etoysマニア
もくじ
- はじめに
- 復習
- 集合
- 変数と型
- 兄弟
- スクリプティング
- 再帰
- 用語集
... このマークは、Squeak Nihongo7 で実行できるサンプルを表しています。
この文章について
この文章には、Squeak の子ども向けプログラミング環境 etoys の、ちょっぴ
りマニアックな機能の数々について書いてあります。etoys とは、簡単なマウ
ス操作でアニメーションを作ったり科学的なシミュレーションを作ったりする
事が出来るプログラミング環境です。けれどもしばらく遊んでいるとそのうち
もう少し高度な事に挑戦したいと思うに違いありません。この文章はそんな挑
戦に対するガイドとして書かれました。
etoys は確かに子供向けプログラミング環境として優れた面を持っています。
しかし少し凝った事をしようとするといくつかのコツが必要になります。すで
にプログラミングについて多くの経験をお持ちの方なら、etoys の特殊な性質
にしばしば戸惑う点もあるかも知れませし、Flash や Java アプレットを作っ
た事のある方なら、etoys の使い勝手がちょっと違う事に気づかれると思いま
す。残念ながら etoys は万能ではありませんし、不得意な事もあります。し
かしこの etoys の特性を理解する事によって、他の環境ではとても実現が難
しい事を簡単に実現する事が出来るのです。この文章が etoys らしさを身に
つけ、etoys で楽しくプログラミングをするための手引きになれば幸いです。
etoys の気持ち
先ほど書いたように etoys の高度な機能を使いこなす為にはちょっとしたコ
ツが必要です。そのうちの知っておいたほうが良いことをここに書いておきま
す。コツが分かってくると、だんだん etoys での考え方が身についてきて、
etoys の気持ちになる事が出来ます。
- 基本はチクタク・ループ: オブジェクトは基本的にチクタクで自動的にルー
プ処理を行います。プログラムの基本はこうなったらああなるというオブジェ
クトの性質を条件文としてループの中に書いて行く事です。
- オブジェクトはコピーで作る: etoys では、新しいオブジェクトが欲しい場合、あらか
じめ元のオブジェクトを作っておいてコピー(複製や兄弟)で増やします。
- オブジェクトは一度に一つの場所にしかいない: オブジェクトを他のオブ
ジェクトに埋め込んだとき、元あった場所からは自動的に居なくなります。逆
に言うと、一つのオブジェクトを二箇所で表示させる事は出来ません。
- 始めと終わりはユーザが決める: etoys ではプログラムの作成と実行を区
別しないため、プログラムには始めも終わりもありません。もしもあるオブジェ
クトの開始位置が決まっているような場合、開始位置に戻すようなスクリプト
を書いておくと便利です。
タイルスクリプティングの可能性
etoys の大きな特徴の一つにタイルスクリプティングがあります。ユーザはキー
ボードからプログラムを打ち込む必要が無く、マウス操作だけで複雑な動きを
作る事が出来ます。これはプログラムに必要な多くのキーワードを覚えなくて
も済むという反面、テキストの自由度と表現力を持ち合わせていないという短
所もあります。タイルスクリプティングはまだまだ改良の余地が残されていま
すが、ここでタイルの持つ利点と応用について考えてみます。
- 文法エラーが無い
- ユーザインタフェースとしてタイルを使う。タイルは etoys 作者だけで
なく、他のユーザによって変更する事が出来る。例えばプログラム中の定数を
マウス操作で変更したり、ロジックを変更したりする事が出来る。
- タイルには型があるので、おかしな繋がり方をしない。
- タイルは名前ではなく、オブジェクトその物を指すので、オブジェクト名
や変数名の変更が自動的に他の場所に反映される。
これらはどれもプログラムを通したコミュニケーションを助けます。ユーザは
ただ作者の書いたプログラムを見るだけではなく、変更する事によってより深
く作者の考えを知ります。また、この性質には、システムが動いているプログ
ラムを自分でいつでも変更出来るという Squeak の動的な特徴が大いに役立っ
ています。
Squeak そして etoys の特徴とメタ性
なぜ Squeak なのでしょうか。もちろんオープンソースである事や、練られた
開発環境も一つの大きな理由ですが、Squeak の最大の利点はプログラムの開
発と実行を切り替えなくても良いという事だと思っています。Squeak にとっ
てのプログラムの開発とは、生きているシステム自体を生きながら変更してい
く事。いわば無免許医ブラック・ジャック氏のように自分自身の生きた体を手
術して行くような物です。他のプログラミング環境の開発プロセスが静的な、
いわば死んだソースコードを対象とするのに比べて、Squeak では常に生きた
オブジェクトを扱います。この性質は、Squeak の持つメタ性にとって大きな
役割を果たしています。
「メタ」とは、「上位」を現す接頭語です。例えば絵を描く事を考えてみましょ
う。絵を描くためには紙や、絵の具や、様々な画材を使います。画材の種類に
よって描く事の出来る絵が決まってしまうことはよく分かると思います。もし
も目の前の画材に飽きてしまったら、あなたは新たな素材を求めて画材屋さん
を訪ねるでしょうし、歴史的絵画の雰囲気を求めて古代の画材を捜し求めるか
も知れません。絵を描くという行為に対して、それ以前に必要な性質、いわば
画材を吟味し、時には自作するような事をここではメタな行為ものと呼びましょ
う。
プログラムを作る為にも様々な道具が必要です、そしてそれらの道具がプログ
ラム自身の出来上がりに大きく関わってきます。Squeak のような大きなメタ
性を持つシステムでは、実行と開発に境界が無いため、プログラムを作りなが
らプログラムを作るための道具を同時に作るという事が可能です。Squeak の
この性質は、ヴァーチャル・マシン、直接ハードウェアを制御する低レベルの
機構から etoys のような高レベルで豊かなユーザインタフェースまで貫かれ
ているため、絵を描きながら鉱石から絵具を調合するようなメタレベルな操作
を自由に行う事が出来ます。このメタ性を初心者向けのシステムで効果的に扱
う方法が、この文章のもう一つの焦点となっています。
ここでは、高度な etoys の機能に入る前に必要な知識を一通り復習しておきます。
オブジェクトを作る
新たなオブジェクトを作るにはいくつかの方法があります。
- ペイントツールを使う: ナビゲータからペイントツールを使って、自由な
図形を描く事が出来ます。
- 画像ファイルをドロップ: 他のツールで作成した gif, jpeg, png ファイ
ルを Squeak にドロップする事が出来ます。お勧めは透過の gif か png です
- 部品: 部品フラップに、様々な機能のついたオブジェクトがあらかじめ用
意されています。また、部品フラップのオブジェクトカタログから、さらに多
くのオブジェクトを取り出す事が出来ます
ハロを出す
ハロ
ハロを出す事によってオブジェクトに対して色々な操作を行います。ハロの中
で、特に高度な機能を実現するために重要な物について述べます。
- ビューワを開く: プレイヤの状態を表し、
スクリプトを編集するためのビューワを開きます。
- 名前タイルを
作る: このプレイヤを表すタイルを作ります。スクリプトの中でこのタイルを
使ってプレイヤを動かしたり、プレイヤ型を持つスロットに代入したり出来ま
す。
- 赤ハロメニュー: このオブジェクト独自の
メニューを出します。例えば文字列のフォントを変更したり、曲線を滑らかに
したり、様々な機能を呼び出します。
- 複製(シフトを押すと兄弟): 兄弟の機能
については後述します。このオブジェクトと同じようなオブジェクトを作りま
す。
- デバッグ: outOfBox テーマ時のみ出現す
る隠れハロです。オブジェクトの検査やクラスのブラウズ等、Smtalltalk の機能を
利用するのに使います。
埋め込む
オブジェクトには、「入れ物」のように他のオブジェクトをドロップで埋め込
む事の出来る物があります。「入れ物」以外のオブジェクトでも、赤ハロメ
ニューの中の「埋め込む」機能を使ってオブジェクトをオブジェクトの中に入
れる事が出来ます。上手く纏める事によってより柔軟な作品作りが可能です。
メニューアイコン
メニュー
赤ハロメニュー以外にも色々な場所にオブジェクトの細かい機能を指定するメ
ニューがあります。メニューが現れる場所は、メニューボタンや、メニューカー
ソルが表示される場所です。面白い機能が沢山あるので色々試してみましょう。
集合で利用できるメニューとタイル
部品の中にある「入れ物」や「遊び場」をここではまとめて集合オブジェクトと呼び
ます。この二つのオブジェクトは性質が少し違いますが実際は同じ物で、どちらも同
じタイルを使う事が出来ます。集合の中のプレイヤを数字で指し示す事が出き
ますが、現在指しているプレイヤを現すのに「カーソル」の値を使います。ア
ニメーションでこのカーソルが活躍するのはお馴染みですね。
集合に要素を追加する
集合の中にオブジェクトを入れるためのタイルがいくつか用意されています。
[に含める]ですでに入っているオブジェクトの後ろに、[の先頭に追加する]で
先頭に指定されたオブジェクトを追加します。集合の中に入っているオブジェ
クトを指定するにはカーソルを使います。まずカーソルの位置を設定し、次に
[カーソル位置のプレイヤ]で、カーソル位置のオブジェクトを取り出します。
これは、色のついたボールの順序を逆順にするサンプルです。まず下のスクリ
プトの実行ボタン[!]を何度も押すと、ボールが次々と先頭に追加されて行き
ます。全てのボールが下の入れ物に入ってから上の実行ボタンを押すと、今度
はボールが後ろに追加されます。これでボールを逆順にする事が出来ます。入
れ物にボールを入れると、元あった場所からは自動的に削除されます。
変数の作り方と型の設定
プレイヤに現在の速度や重さ等、追加の情報を保存したい時、プレイヤに変数
を追加する事が出来ます。追加された変数は最初から存在する「高さ」や「色」
等のスロットと同じように代入や読み込みを行う事が出来ます。
変数の作り方
変数を追加するには、ビューワのオブジェクト名の隣にある[v]ボタンを押し
ます。変数の名前を聞かれるので適当に名前をつけて下さい。また、出来た変
数の右側にあるメニューから、変数の型を設定する事が出来ます。数多くの型
を利用する事が出来ますが、特に重要な物を以下に挙げます。
- 真偽値: 「はい」または「いいえ」が入る。条件文で利用できる。
- 色: 色はオブジェクト同士を見分けるための柔軟でコストの低い方法。
- 画像: スケッチモーフの画像を記憶出来る。
- 数値: 最も基本的な型
- プレイヤ: 他のプレイヤを指し示す事が出来る。
- 文字列:
プレイヤ変数
変数にプレイヤを設定する。
変数にプレイヤを設定するには、まずプレイヤ型に設定したスロットのアイコ
ンをクリックし、カーソルを十字架状にします。その状態で好きなオブジェク
トを指定してください。プレイヤ変数を使うと、スクリプトの中で他のプレイ
ヤを指定出来るようになります。
ここで、etoys を習った最初の頃に、他のプレイヤを指定するもっと簡単な方
法を教わった事を思い出すでしょう。それは直接他のプレイヤからタイルを抜
き出したり、名前タイルを利用する方法です。上の
例では、[tombo][を回す] [hand][の向き] というシンプルな方法で、それを
実現しています。ここで、あえて変数経由で他のプレイヤを指定する利点は何
でしょうか? 私は以下の理由で、出来るだけプレイヤ変数を使う事をお勧めし
ます。
- 対象のプレイヤを変更する時の手間がラク: 他のプレイヤの複数のタイル
を使うとき、直接指定していれば全部のタイルをドロップしなおさなくてはい
けません。
- プレイヤ同士の関連が明確になる: どのプレイヤとどのプレイヤが関係し
ているのかがはっきりします。
- 兄弟と相性が良い: 兄弟ではスクリプトは共有されるので。直接指定では
兄弟全体で同じプレイヤを参照してしまいます。
- コピーの時名前は勝手につけられる: オブジェクトをコピーした時、
etoys は名前に「とんぼ1」「とんぼ2」のように自動的に数字をつけます。こ
のような数字つきの名前がスクリプトの中に入る事はあまり美しくありません。
メニューから兄弟を作る
スクリプトで兄弟を作る
スクリプトと変数を共有するプレイヤの事を兄弟(sibling - シブリング)と呼
びます。兄弟と複製は大変よく似ています。どちらも緑色のハロで作成します
し、そっくりなオブジェクトを生成します。重要な違いは以下のとおりです。
複製の場合、新しく出来たオブジェクトはそっくりそのまま元のオブジェクト
のコピーですが、そっくりなだけで何の関係もありません。一方兄弟は、同じ
性質をずっと持ち続けます。例えば、作った兄弟のスクリプトを変更すると元
のプレイヤにもその変更が反映されます。
兄弟の作り方
- 複製ハロを使う: シフトキーを押しながら緑色のハロを押すと、兄弟が作
られます。
- メニューを使う: 赤ハロメニューの中に兄弟に関係する選択肢があります。
- スクリプトから作る: 「その他」カテゴリの中の「コピー」タイルで兄弟
を作る事が出来ます。例えばこのタイルをプレイヤ変数に入れる事によって、
出来た兄弟を制御する事が出来ます。
兄弟で注意すること
兄弟は同じ性質を持つプレイヤですが、共有される性質とは一体何でしょうか。
兄弟間で共有されるものはスクリプトと変数の数と種類だけ。言い換えれば、
それ以外のもの、例えば色や位置、画像などはそれぞれ別々にする事が出来ま
す。例えばスクリプト無いでプレイヤの移動する速度を数字でそのまま指定す
ると、全ての兄弟は同じ速度で動きます。しかし速度を変数で指定する事によっ
てそれぞれ別の速度で動かす事が出来ます。
また、チクタクで動くスクリプトを含むプレイヤは特に注意が必要です。チク
タクの中で「コピー」が呼ばれると、生まれた兄弟がまた「コピー」を呼び出
してしまい、大量のコピーが発生してしまいます。生まれた兄弟はもとのプレ
イヤの状態をそのまま写されている事を覚えておいてください。
「スクリプティング」カテゴリ
ビューワの中でも「スクリプティング」カテゴリにあるタイル達は特に強力な
機能を持っています。スクリプティングのタイルを使うと、チクタクやポーズ
などのプレイヤの状態をスクリプトから変化させる事が出来ます。また、複数
の兄弟に対して一度にスクリプトを実行させる事も出来ます。早速例を見てみましょう。
スタートとポーズ
このスクリプトでは、二つのボールがカベの間を互いに反射し続けます。例え
ば動いているボール1が止まっているボール2に当たると、ボール1 は自分の動
きを止め ([ボール1][をポーズする][転がる])、ボール2 を動かし始めます
([ボール2][をスタートする][ 転がる])。互いにこの動作を繰り返す為、二つ
のボールは衝突しながら動き続けるのです。
兄弟の操作
タイルを使って、すべての兄弟に同じ動作をさせる事が出来ます。この例では、
ロボをクリックした時に、自分以外の兄弟に対して「歩く」スクリプトをスター
トさせるよう指示しています。
送る
スタートやポーズ以外にも、様々なタイルがあります。特に、「送る」タイル
の仲間の意味は微妙に異なるので注意しましょう。
- 兄弟皆に送る: 自分以外の兄弟で同じスクリプトを実行します。全ての兄
弟を削除する時などに便利です。
- 皆に送る。自分を含む兄弟全員で同じスクリプトを実行します。
- スクリプトを実行する: 一つのプレイヤにだけスクリプトを実行しますが、
その指示はすぐには実行されず、一瞬待ってから実行されます。
再帰的な図形
今までのテクニックを使って、再帰的な図形を描いてみましょう。ここでは典
型的な例として、ツリー状の図形を取り上げます。ツリー状のそれぞれの節を
オブジェクトとして表現してみましょう。
元になるオブジェクト
例えばこのような形で「まる」と名付けられたプレイヤに変数を定義します。
型はそれぞれプレイヤ変数である「こども1」と「こども2」、そして数値とし
て変数「ながさ」です。それぞれの「こども」は節から伸びる次の節を、「な
がさ」は次の節までの長さを現します。
初期化スクリプトと「こども」の動作
この「まる」が自分をコピーして二つの「こども」を作る事を繰り返し、ツリー
状の図形を作っていきます。その前に、準備のためのスクリプトを作りましょ
う。これらは、コピーしたプレイヤを初期化するのに使います。
まず、「さいしょ」スクリプトには共通の初期化処理を書きます。まず、プレ
イヤの brightness を小さくする事によって色を暗くします(これは単にかっ
こよさのためです)。次に、「ながさ」の値に0.8 を掛け、八割に短くします。
ここを変えると枝の密度が変わるでしょう。次に、「まる」は最初子供を持っ
ていないのでドットを入れておきます。「ドット」タイルは、そのまま新しく
作ったプレイヤ変数の代入タイルから作られます。なぜ「ドット」への代入が
必要なのかは後で分かります。
続く[左へ][右へ] スクリプトは生まれた「こども」を次の位置に進めるた
めに使います。
こどもを作る
ふたつの「こども」を作り、それぞれ変数に代入しています。代入された「こ
ども」はそれぞれ初期化され、それぞれの方向に進みます。ここで、先ほど
「こども1」「こども2」に「ドット」を代入した事を思い出してください。な
ぜこの代入が必要なのか気になる人は、この「さいしょ」を実行しなかったら
どうなるかやってみましょう。トリックは、コピータイルによって元の状態が
全て受け継がれるという性質にあります。
この「生む」のスクリプトをマウスアップで起動するようにすると、クリック
でどんどん図形が大きくなってゆきます。
こどもを削除する
etoys プログラムを作るコツの一つに、画面を掃除するスクリプトを書いてお
くというのがあります。新しい図形を作りたくなったときに、沢山作ったオブ
ジェクトをわざわざ手で消してゆくのは骨の折れるものです。掃除プログラム
を作る事により、色々条件を変えてすばやく実験を行う事が出来ます。この
「こどもをけす」スクリプトの特徴は、スクリプトの中で、こどもの「こども
をけす」スクリプトを呼び出している事です。これにより、樹の根っこに相当
するオブジェクトから、全ての枝を削除する事が出来ます。
このプログラムも例として作品ファイルを載せて置きますが、まだまだ改
良の余地は沢山あります。例えば、クリックではなく、一定時間ごとに自動的
に枝が生えるようにしては如何でしょうか? ランダムに枝の角度が変わるとい
うのも面白いかも知れません。
オブジェクト
画面上にある独立して操作出来る物をオブジェクトと呼びます。本来 Squeak
では、表示できるかどうかに関わらずプログラムの対象全てをオブジェクトと
呼ぶのですが、etoys の範囲では操作の対象になるのは画面上の物となります。
また、後述するプレイヤとモーフを使い分ける必要の無い場合にオブジェクト
という言葉を使います。
プレイヤ
モーフとプレイヤ
画面上のオブジェクトを振る舞いから見たときにプレイヤ、見ためから見た時
にモーフと呼びます。比喩的に現すと、プレイヤは演劇の中での役者を現し、
私達が画面を通してみる物は役者の演じる虚構的な画像(モーフ)と見る事が出
来ます。私達はプレイヤに対してスクリプトを書いたり変数を設定します。多
くの場合、モーフとプレイヤの違いについて意識する必要が無いようになって
いますので、ここではそういう言葉があると覚えるだけで良いでしょう。
Squeak の深層を覗き始めるとこの違いは重要になります。
ドット
「無い」事を現す特別なプレイヤ、小さな黒丸の形をしています。プレイヤを
引数にとるタイルでは、あらかじめこのドットが設定されています。プログラ
ム中に、プレイヤが「存在しない」事を表す時に使います。一度他のプレイヤ
が入ってしまった変数に再度ドットを代入するには、一度他の型を設定してか
らもう一度プレイヤに戻してください。
山宮 隆 : tak@metatoys.org
$Id: index.html 929 2004-12-15 02:00:51Z propella $