WEB+DB PRESS vol.38

WEB+DB PRESS Vol.38 の見本誌が届きました。連載も今回で7回目。今回は POE の話の後編です。複数の HTTP サーバーに非同期で同時アクセスするクライアントプログラムを POE::Component::* に頼らずつくり、その後 POE::Component を紹介しつつ IRC bot を作る、という内容になってます。先日の前編の vol.37、それから先日の YAPC::Asia の資料とあわせてお読みいただけると理解が深まるかなと思います。

今月号は新連載が色々始まってたりして関心が高いわけですが、断固guy 小飼弾さん (http://blog.livedoor.jp/dankogai/) の Alpha Geek に逢いたいのゲストがIT戦記の id:amachang とあの"はまちちゃん"で、はまちちゃんの写真が載っていました。はまちちゃんの顔が見たい人は WEB+DB PRESS を立ち読..じゃなくて購入するといいと思います。

まじめな話。

yoheiさん が REST レシピと題して REST にまつわる連載を開始されてます。第一回目は URI の設計。良い URI 設計 = Cool URI とは何か。これは良い連載ですね。期待age。あと最近露出の激しいDSASの中の人MySQL の連載を終えて、新たに負荷分散に関する連載を始められております。

URI設計とか負荷分散のノウハウとか、普通はどうやって学んだらいいんだろうと迷うところに目をつけた WEB+DB PRESS の中の人は偉い。

ところで、今回の連載でちょっと原稿を書きすぎてしまってボツになったソースがあるので貼り付けておきます。POE::Wheel::FollowTail を使うとある特定のファイルの末尾を "tail" しつつ、書き込みがあったらイベントを起動するということができます。任意のファイルを tail してその内容を IRC にポストする簡単な bot スクリプトです。

#!/usr/local/bin/perl
use strict;
use warnings;
use Class::Inspector;
use POE qw/Sugar::Args Wheel::FollowTail Component::IRC/;

my $Channel = '#tailbot';

POE::Component::IRC->spawn(
    alias   => 'bot',
    nick    => 'tailbot',
    server  => 'irc.freenode.net',
    port    => 6667,
);

POE::Session->create(
    package_states => [ main => Class::Inspector->methods('main') ],
    args           => \@ARGV,
);

POE::Kernel->sig(INT => sub { POE::Kernel->stop });
POE::Kernel->run;

sub _start {
    my $poe = sweet_args;
    $poe->kernel->post(bot => register => 'all');
    $poe->kernel->post(bot => connect  => {});
    $poe->heap->{wheel} = POE::Wheel::FollowTail->new(
        Filename     => $poe->args->[0],
        PollInterval => 1,
        InputEvent   => 'got_new_line',
    );
}

sub got_new_line {
    my $poe = sweet_args;
    $poe->kernel->post(
        bot => privmsg => $Channel => $poe->args->[0],
    );
}

sub irc_001 {
    my $poe = sweet_args;
    $poe->kernel->post($poe->sender => join => $Channel);
}

POE を使うとこの程度の処理であればイベント駆動で簡単に書けますよ、ということで。