Your SlideShare is downloading. ×
0
Mojolicious.
                         The web in a box!
                               Perlburg 2010
                     ...
http://mojolicious.org/
пятница, 26 февраля 2010 г.
Sebastian Riedel
                                 автор Catalyst и Mojo
                                  http://labs.krai...
http://twitter.com/kraih
пятница, 26 февраля 2010 г.
Sebastian Riedel
                                 автор Catalyst и Mojo
                                  http://labs.krai...
Sebastian Riedel
                              creator of Catalyst and Mojolicious
                                     ht...
Catalyst + Mojo = ?
пятница, 26 февраля 2010 г.
What is
                              Mojolicious?


пятница, 26 февраля 2010 г.
What is Mojolicious?
                  • Pure Perl amazing web framework, without
                         any hidden magi...
«Fresh code,
                           based upon years of
                          experience developing
              ...
пятница, 26 февраля 2010 г.
Pure Perl
                              web framework


пятница, 26 февраля 2010 г.
• Mojo::Base
                   • Mojo::ByteStream
                   • Mojo::Template, Mojo::JSON
                   • Mo...
• Mojo::Base
                   • Mojo::ByteStream
                   • Mojo::Template, Mojo::JSON
                   • Mo...
Mojo::Base
                              Minimal Base Class For Mojo Projects




пятница, 26 февраля 2010 г.
package App;
               use base ‘Mojo::Base’;

               __PACKAGE__->attr(conf => sub {
               	

 retu...
package App;
               use base ‘Mojo::Base’;

               __PACKAGE__->attr(conf => sub {
               	

 retu...
package App;
               use base ‘Mojo::Base’;

               __PACKAGE__->attr(conf => sub {
               	

 retu...
• Mojo::Base
                   • Mojo::ByteStream
                   • Mojo::Template, Mojo::JSON
                   • Mo...
Mojo::ByteStream
                                   ByteStream




пятница, 26 февраля 2010 г.
use Mojo::ByteStream;
               my $s = Mojo::ByteStream->new('foo_bar');

               $s->camelize; $s->decameliz...
use Mojo::ByteStream;
               my $s = Mojo::ByteStream->new('foo_bar');

               $s->camelize; $s->decameliz...
use Mojo::ByteStream;
               my $s = Mojo::ByteStream->new('foo_bar');

               $s->camelize; $s->decameliz...
use Mojo::ByteStream;
               my $s = Mojo::ByteStream->new('foo_bar');

               $s->camelize; $s->decameliz...
use Mojo::ByteStream;
               my $s = Mojo::ByteStream->new('foo_bar');

               $s->camelize; $s->decameliz...
use Mojo::ByteStream;
               my $s = Mojo::ByteStream->new('foo_bar');

               $s->camelize; $s->decameliz...
use Mojo::ByteStream;
               my $s = Mojo::ByteStream->new('foo_bar');

               $s->camelize; $s->decameliz...
use Mojo::ByteStream;
               my $s = Mojo::ByteStream->new('foo_bar');

               $s->camelize; $s->decameliz...
use Mojo::ByteStream;
               my $s = Mojo::ByteStream->new('foo_bar');

               $s->camelize; $s->decameliz...
use Mojo::ByteStream;
               my $s = Mojo::ByteStream->new('foo_bar');

               $s->camelize; $s->decameliz...
• Mojo::Base
                   • Mojo::ByteStream
                   • Mojo::Template, Mojo::JSON
                   • Mo...
Mojo::Template
                                 Perlish Templates!




пятница, 26 февраля 2010 г.
% my $list = $self->stash(‘list’);

               <ul>
               % for (@$list) {
               	

 <li>
          ...
% my $list = $self->stash(‘list’);

               <ul>
               % for (@$list) {
               	

 <li>
          ...
% my $list = $self->stash(‘list’);

               <ul>
               % for (@$list) {
               	

 <li>
          ...
%= my $list = $self->stash(‘list’);

               <ul>
               % for (@$list) {
               	

 <li>
         ...
%== my $list = $self->stash(‘list’);

               <ul>
               % for (@$list) {
               	

 <li>
        ...
% my $list = $self->stash(‘list’);

               <ul>
               % for (@$list) {
               	

 <li>
          ...
% use Foo::Bar;

               <ul>
               % for (@$list) {
               	

 <li>
               	

 	

 <%= $_...
% my $list = $self->stash(‘list’);

               <ul>
               % for (@$list) {
               	

 <li>
          ...
% my $list = $self->stash(‘list’);

               <ul>
               % for (@$list) {
               	

 <li>
          ...
% my $list = $self->stash(‘list’);

               <ul>
               % for (@$list) {
               	

 <li>
          ...
% my $list = $self->stash(‘list’);

               <ul>
               % for (@$list) {
               	

 <li>
          ...
% my $list = $self->stash(‘list’);

               <ul>
               % for (@$list) {
               	

 <li>
          ...
% my $list = $self->stash(‘list’);

               <ul>
               % for (@$list) {
               	

 <li>
          ...
% my $list = $self->stash(‘list’);

               <ul>
               % for (@$list) {
               	

 <li>
          ...
% my $list = $self->stash(‘list’);

               <ul>
               % for (@$list) {
               	

 <li>
          ...
% my $list = $self->stash(‘list’);

               <ul>
               % for (@$list) {
               	

 <li>
          ...
% my $list = $self->stash(‘list’);

               <ul>
               % for (@$list) {
               	

 <li>
          ...
Easy as PHP,
                              but cool as Perl
                                  Mojo::Template




пятница, ...
• Mojo::Base
                   • Mojo::ByteStream
                   • Mojo::Template, Mojo::JSON
                   • Mo...
Mojo::JSON
                               Minimalistic JSON




пятница, 26 февраля 2010 г.
my $json = Mojo::JSON->new;

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

               my $hash = $json->...
my $json = Mojo::JSON->new;

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

               my $hash = $json->...
my $json = Mojo::JSON->new;

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

               my $hash = $json->...
• Mojo::Base
                   • Mojo::ByteStream
                   • Mojo::Template, Mojo::JSON
                   • Mo...
Mojo::Loader
                              Class loader: load, reload, search




пятница, 26 февраля 2010 г.
Mojo::Loader
                              Class loader: load, reload, search




пятница, 26 февраля 2010 г.
• Mojo::Base
                   • Mojo::ByteStream
                   • Mojo::Template, Mojo::JSON
                   • Mo...
• Mojo::Base
                   • Mojo::ByteStream
                   • Mojo::Template, Mojo::JSON
                   • Mo...
• Mojo::Base
                   • Mojo::ByteStream
                   • Mojo::Template, Mojo::JSON
                   • Mo...
• Mojo::Trasaction, Mojo::Stateful
                   • Mojo::IOLoop
                   • Mojo::Client, Mojo::Server
     ...
• Mojo::Trasaction, Mojo::Stateful
                   • Mojo::IOLoop
                   • Mojo::Client, Mojo::Server
     ...
• Mojo::Trasaction, Mojo::Stateful
                   • Mojo::IOLoop
                   • Mojo::Client, Mojo::Server
     ...
• Mojo::Trasaction, Mojo::Stateful
                   • Mojo::IOLoop
                   • Mojo::Client, Mojo::Server
     ...
my $client = Mojo::Client->new;

               $client->get(
               	

 ‘http://goo.gl’ => sub {
               	...
my $client = Mojo::Client->new;

               $self->client->get(
               	

 ‘http://goo.gl’ => sub {
          ...
my $client = Mojo::Client->new;

               $client->get(
               	

 ‘http://goo.gl’ => sub {
               	...
my $client = Mojo::Client->new;

               $client->post(
               	

 ‘http://goo.gl’ => sub {
               ...
my $client = Mojo::Client->new;

               $client->head(
               	

 ‘http://goo.gl’ => sub {
               ...
my $client = Mojo::Client->new;

               $client->put(
               	

 ‘http://goo.gl’ => sub {
               	...
my $client = Mojo::Client->new;

               $client->get(
               	

 ‘http://goo.gl’ => sub {
               	...
my $client = Mojo::Client->new;

               $client->get(
               	

 ‘http://goo.gl’ => sub {
               	...
my $client = Mojo::Client->new;

               $client->get(
               	

 ‘http://goo.gl’ => sub {
               	...
my $client = Mojo::Client->new;

               $client->get(
               	

 ‘http://goo.gl’ => sub {
               	...
my $client = Mojo::Client->new;

               $client->get(
               	

 ‘http://goo.gl’ => sub {
               	...
• Mojo::Trasaction, Mojo::Stateful
                   • Mojo::IOLoop
                   • Mojo::Client, Mojo::Server
     ...
• Mojo::Trasaction, Mojo::Stateful
                   • Mojo::IOLoop
                   • Mojo::Client, Mojo::Server
     ...
• Mojo::Trasaction, Mojo::Stateful
                   • Mojo::IOLoop
                   • Mojo::Client, Mojo::Server
     ...
• Mojo::Trasaction, Mojo::Stateful
                   • Mojo::IOLoop
                   • Mojo::Client, Mojo::Server
     ...
• Mojo::Trasaction, Mojo::Stateful
                   • Mojo::IOLoop
                   • Mojo::Client, Mojo::Server
     ...
Mojolicious
                              is the web in a box!


пятница, 26 февраля 2010 г.
No requirements
                                  besides Perl 5.8.1




пятница, 26 февраля 2010 г.
Mojo runtime
пятница, 26 февраля 2010 г.
Perl 5.005
пятница, 26 февраля 2010 г.
Perl 5.006002
пятница, 26 февраля 2010 г.
Perl 5.008001
пятница, 26 февраля 2010 г.
Mojo Perl 5.010
пятница, 26 февраля 2010 г.
Object oriented API



пятница, 26 февраля 2010 г.
package TestMojo;
               use base 'Mojo';

               sub handler {
                   my ($self, $tx) = @_;
 ...
package TestMojo;
               use base 'Mojo';

               sub handler {
                   my ($self, $tx) = @_;
 ...
package TestMojo;
               use base 'Mojo';

               sub handler {
                   my ($self, $tx) = @_;
 ...
package TestMojo;
               use base 'Mojo';

               sub handler {
                   my ($self, $tx) = @_;
 ...
use overload '""' => sub
                  { shift->to_string },
                     fallback => 1;

пятница, 26 февраля ...
GET / HTTP/1.1
            Connection: keep-alive
            Accept: text/html, application/xhtml, ....
            Accep...
GET / HTTP/1.1
            Connection: keep-alive
            Accept: text/html, application/xhtml, ....
            Accep...
package TestMojo;
               use base 'Mojo';

               sub handler {
                   my ($self, $tx) = @_;
 ...
package TestMojo;
               use base 'Mojo';

               sub handler {
                   my ($self, $tx) = @_;
 ...
A generation
                              of the mojo app


пятница, 26 февраля 2010 г.
mojo generate app
                                  TestMojo
                              [mkdir]   test_mojo/script
    ...
mojo generate app
                                  TestMojo
                              [mkdir]   test_mojo/script
    ...
use FindBin;

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

          ...
mojo generate app
                                  TestMojo
                              [mkdir]   test_mojo/script
    ...
package TestMojo;
               use base 'Mojo';

               sub handler {
                   my ($self, $tx) = @_;
 ...
mojo generate app
                                  TestMojo
                              [mkdir]   test_mojo/script
    ...
#!/usr/bin/env perl

               use strict;
               use warnings;

               use Test::More tests => 1;

 ...
Full stack HTTP 1.1



пятница, 26 февраля 2010 г.
пятница, 26 февраля 2010 г.
MojoX::UserAgent
                                            Pascal Gaudette
                              Thanks to the G...
Support WebSocket



пятница, 26 февраля 2010 г.
WebSocket protocol
                                 Google, Inc
                              December 16, 2009




пятниц...
use Mojolicious::Lite;

               websocket ‘/echo’ => sub {
               	

 my $self = shift;
               	

 ...
use Mojolicious::Lite;

               websocket ‘/echo’ => sub {
               	

 my $self = shift;
               	

 ...
CGI, FastCGI, PSGI,
                        Daemon and Prefork


пятница, 26 февраля 2010 г.
script/test_mojo
                    COMMAND [OPTIONS]
                              script/test_mojo cgi
                ...
script/test_mojo
                    COMMAND [OPTIONS]
                              script/test_mojo cgi
                ...
PATH_INFO='/' script/
                       test_mojo cgi
                                       Easy testing
           ...
script/test_mojo
                    COMMAND [OPTIONS]
                              script/test_mojo cgi
                ...
Mojo::Server::FCGI
                              script/test_mojo fcgi
                              script/test_mojo fcgi...
Mojo::Server::FCGI
                              script/test_mojo fcgi
                              script/test_mojo fcgi...
Mojo::Server::FCGI
                              script/test_mojo fcgi
                              script/test_mojo fcgi...
nginx + fcgi_prefork



пятница, 26 февраля 2010 г.
location / {
              fastcgi_pass 127.0.0.1:3000;
              fastcgi_param MOJO_APP App;
              fastcgi_pa...
location / {
              fastcgi_pass 127.0.0.1:3000;
              fastcgi_param MOJO_APP App;
              fastcgi_pa...
location / {
              fastcgi_pass 127.0.0.1:3000;
              fastcgi_param MOJO_APP App;
              fastcgi_pa...
location / {
              fastcgi_pass 127.0.0.1:3000;
              fastcgi_param MOJO_APP App;
              fastcgi_pa...
location / {
              fastcgi_pass 127.0.0.1:3000;
              fastcgi_param MOJO_APP App;
              fastcgi_pa...
script/test_mojo
                    COMMAND [OPTIONS]
                              script/test_mojo cgi
                ...
MOJO_RELOAD=1
              script/test_mojo daemon
                              Code of application reloads on each requ...
script/test_mojo
                                daemon --reload
                              Code of application reloads...
Support USR1 signal
                            for reload app


пятница, 26 февраля 2010 г.
script/test_mojo
                    COMMAND [OPTIONS]
                              script/test_mojo cgi
                ...
script/test_mojo
                    COMMAND [OPTIONS]
                              script/test_mojo cgi
                ...
script/test_mojo
                                generate psgi
                                  my_app.psgi




пятница, ...
use FindBin;

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

               u...
script/test_mojo
                    COMMAND [OPTIONS]
                              script/test_mojo cgi
                ...
script/test_mojo
                    COMMAND [OPTIONS]
                              script/test_mojo cgi
                ...
script/test_mojo
                    COMMAND [OPTIONS]
                              script/test_mojo cgi
                ...
Web frameworks



пятница, 26 февраля 2010 г.
Mojo
                              Base framework




пятница, 26 февраля 2010 г.
package TestMojo;
               use base 'Mojo';

               sub handler {
                   my ($self, $tx) = @_;
 ...
MVC web frameworks



пятница, 26 февраля 2010 г.
Mojolicious
                                use base 'Mojo';




пятница, 26 февраля 2010 г.
• Mojolicous::Controller
                   • Mojolicious::Plugin
                   • Mojolicious::Commands
             ...
• Mojolicous::Controller
                   • Mojolicious::Plugin
                   • Mojolicious::Commands
             ...
Mojolicious::Controller
                              Controller Base Class




пятница, 26 февраля 2010 г.
• render
                   • render_text
                   • render_json
                   • render_inner
             ...
• render
                   • render_text
                   • render_json
                   • render_inner
             ...
• render(tempate => ‘foo/bar’)
                   • render_text
                   • render_json
                   • rend...
• render(controller => ‘foo’, action => ‘bar’)
                   • render_text
                   • render_json
         ...
• render(‘foo#bar’, format => ‘html')
                   • render_text
                   • render_json
                  ...
• render
                   • render_text
                   • render_json
                   • render_inner
             ...
• render
                   • render(text => ‘Perlburg 2010’)
                   • render_json
                   • render...
• render
                   • render_text
                   • render_json
                   • render_inner
             ...
• render
                   • render_text
                   • render(json => {foo => ‘bar’})
                   • render_...
• render
                   • render_text
                   • render_json
                   • render_inner
             ...
• render
                   • render_text
                   • render_json
                   • render_inner
             ...
• render
                   • render_text
                   • render_json
                   • render_inner
             ...
• render
                   • render_text
                   • render_json
                   • render_inner
             ...
• Mojolicous::Controller
                   • Mojolicious::Plugin
                   • Mojolicious::Commands
             ...
Mojolicious::Plugin
                                   Plugin Base Class




пятница, 26 февраля 2010 г.
Mojolicious::Plugins
                              Plugins: load_plugin, add_hook, run_hook




пятница, 26 февраля 2010 г.
• AgentCondition
                   • Charset
                   • DefaultHelpers
                   • EplRenderer
       ...
• AgentCondition
                   • Charset
                   • DefaultHelpers
                   • EplRenderer
       ...
• AgentCondition
                   • Charset
                   • DefaultHelpers
                   • EplRenderer
       ...
• AgentCondition
                   • Charset
                   • DefaultHelpers
                   • EplRenderer
       ...
• dumper
                   • param
                   • stash
                   • layout
                   • include
  ...
• dumper
                   • param
                   • stash
                   • layout
                   • include
  ...
• Data::Dumper (Maxdepth: 2, Indent: 1, Terse: 1)
                   • param
                   • stash
                  ...
• dumper
                   • param
                   • stash
                   • layout
                   • include
  ...
• dumper
                   • $self->req->param(...)
                   • stash
                   • layout
              ...
• dumper
                   • param
                   • stash
                   • layout
                   • include
  ...
• dumper
                   • param
                   • $self->stash(...)
                   • layout
                   ...
• dumper
                   • param
                   • stash
                   • layout
                   • include
  ...
• dumper
                   • param
                   • stash
                   • $self->stash(layout => ...)
          ...
• dumper
                   • param
                   • stash
                   • layout
                   • include
  ...
• dumper
                   • param
                   • stash
                   • layout
                   • $self->ren...
• dumper
                   • param
                   • stash
                   • layout
                   • include
  ...
• dumper
                   • param
                   • stash
                   • layout
                   • include
  ...
• dumper
                   • param
                   • stash
                   • layout
                   • include
  ...
• dumper
                   • param
                   • stash
                   • layout
                   • include
  ...
• dumper
                   • param
                   • stash
                   • layout
                   • include
  ...
• dumper
                   • param
                   • stash
                   • layout
                   • include
  ...
• AgentCondition
                   • Charset
                   • DefaultHelpers
                   • EplRenderer
       ...
• extension of temlplates is .epl
                   • my $self = shift;
                   • $self->stash(foo => ‘bar’)

...
• AgentCondition
                   • Charset
                   • DefaultHelpers
                   • EplRenderer
       ...
• extension of temlplates is .ep
                   • caсhing templates with stash parameters
                   • $self->...
• AgentCondition
                   • Charset
                   • DefaultHelpers
                   • EplRenderer
       ...
• AgentCondition
                   • Charset
                   • DefaultHelpers
                   • EplRenderer
       ...
• AgentCondition
                   • Charset
                   • DefaultHelpers
                   • EplRenderer
       ...
• AgentCondition
                   • Charset
                   • DefaultHelpers
                   • EplRenderer
       ...
• AgentCondition
                   • Charset
                   • DefaultHelpers
                   • EplRenderer
       ...
• AgentCondition
                   • Charset
                   • DefaultHelpers
                   • EplRenderer
       ...
• Mojolicous::Controller
                   • Mojolicious::Plugin
                   • Mojolicious::Commands
             ...
script/test_app
                    COMMAND [OPTIONS]
                              script/test_app cgi
                  ...
script/test_app
                    COMMAND [OPTIONS]
                              script/test_app cgi
                  ...
• Mojolicous::Controller
                   • Mojolicious::Plugin
                   • Mojolicious::Commands
             ...
• Mojolicous::Controller
                   • Mojolicious::Plugin
                   • Mojolicious::Commands
             ...
A generation
                              the mojolicious app


пятница, 26 февраля 2010 г.
mojolicious generate
                           app TestApp


пятница, 26 февраля 2010 г.
[mkdir] test_app/script
                              [write] test_app/script/test_app
                              [chmo...
[mkdir] test_app/script
                              [write] test_app/script/test_app
                              [chmo...
[mkdir] test_app/script
                              [write] test_app/script/test_app
                              [chmo...
[mkdir] test_app/script
                              [write] test_app/script/test_app
                              [chmo...
package TestApp;

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

...
package TestApp;

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

...
package TestApp;

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

...
package TestApp;

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

...
package TestApp;

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

...
package TestApp;

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

...
package TestApp;

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

...
package TestApp::Example;

            use base 'Mojolicious::Controller';
            sub welcome {
                my $s...
[exist]       test_app/public
                [write]       test_app/public/index.html
                [mkdir]       test_...
[exist]       test_app/public
                [write]       test_app/public/index.html
                [mkdir]       test_...
example/
                              welcome.html.ep
                                 Path to the template




пятница, ...
example/
                              welcome.html.ep
                                 Path to the template




пятница, ...
controller/
                              welcome.html.ep
                                 Path to the template




пятниц...
example/
                              welcome.html.ep
                                 Path to the template




пятница, ...
example/
                              welcome.html.ep
                                 Path to the template




пятница, ...
example/
                              action.html.ep
                                Path to the template




пятница, 26...
example/
                              welcome.html.ep
                                 Path to the template




пятница, ...
example/
                              welcome.html.ep
                                 Path to the template




пятница, ...
example/
                     welcome.html.handler
                              Path to the template




пятница, 26 февр...
example/
                              welcome.html.ep
                                 Path to the template




пятница, ...
example/
                              welcome.html.epl
                                 Path to the template




пятница,...
example/
                              welcome.html.tt
                                 Path to the template




пятница, ...
example/
                              welcome.html.ht
                                 Path to the template




пятница, ...
example/
                              welcome.html.pro
                                  Path to the template




пятница...
example/
                          welcome.html.ctpp2
                               Path to the template




пятница, 26 ...
example/
                              welcome.html.foo
                                  Path to the template




пятница...
example/
                              welcome.html.ep
                                 Path to the template




пятница, ...
example/
                              welcome.html.ep
                                 Path to the template




пятница, ...
example/
                              welcome.format.ep
                                  Path to the template




пятниц...
example/
                              welcome.html.ep
                                 Path to the template




пятница, ...
example/
                              welcome.xml.ep
                                 Path to the template




пятница, 2...
example/
                              welcome.rss.ep
                                Path to the template




пятница, 26...
example/
                              welcome.json.ep
                                 Path to the template




пятница, ...
example/
                              welcome.yaml.ep
                                 Path to the template




пятница, ...
example/
                              welcome.mail.ep
                                 Path to the template




пятница, ...
example/
                              welcome.bar.ep
                                 Path to the template




пятница, 2...
example/
                              welcome.html.ep
                                 Path to the template




пятница, ...
example/
                              welcome.html.ep
                                 Path to the template




пятница, ...
controller/
                       action.format.handler
                              Path to the template




пятница, 2...
% layout 'default';

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

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




пятниц...
[exist]       test_app/public
                [write]       test_app/public/index.html
                [mkdir]       test_...
<!doctype html>
            <html>
               <head><title>Welcome</title></head>
               <body>
              ...
[exist]       test_app/public
                [write]       test_app/public/index.html
                [mkdir]       test_...
Global symbol "$message2" requires explicit package
                name at (eval 280) line 2.

                1: % layou...
$ENV{MOJO_MODE}
                              Default value is development




пятница, 26 февраля 2010 г.
[exist]       test_app/public
                [write]       test_app/public/index.html
                [mkdir]       test_...
Mojolicious::Lite
                                 use base 'Mojolicious';




пятница, 26 февраля 2010 г.
mojolicious generate
                         lite_app test_lite


пятница, 26 февраля 2010 г.
[write] test_lite
                              [chmod] test_lite 744




пятница, 26 февраля 2010 г.
use Mojolicious::Lite;

               get '/' => 'index';

               any '/:groovy' => sub {
                  my $s...
use Mojolicious::Lite;

               get '/' => 'index';

               any '/:groovy' => sub {
                  my $s...
use Mojolicious::Lite;

               get '/' => 'index'; # /

               any '/:groovy' => sub {
                  m...
use Mojolicious::Lite;

               post '/' => 'index';

               any '/:groovy' => sub {
                  my $...
use Mojolicious::Lite;

               any '/' => 'index';

               any '/:groovy' => sub {
                  my $s...
use Mojolicious::Lite;

               get '/' => 'index';

               any '/:groovy' => sub { # /*
                  ...
use Mojolicious::Lite;

               get '/' => 'index';

               any '/:groovy' => [groovy => qr/d+/] => sub {
 ...
use Mojolicious::Lite;

               get '/' => 'index';

               any '/:groovy' => {groovy => 42} => sub {
     ...
use Mojolicious::Lite;

               get '/' => 'index';

               any '/:groovy' => (agent=>qr/Firefox/) => sub {...
use Mojolicious::Lite;

               get '/' => 'index';

               any '/:groovy' => sub {
                  my $s...
use Mojolicious::Lite;
               websocket '/echo' => sub { ... }; # websocket
               get '/' => 'index';

  ...
use Mojolicious::Lite;
               ladder sub { ... }; # auth
               get '/' => 'index';

               any '/...
use Mojolicious::Lite;

               get '/' => 'index';

               any '/:groovy' => sub {
                  my $s...
__DATA__

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

               @@ lay...
Mojolicious modules
                             on CPAN


пятница, 26 февраля 2010 г.
Mojolicious modules
                             on CPAN
                   •      Mojolicious               •   MojoX::Ro...
Mojolicious Style Guide
                              Rules




пятница, 26 февраля 2010 г.
Mojolicious Style Guide
        • Keep it simple, no magic unless absolutely nessary
        • Code should be written with...
Mojolicious Style Guide
        • Keep it simple, no magic unless absolutely nessary
        • Code should be written with...
Mojolicious Style Guide
        • Keep it simple, no magic unless absolutely nessary
        • Code should be written with...
Mojolicious Style Guide
        • Keep it simple, no magic unless absolutely nessary
        • Code should be written with...
Mojolicious Style Guide
        • Keep it simple, no magic unless absolutely nessary
        • Code should be written with...
Mojolicious Style Guide
        • Keep it simple, no magic unless absolutely nessary
        • Code should be written with...
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Mojolicious. The web in a box!
Upcoming SlideShare
Loading in...5
×

Mojolicious. The web in a box!

3,620

Published on

Perlburg 2010

Published in: Technology, Design
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,620
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
75
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "Mojolicious. The web in a box!"

  1. 1. Mojolicious. The web in a box! Perlburg 2010 English version пятница, 26 февраля 2010 г.
  2. 2. http://mojolicious.org/ пятница, 26 февраля 2010 г.
  3. 3. Sebastian Riedel автор Catalyst и Mojo http://labs.kraih.com/ пятница, 26 февраля 2010 г.
  4. 4. http://twitter.com/kraih пятница, 26 февраля 2010 г.
  5. 5. Sebastian Riedel автор Catalyst и Mojo http://labs.kraih.com пятница, 26 февраля 2010 г.
  6. 6. Sebastian Riedel creator of Catalyst and Mojolicious http://labs.kraih.com пятница, 26 февраля 2010 г.
  7. 7. Catalyst + Mojo = ? пятница, 26 февраля 2010 г.
  8. 8. What is Mojolicious? пятница, 26 февраля 2010 г.
  9. 9. What is Mojolicious? • Pure Perl amazing web framework, without any hidden magiс • No requirements besides Perl 5.8.1 • Very clean and object oriented API • Full stack HTTP 1.1, WebSocket, IPv6, SSL • CGI, FastCGI, PSGI, Daemon and Prefork • There are 3 frameworks: Mojo, Mojolicious and Mojolicious::Lite пятница, 26 февраля 2010 г.
  10. 10. «Fresh code, based upon years of experience developing Catalyst» пятница, 26 февраля 2010 г.
  11. 11. пятница, 26 февраля 2010 г.
  12. 12. Pure Perl web framework пятница, 26 февраля 2010 г.
  13. 13. • 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 пятница, 26 февраля 2010 г.
  14. 14. • 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 пятница, 26 февраля 2010 г.
  15. 15. Mojo::Base Minimal Base Class For Mojo Projects пятница, 26 февраля 2010 г.
  16. 16. 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 { ... } пятница, 26 февраля 2010 г.
  17. 17. 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 { ... } пятница, 26 февраля 2010 г.
  18. 18. package App; use base ‘Mojo::Base’; __PACKAGE__->attr(conf => sub { return do ‘conf/app.conf’; }); __PACKAGE__->attr(db => sub { my $self = shift; return Util->db($self->conf->{'db'}); }); sub dispatch { ... } пятница, 26 февраля 2010 г.
  19. 19. • 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 пятница, 26 февраля 2010 г.
  20. 20. Mojo::ByteStream ByteStream пятница, 26 февраля 2010 г.
  21. 21. 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; $s->punycode_encode; $s->punycode_decode пятница, 26 февраля 2010 г.
  22. 22. 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; $s->punycode_encode; $s->punycode_decode пятница, 26 февраля 2010 г.
  23. 23. use Mojo::ByteStream; my $s = Mojo::ByteStream->new('foo_bar'); $s->camelize; $s->decamelize; $s->b64_encode; $s->b64_decode; $s->encode('utf8'); $s->decode('utf8'); $s->html_escape; $s->html_unescape; $s->qp_encode; $s->qp_decode; $s->quote; $stream->unquote; $s->url_escape; $s->url_unescape; $s->xml_escape; $s->punycode_encode; $s->punycode_decode пятница, 26 февраля 2010 г.
  24. 24. use Mojo::ByteStream; my $s = Mojo::ByteStream->new('foo_bar'); $s->camelize; $s->decamelize; $s->b64_encode; $s->b64_decode; $s->encode('utf8'); $s->decode('utf8'); $s->html_escape; $s->html_unescape; $s->qp_encode; $s->qp_decode; $s->quote; $stream->unquote; $s->url_escape; $s->url_unescape; $s->xml_escape; $s->punycode_encode; $s->punycode_decode пятница, 26 февраля 2010 г.
  25. 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; $s->punycode_encode; $s->punycode_decode пятница, 26 февраля 2010 г.
  26. 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; $s->punycode_encode; $s->punycode_decode пятница, 26 февраля 2010 г.
  27. 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; $s->punycode_encode; $s->punycode_decode пятница, 26 февраля 2010 г.
  28. 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; $s->punycode_encode; $s->punycode_decode пятница, 26 февраля 2010 г.
  29. 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; $s->punycode_encode; $s->punycode_decode пятница, 26 февраля 2010 г.
  30. 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; $s->punycode_encode; $s->punycode_decode пятница, 26 февраля 2010 г.
  31. 31. • 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 пятница, 26 февраля 2010 г.
  32. 32. Mojo::Template Perlish Templates! пятница, 26 февраля 2010 г.
  33. 33. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> пятница, 26 февраля 2010 г.
  34. 34. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> пятница, 26 февраля 2010 г.
  35. 35. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> пятница, 26 февраля 2010 г.
  36. 36. %= my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> пятница, 26 февраля 2010 г.
  37. 37. %== my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> пятница, 26 февраля 2010 г.
  38. 38. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> пятница, 26 февраля 2010 г.
  39. 39. % use Foo::Bar; <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> пятница, 26 февраля 2010 г.
  40. 40. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> пятница, 26 февраля 2010 г.
  41. 41. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> пятница, 26 февраля 2010 г.
  42. 42. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> пятница, 26 февраля 2010 г.
  43. 43. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> пятница, 26 февраля 2010 г.
  44. 44. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%== $_->{title} %> </li> %} </ul> <p><%# comment %></p> пятница, 26 февраля 2010 г.
  45. 45. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <% my $foo = $_->{id} + 100_500; %> </li> %} </ul> <p><%# comment %></p> пятница, 26 февраля 2010 г.
  46. 46. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <% my $foo = $_->{id} + 100_500; %> </li> %} </ul> <p><%# comment %></p> пятница, 26 февраля 2010 г.
  47. 47. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> пятница, 26 февраля 2010 г.
  48. 48. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> пятница, 26 февраля 2010 г.
  49. 49. % my $list = $self->stash(‘list’); <ul> % for (@$list) { <li> <%= $_->{title} %> </li> %} </ul> <p><%# comment %></p> пятница, 26 февраля 2010 г.
  50. 50. Easy as PHP, but cool as Perl Mojo::Template пятница, 26 февраля 2010 г.
  51. 51. • 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 пятница, 26 февраля 2010 г.
  52. 52. Mojo::JSON Minimalistic JSON пятница, 26 февраля 2010 г.
  53. 53. my $json = Mojo::JSON->new; my $string = $json->encode({foo => ‘bar’}); my $hash = $json->decode(‘{"foo":"bar"}’); пятница, 26 февраля 2010 г.
  54. 54. my $json = Mojo::JSON->new; my $string = $json->encode({foo => ‘bar’}); my $hash = $json->decode(‘{"foo":"bar"}’); пятница, 26 февраля 2010 г.
  55. 55. my $json = Mojo::JSON->new; my $string = $json->encode({foo => ‘bar’}); my $hash = $json->decode(‘{"foo":"bar"}’); пятница, 26 февраля 2010 г.
  56. 56. • 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 пятница, 26 февраля 2010 г.
  57. 57. Mojo::Loader Class loader: load, reload, search пятница, 26 февраля 2010 г.
  58. 58. Mojo::Loader Class loader: load, reload, search пятница, 26 февраля 2010 г.
  59. 59. • 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 пятница, 26 февраля 2010 г.
  60. 60. • 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 пятница, 26 февраля 2010 г.
  61. 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 пятница, 26 февраля 2010 г.
  62. 62. • Mojo::Trasaction, Mojo::Stateful • Mojo::IOLoop • Mojo::Client, Mojo::Server • Mojo::Server::CGI, Mojo::Server::FastCGI • Mojo::Server::PSGI • Mojo::Server::Daemon and ::Prefork • Mojo::Command • Mojo::Command::Generate and ~ Server пятница, 26 февраля 2010 г.
  63. 63. • Mojo::Trasaction, Mojo::Stateful • Mojo::IOLoop • Mojo::Client, Mojo::Server • Mojo::Server::CGI, Mojo::Server::FastCGI • Mojo::Server::PSGI • Mojo::Server::Daemon and ::Prefork • Mojo::Command • Mojo::Command::Generate and ~ Server пятница, 26 февраля 2010 г.
  64. 64. • Mojo::Trasaction, Mojo::Stateful • Mojo::IOLoop • Mojo::Client, Mojo::Server • Mojo::Server::CGI, Mojo::Server::FastCGI • Mojo::Server::PSGI • Mojo::Server::Daemon and ::Prefork • Mojo::Command • Mojo::Command::Generate and ~ Server пятница, 26 февраля 2010 г.
  65. 65. • Mojo::Trasaction, Mojo::Stateful • Mojo::IOLoop • Mojo::Client, Mojo::Server • Mojo::Server::CGI, Mojo::Server::FastCGI • Mojo::Server::PSGI • Mojo::Server::Daemon and ::Prefork • Mojo::Command • Mojo::Command::Generate and ~ Server пятница, 26 февраля 2010 г.
  66. 66. my $client = Mojo::Client->new; $client->get( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; пятница, 26 февраля 2010 г.
  67. 67. my $client = Mojo::Client->new; $self->client->get( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; пятница, 26 февраля 2010 г.
  68. 68. my $client = Mojo::Client->new; $client->get( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; пятница, 26 февраля 2010 г.
  69. 69. my $client = Mojo::Client->new; $client->post( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; пятница, 26 февраля 2010 г.
  70. 70. my $client = Mojo::Client->new; $client->head( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; пятница, 26 февраля 2010 г.
  71. 71. my $client = Mojo::Client->new; $client->put( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; пятница, 26 февраля 2010 г.
  72. 72. my $client = Mojo::Client->new; $client->get( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; пятница, 26 февраля 2010 г.
  73. 73. my $client = Mojo::Client->new; $client->get( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; пятница, 26 февраля 2010 г.
  74. 74. my $client = Mojo::Client->new; $client->get( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; пятница, 26 февраля 2010 г.
  75. 75. my $client = Mojo::Client->new; $client->get( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; пятница, 26 февраля 2010 г.
  76. 76. my $client = Mojo::Client->new; $client->get( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; } )->process; пятница, 26 февраля 2010 г.
  77. 77. • Mojo::Trasaction, Mojo::Stateful • Mojo::IOLoop • Mojo::Client, Mojo::Server • Mojo::Server::CGI, Mojo::Server::FastCGI • Mojo::Server::PSGI • Mojo::Server::Daemon and ::Prefork • Mojo::Command • Mojo::Command::Generate and ~ Server пятница, 26 февраля 2010 г.
  78. 78. • Mojo::Trasaction, Mojo::Stateful • Mojo::IOLoop • Mojo::Client, Mojo::Server • Mojo::Server::CGI, Mojo::Server::FastCGI • Mojo::Server::PSGI • Mojo::Server::Daemon and ::Prefork • Mojo::Command • Mojo::Command::Generate and ~ Server пятница, 26 февраля 2010 г.
  79. 79. • Mojo::Trasaction, Mojo::Stateful • Mojo::IOLoop • Mojo::Client, Mojo::Server • Mojo::Server::CGI, Mojo::Server::FastCGI • Mojo::Server::PSGI • Mojo::Server::Daemon and ::Prefork • Mojo::Command • Mojo::Command::Generate and ~ Server пятница, 26 февраля 2010 г.
  80. 80. • Mojo::Trasaction, Mojo::Stateful • Mojo::IOLoop • Mojo::Client, Mojo::Server • Mojo::Server::CGI, Mojo::Server::FastCGI • Mojo::Server::PSGI • Mojo::Server::Daemon and ::Prefork • Mojo::Command • Mojo::Command::Generate and ~ Server пятница, 26 февраля 2010 г.
  81. 81. • Mojo::Trasaction, Mojo::Stateful • Mojo::IOLoop • Mojo::Client, Mojo::Server • Mojo::Server::CGI, Mojo::Server::FastCGI • Mojo::Server::PSGI • Mojo::Server::Daemon and ::Prefork • Mojo::Command • Mojo::Command::Generate and ~ Server пятница, 26 февраля 2010 г.
  82. 82. Mojolicious is the web in a box! пятница, 26 февраля 2010 г.
  83. 83. No requirements besides Perl 5.8.1 пятница, 26 февраля 2010 г.
  84. 84. Mojo runtime пятница, 26 февраля 2010 г.
  85. 85. Perl 5.005 пятница, 26 февраля 2010 г.
  86. 86. Perl 5.006002 пятница, 26 февраля 2010 г.
  87. 87. Perl 5.008001 пятница, 26 февраля 2010 г.
  88. 88. Mojo Perl 5.010 пятница, 26 февраля 2010 г.
  89. 89. Object oriented API пятница, 26 февраля 2010 г.
  90. 90. 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!'); } пятница, 26 февраля 2010 г.
  91. 91. 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!'); } пятница, 26 февраля 2010 г.
  92. 92. 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!'); } пятница, 26 февраля 2010 г.
  93. 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!'); } пятница, 26 февраля 2010 г.
  94. 94. use overload '""' => sub { shift->to_string }, fallback => 1; пятница, 26 февраля 2010 г.
  95. 95. 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 пятница, 26 февраля 2010 г.
  96. 96. 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 пятница, 26 февраля 2010 г.
  97. 97. 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!'); } пятница, 26 февраля 2010 г.
  98. 98. 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!'); } пятница, 26 февраля 2010 г.
  99. 99. A generation of the mojo app пятница, 26 февраля 2010 г.
  100. 100. 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 пятница, 26 февраля 2010 г.
  101. 101. 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 пятница, 26 февраля 2010 г.
  102. 102. 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’) пятница, 26 февраля 2010 г.
  103. 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 пятница, 26 февраля 2010 г.
  104. 104. 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!'); } пятница, 26 февраля 2010 г.
  105. 105. 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 пятница, 26 февраля 2010 г.
  106. 106. #!/usr/bin/env perl use strict; use warnings; use Test::More tests => 1; use_ok('TestMojo'); пятница, 26 февраля 2010 г.
  107. 107. Full stack HTTP 1.1 пятница, 26 февраля 2010 г.
  108. 108. пятница, 26 февраля 2010 г.
  109. 109. MojoX::UserAgent Pascal Gaudette Thanks to the Google of Summer Code 2009! пятница, 26 февраля 2010 г.
  110. 110. Support WebSocket пятница, 26 февраля 2010 г.
  111. 111. WebSocket protocol Google, Inc December 16, 2009 пятница, 26 февраля 2010 г.
  112. 112. use Mojolicious::Lite; websocket ‘/echo’ => sub { my $self = shift; $self->receive_message(sub { my ($self, $msg) = @_; $self->send_massage("echo: $msg"); }); }; shagadelic; пятница, 26 февраля 2010 г.
  113. 113. use Mojolicious::Lite; websocket ‘/echo’ => sub { my $self = shift; $self->receive_message(sub { my ($self, $msg) = @_; $self->send_massage("echo: $msg"); }); }; shagadelic; пятница, 26 февраля 2010 г.
  114. 114. CGI, FastCGI, PSGI, Daemon and Prefork пятница, 26 февраля 2010 г.
  115. 115. script/test_mojo COMMAND [OPTIONS] script/test_mojo cgi script/test_mojo fastcgi script/test_mojo daemon script/test_mojo daemon_prefork пятница, 26 февраля 2010 г.
  116. 116. script/test_mojo COMMAND [OPTIONS] script/test_mojo cgi script/test_mojo fastcgi script/test_mojo daemon script/test_mojo daemon_prefork пятница, 26 февраля 2010 г.
  117. 117. PATH_INFO='/' script/ test_mojo cgi Easy testing Can profile the mojolicious app using Devel::NYTProf пятница, 26 февраля 2010 г.
  118. 118. script/test_mojo COMMAND [OPTIONS] script/test_mojo cgi script/test_mojo fastcgi script/test_mojo daemon script/test_mojo daemon_prefork пятница, 26 февраля 2010 г.
  119. 119. Mojo::Server::FCGI script/test_mojo fcgi script/test_mojo fcgi_prefork пятница, 26 февраля 2010 г.
  120. 120. Mojo::Server::FCGI script/test_mojo fcgi script/test_mojo fcgi_prefork пятница, 26 февраля 2010 г.
  121. 121. Mojo::Server::FCGI script/test_mojo fcgi script/test_mojo fcgi_prefork пятница, 26 февраля 2010 г.
  122. 122. nginx + fcgi_prefork пятница, 26 февраля 2010 г.
  123. 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; } пятница, 26 февраля 2010 г.
  124. 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; } пятница, 26 февраля 2010 г.
  125. 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; } пятница, 26 февраля 2010 г.
  126. 126. 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; } пятница, 26 февраля 2010 г.
  127. 127. 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; } пятница, 26 февраля 2010 г.
  128. 128. script/test_mojo COMMAND [OPTIONS] script/test_mojo cgi script/test_mojo fastcgi script/test_mojo daemon script/test_mojo daemon_prefork пятница, 26 февраля 2010 г.
  129. 129. MOJO_RELOAD=1 script/test_mojo daemon Code of application reloads on each request пятница, 26 февраля 2010 г.
  130. 130. script/test_mojo daemon --reload Code of application reloads on each request пятница, 26 февраля 2010 г.
  131. 131. Support USR1 signal for reload app пятница, 26 февраля 2010 г.
  132. 132. script/test_mojo COMMAND [OPTIONS] script/test_mojo cgi script/test_mojo fastcgi script/test_mojo daemon script/test_mojo daemon_prefork пятница, 26 февраля 2010 г.
  133. 133. script/test_mojo COMMAND [OPTIONS] script/test_mojo cgi script/test_mojo fastcgi script/test_mojo daemon script/test_mojo daemon_prefork script/test_mojo psgi пятница, 26 февраля 2010 г.
  134. 134. script/test_mojo generate psgi my_app.psgi пятница, 26 февраля 2010 г.
  135. 135. use FindBin; use lib "$FindBin::Bin/lib"; use lib "$FindBin::Bin/../lib"; use Mojo::Server::PSGI; my $psgi = Mojo::Server::PSGI->new( app_class => 'MyApp' ); my $app = sub { $psgi->run(@_) }; пятница, 26 февраля 2010 г.
  136. 136. script/test_mojo COMMAND [OPTIONS] script/test_mojo cgi script/test_mojo fastcgi script/test_mojo daemon script/test_mojo daemon_prefork script/test_mojo psgi script/test_mojo test пятница, 26 февраля 2010 г.
  137. 137. script/test_mojo COMMAND [OPTIONS] script/test_mojo cgi script/test_mojo fastcgi script/test_mojo daemon script/test_mojo daemon_prefork script/test_mojo psgi script/test_mojo test script/test_mojo get пятница, 26 февраля 2010 г.
  138. 138. script/test_mojo COMMAND [OPTIONS] script/test_mojo cgi script/test_mojo fastcgi script/test_mojo daemon script/test_mojo daemon_prefork script/test_mojo psgi script/test_mojo test script/test_mojo get http://goo.gl пятница, 26 февраля 2010 г.
  139. 139. Web frameworks пятница, 26 февраля 2010 г.
  140. 140. Mojo Base framework пятница, 26 февраля 2010 г.
  141. 141. 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!'); } пятница, 26 февраля 2010 г.
  142. 142. MVC web frameworks пятница, 26 февраля 2010 г.
  143. 143. Mojolicious use base 'Mojo'; пятница, 26 февраля 2010 г.
  144. 144. • Mojolicous::Controller • Mojolicious::Plugin • Mojolicious::Commands • MojoX::Types • MojoX::Dispatcher, MojoX::Routes пятница, 26 февраля 2010 г.
  145. 145. • Mojolicous::Controller • Mojolicious::Plugin • Mojolicious::Commands • MojoX::Types • MojoX::Dispatcher, MojoX::Routes пятница, 26 февраля 2010 г.
  146. 146. Mojolicious::Controller Controller Base Class пятница, 26 февраля 2010 г.
  147. 147. • render • render_text • render_json • render_inner • render_partial • pause / resume • redirect_to / url_for пятница, 26 февраля 2010 г.
  148. 148. • render • render_text • render_json • render_inner • render_partial • pause / resume • redirect_to / url_for пятница, 26 февраля 2010 г.
  149. 149. • render(tempate => ‘foo/bar’) • render_text • render_json • render_inner • render_partial • pause / resume • redirect_to / url_for пятница, 26 февраля 2010 г.
  150. 150. • render(controller => ‘foo’, action => ‘bar’) • render_text • render_json • render_inner • render_partial • pause / resume • redirect_to / url_for пятница, 26 февраля 2010 г.
  151. 151. • render(‘foo#bar’, format => ‘html') • render_text • render_json • render_inner • render_partial • pause / resume • redirect_to / url_for пятница, 26 февраля 2010 г.
  152. 152. • render • render_text • render_json • render_inner • render_partial • pause / resume • redirect_to / url_for пятница, 26 февраля 2010 г.
  153. 153. • render • render(text => ‘Perlburg 2010’) • render_json • render_inner • render_partial • pause / resume • redirect_to / url_for пятница, 26 февраля 2010 г.
  154. 154. • render • render_text • render_json • render_inner • render_partial • pause / resume • redirect_to / url_for пятница, 26 февраля 2010 г.
  155. 155. • render • render_text • render(json => {foo => ‘bar’}) • render_inner • render_partial • pause / resume • redirect_to / url_for пятница, 26 февраля 2010 г.
  156. 156. • render • render_text • render_json • render_inner • render_partial • pause / resume • redirect_to / url_for пятница, 26 февраля 2010 г.
  157. 157. • render • render_text • render_json • render_inner • render_partial • pause / resume • redirect_to / url_for пятница, 26 февраля 2010 г.
  158. 158. • render • render_text • render_json • render_inner • render_partial • pause / resume • redirect_to / url_for пятница, 26 февраля 2010 г.
  159. 159. • render • render_text • render_json • render_inner • render_partial • pause / resume • redirect_to / url_for пятница, 26 февраля 2010 г.
  160. 160. • Mojolicous::Controller • Mojolicious::Plugin • Mojolicious::Commands • MojoX::Types • MojoX::Dispatcher, MojoX::Routes пятница, 26 февраля 2010 г.
  161. 161. Mojolicious::Plugin Plugin Base Class пятница, 26 февраля 2010 г.
  162. 162. Mojolicious::Plugins Plugins: load_plugin, add_hook, run_hook пятница, 26 февраля 2010 г.
  163. 163. • AgentCondition • Charset • DefaultHelpers • EplRenderer • EpRenderer • HeaderCondition • I18n, JsonConfig, PoweredBy • PodRenderer, RequestTimer пятница, 26 февраля 2010 г.
  164. 164. • AgentCondition • Charset • DefaultHelpers • EplRenderer • EpRenderer • HeaderCondition • I18n, JsonConfig, PoweredBy • PodRenderer, RequestTimer пятница, 26 февраля 2010 г.
  165. 165. • AgentCondition • Charset • DefaultHelpers • EplRenderer • EpRenderer • HeaderCondition • I18n, JsonConfig, PoweredBy • PodRenderer, RequestTimer пятница, 26 февраля 2010 г.
  166. 166. • AgentCondition • Charset • DefaultHelpers • EplRenderer • EpRenderer • HeaderCondition • I18n, JsonConfig, PoweredBy • PodRenderer, RequestTimer пятница, 26 февраля 2010 г.
  167. 167. • dumper • param • stash • layout • include • content • extends • url_for пятница, 26 февраля 2010 г.
  168. 168. • dumper • param • stash • layout • include • content • extends • url_for пятница, 26 февраля 2010 г.
  169. 169. • Data::Dumper (Maxdepth: 2, Indent: 1, Terse: 1) • param • stash • layout • include • content • extends • url_for пятница, 26 февраля 2010 г.
  170. 170. • dumper • param • stash • layout • include • content • extends • url_for пятница, 26 февраля 2010 г.
  171. 171. • dumper • $self->req->param(...) • stash • layout • include • content • extends • url_for пятница, 26 февраля 2010 г.
  172. 172. • dumper • param • stash • layout • include • content • extends • url_for пятница, 26 февраля 2010 г.
  173. 173. • dumper • param • $self->stash(...) • layout • include • content • extends • url_for пятница, 26 февраля 2010 г.
  174. 174. • dumper • param • stash • layout • include • content • extends • url_for пятница, 26 февраля 2010 г.
  175. 175. • dumper • param • stash • $self->stash(layout => ...) • include • content • extends • url_for пятница, 26 февраля 2010 г.
  176. 176. • dumper • param • stash • layout • include • content • extends • url_for пятница, 26 февраля 2010 г.
  177. 177. • dumper • param • stash • layout • $self->render_partial(...) • content • extends • url_for пятница, 26 февраля 2010 г.
  178. 178. • dumper • param • stash • layout • include • content • extends • url_for пятница, 26 февраля 2010 г.
  179. 179. • dumper • param • stash • layout • include • $self->render_inner(...) • extends • url_for пятница, 26 февраля 2010 г.
  180. 180. • dumper • param • stash • layout • include • content • extends • url_for пятница, 26 февраля 2010 г.
  181. 181. • dumper • param • stash • layout • include • content • $self->stash(extends => ...) • url_for пятница, 26 февраля 2010 г.
  182. 182. • dumper • param • stash • layout • include • content • extends • url_for пятница, 26 февраля 2010 г.
  183. 183. • dumper • param • stash • layout • include • content • extends • $self->url_for(...) пятница, 26 февраля 2010 г.
  184. 184. • AgentCondition • Charset • DefaultHelpers • EplRenderer • EpRenderer • HeaderCondition • I18n, JsonConfig, PoweredBy • PodRenderer, RequestTimer пятница, 26 февраля 2010 г.
  185. 185. • extension of temlplates is .epl • my $self = shift; • $self->stash(foo => ‘bar’) пятница, 26 февраля 2010 г.
  186. 186. • AgentCondition • Charset • DefaultHelpers • EplRenderer • EpRenderer • HeaderCondition • I18n, JsonConfig, PoweredBy • PodRenderer, RequestTimer пятница, 26 февраля 2010 г.
  187. 187. • extension of temlplates is .ep • caсhing templates with stash parameters • $self->stash(foo => ‘bar’) – $foo • any helpers • default handler пятница, 26 февраля 2010 г.
  188. 188. • AgentCondition • Charset • DefaultHelpers • EplRenderer • EpRenderer • HeaderCondition • I18n, JsonConfig, PoweredBy • PodRenderer, RequestTimer пятница, 26 февраля 2010 г.
  189. 189. • AgentCondition • Charset • DefaultHelpers • EplRenderer • EpRenderer • HeaderCondition • I18n, JsonConfig, PoweredBy • PodRenderer, RequestTimer пятница, 26 февраля 2010 г.
  190. 190. • AgentCondition • Charset • DefaultHelpers • EplRenderer • EpRenderer • HeaderCondition • I18n, JsonConfig, PoweredBy • PodRenderer, RequestTimer пятница, 26 февраля 2010 г.
  191. 191. • AgentCondition • Charset • DefaultHelpers • EplRenderer • EpRenderer • HeaderCondition • I18n, JsonConfig, PoweredBy • PodRenderer, RequestTimer пятница, 26 февраля 2010 г.
  192. 192. • AgentCondition • Charset • DefaultHelpers • EplRenderer • EpRenderer • HeaderCondition • I18n, JsonConfig, PoweredBy • PodRenderer, RequestTimer пятница, 26 февраля 2010 г.
  193. 193. • AgentCondition • Charset • DefaultHelpers • EplRenderer • EpRenderer • HeaderCondition • I18n, JsonConfig, PoweredBy • PodRenderer, RequestTimer пятница, 26 февраля 2010 г.
  194. 194. • Mojolicous::Controller • Mojolicious::Plugin • Mojolicious::Commands • MojoX::Types • MojoX::Dispatcher, MojoX::Routes пятница, 26 февраля 2010 г.
  195. 195. script/test_app COMMAND [OPTIONS] script/test_app cgi script/test_app fastcgi script/test_app daemon script/test_app daemon_prefork script/test_app psgi script/test_app test script/test_app get scritp/test_app routes пятница, 26 февраля 2010 г.
  196. 196. script/test_app COMMAND [OPTIONS] script/test_app cgi script/test_app fastcgi script/test_app daemon script/test_app daemon_prefork script/test_app psgi script/test_app test script/test_app get scritp/test_app routes пятница, 26 февраля 2010 г.
  197. 197. • Mojolicous::Controller • Mojolicious::Plugin • Mojolicious::Commands • MojoX::Types • MojoX::Dispatcher, MojoX::Routes пятница, 26 февраля 2010 г.
  198. 198. • Mojolicous::Controller • Mojolicious::Plugin • Mojolicious::Commands • MojoX::Types • MojoX::Dispatcher, MojoX::Routes пятница, 26 февраля 2010 г.
  199. 199. A generation the mojolicious app пятница, 26 февраля 2010 г.
  200. 200. mojolicious generate app TestApp пятница, 26 февраля 2010 г.
  201. 201. [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 пятница, 26 февраля 2010 г.
  202. 202. [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 пятница, 26 февраля 2010 г.
  203. 203. [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 пятница, 26 февраля 2010 г.
  204. 204. [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 пятница, 26 февраля 2010 г.
  205. 205. package TestApp; use base 'Mojolicious'; sub startup { my $self = shift; my $r = $self->routes; $r->route('/:controller/:action/:id') ->to('example#welcome', id => 1); } 1; пятница, 26 февраля 2010 г.
  206. 206. package TestApp; use base 'Mojolicious'; sub startup { my $self = shift; my $r = $self->routes; $r->route('/:controller/:action/:id') ->to('example#welcome', id => 1); } 1; пятница, 26 февраля 2010 г.
  207. 207. package TestApp; use base 'Mojolicious'; sub startup { my $self = shift; my $r = $self->routes; $r->route('/:controller/:action/:id') ->to('example#welcome', id => 1); } 1; пятница, 26 февраля 2010 г.
  208. 208. package TestApp; use base 'Mojolicious'; sub startup { my $self = shift; my $r = $self->routes; $r->route('/:controller/:action/:id') ->to('example#welcome', id => 1); } 1; пятница, 26 февраля 2010 г.
  209. 209. package TestApp; use base 'Mojolicious'; sub startup { my $self = shift; my $r = $self->routes; $r->route('/:controller/:action/:id') ->to('example#welcome', id => 1); } 1; пятница, 26 февраля 2010 г.
  210. 210. package TestApp; use base 'Mojolicious'; sub startup { my $self = shift; my $r = $self->routes; $r->route('/:controller/:action/:id') ->to('example#welcome', id => 1); } 1; пятница, 26 февраля 2010 г.
  211. 211. package TestApp; use base 'Mojolicious'; sub startup { my $self = shift; my $r = $self->routes; $r->bridge->to('auth#check') # check auth ->route(...)->to(...); } 1; пятница, 26 февраля 2010 г.
  212. 212. package TestApp::Example; use base 'Mojolicious::Controller'; sub welcome { my $self = shift; warn $self->stash(‘id’); $self->render(message => 'Perlicious!'); } 1; пятница, 26 февраля 2010 г.
  213. 213. [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 пятница, 26 февраля 2010 г.
  214. 214. [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 пятница, 26 февраля 2010 г.
  215. 215. example/ welcome.html.ep Path to the template пятница, 26 февраля 2010 г.
  216. 216. example/ welcome.html.ep Path to the template пятница, 26 февраля 2010 г.
  217. 217. controller/ welcome.html.ep Path to the template пятница, 26 февраля 2010 г.
  218. 218. example/ welcome.html.ep Path to the template пятница, 26 февраля 2010 г.
  219. 219. example/ welcome.html.ep Path to the template пятница, 26 февраля 2010 г.
  220. 220. example/ action.html.ep Path to the template пятница, 26 февраля 2010 г.
  221. 221. example/ welcome.html.ep Path to the template пятница, 26 февраля 2010 г.
  222. 222. example/ welcome.html.ep Path to the template пятница, 26 февраля 2010 г.
  223. 223. example/ welcome.html.handler Path to the template пятница, 26 февраля 2010 г.
  224. 224. example/ welcome.html.ep Path to the template пятница, 26 февраля 2010 г.
  225. 225. example/ welcome.html.epl Path to the template пятница, 26 февраля 2010 г.
  226. 226. example/ welcome.html.tt Path to the template пятница, 26 февраля 2010 г.
  227. 227. example/ welcome.html.ht Path to the template пятница, 26 февраля 2010 г.
  228. 228. example/ welcome.html.pro Path to the template пятница, 26 февраля 2010 г.
  229. 229. example/ welcome.html.ctpp2 Path to the template пятница, 26 февраля 2010 г.
  230. 230. example/ welcome.html.foo Path to the template пятница, 26 февраля 2010 г.
  231. 231. example/ welcome.html.ep Path to the template пятница, 26 февраля 2010 г.
  232. 232. example/ welcome.html.ep Path to the template пятница, 26 февраля 2010 г.
  233. 233. example/ welcome.format.ep Path to the template пятница, 26 февраля 2010 г.
  234. 234. example/ welcome.html.ep Path to the template пятница, 26 февраля 2010 г.
  235. 235. example/ welcome.xml.ep Path to the template пятница, 26 февраля 2010 г.
  236. 236. example/ welcome.rss.ep Path to the template пятница, 26 февраля 2010 г.
  237. 237. example/ welcome.json.ep Path to the template пятница, 26 февраля 2010 г.
  238. 238. example/ welcome.yaml.ep Path to the template пятница, 26 февраля 2010 г.
  239. 239. example/ welcome.mail.ep Path to the template пятница, 26 февраля 2010 г.
  240. 240. example/ welcome.bar.ep Path to the template пятница, 26 февраля 2010 г.
  241. 241. example/ welcome.html.ep Path to the template пятница, 26 февраля 2010 г.
  242. 242. example/ welcome.html.ep Path to the template пятница, 26 февраля 2010 г.
  243. 243. controller/ action.format.handler Path to the template пятница, 26 февраля 2010 г.
  244. 244. % layout 'default'; <h2><%= $message %></h2> <a href="<%== url_for %>">click here</a> пятница, 26 февраля 2010 г.
  245. 245. [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 пятница, 26 февраля 2010 г.
  246. 246. <!doctype html> <html> <head><title>Welcome</title></head> <body> <%== content %> </body> </html> пятница, 26 февраля 2010 г.
  247. 247. [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 пятница, 26 февраля 2010 г.
  248. 248. Global symbol "$message2" requires explicit package name at (eval 280) line 2. 1: % layout 'default'; 2: <h2><%= $message2 %></h2> 3: ... { 'status' => 500, 'message' => ‘Perlicious!’, ... } пятница, 26 февраля 2010 г.
  249. 249. $ENV{MOJO_MODE} Default value is development пятница, 26 февраля 2010 г.
  250. 250. [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 пятница, 26 февраля 2010 г.
  251. 251. Mojolicious::Lite use base 'Mojolicious'; пятница, 26 февраля 2010 г.
  252. 252. mojolicious generate lite_app test_lite пятница, 26 февраля 2010 г.
  253. 253. [write] test_lite [chmod] test_lite 744 пятница, 26 февраля 2010 г.
  254. 254. use Mojolicious::Lite; get '/' => 'index'; any '/:groovy' => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; пятница, 26 февраля 2010 г.
  255. 255. use Mojolicious::Lite; get '/' => 'index'; any '/:groovy' => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; пятница, 26 февраля 2010 г.
  256. 256. use Mojolicious::Lite; get '/' => 'index'; # / any '/:groovy' => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; пятница, 26 февраля 2010 г.
  257. 257. use Mojolicious::Lite; post '/' => 'index'; any '/:groovy' => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; пятница, 26 февраля 2010 г.
  258. 258. use Mojolicious::Lite; any '/' => 'index'; any '/:groovy' => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; пятница, 26 февраля 2010 г.
  259. 259. use Mojolicious::Lite; get '/' => 'index'; any '/:groovy' => sub { # /* my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; пятница, 26 февраля 2010 г.
  260. 260. use Mojolicious::Lite; get '/' => 'index'; any '/:groovy' => [groovy => qr/d+/] => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; пятница, 26 февраля 2010 г.
  261. 261. use Mojolicious::Lite; get '/' => 'index'; any '/:groovy' => {groovy => 42} => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; пятница, 26 февраля 2010 г.
  262. 262. use Mojolicious::Lite; get '/' => 'index'; any '/:groovy' => (agent=>qr/Firefox/) => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; пятница, 26 февраля 2010 г.
  263. 263. use Mojolicious::Lite; get '/' => 'index'; any '/:groovy' => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; app->renderer->default_handler(‘epl’); shagadelic; пятница, 26 февраля 2010 г.
  264. 264. use Mojolicious::Lite; websocket '/echo' => sub { ... }; # websocket get '/' => 'index'; any '/:groovy' => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; пятница, 26 февраля 2010 г.
  265. 265. use Mojolicious::Lite; ladder sub { ... }; # auth get '/' => 'index'; any '/:groovy' => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; пятница, 26 февраля 2010 г.
  266. 266. use Mojolicious::Lite; get '/' => 'index'; any '/:groovy' => sub { my $self = shift; $self->render_text($self->stash('groovy')); }; shagadelic; # shagadelic(‘cgi’) пятница, 26 февраля 2010 г.
  267. 267. __DATA__ @@ index.html.ep % layout 'funky'; Yea baby! @@ layouts/funky.html.ep <!doctype html><html> <body> <%== content %> </body> </html> пятница, 26 февраля 2010 г.
  268. 268. Mojolicious modules on CPAN пятница, 26 февраля 2010 г.
  269. 269. Mojolicious modules on CPAN • Mojolicious • 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 пятница, 26 февраля 2010 г.
  270. 270. Mojolicious Style Guide Rules пятница, 26 февраля 2010 г.
  271. 271. Mojolicious Style Guide • Keep it simple, no magic 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 пятница, 26 февраля 2010 г.
  272. 272. Mojolicious Style Guide • Keep it simple, no magic 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 пятница, 26 февраля 2010 г.
  273. 273. Mojolicious Style Guide • Keep it simple, no magic 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 пятница, 26 февраля 2010 г.
  274. 274. Mojolicious Style Guide • Keep it simple, no magic 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 пятница, 26 февраля 2010 г.
  275. 275. Mojolicious Style Guide • Keep it simple, no magic 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 пятница, 26 февраля 2010 г.
  276. 276. Mojolicious Style Guide • Keep it simple, no magic 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 пятница, 26 февраля 2010 г.
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×