Plack

3,965 views
3,904 views

Published on

A authorized adaptation of Miyagawa Plack presentation to portuguese for the Portuguese Perl Workshop 2010

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
3,965
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
28
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide




















































































































  • Plack

    1. 1. Plack O canivete suiço das Frameworks Web Original de Tatsuhiko Miyagawa Assassinado por Pedro Melo
    2. 2. Uma breve viagem...
    3. 3. Frameworks Web em Perl
    4. 4. Mil e uma maneiras de escrever aplicações Web
    5. 5. Maypole Mason Mojo Sledge Catalyst Spoon PageKit AxKit Egg Gantry Continuity Solstice Mojolicious Tripletail Konstrukt Reaction Jifty Cyclone3 WebGUI OpenInteract Squatting Dancer CGI::Application Nanoa Ark Angelos Noe Schenker Tatsumaki Amon Apache2::WebApp Web::Simple Apache2::REST SweetPea Hydrant Titanium
    6. 6. Algumas maneiras de correr aplicações Web em Perl
    7. 7. CGI, FastCGI & mod_perl
    8. 8. Por exemplo....
    9. 9. CGI.pm
    10. 10. Corre “fixe” em: CGI, FastCGI, mod_perl (1 & 2) Standalone (usando HTTP::Server::Simple)
    11. 11. CGI.pm = MDC (máximo denominador comum) Módulo Perl incluído de base
    12. 12. 8803 linhas de código Versão inicial: Novembro 1995
    13. 13. :-(
    14. 14. CGI.PM tem de ir com os porcos!!
    15. 15. (tou a brincar...)
    16. 16. Catalyst A framework web em Perl que todas as vedetas usam (brinco de brilhantes estilo Ronaldo ou Quaresma não incluído)
    17. 17. Catalyst::Engine::* Adaptadores para servidores: Apache, FastCGI, Standalone e Prefork
    18. 18. CGI.pm Jifty, CGI::Application, Spoon baseadas em mod_perl Mason, Sledge, PageKit, WebGUI Adaptadores Catalyst, Maypole, Squatting
    19. 19. Problemas
    20. 20. Duplicação de esforços Difícil de comparar performance
    21. 21. Que tal partilhar esse código?
    22. 22. Algumas tentativas...
    23. 23. HTTP::Engine Yappo, tokuhirom, nothingmuch e companhia
    24. 24. Vitória! “Rouba-se” o código do Catalyst e cria-se uma biblioteca à parte. Tá feito! Siga pa bingo!
    25. 25. Err... talvez não Um pedaço de código disforme, sem separação de interface e implementação: “À cão”
    26. 26. Até que em Setembro 2009...
    27. 27. miyagawa http://www.flickr.com/photos/hanekomu/4518057694/
    28. 28. Episode IV: A new hope
    29. 29. Que tal utilizar umas ideias fines do Python e Ruby?
    30. 30. Posto de outra forma Vamos importar ideias estruturantes que provaram ser populares noutros contextos dinâmicos, criando sinergias que nos permitem agilizar a nossa entrada no mercado global com uma proposta de valor vencedora
    31. 31. “...A gente vai gamar a cena toda...”
    32. 32. WSGI (Python) Rack (Ruby)
    33. 33. WSGI (PEP-333)
    34. 34. WSGI • Django • mod_wsgi • Bottle • Paste • CherryPy • gunicorn • Tornado • uWSGI • Pylons • wsgiref • Flask • Google AppEngine
    35. 35. Django Bottle Flask Tornado WSGI middleware WSGI wsgi handlers Apache lighttpd nginx mod_wsgi GAE
    36. 36. Rack
    37. 37. Rack • Rails • Unicorn • Merb • Thin • Sinatra • Mongrel • Camping • Rainbows! • Ramaze • Phusion Passenger • etc. • Heroku
    38. 38. Rails Merb Sinatra Ramaze Rack middleware Rack Rack handlers Apache lighttpd Thin Unicorn Mongrel
    39. 39. A prata da casa...
    40. 40. PSGI Perl Web Server Gateway Interface
    41. 41. Interface++
    42. 42. Atenção! o próximo programa inclui cenas de Perl explicito, só recomendadas a programadores de Frameworks Perl, ou pessoas à procura de novas experiências
    43. 43. # WSGI def hello(environ, start_response): start_response(“200 OK”, [ (‘Content-Type’, ‘text/plain’) ]) return [“Hello World”]
    44. 44. # Rack class Hello def call(env) return [ 200, { “Content-Type” => ”text/plain” }, [“Hello World”] ] end end
    45. 45. # PSGI my $app = sub { my $env = shift; return [ 200, [ ‘Content-Type’, ‘text/plain’ ], [ ‘Hello World’ ], ]; };
    46. 46. Aplicação PSGI code reference $app = sub {...};
    47. 47. my $app = sub { my $env = shift; return [ $status, $header, $body ]; };
    48. 48. hashref com o ambiente $env:Variáveis ao estilo CGI + psgi.input, psgi.errors, etc.
    49. 49. my $app = sub { my $env = shift; return [ $status, $header, $body ]; };
    50. 50. Resposta array ref com três elementos código HTTP, headers (array ref) e corpo da resposta (IO-like ou array ref)
    51. 51. my $app = sub { my $env = shift; return [ $status, $header, $body ]; };
    52. 52. $body IO::Handle-like getline() e close()
    53. 53. IO::Handle::Util Ajuda a converter uma coderef em algo parecido com um IO::Handle
    54. 54. E ainda...
    55. 55. Interface para streaming e/ou “non- blocking servers”
    56. 56. my $app = sub { my $env = shift; return sub { my $respond = shift; # Aqui podem delegar num event-loop estilo # POE ou AnyEvent para implementar cenas # tipo Comet $respond->([ $status, $header, $body ]); }; };
    57. 57. my $app = sub { my $env = shift; return sub { my $respond = shift; my $w = $respond->([ $status, $header ]); $w->write($body); $w->write($body); ... $w->close; }; };
    58. 58. Interface de Streaming Inicialmente desenhado para servidores “non-blocking” Já disponível para a maioria dos servidores incluindo CGI e Apache
    59. 59. Catalyst CGI::App Jifty Tatsumaki Plack::Middleware PSGI Plack::Handler::* (CGI, FCGI, Apache) Apache lighttpd HTTP::Server::PSGI mod_psgi Perlbal
    60. 60. E como estamos em termos de adopção do PSGI?
    61. 61. Maypole Mason Mojo Sledge Catalyst Spoon PageKit AxKit Egg Gantry Continuity Solstice Mojolicious Tripletail Konstrukt Reaction Jifty Cyclone3 WebGUI OpenInteract Squatting Dancer CGI::Application Nanoa Ark Angelos Noe Schenker Tatsumaki Amon Apache2::WebApp Web::Simple Apache2::REST SweetPea Hydrant Titanium
    62. 62. Maypole Mason Mojo Sledge Catalyst Spoon PageKit AxKit Egg Gantry Continuity Solstice Mojolicious Tripletail Konstrukt Reaction Jifty Cyclone3 WebGUI OpenInteract Squatting Dancer CGI::Application Nanoa Ark Angelos Noe Schenker Tatsumaki Amon Apache2::WebApp Web::Simple Apache2::REST SweetPea Hydrant Titanium
    63. 63. Aplicações Movable Type, WebGUI
    64. 64. # Catalyst use MyApp; MyApp->setup_engine(‘PSGI’); my $app = sub { MyApp->run(@_) }; # $app é uma aplicação PSGI!
    65. 65. # Jifty use MyPonyApp; my $app = MyPonyApp->psgi_app; # $app é uma aplicação PSGI!
    66. 66. # Dancer use Dancer; get ‘/’ => sub { “Hello World”; }; use Dancer::Config ‘setting’; setting apphandler => ‘PSGI’; my $app = sub { my $r = Dancer::Request->new(shift); Dancer->dance($r); }; # $app é uma aplicação PSGI!
    67. 67. # Mojolicious::Lite use Mojolicious::Lite; get ‘/:name’ => sub { my $self = shift; $self->render_text(‘Hello!’); }; shagadelic; # devolve uma aplicação PSGI
    68. 68. # Web::Simple use Web::Simple ‘MyApp’; package MyApp; dispatch { sub(GET) { [ 200, [...], [ ‘Hello’ ] ]; } }; my $app = MyApp->as_psgi; # $app é uma aplicação PSGI!
    69. 69. Então o que isto do Plack?
    70. 70. Plack “PSGI toolkit”
    71. 71. HTTP::Server::PSGI Implementação de referência de um servidor Web com suporte para PSGI, incluído de base com o Plack
    72. 72. Plack::Handler Liga aplicações PSGI a servidores Web via CGI, FastCGI, Apache, SCGI
    73. 73. Plackup Corre uma aplicação PSGI directamente a partir da linha de comandos
    74. 74. > plackup app.psgi
    75. 75. Bife+Salsicha+Linguiça +Fiambre
    76. 76. Middleware dos amantes da francesinha
    77. 77. my $app = sub { my $env = shift; return [ $status, $header, $body ]; }; my $mw = sub { my $env = shift; # do something with $env my $res = $app->($env); # do something with $res; return $res; };
    78. 78. Middleware Debug, Session, Logger, Runtime, Static, AccessLog, ConditionalGET, ErrorDocument, StackTrace, Auth::Basic, Auth::Digest, ReverseProxy, Refresh etc. (“Importado” via Rack & Paste)
    79. 79. Plack::Middleware framework extensível e reutilizável para criar Middleware Plack::Builder DSL para criar .psgi
    80. 80. my $app = sub { return [ $status, $header, $body ]; }; use Plack::Builder; builder { enable “Static”, root => “/htdocs”, path => qr!^/static/!; enable “Deflater”; # gzip/deflate $app; }
    81. 81. Compatível com plackup plackup -e ‘enable “Foo”;’ app.psgi
    82. 82. Plack::App::URLMap Multiplex de várias aplicações Integrado com a DSL do Builder (“Importado” do Rack)
    83. 83. use CatApp; use CGIApp; my $c1 = sub { CatApp->run }; my $c2 = sub { CGIApp->run_psgi }; use Plack::Builder; builder { mount “/cat” => $c1; mount “/cgi-app” => builder { enable “StackTrace”; $c2; }; }
    84. 84. CGI::PSGI Migração fácil para aplicações CGI.pm
    85. 85. CGI::Emulate::PSGI CGI::Compile A maneira mais fácil para migrar aplicações CGI.pm (tipo Registry do mod_perl)
    86. 86. Plack::Request semelhante ao libapreq (Apache::Request) APIs para developers de Middleware
    87. 87. Plack::Test Interface para escrever testes para apps PSGI suporta “mock” HTTP e “live” HTTP
    88. 88. use Plack::Test; use HTTP::Request::Common; my $app = sub { my $env = shift; return [ $status, $header, $body ]; }; test_psgi app => $app, client => sub { my $cb = shift; my $req = GET “http://localhost/foo”; my $res = $cb->($req); # test $res; };
    89. 89. use Plack::Test; use HTTP::Request::Common; $Plack::Test::Impl = “Server”; my $app = sub { my $env = shift; return [ $status, $header, $body ]; }; test_psgi app => $app, client => sub { my $cb = shift; my $req = GET “http://localhost/foo”; my $res = $cb->($req); # test $res; };
    90. 90. Servidores Web PSGI
    91. 91. Starman Servidor HTTP “Preforking” para UNIX (estilo Unicorn.rb) HTTP/1.1 chunk + keep-alives / “Estupidamente rápido”
    92. 92. Twiggy Servidor Web “non-blocking” (estilo Thin.rb) utiliza a framework AnyEvent
    93. 93. Corona Baseado no Coro.pm, utiliza co-rotinas para cada pedido
    94. 94. HTTP::Server::Simple::PSGI Servidor com o mínimo de dependências (apenas HTTP::Server::Simple) O melhor para correr aplicações sem outro servidor
    95. 95. nginx embedded perl http://github.com/yappo/nginx-psgi-patchs
    96. 96. mod_psgi http://github.com/spiritloose/mod_psgi
    97. 97. evpsgi http://github.com/sekimura/evpsgi
    98. 98. Perlbal plugin http://github.com/miyagawa/Perlbal-Plugin-PSGI
    99. 99. uWSGI http://projects.unbit.it/uwsgi/
    100. 100. Catalyst CGI::App Jifty Tatsumaki Plack::Middleware PSGI Plack::Handler::* (CGI, FCGI, Apache) Apache lighttpd HTTP::Server::PSGI mod_psgi Perlbal Starman Twiggy uWSGI Corona evpsgi
    101. 101. Podem começar a brincar com a coisa...
    102. 102. > cpanm Plack > cpanm Task::Plack
    103. 103. Cloud? (Heroku, GAE)
    104. 104. Sunaba http://sunaba.plackperl.org/
    105. 105. Corre numa “sandbox” do Dan Kogai
    106. 106. (.... ele confia muito na sua sandbox ....)
    107. 107. Desilusões para script kiddies system(“rm -fr /”); while (1) { }
    108. 108. Resumo • PSGI é o interface, Plack é uma implementação • Temos vários servidores PSGI, muito bons e bem rápidos • Temos adaptadores e ferramentas para a maioria das frameworks Web • Pronto a usar!
    109. 109. Processo • Partilhar é importante • Utilizar as ideias das outras comunidades é um bom inicio • Integrar algo com utilidade comprovada é excelente
    110. 110. Dúvidas?
    111. 111. Obrigado! Pedro Melo {mailto,xmpp}:melo@simplicidade.org http://github.com/miyagawa/Plack http://plackperl.org/ http://blog.plackperl.org/ irc://irc.perl.org/#plack

    ×