WEBVTT

00:00:00.560 --> 00:00:05.040 align:middle
こんにちは。今回は Voyage を紹介します。

00:00:05.560 --> 00:00:07.880 align:middle
NoSQL データベースのラッパーです。

00:00:08.120 --> 00:00:11.520 align:middle
目標は、本物のアプリケーションを
構築することです。

00:00:11.680 --> 00:00:15.680 align:middle
Voyage を使って
TinyBlog のように Mongo データベースに

00:00:16.080 --> 00:00:19.200 align:middle
オブジェクトを格納して、実サービスとして
デプロイできるようになるでしょう。

00:00:19.400 --> 00:00:20.880 align:middle
また、オブジェクトを格納するための

00:00:21.200 --> 00:00:23.680 align:middle
簡単な方法もお見せしたいと思います。

00:00:24.080 --> 00:00:27.120 align:middle
Voyage は簡単なソリューションです。

00:00:28.640 --> 00:00:30.320 align:middle
まず、MongoDB とは何でしょうか？

00:00:30.760 --> 00:00:35.680 align:middle
Mongo はドキュメント指向の
新しい NoSQL データベースです。

00:00:36.840 --> 00:00:40.280 align:middle
強力な問い合わせ言語を持っています。

00:00:40.440 --> 00:00:44.440 align:middle
Mongo はまた CouchDB や Riak に並んで
最も人気のあるデータベースの 1 つです。

00:00:44.600 --> 00:00:48.240 align:middle
Mongo と Voyage を使いましょう。

00:00:48.480 --> 00:00:52.480 align:middle
実際のところ、Voyage はマッパーです。
オブジェクトに対して プログラマに代わって

00:00:53.360 --> 00:00:56.680 align:middle
MongoDB にほぼ自動的にマップします。

00:00:56.840 --> 00:00:58.880 align:middle
Java で Hibernate を使ったことがあれば

00:00:59.040 --> 00:01:02.120 align:middle
Voyage は MongoDB での Hibernate
と同等です。

00:01:02.400 --> 00:01:03.960 align:middle
ただし Voyage は Pharo 用に作られています。

00:01:05.120 --> 00:01:08.680 align:middle
ここに Voyage の特徴を挙げています。
とても単純です。

00:01:08.840 --> 00:01:12.320 align:middle
格納されたオブジェクトを読み込んだ時に
元のオブジェクトの同一性が保証されています。

00:01:13.000 --> 00:01:15.320 align:middle
エラー処理も提供されています。

00:01:15.480 --> 00:01:18.840 align:middle
そしてコネクションプールを実装しているので

00:01:19.000 --> 00:01:21.160 align:middle
スピードも向上しています。

00:01:22.720 --> 00:01:25.360 align:middle
簡単なところから始めましょう。

00:01:25.520 --> 00:01:28.640 align:middle
最初に MongoRepositoryを作ります。

00:01:28.800 --> 00:01:31.520 align:middle
これらの表現式を使います。

00:01:32.240 --> 00:01:35.680 align:middle
Mongo データベースに
アクセスしたいとします。

00:01:35.840 --> 00:01:37.920 align:middle
Mongo は Pharo の外部で
管理されているわけですが

00:01:38.320 --> 00:01:41.880 align:middle
プロトタイプする時にはよく

00:01:42.040 --> 00:01:44.440 align:middle
Mongo データベースをオンメモリで使います。

00:01:44.600 --> 00:01:47.600 align:middle
ここでは MongoMemoryRepository
として参照されています。

00:01:48.040 --> 00:01:52.440 align:middle
Mongo データベースは必要ありません。
まず最初に、アプリケーションをプロトタイプします。

00:01:53.040 --> 00:01:58.080 align:middle
プロトタイプがちゃんと動くようになったら
オンメモリのレポジトリを

00:01:58.360 --> 00:02:01.560 align:middle
本物のレポジトリに切り替えて
外部にあるデータベースを使います。

00:02:01.720 --> 00:02:04.000 align:middle
こうやって作っていきます。

00:02:07.400 --> 00:02:08.680 align:middle
Mongo を説明するために

00:02:09.040 --> 00:02:13.240 align:middle
とても単純なモデルを用意しました。
スーパーパワーを持ったスーパーヒーローがいて

00:02:13.680 --> 00:02:16.440 align:middle
鎧や武器を持っています。

00:02:16.880 --> 00:02:21.440 align:middle
このコースでお見せすることを使って
演習をすることができるでしょう。

00:02:21.600 --> 00:02:23.160 align:middle
きっと助けになります。

00:02:23.560 --> 00:02:26.680 align:middle
スーパーマンをスクリプティングすることを
楽しんでください。

00:02:27.280 --> 00:02:32.240 align:middle
まず、どうやってヒーローとパワーを操るかを
見てみましょう。

00:02:33.400 --> 00:02:38.920 align:middle
まず Hero クラスがあります。
Hero クラスには名前とレベルと能力があります。

00:02:39.880 --> 00:02:43.720 align:middle
名前にはアクセサーとセッターがあります。

00:02:43.880 --> 00:02:45.640 align:middle
レベルについても同様です。

00:02:46.000 --> 00:02:48.040 align:middle
能力(power)は集合として管理します。

00:02:48.200 --> 00:02:53.000 align:middle
能力がなければ空集合です。

00:02:53.600 --> 00:02:56.400 align:middle
何か能力を加える時には
それを集合に加えます。

00:02:56.560 --> 00:02:59.040 align:middle
これがとても基本的な部分です。

00:03:00.720 --> 00:03:04.560 align:middle
当面は能力には名前だけがあります。

00:03:05.720 --> 00:03:08.920 align:middle
名前を書くこともできますし
書かないでおくこともできます。

00:03:10.000 --> 00:03:13.360 align:middle
さて、ここでのポイントは
ドメインクラスがデータベースに格納される

00:03:13.800 --> 00:03:17.000 align:middle
ことをどうやって宣言するかです。

00:03:17.240 --> 00:03:22.600 align:middle
ルートクラスという考え方を理解することが
このデータベースの出発地点です。

00:03:23.160 --> 00:03:27.720 align:middle
システムのどのクラスでも構いません。
ルートとして印を付けて

00:03:28.080 --> 00:03:32.280 align:middle
isVoyageRoot というクラスメソッドがあれば。
（クラスメソッドですよ）

00:03:33.800 --> 00:03:38.640 align:middle
Hero クラスの場合には
isVoyageRoot は true を返します。

00:03:39.360 --> 00:03:43.400 align:middle
この時点で Voyage は Hero を

00:03:43.800 --> 00:03:45.360 align:middle
Mongo データベースに格納するとわかります。

00:03:46.640 --> 00:03:48.960 align:middle
スパイダーマンをやってみましょう。

00:03:49.240 --> 00:03:51.880 align:middle
名前は Spiderman で
レベルは epic（最高）です。

00:03:52.240 --> 00:03:56.720 align:middle
能力は、スパイダーマンの特殊技能ですが
彼の能力は強靭なこと、壁を登ること

00:03:57.160 --> 00:04:01.760 align:middle
蜘蛛としての本能を持っているとされています。

00:04:02.440 --> 00:04:04.480 align:middle
この情報を保存します。

00:04:04.880 --> 00:04:09.400 align:middle
save は Voyage にこのスーパーヒーローを

00:04:09.560 --> 00:04:11.160 align:middle
データベースに格納するように指示します。

00:04:11.400 --> 00:04:15.000 align:middle
同じことをウルヴァリンと
彼の能力について行って

00:04:15.160 --> 00:04:16.600 align:middle
そのデータを保存します。

00:04:16.880 --> 00:04:18.880 align:middle
さて、Mongo データベースを見ると

00:04:19.040 --> 00:04:21.440 align:middle
db.Hero.find すると

00:04:21.800 --> 00:04:21.840 align:middle
スパイダーマンと

00:04:25.480 --> 00:04:27.280 align:middle
彼の能力を見ることができるはずです。

00:04:27.640 --> 00:04:29.960 align:middle
ここで気を付けてください。

00:04:30.360 --> 00:04:34.920 align:middle
彼の能力はここに全て示されています。

00:04:35.360 --> 00:04:37.480 align:middle
ウルヴァリンも同様です。

00:04:39.880 --> 00:04:43.640 align:middle
これができたら、Pharo で沢山のことができます。

00:04:43.800 --> 00:04:48.080 align:middle
詳しくは説明しませんが
スーパーヒーロー全員を選んでくると

00:04:48.240 --> 00:04:51.320 align:middle
スパイダーマンとウルヴァリンが得られます。

00:04:51.640 --> 00:04:54.960 align:middle
スパイダーマンを見つけるように
言うこともできます。

00:04:55.240 --> 00:05:01.160 align:middle
レベルが epic (最高) のスーパーヒーロー
全員を見つけてくるように言うこともできます。

00:05:02.080 --> 00:05:04.720 align:middle
すると 2 人のスーパーヒーローが得られます。

00:05:06.560 --> 00:05:09.280 align:middle
違う表現もできます。

00:05:09.440 --> 00:05:12.720 align:middle
実際、Mongo データベースは

00:05:13.040 --> 00:05:16.160 align:middle
JSON を扱うことができます。
つまり JSON を実行中に作って

00:05:16.440 --> 00:05:18.800 align:middle
保管したり
JSON 形式での問い合わせができます。

00:05:19.080 --> 00:05:21.600 align:middle
どのスーパーヒーローが
スパイダーマンという名前か

00:05:22.320 --> 00:05:24.560 align:middle
知りたいとしましょう。

00:05:24.760 --> 00:05:29.760 align:middle
JSON 形式で辞書として表現したので
1 つのエントリが得られます。

00:05:30.880 --> 00:05:33.440 align:middle
同様に selectMany: することもできます。

00:05:33.680 --> 00:05:38.000 align:middle
問い合わせを表現するのに最も簡単な
方法が何かによるわけですが

00:05:38.160 --> 00:05:40.640 align:middle
それは今の所は大事ではありません。

00:05:40.960 --> 00:05:43.400 align:middle
もっと高度な問い合わせもできます。

00:05:43.680 --> 00:05:46.280 align:middle
ヒーローを全員選んだり

00:05:46.920 --> 00:05:51.280 align:middle
あるいは 最高レベルのスーパーヒーローを
複数選ぶことができます。

00:05:51.440 --> 00:05:54.480 align:middle
名前で昇順に並べることができます。

00:05:54.640 --> 00:05:58.400 align:middle
リミットを 10 に設定した 0 ページ目から
開始することもできます。

00:05:58.560 --> 00:06:01.880 align:middle
するとデータベースから区画ごとに
取り出すことができます。

00:06:03.120 --> 00:06:05.760 align:middle
これらのことをしたい時には
ドキュメンテーションを読んでください。

00:06:06.360 --> 00:06:10.280 align:middle
他の操作もあります。
例えば、スーパーヒーローの数を数えるなど。

00:06:10.680 --> 00:06:14.160 align:middle
ある特定の性質を持つものだけを数えることができます。

00:06:14.440 --> 00:06:18.240 align:middle
削除することもできます。
全て削除したら、データベースが空になります。

00:06:18.560 --> 00:06:20.360 align:middle
このコマンドには気を付けてください。

00:06:20.520 --> 00:06:23.680 align:middle
ここで、1項目選択して
それを削除することができます。

00:06:24.520 --> 00:06:26.960 align:middle
このヒーローはデータベースから削除されます。

00:06:28.360 --> 00:06:31.000 align:middle
これらの操作をすることができます。

00:06:31.880 --> 00:06:35.600 align:middle
さて、MongoDB を使っていると
出てくる疑問があります。

00:06:35.760 --> 00:06:39.840 align:middle
Mongo ではベースルートとは何でしょう？

00:06:40.280 --> 00:06:42.760 align:middle
クラスはいつルートと定義されるのでしょう？

00:06:43.080 --> 00:06:46.640 align:middle
答えは、問い合わせたいクラスが
ベースルートです。

00:06:46.800 --> 00:06:48.200 align:middle
それが第 1 のルールです。

00:06:48.320 --> 00:06:51.440 align:middle
あるクラスをルートと定義するのは

00:06:51.600 --> 00:06:55.600 align:middle
そのクラスの全てのオブジェクトに
アクセスしたいからです。

00:06:55.880 --> 00:06:58.880 align:middle
別の理由としては
ルート間でオブジェクトを共有したい

00:06:59.200 --> 00:07:02.800 align:middle
という場合です。

00:07:03.640 --> 00:07:06.800 align:middle
Power を共有したい

00:07:07.240 --> 00:07:10.440 align:middle
ヒーロー間で能力を共有できることを
明確にしたい場合には

00:07:11.000 --> 00:07:15.160 align:middle
Power (能力) をルートとして定義します。

00:07:15.560 --> 00:07:16.760 align:middle
これを見てください。

00:07:17.560 --> 00:07:21.560 align:middle
この例では、Hero はルートです。

00:07:21.720 --> 00:07:24.240 align:middle
そして Power もルートです。

00:07:24.520 --> 00:07:28.520 align:middle
Voyage では、どんなクラスもルートとして
宣言することができます。

00:07:29.120 --> 00:07:31.160 align:middle
やり方はこうです。

00:07:32.280 --> 00:07:37.040 align:middle
Power クラスは isVoyageRoot となっています。

00:07:37.880 --> 00:07:42.040 align:middle
さて、Fly（飛行）という能力を作って

00:07:42.400 --> 00:07:44.960 align:middle
保存します。これでデータベースに格納されます。

00:07:45.920 --> 00:07:47.840 align:middle
強靭（Super strength）も同じです。

00:07:48.000 --> 00:07:52.280 align:middle
ここで Voyage に飛行能力を取り出すように

00:07:52.680 --> 00:07:55.520 align:middle
問い合わせることができます。

00:07:55.760 --> 00:08:00.160 align:middle
また、超人的な強靭さの能力も
取り出したい。

00:08:00.920 --> 00:08:03.240 align:middle
そしてここで、スーパーマンを作ります。

00:08:03.640 --> 00:08:05.080 align:middle
Voyage に伝えている意味は

00:08:06.840 --> 00:08:11.120 align:middle
ここに 2 つの能力があって、（このヒーローは）
システムに1つしかないものだから、それを保存する。

00:08:11.400 --> 00:08:15.280 align:middle
基本的なスキーマが変更されるたびに

00:08:15.480 --> 00:08:18.720 align:middle
データベースをリセットして

00:08:18.880 --> 00:08:22.240 align:middle
ちゃんと動くようにします。

00:08:23.600 --> 00:08:26.880 align:middle
ここでどうなっているかを見せます。

00:08:27.320 --> 00:08:30.520 align:middle
スーパーマンの能力は
前と違う形で表現されています。

00:08:31.360 --> 00:08:35.640 align:middle
能力はヒーローの中に埋め込まれていません。
能力への参照になっています。

00:08:36.640 --> 00:08:41.440 align:middle
つまり、飛行能力を持つ他のヒーローがいる
ということです。

00:08:42.160 --> 00:08:46.640 align:middle
2 つの Power のインスタンスがあるのではなく
共有されています。

00:08:47.440 --> 00:08:51.920 align:middle
つまり、ドメインによって、また
それをどうモデル化するかによって

00:08:52.280 --> 00:08:54.320 align:middle
ルートの定義は異なってきます。

00:08:54.480 --> 00:08:57.440 align:middle
この単純な例で考え方を理解してください。

00:08:57.720 --> 00:09:01.240 align:middle
実際、繰り返しますが
ドメインルートを定義するのは

00:09:01.600 --> 00:09:07.040 align:middle
それに対して問い合わせをしたり
オブジェクトを共有する場合です。

00:09:09.560 --> 00:09:13.880 align:middle
Voyage では関連は

00:09:14.320 --> 00:09:17.360 align:middle
関係データベースでの外部キーと
同じように表現されています。

00:09:17.640 --> 00:09:21.640 align:middle
Voyage はルートオブジェクトの循環参照を
自動的に扱うことができます。

00:09:21.840 --> 00:09:26.440 align:middle
しかし気を付けてください。
Voyage は埋め込まれたオブジェクト間の

00:09:26.880 --> 00:09:29.600 align:middle
循環参照はサポートしません。

00:09:31.240 --> 00:09:35.800 align:middle
実験してみてください。
ルートであれば安全です。

00:09:36.320 --> 00:09:40.600 align:middle
このコースでは、Mongo データベースに
オブジェクトを格納することが

00:09:41.040 --> 00:09:43.160 align:middle
とても簡単だということをお見せしました。

00:09:43.680 --> 00:09:48.120 align:middle
もっと知りたい場合には
Enterprise Pharo: a Web Perspective

00:09:48.280 --> 00:09:50.200 align:middle
を読んでください。
この MOOC の資料に入っています。

00:09:50.600 --> 00:09:55.680 align:middle
スーパーヒーローデータベースを構築する
ちょっとしたチュートリアルを参照できます。

00:09:56.840 --> 00:09:58.200 align:middle
それで全て学ぶことができます。

