Использование технологий WWW для доступа к базам данных
Администрирование Cold Fusion
Для администрирования в Cold Fusion предусмотрен специальный интерфейс администратора.
Этот интерфейс позволяет изменять различные параметры настройки Cold Fusion по четырем категориям:
Data Sources - используется для настройки источников данных ODBC,
для использования их с Cold Fusion.
Чтобы добавить источник данных, нужно нажать на кнопку "Add...",
выбрать один из установленных в системе драйверов ODBC
и задать определенные для него настройки. Переопределить эти настройки
можно воспользовавшись кнопкой "Setup...",
предварительно выделив конкретный источник данных. Если нужно
определить способы взаимодействия Cold
Fusion с источником данных, то нужно нажать на кнопку "Preferences..."
и определить такие атрибуты как имя пользователя, пароль,
допустимые операции с базой данных и др.
Templates - используется
для настройки логических путей до директорий в которых расположены
файлы с шаблонами Cold Fusion.
Debugging - используется
для настройки отладочных сообщений и сообщений об ошибках.
Mail - используется для настройки параметров SMTP mail
и позволяет просматривать журнал сообщений и ошибок.
Адреса
В HTML есть средство для оформления адресов (адрес будет, по возможности,
выделен шрифтом). Конечно, никто не заставляет пользоваться этой возможностью, но без ее описания наша книга не была бы полной.
Адрес оформляется с помощью тега ...
Браузеры обычно выделяют его курсивом, то есть строка ул. Пирогова, д. 2 будет отображена как
ул. Пирогова, д. 2.
Аргументы командной строки
СGI-модуль в командной строке от сервера получает:
остаток URL после имени cgi-модуля в качестве первого параметра (первый параметр будет пуст, если присутствовало только имя cgi-модуля), и
список ключевых слов в качестве остатка командной строки
для скрипта поиска, или
чередующиеся имена полей формы с добавленным знаком равенства и соответствующих значений переменных.
Ключевые слова, имена и значения полей формы передаются декодированными (из HTTP URL формата кодирования) и перекодированными в соответствии с правилами кодирования Bourne shell так, что cgi-модуль в командной строке получит информацию без необходимости осуществлять дополнительные преобразования.
Ассоциативные массивы
Ассоциативные массивы или хэши содержат пары ``ключ'' и ``значение''.
Например:
\%map = ('red',0x00f,'blue',0x0f0,'green',0xf00);
Часто для удобства чтения между ``ключом'' и ``значением'' ставят оператор =>.
%map = (
'red' => 0x00f,
'blue' => 0x0f0,
'green' => )xf00
);
Библиотеки и функции на языке C
Одной из основных технологий создания CGI-модулей для реализации функций "преобразователя"
и "обработчика" сценариев 1-3 является язык C. Язык C - наиболее распространенный
язык программирования. В каждом ВУЗе есть специалисты, способные использовать его для создания приложений.
При решении описанных задач язык C можно использовать для создания следующих программ:
преобразователя, однократно преобразующего содержимое БД в сеть гипертекстовых
документов (рис. );
обработчика, динамически обрабатывающего запрос от WWW-сервера
к БД. (рис. );
перегрузчика из существующих БД в информационное хранилище (см.
рис. );
обработчика запросов от WWW-сервера к информационному хранилищу (рис. ).
Для поддержки этих функций создано большое количество библиотек и функций языка C,
готовых приложений в исходных текстах. В главе описывается использование языка C
для создания исполняемых CGI-программ.
Бинарные операторы
Звездочка * - умножение двух чисел. Cлэш / - деление числа на число.
Процент % - вычисляет модуль двух чисел, x - оператор повторения. В
скалярном контексте возвращает строку, состоящую из многократно повторенного
левого операнда, причем повторяется он то количество раз, которое стоит справа.
В списковом контексте он многократно повторяет список.
print 'a' x 80; напечатает букву a 80 раз.
@ones = (1) x 80; массив из восьмидесяти единиц.
@ones = (5) x @ones сделает все элементы равными пяти.
Бинарный плюс - операция сложения двух чисел.
Бинарный минус - операция вычитания двух чисел.
Бинарная точка - конкатенация строк.
Что такое progressive JPEGs и как ИХ делать
Существует возможность создавать GIF-файлы, которые отображаются черезстрочным
способом. Эта возможность является очень удобной для Web-страниц.
Не все знают, что подобная возможность имеется и в формате JPEG. Метод
этот называется progressive JPEGs. Сейчас все большее количество
программных пакетов начинает его использовать. Например для Adobe Photoshop
существует подключаемый модуль, создающий progressive JPEGs. Смотрите внимательно
в меню экспорта графики Вашей любимой программы. Быть может она уже имеет
такую функцию!
Что такое transparent/interlaced GIFs и как их делать
Графический формат GIF имеет несколько интересных возможностей, делающих его особенно привлекательным для WWW. К ним относятся возможности создавать ``прозрачные'' (transparent) изображения и изображения, проявляющиеся постепенно, по мере подкачки (interlaced). Эффект постепенного проявления достигается за счет черезстрочной отрисовки изображения: сначала появляются каждые четвертые строчки растра, затем каждые четвертые строчки со сдвигом на одну строку вниз и т.д. Таким образом, картинка появляется как бы в четыре приема. Эффект прозрачности состоит в том, что один из индексов палитры объявляется прозрачным, то есть при отображении вместо соответствующего цвета будет использоваться цвет ``из-под'' изображения, например, цвет фона документа.
Существует множество различных программ для большинства систем, позволяющих придать GIF-картинкам свойства прозрачности и черезстрочности. Из них
выделяются по своим возможностям и удобству использования:
для платформы MS Windows - GIF Construction Set by Alchemy Mindworks,
для UNIX-систем - git, Image Alchemy, PBMPLUS и прочие.
Цитаты и преформатированный текст
Иногда возникает ситуация, когда необходимо вставить в документ цитату,
исходный текст программы или просто текстовый документ, где формат
имеет значение и нежелательно, чтобы Web-браузер сам пытался вставлять
переводы строк там, где он хочет. Язык HTML имеет для возможности для
всех эти случаев.
Цитаты в HTML оформляются с помощью тега
...
Браузер выделит цитату каким-либо способом, например шрифтом и/или вставит
горизонтальные отступы справа и слева.
Чтобы вставить в документ исходный текст можно воспользоваться тегом
...
Текст будет выделен шрифтом фиксированной ширины.
Случай, когда в документе необходимо присутствие текста с фиксированным
форматом особенно распространен. Часто такая возможность применяется,
например, при включении в текст содержимого электронных писем или статей из
сети Usenet. Оформляется все это с помощью тега
текст1
...
...
текстN
При этом отображен он будет, по возможности, примерно так:
текст1
...
...
текстN
Cтруктуры данных
Perl поддерживает три типа данных:
скаляры
массивы скаляров
ассоциативные массивы скаляров (так называемые хэши).
Обычные массивы, как и в языке C, индексируются числами, начиная с нуля.
Ассоциативные массивы индексируются строками.
Простые скаляры (в дальнейшем мы будем также называть их переменными) всегда
начинаются со знака доллара: $, даже в том случае, когда мы обращаемся к
элементу массива.
?
$day простая переменная day
$day[28] 29 элемент массива day
$day{'Feb'} значение 'Feb' из хэша %day
$#day последний индекс массива @day
Простой массив начинается со знака @: ?
@day массив day - ($day[1],$day[2],...)
@day[3,4,5] то же, что и @day[3..5]
Ассоциативный массив (хэш) начинается со знака процент %: %day (key1, val1, key2, val2, ...)
Каждый тип данных имеет свое именное пространство, поэтому вы можете использовать
одно и то же имя одновременно для скалярной переменной, массива или
хэша (а также для подпрограммы или метки) без опасения, что произойдет ошибка.
Perl различает большие и маленькие буквы: FOO, foo и Foo будут
рассматриваться Perl-ом как разные переменные. Имена, начинающиеся с буквы или
знака подчеркивания, могут в дальнейшем содержать в себе цифры или знаки подчеркивания.
Имена,
начинающиеся с цифры, могут в дальнейшем содержать только цифры. Имена, начинающиеся не с буквы, цифры или подчерка должны состоять только из одного символа.
Большинство таких имен зарезервировано, например $$ является
идентификатором текущего процесса.
Интерпретация команды или величины часто зависит от требований контекста.
Существует два основных контекста: скалярный и списковый. Некоторые операции
возвращают список величин если в контексте подразумевается список и одну величину,
если контекст скалярный.
Например, операция &ora_fetch в скалярном контексте возвращает количество
выбранных строк:
$nfields = &ora_fetch($csr);
В списковом контексте она возвращает массив выбранных строк:
@array = &ora_fetch($csr); Левый аргумент определяет контекст правого аргумента.
Деструкторы
Когда удаляется последняя ссылка на объект, этот объект автоматически удаляется.
Это может произойти даже после завершения программы, если ссылки на объект
содержались в глобальных переменных. Если необходимо контролировать процесс
удаления объекта, можно определить в объекте специальный метод, называемый
деструктором. Деструктор объекта (в отличие от C++) имеет
фиксированное имя DESTROY и вызывается перед удалением объекта. В нем можно
реализовать дополнительные процедуры, необходимые для корректного
завершения (например, удаление временных файлов, используемых объектом).
[]
[]
[]
Динамическое определение SQL выражения
В некоторых сложных приложениях может потребоваться, в зависимости
от значений параметров, определять не только содержание запроса,
но и его структуру. В Cold Fusion
предусмотрен тег DBSQL,
который может употребляться внутри тега DBQUERY,
доопределяя SQL - выражение,
в зависимости от значений параметров. Тег DBSQL
имеет единственный атрибут SQL,
значение которого будет добавляться к основному SQL
- выражению.
Пример
DATASOURCE="Sites Database"
SQL="SELECT * FROM SITES
WHERE SiteType = #SiteType# ">
not "">
Динамическое создание гипертекстовых документов на основе содержимого БД
В этом варианте доступ к БД осуществляется специальной CGI-программой,
запускаемой WWW-сервером в ответ на запрос WWW - клиента.
Эта программа, обрабатывая запрос, просматривает содержимое БД и создает выходной HTML-документ,
возвращаемый клиенту (см.рис.1-3).
Это решение эффективно для больших баз данных со сложной структурой
и при необходимости поддержки операций поиска. Показаниями также являются частое обновление и невозможность
синхронизации преобразования БД в статические документы с обновлением
содержимого. В этом варианте возможно осуществлять изменение БД из WWW-интерфейсов.
К недостаткам этого метода можно отнести большое время обработки
запросов, необходимость постоянного доступа к основной базе данных, дополнительную
загрузку средств поддержки БД, связанную с обработкой запросов от WWW - сервера.
Для реализации такой технологии необходимо использовать взаимодействие WWW-сервера
с запускаемыми программами CGI - Common Gateway Interface. Выбор программных
средств достаточно широк - языки программирования, интегрированные средства типа генераторов отчетов. Для СУБД со внутренними языками программирования существуют
варианты использования этого языка для генерации документов.
Для метода GET
Получить значение переменной QUERY_STRING
Декодировать имена и их значения (учитывая, что все пробелы
при декодировании сервером были заменены символом "+"
и все символы с десятичным кодом больше 128 преобразованы в символ
"%" и следующим за ним шестнадцатеричным кодом символа.)
Сформировать структуру соответствия "имя - значение"
для дальнейшего использования в cgi-модуле
Для метода POST
Получить из стандартного входного потока CONTENT_LENGTH символов
Декодировать имена и их значения (учитывая, что все пробелы
при декодировании сервером были заменены символом "+"
и все символы с десятичным кодом больше 128 преобразованы в символ
"%" и следующим за ним шестнадцатеричным кодом
символа.)
Сформировать структуру соответствия "имя - значение"
для дальнейшего использования в cgi-модуле
Очевидно, что отличие только в источнике данных. Поэтому, в принципе,
возможно создание единого модуля для методов POST и GET. Необходимо
только добавить в начало проверку значения переменной REQUEST_METHOD
для определения метода запроса. После формирования структуры "имя-значение"
можно приступить к решению задач, ради которых, собственно, создавался
cgi-модуль. Понятно, что задачи, решаемые cgi-модулем, могут быть
очень разнообразными (получение и обработка почты, доступ к базам
данных, гостевая книга и т.д.).
Следующим важным моментом является динамическое формирование cgi-модулем
HTML-документа (оформление результата работы модуля). Например,
таблицы выборки из базы данных.
Для этого cgi-модуль должен выдать в стандартный выходной поток
заголовок состоящий из строки: Content-type: text/html и пустой строки (двух символов CR)
После этого заголовка можно давать любой текст в формате HTML.
Дополнительные функции
Дополнительные возможности предоставляются функциями &ora_titles() &ora_length()
&ora_types() &ora_autocommit() &ora_commit()
&ora_rollback() &ora_version()
&ora_titles
@titles = &ora_titles($csr)
Программа может определить название полей, содержимое которых будет извлечено запросом, вызовом функции
&ora_title. Эта функция имеет один параметр - курсор. Заголовки обрезаются
до длины поля.
&ora_length
@length = &ora_length($csr)
Программа может определить длину каждого из полей, возвращенных запросом,
с помощью вызова функции &ora_length. Она имеет только один параметр - курсор и
возвращает массив целых чисел.
&ora_types
@types = &ora_types($csr)
Программа может определить тип каждого из полей, возвращенных запросом,
с помощью вызова функции &ora_types. Она имеет один параметр - курсор и возвращает
массив целых чисел. Эти типы определяются в документации по OCI и в файле
oraperl.ph для Oracle v6.
&ora_autocommit
&ora_autocommit($lda,$on_or_off)
Режим автоматического завершения транзакций можно установить или отменить
вызовом функции &ora_autocommit. Эта функция имеет два параметра:
идентификатор регистрации и булевскую переменную, которая указывает
действие, которое нужно выполнить. Если значение переменной ненулевое, то
режим включается, если нулевое, то отключается. По умолчанию режим не включен.
Режим включается на продолжительность пребывания в системе. Если есть
необходимость включать его только для одного оператора, то лучше делать
несколько регистраций и использовать для каждого оператора отдельный
идентификатор регистрации.
&ora_commit, &ora_rollback
&ora_commit($lda)
&ora_rollback($lda)
Изменения в базе данных могут быть сохранены или отменены вызовом этих
функций. Они имеют один параметр - идентификатор регистрации в системе.
Транзакции, результат которых уже был сохранен не могут быть отменены
&ora_rollback. Эти функции также действуют на все время пребывания в
системе, а не на отдельные операторы.
&ora_version
&ora_version()
Эта функция печатает версию и информацию об авторских правах, касающуюся
Oraperl. Она не возвращает ничего.
Дополнительные команды SQL
В теге DBOUTPUT, кроме выражения
SELECT языка SQL,
допускается использование и любых других, допустимых для конкретного
источника данных, SQL - команд,
включая:
INSERT - добавление записи
в таблицу.
UPDATE - модификация записи в таблице.
DELETE - удаление записи из таблицы.
Использование непосредственно команд SQL
вместо тегов DBINSERT и
DBUPDATE в некоторых случаях
может обеспечить большую гибкость и эффективность. Например, при
модификации или создании новой записи, появляется возможность
использовать все параметры и переменные доступные в шаблоне в
том числе и результаты определенных в шаблоне запросов.
Пример использования команды UPDATE
в теге DBQUERY приведен
в
[]
[]
[]
Дополнительные замечания по созданию DBML - шаблонов
В шаблонах DBML, для комментариев, используется три тире (
Конфигурационные файлы Режимы работы сервера
Главный файл конфигурации (ГКФ) сервера содержит все параметры,
необходимые серверу для начала работы, а также пути других конфигурационных
файлов. По умолчанию, главный файл конфигурации сервера находится
в подкаталоге conf/ каталога и имеет имя httpd.conf.
При запуске серверу можно указать другой путь, используя ключ -f.
Например: /usr/local/sbin/httpd -f /etc/httpd.config
Ниже приведены параметры, указываемые в главном файле конфигурации
сервера, с необходимыми пояснениями. Значения параметров отделяются
от названия одним или несколькими пробелами или табуляциями. Если
одному параметру соответствуют несколько значений, они разделяются
запятыми.
Параметры запуска серверных процессов
ServerType
Определяет способ запуска сервера: ServerType inetd
серверный процесс запускается в ответ на каждое обращение клиента
через механизм inetd. После обработки запроса, сервер прекращает
свою работу. ServerType standalone
серверный процесс запускается один раз и находится в состоянии
ожидания запросов клиентов. После обработки запроса, сервер остается
запущенным.
Port
Определяет порт tcp, по которому сервер принимает запросы клиентов.
Этот параметр используется только для сервера типа standalone.
При механизме старта inetd порт определяется конфигурационным
файлом сервера inetd - inetd.conf.
Стандартный порт для WWW - сервера - 80.
Пример: Port 80
StartServers и MaxServers
Для режима standalone определяют количество процессов сервера
при многопоточной обработке. StartServers - указывает
число процессов сервера, создаваемых при запуске httpd. MaxServers
определяет максимальное число одновременно работающих процессов
сервера.
Пример: StartServers 3 MaxServers 5
TimeOut
Определяет время (в секундах), которое серверный процесс, запущенный
в режиме standalone, будет
ожидать повторного обращения клиента. По умолчанию используется
1200 секунд.
Пример: TimeOut 3600
User и Group
Определяют имя пользователя и группу, права которого получает
сервер при запуске в режиме standalone. Изменение прав сервера
производится с целью предотвращения доступа WWW - клиентов к файлам
операционной системы, не являющимися общедоступными. Например:
User nobody
Group nobody
Информационные параметры для WWW - клиентов
ServerName
Определяет имя сервера, которое пересылается клиенту вместе с
другими параметрами запроса. Используется в случае, если сервер
имеет несколько имен (синонимов).
Например:
ServerName Indy.cnit.nsu.ru
ServerAdmin
Определяет адрес электронной
почты администратора сервера. При возникновении каких - либо ошибок
в работе сервера, он выдает клиенту сообщение с просьбой проинформировать
о них администратора сервера по указанному Email.
Например:
ServerAdmin fancy@nsu.ru
Расположение необходимых файлов и каталогов
ServerRoot
Определяет местоположение каталога ServerRoot. По
умолчанию, это /usr/local/etc/httpd
или измененное значение параметра HTTPD_ROOT файла src/config.h.
Например:
ServerRoot /var/httpd
ErrorLog
Определяет местоположение файла - журнала ошибок, в который заносятся
все сообщения об ошибках, возникающих в процессе работы сервера.
Если значение не начинается со slash (/), подразумевается путь
относительно ServerRoot.
Например:
ErrorLog logs/errlog
Журналом ошибок является файл /var/httpd/logs/errlog
TransferLog
Определяет местоположение файла - журнала доступа, в который заносятся
данные обо всех передачах данных между WWW - клиентом и WWW -
сервером. Если значение не начинается со slash (/), подразумевается
путь относительно ServerRoot.
Например:
TransferLog logs/translog
Журналом доступа является файл /var/httpd/logs/translog
AgentLog
Определяет местоположение файла - журнала клиентов, в который
заносятся данные о программном обеспечении, используемом WWW клиентами
при доступе к данному серверу. Если значение не начинается со
slash (/), подразумевается путь относительно ServerRoot.
Например:
TransferLog logs/agentlog
Журналом клиентского программного обеспечения является файл /var/httpd/logs/agentlog
RefererLog
Определяет местоположение файла в который записываются все факты
обращений к данным сервера в виде ссылок от клиентов к данным.
Если значение не начинается со slash (/), подразумевается путь
относительно ServerRoot.
Например:
RefererLog logs/reflog
Журналом ссылок является файл /var/httpd/logs/reflog
PidFile
Определяет местоположение файла, хранящего номер процесса запущенного
WWW - сервера. Используется для остановки работы сервера путем
посылки сигнала командой kill. Если значение не
начинается со slash (/), подразумевается путь относительно ServerRoot.
Например:
PidFile logs/httpd.pid
Номер процесса - сервера записывается при старте в файл /var/httpd/logs/httpd.pid
AccessConfig
Определяет местоположение файла управления доступом. Если значение
не начинается со slash (/), подразумевается путь относительно
ServerRoot.
Например:
AccessConfig conf/access.conf
TypesConfig
Определяет местоположение файла, содержащего список соответствий
расширений файлов ОС типам MIME. По умолчанию используется файл
conf/mime.types в каталоге, определяемом ServerRoot. Если не начинается
с backslash (/), подразумевается путь относительно ServerRoot.
Например:
TypesConfig /etc/mime.types
CoreDirectory
Определяет местоположение каталога, в который записывается файл
дампа памяти при возникновении сбоя.
Например:
CoreDirectory /tmp
Параметры протоколирования
LogOptions
Определяет, будут ли несколько протоколов записываться в один
файл (Combined) или каждый будет записан в свой
файл (Separate).
Например:
LogOptions Separate
RefererIgnore
Определяет имена серверов, обращения от которых не будут протоколироваться.
Например:
RefererIgnore Indy.cnit.nsu.ru
Другие режимы работы
DNSMode
Определяет интенсивность обращений WWW сервера к серверу имен
Интернет. Minimum означает,
что сервер будет обращаться к DNS только при необходимости проверить
ограничения доступа по домену. Standard означает,
что сервер будет обращаться к серверу имен каждый раз при обработке
запроса клиента. Maximum означает, что сервер будет
дважды обращаться к серверу имен при каждой обработке запроса.
Например:
DNSMode Standard
Процедура определения конфигурации сервера
После запуска основного серверного процесса сервер пытается открыть
главный конфигурационный файл. Этот файл ищется по умолчанию в
каталоге /usr/local/etc/http/conf с именем httpd.conf.
Умолчание можно изменить при сборке системы редактированием файла
src/config.h. За каталог отвечает параметр HTTPD_ROOT,
за имя файла - параметр SERVER_CONFIG_FILE. Изменить значения
по умолчанию можно при запуске сервера, указав ключи -h
и-f (см. выше).
Местоположение файлов конфигурации доступа, документов, типов
MIME, а также файлов журналов сервер получает из главного конфигурационного
файла. Если каких - либо параметров там нет, их значения берутся
по умолчанию (см. src/config.h).
Конфигурация ресурсов
Расположение файлов данных, их интерпретация сервером и поведение
сервера при обращении к разным типам файлов определяются параметрами
файла конфигурации ресурсов. Ниже приведен список основных параметров
с пояснениями.
DocumentRoot
Определяет каталог локальной файловой системы,
от которого начинается отсчет виртуального пути URL.
Например:
DocumentRoot /apply/www
UserDir
Определяет название публичного подкаталога пользователей. ПО WWW
- сервера позволяет обеспечить внешний доступ к гипертекстовым
документам пользователей базовой операционной системы. Для этого
пользователям необходимо создать в своем домашнем каталоге подкаталог
с именем, определяемым параметром UserDir. После
этого все обращения по URL:
http://<имя_сервера>/~<имя_пользователя_ОС>
будут транслироваться в реальный путь до подкаталога, определенного
параметром UserDir в домашнем каталоге пользователя <имя_пользователя_ОС>.
Например:
UserDir public_html
при этом при обращении по URL
http://www.nsu.ru/~fancy/index.html
сервер будет искать файл Index.html в подкаталоге
public_html/ домашнего каталога пользователя fancy.
Redirect
Переадресует запрос к одной иерархии в запрос к другой иерархии,
возможно расположенной на другом сервере.
Например:
Redirect /HTTPd/ http://hoohoo.ncsa.uiuc.edu/
Alias
Определяет синоним для документа или каталога на локальном сервере.
Пример:
Alias /icons /var/opt/images
ScriptAlias
Определяет синоним для каталогов, содержащих CGI - программы.
Пример:
ScriptAlias /hrv-cgi /var/opt/cgi
DirectoryIndex
Определяет имена файлов, трактующихся сервером как индексные.
Их содержимое выдается сервером при обращении к данному каталогу.
Пример:
DirectoryIndex index.html index.htm index.cgi
AccessFileName
Определяет имя файла, трактующегося сервером как файл управления
доступом (см. раздел ).
Пример:
AccessFileName .htaccess
Конструкторы и деструкторы пакетов
Существует две функции специального вида - конструкторы и деструкторы. Это
BEGIN и END программы в их описании необязательно использование sub. Подпрограмма
BEGIN исполняется сразу, как только это возможно, то есть в момент, когда
она полностью определена, даже перед тем как обрабатывается остаток содержащего
файла. В файле может быть несколько блоков BEGIN. Они исполняются в порядке
определения.
Подпрограмма END исполняется в самом конце. В файле может содержаться несколько
END блоков, они исполняются в обратном порядке.
Контроль работоспособности сервера
Проверка работоспособности сервера может осуществляться различными
способами. На Unix - платформе, в режиме standalone, можно посмотреть
список процессов, выделив среди них процессы с именем httpd:
# ps -aef | grep httpd root
28816 1 0 Nov 14 ? 7:42 /usr/local/sbin/httpd
nobody 28817 28816 0 Nov
14 ? 5:50 /usr/local/sbin/httpd
nobody 28818 28816 0 Nov
14 ? 5:32 /usr/local/sbin/httpd
nobody 28819 28816 0 Nov
14 ? 4:49 /usr/local/sbin/httpd
nobody 28820 28816 0 Nov
14 ? 5:24 /usr/local/sbin/httpd
nobody 28821 28816 0 Nov
14 ? 5:42 /usr/local/sbin/httpd
root 19150 19145 0 14:57:58
pts/4 0:00 grep httpd
#
Мы увидим несколько процессов, у одного из которых собственником
является root, а у других - пользователь, определенный
параметром User главного конфигурационного файла
(ГКФ). Процесс с собственником root запускается
первым. Он контролирует работу остальных процессов - серверов.
По использованному процессорному времени (колонка 8
примера) можно судить о загруженности серверов.
Если сервер работает в режиме inetd или необходимо
проверить работоспособность сервера извне, нужно выполнить команду telnet, указав ей имя машины - сервера и номер порта.
После установления соединения наберите команду GET /.
Сервер должен выдать содержимое корневого каталога документов
или индексного файла, находящегося в этом каталоге. Номер порта
обычно равен 80. В режиме standalone он определяется параметром
Port ГКФ. Для режима inetd он определяется парой файлов - services
и inetd.conf, определяющих соответствие между входными
tcp - портами и сервисами Unix.
Например:
$ telnet www.cnit.nsu.ru
80
Trying 193.124.209.70...
Connected to Indy.
Escape character is '^]'. GET /
Novosibirsk Center
of New Information Technologies
. . .
Connection closed by foreign host.
$
Логическое И и логическое ИЛИ
Бинарное && - логическое И. Если левый аргумент FALSE, то правый
не проверяется.
Бинарное - логическое ИЛИ. Если левый аргумент TRUE, то правый
аргумент не проверяется.
''и && отличаются от подобных операторов в \verbC| тем, что вместо 0 или
1 они возвращают последнюю обработанную величину.
Таким образом, наиболее удобным способом определить домашний каталог
пользователя из переменной окружения HOME будет (на практике такой способ
определения домашнего каталога пользователя не рекомендуется):
$home = $ENV{'HOME'} $ENV{'LOGDIR'}
(getpwuid($<))[7] die "You're homeless!\n";
В качестве более удобной для чтения альтернативы Perl поддерживает операторы and и
or, которые будут описаны далее. Их приоритет ниже, однако их можно с
удобством использовать, не расставляя скобки,
после операторов, аргументами которых являются списки:
unlink "alpha", "beta", "gamma"
or gripe(), next LINE;
Если писать в стиле C, то это может быть записано так:
unlink("alpha", "beta", "gamma")
(gripe(), next LINE);
Логическое И, ИЛИ и Исключающее ИЛИ
and возвращает конъюнкцию двух выражений. Он эквивалентен &&, за
исключением более низкого приоритета.
or возвращает дизъюнкцию аргументов. Он эквивалентен , за исключением
более низкого приоритета.
xor (eXclusive OR) - исключающее ИЛИ, возвращает истину, если истинен
ровно один из аргументов.
Логическое НЕ
Унарное NOT возвращает отрицание аргумента. Оно эквивалентно !, за
исключением более низкого приоритета.
Методы HTTP запроса
Для реализации взаимодействия "клиент-сервер" важно, какой метод HTTP запроса использует
клиентская часть при обращении к WWW серверу. В общем случае, запрос - это сообщение, посылаемое
клиентом серверу. Первая строка HTTP запроса(см. ) включает в себя метод, который должен быть применен к запрашиваемому ресурсу,
идентификатор ресурса(URI-Uniform Resource Identifier), и используемую версию
HTTP-протокола. В рассматриваемом нами случае, клиентская часть применяет методы запроса POST и GET. Метод POST используется для запроса серверу, чтобы тот принял информацию, включенную в запрос, как
относящуюся к ресурсу, указанному идентификатором ресурса. Метод GET используется для получения
любой информации, идентифицированной идентификатором ресурса в HTTP запросе.
Для WWW-сервера стандарта NCSA прикладные программы или CGI-модули, обрабатывающие поток данных от клиента
или (и) формирующие обратный поток данных могут быть написаны на таких языках программирования как:
C/C++;
Любой UNIX shell;
Fortran;
Perl;
Visual Basic;
TCL;
AppleScript;
Методы
В Perl-е метод имеет синтаксис простой подпрограммы. В качестве первого аргумента
метода выступает объект или пакет. Существует два типа методов: статические и
виртуальные методы.
Статические методы имеют первым аргументом имя класса. Они обеспечивают функциональность
для класса в целом, а не для отдельных объектов принадлежащих классу. Конструкторы
являются, как правило, статическими методами. Многие статические методы просто игнорируют
свой первый аргумент, так как заранее знают, какому пакету они принадлежат.
Другой способ использования статических методов состоит в том, что метод работает
с объектом, используя имя:
sub find {
my ($class, $name) = @_;
$objtable{$name};
}
Виртуальные методы имеют первым аргументом ссылку на объект. Обычно они
помещают
эту ссылку в переменную self или this и в дальнейшем используют ее как обычную
ссылку.
sub display {
my $self = shift;
my @keys = @_ ? @_ : sort keys %$self;
foreach $key (@keys) {
print "\t$key => $self ->{$key}\n";
}
}
Модули
В Perl 5 понятие пакетов расширено в понятие модулей. Модули это пакеты находящиеся
в одноименном файле, включенном в библиотеку. Модули подключаются следующим образом:
use Module; или use Module LIST;
Это эквивалентно:
BEGIN { require "Module.pm"; import Module; }
Все модули имеют расширение .pm. Если именное пространство модуля пересекается
с именным пространством основной программы то всегда используется use, если не
пересекается то можно использовать require.
Стандартные модули Perl описаны в документации.
Multimedia-материалы
Все большее количество Web-страниц использует различные multimedia-материалы,
как-то звуки или видеовставки. Они обычно имеют ОЧЕНЬ большой размер
и передаются по сети ОЧЕНЬ долго. Как этого избежать? Единого ответа
на этот вопрос нет. Все зависит от того что вам на самом деле нужно.
Как всегда, возникает вопрос о форматах хранения данных.
Для звука используются форматы MIDI, WAV (Windows Audio), AU (Sun Audio),
AIFF (Mac Audio).
Для видео-вставок -- AVI (Microsoft Video for Windows), MPEG (Motion
Picture Experts Group), и MOV (Apple QuickTime movies).
Рассмотрим сначала форматы хранения аудиоданных: MIDI
- Musical Instruments Digital Interface -- формат хранения команд
для различных электронных музыкальных инструментов (например, синтезатора на
музыкальной карте компьютера). Грубо говоря, внутри файла формата MIDI
хранится нотная запись музыкального фрагмента. Это позволяет достичь
минимального размера файла при максимальной сложности мелодии. Файлы MIDI
являются оптимальными для записи мелодий, если не требуется гарантий
абсолютно идентичного звучания различных инструментов на различных системах. WAV
- формат хранения звуков, используемый в системах семейства Windows.
Содержит запись звука в виде сигнала, то есть, гарантирует точность
воспроизведения (если, конечно, устройство вывода позволяет). AU
- формат представления звука, используемый в системах компании
Sun Microsystems. По принципу схож с WAV. Имеет встроенную компрессию. AIFF
- формат представления аудиоданных, используемый в системах
Apple Computer и Silicon Graphics. По принципу схож с WAV.
Имеет встроенную компрессию.
Как и в случае с изображениями, следует прежде всего избавиться от избыточной
информации. Для цифрового звука характерны два параметра, влияющие на размер
данных: частота оцифровки и разрядность уровня сигнала. Частота оцифровки
определяет, сколько раз в секунду замерялся уровень сигнала (и сколько раз в
секунду он будет меняться при нормальном воспроизведении).
Разрядность
показывает, сколько бит при этом выделялось на запись этого уровня.
Для примера: на музыкальных компакт-дисках частота дискретизации составляет
примерно 44.1 Кгерц при разрядности 16 бит. Нетрудно подсчитать, что при
такой схеме одна секунда звука будет занимать больше 88 килобайт (!)
К счастью, уровень качества звука, присущий компакт-дискам, далеко не всегда
необходим при передаче звука по сетям. Например, для корректной передачи
голоса достаточно частоты дискретизации в 8.0 Кгерц при разрядности
сигнала в 8 бит. Таким образом, в те же 88 килобайт поместится уже почти
11 секунд звучания голоса. Если при этом использовать еще и сжатие (с потерями),
то это значение можно сильно увеличить.
Таким образом, главное правило звучит так:
Для звуковых файлов выбирайте минимальную частоту дискретизации и
разрядность, при которых качество все еще остается приемлемым. Выбирайте формат
с максимальным показателем сжатия для ваших данных.
Видеовставки, пожалуй -- самый объемный элемент современных Web-страниц.
Единственный совет, который можно дать по отношению к ним: старайтесь не
вставлять их прямо в документ (inline). Лучше вставьте один из кадров
в виде статичной картинки и сделайте ссылку на весь фрагмент. Кроме того,
можно выбирать формат и способ компрессии, достигая при этом оптимального
соотношения размер / качество.
Обычно в WWW применяются следующие форматы хранения видеофрагментов:
AVI
- формат компании Microsoft, используемый в системах семейства
Windows. Построен по схеме применения так называемых ``кодеков'', то есть
модулей сжатия/распаковки. Точно такой же подход используется в формате
QuickTime фирмы Apple, только набор стандартных кодеков отличается.
QuickTime MOV
- формат, разработанный компанией Apple и ныне получивший
повсеместное распространение. Программы его воспроизведения (некоторое
множество кодеков) ныне существуют для большинства систем.
MPEG
- Формат экспертной группы по кинематографии. Очень сильно
распространен и популярен.
Написание модулей CGI
Язык Perl очень широко используется при написании исполняемых модулей
CGI (Common Gateway Interface) для Web.
Это обусловлено прежде всего тем, что Perl предоставляет разработчикам
простые и удобные средства обработки текста и взаимодействия с базами
данных. Наша цель - лишь дать пример
использования Perl для написания CGI-модуля.
Рассмотрим простую подпрограмму разбора входного потока CGI-программы
(при передаче параметров используется метод POST ).
#!/usr/local/bin/perl
sub Print {
$len = 100;
$buf = "";
read(STDIN, $buf,$len);
# считываем из стандартного потока ввода
# в переменную $buf количество символов
# $len
@ar = split(/[&=]/,$buf);
# разбиваем строку в массив строк,
# разделителями служат & и =.
$output = "Content-type: text/html\n\n
# посылает тип MIME передаваемого документа Result
Hi there
";
$i = 0;
while ($i <= $#ar) {
$ar[$i] =~ s/\+/ /g;
# заменяем в элементах массива + на пробел
$output .= "$ar[$i]\n";
# конкатенация переменной $output с
# элементом массива
$i++; }
$output .="";
# завершаем HTML страницу
print $output;
}
eval &Print;
# выполняем подпрограмму осуществляющую
# считывание, обработку и вывод информации
В данном примере был проиллюстрирован случай считывания параметров из входного
потока.
Если параметры передаются CGI-модулю в командной строке, то они помещаются в служебный
массив @ARGV. Например, если параметры пишуться в URL:
Как видно из примера, написать CGI-модуль на Perl совсем не сложно. Существуют также
различные модули для облегчения написания CGI. Документацию по ним и сами модули доступны на сервере
Назначение WWW - сервера Общая схема работы Определение
WWW сервер - это такая часть глобальной или внутрикорпоративной
сети, которая дает возможность пользователям сети получать доступ
к гипертекстовым документам, расположенным на данном сервере.
Для взаимодействия с WWW сервером пользователь сети должен использовать
специализированное программное обеспечение - броузер (от англ.
browser), другое название - программа просмотра. Схема работы
Рассмотрим более подробно, чем
в предыдущих главах, схему
работы WWW-сервера.
В общем виде она выглядит так:
Пользователь сети запускает пакет программного обеспечения,
называемый броузером,
в функции которого входит
Установление связи с сервером
Получение требуемого документа
Отображение полученного документа
Реагирование на действия пользователя - доступ к новому документу
После запуска броузер по команде пользователя или автоматически
устанавливает связь с заданным WWW - сервером и передает ему запрос
на получение заданного документа (см рис.3-1).
WWW сервер ищет
запрашиваемый документ и возвращает результаты броузеру
(см. рис.
3-2).
Броузер, получив
документ, отображает его пользователю
и ожидает его реакции. Возможные варианты:
Ввод адреса нового документа
Печать, поиск, другие
операции над текущим документом
Активизация (нажатие) специальных зон полученного документа,
называемых связями (link) и ассоциироваными с адресом
нового документа.
В первом и третьем случае происходит обращение за новым документом. Адрес
Как было описано в главе , адрес
документа указывается в виде специальной строки, называемой URL.
Для протокола HTTP, используемого при взаимодействии WWW клиента
и WWW сервера, URL состоит из следующих компонент:
Наименование протокола,
по которому работает сервер (http).
Имя машины - сервера в Internet или ее IP - номер.
Порт TCP, обращение к которому обрабатывает сервер.
Место (путь) документа на машине - сервере.
Например: http://www.cnit.nsu.ru:80/welcome.html
Здесь http означает протокол работы с WWW - сервером
':' - разделитель
"www.cnit.nsu.ru" - имя машины - сервера
в Internet
"80" - номер tcp - порта
/welcome.html - путь до документа на машине
- сервере
Из общей схемы работы видно,
что функции WWW сервера заключаются в следующем:
Установление соединения с клиентским ПО по протоколу tcp.
Принятие запроса на документ по протоколу http.
Поиск документа в локальных ресурсах.
Возврат результатов поиска по протоколу http.
В общем случае, WWW - сервером будем называть программно
- аппаратный комплекс, предназначенный для выполнения вышеперечисленных
действий.
Среда работы сервера
В настоящее время все известные WWW - серверы представляют собой
компьютер общего назначения с многозадачной операционной системой.
Один или несколько процессов такой системы отвечают за поддержку
специфических для WWW - сервера функций. Другие процессы ОС отвечают
за обеспечение других функций, не обязательно связанных с поддержкой
технологии WWW (см. рис. 3-3).
Такая структура приводит к тому, что под WWW сервером начинают подразумевать только часть программного
обеспечения, единственными функциями которой являются функции
WWW сервера, а остальную часть - компьютер, операционную систему,
другие процессы, сетевую структуру называют средой работы WWW
сервера или платформой. Ниже приведена таблица 3-1,
содержащая список наиболее распространенных платформ для
WWW - сервера.
Таблица 3-1
Компьютер
Операционная Система
IBM PC
Unix (UnixWare, Open Server, Solaris, BSD, Linux и т.д.
Microsoft Windows NT
IBM OS/2
Novell NetWare
Sun SparcStation и SparcServer
SunOS
Solaris
Silicon Graphics
серверы и рабочие станции
IRIS
Непосредственные функции сервера Базовые определения
В простейшем случае гипертекстовый документ представляет собой
совокупность файлов. Представление этих файлов как единого документа
производится броузером. По каждому файлу документа броузер делает
запрос к WWW - серверу. Таким образом,
сервер не имеет представления о структуре и составе документов,
он отвечает только за выдачу локальных файлов по запросам.
На различных платформах, в различных операционных системах пути
файлов выглядят по разному.
Например: D:\DOCUMENTS\HTML\INDEX.HTM - в Windows, /u/data/www/html/index.html - в Unix - системах, USR:WWW/HTML - в NetWare и т.д.
Путь файла, указываемый в URL, имеет стандартный вид:
/<имя_каталога>/ ... /<имя_каталога>/<имя_файла>
Таким образом, в функции WWW - сервера входит преобразование адреса
из внешнего единого формата в платформенно ориентированный внутренний
формат. Появляется ряд понятий,
специфичных для такого преобразования, необходимых для него.
Исходный каталог документов
Это каталог реальной файловой системы сервера, от которого идет
вычисление пути, указанного в URL.
Например, если исходным каталогом
документов являетсяD:\Documents\HTML\,
то на запрос к этому серверу документа по URL http://<имя_сервера>/index.htm
будет возвращен файл D:\Documents\HTML\index.htm
Синонимы
В случае, когда необходимо
осуществить обращение к конкретному каталогу или файлу, находящемуся
вне иерархии Исходного каталога документов,
используется механизм синонимов. Синоним позволяет явно определить
соответствие между путем, указанным в URL, и путем локальной файловой
системы.
Например:
Синонимом для /Harvest объявляется /projects/www/harvest
или
синонимом для/test/myfile.html объявляется C:\MYDIR\FILE.HTM
В первом случае все обращения к файлам каталога /Harvest
будут обрабатываться в каталоге /projects/www/harvest.
Второй пример показывает работу
синонима с конкретным файлом файловой системы.
Индексный файл
Для каждого сервера определено имя так называемого индексного
файла. Обычно этот файл содержит ссылки на другие файлы данного
каталога. Содержимое индексного файла выдается сервером в случае,
если в URL указан каталог без конкретного файла.
Пользовательский раздел
Для многопользовательских операционных систем (таких как Unix)
ПО WWW - сервера позволяет каждому пользователю предоставлять
доступ к своему собственному набору гипертекстовых документов
вне основной иерархии (Исходного каталога документов, Синонимов
и т.д.). Этот набор документов должен находиться в собственном
(т.н. "домашнем") каталоге пользователя. Для доступа
к таким документам в URL перед путем ставится знак тильда и имя
пользователя: ~<имя_пользователя>.
Например:
На сервере Indy.cnit.nsu.ru создан пользователь
с именем fancy и "домашним" каталогом /home/fancy.
Собственные гипертекстовые документы он хранит в каталоге /home/fancy/public_html.
При обращении по URL http://Indy.cnit.nsu.ru/~fancy/start.html,
WWW - сервер будет искать документ start.html в
каталоге /home/fancy/public_html.
Объектная ориентация
Понятие объектной ориентации зиждется на трех простых определениях:
Объект это просто ссылка.
Класс это просто пакет, который содержит методы для работы с объектными
ссылками.
Метод это просто подпрограмма, которая имеет своим первым аргументом
объектную ссылку (или имя пакета для статического метода).
Объекты
В отличие от C++, Perl не имеет специального синтаксиса для описания
конструкторов. Конструктор, как уже говорилось раньше, это просто подпрограмма,
которая возвращает ссылку ассоциированную с классом (как правило с тем, где
определена подпрограмма). Например, типичный конструктор:
package Critter;
sub new { bless {} }
{} создает ссылку на анонимный хэш.
В пределах класса методы как правило работают с обычными ссылками. Конструктор
может привязать объект к другому классу, в таком случае предыдущая привязка
бывает забыта, так как объект не может принадлежать одновременно нескольким
классам.
Обработка файлов формата DBF
Для взаимодействия с файлами этого формата существует специальный модуль - Xbase.pm
На текущий момент поддерживается только возможность чтения таких файлов.
Этот модуль подключается стандартным образом: use Xbase;
Новый Xbase объект создается следующим образом:
$database = new Xbase;
Будет создан объект $database, который в дальнейшем будет использоваться для
взаимодействия со всевозможными методами, которые поддерживает модуль.
Доступ к базе данных осуществляется следующим образом:
$database->open_dbf($dbf_name,$idx_name);
Мы ассоциировали DBF-файл и необязательный индексный файл с объектом. Чтобы
определить тип (database type) можно сделать следующее:
print $database->dbf_type;
Вернется строка, которая, если Xbase файл открыт, будет содержать значение
DBF3, DBF4 или FOX.
Чтобы узнать дату последнего обновления делается следующее:
print $database->last_update;
Возвращает строку с датой.
Чтобы узнать номер последней записи можно сделать следующее:
$end=$database->lastrec;
Вернется номер последней записи в файле с базой данных.
Информацию о статусе базы данных можно посмотреть следующим образом:
$database->dbf_stat;
В стандартный выходной поток будет напечатана информация о статусе и структуре
базы данных. Этот метод работает аналогично команде display status.
Посмотреть информацию о статусе индексного файла можно используя метод idx_stat:
$database->idx_stat;
Печатает в стандартный выходной поток (STDOUT) информацию о статусе открытого
IDX-файла.
Для того чтобы перейти на начало файла есть метод go_top:
$database->go_top;
Передвигает курсор чтения на физическое начало файла,если индексы не существуют
и на первую запись, соответствующую порядку, который задается индексом, в
противоположном случае.
Для того чтобы перейти на конец файла есть метод go_bottom:
$database->go_bottom;
Передвигает курсор чтения на физический конец файла,если индексы не существуют
и на последнюю запись, соответствующую порядку, который задается индексом, в
противоположном случае.
Чтобы перейти на следующую запись есть метод go_next:
$database->go_next;
Эквивалентно команде skip 1, которая передвигает курсор на следующую запись.
Чтобы перейти на предыдущую запись есть метод go_prev:
$database->go_prev;
Эквивалентно команде skip -1, которая передвигает курсор на предыдущую запись.
Есть возможность осуществить поиск по заданному ключу:
$stat=$database->seek($keyvalue);
Эта команда устанавливает курсор на первую запись, соответствующую данному
ключу. Но в данном случае база данных должна быть открыта с соответствующим
индексом, в противоположном случае будет выдано сообщение об ошибке и исполнение
прекратиться. Возвращается значение, содержащее информацию о том, был ключ найден
или нет.
Чтобы узнать номер записи, на которой стоит курсор можно использовать следующую
команду:
$current_rec=$database->recno;
Метод bof возвращает значение true, если курсор находится в самом начале файла.
if ($database->bof) {
print " At the very top of the file \n";
}
Аналогично действует метод eof:
if ($database->eof) {
print " At the very end of the file \n";
}
Чтобы прочитать содержимое какого-либо поля записи можно поступить так:
print $database->get_field("NAME");
Возвращает строку с содержимым поля. Если данная запись помечена для удаления, то
использует псевдоимя поля _DELETED.
Чтобы прочитать значения полей записи в массив можно поступить так:
@fields = $database->get_record;
В массиве они будут располагаться в такой же последовательности, как и в базе
данных.
Для закрытия базы данных используется метод close_dbf.
$database->close_dbf;
Закрывает файл с базой данных, индексами и комментариями. В завершение приведем
небольшой пример программы, которая распечатывает статус базы данных и индексного
файла, а также дату последнего обновления и количество записей в базе данных.
#!/usr/bin/perl
use Xbase;
# подключение модуля
$database = new Xbase;
# создание объекта
$d = "/home/smit/employee.dbf";
# имя файла с базой
$i = "/home/smit/employee.cdx";
# имя индексного файла
$database->open_dbf($d,$i);
# открываем базу данных
$database->dbf_stat;
# печатаем статус и структуру
# базы данных
$database->idx_stat;
# печатаем статус и структуру
# индексов
@fields = $database->get_record;
print @fields,"\n";
# печатаем содержимое текущей записи
print $database->last_update, "\n";
# печатаем дату последнего обновления
$end = $database->lastrec;
print $end;
#печатаем номер последней записи
Полная спецификация языка Perl приводиться в Приложении к отчету.
[]
[]
[]
Обработка журналов
Время от времени возникает необходимость уменьшить размер файлов
статистики путем их удаления или переноса в другое место. Если
сервер находится в режиме inetd, можно свободно удалять и переносить
файлы статистики. Они снова создадутся по указанным в ГКФ путям.
Если же сервер работает в режиме standalone, эти файлы постоянно
открыты процессами - серверами. Удаление или перенос их не освободят
место на диске и не приведут к созданию новых файлов. Для корректной
работы с журналами в этом случае, необходима остановка работы
сервера. Необходимо "убить" процессы - серверы, перенести
файлы журналов и перезапустить сервер. "Убить" процессы
- серверы можно послав команду kill процессу с номером, указанном
в файле PidFile (см. параметры ГКФ). Пример последовательности
команд для выполнения такой операции:
Для анализа файлов статистики существует большое количество программного
обеспечения, делающего "вытяжку" из них в виде диаграмм,
сравнительных таблиц и т.д.
Обзор расширений
Некоторые браузеры кроме поддержки базового языка HTML обладают
также дополнительными возможностями.
Первым браузером, имевшим действительно значительные расширения стал
Netscape Navigator. Популярность использования расширенных возможностей
Netscape была настолько высока, что они вошли в новый проект стандарта HTML 3.2.
Его конкурент, Microsoft Internet Explorer, предоставляет разработчикам Web-страниц еще больший простор; но тот факт, что
он функционирует лишь на одной платформе, делает разработку специфичных
для него документов не очень привлекательной (если, конечно, ВСЕ
пользователи ваших страниц не работают в Microsoft Windows и Internet
Explorer).
Большинство мелких расширений представляют собой дополнительные параметры
или значения параметров различных тегов. Они обсуждались нами во время
обсуждения тегов HTML.
Самыми существенными расширениями, конечно, являются внутренние языки
браузеров: JavaScript в и VBScript в .
Обсуждение этих языков выходит за рамки данной книги, их описания могут
быть найдены на серверах их производителей.
Обзор различных программ просмотра
На сегодняшний день существует множество браузеров, как коммерческих, так
и бесплатных. Все они имеют свои особенности, и очень важно их учитывать
при создании Web-страниц.
Автору известны следующие браузеры для платформ Microsoft Windows
и UNIX/XWindow:
LYNX - браузер, работающий в алфавитно-цифровом режиме, существует для
абсолютного большинства UNIX-систем, а также для ОС VMS. Бесплатный,
поставляется в исходных текстах.
Mosaic - один из первых графических браузеров. На сегодняшний день почти не
используется. Существует в версиях для MS Windows, для UNIX/XWindow/Motif поставляется
в исходных текстах. Бесплатный.
Arena - экспериментальный браузер комитета W3 Consortium для провалившегося
стандарта HTML 3.0. Существует для большинства UNIX-систем. Поставляется
бесплатно в исходных текстах.
Amaya - новый проект W3 Consortium, соответствующий проекту стандарта
HTML 3.2. Находится в очень ранней стадии разработки.
Cello - довольно простой браузер для MS Windows.
Emacs W3 mode - Web-браузер для интегрированной среды Emacs. Бесплатный.
HotJava - браузер компании Sun Microsystems, написанный на языке Java.
Netscape Navigator (Рис. ) - браузер, произведший настоящую революцию в мире
WWW. В нем впервые появились такие возможности, как фоновые цвета и
изображения, поддержка формата JPEG, и т.д. Существует для
MS Windows 3.xx, MS Windows95, Sun Solaris, SGI IRIX, BSDI, Linux, IBM
RS6000, DEC Digital UNIX, HP-UX. Почти для всех систем поддерживается
язык Java. Бесплатный для образовательных организаций, некоммерческих
пользователей и для пробы перед покупкой.
Microsoft Internet Explorer (Рис. )- взгляд известной фирмы Microsoft на то, каким
должен быть WWW браузер. Существует только для систем MS Windows95 и WindowsNT.
Подерживает язык Java, бесплатный.
На самом деле, браузеров очень и очень много. Поищите список на узле
.
Рис. П1.2.1: Netscape Navigator 3.0
Рис. П1.2.2: Microsoft Internet Explorer 3.0
Оценка трудоемкости обеспечения WWW доступа
Трудоемкость обеспечения WWW-доступа к базам данных, очевидно,
складывается из трудоемкости работ при реализации одного из вышеприведенных сценариев. Реализация
первого сценария связана с последовательным преобразованием всех данных, находящихся в исходной
БД. Разработка средств вывода содержимого таблицы в формате HTML с необходимым форматированием и текстовым сопровождением будет
занимать порядка 1-3-х дней для одного разработчика. Разработка средств построения индексной структуры к выводимым
данным является более творческой работой и может занять 1-3 недели для одного разработчика.
Трудоемкость построения интерфейсов для сценариев 2, 3, в общем случае,
эквивалентна трудоемкости построения этих интерфейсов при создании исходной информационной системы (т.е.
той, для которой обеспечивается WWW-доступ) с использованием традиционных средств разработки (не-CASE). В третьем сценарии дополнительные
трудозатраты пойдут на перегрузку данных в ИХ. При перегрузке данных без изменения структуры и имен
можно исходить из оценки трудозатрат: 1-2 таблицы в 1-2 дня для одного разработчика,
в зависимости от сложности и объема таблиц, при условии отладки технологии перегрузки.
При использовании различных средств разработки интерфейсов к БД,
представленных в отчете, трудозатраты могут существенно различаться. Ранжированный
по уменьшению трудозатрат на разработку интерфейсов список будет выглядеть так:
библиотеки и функции на языке C;
язык Perl;
- 4. пакеты WOW и Cold Fusion.
[]
[]
Однократное или периодическое преобразование содержимого БД в статические документы
В этом варианте содержимое БД просматривает специальная программа,
создающая множество файлов - связных HTML-документов (см.рис.1-2).
Полученные файлы могут быть перенесены на один или несколько WWW-серверов.
Доступ к ним будет осуществляться как к статическим гипертекстовым документам сервера.
Этот вариант характеризуется минимальными начальными расходами.
Он эффективен на небольших массивах данных простой структуры и редким обновлением, а также
при пониженных требованиях к актуальности данных, предоставляемых через WWW.
Кроме этого, очевидно полное отсутствие механизма поиска, хотя возможно развитое индексирование.
В качестве преобразователя может выступать программный комплекс,
автоматически или полуавтоматически генерирующий статические документы.
Программа-преобразователь может являться самостоятельно разработанной программой либо
быть интегрированным средством класса генераторов отчетов.
Оператор чтения из файла
В Perl есть несколько операций ввода-вывода. Для вывода из файла используется
команда <>.
open(STDIN,"/etc/passwd");
while ($string = )
{
@a = split(/[:]/,$string);
}
Внутри этих скобок стоит дескриптор файла. Считывание происходит построчно.
В конце файла принимает значение FALSE и цикл while завершается.
По умолчанию считывание происходит в переменную $_. Нулевой дескриптор файла
используется также как в sed и awk, то есть считывается поток из файлов перечисленных
в командной строке.
Оператор диапазона
.. - оператор диапазона. Реально это два разных оператора, в зависимости
от контекста. В списковом контексте он работает как оператор диапазона от
левого аргумента до правого.
for (1..10) {
#code
}
В скалярном контексте он возвращает булевское
значение. Если левый операнд TRUE, то .. принимает значение TRUE, если
правый операнд тоже TRUE.
if (101..200) { print 'hi;)';}
- напечатает вторую сотню строк
Оператор ``стрелка''
Также, как в С и С++ ``->'' является инфиксным оператором ссылки. Если правая
часть является [...] или {...} подпрограммой, тогда левая часть должна быть
символьной ссылкой на массив или хэш. Если правая часть - это имя метода или
скалярная переменная содержащая имя метода, то левая часть должна быть объектом
или именем класса.
Оператор замены множества символов
tr/SEARCHLIST/REPLACEMENTLIST/cds y/SEARCHLIST/REPLACEMENTLIST/cds
Заменяет все найденные символы из множества символов SEARCHLIST на
соответствующие символы из множества символов REPLACEMENTLIST. Возвращает
число символов, которые были заменены или удалены. Если посредством операторов
=~, !~ не была указана никакая строка, то обрабатывается переменная $_.
y является синонимом tr. Если SEARCHLIST заключен в скобки,
то REPLACEMENTLIST тоже заключается в скобки, которые могут отличаться от тех,
в которые заключается шаблон, например:
tr[A-Z][a-z]
tr(+-*/)/ABCD/
Этот оператор употребляется со следующими опциями:
c заменяет символы, которые не входят во множество SEARCHLIST на
REPLACEMENTLIST, например:
tr/a-zA-Z/ /cs;
заменит неалфавитные символы.
d Стирает символы, которые ни на что не заменяются.
s Переводит последовательность символов, которые заменяются на один и тот же
символ в один символ.
Например:
$a = 'CCCCCCCCC';
$a =~ tr/C/D/s;
теперь $a = 'D'
Оператор замены строки
Оператор s/PATTERN/REPLACEMENT/egimosx производит поиск строки, соответствующей
шаблону PATTERN и если строка найдена, то подстановку на ее место текста
REPLACEMENT. Возвращает количество произведенных подстановок.
Если перед этим не использовался оператор =~ или !~ для определения
переменной, которая будет обрабатываться, то будет модифицироваться переменная $_.
Этот оператор используется со следующими опциями:
e интерпретирует правую часть как выражение.
g производит подстановку на место каждой строки, соответствующей шаблону.
i производит поиск различающий большие и маленькие буквы.
m обрабатывает строку, как состоящую из нескольких строк.
o происходит подстановка только на место первой встреченной строки.
s обрабатывает строку, как состоящую только из одной строки.
x использует расширенные регулярные выражения.
Например:
$path =~ s|/usr/local/bin|/usr/bin|;
($foo = $bar) =~ s/this/that/o;
$count = ($paragraf =~ s/Mister\b/Mr./gm);
Оператор ``запятая''
, - оператор запятая или comma-оператор. В скалярном контексте он
обрабатывает левый аргумент и отбрасывает его значение, потом обрабатывает
правый аргумент и возвращает его величину. В этом он подобен comma-оператору
из C. В списковом контексте он играет роль разделителя аргументов и вставляет
оба аргумента в список. => является синонимом comma-оператора.
Операторы ++ и - -
Эти операторы работают также как и в С. То есть, если они стоят перед
переменной, то они увеличивают или уменьшают переменную до возвращения значения.
Если они стоят после переменной, то увеличение или уменьшение переменной
происходит после возврата значения. Если переменная содержит в себе число или
употребляется в скалярном контексте, то использование ++ дает обычное
увеличение значения. Если же переменная употреблялась только в строковом
контексте, не является пустой строкой и содержит символы a-z,A-Z,0..9, то
происходит строковое увеличение значения переменной:
print ++($foo = '99'); - напечатает 100
print ++($foo = 'a0'); - напечатает a1
print ++($foo = 'Az'); - напечатает Ba
print ++($foo = 'zz'); - напечатает aaa
Операторы эквивалентности
== возвращает TRUE, если левый аргумент численно эквивалентен правому.
!= возвращает TRUE, если левый аргумент численно неэквивалентен правому.
<=> возвращает -1, 0 или 1 в зависимости от того, численно меньше,
равен или больше левый аргумент правого.
eq возвращает TRUE, если левый аргумент эквивалентен правому (в строковом контексте).
ne возвращает TRUE, если левый аргумент неэквивалентен правому (в строковом контексте).
cmp возвращает -1, 0 или 1 в зависимости от того, меньше равен или
больше левый аргумент правого (в строковом контексте).
Операторы присваивания
= - обычный оператор присваивания. Вообще операторы присваивания работают
также как и в C.
$a += 2; - то же самое, что и $a = $a + 2;
Можно использовать следующие сокращения:
**= += *= &= <<= &&=
-= /= |= >>= =
.= %= ^= x=
($a += 2) *= 3; - то же самое, что и :
$a = $a + 2;
$a = $a * 3;
Операторы сдвига
Двоичный сдвиг осуществляется, как и во многих других языках
программирования, с помощью операторов ``<<'' и ``>>''. При применении
этих операторов значения левых аргументов сдвигаются в соответствующую
сторону на количество разрядов, указанное в правых аргументах.
Аргументы должны быть целочисленными.
Операторы сравнения
``<'' - возвращает TRUE если левый аргумент численно меньше, чем правый.
``>'' - возвращает TRUE если правый аргумент численно меньше, чем левый.
``<='' - возвращает TRUE если правый аргумент численно меньше или равен левому.
``>='' - возвращает TRUE если левый аргумент численно меньше или равен правому.
``gt'' - возвращает TRUE если левый аргумент меньше (в строковом контексте), чем правый.
``lt'' - возвращает TRUE если правый аргумент меньше (в строковом контексте), чем левый.
На поведение операторов lt и gt влияют установки
системного языка, если операционная система способна работать с несколькими
языками. По этой причине операторы должны корректно работать со строками
на языках, отличных от US ASCII, что в системе UNIX задается указанием
свойств LC_COLLATE системного locale.
Операторы связки
Знак равенства с тильдой ``=~''связывает выражение слева
с определенным шаблоном. Некоторые операторы обрабатывают и модифицируют
переменную $_. Эти же операции иногда желательно бывает выполнить над
другой переменной. Правый аргумент это образец поиска, подстановки или
трансляции, левый аргумент - это то, что должно быть подставлено вместо
$_. Возвращаемая величина показывает успех операции.
Бинарное ``!~'' это тоже самое, что и ``=~'', только
возвращаемая величина является отрицательной в логическом смысле.
Определение типа данных MIME для содержимого документа
Cold Fusion позволяет задавать
тип MIME для данных которые
будут отправлены пользователю из текущего шаблона
(по умолчанию используется text/html).
Для этого используется тег DBCONTENT,
имеющий единственный атрибут TYPE,
который, собственно, и задает тип данных. Например, чтобы отправить
клиенту VRML - документ может
использоваться следующий шаблон:
SQL="SELECT VRML_Script
FROM CyberRooms WHERE
RoomNumber=#URL.RoomNumber#">
#VRML_Script#
Заметим, что Cold Fusion не
будет отправлять клиенту текст, расположенный до тега DBOUTPUT.
Оптимизация Web-страниц
По причине низкой пропускной способности каналов Internet возникает
необходимость в жестком слежении за размерами элементов Web-страниц,
особенно графики и multimedia-материалов. Для снижения размеров таких
ресурсов существует несколько стандартных методик, но, вообще говоря,
подход является индивидуальным. Каждое изображение или другой материал
имеет свои особенности, и на них можно выиграть драгоценное снижение
байтового размера. При разработке страницы на быстром компьютере
и с высокоскоростным каналом связи не всегда заметно то, от чего
страдают пользователи массовых модемов со скоростью 14400 бод (или даже ниже).
Поставьте себе такой модем и посмотрите на создаваемые страницы!
Если они плохо оптимизированы, то это откроет вам глаза.
В этом разделе мы рассмотрим основные приемы,
используемые при процессе оптимизации различных материалов для WWW.
Основные функции доступа
Мы приведем здесь пример программы, которая создает таблицу, помещает
в нее некоторые данные и потом производит выборку строк из этой таблицы.
#!/usr/local/bin/perl
use Oraperl;
# подключаем модуль Oraperl
$system_id = 'T:bdhost.com:Base';
$lda = &ora_login($system_id,'scott','tiger');
# вход в систему
$st = 'create table EMP (name varchar2(100),
organization varchar2(100))';
$csr = &ora_open($lda,$st) die $ora_errstr;
&ora_close($csr);
# создание таблицы в базе данных
$st = 'insert into EMP values
(\'John Smit\', \'NATO\')';
$csr = &ora_open($lda, $st);
&ora_close($csr);
# помещение строки в таблицу
В результате в базе создалась таблица из двух столбцов с одной записью:
Name
Organization
John Smit
NATO
$st = 'select name from EMP
where organization = \'NATO\'';
$csr = &ora_open($lda,$st);
# выбираем из таблицы значения столбца name,
# которым сответствует значение столбца organization
# равное 'NATO'
@result = &ora_fetch($csr);
# помещаем эти значения в массив @result
&ora_close($csr);
print @result;
&ora_logoff($lda);
# выход из системы
Для взаимодействия с Oracle в Perl есть специальный модуль Oraperl.pm.
Основными функциями для доступа к базе данных являются:
&ora_login
$lda = &ora_login($system_id,$username,$password)
Для того, чтобы получить доступ к информации, хранимой в Oracle необходимо сначала
войти в систему. Это осуществляется вызовом функции &ora_login(). Эта функция
имеет три параметра: системный идентификатор базы данных, имя пользователя в базе
и пароль пользователя. Возвращается идентификатор регистрации в системе (Oracle Login Data Area).
Несколько доступов могут осуществляться одновременно. Эта функция
эквивалентна функции OCI(Oracle Call Interface) olon или orlon.
&ora_open
$csr = &ora_open($lda, $statement [,$cache])
Для определения SQL-запроса в базу данных программа должна вызывать функцию
&ora_open. Эта функция имеет как минимум два параметра: идентификатор регистрации
и SQL выражение. Необязательный третий параметр описывает размер буфера строк для
SELECT оператора. Возвращается курсор Oracle. Если третий параметр опущен,
то используется стандартный размер буфера.
$csr = &ora_open($lda,'select ename,
sal from emp order by ename',10);
Эта функция эквивалентна функции OCI oopen или oparse.
&ora_bind
&ora_bind($csr, $var, ...)
Если SQL выражение содержит обращение к переменным языка Perl, то необходимо подставить вместо имен
значения переменных. Для этого используется функция &ora_bind.
$csr = &ora_open($lda, 'insert into emp values (:1,:2)');
&ora_bind($csr,$ename,$sal);
- подставляет в SQL выражение вместо :1 и :2 значения переменных $ename
и $sal.
&ora_fetch
$nfields = &ora_fetch($csr[, trunc]);
@array = &ora_fetch($csr);
Эта функция используется с оператором SQL SELECT для
извлечения информации из базы данных и имеет только один обязательный параметр
- идентификатор курсора, полученный в результате вызова функции &ora_open. В скалярном
контексте она возвращает число выбранных строк, в списковом - массив выбранных
строк. Второй необязательный параметр содержит информацию о том, можно ли обрезать
данные типов LONG и LONG RAW или выдавать сообщение об ошибке. Если параметр
опущен, то информация берется из переменной $ora_trunc.
Если произошло обрезание данных, то переменная $ora_errno принимает значение
1406. Эта функция эквивалентна функции OCI ofetch.
&ora_close
&ora_close($csr)
Если открытый курсор не будет больше использоваться, то его нужно закрыть
вызовом функции &ora_close. Это эквивалентно функции OCI oclose.
&ora_do
&ora_do($lda,$statement)
Не все SQL-выражения возвращают данные или содержат переменные для подстановки.
В таких случаях функция &ora_do выступает в качестве альтернативы &ora_open
и &ora_close. Первым параметром является идентификатор регистрации, вторым --
функция &ora_logoff. Она эквивалентна функции OCI ologoff.
Основные понятия
Использование технологий WWW для обеспечения доступа к каким-либо информационным ресурсам подразумевает существование следующих компонент (см.рис.1-1):
IP - сети с поддержкой базового набора услуг по передаче данных с единой политикой нумерации и маршрутизации, работающим сервисом имен DNS.
Выделенного информационного сервера - WWW-сервера,
обеспечивающего предоставление гипертекстовых документов через IP - сеть в ответ на запросы WWW - клиентов.
Передаваемые гипертекстовые документы оформляются в стандарте HTML - языке описания гипертекстовых документов. Эти документы могут либо храниться в статическом виде (совокупность файлов на диске), либо динамически компоноваться
в зависимости от параметров запроса специальным программным обеспечением. Для динамической компоновки HTML-документов, WWW-сервер использует специальным образом оформленные программы- CGI-программы.
Основные типы графики для WWW
Несмотря на то, что графическое оформление Web-страницы является довольно широким полем для фантазии, существует несколько типов наиболее употребимых графических вставок, как то:
разделяющие полосы (lines, rules)
фоновые картинки (backgrounds)
заглавные изображения (titles)
маркеры списков (bullets)
кнопки (buttons)
В Internet имеются довольно обширные коллекции бесплатных изображений такого типа. Тем не менее, иногда бывает проще нарисовать их для конкретных страниц самостоятельно.
Особенности WWW-графики
При подготовке графического материала для WWW следует учитывать некоторую специфику, связанную с тем, что графика будет передаваться по сети, а также с тем, что он будет, в основном, отображаться на компьютерных дисплеях.
Еще одной особенностью является тот исторически сложившийся факт, что на графических системах с глубиной цвета 8 бит (256 цветов) используется фиксированная палитра из 216-ти цветов выбранных так, чтобы в палитре равномерно присутствовали цвета спектра.
Пакет Cold Fusion фирмы Allaire Corp
Пакет предназначен для использования под ОС Windows и позволяет обращаться к различным базам данных,
поддерживающим интерфейс ODBC через WWW-интерфейсы. Пакет имеет коммерческий статус,
его "evaluation copy" является свободно-распространяемой.
Для доступа к базам данных используются конструкции языка DBML - расширения языка HTML,
дополненного средствами доступа к БД через ODBC. Документы на языке DBML обрабатываются
на серверной части, в результате чего создается HTML-документ.
Полноценная версия пакета, вместе с WWW - сервером стоит $486.
Пакет может эффективно использоваться в качестве обработчика запросов
WWW к исходным базам данных или информационному хранилищу (сценарии 2,3).
Глава отчета посвящена описанию процедуры установки и использованию пакета.
Пакет Web - Oracle - Web
Пакет WOW является свободно-распространяемым программным средством, предназначенным
для создания интерактивных WWW-интерфейсов с СУБД Oracle. Пакет WOW был первым и наиболее простым средством,
выпущенным фирмой Oracle. В настоящее время существует набор продуктов, развивающих
функциональность WOW'а - Oracle Web Server версий 1, 2, Oracle Web Arcitecture.
Все перечисленные продукты позволяют использовать процедурное
расширение языка SQL - PL/SQL, разработанное фирмой Oracle для динамического
создания гипертекстовых документов. Высокая скорость разработки достигается за счет резкого
упрощения доступа к БД - программы на PL/SQL исполняются самим сервером Oracle.
Предлагаемый пакет WOW был переработан в Новосибирском областном центре НИТ с целью поддержки
нескольких русскоязычных кодировок.
Основной областью использования WOW является обработка запросов от WWW-сервера к SQL-серверу Oracle в среде Unix. В предложенных сценариях пакет WOW позволит
организовать эффективный WWW доступ к информационному хранилищу, построенному на базе сервера баз данных Oracle (сценарий 3). Глава
отчета посвящена описанию процедур установки и администрирования
пакета.
Пакеты
Perl поддерживает механизм альтернативного именного пространства для каждого
отдельного пакета. Обычная программа является пакетом с именем main. Можно
ссылаться на переменные или дескрипторы файлов из других пакетов посредством
использования префикса перед именем переменной, состоящего из имени пакета и
двойного двоеточия: $Package::Variable. Если имя пакета нулевое, то предполагается
использование переменной из main пакета. То есть $::sail эквивалентно
$main::sail. Пакеты могут включать в себя другие пакеты, в таком случае
чтобы обратиться к переменной нужно применить описанное обозначение рекурсивно:
$OUTER::INNER::var.
В пакете могут содержаться только переменные, чьи имена начинаются с буквы или
подчерка, остальные переменные содержатся в пакете main. Кроме того
зарезервированные переменные, как то STDIN, STDOUT, STDERR, ARGV, ARGVOUT, ENV,
INC и SIG также содержатся в главном пакете.
package mypack;
sub main::mysub {
...
}