Your SlideShare is downloading. ×
0
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Plack
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Plack

3,778

Published on

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

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,778
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
28
Comments
0
Likes
0
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. 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

    ×