指定したURIのページを取得するための Perl モジュール。
Cache モジュールを使うと、キャッシュ機能を使用することができる。
Cache::Cache モジュールでも可だが、URI::Fetch でも Cache::Cache でもシリアライズを行うので冗長である。 無駄を避けるには URI::Fetch の、Freeze、Thaw パラメータに、素通りさせるだけのサブルーチンを指定すれば良いはず。
キャッシュを利用できる HTTP ユーザエージェントモジュールとしては、他に WWW::Mechanize::Cached、LWP::UserAgent::WithCache などがある。
WiKicker や DiKicker でうまく他のサイトの情報を取り込んで利用できるようにしたい。 相手サイト・自サイトともに負荷をかけないように処理するには、うまくキャッシングする必要がある。
キャッシュ機能のあるPerl用HTTPユーザエージェントには
などがある。
WWW::Mechanize::Cached は1度取得したレスポンスを無条件に1日間キャッシュする。 WWW::Mechanize のサブクラスで、便利な機能が利用できるが、キャッシュは適当。
キャッシュは Cache::FileCache決め打ち。
LWP::UserAgentのサブクラス。 Expires、Last-Modified、Etag ヘッダを考慮して処理する。
キャッシュは Cache::FileCache決め打ち。
fetch サブルーチンのみを提供するシンプルなモジュール。
キャッシュは Cache 系APIのモジュールを指定する。実際には Cache::Cache 系でもOK。 Last-Modified、Etag を考慮して処理する。
前回のアクセスから一定時間はキャッシュを返すようにする機能があり、RSS や Atom フィードを取得して利用するのに便利。
URI::Fetch をチョイス。 our を使っているのでそのままでは Perl 5.005_03 では動かないが、use vars に書き換えれば問題なく動く。
5カ月ほど前にはてなブックマーク上の最新ブックマークを nDiki のサイドバーに表示するようにしてみた。
今回は nDiki のキーワード別のページに、はてなブックマークからそのキーワードで検索されたブックマークを表示する機能を追加してみた。
取得する対象RSSが多くなり、さすがに前回みたいにローカルPCで処理して定期的にアップロードという形では無駄が多すぎるのでちゃんとサーバ上で処理するようにした。
URI::Fetch + Cache::FileCache + XML::RSS を用いて実装。 キャッシュ期間は1日に設定。キーワードページを最初にアクセスした際にははてなブックマークからのフィード取得があるので、ちょっと時間がかかるが2度目のアクセス以降キャッシュを使っている間はそれほど余計な時間はかからないはず。
自分のWeb日記とブックマークの組み合わせだと当然扱うネタが近いので、きちんと関連する情報が表示されるはずだ。 他の検索サーバのRSSフィードを利用する事も考えてはいるけど、しばらくはこれでいいかな。
公式の Flash 版 Twitter badge をこのページのサイドバーに表示していたが、以下の点でちょっと不満だった。
「自分の過去のステータスを一覧的にサイドバーに表示する」のがしたいことなのだが、ちょっとマッチしない。 ということで Twitter から RSS フィードを取ってきて、サイドバーに表示することにした。
使ったモジュールは URI::Fetch + XML::RSS + Date::Parse。 それとユーティリティとして WiKicker::HTML と WiKicker::URI。
と簡単に実装してみた。機能的には概ね満足。
2週間ほど前にtwitterfeed で Flickr に写真をアップロードしたら自動的に Twitter にタイトルと URL をポストするようにしたのだが、これだと写ツみたいに画像そのものはポストされず今一歩なので、写真自体を自動的に Twitter アイコンにアップロードするようにしてみた。
流れは以下:
例えば今日 VQ1005 で撮影して Flickr にアップロードした写真を自動的に加工させたものがコレ。
なんか偽中継のような嘘臭さがあるけれど、まあだいたいアップロードした写真は自分が実際にその場にいたのだから、あながちでもないんじゃないか。
半年ぐらい前に Skype for Linux で Twitter への書き込みを自動的に Skype ムードメッセージに設定するスクリプト(記事)を作って cron で 10分毎に更新するようにした。
Windows BOX 上 Skype を使っている時も同様にできるように、Skype4COM を使うバージョンも書いてみた。 D-Bus ではなく Skype4COM を使うようにすることと、Skype4COM にはシフト JIS の文字列を渡すようにすること以外はほとんど同じ。
Skype4COM の DLL を登録し、Skype が起動している状態で以下の Perl スクリプトを実行。
#!/usr/bin/perl use strict; use warnings; use Win32::OLE; use URI::Fetch; use XML::RSS; use Date::Parse; use Encode; my $id = '自分の Twitter ID'; my $time = time; my $fetch_response = URI::Fetch->fetch( "http://twitter.com/statuses/user_timeline/$id.rss?dummy=$time") or die URI::Fetch->errstr; my $rss = XML::RSS->new; $rss->parse($fetch_response->content); die 'no items' if @{$rss->{items}} == 0; my $item = $rss->{items}->[0]; my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(str2time($item->{pubDate})); my $title = $item->{title}; my $mood = sprintf("$title [%02d/%02d %02d:%02d]", $mon + 1, $mday, $hour, $min); $mood = Encode::encode('shiftjis', $mood); my $skype = Win32::OLE->new('Skype4COM.Skype'); $skype->Client->Start unless $skype->Client->IsRunning; my $profile = $skype->CurrentUserProfile; $profile->{MoodText} = $mood;
インストール済みだった ActivePerl 5.8.8.822 で動作を確認(ちなみに現時点での最新は ActivePerl 5.10.0.1003)。なお URI::Fetch、XML::RSS、Date::Parse(TimeDate) は標準では入っていないので PPM パッケージでインストール。
タスク スケジューラで10分毎に上記のスクリプトを wperl.exe で実行するように設定。 これで Windows 上でもさえずりをムードメッセージに設定できるようになった。
Naney (なにい) です。株式会社MIXIで SNS 事業の部長をしています。
※本サイトの内容は個人的見解であり所属組織とは関係ありません。