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

165
Mojo. Веб в коробке! BY Perl Too 2009 17 октября 2009 г.

Upload: anatoly-sharifulin

Post on 24-May-2015

1.415 views

Category:

Education


4 download

DESCRIPTION

BY Perl Too 2009

TRANSCRIPT

Page 1: Mojo. Веб в коробке!

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

BY Perl Too 2009

17 октября 2009 г.

Page 2: Mojo. Веб в коробке!

http://mojolicious.org/17 октября 2009 г.

Page 3: Mojo. Веб в коробке!

Sebastian Riedelсоздатель Catalyst и Mojo

http://labs.kraih.com/

17 октября 2009 г.

Page 4: Mojo. Веб в коробке!

http://twitter.com/kraih17 октября 2009 г.

Page 5: Mojo. Веб в коробке!

Catalyst + Mojo = ?17 октября 2009 г.

Page 6: Mojo. Веб в коробке!

Что такое Mojo?

17 октября 2009 г.

Page 7: Mojo. Веб в коробке!

Что такое Mojo?

• Pure Perl веб-фреймворк

• Без зависимостей (начиная с Perl 5.10)

• Объектно-ориентированное API

• Поддержка HTTP 1.1 (клиент-сервер)

• CGI, FastCGI, Daemon и Daemon Prefork

• MVC веб-фреймворки: Mojolicious и Mojolicious::Lite

17 октября 2009 г.

Page 8: Mojo. Веб в коробке!

Что такое Mojo?

• Pure Perl веб-фреймворк

• Без зависимостей (с версии Perl 5.8.1)

• Объектно-ориентированное API

• Поддержка HTTP 1.1 (клиент-сервер)

• CGI, FastCGI, Daemon и Daemon Prefork

• MVC веб-фреймворки: Mojolicious и Mojolicious::Lite

17 октября 2009 г.

Page 9: Mojo. Веб в коробке!

Что такое Mojo?

• Pure Perl веб-фреймворк

• Без зависимостей (с версии Perl 5.8.1)

• Объектно-ориентированное API

• Поддержка HTTP 1.1 (клиент-сервер)

• CGI, FastCGI, Daemon и Daemon Prefork

• MVC веб-фреймворки: Mojolicious и Mojolicious::Lite

17 октября 2009 г.

Page 10: Mojo. Веб в коробке!

Что такое Mojo?

• Pure Perl веб-фреймворк

• Без зависимостей (с версии Perl 5.8.1)

• Объектно-ориентированное API

• Поддержка HTTP 1.1 (клиент-сервер)

• CGI, FastCGI, Daemon и Daemon Prefork

• MVC веб-фреймворки: Mojolicious и Mojolicious::Lite

17 октября 2009 г.

Page 11: Mojo. Веб в коробке!

Что такое Mojo?

• Pure Perl веб-фреймворк

• Без зависимостей (с версии Perl 5.8.1)

• Объектно-ориентированное API

• Поддержка HTTP 1.1 (клиент-сервер)

• CGI, FastCGI, Daemon и Daemon Prefork

• MVC веб-фреймворки: Mojolicious и Mojolicious::Lite

17 октября 2009 г.

Page 12: Mojo. Веб в коробке!

Что такое Mojo?

• Pure Perl веб-фреймворк

• Без зависимостей (с версии Perl 5.8.1)

• Объектно-ориентированное API

• Поддержка HTTP 1.1 (клиент-сервер)

• CGI, FastCGI, Daemon и Daemon Prefork

• MVC веб-фреймворки: Mojolicious и Mojolicious::Lite

17 октября 2009 г.

Page 13: Mojo. Веб в коробке!

Что такое Mojo?

• Pure Perl веб-фреймворк

• Без зависимостей (с версии Perl 5.8.1)

• Объектно-ориентированное API

• Поддержка HTTP 1.1 (клиент-сервер)

• CGI, FastCGI, Daemon и Daemon Prefork

• MVC веб-фреймворки: Mojolicious и Mojolicious::Lite

17 октября 2009 г.

Page 14: Mojo. Веб в коробке!

Pure Perl веб-фреймворк

17 октября 2009 г.

Page 15: Mojo. Веб в коробке!

• Mojo::Base

• Mojo::ByteStream

• Mojo::Template, Mojo::JSON

• Mojo::Loader, Mojo::Log, Mojo::Path

• Mojo::URL, Mojo::Parameters, Mojo::Content

• Mojo::Message::Request, Mojo::Message::Response,Mojo::Headers, Mojo::Cookie, Mojo::Date

17 октября 2009 г.

Page 16: Mojo. Веб в коробке!

• Mojo::Base

• Mojo::ByteStream

• Mojo::Template, Mojo::JSON

• Mojo::Loader, Mojo::Log, Mojo::Path

• Mojo::URL, Mojo::Parameters, Mojo::Content

• Mojo::Message::Request, Mojo::Message::Response,Mojo::Headers, Mojo::Cookie, Mojo::Date

17 октября 2009 г.

Page 17: Mojo. Веб в коробке!

Minimal Base Class For Mojo Projects

Mojo::Base

17 октября 2009 г.

Page 18: Mojo. Веб в коробке!

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

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

sub dispatch { ... }17 октября 2009 г.

Page 19: Mojo. Веб в коробке!

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

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

sub dispatch { ... }17 октября 2009 г.

Page 20: Mojo. Веб в коробке!

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

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

sub dispatch { ... }17 октября 2009 г.

Page 21: Mojo. Веб в коробке!

• Mojo::Base

• Mojo::ByteStream

• Mojo::Template, Mojo::JSON

• Mojo::Loader, Mojo::Log, Mojo::Path

• Mojo::URL, Mojo::Parameters, Mojo::Content

• Mojo::Message::Request, Mojo::Message::Response,Mojo::Headers, Mojo::Cookie, Mojo::Date

17 октября 2009 г.

Page 22: Mojo. Веб в коробке!

ByteStream

Mojo::ByteStream

17 октября 2009 г.

Page 23: Mojo. Веб в коробке!

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

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

17 октября 2009 г.

Page 24: Mojo. Веб в коробке!

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

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

17 октября 2009 г.

Page 25: Mojo. Веб в коробке!

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

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

17 октября 2009 г.

Page 26: Mojo. Веб в коробке!

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

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

17 октября 2009 г.

Page 27: Mojo. Веб в коробке!

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

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

17 октября 2009 г.

Page 28: Mojo. Веб в коробке!

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

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

17 октября 2009 г.

Page 29: Mojo. Веб в коробке!

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

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

17 октября 2009 г.

Page 30: Mojo. Веб в коробке!

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

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

17 октября 2009 г.

Page 31: Mojo. Веб в коробке!

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

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

17 октября 2009 г.

Page 32: Mojo. Веб в коробке!

• Mojo::Base

• Mojo::ByteStream

• Mojo::Template, Mojo::JSON

• Mojo::Loader, Mojo::Log, Mojo::Path

• Mojo::URL, Mojo::Parameters, Mojo::Content

• Mojo::Message::Request, Mojo::Message::Response,Mojo::Headers, Mojo::Cookie, Mojo::Date

17 октября 2009 г.

Page 33: Mojo. Веб в коробке!

Perlish Templates!

Mojo::Template

17 октября 2009 г.

Page 34: Mojo. Веб в коробке!

% my $self = shift;% my $list = $self->stash(‘list’);

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

17 октября 2009 г.

Page 35: Mojo. Веб в коробке!

• Mojo::Base

• Mojo::ByteStream

• Mojo::Template, Mojo::JSON

• Mojo::Loader, Mojo::Log, Mojo::Path

• Mojo::URL, Mojo::Parameters, Mojo::Content

• Mojo::Message::Request, Mojo::Message::Response,Mojo::Headers, Mojo::Cookie, Mojo::Date

17 октября 2009 г.

Page 36: Mojo. Веб в коробке!

• Mojo::Base

• Mojo::ByteStream

• Mojo::Template, Mojo::JSON

• Mojo::Loader, Mojo::Log, Mojo::Path

• Mojo::URL, Mojo::Parameters, Mojo::Content

• Mojo::Message::Request, Mojo::Message::Response,Mojo::Headers, Mojo::Cookie, Mojo::Date

17 октября 2009 г.

Page 37: Mojo. Веб в коробке!

• Mojo::Base

• Mojo::ByteStream

• Mojo::Template, Mojo::JSON

• Mojo::Loader, Mojo::Log, Mojo::Path

• Mojo::URL, Mojo::Parameters, Mojo::Content

• Mojo::Message::Request, Mojo::Message::Response,Mojo::Headers, Mojo::Cookie, Mojo::Date

17 октября 2009 г.

Page 38: Mojo. Веб в коробке!

• Mojo::Base

• Mojo::ByteStream

• Mojo::Template, Mojo::JSON

• Mojo::Loader, Mojo::Log, Mojo::Path

• Mojo::URL, Mojo::Parameters, Mojo::Content

• Mojo::Message::Request, Mojo::Message::Response,Mojo::Headers, Mojo::Cookie, Mojo::Date

17 октября 2009 г.

Page 39: Mojo. Веб в коробке!

• Mojo::Base

• Mojo::ByteStream

• Mojo::Template, Mojo::JSON

• Mojo::Loader, Mojo::Log, Mojo::Path

• Mojo::URL, Mojo::Parameters, Mojo::Content

• Mojo::Message::Request, Mojo::Message::Response,Mojo::Headers, Mojo::Cookie, Mojo::Date

17 октября 2009 г.

Page 40: Mojo. Веб в коробке!

• Mojo::Trasaction, Mojo::Stateful

• Mojo::Client

• Mojo::Server

• Mojo::Server::CGI, Mojo::Server::FastCGI

• Mojo::Server::Daemon

• Mojo::Server::Daemon::Prefork

• Mojo::Command

• Mojo::Command::Generate и ~ Server

17 октября 2009 г.

Page 41: Mojo. Веб в коробке!

• Mojo::Trasaction, Mojo::Stateful

• Mojo::Client

• Mojo::Server

• Mojo::Server::CGI, Mojo::Server::FastCGI

• Mojo::Server::Daemon

• Mojo::Server::Daemon::Prefork

• Mojo::Command

• Mojo::Command::Generate и ~ Server

17 октября 2009 г.

Page 42: Mojo. Веб в коробке!

• Mojo::Trasaction, Mojo::Stateful

• Mojo::Client

• Mojo::Server

• Mojo::Server::CGI, Mojo::Server::FastCGI

• Mojo::Server::Daemon

• Mojo::Server::Daemon::Prefork

• Mojo::Command

• Mojo::Command::Generate и ~ Server

17 октября 2009 г.

Page 43: Mojo. Веб в коробке!

• Mojo::Trasaction, Mojo::Stateful

• Mojo::Client

• Mojo::Server

• Mojo::Server::CGI, Mojo::Server::FastCGI

• Mojo::Server::Daemon

• Mojo::Server::Daemon::Prefork

• Mojo::Command

• Mojo::Command::Generate и ~ Server

17 октября 2009 г.

Page 44: Mojo. Веб в коробке!

• Mojo::Trasaction, Mojo::Stateful

• Mojo::Client

• Mojo::Server

• Mojo::Server::CGI, Mojo::Server::FastCGI

• Mojo::Server::Daemon

• Mojo::Server::Daemon::Prefork

• Mojo::Command

• Mojo::Command::Generate и ~ Server

17 октября 2009 г.

Page 45: Mojo. Веб в коробке!

• Mojo::Trasaction, Mojo::Stateful

• Mojo::Client

• Mojo::Server

• Mojo::Server::CGI, Mojo::Server::FastCGI

• Mojo::Server::Daemon

• Mojo::Server::Daemon::Prefork

• Mojo::Command

• Mojo::Command::Generate и ~ Server

17 октября 2009 г.

Page 46: Mojo. Веб в коробке!

• Mojo::Trasaction, Mojo::Stateful

• Mojo::Client

• Mojo::Server

• Mojo::Server::CGI, Mojo::Server::FastCGI

• Mojo::Server::Daemon

• Mojo::Server::Daemon::Prefork

• Mojo::Command

• Mojo::Command::Generate и ~ Server

17 октября 2009 г.

Page 47: Mojo. Веб в коробке!

Mojo – веб в коробке!

Всё, что нужно есть

17 октября 2009 г.

Page 48: Mojo. Веб в коробке!

Mojo – веб в коробке!

Почти всё, что нужно есть :)

17 октября 2009 г.

Page 49: Mojo. Веб в коробке!

Без зависимостейс версии Perl 5.8.1

17 октября 2009 г.

Page 50: Mojo. Веб в коробке!

Почтибез зависимостей :)

17 октября 2009 г.

Page 51: Mojo. Веб в коробке!

Mojo runtime17 октября 2009 г.

Page 52: Mojo. Веб в коробке!

Perl 5.00517 октября 2009 г.

Page 53: Mojo. Веб в коробке!

Perl 5.00600217 октября 2009 г.

Page 54: Mojo. Веб в коробке!

Perl 5.00800117 октября 2009 г.

Page 55: Mojo. Веб в коробке!

Mojo Perl 5.01017 октября 2009 г.

Page 56: Mojo. Веб в коробке!

Объектно-ориентированное API

17 октября 2009 г.

Page 57: Mojo. Веб в коробке!

package TestMojo;use base 'Mojo';

sub handler { my ($self, $tx) = @_; warn $tx->req; warn $tx->req->url; $tx->res->headers ->content_type('text/plain'); $tx->res->body('Hello Mojo!');}

17 октября 2009 г.

Page 58: Mojo. Веб в коробке!

package TestMojo;use base 'Mojo';

sub handler { my ($self, $tx) = @_; warn $tx->req; warn $tx->req->url; $tx->res->headers ->content_type('text/plain'); $tx->res->body('Hello Mojo!');}

17 октября 2009 г.

Page 59: Mojo. Веб в коробке!

package TestMojo;use base 'Mojo';

sub handler { my ($self, $tx) = @_; warn $tx->req; warn $tx->req->url; $tx->res->headers ->content_type('text/plain'); $tx->res->body('Hello Mojo!');}

17 октября 2009 г.

Page 60: Mojo. Веб в коробке!

package TestMojo;use base 'Mojo';

sub handler { my ($self, $tx) = @_; warn $tx->req; warn $tx->req->url; $tx->res->headers ->content_type('text/plain'); $tx->res->body('Hello Mojo!');}

17 октября 2009 г.

Page 61: Mojo. Веб в коробке!

use overload '""' => sub { shift->to_string },

fallback => 1;

17 октября 2009 г.

Page 62: Mojo. Веб в коробке!

package TestMojo;use base 'Mojo';

sub handler { my ($self, $tx) = @_; warn $tx->req; warn $tx->req->url; $tx->res->headers ->content_type('text/plain'); $tx->res->body('Hello Mojo!');}

17 октября 2009 г.

Page 63: Mojo. Веб в коробке!

package TestMojo;use base 'Mojo';

sub handler { my ($self, $tx) = @_; warn $tx->req; warn $tx->req->url; $tx->res->headers ->content_type('text/plain'); $tx->res->body('Hello Mojo!');}

17 октября 2009 г.

Page 64: Mojo. Веб в коробке!

package TestMojo;use base 'Mojo';

sub handler { my ($self, $tx) = @_; warn $tx->req; warn $tx->req->url; $tx->res->headers ->content_type('text/plain'); $tx->res->body('Hello Mojo!');}

17 октября 2009 г.

Page 65: Mojo. Веб в коробке!

Генерацияmojo-приложения

17 октября 2009 г.

Page 66: Mojo. Веб в коробке!

mojo generate app TestMojo

[mkdir] test_mojo/script[write] test_mojo/script/test_mojo[chmod] test_mojo/script/test_mojo 744[mkdir] test_mojo/lib[write] test_mojo/lib/TestMojo.pm[mkdir] test_mojo/t[write] test_mojo/t/basic.t

17 октября 2009 г.

Page 67: Mojo. Веб в коробке!

mojo generate app TestMojo

[mkdir] test_mojo/script[write] test_mojo/script/test_mojo[chmod] test_mojo/script/test_mojo 744[mkdir] test_mojo/lib[write] test_mojo/lib/TestMojo.pm[mkdir] test_mojo/t[write] test_mojo/t/basic.t

17 октября 2009 г.

Page 68: Mojo. Веб в коробке!

use FindBin;

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

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

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

17 октября 2009 г.

Page 69: Mojo. Веб в коробке!

mojo generate app TestMojo

[mkdir] test_mojo/script[write] test_mojo/script/test_mojo[chmod] test_mojo/script/test_mojo 744[mkdir] test_mojo/lib[write] test_mojo/lib/TestMojo.pm[mkdir] test_mojo/t[write] test_mojo/t/basic.t

17 октября 2009 г.

Page 70: Mojo. Веб в коробке!

mojo generate app TestMojo

[mkdir] test_mojo/script[write] test_mojo/script/test_mojo[chmod] test_mojo/script/test_mojo 744[mkdir] test_mojo/lib[write] test_mojo/lib/TestMojo.pm[mkdir] test_mojo/t[write] test_mojo/t/basic.t

17 октября 2009 г.

Page 71: Mojo. Веб в коробке!

#!/usr/bin/env perl

use strict;use warnings;

use Test::More tests => 1;

use_ok('TestMojo');

17 октября 2009 г.

Page 72: Mojo. Веб в коробке!

Поддержка HTTP 1.1

17 октября 2009 г.

Page 73: Mojo. Веб в коробке!

17 октября 2009 г.

Page 74: Mojo. Веб в коробке!

MojoX::UserAgentPascal Gaudette

Спасибо Google of Summer Code 2009!

17 октября 2009 г.

Page 75: Mojo. Веб в коробке!

Поддержка CGI, FastCGI, Daemon, Daemon Prefork

17 октября 2009 г.

Page 76: Mojo. Веб в коробке!

script/test_mojo COMMAND [OPTIONS]

script/test_mojo cgiscript/test_mojo fastcgiscript/test_mojo daemonscript/test_mojo daemon_prefork --port 80

17 октября 2009 г.

Page 77: Mojo. Веб в коробке!

script/test_mojo COMMAND [OPTIONS]

script/test_mojo cgiscript/test_mojo fastcgiscript/test_mojo daemonscript/test_mojo daemon_prefork --port 80

17 октября 2009 г.

Page 78: Mojo. Веб в коробке!

PATH_INFO='/' script/test_mojo cgi

Легко тестироватьМожно профилировать код, используя Devel::NYProf

17 октября 2009 г.

Page 79: Mojo. Веб в коробке!

script/test_mojo COMMAND [OPTIONS]

script/test_mojo cgiscript/test_mojo fastcgiscript/test_mojo daemonscript/test_mojo daemon_prefork --port 80

17 октября 2009 г.

Page 80: Mojo. Веб в коробке!

Mojo::Server::FCGIscript/test_mojo fcgiscript/test_mojo fcgi_prefork

17 октября 2009 г.

Page 81: Mojo. Веб в коробке!

Mojo::Server::FCGIscript/test_mojo fcgiscript/test_mojo fcgi_prefork

17 октября 2009 г.

Page 82: Mojo. Веб в коробке!

Mojo::Server::FCGIscript/test_mojo fcgiscript/test_mojo fcgi_prefork

17 октября 2009 г.

Page 83: Mojo. Веб в коробке!

location / { fastcgi_pass 127.0.0.1:3000; fastcgi_param MOJO_APP App; fastcgi_param SCRIPT_NAME http://127.0.0.1:3000; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length;}

17 октября 2009 г.

Page 84: Mojo. Веб в коробке!

location / { fastcgi_pass 127.0.0.1:3000; fastcgi_param MOJO_APP App; fastcgi_param SCRIPT_NAME http://127.0.0.1:3000; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length;}

17 октября 2009 г.

Page 85: Mojo. Веб в коробке!

location / { fastcgi_pass 127.0.0.1:3000; fastcgi_param MOJO_APP App; fastcgi_param SCRIPT_NAME http://127.0.0.1:3000; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length;}

17 октября 2009 г.

Page 86: Mojo. Веб в коробке!

location / { fastcgi_pass 127.0.0.1:3000; fastcgi_param MOJO_APP App; fastcgi_param SCRIPT_NAME http://127.0.0.1:3000; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length;}

17 октября 2009 г.

Page 87: Mojo. Веб в коробке!

location / { fastcgi_pass 127.0.0.1:3000; fastcgi_param MOJO_APP App; fastcgi_param SCRIPT_NAME http://127.0.0.1:3000; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length;}

17 октября 2009 г.

Page 88: Mojo. Веб в коробке!

script/test_mojo COMMAND [OPTIONS]

script/test_mojo cgiscript/test_mojo fastcgiscript/test_mojo daemonscript/test_mojo daemon_prefork --port 80

17 октября 2009 г.

Page 89: Mojo. Веб в коробке!

MOJO_RELOAD=1 script/test_mojo daemon

Код перезагружается при каждом запросе

17 октября 2009 г.

Page 90: Mojo. Веб в коробке!

script/test_mojo COMMAND [OPTIONS]

script/test_mojo cgiscript/test_mojo fastcgiscript/test_mojo daemonscript/test_mojo daemon_prefork --port 80

17 октября 2009 г.

Page 91: Mojo. Веб в коробке!

script/test_mojo COMMAND [OPTIONS]

script/test_mojo cgiscript/test_mojo fastcgiscript/test_mojo daemonscript/test_mojo daemon_prefork --port 80

script/test_mojo test

17 октября 2009 г.

Page 92: Mojo. Веб в коробке!

MVC веб-фреймворки

17 октября 2009 г.

Page 93: Mojo. Веб в коробке!

Mojolicioususe base 'Mojo';

17 октября 2009 г.

Page 94: Mojo. Веб в коробке!

• Mojolicious::Renderer

• Mojolicous::Controller

• Mojolicious::Commands

• MojoX::Types

• MojoX::Dispatcher, MojoX::Routes

17 октября 2009 г.

Page 95: Mojo. Веб в коробке!

• Mojolicious::Renderer

• Mojolicous::Controller

• Mojolicious::Commands

• MojoX::Types

• MojoX::Dispatcher, MojoX::Routes

17 октября 2009 г.

Page 96: Mojo. Веб в коробке!

• Mojolicious::Renderer

• Mojolicous::Controller

• Mojolicious::Commands

• MojoX::Types

• MojoX::Dispatcher, MojoX::Routes

17 октября 2009 г.

Page 97: Mojo. Веб в коробке!

• Mojolicious::Renderer

• Mojolicous::Controller

• Mojolicious::Commands

• MojoX::Types

• MojoX::Dispatcher, MojoX::Routes

17 октября 2009 г.

Page 98: Mojo. Веб в коробке!

• Mojolicious::Renderer

• Mojolicous::Controller

• Mojolicious::Commands

• MojoX::Types

• MojoX::Dispatcher, MojoX::Routes

17 октября 2009 г.

Page 99: Mojo. Веб в коробке!

• Mojolicious::Renderer

• Mojolicous::Controller

• Mojolicious::Commands

• MojoX::Types

• MojoX::Dispatcher, MojoX::Routes

17 октября 2009 г.

Page 100: Mojo. Веб в коробке!

Генерацияmojolicious-приложения

17 октября 2009 г.

Page 101: Mojo. Веб в коробке!

mojolicious generate app TestApp

17 октября 2009 г.

Page 102: Mojo. Веб в коробке!

[mkdir] test_app/script[write] test_app/script/test_app[chmod] test_app/script/test_app 744[mkdir] test_app/lib[write] test_app/lib/TestApp.pm[mkdir] test_app/lib/TestApp[write] test_app/lib/TestApp/Example.pm[mkdir] test_app/t[write] test_app/t/basic.t[mkdir] test_app/log[mkdir] test_app/public[write] test_app/public/404.html[exist] test_app/public[write] test_app/public/500.html

17 октября 2009 г.

Page 103: Mojo. Веб в коробке!

[mkdir] test_app/script[write] test_app/script/test_app[chmod] test_app/script/test_app 744[mkdir] test_app/lib[write] test_app/lib/TestApp.pm[mkdir] test_app/lib/TestApp[write] test_app/lib/TestApp/Example.pm[mkdir] test_app/t[write] test_app/t/basic.t[mkdir] test_app/log[mkdir] test_app/public[write] test_app/public/404.html[exist] test_app/public[write] test_app/public/500.html

17 октября 2009 г.

Page 104: Mojo. Веб в коробке!

[mkdir] test_app/script[write] test_app/script/test_app[chmod] test_app/script/test_app 744[mkdir] test_app/lib[write] test_app/lib/TestApp.pm[mkdir] test_app/lib/TestApp[write] test_app/lib/TestApp/Example.pm[mkdir] test_app/t[write] test_app/t/basic.t[mkdir] test_app/log[mkdir] test_app/public[write] test_app/public/404.html[exist] test_app/public[write] test_app/public/500.html

17 октября 2009 г.

Page 105: Mojo. Веб в коробке!

[mkdir] test_app/script[write] test_app/script/test_app[chmod] test_app/script/test_app 744[mkdir] test_app/lib[write] test_app/lib/TestApp.pm[mkdir] test_app/lib/TestApp[write] test_app/lib/TestApp/Example.pm[mkdir] test_app/t[write] test_app/t/basic.t[mkdir] test_app/log[mkdir] test_app/public[write] test_app/public/404.html[exist] test_app/public[write] test_app/public/500.html

17 октября 2009 г.

Page 106: Mojo. Веб в коробке!

package TestApp;

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

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

17 октября 2009 г.

Page 107: Mojo. Веб в коробке!

package TestApp;

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

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

17 октября 2009 г.

Page 108: Mojo. Веб в коробке!

package TestApp;

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

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

17 октября 2009 г.

Page 109: Mojo. Веб в коробке!

package TestApp;

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

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

17 октября 2009 г.

Page 110: Mojo. Веб в коробке!

package TestApp;

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

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

17 октября 2009 г.

Page 111: Mojo. Веб в коробке!

package TestApp;

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

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

17 октября 2009 г.

Page 112: Mojo. Веб в коробке!

package TestApp;

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

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

17 октября 2009 г.

Page 113: Mojo. Веб в коробке!

package TestApp::Example;

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

1;

17 октября 2009 г.

Page 114: Mojo. Веб в коробке!

[exist] test_app/public[write] test_app/public/index.html[mkdir] test_app/templates[write] test_app/templates/exception.html.ep[mkdir] test_app/templates/layouts[write] test_app/templates/layouts/default.html.ep[mkdir] test_app/templates/example[write] test_app/templates/example/welcome.html.ep

17 октября 2009 г.

Page 115: Mojo. Веб в коробке!

[exist] test_app/public[write] test_app/public/index.html[mkdir] test_app/templates[write] test_app/templates/exception.html.ep[mkdir] test_app/templates/layouts[write] test_app/templates/layouts/default.html.ep[mkdir] test_app/templates/example[write] test_app/templates/example/welcome.html.ep

17 октября 2009 г.

Page 116: Mojo. Веб в коробке!

% layout 'default';

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

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

17 октября 2009 г.

Page 117: Mojo. Веб в коробке!

[exist] test_app/public[write] test_app/public/index.html[mkdir] test_app/templates[write] test_app/templates/exception.html.ep[mkdir] test_app/templates/layouts[write] test_app/templates/layouts/default.html.ep[mkdir] test_app/templates/example[write] test_app/templates/example/welcome.html.ep

17 октября 2009 г.

Page 118: Mojo. Веб в коробке!

<!doctype html><html> <head><title>Welcome</title></head> <body> <%== content %> </body></html>

17 октября 2009 г.

Page 119: Mojo. Веб в коробке!

[exist] test_app/public[write] test_app/public/index.html[mkdir] test_app/templates[write] test_app/templates/exception.html.ep[mkdir] test_app/templates/layouts[write] test_app/templates/layouts/default.html.ep[mkdir] test_app/templates/example[write] test_app/templates/example/welcome.html.ep

17 октября 2009 г.

Page 120: Mojo. Веб в коробке!

Mojolicious::Liteuse base 'Mojolicious';

17 октября 2009 г.

Page 121: Mojo. Веб в коробке!

mojolicious generate lite_app test_lite

17 октября 2009 г.

Page 122: Mojo. Веб в коробке!

[write] test_lite[chmod] test_lite 744

17 октября 2009 г.

Page 123: Mojo. Веб в коробке!

use Mojolicious::Lite;

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

get '/' => 'index';

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

shagadelic;17 октября 2009 г.

Page 124: Mojo. Веб в коробке!

use Mojolicious::Lite;

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

get '/' => 'index';

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

shagadelic;17 октября 2009 г.

Page 125: Mojo. Веб в коробке!

use Mojolicious::Lite;

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

get '/' => 'index';

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

shagadelic;17 октября 2009 г.

Page 126: Mojo. Веб в коробке!

use Mojolicious::Lite;

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

get '/' => 'index';

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

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

Page 127: Mojo. Веб в коробке!

__DATA__

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

@@ layouts/funky.html.ep<!doctype html><html> <body> <%== content %> </body></html>

17 октября 2009 г.

Page 128: Mojo. Веб в коробке!

Mojo-модули на CPAN

17 октября 2009 г.

Page 129: Mojo. Веб в коробке!

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

17 октября 2009 г.

Page 130: Mojo. Веб в коробке!

Стабильная версия,обратная

совместимость?

17 октября 2009 г.

Page 131: Mojo. Веб в коробке!

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

17 октября 2009 г.

Page 132: Mojo. Веб в коробке!

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

17 октября 2009 г.

Page 133: Mojo. Веб в коробке!

Первый критичный баг

17 октября 2009 г.

Page 134: Mojo. Веб в коробке!

get ‘/bug/’ => sub { my $self = shift;

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

17 октября 2009 г.

Page 135: Mojo. Веб в коробке!

get ‘/bug/’ => sub { my $self = shift;

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

17 октября 2009 г.

Page 136: Mojo. Веб в коробке!

test.pl

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

17 октября 2009 г.

Page 137: Mojo. Веб в коробке!

script/test_bug daemon # OK

17 октября 2009 г.

Page 138: Mojo. Веб в коробке!

script/test_bug daemon # OKscript/test_bug daemon_prefork # DIE

17 октября 2009 г.

Page 139: Mojo. Веб в коробке!

Mojo::Server::Daemon::Prefork #323:

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

17 октября 2009 г.

Page 140: Mojo. Веб в коробке!

Mojo::Server::Daemon::Prefork #323:

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

17 октября 2009 г.

Page 141: Mojo. Веб в коробке!

Mojo::Server::Daemon::Prefork #323:

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

$SIG{CHLD} = ‘IGNORE’;

17 октября 2009 г.

Page 142: Mojo. Веб в коробке!

Документация

17 октября 2009 г.

Page 143: Mojo. Веб в коробке!

ДокументацияНе очень :)

17 октября 2009 г.

Page 144: Mojo. Веб в коробке!

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

FriendFeed форева!

17 октября 2009 г.

Page 145: Mojo. Веб в коробке!

Полезная информация

• http://mojolicious.org

• http://labs.kraih.com/blog/

• http://search.cpan.org/dist/Mojo/

• http://github.com/kraih/mojo

• http://sharifulin.livejournal.com/tag/mojo

• http://getbootylicious.org/

17 октября 2009 г.

Page 146: Mojo. Веб в коробке!

Полезная информация

• http://mojolicious.org

• http://labs.kraih.com/blog/

• http://search.cpan.org/dist/Mojo/

• http://github.com/kraih/mojo

• http://sharifulin.livejournal.com/tag/mojo

• http://getbootylicious.org/

17 октября 2009 г.

Page 147: Mojo. Веб в коробке!

Bootylicious17 октября 2009 г.

Page 148: Mojo. Веб в коробке!

Полезная информация

• irc://irc.perl.org/#mojo

• http://lists.kraih.com/cgi-bin/mailman/listinfo/mojo

• Twitter: @kraih, @vtivti, @sharifulin

17 октября 2009 г.

Page 149: Mojo. Веб в коробке!

Последние новости• PSGI and Plack is the future of HTTP::Engine that

has support for servers like CGI, FastCGI, Apache, AnyEvent and Mojo.

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

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

• Unicode support in #Mojolicious looks really great now.

17 октября 2009 г.

Page 150: Mojo. Веб в коробке!

Опыт разработки на Mojo

17 октября 2009 г.

Page 151: Mojo. Веб в коробке!

Mojolicious + MojoX::Renderer::TT17 октября 2009 г.

Page 152: Mojo. Веб в коробке!

Mojo + JSON17 октября 2009 г.

Page 153: Mojo. Веб в коробке!

Mojolicious::Lite + MojoX::Renderer::JSON

17 октября 2009 г.

Page 154: Mojo. Веб в коробке!

Mojolicious::Lite + MojoX::Renderer::JSON + RSS

17 октября 2009 г.

Page 155: Mojo. Веб в коробке!

Mojolicious + Mojo::Template17 октября 2009 г.

Page 156: Mojo. Веб в коробке!

Mojolicious::Lite + other render17 октября 2009 г.

Page 157: Mojo. Веб в коробке!

«Я никогда так быстро не делал сайты на Perl»

Анатолий Шарифулин :)

17 октября 2009 г.

Page 158: Mojo. Веб в коробке!

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

17 октября 2009 г.

Page 159: Mojo. Веб в коробке!

Ответ: «Да!»

17 октября 2009 г.

Page 160: Mojo. Веб в коробке!

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

17 октября 2009 г.

Page 161: Mojo. Веб в коробке!

use Perlor die

17 октября 2009 г.

Page 162: Mojo. Веб в коробке!

use Mojoor die

17 октября 2009 г.

Page 163: Mojo. Веб в коробке!

JFDI

17 октября 2009 г.

Page 164: Mojo. Веб в коробке!

any ‘/questions/’ => sub { shift->render( say => ‘sharifulin’, );};shagadelic;

17 октября 2009 г.

Page 165: Mojo. Веб в коробке!

Дзякуй, кали ласка!Анатолий Шарифулин

RostovOnDon.pm

17 октября 2009 г.