SlideShare une entreprise Scribd logo
1  sur  80
Télécharger pour lire hors ligne
Mojolicious.
                          Веб в коробке!
                            Анатолий Шарифулин




вторник, 18 мая 2010 г.
Perl, CGI.pm


вторник, 18 мая 2010 г.
Perl, cgi-bin/


вторник, 18 мая 2010 г.
Perl, cgi-bin/, гамно!


вторник, 18 мая 2010 г.
вторник, 18 мая 2010 г.
Что такое
                          Mojolicious?


вторник, 18 мая 2010 г.
Что такое Mojolicious?
               • Веб фреймворки:
                          Mojolicious::Lite, Mojolicious, Mojo
               • Объектно-ориентированное API,
                          без скрытой магии и зависимостей,
                          написанное на чистом Perl
               • Полный стек HTTP 1.1 и WebSocket
                          (клиент-сервер), а также IPv6, SSL и IDNA


вторник, 18 мая 2010 г.
HTTP 1.0
                    Запрос

                                        Ответ
                    Запрос

                                        Ответ




вторник, 18 мая 2010 г.
HTTP 1.1
                   Запрос


                   Запрос
                                       Ответ


                                       Ответ



вторник, 18 мая 2010 г.
Что такое Mojolicious?
               • Асинхронный ввод-вывод, prefork-веб
                          сервер с поддержкой epoll и kqueue,
                          unix-сокетов и «горячей» разработки
               • CGI, FastCGI и PSGI
               • RESTful-роутеры, плагины, сессии,
                          Perl-ish шаблонизатор, JSON, I18N



вторник, 18 мая 2010 г.
«Свежий» код,
                   основанный на опыте
                    разработке Catalyst


вторник, 18 мая 2010 г.
Удовольствие!

                                                   Код

                                             Mojolicious::Lite
                          Код

                                                 Mojolicious

                                         Mojo

            CGI            FastCGI    PSGI      HTTP 1.1       WebSocket


вторник, 18 мая 2010 г.
Mojolicious::Lite
                             MVC веб-фреймворк
                                  ~ sinatra




вторник, 18 мая 2010 г.
use Mojolicious::Lite;

                          get '/hello' => sub {
                             shift->render_text( 'Привет Devconf!' );
                          };

                          app->start;




вторник, 18 мая 2010 г.
use Mojolicious::Lite;

                          post '/hello' => sub {
                             shift->render_text( 'Привет Devconf!' );
                          };

                          app->start;




вторник, 18 мая 2010 г.
use Mojolicious::Lite;

                          any '/hello' => sub {
                             shift->render_text( 'Привет Devconf!' );
                          };

                          app->start;




вторник, 18 мая 2010 г.
use Mojolicious::Lite;

                          get '/hello' => (agent => qr/Firefox/) => sub {
                             shift->render_text( 'Привет Devconf!' );
                          };

                          app->start;




вторник, 18 мая 2010 г.
use Mojolicious::Lite;

                          post '/:name' => sub { # /*
                            my $self = shift;
                            my $name = $self->param('name');

                               $self->render_text( "Привет $name!" );
                          };

                          app->start;



вторник, 18 мая 2010 г.
use Mojolicious::Lite;

                          post '/:name' => { id => 42 } => sub { # /*
                             my $self = shift;
                             my $name = $self->param('name');
                             warn $self->param( 'id' );
                             $self->render_text( "Привет $name!" );
                          };

                          app->start;



вторник, 18 мая 2010 г.
use Mojolicious::Lite;

                          post '/:name' => { id => 42 } => sub { # /*
                             my $self = shift;
                             my $name = $self->param('name');
                             warn $self->stash( 'id' );
                             $self->render_text( "Привет $name!" );
                          };

                          app->start;



вторник, 18 мая 2010 г.
use Mojolicious::Lite;

                          post '/:name' => [ name => qr/d+/ ] => sub {
                            my $self = shift;
                            my $name = $self->param('name');

                               $self->render_text( "Привет $name!" );
                          };

                          app->start;



вторник, 18 мая 2010 г.
use Mojolicious::Lite;

                          any '/time' => 'clock';

                          app->start;

                          __DATA__

                          @@ clock.html.ep
                          % my ($sec, $min, $hour) = (localtime)[0, 1, 2];
                          Текущее время
                           <%= $hour %>:<%= $min %>:<%= $sec %>

вторник, 18 мая 2010 г.
use Mojolicious::Lite;

                          websocket '/echo' => sub {
                             my $self = shift;
                             $self->receive_message(
                                sub {
                                   my ($self, $msg) = @_;
                                   $self->send_message( "тук-тук: $msg" );
                                }
                             );
                          };


вторник, 18 мая 2010 г.
Примеры
                     Mojolicious WebSocket
                                @xantus, @vti
                          Интересный пример IRC-клиент




вторник, 18 мая 2010 г.
use Mojolicious::Lite;

                          get '/fetch' => sub {
                             my $self = shift;
                             $self->render_data(
                                 $self->client
                                      ->get( 'http://devconf.ru' )
                                      ->res
                                      ->body
                                 );
                          };


вторник, 18 мая 2010 г.
use Mojolicious::Lite;

                          plugin charset => { charset => 'windows-1251' };

                          ladder sub {
                             my $self = shift;

                                # проверка авторизации
                          };

                          ...


вторник, 18 мая 2010 г.
Cписок всех роутеров
                              приложения
                           script/lite.pl routes
                             /hello   (?-xism:^/hello)
                             /time    (?-xism:^/time)
                             /echo    (?-xism:^/echo)
                             /fetch   (?-xism:^/fetch)
                             /:name   (?-xism:^/((?-xism:d+)))


вторник, 18 мая 2010 г.
Если много шаблонов
                           в секции __DATA__
                            script/lite.pl inflate
                             /templates/
                             /templates/clock.html.ep




вторник, 18 мая 2010 г.
Сокращатель ссылок
                           на Mojolicious::Lite
                            100 строк кода (5 обработчиков)
                            130 строк шаблонов (4 шаблона)
                                        1 файл




вторник, 18 мая 2010 г.
вторник, 18 мая 2010 г.
Mojolicious
                           MVC веб-фреймворк
                             ~ Ruby on Rails




вторник, 18 мая 2010 г.
package App;
                          use base 'Mojolicious';

                          sub startup {
                            my $self = shift;

                               my $r = $self->routes;
                               $r->route('/:controller/:action/:id')
                                 ->to('example#welcome', id => 1);
                          }

                          1;


вторник, 18 мая 2010 г.
package App;
                          use base 'Mojolicious';

                          sub startup {
                            my $self = shift;

                               my $r = $self->routes;
                               $r->route('/:controller/:action/:id')
                                 ->to('example#welcome', id => 1);
                          }

                          1;


вторник, 18 мая 2010 г.
package App;
                          use base 'Mojolicious';

                          sub startup {
                            my $self = shift;

                               my $r = $self->routes;
                               $r->route('/:controller/:action/:id')
                                 ->to('example#welcome', id => 1);
                          }

                          1;


вторник, 18 мая 2010 г.
package App;
                          use base 'Mojolicious';

                          sub startup {
                            my $self = shift;

                               my $r = $self->routes;
                               $r->route('/:controller/:action/:id')
                                 ->to('example#welcome', id => 1);
                          }

                          1;


вторник, 18 мая 2010 г.
package App;
                          use base 'Mojolicious';

                          sub startup {
                            my $self = shift;

                              my $r = $self->routes;
                              my $b = $r->bridge->to('auth#check);

                              $b->route('/admin')->to('admin#welcome');
                          }



вторник, 18 мая 2010 г.
package App;
                          use base 'Mojolicious';

                          sub startup {
                            my $self = shift;

                               my $r = $self->routes;
                               $r->route('/:controller/:action/:id')
                                 ->to('example#welcome', id => 1);
                          }

                          1;


вторник, 18 мая 2010 г.
package App::Example;
                          use base 'Mojolicious::Controller';

                          sub welcome {
                              my $self = shift;
                          	

 warn $self->stash( ‘id’ );
                              $self->render( message => 'Devconf!' );
                          }

                          1;



вторник, 18 мая 2010 г.
Шаблон
          example/welcome.html.ep
                          controller / action . format . handler




вторник, 18 мая 2010 г.
Шаблон
            example/welcome.xml.ep
                          controller / action . format . handler




вторник, 18 мая 2010 г.
Шаблон
               example/welcome.rss.ep
                          controller / action . format . handler




вторник, 18 мая 2010 г.
Шаблон
           example/welcome.mail.ep
                          controller / action . format . handler




вторник, 18 мая 2010 г.
Шаблон
          example/welcome.html.ep
                          controller / action . format . handler




вторник, 18 мая 2010 г.
Шаблон
            example/welcome.html.tt
                          controller / action . format . handler




вторник, 18 мая 2010 г.
Шаблон
  example/welcome.html.cttp2
                          controller / action . format . handler




вторник, 18 мая 2010 г.
Шаблон
          example/welcome.html.ep
                          controller / action . format . handler




вторник, 18 мая 2010 г.
% layout 'default';

                          <h2><%= $message %></h2>

                          <a href="<%== url_for %>">click here</a>




вторник, 18 мая 2010 г.
<!doctype html>
                          <html>
                             <head><title> Привет! </title></head>
                             <body>
                               <%== content %>
                             </body>
                          </html>




вторник, 18 мая 2010 г.
Около 20 проектов
                            на Mojolicious


вторник, 18 мая 2010 г.
вторник, 18 мая 2010 г.
Mojo
                          Базовый веб-фреймворк




вторник, 18 мая 2010 г.
package App;
                          use base 'Mojo';

                          sub handler {
                              my ($self, $tx) = @_;
                          	

                          	

 warn $tx->req; warn $tx->req->url;
                          	

                              $tx->res->headers
                                       ->content_type( 'text/plain' );
                              $tx->res->body( 'Devconf 2010' );
                          }


вторник, 18 мая 2010 г.
вторник, 18 мая 2010 г.
Mojo::Client
                          HTTP 1.1 и WebSocket клиент




вторник, 18 мая 2010 г.
my $client = Mojo::Client->new;

                          $client->get(
                          	

 ‘http://devconf.ru’ => sub {
                          	

 	

 my ($self, $tx) = @_;
                          	

 	

 say $tx->res;
                          	

 }
                          )->process;




вторник, 18 мая 2010 г.
my $client = Mojo::Client->new;

                          $client->post(
                          	

 ‘http://devconf.ru’ => sub {
                          	

 	

 my ($self, $tx) = @_;
                          	

 	

 say $tx->res;
                          	

 }
                          )->process;




вторник, 18 мая 2010 г.
my $client = Mojo::Client->new;

                          $client->put(
                          	

 ‘http://devconf.ru’ => sub {
                          	

 	

 my ($self, $tx) = @_;
                          	

 	

 say $tx->res;
                          	

 }
                          )->process;




вторник, 18 мая 2010 г.
my $client = Mojo::Client->new;

                          $client->delete(
                          	

 ‘http://devconf.ru’ => sub {
                          	

 	

 my ($self, $tx) = @_;
                          	

 	

 say $tx->res;
                          	

 }
                          )->process;




вторник, 18 мая 2010 г.
my $client = Mojo::Client->new;

                          $self->client->get(
                          	

 ‘http://devconf.ru’ => sub {
                          	

 	

 my ($self, $tx) = @_;
                          	

 	

 say $tx->res;
                          	

 }
                          )->process;




вторник, 18 мая 2010 г.
my $client = Mojo::Client->new;

                          $client->async->get(
                          	

 ‘http://devconf.ru’ => sub {
                          	

 	

 my ($self, $tx) = @_;
                          	

 	

 say $tx->res;
                          	

 }
                          )->process;




вторник, 18 мая 2010 г.
my $client = Mojo::Client->new;

                          $client->get(‘http://devconf.ru’)->res->code;

                          $client->get(
                            'http://search.twitter.com/trends.json'
                          )->success->json->{trends}->[0]->{name}




вторник, 18 мая 2010 г.
Mojo::IOLoop
                            TCP клиент-сервер




вторник, 18 мая 2010 г.
my $loop = Mojo::IOLoop->new;
                          $loop->listen(port => 3000, cb => sub {
                             my ($self, $id) = @_;

                               $self->read_cb ($id => sub { ... });

                               $self->write_cb($id => sub { ... });
                          );
                          my $id = $loop->connect(port => 3000, ...);
                          $loop->start; $loop->stop;


вторник, 18 мая 2010 г.
Test::Mojo
                          Фреймворк для тестирования




вторник, 18 мая 2010 г.
my $t = Test::Mojo->new( app => 'App' );

                $t->get_ok( '/hello' )
                  ->status_is( 200 )
                  ->header_is(
                    'X-Powered-By' => 'Mojolicious (Perl)'
                  )
                  ->content_is( 'Привет Devconf!' );

                $t->post_ok( '/42' )
                  ->content_like(qr/Привет/, 'тест пройден!');


вторник, 18 мая 2010 г.
Всё, что нужно – есть!
                          Mojolicious – веб в коробке!




вторник, 18 мая 2010 г.
Mojolicious на CPAN
              • Mojolicious                • MojoX::Log::*
              • Mojo::Server::FCGI         • MojoX::Renderer::*
              • AnyEvent::Mojo              • TT
              • Apache::Mojo                • CTTP2, HTP
                     Apache2::Mojo
                                            • XSLT
              • Catalyst::Engine::Mojo      • Mail
                     Squatting::On::Mojo


вторник, 18 мая 2010 г.
Документация

               • Пока мало документации, зато очень
                          хороший фидбек :)
               • Mojolicious::Lite и Mojolicious::Guides
               • Mojolicious Handbook @kvorg
               • Mojolicious FAQ @vti

вторник, 18 мая 2010 г.
Полезная информация
                   • http://mojolicious.org
                   • irc://irc.perl.org/#mojo
                   • http://groups.google.com/group/mojolicious
                   • Github: kraih, vti, xantus, memowe, sharifulin
                   • Twitter: @kraih, @vtivti, @sharifulin
                   • Juick: @vti, @sharifulin
вторник, 18 мая 2010 г.
«Making hard things possible
          and everything fun!»
                          Девиз Mojolicious




вторник, 18 мая 2010 г.
«Duct tape
                          for the HTML5 Web»
                              Девиз Mojolicious #2




вторник, 18 мая 2010 г.
«Viva la revolution!»
                              Девиз Mojolicious #3




вторник, 18 мая 2010 г.
«Особая разновидность
  современного программиста
   – программист, изучающий
          фреймворки»
                          Алекс Капранов




вторник, 18 мая 2010 г.
«Каждый программист
         должен сделать 3 вещи:
        фреймворк, шаблонизатор
         и событийную машину»
                          Анатолий Шарифулин




вторник, 18 мая 2010 г.
use Mojolicious
                                or die




вторник, 18 мая 2010 г.
Viva la revolution!



вторник, 18 мая 2010 г.
use Perl
                            or die




вторник, 18 мая 2010 г.
JFDI



вторник, 18 мая 2010 г.
Спасибо
                          за внимание!
                           Анатолий Шарифулин
                                    sharifulin




вторник, 18 мая 2010 г.
any ‘/questions’ => sub {
           	

 	

 shift->render(
           	

 	

 	

 answer => ‘sharifulin’
           	

 	

 );
              };
вторник, 18 мая 2010 г.

Contenu connexe

Plus de Anatoly Sharifulin

Ещё один способ привлекать и удерживать пользователей в играх
Ещё один способ привлекать и удерживать пользователей в играхЕщё один способ привлекать и удерживать пользователей в играх
Ещё один способ привлекать и удерживать пользователей в играхAnatoly Sharifulin
 
ASO Аудит для приложений и игр
ASO Аудит для приложений и игрASO Аудит для приложений и игр
ASO Аудит для приложений и игрAnatoly Sharifulin
 
ASO для iOS 11 (продвижение In-App Prurchases)
ASO для iOS 11 (продвижение In-App Prurchases)ASO для iOS 11 (продвижение In-App Prurchases)
ASO для iOS 11 (продвижение In-App Prurchases)Anatoly Sharifulin
 
AppFollow митап в Москве
AppFollow митап в МосквеAppFollow митап в Москве
AppFollow митап в МосквеAnatoly Sharifulin
 
То, что русскому — ФРИИ, финну — Startup Sauna. Опыт прохождения акселерации ...
То, что русскому — ФРИИ, финну — Startup Sauna. Опыт прохождения акселерации ...То, что русскому — ФРИИ, финну — Startup Sauna. Опыт прохождения акселерации ...
То, что русскому — ФРИИ, финну — Startup Sauna. Опыт прохождения акселерации ...Anatoly Sharifulin
 
Аналитика приложений конкурентов в Google Play
Аналитика приложений конкурентов в Google PlayАналитика приложений конкурентов в Google Play
Аналитика приложений конкурентов в Google PlayAnatoly Sharifulin
 
Конкурентный анализ мобильных приложений
Конкурентный анализ мобильных приложенийКонкурентный анализ мобильных приложений
Конкурентный анализ мобильных приложенийAnatoly Sharifulin
 
Аналитика приложений конкурентов
Аналитика приложений конкурентовАналитика приложений конкурентов
Аналитика приложений конкурентовAnatoly Sharifulin
 
Аналитика магазинов приложений
Аналитика магазинов приложенийАналитика магазинов приложений
Аналитика магазинов приложенийAnatoly Sharifulin
 
Аналитика мобильных приложений
Аналитика мобильных приложенийАналитика мобильных приложений
Аналитика мобильных приложенийAnatoly Sharifulin
 
Анализ приложений конкурентов
Анализ приложений конкурентовАнализ приложений конкурентов
Анализ приложений конкурентовAnatoly Sharifulin
 
ASO оптимизация мобильных приложений: «Что такое хорошо и что такое плохо?»
ASO оптимизация мобильных приложений: «Что такое хорошо и что такое плохо?»ASO оптимизация мобильных приложений: «Что такое хорошо и что такое плохо?»
ASO оптимизация мобильных приложений: «Что такое хорошо и что такое плохо?»Anatoly Sharifulin
 
Продвижение мобильных приложений: с чего начать?
Продвижение мобильных приложений: с чего начать?Продвижение мобильных приложений: с чего начать?
Продвижение мобильных приложений: с чего начать?Anatoly Sharifulin
 
Основной продукт vs. мобильный на примере Ostrovok.ru
Основной продукт vs. мобильный на примере Ostrovok.ruОсновной продукт vs. мобильный на примере Ostrovok.ru
Основной продукт vs. мобильный на примере Ostrovok.ruAnatoly Sharifulin
 
ASO оптимизация и продвижение мобильных приложений
ASO  оптимизация и продвижение мобильных приложенийASO  оптимизация и продвижение мобильных приложений
ASO оптимизация и продвижение мобильных приложенийAnatoly Sharifulin
 

Plus de Anatoly Sharifulin (20)

Ещё один способ привлекать и удерживать пользователей в играх
Ещё один способ привлекать и удерживать пользователей в играхЕщё один способ привлекать и удерживать пользователей в играх
Ещё один способ привлекать и удерживать пользователей в играх
 
ASO Аудит для приложений и игр
ASO Аудит для приложений и игрASO Аудит для приложений и игр
ASO Аудит для приложений и игр
 
ASO для iOS 11 (продвижение In-App Prurchases)
ASO для iOS 11 (продвижение In-App Prurchases)ASO для iOS 11 (продвижение In-App Prurchases)
ASO для iOS 11 (продвижение In-App Prurchases)
 
ASO для iOS 11
ASO для iOS 11ASO для iOS 11
ASO для iOS 11
 
AppFollow митап в Москве
AppFollow митап в МосквеAppFollow митап в Москве
AppFollow митап в Москве
 
ASO Best Practices 2016
ASO Best Practices 2016ASO Best Practices 2016
ASO Best Practices 2016
 
То, что русскому — ФРИИ, финну — Startup Sauna. Опыт прохождения акселерации ...
То, что русскому — ФРИИ, финну — Startup Sauna. Опыт прохождения акселерации ...То, что русскому — ФРИИ, финну — Startup Sauna. Опыт прохождения акселерации ...
То, что русскому — ФРИИ, финну — Startup Sauna. Опыт прохождения акселерации ...
 
Аналитика приложений конкурентов в Google Play
Аналитика приложений конкурентов в Google PlayАналитика приложений конкурентов в Google Play
Аналитика приложений конкурентов в Google Play
 
ASO FAQ
ASO FAQASO FAQ
ASO FAQ
 
ASO: Best Practices 2015
ASO: Best Practices 2015ASO: Best Practices 2015
ASO: Best Practices 2015
 
AppFollow Demo Day ФРИИ
AppFollow Demo Day ФРИИAppFollow Demo Day ФРИИ
AppFollow Demo Day ФРИИ
 
Конкурентный анализ мобильных приложений
Конкурентный анализ мобильных приложенийКонкурентный анализ мобильных приложений
Конкурентный анализ мобильных приложений
 
Аналитика приложений конкурентов
Аналитика приложений конкурентовАналитика приложений конкурентов
Аналитика приложений конкурентов
 
Аналитика магазинов приложений
Аналитика магазинов приложенийАналитика магазинов приложений
Аналитика магазинов приложений
 
Аналитика мобильных приложений
Аналитика мобильных приложенийАналитика мобильных приложений
Аналитика мобильных приложений
 
Анализ приложений конкурентов
Анализ приложений конкурентовАнализ приложений конкурентов
Анализ приложений конкурентов
 
ASO оптимизация мобильных приложений: «Что такое хорошо и что такое плохо?»
ASO оптимизация мобильных приложений: «Что такое хорошо и что такое плохо?»ASO оптимизация мобильных приложений: «Что такое хорошо и что такое плохо?»
ASO оптимизация мобильных приложений: «Что такое хорошо и что такое плохо?»
 
Продвижение мобильных приложений: с чего начать?
Продвижение мобильных приложений: с чего начать?Продвижение мобильных приложений: с чего начать?
Продвижение мобильных приложений: с чего начать?
 
Основной продукт vs. мобильный на примере Ostrovok.ru
Основной продукт vs. мобильный на примере Ostrovok.ruОсновной продукт vs. мобильный на примере Ostrovok.ru
Основной продукт vs. мобильный на примере Ostrovok.ru
 
ASO оптимизация и продвижение мобильных приложений
ASO  оптимизация и продвижение мобильных приложенийASO  оптимизация и продвижение мобильных приложений
ASO оптимизация и продвижение мобильных приложений
 

Mojolicious

  • 1. Mojolicious. Веб в коробке! Анатолий Шарифулин вторник, 18 мая 2010 г.
  • 6. Что такое Mojolicious? вторник, 18 мая 2010 г.
  • 7. Что такое Mojolicious? • Веб фреймворки: Mojolicious::Lite, Mojolicious, Mojo • Объектно-ориентированное API, без скрытой магии и зависимостей, написанное на чистом Perl • Полный стек HTTP 1.1 и WebSocket (клиент-сервер), а также IPv6, SSL и IDNA вторник, 18 мая 2010 г.
  • 8. HTTP 1.0 Запрос Ответ Запрос Ответ вторник, 18 мая 2010 г.
  • 9. HTTP 1.1 Запрос Запрос Ответ Ответ вторник, 18 мая 2010 г.
  • 10. Что такое Mojolicious? • Асинхронный ввод-вывод, prefork-веб сервер с поддержкой epoll и kqueue, unix-сокетов и «горячей» разработки • CGI, FastCGI и PSGI • RESTful-роутеры, плагины, сессии, Perl-ish шаблонизатор, JSON, I18N вторник, 18 мая 2010 г.
  • 11. «Свежий» код, основанный на опыте разработке Catalyst вторник, 18 мая 2010 г.
  • 12. Удовольствие! Код Mojolicious::Lite Код Mojolicious Mojo CGI FastCGI PSGI HTTP 1.1 WebSocket вторник, 18 мая 2010 г.
  • 13. Mojolicious::Lite MVC веб-фреймворк ~ sinatra вторник, 18 мая 2010 г.
  • 14. use Mojolicious::Lite; get '/hello' => sub { shift->render_text( 'Привет Devconf!' ); }; app->start; вторник, 18 мая 2010 г.
  • 15. use Mojolicious::Lite; post '/hello' => sub { shift->render_text( 'Привет Devconf!' ); }; app->start; вторник, 18 мая 2010 г.
  • 16. use Mojolicious::Lite; any '/hello' => sub { shift->render_text( 'Привет Devconf!' ); }; app->start; вторник, 18 мая 2010 г.
  • 17. use Mojolicious::Lite; get '/hello' => (agent => qr/Firefox/) => sub { shift->render_text( 'Привет Devconf!' ); }; app->start; вторник, 18 мая 2010 г.
  • 18. use Mojolicious::Lite; post '/:name' => sub { # /* my $self = shift; my $name = $self->param('name'); $self->render_text( "Привет $name!" ); }; app->start; вторник, 18 мая 2010 г.
  • 19. use Mojolicious::Lite; post '/:name' => { id => 42 } => sub { # /* my $self = shift; my $name = $self->param('name'); warn $self->param( 'id' ); $self->render_text( "Привет $name!" ); }; app->start; вторник, 18 мая 2010 г.
  • 20. use Mojolicious::Lite; post '/:name' => { id => 42 } => sub { # /* my $self = shift; my $name = $self->param('name'); warn $self->stash( 'id' ); $self->render_text( "Привет $name!" ); }; app->start; вторник, 18 мая 2010 г.
  • 21. use Mojolicious::Lite; post '/:name' => [ name => qr/d+/ ] => sub { my $self = shift; my $name = $self->param('name'); $self->render_text( "Привет $name!" ); }; app->start; вторник, 18 мая 2010 г.
  • 22. use Mojolicious::Lite; any '/time' => 'clock'; app->start; __DATA__ @@ clock.html.ep % my ($sec, $min, $hour) = (localtime)[0, 1, 2]; Текущее время <%= $hour %>:<%= $min %>:<%= $sec %> вторник, 18 мая 2010 г.
  • 23. use Mojolicious::Lite; websocket '/echo' => sub { my $self = shift; $self->receive_message( sub { my ($self, $msg) = @_; $self->send_message( "тук-тук: $msg" ); } ); }; вторник, 18 мая 2010 г.
  • 24. Примеры Mojolicious WebSocket @xantus, @vti Интересный пример IRC-клиент вторник, 18 мая 2010 г.
  • 25. use Mojolicious::Lite; get '/fetch' => sub { my $self = shift; $self->render_data( $self->client ->get( 'http://devconf.ru' ) ->res ->body ); }; вторник, 18 мая 2010 г.
  • 26. use Mojolicious::Lite; plugin charset => { charset => 'windows-1251' }; ladder sub { my $self = shift; # проверка авторизации }; ... вторник, 18 мая 2010 г.
  • 27. Cписок всех роутеров приложения script/lite.pl routes /hello (?-xism:^/hello) /time (?-xism:^/time) /echo (?-xism:^/echo) /fetch (?-xism:^/fetch) /:name (?-xism:^/((?-xism:d+))) вторник, 18 мая 2010 г.
  • 28. Если много шаблонов в секции __DATA__ script/lite.pl inflate /templates/ /templates/clock.html.ep вторник, 18 мая 2010 г.
  • 29. Сокращатель ссылок на Mojolicious::Lite 100 строк кода (5 обработчиков) 130 строк шаблонов (4 шаблона) 1 файл вторник, 18 мая 2010 г.
  • 31. Mojolicious MVC веб-фреймворк ~ Ruby on Rails вторник, 18 мая 2010 г.
  • 32. package App; use base 'Mojolicious'; sub startup { my $self = shift; my $r = $self->routes; $r->route('/:controller/:action/:id') ->to('example#welcome', id => 1); } 1; вторник, 18 мая 2010 г.
  • 33. package App; use base 'Mojolicious'; sub startup { my $self = shift; my $r = $self->routes; $r->route('/:controller/:action/:id') ->to('example#welcome', id => 1); } 1; вторник, 18 мая 2010 г.
  • 34. package App; use base 'Mojolicious'; sub startup { my $self = shift; my $r = $self->routes; $r->route('/:controller/:action/:id') ->to('example#welcome', id => 1); } 1; вторник, 18 мая 2010 г.
  • 35. package App; use base 'Mojolicious'; sub startup { my $self = shift; my $r = $self->routes; $r->route('/:controller/:action/:id') ->to('example#welcome', id => 1); } 1; вторник, 18 мая 2010 г.
  • 36. package App; use base 'Mojolicious'; sub startup { my $self = shift; my $r = $self->routes; my $b = $r->bridge->to('auth#check); $b->route('/admin')->to('admin#welcome'); } вторник, 18 мая 2010 г.
  • 37. package App; use base 'Mojolicious'; sub startup { my $self = shift; my $r = $self->routes; $r->route('/:controller/:action/:id') ->to('example#welcome', id => 1); } 1; вторник, 18 мая 2010 г.
  • 38. package App::Example; use base 'Mojolicious::Controller'; sub welcome { my $self = shift; warn $self->stash( ‘id’ ); $self->render( message => 'Devconf!' ); } 1; вторник, 18 мая 2010 г.
  • 39. Шаблон example/welcome.html.ep controller / action . format . handler вторник, 18 мая 2010 г.
  • 40. Шаблон example/welcome.xml.ep controller / action . format . handler вторник, 18 мая 2010 г.
  • 41. Шаблон example/welcome.rss.ep controller / action . format . handler вторник, 18 мая 2010 г.
  • 42. Шаблон example/welcome.mail.ep controller / action . format . handler вторник, 18 мая 2010 г.
  • 43. Шаблон example/welcome.html.ep controller / action . format . handler вторник, 18 мая 2010 г.
  • 44. Шаблон example/welcome.html.tt controller / action . format . handler вторник, 18 мая 2010 г.
  • 45. Шаблон example/welcome.html.cttp2 controller / action . format . handler вторник, 18 мая 2010 г.
  • 46. Шаблон example/welcome.html.ep controller / action . format . handler вторник, 18 мая 2010 г.
  • 47. % layout 'default'; <h2><%= $message %></h2> <a href="<%== url_for %>">click here</a> вторник, 18 мая 2010 г.
  • 48. <!doctype html> <html> <head><title> Привет! </title></head> <body> <%== content %> </body> </html> вторник, 18 мая 2010 г.
  • 49. Около 20 проектов на Mojolicious вторник, 18 мая 2010 г.
  • 51. Mojo Базовый веб-фреймворк вторник, 18 мая 2010 г.
  • 52. package App; use base 'Mojo'; sub handler { my ($self, $tx) = @_; warn $tx->req; warn $tx->req->url; $tx->res->headers ->content_type( 'text/plain' ); $tx->res->body( 'Devconf 2010' ); } вторник, 18 мая 2010 г.
  • 54. Mojo::Client HTTP 1.1 и WebSocket клиент вторник, 18 мая 2010 г.
  • 55. my $client = Mojo::Client->new; $client->get( ‘http://devconf.ru’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; вторник, 18 мая 2010 г.
  • 56. my $client = Mojo::Client->new; $client->post( ‘http://devconf.ru’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; вторник, 18 мая 2010 г.
  • 57. my $client = Mojo::Client->new; $client->put( ‘http://devconf.ru’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; вторник, 18 мая 2010 г.
  • 58. my $client = Mojo::Client->new; $client->delete( ‘http://devconf.ru’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; вторник, 18 мая 2010 г.
  • 59. my $client = Mojo::Client->new; $self->client->get( ‘http://devconf.ru’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; вторник, 18 мая 2010 г.
  • 60. my $client = Mojo::Client->new; $client->async->get( ‘http://devconf.ru’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; вторник, 18 мая 2010 г.
  • 61. my $client = Mojo::Client->new; $client->get(‘http://devconf.ru’)->res->code; $client->get( 'http://search.twitter.com/trends.json' )->success->json->{trends}->[0]->{name} вторник, 18 мая 2010 г.
  • 62. Mojo::IOLoop TCP клиент-сервер вторник, 18 мая 2010 г.
  • 63. my $loop = Mojo::IOLoop->new; $loop->listen(port => 3000, cb => sub { my ($self, $id) = @_; $self->read_cb ($id => sub { ... }); $self->write_cb($id => sub { ... }); ); my $id = $loop->connect(port => 3000, ...); $loop->start; $loop->stop; вторник, 18 мая 2010 г.
  • 64. Test::Mojo Фреймворк для тестирования вторник, 18 мая 2010 г.
  • 65. my $t = Test::Mojo->new( app => 'App' ); $t->get_ok( '/hello' ) ->status_is( 200 ) ->header_is( 'X-Powered-By' => 'Mojolicious (Perl)' ) ->content_is( 'Привет Devconf!' ); $t->post_ok( '/42' ) ->content_like(qr/Привет/, 'тест пройден!'); вторник, 18 мая 2010 г.
  • 66. Всё, что нужно – есть! Mojolicious – веб в коробке! вторник, 18 мая 2010 г.
  • 67. Mojolicious на CPAN • Mojolicious • MojoX::Log::* • Mojo::Server::FCGI • MojoX::Renderer::* • AnyEvent::Mojo • TT • Apache::Mojo • CTTP2, HTP Apache2::Mojo • XSLT • Catalyst::Engine::Mojo • Mail Squatting::On::Mojo вторник, 18 мая 2010 г.
  • 68. Документация • Пока мало документации, зато очень хороший фидбек :) • Mojolicious::Lite и Mojolicious::Guides • Mojolicious Handbook @kvorg • Mojolicious FAQ @vti вторник, 18 мая 2010 г.
  • 69. Полезная информация • http://mojolicious.org • irc://irc.perl.org/#mojo • http://groups.google.com/group/mojolicious • Github: kraih, vti, xantus, memowe, sharifulin • Twitter: @kraih, @vtivti, @sharifulin • Juick: @vti, @sharifulin вторник, 18 мая 2010 г.
  • 70. «Making hard things possible and everything fun!» Девиз Mojolicious вторник, 18 мая 2010 г.
  • 71. «Duct tape for the HTML5 Web» Девиз Mojolicious #2 вторник, 18 мая 2010 г.
  • 72. «Viva la revolution!» Девиз Mojolicious #3 вторник, 18 мая 2010 г.
  • 73. «Особая разновидность современного программиста – программист, изучающий фреймворки» Алекс Капранов вторник, 18 мая 2010 г.
  • 74. «Каждый программист должен сделать 3 вещи: фреймворк, шаблонизатор и событийную машину» Анатолий Шарифулин вторник, 18 мая 2010 г.
  • 75. use Mojolicious or die вторник, 18 мая 2010 г.
  • 77. use Perl or die вторник, 18 мая 2010 г.
  • 79. Спасибо за внимание! Анатолий Шарифулин sharifulin вторник, 18 мая 2010 г.
  • 80. any ‘/questions’ => sub { shift->render( answer => ‘sharifulin’ ); }; вторник, 18 мая 2010 г.