2011/04/04

Recent entries from same category

  1. PerlでWindowsと親和性の高いreadlineが欲しい → あった「Caroline」
  2. Perl をゆるふわと語ろう
  3. cpanfile とは何か、なぜそれを使いたいのか
  4. plackup の --path 引数
  5. Github Notification API が出たので通知を Growl するの書いた。

富田さんが書かれた、「CPANモジュールガイド」を献本頂きました。
Growl::Anyを紹介して頂いています。

ざっと目を通しましたが「perlの今」が分かる、読んでてとてもワクワクする本です。各モジュールにサンプルコードが示されていて今ホットなCPANモジュールが150本程紹介されています。perlを知ってる方ならば「あーあのモジュールか。」とニタニタしながら読むことが出来ますし、perlをこれから始める方にとっても「へー最近良く聞くあのモジュールは、こういう機能があって、こう使うんだ。」と分かりやすく書いてあります。
その中にも、サンプルコードで他のモジュールを絡めて書かれている為、アプリケーションを書く上での基礎知識が得られる、持っていて絶対損のないガイドブックになっていると思います。
ボリューム感もあるので、僕もしばらく通勤電車の中でニタニタする事が出来ると思います。

Perl CPANモジュールガイド Perl CPANモジュールガイド
冨田尚樹, タナカユカリ
ワークスコーポレーション 単行本(ソフトカバー) / ¥173 (2011年04月08日)
 
発送可能時間:


さて、Growl::Anyですが、このモジュールは各OS上で動作するGrowl、もしくはGrowlライクなアプリケーションに対して共通インタフェースを提供するアダプタモジュールです。
Growl::Any - search.cpan.org

Growl::Any - Common interface to Growl

http://search.cpan.org/dist/Growl-Any/
先日gfxさんに大改良して頂き、わかりやすい構成になりました。

実は僕はMac OSXを持っていません。なのでGrowl::Anyが無くても直接困る人でもありません。僕がこれを書いたのは、miyagawaさんなんかが良く書いてるMac OSX上で動くGrowlアプリケーションを、Mac OSXを持ってない人が簡単な修正だけで動かせる様にしてもらいたいと思ったからです。もちろん僕自身もその一人です。
僕はWindows上で動作するGrowl、Growl For Windowsへ通知が出来るCPANモジュールGrowl::GNTPを作っている事もあり、なおかつGrowl For Windowsの中身もまぁまぁ知ってるので(コミット権も持ってるけどあまりコミットしてない苦笑)、たぶんGrowl::AnyのAUTHORとしては適任なのかもしれない。
もちろんGrowlだけじゃなく、あのカッコいいperlアプリケーションをWindowsで動かしたいなと思ってる人は僕だけじゃないと信じています。
そしてMac OSX上で動くイカしたアプリケーションを他のOSで動作させる為のグルー的な役割を、ブログなんかで冗談混じりに紹介し、ポーティングの楽しさ、CPANモジュールの便利さアピールするのが僕の役目なんだろうなと勝手に思っています。

良いアダプタになれればいいなと思います。

さて先日Data::Deduperというモジュールを書きました。
mattn/p5-Data-Deduper - GitHub

remove duplicated item from array

https://github.com/mattn/p5-Data-Deduper
Growlを使ったアプリケーションを書く場合RSSフィードから新着表示したりする訳ですがこの場合、前回フェッチ時のエントリから今回増えたエントリを抽出してGrowl通知する事になります。
そんな場合に役立つんじゃないかと思っています。中身はとても短いコードのモジュールですが、RSSフィードの新着エントリを表示するスクリプトがこんな風に書けます。
#!perl
use strict;
use warnings;
use Encode;
use Data::Deduper;
use XML::Feed;

my $uri = URI->new( "http://api.twitter.com/1/statuses/public_timeline.rss" );

my $dd = Data::Deduper->new(
    expr => sub {
        my ( $a$b ) = @_;
        $a->link eq $b->link;
    },
    size => 50,
);

while (1) {
    my $feed = XML::Feed->parse( $uri );
    for ( $dd->dedup$feed->entries ) ) {
        print encode_utf8 $_->content->body."\n";
    }
    sleep 3;
}
実は、こういったスクリプトを書く際にはこれまでtokuhiromさんが書いたXML::Feed::Deduperを使っていたのですが、RSSフィードの新着確認であればフィード内のエントリ数分だけ管理出来ていれば良くて、特にGrowl通知アプリケーションなんかの場合は大概常駐アプリになるので、DB_Fileを使わなくてもいいんじゃないかという発想で書きました。
まぁ便利かもと思ったのは僕だけかも知れないけど。

こういった、何かの手順を簡素に出来るモジュールをこれからも書いていけたらなぁと思っています。
Posted at by