SlideShare una empresa de Scribd logo
1 de 42
Descargar para leer sin conexión
1 
Couchbase MeetUP Tokyo - #11
自己紹介 
2 
•木次 恭一 
•Twitter: @kyoichi_kitsugi  
•ウイングソリューションズ(株) 
•仕事ではJavaがメイン 
•最近では Sencha Touch, ElasticSearchなど
Couchbase Mobileとの出会い 
3 
MongoDB 
CouchDB 
TouchDB 
Couchbase 
Server 
Sync 
Gateway 
Couchbase 
Lite 
CouchDB 
NoSQL 
に興味 
JSON 
大好き 
モバイル 
大好き
Couchbase Mobile Hackathon 
4 
ハッカソン開催 
•2014年9月7日開催 
•向上心溢れる暇な人が集結 
•Couchbase Liteを利用したアプリを作成 
•優勝したら一人だけサンフランシスコに行ける
Couchbase Mobile Hackathon 
5 
ROUND 1 
FIGHT
Couchbase Mobile Hackathon 
6 
TIME OVER 
5時間じゃ厳しいっす!!
Couchbase Mobile Hackathon 
7 
ヒソ( ´д)ヒソ(´д`)ヒソ(д` )ヒソ 
審査中 
ネェ、キイタ?( ´д)オクサン(д` )アラヤダワァ
Couchbase Mobile Hackathon 
8 
優勝
Couchbase Mobile Hackathon 
9 
勝因をしいてあげるなら 
•チームの人数が多かった 
•プレゼン資料が良かった 
•画面数が一番多かった
おもいでノート 
10 
行ったことがある場所A B 
Tom Jerry 
行ったことがない場所C 
行った事がある場所は 
自宅で閲覧・更新が可能 
その場所に行かないと 
何も出来ない
おもいでノート 
11 
デモ 
https://github.com/kitsugi/omoidebase
おもいでノート 
12 
行ったことがない場所
Couchbase Connect 
13 
•2014年10月6日~7日開催 
•サンフランシスコ 
•全米No1と僕が思ったNoSQLカンファレンス 
•スタバのコーヒーが飲み放題
Couchbase Connectの様子 
14
Couchbase Connectの様子 
15
Couchbase Connectの様子 
16
Couchbase Connectの様子 
17
Couchbase Connectの様子 
18
Couchbase Connectの様子 
19
おもいでノート 
20 
ドキュメント
Document種別 
21 
場所 
place 
コメント 
comment 
プロフィール 
コメント コメント 
tom 
comment 
comment 
場所 
place 
コメント 
comment 
コメント 
comment 
プロフィール 
jerry
場所 
{ 
"type" : "place", 
"code" : "ADAA8D9E-26C4-46F8-9A39-78EFD6DDC3F5", 
"name" : "Westin San Francisco", 
"remark": "Couchbase Connect 2014 on Oct 6, 2014 in San Francisco", 
"location": { 
"latitude": 37.7876643, 
"longitude": -122.4090627 
}, 
"image" : "画像 (base64文字列)" 
}
コメント 
{ 
"type" : "comment", 
"place" : "ADAA8D9E-26C4-46F8-9A39-78EFD6DDC3F5", 
"created_at" : "2014-11-17T13:56:52+09:00", 
"contents" : "内容", 
"image": "画像 (base64文字列)" 
}
プロフィール 
{ 
"type" : "profile", 
"name" : "tom", 
"places" : [ 
"ADAA8D9E-26C4-46F8-9A39-78EFD6DDC3F5", 
"89B038CD-84A9-442c-95D1-0E22CAF8EB9E" 
] 
}
おもいでノート 
25 
構築
構成図 
Couchbase Server 
Sync Gateway 
おもいでノート 
(Couchbase Lite) 
cURL等 
:8091 
Backet 
omoidebase 
:4985 
:4984 User, Roleの作成・削除 
マスタ投入 
おもいでノート 
(Couchbase Lite) 
26 
コメント作成コメント作成
構築1:バケット作成 
Couchbase Server 
:8091 
Backet 
omoidebase 
Admin Console等
構築2:Sync Gateway起動 
Backet 
omoidebase 
Couchbase Server 
:8091 
Sync Gateway 
Terminal等 
./sync_gateway config.json 
{ 
"interface": ":4984", 
"adminInterface": ":4985", 
"log": [ 
"REST" 
], 
"databases": { 
"omoidebase": { 
"server": "http://localhost:8091", 
"bucket": "omoidebase", 
"sync": ` function(doc, oldDoc) { 
if (doc.type === "profile") { 
if (doc.places) { 
for (var i = 0; i < doc.places.length; i++) { 
access(doc.name, doc.places[i]); 
} 
} 
access(doc.name, doc.name); 
channel(doc.name); 
} else if (doc.type === "comment") { 
channel(doc.place); 
} else if (doc.type === "place") { 
channel(doc._id); 
} 
}` 
} 
} 
} 
※データーベースは複数定義可能 
:4984 
:4985 
Sync 
Function
構築3:ユーザー作成 
Backet 
omoidebase 
Couchbase Server 
:8091 
Sync Gateway 
:4985 
cURL等 
tom 
password 
curl -XPOST -H "Content-Type: application/json" http://localhost:4985/omoidebase/ 
_user/ -d @user1.json 
{ 
"name": "tom", 
"password": "password" 
}
構築4:マスタ系データインポート 
Backet 
omoidebase 
Couchbase Server 
:8091 
Sync Gateway 
:4985 
cURL等 
場所プロフィール 
curl -XPUT -H "Content-Type: application/json" http://localhost:4985/omoidebase/ 
ADAA8D9E-26C4-46F8-9A39-78EFD6DDC3F5 -d @place1.json 
curl -XPUT -H "Content-Type: application/json" http://localhost:4985/omoidebase/tom -d 
@profile1.json
構築5:クライアント同期 
Backet 
omoidebase 
Couchbase Server 
:8091 
Sync Gateway 
:4984 
アプリ 
Couchbase Lite 
Database 
omoidebase 
URL url = new URL("http://localhost:4984/omoidebase"); 
pull = database.createPullReplication(url); 
push = database.createPushReplication(url); 
Authenticator auth = new BasicAuthenticator(“tom”, “password”); 
pull.setAuthenticator(auth); 
push.setAuthenticator(auth); 
pull.start(); 
push.start(); 
Sync 
Function 
tom 
password 
place profile 
place profile
構築:Couchbase Serverのドキュメント 
32 
1.バケット作成 
なし 
2.Sync Gateway起動 
ID Content 
_sync:seq 
_sync:syncdata { "Sync": " function(doc, oldDoc) {n if (doc.type === "profile… 
3.ユーザー作成 
ID Content 
_sync:seq 2 
_sync:syncdata { "Sync": " function(doc, oldDoc) {n if (doc.type === ”profile… 
_sync:user:jerry { "name": "jerry", "all_channels": { }, "sequence": 2, "passwo… 
_sync:user:tom { "name": "tom", "all_channels": { }, "sequence": 1, "passwo…
構築:Couchbase Serverのドキュメント 
33 
4.マスタ系データインポート 
ID Content 
_sync:seq 7 
_sync:syncdata { "Sync": " function(doc, oldDoc) {n if (doc.type === ”profile… 
_sync:user:jerry { "name": "jerry", "all_channels": { }, "sequence": 2, "passwo… 
_sync:user:tom { "name": "tom", "all_channels": { }, "sequence": 1, "passwo… 
ADAA8D9E-26C4-46F8-9A39-78EFD6DDC3F5 { "_sync": { "rev": "1-375de787d53752736649d964197e7a41", "s… 
2C139CE5-9B5D-4836-97A3-B25AEC49D6FB { "_sync": { "rev": "1-22476c90d79e6724058271609f1a4408", "s… 
89B038CD-84A9-442c-95D1-0E22CAF8EB9E { "_sync": { "rev": "1-4867aafbf14a79607730e3e3f7de6257", "s… 
jerry { "_sync": { "rev": "1-c0888ab8cf936c83aaf36a10eaca1a8d", "s… 
tom { "_sync": { "rev": "1-009fa66f707d5e3eea7b2830cff0ea51", "s…
構築:Couchbase Serverのドキュメント 
34 
5.クライアント同期 
ID Content 
_sync:seq 7 
_sync:syncdata { "Sync": " function(doc, oldDoc) {n if (doc.type === ”profile… 
_sync:user:jerry { "name": "jerry", "all_channels": { }, "sequence": 2, "passwo… 
_sync:user:tom { "name": "tom", "all_channels": { }, "sequence": 1, "passwo… 
ADAA8D9E-26C4-46F8-9A39-78EFD6DDC3F5 { "_sync": { "rev": "1-375de787d53752736649d964197e7a41", "s… 
2C139CE5-9B5D-4836-97A3-B25AEC49D6FB { "_sync": { "rev": "1-22476c90d79e6724058271609f1a4408", "s… 
89B038CD-84A9-442c-95D1-0E22CAF8EB9E { "_sync": { "rev": "1-4867aafbf14a79607730e3e3f7de6257", "s… 
jerry { "_sync": { "rev": "1-c0888ab8cf936c83aaf36a10eaca1a8d", "s… 
tom { "_sync": { "rev": "1-009fa66f707d5e3eea7b2830cff0ea51", "s…
おもいでノート 
35 
Sync Function
Configuration Files 
{ 
"interface": ":4984", 
"adminInterface": ":4985", 
"log": [ 
"REST" 
], 
"databases": { 
"omoidebase": { 
"server": "http://localhost:8091", 
"bucket": "omoidebase", 
"sync": ` function(doc, oldDoc) { 
if (doc.type === "profile") { 
if (doc.places) { 
for (var i = 0; i < doc.places.length; i++) { 
access(doc.name, doc.places[i]); 
} 
} 
access(doc.name, doc.name); 
channel(doc.name); 
} else if (doc.type === "comment") { 
channel(doc.place); 
} else if (doc.type === "place") { 
channel(doc._id); 
} 
}` 
} 
} 
} 
36
Sync Function API 
37 
主な関数 
関数名引数説明 
throw forbiddenプロパティを含むエラーオブジェクト例外の送出 
requireUser username(文字列または文字列の配列) ユーザー名が引数に一致または配列の場合は含まれなければ例外を送出 
requireRole rolename(文字列または文字列の配列) ユーザーのロールが引数に一致または配列の場合は含まれなければ例外を送 
出 
requireAccess channels(文字列または文字列の配列) ユーザーが引数のチャネルのうち少なくとも一つへのアクセスを有していなけ 
れば例外を送出 
channel name(文字列または文字列の配列。nullやundefinedでも可) 引数に指定されたチャネルにドキュメントをルーティングします 
access username(文字列または文字列の配列。nullやundefinedでも可), 
channelname(文字列または文字列の配列。nullやundefinedでも可) 
ユーザーにチャネルへのアクセス権を付与します 
role username(文字列または文字列の配列。nullやundefinedでも可), 
rolename(文字列または文字列の配列。nullやundefinedでも可) 
ユーザーにロールを付与します 
http://developer.couchbase.com/mobile/develop/guides/sync-gateway/sync-function-api-guide/index.html 
重要なのは 
channelとaccess
場所 
チャネル 
ADAA8D9E-26C4-46F8-9A 
39-78EFD6DDC3F5 
{ 
"type" : "place", 
"code" : "ADAA8D9E-26C4-46F8-9A39-78EFD6DDC3F5", 
"name" : "Westin San Francisco", 
"remark": "Couchbase Connect 2014 on Oct 6, 2014 in San Francisco", 
"location": { 
チャネル 
89B038CD-84A9-442c-95 
D1-0E22CAF8EB9E 
チャネル 
2C139CE5-9B5D-4836-97 
A3-B25AEC49D6FB 
"latitude": 37.7876643, 
"longitude": -122.4090627 
}, 
"image" : "画像 (base64文字列)" 
} 
if (doc.type === "place") { 
channel(doc._id); 
} 
場所場所場所
プロフィール 
if (doc.type === "profile") { 
if (doc.places) { 
for (var i = 0; i < doc.places.length; i++) { 
access(doc.name, doc.places[i]); 
} 
} 
access(doc.name, doc.name); 
channel(doc.name); 
} 
プロフィール場所プロフィール場所 
チャネル 
tom 
チャネル 
jerry 
チャネル 
ADAA8D9E-26C4-46F8-9 
A39-78EFD6DDC3F5 
tom jerry 
チャネル 
89B038CD-84A9-442c-95 
D1-0E22CAF8EB9E 
{ 
"type" : "profile", 
"name" : "tom", 
"places" : [ 
"ADAA8D9E-26C4-46F8-9A39-78EFD6DDC3F5", 
"89B038CD-84A9-442c-95D1-0E22CAF8EB9E" 
] 
}
コメント 
{ 
"type" : "comment", 
"place" : "ADAA8D9E-26C4-46F8-9A39-78EFD6DDC3F5", 
"created_at" : "2014-11-17T13:56:52+09:00", 
"contents" : "内容", 
"image": "画像 (base64文字列)" 
} 
if (doc.type === "comment") { 
channel(doc.place); 
} 
コメントコメントコメント 
チャネル 
ADAA8D9E-26C4-46F8-9 
A39-78EFD6DDC3F5 
チャネル 
89B038CD-84A9-442c-95 
D1-0E22CAF8EB9E 
チャネル 
2C139CE5-9B5D-4836-97 
A3-B25AEC49D6FB
ポイント 
•チャネルの範囲を決める 
•ドキュメントにプロフィール情報を持つ 
チャネル 
ADAA8D9E-26C4-46F8- 
9A39-78EFD6DDC3F5 
場所 
コメント 
コメント 
コメント 
コメント
42 
That's all.

Más contenido relacionado

La actualidad más candente

Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについてtako pons
 
CMSとPerlで遊ぼう
CMSとPerlで遊ぼうCMSとPerlで遊ぼう
CMSとPerlで遊ぼうDaiki Ichinose
 
やや関数型を意識した風Elixir/Phoenixご紹介
やや関数型を意識した風Elixir/Phoenixご紹介やや関数型を意識した風Elixir/Phoenixご紹介
やや関数型を意識した風Elixir/Phoenixご紹介fukuoka.ex
 
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみようSlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみようShigeo Ueda
 
Valhalla Update JJUG CCC Spring 2019
Valhalla Update JJUG CCC Spring 2019Valhalla Update JJUG CCC Spring 2019
Valhalla Update JJUG CCC Spring 2019David Buck
 
20140903groonga発表資料
20140903groonga発表資料20140903groonga発表資料
20140903groonga発表資料Hironobu Saitoh
 
ServiceStackの紹介
ServiceStackの紹介ServiceStackの紹介
ServiceStackの紹介wilfrem
 
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall博文 斉藤
 
Search on AWS - IVS CTO Night and Day 2016 Spring
Search on AWS - IVS CTO Night and Day 2016 SpringSearch on AWS - IVS CTO Night and Day 2016 Spring
Search on AWS - IVS CTO Night and Day 2016 SpringEiji Shinohara
 
NIO.2を使って簡単ファイル操作
NIO.2を使って簡単ファイル操作NIO.2を使って簡単ファイル操作
NIO.2を使って簡単ファイル操作Yuichi Sakuraba
 
Getting Started Japanese Search and Calculate Similarity with Apache Lucene
Getting Started Japanese Search and Calculate Similarity with Apache LuceneGetting Started Japanese Search and Calculate Similarity with Apache Lucene
Getting Started Japanese Search and Calculate Similarity with Apache LuceneEiji Shinohara
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編Miki Shimogai
 
Develop Web Application with Node.js + Express
Develop Web Application with Node.js + ExpressDevelop Web Application with Node.js + Express
Develop Web Application with Node.js + ExpressAkinari Tsugo
 
難しそうで難しくない少し難しいClojure並行処理
難しそうで難しくない少し難しいClojure並行処理難しそうで難しくない少し難しいClojure並行処理
難しそうで難しくない少し難しいClojure並行処理Naoyuki Kakuda
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8y_taka_23
 
月間10億pvを支えるmongo db
月間10億pvを支えるmongo db月間10億pvを支えるmongo db
月間10億pvを支えるmongo dbYuji Isobe
 
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration勉強会force#4 Chatter Integration
勉強会force#4 Chatter IntegrationKazuki Nakajima
 

La actualidad más candente (19)

Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについて
 
CMSとPerlで遊ぼう
CMSとPerlで遊ぼうCMSとPerlで遊ぼう
CMSとPerlで遊ぼう
 
はじめてのMongoDB
はじめてのMongoDBはじめてのMongoDB
はじめてのMongoDB
 
やや関数型を意識した風Elixir/Phoenixご紹介
やや関数型を意識した風Elixir/Phoenixご紹介やや関数型を意識した風Elixir/Phoenixご紹介
やや関数型を意識した風Elixir/Phoenixご紹介
 
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみようSlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
 
Valhalla Update JJUG CCC Spring 2019
Valhalla Update JJUG CCC Spring 2019Valhalla Update JJUG CCC Spring 2019
Valhalla Update JJUG CCC Spring 2019
 
20140903groonga発表資料
20140903groonga発表資料20140903groonga発表資料
20140903groonga発表資料
 
ServiceStackの紹介
ServiceStackの紹介ServiceStackの紹介
ServiceStackの紹介
 
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
 
Search on AWS - IVS CTO Night and Day 2016 Spring
Search on AWS - IVS CTO Night and Day 2016 SpringSearch on AWS - IVS CTO Night and Day 2016 Spring
Search on AWS - IVS CTO Night and Day 2016 Spring
 
NIO.2を使って簡単ファイル操作
NIO.2を使って簡単ファイル操作NIO.2を使って簡単ファイル操作
NIO.2を使って簡単ファイル操作
 
Getting Started Japanese Search and Calculate Similarity with Apache Lucene
Getting Started Japanese Search and Calculate Similarity with Apache LuceneGetting Started Japanese Search and Calculate Similarity with Apache Lucene
Getting Started Japanese Search and Calculate Similarity with Apache Lucene
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編
 
Develop Web Application with Node.js + Express
Develop Web Application with Node.js + ExpressDevelop Web Application with Node.js + Express
Develop Web Application with Node.js + Express
 
難しそうで難しくない少し難しいClojure並行処理
難しそうで難しくない少し難しいClojure並行処理難しそうで難しくない少し難しいClojure並行処理
難しそうで難しくない少し難しいClojure並行処理
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
 
Tottoruby 20110903
Tottoruby 20110903Tottoruby 20110903
Tottoruby 20110903
 
月間10億pvを支えるmongo db
月間10億pvを支えるmongo db月間10億pvを支えるmongo db
月間10億pvを支えるmongo db
 
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration
 

Similar a Couchbase MeetUP Tokyo - #11 Omoidenote

初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api   cms どうでしょう - 大阪夏の陣初めての Data api   cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣Yuji Takayama
 
初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API   CMS どうでしょう - 仙台編 -初めての Data API   CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -Yuji Takayama
 
ホット・トピック・セミナー「Metro」
ホット・トピック・セミナー「Metro」ホット・トピック・セミナー「Metro」
ホット・トピック・セミナー「Metro」Kohsuke Kawaguchi
 
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Yuji Takayama
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略takezoe
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義JPCERT Coordination Center
 
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」fukuoka.ex
 
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版ありますElixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版ありますfukuoka.ex
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方linzhixing
 
DEV-010_エンプラ系業務 Web アプリ開発に効く! 実践的 SPA 型モダン Web アプリ開発の選択手法
DEV-010_エンプラ系業務 Web アプリ開発に効く! 実践的 SPA 型モダン Web アプリ開発の選択手法DEV-010_エンプラ系業務 Web アプリ開発に効く! 実践的 SPA 型モダン Web アプリ開発の選択手法
DEV-010_エンプラ系業務 Web アプリ開発に効く! 実践的 SPA 型モダン Web アプリ開発の選択手法decode2016
 
初めての Data api
初めての Data api初めての Data api
初めての Data apiYuji Takayama
 
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るnode+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るKiyoshi SATOH
 
Azure Cosmos DB を使った高速分散アプリケーションの設計パターン
Azure Cosmos DB を使った高速分散アプリケーションの設計パターンAzure Cosmos DB を使った高速分散アプリケーションの設計パターン
Azure Cosmos DB を使った高速分散アプリケーションの設計パターンKazuyuki Miyake
 
Data api workshop at Co-Edo
Data api workshop at Co-EdoData api workshop at Co-Edo
Data api workshop at Co-EdoYuji Takayama
 
Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方Shinsuke Sugaya
 
現場的!AWSとオンプレの違い(赤べこバージョン)
現場的!AWSとオンプレの違い(赤べこバージョン)現場的!AWSとオンプレの違い(赤べこバージョン)
現場的!AWSとオンプレの違い(赤べこバージョン)真吾 吉田
 

Similar a Couchbase MeetUP Tokyo - #11 Omoidenote (20)

初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api   cms どうでしょう - 大阪夏の陣初めての Data api   cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
 
初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API   CMS どうでしょう - 仙台編 -初めての Data API   CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -
 
ホット・トピック・セミナー「Metro」
ホット・トピック・セミナー「Metro」ホット・トピック・セミナー「Metro」
ホット・トピック・セミナー「Metro」
 
Parse触ってみた
Parse触ってみたParse触ってみた
Parse触ってみた
 
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略
 
OpenStack API
OpenStack APIOpenStack API
OpenStack API
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
 
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
 
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版ありますElixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
 
DEV-010_エンプラ系業務 Web アプリ開発に効く! 実践的 SPA 型モダン Web アプリ開発の選択手法
DEV-010_エンプラ系業務 Web アプリ開発に効く! 実践的 SPA 型モダン Web アプリ開発の選択手法DEV-010_エンプラ系業務 Web アプリ開発に効く! 実践的 SPA 型モダン Web アプリ開発の選択手法
DEV-010_エンプラ系業務 Web アプリ開発に効く! 実践的 SPA 型モダン Web アプリ開発の選択手法
 
初めての Data api
初めての Data api初めての Data api
初めての Data api
 
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るnode+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作る
 
Azure Cosmos DB を使った高速分散アプリケーションの設計パターン
Azure Cosmos DB を使った高速分散アプリケーションの設計パターンAzure Cosmos DB を使った高速分散アプリケーションの設計パターン
Azure Cosmos DB を使った高速分散アプリケーションの設計パターン
 
Data api workshop at Co-Edo
Data api workshop at Co-EdoData api workshop at Co-Edo
Data api workshop at Co-Edo
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方
 
HTML5&API総まくり
HTML5&API総まくりHTML5&API総まくり
HTML5&API総まくり
 
現場的!AWSとオンプレの違い(赤べこバージョン)
現場的!AWSとオンプレの違い(赤べこバージョン)現場的!AWSとオンプレの違い(赤べこバージョン)
現場的!AWSとオンプレの違い(赤べこバージョン)
 

Couchbase MeetUP Tokyo - #11 Omoidenote

  • 1. 1 Couchbase MeetUP Tokyo - #11
  • 2. 自己紹介 2 •木次 恭一 •Twitter: @kyoichi_kitsugi  •ウイングソリューションズ(株) •仕事ではJavaがメイン •最近では Sencha Touch, ElasticSearchなど
  • 3. Couchbase Mobileとの出会い 3 MongoDB CouchDB TouchDB Couchbase Server Sync Gateway Couchbase Lite CouchDB NoSQL に興味 JSON 大好き モバイル 大好き
  • 4. Couchbase Mobile Hackathon 4 ハッカソン開催 •2014年9月7日開催 •向上心溢れる暇な人が集結 •Couchbase Liteを利用したアプリを作成 •優勝したら一人だけサンフランシスコに行ける
  • 5. Couchbase Mobile Hackathon 5 ROUND 1 FIGHT
  • 6. Couchbase Mobile Hackathon 6 TIME OVER 5時間じゃ厳しいっす!!
  • 7. Couchbase Mobile Hackathon 7 ヒソ( ´д)ヒソ(´д`)ヒソ(д` )ヒソ 審査中 ネェ、キイタ?( ´д)オクサン(д` )アラヤダワァ
  • 9. Couchbase Mobile Hackathon 9 勝因をしいてあげるなら •チームの人数が多かった •プレゼン資料が良かった •画面数が一番多かった
  • 10. おもいでノート 10 行ったことがある場所A B Tom Jerry 行ったことがない場所C 行った事がある場所は 自宅で閲覧・更新が可能 その場所に行かないと 何も出来ない
  • 11. おもいでノート 11 デモ https://github.com/kitsugi/omoidebase
  • 13. Couchbase Connect 13 •2014年10月6日~7日開催 •サンフランシスコ •全米No1と僕が思ったNoSQLカンファレンス •スタバのコーヒーが飲み放題
  • 21. Document種別 21 場所 place コメント comment プロフィール コメント コメント tom comment comment 場所 place コメント comment コメント comment プロフィール jerry
  • 22. 場所 { "type" : "place", "code" : "ADAA8D9E-26C4-46F8-9A39-78EFD6DDC3F5", "name" : "Westin San Francisco", "remark": "Couchbase Connect 2014 on Oct 6, 2014 in San Francisco", "location": { "latitude": 37.7876643, "longitude": -122.4090627 }, "image" : "画像 (base64文字列)" }
  • 23. コメント { "type" : "comment", "place" : "ADAA8D9E-26C4-46F8-9A39-78EFD6DDC3F5", "created_at" : "2014-11-17T13:56:52+09:00", "contents" : "内容", "image": "画像 (base64文字列)" }
  • 24. プロフィール { "type" : "profile", "name" : "tom", "places" : [ "ADAA8D9E-26C4-46F8-9A39-78EFD6DDC3F5", "89B038CD-84A9-442c-95D1-0E22CAF8EB9E" ] }
  • 26. 構成図 Couchbase Server Sync Gateway おもいでノート (Couchbase Lite) cURL等 :8091 Backet omoidebase :4985 :4984 User, Roleの作成・削除 マスタ投入 おもいでノート (Couchbase Lite) 26 コメント作成コメント作成
  • 27. 構築1:バケット作成 Couchbase Server :8091 Backet omoidebase Admin Console等
  • 28. 構築2:Sync Gateway起動 Backet omoidebase Couchbase Server :8091 Sync Gateway Terminal等 ./sync_gateway config.json { "interface": ":4984", "adminInterface": ":4985", "log": [ "REST" ], "databases": { "omoidebase": { "server": "http://localhost:8091", "bucket": "omoidebase", "sync": ` function(doc, oldDoc) { if (doc.type === "profile") { if (doc.places) { for (var i = 0; i < doc.places.length; i++) { access(doc.name, doc.places[i]); } } access(doc.name, doc.name); channel(doc.name); } else if (doc.type === "comment") { channel(doc.place); } else if (doc.type === "place") { channel(doc._id); } }` } } } ※データーベースは複数定義可能 :4984 :4985 Sync Function
  • 29. 構築3:ユーザー作成 Backet omoidebase Couchbase Server :8091 Sync Gateway :4985 cURL等 tom password curl -XPOST -H "Content-Type: application/json" http://localhost:4985/omoidebase/ _user/ -d @user1.json { "name": "tom", "password": "password" }
  • 30. 構築4:マスタ系データインポート Backet omoidebase Couchbase Server :8091 Sync Gateway :4985 cURL等 場所プロフィール curl -XPUT -H "Content-Type: application/json" http://localhost:4985/omoidebase/ ADAA8D9E-26C4-46F8-9A39-78EFD6DDC3F5 -d @place1.json curl -XPUT -H "Content-Type: application/json" http://localhost:4985/omoidebase/tom -d @profile1.json
  • 31. 構築5:クライアント同期 Backet omoidebase Couchbase Server :8091 Sync Gateway :4984 アプリ Couchbase Lite Database omoidebase URL url = new URL("http://localhost:4984/omoidebase"); pull = database.createPullReplication(url); push = database.createPushReplication(url); Authenticator auth = new BasicAuthenticator(“tom”, “password”); pull.setAuthenticator(auth); push.setAuthenticator(auth); pull.start(); push.start(); Sync Function tom password place profile place profile
  • 32. 構築:Couchbase Serverのドキュメント 32 1.バケット作成 なし 2.Sync Gateway起動 ID Content _sync:seq _sync:syncdata { "Sync": " function(doc, oldDoc) {n if (doc.type === "profile… 3.ユーザー作成 ID Content _sync:seq 2 _sync:syncdata { "Sync": " function(doc, oldDoc) {n if (doc.type === ”profile… _sync:user:jerry { "name": "jerry", "all_channels": { }, "sequence": 2, "passwo… _sync:user:tom { "name": "tom", "all_channels": { }, "sequence": 1, "passwo…
  • 33. 構築:Couchbase Serverのドキュメント 33 4.マスタ系データインポート ID Content _sync:seq 7 _sync:syncdata { "Sync": " function(doc, oldDoc) {n if (doc.type === ”profile… _sync:user:jerry { "name": "jerry", "all_channels": { }, "sequence": 2, "passwo… _sync:user:tom { "name": "tom", "all_channels": { }, "sequence": 1, "passwo… ADAA8D9E-26C4-46F8-9A39-78EFD6DDC3F5 { "_sync": { "rev": "1-375de787d53752736649d964197e7a41", "s… 2C139CE5-9B5D-4836-97A3-B25AEC49D6FB { "_sync": { "rev": "1-22476c90d79e6724058271609f1a4408", "s… 89B038CD-84A9-442c-95D1-0E22CAF8EB9E { "_sync": { "rev": "1-4867aafbf14a79607730e3e3f7de6257", "s… jerry { "_sync": { "rev": "1-c0888ab8cf936c83aaf36a10eaca1a8d", "s… tom { "_sync": { "rev": "1-009fa66f707d5e3eea7b2830cff0ea51", "s…
  • 34. 構築:Couchbase Serverのドキュメント 34 5.クライアント同期 ID Content _sync:seq 7 _sync:syncdata { "Sync": " function(doc, oldDoc) {n if (doc.type === ”profile… _sync:user:jerry { "name": "jerry", "all_channels": { }, "sequence": 2, "passwo… _sync:user:tom { "name": "tom", "all_channels": { }, "sequence": 1, "passwo… ADAA8D9E-26C4-46F8-9A39-78EFD6DDC3F5 { "_sync": { "rev": "1-375de787d53752736649d964197e7a41", "s… 2C139CE5-9B5D-4836-97A3-B25AEC49D6FB { "_sync": { "rev": "1-22476c90d79e6724058271609f1a4408", "s… 89B038CD-84A9-442c-95D1-0E22CAF8EB9E { "_sync": { "rev": "1-4867aafbf14a79607730e3e3f7de6257", "s… jerry { "_sync": { "rev": "1-c0888ab8cf936c83aaf36a10eaca1a8d", "s… tom { "_sync": { "rev": "1-009fa66f707d5e3eea7b2830cff0ea51", "s…
  • 36. Configuration Files { "interface": ":4984", "adminInterface": ":4985", "log": [ "REST" ], "databases": { "omoidebase": { "server": "http://localhost:8091", "bucket": "omoidebase", "sync": ` function(doc, oldDoc) { if (doc.type === "profile") { if (doc.places) { for (var i = 0; i < doc.places.length; i++) { access(doc.name, doc.places[i]); } } access(doc.name, doc.name); channel(doc.name); } else if (doc.type === "comment") { channel(doc.place); } else if (doc.type === "place") { channel(doc._id); } }` } } } 36
  • 37. Sync Function API 37 主な関数 関数名引数説明 throw forbiddenプロパティを含むエラーオブジェクト例外の送出 requireUser username(文字列または文字列の配列) ユーザー名が引数に一致または配列の場合は含まれなければ例外を送出 requireRole rolename(文字列または文字列の配列) ユーザーのロールが引数に一致または配列の場合は含まれなければ例外を送 出 requireAccess channels(文字列または文字列の配列) ユーザーが引数のチャネルのうち少なくとも一つへのアクセスを有していなけ れば例外を送出 channel name(文字列または文字列の配列。nullやundefinedでも可) 引数に指定されたチャネルにドキュメントをルーティングします access username(文字列または文字列の配列。nullやundefinedでも可), channelname(文字列または文字列の配列。nullやundefinedでも可) ユーザーにチャネルへのアクセス権を付与します role username(文字列または文字列の配列。nullやundefinedでも可), rolename(文字列または文字列の配列。nullやundefinedでも可) ユーザーにロールを付与します http://developer.couchbase.com/mobile/develop/guides/sync-gateway/sync-function-api-guide/index.html 重要なのは channelとaccess
  • 38. 場所 チャネル ADAA8D9E-26C4-46F8-9A 39-78EFD6DDC3F5 { "type" : "place", "code" : "ADAA8D9E-26C4-46F8-9A39-78EFD6DDC3F5", "name" : "Westin San Francisco", "remark": "Couchbase Connect 2014 on Oct 6, 2014 in San Francisco", "location": { チャネル 89B038CD-84A9-442c-95 D1-0E22CAF8EB9E チャネル 2C139CE5-9B5D-4836-97 A3-B25AEC49D6FB "latitude": 37.7876643, "longitude": -122.4090627 }, "image" : "画像 (base64文字列)" } if (doc.type === "place") { channel(doc._id); } 場所場所場所
  • 39. プロフィール if (doc.type === "profile") { if (doc.places) { for (var i = 0; i < doc.places.length; i++) { access(doc.name, doc.places[i]); } } access(doc.name, doc.name); channel(doc.name); } プロフィール場所プロフィール場所 チャネル tom チャネル jerry チャネル ADAA8D9E-26C4-46F8-9 A39-78EFD6DDC3F5 tom jerry チャネル 89B038CD-84A9-442c-95 D1-0E22CAF8EB9E { "type" : "profile", "name" : "tom", "places" : [ "ADAA8D9E-26C4-46F8-9A39-78EFD6DDC3F5", "89B038CD-84A9-442c-95D1-0E22CAF8EB9E" ] }
  • 40. コメント { "type" : "comment", "place" : "ADAA8D9E-26C4-46F8-9A39-78EFD6DDC3F5", "created_at" : "2014-11-17T13:56:52+09:00", "contents" : "内容", "image": "画像 (base64文字列)" } if (doc.type === "comment") { channel(doc.place); } コメントコメントコメント チャネル ADAA8D9E-26C4-46F8-9 A39-78EFD6DDC3F5 チャネル 89B038CD-84A9-442c-95 D1-0E22CAF8EB9E チャネル 2C139CE5-9B5D-4836-97 A3-B25AEC49D6FB
  • 41. ポイント •チャネルの範囲を決める •ドキュメントにプロフィール情報を持つ チャネル ADAA8D9E-26C4-46F8- 9A39-78EFD6DDC3F5 場所 コメント コメント コメント コメント