Skip to main content
2009/06/23
                   webjourney.org
               Yohei Sasaki / yssk22

CouchDB or Erlangを使って
やってみたいアプリケーション
自己紹介

 Yohei Sasaki
   http://www.yssk22.info/
   仕事の時は ysasaki2
     developerWorks にCouchDBの記事を書いてます。
       5回連載 3ヶ月で終わる予定が、1年で4回 orz


   趣味の時は yssk22 (← 今日はこっち)
     http://d.hatena.ne.jp/yssk22
WebJourney
http://journal.mycom.co.jp/series/webtool/026/index.html
WebJourney

 iGoogle を Rails で作ってみたもの
 jQuery + Rails + CouchDB 0.9.0 で実装
   昔はMySQL(その話は後ほど)
さらに、今なら OpenSocial
OpenSocial + CouchDB
= Open Web Application
 OpenSocial
   自由にアプリケーションを持ち運べる


          CouchDB
            自由にデータを持ち運べる



          データとアプリケーションに
           明確な境界など要らない?
2009/06/23
                   webjourney.org
               Yohei Sasaki / yssk22

CouchDB で始める
ActiveRecord からの脱却
これからの話

 "CouchDBに興味があって、最近始めた"~
 "CouchDBのアプリを作ってみようかなっ
 て思い始めた"人くらいを主なターゲット
 にしています。

 Rails 使い がCouchDBのアプリを作ってみ
  ようかなー、と思い始めたときの話。
 Relational DB から CouchDB へのreplace
長年の悩み::
GadgetをRDBに保存するのは難しい
 Gadget のデータ、スキーマ
  はユーザーが追加するまで
  決められない。
 Gadget は必要に応じて追加
  開発するから最初からス
  キーマを定義できない
そうはいっても
ActiveRecord + MySQL
ActiveRecord による実装
                            pages
pages                        - 各ページのデータ
                            gadget_instances
                             - ページに貼り付けられた
                               gadgetのデータ
                            gadgets
          gadget_instance
                             - サイトにインストールされた
                 s
                               gadget のマスターデータ



gadgets                     意外と簡単そう???
ActiveRecord による実装
                           class GadgetInstance 
pages
                             < ActiveRecord::Base
                             validates_length_of :title, ...
                             validates ...


                             serialize :parameters
         gadget_instance
                           end




gadget
                 結局KeyValueにシリアライズ!
GadgetInstance#parameters

 Gadget 開発者がそれぞれのGadgetアプリ
  ケーションに応じて利用可能なフィールド
  RSS のフィードURL
  Blog Parts のようなJavaScript スクリプト
  ...


 gi.parameters[:feed_url] = "http://...."
 とか
 gi.parameters[:script][:src] = "http://..."
 とか
抱える問題 = クエリ

 GadgetデータをRDBに入れるのは簡単
  ADO.NET の場合:: XML列にMapping (SQL Server)
  Rails の場合:: YAMLで放り込む

  Object → XML/YAML は比較的楽


 しかし、クエリで取り出せない罠
  XQuery 勉強する暇あったらORMなんか使いませんよ!
  玉石混交のユーザーデータをフィルタできないなん
  て!!
    例えば、Feed Gadgetなら設定されたURLのランキングを
     とりたい、とか。
そこでCouchDB
きっかけ

 ロゴが気に入った。
 勉強する時間が欲しかった。
  特にErlang
 HTTP
 JSON
 MapReduce
  これなら、JavaScriptでクエリでき
   る!!
Active Record => CouchDB
移植開始
 中のロジックを変えるのが面倒だったの
 で、ActiveRecord とインターフェースをそ
 ろえた CouchDB Mapper 作る

 3ヶ月ぐらいで、いい加減実装完了
  CouchResource
   http://github.com/yssk22/couch_resource/tree/mast
    er
結果
  class GadgetInstance < CouchResource::Base
       string :title, :validates => [:length_of => ..]

        object :parameters
  end

 GadgetInstance.find(...) でCouchDBのビューが呼ばれるので、
  クエリもサポート!
 Gadget 開発者が自由にデータを使える(クエリも含めて!
 ActiveRecord のノリで開発できる!
     ほとんど記法は同じ。
       migration 部分はクラスに直接かく
          他のCouchDB Mapper でも property :title, :as => :string とか。
CouchResource

 ○
  バリデーション: validates_xxx サポート
  コールバック: before|after_xxx サポート
  JSONデータ型 : string :title などのようにマッ
   ピング時の型変換ルールをかける
  クエリ : find メソッド使える
 △
  関連 : habtm, has_many, belongs_to などはいら
   ないので作らなかった
  CouchRest のようにストリーミングしない。
Good by
Relational
Database
とりあえず結論
 serializeとか STI (Single Table Inheritance / 同じテーブルを複数
  クラスで使い回す)とか使いたくなってくるところには
  CouchDBみたいなもの
     入れる(INSERT/UPDATE)だけなら、そこまで無理なくていい

 (item_name, value) なんていうテーブルがあったら、
  CouchDBを検討してみるといい!
     Form の項目をDBに保存しているときとか。

 がんばればActiveRecordっぽく、CouchDBを使える!
     Merb::DataMapper のCouchDB Adapterももあるらしい。

 CouchDB は、(alpha stageっていってるけど)わりと素直に動
  きます。
     compaction さえ忘れなければ。
Do you realy
   need
app server?
わき上がる疑問:: Rails要るの?


JavaScriptで
バリデーションとか


     Rails が Hashを          Ruby でバリデーションとか
     CouchResourceに



                      CouchResourceを
                      Hash経由でJSONに
結果

 jQuery から 直接 CouchDB たたけばいい
 CouchDB にビジネスロジック書いておけば
 OK
  奥の手External Process
    CouchDB と任意のコマンドラインプロセスをPipeで
     つなぐことができる
       script/runner でもOK


 さようならRails, こんにちはCouchDB
  CouchAppもヨロシク。
Good by
 Rails
Ruby off Rails

 Rails で RDB 使わないのは敷居が高すぎる
  問い合わせ;
    MySQLで動かないようなんだけどSQLiteじゃな
     いとだめ?どのDB使えばいいの?
  回答:
    いや、RDBじゃだめw CouchDBインストールして。
  結果:
    連絡が途絶えた
CouchResource

 ×
  終了のお知らせ。
  ActiveRecord 思想にこだわった時点で終了のお
   知らせだったか。
  trac にかいといたドキュメントがlost
  CouchRest がいい。




 がんばって作ってみたけど、だめでした。
CouchDBで Web Appを作る。

 まさに CouchApp の世界
  セキュリティは[あとで]。
   とりあえず、リラックスすれば、世の中みんな
    いい人しかいないと思えてくる!!!
@これから