SlideShare a Scribd company logo
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
Perl Web Client
Perl Web Client
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,
);
Perl Web Client
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,
);
Perl Web Client
$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

More Related Content

PDF
Nubilus Perl
KEY
dotCloud and go
PDF
Teaching Your Machine To Find Fraudsters
PDF
Debugging: Rules And Tools - PHPTek 11 Version
PDF
Advanced symfony Techniques
PDF
Doctrine MongoDB ODM (PDXPHP)
KEY
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011
PPTX
Electrify your code with PHP Generators
Nubilus Perl
dotCloud and go
Teaching Your Machine To Find Fraudsters
Debugging: Rules And Tools - PHPTek 11 Version
Advanced symfony Techniques
Doctrine MongoDB ODM (PDXPHP)
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011
Electrify your code with PHP Generators

What's hot (20)

PDF
Introducing Assetic (NYPHP)
PPTX
Webrtc mojo
KEY
Introduction to CloudForecast / YAPC::Asia 2010 Tokyo
PDF
Design Patterns avec PHP 5.3, Symfony et Pimple
PDF
News of the Symfony2 World
PDF
Silex meets SOAP & REST
PDF
Perl web frameworks
PDF
The History of PHPersistence
PPTX
Looping the Loop with SPL Iterators
PDF
Database Design Patterns
PDF
Models and Service Layers, Hemoglobin and Hobgoblins
PDF
The Zen of Lithium
ODP
The promise of asynchronous php
PDF
Symfony 2.0 on PHP 5.3
PDF
Perl Bag of Tricks - Baltimore Perl mongers
PDF
Perl6 in-production
PDF
Symfony components in the wild, PHPNW12
PDF
Command Bus To Awesome Town
PDF
Symfony War Stories
Introducing Assetic (NYPHP)
Webrtc mojo
Introduction to CloudForecast / YAPC::Asia 2010 Tokyo
Design Patterns avec PHP 5.3, Symfony et Pimple
News of the Symfony2 World
Silex meets SOAP & REST
Perl web frameworks
The History of PHPersistence
Looping the Loop with SPL Iterators
Database Design Patterns
Models and Service Layers, Hemoglobin and Hobgoblins
The Zen of Lithium
The promise of asynchronous php
Symfony 2.0 on PHP 5.3
Perl Bag of Tricks - Baltimore Perl mongers
Perl6 in-production
Symfony components in the wild, PHPNW12
Command Bus To Awesome Town
Symfony War Stories
Ad

Similar to Perl Web Client (20)

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

Recently uploaded (20)

PPTX
cấu trúc sử dụng mẫu Cause - Effects.pptx
PDF
Attachment Theory What Childhood Says About Your Relationships.pdf
PPT
cypt-cht-healthy-relationships-part1-presentation-v1.1en.ppt
PPTX
SELF ASSESSMENT -SNAPSHOT.pptx an index of yourself by Dr NIKITA SHARMA
PPTX
How to Deal with Imposter Syndrome for Personality Development?
PDF
The Zeigarnik Effect by Meenakshi Khakat.pdf
PDF
The Power of Pausing Before You React by Meenakshi Khakat
PDF
Top 10 Visionary Entrepreneurs to Watch in 2025
PPTX
PERDEV-LESSON-3 DEVELOPMENTMENTAL STAGES.pptx
PPTX
Self -Management and Self Awareness.pptx
PPTX
Presentation on interview preparation.pt
PPTX
Learn numerology content and join tarot reading
PPTX
Chapter-7-The-Spiritual-Self-.pptx-First
PPT
proper hygiene for teenagers for secondary students .ppt
PPTX
Learn about numerology and do tarot reading
PPTX
Pradeep Kumar Roll no.30 Paper I.pptx....
PPTX
diasspresentationndkcnskndncelklkfndc.pptx
PPTX
Learn how to prevent Workplace Incidents?
PDF
Red Light Wali Muskurahat – A Heart-touching Hindi Story
PPTX
Identity Development in Adolescence.pptx
cấu trúc sử dụng mẫu Cause - Effects.pptx
Attachment Theory What Childhood Says About Your Relationships.pdf
cypt-cht-healthy-relationships-part1-presentation-v1.1en.ppt
SELF ASSESSMENT -SNAPSHOT.pptx an index of yourself by Dr NIKITA SHARMA
How to Deal with Imposter Syndrome for Personality Development?
The Zeigarnik Effect by Meenakshi Khakat.pdf
The Power of Pausing Before You React by Meenakshi Khakat
Top 10 Visionary Entrepreneurs to Watch in 2025
PERDEV-LESSON-3 DEVELOPMENTMENTAL STAGES.pptx
Self -Management and Self Awareness.pptx
Presentation on interview preparation.pt
Learn numerology content and join tarot reading
Chapter-7-The-Spiritual-Self-.pptx-First
proper hygiene for teenagers for secondary students .ppt
Learn about numerology and do tarot reading
Pradeep Kumar Roll no.30 Paper I.pptx....
diasspresentationndkcnskndncelklkfndc.pptx
Learn how to prevent Workplace Incidents?
Red Light Wali Muskurahat – A Heart-touching Hindi Story
Identity Development in Adolescence.pptx

Perl Web Client