Category sw.

実験的に Rena を使ってみたかったので、よろしそうなプログラムを考える。

IRC BOT に何か FOAF アレこれできるような機能をつけてみたかった (意味があるかは考えない) ので、とりあえず URI に反応して、それが FOAF だったら foaf:nick と foaf:name をとってくるようにしてみた。

URI (http:) が PRIV されたら HEAD でアクセスして、ステータスコードと Content-Type を確認。`text/xml', `application/xml', `application/rdf+xml', `text/ntriples' であれば Rena にロードさせる。

ロードしたら rdf:about="" なリソースを探し、それが foaf:PersonalProfileDocument であれば foaf:primaryTopic のさすリソースの foaf:nick と foaf:name をてけとーに取得して IRC に NOTICE

Rena は結構遅いので、RDF パース中は chokan が他の処理しないかもしれない。

作るにあたって Using Rena to Process RDF in Ruby が役に立った。

よく考えると open-uri に Accept ヘッダを加えるのは無理 (もしくはめんどう) なので、最初から GET して、response.body を StringIO にして Rena に投げることにする。こうしないとネゴシエーション効いてる場合ダメになる。

メイン部分のコード。

# uri は読み込んだ RDF の URI の URI クラスのインスタンス
# res は HTTP#get の値
model = Rena::MemModel.new
model.load(StringIO.new(res.body),{
:content_type => Regexp.last_match[0],
:base => uri.to_s
})
resource = model[uri.to_s] # 相対 URI は絶対 URI に変換されている。
if resource &&
resource.get_property(RDF + "type").uri == URI.parse(FOAF + "PersonalProfileDocument")
mes = "foaf:PersonalProfileDocument"
foaf = resource.get_property(FOAF + "primaryTopic")
nick = foaf.get_property_values(FOAF + "nick")
name = foaf.get_property_values(FOAF + "name")
# string_array は rdf:Alt とかも全部ひっくるめて単一の文字列の配列にする
mes += " [nick:#{string_array(nick).join(", ")}]" unless nick.empty?
mes += " [name:#{string_array(name).join(", ")}]" unless name.empty?
subject << notice(channel, mes.to_jis)
else
puts "Not FOAF"
end
  1. トップ
  2. rdf
  3. chokan & FOAF
  1. トップ
  2. sw
  3. chokan & FOAF
  1. トップ
  2. irc
  3. chokan & FOAF

/view-img/2003/ みたいな。

RDF は画像ファイル自身に埋め込んだのを取り出していちいち動的に合成してる。現状では同じディレクトリに samp-meta.rdf があるからそっち直接読んでもいいんだけど……実験ってことで……

合成するとき REXML 使ってるから怪しい XML (名前空間接頭辞が他のファイルと違うとか) があるとたぶんパースエラーになる。稀なケースだし Ruby のライブラリでガッチリキッチリ実装した使いやすいやつを知らないので仕方ない。

ローカル側では RDF を埋め込む (ファイル名に -meta.rdf をつけたやつを突っ込む) ときに画像サイズが一定以上だったらサムネイルを作って、その情報 (foaf:thumbnail) も追加して埋め込む。

サーバー側は同じディレクトリの画像をスキャンして RDF を取り出し、@rdf:about を書き換えて合成。合成したヤツを XSLT エンジンに渡す。あとはまぁ普通に XSLT テンプレの仕事で……

ちなみにファイル名のリストは別に XML 作って渡してる。丁度いい語彙があれば RDFRDF として突っ込んだほうがスマートだけど考えるのが面倒だった。

だいぶソースが汚い。

  1. トップ
  2. sw
  3. 画像をてきとーに一覧表示する。
  1. トップ
  2. web
  3. 画像をてきとーに一覧表示する。
  1. トップ
  2. xslt
  3. 画像をてきとーに一覧表示する。