聞くところによると,CouchDB の魅力ってのは,ドキュメント指向であったり,Map/Reduce であったり,その辺りにあるらしいのですが,ボクはまだよく分かっていません.このエントリでは,後述の目的を果たすために,CouchDB をサーバにインストールして動かしてみて,永続化ハッシュとして利用するために,値の格納と取得をやってみた,ってところまで扱います.その先の話はエントリを改めてまた今度.
目的
よく,cron なんかで定期実行させるスクリプトの中で,前回実行時の情報をファイルに保持させたりしている.これだとスクリプトを実行させるマシンが変わったときにそのファイルも忘れずに移動させなきゃいけないし,複数マシンで実行させるスクリプトともなると,協調が大変.そこで,情報を保持する箇所をひとつにし,かつ,どのマシンからでも情報を読み書きできる仕組みを用意し,ファイルに保持させないようにする.
CouchDB のインストール
Debian 機にインストールした.参考にしたのは以下のエントリ.ありがとうございました.
- Barking Iguana: Installing CouchDB 0.8.0 on Ubuntu 8.04
- ricollab Web Tech Blog » Blog Archive » CouchDB について Erlang 分散システム勉強会で紹介してきました
インストールしたサーバに設定したポート(デフォルトは5984)
http://my.server.jp:5984/
でアクセスすると
{"couchdb":"Welcome","version":"0.8.0-incubating"}
が返ってくる.ここがすでに JSON だ.楽しい.
ご丁寧にブラウザから中身を操作できる管理画面がついてくる.ここからデータベースを作成したり,レコードの値を書き換えたりできる.
http://my.server.jp:5984/_utils/
couchdb.rb
今回使いたい get と put だけを実装した.公式のサンプルでは JSON 文字列を受け渡ししているんだけど,Ruby のハッシュをそのまま与えるようにしてみた.
photoshare2twitter.rb
ボクが iPhone で撮った写真をアップしている Big Canvas PhotoShare から,新着があれば Twitter に流すっていうサンプル.
Pit で CouchDB のホストとポートを取ってきて,photoshare ってデータベースの latest_processed_photo っていうドキュメントを get する.最後に処理した id より新しい id を持つ写真があれば put でデータを更新する.まさに Java の Map#get,Map#put と変わらない感じで書ける.ただし _rev ってのはリビジョン番号を表していて,これを正しく渡してやらないと
412: Precondition Failed (前提条件で失敗した)
が返ってくる.複数のトランザクションが同じドキュメントにアクセスするとき,整合性を保つために必要なのだろう.REST について勉強したときも感じたけど,HTTP メソッドとかステータスコードとか,すでにあるものをきちんと理解して,正しく使うってのは大事だなぁ.勉強になります.
今回のサンプルは,データベースもドキュメントもすでに存在することを前提としているから,本当は存在しなかったら作成するとか,そういう処理が必要だ.エラーメッセージも JSON に格納されて返ってくる.
まとめ
ひとまず目的は達成できました.最低限の機能でよければ CouchDB のラッパーは簡単に書けてしまう(中身は HTTP のリクエストを呼んでいるだけ) し,とても手軽に使える.
せっかくインストールしたんだから,もうちょっと凝った使い方もしてみたい.次に触ってみたいのは Map/Reduce です.