Apache CouchDB再入門<br />2010/04/23<br />id: yssk22 (CouchDB-JP)<br />
自己紹介<br />Yohei Sasaki (yssk22)<br />developerWorks のCouchDB連載記事<br />CouchDB基礎文法最速マスター<br />CouchDB-JP<br />People on the...
はじめに / お願い<br />質問は随時... というのは大変なのでハッシュタグ #bpstudyを添えてつぶやいてください。<br />つぶやきに 半角?または全角? をいれていただければ回答します。<br />ハンズオン用URL<br /...
目次<br />CouchDBとは何か?<br />HTTP API<br />MapReduce<br />CouchDB Application<br />
CouchDBとは何か?<br />まずは思想的な話から...<br />
CouchDBとは何か?<br /><ul><li>KVSっぽいデータストア
Apache プロジェクト
HTTP によるアクセス
MapReduceでクエリができる
Erlangで実装されたデータベース
Lotus Notes みたいなレプリケーション
すべて正しいけれど、その前にもっと本質的な話を...</li></li></ul><li>CouchDBの思想の原点: Relax<br /><ul><li>CouchDB: The Definitive Guide より...</li></u...
データモデルに対するアプローチ<br />Webそのもの。<br />WWW はデータベース<br />WWW はドキュメント指向データベース<br />Django may be built for the Web, but CouchDB ...
例:請求書<br />請求元: hogehoge株式会社<br />請求先:<br />郵便番号: 123-4567<br />住所: 神奈川県川崎市...<br />氏名: 佐々木庸平<br />請求金額: 12,345<br />明細:<b...
例:請求書 (RDBの場合)<br />請求元: 1<br />請求先: 3<br />請求金額: SUM(小計)<br />明細<br />商品数量金額小計1	1	1.P	1 * 1.P<br />2	3	2.P	3 * 2.P<br />1...
正規化とドキュメント指向の狭間<br /><ul><li>正規化の利点はデータの整合性を保つこと。
例えば、請求書の発行後に住所が変わったら?
顧客マスタ上の住所を変更する
あれ? 昔の請求書の住所までかわっちゃったんだけど...
現実世界の"ドキュメント"は整合性を保たないほうがよい場合も。
現実世界のとおりであることが当たり前 = Relax
Web を作るイメージでデザインするとしっくりくる。</li></ul>1 URI = 1 ドキュメント<br />でも、マスタ管理はしたい。<br />
ドキュメント指向的アプローチ<br />請求元: hogehoge株式会社<br />請求先:<br />郵便番号: 123-4567<br />住所: 神奈川県川崎市...<br />氏名: 佐々木庸平<br />請求金額: 12,345<b...
データモデルを定義するタイミング<br /><ul><li>RDB
最初に蓄積すべきデータをモデル化しておく
業務分析
エンティティを切り出し
正規化
業務の決まりを事前定義
CouchDB
随時やる</li></ul>業務の決まりを随時定義<br /><ul><li>現実世界で随時やるように...</li></li></ul><li>スケールに対する考え方<br />CouchDBにとっての基幹システム<br />ユーザーのブラウ...
通勤経路の稼働率<br />稼働率 24min/30min : 80%<br />具体的なサービスの例:<br />gmail, google reader, twitter, hatena.ne.jp, ...<br />サービス提供側として...
レプリケーションによる可用性の確保ができるかもしれない<br />1台になっても、<br />N台になっても対応できるストレージシステム<br />App<br />HTTP<br />App<br />
ここまでのまとめ<br />CouchDB = Relax<br />当たり前のことを当たり前に。<br />データモデルに対するアプローチ<br />ドキュメント指向<br />スケールに対するアプローチ<br />スケールダウン<br />...
HTTP API<br />実際の使い方<br />
CouchDBの使い方<br />HTTP で使う<br />使い方 = Web で当たり前の使い方<br />GET 		: ドキュメントを取得する<br />POST 	: ドキュメントを作成する<br />PUT 		: ドキュメントを更...
ドキュメントの表現方法<br />JSONで記述<br />すべてのドキュメントは一意に識別するためのIDとバージョン番号REVをもつ<br />他は自由<br />{ <br />"_id" : "請求番号XXXXYYYY", "_rev" ...
Futon による確認<br />GUI Tool<br />http://localhost:5984/_utils/<br />Firefox + Firebug を使うのがbetter<br />デモ<br />
補足: リビジョン管理<br />CouchDBはMVCCによりディスクアクセスを行う<br />データの更新操作(PUT)は、論理更新であり物理的には追加が行われる。<br />_rev には"更新回数-ドキュメントのMD5" が格納されてい...
HTTP API 一覧<br />後でリファレンス的に利用できるようにSphinx Document にまとめみました<br />http://bit.ly/b008oP<br />HTTPメソッドは省略<br />慣習に従えばよいので。<br...
HTTP Header も活用しよう<br />Request<br />X-Couch-Full-Commit<br />true<br />レスポンス前に確実にディスクに書き込む<br />帳票などのドキュメントに使う<br />false...
そのほかの主要機能<br />レプリケーション<br />二つのデータベースの同期をとる<br />P2P モデルで、双方向に同期をとることができる。<br />半自動実行なので、ネットワークが切れても問題がない。<br />添付ファイル<br...
各種言語からの利用<br />HTTPライブラリとJSONライブラリが必要十分条件<br />以下独断と偏見によるおすすめ<br />JavaScript<br />/_utils/script/jquery.couch.jsが標準添付<br ...
MapReduce<br />データ処理のための手法...<br />
デザインドキュメント<br />デザインドキュメント<br />CouchDBに格納されるアプリケーションを定義したドキュメント<br />ビュー<br />デザインドキュメントの中に定義するMapReduce関数を記述し、インデックスを作成す...
デザインドキュメントの構成<br />{   "_id" : "_design/app",   "_rev" : "3-XXXXXX",   "language" : "text/javascript",   "views" : {      ...
ビューの用途<br />基本<br />ドキュメントのフィルタリング<br />並び替え<br />内部的にはインデックスを作る作業<br />ドキュメントを効率的に見つけるために!<br />様々な計算<br />SUM  とか。<br />...
MapReduce<br />Map<br />1つのドキュメントから別のデータを作成する。<br />別のデータ : Key-Value の組み合わせ<br />Reduce<br />Keyが同じデータの集合から、データを集約して1つの値を...
サンプルデータ<br />ハンズオンでやります。<br />http://search.twitter.com/?q=%23bpstudy <br />{ "_id": "479ce1c32f79d7864730ecbae60d6610",  ...
map 関数 の書き方<br />function(doc){   emit(key, value);emit(key, value);   ...}<br />emit(key, value)<br />
発言者ごとにemitする<br />function(doc){   function format_date() { ... }; // 省略   if( doc.type == ''tweets'' ){var t = format_dat...
結果<br />/{db}/_design/{app} /_view/{viewname} で確認可能<br />{"total_rows":169,"offset":0,"rows":[<br />{"id":"...","key":["AE...
ビューに対してクエリをかける<br />よく使うのは範囲指定<br />startkey=xxx&endkey=yyyy<br />特定の発言者だけ時系列にとりだす<br />startkey=["yssk22"]&endkey=["yssk2...
CouchDBのMapReduceの特徴<br />B+Tree構造でディスクに結果を保持<br />インクリメンタルに実行される<br />一度計算した結果は、元のドキュメントが更新されない限りキャッシュが保持される。<br />
CouchDBのMapReduceの特徴<br />B+Tree構造でディスクに結果を保持<br />インクリメンタルに実行される<br />一度計算した結果は、元のドキュメントが更新されない限りキャッシュが保持される。<br />オンラインシ...
Upcoming SlideShare
Loading in …5
×

BPStudy32 CouchDB 再入門

3,519 views
3,370 views

Published on

CouchDB introduction at BPStudy.

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,519
On SlideShare
0
From Embeds
0
Number of Embeds
159
Actions
Shares
0
Downloads
35
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

BPStudy32 CouchDB 再入門

  1. 1. Apache CouchDB再入門<br />2010/04/23<br />id: yssk22 (CouchDB-JP)<br />
  2. 2. 自己紹介<br />Yohei Sasaki (yssk22)<br />developerWorks のCouchDB連載記事<br />CouchDB基礎文法最速マスター<br />CouchDB-JP<br />People on the Couch: UTC+9<br />今年から某ECサイトの開発<br />
  3. 3. はじめに / お願い<br />質問は随時... というのは大変なのでハッシュタグ #bpstudyを添えてつぶやいてください。<br />つぶやきに 半角?または全角? をいれていただければ回答します。<br />ハンズオン用URL<br />http://bit.ly/6rXbn5<br />
  4. 4. 目次<br />CouchDBとは何か?<br />HTTP API<br />MapReduce<br />CouchDB Application<br />
  5. 5. CouchDBとは何か?<br />まずは思想的な話から...<br />
  6. 6. CouchDBとは何か?<br /><ul><li>KVSっぽいデータストア
  7. 7. Apache プロジェクト
  8. 8. HTTP によるアクセス
  9. 9. MapReduceでクエリができる
  10. 10. Erlangで実装されたデータベース
  11. 11. Lotus Notes みたいなレプリケーション
  12. 12. すべて正しいけれど、その前にもっと本質的な話を...</li></li></ul><li>CouchDBの思想の原点: Relax<br /><ul><li>CouchDB: The Definitive Guide より...</li></ul>If there’s one phrase to describe CouchDB it is relax.<br />making CouchDB easy, event a pleasure, to use.<br />当たり前のことが当たり前に感じられる道具であること。<br />開発するときの当たり前感<br />ドキュメント指向<br />運用するときの当たり前感<br />いつでも利用可能<br />
  13. 13. データモデルに対するアプローチ<br />Webそのもの。<br />WWW はデータベース<br />WWW はドキュメント指向データベース<br />Django may be built for the Web, but CouchDB is built of the Web.<br /><ul><li>Jacob Kaplan-Moss, Django Developer</li></ul>Document Oriented Database<br />Webで実現する文書そのものを格納するためのデータベース。<br />
  14. 14. 例:請求書<br />請求元: hogehoge株式会社<br />請求先:<br />郵便番号: 123-4567<br />住所: 神奈川県川崎市...<br />氏名: 佐々木庸平<br />請求金額: 12,345<br />明細:<br />商品数量金額小計AAAA 1 1,980 1,980<br />BBBB 3 1,210 3,630<br />...<br />CouchDBにおける1つの保存単位- ドキュメント<br />
  15. 15. 例:請求書 (RDBの場合)<br />請求元: 1<br />請求先: 3<br />請求金額: SUM(小計)<br />明細<br />商品数量金額小計1 1 1.P 1 * 1.P<br />2 3 2.P 3 * 2.P<br />1, hogehoge株式会社<br />3, 123-4567, 神奈川県..., 佐々木庸平<br />10, 1, 1<br />1, AAAA, 1,980<br />10, 2, 3<br />2, BBBB, 1,210<br />正規化!正規化!正規化!<br />
  16. 16. 正規化とドキュメント指向の狭間<br /><ul><li>正規化の利点はデータの整合性を保つこと。
  17. 17. 例えば、請求書の発行後に住所が変わったら?
  18. 18. 顧客マスタ上の住所を変更する
  19. 19. あれ? 昔の請求書の住所までかわっちゃったんだけど...
  20. 20. 現実世界の"ドキュメント"は整合性を保たないほうがよい場合も。
  21. 21. 現実世界のとおりであることが当たり前 = Relax
  22. 22. Web を作るイメージでデザインするとしっくりくる。</li></ul>1 URI = 1 ドキュメント<br />でも、マスタ管理はしたい。<br />
  23. 23. ドキュメント指向的アプローチ<br />請求元: hogehoge株式会社<br />請求先:<br />郵便番号: 123-4567<br />住所: 神奈川県川崎市...<br />氏名: 佐々木庸平<br />請求金額: 12,345<br />明細:<br />商品数量金額小計AAAA 1 1,980 1,980<br />BBBB 3 1,210 3,630<br />...<br />hogehoge株式会社<br />佐々木庸平<br />AAAA, 1,980<br />BBBB, 1,210<br />台帳から書き写す、という事務処理<br />
  24. 24. データモデルを定義するタイミング<br /><ul><li>RDB
  25. 25. 最初に蓄積すべきデータをモデル化しておく
  26. 26. 業務分析
  27. 27. エンティティを切り出し
  28. 28. 正規化
  29. 29. 業務の決まりを事前定義
  30. 30. CouchDB
  31. 31. 随時やる</li></ul>業務の決まりを随時定義<br /><ul><li>現実世界で随時やるように...</li></li></ul><li>スケールに対する考え方<br />CouchDBにとっての基幹システム<br />ユーザーのブラウザ<br />Webのだめなところ<br />レイテンシー<br />ユーザーネットワークはSPoF<br />スケールダウンしても利用可能なサービスを提供する<br />アプリケーションとデータ(のサブセット)を丸ごとユーザーに複製させる<br />
  32. 32. 通勤経路の稼働率<br />稼働率 24min/30min : 80%<br />具体的なサービスの例:<br />gmail, google reader, twitter, hatena.ne.jp, ...<br />サービス提供側としては100%を目指しているのを十分承知しているものの...<br />
  33. 33. レプリケーションによる可用性の確保ができるかもしれない<br />1台になっても、<br />N台になっても対応できるストレージシステム<br />App<br />HTTP<br />App<br />
  34. 34. ここまでのまとめ<br />CouchDB = Relax<br />当たり前のことを当たり前に。<br />データモデルに対するアプローチ<br />ドキュメント指向<br />スケールに対するアプローチ<br />スケールダウン<br />レプリケーション<br />
  35. 35. HTTP API<br />実際の使い方<br />
  36. 36. CouchDBの使い方<br />HTTP で使う<br />使い方 = Web で当たり前の使い方<br />GET : ドキュメントを取得する<br />POST : ドキュメントを作成する<br />PUT : ドキュメントを更新する<br />DELETE : ドキュメントを削除する<br />Web の常識をしっていれば、どの言語/ランタイムでもCouchDBは簡単<br />「Webを支える技術」参照<br />
  37. 37. ドキュメントの表現方法<br />JSONで記述<br />すべてのドキュメントは一意に識別するためのIDとバージョン番号REVをもつ<br />他は自由<br />{ <br />"_id" : "請求番号XXXXYYYY", "_rev" : "3-ZZZZZMMMM""発行者": "hogehoge株式会社"<br />"請求先": {<br />"郵便番号": 123-4567"<br /> "住所": "神奈川県川崎市..."<br />"氏名": "佐々木庸平"<br />},<br />"請求金額": 12345<br />"明細": [<br /> { "商品: "AAAA", "数量": 1, "単価": 1980, "小計": 1980 },<br /> ...<br /> ]<br />}<br />
  38. 38. Futon による確認<br />GUI Tool<br />http://localhost:5984/_utils/<br />Firefox + Firebug を使うのがbetter<br />デモ<br />
  39. 39. 補足: リビジョン管理<br />CouchDBはMVCCによりディスクアクセスを行う<br />データの更新操作(PUT)は、論理更新であり物理的には追加が行われる。<br />_rev には"更新回数-ドキュメントのMD5" が格納されている<br />_rev を使った Optimistic Lock により更新の衝突を検出する<br />Compaction という操作により、古いリビジョンは削除される<br />
  40. 40. HTTP API 一覧<br />後でリファレンス的に利用できるようにSphinx Document にまとめみました<br />http://bit.ly/b008oP<br />HTTPメソッドは省略<br />慣習に従えばよいので。<br />XXを実行する 系はPOST<br />ハンズオンで curl を使って試します。<br />
  41. 41. HTTP Header も活用しよう<br />Request<br />X-Couch-Full-Commit<br />true<br />レスポンス前に確実にディスクに書き込む<br />帳票などのドキュメントに使う<br />false<br />ディスクに書き込む前に HTTP 201 を返す<br />ポストイット的なドキュメントに使う<br />Response<br />ETag<br />ドキュメントの _rev と同じ値が入る<br />JSONのparseをしなくても_revを入手できる<br />
  42. 42. そのほかの主要機能<br />レプリケーション<br />二つのデータベースの同期をとる<br />P2P モデルで、双方向に同期をとることができる。<br />半自動実行なので、ネットワークが切れても問題がない。<br />添付ファイル<br />ドキュメントにはバイナリファイルを添付できる。<br />メディア+メタデータ管理とかに利用可能<br />
  43. 43. 各種言語からの利用<br />HTTPライブラリとJSONライブラリが必要十分条件<br />以下独断と偏見によるおすすめ<br />JavaScript<br />/_utils/script/jquery.couch.jsが標準添付<br />Ruby<br />couchrest<br />Python<br />couchdb-kit<br />python-couchdb<br />Java<br />couchdb4j<br />
  44. 44. MapReduce<br />データ処理のための手法...<br />
  45. 45. デザインドキュメント<br />デザインドキュメント<br />CouchDBに格納されるアプリケーションを定義したドキュメント<br />ビュー<br />デザインドキュメントの中に定義するMapReduce関数を記述し、インデックスを作成する機能<br />
  46. 46. デザインドキュメントの構成<br />{ "_id" : "_design/app", "_rev" : "3-XXXXXX", "language" : "text/javascript", "views" : { "count_by_name" : { "map" : "function(doc){ ... }", "reduce" : "function(k,v,r){ ... }" } }, "shows" : ... "lists" : ...}<br />これ<br />
  47. 47. ビューの用途<br />基本<br />ドキュメントのフィルタリング<br />並び替え<br />内部的にはインデックスを作る作業<br />ドキュメントを効率的に見つけるために!<br />様々な計算<br />SUM とか。<br />応用<br />(データ構造の)フォーマット<br />"正規化", "非正規化" も含めて<br />覚えておくべきこと:<br />クエリではありません。<br />"クエリ"の機能 ... URLにクエリ文字列っていうものがありますよね?<br />
  48. 48. MapReduce<br />Map<br />1つのドキュメントから別のデータを作成する。<br />別のデータ : Key-Value の組み合わせ<br />Reduce<br />Keyが同じデータの集合から、データを集約して1つの値を計算する。<br />reduce フェーズと rereduce フェーズがある<br />
  49. 49. サンプルデータ<br />ハンズオンでやります。<br />http://search.twitter.com/?q=%23bpstudy <br />{ "_id": "479ce1c32f79d7864730ecbae60d6610", "_rev": "1-f45bf5f71b84692d0acc4b196849c2d7","iso_language_code": "ja", "type": "tweets", "keyword": "#bpstudy", "text": "1時間遅れたけど終わった。これであとは資料の残り半分を完成させればOK #bpstudy (といってハッシュタグのテスト)", "created_at": "Sat, 17 Apr 2010 19:07:16 +0000", "profile_image_url": "http://a3.twimg.com/profile_images/427387065/speedland_normal.png", "source": "&lt;ahref=&quot;http://sites.google.com/site/yorufukurou/&quot; rel=&quot;nofollow&quot;&gt;YoruFukurou&lt;/a&gt;", "from_user": "yssk22", "from_user_id": 3749810, "to_user_id": null, "geo": null, "id": 12356675615, "metadata": { "result_type": "recent" }}<br />
  50. 50. map 関数 の書き方<br />function(doc){ emit(key, value);emit(key, value); ...}<br />emit(key, value)<br />
  51. 51. 発言者ごとにemitする<br />function(doc){ function format_date() { ... }; // 省略 if( doc.type == ''tweets'' ){var t = format_date(t); emit([doc.from_user, t], null); }}<br />emit(key, value) で出力を定義<br />key はobject以外の任意の値<br />value は null でもよい。<br />undefined はJSONの仕様外なのでだめ<br />
  52. 52. 結果<br />/{db}/_design/{app} /_view/{viewname} で確認可能<br />{"total_rows":169,"offset":0,"rows":[<br />{"id":"...","key":["AE35","2010/04/02 01:36"],"value":null},<br />{"id":"...","key":["albuk","2010/04/01 15:36"],"value":null},<br />{"id":"...","key":["ali_lin5757","2010/04/05 20:02"],"value":null},<br />{"id":"...","key":["Amoreeeee","2010/04/06 15:45"],"value":null},<br />{"id":"...","key":["aodag","2010/04/02 01:57"],"value":null},<br />...<br />]}<br />
  53. 53. ビューに対してクエリをかける<br />よく使うのは範囲指定<br />startkey=xxx&endkey=yyyy<br />特定の発言者だけ時系列にとりだす<br />startkey=["yssk22"]&endkey=["yssk22", "u9999"]<br />["yssk22"] より大きくて、["yssk22", "u9999"] より小さいキーを抽出<br />配列は要素ごとに比較して順序づけ<br />文字列の最大値は u9999<br />
  54. 54. CouchDBのMapReduceの特徴<br />B+Tree構造でディスクに結果を保持<br />インクリメンタルに実行される<br />一度計算した結果は、元のドキュメントが更新されない限りキャッシュが保持される。<br />
  55. 55. CouchDBのMapReduceの特徴<br />B+Tree構造でディスクに結果を保持<br />インクリメンタルに実行される<br />一度計算した結果は、元のドキュメントが更新されない限りキャッシュが保持される。<br />オンラインシステムで使えるMapReduceの仕組み<br />再計算する<br />再計算しない<br />再計算しない<br />再計算しない<br />更新<br />
  56. 56. 発言数をカウントする<br />map 関数の定義<br />function(doc){ function format_date() { ... }; // 省略 if( doc.type == ''tweets'' ){var t = format_date(t); emit([doc.from_user, t], 1); }}<br />
  57. 57. 発言数をカウントする<br />reduce 関数の定義<br />function(keys, values, rereduce){ if( rereduce ){ return sum(values); // sum([2,5,3,4, ...]) }else{ return values.length; // [1,1,1,1,...].length }}<br />
  58. 58. rereduce に注意<br />MapReduceの<br />実行モデル<br />rereduce()<br />reduce()<br />
  59. 59. Rereduceに注意<br />これは正しく動かない場合がある<br />function(key, values, rereduce){ return values.length;}<br />これは正しく動くが遅い場合がある<br />function(key, values, rereduce){ return sum(values);}<br />reduce 結果のデータ構造は意識して計算を記述する<br />
  60. 60. CouchDB Application<br />アプリケーションとデータベースの奇妙な関係<br />
  61. 61. ちょっと前のWeb+DB<br />Web Server<br />Web Server<br />Web Server<br />Web Server<br />App Server<br />App Server<br />App Server<br />App Server<br />RDB Server<br />RDB Server<br />
  62. 62. 最近の Web+DB<br />Web Server<br />Web Server<br />Web Server<br />Web Server<br />App Server<br />App Server<br />App Server<br />App Server<br />DB Server<br />DB Server<br />DB Server<br />DB Server<br />RDBだったりKVSだったり...<br />
  63. 63. CouchDB = 1人で3役<br />Relax<br />Relax<br />Relax<br />Relax<br />
  64. 64. CouchDBはWebを作るデータベース<br /><ul><li>Webを作るのに必要な機能を一通りもっている。
  65. 65. HTTPリクエストに対して、以下の振る舞いを提供する
  66. 66. 静的なデータを返す
  67. 67. HTTP API
  68. 68. 動的なデータを返す
  69. 69. Show, List 関数
  70. 70. 適切な振り分けを行う
  71. 71. Virtual Host, URL Rewrite
  72. 72. 適切にデータを更新する
  73. 73. HTTP API, Update 関数, Validation 関数</li></li></ul><li>再びデザインドキュメント<br />{ "_id" : "_design/app", "_rev" : "3-XXXXXX", "language" : "text/javascript", "views" : ... "shows" : { "tweet": "function(doc, req){ ... }" } "lists" : { "timeline": "function(head, req){...}" }}<br />これ<br />
  74. 74. Show関数<br />ドキュメントを表示する.<br />/{db}/_design/{app} /_show/{showname}/{doc_id}<br />doc_idは Optional<br />JavaScript で記述 ... !?<br />Server Side JavaScript.<br />
  75. 75. tweet の表示<br />function(doc, req){<br />var t = require('vendor/crayon/lib/template');if(doc && doc.type == 'tweets'){<br /> bindings["page.title"] = "@" + doc.from_user + ": " + doc.text;<br /> bindings["tweet.id"] = doc.id;<br /> bindings["tweet.text"] = doc.text;<br /> ...<br />returnt.render(ddoc.templates.site.header, bindings) +<br />t.render(ddoc.templates.tweet, bindings) +<br />t.render(ddoc.templates.site.footer, bindings);<br /> }<br /> ...<br />URLからドキュメントを変数にマップ<br />3rd party ライブラリの利用<br />コンテンツを文字列で返す<br />
  76. 76. List関数<br />Viewの結果を表示する.<br />/{db}/_design/{app} /_list/{listname}/{viewname}<br />viewnameは 必須<br />クエリ文字列も利用可能<br />例によってJavaScript で記述<br />Server Side JavaScript.<br />
  77. 77. timeline の表示<br />function(head, req){<br /> provides(''html", function(){<br /> bindings["page.title"] = keyword;<br />send(t.render(ddoc.templates.site.header, bindings));<br /> send(t.render(ddoc.templates.timeline.header, bindings));<br /> while(row = getRow()){<br />var doc = row.doc;<br /> if( doc && doc.type == 'tweets'){<br /> $.extend(bindings, h.bind_tweet(doc));<br /> send(t.render(ddoc.templates.timeline.row, bindings));<br /> }<br /> }<br /> send(t.render(ddoc.templates.timeline.footer, bindings));<br /> return t.render(ddoc.templates.site.footer, bindings);<br /> });<br />}<br />Content Negotiation<br />Content-Length: chunked で送信開始<br />Viewの結果を1行ずつ取得して処理<br />
  78. 78. CouchDBで実装したオンラインTV録画システム<br />http://bit.ly/bX5i7Q<br />ソース:<br />http://github.com/yssk22/recstore<br />世界中のCouchDBソフトウェアはCouchDB wiki を参照。<br />
  79. 79. Server Side JavaScript Impl<br />CouchDBの場合は Spidermonkeyベースの実装<br />CGIのように動作する<br />couchjsというProcess Poolが都度実行<br />CouchDBのメインプロセスとPipeで通信<br />それほど早くないので注意<br />Server Side で実装してみて、遅ければブラウザに実行させるのもあり。<br />ドキュメントモデルと画面の差異が大きいほどJSで処理する量が多くなるので、その場合は設計を疑うのも○。<br />実際どこまでできる?<br />sandbox になっているので、ファイルを読んだり、外部リソースにアクセスすることはできない。<br />JSの実装が気に入らなければ、Python, Ruby など他の実装に切り替えることもできる。<br />
  80. 80. まとめ<br />CouchDBとは、Webの一部となるドキュメント指向データベース<br />Web を支える HTTP で操作される<br />データベースとアプリケーションサーバーがJavaScriptで完結する<br />time to relax.<br />

×