NULL::something

Login via flickr, はてな, TypeKey.

2005-01-15

chokan & FOAF

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

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

URI (http:) が PRIV されたら HEAD

Inserted at 2005-01-15T20:19:02+09:00

でアクセスして、ステータスコードと 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 に投げることにする。こうしないとネゴシエーション効いてる場合ダメになる。

Inserted at 2005-01-15T20:19:46+09:00

メイン部分のコード。

# 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

Inserted at 2005-01-15T23:45:47+09:00

Comments (0)

Trackback URI: http://lowreal.net/logs/2005/01/15/2.trackback

NULL

RSS feed meter for http://lowreal.net/logs/latest

Alternates

  1. RSS 1.0
  2. Atom 1.0

Generated with Taglibro

この日記は Taglibro と呼ばれる XML ベースの XSLT をテンプレートとして使ったシステムを使っています。現在の Taglibro は Ruby, ruby-xslt, libxml-ruby による実装です。ソースコードはとりあえず公開していません。