日曜は、Plagger を初めてちゃんとさわってみました。
Plagger の概略は、miyagawaさん自身による このYAPC::NAのPDF がわかりやすいです。要するに、 『ネットからフィードを集める → (ごにょごにょする) → 出力する』をするものです。
この「集める」や「ごにょごにょ」や「出力」の部分に、ブロックを重ねるようにしてモジュールを重ね、自分の好きな起承転結にできるという点が実にPerlぽい着想です。勝手に 風がふけば桶屋がもうかるフレームワーク と呼んでいます。
まあ、まずは普通に使ってみようということで、「Bloglinesから集める」→ (エントリごとに分割、RSS広告除去、本文の内容をできるだけ収集→Bloglines、Deliciousへのリンク付与、はてブ登録数付与) → Gmail に送信 をやってみました。
Plaggerはこれを、以下のような設定を書くだけでできるのがかっこいい。モジュールをたたた、と重ねていく感じ。
global:
timezone: Asia/Tokyo
log:
level: error
plugins:
- module: Subscription::Bloglines
config:
username: my-blogline-id@example.com
password: p4ssw0rd
mark_read: 1
fetch_meta: 1
- module: Filter::BreakEntriesToFeeds
- module: Filter::StripRSSAd
- module: Filter::ResolveRelativeLink
- module: Filter::EntryFullText
- module: Widget::BloglinesSubscription
- module: Widget::Delicious
- module: Widget::HatenaBookmarkUsersCount
- module: Publish::Gmail
config:
mailto: your-gmail-id+plagger@gmail.com
mailfrom: your-gmail-id@gmail.com
mailroute:
via: sendmail
Bloglinesで読むのと比べて、データを後から検索できるという頼もしさがあり、大量の未読がたまったときの圧迫感がだいぶなくなりました。
ちなみに、Bloglinesの「未読にする」や、LDRのピンに相当するものとして、★を使ってます。GmailでショートカットキーをONにしてると、s で★を付けられます。j や n で読み進めつつ、あとで読もうと思うときは s。これでスターフォルダにためて、スターフォルダで見おわったら★を外してます。
Plagger の開発に関係している Perl ハカーたちがかなり熱いのと、Plagger Plugin が簡単に書けることから、おもしろい Plagger ネタがいろいろ出てきています。
たとえば、出力の部分で、CDトレイを開けるモジュールに渡して、「新しいニュースが入る → CDトレイがガチャーと開いてお知らせ!」 とか、
入力部分に MacBookに付いてる急な動きを察知するセンサーを使ったモジュールや、カメラやメールや「しゃべる」とかシャットダウンするというプラグインを出力部分に持ってきて、「置いといたMacBookが盗まれそうになったらカメラでそいつの写真を撮り、自分の携帯に送信、こら!と言った後シャットダウン」 みたいなネタもあります。ていうか両方とも同じ人ですね。
http://blog.yappo.jp/yappo/archives/000435.html
さっそくワタクシも、ネタをやってみました。
設定YAMLはこんな感じ
plugins:
- module: CustomFeed::GoogleSearchHistory
config:
username: google-id
password: p4ssw0rd
- module: Filter::BreakEntriesToFeeds
config:
use_entry_title: 1
- module: Filter::Rule
rule:
- module: Deduped
- module: Fresh
duration: 10
- module: Notify::Pizza
rule:
expression: $args->{feed}->title =~ /^はらへった/
config:
username: my-demae-can-id
password: p4ssw0rd
order: 1
で、これを cron で 5分単位とかで動かす。
100個とか届いたらやだなーと、かなりびくびくしながら Google に...

すると、【出前館】ご利用ありがとうございました! メールが! 嬉々
届いたピザ。
今日のあさごはんにもなりました。雨の中、配達ご苦労様でした。
書いたプラグインや、内部の説明。
実は Google Search History は RSS で取れるので、それこそ Plagger の本領発揮。別に新たにプラグインを書く必要なく、Subscription::Config プラグインとかで指定して取ってくるのが順等です。このRSS、Basic認証がかかるのですが、https://user:pass@... の形式で設定すればいける。(追記: UserAgent::AuthenRequest ができたので、これを使うという手もあります)
ただ、どうしても日本語の検索キーワードが文字化けしてしまう。いろいろ調べると、Google Search History の RSS は UserAgent がブラウザぽくないと charaset=utf-8 じゃなく、charset=ISO-8859-1 を返してきやがる。
で、Plaggerが内部で使っている URI::Fetch は、現在の仕様では UserAgent は URI::Fetch * 決め打ち(70行目)なので、どうもむずかしい。そんなわけで CustomFeed::GoogleSearchHistory という独自のプラグインを書いた
のですが、これは fix。なので、今回ぼくが書いた yaml ではなく、Plaggerオリジナルの Plugin だけで同じことができます。くわしくはこちらにまとめました )
config: use_entry_titleこれは、今回「フィードのタイトル」ではなく、「エントリのタイトル」で Filter::Rule するスマートなやり方がわからなくて、適当にパッチを当ててみたものです。
--- lib/Plagger/Plugin/Filter/BreakEntriesToFeeds.pm (リビジョン 1122)
+++ lib/Plagger/Plugin/Filter/BreakEntriesToFeeds.pm (作業コピー)
@@ -17,7 +17,8 @@
my $feed = $args->{feed}->clone;
$feed->clear_entries;
$feed->add_entry($args->{entry});
-
+ $feed->title($args->{entry}->title) if $self->conf->{use_entry_title};
+
push @{$self->{feeds}}, $feed;
}
もちろん、$args->{feed}{entries}[0]{title} とかでもいいと思うのですが。。追記:このパッチも、すでに対応してもらっています。
Plagger::Plugin::Notify::Pizza
これは、もう完全にネタですw
出前を頼むときはよく使っている出前館に、WWW::Mechanize でボットアクセスしてみました。出前館でピザーラを頼むと、ポテトが付いてきておトクです。
WWW::Mechanize 用スクリプトは、こんなネタのためにめんどうなことしたくないので、 HTTP::Recorder を使ってサクっとやりました。
HTTP::Recorder は、こんなのを書いて、
use strict;
use HTTP::Proxy;
use HTTP::Recorder;
my $proxy = new HTTP::Proxy(host => '127.0.0.1', port => 5656);
my $agent = new HTTP::Recorder(showwindow => 0, file => 'proxy.log');
$proxy->agent($agent);
$proxy->start();
ブラウザのプロキシを 127.0.0.1:5656 (おなかすいてたから)にすると、ブラウザでの動きをそのまま proxy.log に WWW::Mechanize 用スクリプトとして記述してくれるつう、すぐれものです。ただいろいろとバギーなのと、Frame処理とかイマイチで、そのへん考えてあげる必要あるのですが、下地造りとして便利。
というか、まあ ピザでお知らせ、というのはネタだけど、Googleに「あとで○○をする」とか入れるとそれが会社にメールされたりとか、実用的なアイディアがありそうな気が。Googleへの検索窓って、最近はブラウザにくっついてるから、楽だし。
実用編 へ続きます。
Plagger0.7.9未満では、設定ファイルのなかに日本語を入れる場合は工夫が必要でしたが、これは0.7.9で解消しています。上の例も0.7.9以降用な感じに変えました。
この話は ここにまとめて書いています
このエントリへのTrackBackアドレス
http://e8y.net/mt/mt-tb.cgi/126
SUSE LinuxへPlaggerを導入
自宅サーバーに今話題のPlaggerを入れてみました(CPANより)。
Plaggerでは、こういうことができます。
otsune FreeStyleWi...
はらへった
Elementary, ... Googleで「はらへった」と検索するとピザが届くようにするまで "勝手に 風がふけば桶屋がもうかるフレーム...
オリコンのチャートとYouTubeをマッシュアップ(CDTube)
いつもこっそり除いている「ゆーすけべー日記」さんが作ったwebサービス「CDT...
授業メモ
Plagger Perlで記述されている「フィードアグリゲータ」 様々なプラグインを組み合わせ、オリジナルのツールを作る 「フィードを集める」->...
Got To Do (alternative GTD)
2005年に"Web2.0"というキャッチーなフレーズで総括されたここ数年のイン
Plagger
Elementary, ... Googleで「はらへった」と検索するとピザが届くようにするまで
パンがなければお菓子を食べればいいじゃない
マリー・アントワネットのセリフだと思ってたんですが、実は違う人の言葉だったんです...
Plaggerの活用例:Googleで「はらへった」と検索するとピザが届くようにするまで
Plaggerを活用したネタ。面白い!
Plagger::Plugin::Notify::Pizzaで出前館
今さらPlaggerで使い尽くされたネタを実践 もう、Plaggerのこのピザネタ「Googleで「はらへった」と検索するとピザが届くようにするまで」が出...
Plagger/Info
Plagger - Trac 実行フェーズ mizzy.org : Plagger プラグインの実行フェーズ ▲ ▼モジュール一覧 ...
君のエントリで 僕が儲かる
plaggerに、そのヒントがありそうです。
plaggerとは、サーバー上でも動く、
「取得」→「加工」→「表示」の為のPerlで書かれたフ...
So cool. URI::Fetch はパッチあてときました。
すごすぎです!
miyagawaさん、URI::Fetch とuse_entry_titleありがとうございます。これで、PlaggerデフォルトのPluginだけで同じことができますね。
帰ったら 『Googleに「会社で○○をする」とか入れるとそれが会社にメールされたり』 とか、 『Googleに「あとで○○をする」とか入れるとそれがオンラインTODOリストに入る』、というのをやってみるよてい
どうしてもピザが注文したくてPizza.pmをいじりました。perlの知識はほとんどないのですが、plaggerは楽しいので触っています。
http://www.greenplastic.net/2006/08/30_0319.php
これは、凄い!! 感動です。
はてな経由です。
最近はテクノに感動することが少なかったのですけどね。
その昔に、applescriptでの自動化をちょこちょこ触っていたものの、web版進化型のツールですね。
これはもっと研究せねばなるまいて。
詳しい紹介ありがとうございます。
yosshi さん、バグ報告ありがとうございます。出前館のHTMLが変わったのですね。Notify::Pizza 修正しておきました。
はらへった、旅行もしたい