YAPC::Brasil 2009, POE

Post on 01-Dec-2014

776 views 0 download

description

 

Transcript of YAPC::Brasil 2009, POE

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

http://poe.perl.org

Obrigado!Thiago Rondonthiago@aware.com.brhttp://www.aware.com.br/