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




18 декабря 2009 г.
http://mojolicious.org/
18 декабря 2009 г.
Sebastian Riedel
                        автор Catalyst и Mojo
                         http://labs.kraih.com/




18 декабря 2009 г.
http://twitter.com/kraih
18 декабря 2009 г.
Sebastian Riedel
                        автор Catalyst и Mojo
                         http://labs.kraih.com/




18 декабря 2009 г.
Sebastian Riedel
                        автор Catalyst и Mojo
                         http://labs.kraih.com/




18 декабря 2009 г.
Catalyst + Mojo = ?
18 декабря 2009 г.
Что такое Mojo?


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

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

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

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

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

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

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

18 декабря 2009 г.
Pure Perl
                     веб-фреймворк


18 декабря 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


18 декабря 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


18 декабря 2009 г.
Mojo::Base
                     Minimal Base Class For Mojo Projects




18 декабря 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 { ... }
18 декабря 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 { ... }
18 декабря 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 { ... }
18 декабря 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


18 декабря 2009 г.
Mojo::ByteStream
                          ByteStream




18 декабря 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;

18 декабря 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;

18 декабря 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;

18 декабря 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;

18 декабря 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;

18 декабря 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;

18 декабря 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;

18 декабря 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;

18 декабря 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;

18 декабря 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


18 декабря 2009 г.
Mojo::Template
                        Perlish Templates!




18 декабря 2009 г.
% my $list = $self->stash(‘list’);

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

                <p><%# comment %></p>
18 декабря 2009 г.
% my $list = $self->stash(‘list’);

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

                <p><%# comment %></p>
18 декабря 2009 г.
% my $list = $self->stash(‘list’);

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

                <p><%# comment %></p>
18 декабря 2009 г.
%= my $list = $self->stash(‘list’);

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

                <p><%# comment %></p>
18 декабря 2009 г.
%== my $list = $self->stash(‘list’);

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

                <p><%# comment %></p>
18 декабря 2009 г.
% my $list = $self->stash(‘list’);

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

                <p><%# comment %></p>
18 декабря 2009 г.
% use Foo::Bar;

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

                <p><%# comment %></p>
18 декабря 2009 г.
% my $list = $self->stash(‘list’);

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

                <p><%# comment %></p>
18 декабря 2009 г.
% my $list = $self->stash(‘list’);

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

                <p><%# comment %></p>
18 декабря 2009 г.
% my $list = $self->stash(‘list’);

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

                <p><%# comment %></p>
18 декабря 2009 г.
% my $list = $self->stash(‘list’);

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

                <p><%# comment %></p>
18 декабря 2009 г.
% my $list = $self->stash(‘list’);

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

                <p><%# comment %></p>
18 декабря 2009 г.
% my $list = $self->stash(‘list’);

                <ul>
                % for (@$list) {
                
 <li>
                
 
 <% my $foo = $_->{id} + 100500; %>
                
 </li>
                %}
                </ul>

                <p><%# comment %></p>
18 декабря 2009 г.
% my $list = $self->stash(‘list’);

                <ul>
                % for (@$list) {
                
 <li>
                
 
 <% my $foo = $_->{id} + 100500; %>
                
 </li>
                %}
                </ul>

                <p><%# comment %></p>
18 декабря 2009 г.
% my $list = $self->stash(‘list’);

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

                <p><%# comment %></p>
18 декабря 2009 г.
% my $list = $self->stash(‘list’);

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

                <p><%# comment %></p>
18 декабря 2009 г.
% my $list = $self->stash(‘list’);

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

                <p><%# comment %></p>
18 декабря 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


18 декабря 2009 г.
Mojo::JSON
                      Minimalistic JSON




18 декабря 2009 г.
my $json = Mojo::JSON->new;

                my $string = $json->encode({foo => ‘bar’});

                my $hash = $json->decode(‘{"foo":"bar"}’);




18 декабря 2009 г.
my $json = Mojo::JSON->new;

                my $string = $json->encode({foo => ‘bar’});

                my $hash = $json->decode(‘{"foo":"bar"}’);




18 декабря 2009 г.
my $json = Mojo::JSON->new;

                my $string = $json->encode({foo => ‘bar’});

                my $hash = $json->decode(‘{"foo":"bar"}’);




18 декабря 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


18 декабря 2009 г.
Mojo::Loader
                     Class loader: load, reload, search




18 декабря 2009 г.
Mojo::Loader
                     Class loader: load, reload, search




18 декабря 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


18 декабря 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


18 декабря 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


18 декабря 2009 г.
• Mojo::Trasaction, Mojo::Stateful
                     • Mojo::IOLoop
                     • Mojo::Client, Mojo::Server
                      • Mojo::Server::CGI, Mojo::Server::FastCGI
                      • Mojo::Server::PSGI
                      • Mojo::Server::Daemon и ::Prefork
                     • Mojo::Command
                      • Mojo::Command::Generate и ~ Server
18 декабря 2009 г.
• Mojo::Trasaction, Mojo::Stateful
                     • Mojo::IOLoop
                     • Mojo::Client, Mojo::Server
                      • Mojo::Server::CGI, Mojo::Server::FastCGI
                      • Mojo::Server::PSGI
                      • Mojo::Server::Daemon и ::Prefork
                     • Mojo::Command
                      • Mojo::Command::Generate и ~ Server
18 декабря 2009 г.
• Mojo::Trasaction, Mojo::Stateful
                     • Mojo::IOLoop
                     • Mojo::Client, Mojo::Server
                      • Mojo::Server::CGI, Mojo::Server::FastCGI
                      • Mojo::Server::PSGI
                      • Mojo::Server::Daemon и ::Prefork
                     • Mojo::Command
                      • Mojo::Command::Generate и ~ Server
18 декабря 2009 г.
• Mojo::Trasaction, Mojo::Stateful
                     • Mojo::IOLoop
                     • Mojo::Client, Mojo::Server
                      • Mojo::Server::CGI, Mojo::Server::FastCGI
                      • Mojo::Server::PSGI
                      • Mojo::Server::Daemon и ::Prefork
                     • Mojo::Command
                      • Mojo::Command::Generate и ~ Server
18 декабря 2009 г.
my $client = Mojo::Client->new;

                $client->get(
                
 ‘http://goo.gl’ => sub {
                
 
 my ($self, $tx) = @_;
                
 
 say $tx->res;
                
 }
                )->process;


18 декабря 2009 г.
my $client = Mojo::Client->new;

                $client->get(
                
 ‘http://goo.gl’ => sub {
                
 
 my ($self, $tx) = @_;
                
 
 say $tx->res;
                
 }
                )->process;


18 декабря 2009 г.
my $client = Mojo::Client->new;

                $client->post(
                
 ‘http://goo.gl’ => sub {
                
 
 my ($self, $tx) = @_;
                
 
 say $tx->res;
                
 }
                )->process;


18 декабря 2009 г.
my $client = Mojo::Client->new;

                $client->head(
                
 ‘http://goo.gl’ => sub {
                
 
 my ($self, $tx) = @_;
                
 
 say $tx->res;
                
 }
                )->process;


18 декабря 2009 г.
my $client = Mojo::Client->new;

                $client->put(
                
 ‘http://goo.gl’ => sub {
                
 
 my ($self, $tx) = @_;
                
 
 say $tx->res;
                
 }
                )->process;


18 декабря 2009 г.
my $client = Mojo::Client->new;

                $client->get(
                
 ‘http://goo.gl’ => sub {
                
 
 my ($self, $tx) = @_;
                
 
 say $tx->res;
                
 }
                )->process;


18 декабря 2009 г.
my $client = Mojo::Client->new;

                $client->get(
                
 ‘http://goo.gl’ => sub {
                
 
 my ($self, $tx) = @_;
                
 
 say $tx->res;
                
 }
                )->process;


18 декабря 2009 г.
my $client = Mojo::Client->new;

                $client->get(
                
 ‘http://goo.gl’ => sub {
                
 
 my ($self, $tx) = @_;
                
 
 say $tx->res;
                
 }
                )->process;


18 декабря 2009 г.
my $client = Mojo::Client->new;

                $client->get(
                
 ‘http://goo.gl’ => sub {
                
 
 my ($self, $tx) = @_;
                
 
 say $tx->res;
                
 }
                )->process;


18 декабря 2009 г.
my $client = Mojo::Client->new;

                $client->get(
                
 ‘http://goo.gl’ => sub {
                
 
 my ($self, $tx) = @_;
                
 
 say $tx->res;
                
 }
                )->process;


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




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




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




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


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


18 декабря 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!');
                }
18 декабря 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!');
                }
18 декабря 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!');
                }
18 декабря 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!');
                }
18 декабря 2009 г.
use overload '""' => sub
                  { shift->to_string },
                     fallback => 1;

18 декабря 2009 г.
GET / HTTP/1.1
             Connection: keep-alive
             Accept: text/html, application/xhtml, ....
             Accept-Charset: windows-1251, utf-8; ...
             Accept-Encoding: gzip,deflate
             Accept-Language: ru,en-us;q=0.7,en;q=0.3
             Host: localhost:3000
             User-Agent: Mozilla/5.0 (Macintosh; ...
             Content-Length: 0
             Keep-Alive: 300

18 декабря 2009 г.
GET / HTTP/1.1
             Connection: keep-alive
             Accept: text/html, application/xhtml, ....
             Accept-Charset: windows-1251, utf-8; ...
             Accept-Encoding: gzip,deflate
             Accept-Language: ru,en-us;q=0.7,en;q=0.3
             Host: localhost:3000
             User-Agent: Mozilla/5.0 (Macintosh; ...
             Content-Length: 0
             Keep-Alive: 300

18 декабря 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!');
                }
18 декабря 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!');
                }
18 декабря 2009 г.
Генерация
                     mojo-приложения


18 декабря 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

18 декабря 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

18 декабря 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’)


18 декабря 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

18 декабря 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!');
                }
18 декабря 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

18 декабря 2009 г.
#!/usr/bin/env perl

                use strict;
                use warnings;

                use Test::More tests => 1;

                use_ok('TestMojo');



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



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




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


18 декабря 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




18 декабря 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




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




18 декабря 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




18 декабря 2009 г.
Mojo::Server::FCGI
                     script/test_mojo fcgi
                     script/test_mojo fcgi_prefork




18 декабря 2009 г.
Mojo::Server::FCGI
                     script/test_mojo fcgi
                     script/test_mojo fcgi_prefork




18 декабря 2009 г.
Mojo::Server::FCGI
                     script/test_mojo fcgi
                     script/test_mojo fcgi_prefork




18 декабря 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;
             }
18 декабря 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;
             }
18 декабря 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;
             }
18 декабря 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;
             }
18 декабря 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;
             }
18 декабря 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




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




18 декабря 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




18 декабря 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



18 декабря 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
                      script/test_mojo get


18 декабря 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
                      script/test_mojo get http://goo.gl


18 декабря 2009 г.
MVC веб-фреймворки



18 декабря 2009 г.
Mojolicious
                       use base 'Mojo';




18 декабря 2009 г.
• Mojolicous::Controller
                     • Mojolicious::Plugin
                     • Mojolicious::Commands
                     • MojoX::Types
                     • MojoX::Dispatcher, MojoX::Routes

18 декабря 2009 г.
• Mojolicous::Controller
                     • Mojolicious::Plugin
                     • Mojolicious::Commands
                     • MojoX::Types
                     • MojoX::Dispatcher, MojoX::Routes

18 декабря 2009 г.
Mojolicious::Controller
                           Controller Base Class




18 декабря 2009 г.
• render
                     • render_text
                     • render_json
                     • render_inner
                     • render_partial
                     • pause / resume
                     • redirect_to / url_for
18 декабря 2009 г.
• render
                     • render_text
                     • render_json
                     • render_inner
                     • render_partial
                     • pause / resume
                     • redirect_to / url_for
18 декабря 2009 г.
• render(tempate => ‘foo/bar’)
                     • render_text
                     • render_json
                     • render_inner
                     • render_partial
                     • pause / resume
                     • redirect_to / url_for
18 декабря 2009 г.
• render(controller => ‘foo’, action => ‘bar’)
                     • render_text
                     • render_json
                     • render_inner
                     • render_partial
                     • pause / resume
                     • redirect_to / url_for
18 декабря 2009 г.
• render(‘foo/bar’, format => ‘html)
                     • render_text
                     • render_json
                     • render_inner
                     • render_partial
                     • pause / resume
                     • redirect_to / url_for
18 декабря 2009 г.
• render
                     • render_text
                     • render_json
                     • render_inner
                     • render_partial
                     • pause / resume
                     • redirect_to / url_for
18 декабря 2009 г.
• render
                     • render(text => ‘Saint Perl 2009’)
                     • render_json
                     • render_inner
                     • render_partial
                     • pause / resume
                     • redirect_to / url_for
18 декабря 2009 г.
• render
                     • render_text
                     • render_json
                     • render_inner
                     • render_partial
                     • pause / resume
                     • redirect_to / url_for
18 декабря 2009 г.
• render
                     • render_text
                     • render(json => {foo => ‘bar’})
                     • render_inner
                     • render_partial
                     • pause / resume
                     • redirect_to / url_for
18 декабря 2009 г.
• render
                     • render_text
                     • render_json
                     • render_inner
                     • render_partial
                     • pause / resume
                     • redirect_to / url_for
18 декабря 2009 г.
• render
                     • render_text
                     • render_json
                     • render_inner
                     • render_partial
                     • pause / resume
                     • redirect_to / url_for
18 декабря 2009 г.
• render
                     • render_text
                     • render_json
                     • render_inner
                     • render_partial
                     • pause / resume
                     • redirect_to / url_for
18 декабря 2009 г.
• render
                     • render_text
                     • render_json
                     • render_inner
                     • render_partial
                     • pause / resume
                     • redirect_to / url_for
18 декабря 2009 г.
• Mojolicous::Controller
                     • Mojolicious::Plugin
                     • Mojolicious::Commands
                     • MojoX::Types
                     • MojoX::Dispatcher, MojoX::Routes

18 декабря 2009 г.
Mojolicious::Plugin
                          Plugin Base Class




18 декабря 2009 г.
Mojolicious::Plugins
                     Plugins: load_plugin, add_hook, run_hook




18 декабря 2009 г.
• AgentCondition
                     • Charset
                     • DefaultHelpers
                     • EpRenderer
                     • EplRenderer
                     • RequestTimer

18 декабря 2009 г.
• AgentCondition
                     • Charset
                     • DefaultHelpers
                     • EpRenderer
                     • EplRenderer
                     • RequestTimer

18 декабря 2009 г.
• AgentCondition
                     • Charset
                     • DefaultHelpers
                     • EpRenderer
                     • EplRenderer
                     • RequestTimer

18 декабря 2009 г.
• AgentCondition
                     • Charset
                     • DefaultHelpers
                     • EpRenderer
                     • EplRenderer
                     • RequestTimer

18 декабря 2009 г.
• dumper
                     • param
                     • layout
                     • include
                     • content
                     • extends

18 декабря 2009 г.
• dumper
                     • param
                     • layout
                     • include
                     • content
                     • extends

18 декабря 2009 г.
• Data::Dumper (Maxdepth: 2, Indent: 1, Terse: 1)
                     • param
                     • layout
                     • include
                     • content
                     • extends

18 декабря 2009 г.
• dumper
                     • param
                     • layout
                     • include
                     • content
                     • extends

18 декабря 2009 г.
• dumper
                     • $self->req->param(...)
                     • layout
                     • include
                     • content
                     • extends

18 декабря 2009 г.
• dumper
                     • param
                     • layout
                     • include
                     • content
                     • extends

18 декабря 2009 г.
• dumper
                     • param
                     • $self->stash(layout => ...)
                     • include
                     • content
                     • extends

18 декабря 2009 г.
• dumper
                     • param
                     • layout
                     • include
                     • content
                     • extends

18 декабря 2009 г.
• dumper
                     • param
                     • layout
                     • $self->render_partial(...)
                     • content
                     • extends

18 декабря 2009 г.
• dumper
                     • param
                     • layout
                     • include
                     • content
                     • extends

18 декабря 2009 г.
• dumper
                     • param
                     • layout
                     • include
                     • $self->render_inner(...)
                     • extends

18 декабря 2009 г.
• dumper
                     • param
                     • layout
                     • include
                     • content
                     • extends

18 декабря 2009 г.
• dumper
                     • param
                     • layout
                     • include
                     • content
                     • $self->stash(extends => ...)

18 декабря 2009 г.
• AgentCondition
                     • Charset
                     • DefaultHelpers
                     • EpRenderer
                     • EplRenderer
                     • RequestTimer

18 декабря 2009 г.
• расширение шаблонов .epl
                     • my $self = shift;
                     • $self->stash(foo => ‘bar’)



18 декабря 2009 г.
• AgentCondition
                     • Charset
                     • DefaultHelpers
                     • EpRenderer
                     • EplRenderer
                     • RequestTimer

18 декабря 2009 г.
• расширение шаблонов .ep
                     • кеширование шаблонов
                     • $self->stash(foo => ‘bar’) – $foo
                     • доступны подключенные helper’ы
                     • обработчик по умолчанию


18 декабря 2009 г.
• AgentCondition
                     • Charset
                     • DefaultHelpers
                     • EpRenderer
                     • EplRenderer
                     • RequestTimer

18 декабря 2009 г.
• Mojolicous::Controller
                     • Mojolicious::Plugin
                     • Mojolicious::Commands
                     • MojoX::Types
                     • MojoX::Dispatcher, MojoX::Routes

18 декабря 2009 г.
script/test_app
                     COMMAND [OPTIONS]
                      script/test_app cgi
                      script/test_app fastcgi
                      script/test_app daemon
                      script/test_app daemon_prefork --port 80
                      script/test_app test
                      script/test_app get


18 декабря 2009 г.
script/test_app
                     COMMAND [OPTIONS]
                      script/test_app cgi
                      script/test_app fastcgi
                      script/test_app daemon
                      script/test_app daemon_prefork --port 80
                      script/test_app test
                      script/test_app get
                      scritp/test_app routes

18 декабря 2009 г.
• Mojolicous::Controller
                     • Mojolicious::Plugin
                     • Mojolicious::Commands
                     • MojoX::Types
                     • MojoX::Dispatcher, MojoX::Routes

18 декабря 2009 г.
• Mojolicous::Controller
                     • Mojolicious::Plugin
                     • Mojolicious::Commands
                     • MojoX::Types
                     • MojoX::Dispatcher, MojoX::Routes

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


18 декабря 2009 г.
mojolicious generate
                        app TestApp


18 декабря 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


18 декабря 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


18 декабря 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


18 декабря 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


18 декабря 2009 г.
package TestApp;

                use base 'Mojolicious';
                sub startup {
                  my $self = shift;

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

18 декабря 2009 г.
package TestApp;

                use base 'Mojolicious';
                sub startup {
                  my $self = shift;

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

18 декабря 2009 г.
package TestApp;

                use base 'Mojolicious';
                sub startup {
                  my $self = shift;

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

18 декабря 2009 г.
package TestApp;

                use base 'Mojolicious';
                sub startup {
                  my $self = shift;

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

18 декабря 2009 г.
package TestApp;

                use base 'Mojolicious';
                sub startup {
                  my $self = shift;

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

18 декабря 2009 г.
package TestApp;

                use base 'Mojolicious';
                sub startup {
                  my $self = shift;

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

18 декабря 2009 г.
package TestApp;

                use base 'Mojolicious';
                sub startup {
                  my $self = shift;

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

18 декабря 2009 г.
package TestApp;

                use base 'Mojolicious';
                sub startup {
                  my $self = shift;

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

18 декабря 2009 г.
package TestApp::Example;

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

             1;

18 декабря 2009 г.
[exist]   test_app/public
                [write]   test_app/public/index.html
                [mkdir]   test_app/templates
                [write]   test_app/templates/exception.html.ep
                [write]   test_app/templates/not_found.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




18 декабря 2009 г.
[exist]   test_app/public
                [write]   test_app/public/index.html
                [mkdir]   test_app/templates
                [write]   test_app/templates/exception.html.ep
                [write]   test_app/templates/not_found.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




18 декабря 2009 г.
example/
                      welcome.html.ep
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                      welcome.html.ep
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
controller/
                      welcome.html.ep
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                      welcome.html.ep
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                      welcome.html.ep
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                         action.html.ep
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                      welcome.html.ep
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                      welcome.html.ep
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                     welcome.html.handler
                      Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                      welcome.html.ep
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                      welcome.html.epl
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                       welcome.html.tt
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                       welcome.html.ht
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                     welcome.html.pro
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                     welcome.html.ctpp2
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                      welcome.html.foo
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                      welcome.html.ep
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                      welcome.html.ep
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                     welcome.format.ep
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                      welcome.html.ep
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                       welcome.xml.ep
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                        welcome.rss.ep
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                       welcome.json.ep
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                      welcome.yaml.ep
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                       welcome.mail.ep
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                        welcome.bar.ep
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                      welcome.html.ep
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
example/
                      welcome.html.ep
                     Автоматическая генерация имени шаблона




18 декабря 2009 г.
controller/
                     action.format.handler
                      Автоматическая генерация имени шаблона




18 декабря 2009 г.
% layout 'default';

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

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




18 декабря 2009 г.
[exist]   test_app/public
                [write]   test_app/public/index.html
                [mkdir]   test_app/templates
                [write]   test_app/templates/exception.html.ep
                [write]   test_app/templates/not_found.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




18 декабря 2009 г.
<!doctype html>
             <html>
                <head><title>Welcome</title></head>
                <body>
                  <%== content %>
                </body>
             </html>




18 декабря 2009 г.
[exist]   test_app/public
                [write]   test_app/public/index.html
                [mkdir]   test_app/templates
                [write]   test_app/templates/exception.html.ep
                [write]   test_app/templates/not_found.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




18 декабря 2009 г.
Global symbol "$message2" requires explicit package
                name at (eval 280) line 2.

                1: % layout 'default';
                2: <h2><%= $message2 %></h2>
                3: ...

                {
                     'status' => 500,
                     'message' => ‘Saint Perl 2009’,
                     ...
                }


18 декабря 2009 г.
$ENV{MOJO_MODE}
                        По умолчанию development




18 декабря 2009 г.
[exist]   test_app/public
                [write]   test_app/public/index.html
                [mkdir]   test_app/templates
                [write]   test_app/templates/exception.html.ep
                [write]   test_app/templates/not_found.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




18 декабря 2009 г.
Mojolicious::Lite
                        use base 'Mojolicious';




18 декабря 2009 г.
mojolicious generate
                      lite_app test_lite


18 декабря 2009 г.
[write] test_lite
                     [chmod] test_lite 744




18 декабря 2009 г.
use Mojolicious::Lite;

                get '/' => 'index';

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

                shagadelic;

18 декабря 2009 г.
use Mojolicious::Lite;

                get '/' => 'index';

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

                shagadelic;

18 декабря 2009 г.
use Mojolicious::Lite;

                get '/' => 'index';

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

                shagadelic;

18 декабря 2009 г.
use Mojolicious::Lite;

                post '/' => 'index';

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

                shagadelic;

18 декабря 2009 г.
use Mojolicious::Lite;

                any '/' => 'index';

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

                shagadelic;

18 декабря 2009 г.
use Mojolicious::Lite;

                get '/' => 'index';

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

                shagadelic;

18 декабря 2009 г.
use Mojolicious::Lite;

                get '/' => 'index';

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

                shagadelic;

18 декабря 2009 г.
use Mojolicious::Lite;

                get '/' => 'index';

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

                shagadelic;

18 декабря 2009 г.
use Mojolicious::Lite;

                get '/' => 'index';

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

                shagadelic;

18 декабря 2009 г.
use Mojolicious::Lite;

                get '/' => 'index';

                any '/:groovy' => sub {
                   my $self = shift;
                   $self->render_text($self->stash('groovy'));
                };
                app->renderer->default_handler(‘epl’);
                shagadelic;

18 декабря 2009 г.
use Mojolicious::Lite;
                ladder sub { ... }; # auth
                get '/' => 'index';

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

                shagadelic;

18 декабря 2009 г.
use Mojolicious::Lite;

                get '/' => 'index';

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

                shagadelic; # shagadelic(‘cgi’)

18 декабря 2009 г.
__DATA__

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

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



18 декабря 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


18 декабря 2009 г.
Mojo Guide Style
                           Rules




18 декабря 2009 г.
Mojo Guide Style
        • Keep it simple, no magick unless absolutely nessary
        • Code should be written with a Perl6 port in mind
        • It’s not a feature without a test
        • Only add prereqs if absolutely necessary
        • No inline POD
        • No spaghetti code
        • Every files should contain at least one quote from
                The Simpsons or Futurama

18 декабря 2009 г.
Mojo Guide Style
        • Keep it simple, no magick unless absolutely nessary
        • Code should be written with a Perl6 port in mind
        • It’s not a feature without a test
        • Only add prereqs if absolutely necessary
        • No inline POD
        • No spaghetti code
        • Every files should contain at least one quote from
                The Simpsons or Futurama

18 декабря 2009 г.
Mojo Guide Style
        • Keep it simple, no magick unless absolutely nessary
        • Code should be written with a Perl6 port in mind
        • It’s not a feature without a test
        • Only add prereqs if absolutely necessary
        • No inline POD
        • No spaghetti code
        • Every files should contain at least one quote from
                The Simpsons or Futurama

18 декабря 2009 г.
Mojo Guide Style
        • Keep it simple, no magick unless absolutely nessary
        • Code should be written with a Perl6 port in mind
        • It’s not a feature without a test
        • Only add prereqs if absolutely necessary
        • No inline POD
        • No spaghetti code
        • Every files should contain at least one quote from
                The Simpsons or Futurama

18 декабря 2009 г.
Mojo Guide Style
        • Keep it simple, no magick unless absolutely nessary
        • Code should be written with a Perl6 port in mind
        • It’s not a feature without a test
        • Only add prereqs if absolutely necessary
        • No inline POD
        • No spaghetti code
        • Every files should contain at least one quote from
                The Simpsons or Futurama

18 декабря 2009 г.
Mojo Guide Style
        • Keep it simple, no magick unless absolutely nessary
        • Code should be written with a Perl6 port in mind
        • It’s not a feature without a test
        • Only add prereqs if absolutely necessary
        • No inline POD
        • No spaghetti code
        • Every files should contain at least one quote from
                The Simpsons or Futurama

18 декабря 2009 г.
Mojo Guide Style
        • Keep it simple, no magick unless absolutely nessary
        • Code should be written with a Perl6 port in mind
        • It’s not a feature without a test
        • Only add prereqs if absolutely necessary
        • No inline POD
        • No spaghetti code
        • Every files should contain at least one quote from
                The Simpsons or Futurama :)

18 декабря 2009 г.
The Simpsons or Futurama
18 декабря 2009 г.
Стабильная версия,
                         обратная
                      совместимость?


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




18 декабря 2009 г.
http://github.com/kraih/mojo
18 декабря 2009 г.
Обратная
                     совместимость не
                      гарантируется :)
                       До первой стабильной версии




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


18 декабря 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’);;
              };

18 декабря 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’);;
              };

18 декабря 2009 г.
test.pl

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




18 декабря 2009 г.
script/test_bug daemon # OK




18 декабря 2009 г.
script/test_bug daemon # OK
                     script/test_bug daemon_prefork # DIE




18 декабря 2009 г.
Mojo::Server::Daemon::Prefork #323:

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




18 декабря 2009 г.
Mojo::Server::Daemon::Prefork #323:

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




18 декабря 2009 г.
Mojo::Server::Daemon::Prefork #323:

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

          $SIG{CHLD} = ‘IGNORE’;




18 декабря 2009 г.
Второй критичный
                            баг


18 декабря 2009 г.
Второй критичный
                          мой баг


18 декабря 2009 г.
MOJO_RELOAD,
                      daemon и attr


18 декабря 2009 г.
MOJO_RELOAD=1 script/test_bug2 daemon
                       # OK




18 декабря 2009 г.
MOJO_RELOAD=1 script/test_bug2 daemon
                    # OK не всегда




18 декабря 2009 г.
script/test_bug2 daemon_prefork # OK




18 декабря 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 { ... }
18 декабря 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 { ... }
18 декабря 2009 г.
package App;
                use base ‘Mojo::Base’;

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

                sub dispatch { ... }
18 декабря 2009 г.
Документация



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




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




18 декабря 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/
18 декабря 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/
18 декабря 2009 г.
Bootylicious
18 декабря 2009 г.
Bootylicious
18 декабря 2009 г.
«А жопа-то у неё ничего»
18 декабря 2009 г.
Полезная информация

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

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

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

                     •   Slowly starting with documentation work, crazy
                         how much #Mojolicious has grown recently, looks
                         like it needs a few extra chapters now. :)

                     •   Added native #PSGI support to #Mojolicious

18 декабря 2009 г.
Опыт разработки
                        на Mojo


18 декабря 2009 г.
Mojolicious + MojoX::Renderer::TT
18 декабря 2009 г.
Mojo + JSON
18 декабря 2009 г.
Mojolicious::Lite +
18 декабря 2009 г.
                     MojoX::Renderer::JSON
Mojolicious::Lite +
                 MojoX::Renderer::JSON + RSS
18 декабря 2009 г.
Mojolicious + Mojo::Template
18 декабря 2009 г.
Mojolicious + EpRenderer
                         Около 7 проектов работает




18 декабря 2009 г.
«Я никогда так быстро не
                        делал сайты на Perl»
                          Анатолий Шарифулин :)




18 декабря 2009 г.
«Making hard things possible and
                        everything fun!»
                           Девиз Mojolicious




18 декабря 2009 г.
Mojo. Веб в коробке!
Mojo. Веб в коробке!
Mojo. Веб в коробке!
Mojo. Веб в коробке!
Mojo. Веб в коробке!
Mojo. Веб в коробке!
Mojo. Веб в коробке!
Mojo. Веб в коробке!
Mojo. Веб в коробке!
Mojo. Веб в коробке!
Mojo. Веб в коробке!

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
 
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
 
Николай Сиварев "Приручая сайты"
Николай Сиварев "Приручая сайты"Николай Сиварев "Приручая сайты"
Николай Сиварев "Приручая сайты"Yandex
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 
Разработка SPA на мультисайтовом highload-проекте
Разработка SPA на мультисайтовом highload-проектеРазработка SPA на мультисайтовом highload-проекте
Разработка SPA на мультисайтовом highload-проектеAndrew Gumenniy
 
JSLab. Григорий Перетяка "Разработка SPA на мультисайтовом highload-проекте"
JSLab. Григорий Перетяка "Разработка SPA на мультисайтовом highload-проекте"JSLab. Григорий Перетяка "Разработка SPA на мультисайтовом highload-проекте"
JSLab. Григорий Перетяка "Разработка SPA на мультисайтовом highload-проекте"GeeksLab Odessa
 
Артем Курбатов — Мастер-класс «Динамический БЭМ-сайт на Node.js»
Артем Курбатов — Мастер-класс «Динамический БЭМ-сайт на Node.js»Артем Курбатов — Мастер-класс «Динамический БЭМ-сайт на Node.js»
Артем Курбатов — Мастер-класс «Динамический БЭМ-сайт на Node.js»Yandex
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...Yandex
 
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...CodeFest
 
Мульти-доменность в Django проекте
Мульти-доменность в Django проектеМульти-доменность в Django проекте
Мульти-доменность в Django проектеAlexey Kinyov
 
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ruБаба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ruYandex
 
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»  Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов» Badoo Development
 

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

Mojolicious. The web in a box!
Mojolicious. The web in a box!Mojolicious. The web in a box!
Mojolicious. The web in a box!
 
M18 backups
M18 backupsM18 backups
M18 backups
 
Docker в Badoo: ПМЖ или временная регистрация
Docker в Badoo: ПМЖ или временная регистрацияDocker в Badoo: ПМЖ или временная регистрация
Docker в Badoo: ПМЖ или временная регистрация
 
Docker integration into Badoo
Docker integration into BadooDocker integration into Badoo
Docker integration into Badoo
 
Николай Сиварев "Приручая сайты"
Николай Сиварев "Приручая сайты"Николай Сиварев "Приручая сайты"
Николай Сиварев "Приручая сайты"
 
Ruby gui
Ruby guiRuby gui
Ruby gui
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Разработка SPA на мультисайтовом highload-проекте
Разработка SPA на мультисайтовом highload-проектеРазработка SPA на мультисайтовом highload-проекте
Разработка SPA на мультисайтовом highload-проекте
 
JSLab. Григорий Перетяка "Разработка SPA на мультисайтовом highload-проекте"
JSLab. Григорий Перетяка "Разработка SPA на мультисайтовом highload-проекте"JSLab. Григорий Перетяка "Разработка SPA на мультисайтовом highload-проекте"
JSLab. Григорий Перетяка "Разработка SPA на мультисайтовом highload-проекте"
 
Артем Курбатов — Мастер-класс «Динамический БЭМ-сайт на Node.js»
Артем Курбатов — Мастер-класс «Динамический БЭМ-сайт на Node.js»Артем Курбатов — Мастер-класс «Динамический БЭМ-сайт на Node.js»
Артем Курбатов — Мастер-класс «Динамический БЭМ-сайт на Node.js»
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...
 
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...
 
php frameworks
php frameworksphp frameworks
php frameworks
 
Мульти-доменность в Django проекте
Мульти-доменность в Django проектеМульти-доменность в Django проекте
Мульти-доменность в Django проекте
 
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ruБаба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
 
Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»  Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»
 

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
 
Конкурентный анализ мобильных приложений
Конкурентный анализ мобильных приложенийКонкурентный анализ мобильных приложений
Конкурентный анализ мобильных приложений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
 
Удержание пользователя в приложении
Удержание пользователя в приложенииУдержание пользователя в приложении
Удержание пользователя в приложенииAnatoly Sharifulin
 
Мобильный сайт или мобильное приложение?
Мобильный сайт или мобильное приложение?Мобильный сайт или мобильное приложение?
Мобильный сайт или мобильное приложение?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
 
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. Веб в коробке! Saint Perl 2009 18 декабря 2009 г.
  • 3. Sebastian Riedel автор Catalyst и Mojo http://labs.kraih.com/ 18 декабря 2009 г.
  • 5. Sebastian Riedel автор Catalyst и Mojo http://labs.kraih.com/ 18 декабря 2009 г.
  • 6. Sebastian Riedel автор Catalyst и Mojo http://labs.kraih.com/ 18 декабря 2009 г.
  • 7. Catalyst + Mojo = ? 18 декабря 2009 г.
  • 8. Что такое Mojo? 18 декабря 2009 г.
  • 9. Что такое Mojo? • Pure Perl веб-фреймворк • Без зависимостей (начиная с Perl 5.10) • Объектно-ориентированное API • Поддержка HTTP 1.1 (клиент-сервер) • CGI, FastCGI, Daemon и Daemon Prefork • MVC веб-фреймворки: Mojolicious и Mojolicious::Lite 18 декабря 2009 г.
  • 10. Что такое Mojo? • Pure Perl веб-фреймворк • Без зависимостей (с версии Perl 5.8.1) • Объектно-ориентированное API • Поддержка HTTP 1.1 (клиент-сервер) • CGI, FastCGI, Daemon и Daemon Prefork • MVC веб-фреймворки: Mojolicious и Mojolicious::Lite 18 декабря 2009 г.
  • 11. Что такое Mojo? • Pure Perl веб-фреймворк • Без зависимостей (с версии Perl 5.8.1) • Объектно-ориентированное API • Поддержка HTTP 1.1 (клиент-сервер) • CGI, FastCGI, Daemon и Daemon Prefork • MVC веб-фреймворки: Mojolicious и Mojolicious::Lite 18 декабря 2009 г.
  • 12. Что такое Mojo? • Pure Perl веб-фреймворк • Без зависимостей (с версии Perl 5.8.1) • Объектно-ориентированное API • Поддержка HTTP 1.1 (клиент-сервер) • CGI, FastCGI, Daemon и Daemon Prefork • MVC веб-фреймворки: Mojolicious и Mojolicious::Lite 18 декабря 2009 г.
  • 13. Что такое Mojo? • Pure Perl веб-фреймворк • Без зависимостей (с версии Perl 5.8.1) • Объектно-ориентированное API • Поддержка HTTP 1.1 (клиент-сервер) • CGI, FastCGI, PSGI, Daemon и Prefork • MVC веб-фреймворки: Mojolicious и Mojolicious::Lite 18 декабря 2009 г.
  • 14. Что такое Mojo? • Pure Perl веб-фреймворк • Без зависимостей (с версии Perl 5.8.1) • Объектно-ориентированное API • Поддержка HTTP 1.1 (клиент-сервер) • CGI, FastCGI, PSGI, Daemon и Prefork • MVC веб-фреймворки: Mojolicious и Mojolicious::Lite 18 декабря 2009 г.
  • 15. Что такое Mojo? • Pure Perl веб-фреймворк • Без зависимостей (с версии Perl 5.8.1) • Объектно-ориентированное API • Поддержка HTTP 1.1 (клиент-сервер) • CGI, FastCGI, PSGI, Daemon и Prefork • MVC веб-фреймворки: Mojolicious и Mojolicious::Lite 18 декабря 2009 г.
  • 16. Pure Perl веб-фреймворк 18 декабря 2009 г.
  • 17. • 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 18 декабря 2009 г.
  • 18. • 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 18 декабря 2009 г.
  • 19. Mojo::Base Minimal Base Class For Mojo Projects 18 декабря 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 { ... } 18 декабря 2009 г.
  • 21. 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 { ... } 18 декабря 2009 г.
  • 22. 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 { ... } 18 декабря 2009 г.
  • 23. • 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 18 декабря 2009 г.
  • 24. Mojo::ByteStream ByteStream 18 декабря 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; 18 декабря 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; 18 декабря 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; 18 декабря 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; 18 декабря 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; 18 декабря 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; 18 декабря 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; 18 декабря 2009 г.
  • 32. 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; 18 декабря 2009 г.
  • 33. 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; 18 декабря 2009 г.
  • 34. • 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 18 декабря 2009 г.
  • 35. Mojo::Template Perlish Templates! 18 декабря 2009 г.
  • 36. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> 18 декабря 2009 г.
  • 37. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> 18 декабря 2009 г.
  • 38. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> 18 декабря 2009 г.
  • 39. %= my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> 18 декабря 2009 г.
  • 40. %== my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> 18 декабря 2009 г.
  • 41. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> 18 декабря 2009 г.
  • 42. % use Foo::Bar; <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> 18 декабря 2009 г.
  • 43. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> 18 декабря 2009 г.
  • 44. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> 18 декабря 2009 г.
  • 45. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> 18 декабря 2009 г.
  • 46. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> 18 декабря 2009 г.
  • 47. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%== $_->{title} %> </li> %} </ul> <p><%# comment %></p> 18 декабря 2009 г.
  • 48. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <% my $foo = $_->{id} + 100500; %> </li> %} </ul> <p><%# comment %></p> 18 декабря 2009 г.
  • 49. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <% my $foo = $_->{id} + 100500; %> </li> %} </ul> <p><%# comment %></p> 18 декабря 2009 г.
  • 50. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> 18 декабря 2009 г.
  • 51. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> 18 декабря 2009 г.
  • 52. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> 18 декабря 2009 г.
  • 53. • 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 18 декабря 2009 г.
  • 54. Mojo::JSON Minimalistic JSON 18 декабря 2009 г.
  • 55. my $json = Mojo::JSON->new; my $string = $json->encode({foo => ‘bar’}); my $hash = $json->decode(‘{"foo":"bar"}’); 18 декабря 2009 г.
  • 56. my $json = Mojo::JSON->new; my $string = $json->encode({foo => ‘bar’}); my $hash = $json->decode(‘{"foo":"bar"}’); 18 декабря 2009 г.
  • 57. my $json = Mojo::JSON->new; my $string = $json->encode({foo => ‘bar’}); my $hash = $json->decode(‘{"foo":"bar"}’); 18 декабря 2009 г.
  • 58. • 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 18 декабря 2009 г.
  • 59. Mojo::Loader Class loader: load, reload, search 18 декабря 2009 г.
  • 60. Mojo::Loader Class loader: load, reload, search 18 декабря 2009 г.
  • 61. • 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 18 декабря 2009 г.
  • 62. • 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 18 декабря 2009 г.
  • 63. • 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 18 декабря 2009 г.
  • 64. • Mojo::Trasaction, Mojo::Stateful • Mojo::IOLoop • Mojo::Client, Mojo::Server • Mojo::Server::CGI, Mojo::Server::FastCGI • Mojo::Server::PSGI • Mojo::Server::Daemon и ::Prefork • Mojo::Command • Mojo::Command::Generate и ~ Server 18 декабря 2009 г.
  • 65. • Mojo::Trasaction, Mojo::Stateful • Mojo::IOLoop • Mojo::Client, Mojo::Server • Mojo::Server::CGI, Mojo::Server::FastCGI • Mojo::Server::PSGI • Mojo::Server::Daemon и ::Prefork • Mojo::Command • Mojo::Command::Generate и ~ Server 18 декабря 2009 г.
  • 66. • Mojo::Trasaction, Mojo::Stateful • Mojo::IOLoop • Mojo::Client, Mojo::Server • Mojo::Server::CGI, Mojo::Server::FastCGI • Mojo::Server::PSGI • Mojo::Server::Daemon и ::Prefork • Mojo::Command • Mojo::Command::Generate и ~ Server 18 декабря 2009 г.
  • 67. • Mojo::Trasaction, Mojo::Stateful • Mojo::IOLoop • Mojo::Client, Mojo::Server • Mojo::Server::CGI, Mojo::Server::FastCGI • Mojo::Server::PSGI • Mojo::Server::Daemon и ::Prefork • Mojo::Command • Mojo::Command::Generate и ~ Server 18 декабря 2009 г.
  • 68. my $client = Mojo::Client->new; $client->get( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; 18 декабря 2009 г.
  • 69. my $client = Mojo::Client->new; $client->get( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; 18 декабря 2009 г.
  • 70. my $client = Mojo::Client->new; $client->post( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; 18 декабря 2009 г.
  • 71. my $client = Mojo::Client->new; $client->head( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; 18 декабря 2009 г.
  • 72. my $client = Mojo::Client->new; $client->put( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; 18 декабря 2009 г.
  • 73. my $client = Mojo::Client->new; $client->get( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; 18 декабря 2009 г.
  • 74. my $client = Mojo::Client->new; $client->get( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; 18 декабря 2009 г.
  • 75. my $client = Mojo::Client->new; $client->get( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; 18 декабря 2009 г.
  • 76. my $client = Mojo::Client->new; $client->get( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; 18 декабря 2009 г.
  • 77. my $client = Mojo::Client->new; $client->get( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; 18 декабря 2009 г.
  • 78. • Mojo::Trasaction, Mojo::Stateful • Mojo::IOLoop • Mojo::Client, Mojo::Server • Mojo::Server::CGI, Mojo::Server::FastCGI • Mojo::Server::PSGI • Mojo::Server::Daemon и ::Prefork • Mojo::Command • Mojo::Command::Generate и ~ Server 18 декабря 2009 г.
  • 79. • Mojo::Trasaction, Mojo::Stateful • Mojo::IOLoop • Mojo::Client, Mojo::Server • Mojo::Server::CGI, Mojo::Server::FastCGI • Mojo::Server::PSGI • Mojo::Server::Daemon и ::Prefork • Mojo::Command • Mojo::Command::Generate и ~ Server 18 декабря 2009 г.
  • 80. • Mojo::Trasaction, Mojo::Stateful • Mojo::IOLoop • Mojo::Client, Mojo::Server • Mojo::Server::CGI, Mojo::Server::FastCGI • Mojo::Server::PSGI • Mojo::Server::Daemon и ::Prefork • Mojo::Command • Mojo::Command::Generate и ~ Server 18 декабря 2009 г.
  • 81. • Mojo::Trasaction, Mojo::Stateful • Mojo::IOLoop • Mojo::Client, Mojo::Server • Mojo::Server::CGI, Mojo::Server::FastCGI • Mojo::Server::PSGI • Mojo::Server::Daemon и ::Prefork • Mojo::Command • Mojo::Command::Generate и ~ Server 18 декабря 2009 г.
  • 82. • Mojo::Trasaction, Mojo::Stateful • Mojo::IOLoop • Mojo::Client, Mojo::Server • Mojo::Server::CGI, Mojo::Server::FastCGI • Mojo::Server::PSGI • Mojo::Server::Daemon и ::Prefork • Mojo::Command • Mojo::Command::Generate и ~ Server 18 декабря 2009 г.
  • 83. Всё, что нужно есть Mojo – веб в коробке! 18 декабря 2009 г.
  • 84. Почти всё, что нужно есть :) Mojo – веб в коробке! 18 декабря 2009 г.
  • 85. Без зависимостей с версии Perl 5.8.1 18 декабря 2009 г.
  • 86. Почти без зависимостей :) 18 декабря 2009 г.
  • 91. Mojo Perl 5.010 18 декабря 2009 г.
  • 92. Объектно- ориентированное API 18 декабря 2009 г.
  • 93. 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!'); } 18 декабря 2009 г.
  • 94. 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!'); } 18 декабря 2009 г.
  • 95. 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!'); } 18 декабря 2009 г.
  • 96. 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!'); } 18 декабря 2009 г.
  • 97. use overload '""' => sub { shift->to_string }, fallback => 1; 18 декабря 2009 г.
  • 98. GET / HTTP/1.1 Connection: keep-alive Accept: text/html, application/xhtml, .... Accept-Charset: windows-1251, utf-8; ... Accept-Encoding: gzip,deflate Accept-Language: ru,en-us;q=0.7,en;q=0.3 Host: localhost:3000 User-Agent: Mozilla/5.0 (Macintosh; ... Content-Length: 0 Keep-Alive: 300 18 декабря 2009 г.
  • 99. GET / HTTP/1.1 Connection: keep-alive Accept: text/html, application/xhtml, .... Accept-Charset: windows-1251, utf-8; ... Accept-Encoding: gzip,deflate Accept-Language: ru,en-us;q=0.7,en;q=0.3 Host: localhost:3000 User-Agent: Mozilla/5.0 (Macintosh; ... Content-Length: 0 Keep-Alive: 300 18 декабря 2009 г.
  • 100. 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!'); } 18 декабря 2009 г.
  • 101. 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!'); } 18 декабря 2009 г.
  • 102. Генерация mojo-приложения 18 декабря 2009 г.
  • 103. 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 18 декабря 2009 г.
  • 104. 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 18 декабря 2009 г.
  • 105. 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’) 18 декабря 2009 г.
  • 106. 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 18 декабря 2009 г.
  • 107. 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!'); } 18 декабря 2009 г.
  • 108. 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 18 декабря 2009 г.
  • 109. #!/usr/bin/env perl use strict; use warnings; use Test::More tests => 1; use_ok('TestMojo'); 18 декабря 2009 г.
  • 110. Поддержка HTTP 1.1 18 декабря 2009 г.
  • 112. MojoX::UserAgent Pascal Gaudette Спасибо Google of Summer Code 2009! 18 декабря 2009 г.
  • 113. Поддержка CGI, FastCGI, PSGI, Daemon, Prefork 18 декабря 2009 г.
  • 114. script/test_mojo COMMAND [OPTIONS] script/test_mojo cgi script/test_mojo fastcgi script/test_mojo daemon script/test_mojo daemon_prefork --port 80 18 декабря 2009 г.
  • 115. script/test_mojo COMMAND [OPTIONS] script/test_mojo cgi script/test_mojo fastcgi script/test_mojo daemon script/test_mojo daemon_prefork --port 80 18 декабря 2009 г.
  • 116. PATH_INFO='/' script/ test_mojo cgi Легко тестировать Можно профилировать код, используя Devel::NYProf 18 декабря 2009 г.
  • 117. script/test_mojo COMMAND [OPTIONS] script/test_mojo cgi script/test_mojo fastcgi script/test_mojo daemon script/test_mojo daemon_prefork --port 80 18 декабря 2009 г.
  • 118. Mojo::Server::FCGI script/test_mojo fcgi script/test_mojo fcgi_prefork 18 декабря 2009 г.
  • 119. Mojo::Server::FCGI script/test_mojo fcgi script/test_mojo fcgi_prefork 18 декабря 2009 г.
  • 120. Mojo::Server::FCGI script/test_mojo fcgi script/test_mojo fcgi_prefork 18 декабря 2009 г.
  • 121. 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; } 18 декабря 2009 г.
  • 122. 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; } 18 декабря 2009 г.
  • 123. 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; } 18 декабря 2009 г.
  • 124. 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; } 18 декабря 2009 г.
  • 125. 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; } 18 декабря 2009 г.
  • 126. script/test_mojo COMMAND [OPTIONS] script/test_mojo cgi script/test_mojo fastcgi script/test_mojo daemon script/test_mojo daemon_prefork --port 80 18 декабря 2009 г.
  • 127. MOJO_RELOAD=1 script/test_mojo daemon Код перезагружается при каждом запросе 18 декабря 2009 г.
  • 128. script/test_mojo COMMAND [OPTIONS] script/test_mojo cgi script/test_mojo fastcgi script/test_mojo daemon script/test_mojo daemon_prefork --port 80 18 декабря 2009 г.
  • 129. 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 18 декабря 2009 г.
  • 130. 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 script/test_mojo get 18 декабря 2009 г.
  • 131. 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 script/test_mojo get http://goo.gl 18 декабря 2009 г.
  • 133. Mojolicious use base 'Mojo'; 18 декабря 2009 г.
  • 134. • Mojolicous::Controller • Mojolicious::Plugin • Mojolicious::Commands • MojoX::Types • MojoX::Dispatcher, MojoX::Routes 18 декабря 2009 г.
  • 135. • Mojolicous::Controller • Mojolicious::Plugin • Mojolicious::Commands • MojoX::Types • MojoX::Dispatcher, MojoX::Routes 18 декабря 2009 г.
  • 136. Mojolicious::Controller Controller Base Class 18 декабря 2009 г.
  • 137. • render • render_text • render_json • render_inner • render_partial • pause / resume • redirect_to / url_for 18 декабря 2009 г.
  • 138. • render • render_text • render_json • render_inner • render_partial • pause / resume • redirect_to / url_for 18 декабря 2009 г.
  • 139. • render(tempate => ‘foo/bar’) • render_text • render_json • render_inner • render_partial • pause / resume • redirect_to / url_for 18 декабря 2009 г.
  • 140. • render(controller => ‘foo’, action => ‘bar’) • render_text • render_json • render_inner • render_partial • pause / resume • redirect_to / url_for 18 декабря 2009 г.
  • 141. • render(‘foo/bar’, format => ‘html) • render_text • render_json • render_inner • render_partial • pause / resume • redirect_to / url_for 18 декабря 2009 г.
  • 142. • render • render_text • render_json • render_inner • render_partial • pause / resume • redirect_to / url_for 18 декабря 2009 г.
  • 143. • render • render(text => ‘Saint Perl 2009’) • render_json • render_inner • render_partial • pause / resume • redirect_to / url_for 18 декабря 2009 г.
  • 144. • render • render_text • render_json • render_inner • render_partial • pause / resume • redirect_to / url_for 18 декабря 2009 г.
  • 145. • render • render_text • render(json => {foo => ‘bar’}) • render_inner • render_partial • pause / resume • redirect_to / url_for 18 декабря 2009 г.
  • 146. • render • render_text • render_json • render_inner • render_partial • pause / resume • redirect_to / url_for 18 декабря 2009 г.
  • 147. • render • render_text • render_json • render_inner • render_partial • pause / resume • redirect_to / url_for 18 декабря 2009 г.
  • 148. • render • render_text • render_json • render_inner • render_partial • pause / resume • redirect_to / url_for 18 декабря 2009 г.
  • 149. • render • render_text • render_json • render_inner • render_partial • pause / resume • redirect_to / url_for 18 декабря 2009 г.
  • 150. • Mojolicous::Controller • Mojolicious::Plugin • Mojolicious::Commands • MojoX::Types • MojoX::Dispatcher, MojoX::Routes 18 декабря 2009 г.
  • 151. Mojolicious::Plugin Plugin Base Class 18 декабря 2009 г.
  • 152. Mojolicious::Plugins Plugins: load_plugin, add_hook, run_hook 18 декабря 2009 г.
  • 153. • AgentCondition • Charset • DefaultHelpers • EpRenderer • EplRenderer • RequestTimer 18 декабря 2009 г.
  • 154. • AgentCondition • Charset • DefaultHelpers • EpRenderer • EplRenderer • RequestTimer 18 декабря 2009 г.
  • 155. • AgentCondition • Charset • DefaultHelpers • EpRenderer • EplRenderer • RequestTimer 18 декабря 2009 г.
  • 156. • AgentCondition • Charset • DefaultHelpers • EpRenderer • EplRenderer • RequestTimer 18 декабря 2009 г.
  • 157. • dumper • param • layout • include • content • extends 18 декабря 2009 г.
  • 158. • dumper • param • layout • include • content • extends 18 декабря 2009 г.
  • 159. • Data::Dumper (Maxdepth: 2, Indent: 1, Terse: 1) • param • layout • include • content • extends 18 декабря 2009 г.
  • 160. • dumper • param • layout • include • content • extends 18 декабря 2009 г.
  • 161. • dumper • $self->req->param(...) • layout • include • content • extends 18 декабря 2009 г.
  • 162. • dumper • param • layout • include • content • extends 18 декабря 2009 г.
  • 163. • dumper • param • $self->stash(layout => ...) • include • content • extends 18 декабря 2009 г.
  • 164. • dumper • param • layout • include • content • extends 18 декабря 2009 г.
  • 165. • dumper • param • layout • $self->render_partial(...) • content • extends 18 декабря 2009 г.
  • 166. • dumper • param • layout • include • content • extends 18 декабря 2009 г.
  • 167. • dumper • param • layout • include • $self->render_inner(...) • extends 18 декабря 2009 г.
  • 168. • dumper • param • layout • include • content • extends 18 декабря 2009 г.
  • 169. • dumper • param • layout • include • content • $self->stash(extends => ...) 18 декабря 2009 г.
  • 170. • AgentCondition • Charset • DefaultHelpers • EpRenderer • EplRenderer • RequestTimer 18 декабря 2009 г.
  • 171. • расширение шаблонов .epl • my $self = shift; • $self->stash(foo => ‘bar’) 18 декабря 2009 г.
  • 172. • AgentCondition • Charset • DefaultHelpers • EpRenderer • EplRenderer • RequestTimer 18 декабря 2009 г.
  • 173. • расширение шаблонов .ep • кеширование шаблонов • $self->stash(foo => ‘bar’) – $foo • доступны подключенные helper’ы • обработчик по умолчанию 18 декабря 2009 г.
  • 174. • AgentCondition • Charset • DefaultHelpers • EpRenderer • EplRenderer • RequestTimer 18 декабря 2009 г.
  • 175. • Mojolicous::Controller • Mojolicious::Plugin • Mojolicious::Commands • MojoX::Types • MojoX::Dispatcher, MojoX::Routes 18 декабря 2009 г.
  • 176. script/test_app COMMAND [OPTIONS] script/test_app cgi script/test_app fastcgi script/test_app daemon script/test_app daemon_prefork --port 80 script/test_app test script/test_app get 18 декабря 2009 г.
  • 177. script/test_app COMMAND [OPTIONS] script/test_app cgi script/test_app fastcgi script/test_app daemon script/test_app daemon_prefork --port 80 script/test_app test script/test_app get scritp/test_app routes 18 декабря 2009 г.
  • 178. • Mojolicous::Controller • Mojolicious::Plugin • Mojolicious::Commands • MojoX::Types • MojoX::Dispatcher, MojoX::Routes 18 декабря 2009 г.
  • 179. • Mojolicous::Controller • Mojolicious::Plugin • Mojolicious::Commands • MojoX::Types • MojoX::Dispatcher, MojoX::Routes 18 декабря 2009 г.
  • 180. Генерация mojolicious-приложения 18 декабря 2009 г.
  • 181. mojolicious generate app TestApp 18 декабря 2009 г.
  • 182. [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 18 декабря 2009 г.
  • 183. [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 18 декабря 2009 г.
  • 184. [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 18 декабря 2009 г.
  • 185. [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 18 декабря 2009 г.
  • 186. package TestApp; use base 'Mojolicious'; sub startup { my $self = shift; my $r = $self->routes; $r->route('/:controller/:action/:id') ->to(controller => 'example', action => 'welcome', id => 1); } 18 декабря 2009 г.
  • 187. package TestApp; use base 'Mojolicious'; sub startup { my $self = shift; my $r = $self->routes; $r->route('/:controller/:action/:id') ->to(controller => 'example', action => 'welcome', id => 1); } 18 декабря 2009 г.
  • 188. package TestApp; use base 'Mojolicious'; sub startup { my $self = shift; my $r = $self->routes; $r->route('/:controller/:action/:id') ->to(controller => 'example', action => 'welcome', id => 1); } 18 декабря 2009 г.
  • 189. package TestApp; use base 'Mojolicious'; sub startup { my $self = shift; my $r = $self->routes; $r->route('/:controller/:action/:id') ->to(controller => 'example', action => 'welcome', id => 1); } 18 декабря 2009 г.
  • 190. package TestApp; use base 'Mojolicious'; sub startup { my $self = shift; my $r = $self->routes; $r->route('/:controller/:action/:id') ->to(controller => 'example', action => 'welcome', id => 1); } 18 декабря 2009 г.
  • 191. package TestApp; use base 'Mojolicious'; sub startup { my $self = shift; my $r = $self->routes; $r->route('/:controller/:action/:id') ->to(controller => 'example', action => 'welcome', id => 1); } 18 декабря 2009 г.
  • 192. package TestApp; use base 'Mojolicious'; sub startup { my $self = shift; my $r = $self->routes; $r->bridge->route('/:controller/:action/:id') ->to(controller => 'example', action => 'welcome', id => 1); } 18 декабря 2009 г.
  • 193. package TestApp; use base 'Mojolicious'; sub startup { my $self = shift; my $r = $self->routes; $r->route('/:controller/:action/:id') ->to(controller => 'example', action => 'welcome', id => 1); } 18 декабря 2009 г.
  • 194. package TestApp::Example; use base 'Mojolicious::Controller'; sub welcome { my $self = shift; warn $self->stash(‘id’); $self->render(message => 'Welcome!'); } 1; 18 декабря 2009 г.
  • 195. [exist] test_app/public [write] test_app/public/index.html [mkdir] test_app/templates [write] test_app/templates/exception.html.ep [write] test_app/templates/not_found.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 18 декабря 2009 г.
  • 196. [exist] test_app/public [write] test_app/public/index.html [mkdir] test_app/templates [write] test_app/templates/exception.html.ep [write] test_app/templates/not_found.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 18 декабря 2009 г.
  • 197. example/ welcome.html.ep Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 198. example/ welcome.html.ep Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 199. controller/ welcome.html.ep Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 200. example/ welcome.html.ep Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 201. example/ welcome.html.ep Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 202. example/ action.html.ep Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 203. example/ welcome.html.ep Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 204. example/ welcome.html.ep Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 205. example/ welcome.html.handler Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 206. example/ welcome.html.ep Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 207. example/ welcome.html.epl Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 208. example/ welcome.html.tt Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 209. example/ welcome.html.ht Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 210. example/ welcome.html.pro Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 211. example/ welcome.html.ctpp2 Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 212. example/ welcome.html.foo Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 213. example/ welcome.html.ep Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 214. example/ welcome.html.ep Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 215. example/ welcome.format.ep Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 216. example/ welcome.html.ep Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 217. example/ welcome.xml.ep Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 218. example/ welcome.rss.ep Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 219. example/ welcome.json.ep Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 220. example/ welcome.yaml.ep Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 221. example/ welcome.mail.ep Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 222. example/ welcome.bar.ep Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 223. example/ welcome.html.ep Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 224. example/ welcome.html.ep Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 225. controller/ action.format.handler Автоматическая генерация имени шаблона 18 декабря 2009 г.
  • 226. % layout 'default'; <h2><%= $message %></h2> <a href="<%== url_for %>">click here</a> 18 декабря 2009 г.
  • 227. [exist] test_app/public [write] test_app/public/index.html [mkdir] test_app/templates [write] test_app/templates/exception.html.ep [write] test_app/templates/not_found.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 18 декабря 2009 г.
  • 228. <!doctype html> <html> <head><title>Welcome</title></head> <body> <%== content %> </body> </html> 18 декабря 2009 г.
  • 229. [exist] test_app/public [write] test_app/public/index.html [mkdir] test_app/templates [write] test_app/templates/exception.html.ep [write] test_app/templates/not_found.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 18 декабря 2009 г.
  • 230. Global symbol "$message2" requires explicit package name at (eval 280) line 2. 1: % layout 'default'; 2: <h2><%= $message2 %></h2> 3: ... { 'status' => 500, 'message' => ‘Saint Perl 2009’, ... } 18 декабря 2009 г.
  • 231. $ENV{MOJO_MODE} По умолчанию development 18 декабря 2009 г.
  • 232. [exist] test_app/public [write] test_app/public/index.html [mkdir] test_app/templates [write] test_app/templates/exception.html.ep [write] test_app/templates/not_found.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 18 декабря 2009 г.
  • 233. Mojolicious::Lite use base 'Mojolicious'; 18 декабря 2009 г.
  • 234. mojolicious generate lite_app test_lite 18 декабря 2009 г.
  • 235. [write] test_lite [chmod] test_lite 744 18 декабря 2009 г.
  • 236. use Mojolicious::Lite; get '/' => 'index'; any '/:groovy' => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; 18 декабря 2009 г.
  • 237. use Mojolicious::Lite; get '/' => 'index'; any '/:groovy' => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; 18 декабря 2009 г.
  • 238. use Mojolicious::Lite; get '/' => 'index'; any '/:groovy' => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; 18 декабря 2009 г.
  • 239. use Mojolicious::Lite; post '/' => 'index'; any '/:groovy' => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; 18 декабря 2009 г.
  • 240. use Mojolicious::Lite; any '/' => 'index'; any '/:groovy' => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; 18 декабря 2009 г.
  • 241. use Mojolicious::Lite; get '/' => 'index'; any '/:groovy' => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; 18 декабря 2009 г.
  • 242. use Mojolicious::Lite; get '/' => 'index'; any '/:groovy' => [groovy => qr/d+/] => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; 18 декабря 2009 г.
  • 243. use Mojolicious::Lite; get '/' => 'index'; any '/:groovy' => {groovy => 42} => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; 18 декабря 2009 г.
  • 244. use Mojolicious::Lite; get '/' => 'index'; any '/:groovy' => (agent=>qr/Firefox/) => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; 18 декабря 2009 г.
  • 245. use Mojolicious::Lite; get '/' => 'index'; any '/:groovy' => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; app->renderer->default_handler(‘epl’); shagadelic; 18 декабря 2009 г.
  • 246. use Mojolicious::Lite; ladder sub { ... }; # auth get '/' => 'index'; any '/:groovy' => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; 18 декабря 2009 г.
  • 247. use Mojolicious::Lite; get '/' => 'index'; any '/:groovy' => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; # shagadelic(‘cgi’) 18 декабря 2009 г.
  • 248. __DATA__ @@ index.html.ep % layout 'funky'; Yea baby! @@ layouts/funky.html.ep <!doctype html><html> <body> <%== content %> </body> </html> 18 декабря 2009 г.
  • 249. Mojo-модули на CPAN 18 декабря 2009 г.
  • 250. 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 18 декабря 2009 г.
  • 251. Mojo Guide Style Rules 18 декабря 2009 г.
  • 252. Mojo Guide Style • Keep it simple, no magick unless absolutely nessary • Code should be written with a Perl6 port in mind • It’s not a feature without a test • Only add prereqs if absolutely necessary • No inline POD • No spaghetti code • Every files should contain at least one quote from The Simpsons or Futurama 18 декабря 2009 г.
  • 253. Mojo Guide Style • Keep it simple, no magick unless absolutely nessary • Code should be written with a Perl6 port in mind • It’s not a feature without a test • Only add prereqs if absolutely necessary • No inline POD • No spaghetti code • Every files should contain at least one quote from The Simpsons or Futurama 18 декабря 2009 г.
  • 254. Mojo Guide Style • Keep it simple, no magick unless absolutely nessary • Code should be written with a Perl6 port in mind • It’s not a feature without a test • Only add prereqs if absolutely necessary • No inline POD • No spaghetti code • Every files should contain at least one quote from The Simpsons or Futurama 18 декабря 2009 г.
  • 255. Mojo Guide Style • Keep it simple, no magick unless absolutely nessary • Code should be written with a Perl6 port in mind • It’s not a feature without a test • Only add prereqs if absolutely necessary • No inline POD • No spaghetti code • Every files should contain at least one quote from The Simpsons or Futurama 18 декабря 2009 г.
  • 256. Mojo Guide Style • Keep it simple, no magick unless absolutely nessary • Code should be written with a Perl6 port in mind • It’s not a feature without a test • Only add prereqs if absolutely necessary • No inline POD • No spaghetti code • Every files should contain at least one quote from The Simpsons or Futurama 18 декабря 2009 г.
  • 257. Mojo Guide Style • Keep it simple, no magick unless absolutely nessary • Code should be written with a Perl6 port in mind • It’s not a feature without a test • Only add prereqs if absolutely necessary • No inline POD • No spaghetti code • Every files should contain at least one quote from The Simpsons or Futurama 18 декабря 2009 г.
  • 258. Mojo Guide Style • Keep it simple, no magick unless absolutely nessary • Code should be written with a Perl6 port in mind • It’s not a feature without a test • Only add prereqs if absolutely necessary • No inline POD • No spaghetti code • Every files should contain at least one quote from The Simpsons or Futurama :) 18 декабря 2009 г.
  • 259. The Simpsons or Futurama 18 декабря 2009 г.
  • 260. Стабильная версия, обратная совместимость? 18 декабря 2009 г.
  • 261. Mojo 0.999915 Последняя версия всегда доступна на github.com 18 декабря 2009 г.
  • 263. Обратная совместимость не гарантируется :) До первой стабильной версии 18 декабря 2009 г.
  • 264. Первый критичный баг 18 декабря 2009 г.
  • 265. 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’);; }; 18 декабря 2009 г.
  • 266. 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’);; }; 18 декабря 2009 г.
  • 267. test.pl #!/usr/bin/perl warn $_ while <STDIN>; 18 декабря 2009 г.
  • 268. script/test_bug daemon # OK 18 декабря 2009 г.
  • 269. script/test_bug daemon # OK script/test_bug daemon_prefork # DIE 18 декабря 2009 г.
  • 270. Mojo::Server::Daemon::Prefork #323: $SIG{HUP } = $SIG{INT } =  $SIG{CHLD} = $SIG{TERM} = sub { exit 0 }; 18 декабря 2009 г.
  • 271. Mojo::Server::Daemon::Prefork #323: $SIG{HUP } = $SIG{INT } =  $SIG{CHLD} = $SIG{TERM} = sub { exit 0 }; 18 декабря 2009 г.
  • 272. Mojo::Server::Daemon::Prefork #323: $SIG{HUP } = $SIG{INT } =  $SIG{TERM } = sub { exit 0 }; $SIG{CHLD} = ‘IGNORE’; 18 декабря 2009 г.
  • 273. Второй критичный баг 18 декабря 2009 г.
  • 274. Второй критичный мой баг 18 декабря 2009 г.
  • 275. MOJO_RELOAD, daemon и attr 18 декабря 2009 г.
  • 276. MOJO_RELOAD=1 script/test_bug2 daemon # OK 18 декабря 2009 г.
  • 277. MOJO_RELOAD=1 script/test_bug2 daemon # OK не всегда 18 декабря 2009 г.
  • 278. script/test_bug2 daemon_prefork # OK 18 декабря 2009 г.
  • 279. 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 { ... } 18 декабря 2009 г.
  • 280. 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 { ... } 18 декабря 2009 г.
  • 281. package App; use base ‘Mojo::Base’; __PACKAGE__->attr(conf => sub { return do ‘conf/app.conf’; }); __PACKAGE__->attr(db => sub { my $self = shift; return $::DB ||= Util->db(...->{'db'}); }); sub dispatch { ... } 18 декабря 2009 г.
  • 283. Документация Не очень :) 18 декабря 2009 г.
  • 284. «мне кажется документацию он никогда не напишет) он х**рит быстрее, чем можно писать документацию для него)» FriendFeed форева! 18 декабря 2009 г.
  • 285. Полезная информация • 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/ 18 декабря 2009 г.
  • 286. Полезная информация • 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/ 18 декабря 2009 г.
  • 289. «А жопа-то у неё ничего» 18 декабря 2009 г.
  • 290. Полезная информация • irc://irc.perl.org/#mojo • http://lists.kraih.com/cgi-bin/mailman/ listinfo/mojo • Twitter: @kraih, @vtivti, @sharifulin • Juick: @vti, @sharifulin 18 декабря 2009 г.
  • 291. Последние новости • PSGI and Plack is the future of HTTP::Engine that has support for servers like CGI, FastCGI, Apache, AnyEvent and Mojo. • New #mod_perlite release looks great, #Mojolicious with CGI backend should "just work™" on it. • Slowly starting with documentation work, crazy how much #Mojolicious has grown recently, looks like it needs a few extra chapters now. :) • Added native #PSGI support to #Mojolicious 18 декабря 2009 г.
  • 292. Опыт разработки на Mojo 18 декабря 2009 г.
  • 293. Mojolicious + MojoX::Renderer::TT 18 декабря 2009 г.
  • 294. Mojo + JSON 18 декабря 2009 г.
  • 295. Mojolicious::Lite + 18 декабря 2009 г. MojoX::Renderer::JSON
  • 296. Mojolicious::Lite + MojoX::Renderer::JSON + RSS 18 декабря 2009 г.
  • 297. Mojolicious + Mojo::Template 18 декабря 2009 г.
  • 298. Mojolicious + EpRenderer Около 7 проектов работает 18 декабря 2009 г.
  • 299. «Я никогда так быстро не делал сайты на Perl» Анатолий Шарифулин :) 18 декабря 2009 г.
  • 300. «Making hard things possible and everything fun!» Девиз Mojolicious 18 декабря 2009 г.