SlideShare uma empresa Scribd logo
1 de 165
Baixar para ler offline
Mojo.
                     Веб в коробке!
                         BY Perl Too 2009




17 октября 2009 г.
http://mojolicious.org/
17 октября 2009 г.
Sebastian Riedel
                       создатель Catalyst и Mojo
                         http://labs.kraih.com/




17 октября 2009 г.
http://twitter.com/kraih
17 октября 2009 г.
Catalyst + Mojo = ?
17 октября 2009 г.
Что такое Mojo?


17 октября 2009 г.
Что такое Mojo?
                     • Pure Perl веб-фреймворк
                     • Без зависимостей (начиная с Perl 5.10)
                     • Объектно-ориентированное API
                     • Поддержка HTTP 1.1 (клиент-сервер)
                     • CGI, FastCGI, Daemon и Daemon Prefork
                     • MVC веб-фреймворки:
                        Mojolicious и Mojolicious::Lite

17 октября 2009 г.
Что такое Mojo?
                     • Pure Perl веб-фреймворк
                     • Без зависимостей (с версии Perl 5.8.1)
                     • Объектно-ориентированное API
                     • Поддержка HTTP 1.1 (клиент-сервер)
                     • CGI, FastCGI, Daemon и Daemon Prefork
                     • MVC веб-фреймворки:
                        Mojolicious и Mojolicious::Lite

17 октября 2009 г.
Что такое Mojo?
                     • Pure Perl веб-фреймворк
                     • Без зависимостей (с версии Perl 5.8.1)
                     • Объектно-ориентированное API
                     • Поддержка HTTP 1.1 (клиент-сервер)
                     • CGI, FastCGI, Daemon и Daemon Prefork
                     • MVC веб-фреймворки:
                        Mojolicious и Mojolicious::Lite

17 октября 2009 г.
Что такое Mojo?
                     • Pure Perl веб-фреймворк
                     • Без зависимостей (с версии Perl 5.8.1)
                     • Объектно-ориентированное API
                     • Поддержка HTTP 1.1 (клиент-сервер)
                     • CGI, FastCGI, Daemon и Daemon Prefork
                     • MVC веб-фреймворки:
                        Mojolicious и Mojolicious::Lite

17 октября 2009 г.
Что такое Mojo?
                     • Pure Perl веб-фреймворк
                     • Без зависимостей (с версии Perl 5.8.1)
                     • Объектно-ориентированное API
                     • Поддержка HTTP 1.1 (клиент-сервер)
                     • CGI, FastCGI, Daemon и Daemon Prefork
                     • MVC веб-фреймворки:
                        Mojolicious и Mojolicious::Lite

17 октября 2009 г.
Что такое Mojo?
                     • Pure Perl веб-фреймворк
                     • Без зависимостей (с версии Perl 5.8.1)
                     • Объектно-ориентированное API
                     • Поддержка HTTP 1.1 (клиент-сервер)
                     • CGI, FastCGI, Daemon и Daemon Prefork
                     • MVC веб-фреймворки:
                        Mojolicious и Mojolicious::Lite

17 октября 2009 г.
Что такое Mojo?
                     • Pure Perl веб-фреймворк
                     • Без зависимостей (с версии Perl 5.8.1)
                     • Объектно-ориентированное API
                     • Поддержка HTTP 1.1 (клиент-сервер)
                     • CGI, FastCGI, Daemon и Daemon Prefork
                     • MVC веб-фреймворки:
                        Mojolicious и Mojolicious::Lite

17 октября 2009 г.
Pure Perl
                     веб-фреймворк


17 октября 2009 г.
• Mojo::Base
                     • Mojo::ByteStream
                     • Mojo::Template, Mojo::JSON
                     • Mojo::Loader, Mojo::Log, Mojo::Path
                     • Mojo::URL, Mojo::Parameters, Mojo::Content
                     • Mojo::Message::Request,
                       Mojo::Message::Response,
                       Mojo::Headers, Mojo::Cookie, Mojo::Date


17 октября 2009 г.
• Mojo::Base
                     • Mojo::ByteStream
                     • Mojo::Template, Mojo::JSON
                     • Mojo::Loader, Mojo::Log, Mojo::Path
                     • Mojo::URL, Mojo::Parameters, Mojo::Content
                     • Mojo::Message::Request,
                       Mojo::Message::Response,
                       Mojo::Headers, Mojo::Cookie, Mojo::Date


17 октября 2009 г.
Mojo::Base
                     Minimal Base Class For Mojo Projects




17 октября 2009 г.
package App;
                use base ‘Mojo::Base’;

                __PACKAGE__->attr(‘conf’ => sub {
                
 return do ‘conf/app.conf’;
                });
                __PACKAGE__->attr(‘db’ => sub {
                
 my $self = shift;
                
 return Util->db($self->conf->{'db'});
                });

                sub dispatch { ... }
17 октября 2009 г.
package App;
                use base ‘Mojo::Base’;

                __PACKAGE__->attr(‘conf’ => sub {
                
 return do ‘conf/app.conf’;
                });
                __PACKAGE__->attr(‘db’ => sub {
                
 my $self = shift;
                
 return Util->db($self->conf->{'db'});
                });

                sub dispatch { ... }
17 октября 2009 г.
package App;
                use base ‘Mojo::Base’;

                __PACKAGE__->attr(‘conf’ => sub {
                
 return do ‘conf/app.conf’;
                });
                __PACKAGE__->attr(‘db’ => sub {
                
 my $self = shift;
                
 return Util->db($self->conf->{'db'});
                });

                sub dispatch { ... }
17 октября 2009 г.
• Mojo::Base
                     • Mojo::ByteStream
                     • Mojo::Template, Mojo::JSON
                     • Mojo::Loader, Mojo::Log, Mojo::Path
                     • Mojo::URL, Mojo::Parameters, Mojo::Content
                     • Mojo::Message::Request,
                       Mojo::Message::Response,
                       Mojo::Headers, Mojo::Cookie, Mojo::Date


17 октября 2009 г.
Mojo::ByteStream
                          ByteStream




17 октября 2009 г.
use Mojo::ByteStream;
                my $s = Mojo::ByteStream->new('foo_bar');

                $s->camelize; $s->decamelize;
                $s->b64_encode; $s->b64_decode;
                $s->encode('utf8'); $s->decode('utf8');
                $s->html_escape; $s->html_unescape;
                $s->qp_encode; $s->qp_decode;
                $s->quote; $stream->unquote;
                $s->url_escape; $s->url_unescape;
                $s->xml_escape;

17 октября 2009 г.
use Mojo::ByteStream;
                my $s = Mojo::ByteStream->new('foo_bar');

                $s->camelize; $s->decamelize;
                $s->b64_encode; $s->b64_decode;
                $s->encode('utf8'); $s->decode('utf8');
                $s->html_escape; $s->html_unescape;
                $s->qp_encode; $s->qp_decode;
                $s->quote; $stream->unquote;
                $s->url_escape; $s->url_unescape;
                $s->xml_escape;

17 октября 2009 г.
use Mojo::ByteStream;
                my $s = Mojo::ByteStream->new('foo_bar');

                $s->camelize; $s->decamelize;
                $s->b64_encode; $s->b64_decode;
                $s->encode('utf8'); $s->decode('utf8');
                $s->html_escape; $s->html_unescape;
                $s->qp_encode; $s->qp_decode;
                $s->quote; $stream->unquote;
                $s->url_escape; $s->url_unescape;
                $s->xml_escape;

17 октября 2009 г.
use Mojo::ByteStream;
                my $s = Mojo::ByteStream->new('foo_bar');

                $s->camelize; $s->decamelize;
                $s->b64_encode; $s->b64_decode;
                $s->encode('utf8'); $s->decode('utf8');
                $s->html_escape; $s->html_unescape;
                $s->qp_encode; $s->qp_decode;
                $s->quote; $stream->unquote;
                $s->url_escape; $s->url_unescape;
                $s->xml_escape;

17 октября 2009 г.
use Mojo::ByteStream;
                my $s = Mojo::ByteStream->new('foo_bar');

                $s->camelize; $s->decamelize;
                $s->b64_encode; $s->b64_decode;
                $s->encode('utf8'); $s->decode('utf8');
                $s->html_escape; $s->html_unescape;
                $s->qp_encode; $s->qp_decode;
                $s->quote; $stream->unquote;
                $s->url_escape; $s->url_unescape;
                $s->xml_escape;

17 октября 2009 г.
use Mojo::ByteStream;
                my $s = Mojo::ByteStream->new('foo_bar');

                $s->camelize; $s->decamelize;
                $s->b64_encode; $s->b64_decode;
                $s->encode('utf8'); $s->decode('utf8');
                $s->html_escape; $s->html_unescape;
                $s->qp_encode; $s->qp_decode;
                $s->quote; $stream->unquote;
                $s->url_escape; $s->url_unescape;
                $s->xml_escape;

17 октября 2009 г.
use Mojo::ByteStream;
                my $s = Mojo::ByteStream->new('foo_bar');

                $s->camelize; $s->decamelize;
                $s->b64_encode; $s->b64_decode;
                $s->encode('utf8'); $s->decode('utf8');
                $s->html_escape; $s->html_unescape;
                $s->qp_encode; $s->qp_decode;
                $s->quote; $stream->unquote;
                $s->url_escape; $s->url_unescape;
                $s->xml_escape;

17 октября 2009 г.
use Mojo::ByteStream;
                my $s = Mojo::ByteStream->new('foo_bar');

                $s->camelize; $s->decamelize;
                $s->b64_encode; $s->b64_decode;
                $s->encode('utf8'); $s->decode('utf8');
                $s->html_escape; $s->html_unescape;
                $s->qp_encode; $s->qp_decode;
                $s->quote; $stream->unquote;
                $s->url_escape; $s->url_unescape;
                $s->xml_escape;

17 октября 2009 г.
use Mojo::ByteStream;
                my $s = Mojo::ByteStream->new('foo_bar');

                $s->camelize; $s->decamelize;
                $s->b64_encode; $s->b64_decode;
                $s->encode('utf8'); $s->decode('utf8');
                $s->html_escape; $s->html_unescape;
                $s->qp_encode; $s->qp_decode;
                $s->quote; $stream->unquote;
                $s->url_escape; $s->url_unescape;
                $s->xml_escape;

17 октября 2009 г.
• Mojo::Base
                     • Mojo::ByteStream
                     • Mojo::Template, Mojo::JSON
                     • Mojo::Loader, Mojo::Log, Mojo::Path
                     • Mojo::URL, Mojo::Parameters, Mojo::Content
                     • Mojo::Message::Request,
                       Mojo::Message::Response,
                       Mojo::Headers, Mojo::Cookie, Mojo::Date


17 октября 2009 г.
Mojo::Template
                        Perlish Templates!




17 октября 2009 г.
% my $self = shift;
                % my $list = $self->stash(‘list’);

                <ul>
                % for (@$list) {
                
 <li><%= $_->{title} %></li>
                %}
                </ul>


17 октября 2009 г.
• Mojo::Base
                     • Mojo::ByteStream
                     • Mojo::Template, Mojo::JSON
                     • Mojo::Loader, Mojo::Log, Mojo::Path
                     • Mojo::URL, Mojo::Parameters, Mojo::Content
                     • Mojo::Message::Request,
                       Mojo::Message::Response,
                       Mojo::Headers, Mojo::Cookie, Mojo::Date


17 октября 2009 г.
• Mojo::Base
                     • Mojo::ByteStream
                     • Mojo::Template, Mojo::JSON
                     • Mojo::Loader, Mojo::Log, Mojo::Path
                     • Mojo::URL, Mojo::Parameters, Mojo::Content
                     • Mojo::Message::Request,
                       Mojo::Message::Response,
                       Mojo::Headers, Mojo::Cookie, Mojo::Date


17 октября 2009 г.
• Mojo::Base
                     • Mojo::ByteStream
                     • Mojo::Template, Mojo::JSON
                     • Mojo::Loader, Mojo::Log, Mojo::Path
                     • Mojo::URL, Mojo::Parameters, Mojo::Content
                     • Mojo::Message::Request,
                       Mojo::Message::Response,
                       Mojo::Headers, Mojo::Cookie, Mojo::Date


17 октября 2009 г.
• Mojo::Base
                     • Mojo::ByteStream
                     • Mojo::Template, Mojo::JSON
                     • Mojo::Loader, Mojo::Log, Mojo::Path
                     • Mojo::URL, Mojo::Parameters, Mojo::Content
                     • Mojo::Message::Request,
                       Mojo::Message::Response,
                       Mojo::Headers, Mojo::Cookie, Mojo::Date


17 октября 2009 г.
• Mojo::Base
                     • Mojo::ByteStream
                     • Mojo::Template, Mojo::JSON
                     • Mojo::Loader, Mojo::Log, Mojo::Path
                     • Mojo::URL, Mojo::Parameters, Mojo::Content
                     • Mojo::Message::Request,
                       Mojo::Message::Response,
                       Mojo::Headers, Mojo::Cookie, Mojo::Date


17 октября 2009 г.
• Mojo::Trasaction, Mojo::Stateful
                     • Mojo::Client
                     • Mojo::Server
                      • Mojo::Server::CGI, Mojo::Server::FastCGI
                      • Mojo::Server::Daemon
                      • Mojo::Server::Daemon::Prefork
                     • Mojo::Command
                      • Mojo::Command::Generate и ~ Server
17 октября 2009 г.
• Mojo::Trasaction, Mojo::Stateful
                     • Mojo::Client
                     • Mojo::Server
                      • Mojo::Server::CGI, Mojo::Server::FastCGI
                      • Mojo::Server::Daemon
                      • Mojo::Server::Daemon::Prefork
                     • Mojo::Command
                      • Mojo::Command::Generate и ~ Server
17 октября 2009 г.
• Mojo::Trasaction, Mojo::Stateful
                     • Mojo::Client
                     • Mojo::Server
                      • Mojo::Server::CGI, Mojo::Server::FastCGI
                      • Mojo::Server::Daemon
                      • Mojo::Server::Daemon::Prefork
                     • Mojo::Command
                      • Mojo::Command::Generate и ~ Server
17 октября 2009 г.
• Mojo::Trasaction, Mojo::Stateful
                     • Mojo::Client
                     • Mojo::Server
                      • Mojo::Server::CGI, Mojo::Server::FastCGI
                      • Mojo::Server::Daemon
                      • Mojo::Server::Daemon::Prefork
                     • Mojo::Command
                      • Mojo::Command::Generate и ~ Server
17 октября 2009 г.
• Mojo::Trasaction, Mojo::Stateful
                     • Mojo::Client
                     • Mojo::Server
                      • Mojo::Server::CGI, Mojo::Server::FastCGI
                      • Mojo::Server::Daemon
                      • Mojo::Server::Daemon::Prefork
                     • Mojo::Command
                      • Mojo::Command::Generate и ~ Server
17 октября 2009 г.
• Mojo::Trasaction, Mojo::Stateful
                     • Mojo::Client
                     • Mojo::Server
                      • Mojo::Server::CGI, Mojo::Server::FastCGI
                      • Mojo::Server::Daemon
                      • Mojo::Server::Daemon::Prefork
                     • Mojo::Command
                      • Mojo::Command::Generate и ~ Server
17 октября 2009 г.
• Mojo::Trasaction, Mojo::Stateful
                     • Mojo::Client
                     • Mojo::Server
                      • Mojo::Server::CGI, Mojo::Server::FastCGI
                      • Mojo::Server::Daemon
                      • Mojo::Server::Daemon::Prefork
                     • Mojo::Command
                      • Mojo::Command::Generate и ~ Server
17 октября 2009 г.
Всё, что нужно есть
                         Mojo – веб в коробке!




17 октября 2009 г.
Почти
                     всё, что нужно есть :)
                           Mojo – веб в коробке!




17 октября 2009 г.
Без зависимостей
                         с версии Perl 5.8.1




17 октября 2009 г.
Почти
                     без зависимостей :)


17 октября 2009 г.
Mojo runtime
17 октября 2009 г.
Perl 5.005
17 октября 2009 г.
Perl 5.006002
17 октября 2009 г.
Perl 5.008001
17 октября 2009 г.
Mojo Perl 5.010
17 октября 2009 г.
Объектно-
                     ориентированное API


17 октября 2009 г.
package TestMojo;
                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('Hello Mojo!');
                }
17 октября 2009 г.
package TestMojo;
                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('Hello Mojo!');
                }
17 октября 2009 г.
package TestMojo;
                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('Hello Mojo!');
                }
17 октября 2009 г.
package TestMojo;
                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('Hello Mojo!');
                }
17 октября 2009 г.
use overload '""' => sub
                   { shift->to_string },
                      fallback => 1;

17 октября 2009 г.
package TestMojo;
                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('Hello Mojo!');
                }
17 октября 2009 г.
package TestMojo;
                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('Hello Mojo!');
                }
17 октября 2009 г.
package TestMojo;
                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('Hello Mojo!');
                }
17 октября 2009 г.
Генерация
                     mojo-приложения


17 октября 2009 г.
mojo generate app
                         TestMojo
                     [mkdir]   test_mojo/script
                     [write]   test_mojo/script/test_mojo
                     [chmod]   test_mojo/script/test_mojo 744
                     [mkdir]   test_mojo/lib
                     [write]   test_mojo/lib/TestMojo.pm
                     [mkdir]   test_mojo/t
                     [write]   test_mojo/t/basic.t

17 октября 2009 г.
mojo generate app
                         TestMojo
                     [mkdir]   test_mojo/script
                     [write]   test_mojo/script/test_mojo
                     [chmod]   test_mojo/script/test_mojo 744
                     [mkdir]   test_mojo/lib
                     [write]   test_mojo/lib/TestMojo.pm
                     [mkdir]   test_mojo/t
                     [write]   test_mojo/t/basic.t

17 октября 2009 г.
use FindBin;

                use lib "$FindBin::Bin/../lib";
                use lib "$FindBin::Bin/../../lib";

                # Application
                $ENV{MOJO_APP} ||= 'TestMojo';

                use Mojo::Commands;
                Mojo::Commands->start; # ->start(‘cgi’)


17 октября 2009 г.
mojo generate app
                         TestMojo
                     [mkdir]   test_mojo/script
                     [write]   test_mojo/script/test_mojo
                     [chmod]   test_mojo/script/test_mojo 744
                     [mkdir]   test_mojo/lib
                     [write]   test_mojo/lib/TestMojo.pm
                     [mkdir]   test_mojo/t
                     [write]   test_mojo/t/basic.t

17 октября 2009 г.
mojo generate app
                         TestMojo
                     [mkdir]   test_mojo/script
                     [write]   test_mojo/script/test_mojo
                     [chmod]   test_mojo/script/test_mojo 744
                     [mkdir]   test_mojo/lib
                     [write]   test_mojo/lib/TestMojo.pm
                     [mkdir]   test_mojo/t
                     [write]   test_mojo/t/basic.t

17 октября 2009 г.
#!/usr/bin/env perl

                use strict;
                use warnings;

                use Test::More tests => 1;

                use_ok('TestMojo');



17 октября 2009 г.
Поддержка HTTP 1.1



17 октября 2009 г.
17 октября 2009 г.
MojoX::UserAgent
                               Pascal Gaudette
                     Спасибо Google of Summer Code 2009!




17 октября 2009 г.
Поддержка CGI,
                     FastCGI, Daemon,
                      Daemon Prefork


17 октября 2009 г.
script/test_mojo
                     COMMAND [OPTIONS]
                      script/test_mojo cgi
                      script/test_mojo fastcgi
                      script/test_mojo daemon
                      script/test_mojo daemon_prefork --port 80




17 октября 2009 г.
script/test_mojo
                     COMMAND [OPTIONS]
                      script/test_mojo cgi
                      script/test_mojo fastcgi
                      script/test_mojo daemon
                      script/test_mojo daemon_prefork --port 80




17 октября 2009 г.
PATH_INFO='/' script/
                        test_mojo cgi
                                  Легко тестировать
                     Можно профилировать код, используя Devel::NYProf




17 октября 2009 г.
script/test_mojo
                     COMMAND [OPTIONS]
                      script/test_mojo cgi
                      script/test_mojo fastcgi
                      script/test_mojo daemon
                      script/test_mojo daemon_prefork --port 80




17 октября 2009 г.
Mojo::Server::FCGI
                     script/test_mojo fcgi
                     script/test_mojo fcgi_prefork




17 октября 2009 г.
Mojo::Server::FCGI
                     script/test_mojo fcgi
                     script/test_mojo fcgi_prefork




17 октября 2009 г.
Mojo::Server::FCGI
                     script/test_mojo fcgi
                     script/test_mojo fcgi_prefork




17 октября 2009 г.
location / {
               fastcgi_pass 127.0.0.1:3000;
               fastcgi_param MOJO_APP App;
               fastcgi_param SCRIPT_NAME
                                            http://127.0.0.1:3000;
               fastcgi_param PATH_INFO
                                            $fastcgi_script_name;
               fastcgi_param QUERY_STRING
                                            $query_string;
               fastcgi_param REQUEST_METHOD
                                            $request_method;
               fastcgi_param CONTENT_TYPE
                                            $content_type;
               fastcgi_param CONTENT_LENGTH
                                          $content_length;
             }
17 октября 2009 г.
location / {
               fastcgi_pass 127.0.0.1:3000;
               fastcgi_param MOJO_APP App;
               fastcgi_param SCRIPT_NAME
                                            http://127.0.0.1:3000;
               fastcgi_param PATH_INFO
                                            $fastcgi_script_name;
               fastcgi_param QUERY_STRING
                                            $query_string;
               fastcgi_param REQUEST_METHOD
                                            $request_method;
               fastcgi_param CONTENT_TYPE
                                            $content_type;
               fastcgi_param CONTENT_LENGTH
                                          $content_length;
             }
17 октября 2009 г.
location / {
               fastcgi_pass 127.0.0.1:3000;
               fastcgi_param MOJO_APP App;
               fastcgi_param SCRIPT_NAME
                                            http://127.0.0.1:3000;
               fastcgi_param PATH_INFO
                                            $fastcgi_script_name;
               fastcgi_param QUERY_STRING
                                            $query_string;
               fastcgi_param REQUEST_METHOD
                                            $request_method;
               fastcgi_param CONTENT_TYPE
                                            $content_type;
               fastcgi_param CONTENT_LENGTH
                                          $content_length;
             }
17 октября 2009 г.
location / {
               fastcgi_pass 127.0.0.1:3000;
               fastcgi_param MOJO_APP App;
               fastcgi_param SCRIPT_NAME
                                            http://127.0.0.1:3000;
               fastcgi_param PATH_INFO
                                            $fastcgi_script_name;
               fastcgi_param QUERY_STRING
                                            $query_string;
               fastcgi_param REQUEST_METHOD
                                            $request_method;
               fastcgi_param CONTENT_TYPE
                                            $content_type;
               fastcgi_param CONTENT_LENGTH
                                          $content_length;
             }
17 октября 2009 г.
location / {
               fastcgi_pass 127.0.0.1:3000;
               fastcgi_param MOJO_APP App;
               fastcgi_param SCRIPT_NAME
                                             http://127.0.0.1:3000;
               fastcgi_param PATH_INFO
                                            $fastcgi_script_name;
               fastcgi_param QUERY_STRING
                                            $query_string;
               fastcgi_param REQUEST_METHOD
                                            $request_method;
               fastcgi_param CONTENT_TYPE
                                            $content_type;
               fastcgi_param CONTENT_LENGTH
                                          $content_length;
             }
17 октября 2009 г.
script/test_mojo
                     COMMAND [OPTIONS]
                      script/test_mojo cgi
                      script/test_mojo fastcgi
                      script/test_mojo daemon
                      script/test_mojo daemon_prefork --port 80




17 октября 2009 г.
MOJO_RELOAD=1
              script/test_mojo daemon
                     Код перезагружается при каждом запросе




17 октября 2009 г.
script/test_mojo
                     COMMAND [OPTIONS]
                      script/test_mojo cgi
                      script/test_mojo fastcgi
                      script/test_mojo daemon
                      script/test_mojo daemon_prefork --port 80




17 октября 2009 г.
script/test_mojo
                     COMMAND [OPTIONS]
                      script/test_mojo cgi
                      script/test_mojo fastcgi
                      script/test_mojo daemon
                      script/test_mojo daemon_prefork --port 80

                      script/test_mojo test


17 октября 2009 г.
MVC веб-фреймворки



17 октября 2009 г.
Mojolicious
                       use base 'Mojo';




17 октября 2009 г.
• Mojolicious::Renderer
                     • Mojolicous::Controller
                     • Mojolicious::Commands
                     • MojoX::Types
                     • MojoX::Dispatcher, MojoX::Routes

17 октября 2009 г.
• Mojolicious::Renderer
                     • Mojolicous::Controller
                     • Mojolicious::Commands
                     • MojoX::Types
                     • MojoX::Dispatcher, MojoX::Routes

17 октября 2009 г.
• Mojolicious::Renderer
                     • Mojolicous::Controller
                     • Mojolicious::Commands
                     • MojoX::Types
                     • MojoX::Dispatcher, MojoX::Routes

17 октября 2009 г.
• Mojolicious::Renderer
                     • Mojolicous::Controller
                     • Mojolicious::Commands
                     • MojoX::Types
                     • MojoX::Dispatcher, MojoX::Routes

17 октября 2009 г.
• Mojolicious::Renderer
                     • Mojolicous::Controller
                     • Mojolicious::Commands
                     • MojoX::Types
                     • MojoX::Dispatcher, MojoX::Routes

17 октября 2009 г.
• Mojolicious::Renderer
                     • Mojolicous::Controller
                     • Mojolicious::Commands
                     • MojoX::Types
                     • MojoX::Dispatcher, MojoX::Routes

17 октября 2009 г.
Генерация
             mojolicious-приложения


17 октября 2009 г.
mojolicious generate
                        app TestApp


17 октября 2009 г.
[mkdir] test_app/script
                     [write] test_app/script/test_app
                     [chmod] test_app/script/test_app 744
                     [mkdir] test_app/lib
                     [write] test_app/lib/TestApp.pm
                     [mkdir] test_app/lib/TestApp
                     [write] test_app/lib/TestApp/Example.pm
                     [mkdir] test_app/t
                     [write] test_app/t/basic.t
                     [mkdir] test_app/log
                     [mkdir] test_app/public
                     [write] test_app/public/404.html
                     [exist] test_app/public
                     [write] test_app/public/500.html


17 октября 2009 г.
[mkdir] test_app/script
                     [write] test_app/script/test_app
                     [chmod] test_app/script/test_app 744
                     [mkdir] test_app/lib
                     [write] test_app/lib/TestApp.pm
                     [mkdir] test_app/lib/TestApp
                     [write] test_app/lib/TestApp/Example.pm
                     [mkdir] test_app/t
                     [write] test_app/t/basic.t
                     [mkdir] test_app/log
                     [mkdir] test_app/public
                     [write] test_app/public/404.html
                     [exist] test_app/public
                     [write] test_app/public/500.html


17 октября 2009 г.
[mkdir] test_app/script
                     [write] test_app/script/test_app
                     [chmod] test_app/script/test_app 744
                     [mkdir] test_app/lib
                     [write] test_app/lib/TestApp.pm
                     [mkdir] test_app/lib/TestApp
                     [write] test_app/lib/TestApp/Example.pm
                     [mkdir] test_app/t
                     [write] test_app/t/basic.t
                     [mkdir] test_app/log
                     [mkdir] test_app/public
                     [write] test_app/public/404.html
                     [exist] test_app/public
                     [write] test_app/public/500.html


17 октября 2009 г.
[mkdir] test_app/script
                     [write] test_app/script/test_app
                     [chmod] test_app/script/test_app 744
                     [mkdir] test_app/lib
                     [write] test_app/lib/TestApp.pm
                     [mkdir] test_app/lib/TestApp
                     [write] test_app/lib/TestApp/Example.pm
                     [mkdir] test_app/t
                     [write] test_app/t/basic.t
                     [mkdir] test_app/log
                     [mkdir] test_app/public
                     [write] test_app/public/404.html
                     [exist] test_app/public
                     [write] test_app/public/500.html


17 октября 2009 г.
package TestApp;

                use base 'Mojolicious';
                sub startup {
                  my $self = shift;
                  $self->renderer->default_handler('ep');

                  my $r = $self->routes;
                  $r->route('/:controller/:action/:id')
                    ->to(controller => 'example', action =>
                'welcome', id => 1);
                }
17 октября 2009 г.
package TestApp;

                use base 'Mojolicious';
                sub startup {
                  my $self = shift;
                  $self->renderer->default_handler('ep');

                  my $r = $self->routes;
                  $r->route('/:controller/:action/:id')
                    ->to(controller => 'example', action =>
                'welcome', id => 1);
                }
17 октября 2009 г.
package TestApp;

                use base 'Mojolicious';
                sub startup {
                  my $self = shift;
                  $self->renderer->default_handler('ep');

                  my $r = $self->routes;
                  $r->route('/:controller/:action/:id')
                    ->to(controller => 'example', action =>
                'welcome', id => 1);
                }
17 октября 2009 г.
package TestApp;

                use base 'Mojolicious';
                sub startup {
                  my $self = shift;
                  $self->renderer->default_handler('ep');

                  my $r = $self->routes;
                  $r->route('/:controller/:action/:id')
                    ->to(controller => 'example', action =>
                'welcome', id => 1);
                }
17 октября 2009 г.
package TestApp;

                use base 'Mojolicious';
                sub startup {
                  my $self = shift;
                  $self->renderer->default_handler('ep');

                  my $r = $self->routes;
                  $r->route('/:controller/:action/:id')
                    ->to(controller => 'example', action =>
                'welcome', id => 1);
                }
17 октября 2009 г.
package TestApp;

                use base 'Mojolicious';
                sub startup {
                  my $self = shift;
                  $self->renderer->default_handler('ep');

                  my $r = $self->routes;
                  $r->route('/:controller/:action/:id')
                    ->to(controller => 'example', action =>
                'welcome', id => 1);
                }
17 октября 2009 г.
package TestApp;

                use base 'Mojolicious';
                sub startup {
                  my $self = shift;
                  $self->renderer->default_handler('ep');

                  my $r = $self->routes;
                  $r->route('/:controller/:action/:id')
                    ->to(controller => 'example', action =>
                'welcome', id => 1);
                }
17 октября 2009 г.
package TestApp::Example;

             use base 'Mojolicious::Controller';
             sub welcome {
               my $self = shift;
             
 warn $self->stash(‘id’);
               $self->render(message => 'Welcome!');
             }

             1;

17 октября 2009 г.
[exist]   test_app/public
                [write]   test_app/public/index.html
                [mkdir]   test_app/templates
                [write]   test_app/templates/exception.html.ep
                [mkdir]   test_app/templates/layouts
                [write]   test_app/templates/layouts/default.html.ep
                [mkdir]   test_app/templates/example
                [write]   test_app/templates/example/welcome.html.ep




17 октября 2009 г.
[exist]   test_app/public
                [write]   test_app/public/index.html
                [mkdir]   test_app/templates
                [write]   test_app/templates/exception.html.ep
                [mkdir]   test_app/templates/layouts
                [write]   test_app/templates/layouts/default.html.ep
                [mkdir]   test_app/templates/example
                [write]   test_app/templates/example/welcome.html.ep




17 октября 2009 г.
% layout 'default';

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

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




17 октября 2009 г.
[exist]   test_app/public
                [write]   test_app/public/index.html
                [mkdir]   test_app/templates
                [write]   test_app/templates/exception.html.ep
                [mkdir]   test_app/templates/layouts
                [write]   test_app/templates/layouts/default.html.ep
                [mkdir]   test_app/templates/example
                [write]   test_app/templates/example/welcome.html.ep




17 октября 2009 г.
<!doctype html>
             <html>
                <head><title>Welcome</title></head>
                <body>
                  <%== content %>
                </body>
             </html>




17 октября 2009 г.
[exist]   test_app/public
                [write]   test_app/public/index.html
                [mkdir]   test_app/templates
                [write]   test_app/templates/exception.html.ep
                [mkdir]   test_app/templates/layouts
                [write]   test_app/templates/layouts/default.html.ep
                [mkdir]   test_app/templates/example
                [write]   test_app/templates/example/welcome.html.ep




17 октября 2009 г.
Mojolicious::Lite
                        use base 'Mojolicious';




17 октября 2009 г.
mojolicious generate
                      lite_app test_lite


17 октября 2009 г.
[write] test_lite
                     [chmod] test_lite 744




17 октября 2009 г.
use Mojolicious::Lite;

                app->renderer->default_handler('ep');

                get '/' => 'index';

                any '/:groovy' => sub {
                   my $self = shift;
                   $self->render_text($self->stash('groovy'));
                };

                shagadelic;
17 октября 2009 г.
use Mojolicious::Lite;

                app->renderer->default_handler('ep');

                get '/' => 'index';

                any '/:groovy' => sub {
                   my $self = shift;
                   $self->render_text($self->stash('groovy'));
                };

                shagadelic;
17 октября 2009 г.
use Mojolicious::Lite;

                app->renderer->default_handler('ep');

                get '/' => 'index';

                any '/:groovy' => sub {
                   my $self = shift;
                   $self->render_text($self->stash('groovy'));
                };

                shagadelic;
17 октября 2009 г.
use Mojolicious::Lite;

                app->renderer->default_handler('ep');

                get '/' => 'index';

                any '/:groovy' => sub {
                   my $self = shift;
                   $self->render_text($self->stash('groovy'));
                };

                shagadelic; # shagadelic(‘cgi’)
17 октября 2009 г.
__DATA__

                @@ index.html.ep
                % layout 'funky';
                Yea baby!

                @@ layouts/funky.html.ep
                <!doctype html><html>
                   <body>
                     <%== content %>
                   </body>
                </html>
17 октября 2009 г.
Mojo-модули на CPAN



17 октября 2009 г.
Mojo-модули на CPAN
                     •   Mojo                      •   MojoX::Routes::AsGraph

                     •   Mojo::Server::FCGI
                                                   •   MojoX::Session
                     •   AnyEvent::Mojo
                                                   •   MojoX::Log::*
                     •   Apache::Mojo,
                         Apache2::Mojo
                                                   •   MojoX::Renderer::*

                     •   Catalyst::Engine::Mojo,
                                                       •   JSON
                         Squatting::On::Mojo
                                                       •   TT
                     •   MojoX::UserAgent
                                                       •   CTTP2, HTP


17 октября 2009 г.
Стабильная версия,
                         обратная
                      совместимость?


17 октября 2009 г.
Mojo 0.991252
                     Последняя версия всегда доступна на github.com




17 октября 2009 г.
Обратная
                     совместимость не
                      гарантируется :)
                       До первой стабильной версии




17 октября 2009 г.
Первый критичный
                           баг


17 октября 2009 г.
get ‘/bug/’ => sub {
              
 my $self = shift;

              
       # open my $fh, ‘|-’, ‘/usr/sbin/sendmail -t’;
              
       open my $fh, ‘|-’, ‘perl test.pl’;
              
       print $fh join "n",
              
       
 'To: sharifulin at gmail.com',
              
       
 'Subject: Test', '',
              
      
 
 'Test!';
                       $self->render_text(‘Test’);;
              };

17 октября 2009 г.
get ‘/bug/’ => sub {
              
 my $self = shift;

              
       # open my $fh, ‘|-’, ‘/usr/sbin/sendmail -t’;
              
       open my $fh, ‘|-’, ‘perl test.pl’;
              
       print $fh join "n",
              
       
 'To: sharifulin at gmail.com',
              
       
 'Subject: Test', '',
              
      
 
 'Test!';
                       $self->render_text(‘Test’);;
              };

17 октября 2009 г.
test.pl

              #!/usr/bin/perl
              warn $_ while <STDIN>;




17 октября 2009 г.
script/test_bug daemon # OK




17 октября 2009 г.
script/test_bug daemon # OK
                     script/test_bug daemon_prefork # DIE




17 октября 2009 г.
Mojo::Server::Daemon::Prefork #323:

          $SIG{HUP } = $SIG{INT } = 
          $SIG{CHLD} = $SIG{TERM} = sub { exit 0 };




17 октября 2009 г.
Mojo::Server::Daemon::Prefork #323:

          $SIG{HUP } = $SIG{INT } = 
          $SIG{CHLD} = $SIG{TERM} = sub { exit 0 };




17 октября 2009 г.
Mojo::Server::Daemon::Prefork #323:

          $SIG{HUP } = $SIG{INT } = 
          $SIG{TERM } = sub { exit 0 };

          $SIG{CHLD} = ‘IGNORE’;




17 октября 2009 г.
Документация



17 октября 2009 г.
Документация
                        Не очень :)




17 октября 2009 г.
«мне кажется документацию он никогда
                  не напишет) он х**рит быстрее, чем
                 можно писать документацию для него)»
                            FriendFeed форева!




17 октября 2009 г.
Полезная информация

                     • http://mojolicious.org
                     • http://labs.kraih.com/blog/
                     • http://search.cpan.org/dist/Mojo/
                     • http://github.com/kraih/mojo
                     • http://sharifulin.livejournal.com/tag/mojo
                     • http://getbootylicious.org/
17 октября 2009 г.
Полезная информация

                     • http://mojolicious.org
                     • http://labs.kraih.com/blog/
                     • http://search.cpan.org/dist/Mojo/
                     • http://github.com/kraih/mojo
                     • http://sharifulin.livejournal.com/tag/mojo
                     • http://getbootylicious.org/
17 октября 2009 г.
Bootylicious
17 октября 2009 г.
Полезная информация


                     • irc://irc.perl.org/#mojo
                     • http://lists.kraih.com/cgi-bin/mailman/
                       listinfo/mojo
                     • Twitter: @kraih, @vtivti, @sharifulin

17 октября 2009 г.
Последние новости
                     •   PSGI and Plack is the future of HTTP::Engine that
                         has support for servers like CGI, FastCGI, Apache,
                         AnyEvent and Mojo.

                     •   As usually @vtivti is the first to use our newest
                         Mojolicious feature, ep templates now in
                         Bootylicious.

                     •   New #mod_perlite release looks great,
                         #Mojolicious with CGI backend should "just
                         work™" on it.

                     •   Unicode support in #Mojolicious looks really great
                         now.
17 октября 2009 г.
Опыт разработки на
                           Mojo


17 октября 2009 г.
Mojolicious + MojoX::Renderer::TT
17 октября 2009 г.
Mojo + JSON
17 октября 2009 г.
Mojolicious::Lite +
17 октября 2009 г.
                     MojoX::Renderer::JSON
Mojolicious::Lite +
                 MojoX::Renderer::JSON + RSS
17 октября 2009 г.
Mojolicious + Mojo::Template
17 октября 2009 г.
Mojolicious::Lite + other render
17 октября 2009 г.
«Я никогда так быстро не
                        делал сайты на Perl»
                          Анатолий Шарифулин :)




17 октября 2009 г.
«Можно ли на хостинге, где
                     только FTP, Apache и CGI?»
                      Постоянный вопрос, который задают мне




17 октября 2009 г.
Ответ: «Да!»




17 октября 2009 г.
Ответ: «Да!»
                     Только я не проверял :)




17 октября 2009 г.
use Perl
                       or die




17 октября 2009 г.
use Mojo
                       or die




17 октября 2009 г.
JFDI



17 октября 2009 г.
any ‘/questions/’ => sub {
           
 
 shift->render(
           
 
 
 
 say => ‘sharifulin’,
           
 
 );
           };
           shagadelic;
17 октября 2009 г.
Дзякуй, кали ласка!
                         Анатолий Шарифулин
                           RostovOnDon.pm




17 октября 2009 г.

Mais conteúdo relacionado

Semelhante a Mojo. Веб в коробке!

Mojolicious. The web in a box!
Mojolicious. The web in a box!Mojolicious. The web in a box!
Mojolicious. The web in a box!Anatoly Sharifulin
 
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Александр Егурцов
 
Николай Сиварев "Приручая сайты"
Николай Сиварев "Приручая сайты"Николай Сиварев "Приручая сайты"
Николай Сиварев "Приручая сайты"Yandex
 
Мульти-доменность в Django проекте
Мульти-доменность в Django проектеМульти-доменность в Django проекте
Мульти-доменность в Django проектеAlexey Kinyov
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPITimur Shemsedinov
 
Артем Курбатов — Мастер-класс «Динамический БЭМ-сайт на Node.js»
Артем Курбатов — Мастер-класс «Динамический БЭМ-сайт на Node.js»Артем Курбатов — Мастер-класс «Динамический БЭМ-сайт на Node.js»
Артем Курбатов — Мастер-класс «Динамический БЭМ-сайт на Node.js»Yandex
 
Программируем back-end: функции, события, особенности мобильного приложения
Программируем back-end: функции, события, особенности мобильного приложенияПрограммируем back-end: функции, события, особенности мобильного приложения
Программируем back-end: функции, события, особенности мобильного приложения1С-Битрикс
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 
Введение в Python и Django
Введение в Python и DjangoВведение в Python и Django
Введение в Python и DjangoTaras Lyapun
 
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...Ontico
 
Docker в Badoo: ПМЖ или временная регистрация
Docker в Badoo: ПМЖ или временная регистрацияDocker в Badoo: ПМЖ или временная регистрация
Docker в Badoo: ПМЖ или временная регистрацияBadoo Development
 
Docker integration into Badoo
Docker integration into BadooDocker integration into Badoo
Docker integration into BadooAnton Turetsky
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПKirill Chebunin
 
Разработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервисаРазработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервисаITCrowd Almaty
 
Разработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервисаРазработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервисаendeveit
 
Как сделать сложное простым. История создания Проект1917 / Сергей Спорышев (I...
Как сделать сложное простым. История создания Проект1917 / Сергей Спорышев (I...Как сделать сложное простым. История создания Проект1917 / Сергей Спорышев (I...
Как сделать сложное простым. История создания Проект1917 / Сергей Спорышев (I...Ontico
 

Semelhante a Mojo. Веб в коробке! (20)

Mojo. The web in a box!
Mojo. The web in a box!Mojo. The web in a box!
Mojo. The web in a box!
 
Mojolicious. The web in a box!
Mojolicious. The web in a box!Mojolicious. The web in a box!
Mojolicious. The web in a box!
 
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
 
Николай Сиварев "Приручая сайты"
Николай Сиварев "Приручая сайты"Николай Сиварев "Приручая сайты"
Николай Сиварев "Приручая сайты"
 
Мульти-доменность в Django проекте
Мульти-доменность в Django проектеМульти-доменность в Django проекте
Мульти-доменность в Django проекте
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Артем Курбатов — Мастер-класс «Динамический БЭМ-сайт на Node.js»
Артем Курбатов — Мастер-класс «Динамический БЭМ-сайт на Node.js»Артем Курбатов — Мастер-класс «Динамический БЭМ-сайт на Node.js»
Артем Курбатов — Мастер-класс «Динамический БЭМ-сайт на Node.js»
 
Программируем back-end: функции, события, особенности мобильного приложения
Программируем back-end: функции, события, особенности мобильного приложенияПрограммируем back-end: функции, события, особенности мобильного приложения
Программируем back-end: функции, события, особенности мобильного приложения
 
php frameworks
php frameworksphp frameworks
php frameworks
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
Введение в Python и Django
Введение в Python и DjangoВведение в Python и Django
Введение в Python и Django
 
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
 
Docker в Badoo: ПМЖ или временная регистрация
Docker в Badoo: ПМЖ или временная регистрацияDocker в Badoo: ПМЖ или временная регистрация
Docker в Badoo: ПМЖ или временная регистрация
 
Docker integration into Badoo
Docker integration into BadooDocker integration into Badoo
Docker integration into Badoo
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
Разработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервисаРазработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервиса
 
Разработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервисаРазработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервиса
 
Как сделать сложное простым. История создания Проект1917 / Сергей Спорышев (I...
Как сделать сложное простым. История создания Проект1917 / Сергей Спорышев (I...Как сделать сложное простым. История создания Проект1917 / Сергей Спорышев (I...
Как сделать сложное простым. История создания Проект1917 / Сергей Спорышев (I...
 

Mais 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
 

Mais 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 оптимизация и продвижение мобильных приложений
 

Mojo. Веб в коробке!

  • 1. Mojo. Веб в коробке! BY Perl Too 2009 17 октября 2009 г.
  • 3. Sebastian Riedel создатель Catalyst и Mojo http://labs.kraih.com/ 17 октября 2009 г.
  • 5. Catalyst + Mojo = ? 17 октября 2009 г.
  • 6. Что такое Mojo? 17 октября 2009 г.
  • 7. Что такое Mojo? • Pure Perl веб-фреймворк • Без зависимостей (начиная с Perl 5.10) • Объектно-ориентированное API • Поддержка HTTP 1.1 (клиент-сервер) • CGI, FastCGI, Daemon и Daemon Prefork • MVC веб-фреймворки: Mojolicious и Mojolicious::Lite 17 октября 2009 г.
  • 8. Что такое Mojo? • Pure Perl веб-фреймворк • Без зависимостей (с версии Perl 5.8.1) • Объектно-ориентированное API • Поддержка HTTP 1.1 (клиент-сервер) • CGI, FastCGI, Daemon и Daemon Prefork • MVC веб-фреймворки: Mojolicious и Mojolicious::Lite 17 октября 2009 г.
  • 9. Что такое Mojo? • Pure Perl веб-фреймворк • Без зависимостей (с версии Perl 5.8.1) • Объектно-ориентированное API • Поддержка HTTP 1.1 (клиент-сервер) • CGI, FastCGI, Daemon и Daemon Prefork • MVC веб-фреймворки: Mojolicious и Mojolicious::Lite 17 октября 2009 г.
  • 10. Что такое Mojo? • Pure Perl веб-фреймворк • Без зависимостей (с версии Perl 5.8.1) • Объектно-ориентированное API • Поддержка HTTP 1.1 (клиент-сервер) • CGI, FastCGI, Daemon и Daemon Prefork • MVC веб-фреймворки: Mojolicious и Mojolicious::Lite 17 октября 2009 г.
  • 11. Что такое Mojo? • Pure Perl веб-фреймворк • Без зависимостей (с версии Perl 5.8.1) • Объектно-ориентированное API • Поддержка HTTP 1.1 (клиент-сервер) • CGI, FastCGI, Daemon и Daemon Prefork • MVC веб-фреймворки: Mojolicious и Mojolicious::Lite 17 октября 2009 г.
  • 12. Что такое Mojo? • Pure Perl веб-фреймворк • Без зависимостей (с версии Perl 5.8.1) • Объектно-ориентированное API • Поддержка HTTP 1.1 (клиент-сервер) • CGI, FastCGI, Daemon и Daemon Prefork • MVC веб-фреймворки: Mojolicious и Mojolicious::Lite 17 октября 2009 г.
  • 13. Что такое Mojo? • Pure Perl веб-фреймворк • Без зависимостей (с версии Perl 5.8.1) • Объектно-ориентированное API • Поддержка HTTP 1.1 (клиент-сервер) • CGI, FastCGI, Daemon и Daemon Prefork • MVC веб-фреймворки: Mojolicious и Mojolicious::Lite 17 октября 2009 г.
  • 14. Pure Perl веб-фреймворк 17 октября 2009 г.
  • 15. • Mojo::Base • Mojo::ByteStream • Mojo::Template, Mojo::JSON • Mojo::Loader, Mojo::Log, Mojo::Path • Mojo::URL, Mojo::Parameters, Mojo::Content • Mojo::Message::Request, Mojo::Message::Response, Mojo::Headers, Mojo::Cookie, Mojo::Date 17 октября 2009 г.
  • 16. • Mojo::Base • Mojo::ByteStream • Mojo::Template, Mojo::JSON • Mojo::Loader, Mojo::Log, Mojo::Path • Mojo::URL, Mojo::Parameters, Mojo::Content • Mojo::Message::Request, Mojo::Message::Response, Mojo::Headers, Mojo::Cookie, Mojo::Date 17 октября 2009 г.
  • 17. Mojo::Base Minimal Base Class For Mojo Projects 17 октября 2009 г.
  • 18. package App; use base ‘Mojo::Base’; __PACKAGE__->attr(‘conf’ => sub { return do ‘conf/app.conf’; }); __PACKAGE__->attr(‘db’ => sub { my $self = shift; return Util->db($self->conf->{'db'}); }); sub dispatch { ... } 17 октября 2009 г.
  • 19. package App; use base ‘Mojo::Base’; __PACKAGE__->attr(‘conf’ => sub { return do ‘conf/app.conf’; }); __PACKAGE__->attr(‘db’ => sub { my $self = shift; return Util->db($self->conf->{'db'}); }); sub dispatch { ... } 17 октября 2009 г.
  • 20. package App; use base ‘Mojo::Base’; __PACKAGE__->attr(‘conf’ => sub { return do ‘conf/app.conf’; }); __PACKAGE__->attr(‘db’ => sub { my $self = shift; return Util->db($self->conf->{'db'}); }); sub dispatch { ... } 17 октября 2009 г.
  • 21. • Mojo::Base • Mojo::ByteStream • Mojo::Template, Mojo::JSON • Mojo::Loader, Mojo::Log, Mojo::Path • Mojo::URL, Mojo::Parameters, Mojo::Content • Mojo::Message::Request, Mojo::Message::Response, Mojo::Headers, Mojo::Cookie, Mojo::Date 17 октября 2009 г.
  • 22. Mojo::ByteStream ByteStream 17 октября 2009 г.
  • 23. use Mojo::ByteStream; my $s = Mojo::ByteStream->new('foo_bar'); $s->camelize; $s->decamelize; $s->b64_encode; $s->b64_decode; $s->encode('utf8'); $s->decode('utf8'); $s->html_escape; $s->html_unescape; $s->qp_encode; $s->qp_decode; $s->quote; $stream->unquote; $s->url_escape; $s->url_unescape; $s->xml_escape; 17 октября 2009 г.
  • 24. use Mojo::ByteStream; my $s = Mojo::ByteStream->new('foo_bar'); $s->camelize; $s->decamelize; $s->b64_encode; $s->b64_decode; $s->encode('utf8'); $s->decode('utf8'); $s->html_escape; $s->html_unescape; $s->qp_encode; $s->qp_decode; $s->quote; $stream->unquote; $s->url_escape; $s->url_unescape; $s->xml_escape; 17 октября 2009 г.
  • 25. use Mojo::ByteStream; my $s = Mojo::ByteStream->new('foo_bar'); $s->camelize; $s->decamelize; $s->b64_encode; $s->b64_decode; $s->encode('utf8'); $s->decode('utf8'); $s->html_escape; $s->html_unescape; $s->qp_encode; $s->qp_decode; $s->quote; $stream->unquote; $s->url_escape; $s->url_unescape; $s->xml_escape; 17 октября 2009 г.
  • 26. use Mojo::ByteStream; my $s = Mojo::ByteStream->new('foo_bar'); $s->camelize; $s->decamelize; $s->b64_encode; $s->b64_decode; $s->encode('utf8'); $s->decode('utf8'); $s->html_escape; $s->html_unescape; $s->qp_encode; $s->qp_decode; $s->quote; $stream->unquote; $s->url_escape; $s->url_unescape; $s->xml_escape; 17 октября 2009 г.
  • 27. use Mojo::ByteStream; my $s = Mojo::ByteStream->new('foo_bar'); $s->camelize; $s->decamelize; $s->b64_encode; $s->b64_decode; $s->encode('utf8'); $s->decode('utf8'); $s->html_escape; $s->html_unescape; $s->qp_encode; $s->qp_decode; $s->quote; $stream->unquote; $s->url_escape; $s->url_unescape; $s->xml_escape; 17 октября 2009 г.
  • 28. use Mojo::ByteStream; my $s = Mojo::ByteStream->new('foo_bar'); $s->camelize; $s->decamelize; $s->b64_encode; $s->b64_decode; $s->encode('utf8'); $s->decode('utf8'); $s->html_escape; $s->html_unescape; $s->qp_encode; $s->qp_decode; $s->quote; $stream->unquote; $s->url_escape; $s->url_unescape; $s->xml_escape; 17 октября 2009 г.
  • 29. use Mojo::ByteStream; my $s = Mojo::ByteStream->new('foo_bar'); $s->camelize; $s->decamelize; $s->b64_encode; $s->b64_decode; $s->encode('utf8'); $s->decode('utf8'); $s->html_escape; $s->html_unescape; $s->qp_encode; $s->qp_decode; $s->quote; $stream->unquote; $s->url_escape; $s->url_unescape; $s->xml_escape; 17 октября 2009 г.
  • 30. use Mojo::ByteStream; my $s = Mojo::ByteStream->new('foo_bar'); $s->camelize; $s->decamelize; $s->b64_encode; $s->b64_decode; $s->encode('utf8'); $s->decode('utf8'); $s->html_escape; $s->html_unescape; $s->qp_encode; $s->qp_decode; $s->quote; $stream->unquote; $s->url_escape; $s->url_unescape; $s->xml_escape; 17 октября 2009 г.
  • 31. use Mojo::ByteStream; my $s = Mojo::ByteStream->new('foo_bar'); $s->camelize; $s->decamelize; $s->b64_encode; $s->b64_decode; $s->encode('utf8'); $s->decode('utf8'); $s->html_escape; $s->html_unescape; $s->qp_encode; $s->qp_decode; $s->quote; $stream->unquote; $s->url_escape; $s->url_unescape; $s->xml_escape; 17 октября 2009 г.
  • 32. • Mojo::Base • Mojo::ByteStream • Mojo::Template, Mojo::JSON • Mojo::Loader, Mojo::Log, Mojo::Path • Mojo::URL, Mojo::Parameters, Mojo::Content • Mojo::Message::Request, Mojo::Message::Response, Mojo::Headers, Mojo::Cookie, Mojo::Date 17 октября 2009 г.
  • 33. Mojo::Template Perlish Templates! 17 октября 2009 г.
  • 34. % my $self = shift; % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li><%= $_->{title} %></li> %} </ul> 17 октября 2009 г.
  • 35. • Mojo::Base • Mojo::ByteStream • Mojo::Template, Mojo::JSON • Mojo::Loader, Mojo::Log, Mojo::Path • Mojo::URL, Mojo::Parameters, Mojo::Content • Mojo::Message::Request, Mojo::Message::Response, Mojo::Headers, Mojo::Cookie, Mojo::Date 17 октября 2009 г.
  • 36. • Mojo::Base • Mojo::ByteStream • Mojo::Template, Mojo::JSON • Mojo::Loader, Mojo::Log, Mojo::Path • Mojo::URL, Mojo::Parameters, Mojo::Content • Mojo::Message::Request, Mojo::Message::Response, Mojo::Headers, Mojo::Cookie, Mojo::Date 17 октября 2009 г.
  • 37. • Mojo::Base • Mojo::ByteStream • Mojo::Template, Mojo::JSON • Mojo::Loader, Mojo::Log, Mojo::Path • Mojo::URL, Mojo::Parameters, Mojo::Content • Mojo::Message::Request, Mojo::Message::Response, Mojo::Headers, Mojo::Cookie, Mojo::Date 17 октября 2009 г.
  • 38. • Mojo::Base • Mojo::ByteStream • Mojo::Template, Mojo::JSON • Mojo::Loader, Mojo::Log, Mojo::Path • Mojo::URL, Mojo::Parameters, Mojo::Content • Mojo::Message::Request, Mojo::Message::Response, Mojo::Headers, Mojo::Cookie, Mojo::Date 17 октября 2009 г.
  • 39. • Mojo::Base • Mojo::ByteStream • Mojo::Template, Mojo::JSON • Mojo::Loader, Mojo::Log, Mojo::Path • Mojo::URL, Mojo::Parameters, Mojo::Content • Mojo::Message::Request, Mojo::Message::Response, Mojo::Headers, Mojo::Cookie, Mojo::Date 17 октября 2009 г.
  • 40. • Mojo::Trasaction, Mojo::Stateful • Mojo::Client • Mojo::Server • Mojo::Server::CGI, Mojo::Server::FastCGI • Mojo::Server::Daemon • Mojo::Server::Daemon::Prefork • Mojo::Command • Mojo::Command::Generate и ~ Server 17 октября 2009 г.
  • 41. • Mojo::Trasaction, Mojo::Stateful • Mojo::Client • Mojo::Server • Mojo::Server::CGI, Mojo::Server::FastCGI • Mojo::Server::Daemon • Mojo::Server::Daemon::Prefork • Mojo::Command • Mojo::Command::Generate и ~ Server 17 октября 2009 г.
  • 42. • Mojo::Trasaction, Mojo::Stateful • Mojo::Client • Mojo::Server • Mojo::Server::CGI, Mojo::Server::FastCGI • Mojo::Server::Daemon • Mojo::Server::Daemon::Prefork • Mojo::Command • Mojo::Command::Generate и ~ Server 17 октября 2009 г.
  • 43. • Mojo::Trasaction, Mojo::Stateful • Mojo::Client • Mojo::Server • Mojo::Server::CGI, Mojo::Server::FastCGI • Mojo::Server::Daemon • Mojo::Server::Daemon::Prefork • Mojo::Command • Mojo::Command::Generate и ~ Server 17 октября 2009 г.
  • 44. • Mojo::Trasaction, Mojo::Stateful • Mojo::Client • Mojo::Server • Mojo::Server::CGI, Mojo::Server::FastCGI • Mojo::Server::Daemon • Mojo::Server::Daemon::Prefork • Mojo::Command • Mojo::Command::Generate и ~ Server 17 октября 2009 г.
  • 45. • Mojo::Trasaction, Mojo::Stateful • Mojo::Client • Mojo::Server • Mojo::Server::CGI, Mojo::Server::FastCGI • Mojo::Server::Daemon • Mojo::Server::Daemon::Prefork • Mojo::Command • Mojo::Command::Generate и ~ Server 17 октября 2009 г.
  • 46. • Mojo::Trasaction, Mojo::Stateful • Mojo::Client • Mojo::Server • Mojo::Server::CGI, Mojo::Server::FastCGI • Mojo::Server::Daemon • Mojo::Server::Daemon::Prefork • Mojo::Command • Mojo::Command::Generate и ~ Server 17 октября 2009 г.
  • 47. Всё, что нужно есть Mojo – веб в коробке! 17 октября 2009 г.
  • 48. Почти всё, что нужно есть :) Mojo – веб в коробке! 17 октября 2009 г.
  • 49. Без зависимостей с версии Perl 5.8.1 17 октября 2009 г.
  • 50. Почти без зависимостей :) 17 октября 2009 г.
  • 55. Mojo Perl 5.010 17 октября 2009 г.
  • 56. Объектно- ориентированное API 17 октября 2009 г.
  • 57. package TestMojo; 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('Hello Mojo!'); } 17 октября 2009 г.
  • 58. package TestMojo; 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('Hello Mojo!'); } 17 октября 2009 г.
  • 59. package TestMojo; 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('Hello Mojo!'); } 17 октября 2009 г.
  • 60. package TestMojo; 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('Hello Mojo!'); } 17 октября 2009 г.
  • 61. use overload '""' => sub { shift->to_string }, fallback => 1; 17 октября 2009 г.
  • 62. package TestMojo; 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('Hello Mojo!'); } 17 октября 2009 г.
  • 63. package TestMojo; 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('Hello Mojo!'); } 17 октября 2009 г.
  • 64. package TestMojo; 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('Hello Mojo!'); } 17 октября 2009 г.
  • 65. Генерация mojo-приложения 17 октября 2009 г.
  • 66. mojo generate app TestMojo [mkdir] test_mojo/script [write] test_mojo/script/test_mojo [chmod] test_mojo/script/test_mojo 744 [mkdir] test_mojo/lib [write] test_mojo/lib/TestMojo.pm [mkdir] test_mojo/t [write] test_mojo/t/basic.t 17 октября 2009 г.
  • 67. mojo generate app TestMojo [mkdir] test_mojo/script [write] test_mojo/script/test_mojo [chmod] test_mojo/script/test_mojo 744 [mkdir] test_mojo/lib [write] test_mojo/lib/TestMojo.pm [mkdir] test_mojo/t [write] test_mojo/t/basic.t 17 октября 2009 г.
  • 68. use FindBin; use lib "$FindBin::Bin/../lib"; use lib "$FindBin::Bin/../../lib"; # Application $ENV{MOJO_APP} ||= 'TestMojo'; use Mojo::Commands; Mojo::Commands->start; # ->start(‘cgi’) 17 октября 2009 г.
  • 69. mojo generate app TestMojo [mkdir] test_mojo/script [write] test_mojo/script/test_mojo [chmod] test_mojo/script/test_mojo 744 [mkdir] test_mojo/lib [write] test_mojo/lib/TestMojo.pm [mkdir] test_mojo/t [write] test_mojo/t/basic.t 17 октября 2009 г.
  • 70. mojo generate app TestMojo [mkdir] test_mojo/script [write] test_mojo/script/test_mojo [chmod] test_mojo/script/test_mojo 744 [mkdir] test_mojo/lib [write] test_mojo/lib/TestMojo.pm [mkdir] test_mojo/t [write] test_mojo/t/basic.t 17 октября 2009 г.
  • 71. #!/usr/bin/env perl use strict; use warnings; use Test::More tests => 1; use_ok('TestMojo'); 17 октября 2009 г.
  • 72. Поддержка HTTP 1.1 17 октября 2009 г.
  • 74. MojoX::UserAgent Pascal Gaudette Спасибо Google of Summer Code 2009! 17 октября 2009 г.
  • 75. Поддержка CGI, FastCGI, Daemon, Daemon Prefork 17 октября 2009 г.
  • 76. script/test_mojo COMMAND [OPTIONS] script/test_mojo cgi script/test_mojo fastcgi script/test_mojo daemon script/test_mojo daemon_prefork --port 80 17 октября 2009 г.
  • 77. script/test_mojo COMMAND [OPTIONS] script/test_mojo cgi script/test_mojo fastcgi script/test_mojo daemon script/test_mojo daemon_prefork --port 80 17 октября 2009 г.
  • 78. PATH_INFO='/' script/ test_mojo cgi Легко тестировать Можно профилировать код, используя Devel::NYProf 17 октября 2009 г.
  • 79. script/test_mojo COMMAND [OPTIONS] script/test_mojo cgi script/test_mojo fastcgi script/test_mojo daemon script/test_mojo daemon_prefork --port 80 17 октября 2009 г.
  • 80. Mojo::Server::FCGI script/test_mojo fcgi script/test_mojo fcgi_prefork 17 октября 2009 г.
  • 81. Mojo::Server::FCGI script/test_mojo fcgi script/test_mojo fcgi_prefork 17 октября 2009 г.
  • 82. Mojo::Server::FCGI script/test_mojo fcgi script/test_mojo fcgi_prefork 17 октября 2009 г.
  • 83. location / { fastcgi_pass 127.0.0.1:3000; fastcgi_param MOJO_APP App; fastcgi_param SCRIPT_NAME http://127.0.0.1:3000; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; } 17 октября 2009 г.
  • 84. location / { fastcgi_pass 127.0.0.1:3000; fastcgi_param MOJO_APP App; fastcgi_param SCRIPT_NAME http://127.0.0.1:3000; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; } 17 октября 2009 г.
  • 85. location / { fastcgi_pass 127.0.0.1:3000; fastcgi_param MOJO_APP App; fastcgi_param SCRIPT_NAME http://127.0.0.1:3000; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; } 17 октября 2009 г.
  • 86. location / { fastcgi_pass 127.0.0.1:3000; fastcgi_param MOJO_APP App; fastcgi_param SCRIPT_NAME http://127.0.0.1:3000; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; } 17 октября 2009 г.
  • 87. location / { fastcgi_pass 127.0.0.1:3000; fastcgi_param MOJO_APP App; fastcgi_param SCRIPT_NAME http://127.0.0.1:3000; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; } 17 октября 2009 г.
  • 88. script/test_mojo COMMAND [OPTIONS] script/test_mojo cgi script/test_mojo fastcgi script/test_mojo daemon script/test_mojo daemon_prefork --port 80 17 октября 2009 г.
  • 89. MOJO_RELOAD=1 script/test_mojo daemon Код перезагружается при каждом запросе 17 октября 2009 г.
  • 90. script/test_mojo COMMAND [OPTIONS] script/test_mojo cgi script/test_mojo fastcgi script/test_mojo daemon script/test_mojo daemon_prefork --port 80 17 октября 2009 г.
  • 91. script/test_mojo COMMAND [OPTIONS] script/test_mojo cgi script/test_mojo fastcgi script/test_mojo daemon script/test_mojo daemon_prefork --port 80 script/test_mojo test 17 октября 2009 г.
  • 93. Mojolicious use base 'Mojo'; 17 октября 2009 г.
  • 94. • Mojolicious::Renderer • Mojolicous::Controller • Mojolicious::Commands • MojoX::Types • MojoX::Dispatcher, MojoX::Routes 17 октября 2009 г.
  • 95. • Mojolicious::Renderer • Mojolicous::Controller • Mojolicious::Commands • MojoX::Types • MojoX::Dispatcher, MojoX::Routes 17 октября 2009 г.
  • 96. • Mojolicious::Renderer • Mojolicous::Controller • Mojolicious::Commands • MojoX::Types • MojoX::Dispatcher, MojoX::Routes 17 октября 2009 г.
  • 97. • Mojolicious::Renderer • Mojolicous::Controller • Mojolicious::Commands • MojoX::Types • MojoX::Dispatcher, MojoX::Routes 17 октября 2009 г.
  • 98. • Mojolicious::Renderer • Mojolicous::Controller • Mojolicious::Commands • MojoX::Types • MojoX::Dispatcher, MojoX::Routes 17 октября 2009 г.
  • 99. • Mojolicious::Renderer • Mojolicous::Controller • Mojolicious::Commands • MojoX::Types • MojoX::Dispatcher, MojoX::Routes 17 октября 2009 г.
  • 100. Генерация mojolicious-приложения 17 октября 2009 г.
  • 101. mojolicious generate app TestApp 17 октября 2009 г.
  • 102. [mkdir] test_app/script [write] test_app/script/test_app [chmod] test_app/script/test_app 744 [mkdir] test_app/lib [write] test_app/lib/TestApp.pm [mkdir] test_app/lib/TestApp [write] test_app/lib/TestApp/Example.pm [mkdir] test_app/t [write] test_app/t/basic.t [mkdir] test_app/log [mkdir] test_app/public [write] test_app/public/404.html [exist] test_app/public [write] test_app/public/500.html 17 октября 2009 г.
  • 103. [mkdir] test_app/script [write] test_app/script/test_app [chmod] test_app/script/test_app 744 [mkdir] test_app/lib [write] test_app/lib/TestApp.pm [mkdir] test_app/lib/TestApp [write] test_app/lib/TestApp/Example.pm [mkdir] test_app/t [write] test_app/t/basic.t [mkdir] test_app/log [mkdir] test_app/public [write] test_app/public/404.html [exist] test_app/public [write] test_app/public/500.html 17 октября 2009 г.
  • 104. [mkdir] test_app/script [write] test_app/script/test_app [chmod] test_app/script/test_app 744 [mkdir] test_app/lib [write] test_app/lib/TestApp.pm [mkdir] test_app/lib/TestApp [write] test_app/lib/TestApp/Example.pm [mkdir] test_app/t [write] test_app/t/basic.t [mkdir] test_app/log [mkdir] test_app/public [write] test_app/public/404.html [exist] test_app/public [write] test_app/public/500.html 17 октября 2009 г.
  • 105. [mkdir] test_app/script [write] test_app/script/test_app [chmod] test_app/script/test_app 744 [mkdir] test_app/lib [write] test_app/lib/TestApp.pm [mkdir] test_app/lib/TestApp [write] test_app/lib/TestApp/Example.pm [mkdir] test_app/t [write] test_app/t/basic.t [mkdir] test_app/log [mkdir] test_app/public [write] test_app/public/404.html [exist] test_app/public [write] test_app/public/500.html 17 октября 2009 г.
  • 106. package TestApp; use base 'Mojolicious'; sub startup { my $self = shift; $self->renderer->default_handler('ep'); my $r = $self->routes; $r->route('/:controller/:action/:id') ->to(controller => 'example', action => 'welcome', id => 1); } 17 октября 2009 г.
  • 107. package TestApp; use base 'Mojolicious'; sub startup { my $self = shift; $self->renderer->default_handler('ep'); my $r = $self->routes; $r->route('/:controller/:action/:id') ->to(controller => 'example', action => 'welcome', id => 1); } 17 октября 2009 г.
  • 108. package TestApp; use base 'Mojolicious'; sub startup { my $self = shift; $self->renderer->default_handler('ep'); my $r = $self->routes; $r->route('/:controller/:action/:id') ->to(controller => 'example', action => 'welcome', id => 1); } 17 октября 2009 г.
  • 109. package TestApp; use base 'Mojolicious'; sub startup { my $self = shift; $self->renderer->default_handler('ep'); my $r = $self->routes; $r->route('/:controller/:action/:id') ->to(controller => 'example', action => 'welcome', id => 1); } 17 октября 2009 г.
  • 110. package TestApp; use base 'Mojolicious'; sub startup { my $self = shift; $self->renderer->default_handler('ep'); my $r = $self->routes; $r->route('/:controller/:action/:id') ->to(controller => 'example', action => 'welcome', id => 1); } 17 октября 2009 г.
  • 111. package TestApp; use base 'Mojolicious'; sub startup { my $self = shift; $self->renderer->default_handler('ep'); my $r = $self->routes; $r->route('/:controller/:action/:id') ->to(controller => 'example', action => 'welcome', id => 1); } 17 октября 2009 г.
  • 112. package TestApp; use base 'Mojolicious'; sub startup { my $self = shift; $self->renderer->default_handler('ep'); my $r = $self->routes; $r->route('/:controller/:action/:id') ->to(controller => 'example', action => 'welcome', id => 1); } 17 октября 2009 г.
  • 113. package TestApp::Example; use base 'Mojolicious::Controller'; sub welcome { my $self = shift; warn $self->stash(‘id’); $self->render(message => 'Welcome!'); } 1; 17 октября 2009 г.
  • 114. [exist] test_app/public [write] test_app/public/index.html [mkdir] test_app/templates [write] test_app/templates/exception.html.ep [mkdir] test_app/templates/layouts [write] test_app/templates/layouts/default.html.ep [mkdir] test_app/templates/example [write] test_app/templates/example/welcome.html.ep 17 октября 2009 г.
  • 115. [exist] test_app/public [write] test_app/public/index.html [mkdir] test_app/templates [write] test_app/templates/exception.html.ep [mkdir] test_app/templates/layouts [write] test_app/templates/layouts/default.html.ep [mkdir] test_app/templates/example [write] test_app/templates/example/welcome.html.ep 17 октября 2009 г.
  • 116. % layout 'default'; <h2><%= $message %></h2> <a href="<%== url_for %>">click here</a> 17 октября 2009 г.
  • 117. [exist] test_app/public [write] test_app/public/index.html [mkdir] test_app/templates [write] test_app/templates/exception.html.ep [mkdir] test_app/templates/layouts [write] test_app/templates/layouts/default.html.ep [mkdir] test_app/templates/example [write] test_app/templates/example/welcome.html.ep 17 октября 2009 г.
  • 118. <!doctype html> <html> <head><title>Welcome</title></head> <body> <%== content %> </body> </html> 17 октября 2009 г.
  • 119. [exist] test_app/public [write] test_app/public/index.html [mkdir] test_app/templates [write] test_app/templates/exception.html.ep [mkdir] test_app/templates/layouts [write] test_app/templates/layouts/default.html.ep [mkdir] test_app/templates/example [write] test_app/templates/example/welcome.html.ep 17 октября 2009 г.
  • 120. Mojolicious::Lite use base 'Mojolicious'; 17 октября 2009 г.
  • 121. mojolicious generate lite_app test_lite 17 октября 2009 г.
  • 122. [write] test_lite [chmod] test_lite 744 17 октября 2009 г.
  • 123. use Mojolicious::Lite; app->renderer->default_handler('ep'); get '/' => 'index'; any '/:groovy' => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; 17 октября 2009 г.
  • 124. use Mojolicious::Lite; app->renderer->default_handler('ep'); get '/' => 'index'; any '/:groovy' => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; 17 октября 2009 г.
  • 125. use Mojolicious::Lite; app->renderer->default_handler('ep'); get '/' => 'index'; any '/:groovy' => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; 17 октября 2009 г.
  • 126. use Mojolicious::Lite; app->renderer->default_handler('ep'); get '/' => 'index'; any '/:groovy' => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; # shagadelic(‘cgi’) 17 октября 2009 г.
  • 127. __DATA__ @@ index.html.ep % layout 'funky'; Yea baby! @@ layouts/funky.html.ep <!doctype html><html> <body> <%== content %> </body> </html> 17 октября 2009 г.
  • 128. Mojo-модули на CPAN 17 октября 2009 г.
  • 129. Mojo-модули на CPAN • Mojo • MojoX::Routes::AsGraph • Mojo::Server::FCGI • MojoX::Session • AnyEvent::Mojo • MojoX::Log::* • Apache::Mojo, Apache2::Mojo • MojoX::Renderer::* • Catalyst::Engine::Mojo, • JSON Squatting::On::Mojo • TT • MojoX::UserAgent • CTTP2, HTP 17 октября 2009 г.
  • 130. Стабильная версия, обратная совместимость? 17 октября 2009 г.
  • 131. Mojo 0.991252 Последняя версия всегда доступна на github.com 17 октября 2009 г.
  • 132. Обратная совместимость не гарантируется :) До первой стабильной версии 17 октября 2009 г.
  • 133. Первый критичный баг 17 октября 2009 г.
  • 134. get ‘/bug/’ => sub { my $self = shift; # open my $fh, ‘|-’, ‘/usr/sbin/sendmail -t’; open my $fh, ‘|-’, ‘perl test.pl’; print $fh join "n", 'To: sharifulin at gmail.com', 'Subject: Test', '', 'Test!'; $self->render_text(‘Test’);; }; 17 октября 2009 г.
  • 135. get ‘/bug/’ => sub { my $self = shift; # open my $fh, ‘|-’, ‘/usr/sbin/sendmail -t’; open my $fh, ‘|-’, ‘perl test.pl’; print $fh join "n", 'To: sharifulin at gmail.com', 'Subject: Test', '', 'Test!'; $self->render_text(‘Test’);; }; 17 октября 2009 г.
  • 136. test.pl #!/usr/bin/perl warn $_ while <STDIN>; 17 октября 2009 г.
  • 137. script/test_bug daemon # OK 17 октября 2009 г.
  • 138. script/test_bug daemon # OK script/test_bug daemon_prefork # DIE 17 октября 2009 г.
  • 139. Mojo::Server::Daemon::Prefork #323: $SIG{HUP } = $SIG{INT } =  $SIG{CHLD} = $SIG{TERM} = sub { exit 0 }; 17 октября 2009 г.
  • 140. Mojo::Server::Daemon::Prefork #323: $SIG{HUP } = $SIG{INT } =  $SIG{CHLD} = $SIG{TERM} = sub { exit 0 }; 17 октября 2009 г.
  • 141. Mojo::Server::Daemon::Prefork #323: $SIG{HUP } = $SIG{INT } =  $SIG{TERM } = sub { exit 0 }; $SIG{CHLD} = ‘IGNORE’; 17 октября 2009 г.
  • 143. Документация Не очень :) 17 октября 2009 г.
  • 144. «мне кажется документацию он никогда не напишет) он х**рит быстрее, чем можно писать документацию для него)» FriendFeed форева! 17 октября 2009 г.
  • 145. Полезная информация • http://mojolicious.org • http://labs.kraih.com/blog/ • http://search.cpan.org/dist/Mojo/ • http://github.com/kraih/mojo • http://sharifulin.livejournal.com/tag/mojo • http://getbootylicious.org/ 17 октября 2009 г.
  • 146. Полезная информация • http://mojolicious.org • http://labs.kraih.com/blog/ • http://search.cpan.org/dist/Mojo/ • http://github.com/kraih/mojo • http://sharifulin.livejournal.com/tag/mojo • http://getbootylicious.org/ 17 октября 2009 г.
  • 148. Полезная информация • irc://irc.perl.org/#mojo • http://lists.kraih.com/cgi-bin/mailman/ listinfo/mojo • Twitter: @kraih, @vtivti, @sharifulin 17 октября 2009 г.
  • 149. Последние новости • PSGI and Plack is the future of HTTP::Engine that has support for servers like CGI, FastCGI, Apache, AnyEvent and Mojo. • As usually @vtivti is the first to use our newest Mojolicious feature, ep templates now in Bootylicious. • New #mod_perlite release looks great, #Mojolicious with CGI backend should "just work™" on it. • Unicode support in #Mojolicious looks really great now. 17 октября 2009 г.
  • 150. Опыт разработки на Mojo 17 октября 2009 г.
  • 151. Mojolicious + MojoX::Renderer::TT 17 октября 2009 г.
  • 152. Mojo + JSON 17 октября 2009 г.
  • 153. Mojolicious::Lite + 17 октября 2009 г. MojoX::Renderer::JSON
  • 154. Mojolicious::Lite + MojoX::Renderer::JSON + RSS 17 октября 2009 г.
  • 155. Mojolicious + Mojo::Template 17 октября 2009 г.
  • 156. Mojolicious::Lite + other render 17 октября 2009 г.
  • 157. «Я никогда так быстро не делал сайты на Perl» Анатолий Шарифулин :) 17 октября 2009 г.
  • 158. «Можно ли на хостинге, где только FTP, Apache и CGI?» Постоянный вопрос, который задают мне 17 октября 2009 г.
  • 160. Ответ: «Да!» Только я не проверял :) 17 октября 2009 г.
  • 161. use Perl or die 17 октября 2009 г.
  • 162. use Mojo or die 17 октября 2009 г.
  • 164. any ‘/questions/’ => sub { shift->render( say => ‘sharifulin’, ); }; shagadelic; 17 октября 2009 г.
  • 165. Дзякуй, кали ласка! Анатолий Шарифулин RostovOnDon.pm 17 октября 2009 г.