Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Upcoming SlideShare
Perl Instruments
Perl Instruments
Loading in …3
×
1 of 116

Plack

0

Share

Download to read offline

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

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

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

Editor's Notes





















































































































  • ×