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.
Plack
O canivete suiço das Frameworks Web
       Original de Tatsuhiko Miyagawa
        Assassinado por Pedro Melo
Uma breve
 viagem...
Frameworks Web
    em Perl
Mil e uma maneiras de
escrever aplicações Web
Maypole Mason Mojo Sledge Catalyst Spoon
 PageKit AxKit Egg Gantry Continuity Solstice
 Mojolicious Tripletail Konstrukt R...
Algumas maneiras de
         correr
aplicações Web em Perl
CGI, FastCGI
& mod_perl
Por exemplo....
CGI.pm
Corre “fixe” em:
     CGI, FastCGI, mod_perl (1 & 2)
Standalone (usando HTTP::Server::Simple)
CGI.pm = MDC
     (máximo denominador comum)


Módulo Perl incluído de base
8803 linhas de código
   Versão inicial:
  Novembro 1995
:-(
CGI.PM
tem de ir
 com os
 porcos!!
(tou a brincar...)
Catalyst
A framework web em Perl que todas as vedetas usam
         (brinco de brilhantes estilo Ronaldo ou Quaresma não i...
Catalyst::Engine::*
     Adaptadores para servidores:
 Apache, FastCGI, Standalone e Prefork
CGI.pm
    Jifty, CGI::Application, Spoon


baseadas em mod_perl
  Mason, Sledge, PageKit, WebGUI


     Adaptadores
    C...
Problemas
Duplicação de esforços
 Difícil de comparar
     performance
Que tal partilhar
 esse código?
Algumas tentativas...
HTTP::Engine
Yappo, tokuhirom, nothingmuch e
           companhia
Vitória!
“Rouba-se” o código do Catalyst e cria-se
 uma biblioteca à parte. Tá feito! Siga pa
                 bingo!
Err... talvez não
  Um pedaço de código disforme, sem
separação de interface e implementação:
                “À cão”
Até que em
Setembro 2009...
miyagawa
http://www.flickr.com/photos/hanekomu/4518057694/
Episode IV:
A new hope
Que tal utilizar
 umas ideias fines
do Python e Ruby?
Posto de outra forma
      Vamos importar ideias
 estruturantes que provaram ser
  populares noutros contextos
 dinâmicos,...
“...A gente vai gamar a
      cena toda...”
WSGI (Python)
 Rack (Ruby)
WSGI (PEP-333)
WSGI
•   Django       •   mod_wsgi

•   Bottle       •   Paste

•   CherryPy     •   gunicorn

•   Tornado      •   uWSGI
...
Django              Bottle         Flask        Tornado


                                             WSGI middleware

  ...
Rack
Rack
•   Rails       •   Unicorn

•   Merb        •   Thin

•   Sinatra     •   Mongrel

•   Camping     •   Rainbows!

• ...
Rails              Merb          Sinatra     Ramaze


                                         Rack middleware

          ...
A prata da casa...
PSGI
Perl Web Server Gateway Interface
Interface++
Atenção!
   o próximo programa inclui
   cenas de Perl explicito, só
recomendadas a programadores
de Frameworks Perl, ou p...
# WSGI
def hello(environ, start_response):
 start_response(“200 OK”, [
   (‘Content-Type’, ‘text/plain’)
 ])
 return [“Hel...
# Rack
class Hello
 def call(env)
   return [
     200,
     { “Content-Type” => ”text/plain” },
     [“Hello World”]
   ]...
# PSGI
my $app = sub {
   my $env = shift;
   return [
      200,
      [ ‘Content-Type’, ‘text/plain’ ],
      [ ‘Hello W...
Aplicação PSGI
  code reference
  $app = sub {...};
my $app = sub {
   my $env = shift;
   return [ $status, $header, $body ];
};
hashref com o ambiente
   $env:Variáveis ao estilo CGI
   + psgi.input, psgi.errors, etc.
my $app = sub {
   my $env = shift;
   return [ $status, $header, $body ];
};
Resposta
      array ref com três elementos
    código HTTP, headers (array ref)
e corpo da resposta (IO-like ou array ref)
my $app = sub {
   my $env = shift;
   return [ $status, $header, $body ];
};
$body
 IO::Handle-like
getline() e close()
IO::Handle::Util
Ajuda a converter uma coderef em algo parecido com
                   um IO::Handle
E ainda...
Interface para
streaming e/ou “non-
  blocking servers”
my $app = sub {
  my $env = shift;
  return sub {
    my $respond = shift;
    # Aqui podem delegar num event-loop estilo
...
my $app = sub {
  my $env = shift;
  return sub {
    my $respond = shift;
    my $w = $respond->([ $status, $header ]);
 ...
Interface de Streaming
Inicialmente desenhado para servidores “non-blocking”
  Já disponível para a maioria dos servidores...
Catalyst            CGI::App              Jifty        Tatsumaki


                                                    Pla...
E como estamos em
termos de adopção do
        PSGI?
Maypole Mason Mojo Sledge Catalyst Spoon PageKit
 AxKit Egg Gantry Continuity Solstice Mojolicious
Tripletail Konstrukt Re...
Maypole Mason Mojo Sledge Catalyst Spoon PageKit
 AxKit Egg Gantry Continuity Solstice Mojolicious
Tripletail Konstrukt Re...
Aplicações
Movable Type, WebGUI
# Catalyst
use MyApp;

MyApp->setup_engine(‘PSGI’);
my $app = sub { MyApp->run(@_) };

# $app é uma aplicação PSGI!
# Jifty
use MyPonyApp;
my $app = MyPonyApp->psgi_app;

# $app é uma aplicação PSGI!
# Dancer
use Dancer;

get ‘/’ => sub {
   “Hello World”;
};

use Dancer::Config ‘setting’;
setting apphandler => ‘PSGI’;

m...
# Mojolicious::Lite
use Mojolicious::Lite;

get ‘/:name’ => sub {
   my $self = shift;
   $self->render_text(‘Hello!’);
};...
# Web::Simple
use Web::Simple ‘MyApp’;

package MyApp;
dispatch {
  sub(GET) {
    [ 200, [...], [ ‘Hello’ ] ];
  }
};

my...
Então o que isto do
      Plack?
Plack
“PSGI toolkit”
HTTP::Server::PSGI
 Implementação de referência de um
servidor Web com suporte para PSGI,
    incluído de base com o Plack
Plack::Handler
Liga aplicações PSGI a servidores Web
                  via
      CGI, FastCGI, Apache, SCGI
Plackup
Corre uma aplicação PSGI directamente a
      partir da linha de comandos
> plackup app.psgi
Bife+Salsicha+Linguiça
      +Fiambre
Middleware dos
amantes da francesinha
my $app = sub {
   my $env = shift;
   return [ $status, $header, $body ];
};

my $mw = sub {
   my $env = shift;
   # do ...
Middleware
 Debug, Session, Logger, Runtime, Static, AccessLog,
  ConditionalGET, ErrorDocument, StackTrace,
Auth::Basic, ...
Plack::Middleware
framework extensível e reutilizável para
            criar Middleware
   Plack::Builder DSL para criar ....
my $app = sub {
   return [ $status, $header, $body ];
};

use Plack::Builder;

builder {
  enable “Static”, root => “/htd...
Compatível com plackup
  plackup -e ‘enable “Foo”;’ app.psgi
Plack::App::URLMap
  Multiplex de várias aplicações
Integrado com a DSL do Builder
     (“Importado” do Rack)
use CatApp;
use CGIApp;

my $c1 = sub { CatApp->run };
my $c2 = sub { CGIApp->run_psgi };

use Plack::Builder;

builder {
...
CGI::PSGI
Migração fácil para aplicações CGI.pm
CGI::Emulate::PSGI
     CGI::Compile
A maneira mais fácil para migrar aplicações CGI.pm
          (tipo Registry do mod_pe...
Plack::Request
semelhante ao libapreq (Apache::Request)
  APIs para developers de Middleware
Plack::Test
Interface para escrever testes para apps
                  PSGI
  suporta “mock” HTTP e “live” HTTP
use Plack::Test;
use HTTP::Request::Common;

my $app = sub {
   my $env = shift;
   return [ $status, $header, $body ];
};...
use Plack::Test;
use HTTP::Request::Common;
$Plack::Test::Impl = “Server”;

my $app = sub {
   my $env = shift;
   return ...
Servidores Web PSGI
Starman
Servidor HTTP “Preforking” para UNIX (estilo Unicorn.rb)
 HTTP/1.1 chunk + keep-alives / “Estupidamente rápido”
Twiggy
Servidor Web “non-blocking” (estilo Thin.rb)
       utiliza a framework AnyEvent
Corona
Baseado no Coro.pm, utiliza co-rotinas para cada
                  pedido
HTTP::Server::Simple::PSGI
    Servidor com o mínimo de dependências
          (apenas HTTP::Server::Simple)
O melhor para...
nginx embedded perl
 http://github.com/yappo/nginx-psgi-patchs
mod_psgi
http://github.com/spiritloose/mod_psgi
evpsgi
http://github.com/sekimura/evpsgi
Perlbal plugin
http://github.com/miyagawa/Perlbal-Plugin-PSGI
uWSGI
http://projects.unbit.it/uwsgi/
Catalyst            CGI::App               Jifty        Tatsumaki


                                                     P...
Podem começar a
brincar com a coisa...
> cpanm Plack
> cpanm Task::Plack
Cloud?
(Heroku, GAE)
Sunaba
http://sunaba.plackperl.org/
Corre numa “sandbox”
    do Dan Kogai
(.... ele confia muito na
      sua sandbox ....)
Desilusões para script kiddies

    system(“rm -fr /”);
        while (1) { }
Resumo
• PSGI é o interface, Plack é uma
  implementação
• Temos vários servidores PSGI, muito bons
  e bem rápidos
• Temo...
Processo

• Partilhar é importante
• Utilizar as ideias das outras comunidades é
  um bom inicio
• Integrar algo com utili...
Dúvidas?
Obrigado!
            Pedro Melo
{mailto,xmpp}:melo@simplicidade.org


http://github.com/miyagawa/Plack
        http://pla...
Plack
Plack
Plack
Plack
Plack
Upcoming SlideShare
Loading in …5
×

Plack

4,194 views

Published on

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

Published in: Technology
  • Be the first to comment

  • Be the first to like this

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

×