2005-01-15 ========== chokan & FOAF ------------- Reference URI: http://lowreal.net/logs/2005/01/15/2 Written Time: 2005-01-15T18:04:08+09:00 Tags: rdf sw irc 実験的に [Rena](http://raa.ruby-lang.org/project/rena/) を使ってみたかったので、よろしそうなプログラムを考える。 IRC (Internet Relay Chat) BOT に何か FOAF (Friend Of A Friend) アレこれできるような機能をつけてみたかった (意味があるかは考えない) ので、とりあ えず URI (Uniform Resource Identifer | Universal Resource Identifer) に反応して、それが FOAF (Friend Of A Friend) だったら foaf:nick と foaf:name をとってくるようにしてみた。 URI (Uniform Resource Identifer | Universal Resource Identifer) (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 (Internet Relay Chat) に NOTICE Rena は結構遅いので、RDF (Resource Description Framework) パース中は chokan が他の処理しないかもしれない。 作るにあたって [Using Rena to Process RDF in Ruby](http://www.fakeroot.net/sw/rena-intro/) が役に立った。 よく考えると open-uri に Accept ヘッダを加えるのは無理 (もしくはめんどう) なので、 最初から GET して、response.body を StringIO にして Rena に投げることにする。こう しないとネゴシエーション効いてる場合ダメになる。 メイン部分のコード。 # uri は読み込んだ RDF の URI の URI クラスのインスタンス# res は HTTP#get の値mo del = Rena::MemModel.newmodel.load(StringIO.new(res.body),{ :content_type => R egexp.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:PersonalProfi leDocument" foaf = resource.get_property(FOAF + "primaryTopic") nick = foaf .get_property_values(FOAF + "nick") name = foaf.get_property_values(FOAF + "na me") # string_array は rdf:Alt とかも全部ひっくるめて単一の文字列の配列にする mes += " [nick:#{string_array(nick).join(", ")}]" unless nick.empty? mes += " [name:#{string_array(name).join(", ")}]" unless name.empty? subject << noti ce(channel, mes.to_jis)else puts "Not FOAF"end