MSAgent.pm。ほぼ Publish::Speech::Win32 のコピペ。こんどは Microsoft Agent でアニメーションとかもさせてます。キモは、
sub feed { my($self, $context, $args) = @_; my $character = $self->conf->{character} || 'Merlin'; my $agent = Win32::MSAgent->new($character); my $char = $agent->Characters($character); $char->SoundEffectsOn(1); $char->Show(); $char->MoveTo(300,300); sleep(5); if (my $animation = $self->conf->{animation}) { $char->Play($animation); } ... $self->speak( $char, encode($encoding, $args->{feed}->title_text) ); for my $entry ($args->{feed}->entries) { my $stuff = $entry->title_text . $entry->body_text; for my $message (split /\n/, $stuff) { $self->speak( $char, encode($encoding, $message) ); } } } sub speak { my($self, $character, $message) = @_; my $request = $character->Speak($message); my $i = 0; while (($request->Status == 2) || ($request->Status == 4)) { $character->Stop($request) if $i >10; sleep(1); $i++; } }
アニメーションは config で指定しますが、フィードの内容によってインテリジェントに振舞えるとカッコイイなあ。というわけで、SNMP の通知など、アラートでなごみたい方はどうぞ。
これも Plugin::Pipe からのインスパイヤ。Windows の Speech API (SAPI4) を使ってフィードを読み上げます。楽SpeechS でできるような RSS 音声読み上げアプリができます。
いまのところ Win32 限定ですが、だれか /usr/bin/say でもつかって MacOSX 版おねがいします。
Plagger::Plugin::Speech::Win32
package Plagger::Plugin::Publish::Speech::Win32; use base qw( Plagger::Plugin::Publish::Speech ); use Encode; use Locale::Country; use Locale::Language; use Time::HiRes 'sleep'; use Win32::OLE; use Win32::SAPI4; sub feed { my($self, $context, $args) = @_; my $voice = Win32::SAPI4::VoiceText->new; $self->speak($voice, encode("utf-8", $args->{feed}->title_text) ); for my $entry ($args->{feed}->entries) { my $stuff = $entry->title_text . $entry->body_text; # HACK this should be handled in $entry->locale my $lang = $stuff =~ /\p{Hiragana}|\p{Katakana}|\p{Han}/ ? 'ja' : 'en-us'; my $encoding = $lang eq 'ja' ? 'cp932' : 'latin-1'; $self->speak($voice, $lang, encode($encoding, $stuff) ); } } sub speak { my($self, $voice, $lang, $message) = @_; my($t1, $t2) = split /-/, $lang; my $key = code2language($t1); $key.= " (".code2country($t2).")" if code2country($t2); my $code = $voice->Language2LanguageID($key); my $gender = $self->conf->{voice} || 'male'; my @try_gender = $gender =~ /^male$/i ? (1, 2) : (2, 1); TRY: for my $gender (@try_gender) { for my $i (1 .. $voice->CountEngines) { if ( $voice->LanguageID($i) == $code && $voice->Gender($i) == $gender ) { Plagger->context->log(debug => "Found voice $i for Lang $lang and Gender $gender"); $voice->Select($i); last TRY; } } } $voice->Speak($message); sleep 1 while $voice->IsSpeaking; } 1;
SAPI4 を使ってオーディオからそのまま音声が流れます。本来なら WAV にしてファイルに書き出したいんですが、SAPI4 でやる方法がわかりませんでした。。 $voice->GetObject->{FileName} = "output.wav" とかすると 0 byte の .wav ファイルができるのでイイ線いってるとはおもうのですが。
むかし rss2audiobook を書いたときは SAPI5 で wav ファイルに書き出せたんですが、SAPI5 だと日本語ランゲージパックをいれても GetInstalledLanguages ででてきません orz
Publish::PDF プラグイン。これで rss2pdf 相当のことができます。キモは、
sub feed { my($self, $context, $args) = @_; my $dir = $self->conf->{dir}; unless (-e $dir && -d _) { mkdir $dir, 0755 or $context->error("mkdir $dir: $!"); } my $file = File::Spec->catfile($dir, $args->{feed}->id . ".pdf"); my $body = $self->templatize($context, $args); utf8::encode($body); $context->log(info => "Writing PDF to $file"); my $pdf = PDF::FromHTML->new; $pdf->load_file(\$body); $pdf->convert(); $pdf->write_file($file); }
Audrey の PDF::FromHTML つかってます。PDF::Template のインストールでハマった。(最新版を CPAN から削除したらしく、CPAN シェルからいれられない。search.cpan.org からもってきていれた)
できあがった PDF は こんなの になりました。かっこよくありません。また、img タグをふくんでいるとうまくいかなかったりすることがあるみたいです。 Firefox のコマンドラインオプションとかつかって HTML から PDF を作る方法ってなかったですかね? そのほうがキレイにでそうです。bulknews.typepad.com: Plagger 0.5.2 and 0.5.3 released
I decided to post Plagger updates to this blog, under "Plagger" category. It's a little bit tough and tiresome to write the same thing twice, or even three times (My main blog (japanese), Mailing List and here), but posting it on a blog makes it searchable and easy to keep track of.
Plagger 0.5.3 をリリースしました。おもな変更点は、
* Publish::Spotlight, Search::Rast, Search::Namazu といった検索プラグインの追加
* Publish::MTWidget で MT Sidebar Manager 向け Widget を作成。(スクリーンショット)
* Plagger::Rule::Fresh でタイムスタンプベースの dedupe (重複チェック) ができるように
* show_icon: 1 で フレパ・mixi のフィードにユーザアイコン表示。(スクリーンショット)
詳しくは ChangeLog をみてください。
何度も同じ内容を書くのは非常にメンドウなので、英語 Blog の Plagger カテゴリ にポストしていくことにします。日本語に訳したい方はお好きにどうぞw
開発の議論やらは、Mailing List と IRC #plagger (英語) #plagger-ja (日本語) で。
YAPC::Asia 2006 Tokyo (Japanese)
先日お知らせした チケット販売ですが、2006/2/27 (Mon) 10:00 より、ローソンチケットにて50枚追加販売することに決定しました。
YAPC::Asia のチケットを追加で発売します。50枚限定ですので、間に合わなかった!という方はお忘れなく。
ローソンチケットのサイトの方はいまひとつ availability に問題があるように見えるので、電話予約のほうをおすすめします。
Plagger 0.5.2 をリリース。
* Subscription::HatenaRSS: はてな RSS の OPML とシンクロ
* Subscription::Odeo: Odeo の OPML とシンクロ(enclosure の扱いはまだ不完全です)
* Publish::IRC: 更新を IRC チャネルに通知。POE と IKC つかってるのが Cool
* Filter::StripRSSAd: rssad.jp や Google AdSense for Feeds の広告を strip
その他いくつか Bugfix を含んでます。くわしくは ChangeLog を。
昨日 IRC で盛り上がったのが Yappo さんのつくった RssSearch と OpenSearch プラグイン。どちらも Aggregator 継承になっているのでここを分離して、Subscription を拡張する ( engine: Bulkfeeds, BlogDB, Technorati / query: Plagger のようにしてバーティカル検索できるように) というのは面白いアイデアかも。
それと Ben Trott の Blog で紹介されました。
Stupidfool.org: "The geek at your feet says you're neat..."
Plagger (by Tatsuhiko & others) is a fantastic idea. Having developed a bunch of miniature feed-related apps, what I love most about this is that it's essentially the perlbal/qpsmtpd of RSS/Atom feed frameworks.
21日の夕方に Ingy dot Net がオフィスにきて、Jemplate Hackathon。Six Apart からは Yann と xantus も参加。
ブラウザで動く test suite が動作するようになったり、Jemplate.Stash を拡張して foo = [ "a", "b", "c" ]; foo.join("::") が動くようになったり(まだかなり nasty な Hack ですが)。テストができたので TT2 のテストをポートしようという話も。
今後ますます楽しみ。
各サービスには担当開発者がおり、全てはてな社員です。主に個人的な動機により開発を行っています。
はてな社員じゃない人が開発できる場だったら面白いのに、とか思いました。
Alexa Web Search Platform, Ning, Google Homepage API ... Architecture of Participation。
YAPC::Asia 2006 Tokyo まで 36 日。Yahoo! JAPAN がスポンサーになり、セッション一覧 を公開、また チケットの追加販売を準備中 です。
Plagger - Pluggable RSS/Atom aggregator の 0.5.0 を CPAN にリリースしました。
Plagger は Bloglines to Gmail な Hack の進化したもので、すべてをプラグインで実装できるようにしたソフトウェアです。Blog ソフトウェアの Blosxom とか SMTP サーバの qpsmtpd とかを知ってる方は、それの RSS アグリゲータ版と思っていただけると話が早い。
Bloglines からとってきて Gmail に HTML メールを送る、というのに限らず、RSS をとってきてそれを加工して何かのフォーマットで書き出す、というのはよくやるハックだなあと思っていました。自分の例でも、
* Bloglines -> Gmail
* Bloglines -> iPod
* RSS -> Audiobook
* RSS -> JavaScript
といくつもリストアップできますが、これを Plagger ではプラグインの組み合わせで実現することができます。またこれらの出力を並列にして、Rule ベースでオンオフすることも可能。
ほかにも、
* はてなブックマークや del.icio.us の更新を MT に XML-RPC でポスト
* RSS の新着エントリを IRC にポスト
なんてのも Plagger 上では実現できそうです(まだ全部のプラグインができていないのですが)。
また、これから面白くなりそうだなぁと思っているのが Filter と SmartFeed の機能で、del.icio.us や はてなブックマーク でのユーザ数、ユーザに付けられた Tag などを取得するプラグインをすでに書いています。これと SmartFeed を組み合わせて、「きのうの Bloglines の更新のうち、はてなブックマークで 10 users 以上にブックマークされたもの」という Rule をつくり、マッチしたものを PSP に書き出してブウラウザで見たり, JavaScript に書き出してサイドバーに張ったり といったことができるようになってます。(NOTE: はてブ、del.icio.us プラグインともデモ目的でつくったもので、フィードの数がおおいと IP Ban される可能性が高いので注意)
カスタムフィードのプラグインでは、mixi や livedoor フレパ などログインの必要なサイトの情報をフィード形式で扱ったり、Mailman のアーカイブ から RSS を生成したりといったこともできます。
Plagger の開発はまだはじまったばかりで、API やプラグインなどまだまだ安定していませんが、興味のある方の参加をお待ちしてます。Mailing List (Google Groups) と IRC チャネル #plagger (freenode) で議論と開発が行われてます。
404 Blog Not Found:はてなキーワード連想語API vs. XMLRPC::Lite
そうなのです。XMLRPC::Liteは、Non-ASCIIな文字列はbase64でおくっておったのですね。
以下のようにすれば base64 しないでそのまま string として送るようになります。ローカルハックは必要なし。
my $res = XMLRPC::Lite->new->proxy('http://d.hatena.ne.jp/xmlrpc') ->call('hatena.getSimilarWord', { wordlist => [ XMLRPC::Data->type(string => "はてな") ] } );
"はてな" の部分は utf-8 bytes でも Unicode flagged な string でもOK。
先週の木曜に、San Francisco に来ていた Ingy が IM で "Do you have a time to hack today? I have a pretty neat project we could hack on." てなメッセージをくれたのでちょっとだけハックしてたのが Jemplate。実際には時間がなくてアイデアを練るだけで終わってしまいましたが、Ingy は作業を続けて今日 CPAN に最初のバージョンがリリースされたみたいです(まだ [% foo %] とか FOREACH, IF ぐらいしかできないですが)。
JavaScript の Template にもいろいろあって、prototype.js の最新版には簡単な Template.js コードがついているようだし、ほかにもいろいろとありますね。Six Apart でも一時期 TT2 のコンパイラバックエンド(TT はデフォルトでテンプレートを Perl コードにコンパイルするバックエンドが動いていて、これを他の言語・フォーマットに切り替えることができます)を作ろうという話があったんですが、なかなかしんどそうで今は pure JavaScript なテンプレートエンジンに向かっています。これは LJ で使っている Tag AutoComplete なスクリプトと同様に、BSD / MIT 的ライセンスでそのうちリリースされるかも。
ってなわけで Jemplate ですが、サーバサイドにおいたテンプレートファイルを1枚の .js にコンパイルしてくれるというもの。JSON と組み合わせてデータをサーバからとってきて Jemplate.process すればいいというなかなか楽しい仕組みです。
さっそくというか Catalyst::View::Jemplate をつくってみました。これと Catalyst::View::JSON を組み合わせて Catalyst とデータをやりとりさせるのはカンタンにできますね。まだ Jemplate でできることが少ないのでいろいろ先は長そうですが。
そんな Ingy ですが YAPC::Asia で来日がきまっています。Lightning Talk で Jemplate どう? といったら早速 OK な返事が。楽しみです。チケットは昨日から発売されてますのでお早めにどうぞ!
YAPC::Asia 2006 Tokyo (Japanese): スピーカーとスポンサーが決定!
YAPC::Asia 2006 Tokyo のスピーカーおよびスポンサーが決定しましたので、改めてイベント概要とともに告知します。
YAPC::Asia 2006 Tokyo のスピーカー・スポンサーを発表しました。Larry Wall, Damian Conway, Audrey Tang をはじめ海外・国内から豪華なスピーカーが集まりました。いまから楽しみです。
私は Blog SPAM 関係と Trickster 2.0 な話をする予定ですが、最近いじりはじめた Plagger も自分的に盛り上がってきているので、Lightning Talk でこっちの話もするかも、ってな感じです。
3月上旬までサンフランシスコに出張できているため、日本で会場との交渉やスポンサー関係などしていただいてるスタッフの皆さんにこの場を借りて感謝です。