SlideShare une entreprise Scribd logo
1  sur  48
EWD 3
トレーニング・コース #25
GlobalストレージのJavaScript用の抽象化
(f) Documentデータベースのできること
M/Gateway Developments Ltd.
Rob Tweed
訳: 日本ダイナシステム株式会社 嶋 芳成
GT.M版編集: 澤田 潔
※ 本稿オリジナルはCache’向けとして編纂
Document データベースとしての
Global ストレージ
2016/9/19 EWD 3 トレーニング・コース #25 2
1対1 対応
myDoc("a") = 123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d","e1","f1a")="bar1a"
myDoc("d","e1","f2a")="bar2a"
myDoc("d","e2","f1b")="bar1b"
myDoc("d","e2","f2b")="bar2b"
myDoc("d","e2","f3b")="bar3b"
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
},
d: {
e1: {
f1a: 'bar1a',
f2a: 'bar2a'
}
e2: {
f1b: 'bar1b',
f2b: 'bar2b',
f3b: 'bar3b'
}
}
}
2016/9/19 EWD 3 トレーニング・コース #25 3
Document データベースのメソッド
• Documentsデータベースに対するDocumentNode メソッド
/JSON マッピング
• getDocument()
• setDocument()
2016/9/19 EWD 3 トレーニング・コース #25 4
DocumentNode オブジェクトのインスタンス化
var doc = new this.documentStore.DocumentNode('myDoc');
myDoc("a") = 123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d","e1","f1a")="bar1a"
myDoc("d","e1","f2a")="bar2a"
myDoc("d","e2","f1b")="bar1b"
myDoc("d","e2","f2b")="bar2b"
myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #25 5
getDocument()
var doc = new this.documentStore.DocumentNode('myDoc');
var myObj = doc.getDocument();
myDoc("a") = 123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d","e1","f1a")="bar1a"
myDoc("d","e1","f2a")="bar2a"
myDoc("d","e2","f1b")="bar1b"
myDoc("d","e2","f2b")="bar2b"
myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #25 6
生成する
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
},
d: {
e1: {
f1a: 'bar1a',
f2a: 'bar2a'
}
e2: {
f1b: 'bar1b',
f2b: 'bar2b',
f3b: 'bar3b'
}
}
}
getDocument()
var doc = new this.documentStore.DocumentNode('myDoc');
var myObj = doc.getDocument();
myDoc("a") = 123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d","e1","f1a")="bar1a"
myDoc("d","e1","f2a")="bar2a"
myDoc("d","e2","f1b")="bar1b"
myDoc("d","e2","f2b")="bar2b"
myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #25 7
生成する
myObj は、標準のメモリ内の JavaScript オブジェクトで、
DocumentNode の階層構造の、指定された節の下の
部分木のデータのコピーを保持しています
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
},
d: {
e1: {
f1a: 'bar1a',
f2a: 'bar2a'
}
e2: {
f1b: 'bar1b',
f2b: 'bar2b',
f3b: 'bar3b'
}
}
}
setDocument()
var myObj = { //右に示すオブジェクトを生成する }
2016/9/19 EWD 3 トレーニング・コース #25 8
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
},
d: {
e1: {
f1a: 'bar1a',
f2a: 'bar2a'
}
e2: {
f1b: 'bar1b',
f2b: 'bar2b',
f3b: 'bar3b'
}
}
}
setDocument()
var myObj = { //右に示すオブジェクトを生成する }
var doc = new this.documentStore.DocumentNode('myDoc');
// これはまだディスク上には存在しない
2016/9/19 EWD 3 トレーニング・コース #25 9
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
},
d: {
e1: {
f1a: 'bar1a',
f2a: 'bar2a'
}
e2: {
f1b: 'bar1b',
f2b: 'bar2b',
f3b: 'bar3b'
}
}
}
setDocument()
var myObj = { //右に示すオブジェクトを生成する }
var doc = new this.documentStore.DocumentNode('myDoc');
doc.setDocument(myObj);
myDoc("a") = 123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d","e1","f1a")="bar1a"
myDoc("d","e1","f2a")="bar2a"
myDoc("d","e2","f1b")="bar1b"
myDoc("d","e2","f2b")="bar2b"
myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #25 10
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
},
d: {
e1: {
f1a: 'bar1a',
f2a: 'bar2a'
}
e2: {
f1b: 'bar1b',
f2b: 'bar2b',
f3b: 'bar3b'
}
}
}
生成する
setDocument()
var myObj = { //右に示すオブジェクトを生成する }
var doc = new this.documentStore.DocumentNode('myDoc');
doc.setDocument(myObj);
myDoc("a") = 123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d","e1","f1a")="bar1a"
myDoc("d","e1","f2a")="bar2a"
myDoc("d","e2","f1b")="bar1b"
myDoc("d","e2","f2b")="bar2b"
myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #25 11
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
},
d: {
e1: {
f1a: 'bar1a',
f2a: 'bar2a'
}
e2: {
f1b: 'bar1b',
f2b: 'bar2b',
f3b: 'bar3b'
}
}
}
生成する
myDoc は、ディスク上に生成され、そこには myObj オブ
ジェクトの保持するデータのコピーが格納されています
これで、Global ストレージの節(ノード)と対応されました
任意のDocumentNodeに適応できること
これらのメソッドは、ディスク上の Document の任意のレベルのノードに適用できます
var dnode = new this.documentStore.DocumentNode('myDoc', ['d']);
myDoc("a") = 123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d","e1","f1a")="bar1a"
myDoc("d","e1","f2a")="bar2a"
myDoc("d","e2","f1b")="bar1b"
myDoc("d","e2","f2b")="bar2b"
myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #25 12
任意のDocumentNodeに適応できること
これらのメソッドは、ディスク上の Document の任意のレベルのノードに適用できます
var dnode = new this.documentStore.DocumentNode('myDoc', ['d']);
var myObj = dnode.getDocument()
myDoc("a") = 123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d","e1","f1a")="bar1a"
myDoc("d","e1","f2a")="bar2a"
myDoc("d","e2","f1b")="bar1b"
myDoc("d","e2","f2b")="bar2b"
myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #25 13
myObj = {
e1: {
f1a: 'bar1a',
f2a: 'bar2a'
}
e2: {
f1b: 'bar1b',
f2b: 'bar2b',
f3b: 'bar3b'
}
}
任意のDocumentNodeに適応できること
これらのメソッドは、ディスク上の Document の任意のレベルのノードに適用できます
var dnode = new this.documentStore.DocumentNode('myDoc', ['d']);
var myObj = dnode.getDocument()
myDoc("a") = 123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d","e1","f1a")="bar1a"
myDoc("d","e1","f2a")="bar2a"
myDoc("d","e2","f1b")="bar1b"
myDoc("d","e2","f2b")="bar2b"
myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #25 14
myObj = {
e1: {
f1a: 'bar1a',
f2a: 'bar2a'
}
e2: {
f1b: 'bar1b',
f2b: 'bar2b',
f3b: 'bar3b'
}
}
myObj は、myDoc("d") の下位節(下位ノード)
の部分木だけから生成されます
任意のDocumentNodeに適応できること
これらのメソッドは、ディスク上の Document の任意のレベルのノードに適用できます
var dnode = new this.documentStore.DocumentNode('myDoc', ['d']);
myDoc("a") = 123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d","e1","f1a")="bar1a"
myDoc("d","e1","f2a")="bar2a"
myDoc("d","e2","f1b")="bar1b"
myDoc("d","e2","f2b")="bar2b"
myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #25 15
任意のDocumentNodeに適応できること
これらのメソッドは、ディスク上の Document の任意のレベルのノードに適用できます
var dnode = new this.documentStore.DocumentNode('myDoc', ['d']);
var myObj = { // 右に示したオブジェクトを生成します };
myDoc("a") = 123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d","e1","f1a")="bar1a"
myDoc("d","e1","f2a")="bar2a"
myDoc("d","e2","f1b")="bar1b"
myDoc("d","e2","f2b")="bar2b"
myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #25 16
myObj = {
g: 1000,
h2: {
w1: 'foo',
w2: 'bar'
}
}
任意のDocumentNodeに適応できること
これらのメソッドは、ディスク上の Document の任意のレベルのノードに適用できます
var dnode = new this.documentStore.DocumentNode('myDoc', ['d']);
var myObj = { // 右に示したオブジェクトを生成します };
dnode.setDocument(myObj);
myDoc("a") = 123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d","e1","f1a")="bar1a"
myDoc("d","e1","f2a")="bar2a"
myDoc("d","e2","f1b")="bar1b"
myDoc("d","e2","f2b")="bar2b"
myDoc("d","e2","f3b")="bar3b"
myDoc("d","g")=1000
myDoc("d","h2","w1")="foo"
myDoc("d","h2","w2")="bar"
2016/9/19 EWD 3 トレーニング・コース #25 17
myObj = {
g: 1000,
h2: {
w1: 'foo',
w2: 'bar'
}
}
任意のDocumentNodeに適応できること
これらのメソッドは、ディスク上の Document の任意のレベルのノードに適用できます
var dnode = new this.documentStore.DocumentNode('myDoc', ['d']);
var myObj = { // 右に示したオブジェクトを生成します };
dnode.setDocument(myObj);
myDoc("a") = 123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d","e1","f1a")="bar1a"
myDoc("d","e1","f2a")="bar2a"
myDoc("d","e2","f1b")="bar1b"
myDoc("d","e2","f2b")="bar2b"
myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #25 18
?
myObj = {
e2: {
f3b: 'new value',
f4b: 'bar4b'
},
g: 1000,
h2: {
w1: 'foo',
w2: 'bar'
}
}
任意のDocumentNodeに適応できること
これらのメソッドは、ディスク上の Document の任意のレベルのノードに適用できます
var dnode = new this.documentStore.DocumentNode('myDoc', ['d']);
var myObj = { // 右に示したオブジェクトを生成します };
dnode.setDocument(myObj);
myDoc("a") = 123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d","e1","f1a")="bar1a"
myDoc("d","e1","f2a")="bar2a"
myDoc("d","e2","f1b")="bar1b"
myDoc("d","e2","f2b")="bar2b"
myDoc("d","e2","f3b")="new value"
myDoc("d","e2","f4b")="bar4b"
myDoc("d","g")=1000
myDoc("d","h2","w1")="foo"
myDoc("d","h2","w2")="bar"
2016/9/19 EWD 3 トレーニング・コース #25 19
myObj = {
e2: {
f3b: 'new value',
f4b: 'bar4b'
},
g: 1000,
h2: {
w1: 'foo',
w2: 'bar'
}
}
任意のDocumentNodeに適応できること
これらのメソッドは、ディスク上の Document の任意のレベルのノードに適用できます
var dnode = new this.documentStore.DocumentNode('myDoc', ['d']);
var myObj = { // 右に示したオブジェクトを生成します };
dnode.delete();
myDoc("a") = 123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d","e1","f1a")="bar1a"
myDoc("d","e1","f2a")="bar2a"
myDoc("d","e2","f1b")="bar1b"
myDoc("d","e2","f2b")="bar2b"
myDoc("d","e2","f3b")="bar3b"
2016/9/19 EWD 3 トレーニング・コース #25 20
myObj = {
e2: {
f3b: 'new value',
f4b: 'bar4b'
},
g: 1000,
h2: {
w1: 'foo',
w2: 'bar'
}
}
任意のDocumentNodeに適応できること
これらのメソッドは、ディスク上の Document の任意のレベルのノードに適用できます
var dnode = new this.documentStore.DocumentNode('myDoc', ['d']);
var myObj = { // 右に示したオブジェクトを生成します };
dnode.delete();
myDoc("a") = 123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
2016/9/19 EWD 3 トレーニング・コース #25 21
myObj = {
e2: {
f3b: 'new value',
f4b: 'bar4b'
},
g: 1000,
h2: {
w1: 'foo',
w2: 'bar'
}
}
任意のDocumentNodeに適応できること
これらのメソッドは、ディスク上の Document の任意のレベルのノードに適用できます
var dnode = new this.documentStore.DocumentNode('myDoc', ['d']);
var myObj = { // 右に示したオブジェクトを生成します };
dnode.delete();
dnode.setDocument(myObj);
myDoc("a") = 123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d","e2","f3b")="new value"
myDoc("d","e2","f4b")="bar4b"
myDoc("d","g")=1000
myDoc("d","h2","w1")="foo"
myDoc("d","h2","w2")="bar"
2016/9/19 EWD 3 トレーニング・コース #25 22
myObj = {
e2: {
f3b: 'new value',
f4b: 'bar4b'
},
g: 1000,
h2: {
w1: 'foo',
w2: 'bar'
}
}
getDocument() と setDocument()
のさらに進んだ機能
2016/9/19 EWD 3 トレーニング・コース #25 23
配列のマッピング
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d",0)="value0"
myDoc("d",1)="value1"
myDoc("d",2)="value2"
myDoc("d",3)="value3"
myDoc("d",4)="value4"
myDoc("d",5)="value5"
myDoc("d",6)="value6"
Global ストレージ内での配列は、慣
例に過ぎませんが、添字値として連
続する整数を用います
2016/9/19 EWD 3 トレーニング・コース #25 24
配列のマッピング
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d",1)="value1"
myDoc("d",2)="value2"
myDoc("d",3)="value3"
myDoc("d",4)="value4"
myDoc("d",5)="value5"
myDoc("d",6)="value6"
Global ストレージ内での配列は、慣
例に過ぎませんが、添字値として連
続する整数を用います
旧来のアプリケーションでは、番号付
けは通常 1 からです
2016/9/19 EWD 3 トレーニング・コース #25 25
配列のマッピング
var myDoc = new this.documentStore.DocumentNode('myDoc');
var myObj = myDoc.getDocument();
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d",0)="value0"
myDoc("d",1)="value1"
myDoc("d",2)="value2"
myDoc("d",3)="value3"
myDoc("d",4)="value4"
myDoc("d",5)="value5"
myDoc("d",6)="value6"
getDocument() は、これらをオブジェクトにマップする
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: {
"0": "value0",
"1": "value1",
"2": "value2",
"3": "value3",
"4": "value4",
"5": "value5",
"6": "value6"
}
}
2016/9/19 EWD 3 トレーニング・コース #25 26
配列のマッピング
何故 JavaScript の配列にマッピングしないのでしょうか?
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d",0)="value0"
myDoc("d",1)="value1"
myDoc("d",2)="value2"
myDoc("d",3)="value3"
myDoc("d",4)="value4"
myDoc("d",5)="value5"
myDoc("d",6)="value6"
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: [
"value0",
"value1",
"value2",
"value3",
"value4",
"value5",
"value6"
]
}
2016/9/19 EWD 3 トレーニング・コース #25 27
?
配列のマッピング
何故 JavaScript の配列にマッピングしないのでしょうか?
もし2番目の項目がディスク上に存在しなくなったら?
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d",0)="value0"
myDoc("d",1)="value1"
myDoc("d",2)="value2"
myDoc("d",3)="value3"
myDoc("d",4)="value4"
myDoc("d",5)="value5"
myDoc("d",6)="value6"
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: [
"value0",
"value1",
"value2",
"value3",
"value4",
"value5",
"value6"
]
}
2016/9/19 EWD 3 トレーニング・コース #25 28
配列のマッピング
何故 JavaScript の配列にマッピングしないのでしょうか?
もし2番目の項目がディスク上に存在しなくなったら?
要素の番号がもはや一致しなくなります
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d",0)="value0"
myDoc("d",1)="value1"
myDoc("d",3)="value3"
myDoc("d",4)="value4"
myDoc("d",5)="value5"
myDoc("d",6)="value6"
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: [
"value0",
"value1",
"value3",
"value4",
"value5",
"value6"
]
}
2016/9/19 EWD 3 トレーニング・コース #25 29
myDoc("d",3) myObj.d[2]
配列のマッピング
何故 JavaScript の配列にマッピングしないのでしょうか?
もし2番目の項目がディスク上に存在しなくなったら?
setDocument() を再度用いると問題が生じます
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d",0)="value0"
myDoc("d",1)="value1"
myDoc("d",2)="value3"
myDoc("d",3)="value4"
myDoc("d",4)="value5"
myDoc("d",5)="value6"
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: [
"value0",
"value1",
"value3",
"value4",
"value5",
"value6"
]
}
2016/9/19 EWD 3 トレーニング・コース #25 30
配列のマッピング
何故 JavaScript の配列にマッピングしないのでしょうか?
整数以外の添字があると順序が狂います
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d",0)="value0"
myDoc("d",1)="value1"
myDoc("d",2)="value2"
myDoc("d",3)="value3"
myDoc("d",4)="value4"
myDoc("d",5)="value5"
myDoc("d",6)="value6"
myDoc("d","foo")="bar"
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: [
"value0",
"value1",
"value2",
"value3",
"value4",
"value5",
"value6"
]
}
2016/9/19 EWD 3 トレーニング・コース #25 31
?
配列のマッピング
何故 JavaScript の配列にマッピングしないのでしょうか?
整数の順序が狂っていない添字なら配列にマップ可能?
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d",0)="value0"
myDoc("d",1)="value1"
myDoc("d",2)="value2"
myDoc("d",3)="value3"
myDoc("d",4)="value4"
myDoc("d",5)="value5"
myDoc("d",6)="value6"
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: [
"value0",
"value1",
"value2",
"value3",
"value4",
"value5",
"value6"
]
}
2016/9/19 EWD 3 トレーニング・コース #25 32
配列のマッピング
何故 JavaScript の配列にマッピングしないのでしょうか?
整数の順序が狂っていない添字なら配列にマップ可能?
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d",0)="value0"
myDoc("d",1)="value1"
myDoc("d",2)="value2"
myDoc("d",3)="value3"
myDoc("d",4)="value4"
myDoc("d",5)="value5"
myDoc("d",6)="value6"
myDoc("d","foo")="bar"
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: {
"0": "value0",
"1": "value1",
"2": "value2",
"3": "value3",
"4": "value4",
"5": "value5",
"6": "value6"
"foo": "bar"
}
}
2016/9/19 EWD 3 トレーニング・コース #25 33
配列のマッピング
何故 JavaScript の配列にマッピングしないのでしょうか?
整数の順序が狂っていない添字なら配列にマップ可能?
 これは、性能上に大きな問題が生じることになるでしょう
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d",0)="value0"
myDoc("d",1)="value1"
myDoc("d",2)="value2"
myDoc("d",3)="value3"
myDoc("d",4)="value4"
myDoc("d",5)="value5"
myDoc("d",6)="value6"
… 省略 …
myDoc("d",301839979)="not good"
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: [
"value0",
"value1",
"value2",
"value3",
"value4",
"value5",
"value6"
…
"not good"
]
}
2016/9/19 EWD 3 トレーニング・コース #25 34
配列のマッピング
何故 JavaScript の配列にマッピングしないのでしょうか?
整数の順序が狂っていない添字なら配列にマップ可能?
 これは、性能上に大きな問題が生じることになるでしょう
 すべての添字値をチェックする必要が生じるのです
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d",0)="value0"
myDoc("d",1)="value1"
myDoc("d",2)="value2"
myDoc("d",3)="value3"
myDoc("d",4)="value4"
myDoc("d",5)="value5"
myDoc("d",6)="value6"
… 省略 …
myDoc("d",301839979)="not good"
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: [
"value0",
"value1",
"value2",
"value3",
"value4",
"value5",
"value6"
…
"not good"
]
}
2016/9/19 EWD 3 トレーニング・コース #25 35
何百万もの添字をチェックするこ
とはできますが…
配列のマッピング
var myDoc = new this.documentStore.DocumentNode('myDoc');
var myObj = myDoc.getDocument();
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d",0)="value0"
myDoc("d",1)="value1"
myDoc("d",2)="value2"
myDoc("d",3)="value3"
myDoc("d",4)="value4"
myDoc("d",5)="value5"
myDoc("d",6)="value6"
getDocument() は、性能維持のためにオブジェクトとの間
でマップします
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: {
"0": "value0",
"1": "value1",
"2": "value2",
"3": "value3",
"4": "value4",
"5": "value5",
"6": "value6"
}
}
2016/9/19 EWD 3 トレーニング・コース #25 36
配列のマッピング
var myDoc = new this.documentStore.DocumentNode('myDoc');
myDoc.setDocument(myObj);
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d",0)="value0"
myDoc("d",1)="value1"
myDoc("d",2)="value2"
myDoc("d",3)="value3"
myDoc("d",4)="value4"
myDoc("d",5)="value5"
myDoc("d",6)="value6"
そして、JavaScript オブジェクトと両方向の変換で曖昧さを
排除したマッピングのためです
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: {
"0": "value0",
"1": "value1",
"2": "value2",
"3": "value3",
"4": "value4",
"5": "value5",
"6": "value6"
}
}
2016/9/19 EWD 3 トレーニング・コース #25 37
マップされた配列を利用する
var myDoc = new this.documentStore.DocumentNode('myDoc');
var myObj = myDoc.getDocument();
for (var index in myObj.d) {
console.log('element index: ' + myObj.d[index]);
}
forEach 何とかではなく、ループには for を使う必要
があります
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: {
"0": "value0",
"1": "value1",
"2": "value2",
"3": "value3",
"4": "value4",
"5": "value5",
"6": "value6"
}
}
2016/9/19 EWD 3 トレーニング・コース #25 38
JavaScript 配列についてはどうなる?
JavaScript には正式な配列型があります
例えば右の myObj.d は JavaScript の配列です
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: [
"value0",
"value1",
"value2",
"value3",
"value4",
"value5",
"value6"
]
}
2016/9/19 EWD 3 トレーニング・コース #25 39
JavaScript 配列についてはどうなる?
JavaScript には正式な配列型があります
例えば右の myObj.d は JavaScript の配列です
これらを setDocument() はどのように処理するのでしょう?
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: [
"value0",
"value1",
"value2",
"value3",
"value4",
"value5",
"value6"
]
}
2016/9/19 EWD 3 トレーニング・コース #25 40
setDocument() による配列のマッピング
var myDoc = new this.documentStore.DocumentNode('myDoc');
myDoc.delete()
myDoc.setDocument(myObj);
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d",0)="value0"
myDoc("d",1)="value1"
myDoc("d",2)="value2"
myDoc("d",3)="value3"
myDoc("d",4)="value4"
myDoc("d",5)="value5"
myDoc("d",6)="value6"
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: [
"value0",
"value1",
"value2",
"value3",
"value4",
"value5",
"value6"
]
}
2016/9/19 EWD 3 トレーニング・コース #25 41
setDocument() による配列のマッピング
var myDoc = new this.documentStore.DocumentNode('myDoc');
myDoc.delete()
myDoc.setDocument(myObj);
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d",0)="value0"
myDoc("d",1)="value1"
myDoc("d",2)="value2"
myDoc("d",3)="value3"
myDoc("d",4)="value4"
myDoc("d",5)="value5"
myDoc("d",6)="value6"
ゼロ「0」から始まる整数連番の添え字にマッピングされます
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: [
"value0",
"value1",
"value2",
"value3",
"value4",
"value5",
"value6"
]
}
2016/9/19 EWD 3 トレーニング・コース #25 42
従来のGlobalストレージのマッピング
var myDoc = new this.documentStore.DocumentNode('myDoc');
myDoc.delete()
myDoc.setDocument(myObj);
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d",1)="value1"
myDoc("d",2)="value2"
myDoc("d",3)="value3"
myDoc("d",4)="value4"
myDoc("d",5)="value5"
myDoc("d",6)="value6"
従来のMUMPSを統合する場合、1から始まる連番に
ついてはどうなるでしょうか?
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: [
"value1",
"value2",
"value3",
"value4",
"value5",
"value6"
]
}
2016/9/19 EWD 3 トレーニング・コース #25 43
?
従来のGlobalストレージのマッピング
var myDoc = new this.documentStore.DocumentNode('myDoc');
var myObj = myDoc.getDocument();
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d",1)="value1"
myDoc("d",2)="value2"
myDoc("d",3)="value3"
myDoc("d",4)="value4"
myDoc("d",5)="value5"
myDoc("d",6)="value6"
getDocument() によるマッピングは正しく働きます
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: {
"1": "value1",
"2": "value2",
"3": "value3",
"4": "value4",
"5": "value5",
"6": "value6"
}
}
2016/9/19 EWD 3 トレーニング・コース #25 44
従来のGlobalストレージのマッピング
var myDoc = new this.documentStore.DocumentNode('myDoc');
myDoc.delete()
myDoc.setDocument(myObj);
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d",1)="value1"
myDoc("d",2)="value2"
myDoc("d",3)="value3"
myDoc("d",4)="value4"
myDoc("d",5)="value5"
myDoc("d",6)="value6"
オブジェクトからの逆のマッピングも正しく作動します
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: {
"1": "value1",
"2": "value2",
"3": "value3",
"4": "value4",
"5": "value5",
"6": "value6"
}
}
2016/9/19 EWD 3 トレーニング・コース #25 45
setDocument() による配列のマッピング
var myDoc = new this.documentStore.DocumentNode('myDoc');
myDoc.delete()
myDoc.setDocument(myObj);
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d",0)="value1"
myDoc("d",1)="value2"
myDoc("d",2)="value3"
myDoc("d",3)="value4"
myDoc("d",4)="value5"
myDoc("d",5)="value6"
しかし、配列からはゼロ「0」に始まる整数連番の添え字に
マッピングされます
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: [
"value1",
"value2",
"value3",
"value4",
"value5",
"value6"
]
}
2016/9/19 EWD 3 トレーニング・コース #25 46
setDocument() による配列のマッピング
var myDoc = new this.documentStore.DocumentNode('myDoc');
myDoc.delete()
var offset = 1;
myDoc.setDocument(myObj, offset);
myDoc("a")=123
myDoc("b","c1")="foo"
myDoc("b","c2")="foo2"
myDoc("d",1)="value1"
myDoc("d",2)="value2"
myDoc("d",3)="value3"
myDoc("d",4)="value4"
myDoc("d",5)="value5"
myDoc("d",6)="value6"
第2引数としてオフセットを指定しなければ、です
myObj = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: [
"value1",
"value2",
"value3",
"value4",
"value5",
"value6"
]
}
2016/9/19 EWD 3 トレーニング・コース #25 47
ユニークで強力なドキュメント・データ
ベース
• 粒度が細かい
• すなわち、ディスク上のドキュメント内のどのレベルにも適用
可能
• setDocument() を用いて巨大なドキュメントを保存
• getDocument() を用いることで、ある
DocumentNodeの下の下位節を検索します
• ディスク上の Document について、DocumentNode の
value プロパティを利用することで、その Document の任
意のレベルで名前/値のペアを読み書き可能
2016/9/19 EWD 3 トレーニング・コース #25 48

Contenu connexe

En vedette

En vedette (16)

EWD 3トレーニングコース#2 EWD 3の概要
EWD 3トレーニングコース#2 EWD 3の概要EWD 3トレーニングコース#2 EWD 3の概要
EWD 3トレーニングコース#2 EWD 3の概要
 
EWD 3トレーニングコース#8 ewd-xpressメッセージ・サイクルの解剖
EWD 3トレーニングコース#8 ewd-xpressメッセージ・サイクルの解剖EWD 3トレーニングコース#8 ewd-xpressメッセージ・サイクルの解剖
EWD 3トレーニングコース#8 ewd-xpressメッセージ・サイクルの解剖
 
EWD 3トレーニングコース#14 ewd-xpressメッセージ用にAjaxを用いる
EWD 3トレーニングコース#14 ewd-xpressメッセージ用にAjaxを用いるEWD 3トレーニングコース#14 ewd-xpressメッセージ用にAjaxを用いる
EWD 3トレーニングコース#14 ewd-xpressメッセージ用にAjaxを用いる
 
EWD 3トレーニングコース#11 ewd-xpressでのエラー処理
EWD 3トレーニングコース#11 ewd-xpressでのエラー処理EWD 3トレーニングコース#11 ewd-xpressでのエラー処理
EWD 3トレーニングコース#11 ewd-xpressでのエラー処理
 
EWD 3トレーニングコース#12 ewd-xpressのセッション・タイムアウトの制御
EWD 3トレーニングコース#12 ewd-xpressのセッション・タイムアウトの制御EWD 3トレーニングコース#12 ewd-xpressのセッション・タイムアウトの制御
EWD 3トレーニングコース#12 ewd-xpressのセッション・タイムアウトの制御
 
EWD 3トレーニングコース#6 ewd-xpressアプリ開始時に何が起こるか
EWD 3トレーニングコース#6 ewd-xpressアプリ開始時に何が起こるかEWD 3トレーニングコース#6 ewd-xpressアプリ開始時に何が起こるか
EWD 3トレーニングコース#6 ewd-xpressアプリ開始時に何が起こるか
 
EWD 3トレーニングコース#23 GlobalストレージのJavaScript用抽象化-(d) ノードの範囲を渡り歩く
EWD 3トレーニングコース#23 GlobalストレージのJavaScript用抽象化-(d) ノードの範囲を渡り歩くEWD 3トレーニングコース#23 GlobalストレージのJavaScript用抽象化-(d) ノードの範囲を渡り歩く
EWD 3トレーニングコース#23 GlobalストレージのJavaScript用抽象化-(d) ノードの範囲を渡り歩く
 
EWD 3トレーニングコース#10 ewd-xpressのSessionとユーザー認証
EWD 3トレーニングコース#10 ewd-xpressのSessionとユーザー認証EWD 3トレーニングコース#10 ewd-xpressのSessionとユーザー認証
EWD 3トレーニングコース#10 ewd-xpressのSessionとユーザー認証
 
EWD 3トレーニング・コース #29 ewd-xpress を Linux systemdでサービスとして稼働させる
EWD 3トレーニング・コース #29 ewd-xpress を Linux systemdでサービスとして稼働させるEWD 3トレーニング・コース #29 ewd-xpress を Linux systemdでサービスとして稼働させる
EWD 3トレーニング・コース #29 ewd-xpress を Linux systemdでサービスとして稼働させる
 
EWD 3トレーニングコース#24 GlobalストレージのJavaScript用抽象化-(e) ドキュメントの末端ノードを渡り歩く
EWD 3トレーニングコース#24 GlobalストレージのJavaScript用抽象化-(e) ドキュメントの末端ノードを渡り歩くEWD 3トレーニングコース#24 GlobalストレージのJavaScript用抽象化-(e) ドキュメントの末端ノードを渡り歩く
EWD 3トレーニングコース#24 GlobalストレージのJavaScript用抽象化-(e) ドキュメントの末端ノードを渡り歩く
 
EWD 3トレーニングコース#5 ewd-xpressアプリ開発第1ステップ
EWD 3トレーニングコース#5 ewd-xpressアプリ開発第1ステップEWD 3トレーニングコース#5 ewd-xpressアプリ開発第1ステップ
EWD 3トレーニングコース#5 ewd-xpressアプリ開発第1ステップ
 
EWD 3トレーニングコース#9 複雑なewd-xpressメッセージと応答
EWD 3トレーニングコース#9 複雑なewd-xpressメッセージと応答EWD 3トレーニングコース#9 複雑なewd-xpressメッセージと応答
EWD 3トレーニングコース#9 複雑なewd-xpressメッセージと応答
 
EWD 3トレーニングコース#4 ewd-xpressのインストールと構成
EWD 3トレーニングコース#4 ewd-xpressのインストールと構成EWD 3トレーニングコース#4 ewd-xpressのインストールと構成
EWD 3トレーニングコース#4 ewd-xpressのインストールと構成
 
EWD 3 トレーニング・コース #1 Node.jsとGT.Mの統合方法
EWD 3トレーニング・コース #1 Node.jsとGT.Mの統合方法EWD 3トレーニング・コース #1 Node.jsとGT.Mの統合方法
EWD 3 トレーニング・コース #1 Node.jsとGT.Mの統合方法
 
EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/WebサービスにアクセスするEWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
 
EWD 3トレーニングコース#13 全てをひとつにまとめてewd-xpressで稼働させてみる
EWD 3トレーニングコース#13 全てをひとつにまとめてewd-xpressで稼働させてみるEWD 3トレーニングコース#13 全てをひとつにまとめてewd-xpressで稼働させてみる
EWD 3トレーニングコース#13 全てをひとつにまとめてewd-xpressで稼働させてみる
 

Similaire à EWD 3トレーニングコース#25 GlobalストレージのJavaScript用抽象化 - (f) Documentデータベースのできること

はじめてのCouch db
はじめてのCouch dbはじめてのCouch db
はじめてのCouch db
Eiji Kuroda
 
今さら始めるCoffeeScript
今さら始めるCoffeeScript今さら始めるCoffeeScript
今さら始めるCoffeeScript
Ashitaba YOSHIOKA
 
怪しいWindowsプログラミング
怪しいWindowsプログラミング怪しいWindowsプログラミング
怪しいWindowsプログラミング
nagoya313
 
月間10億pvを支えるmongo db
月間10億pvを支えるmongo db月間10億pvを支えるmongo db
月間10億pvを支えるmongo db
Yuji Isobe
 
cocos2d-xにおけるBox2Dの利用方法および便利なツール
cocos2d-xにおけるBox2Dの利用方法および便利なツールcocos2d-xにおけるBox2Dの利用方法および便利なツール
cocos2d-xにおけるBox2Dの利用方法および便利なツール
Tomoaki Shimizu
 

Similaire à EWD 3トレーニングコース#25 GlobalストレージのJavaScript用抽象化 - (f) Documentデータベースのできること (16)

EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするEWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
 
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするEWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
 
はじめてのCouch db
はじめてのCouch dbはじめてのCouch db
はじめてのCouch db
 
今さら始めるCoffeeScript
今さら始めるCoffeeScript今さら始めるCoffeeScript
今さら始めるCoffeeScript
 
怪しいWindowsプログラミング
怪しいWindowsプログラミング怪しいWindowsプログラミング
怪しいWindowsプログラミング
 
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作るGoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
 
MongoDB2.2の新機能
MongoDB2.2の新機能MongoDB2.2の新機能
MongoDB2.2の新機能
 
Gorinphp0729
Gorinphp0729Gorinphp0729
Gorinphp0729
 
Gorinphp0729
Gorinphp0729Gorinphp0729
Gorinphp0729
 
Zend Frameworkで始める携帯サイト
Zend Frameworkで始める携帯サイトZend Frameworkで始める携帯サイト
Zend Frameworkで始める携帯サイト
 
月間10億pvを支えるmongo db
月間10億pvを支えるmongo db月間10億pvを支えるmongo db
月間10億pvを支えるmongo db
 
about dakota6.7 gui
about dakota6.7 guiabout dakota6.7 gui
about dakota6.7 gui
 
EmacsとGlossでお絵描きしてみるよ
EmacsとGlossでお絵描きしてみるよEmacsとGlossでお絵描きしてみるよ
EmacsとGlossでお絵描きしてみるよ
 
Try Jetpack
Try JetpackTry Jetpack
Try Jetpack
 
cocos2d-xにおけるBox2Dの利用方法および便利なツール
cocos2d-xにおけるBox2Dの利用方法および便利なツールcocos2d-xにおけるBox2Dの利用方法および便利なツール
cocos2d-xにおけるBox2Dの利用方法および便利なツール
 
第5回LinkedData勉強会@yayamamo
第5回LinkedData勉強会@yayamamo第5回LinkedData勉強会@yayamamo
第5回LinkedData勉強会@yayamamo
 

Plus de Kiyoshi Sawada

Plus de Kiyoshi Sawada (17)

EWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作る
EWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作るEWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作る
EWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作る
 
EWD 3トレーニングコース#30 ewd-xpressアプリケーションをモジュラー化する
EWD 3トレーニングコース#30 ewd-xpressアプリケーションをモジュラー化するEWD 3トレーニングコース#30 ewd-xpressアプリケーションをモジュラー化する
EWD 3トレーニングコース#30 ewd-xpressアプリケーションをモジュラー化する
 
EWD 3トレーニングコース#29 ewd-xpressをWindows上のサービスとして稼働させる
EWD 3トレーニングコース#29 ewd-xpressをWindows上のサービスとして稼働させるEWD 3トレーニングコース#29 ewd-xpressをWindows上のサービスとして稼働させる
EWD 3トレーニングコース#29 ewd-xpressをWindows上のサービスとして稼働させる
 
EWD 3トレーニングコース#28 従来のMUMPSコードをewd-xpressと統合する
EWD 3トレーニングコース#28 従来のMUMPSコードをewd-xpressと統合するEWD 3トレーニングコース#28 従来のMUMPSコードをewd-xpressと統合する
EWD 3トレーニングコース#28 従来のMUMPSコードをewd-xpressと統合する
 
EWD 3トレーニングコース#27 GlobalストレージのJavaScript用抽象化-(h) EWD 3 セッション
EWD 3トレーニングコース#27 GlobalストレージのJavaScript用抽象化-(h) EWD 3 セッションEWD 3トレーニングコース#27 GlobalストレージのJavaScript用抽象化-(h) EWD 3 セッション
EWD 3トレーニングコース#27 GlobalストレージのJavaScript用抽象化-(h) EWD 3 セッション
 
EWD 3トレーニングコース#26 GlobalストレージのJavaScript用抽象化-(g) イベント駆動の索引管理
EWD 3トレーニングコース#26 GlobalストレージのJavaScript用抽象化-(g) イベント駆動の索引管理EWD 3トレーニングコース#26 GlobalストレージのJavaScript用抽象化-(g) イベント駆動の索引管理
EWD 3トレーニングコース#26 GlobalストレージのJavaScript用抽象化-(g) イベント駆動の索引管理
 
EWD 3トレーニングコース#24 GlobalストレージのJavaScript用抽象化-(e) ドキュメントの末端ノードを渡り歩く
EWD 3トレーニングコース#24 GlobalストレージのJavaScript用抽象化-(e) ドキュメントの末端ノードを渡り歩くEWD 3トレーニングコース#24 GlobalストレージのJavaScript用抽象化-(e) ドキュメントの末端ノードを渡り歩く
EWD 3トレーニングコース#24 GlobalストレージのJavaScript用抽象化-(e) ドキュメントの末端ノードを渡り歩く
 
EWD 3トレーニングコース#18 GlobalストレジでNoSQLデータベースをモデル化する
EWD 3トレーニングコース#18 GlobalストレジでNoSQLデータベースをモデル化するEWD 3トレーニングコース#18 GlobalストレジでNoSQLデータベースをモデル化する
EWD 3トレーニングコース#18 GlobalストレジでNoSQLデータベースをモデル化する
 
EWD 3トレーニングコース#17 Globalストレジ・データベース入門
EWD 3トレーニングコース#17 Globalストレジ・データベース入門EWD 3トレーニングコース#17 Globalストレジ・データベース入門
EWD 3トレーニングコース#17 Globalストレジ・データベース入門
 
EWD 3トレーニングコース#16 ewd-xpressサービス
EWD 3トレーニングコース#16 ewd-xpressサービスEWD 3トレーニングコース#16 ewd-xpressサービス
EWD 3トレーニングコース#16 ewd-xpressサービス
 
EWD 3トレーニングコース#15 ewd-xpressでjQuery以外のフレームワークを利用する
EWD 3トレーニングコース#15 ewd-xpressでjQuery以外のフレームワークを利用するEWD 3トレーニングコース#15 ewd-xpressでjQuery以外のフレームワークを利用する
EWD 3トレーニングコース#15 ewd-xpressでjQuery以外のフレームワークを利用する
 
EWD 3トレーニングコース#12 ewd-xpressのセッション・タイムアウトの制御
EWD 3トレーニングコース#12 ewd-xpressのセッション・タイムアウトの制御EWD 3トレーニングコース#12 ewd-xpressのセッション・タイムアウトの制御
EWD 3トレーニングコース#12 ewd-xpressのセッション・タイムアウトの制御
 
EWD 3トレーニングコース#11 ewd-xpressでのエラー処理
EWD 3トレーニングコース#11 ewd-xpressでのエラー処理EWD 3トレーニングコース#11 ewd-xpressでのエラー処理
EWD 3トレーニングコース#11 ewd-xpressでのエラー処理
 
EWD 3トレーニングコース#8 ewd-xpressメッセージ・サイクルの解剖
EWD 3トレーニングコース#8 ewd-xpressメッセージ・サイクルの解剖EWD 3トレーニングコース#8 ewd-xpressメッセージ・サイクルの解剖
EWD 3トレーニングコース#8 ewd-xpressメッセージ・サイクルの解剖
 
EWD 3トレーニングコース#7 ewd-xpressメッセージ・パターンを適用する
EWD 3トレーニングコース#7 ewd-xpressメッセージ・パターンを適用するEWD 3トレーニングコース#7 ewd-xpressメッセージ・パターンを適用する
EWD 3トレーニングコース#7 ewd-xpressメッセージ・パターンを適用する
 
EWD 3トレーニングコース#6 ewd-xpressアプリ開始時に何が起こるか
EWD 3トレーニングコース#6 ewd-xpressアプリ開始時に何が起こるかEWD 3トレーニングコース#6 ewd-xpressアプリ開始時に何が起こるか
EWD 3トレーニングコース#6 ewd-xpressアプリ開始時に何が起こるか
 
EWD 3トレーニングコース#3 EWD 3 モジュールの概要
EWD 3トレーニングコース#3 EWD 3 モジュールの概要EWD 3トレーニングコース#3 EWD 3 モジュールの概要
EWD 3トレーニングコース#3 EWD 3 モジュールの概要
 

EWD 3トレーニングコース#25 GlobalストレージのJavaScript用抽象化 - (f) Documentデータベースのできること