Logo    
Продукты, технологии Проекты, внедрения Новости мира IT Форумы Курилка Новые публикации Учебный центр
CitForum    CITForum на CD Море(!) аналитической информации! :: CITFORUM.RU
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware HOWTO

22.10.2004

[an error occurred while processing this directive]
Google
WWW CITForum.ru

2000 г

Создание news-reader'а с веб-интерфейсом.

Перевод Анисимова Михаила (mih@da.ru)

Каждый, кто начинает программировать на Перле, сталкивается с аббревиатурой CPAN, что значит Comprehensive Perl Archive Network ("всеобъемлющий архив по Перлу") CPAN - прекрасный ресурс, где можно отыскать все что угодно, связанное с Перлом. В мире много зеркал CPAN, так что выбирайте то, которое вам ближе географически. Для этого сходите на ftp://ftp.funet.fi/pub/languages/perl/CPAN/CPAN, где есть список всех зеркал.

Немного об организации архива. Каждое зеркало центрального сервера содержит файл CPAN/Roadmap или CPAN/Roadmap.html, а также CPAN/modules/Readme, где есть описания всех содержащихся модулей. Вы скажете - Зачем нам эти модули? Мы и сами можем написать... Ну если так - то пожалуйста, пишите сами. А те, кто желает сэкономить время и силы, зайдите на CPAN и найдите для себя уже готовый модуль.

Не так давно передо мной стала задача - сделать что-то наподобие news-reader'а прямо на веб-странице. То есть: при обращении к серверу пользователь получает список сообщений в группе новостей (конференции) в виде ссылок на сами сообщения. Щелкнув по ссылке, пользователь сможет поглядеть картинку, содержащуюся в сообщении. Доступ к конференции осуществляется по протоколу NNTP.

Мне нужен был CGI, NNTP и base64 для декодирования картинок внутри сообщений. Для обеспечения CGI-интерфейса был взят модуль CGI.pm (CPAN/authors/id/LDS/CGI.pm-2.13.tar.gz). Для того, чтобы общаться с news-сервером по NNTP протоколу я нашел NNTPClient все там же на CPAN - CPAN/authors/id/RVA/NNTPClient-0.22.pm.gz. Ну и последний компонент - base64 декодировщик я нашел в модуле LWP (MIME:Base64) (CPAN/authors/id/LDS/CGI-modules-2.74.tar.gz.)

Использование библиотек, написанных не мной самим, позволило отвлечься от низкоуровневых задач, и сконцентрироваться на самом высоком уровне функционирования скрипта. Да и время сэкономило немало.

Вот такой скрипт получился в результате:

Скрипт 1

        =1=     #!/usr/bin/perl
        =2=
        =3=     use CGI;                        # must be version 2 or higher
        =4=     use News::NNTPClient;
        =5=     use MIME::Base64;
        =6=
        =7=     $nntpserver = "news.teleport.com"; # location of news server
        =8=
        =9=     ## because of the copyright nature of this material, you should
        =10=    ## put this script in a directory that has an appropriate htaccess file.
        =11=
        =12=    @groups = (
        =13=               ["clari.living.comics.bizarro", "Bizarro"],
        =14=               ["clari.living.comics.cafe_angst","Cafe Angst"],
        =15=               ["clari.living.comics.doonesbury","Doonesbury"],
        =16=               ["clari.living.comics.forbetter","For Better or For Worse"],
        =17=               ["clari.living.comics.foxtrot","Foxtrot"],
        =18=               ["clari.living.comics.ozone_patrol","Ozone Patrol"],
        =19=               ["clari.editorial.cartoons.toles","Toles"],
        =20=               ["clari.editorial.cartoons.worldviews","Worldviews"],
        =21=               ["clari.news.photos","News photos (not a comic, but handy)"],
        =22=               );
        =23=
        =24=    $Q = new CGI;
        =25=    $Qself = $Q->self_url;
        =26=
        =27=    unless ($group = $Q->param('group')) { # nothing at all, give index
        =28=        $links = join "\n",
        =29=        map { "<p><a href=\"$Qself?group=$_->[0]\">$_->[1]</a>" } @groups;
        =30=
        =31=        print <<"GROK"; q/"/;
        =32=    @{[$Q->header]}
        =33=    @{[$Q->start_html('Comics','merlyn@stonehenge.com')]}
        =34=    <h1>Read the Comics</h1>
        =35=    <p>Select the group you want to read:
        =36=    <HR>
        =37=    $links
        =38=    <HR>
        =39=    <p>Please respect the copyrights and license agreements of this service.
        =40=    @{[$Q->end_html]}
        =41=    GROK
        =42=    q/"/;
        =43=        exit 0;
        =44=    }
        =45=
        =46=    unless ($article = $Q->param('article')) { # group but no art, give group
        =47=        $N = new News::NNTPClient($nntpserver,119,0);
        =48=        for ($N->xover($N->group($group))) {
        =49=            ($numb,$subj) = split /\t/;
        =50=            $links .= "<p><a href=\"$Qself&article=$numb\">$subj</a>\n";
        =51=        }
        =52=
        =53=        print <<"GROK"; q/"/;
        =54=    @{[$Q->header]}
        =55=    @{[$Q->start_html('Comics','merlyn@stonehenge.com')]}
        =56=    <h1>Read the Comics</h1>
        =57=    <p>Select the article you wish to view:
        =58=    <HR>
        =59=    $links
        =60=    <HR>
        =61=    <p>Please respect the copyrights and license agreements of this service.
        =62=    @{[$Q->end_html]}
        =63=    GROK
        =64=    q/"/;
        =65=        exit 0;
        =66=    }
        =67=
        =68=    ## $group and $article both valid:
        =69=    $N = new News::NNTPClient($nntpserver,119,0);
        =70=    $N->group($group);
        =71=    @art = $N->article($article);
        =72=    shift @art while @art and $art[0] !~ /^Content-Type: (image\/[-a-z]+)/;
        =73=    $type = $1;
        =74=    shift @art while @art and $art[0] !~ /^\s*$/;
        =75=    pop @art;                       # heh
        =76=    $gif = decode_base64(join "", @art);
        =77=    print "Content-type: $type\n\n";
        =78=    print $gif;
        =79=    exit 0;

Комментарии:

Строки 3-5: подключение модулей

Строка 7: Адрес news-сервера можно конечно же поменять.

Строки 12-22 определяют массив названий групп, в длинной форме - для сервера и в короткой - для человека. Длинное имя можно получить, например, так - $groups[2][0], а короткое - $groups[2][1]

В строке 24 создается CGI-объект $Q. Входные данные скрипт может получать из командной строки, через переменную окружения и из стандартного потока ввода.

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

В 27 строке проверяется входной параметр 'group'. И если его нет - то выводится полный список групп. Строки 28-44 создают страничку со списком доступных групп на основе массива @groups 28-29 строки создают переменную $links, содержащую ссылки на группы в виде:

        <p><a href="SOMEWHERE?group=clari.living.comics.doonesbury">Doonesbury</a>
        Где SOMEWHERE - это как раз URL скрипта.

Строки с 32 по 40 выводят результат - заголовок, начало HTML-документа, список ссылок и конец HTML-документа. Конструкция @{[thing]} - это вывод 'thing' в списковом контексте. Можно было вместо этого просто разбить оператор print на несколько операторов print.

Строка 46: проверка на наличие входного параметра article.

Строки с 47 по 65 выводят список сообщений в выбранной группе.

Строка 47: установление соединения с news-сервером (порт 119 - стандартный)

Строки с 48 по 51: вывод тем всех сообщений в данной конференции. Выражение в строке 48 возвращает массив строк, где символом табуляции разделены номер и тема сообщения. 49 строка разбивает строки, а 50тая - создает строку со списком уже в HTML-виде, где на каждое сообщение - своя ссылка:

<p><a href="SOMEWHERE?group=clari.living.comics.doonesbury&article=123">Doonesbury 950101</a>

Строки 52-60: вывод результатов

Строка 69 начинает часть скрипта, которая непосредственно выдает картинки, содержащиеся в отдельных сообщениях. Снова устанавливается соединение с news-сервером, и забирается уже конкретное сообщение.

Строка 71: сообщение укладывается в массив @art

Строка 72: так как важна только та часть сообщения, которая начинается с Content-type, то все остальные строки можно выкинуть. При этом сохраняется тип картинки (строка 73).

Строки 74-75: Пустая строка после Content-type пропускается

Строка 76: непосредственно декодирование из base64

Строки 77-78: вывод картинки браузеру

 

Ближайшие курсы Центра Информационных Технологий:

25-28 октября 2004, Москва
Введение в объектно-ориентированный анализ и проектирование и унифицированный процесс разработки программного обеспечения c использованием языка UML и CASE-средства IBM Rational Rose

1-4 ноября 2004, Москва
Современные технологии анализа и проектирования информационных систем

1-5 ноября 2004, Москва
Основы передачи данных

9-10 ноября 2004, Москва
Основы моделирования бизнес-процессов и спецификации требований к ПО

Подписка на новости библиотеки:

Новые поступления в on-line библиотеку:

19 октября

  • Функциональная безопасность программных средств
  • Технологические процессы и стандарты обеспечения функциональной безопасности в жизненном цикле программных средств
  • Так как же восстановить данные таблицы?
  • Использование CAST и табличных функций в PL/SQL

    14 октября

  • Разрезая биллионы
  • Платформа, которой не существует
  • Intel 9xx: время тестов
  • Сбалансированная система показателей: краткий обзор рынка программного обеспечения
  • Кросс-браузерность: теория и практика

    12 октября

  • В борьбе за каждый миллиметр
  • Хранилища данных и семантические разрывы
  • BI и ССП: связь между ними
  • Десять заповедей резервного копирования

    7 октября

  • XML-СУБД Sedna: технические особенности и варианты использования
  • Хранилище данных: вопросы и ответы
  • Порядок разработки ETL-процессов

    5 октября

  • Использование сокетов в Delphi
    Часть первая: стандартные сокеты
    Часть вторая: сокеты Windows
  • Задачи и аналитическая платформа для ВРМ
  • Методики, технологии и инструменты ВРМ
  • Выбор системы управления эффективностью бизнеса: решающие факторы

    30 сентября

  • MySQL: Руководство разработчика
  • MySQL: Руководство по ODBC и MyODBC

    28 сентября

  • СУБД ЛИНТЕР. Технический обзор
  • Новое в СУБД ЛИНТЕР 6.1
  • Использование ЛИНТЕР в качестве встроенной СУБД

    21 сентября

  • Материалы книги П.Б.Храмцова "Система доменных имен"
  • Храните свои терабайты в ящике
  • Тестирование контроллеров iSCSI
  • Девять ошибок, которые могут помешать работе SAN

    16 сентября

  • Курс лекций В.В.Воеводина "Параллельная обработка данных"
  • Заморочки от Oracle, или знать бы, где упасть
  • Реинжиниринг: многое в малом
  • CASE-технологии: что, когда, как?

    14 сентября

  • Сильнее угроза - крепче защита (обзор 16 инструментов)
  • GnuPG - OpenSource шифрование и цифровые подписи
  • Оптимизация не-HTML-сайтов для поисковых серверов
  • Новые графические супер-карты от ATI и NVidia
  • Новая жизнь Ethernet

    9 сентября

  • Экстремальное программирование и быстрая разработка ПО
  • 64 бита - "народные" и не очень
  • Рынок ЖК-дисплеев: компании меняют приоритеты
  • Футбольный стадион на рабочем столе

    7 сентября

  • Методология оценки безопасности информационных технологий по общим критериям
  • MySQL Administrator - рулить СУБД легко
  • Взгляд на Windows через лупу
  • Все яйца в одном лукошке
  • Жесткие диски: любимая емкость

    2 сентября

  • Обзор внешних жестких дисков
  • Техника безопасности в беспроводном мире
  • Добавляем в компьютер USB
  • OpenGL и Delphi на практике
  • OpenGL: раскрой глаза на трехмерную графику
  • Иллюзии и реалии безопасности (обзор журнала Computer)

    31 августа

  • Ipsysctl tutorial 1.0.4
  • От включения питания до приглашения Bash
  • OpenBSD - заметки конечного пользователя
  • Запуск Linux-приложений из FreeBSD

    24 августа

  • О системных таблицах InterBase
  • О blog-ах замолвим пару словечек
  • Что такое RSS?
  • Разгон... Sound Blaster'а

    19 августа

  • Введение в Delphi 8
  • Парное тестирование - возьмем от ХР лучшее
  • XML-RPC: вызов процедур посредством XML
  • Связь и интернет для всей планеты
  • Сети для ловли будущего
  • Три кита будущей беспроводной свободы

    17 августа

  • Стеганография. Особенности использования программ на основе метода наименьшего значащего бита
  • Ping своими руками
  • Спецификации XML 1.1 и "Пространства имен 1.1"
  • Что нового в WSDL 2.0

    11 августа

  • Информационная безопасность в современных системах управления базами данных
  • Методические рекомендации №1 "О порядке автоматизации отчетности по МСФО"
  • Черводинамика: причины и следствия
  • Оживляем веб-страничку
  • Тихий ПК: несколько простых способов избавиться от компьютерного шума

    10 августа

  • Полезные советы по Windows XP
  • Oracle и Perl - это очень просто

    9 августа

  • Проблемы при восстановлении и их решение
  • Восстановление сервера с помощью onbar и ISM
  • Настройка диспетчера хранения данных ISM

    5 августа
    Виктор Костромин. "Linux для пользователя"

    Все новости >>>



  • IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware HOWTO

    Реклама на IT-портале citforum.ru

    Нестандартные PR-акции - pr@citforum.ru
    Пресс-релизы и информация в каталог компаний - manager@citforum.ru
    Послать комментарий
    Информация для авторов
    Rambler's Top100 TopList This Web server launched on February 24, 1997
    Copyright © 1997-2000 CIT, © 2001-2004 CIT Forum
    Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.