2009/07/09


XML::Simpleだと格納される結果が決まっており、例えば <statuses>
    <status>
        <id>4773580</id>
        <text>kazuhoさんがやってくれました!</text>
        <user>
            <screen_name>mattn</screen_name>
        </user>
    </status>
    <status>
        <id>4773581</id>
        <text>今日のnickは○○提供です。</text>
        <user>
            <screen_name>kazuho</screen_name>
        </user>
    </status>
</statuses>
こんなXMLを以下の様な形にしたい場合がある場合に少し不便だったりします。 ---
id: 4773580
text: kazuhoさんがやってくれました!
screen_name: mattn
---
id: 4773581
text: 今日のnickは○○提供です。
screen_name: kazuho
XML::Simpleを使うと、arrayノード一つにID要素があると勝手にノード扱いになったり、不必要なノードへのアクセスが必要になったりします。以下XML::Simpleのパース結果
---
status:
  4773580:
    text: kazuhoさんがやってくれました!
    user:
      screen_name: mattn
  4773581:
    text: 今日のnickは○○提供です。
    user:
      screen_name: kazuho
こんな場合にはXML::CuteQueriesを使うと便利です。
Paul Miller / XML-CuteQueries - search.cpan.org

A cute little query language for converting XML to Perl

http://search.cpan.org/dist/XML-CuteQueries/
上の例であれば以下のコードで望み通りの形式でパース出来てしまいます。
use strict;
use warnings;
use LWP::Simple;
use XML::CuteQueries;

my $cq = XML::CuteQueries->new;
$cq->parse(get "http://api.wassr.jp/statuses/public_timeline.xml");
my @statuses   = $cq->cute_query("/statuses/*" => {'*' => '', 'user/*' => ''});
use YAML;
warn Dump @statuses;
PODを見ていただければ分かりますが、XPathでクエリ式を書きそれに対するデータシェイプを指定します。例であれば"/statuses/*"にあるノードすべて"*"はデータシェイプのルートに、また"/statuses/*"にある"user/*"(user内の全て)もデータシェイプ内のルートに置くという指定になります。
これ、XML版のWeb::Scraperって感じですかね。便利だわー。

Posted at by



2009/07/05


最後までC言語で書き直そうかと迷いましたが、結局Perlのままになりました。
スクリーンショットは以下
nhk-news
しくみは、起動時にオートディスカバリでフィード一覧をコンボボックスに展開、コンボボックスが選ばれたらフィードを取得してエントリ一覧をリストに展開、リストがダブルクリックされたらHTMLをスクレイピングしてGtk2::Ex::MPlayerEmbedで再生という単純なもの。プレーヤ部分のツールチップにニュース本文が表示されます。
本当は、fltk2でmplayer埋め込みプレーヤを2年ほど前に作ってあったのでそれを使っても良かったのですが、いかんせんfltkがマイナー過ぎるのでやめました。
mattn's nhk-news-pl at master - GitHub

NHK News Movie Player

http://github.com/mattn/nhk-news-pl/tree/master
ライセンスとか難しい物はありません。ソースは上のリンクにあるのでパクるとか、お好み焼きに付けるとか、勝手にして下さい。
問題ありそうならキャプチャは取り下げる予定です。
Posted at by



2009/06/24


Freenodeのwebchatインタフェースを叩いて通信し、携帯電話からでもIRC出来るCGI書いた。
欲しい人なんかいるんかなーとか思いながら、作ったのでメッセージの送受信しか出来ません。 nick登録もなし、nickの自動割り当てもなしです。
私はこんだけあったら十分なので...。コードはこの辺にあります。
mattn's freenode-mobile-gateway at master - GitHub

IRC gateway for freenode writen in perl.

http://github.com/mattn/freenode-mobile-gateway/tree/master
SoftBank携帯ですが、一応動いてます。欲しい機能があればgithubでforkして下さい。
Posted at by