レンタルサーバー

 予定通り、さくらのレンタルサーバーだと簡単にgnu-Smalltalk環境を構築できた。先ず、sshでログインして、

% mkdir src
% cd src
% wget -c ftp://ftp.gnu.org/gnu/smalltalk/smalltalk-2.3.6.tar.gz
# 現在最新の安定版は2.3.6
% tar zxvf smalltalk-2.3.6.tar.gz
% cd smalltalk-2.3.6
% ./configure --prefix=/home/ユーザー名
% make
% make install
% make clean
% cd
% cat ~/.cshrc
.
.
.
set path = (/sbin /bin /usr/sbin /usr/bin \
/usr/games /usr/local/sbin /usr/local/bin \
/usr/X11R6/bin $HOME/bin)
.
.
%

 最後に $HOME/bin がpathに追加されているか確認。
 CGIのテストも問題無かったので、早速ホームページを といきたい所だけど、肝心のプログラムはほとんど完成していないTT

CGI

 レンタルサーバーを借りてgnuSmalltalkでホームページを作ってみたい。
 gnu-Smalltalkをインストールすると、独自のWikiサーバーがおまけで付いてくるけど、今回はレンタルサーバーなのでそれを利用するのは難しそうだ。なので、やはりCGIという事になる。色々調べてみると、さくらのレンタルサーバーならsshでログインしてgnu-Smalltalk環境を構築してCGI出来そうだ(未確認)。
 では、早速サーバーを借りようか とその前に、gnu-SmalltalkCGIってどうやんだろ?どうやって環境変数にアクセスすんだろ? 基本的な事をまったく知らなかったのでちょっと調べてみた所、どうやら、 Smalltalk getenv: 'HOME' みたいな感じで環境変数にアクセス出来るらしい。では、早速ローカル内でテスト。

#!/usr/bin/env gst

| environ |
environ := #(#SERVER_SOFTWARE #SERVER_NAME #GATEWAY_INTERFACE
    #SERVER_PORT #PATH_INFO #PATH_TRANSLATED #SCRIPT_NAME
    #SCRIPT_FILENAME #QUERY_STRING #REMOTE_ADDR #REMOTE_USER
    #REMOTE_IDENT #CONTENT_TYPE #HTTP_ACCEPT #HTTP_USER_AGENT
    #HTTP_REFERER #SERVER_PROTCOL #REQUEST_METHOD #CONTENT_LENGTH
    #AUTH_TYPE #HTTP_COOKIE #TZ).

stdout nextPutAll: 'Content-Type: text/plain';nl;nl.
environ do:[:env |
    stdout nextPutAll: (env, ' -> ', (Smalltalk getenv: env));nl
].
!

うん。問題無く表示できた。次はレンタルサーバーにgnu-Smalltalk環境の構築だ。

メタ

 「"Class"がインスタンスを分類し、"Metaclass"がクラスを分類する」とはどうゆう事だろうと、その裏を取るべく、色々いぢくり回しているうちに(何度もSqueakをフリーズさせながらw)やっとSmalltalk/Squeakメタモデルの基本的な部分が解かったような気がする(自信は無い。が、さらにいぢくり回せは自信が付くかも)。
 最初、何故"Class"は自分自身の中で定義されているインスタンスメソッドを Class method って呼び出せるんだろうと不思議でならなかったけど、Objectのメタクラス(と言うか、全てのメタクラス)は"Class"を継承しちゃってるってのがミソなんすねぇ。素敵だ。
 メタモデルをいぢってる参考になるようなコードはないかといつもの様にGoogle先生に聞こうかと思ったけど、そういえば以前そうゆうコードが載っているページを見付けてブックマークしたような記憶があったので、ブックマークを検索してみたら、やっぱりあった^^。
Happy Squeaking!! -オブジェクト指向再入門- [第四回:メタ機能との出会い]
この連載の中でメタモデルをいぢってSmalltalkにInterface概念を追加しちゃってる。面白い。早速勉強だ。

朝だ・・・

 もう朝になってしまった。膨大なクラスライブラリの中を探検しながら面白そうなメソッドを見付けては小さなコードを書いて試してみる。そんな事を繰り返してると時間が立つのも忘れてしまう。明日(もう今日だ)が仕事休みで良かった ーー;。
 真のオブジェクト指向を学ぶにはSmalltalkは最適だと、どっかの記事で読んだ覚えがあるが、確かにそう思う。だって、何もかもがオブジェクト、徹底的にオブジェクトだもの、いやがおうにもオブジェクトワールドに引きずり込まれていくw 「オブジェクト指向」の定義にもいろいろあるんだろうけど、C++みたいな世界よりはSmalltalkな世界が自分は好きなだぁ、*1と最近何かに目覚めつつある自分自身にワクワクしてる。このワクワク感は初めてUnixな世界に触れた時と似てる。最初は凄くしんどかったけど、引きずり込まれていくうちにだんだん楽しくなってきて、腹の底からワクワクが湧いてくる感じ。今でも自宅ではUnixを使い続けていて、今だに楽しい。Smalltalk/Squeakとも長い付き合いになると良いなぁ。

*1:C++が嫌いと言うわけではないですよ。

梅澤さん?

 今、おやっと思ったのだけれど、昨日の記事でコメントを頂いた「umejava」さんって、もしかして、自由自在Squeakプログラミングの著者 梅澤真史さん?

 確信を得るべく、いろいろ検索してみたりしたら、やはりそうかもしれない。現在愛用している本の著者からコメントを頂けるとは、うれしい限りです。しかも、「umejavaさんのブログ」FileManという素敵なものが有るということを初めて知り、さらにラッキーです。そして、SqueakSourceJというサイトが有る事も初めて知った。
 PythonRubyなどと比べるとマイナーなイメージをSmalltalk/Squeakに対して持っていたのですが、ここ最近で自分の中でずいぶんイメージが変わった。コミュニティーはすごく活発だし、メジャーで楽しげなイメージだ。

ワークスペース変数

 昨日の記事で書き足りない部分があったので書き足し。
 勿論、ワークスペースだってSqueakの一部だもの、スペルチェックをしてタイプミスを教えてくれたりするのですが、変数名に限ってはチェックが効かないらしいのです。これはやっかいです。id:sumim:20061126:p1の記事にも書かれている通り、“完全な悪”とまでおっしゃってます。id:abee2さんから「ワークスペース変数は百害あって一理なしと思います。」とのコメントも頂きました。
 そもそも自分、ワークスペース変数っていうか、ワークスペースについてよく知らないな という事に気付きまして、その件についてGoogle先生に聞いてみたら、とりあえずSqueak-ja メーリングリストの保存書庫ページに案内された。以下、保存書庫よりちょっとだけ引用させていただきます。

Workspace のインスタンス変数というのは、おそらくクラスWorkspace に定義された bindings のことだと思います。これは『ワークスペース変数の仕組み』を実現しているものです。このインスタンス変数には連想配列のオブジェクト(Dictionary)がぶら下がってます。
ワークスペースで式を実行すると、式の中で出現したワークスペース変数名をキー(添字)にして、そのワークスペース変数に代入(バインド)されたオブジェクトが、この連想配列に登録されていきます。

キー 値
#a星2142 -> {星のオブジェクト}
#a四角形233 -> {四角形のオブジェクト}
#a楕円1482 -> {楕円のオブジェクト}
...

という感じです。
次の実行時には、式の中の変数名でこの連想配列を辞書引きして、その連想値であるオブジェクトに置き換えてるということですね。こうすると変数として機能する見えるという仕掛けです。
また、bindings は Workspace のインスタンス変数なので、一枚一枚のワークスペース(Workspaceのインスタンス)ごとに別なオブジェクトになりますので、必然的にスコープはワークスペースごととなります。ですのでグローバル変数ほどスコープは広くはないです。

http://www.smalltalk.jp/pipermail/squeak-ja/2006-December/003269.html

 Dictionaryを使ってるんだぁ。確かに、System Browserで調べてみたら bindings := Dictionary new とかやってる箇所がある。けど、まだよくわかんない^^; もうちょっと調べてみよう。っていうか寝よう。

テキストファイルエディタを使う

 Squeakでちょっとしたコードなどを書く場合、Workspaceを使うのが普通らしい。自分もよく使います。が、ちょっとこまった事があります。Workspaceはタイプミスを無視しちゃいます。たとえば、以下のようなコード

|writer|
writer := [:toWrite | Transcript cr; show: toWrit].
writer value: 'Workspace'.

(ブロックの引数をタイプミス)こうゆうミスを平気で無視しちゃうし、Transcriptはというと、何事もないかのようにnilを表示します。これはどうにかならんのかな〜っとGoogle先生に聞いてみたら、Smalltalk/Squeak の“きまり文句”というページを教えてくれた。ありがとう。(このページはid:sumimさんが運営されているWikiらしいです。)このページの情報によると、タイプミスが多い人はテキストファイルエディタを使うと良いらしい。Workspaceで以下のようにすると、

(FileStream fileNamed: 'test.txt') edit

テキストファイルエディタが起動する。んで、こいつはタイプミスなコードをdoitしようとすると、ちゃんと教えてくれる。

ん〜、お利口なやつ。好きになりそうだ。

今日の参考サイト
Wiki っぽい場(あるいは 疑似脳内ネットワーク)