Другое усовершенствование сценария — реализовать вывод пиктограмм вложенных папок, на которых можно щелкать мышью, чтобы альбом действовал как целая файловая система или дерево фотографий, организованных в виде подборок.
Этот сценарий фотоальбома — наш давний фаворит. Самое замечательное в нем то, что он написан на языке командной оболочки и его функциональные возможности легко расширить в тысячах направлений. Например, использовав сценарий showpic для вывода больших изображений вместо простых ссылок на изображения JPEG, за 15 минут можно реализовать счетчик, показывающий, какие изображения пользуются наибольшей популярностью.
№ 68. Отображение случайного текста
Многие веб-серверы имеют встроенный механизм вставки на стороне сервера (Server-Side Include, SSI), позволяющий вызывать программы для вставки одной или нескольких строк текста в веб-страницу перед отправкой ее посетителю. Этот механизм предлагает несколько интересных способов расширения веб-страниц. Один из наших любимых — изменение элемента веб-страницы с каждой новой попыткой получить ее. Это может быть графический элемент, фрагмент новостей, подстраница или слоган самого сайта, слегка изменяющийся с каждым посещением, чтобы вызвать у читателя желание возвращаться на сайт снова и снова.
Самое примечательное, что этот трюк легко реализовать в виде сценария командной оболочки, содержащего awk-программу длиной всего в несколько строк, который вызывается из веб-страницы посредством SSI или из плавающего кадра (iframe, способ включения фрагмента страницы, имеющего свой URL, отличный от URL самой страницы). Такой сценарий представлен в листинге 8.9.
Листинг 8.9.Сценарий randomquote
#!/bin/bash
# randomquote — получая файл с данными, в котором каждая запись находится
#·· в отдельной строке, случайно выбирает одну строку и выводит ее. Хорошо
#·· подходит для вызова из веб-страницы посредством SSI.
awkscript="/tmp/randomquote.awk.$$"
if [$# −ne 1]; then
··echo "Usage: randomquote datafilename" >&2
··exit 1
elif [! -r "$1"]; then
··echo "Error: quote file $1 is missing or not readable" >&2
··exit 1
fi
trap "$(which rm) −f $awkscript" 0
cat << "EOF" > $awkscript
BEGIN { srand() }
······{ s[NR] = $0 }
END·· { print s[randint(NR)] }
function randint(n) { return int (n * rand()) + 1 }
EOF
awk −f $awkscript < "$1"
exit 0
Получая имя файла с данными, сценарий сначала проверяет существование файла и его доступность для чтения. Затем он передает весь файл короткому awk-сценарию, который сохраняет строки из него в массиве, подсчитывает их количество и затем случайно выбирает одну и выводит ее на экран.
Этот сценарий можно внедрить в SSI-совместимую веб-страницу, как показано ниже:
Большинство серверов требуют, чтобы страницы с подобными вставками хранились в файлах с расширением .shtml , а не с более традиционными .html и .htm . Благодаря этому простому изменению вывод сценария randomquote будет внедряться в содержимое веб-страницы.
Этот сценарий можно опробовать в командной строке, вызвав его, как показано в листинге 8.10.
Листинг 8.10.Запуск сценария randomquote
$ randomquote samplequotes.txt
Neither rain nor sleet nor dark of night…
$ randomquote samplequotes.txt
The rain in Spain stays mainly on the plane? Does the pilot know about this?
Усовершенствование сценария
Нетрудно создать файл с данными для сценария randomquote, содержащий список имен файлов графических изображений. Тогда с помощью этого сценария можно было бы организовать выбор случайного изображения. Немного подумав, вы найдете множество способов применения и развития этой идеи.
Глава 9. Администрирование веб-сервера
Если вы занимаетесь поддержкой веб-сервера или отвечаете за работу веб-сайта, простого или сложного, то наверняка регулярно решаете какие-то повторяющиеся задачи, такие как выявление недействительных внутренних или внешних ссылок. Многие из этих задач можно автоматизировать с использованием сценариев командной оболочки. То же касается некоторых типичных клиент/серверных задач, таких как управление доступом к информации в каталогах веб-сервера с использованием паролей.
№ 69. Выявление недействительных внутренних ссылок
Несколько сценариев в главе 7 продемонстрировали отдельные возможности текстового веб-браузера lynx, но в этой замечательной программе скрыто намного больше. Одна из таких возможностей, особенно полезная для администраторов веб-серверов, — функция traverse (включается флагом −traversal), заставляющая lynx опробовать все ссылки на сайте и отыскать среди них недействительные. Эту функцию можно задействовать в коротком сценарии, как тот, что показан в листинге 9.1.
Читать дальше