Plack
Upcoming SlideShare
Loading in...5
×
 

Plack

on

  • 4,648 views

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

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

Statistics

Views

Total Views
4,648
Views on SlideShare
4,528
Embed Views
120

Actions

Likes
0
Downloads
27
Comments
0

2 Embeds 120

http://www.slideshare.net 87
http://blog.plackperl.org 33

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />

Plack Presentation Transcript

  • 1. Plack O canivete suiço das Frameworks Web Original de Tatsuhiko Miyagawa Assassinado por Pedro Melo
  • 2. Uma breve viagem...
  • 3. Frameworks Web em Perl
  • 4. Mil e uma maneiras de escrever aplicações Web
  • 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. Algumas maneiras de correr aplicações Web em Perl
  • 7. CGI, FastCGI & mod_perl
  • 8. Por exemplo....
  • 9. CGI.pm
  • 10. Corre “fixe” em: CGI, FastCGI, mod_perl (1 & 2) Standalone (usando HTTP::Server::Simple)
  • 11. CGI.pm = MDC (máximo denominador comum) Módulo Perl incluído de base
  • 12. 8803 linhas de código Versão inicial: Novembro 1995
  • 13. :-(
  • 14. CGI.PM tem de ir com os porcos!!
  • 15. (tou a brincar...)
  • 16. Catalyst A framework web em Perl que todas as vedetas usam (brinco de brilhantes estilo Ronaldo ou Quaresma não incluído)
  • 17. Catalyst::Engine::* Adaptadores para servidores: Apache, FastCGI, Standalone e Prefork
  • 18. CGI.pm Jifty, CGI::Application, Spoon baseadas em mod_perl Mason, Sledge, PageKit, WebGUI Adaptadores Catalyst, Maypole, Squatting
  • 19. Problemas
  • 20. Duplicação de esforços Difícil de comparar performance
  • 21. Que tal partilhar esse código?
  • 22. Algumas tentativas...
  • 23. HTTP::Engine Yappo, tokuhirom, nothingmuch e companhia
  • 24. Vitória! “Rouba-se” o código do Catalyst e cria-se uma biblioteca à parte. Tá feito! Siga pa bingo!
  • 25. Err... talvez não Um pedaço de código disforme, sem separação de interface e implementação: “À cão”
  • 26. Até que em Setembro 2009...
  • 27. miyagawa http://www.flickr.com/photos/hanekomu/4518057694/
  • 28. Episode IV: A new hope
  • 29. Que tal utilizar umas ideias fines do Python e Ruby?
  • 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. “...A gente vai gamar a cena toda...”
  • 32. WSGI (Python) Rack (Ruby)
  • 33. WSGI (PEP-333)
  • 34. WSGI • Django • mod_wsgi • Bottle • Paste • CherryPy • gunicorn • Tornado • uWSGI • Pylons • wsgiref • Flask • Google AppEngine
  • 35. Django Bottle Flask Tornado WSGI middleware WSGI wsgi handlers Apache lighttpd nginx mod_wsgi GAE
  • 36. Rack
  • 37. Rack • Rails • Unicorn • Merb • Thin • Sinatra • Mongrel • Camping • Rainbows! • Ramaze • Phusion Passenger • etc. • Heroku
  • 38. Rails Merb Sinatra Ramaze Rack middleware Rack Rack handlers Apache lighttpd Thin Unicorn Mongrel
  • 39. A prata da casa...
  • 40. PSGI Perl Web Server Gateway Interface
  • 41. Interface++
  • 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. # WSGI def hello(environ, start_response): start_response(“200 OK”, [ (‘Content-Type’, ‘text/plain’) ]) return [“Hello World”]
  • 44. # Rack class Hello def call(env) return [ 200, { “Content-Type” => ”text/plain” }, [“Hello World”] ] end end
  • 45. # PSGI my $app = sub { my $env = shift; return [ 200, [ ‘Content-Type’, ‘text/plain’ ], [ ‘Hello World’ ], ]; };
  • 46. Aplicação PSGI code reference $app = sub {...};
  • 47. my $app = sub { my $env = shift; return [ $status, $header, $body ]; };
  • 48. hashref com o ambiente $env:Variáveis ao estilo CGI + psgi.input, psgi.errors, etc.
  • 49. my $app = sub { my $env = shift; return [ $status, $header, $body ]; };
  • 50. Resposta array ref com três elementos código HTTP, headers (array ref) e corpo da resposta (IO-like ou array ref)
  • 51. my $app = sub { my $env = shift; return [ $status, $header, $body ]; };
  • 52. $body IO::Handle-like getline() e close()
  • 53. IO::Handle::Util Ajuda a converter uma coderef em algo parecido com um IO::Handle
  • 54. E ainda...
  • 55. Interface para streaming e/ou “non- blocking servers”
  • 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. 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. Interface de Streaming Inicialmente desenhado para servidores “non-blocking” Já disponível para a maioria dos servidores incluindo CGI e Apache
  • 59. Catalyst CGI::App Jifty Tatsumaki Plack::Middleware PSGI Plack::Handler::* (CGI, FCGI, Apache) Apache lighttpd HTTP::Server::PSGI mod_psgi Perlbal
  • 60. E como estamos em termos de adopção do PSGI?
  • 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. 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. Aplicações Movable Type, WebGUI
  • 64. # Catalyst use MyApp; MyApp->setup_engine(‘PSGI’); my $app = sub { MyApp->run(@_) }; # $app é uma aplicação PSGI!
  • 65. # Jifty use MyPonyApp; my $app = MyPonyApp->psgi_app; # $app é uma aplicação PSGI!
  • 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. # Mojolicious::Lite use Mojolicious::Lite; get ‘/:name’ => sub { my $self = shift; $self->render_text(‘Hello!’); }; shagadelic; # devolve uma aplicação PSGI
  • 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. Então o que isto do Plack?
  • 70. Plack “PSGI toolkit”
  • 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. Plack::Handler Liga aplicações PSGI a servidores Web via CGI, FastCGI, Apache, SCGI
  • 73. Plackup Corre uma aplicação PSGI directamente a partir da linha de comandos
  • 74. > plackup app.psgi
  • 75. Bife+Salsicha+Linguiça +Fiambre
  • 76. Middleware dos amantes da francesinha
  • 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. Middleware Debug, Session, Logger, Runtime, Static, AccessLog, ConditionalGET, ErrorDocument, StackTrace, Auth::Basic, Auth::Digest, ReverseProxy, Refresh etc. (“Importado” via Rack & Paste)
  • 79. Plack::Middleware framework extensível e reutilizável para criar Middleware Plack::Builder DSL para criar .psgi
  • 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. Compatível com plackup plackup -e ‘enable “Foo”;’ app.psgi
  • 82. Plack::App::URLMap Multiplex de várias aplicações Integrado com a DSL do Builder (“Importado” do Rack)
  • 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. CGI::PSGI Migração fácil para aplicações CGI.pm
  • 85. CGI::Emulate::PSGI CGI::Compile A maneira mais fácil para migrar aplicações CGI.pm (tipo Registry do mod_perl)
  • 86. Plack::Request semelhante ao libapreq (Apache::Request) APIs para developers de Middleware
  • 87. Plack::Test Interface para escrever testes para apps PSGI suporta “mock” HTTP e “live” HTTP
  • 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. 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. Servidores Web PSGI
  • 91. Starman Servidor HTTP “Preforking” para UNIX (estilo Unicorn.rb) HTTP/1.1 chunk + keep-alives / “Estupidamente rápido”
  • 92. Twiggy Servidor Web “non-blocking” (estilo Thin.rb) utiliza a framework AnyEvent
  • 93. Corona Baseado no Coro.pm, utiliza co-rotinas para cada pedido
  • 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. nginx embedded perl http://github.com/yappo/nginx-psgi-patchs
  • 96. mod_psgi http://github.com/spiritloose/mod_psgi
  • 97. evpsgi http://github.com/sekimura/evpsgi
  • 98. Perlbal plugin http://github.com/miyagawa/Perlbal-Plugin-PSGI
  • 99. uWSGI http://projects.unbit.it/uwsgi/
  • 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. Podem começar a brincar com a coisa...
  • 102. > cpanm Plack > cpanm Task::Plack
  • 103. Cloud? (Heroku, GAE)
  • 104. Sunaba http://sunaba.plackperl.org/
  • 105. Corre numa “sandbox” do Dan Kogai
  • 106. (.... ele confia muito na sua sandbox ....)
  • 107. Desilusões para script kiddies system(“rm -fr /”); while (1) { }
  • 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. Processo • Partilhar é importante • Utilizar as ideias das outras comunidades é um bom inicio • Integrar algo com utilidade comprovada é excelente
  • 110. Dúvidas?
  • 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