SlideShare ist ein Scribd-Unternehmen logo
1 von 53
はじめてのCouchDB
                     黒田英二
  http://blog.kuroda.me/eiji/
                10 May 2012




   1
CouchDBとは

Apache CouchDB
NoSQL
JSONを格納

Erlangで書かれてる

http://couchdb.apache.org/

              2
ところでNoSQL
SQLインターフェイスを持たないDB

スキーマレス

モデルの結合(JOIN)が出来ない

トランザクションがない

水平スケーラビリティー(スケールアウト)しやすい

キーバリュー型

  Cassandra, HBase, DynamoDB
ドキュメント指向

  MongoDB, CouchDB

                      3
CouchDBの特徴




4
主だった特徴

ドキュメント指向型

テーブルの概念が無い

プロトコルにHTTPを使う(CRUD)

最新のバージョンは1.20

クエリはMap/Reduceベース

マルチ・マスタのレプリケーション対応
           5
向いてるもの

辞書、図鑑、レシピ、名簿

テーブルの概念が必要ない

オブジェクト間で親子のような関連性が無い

オブジェクトにタグのようなツリー構造を含む

トランザクションの必要性が低い

更新頻度が低い

          6
不向きなもの

操作履歴、業務系データ、SNSのデータ

テーブルの概念が必要

オブジェクト間の関連が複雑

トランザクションが必要

更新頻度が高い

          7
インストール




8
Mac OSX 10.7+

必要な環境

       Xcode4.3+のCommand Line Tools

       ruby 1.9.3
brewでインストール
# 以前にCouchDBをインストールしてたら
brew remove --force openssl erlang couchdb icu4c spidermonkey nspr
# インストール
brew update
brew install erlang --no-docs
brew install couchdb


                                    9
起動方法
    #初めてインストールしたら
    mkdir -p ~/Library/LaunchAgents
    cp /usr/local/Cellar/couchdb/1.2.0/Library/LaunchDaemons/org.apache.couchdb.plist 
      ~/Library/LaunchAgents/
    launchctl load -w ~/Library/LaunchAgents/org.apache.couchdb.plist
 
#既にインストールしてたら
    launchctl unload -w ~/Library/LaunchAgents/org.apache.couchdb.plist
    cp /usr/local/Cellar/couchdb/1.2.0/Library/LaunchDaemons/org.apache.couchdb.plist 
      ~/Library/LaunchAgents/
    launchctl load -w ~/Library/LaunchAgents/org.apache.couchdb.plist
 
#自動起動は下記
    sudo launchctl list org.apache.couchdb >/dev/null 2>&1 && 
      sudo launchctl unload -w /Library/LaunchDaemons/org.apache.couchdb.plist
    sudo cp /usr/local/Cellar/couchdb/1.2.0/Library/LaunchDaemons/org.apache.couchdb.plist 
      /Library/LaunchDaemons/
    sudo launchctl load -w /Library/LaunchDaemons/org.apache.couchdb.plist
 
#もしくは、下記で
    couchdb



                                                10
Futon+基本API




11
Futon

WebベースのDB
管理ツール

デフォルトでイ
ンストールされ
る

全DB操作可能


              12
APIのURL表記について
太字のURLはAPIの例を記述

Method URL [JSON] で記述

URLの次行にJSONがある場合はレスポンスを示す

PUT /members
   curl -X PUT ‘http://localhost:5984/members’
PUT /members {“name”:”eiji”}
   curl -X PUT -d ‘{“name”:”eiji”}’ ‘http://...’


curlでJSONをPOST/PUTする時は次のオプションが必要

   -H 'Content-type:application/json'

                           13
DBを作る

DB名に使える文字

   アルファベットの小文字

   数字

   _,$,(,),+,-,/
            DB名がmembersの
                   場合


PUT /members

                           14
DBの情報取得

テーブルの概念は無い

ドキュメント(レコード)操
作

デザインの操作(後述)
         DB名がmembersの
               場合




GET /members

                        15
ドキュメントID

ドキュメントを一意(※最新という意味で)に表す

この資料内ではDocIDと表記

自動でDocIDが採番 or 手動で設定する
リビジョン番号
  CouchDBのドキュメントは削除されず追加のみ (※1)

  DocID+リビジョン番号(RevID)で一意

  DocIDのみ取得できるドキュメントは、最新のもの(※2)

                       “id”:”eiji”, “name”:”eiji”, “rev”:”1-123”
  新規追加時のDoc

                      “id”:”eiji”, “name”:”test”, “rev”:”2-abc”
   1回目の更新
                                                                    更新や削除では、
                     “id”:”eiji”, “name”:”kuroda”, “rev”:”3-efg”
                                                                   DocID+RevIDを指定
 2回目の更新=最新


※1 空間最適化のために、DB別に古いリビジョンを物理削除するコマンドがある
※2 コンフリクトが発生してない場合
                                        17
ドキュメント追加
POSTはDocID自動採番

PUTはDocID指定



POST /members {“name”:”Eiji Kuroda”,”age”:40}
{"ok":true,"id":"7544d...", "rev":"1-1e60813a..."}

                          リビジョン番号はも
   DocIDが自動採番
                                 採番
                                                     DocIDを”eiji”に指定


PUT /members/eiji {“name”:”Eiji Kuroda”,”age”:40}
{"ok":true,"id":"eiji","rev":"1-1e60813a..."}


                                                18
一覧取得
futon上はDBの初期画面

DocID,key,valueが返る

valueはリビジョン番号

                                       _all_docsは予約語


GET /members/_all_docs
{"total_rows":2,"offset":0,"rows":[
{"id":"7544...","key":"7544...","value"{"rev":"1-1e60813c6ca45903.."}},
{"id":"eiji","key":"eiji","value":{"rev":"1-96277b971e..."}}
]}

ソート順を逆にしたり、取得件数を指定するオプションあり



                                            19
1件取得

Key値をクリックする

futonでは
フィールド別とJSON形式
の2種類の画面がある
            DocIDが”eiji”のドキュメント取
                        得



GET /members/eiji
{"_id":"eiji","_rev":"3-33c49f...","name":"Eiji Kuroda","age":40}

以前のバージョン(リビジョン)で取得できるオプションあり


                                      20
更新
詳細画面でSourceをクリック

仮に1フィールドだけ更新でも
ドキュメント全体を再設定

リクエストにはリビジョン番号の指定が必須

リビジョン番号が更新される

futonでは1フィールドずつ追加も可能
                                                        リビジョンは必須、無ければ新規とみなされる



PUT /members/eiji {“_rev”:”123ABC”,“name”:”Eiji Kuroda”,”age”:18}
{"_id":"eiji","_rev":"4-33c49f...","name":"Eiji Kuroda","age":18}


                     リ
      ビジョン番号が更新される                                21
削除

詳細画面で削除を選択

リクエストには
リビジョン番号の指定が必須

削除にもリビジョン番号が設定される

                                            リビジョンは必須、無いとエラー



DELETE /members/eiji?rev=123ABC
{"ok":true,"id":"eiji","rev":"5-49c6c.."}          リビジョン番号が付く



                                      22
バルクAPI




23
バルク取得

複数のドキュメントを1回のリクエストで取得

_all_docs に POST で DocIDs を配列で投げる

戻ってくるJSON形式は_all_docsと同じ

POST /members/_all_docs {“keys”:[“eiji”,”hoge”]}
{"total_rows":2,"offset":0,
  "rows":[
    {"id":"eiji","key":"eiji","value":{"rev":"abc123"},
    {"id":"hoge","key":"hoge","value":{"rev":"efg987”}
  ]
}


                                     24
バルク追加、更新、削除
複数のドキュメントの追加、更新、削除を1回のリクエストで可能

更新、削除は各ドキュメントのリビジョン番号を指定

次のようなファイル(data.json)があるとして
                                                  追加
{"docs":[
  {"_id":"hoge", "name":"hoge"},                              更新
  {"_id":"eiji", "_rev":"abc123", "name":"eiji"},
  {"_id":"kuroda", "_rev":"efg987", “_deleted”:true},
]}
                                                              削除
POST /members/_bulk_docs @data.json
[
    {"ok":true,"id":"hoge","rev":"1-c1b7ada1c9b31..."},
    {"ok":true,"id":"eiji","rev":"2-c1b7ada1c9b31..."},
    {"ok":true,"id":"kuroda","rev":"2-a84c9f34a74285a2..."}
]



                                             25
バルクAPI注意点
デフォルトの動きでは、複数ドキュメントを追加した場合に、その中の
1つがエラーになっていても他のドキュメントは正常に保存される

上記ケースで1つも保存したくない場合は、
all_or_nothingオプションを利用する

all_or_nothingオプションはIDのコンフリクトチェックをしない

同じIDで違う内容のドキュメントが登録できる→コンフリクト状態

ただし、ドキュメントの内容が同じ場合はコンフリクト状態にならない




                     26
コンフリクト状態
first.json                                    second.json                               “id”:”abc”は
{"docs":[                                    {"all_or_nothing":true,"docs":[       中身が違うドキュメン
  {"_id":"abc", "name":"abc"},                 {"_id":"abc", "name":"ABC"},                ト
  {"_id":"def", "name":"def"}                  {"_id":"def", "name":"def"}
]}                                           ]}

POST /members/_balk_docs @first.json                                      コンフリクトが発生したが
[ {"ok":true,"id":"abc","rev":"1-123xxx"},
                                                                           レスポンスは全件OK
 {"ok":true,"id":"def","rev":"1-123yyy"}]
                                                                         しかも、全部保存されてる
POST /members/_balk_docs @second.jso
[ {"ok":true,"id":"abc","rev":"1-123zzz"},
  {"ok":true,"id":"def","rev":"1-123yyy"}]                                        conflicts=trueは
                                                     普通に取得可能                   コンフリクトしてるかどうかを
GET /members/abc
{"_id":"abc","_rev":"1-123xxx","name":"abc"}                                   属性に含めて返すオプション

GET /members/abc?conflicts=true
{"_id":"abc","_rev":"1-123xxx","name":"abc","_conflicts":["1-123zzz"]}
GET /members/def?conflicts=true                                                 コンフリクトしてる
{"_id":"def","_rev":"1-123yyy","name":"def"}
                                                         コンフリクトしてない



                                                    27
viewの概念




28
viewとは
クエリを発行したり、レポートを作ったりするのに使う機能

1つのview属性は1つのmapを持ち、オプションで1つのreduceを持てる

いくつかのview属性が1つのデザイン・ドキュメントに格納される

デザイン・ドキュメントも、他のドキュメントと同様の操作ができる

                          デザイン・ドキュメントの名        view属性の名前
実行時のURLは以下のようになる

   “/{dbName}/_design/{デザイン名}/_view/{view名}”

   ”_design/{デザイン名}” でひとつのドキュメントID
デザイン・ドキュメント

    _design/people                                 “people”というデザイン名
                                                 “_design/people”というDocID


“all”:         “map”:”function(doc){..}”
                                                      “all”というview名



“over20”:      “map”:”function(doc){..}”




               “map”:”function(doc){..}”                   実際に表示する際のURL
“total_age”:                                    GET /{dbname}/_design/people/_view/total_age

               “reduce”:”function(keys,.




                                           30
ところでMap&Reduce
大量のデータを分散して処理する仕組
み
                  map         reduce
“バナナ”, 300円    “りんご”, 400円    400円+300円

               “おにぎり”, 150円
“りんご”, 400円
                              150円+700円
“ぶどう”, 700円

“おにぎり”, 150円   “バナナ”, 300円

               “ぶどう”, 700円

                                1550円




                       31
viewを作る




32
Futonで操作

API上は、普通のドキュメントと同じ操作

テストのためにTemporaryビューを使う

Futon上は右上のプルダウンか
ら”temporary_view...”を選択
買い物リストでサンプル作成

 date   category        item   price

 5/10     果物            バナナ    300

 5/10      魚             鯛     1000

 5/11     果物            みかん    400

 5/11     果物            バナナ    250

 5/12      魚             鯛     900

                   34
最も単純なmap

                                                                               emitで指定したkey
map                                                 結果
function(doc){                                         key      id      date   category   item   price
  emit(null, doc)
}                                                      null   123xx    5/10      果物       バナナ    300
                                                       null   234xx    5/10       魚          鯛   1000
                                                       null   345xx    5/11      果物       みかん    400
•mapにドキュメントがパラメータとして来る
                        null                                  456xx    5/11      果物       バナナ    250
•reduceに渡すのはemitメソッド    null                                  567xx    5/12       魚          鯛   900
•検索結果の行数(total_rows)も出力
•結果はJSONで返る                                                   mapしたドキュメントのdocID


{"total_rows":5,"offset":0,"rows":[
{"id":"123xx","key":null,
  "value":{
    "_id":"123xx","_rev":"1-123xx","date":"5/10", "category":"果物","item":"バナナ","price":300
  }
},....
                                                  35
値段の順にソート

map                               結果
function(doc){                        key     id     date   category   item   price
  emit(doc.price, doc);
}                                     250    456xx   5/11     果物       バナナ    250
                                      300    123xx   5/10     果物       バナナ    300
                                      400    345xx   5/11     果物       みかん    400
                                      900    567xx   5/12      魚        鯛     900
                                      1000   234xx   5/10      魚        鯛     1000
•key+idの降順
•逆順にする場合は descending=true

例) GET /items/_design/items/_view/by_price?descending=true




                                 36
果物だけ抽出

map                            結果
function(doc){                     key     id     date   category   item   price
 if(doc.category == ”果物”)
                                   null   123xx   5/10     果物       バナナ    300
    emit(null, doc);
}
                                   null   345xx   5/11     果物       みかん    400

                                   null   456xx   5/11     果物       バナナ    250




                              37
値段を合計する

map                            結果
function(doc){                             key                           value
  emit(null, doc.price);
                                           null                          2850
}

                               {"rows":[
                                 {"key":null, value:2850}
reduce                         ]}

function(keys, values){        keysには次のような値が入る
  return sum(values);
                               [[null, “123xx”], [null, “234xxx”], ..]
}
                               valuesには次のような値が入る
   sumは数値の配列を合計するメソッド          [300, 1000, 400, 250, 900]
    returnで1つの値を返すように作る




                              38
日付毎に値段を合計

map                                     結果
function(doc){                                     key                        value
  emit(doc.date, doc.price);
}                                                 5/10                        300

                                                  5/11                        1650

reduce                                            5/12                        900


function(keys, values){                 次のように3回に分けて reduce が呼ばれる
  return sum(values);
}                                       keys [[“5/10”, “123xxx”]]
                                        values [300]

普通に呼び出すと合計の2850だけが戻る                    keys [[“5/11”, “123xx”], [“5/11”, “234xxx”], ..]
key値毎の塊をグループと言う。                        values [250, 400, 1000]

グループ毎に出力するには、次のように呼び出す。                 keys [[“5/12”, “123xx”]]
                                        values [900]
GET /.../_view/daily_cost?group=true

                                       39
日付+カテゴリ毎に値段を合

map                                             結果
function(doc){                                          key         value
  emit([doc.date, doc.category], doc.price);
                                                    [“5/10”,”果物”]   300
}
                                                    [“5/11”,”果物”]   650
                                                    [“5/11”,”魚”]    1000
reduce                                              [“5/12”,”魚”]    900
function(keys, values){
  return sum(values);
}


グループに深さができる。
1階層目は日付ごと、2階層目は日付+カテゴリ毎

GET /.../_view/dail_cat_cost?group=true #日付+カテゴリ毎
GET /.../_view/dail_cat_cost?group=true&group_level=2 #日付+カテゴリ
毎
GET /.../_view/dail_cat_cost?group=true&group_level=1 #日付毎
                                               40
カテゴリ毎の件数を調べる

map                         結果
function(doc){                         key                        value
  emit(doc.category, 1);
}                                     果物                             3

                                       魚                             2
reduce
function(keys, values){     次のようにreduceが呼ばれる
  return sum(values);
}                           keys [[“果物”, “123xxx”], [“果物”,...]]
                            values [1,1,1]

                            keys [[“魚”, “123xx”], [“魚”, “234xxx”]]
                            values [1,1]




                           41
rereduce




42
reduceの再帰呼び出し
Hadoopではcombine

同一グループの件数が多いとreduceの再帰呼び出しで高速化

function(keys, values, rereduce)

rereduceがfalseの時

   valuesはemitで渡した値の配列

rereduceがtrueの時

   valuesには、計算途中の配列が入る
失敗するcount
    下記の処理でも件数が求まるように思えるが
    実際には想定通り動かない場合がある。
map                                               reduce
function(doc){                                    function(keys, values, rereduce){
  emit(doc.category, 1);                            return values.length;
}                                                 }




                                                  再帰呼び出しの際に
5個のりんごが2個とカウントされてしま
                                                  reduceの戻り値の配列がvaluseに入る
う
keys [[“りんご”]...] values [1,1,1] rereduce false
                                                                         rereduce処理
 values.length -> 3
                                                   keys null values [3,2] rereduce true
keys [[“りんご”]...] values [1,1] rereduce false
 values.length -> 2
                                                     values.length ->   2
成功するcount①

map                                               reduce
function(doc){                                    function(keys, values, rereduce){
  emit(doc.category, 1);                            return sum(values);
}                                                 }




keys [[“りんご”]...] values [1,1,1] rereduce false                          rereduce処理
 sum(values) -> 3
                                                   keys null values [3,2] rereduce true
keys [[“りんご”]...] values [1,1] rereduce false
 sum(values) -> 2
                                                     sum(values) ->    5
成功するcount②

map                                               reduce
function(doc){                                    function(keys, values, rereduce){
  emit(doc.category, 1);                            if(rereduce)
}                                                     return sum(values);
                                                    else
                                                      return values.length;
                                                  }




keys [[“りんご”]...] values [1,1,1] rereduce false                          rereduce処理
 values.length -> 3
                                                   keys null values [3,2] rereduce true
keys [[“りんご”]...] values [1,1] rereduce false
 values.length -> 2
                                                     sum(values) ->    5
viewについて補足
sum,countには組込のメソッド           {“map”:”function(doc){emmit(doc,1)}”
                             “reduce”:”_count”},
がある                          {“map”:”function(doc){emmit(doc,doc.price)}”
                             “reduce”:”_sum”}

デバッグ用にlogメソッドがあ
                             function(keys, values, rereduce){
る。ログファイルに出力される。                log(values);
                               return sum(values);
                             }
Validationが設定できる
Document Update Validation

一括Updateの方法がある
Document Update Handler
レプリケーション




48
レプリケーションの仕様
Target(Slave)のサーバにSource(Master)を設定

データベース単位でレプリケーションを設定

Sourceに流れたPUT,POST,DELETEのクエリがTargetにも流れる

レプリケーションを設定する前のデータは同期しない

コンフリクトが起きてもエラーにはならない

1.10からレプリケーション設定の仕様が変更
マルチマスタも実装可能

http://localhost:5984/some_db/_all_docs


                                  nginxなどをProxyとして使う

                         proxy




          couchdb       couchdb       couchdb


                                           相互にクエリを投げ合う
パフォーマンス




51
速くない...

正直、MySQLの方が速い気がする。

10万件のINSERT

   MySQL 3.7秒

   CouchDB 30秒

SELECT系もMySQLの勝利だった

今度 mongo dbのベンチマークするので詳細はそこで。
おしまい




53

Weitere ähnliche Inhalte

Was ist angesagt?

はじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタはじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタSatoyuki Tsukano
 
GraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ることGraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ることShingo Fukui
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーyoku0825
 
スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門Hisashi HATAKEYAMA
 
運用に自動化を求めるのは間違っているだろうか
運用に自動化を求めるのは間違っているだろうか運用に自動化を求めるのは間違っているだろうか
運用に自動化を求めるのは間違っているだろうかMasahito Zembutsu
 
webエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのrediswebエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのredisnasa9084
 
Linked Open Data勉強会2020 後編:SPARQLの簡単な使い方、SPARQLを使った簡単なアプリ開発
Linked Open Data勉強会2020 後編:SPARQLの簡単な使い方、SPARQLを使った簡単なアプリ開発Linked Open Data勉強会2020 後編:SPARQLの簡単な使い方、SPARQLを使った簡単なアプリ開発
Linked Open Data勉強会2020 後編:SPARQLの簡単な使い方、SPARQLを使った簡単なアプリ開発KnowledgeGraph
 
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)Trainocate Japan, Ltd.
 
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.4.0対応)
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.4.0対応)FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.4.0対応)
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.4.0対応)fisuda
 
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 Hiroshi Ito
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法についてYuji Otani
 
pg_bigmを触り始めた人に伝えたいこと
pg_bigmを触り始めた人に伝えたいことpg_bigmを触り始めた人に伝えたいこと
pg_bigmを触り始めた人に伝えたいことMasahiko Sawada
 
100%Kotlin ORM Ktormを試してみた
100%Kotlin ORM Ktormを試してみた100%Kotlin ORM Ktormを試してみた
100%Kotlin ORM Ktormを試してみたKeita Tsukamoto
 
【修正版】Django + SQLAlchemy: シンプルWay
【修正版】Django + SQLAlchemy: シンプルWay【修正版】Django + SQLAlchemy: シンプルWay
【修正版】Django + SQLAlchemy: シンプルWayTakayuki Shimizukawa
 
NGSI によるデータ・モデリング - FIWARE WednesdayWebinars
NGSI によるデータ・モデリング - FIWARE WednesdayWebinarsNGSI によるデータ・モデリング - FIWARE WednesdayWebinars
NGSI によるデータ・モデリング - FIWARE WednesdayWebinarsfisuda
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersSeiya Mizuno
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことAmazon Web Services Japan
 

Was ist angesagt? (20)

はじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタはじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタ
 
GraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ることGraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ること
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門
 
運用に自動化を求めるのは間違っているだろうか
運用に自動化を求めるのは間違っているだろうか運用に自動化を求めるのは間違っているだろうか
運用に自動化を求めるのは間違っているだろうか
 
webエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのrediswebエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのredis
 
Linked Open Data勉強会2020 後編:SPARQLの簡単な使い方、SPARQLを使った簡単なアプリ開発
Linked Open Data勉強会2020 後編:SPARQLの簡単な使い方、SPARQLを使った簡単なアプリ開発Linked Open Data勉強会2020 後編:SPARQLの簡単な使い方、SPARQLを使った簡単なアプリ開発
Linked Open Data勉強会2020 後編:SPARQLの簡単な使い方、SPARQLを使った簡単なアプリ開発
 
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
 
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.4.0対応)
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.4.0対応)FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.4.0対応)
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.4.0対応)
 
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
pg_bigmを触り始めた人に伝えたいこと
pg_bigmを触り始めた人に伝えたいことpg_bigmを触り始めた人に伝えたいこと
pg_bigmを触り始めた人に伝えたいこと
 
100%Kotlin ORM Ktormを試してみた
100%Kotlin ORM Ktormを試してみた100%Kotlin ORM Ktormを試してみた
100%Kotlin ORM Ktormを試してみた
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
【修正版】Django + SQLAlchemy: シンプルWay
【修正版】Django + SQLAlchemy: シンプルWay【修正版】Django + SQLAlchemy: シンプルWay
【修正版】Django + SQLAlchemy: シンプルWay
 
NGSI によるデータ・モデリング - FIWARE WednesdayWebinars
NGSI によるデータ・モデリング - FIWARE WednesdayWebinarsNGSI によるデータ・モデリング - FIWARE WednesdayWebinars
NGSI によるデータ・モデリング - FIWARE WednesdayWebinars
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
 
What’s new in cloud run 2021 後期
What’s new in cloud run 2021 後期What’s new in cloud run 2021 後期
What’s new in cloud run 2021 後期
 
PostgreSQL Query Cache - "pqc"
PostgreSQL Query Cache - "pqc"PostgreSQL Query Cache - "pqc"
PostgreSQL Query Cache - "pqc"
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 

Andere mochten auch

CouchDB on Android
CouchDB on AndroidCouchDB on Android
CouchDB on AndroidSven Haiges
 
My sql event_scheduler_casual_slideshare__
My sql event_scheduler_casual_slideshare__My sql event_scheduler_casual_slideshare__
My sql event_scheduler_casual_slideshare__Tatsuro Hisamori
 
プログラミング言語とは ~ 非エンジニアの方へ ~
プログラミング言語とは ~ 非エンジニアの方へ ~プログラミング言語とは ~ 非エンジニアの方へ ~
プログラミング言語とは ~ 非エンジニアの方へ ~Eiji Kuroda
 
JS開発環境を晒す。
JS開発環境を晒す。JS開発環境を晒す。
JS開発環境を晒す。Eiji Kuroda
 
HTMLElementの派生が作りたかった。
HTMLElementの派生が作りたかった。HTMLElementの派生が作りたかった。
HTMLElementの派生が作りたかった。Eiji Kuroda
 
新卒のみなさんへ 〜大志のいだき方〜
新卒のみなさんへ 〜大志のいだき方〜新卒のみなさんへ 〜大志のいだき方〜
新卒のみなさんへ 〜大志のいだき方〜Eiji Kuroda
 
Hotサービスの傾向
Hotサービスの傾向Hotサービスの傾向
Hotサービスの傾向Eiji Kuroda
 
いまどきのチームびるでぃんぐ
いまどきのチームびるでぃんぐいまどきのチームびるでぃんぐ
いまどきのチームびるでぃんぐEiji Kuroda
 
SmartPhone と AdTechの世界
SmartPhone と AdTechの世界SmartPhone と AdTechの世界
SmartPhone と AdTechの世界Eiji Kuroda
 
YAPC::Europe 2014 に行ってきました
YAPC::Europe 2014 に行ってきましたYAPC::Europe 2014 に行ってきました
YAPC::Europe 2014 に行ってきましたTatsuro Hisamori
 
DynamoDBだけでソシャゲを作ってみた
DynamoDBだけでソシャゲを作ってみたDynamoDBだけでソシャゲを作ってみた
DynamoDBだけでソシャゲを作ってみた伊藤 祐策
 
今更聞けないストリーム処理のあれとかこれ
今更聞けないストリーム処理のあれとかこれ今更聞けないストリーム処理のあれとかこれ
今更聞けないストリーム処理のあれとかこれTatsuro Hisamori
 
平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用
平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用
平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用Tatsuro Hisamori
 
アドテク勉強会0819
アドテク勉強会0819アドテク勉強会0819
アドテク勉強会0819Hideya Kato
 
AdServerの仕組み
AdServerの仕組みAdServerの仕組み
AdServerの仕組みEiji Kuroda
 
CGI Perlでわかる!サーバレス
CGI Perlでわかる!サーバレスCGI Perlでわかる!サーバレス
CGI Perlでわかる!サーバレスTatsuro Hisamori
 

Andere mochten auch (20)

CouchDB on Android
CouchDB on AndroidCouchDB on Android
CouchDB on Android
 
20120409 aws meister-reloaded-dynamo-db
20120409 aws meister-reloaded-dynamo-db20120409 aws meister-reloaded-dynamo-db
20120409 aws meister-reloaded-dynamo-db
 
My sql event_scheduler_casual_slideshare__
My sql event_scheduler_casual_slideshare__My sql event_scheduler_casual_slideshare__
My sql event_scheduler_casual_slideshare__
 
プログラミング言語とは ~ 非エンジニアの方へ ~
プログラミング言語とは ~ 非エンジニアの方へ ~プログラミング言語とは ~ 非エンジニアの方へ ~
プログラミング言語とは ~ 非エンジニアの方へ ~
 
JS開発環境を晒す。
JS開発環境を晒す。JS開発環境を晒す。
JS開発環境を晒す。
 
HTMLElementの派生が作りたかった。
HTMLElementの派生が作りたかった。HTMLElementの派生が作りたかった。
HTMLElementの派生が作りたかった。
 
新卒のみなさんへ 〜大志のいだき方〜
新卒のみなさんへ 〜大志のいだき方〜新卒のみなさんへ 〜大志のいだき方〜
新卒のみなさんへ 〜大志のいだき方〜
 
Riakmeetup2forupload
Riakmeetup2foruploadRiakmeetup2forupload
Riakmeetup2forupload
 
Html5j 8
Html5j 8Html5j 8
Html5j 8
 
Hotサービスの傾向
Hotサービスの傾向Hotサービスの傾向
Hotサービスの傾向
 
いまどきのチームびるでぃんぐ
いまどきのチームびるでぃんぐいまどきのチームびるでぃんぐ
いまどきのチームびるでぃんぐ
 
SmartPhone と AdTechの世界
SmartPhone と AdTechの世界SmartPhone と AdTechの世界
SmartPhone と AdTechの世界
 
YAPC::Europe 2014 に行ってきました
YAPC::Europe 2014 に行ってきましたYAPC::Europe 2014 に行ってきました
YAPC::Europe 2014 に行ってきました
 
YAPCEurope2014-myfinder
YAPCEurope2014-myfinderYAPCEurope2014-myfinder
YAPCEurope2014-myfinder
 
DynamoDBだけでソシャゲを作ってみた
DynamoDBだけでソシャゲを作ってみたDynamoDBだけでソシャゲを作ってみた
DynamoDBだけでソシャゲを作ってみた
 
今更聞けないストリーム処理のあれとかこれ
今更聞けないストリーム処理のあれとかこれ今更聞けないストリーム処理のあれとかこれ
今更聞けないストリーム処理のあれとかこれ
 
平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用
平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用
平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用
 
アドテク勉強会0819
アドテク勉強会0819アドテク勉強会0819
アドテク勉強会0819
 
AdServerの仕組み
AdServerの仕組みAdServerの仕組み
AdServerの仕組み
 
CGI Perlでわかる!サーバレス
CGI Perlでわかる!サーバレスCGI Perlでわかる!サーバレス
CGI Perlでわかる!サーバレス
 

Ähnlich wie はじめてのCouch db

Redis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo SpringRedis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo SpringMakoto Ohnami
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方linzhixing
 
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトEWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトKiyoshi Sawada
 
PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017Shigeru Hanada
 
Couchbase MeetUP Tokyo - #11 Omoidenote
Couchbase MeetUP Tokyo - #11 OmoidenoteCouchbase MeetUP Tokyo - #11 Omoidenote
Couchbase MeetUP Tokyo - #11 Omoidenotekitsugi
 
Infrastructure as code for azure
Infrastructure as code for azureInfrastructure as code for azure
Infrastructure as code for azureKeiji Kamebuchi
 
今さら始めるCoffeeScript
今さら始めるCoffeeScript今さら始めるCoffeeScript
今さら始めるCoffeeScriptAshitaba YOSHIOKA
 
V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...
V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...
V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...junichi anno
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platformToru Yamaguchi
 
オンプレでPrivate Registry使ったDockerイメージの運用について
オンプレでPrivate Registry使ったDockerイメージの運用についてオンプレでPrivate Registry使ったDockerイメージの運用について
オンプレでPrivate Registry使ったDockerイメージの運用についてYASUKAZU NAGATOMI
 
BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門Yohei Sasaki
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門Sho A
 
Play2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだことPlay2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだことdcubeio
 
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"Michio Koyama
 
初めての Data api
初めての Data api初めての Data api
初めての Data apiYuji Takayama
 

Ähnlich wie はじめてのCouch db (20)

Redis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo SpringRedis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo Spring
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
 
MongoDB2.2の新機能
MongoDB2.2の新機能MongoDB2.2の新機能
MongoDB2.2の新機能
 
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトEWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
 
PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017
 
d3sparql.js
d3sparql.js d3sparql.js
d3sparql.js
 
Couchbase MeetUP Tokyo - #11 Omoidenote
Couchbase MeetUP Tokyo - #11 OmoidenoteCouchbase MeetUP Tokyo - #11 Omoidenote
Couchbase MeetUP Tokyo - #11 Omoidenote
 
Infrastructure as code for azure
Infrastructure as code for azureInfrastructure as code for azure
Infrastructure as code for azure
 
今さら始めるCoffeeScript
今さら始めるCoffeeScript今さら始めるCoffeeScript
今さら始めるCoffeeScript
 
V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...
V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...
V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 
Django boodoo
Django boodooDjango boodoo
Django boodoo
 
WDD2012_SC-004
WDD2012_SC-004WDD2012_SC-004
WDD2012_SC-004
 
オンプレでPrivate Registry使ったDockerイメージの運用について
オンプレでPrivate Registry使ったDockerイメージの運用についてオンプレでPrivate Registry使ったDockerイメージの運用について
オンプレでPrivate Registry使ったDockerイメージの運用について
 
BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門
 
Play2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだことPlay2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだこと
 
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
 
Teclab3
Teclab3Teclab3
Teclab3
 
初めての Data api
初めての Data api初めての Data api
初めての Data api
 

はじめてのCouch db

Hinweis der Redaktion

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n