SlideShare ist ein Scribd-Unternehmen logo
1 von 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

Weitere ähnliche Inhalte

Was ist angesagt?

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
 

Was ist angesagt? (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
 

Ähnlich wie 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
 

Ähnlich wie 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
 

Kürzlich hochgeladen

Virtue ethics & Effective Altruism: What can EA learn from virtue ethics?
Virtue ethics & Effective Altruism: What can EA learn from virtue ethics?Virtue ethics & Effective Altruism: What can EA learn from virtue ethics?
Virtue ethics & Effective Altruism: What can EA learn from virtue ethics?Mikko Kangassalo
 
Inspiring Through Words Power of Inspiration.pptx
Inspiring Through Words Power of Inspiration.pptxInspiring Through Words Power of Inspiration.pptx
Inspiring Through Words Power of Inspiration.pptxShubham Rawat
 
Authentic No 1 Amil Baba In Pakistan Amil Baba In Faisalabad Amil Baba In Kar...
Authentic No 1 Amil Baba In Pakistan Amil Baba In Faisalabad Amil Baba In Kar...Authentic No 1 Amil Baba In Pakistan Amil Baba In Faisalabad Amil Baba In Kar...
Authentic No 1 Amil Baba In Pakistan Amil Baba In Faisalabad Amil Baba In Kar...Authentic No 1 Amil Baba In Pakistan
 
Spiritual Life Quote from Shiva Negi
Spiritual Life Quote from Shiva Negi Spiritual Life Quote from Shiva Negi
Spiritual Life Quote from Shiva Negi OneDay18
 
南新罕布什尔大学毕业证学位证成绩单-学历认证
南新罕布什尔大学毕业证学位证成绩单-学历认证南新罕布什尔大学毕业证学位证成绩单-学历认证
南新罕布什尔大学毕业证学位证成绩单-学历认证kbdhl05e
 
integrity in personal relationship (1).pdf
integrity in personal relationship (1).pdfintegrity in personal relationship (1).pdf
integrity in personal relationship (1).pdfAmitRout25
 
(南达科他州立大学毕业证学位证成绩单-永久存档)
(南达科他州立大学毕业证学位证成绩单-永久存档)(南达科他州立大学毕业证学位证成绩单-永久存档)
(南达科他州立大学毕业证学位证成绩单-永久存档)oannq
 
Module-2-Lesson-2-COMMUNICATION-AIDS-AND-STRATEGIES-USING-TOOLS-OF-TECHNOLOGY...
Module-2-Lesson-2-COMMUNICATION-AIDS-AND-STRATEGIES-USING-TOOLS-OF-TECHNOLOGY...Module-2-Lesson-2-COMMUNICATION-AIDS-AND-STRATEGIES-USING-TOOLS-OF-TECHNOLOGY...
Module-2-Lesson-2-COMMUNICATION-AIDS-AND-STRATEGIES-USING-TOOLS-OF-TECHNOLOGY...JeylaisaManabat1
 

Kürzlich hochgeladen (8)

Virtue ethics & Effective Altruism: What can EA learn from virtue ethics?
Virtue ethics & Effective Altruism: What can EA learn from virtue ethics?Virtue ethics & Effective Altruism: What can EA learn from virtue ethics?
Virtue ethics & Effective Altruism: What can EA learn from virtue ethics?
 
Inspiring Through Words Power of Inspiration.pptx
Inspiring Through Words Power of Inspiration.pptxInspiring Through Words Power of Inspiration.pptx
Inspiring Through Words Power of Inspiration.pptx
 
Authentic No 1 Amil Baba In Pakistan Amil Baba In Faisalabad Amil Baba In Kar...
Authentic No 1 Amil Baba In Pakistan Amil Baba In Faisalabad Amil Baba In Kar...Authentic No 1 Amil Baba In Pakistan Amil Baba In Faisalabad Amil Baba In Kar...
Authentic No 1 Amil Baba In Pakistan Amil Baba In Faisalabad Amil Baba In Kar...
 
Spiritual Life Quote from Shiva Negi
Spiritual Life Quote from Shiva Negi Spiritual Life Quote from Shiva Negi
Spiritual Life Quote from Shiva Negi
 
南新罕布什尔大学毕业证学位证成绩单-学历认证
南新罕布什尔大学毕业证学位证成绩单-学历认证南新罕布什尔大学毕业证学位证成绩单-学历认证
南新罕布什尔大学毕业证学位证成绩单-学历认证
 
integrity in personal relationship (1).pdf
integrity in personal relationship (1).pdfintegrity in personal relationship (1).pdf
integrity in personal relationship (1).pdf
 
(南达科他州立大学毕业证学位证成绩单-永久存档)
(南达科他州立大学毕业证学位证成绩单-永久存档)(南达科他州立大学毕业证学位证成绩单-永久存档)
(南达科他州立大学毕业证学位证成绩单-永久存档)
 
Module-2-Lesson-2-COMMUNICATION-AIDS-AND-STRATEGIES-USING-TOOLS-OF-TECHNOLOGY...
Module-2-Lesson-2-COMMUNICATION-AIDS-AND-STRATEGIES-USING-TOOLS-OF-TECHNOLOGY...Module-2-Lesson-2-COMMUNICATION-AIDS-AND-STRATEGIES-USING-TOOLS-OF-TECHNOLOGY...
Module-2-Lesson-2-COMMUNICATION-AIDS-AND-STRATEGIES-USING-TOOLS-OF-TECHNOLOGY...
 

Perl Web Client