Построение web-приложения при помощи CGI::Ajax Александр Котов
Лирическое отступление: что такое Perl и для чего он нужен Perl  (Перл, тж.: Пёрл) — православный язык программирования, написанный Ларри Уоллом в 1987 году изначально для работы с текстовой документацией. Состоит из РегЭкспов чуть менее, чем полностью.  http://lurkmore.ru/Perl Основные применения языка: Обработка данных (РегЭкспы, тексты, логи, ...), системные скрипты Внутренние проекты: Perl как язык-клей, автотестирование, ... Разработка Web-приложений Perl (как правило) не применяется для ...
Плавно переходим к докладу Александр Котов –  мы используем Perl для ряда внутренних проектов и автоматизации тестирования Это применение Perl №2) Цель доклада Демонстрация возможностей модуля  CGI::Ajax А это – применение Perl №3) Целевая аудитория: Люди, имеющие отношение к веб-разработке Любители  Google Wave
Скажите, а причём здесь  Google Wave?!
Wave на Perl за 20 минут Уже за 1Х минут :) Wave – это Web-приложение Общая БД, совместная работа, AJAX, все дела Вот она, совместная работа: ... Сервер Клиент 1 Клиент 2
Архитектура AJAX-приложения Сервер База Данных Главное приложение HTML + JS + ...  AJAX engine AJAX callback
Реализации AJAX на Perl Можно реализовать AJAX ”Классическим” путем Это полезно для понимания технологии AJAX Можно воспользоваться одним из готовых фреймворков Можно воспользоваться одним из модулей CPAN Есть один качественный модуль – CGI::Ajax Нет, это не я его написал, а Brent Pedersen CGI::Ajax должен быть установлен из CPAN  Последняя версия на CPAN – это 0.707, октябрь 2008 Главное преимущество модуля – он простой!!! Главный недостаток модуля – он слишком простой...
Преимущества CGI::Ajax Сервер База Данных Главное приложение HTML + JS + ...  AJAX engine AJAX callback CGI::AJAX
Архитектура ”Wave Perl 0.0001” Сервер CGI::Ajax /tmp/database.txt print <<END; База Данных Wave Браузер Таймер
Пишем код 1:  Копипаст сэмпла CGI::Ajax use strict; use CGI;  # or any other CGI:: form handler/decoder use CGI::Ajax; my  $cgi  = new CGI; my  $pjx  = new CGI::Ajax( ' exported_func ' => \&perl_func ); print  $pjx->build_html ( $cgi , \&Show_HTML); sub perl_func { my  $input  = shift; my  $output  =  $input  . &quot;  was the input! &quot;; return(  $output  ); } sub Show_HTML { my  $html  = <<EOHTML; <HTML><BODY>Enter something:  <input type=&quot;text&quot; name=&quot;val1&quot; id=&quot;val1&quot; onkeyup=&quot; exported_func( ['val1'], ['resultdiv'] ); &quot;> <br> <div id=&quot;resultdiv&quot;></div> </BODY></HTML> EOHTML return  $html ; } Полная инкапсуляция в одном файле ! Модуль   автоматизирует: - AJAX-вызовы   - Инфраструру AJAX-вызовов - Paзделение Сallback'а и  программы
Пишем код 2: Клиентская часть sub Show_HTML { my  $html  = <<EOHTML; <HTML><BODY> <script language=&quot;JavaScript&quot;> function js_process_func(content) { if (content != document.getElementById('val1').value)       document.getElementById('val1').value = content; } </script> <h1>Wave on Perl:</h1> <textarea cols=&quot;30&quot; rows=&quot;6&quot; name=&quot;val1&quot; id=&quot;val1&quot; onkeyup=&quot; exported_func( ['val1'], [js_process_func] ); &quot;></textarea> </BODY></HTML> EOHTML return  $html ; }
Пишем код 3: Добавляем БД на сервер our  $database  = &quot; /tmp/wave_db.txt &quot;; ... #  $file_content = get_db_value($file_name); sub get_db_value { open(IN,  $_[0] ); my  $result  = join('', <IN>); close(IN); return  $result ; } #  save_db_value($file_name, $file_content); sub save_db_value { my ( $database ,  $content ) = @_;  open(OUT, ' > ',  $database ); # TODO: Add flock print OUT  $content ; close(OUT); } ... sub perl_func { save_db_value( $database ,  $_[0] ); return (get_db_value( $database )); } Велосипеды   и костыли
Пишем код 4: Добавляем js-таймер my  $pjx  = new CGI::Ajax( ' exported_func ' => \&perl_func, ' update_func ' => \&update_func, ); ... sub update_func { return (get_db_value( $database )); } ... sub Show_HTML { my  $html  = <<EOHTML; <HTML><BODY onload=&quot; setTimeout(internal_timer, 1000); &quot;> <script language=&quot;JavaScript&quot;> ... function internal_timer() { update_func( ['val1'], [js_process_func] ); setTimeout(internal_timer, 1000); } </script> ... Новое в серверном коде Новое в  клиентском коде
Оно работает!!! Есть куда расти: Блокировка записи Авторизация Добавление WaveID Мультимедийный контент Свистелки ... PROFIT!
Бонус: граф вызовов Серверный код Клиентский код textarea.onKeyUp() exported_func exported_func js_process_func() internal_timer() update_func update_func js_process_func() textarea.onKeyUp exported_func exported_func js_process_func
Ссылки http://search.cpan.org/~bpederse/CGI-Ajax-0.707/lib/CGI/Ajax.pm http://cpanratings.perl.org/dist/CGI-Ajax http://2009.yapcrussia.org/saintperl/talk/53 Идея для модуля CPAN: Написать автогенератор графа вызовов для CGI-Ajax Ссылки Спасибо!!!

Saint Perl 2009: CGI::Ajax demo

  • 1.
    Построение web-приложения припомощи CGI::Ajax Александр Котов
  • 2.
    Лирическое отступление: чтотакое Perl и для чего он нужен Perl (Перл, тж.: Пёрл) — православный язык программирования, написанный Ларри Уоллом в 1987 году изначально для работы с текстовой документацией. Состоит из РегЭкспов чуть менее, чем полностью. http://lurkmore.ru/Perl Основные применения языка: Обработка данных (РегЭкспы, тексты, логи, ...), системные скрипты Внутренние проекты: Perl как язык-клей, автотестирование, ... Разработка Web-приложений Perl (как правило) не применяется для ...
  • 3.
    Плавно переходим кдокладу Александр Котов – мы используем Perl для ряда внутренних проектов и автоматизации тестирования Это применение Perl №2) Цель доклада Демонстрация возможностей модуля CGI::Ajax А это – применение Perl №3) Целевая аудитория: Люди, имеющие отношение к веб-разработке Любители Google Wave
  • 4.
    Скажите, а причёмздесь Google Wave?!
  • 5.
    Wave на Perlза 20 минут Уже за 1Х минут :) Wave – это Web-приложение Общая БД, совместная работа, AJAX, все дела Вот она, совместная работа: ... Сервер Клиент 1 Клиент 2
  • 6.
    Архитектура AJAX-приложения СерверБаза Данных Главное приложение HTML + JS + ... AJAX engine AJAX callback
  • 7.
    Реализации AJAX наPerl Можно реализовать AJAX ”Классическим” путем Это полезно для понимания технологии AJAX Можно воспользоваться одним из готовых фреймворков Можно воспользоваться одним из модулей CPAN Есть один качественный модуль – CGI::Ajax Нет, это не я его написал, а Brent Pedersen CGI::Ajax должен быть установлен из CPAN Последняя версия на CPAN – это 0.707, октябрь 2008 Главное преимущество модуля – он простой!!! Главный недостаток модуля – он слишком простой...
  • 8.
    Преимущества CGI::Ajax СерверБаза Данных Главное приложение HTML + JS + ... AJAX engine AJAX callback CGI::AJAX
  • 9.
    Архитектура ”Wave Perl0.0001” Сервер CGI::Ajax /tmp/database.txt print <<END; База Данных Wave Браузер Таймер
  • 10.
    Пишем код 1: Копипаст сэмпла CGI::Ajax use strict; use CGI; # or any other CGI:: form handler/decoder use CGI::Ajax; my $cgi = new CGI; my $pjx = new CGI::Ajax( ' exported_func ' => \&perl_func ); print $pjx->build_html ( $cgi , \&Show_HTML); sub perl_func { my $input = shift; my $output = $input . &quot; was the input! &quot;; return( $output ); } sub Show_HTML { my $html = <<EOHTML; <HTML><BODY>Enter something: <input type=&quot;text&quot; name=&quot;val1&quot; id=&quot;val1&quot; onkeyup=&quot; exported_func( ['val1'], ['resultdiv'] ); &quot;> <br> <div id=&quot;resultdiv&quot;></div> </BODY></HTML> EOHTML return $html ; } Полная инкапсуляция в одном файле ! Модуль автоматизирует: - AJAX-вызовы - Инфраструру AJAX-вызовов - Paзделение Сallback'а и программы
  • 11.
    Пишем код 2:Клиентская часть sub Show_HTML { my $html = <<EOHTML; <HTML><BODY> <script language=&quot;JavaScript&quot;> function js_process_func(content) { if (content != document.getElementById('val1').value)      document.getElementById('val1').value = content; } </script> <h1>Wave on Perl:</h1> <textarea cols=&quot;30&quot; rows=&quot;6&quot; name=&quot;val1&quot; id=&quot;val1&quot; onkeyup=&quot; exported_func( ['val1'], [js_process_func] ); &quot;></textarea> </BODY></HTML> EOHTML return $html ; }
  • 12.
    Пишем код 3:Добавляем БД на сервер our $database = &quot; /tmp/wave_db.txt &quot;; ... # $file_content = get_db_value($file_name); sub get_db_value { open(IN, $_[0] ); my $result = join('', <IN>); close(IN); return $result ; } # save_db_value($file_name, $file_content); sub save_db_value { my ( $database , $content ) = @_; open(OUT, ' > ', $database ); # TODO: Add flock print OUT $content ; close(OUT); } ... sub perl_func { save_db_value( $database , $_[0] ); return (get_db_value( $database )); } Велосипеды и костыли
  • 13.
    Пишем код 4:Добавляем js-таймер my $pjx = new CGI::Ajax( ' exported_func ' => \&perl_func, ' update_func ' => \&update_func, ); ... sub update_func { return (get_db_value( $database )); } ... sub Show_HTML { my $html = <<EOHTML; <HTML><BODY onload=&quot; setTimeout(internal_timer, 1000); &quot;> <script language=&quot;JavaScript&quot;> ... function internal_timer() { update_func( ['val1'], [js_process_func] ); setTimeout(internal_timer, 1000); } </script> ... Новое в серверном коде Новое в клиентском коде
  • 14.
    Оно работает!!! Естькуда расти: Блокировка записи Авторизация Добавление WaveID Мультимедийный контент Свистелки ... PROFIT!
  • 15.
    Бонус: граф вызововСерверный код Клиентский код textarea.onKeyUp() exported_func exported_func js_process_func() internal_timer() update_func update_func js_process_func() textarea.onKeyUp exported_func exported_func js_process_func
  • 16.
    Ссылки http://search.cpan.org/~bpederse/CGI-Ajax-0.707/lib/CGI/Ajax.pm http://cpanratings.perl.org/dist/CGI-Ajaxhttp://2009.yapcrussia.org/saintperl/talk/53 Идея для модуля CPAN: Написать автогенератор графа вызовов для CGI-Ajax Ссылки Спасибо!!!