tODE つまみ食い



むしゃくしゃして勢いで書いた。
公開はしてる。

## はじめに
[第57回Smalltalk勉強会](http://www.smalltalk-users.jp/Home/gao-zhi/dai57kaismalltalkbenkyoukai)で取り上げた究極のオブジェクト永続化Webフレームワーク
 GLASS (GemStone, Linux, Apache, Seaside, Smalltalk)
の新しい開発環境 tODE をちょこっと齧ってみました。

tODEは従来のGemToolsに代わるGemStone/Sのための開発環境で、以下の特徴があります。

* Ultra Thin Client 軽量でクラウドなどWAN環境でも軽快に利用できる
* Emacs にインスパイアされたタイル式ウィンドウ
* ウィンドウはリストかテキストのみでボタンや複雑なウィジェットは一切ナシ
* POSIX スタイルのコマンドとファイルシステムメタファーな CLI

そして、主に以下の機能を提供します。

* サーバープロセス管理やバックアップ管理
* Monticello, Metacello, git と連動したパッケージ構成管理
* システムブラウザ・デバッガなどのSmalltalkらしいプログラミング環境

## いきなりインストール
最新のGLASSはGLASSではなくて、[GemStone Solutions for Small Business](http://gemtalksystems.com/small-business/gsdevkit/)として、[これまでのサイト](http://seaside.gemtalksystems.com/downloads.html)から GitHub で 
GemStone/S のためのオープンソースな開発環境 [GsDevKit](https://github.com/GsDevKit/gsDevKitHome#open-source-development-kit-for-gemstones-64-bit-)
 になりました。tODE を含めてGemStoneサーバー環境もひっくるめてインストールするためのスクリプトなどがここで提供されています。インストール手順としては、
[Development Kit Server Installation](https://github.com/GsDevKit/gsDevKitHome#development-kit-server-installation)
 で書かれているように、gsDevKitHome プロジェクトを clone して環境変数を設定した後、スクリプト一発です（サーバーはLinux と Mac だけなので、Windowsの方々はVMでチャレンジを）。
なお、2014/12時点での最新版の GemStone/S は　3.2.3 ですん。

``` bash:
$ installServer devKit 3.2.3
```

インストールが完了すると自動的に tODE がインストールされた Pharo が起動します。

ワールドメニューに追加された "tODE" のサブメニューから、"tODE Shell" を選ぶことで Object Shell が開きます。

![tode-menu.png](https://qiita-image-store.s3.amazonaws.com/0/13174/10ec7c4e-ca3d-f1b9-a862-c527cdb0b606.png)

こっからは tODE のコマンドラインの世界であります。
![tode-object-shell.png](https://qiita-image-store.s3.amazonaws.com/0/13174/23339aed-5b22-778d-b6fe-9d3840bd042c.png)

## man --all
tODE の特徴の一つはCLIですが、コマンドが分からない場合は、man --all や man touch などとすることで機能と引数の指定が分かります。
ただし、まだ全てのサブコマンドがman通りに動いてくれるというわけではなさそうです(未だに find class クラス名が巧く出来ませんでした。)
![tode-man.png](https://qiita-image-store.s3.amazonaws.com/0/13174/2a5efa9c-bba6-47a4-b4e3-d3a87d7b4d20.png)

### ws
ws コマンドを使うとワークスペースが開きますが、このワークスペースは、GemStone と通信して評価結果を受け取るワークスペースです。試しに文字列のクラスを調べてみましょう。

``` smalltalk:
'日本語' class
```

![tode-ws.png](https://qiita-image-store.s3.amazonaws.com/0/13174/d7feceb5-ef9c-a98d-b821-b0249b9b8198.png)

左のワークスペースはGemStoneでの結果(DoubleByteStringが返って来てる)で、右は、Pharo のもの(WideString)で、クラスが異なっていることが分かるかと思います。
ここで DoubleByteString が選択された状態でショートカットキー (CMD-b)もしくはコンテクストメニューのbrowse it を使うことでシステムブラウザを開くことができます。

### システムブラウザ
システムブラウザは、一つのウィンドウではなくて、カテゴリやクラス、メソッドごとに別のウィンドウが用意されていて、Emacsでウィンドウ分割したように開きます。機能的には普通にシステムブラウザですし、デバッガも同様に開きます。

![tode-browser.png](https://qiita-image-store.s3.amazonaws.com/0/13174/9dbb421c-20d5-2250-b985-4f235dbb5381.png)

### ls 
Object Shell で ls とコマンドを打つとファイルシステムのようなモノが見えます。

``` bash:
$ cd ..
$ cd examples
$ ls
```

この内、st を実行しますと7と返ってきます。なので、中身をcatすると3+4となってることが分かります。

![tode-cat.png](https://qiita-image-store.s3.amazonaws.com/0/13174/302e9a32-666d-1eb5-3a26-2bb174808d2a.png)

このように、tODEではファイルシステムをメタファーとして、Smalltalkのコード断片やデータといったものを管理しようとしているらしいです。
まさしく文字通りのオブジェクト指向ファイルシステムとでも言いましょうか。

## プロジェクト構成管理そして突然の（ry
プロジェクト管理は、Smalltalk で馴染みの Monticello や Metacello だけでなく、git とも連動するようになってます。
tODEをインストールした初期状態では、Seasideなども入ってないので、ロードする必要があるのですが……

ここでひっかかってしまいました。

パッケージのロードまでは完了するのですが、Seasideを起動するためのスクリプトが足りませんと起こられてしまい、遂にブレークスルー出来ませんでした〜〜〜。

![tode-websever.png](https://qiita-image-store.s3.amazonaws.com/0/13174/a45b74e8-1ede-767b-669f-8f43a101bd17.png)


すみません。

## おわりに
Seasideには引き続きチャレンジしたいですが、それ以外に GemStone をいじるという意味では、この tODE は結構楽しめると思います。
Seaside以外の Webフレームワークの移植などにチャレンジしてみてもいいのかもしれません。

今回は尻切れトンボになってしまいましたが、できれば Smalltalk 勉強会などの機会で、じっくり GLASS のアップデート情報も交えてレポートしたいと思います。

もしくはどなたかよろしくお願いします。


## 参考文献
* [tODE: And Now For Something Completely Different](http://esug.org/data/ESUG2013/3-Wed/04-tODE_ESUG_2013.pdf)
* [... a long and winding tODE ](http://esug.org/data/ESUG2014/1%20monday/1130-1200-tODE/aLongAndWindingTode_ESUG2014%2007.pdf)
* [Smalltalk勉強会](http://www.smalltalk-users.jp/Home/gao-zhi/dai57kaismalltalkbenkyoukai)

## GitHubサイト
* [dalehenrich/tode](https://github.com/dalehenrich/tode)
* [GsDevKit/gsDevKitHome](https://github.com/GsDevKit/gsDevKitHome)