Upload
anatoly-sharifulin
View
2.027
Download
0
Embed Size (px)
DESCRIPTION
Saint Perl 2009
Citation preview
Mojo.Веб в коробке!
Saint Perl 2009
18 декабря 2009 г.
Sebastian Riedelавтор Catalyst и Mojohttp://labs.kraih.com/
18 декабря 2009 г.
Sebastian Riedelавтор Catalyst и Mojohttp://labs.kraih.com/
18 декабря 2009 г.
Sebastian Riedelавтор Catalyst и Mojohttp://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 г.
Minimal Base Class For Mojo Projects
Mojo::Base
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 г.
ByteStream
Mojo::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 г.
Perlish Templates!
Mojo::Template
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 г.
Minimalistic JSON
Mojo::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 г.
Class loader: load, reload, search
Mojo::Loader
18 декабря 2009 г.
Class loader: load, reload, search
Mojo::Loader
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 runtime18 декабря 2009 г.
Perl 5.00518 декабря 2009 г.
Perl 5.00600218 декабря 2009 г.
Perl 5.00800118 декабря 2009 г.
Mojo Perl 5.01018 декабря 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.1Connection: keep-aliveAccept: text/html, application/xhtml, ....Accept-Charset: windows-1251, utf-8; ...Accept-Encoding: gzip,deflateAccept-Language: ru,en-us;q=0.7,en;q=0.3Host: localhost:3000User-Agent: Mozilla/5.0 (Macintosh; ...Content-Length: 0Keep-Alive: 300
18 декабря 2009 г.
GET / HTTP/1.1Connection: keep-aliveAccept: text/html, application/xhtml, ....Accept-Charset: windows-1251, utf-8; ...Accept-Encoding: gzip,deflateAccept-Language: ru,en-us;q=0.7,en;q=0.3Host: localhost:3000User-Agent: Mozilla/5.0 (Macintosh; ...Content-Length: 0Keep-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::UserAgentPascal Gaudette
Спасибо Google of Summer Code 2009!
18 декабря 2009 г.
Поддержка CGI, FastCGI, PSGI,
Daemon, Prefork
18 декабря 2009 г.
script/test_mojo COMMAND [OPTIONS]
script/test_mojo cgiscript/test_mojo fastcgiscript/test_mojo daemonscript/test_mojo daemon_prefork --port 80
18 декабря 2009 г.
script/test_mojo COMMAND [OPTIONS]
script/test_mojo cgiscript/test_mojo fastcgiscript/test_mojo daemonscript/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 cgiscript/test_mojo fastcgiscript/test_mojo daemonscript/test_mojo daemon_prefork --port 80
18 декабря 2009 г.
Mojo::Server::FCGIscript/test_mojo fcgiscript/test_mojo fcgi_prefork
18 декабря 2009 г.
Mojo::Server::FCGIscript/test_mojo fcgiscript/test_mojo fcgi_prefork
18 декабря 2009 г.
Mojo::Server::FCGIscript/test_mojo fcgiscript/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 cgiscript/test_mojo fastcgiscript/test_mojo daemonscript/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 cgiscript/test_mojo fastcgiscript/test_mojo daemonscript/test_mojo daemon_prefork --port 80
18 декабря 2009 г.
script/test_mojo COMMAND [OPTIONS]
script/test_mojo cgiscript/test_mojo fastcgiscript/test_mojo daemonscript/test_mojo daemon_prefork --port 80script/test_mojo test
18 декабря 2009 г.
script/test_mojo COMMAND [OPTIONS]
script/test_mojo cgiscript/test_mojo fastcgiscript/test_mojo daemonscript/test_mojo daemon_prefork --port 80script/test_mojo testscript/test_mojo get
18 декабря 2009 г.
script/test_mojo COMMAND [OPTIONS]
script/test_mojo cgiscript/test_mojo fastcgiscript/test_mojo daemonscript/test_mojo daemon_prefork --port 80script/test_mojo testscript/test_mojo get http://goo.gl
18 декабря 2009 г.
MVC веб-фреймворки
18 декабря 2009 г.
Mojolicioususe 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 г.
Controller Base Class
Mojolicious::Controller
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 г.
Plugin Base Class
Mojolicious::Plugin
18 декабря 2009 г.
Plugins: load_plugin, add_hook, run_hook
Mojolicious::Plugins
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 cgiscript/test_app fastcgiscript/test_app daemonscript/test_app daemon_prefork --port 80script/test_app testscript/test_app get
18 декабря 2009 г.
script/test_app COMMAND [OPTIONS]
script/test_app cgiscript/test_app fastcgiscript/test_app daemonscript/test_app daemon_prefork --port 80script/test_app testscript/test_app getscritp/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::Liteuse 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 { ... }; # authget '/' => '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
• Mojo::Server::FCGI
• AnyEvent::Mojo
• Apache::Mojo, Apache2::Mojo
• Catalyst::Engine::Mojo,Squatting::On::Mojo
• MojoX::UserAgent
• MojoX::Routes::AsGraph
• MojoX::Session
• MojoX::Log::*
• MojoX::Renderer::*
• JSON
• TT
• CTTP2, HTP
18 декабря 2009 г.
Mojo Guide StyleRules
18 декабря 2009 г.
• 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 fromThe Simpsons or Futurama
Mojo Guide Style
18 декабря 2009 г.
• 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 fromThe Simpsons or Futurama
Mojo Guide Style
18 декабря 2009 г.
• 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 fromThe Simpsons or Futurama
Mojo Guide Style
18 декабря 2009 г.
• 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 fromThe Simpsons or Futurama
Mojo Guide Style
18 декабря 2009 г.
• 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 fromThe Simpsons or Futurama
Mojo Guide Style
18 декабря 2009 г.
• 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 fromThe Simpsons or Futurama
Mojo Guide Style
18 декабря 2009 г.
• 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 fromThe Simpsons or Futurama :)
Mojo Guide Style
18 декабря 2009 г.
The Simpsons or Futurama18 декабря 2009 г.
Стабильная версия,обратная
совместимость?
18 декабря 2009 г.
Mojo 0.999915Последняя версия всегда доступна на github.com
18 декабря 2009 г.
http://github.com/kraih/mojo18 декабря 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/perlwarn $_ while <STDIN>;
18 декабря 2009 г.
script/test_bug daemon # OK
18 декабря 2009 г.
script/test_bug daemon # OKscript/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 г.
Bootylicious18 декабря 2009 г.
Bootylicious18 декабря 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::TT18 декабря 2009 г.
Mojo + JSON18 декабря 2009 г.
Mojolicious::Lite + MojoX::Renderer::JSON
18 декабря 2009 г.
Mojolicious::Lite + MojoX::Renderer::JSON + RSS
18 декабря 2009 г.
Mojolicious + Mojo::Template18 декабря 2009 г.
Mojolicious + EpRendererОколо 7 проектов работает
18 декабря 2009 г.
«Я никогда так быстро не делал сайты на Perl»
Анатолий Шарифулин :)
18 декабря 2009 г.
«Making hard things possible and everything fun!»Девиз Mojolicious
18 декабря 2009 г.
«Можно ли на хостинге, где только FTP, Apache и CGI?»Постоянный вопрос, который задают мне
18 декабря 2009 г.
Ответ: «Да!»
18 декабря 2009 г.
Ответ: «Да!»Только я не проверял :)
18 декабря 2009 г.
«Можно ли на Windows использовать Mojo?»
И еще один
18 декабря 2009 г.
Ответ: «Да!»
18 декабря 2009 г.
Ответ: «Да!»Только не я пробовал :)
18 декабря 2009 г.
use Mojoor die
18 декабря 2009 г.
use Perlor die
18 декабря 2009 г.
JFDI
18 декабря 2009 г.
any ‘/questions/’ => sub { shift->render( say => ‘sharifulin’, );};shagadelic;
18 декабря 2009 г.
Спасибо за внимание!Было 311 слайдовАнатолий Шарифулин
RostovOnDon.pm
18 декабря 2009 г.