WEBVTT

00:00:01.150 --> 00:00:03.440 align:middle
このビデオでは Pharo  での

00:00:03.607 --> 00:00:06.480 align:middle
独特なパッケージングを
お見せしたいと思います。

00:00:06.647 --> 00:00:08.640 align:middle
失われた技術にしないために。

00:00:09.000 --> 00:00:11.400 align:middle
Pharo をインストールするには
通常は表示されたリンクをクリックします。

00:00:11.950 --> 00:00:14.370 align:middle
現時点での Pharo のリリースは
バージョン 4 ですが

00:00:14.537 --> 00:00:17.280 align:middle
（訳注：2018年現在の最新リリースは
　バージョン 6.1 です）

00:00:17.447 --> 00:00:21.060 align:middle
バージョン 5 でも全く同じです。

00:00:21.410 --> 00:00:24.370 align:middle
Mac OSX 版をダウンロードすると
この ZIP ファイルが得られます。

00:00:24.750 --> 00:00:29.090 align:middle
これを unzip すると
Pharo4.app が得られます。

00:00:29.480 --> 00:00:32.460 align:middle
Pharo4.app を立ち上げると
Pharo を使うことができます。

00:00:32.627 --> 00:00:36.410 align:middle
「Hello」と書いたとして

00:00:42.690 --> 00:00:47.380 align:middle
セーブすると
環境が保存されます。

00:00:48.730 --> 00:00:50.430 align:middle
Save をクリックします。

00:00:51.490 --> 00:00:55.920 align:middle
Quit now をクリックして
また立ち上げると

00:00:56.360 --> 00:01:00.100 align:middle
さきほどと全く同じ「Hello」があります。
Pharo のイメージを保存するということは

00:01:00.267 --> 00:01:03.810 align:middle
バイトコードやコンパイル済みメソッドを
含む全てのオブジェクトを

00:01:04.000 --> 00:01:07.780 align:middle
メモリーごとコピーするということ
なのです。

00:01:07.947 --> 00:01:11.920 align:middle
このアプリケーションには

00:01:13.340 --> 00:01:14.400 align:middle
何が入っているのでしょう？

00:01:14.567 --> 00:01:16.750 align:middle
Mac では、中身を見ることができます。

00:01:16.930 --> 00:01:20.620 align:middle
Show Content（パッケージの中身を表示）
をクリックすると

00:01:20.930 --> 00:01:24.380 align:middle
Pharo の仮想機械やリソースが
見つかります。

00:01:24.810 --> 00:01:27.530 align:middle
そしてここに、チェンジファイルと

00:01:31.280 --> 00:01:31.913 align:middle
イメージファイルがあります。

00:01:32.400 --> 00:01:35.880 align:middle
イメージファイルは

00:01:36.047 --> 00:01:39.840 align:middle
メモリ上のオブジェクト全てを
格納したもので

00:01:40.070 --> 00:01:42.760 align:middle
チェンジファイルは、実行された
インクリメンタルな変更を持っています。

00:01:42.927 --> 00:01:46.680 align:middle
イメージファイルを

00:01:48.580 --> 00:01:49.800 align:middle
ダブルクリックすると

00:01:55.800 --> 00:02:00.000 align:middle
OS にもよりますが通常は
インストール済みの Pharo の仮想機械が

00:02:00.470 --> 00:02:03.960 align:middle
起動して

00:02:04.127 --> 00:02:05.900 align:middle
そのイメージファイルを立ち上げます。

00:02:07.020 --> 00:02:08.450 align:middle
イメージファイルは何をするのでしょうか？

00:02:08.617 --> 00:02:10.000 align:middle
クラスを定義する時について
考えてみましょう。

00:02:10.157 --> 00:02:12.050 align:middle
パッケージを定義します。

00:02:18.100 --> 00:02:18.733 align:middle
ATest パッケージを追加します。

00:02:18.900 --> 00:02:20.060 align:middle
このパッケージに

00:02:23.470 --> 00:02:24.300 align:middle
MyStrangeClass を定義します。

00:02:28.600 --> 00:02:33.170 align:middle
そして foooo を

00:02:33.430 --> 00:02:34.063 align:middle
42 を返すよう定義します。

00:02:38.650 --> 00:02:42.750 align:middle
このイメージを別の名前で保存します。

00:02:42.917 --> 00:02:44.270 align:middle
名前を

00:02:44.437 --> 00:02:45.070 align:middle
Pharo40Stef とします。

00:02:52.060 --> 00:02:53.930 align:middle
さて、どうなったでしょう？

00:02:54.097 --> 00:02:58.580 align:middle
一旦終了します。
イメージとチェンジのペアが

00:02:58.747 --> 00:03:01.570 align:middle
新しくできました。
このチェンジファイルは

00:03:01.737 --> 00:03:04.620 align:middle
人間が読めるようなものではないので
開かないでおきます。

00:03:04.787 --> 00:03:07.110 align:middle
中には先ほどのメソッドのコードなどが
入っています。

00:03:07.277 --> 00:03:11.840 align:middle
Pharo4 をもう一度立ち上げると

00:03:12.007 --> 00:03:16.300 align:middle
仮想機械が起動して

00:03:17.940 --> 00:03:22.110 align:middle
また同じスナップショットが立ち上がります。
昔行われた

00:03:22.277 --> 00:03:27.200 align:middle
システムコピーで作られた

00:03:27.440 --> 00:03:28.073 align:middle
スナップショットです。

00:03:28.240 --> 00:03:32.790 align:middle
さて、PharoStef イメージを実行すると

00:03:32.957 --> 00:03:33.590 align:middle
どうなるでしょう？

00:03:33.757 --> 00:03:37.180 align:middle
システムには
先ほど定義したクラスがあります。

00:03:39.740 --> 00:03:42.920 align:middle
Pharo 4 アプリケーションは
いわゆる Mac bundle で

00:03:43.087 --> 00:03:47.460 align:middle
Pharo の仮想機械やイメージやチェンジを
抱えています。

00:03:47.627 --> 00:03:50.500 align:middle
その上でダブルクリックすると
選択の余地なく

00:03:50.667 --> 00:03:52.950 align:middle
常に Pharo イメージが選ばれます。
スクリプトで

00:03:53.330 --> 00:03:55.660 align:middle
そのように定義されています。

00:03:55.827 --> 00:03:59.430 align:middle
Pharo の使い始めでは便利なのですが

00:03:59.597 --> 00:04:02.600 align:middle
一般にはこういう使い方はしません。

00:04:02.767 --> 00:04:05.840 align:middle
一般に、コマンドラインで実行するか

00:04:06.007 --> 00:04:09.200 align:middle
例えば

00:04:10.290 --> 00:04:14.470 align:middle
pharo-ui MyPharoImage.image

00:04:14.637 --> 00:04:19.250 align:middle
のようにすると

00:04:19.417 --> 00:04:21.710 align:middle
立ち上がります。あるいは
コマンドラインから立ち上げる時に

00:04:21.877 --> 00:04:24.010 align:middle
UI が必要なければ
UI なしで立ち上げることもできます。

00:04:24.520 --> 00:04:26.450 align:middle
つまり Pharo は
システムのどこかにインストールされた

00:04:26.617 --> 00:04:30.130 align:middle
UNIX アプリケーションともいえます。

00:04:31.070 --> 00:04:34.400 align:middle
さて、このページには

00:04:36.150 --> 00:04:38.930 align:middle
Pharo のイメージとチェンジのペアと

00:04:39.097 --> 00:04:40.940 align:middle
仮想機械のダウンロードがあります。

00:04:41.110 --> 00:04:43.560 align:middle
仮想機械をダウンロードして

00:04:43.727 --> 00:04:48.220 align:middle
それからイメージとチェンジのペアと
さらにソースもダウンロードしてみます。

00:04:48.690 --> 00:04:50.830 align:middle
これから、それら 3 つが何か

00:04:51.000 --> 00:04:54.460 align:middle
どうやって 3 つを組み合わせて
使うのかを説明します。

00:05:02.630 --> 00:05:05.760 align:middle
Pharo のイメージとチェンジのペアを
unzip すると

00:05:06.570 --> 00:05:09.240 align:middle
これが得られます。

00:05:09.710 --> 00:05:12.260 align:middle
unzip すると

00:05:12.427 --> 00:05:13.680 align:middle
イメージが得られます。

00:05:13.870 --> 00:05:15.950 align:middle
モードを

00:05:19.140 --> 00:05:20.070 align:middle
見やすいように切り替えて

00:05:21.290 --> 00:05:24.010 align:middle
さて、このイメージファイルは

00:05:24.177 --> 00:05:27.660 align:middle
仮想化されたシステムである Pharo の

00:05:27.827 --> 00:05:32.630 align:middle
特定の状態のスナップショットですが

00:05:32.797 --> 00:05:36.280 align:middle
こうして実行することができます。

00:05:38.140 --> 00:05:42.120 align:middle
何かメッセージが表示されましたが

00:05:44.700 --> 00:05:49.270 align:middle
システムはちゃんと動いています。

00:05:49.890 --> 00:05:50.770 align:middle
実行することができています。

00:05:50.937 --> 00:05:53.330 align:middle
これで今まで通りのことが
なんでも実行できます。

00:05:53.497 --> 00:05:58.360 align:middle
MyPackage を作って

00:05:58.770 --> 00:05:59.900 align:middle
MyStrangeClass を定義できます。

00:06:00.740 --> 00:06:02.220 align:middle
いつも通りです。

00:06:04.180 --> 00:06:07.580 align:middle
メソッドを定義します。

00:06:09.010 --> 00:06:12.520 align:middle
fooo ^ 42、と。
私の名前を訊いてきます。

00:06:14.460 --> 00:06:17.510 align:middle
いつもと同じく

00:06:19.370 --> 00:06:23.050 align:middle
MyStrangeClass new fooo
とすると、42 が得られます。

00:06:23.420 --> 00:06:24.600 align:middle
バッチリです。保存できます。

00:06:25.620 --> 00:06:27.360 align:middle
別名で保存します。

00:06:27.527 --> 00:06:32.240 align:middle
PharoStrange という名前にします。

00:06:32.407 --> 00:06:33.040 align:middle
OK。

00:06:39.410 --> 00:06:40.200 align:middle
このメッセージは

00:06:40.367 --> 00:06:44.530 align:middle
ソースファイルが見つからない
と言っています。

00:06:45.310 --> 00:06:49.200 align:middle
どういうことでしょう？

00:06:50.240 --> 00:06:53.730 align:middle
ブラウザを開いて
例えば

00:06:53.897 --> 00:06:58.670 align:middle
AST のコードを見てみましょう。
上のほうにあります。

00:06:58.837 --> 00:07:03.000 align:middle
システムはコメントを

00:07:03.167 --> 00:07:04.000 align:middle
見つけられないでいます。

00:07:08.120 --> 00:07:09.180 align:middle
逆コンパイルしているのです。

00:07:09.750 --> 00:07:11.730 align:middle
このあたりでは見分けがつきません。

00:07:11.897 --> 00:07:13.420 align:middle
メソッドが単純すぎるからです。
しかしこれらは逆コンパイルされています。

00:07:13.587 --> 00:07:15.000 align:middle
もう少し具体的に見ていきます。

00:07:15.147 --> 00:07:19.820 align:middle
これはバイトコードから
逆コンパイルされたコードで

00:07:20.000 --> 00:07:21.620 align:middle
引数であることは
ちゃんとわかっているのですが

00:07:22.040 --> 00:07:23.440 align:middle
ソースコードは失われています。

00:07:24.050 --> 00:07:28.870 align:middle
一般に、Pharo 4 を実装している
システムソースは

00:07:29.037 --> 00:07:33.530 align:middle
PharoV40.sources というファイルに
格納されています。

00:07:33.697 --> 00:07:36.290 align:middle
ここにあります。

00:07:36.457 --> 00:07:38.920 align:middle
一般に、Pharo 4 のソースは

00:07:39.087 --> 00:07:41.420 align:middle
システム中に 1 回だけ
インストールされます。

00:07:41.587 --> 00:07:44.040 align:middle
このファイルはリードオンリーで
Pharo のアプリケーションはみな

00:07:44.860 --> 00:07:46.030 align:middle
同じファイルを使うことができます。

00:07:46.210 --> 00:07:47.180 align:middle
ここにあります。unzip すると

00:07:47.347 --> 00:07:50.670 align:middle
PharoV40.sources が得られます。

00:07:51.270 --> 00:07:52.840 align:middle
保存しないで終了して

00:07:56.690 --> 00:07:59.060 align:middle
アプリケーションを再起動すると

00:07:59.227 --> 00:08:02.280 align:middle
前と全く同じになります。

00:08:02.470 --> 00:08:05.190 align:middle
スナップショットに

00:08:05.357 --> 00:08:10.160 align:middle
別名をつけて保存した

00:08:10.420 --> 00:08:11.620 align:middle
イメージとチェンジがあります。

00:08:12.520 --> 00:08:16.650 align:middle
ここで古いイメージを立ち上げると

00:08:17.670 --> 00:08:20.780 align:middle
エラーが出ません。

00:08:20.947 --> 00:08:24.710 align:middle
システムが最初のイメージで起動した時の
状態と対応付けて

00:08:24.880 --> 00:08:27.130 align:middle
コードを見つけるからです。

00:08:27.297 --> 00:08:28.640 align:middle
ここで 2 番目のイメージを使うと

00:08:34.500 --> 00:08:38.960 align:middle
AST-Core のクラスには

00:08:39.127 --> 00:08:41.830 align:middle
コメントがついています。

00:08:47.100 --> 00:08:51.000 align:middle
これらの引数は
ちゃんと人が付けた名前になっています。

00:08:51.830 --> 00:08:53.870 align:middle
このアーキテクチャでは

00:08:54.950 --> 00:08:57.230 align:middle
システムソースを格納した
ソースファイルと

00:08:57.397 --> 00:09:02.000 align:middle
仮想機械と
イメージとチェンジのペアがあります。

00:09:02.167 --> 00:09:04.610 align:middle
通常のコンパイラでは
一旦システムをコンパイルしたら

00:09:04.777 --> 00:09:08.330 align:middle
もうソースは必要ないのですが。

00:09:09.390 --> 00:09:12.180 align:middle
イメージはユーザー定義およびシステムの

00:09:12.347 --> 00:09:14.790 align:middle
全てのオブジェクトを格納しています。

00:09:14.957 --> 00:09:18.520 align:middle
チェンジファイルは実行したことの
差分を格納しています。

00:09:18.690 --> 00:09:22.430 align:middle
システムを保存するたびに

00:09:22.597 --> 00:09:25.260 align:middle
OS の仮想イメージを保存するのと
同じことです。

00:09:25.427 --> 00:09:26.730 align:middle
全く同じ原理です。

00:09:27.480 --> 00:09:31.910 align:middle
Pharo 4 アプリケーションの中には

00:09:33.200 --> 00:09:35.200 align:middle
これらのリソースが格納されています。

00:09:36.430 --> 00:09:40.730 align:middle
Pharo 4 のソース
イメージファイル

00:09:40.897 --> 00:09:43.130 align:middle
チェンジファイル
そしてどこか、ここに

00:09:43.297 --> 00:09:44.540 align:middle
仮想機械とプラグインがあります。

