vieweditattachhistoryswikistopchangessearchhelp

Squeak のとっかかり

Squeak は Mac や Win などファイルシステムに依存したコンピュータ環境とは違って、
すべての情報(データやプログラム)は個別にファイルに収められるのではなく、
それぞれがオブジェクトに内包され、そのままオブジェクト単位で扱われます。
オブジェクトは、システム動作中は「オブジェクトメモリ」と呼ばれる特殊なしくみを持つメモリに、
システムが動作していないとき、つまりオブジェクトメモリが存在しないときは「仮想イメージ」、
あるいは単に「イメージ」と呼ばれるファイルに、まとめて放り込まれています。

なので、Squeak 環境には、通常のコンピュータ環境に見られる多数のシステムファイル群は存在しません。
システムファイルがすることと似たような働きを持つオブジェクト群はありますが、
それらは個別のファイルではなく、他のオブジェクトと区別されることなく同じ仮想イメージに収められています。
したがって、Squeak 環境は比較的大きな(数メガ〜十数メガの)たったひとつの
仮想イメージファイル(拡張子は、.image )で配布されます。

オブジェクトメモリは、通常のコンピュータ環境における普通のメモリと、
そこに読み込むプログラムやデータをファイルとして保存しておくための場であるハードディスクなどとの
両方の性質をもった仮想デバイスです。つまり、ファイルならぬオブジェクトを保存しつつ、
必要なとき、それらの機能を発現できるしくみを持っています。
メモリに読み込むことなしにハードディスク上でファイルに収まったままのプログラムを実行してしまうような感覚ですね。

このオブジェクトメモリを(Squeak を動かすために使用している)OS が管理するメモリ空間に用意したり、
オブジェクトメモリにあらかじめ指定した仮想イメージの内容を読み込む作業をするのが、仮想マシン(通称、Squeak VM)です。
仮想マシンは、このほかに、自分専用のマシン語である「バイトコード」を実行したり、
(それと同義ですが)OS が管理する入出力デバイスを Squeak 環境がそのユーザーに提供できるよう拝借するための
橋渡し的、あるいは裏方的仕事をこなします。

なお、先のシステムファイル的オブジェクト群は、
他のオブジェクトと一緒に一気にオブジェクトメモリに読み込まれるので、
通常のコンピュータ環境に見られるような、随時ファイルをメモリに読み込んでゆく起動シークエンスのようなものは、
Squeak には存在しません。オブジェクトたちは仮想イメージに封じ込まれた時点の状態から働き始めるので、
起動というよりスリープ(あるいは休止状態=ハイバネーション)からの復活に似ています。

さて。ここまでから分かるように理屈では、仮想マシンと仮想イメージがあれば、Squeak 環境を動作させることは可能です。
実際には、この2つに加えていくつかのファイルが必要になりますが、そうしたファイルをひとまとめにして
プラットフォーム別に過去のバージョンにさかのぼってダウンロードできるように用意されたサーバーが、ftp://ftp.squeak.org/ です。

この記事を執筆している時点でのバージョンである3.6なら、“3.6”ディレクトリ内の、Win 用と Mac 用のそれぞれのディレクトリ内にあるファイル、具体的には、
をゲットしてそれぞれの環境で展開。得られたフォルダを「Squeak3.6」などと改名し、
WinならルートもしくはProgram Filesなど、Mac なら Applications に移動することでインストールは完了です。

フォルダ内の、.image ファイルを Squeak VM(Win なら .exe 、Mac なら .app )にドロップインすれば環境を起動できます。

環境を終了する方法はいくつかありますが、今は、
Win ならクローズボックスを、Mac なら File メニューから「Quit do not save」を選んでください。
Win では確認がでるので Yes を、Mac では無条件でそのまま終了します。
これは通常のコンピュータ環境における強制終了の操作にあたる、考えようによっては少々乱暴なものですが、
まだ環境内での作法を知らない段階なので、当座はこれでしのぐことにしてかまわないでしょう。


ここまでやってみてうまくいったら知らせてください。先を続けます。--sumim

分からないことがあれば、ささいなことでも遠慮無くどうぞ。理解や解釈の確認もどんどんしてください。--sumim

 ありがとうございます。さっそくリンクからダウンロードしてSmalltalkの世界にふれてみたいと思います。わくわく。  (今回はwindows版で)
 ところで、上記リンクのSqueakは英語版だと思うのですが、日本語化することは可能なのでしょうか、出来るようであればその方法を教えてください。よろしくお願いします。--hikaru

日本語化やその利用は、とりあえず Squeak 環境での作法や考え方に慣れてからの方がよろしかろうと思います。
今のところ、いちおう、このチュートリアルの最後で触れるつもりでいます。--sumim


ところで、いわゆる「表示フォントを大きく」するには、どうすればいいでしょうか?
画面のDotが妙に小さいNotePC(Libretto)を使ってるもんで、目が痛いんです(^^;

いや、フォントだけじゃなく表示物すべてが大きくなる、でもいいですが。
あと、これからnewされる字とかだけじゃなく、既に存在してる字とかも、大きくなって欲しいです。 --戯


ウィジェットに用いられているフォントは、
デスクトップメニュー → appearance... → system fonts... で
ポップアップするサブメニューより対応する項目から変えられます。
これらはメッセージ式の評価でもできます。たとえば、
| font |
font := StrikeFont fromUser.
#(System List Menu Flaps WindowTitle) do: [ :target |
	Preferences perform: ('set', target, 'FontTo:') asSymbol with: font ].
BalloonMorph setBalloonFontTo: font
のようなスクリプトを do it (alt-d) すれば、
(最初に選んだフォントに統一されてしまいますが)全設定を一気に済ませられます。
ただ、すでに存在するウィジェットの設定を変えることはできません。
(これを言うと負け惜しみですが、できなくはないと思うのですがたぶん面倒です)

入力済みのテキストについては、
キャレットを置いて alt-shift-k でそのテキストビュー内のデフォルトを変更できます。
また、一部を選択して alt-k でサイズを含めた変更も可能です。
サイズだけ変えるのでよければ、alt-a などで全文選択して、alt-1〜5 のいずれかをタイプします。
こちらも既存のもの全ての変更は勘弁してください(^_^;)。

メニュー項目を上下矢印キーもしくは項目の頭文字タイプで選択できる設定と、
モーフを削除するときにいちいちアニメーションしない設定もしておくのが
よろしかろうと思います。
Preferences setPreferencesFrom: #(
	(menuKeyboardControl true)
	(preserveTrash false))
これらも、
デスクトップメニュー → appearance... もしくは help... → preferences... で出てくる
UI を使っての設定も可能です。--sumim



default text font を変更後、すべての既存テキストに変更を適用できるようなスクリプトを組んでみました。
以下のスクリプトをワークスペースにコピペするなどした後、選択し do it (alt-d) してみてください。
| defaultStyle defaultIndex |
defaultStyle := TextStyle default.
defaultIndex := defaultStyle defaultFontIndex.
PluggableTextMorph allInstances
	do: [ :morph | 
		| aTextMorph aParagraph |
		aTextMorph := morph instVarNamed: 'textMorph'.
		aParagraph := aTextMorph paragraph.
		[aParagraph textStyle: defaultStyle.
		aParagraph text runs values do: [ :value |
			((value first isKindOf: TextFontChange) 
			and: [value first fontNumber < defaultIndex]) 
				ifTrue: [value first fontNumber: defaultIndex]].
		aParagraph composeAll.
		aTextMorph updateFromParagraph] ifError: []]
	displayingProgress: 'recomposing...'
ただサイズについては、default text font で指定したサイズより小さい設定のものを
無条件に default text font のスタイル設定時と同じサイズに変更しているだけなので、
いったんこのスクリプトを使用後、default text font のサイズを小さくして、
再びこのスクリプトを使用しても、大きくなったサイズは元には戻りませんので注意してください。--sumim




fontとかを思い切りデカくしました。

>すでに存在するウィジェットの設定を変えることはできません。

Workspace allInstances do:[ :obj |
(obj dependents at: 2 ) borderWidth: 10
].

なんてな野蛮なことが出来ましたー。わーい(^^;
dependents 配列の要素番号は、 ObjectExplorer (つまり Workspace allInstances explore. ) で眺めました。
なので超野蛮。

メニューの言い回しがメソッドとだいたい同じってのは、良いですね。
そこからアタリをつけて、あとはBrowserでクラス定義を眺めて、まあなんとなく。

あと、まともなことをやるときはともかく、こういう野蛮なことをやるときは、allInstancesって便利ですね(^^; --戯


>なんてな野蛮なことが出来ました
いや。しょっぱなとしては、なかなかイイ線いっているんではないでしょうか。

>メニューの言い回しがメソッドとだいたい同じ
Morphic GUI フレームワークでは、ウィジェットはすべてモーフで構成されていて、
モーフは、shift + alt-クリック(あるいは、alt-クリックの繰り返し)で選択できますので、
メニュー項目についても同じことができます。
こうして選択したメニュー項目(a MenuItemMorph)の灰ハローを shift-クリックしてインスペクトし、
target 、selector 、arguments をながめると項目選択時に誰にどんなメッセージを送るのかが分かります。
ただ、MVC GUI フレームワーク時代のハードコーディングされたメニュー(たとえば、テキストの色を
変える alt-6 とかで表示されるメニューなど)では残念ながらこの手は使えません。
そのメニューを表示するためのメソッド(たとえば alt-6 のメニューなら ParagraphEditor >> #changeEmphasis: )に
直接当たる必要があります。

メッセージセレクタやクラス名は選択して alt-b (browse it) で定義をブラウズできます。
この機能を使えるように、一時変数名は 不定冠詞 + クラス名 とする慣習があります…なんて話はすでにご存じですね。きっと。--sumim



fontをComicBoldの14(だったかな)にしたら、
「←」(でしたっけ?代入記号のアレね)が「_」みたいに見えてしまってショボーン。

>しょっぱなとしては

それこそRubyの類推で結構やれますね。C++やJavaとじゃかけ離れてるけど。

C++やJavaにもBlock(のような無名かつローカルな関数)が有ればいいのに。
これの有無で生産性(=記述の楽さ&読みやすさ)が相当違うんですよね…

あと「.」を書くタイミング(に悩むの)が、Pascalの「;」(に悩むの)と似てますね。
Cの「;」みたいにひたすら書けばいいというものでもないという意味で。
ブロック終了の「]」の直前(つまりブロック内の記述の終端)に
「.」が有っても無くてもいいのは、意外でした。

>モーフは、shift + alt-クリック(あるいは、alt-クリックの繰り返し)で選択できますので、

おお!素晴らしい!
こーゆー「ユーザがボンネットを開ける」ことが出来るってのがインスペクタ動的で均質なシステムって奴の真骨頂ですな。

余談ですがWidgetのように親子関係が色々な奴を選択する手段として、
このクリックのしかたは(手が慣れれば)なかなか良いかも知れません。
いつもウンザリするのがMSWordとかの文書での
複合部品(Text箱とか絵とか表とかの)の「中」の特定のWidget(?)の掴みにくさ。
Wordのボンネットを開けてこういう機能を追加できんかな?(藁
Delphiなら選択「される」Widget(Component)のクラスのほうを修正すれば出来る…かな…

>灰ハロー

灰色ってドレだ?と焦ってしまいました(^^;



#液晶だと「灰」みたいな半端な色は見分けにくいし、ハロって元々小さいんで地味な色は良く判らん。
#八つ当たり:「白」じゃんか?とか思ったり。

インスペクタによると灰色は「Debug」って奴のことのようですね。
あ。折角だから灰ハローのページ作りたいんですが、「ハロ」と「ハロー」のどっちが良いんでしょうか? -戯


>「_」みたいに見えてしまってショボーン
グリフは(Smalltalk 72 時代から)文中へのイラスト挿入などに使っていた経緯もあって、比較的自由に変えられます。
たとえば、デフォルトフォントのアンダーバーを ← にしたければ、ワークスペースなどで、
(TextStyle default fontAt: TextStyle default defaultFontIndex) edit: $_
を do it して、ビットエディタが開き、
← っぽいデザインにしたあと黄ボタンメニューから accept を選んでビットエディタを閉じると、
次の画面のリフレッシュから _ は ← に変わります。同様に、$^ も ↑ に変えておくと吉かも。--sumim


Uploaded Image: biteditor.jpg


>あと「.」を書くタイミング(に悩むの)が、Pascalの「;」(に悩むの)と似てますね。
そうですね。
文法的にはピリオドは(数値「0.2」あるいは文字「$.」などのリテラル式と文脈から判断される場合を除き)
2つ以上のメッセージ式(レシーバとメッセージの組み)の区切り位置指定のための記号として解釈されます。
したがって、終端のメッセージ式の最後にはいりません。ブロック内についても同じです。
ただ、ピリオドを使うのはメッセージ式を自然文っぽく見せ、読みよくする狙いもあるので、
終端にも(無用ながら)付けるという考え方もあると思います。
私はこの点においては少々分裂症気味で、心では後者(自然文に似せる)を支持しながらも、
それを常とすると、式の終端記号と勘違いする人が居るのではないかと危惧して、
身体のほうは、終端にはピリオドを付けないほうを徹底してしまっています。--sumim



>折角だから灰ハローのページ作りたい
是非、お願いします。それとも、何かベースになるものをまず私が書きましょうか?

>「ハロ」と「ハロー」のどっちが良いんでしょうか?
ハロー効果」という日本語があるので、ハローがよいとされています。--sumim



>こーゆー「ユーザがボンネットを開ける」ことが出来るってのがインスペクタ→動的で均質なシステムって奴の真骨頂ですな。
御意。
いちエンドユーザーとしては、パーソナルコンピューティング環境はすべからくこうあって欲しいものです。--sumim





起動時に表示されるウインドウ内が Squeak 環境です。ここでは OS とは別の独自の GUI が動いています。
純粋な Squeak 環境に見せかけたければ、左下の Navigator タブをクリックして現れる“引き出し”
(これを Squeak では フラップ と呼びます)の Escape Browser ボタンをクリックします。
同じ場所にトグルで表示される Browser Reentry ボタンを押せば、元の画面に戻ります。
ここでは仮に、前者をウインドウ表示モード、後者を全画面表示モードと呼ぶことにします。
全画面表示モードは、Squeak の GUI 環境がいかに OS のそれとは別の独立したものであるかを実感するのに向いています。
ウインドウ表示モードは逆に、OS が提供する GUI と連携して使いたいときに重宝します。
たとえば、テキストや画像ファイル、プロジェクトと呼ばれる Squeak 専用ファイルを環境内に読み込む際に、
アイコンの Squeak 環境ウインドウへのドロップインで手軽にすますことができる、といった具合です。

環境内でのウインドウの扱い方は、アプリケーションあるいは文書単位でウインドウ内にメニューが表示されないことを除けば、
基本的に Windows のそれとそれほど変わりません。ちょうど表示されている Welcome To... ウインドウを
ちょっとつついてみていただけるとよいと思います。タイトルバーのドラッグで移動できます。
ウインドウの上下左右の端にマウスポインタを合わせると、ポインタアイコンの形が変わるので、
それを確認してからマウスをドラッグするとウインドウのサイズ変更ができます。タイトルバーには、
左端にはクローズボタンが、右端には最大化、最小化ボタンが並んでいます。クローズボックスのすぐ脇に
見慣れないボタンがありますが、これはウインドウメニューボタンというもので、ウインドウをアプリっぽく
見せるときに、ここに機能を割り振ったりするのに使います。今のところは無視してかまいません。
ウインドウのサイズボックスはありませんが、右下端にマウスポインタを合わせドラッグすることで
同様のことができます。スクロールバー内の、スクロール矢印ボタン、スクロールボックスの使い方も
ほぼ一緒です。ただ、スクロールバー最上部にひとつよけいなボタンが付いていて、これはメニューボタン
(あるいはイエローボタンメニューボタン、黄ボタンメニューボタンなど)と呼ばれます。これは、
ワンボタンマウスを使う Mac 用に用意されたものなので、2ボタン以上が標準の Windows では無用です。
2ボタンなら右ボタン、スクロール機能付きマウスを含めた3ボタンマウスでは中ボタンを押したときと
同じ働きをするボタンです。具体的には名前から分かるように、メニューを表示するのに使われます。

ウインドウ内にメニューバー(メニュータイトルの一覧)はありません。メニューは原則ポップアップです。
デスクトップでは例外的に左ボタンで出てきますが、通常、ウインドウ内で何か操作をしているときは、
2ボタンなら右ボタン、3ボタンなら中ボタンで呼び出します。このように、2ボタンなら…、3ボタンなら…と
いちいち言い換えるのが面倒なので、Squeak を含めた Smalltalk 環境では、左ボタンを赤ボタン、
2ボタンなら右、3ボタンなら中ボタンを黄ボタンと呼びます。なお、ホイールボタンが押し下げ可能な
スクロール機能付きマウスを含めた3ボタンマウスの右ボタンは、青ボタンと呼びます。
青ボタンの役割についてはあとで「モーフ」の説明のところで改めてふれます。2ボタンマウスでは、
青ボタンクリックは、alt-左クリックです。
なお、Mac では、黄ボタンクリックは option-クリック、青ボタンクリックは コマンドクリックです。

cut 、copy 、paste などのテキスト編集の基本的なメニューコマンドは、黄ボタンメニューにあります。
Windows でいうなら、すべてのメニュー操作を右クリックメニューで行なうような感覚ですね。
(というか、Win に右クックメニュー、それを真似した Mac の コントロールメニューの根っこは、
 Smalltalk の黄ボタンメニューにあります。)
パーソナルコンピューティング環境として Smalltalk を選択する理由」で触れた「選択した文字列を Smalltalk コードと見なして評価する」命令も
この黄ボタンメニューにあります。たとえば、3 + 4 と入力して赤ボタン操作で選択してから、
改めて黄ボタンメニューを黄ボタンクリックで呼び出し、print it を選択すると結果が表示されます。
数式だけでなく他にも「'squeak' reverse」とか、「'squeak' at: 3」とか、ちょっと長いですが、
「(Workspace new contents: 'Hi, Hikaru!') openLabel: 'my first window'」などと(文中でも
どこでもいいので)入力して選択後、黄ボタンメニューから print it してみるとおもしろいと思います。
Smalltalk の文法についてはくわしくは後で触れますが、間違っても例外が生じたことを示すノーティファイア
(赤い横長のウインドウ)が現れるだけなのでそれを閉じてしまえば、作業は続行できます。
逆にいろいろな文字列を print it してみて、どんなエラーが出るのか試してみるのも一興かも。

とりあえず、こんなところで。後半ちょっと脱線してしまいましたが、GUI に戻ってもう少し続けます。
なお、現在のオブジェクトメモリ(内のオブジェクトたち)の状況を、仮想イメージとして保存する
デスクトップメニューにある「save」あるいはそれに準ずる「save and quit」などのメニューコマンドを
選択して実行しないかぎり、次回起動時の環境には影響しないので、けっこう無茶をやっても大丈夫だと思います。
仮にもし誤って save してしまっても、現段階ではアーカイブから再び元の仮想イメージを取り出して置き換えれば
よいので気にする必要はないと思います。

週末、ちょっと風邪を引いてしまって書き込み出来ませんでしたが、いろいろ試してみました。なんだか、おもしろそーです。まだ、こわごわ触っているような状況なので、その挙動に新鮮な驚きを感じてます。最初に用意されているものがそうだからかわかりませんが、オーサリングツールのような感覚もありますね。まず、文書作成に使ってみたいと思うのですがお勧めのエディタがありましたら、幾つか教えてもらえないでしょうか。教えてください。よろしくお願いします。
(書き込み遅くなって、ごめんなさい。)------hikaru


どうぞ、ご自愛ください。ゆっくりゆきましょう。
>お勧めのエディタ
標準添付のものしか知りませんがそれでよろしければ。
テキストファイルエディタということでは、ファイルリスト(File List)というのがあります。
デスクトップメニュー → open... → file list で開けます。
上半分がディレクトリブラウザで下がその内容のエディタです。
いったん GUI の説明をおいておいて、ファイルリストの説明をしましょうか?

単に書き捨てのメモでよければ、ワークスペース(Workspace)というのがあります。
これも、デスクトップメニュー → open... → workspace で開くことができます。

両者ともテキスト編集の操作はまったく同じです。
(両者に限らず、Squeak のどのテキスト編集も使える機能やキーボードショートカットは共通です。)
操作自体は Windows のそれに似ていますが、ダブルクリックの概念がないなど、微妙に異なります。
これも必要でしたら先に詳しく説明したほうがよろしいですか?--sumim



あと、解説をもっとエンドユーザー向けにしたほうがよければ言ってください。
hikaru さんのパーソナルコンピューティングのスキルを、取り違えているかもしれません。
のっけから“ファイルシステム”とか言われてもねぇ…なんて具合に。--sumim




このページを編集 (19526 bytes)


Congratulations! 以下の 2 ページから参照されています。

This page has been visited 6196 times.