Post on 01-Dec-2014
description
YAPC::Brasil::2009Thiago Rondon
POEEdgar Allan POE... POEtry ... Panel Of Experts ... Parallel Object Executor ... Parcel Out Execution ... Parenthetically Over-
Engineered ... Parity Of Evil ... Part Of Elephant ... Particles Of Eternity ... Party On, Ebenezer ... Passed Out from Excitement ... Pathetically Over-Engineered ... Peace On Earth ... People Of Earth ... Perfect Orange Eater ... Perfectly Oblique Eggplant ...
Periodically Orbits Earth ... Perl Obfuscation Engine ... Perl Object Environment ... Perl Objects for Enterprises ... Perl Objects for Events ... Perl On Extasy ... Perl Operating Environment ... Perl Operator Extravaganza ... Perl Over Easy ... Perl Over Ethernet ... Perl
Overdrive Engine ... Perl, Objects and Events ... Perl: Objectively Excellent ... Perlmud Offers Expansions ... Perpetual Orgone Energy ... Persistent Object Environment ... Persnickity Oblong Erudition ... Perversely Oriented Entities ... Philanthropic
Organization Enterprises ... Physician Order Entry ... Piece Of Eden ... Piece Of Eight ... Pigs, Owls, and Elephants ... Piles Of Eugh ... Pious Object Excelsior ... Piracy Over Ethernet ... Pissed Off Elephants ... Plain Old English ... Plastic Orbs Everywhere ... Platonic Object Engine ... Plenty Of Everything ... Plucky Object Engine ... Poe Oracle Environment ... Poe Organizes Everything ... Poe Over
Earth ... Point Of Entry ... Polyolester ... Port of Embarkment ... Portal Of Evil ... Possibly Over-Engineered ... Post-Occupancy Evaluation ... Potatoes Of Eternity ... Potentially Omnipotent Entity ... Pow! Oof! Eek! ... Power Operating Environment ... Power Over
Ethernet ... Practical Over Extraction ... Practically Overengineered Environment ... Preponderance of Evidence ... Preserve Our Essences ... Pretty Obelisk, Excavated ... Pretty Obfuscation Engine ... Pretty Obtuse Engine ... Pretty Odd Environment ... Price Of
Entity ... Princess On Ecstasy ... Probable Obese Elephant ... Product Of Experts ... Products Of Eccentricity ... Prognosis: Over-Engineered ... Program Office Estimate ... Programming Over Easy ... Proliferation Of Events ... Prolifically Over-Eaten ... Purity Of
Essence ... Purveyor Of Everything ...
FRAMEWORK
EVENT DRIVEN
MULTITASKING
FORKING & THREADING ?
AD-HOC EVENTS
DISTRIBUTED PROGRAMMING
::IKC
TESTED SYSTEM 1998-2000.........
GROWING TOOLBOX
POE::Component
POE::[Wheel,Filter,Driver]
POE::Session
POE::Kernel
Layer 1
Layer 2
Layer 3
COMPONENT
WHEEL
SESSION
KERNEL
POE::Kernel
Disparador de eventos,
POE::Loop::Select
Singleton
Post & yield
Timers
COMPONENT
WHEEL
SESSION
KERNEL
Responde aos eventos
$_[OBJECT]$_[SESSION]$_[HEAP]$_[STATE]$_[SENDER]$_[ARG0..ARG9]
POE::Session
COMPONENT
WHEEL
SESSION
KERNEL
“Plugins” para a sessão. Encapsular conjuntos de
manipuladores de eventos.
#Exemplo: POE::Wheel::Run#Executa um programa ou um conjunto de código em um subprocesso usando fork() e troca informações pelo stdin, stdout, stderr.
POE::Wheel
COMPONENT
WHEEL
SESSION
KERNEL
POE::Component::IRC,POE::Component::Server::RadiusPOE::Component::Server::TCPPOE::Component::Server::HTTPPOE::Component::GithubPOE::Component::Jabber(...)
POE::Component
564 componentes no CPAN até ontem.(30/Outubro/2009)
ESTUDO DE CASOS
“Ping Múltiplo”
use POE;use POE::Component::Client::Ping;my @addresses = qw(200.219.201.245 200.219.201.246 200.219.201.247);
POE::Component::Client::Ping->spawn( Alias => 'pinger', Timeout => 5,);
POE::Session->create( inline_states => { _start => \&client_start, pong => \&client_got_pong, });
SESSION
COMPONENT
sub client_start { my ($kernel, $session) =
@_[KERNEL, SESSION]; print "Starting to ping hosts.\n";
foreach my $address (@addresses) { $kernel->post(
pinger => ping => pong => $address); }}
sub client_got_pong { my ($kernel, $session) = @_[KERNEL, SESSION]; my $request_packet = $_[ARG0]; my ($request_packetest_address, $request_timeout, $request_time) = @{$request_packet}; my $response_packet = $_[ARG1]; my ($response_address, $roundtrip_time, $reply_time) = @{$response_packet};
if (defined $response_address) { printf("Pinged %-15.15s - Response from %-15.15s in %6.3fs\n", $request_address, $response_address, $roundtrip_time); } else { print "Time's up for responses from $request_address.\n"; }}
$poe_kernel->run();
KERNEL
IRC
#!/usr/bin/perluse warnings;use strict;use POE;use POE::Component::IRC;
my ($irc) = POE::Component::IRC->spawn();
POE::Session->create( inline_states => { _start => \&bot_start, irc_001 => \&on_connect, irc_public => \&on_public, },);
#!/usr/bin/perluse warnings;use strict;use POE;use POE::Component::IRC;
my ($irc) = POE::Component::IRC->spawn();
POE::Session->create( inline_states => { _start => \&bot_start, irc_001 => \&on_connect, irc_public => \&on_public, },);
COMPONENT
#!/usr/bin/perluse warnings;use strict;use POE;use POE::Component::IRC;
my ($irc) = POE::Component::IRC->spawn();
POE::Session->create( inline_states => { _start => \&bot_start, irc_001 => \&on_connect, irc_public => \&on_public, },);
SESSION
COMPONENT
sub bot_start { $irc->yield(register => "all"); $irc->yield( connect => { Nick => 'maluco_yapc', Username => 'maluco', Ircname => 'YAPC Brasil 2009', Server => 'irc.perl.org', Port => '6667', } );}
COMPONENT
sub on_connect { $irc->yield(join => “#yapcbrasil”);}
COMPONENT
sub on_public { my ($kernel, $who, $where, $msg) =
@_[KERNEL, ARG0, ARG1, ARG2]; my $nick = (split /!/, $who)[0]; my $channel = $where->[0]; my $ts = scalar localtime; print " [$ts] <$nick:$channel> $msg\n"; if (my ($response) = $msg =~ /^$nick (.+)/) { $irc->yield(privmsg => $channel, “estamos aqui.“); }}
COMPONENTKERNEL
$poe_kernel->run();
KERNEL
Rocco Caputo
Obrigado!Thiago Rondonthiago@aware.com.brhttp://www.aware.com.br/