Использование технологий WWW для доступа к базам данных

         

Методы


В 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";

}

}



Методы 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 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 передаваемого документа

<HTML><HEAD><TITLE>Result</TITLE></HEAD>

<BODY BGCOLOR=\"#FFAAAA\">

<H1>Hi there</H1><HR><BR>";

$i = 0;

while ($i <= $#ar) {

$ar[$i] =~ s/\+/ /g;

# заменяем в элементах массива + на пробел

$output .= "$ar[$i]\n";

# конкатенация переменной $output с

# элементом массива

$i++; }

$output .="<HR></BODY></HTML>";

# завершаем HTML страницу

print $output;

}

eval &Print;

# выполняем подпрограмму осуществляющую

# считывание, обработку и вывод информации

В данном примере был проиллюстрирован случай считывания параметров из входного

потока.

Если параметры передаются CGI-модулю в командной строке, то они помещаются в служебный

массив @ARGV. Например, если параметры пишуться в URL:

http://www.host.ru/cgi-bin/name.cgi?123+resource+time+12 .

Как видно из примера, написать 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 (см. параметры ГКФ). Пример последовательности

команд для выполнения такой операции:

kill `cat /usr/local/etc/httpd/logs/httpd.pid`

mv /usr/local/etc/httpd/logs/*.log

/otherdir

/usr/local/sbin/httpd

Для анализа файлов статистики существует большое количество программного

обеспечения, делающего "вытяжку" из них в виде диаграмм,

сравнительных таблиц и т.д.



Обзор расширений


Некоторые браузеры кроме поддержки базового языка 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 = <STDIN>)

{

@a = split(/[:]/,$string);

}

Внутри этих скобок стоит дескриптор файла. Считывание происходит построчно.

В конце файла <STDIN> принимает значение 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 - документ может

использоваться следующий шаблон:

<DBCONTENT TYPE="x-world/x-vrml">

<DBQUERY NAME="GetCyberRoom"

SQL="SELECT VRML_Script

FROM CyberRooms WHERE

RoomNumber=#URL.RoomNumber#">

<DBOUTPUT QUERY="GetCyberRoom">

#VRML_Script#

</DBOUTPUT>

Заметим, что 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. Первым параметром является идентификатор регистрации, вторым --

SQL выражение.

&ora_do($lda,'drop table employee');

это эквивалентно:

&ora_close(&ora_open($lda, 'drop table employee'));

&ora_logoff

&ora_logoff($lda)

Для выхода из системы используется

функция &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 {

...

}



Передача параметров в DBML-шаблон


Существует несколько способов передачи параметров между шаблонами.

Можно передавать параметры непосредственно в URL,

использовать для этого форму либо cookie.

Если параметры передаются через URL,

то они добавляются к адресу вызываемого шаблона через символ "&"

(амперсант) в виде параметр

= значение. Например, гипертекстовая ссылка,

приведенная ниже, отправляет параметр с именем 'user_id'

и значением 5 в шаблон 'example.dbm':

<A HREF="cgi-shl/dbml.exe?Template=example.dbm&user_id=5">

При передаче параметров через форму используются поля формы, которые

должны иметь имена, совпадающие с именами параметров, которые

требуется передать. Ниже приведен пример передачи параметра, из

предыдущего примера используя форму:

<FORM ACTION="cgi-shl/dbml.exe?Template=example.dbm">

<INPUT TYPE="HIDDEN"

NAME="user_id" VALUE="5">

<INPUT TYPE="SUBMIT"

VALUE="Enter">

</FORM>

Заметим, что при обращении к CGI

- программе DBML.EXE должен

быть определен стандартный параметр Template,

указывающий на конкретный шаблон.

Переменные, занесенные в cookie браузера

и переменные окружения CGI доступны

в любом шаблоне. Способы занесения информации в cookie

описаны в .



Переменные


В модуле Oraperl.pm есть шесть специальных переменных:
$ora_cache
$ora_long

$ora_trunc
$ora_errno
$ora_errstr
$ora_verno
Эти переменные

используются для определения поведения Oraperl в определенных условиях.


$ora_cache

Эта переменная определяет размер буфера для функции

&ora_open() и SELECT-выражения, если точный размер буфера не указан.

Как правило устанавливается размер буфера равный пяти. Присваивание этой

переменной значения, равного нулю, устанавливает значение этой переменной

равным первоначальному значению. Присваивание отрицательной величины

приводит к ошибке.


$ora_long

Обычно Oraperl спрашивает базу данных о длине каждого поля и соответствующим

образом распределяет буферное пространство. Это невозможно для полей типа

LONG и LONGRAW. Распределение пространства в предположении максимально

возможной длины (65535 bytes) привело бы к излишним тратам памяти. Поэтому

когда &ora_open() определяет, что поле имеет тип LONG, память распределяется

согласно значению переменной $ora_long. При инициализации она принимает

значение 80 (для совместимости с продуктами Oracle), но в программе ее

можно устанавливать произвольным образом.


$ora_trunc

Так как Oraperl не может точно определять длину значений

типа LONG, возникают ситуации, когда значение $ora_long недостаточно для

хранения полученных данных. В таком случае, если у &ora_fetch есть

необязательный второй параметр, происходит обрезание данных. Если второй

параметр опущен, то вместо него используется значение $ora_trunc.


$ora_errno

Содержит код ошибки произошедшей при последнем вызове

какой-либо функции. Есть два интересных случая, касающихся &ora_fetch().

В первом случае, если произошло обрезание данных типа LONG или LONGRAW и

обрезание было разрешено, тогда выполнение этой функции полностью успешно,

но $ora_errno принимает значение 1406, для индикации того, что произошло

обрезание. Во втором случае, если &ora_fetch() возвратила false, то

$ora_errno принимает значение 0 в случае конца данных или код ошибки,

если действительно произошла ошибка.


$ora_errstr

Содержит сообщение об ошибке, соответствующее значению

$ora_errno.


$ora_verno

Содержит версию Oraperl в формате v.ppp, где v -

основной номер версии, а ppp - patchlevel.



Переменные для подстановки


Oraperl позволяет SQL выражению содержать обращение к переменным языка Perl. Они

состоят из двоеточия и следующего за ним номера. Например:

$csr = &ora_open($lda,"insert into tel values(:1,:2)");

Эти два имени :1 и :2 называются переменными для подстановки. Функция

&ora_bind() используется для привязывания переменных к их значениям.

&ora_bind($csr, "Annette","3-222-2-22-22-22");

&ora_bind($csr,$name,$telephone);

Номера переменных должны следовать в порядке возрастания начиная с 1, так как

&ora_bind выполняет подстановку именно в таком порядке.



Переменные окружения


Переменные окружения условно делятся на два типа:

общие для всех типов запросов (устанавливаются для всех типов)

зависящие от метода запроса

К переменным первого типа относятся следующие переменные:

SERVER_SOFTWARE содержит информацию о WWW сервере (название/версия)

SERVER_NAME содержит информацию об имени машины, на которой запущен WWW сервер,

символическое имя или IP адрес соответствующие URL.

GATEWAY_INERFACE содержит информацию о версии CGI(CGI/версия)

Следующие переменные являются специфичными для разных типов запросов

и значения этим переменным присваиваются перед вызовом cgi-модуля.

CONTENT_LENGTH значение этой переменной соответствует длине стандартного входного

потока в символах.

CONTENT_TYPE эта переменная специфицирована для запросов содержащих дополнительную

информацию, таких как HTTP POST и PUT, и содержит тип данных этой информации.

SERVER_PROTOCOL эта переменная содержит информацию об имени и версии информационного

протокола (протокол/версия).

SERVER_PORT значение переменной содержит номер порта, на который был послан запрос.

REQUEST_METHOD метод запроса, который был использован "POST","GET","HEAD"

и т.д.

PATH_INFO значение переменной содержит полученный от клиента виртуальный путь до cgi-модуля

PATH_TRANSLATED значение переменной содержит физический путь до cgi-модуля, преобразованный из значения PATH_INFO.

SCRIPT_NAME виртуальный путь к исполняемому модулю, используемый для получения URL.

QUERY_STRING значение этой переменной соответствует строке символов следующей

за знаком "?" в URL соответствующему данному запросу. Эта информация не декодируется сервером.

REMOTE_HOST содержит символическое имя удаленной машины, с которой был произведен

запрос. В случае отсутствия данной информации сервер присваивает

пустое значение и устанавливает переменную REMOTE_ADDRESS.

REMOTE_ADDRESSсодержит IP адрес клиента

AUTH_TYPE если WWW-сервер поддерживает аутентификацию (подтверждение подлинности)

пользователей и cgi-модуль

является защищенным от постороннего доступа то, значение переменной

специфицирует метод аутотентификации.

REMOTE_USER

содержит имя пользователя в случае аутотентификации.

REMOTE_IDENT содержит имя пользователя, полученное от сервера (если сервер

поддерживает аутентификацию согласно RFC 931)

HTTP_ACCEPT список типов MIME известных клиенту. Каждый тип в списке должен

быть отделен запятой согласно спецификации HTTP (тип/подтип,тип/подтип

и т.д.)

HTTP_USER_AGENT название программы просмотра которую использует клиент при посылке

запроса.



Переменные окружения CGI


Каждый сеанс связи вызывающий CGI

- программу имеет конкретные переменные окружения. Доступ

к ним из шаблона осуществляется, также как и к другим параметрам,

только используется префикс 'CGI.',

например #CGI.REMOTE_ADDR#.



Перенаправление на другой URL (DBLOCATION & DBABORT)


Для перенаправления пользователя на другой URL

предназначен тег DBLOCATION. Этот

тег обычно применяется, если в шаблоне выполняется один или более

запросов, а затем нужно сразу же перейти к другому документу,

либо URL, на который нужно

отправит пользователя, зависит от параметра. Приведем пример использования

тега, иллюстрирующий его синтаксис:

<DBIF #NewPassword# is not

#PasswordConfirmation#>

<DBLOCATION URL="/login/invalidpassword.htm">

</DBIF>

В качестве значения атрибута URL

тега DBLOCATION можно

использовать параметры и переменные, допустимые в шаблоне. Например,

<DBLOCATION URL=#Page#>.

Для прерывания обработки шаблона в Cold

Fusion используется тег DBABORT.

<P>Этот текст будет отправлен

клиенту

<DBABORT>

<P>Этот текст не будет

отправлен клиенту

Обычно этот тег используется при неправильной аутентификации.



План отчета


В главах отчета будут подробно освещены различные этапы приведенных

сценариев, технологические решения, используемые для поддержки этих этапов. Взаимосвязь

глав отчета показывает схема на рис. 1-6.

Во второй главе подробно описывается язык HTML. Она необходима для понимания того,

какой вид должна иметь информация, представляемая с использованием технологий WWW.

Третья глава посвящена описанию базовых элементов WWW-технологии,

процедур установки и администрирования WWW-сервера.

Четвертая глава содержит материал по корневой технологии создания

динамических HTML-документов - интерфейсу CGI. Подробно описывается интерфейс CGI WWW-сервера

с вызываемыми программами. Именно CGI-программы (программы, удовлетворяющие спецификации CGI)

способны динамически обрабатывать WWW - запросы к базам данных.

В главах , , излагается три технологических

направления, используемых при реализации приведенных выше сценариев. Сориентировавшись на одно или несколько таких направлений,

можно реализовывать программные комплексы с функциями "Преобразователь"

и "Обработчик" сценариев 1-3.

Предлагаемые технологические решения обладают универсальностью

области применения. Одно решение может использоваться для:

Однократной генерации гипертекстовых документов.

Поддержки синхронности содержимого информационного хранилища с основной БД.

Обработки запросов от WWW-сервера с динамическим созданием документов на основе данных основной

БД или информационного хранилища.



Побитовое И, побитовое ИЛИ и Исключающее ИЛИ


Бинарное & возвращает объединенные побитово операнды.

Бинарное | возвращает перемноженные побитово операнды.

Бинарное ^ возвращает исключенные побитово операнды.



Поддержка русскоязычных кодировок


Исторически сложилось, что

в России распространены несколько русскоязычных кодировок, в основном

ориентированных на разные платформы. Наиболее известные из них:

КОИ - 8 8 - битовая кодировка по ГОСТ

Microsoft Code Page 866 ("Альтернативная") - кодировка,

используемая в MS-DOS

ISO-8859-5 - кодировка, утвержденная международной организацией

по стандартизации

Microsoft Code Page 1251 ("Windows") - кодировка,

используемая в Microsoft Windows.

Специалисты утверждают что всего в России имеют хождение 11 кодировок

русского алфавита.

Если Ваш WWW сервер ориентирован на использование внутри организации

или его пользователями будет являться ограниченный круг людей

с однотипными рабочими местами, Вы можете ограничиться одной кодировкой

русскоязычной информации на сервере.

Сложности возникают, когда Вы захотите расширить круг клиентов

сервера. Вам необходимо будет организовать поддержку нескольких

кодовых страниц для русскоязычных документов. Приведенный выше

список из четырех кодировок удовлетворит более 99% всех возможных

абонентов сервера.

Вообще говоря, в составе языка HTML имеются теги, определяющие

кодировку документа и должные позволить корректно прочитать документ

в любой кодировке. Однако в связи с тем,

что эти теги не поддерживаются ни одним из известных броузеров,

надеяться на них не стоит. Возможно, в будущем эта ситуация изменится,

и проблема с кодировками будет решена.

Для поддержки нескольких кодовых страниц применяется множество

методов, которые можно разбить на две группы:

использование файлов - копий одного документа в разных кодировках

динамическое преобразование документов из кодировки, в которой

они лежат на сервере, в кодировку, поддерживаемую WWW - клиентом.

В первом случае, на сервере физически присутствуют все файлы во

всех поддерживаемых кодировках. Документы в различных кодировках

отличаются между собой по правилам образования путей и имен.

Например:

indexw.html,

indexa.html

- добавление суффиксов, определяющих


кодировку. Или

.../koi8/index.html,

.../win/index.html

- различные базовые каталоги для разных кодировок.

При этом выделяется одна мастер - кодировка,

в которой новые документы располагаются на сервере,

а все остальные варианты документов получаются после работы

специальной программы - перекодировщика.

Программа - перекодировщик может запускаться вручную -

администратором WWW сервера

или автоматически, с использованием

команд cron, at.

Во втором случае, доступ к

документам осуществляется через дополнительную программу - перекодировщик,

динамически перекодирующую документы сервера в кодировку

WWW - клиента. Эта программа может быть CGI

- программой, через которую всегда осуществляется доступ

к русскоязычной части сервера. На

вход такой программе передается реальный путь документа и кодировка

WWW - клиента,

в которую нужно перекодировать указанный документ

(см. рис.

12.1)



Программа - перекодировщик может также располагаться между WWW

- клиентом и сервером (см.рис.12.2).

В таком варианте она называется PROXY.



Однако здесь возникает проблема с перекодировкой всех данных,

включая графику, видео,

аудио и других нетекстовых материалов.

Для ее решения PROXY придается

дополнительный интеллект - определять тип передаваемых данных

по заголовку MIME и решать,

перекодировать документ или нет,

на основе его типа. Программы

- перекодировщики с различными кодировками обрабатывают обращения

к разным портам tcp сервера.

Клиенту работа с PROXY видна

в URL.

Например:

http://www.nsu.ru:80/index.html

- для кодировки КОИ-8,

http://www.nsu.ru:8000/index.html

- для кодировки ISO-8859-5

и т.д.

[]

[]

[]


Поддержка транзакций


Для объединения нескольких запросов в одну транзакцию может быть

использован тег DBTRANSACTION. Все

запросы, содержащиеся внутри этого тега,

будут интерпретироваться как одна транзакция. То есть все изменения

сделанные в базе данных, либо будут одновременно сохранены, либо

не будет сохранено ни одно из них.

Приведем пример, в котором денежная сумма переводится с одного

банковского счета на другой:

<DBTRANSACTION>

<DBQUERY NAME="WithdrawCash"

DATASOURCE="Bank Accounts"

SQL = "UPDATE Accounts

SET Balance = Balance - #Amount#

WHERE Account_ID = #AccountFrom#

">

<DBQUERY NAME="DepositCash"

DATASOURCE="Bank Accounts"

SQL = "UPDATE Accounts

SET Balance = Balance + #Amount#

WHERE Account_ID = #AccountTo#

">

</DBTRANSACTION>

Заметим, что не все драйверы ODBC

поддерживают транзакции. Например,

драйверы для Oracle, SQL Server

и Access поддерживают транзакции,

а драйверы для FoxPro, dBase

и Paradox - нет.



Подпрограммы


Описать и использовать подпрограмму можно несколькими способами:

sub NAME; - подразумевает описание в дальнейшем тела подпрограммы.

sub NAME BLOCK - непосредственное описание.

$subref = sub BLOCK - анонимное описание.

use PACKAGE qw(NAME1, NAME2, NAME3) - включение подпрограмм из модулей.

Вызвать подпрограмму можно тоже несколькими способами:

    &NAME(LIST) - скобки обязательны для & формы.

    NAME(LIST) - & не обязательно со скобками.

    NAME LIST - скобки можно опустить в случае предварительного описания

    или включения подпрограммы из модуля.

    Аргументы передаются подпрограмме в виде локального массива @_, его элементы

    являются ссылками на реальные скалярные параметры. Подпрограмма возвращает

    значение, полученное в результате исполнения последнего оператора подпрограммы.

    Как уже говорилось, подпрограмма вызывается использованием префикса & перед

    ее именем, в Perl 5 этот префикс не обязателен. Пример:

    sub MAX {

    my $max = pop(@_);

    foreach $foo (@_) {

    $max = $foo if $max < $foo;

    }

    $max;

    }

    ...

    $bestmark = &MAX(1,2,3,4,5);

    Подпрограмма может вызываться рекурсивно. Если подпрограмма вызывается с использованием

    & формы, то список аргументов необязателен.

    Если вы хотите создать внутри модуля его собственную, невидимую снаружи подпрограмму,

    то описание должно быть анонимным:

    my $subref = sub {...}

    &$subref(1,2,3);



    Поля формы и параметры URL


    Если в шаблон, с помощью полей формы или в URL, были переданы

    параметры, то внутри любого тега DBML к этим параметрам

    можно обращаться, используя следующий синтаксис:

    #Form.Name#, #URL.Name#. На самом деле, префиксы 'Form.'

    и 'URL.' могут опускаться,

    если заранее известно, что не может быть параметров других типов

    с такими же именами. Это правило относится ко всем типам параметров

    и переменных.



    Последовательность действий для


    Исходя из разницы методов запросов GET и POST, можно определить последовательность действий для обработки входных данных cgi-модуля

    для разных типов запросов.



    Представление цвета


    Для обозначения цветов можно использовать слова вроде красный или

    белый. Но человеческий глаз различает миллионы цветовых оттенков,

    и не хватит слов ни одного языка, чтобы точно передать каждый из них.

    По этой причине с приближением эры цветного телевидения и печати

    люди стали задумываться над тем, как можно закодировать информацию

    о цвете.

    Всем хорошо известно, что существует чистые цвета (цвета видимого спектра,

    радуги) и смешанные цвета (например, белый цвет -- смешанный).

    В видимом спектре четко выделяются три основных цветовых оттенка:

    красный, зеленый и синий. Было замечено, что, смешивая эти основные цвета,

    можно с хорошей точностью получать почти все возможные оттенки,

    наблюдаемые нами в спектре. Именно на принципе смешения красного, зеленого

    и синего цветов построены электронные лучевые трубки цветных телевизоров

    и мониторов.

    Как известно, компьютеры работают с числами, и именно с числами им

    проще всего работать. Естественно, что для обозначения яркости цветовых

    компонент (так мы будем называть интенсивности основных цветов)

    в цифровой технике стали применять числа. Подсчитано, что для корректного

    цветовоспроизведения достаточно выделить по 256 уровней интенсивности

    для каждой из компонент. За нулевой уровень принимается полное отсутствие

    яркости, за 255-й -- полная яркость. Таким образом может быть отображено

    цветов.

    Для короткого обозначения такого представления цветов используется

    аббревиатура RGB (от Red-Green-Blue, названий основных цветов на

    английском языке).

    Если представить себе цветовое пространство, соответствующее

    RGB-модели, то оно будет представлять собой куб в системе координат, где

    в качестве осей выбраны линии возрастания интенсивности компонент,

    точками которого будут являться конкретные цвета.

    Люди с хорошим пространственным воображением, представив себе такой куб,

    могут сразу примерно прикидывать RGB-разложения конкретных цветов.

    RGB-куб выглядит примерно так:

    Запись RGB-описания цвета удобно производить в виде так называемого


    RGB-триплета: тройки чисел в шестнадцатеричной системе счисления

    (тогда все числа будут двузначными). Шестнадцатеричная система счисления

    отличается от общепринятой десятичной тем, что в качестве основания

    при разложении чисел используется число 16. ``Дополнительными'' цифрами

    считаются шесть первых букв латинского алфавита: A, B, C, D, E, F.

    Для получения RGB-триплета из имеющихся десятичных значений компонент

    легко произвести с помощью научного калькулятора (если не настоящего, то

    содержащегося в системе MS Windows или аналогичного).

    Получить значения RGB-компонент какого-либо конкретного цвета

    можно с помощью некотроых графических пакетов: диалоговые окна

    выбора цветов нередко содержат подобную информацию. Хорошим примером

    программы, имеющей подобные возможности, служит великолепный

    пакет Paint Shop Pro компании Jasc Inc.

    Если вы не хотите даже иметь дело с ``ученой цифирью'', вам

    сильно поможет программа Color Manipulation Device, доступная

    в Internet.

    Для пользователей системы XWindow можно порекомендовать программы

    XColorMix и XColorSel, также доступные в Internet.