2004-03-28 初出
あるはてな ID を持っている人が、何というタイトルではてなダイアリーを書いているかを知りたい場合がある。
そういうときは RSS と XSL を使うと作業が楽である。
簡単に言うと、 RSS( RDF Site Summary) は XML で書いてある更新情報、
XSL( eXtensible Stylesheet Language ) は XML を別形式に変換するための言語になる。
はてなダイアリーは更新情報を自動的に RSS 化してくれるが、そのときに「誰の更新情報か」を示す情報に日記タイトルを埋め込んでいる。
このおかげで、 http://d.hatena.ne.jp/****/rss からデータを取ってくれば、その中に日記のタイトルが含まれている。
あとは RSS の中のデータを XSL で取り出そうというわけ。
はてなダイアリー日記 - RSS
http://d.hatena.ne.jp/hatenadiary/rss
RSS を取ってくるといっても、 http://d.hatena.ne.jp/****/rss を名前を付けて保存したりする必要はない。
XSLT のパス指定は XPath という仕様で決められているが、この XPath の関数に document() というものがある。
この関数は「引数で指定された文字列の内容をノード集合として返す」という機能を持っている。
(ちょっと複雑なので、興味がある人は agenda personal : document(ノード集合) の例(XSLT 1.0) を見てほしい。)
これがどういうことかというと、 document() の引数に URL(正確には URI ) を渡すと、まるごと XML ツリーとして返してくれるのである。
ちゃんと XPath を実装している XSLT エンジンなら、自力でネットワークから情報を取ってくることができるのだ。
初めてこのことを知ったとき、わたしはちょっと感動してしまった。技術の進歩はすごい。
まとめると、はてな ID からはてなダイアリーのタイトルを取るときは、こんな XPath 式を書けばよい。
document('http://d.hatena.ne.jp/****/rss')/rdf:RDF/rss:channel/rss:title
サンプルはこちら。 "hatenadiary" という ID から"はてなダイアリー日記"というタイトルを取ってきている。
Windows XP + IE6.0.2800 では動いたが、 Mozilla Firefox 0.8 (2004-02-10 版)では何も表示されなかった。変換エンジンの違いかな。
実は、この方法にはひとつ欠点がある。
さきほどの document() 関数の仕様では、渡した URI の内容が必ず XML になっていなければならないのだ。
( XML 以外の内容を渡すと XSLT がエラー終了する)
はてなダイアリーの仕様では、ダイアリーを使っていないユーザーの RSS を取ろうとすると HTML4.0 のエラーページが表示される。 ( 2004 年 3 月 28 日現在)
xx-internet : RSS
http://d.hatena.ne.jp/xx-internet/rss
つまり、はてなダイアリーを使っているかどうか分からない ID を並べて、いっぺんにタイトルを取ってこようとすると、 次の表のような状態になってしまう。
| はてな ID | はてなダイアリーの有無 | 結果 |
|---|---|---|
| id1 | 書いている | OK |
| id2 | 書いていない | エラー |
| id3 | 書いている | 処理されない |
id2 の結果が空の RSS で返ってくれば、 id3 以降もきちんと処理される。
これははてなダイアリーへの要望としておこうかな。
(はてな外部から指摘していいのか分からないけど)
RSS モジュールの結果を常に RSS で返していただけないでしょうか。(エラーページも RSS にしてほしい)
もちろん d.hatena.ne.jp/****/ からタイトルを取ってくることもできるが、こちらはあまりお勧めしない。
取ってきたページの中身を解析しなくてはならないからだ。
わたしのモットーはつまらないプログラムはできるだけさっさと作るなので、
日記のタイトルを取ってくる程度のことで、 ネットワークからファイルを取る -> ファイルを解析する -> タイトルを返す
なんて回りくどいことはやってられないんだよね。
Perl の生みの親である Larry Wall はこう言っている。
「プログラマの三大美徳は、無精( laziness )、短気( impatience )、傲慢( hubris )である」
できるだけ手間を省こうとし、何度もプログラムを書き直したり動かし直したりするのがきらいで、
他のプログラムがやってくれることはそちらにやらせる。いいプログラマとはそういう人種なのである。
わたしもこの言葉を肝に銘じて、日夜さぼろうと努力しております。