Hatena::Groupkdri

KazusaAPI開発日誌 このページをアンテナに追加 RSSフィード

2008-05-27

Atom フィードを追加する。

|  Atom フィードを追加する。 - KazusaAPI開発日誌 を含むブックマーク はてなブックマーク -  Atom フィードを追加する。 - KazusaAPI開発日誌  Atom フィードを追加する。 - KazusaAPI開発日誌 のブックマークコメント

かずさアノテーションに Atom フィードを追加してみた。

かずさアノテーションにはウェブページ、ブックマーク、ユーザ、タグといったリソースとしてある。それぞれのリスト表示とエントリ表示に Atom フィードを追加した。すべてのリソースがブックマークを経由して関連しているので、Atom フィードの entry はほとんどがブックマークとなっている。例えば、ユーザページの Atom フィードは、そのユーザの新着ブックマークというように、ブックマークをフィルタしているだけとする。

フィードの設計

Atom フィードを追加するのは次のページ:

  1. /
  2. /annotation
  3. /annotation/show/:id
  4. /:user_login
  5. /bookmark
  6. /bookmark/show/:id
  7. /tags
  8. /tags/show/:id

新着アノテーションの Atom フィードの作成

500 Internal Server ErrorAtom フィードは http://a.kazusa.or.jp/annotation?style=atom である。

ブラウザにフィードを表示するために、app/views/layout/annotation.rhtml の head タグの中に Auto-discovery を埋め込む。Action 毎にフィードのURLを変更するのは、@atom_hash 経由でおこなう。

<%= auto_discovery_link_tag(:atom, @atom_hash) %>

app/controllers/annotation_controller.rb で style=atom 付きの URLAtom フィードとなるようにする。

  def index
    list
  end
  # 中略
  def list
    # 中略
    @atom_hash = {:controller => 'annotation', :q => params[:q], :style => 'atom'}
    case params[:style]
    # 中略
    when 'atom'
      render :template => 'annotation/list.rxml', :layout => false
    else
      render :action => 'list'
    end
  end

q={keyword} を考慮しているので、検索結果のフィードにもなっている。

Atom フィードのテンプレート app/views/annotaton/list.rxml を作成する。

xml.instruct! :xml, :version => 1.0, :encoding => 'UTF-8'
xml.feed 'xmlns' => 'http://www.w3.org/2005/Atom' do
  xml.title 'KazusaAnnotation - Recent annotations'
  xml.link :rel => 'alternate', 
           :href => url_for(:action => '', :q => params[:q], :only_path => false)
  xml.link :rel => 'self', 
           :href => url_for(:action => '', :q => params[:q], :feed => 'atom', :only_path => false)
  xml.id url_for(:action => '', :q => params[:q], :only_path => false)
  xml.updated @bookmarks.first.created_at
  xml.author { xml.name 'Kazusa DNA Research Institute' }
  @bookmarks.each do |bookmark|
    xml.entry do
      xml.title bookmark.page.title
      xml.link :rel => 'alternate', 
               :href => url_for(:controller => 'bookmark', :action => 'show', :id => bookmark.id, :only_path => false)
      xml.id url_for(:controller => 'bookmark', :action => 'show', :id => bookmark.id, :only_path => false)
      xml.updated bookmark.created_at
      xml.author { xml.name bookmark.user.login }
      xml.summary bookmark.tags.map {|x| '[' + x.name + ']' }.to_s
      xml.content 'type' => 'text' do
        xml.text! bookmark.comment
      end
    end
  end
end

参照サイト


まとめ

  1. Rails アプリに Atom フィードを追加した。
  2. Atom で何を表現するかは、提供者の自由なので、自由すぎてこまった。
  3. Atom 中の link の関係に気を配る必要がある。
  4. RSS の方がフィードリーダーでの表現力がでるけど気にしない。
  5. 新着コンテンツがあるページはフィードをつけるべきである。
  6. 検索結果のフィードが便利すぎる。こんな、ユーザが選択できるコンテンツが変える世界がある。
  7. url_for の :only_path => false がわからなくて困った。
  8. app/views/layout/annotation.rhtml の中身をアクション毎に変更する方法がなかなか思いつかなかった。

2008-05-08

TogoWS 統合ウェブサービス REST API をつかってみた。

|  TogoWS 統合ウェブサービス REST API をつかってみた。 - KazusaAPI開発日誌 を含むブックマーク はてなブックマーク -  TogoWS 統合ウェブサービス REST API をつかってみた。 - KazusaAPI開発日誌  TogoWS 統合ウェブサービス REST API をつかってみた。 - KazusaAPI開発日誌 のブックマークコメント

統合ウェブサービスのREST APIがすてきなので、つかってみた。

screenshot

TogoWS とは、ウェブサービスによって DDBJ, KEGG, PDBj, CBRC の4センターをバーチャルに統合し、国内の主要データベースと解析サービスを透過的に利用可能にする取り組みです。これまで4センターで独自に開発されてきたウェブサービスの API を、ライフサイエンス統合データベースセンターにおいて一元的に利用できるようにし、相互に連携するために必要な追加機能を提供することで、ワークフローを容易に構築できる環境をユーザに提供します。

TogoWS

TogoWS 自体がクエリのキャッシュをしているので、繰り返しアクセスしても、サーバ側の負荷にならないので、各サービスを直接アクセスするよりいろいろリソースに優しい設計になっている、とのこと。

利用シーン

文献の PubMed ID (PMID) だけもっているときに、その文献のタイトル、著者名、雑誌名を知りたい。→それTogoWSでできるよ。

タイトルの取得

From genomics to chemical genomics: new developments in KEGG.

http://togows.dbcls.jp/entry/pubmed/16381885/ti

著者名の取得

Kanehisa, M.

Goto, S.

Hattori, M.

Aoki-Kinoshita, K. F.

Itoh, M.

Kawashima, S.

Katayama, T.

Araki, M.

Hirakawa, M.

http://togows.dbcls.jp/entry/pubmed/16381885/authors

掲載雑誌名の取得

Nucleic Acids Res. 2006 Jan 1;34(Database issue):D354-7.

http://togows.dbcls.jp/entry/pubmed/16381885/so

文献の PubMed ID だけもっているときに、その文献のMeSHタームを知りたい。→それTogoWSでできるよ。

*Biotransformation
*Chemistry
*Databases, Factual
*Databases, Genetic
Environment
Enzymes/chemistry/genetics
*Genomics
Humans
Internet
Ligands
Pharmaceutical Preparations/chemistry/classification
Signal Transduction
Systems Integration
User-Computer Interface
http://togows.dbcls.jp/entry/pubmed/16381885/mesh

タンパク質知識ベース UniProt の ID だけもっているときに、その機能ドメインをしりたい。→それTogoWSでできるよ。


クロスドメインなのでAJAX.Update できない

嬉々として、開発中のサービスに次のようなコードを埋め込んでみるが、いっこうに表示されないし、通信が発生しない。

<script type='text/javascript'>
new Ajax.Updater({success: 'pmid-title'}, 
                 'http://togows.dbcls.jp/entry/pubmed/<%= pmid %>/ti',
                 {method: 'get'}); 
</script>
<div id='pmid-title'></div>

クロスドメインなのでコントローラを経由する

<script type='text/javascript'>
new Ajax.Updater({success: 'pmid-title'}, 
                 '/togows?db=pubmed&id=<%= pmid %>&field=ti',
                 {method: 'get'}); 
</script>
<div id='pmid-title'></div>

というようなに利用できる togows コントローラーを用意した。

app/controllers/togows_controller.rb

class TogowsController < ApplicationController
  require 'open-uri'

  def entry
    if uri = build_uri
      text = open(uri).read
    else
      text = '...'
    end
    render :text => text
  end

  private

  def build_uri
    base_uri = 'http://togows.dbcls.jp/entry'
    if params[:db] and params[:id] 
      uri = [base_uri, params[:db], params[:id]] * '/'
      uri += "/#{params[:field]}" if params[:field]
    else
      nil
    end
  end
end

表示されるようになった。

実際使っているサイト例: http://a.kazusa.or.jp/tags/pmid%3A8932316

screenshot

かずさアノテーションは PMID しか保持していない。

まとめ

  1. TogoWS REST API をつかってみた。
  2. /entry/{db_name}/{entry_id} は良い形式
  3. クロスドメイン問題はコントローラー経由で回避した。
  4. JSON 形式の返り値があると、コントローラー無くてもクロスドメインで取得できる。

2008-05-02

gbrowse の das から ProServer への移行(1)

|  gbrowse の das から ProServer への移行(1) - KazusaAPI開発日誌 を含むブックマーク はてなブックマーク -  gbrowse の das から ProServer への移行(1) - KazusaAPI開発日誌  gbrowse の das から ProServer への移行(1) - KazusaAPI開発日誌 のブックマークコメント

gbrowse の das から ProServer へ移行していきます。

gbrowse の das をいままで使っていましたが、いろいろと問題点が見えてきたので