• Like
Mojo. Веб в коробке!
Upcoming SlideShare
Loading in...5
×

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

  • 1,927 views
Uploaded on

Saint Perl 2009

Saint Perl 2009

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
No Downloads

Views

Total Views
1,927
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
18
Comments
5
Likes
3

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

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