SlideShare une entreprise Scribd logo
1  sur  183
I Client Web in Perl
http://
polettix.s3.amazonaws.com
      /tmp/pwc.tar.gz
LWP::Simple
LWP::Simple::getprint


perl -MLWP::Simple -e 
 'getprint("http://www.perl.it")'
LWP::Simple::getprint


perl -MLWP::Simple -e 
  'getprint("http://www.perl.it")'
LWP::Simple::getprint


perl -MLWP::Simple -e 
  'getprint("http://www.perl.it")'
LWP::Simple::getstore

perl -MLWP::Simple -e 
  'getstore("http://www.perl.it",
      "index.html")'
LWP::Simple::getstore

perl -MLWP::Simple -e 
  'getstore("http://www.perl.it",
      "index.html")'
LWP::Simple::get

use LWP::Simple 'get';
my $pagina = get('http://www.perl.it')
  // die "errore!";
say $pagina =~ 'polettix' ? 'OK!!!'
                         : 'No!!!';
LWP::Simple::get

use LWP::Simple 'get';
my $pagina = get('http://www.perl.it')
  // die "errore!";
say $pagina =~ 'polettix' ? 'OK!!!'
                         : 'No!!!';
LWP::Simple::get

use LWP::Simple 'get';
my $pagina = get('http://www.perl.it')
   // die "errore!";
say $pagina =~ 'polettix' ? 'OK!!!'
                         : 'No!!!';
LWP::Simple::get

use LWP::Simple 'get';
my $pagina = get('http://www.perl.it')
   // die "errore!";
say $pagina =~ 'polettix' ? 'OK!!!'
                         : 'No!!!';

      Perl 5.10
LWP::UserAgent
LWP::UserAgent

use LWP::UserAgent;
my $ua = LWP::UserAgent->new(
     user_agent => 'BrowsHer/1.0',
     timeout   => 10,
);
LWP::UserAgent::new

use LWP::UserAgent;
my $ua = LWP::UserAgent->new(
     user_agent => 'BrowsHer/1.0',
     timeout   => 10,
);
LWP::UserAgent::new

use LWP::UserAgent;
my $ua = LWP::UserAgent->new(
     user_agent => 'BrowsHer/1.0',
     timeout   => 10,
);
LWP::UserAgent::new

use LWP::UserAgent;
my $ua = LWP::UserAgent->new(
     user_agent => 'BrowsHer/1.0',
     timeout    => 10,
);
GET


my $uri = 'http://www.perl.it';
my $risposta = $ua->get($uri);
GET


my $uri = 'http://www.perl.it';
my $risposta = $ua->get($uri);


    HTTP::Response
HTTP::Response
HTTP::Response
if ($response->is_success()) {
   say "OK, ho scaricato:n",
      $response->content();
}
HTTP::Response
if ($response->is_success()) {
   say "OK, ho scaricato:n",
      $response->content();
}
elsif ($response->is_error()) {
   say "errore: ",
      $response->status_line();
}
HTTP::Response
HTTP::Response
is_success()
       is_redirect()
 is_info()
        is_error()
HTTP::Response

is_success()
is_error()
HTTP::Response


is_success()
HTTP::Response
if ($response->is_success()) {
   say "OK, ho scaricato:n",
      $response->content();
}
elsif ($response->is_error()) {
   say "errore: ",
      $response->status_line();
}
HTTP::Response
if ($response->is_success()) {
   say "OK, ho scaricato:n",
      $response->decoded_content();
}
elsif ($response->is_error()) {
   say "errore: ",
      $response->status_line();
}
HTTP::Response
if ($response->is_success()) {
   say "OK, ho scaricato:n",
      $response->decoded_content();
}
elsif ($response->is_error()) {
   say "errore: ",
      $response->status_line();
}
HTTP Status Line
HTTP Status Line
 200 OK
HTTP Status Line
    200 OK
307 Temporary Redirect
HTTP Status Line
      200 OK
307 Temporary Redirect
403 Forbidden
HTTP Status Line
      200 OK
307 Temporary Redirect
403 Forbidden
                404 Not Found
HTTP Status Line
      200 OK
307 Temporary Redirect
403 Forbidden
                404 Not Found
500 Internal Server Error
HTTP Status Line
      200 OK
307 Temporary Redirect
403 Forbidden
                404 Not Found
500 Internal Server Error
                   ...
Form con GET
Form con GET

my $base =
   'http://www.google.com';
Form con GET

my $base =
   'http://www.google.com';
my $url = "$base?q=perl";
Form con GET

my $base =
   'http://www.google.com';
my $url = "$base?q=perl";
my $risposta = $ua->get($url);
Attenzione!
Attenzione!


my $query = 'sam & max';
Attenzione!


my $query = 'sam & max';
my $url = "$base?q=$query";
Attenzione!

          t
         a eo
        d r
       n b
      a m
my $query = 'sam & max';

   m te
  i t
my $url = "$base?q=$query";
 R e
  a S
Attenzione!


my $query = 'sam & max';
my $url = "$base?q=$query";
Attenzione!
         Caratteri Speciali


my $query = 'sam & max';
my $url = "$base?q=$query";
NN FUNZIONA!
Dov’è urlencode()?
Ma in PHP c’è!!!
A T O
        C I
Ma in PHP c’è!!!
      C
B O
use URI;
use URI;
my %parametri = (
   nome    => 'Flavio',
   cognome => 'Poletti',
);
my $uri = URI->new(
   'http://roma.pm.org/cerca.pl');
$uri->query_form(%parametri);
use URI;
use URI;
my %parametri = (
   nome    => 'Flavio',
   cognome => 'Poletti',
);
my $uri = URI->new(
   'http://roma.pm.org/cerca.pl');
$uri->query_form(%parametri);
use URI;
use URI;
my %parametri = (
   nome    => 'Flavio',
   cognome => 'Poletti',
);
my $uri = URI->new(
   'http://roma.pm.org/cerca.pl');
$uri->query_form(%parametri);
use URI;
my $uri_string =
   $uri->as_string();
my $risposta =
   $ua->get($uri_string);
# oppure...
my $risposta =
   $ua->get("$uri");
use URI;
my $uri_string =
   $uri->as_string();
my $risposta =
   $ua->get($uri_string);
# oppure...
my $risposta =
   $ua->get("$uri");
use URI;
my $uri_string =
   $uri->as_string();
my $risposta =
   $ua->get($uri_string);
# oppure...
my $risposta =
   $ua->get("$uri");
use URI;
my $uri_string =
   $uri->as_string();
my $risposta =
   $ua->get($uri_string);
# oppure...
my $risposta =
   $ua->get("$uri");
POST
my %parametri = (
   nome    => 'Flavio',
   cognome => 'Poletti',
);
my $risposta = $ua->post(
   'http://www.perl.it/post.pl',
   %parametri,
   'X-New' => 1);
POST
my %parametri = (
   nome    => 'Flavio',
   cognome => 'Poletti',
);
my $risposta = $ua->post(
   'http://www.perl.it/post.pl',
   %parametri,
   'X-New' => 1);
POST
my %parametri = (
   nome    => 'Flavio',
   cognome => 'Poletti',
);
my $risposta = $ua->post(
   'http://www.perl.it/post.pl',
   %parametri,
   'X-New' => 1);
POST
my %parametri = (
   nome    => 'Flavio',
   cognome => 'Poletti',
);
my $risposta = $ua->post(
   'http://www.perl.it/post.pl',
   %parametri,
   'X-New' => 1);
POST
my %parametri = (
   nome    => 'Flavio',
   cognome => 'Poletti',
);
my $risposta = $ua->post(
   'http://www.perl.it/post.pl',
   %parametri,
   'X-New' => 1);
HTTP::Request
F M
HTTP::Request
   T
R
F M
HTTP::Request
   T
R
    Friendly
Autenticazione?
credentials()

my   $server   =   'roma.pm.org:80';
my   $realm    =   'Orticello';
my   $utente   =   'giardiniere';
my   $pass     =   'ciclamino';
$ua->credentials($server,
   $realm, $utente, $pass);
credentials()

my   $server   =   'roma.pm.org:80';
my   $realm    =   'Orticello';
my   $utente   =   'giardiniere';
my   $pass     =   'ciclamino';
$ua->credentials($server,
   $realm, $utente, $pass);
credentials()

my   $server   =   'roma.pm.org:80';
my   $realm    =   'Orticello';
my   $utente   =   'giardiniere';
my   $pass     =   'ciclamino';
$ua->credentials($server,
   $realm, $utente, $pass);
Proxy?
env_proxy
# nella shell...
bash$ export 
   http_proxy='http://ex.com:8080'


# nel codice...
my $ua = LWP::UserAgent->new(
   # ...
   env_proxy => 1,
);
env_proxy
# nella shell...
bash$ export 
   http_proxy='http://ex.com:8080'


# nel codice...
my $ua = LWP::UserAgent->new(
   # ...
   env_proxy => 1,
);
env_proxy()
# nella shell...
bash$ export 
   http_proxy='http://ex.com:8080'


# nel codice...
$ua->env_proxy();
proxy()

$ua->proxy(http => 'http://ex.com:80');


$ua->proxy(
   [qw( ftp gopher )]
   => 'http://dovetipare.it:80'
);
proxy()

$ua->proxy(http => 'http://ex.com:80');


$ua->proxy(
   [qw( ftp gopher )]
   => 'http://dovetipare.it:80'
);
proxy()

$ua->proxy(http => 'http://ex.com:80');


$ua->proxy(
   [qw( ftp gopher )]
   => 'http://dovetipare.it:80'
);
SSL?
Crypt::SSLeay
Crypt::SSLeay
                    na !
             ortu
         a F
    Bu on
Cookies?
LWP::UserAgent::new
Re
                           lo
LWP::UserAgent::new             ad
                                  ed




my $ua = LWP::UserAgent->new(
   cookie_jar => {}
);
cookie_jar()

use HTTP::Cookies::Mozilla;
my $jar = HTTP::Cookies::Mozilla->new(
   file => '/profilo/cookies.sqlite');
$ua->cookie_jar($jar);
cookie_jar()

use HTTP::Cookies::Mozilla;
my $jar = HTTP::Cookies::Mozilla->new(
   file => '/profilo/cookies.sqlite');
$ua->cookie_jar($jar);
cookie_jar()

use HTTP::Cookies::Mozilla;
my $jar = HTTP::Cookies::Mozilla->new(
   file => '/profilo/cookies.sqlite');
$ua->cookie_jar($jar);
WWW::Mechanize
WWW::Mechanize




                 www.z-design.it
new()
use WWW::Mechanize;
my $mech = WWW::Mechanize->new(
   user_agent => 'BrowsHer/1.0',
   timeout     => 10,
   env_proxy   => 1,
   autocheck   => 1,
   stack_depth => 40,
);
new()
use WWW::Mechanize;
my $mech = WWW::Mechanize->new(
   user_agent => 'BrowsHer/1.0',
   timeout     => 10,
   env_proxy   => 1,
   autocheck   => 1,
   stack_depth => 40,
);
autocheck

eval {
   $mech->get($uri);
   # ...
   $mech->post($altra_uri);
   1;
} or say "errore: $@";
autocheck

eval {
   $mech->get($uri);
   # ...
   $mech->post($altra_uri);
   1;
} or say "errore: $@";
autocheck

eval {
   $mech->get($uri);
   # ...
   $mech->post($altra_uri);
   1;
} or say "errore: $@";
new()
use WWW::Mechanize;
my $mech = WWW::Mechanize->new(
   user_agent => 'BrowsHer/1.0',
   timeout     => 10,
   env_proxy   => 1,
   autocheck   => 1,
   stack_depth => 40,
);
$mech->back()
$mech->request()
$mech->response()
$mech->success()
$mech->status()
$mech->content()
$mech->content()
$mech->links()

for my $link ($mech->links()) {
    say $link->url_abs();
}
$mech->links()

for my $link ($mech->links()) {
    say $link->url_abs();
}
find_link()

my $perlit = $mech->find_link(
     text => 'Perl.it',
);
find_link()

my $perlit = $mech->find_link(
     text_regex => qr/perl.it/i,
);
find_link()

n text_regex
url_regex url_abs_regex
name_regex id_regex
class_regex tag_regex
find_all_links()

n text_regex
url_regex url_abs_regex
name_regex id_regex
class_regex tag_regex
$mech->images()
for my $immagine ($mech->images()) {
    $mech->get($immagine->url());
    my $filename =
       $mech->response()->filename();
    $mech->save_content($filename);
}
$mech->images()
for my $immagine ($mech->images()) {
    $mech->get($immagine->url());
    my $filename =
       $mech->response()->filename();
    $mech->save_content($filename);
}
$mech->images()
for my $immagine ($mech->images()) {
    $mech->get($immagine->url());
    my $filename =
       $mech->response()->filename();
    $mech->save_content($filename);
}
$mech->images()
for my $immagine ($mech->images()) {
    $mech->get($immagine->url());
    my $filename =
       $mech->response()->filename();
    $mech->save_content($filename);
}
find_image()

n alt_regex
url_regex url_abs_regex
tag_regex
find_all_images()

n alt_regex
url_regex url_abs_regex
tag_regex
$mech->forms()
$mech
->form_number(3)
$mech
->form_name('Hi')
$mech
->form_id('C1P8')
$mech
->form_with_fields(
 qw( user pass ) )
Una volta selezionato...
$mech->field(
   domain => 'polettix.it');
$mech->set_fields(
   username => 'flavio',
   password => 'poletti',);
$mech->select(
   mongers => 'Roma.pm');
$mech->tick(mailing_list_subscriber => 1);
$mech->untick(wants_spam => 1);
$mech->submit();
Una volta selezionato...
$mech->field(
   domain => 'polettix.it');
$mech->set_fields(
   username => 'flavio',
   password => 'poletti',);
$mech->select(
   mongers => 'Roma.pm');
$mech->tick(mailing_list_subscriber => 1);
$mech->untick(wants_spam => 1);
$mech->submit();
Una volta selezionato...
$mech->field(
   domain => 'polettix.it');
$mech->set_fields(
   username => 'flavio',
   password => 'poletti',);
$mech->select(
   mongers => 'Roma.pm');
$mech->tick(mailing_list_subscriber => 1);
$mech->untick(wants_spam => 1);
$mech->submit();
Una volta selezionato...
$mech->field(
   domain => 'polettix.it');
$mech->set_fields(
   username => 'flavio',
   password => 'poletti',);
$mech->select(
   mongers => 'Roma.pm');
$mech->tick(mailing_list_subscriber => 1);
$mech->untick(wants_spam => 1);
$mech->submit();
Una volta selezionato...
$mech->field(
   domain => 'polettix.it');
$mech->set_fields(
   username => 'flavio',
   password => 'poletti',);
$mech->select(
   mongers => 'Roma.pm');
$mech->tick(mailing_list_subscriber => 1);
$mech->untick(wants_spam => 1);
$mech->submit();
Una volta selezionato...
$mech->field(
   domain => 'polettix.it');
$mech->set_fields(
   username => 'flavio',
   password => 'poletti',);
$mech->select(
   mongers => 'Roma.pm');
$mech->tick(mailing_list_subscriber => 1);
$mech->untick(wants_spam => 1);
$mech->submit();
Per pigri
$mech->submit_form(
     with_fields   =>   {
        domain     =>   'roma.pm.org',
        username   =>   'flavio',
        password   =>   'poletti',
     },
);
Controllo
Maggiore
downlink
Applicazione




  Client       Server
Applicazione




  Client       Server
Applicazione




  Client       Server
Applicazione




  Client       Server
Applicazione




  Client       Server
Applicazione




  Client       Server
Applicazione




  Client       Server
Applicazione




  Client       Server
Applicazione




  Client       Server
Applicazione




  Client       Server
Applicazione




  Client       Server
Applicazione




  Client       Server
Applicazione




  Client       Server
Applicazione




  Client       Server
$ua->progress()
package My::LWP::UserAgent;
use base 'LWP::UserAgent';
sub progress {
    my ( $self, $status, $r ) = @_;
    print {*STDERR} "$statusn";
    print {*STDOUT} $r->content()
       if $status eq 'end';
    return 1
}
$ua->progress()
package My::LWP::UserAgent;
use base 'LWP::UserAgent';
sub progress {
    my ( $self, $status, $r ) = @_;
    print {*STDERR} "$statusn";
    print {*STDOUT} $r->content()
       if $status eq 'end';
    return 1
}
$ua->progress()
package My::LWP::UserAgent;
use base 'LWP::UserAgent';
sub progress {
    my ( $self, $status, $r ) = @_;
    print {*STDERR} "$statusn";
    print {*STDOUT} $r->content()
       if $status eq 'end';
    return 1
}
$ua->progress()
package My::LWP::UserAgent;
use base 'LWP::UserAgent';
sub progress {
    my ( $self, $status, $r ) = @_;
    print {*STDERR} "$statusn";
    print {*STDOUT} $r->content()
       if $status eq 'end';
    return 1
}
$ua->progress()
package My::LWP::UserAgent;
use base 'LWP::UserAgent';
sub progress {
    my ( $self, $status, $r ) = @_;
    print {*STDERR} "$statusn";
    print {*STDOUT} $r->content()
       if $status eq 'end';
    return 1
}
$ua->progress()
package My::LWP::UserAgent;
use base 'LWP::UserAgent';
sub progress {
    my ( $self, $status, $r ) = @_;
    print {*STDERR} "$statusn";
    print {*STDOUT} $r->content()
       if $status eq 'end';
    return 1
}
$ua->progress()
package My::LWP::UserAgent;
use base 'LWP::UserAgent';
sub progress {
    my ( $self, $status, $r ) = @_;
    print {*STDERR} "$statusn";
    print {*STDOUT} $r->content()
       if $status eq 'end';
    return 1
}
:content_cb
callback
callback
sub produci_callback {
    my ($filename) = @_;
    open my $fh, ’>’, $filename
       or die "open(’$filename’): $!";
    binmode $fh;
    return sub {
         my ($data, $response, $protocol) = @_;
         print {$fh} $data;
    };
}
:content_cb

my $response = $ua->get(
   'http://roma.pm.org/roma.pm.png',
   ':content_cb' =>
      produci_callback('logo.png'));
callback
sub produci_callback {
    # ...
    return sub {
         my ($data, $response,
             $protocol) = @_;
         # ...
    };
}
uplink
Applicazione




  Client       Server
Applicazione




  Client       Server
Applicazione




  Client       Server
Upload di un file
my $uri =
   'http://localhost/upload.pl';
my %parametri = (
   blah => ’questo-server’,
   data => scalar(localtime()),
   file => [ ’/etc/passwd’ ],
);
Upload controllato
my $r; # per la risposta
{
    local $HTTP::Request::Common::DYNAMIC_FILE_UPLOAD;
    $HTTP::Request::Common::DYNAMIC_FILE_UPLOAD = 1;
    my $request = HTTP::Request::Common::POST($uri,
       %parametri, ’Content-Type’ => ’form-data’);
    # ...
Upload controllato
my $r; # per la risposta
{
    local $HTTP::Request::Common::DYNAMIC_FILE_UPLOAD;
    $HTTP::Request::Common::DYNAMIC_FILE_UPLOAD = 1;
    my $request = HTTP::Request::Common::POST($uri,
       %parametri, ’Content-Type’ => ’form-data’);
    # ...
Upload controllato
my $r; # per la risposta
{
    local $HTTP::Request::Common::DYNAMIC_FILE_UPLOAD;
    $HTTP::Request::Common::DYNAMIC_FILE_UPLOAD = 1;
    my $request = HTTP::Request::Common::POST($uri,
       %parametri, ’Content-Type’ => ’form-data’);
    # ...
Upload controllato
my $content_closure = $request->content();
$request->content(sub {
   my $porzione = $content_closure->();
   return unless defined $porzione;
   # ...
   return $porzione;
});
Upload controllato
      $HTTP::Request::Common::DYNAMIC_FILE_UPLOAD = 1

my $content_closure = $request->content();
$request->content(sub {
   my $porzione = $content_closure->();
   return unless defined $porzione;
   # ...
   return $porzione;
});
Upload controllato
my $content_closure = $request->content();
$request->content(sub {
   my $porzione = $content_closure->();
   return unless defined $porzione;
   # ...
   return $porzione;
});
Upload controllato
      $HTTP::Request::Common::DYNAMIC_FILE_UPLOAD = 1

my $content_closure = $request->content();
$request->content(sub {
   my $porzione = $content_closure->();
   return unless defined $porzione;
   # ...
   return $porzione;
});
Upload controllato
my $content_closure = $request->content();
$request->content(sub {
   my $porzione = $content_closure->();
   return unless defined $porzione;
   # ...
   return $porzione;
});
Upload controllato
my $content_closure = $request->content();
$request->content(sub {
      my $porzione = $content_closure->();
   return unless defined $porzione;
   # ...
   return $porzione;
});
Upload controllato
my $content_closure = $request->content();
$request->content(sub {
   my $porzione = $content_closure->();
   return unless defined $porzione;
   # ...
      return $porzione;
});
Upload controllato


    $r = $ua->request($request);
}
Upload controllato


    $r = $ua->request($request);
}
Upload controllato


    $r = $ua->request($request);




    !
}
Upload controllato
my $r; # per la risposta
{
    local $HTTP::Request::Common::DYNAMIC_FILE_UPLOAD;
    $HTTP::Request::Common::DYNAMIC_FILE_UPLOAD = 1;
    #...
    $r = $ua->request($request);
}
WWW::Mechanize::Shell
W::M::Shell


shell$ perl -MWWW::Mechanize::Shell 
          -e shell
(no url)>
W::M::Shell

(no url)> get http://www.zooomr.com/login/
Retrieving http://www.zooomr.com/login/(200)
http://www.zooomr.com/login/>
W::M::Shell
http://www.zooomr.com/login/>forms
Form [1]
GET http://www.zooomr.com/search/people/
  q=Find Friends! (text)
Form [2]
POST http://www.zooomr.com/recovery/ [f1]
  email= (text)
  <NONAME>=Retrieve Password (submit)
  gogogo=1 (hidden readonly)
Form [3]
POST http://www.zooomr.com/login/ [f2]
  gogogo=1 (hidden readonly)
  redirect_to=http://www.zooomr.com/ (hidden readonly)
  username= (text)
  password= (password)
  <NONAME>=Let’s Go Exploring! (submit)
  <NONAME>=<UNDEF> (button)
  processlogin=1 (hidden readonly)
W::M::Shell
http://www.zooomr.com/login/>form 3
POST http://www.zooomr.com/login/ [f2]
 gogogo=1 (hidden readonly)
  redirect_to=http://www.zooomr.com/ (hidden
readonly)
  username= (text)
  password= (password)
 <NONAME>=Let’s Go Exploring! (submit)
 <NONAME>=<UNDEF> (button)
 processlogin=1 (hidden readonly)
W::M::Shell
http://www.zooomr.com/login/>value username polettix
http://www.zooomr.com/login/>value password pippo
http://www.zooomr.com/login/>form 3
POST http://www.zooomr.com/login/ [f2]
gogogo=1 (hidden readonly)
redirect_to=http://www.zooomr.com/ (hidden readonly)
username=polettix (text)
password=pippo (password)
<NONAME>=Let’s Go Exploring! (submit)
<NONAME>=<UNDEF> (button)
processlogin=1 (hidden readonly)
W::M::Shell



...>click
W::M::Shell



...>script session.pl
HTTP::Recorder
Perl Web Client

Contenu connexe

Tendances

Introducing Assetic (NYPHP)
Introducing Assetic (NYPHP)Introducing Assetic (NYPHP)
Introducing Assetic (NYPHP)Kris Wallsmith
 
Webrtc mojo
Webrtc mojoWebrtc mojo
Webrtc mojobpmedley
 
Introduction to CloudForecast / YAPC::Asia 2010 Tokyo
Introduction to CloudForecast / YAPC::Asia 2010 TokyoIntroduction to CloudForecast / YAPC::Asia 2010 Tokyo
Introduction to CloudForecast / YAPC::Asia 2010 TokyoMasahiro Nagano
 
Design Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleDesign Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleHugo Hamon
 
News of the Symfony2 World
News of the Symfony2 WorldNews of the Symfony2 World
News of the Symfony2 WorldFabien Potencier
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & RESTHugo Hamon
 
Perl web frameworks
Perl web frameworksPerl web frameworks
Perl web frameworksdiego_k
 
The History of PHPersistence
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistenceHugo Hamon
 
Looping the Loop with SPL Iterators
Looping the Loop with SPL IteratorsLooping the Loop with SPL Iterators
Looping the Loop with SPL IteratorsMark Baker
 
Database Design Patterns
Database Design PatternsDatabase Design Patterns
Database Design PatternsHugo Hamon
 
Models and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and HobgoblinsModels and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and HobgoblinsRoss Tuck
 
The Zen of Lithium
The Zen of LithiumThe Zen of Lithium
The Zen of LithiumNate Abele
 
The promise of asynchronous php
The promise of asynchronous phpThe promise of asynchronous php
The promise of asynchronous phpWim Godden
 
Perl Bag of Tricks - Baltimore Perl mongers
Perl Bag of Tricks  -  Baltimore Perl mongersPerl Bag of Tricks  -  Baltimore Perl mongers
Perl Bag of Tricks - Baltimore Perl mongersbrian d foy
 
Symfony components in the wild, PHPNW12
Symfony components in the wild, PHPNW12Symfony components in the wild, PHPNW12
Symfony components in the wild, PHPNW12Jakub Zalas
 
Command Bus To Awesome Town
Command Bus To Awesome TownCommand Bus To Awesome Town
Command Bus To Awesome TownRoss Tuck
 
Symfony War Stories
Symfony War StoriesSymfony War Stories
Symfony War StoriesJakub Zalas
 

Tendances (20)

Introducing Assetic (NYPHP)
Introducing Assetic (NYPHP)Introducing Assetic (NYPHP)
Introducing Assetic (NYPHP)
 
Webrtc mojo
Webrtc mojoWebrtc mojo
Webrtc mojo
 
Introduction to CloudForecast / YAPC::Asia 2010 Tokyo
Introduction to CloudForecast / YAPC::Asia 2010 TokyoIntroduction to CloudForecast / YAPC::Asia 2010 Tokyo
Introduction to CloudForecast / YAPC::Asia 2010 Tokyo
 
Design Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleDesign Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et Pimple
 
News of the Symfony2 World
News of the Symfony2 WorldNews of the Symfony2 World
News of the Symfony2 World
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & REST
 
Perl web frameworks
Perl web frameworksPerl web frameworks
Perl web frameworks
 
The History of PHPersistence
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistence
 
PHP 5.4
PHP 5.4PHP 5.4
PHP 5.4
 
Looping the Loop with SPL Iterators
Looping the Loop with SPL IteratorsLooping the Loop with SPL Iterators
Looping the Loop with SPL Iterators
 
Database Design Patterns
Database Design PatternsDatabase Design Patterns
Database Design Patterns
 
Models and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and HobgoblinsModels and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and Hobgoblins
 
The Zen of Lithium
The Zen of LithiumThe Zen of Lithium
The Zen of Lithium
 
The promise of asynchronous php
The promise of asynchronous phpThe promise of asynchronous php
The promise of asynchronous php
 
Symfony 2.0 on PHP 5.3
Symfony 2.0 on PHP 5.3Symfony 2.0 on PHP 5.3
Symfony 2.0 on PHP 5.3
 
Perl Bag of Tricks - Baltimore Perl mongers
Perl Bag of Tricks  -  Baltimore Perl mongersPerl Bag of Tricks  -  Baltimore Perl mongers
Perl Bag of Tricks - Baltimore Perl mongers
 
Perl6 in-production
Perl6 in-productionPerl6 in-production
Perl6 in-production
 
Symfony components in the wild, PHPNW12
Symfony components in the wild, PHPNW12Symfony components in the wild, PHPNW12
Symfony components in the wild, PHPNW12
 
Command Bus To Awesome Town
Command Bus To Awesome TownCommand Bus To Awesome Town
Command Bus To Awesome Town
 
Symfony War Stories
Symfony War StoriesSymfony War Stories
Symfony War Stories
 

Similaire à Perl Web Client

Mojolicious. Веб в коробке!
Mojolicious. Веб в коробке!Mojolicious. Веб в коробке!
Mojolicious. Веб в коробке!Anatoly Sharifulin
 
20 modules i haven't yet talked about
20 modules i haven't yet talked about20 modules i haven't yet talked about
20 modules i haven't yet talked aboutTatsuhiko Miyagawa
 
Forget about index.php and build you applications around HTTP!
Forget about index.php and build you applications around HTTP!Forget about index.php and build you applications around HTTP!
Forget about index.php and build you applications around HTTP!Kacper Gunia
 
エロサイト管理者の憂鬱3 - Hokkaiodo.pm#4 -
エロサイト管理者の憂鬱3 - Hokkaiodo.pm#4 -エロサイト管理者の憂鬱3 - Hokkaiodo.pm#4 -
エロサイト管理者の憂鬱3 - Hokkaiodo.pm#4 -Yusuke Wada
 
Forget about Index.php and build you applications around HTTP - PHPers Cracow
Forget about Index.php and build you applications around HTTP - PHPers CracowForget about Index.php and build you applications around HTTP - PHPers Cracow
Forget about Index.php and build you applications around HTTP - PHPers CracowKacper Gunia
 
Perl web app 테스트전략
Perl web app 테스트전략Perl web app 테스트전략
Perl web app 테스트전략Jeen Lee
 
Kansai.pm 10周年記念 Plack/PSGI 入門
Kansai.pm 10周年記念 Plack/PSGI 入門Kansai.pm 10周年記念 Plack/PSGI 入門
Kansai.pm 10周年記念 Plack/PSGI 入門lestrrat
 
Micropage in microtime using microframework
Micropage in microtime using microframeworkMicropage in microtime using microframework
Micropage in microtime using microframeworkRadek Benkel
 
[PL] Jak nie zostać "programistą" PHP?
[PL] Jak nie zostać "programistą" PHP?[PL] Jak nie zostać "programistą" PHP?
[PL] Jak nie zostać "programistą" PHP?Radek Benkel
 
Selenium sandwich-3: Being where you aren't.
Selenium sandwich-3: Being where you aren't.Selenium sandwich-3: Being where you aren't.
Selenium sandwich-3: Being where you aren't.Workhorse Computing
 
Bag Of Tricks From Iusethis
Bag Of Tricks From IusethisBag Of Tricks From Iusethis
Bag Of Tricks From IusethisMarcus Ramberg
 
Intro To Moose
Intro To MooseIntro To Moose
Intro To MoosecPanel
 
Unit and Functional Testing with Symfony2
Unit and Functional Testing with Symfony2Unit and Functional Testing with Symfony2
Unit and Functional Testing with Symfony2Fabien Potencier
 
Dirty Secrets of the PHP SOAP Extension
Dirty Secrets of the PHP SOAP ExtensionDirty Secrets of the PHP SOAP Extension
Dirty Secrets of the PHP SOAP ExtensionAdam Trachtenberg
 
Aura Project for PHP
Aura Project for PHPAura Project for PHP
Aura Project for PHPHari K T
 
AnyMQ, Hippie, and the real-time web
AnyMQ, Hippie, and the real-time webAnyMQ, Hippie, and the real-time web
AnyMQ, Hippie, and the real-time webclkao
 
Advanced modulinos
Advanced modulinosAdvanced modulinos
Advanced modulinosbrian d foy
 

Similaire à Perl Web Client (20)

Mojolicious. Веб в коробке!
Mojolicious. Веб в коробке!Mojolicious. Веб в коробке!
Mojolicious. Веб в коробке!
 
Blog Hacks 2011
Blog Hacks 2011Blog Hacks 2011
Blog Hacks 2011
 
20 modules i haven't yet talked about
20 modules i haven't yet talked about20 modules i haven't yet talked about
20 modules i haven't yet talked about
 
Forget about index.php and build you applications around HTTP!
Forget about index.php and build you applications around HTTP!Forget about index.php and build you applications around HTTP!
Forget about index.php and build you applications around HTTP!
 
エロサイト管理者の憂鬱3 - Hokkaiodo.pm#4 -
エロサイト管理者の憂鬱3 - Hokkaiodo.pm#4 -エロサイト管理者の憂鬱3 - Hokkaiodo.pm#4 -
エロサイト管理者の憂鬱3 - Hokkaiodo.pm#4 -
 
Forget about Index.php and build you applications around HTTP - PHPers Cracow
Forget about Index.php and build you applications around HTTP - PHPers CracowForget about Index.php and build you applications around HTTP - PHPers Cracow
Forget about Index.php and build you applications around HTTP - PHPers Cracow
 
Perl web app 테스트전략
Perl web app 테스트전략Perl web app 테스트전략
Perl web app 테스트전략
 
Daily notes
Daily notesDaily notes
Daily notes
 
Kansai.pm 10周年記念 Plack/PSGI 入門
Kansai.pm 10周年記念 Plack/PSGI 入門Kansai.pm 10周年記念 Plack/PSGI 入門
Kansai.pm 10周年記念 Plack/PSGI 入門
 
Micropage in microtime using microframework
Micropage in microtime using microframeworkMicropage in microtime using microframework
Micropage in microtime using microframework
 
[PL] Jak nie zostać "programistą" PHP?
[PL] Jak nie zostać "programistą" PHP?[PL] Jak nie zostać "programistą" PHP?
[PL] Jak nie zostać "programistą" PHP?
 
Selenium sandwich-3: Being where you aren't.
Selenium sandwich-3: Being where you aren't.Selenium sandwich-3: Being where you aren't.
Selenium sandwich-3: Being where you aren't.
 
Bag Of Tricks From Iusethis
Bag Of Tricks From IusethisBag Of Tricks From Iusethis
Bag Of Tricks From Iusethis
 
CakePHP workshop
CakePHP workshopCakePHP workshop
CakePHP workshop
 
Intro To Moose
Intro To MooseIntro To Moose
Intro To Moose
 
Unit and Functional Testing with Symfony2
Unit and Functional Testing with Symfony2Unit and Functional Testing with Symfony2
Unit and Functional Testing with Symfony2
 
Dirty Secrets of the PHP SOAP Extension
Dirty Secrets of the PHP SOAP ExtensionDirty Secrets of the PHP SOAP Extension
Dirty Secrets of the PHP SOAP Extension
 
Aura Project for PHP
Aura Project for PHPAura Project for PHP
Aura Project for PHP
 
AnyMQ, Hippie, and the real-time web
AnyMQ, Hippie, and the real-time webAnyMQ, Hippie, and the real-time web
AnyMQ, Hippie, and the real-time web
 
Advanced modulinos
Advanced modulinosAdvanced modulinos
Advanced modulinos
 

Dernier

2k Shots ≽ 9205541914 ≼ Call Girls In Jasola (Delhi)
2k Shots ≽ 9205541914 ≼ Call Girls In Jasola (Delhi)2k Shots ≽ 9205541914 ≼ Call Girls In Jasola (Delhi)
2k Shots ≽ 9205541914 ≼ Call Girls In Jasola (Delhi)Delhi Call girls
 
call Now 9811711561 Cash Payment乂 Call Girls in Dwarka Mor
call Now 9811711561 Cash Payment乂 Call Girls in Dwarka Morcall Now 9811711561 Cash Payment乂 Call Girls in Dwarka Mor
call Now 9811711561 Cash Payment乂 Call Girls in Dwarka Morvikas rana
 
Top Rated Pune Call Girls Tingre Nagar ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated  Pune Call Girls Tingre Nagar ⟟ 6297143586 ⟟ Call Me For Genuine Se...Top Rated  Pune Call Girls Tingre Nagar ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated Pune Call Girls Tingre Nagar ⟟ 6297143586 ⟟ Call Me For Genuine Se...Call Girls in Nagpur High Profile
 
2k Shots ≽ 9205541914 ≼ Call Girls In Mukherjee Nagar (Delhi)
2k Shots ≽ 9205541914 ≼ Call Girls In Mukherjee Nagar (Delhi)2k Shots ≽ 9205541914 ≼ Call Girls In Mukherjee Nagar (Delhi)
2k Shots ≽ 9205541914 ≼ Call Girls In Mukherjee Nagar (Delhi)Delhi Call girls
 
LC_YouSaidYes_NewBelieverBookletDone.pdf
LC_YouSaidYes_NewBelieverBookletDone.pdfLC_YouSaidYes_NewBelieverBookletDone.pdf
LC_YouSaidYes_NewBelieverBookletDone.pdfpastor83
 
Pokemon Go... Unraveling the Conspiracy Theory
Pokemon Go... Unraveling the Conspiracy TheoryPokemon Go... Unraveling the Conspiracy Theory
Pokemon Go... Unraveling the Conspiracy Theorydrae5
 
the Husband rolesBrown Aesthetic Cute Group Project Presentation
the Husband rolesBrown Aesthetic Cute Group Project Presentationthe Husband rolesBrown Aesthetic Cute Group Project Presentation
the Husband rolesBrown Aesthetic Cute Group Project Presentationbrynpueblos04
 
KLINIK BATA Jual obat penggugur kandungan 087776558899 ABORSI JANIN KEHAMILAN...
KLINIK BATA Jual obat penggugur kandungan 087776558899 ABORSI JANIN KEHAMILAN...KLINIK BATA Jual obat penggugur kandungan 087776558899 ABORSI JANIN KEHAMILAN...
KLINIK BATA Jual obat penggugur kandungan 087776558899 ABORSI JANIN KEHAMILAN...Cara Menggugurkan Kandungan 087776558899
 
2k Shots ≽ 9205541914 ≼ Call Girls In Dashrath Puri (Delhi)
2k Shots ≽ 9205541914 ≼ Call Girls In Dashrath Puri (Delhi)2k Shots ≽ 9205541914 ≼ Call Girls In Dashrath Puri (Delhi)
2k Shots ≽ 9205541914 ≼ Call Girls In Dashrath Puri (Delhi)Delhi Call girls
 
2k Shots ≽ 9205541914 ≼ Call Girls In Palam (Delhi)
2k Shots ≽ 9205541914 ≼ Call Girls In Palam (Delhi)2k Shots ≽ 9205541914 ≼ Call Girls In Palam (Delhi)
2k Shots ≽ 9205541914 ≼ Call Girls In Palam (Delhi)Delhi Call girls
 
WOMEN EMPOWERMENT women empowerment.pptx
WOMEN EMPOWERMENT women empowerment.pptxWOMEN EMPOWERMENT women empowerment.pptx
WOMEN EMPOWERMENT women empowerment.pptxpadhand000
 
$ Love Spells^ 💎 (310) 882-6330 in West Virginia, WV | Psychic Reading Best B...
$ Love Spells^ 💎 (310) 882-6330 in West Virginia, WV | Psychic Reading Best B...$ Love Spells^ 💎 (310) 882-6330 in West Virginia, WV | Psychic Reading Best B...
$ Love Spells^ 💎 (310) 882-6330 in West Virginia, WV | Psychic Reading Best B...PsychicRuben LoveSpells
 

Dernier (14)

2k Shots ≽ 9205541914 ≼ Call Girls In Jasola (Delhi)
2k Shots ≽ 9205541914 ≼ Call Girls In Jasola (Delhi)2k Shots ≽ 9205541914 ≼ Call Girls In Jasola (Delhi)
2k Shots ≽ 9205541914 ≼ Call Girls In Jasola (Delhi)
 
call Now 9811711561 Cash Payment乂 Call Girls in Dwarka Mor
call Now 9811711561 Cash Payment乂 Call Girls in Dwarka Morcall Now 9811711561 Cash Payment乂 Call Girls in Dwarka Mor
call Now 9811711561 Cash Payment乂 Call Girls in Dwarka Mor
 
Top Rated Pune Call Girls Tingre Nagar ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated  Pune Call Girls Tingre Nagar ⟟ 6297143586 ⟟ Call Me For Genuine Se...Top Rated  Pune Call Girls Tingre Nagar ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated Pune Call Girls Tingre Nagar ⟟ 6297143586 ⟟ Call Me For Genuine Se...
 
2k Shots ≽ 9205541914 ≼ Call Girls In Mukherjee Nagar (Delhi)
2k Shots ≽ 9205541914 ≼ Call Girls In Mukherjee Nagar (Delhi)2k Shots ≽ 9205541914 ≼ Call Girls In Mukherjee Nagar (Delhi)
2k Shots ≽ 9205541914 ≼ Call Girls In Mukherjee Nagar (Delhi)
 
LC_YouSaidYes_NewBelieverBookletDone.pdf
LC_YouSaidYes_NewBelieverBookletDone.pdfLC_YouSaidYes_NewBelieverBookletDone.pdf
LC_YouSaidYes_NewBelieverBookletDone.pdf
 
Pokemon Go... Unraveling the Conspiracy Theory
Pokemon Go... Unraveling the Conspiracy TheoryPokemon Go... Unraveling the Conspiracy Theory
Pokemon Go... Unraveling the Conspiracy Theory
 
(Anamika) VIP Call Girls Navi Mumbai Call Now 8250077686 Navi Mumbai Escorts ...
(Anamika) VIP Call Girls Navi Mumbai Call Now 8250077686 Navi Mumbai Escorts ...(Anamika) VIP Call Girls Navi Mumbai Call Now 8250077686 Navi Mumbai Escorts ...
(Anamika) VIP Call Girls Navi Mumbai Call Now 8250077686 Navi Mumbai Escorts ...
 
the Husband rolesBrown Aesthetic Cute Group Project Presentation
the Husband rolesBrown Aesthetic Cute Group Project Presentationthe Husband rolesBrown Aesthetic Cute Group Project Presentation
the Husband rolesBrown Aesthetic Cute Group Project Presentation
 
KLINIK BATA Jual obat penggugur kandungan 087776558899 ABORSI JANIN KEHAMILAN...
KLINIK BATA Jual obat penggugur kandungan 087776558899 ABORSI JANIN KEHAMILAN...KLINIK BATA Jual obat penggugur kandungan 087776558899 ABORSI JANIN KEHAMILAN...
KLINIK BATA Jual obat penggugur kandungan 087776558899 ABORSI JANIN KEHAMILAN...
 
2k Shots ≽ 9205541914 ≼ Call Girls In Dashrath Puri (Delhi)
2k Shots ≽ 9205541914 ≼ Call Girls In Dashrath Puri (Delhi)2k Shots ≽ 9205541914 ≼ Call Girls In Dashrath Puri (Delhi)
2k Shots ≽ 9205541914 ≼ Call Girls In Dashrath Puri (Delhi)
 
2k Shots ≽ 9205541914 ≼ Call Girls In Palam (Delhi)
2k Shots ≽ 9205541914 ≼ Call Girls In Palam (Delhi)2k Shots ≽ 9205541914 ≼ Call Girls In Palam (Delhi)
2k Shots ≽ 9205541914 ≼ Call Girls In Palam (Delhi)
 
WOMEN EMPOWERMENT women empowerment.pptx
WOMEN EMPOWERMENT women empowerment.pptxWOMEN EMPOWERMENT women empowerment.pptx
WOMEN EMPOWERMENT women empowerment.pptx
 
$ Love Spells^ 💎 (310) 882-6330 in West Virginia, WV | Psychic Reading Best B...
$ Love Spells^ 💎 (310) 882-6330 in West Virginia, WV | Psychic Reading Best B...$ Love Spells^ 💎 (310) 882-6330 in West Virginia, WV | Psychic Reading Best B...
$ Love Spells^ 💎 (310) 882-6330 in West Virginia, WV | Psychic Reading Best B...
 
(Aarini) Russian Call Girls Surat Call Now 8250077686 Surat Escorts 24x7
(Aarini) Russian Call Girls Surat Call Now 8250077686 Surat Escorts 24x7(Aarini) Russian Call Girls Surat Call Now 8250077686 Surat Escorts 24x7
(Aarini) Russian Call Girls Surat Call Now 8250077686 Surat Escorts 24x7
 

Perl Web Client