Powered by SmartDoc

ELM-VE Tutorials

2002年2月13日
Kenji Saito
http://elm-ve.sourceforge.net
ELMの作成は2000年4月にはじまりました。このプログラムパッケージは物理実験用に開発された個人的なプログラムに、ネットワーク透過性の機能の追加し、内部アーキテクチャとユーザインタフェースの完全な分離を実現することで、仮想現実の基本的な機能と、開発環境を提供できるように作成されています。

目次

What's ELM-VE

特徴

特徴ではないですが、まずはじめに、ELMは 仮想現実を提供するということを述べておきます。 この世界で起るさまざまな現象や、空想の世界での出来事、 目に見えない物理現象、実際には費用や危険性や実験の規模の 問題で実現不可能な実験などをシミュレートすることを意図して 作成されています。

仮想現実を実現するためのソフトウェアは、すでに数多く ありますが、ELMの際立った特長といえば拡張性にあるとおもいます。 例えば各オブジェクトに対して、においを表現するデータを 付け加えてElmのエージェントとClientを拡張すれば、においの ある仮想空間を実現できるでしょう(今年アメリカの企業で、 コンピュータに接続して匂い?(かおり)を発生する デバイスがリリースされる予定だそうです)。

近年研究されている多くの分野では、独立した多くの要素が 互いに影響を及ぼしあう対象物が注目されていると言えると思います。 ELMではこのような対象をシミュレーションするのに適しています。 このような対象物は並列処理を用いた、プログラミングが有効ですが、 この場合マルチスレッドプログラミングなどの高等なプログラミング 技術が必要になってきます。ELMでは、スレッドをまったく意識 することなしに、マルチスレッド的なプログラミングが可能です。

スレッドを用いたプログラミングにより、能動的で 自律的なオブジェクトを作成することができます。

とくにELMは学生が研究で実験を行うための環境として 整備されています。シミュレーションのデータを保存したり、 クライアントの画像を保存したり、という機能が 用意されています。

ELMの提供する仮想現実は、通常、クライアントを起動 したときに自動的に作成される、自分のマシン内のサーバ によって維持されています。しかし、クライアントとは 独立したサーバをインターネットに接続された マシンで起動することによって新しい仮想現実を 造ることもできます。これらのサーバ間に リンクをはることによって、分散された巨大な 仮想現実を実現できます。

ELMの応用例

仮想現実、物理シミュレーション

ELM-VEのコンセプト

Javaはオブジェクト指向を取り入れ、プラットフォームを越えた実行ファ イルレベルでの互換性を提供し、計算機ネットワークの資源をフルに活用でき るプログラミング言語として非常に優れている。Javaは アプリケーション開発者の多様な要求にこたえるための言語として発展しているよう に見える。Javaで作成したアプリケーションが現実的な速度で動作し、 安全なセキュリティ機構をもち、豊富なGUIや多くのメディアへの対応、 さまざまなデータ構造の取り扱いを簡便にするクラス郡、などを有し などを目指しており、実際に実現されている。

Javaは優れた言語であるが、アプリケーションの開発言語でクロウト向け という感じが否めない。Javaではさまざまな機能が提供されているが、これら の機能を使ったプログラムを行うためには、その機能を実現するための固有の 概念を理解する必要がある。また、多くの場合さまざまな設定を考慮しなけれ ば、正しく動作するオブジェクトを作成することすらできない。つまり、プロ グラムを組む前の段階で全てを理解している必要がある。簡単なGUIを持つ プログラムを組む場合でも理解していなければならないことは、膨大である。

ほとんどの場合、学生が研究をするときに重要なのは、プログラミング技 術ではなく、そのプログラムで何をするかである。

ELMには計算機アーキテクチャを一切持ち込まない。 例えば、長さの単位にピクセルは持ち込まず、 メートルを用いる。

クラス名と名前だけで、まず、オブジェクトを作成できる。 他のカスタマイズ設定を必要としない。 しかし、カスタマイズできる。

拡張性、は研究に必要で、重要。

特に、並列処理ー>スレッドー>難解&バグ取りが難しい

プログラムが見えるということ

受動的か、能動的か

新しい概念を覚える必要がない、触ってみればよい。 生活の中で得られる概念のメタファを用いる

子供と、年寄りそして、Disabledの復権。

ELM-VEの動作原理

Agent指向?

ELMのもととなったプログラムは、非常に多くの単純な動作をする 要素が互いに影響を及ぼしあう環境をシミュレーションするために 作成されています。ここで、ELM環境内の要素の身になって考えてみ てください。以下にあげられるような機能は必須であることが想像で きるはずです。しかしJavaのデフォルトのオブジェクトはそのような 機能がないのです。そして、この機能は、近年注目されるAgent指向 コンピューティングと非常に親和性があります。 以下ELM環境内のELMオブジェクトの機能を見ていきます。

能動的な動作

オブジェクト指向言語では、各オブジェクトにはメソッドが あり、メソッドの中にそのオブジェクトの動作が記述されます。 Javaのオブジェクトもメソッドをもちますが、普通にプログラム すると、各オブジェクトのメソッドが実行されるかどうかは、 ほとんどの場合、他のオブジェクトからそのメソッドが呼び 出されるかどうかにかかっています。もちろんオブジェクト 内のメソッドから自分自身のメソッドを呼び出すことも可能 ですが、そのような場合は、主となるメソッドの細かい動作を 記述してあるサブルーチン的なメソッドであることがほとんど です。

そこで、オブジェクトの身になって考えてみてください。 自分のどのメソッドを実行して、自分がどのように動作 するか自分で決めたい、つまりどのメソッドを実行するか 決める部分のプログラムも自分自身の中に持ち独自に 実行したいと、思いませんか?このようなことを可能に するには、スレッドのような仕組みがどうしても 必要です。ELMでは、これを実現する方法を提案しています。

他の要素からの要求

上で説明したように、自分のメソッドを自分で、 呼び出す機能があっても、やはり、他のオブジェクトから の要求を受けることができなければ意味がありません。 ここでは、他のオブジェクトからの要求を受ける場合を 考えます。

たくさんの同じタイプのオブジェクトをつくり それらの間での相互作用をシミュレーションする場合を 考えてみてください。オブジェクト指向言語では オブジェクトは全てクラスから生成されます。もし、 これらのオブジェクトが一つのクラスから生成された ものだとすると、Javaのオブジェクトではこまった ことが起こります。Javaのメソッドにはprivate, protected,publicなどの種類がありますが、 同じクラスから生成されたオブジェクトどうし ならば、他のオブジェクトのprivateやprotectedの メソッドをも呼び出せてしまうのです。

それに、Javaのオブジェクトは他のオブジェクトから メソッドを呼び出されたときに、どのオブジェクトから 呼び出されたのかを知る一貫した方法がありません。つまり、 なんの工夫もない通常のプログラムでは、誰から呼び出された としても、同じように答えるしか方法がなく、呼び出された相手に よって要求を拒否したり、返答の内容を変更することが できません。もしくはそのような仕組みを自分で作成する 必要があるでしょう。ELM上でのメッセージの伝達を用いれば この問題を克服できます。

自分の周りの状況を知る

何の工夫もされていないJavaのオブジェクトは、 自分の置かれた状況を把握することができません。 そもそも、自分の周りの状況というものが存在 しないのです。つまり、デフォルトのJavaオブジェクトは 目も見えないし耳も聞こえないのです。

一方ELMのオブジェクトは必ずElmSetオブジェクトの 中にいます(一番トップのElmSetオブジェクトは例外)。 この自分のいるElmSetのことを"親"と呼び、 ELMオブジェクトのいる場所のデータを持っています。 ELMオブジェクトは自分の親に対して、周りに誰が いるのかをたずねることができるし、自分のいるばしょ についてのさまざまな状況を調べることができます。 どのようなことが調べられるかはElmSetの機能に よります。基本的な機能はElmSetにすでにあるはずですが、 ElmSetはユーザが自由に拡張することも可能です。

木構造

前章で述べたようにELMのオブジェクトはElmSetクラスから 生成されるElmSetオブジェクトの 中に存在しています。そして実は、ElmSetクラスはElmクラスの サブクラスです。するどい人はこの事実からすぐ予想できる と思いますが、ELMでは仮想空間を階層的に構築し、 計算機のファイルシステムのように木構造を作ることができます。 これには2つの利点があります。1つは、文字どうり階層的な 仮想空間を作成できるということです。仮想的なバーチャル シティを構築する場合を考えてみて下さい。そのバーチャル シティには学校、病院、役所などのいろいろな建物を建てる ことができます。学校を建てるならばその学校の中に図書館、 体育館、音楽室、教室などの部屋を作ることができます。 もう一つの利点は、なにか複雑なオブジェクトを作成する場合に 既存の単純なオブジェクトを組合せて、それを ElmSetオブジェクトでまとめることによって、簡単に作成 できるということです。将来的には十分な量の 基本ELMオブジェクトを提供することによって、 Javaのプログラミングの知識が無い人でもELM上で複雑な オブジェクトを作成できるようにしていきたいと 考えています。

スレッドにつて

上で述べたように、オブジェクトに能動的な動作をさせるためには、 スレッドのような機能が必要になってきます。しかし、JavaのThread はコストがかかります。つまり、Threadを一つ生成するたびにそれを 維持するために、スタック領域が必要だし、Javaのデフォルトの 動作では、計算機資源からネイティブなスレッドを一つ消費します。 数百、数千のスレッドを生成するのは、非現実的であり下手な プログラミングです。

このような状況を簡単に克服するには、一つのスレッドを 用いて、複数(数百、数千)のオブジェクトのメソッドを順番 に呼び出すようなプログラミングが考えられます。しかし、 この方法はさまざまな状況に対応するために、多くの拡張を 必要とするでしょう。例えば、時間が経過するにつれてオブジェクト の個数が増減する場合や、全てのオブジェクトが常に動作するの ではなく、実際に動作するオブジェクトと休眠状態のオブジェクト が混在しており、個々のオブジェクトが独自に休眠状態から 覚めたり入ったりするような場合です。 もし研究者に十分な時間がなければ、自分の本当に やりたかったことをあきらめて制限されたプログラムを組む ことになりかねません。また、そのようなプログラムを書く プログラマは、それぞれのオブジェクトを自律的に動作 させるための仕組みも独自に考案する必要があるかもしれません。

以上さまざまな問題点を上げて、ELMではそれが克服できると述べてきました が、その克服方法は次節で説明する待ち行列(キュー)を用いたメッセージの処理 によって実現されています。ELMのこの方法は、Swingパッケージのイベント処理 や、Java3Dのオブジェクトの挙動制御やイベントを処理の手法と少し似ています。 これらの手法とELMの違いはELMの待ち行列はオブジェクトごとに用意されている 点です。Java3Dはコンピュータゲームなども作れるように設計されていますが、 コンピュータゲームをやったことのある人ならば、そのゲームの中では様々なキャ ラクタが突然表われて、それぞれに複雑な動きをし、消えゆくと言ったようなこ とが当然のように行なわれていることを知っているでしょう。これはELMの目指 していることと同じです。これらが似たような方法を採用しているのは偶然では ありません。しかし、Java3DやSwingのそれは目的の制限されたものであるし、 ELMの方法のほうがより簡単で拡張性があり理解もしやすいと思います。そして トランザクション機構を実現するための便利な機能も提供しています。ELMを使 いこなすために次節は、しっかり理解して下さい。

待ち行列(キュー)

ELMシステムは多くのクラスから構成されるJavaのパッケージですが、 最も重要な クラスはElmクラスで、仮想空間内のオブジェクト、ユーザ、 部屋などの全ての クラスのスーパクラスです。Elmクラスは待ち行列 (キュー)を持っており、この中にメッセージを格納することができます。 下の図はElmServer内で活動している複数のElmオブジェクトを 模式的に表しています。

上の図を見て下さい。この図にはELMの仕組みの重要な概念の多くが 示されています。この図の全ての要素について適切な説明ができるよう になれば、ELMの仕組みの基礎を理解できていると言えるでしょう。 一番外側の四角はElmServerを表わしています。 その中に"root(ElmSet)"とラベルのある四角があります。これはrootという 名前のElmSetオブジェクトを表わしています。?節でも説明 したように、このElmSetオブジェクトは中に複数のElmオブジェクトやElmSet オブジェクトを含むことができます。ElmやElmSetを拡張した、エージェント や独自のオブジェクトを含むこともできます。始めてElmServerを単独で 起動した時にはElmServerの中にはrootと名の着いたElmSetオブジェクトが 一つだけ存在する状態で起動します。

この図はデフォルトで用意されるrootのElmSetの中に、 "Object1"、"Object2"、"Object3"を作成した状態を表わしています。 Object1とObject2は通常のElmオブジェクトですが、 Object3はElmSetオブジェクトですので、その中にまた他のElmオブジェクト を作成できます。この図ではObject3の中には"ObjectA"と"ObjectB"があります。 これはELMが仮想環境を階層的に作成できることを図で表現しています。

図の中には灰色の小さな四角がいくつも示されています。これらはメッセー ジです。メッセージはElmオブジェクトやElmSetオブジェクトの中で生成され、 オブジェクト間で交換され、オブジェクトの中で処理され消滅します。各オブジェ クトはELMのグラフィカルなクライアントで見ることができますが、メッ セージはクライアントで見えるものではありません。

メッセージの一部は、横長の四角の中に描かれているものがあります。この 横長の四角が"待ち行列(キュー)"です。これはメッセージを受け取ったオブジェ クトが一時的にメッセージを保存しておく場所です。待ち行列の中にメッセージ が格納されるとElmは待ち行列の先頭から一つメッセージを取り出し、自動的に そのメッセージに対応するメソッドを呼出すようななっています。Elmシステム では、全ての動作がメッセージの送信とそれに対応するメソッドの実行のプロセ スで行われます。

メッセージには、4つの要素が含まれます。それらは、メッセージの送り主、 受け手、メソッド名、引数です。よってメッセージを受け取ったElmオブジェク トは、処理の内容をメッセージの送り主によって変えることができます。また、 引数はObject型なので、メッセージを使ってあらゆる種類のデータを伝達す ることが可能です。

以下に実際にメッセージを送信するためのソースコードの例を挙げます。 メッセージの実体はOrderというクラスを用いて実装されます。

import ac.hiu.j314.elm.*;

// method1というメッセージを処理できるElmクラス
public class TestElm extends Elm {
    // 自分自身を呼出すメソッド(無限ループになる)
    public void method1(Order o) {
        System.out.println(o.getStringArgAt(0));
        System.out.println(o.getDoubleArgAt(1));
        System.out.println(o.getIntArgAt(2));
        Object args[] = {"arg1",W.p(2.0),W.p(3)};
        sendMessage(makeOrder(this,"method1",args));
    }
}

詳しい説明はサンプルを参照して下さい。

トランザクション

基本的にはメッセージの伝達の仕組みを用いればELMの全ての機能を実現可能 ですが、不便な点があります。一つは他のオブジェクトにメッセージを送り処理 を依頼するだけではなく、処理結果を返事として受け取りたい場合です。もう一 つは多くのオブジェクトが同期を取って動作しなければならない場合です。ELM では、この二つの場合を次のような同じ一つのテクニックで処理します。

まず、今までメッセージと呼んできたものをOrderとRequestの二つに分類し ます。この二つのクラスはどちらもMessageクラスのサブクラスで、機能はまっ たく同じです。しかしELMシステムはRequestにはそれに対応する返事が必ず存在 すると仮定します。一方Orderは返事を返す必要のないメッセージであるとして 処理します。

実際にRequestを送り返事を受け取るためのソースコードの例を下に示します。

private Elm elmObjectB;
public void method1(Order o) {
    Request r = makeRequest(elmObjectB,"cubicContent",W.p(2.0));
    prepareForReply(r,"method2",null);
    sendMessage(r);
}
public void method2(ReplySet sr) {
    System.out.println(sr.getReplyAt(0).getDoubleArgAt(0));
}

以下のソースファイルは上のソースファイルから呼出されるメソッドです。

// 立方体の体積を求めるメソッド
public void cubicContent(Request r) {
    double d = r.getDoubleArgAt(0);
    sendMessage(makeReply(r,W.p(d*d*d)));
}

先程、メッセージをOrderとRequestの二種類に分類しました。さらに それぞれにプライベートな目的に使用するメッセージを表わすクラスを 用意してあります。Orderに対してはMyOrder、Requestに対しては MyRequestです。

さらに詳しい説明はサンプルを見て下さい。

Server,Client,Mobile Agent

ELMはローカルマシンだけで動作させることができますが、ELMサーバをリモー トマシンに立ち上げれば計算機ネットワークを越えて複数のユーザが共有する仮 想空間を構築することが可能です。そして、ELMのサーバ内のデータをクライア ントに伝達するためにモバイルエージェントを用いています。

VESMAのサーバは、三次元の仮想環境を生成・維持し、クライアントから計算 機ネットワークを通して送られてくるモバイルエージェントを受け入れサーバ内 の仮想環境に導き入れます。クライアントは仮想環境内のモバイルエージェントを 操作するリモートコントロールシステムの役割とモバイルエージェントが仮想環 境内で見ている風景をユーザにも見せる働きを持ちます。

モバイルエージェントを用いたことにより、ユーザインタフェースの機能の 拡張が非常に容易になります。ELMにはデフォルトのクライアントとして、テキ ストベースのクライアント、Swingベースのクライアント、Java3Dベースのクラ イアントの3種類のクライアントが用意されていますが、これもモバイルエージェ ントがサーバからクライアントに送り返すデータの種類をコントロールすること によって実現されています。

ElmCustomizer

ELM仮想空間内のオブジェクトは独自のカスタマイザを設定できます。ELMの Swingベースの2次元クライアントも、Java3Dベースの3次元クライアントもその クライアントの画面だけでは多くの情報を表示するのに十分な広さを持っていま せん。また、常に全ての情報を表示しておくと逆に見にくくなります。Swingベー スのクライアントではオブジェクトをダブルクリックすることによりカスタマイ ザを開くことができます。カスタマイザと名前がついていますが、そのカスタマ イザに表示するものは自由です。これはいくつかの必要なメソッドが実装された JComponentクラスのサブクラスで、その中に様々なSwingコンポーネントを使っ て複雑なユーザインタフェースを作成できます。特にカスタマイザを設定しなけ ればデフォルトのカスタマイザが使用されます。

実際のカスタマイザの作成法はこちらのサンプルを見て下さ い。

利点

以上のようなアーキテクチャを使用することにより3つの利点が得られる。こ れは並列プログラミングのテクニックとして常に問題となる事項である。一つ目 はプログラミングの設計上の見通しの改善、二つ目は複数のスレッドによるデー タ整合性の破壊の回避、三つ目はデッドロック問題の発生の軽減である。

欠点

ELMの欠点を述べる前に、基本的に並列処理のプログラムを組む という場合に避けることのできない問題点がある。まずは、自分の プログラムしようとしている問題は並列処理が向いているのか、 並列処理する必要があるのかを判断する必要がある。 例えば普通、CPUが1つの計算機では並列アルゴリズムにしても 処理スピードが早くなるわけではない。問題の構造が並列処理に 合わないものは並列処理でプログラミングするのは単に物事を 繁雑にするだけである。

0.データが分散されてしまうために、それらをまとめて 処理したい場合は分散されたデータを集めなければならない 場合がある。 1.並列処理では他のスレッドの処理状態を調べる必要性が あるかもしれず、それは繁雑な処理になる可能性がある。 2.ELMの仕組だけで、デッドロックを完全に避けることは できない。

ELM-VEのインストールと基本操作

ELMは仮想環境の開発環境で、自分の希望する仮想環境を 実現するには、その仮想環境の中に存在すべきオブジェクトの クラスを作成する必要がありますが、ELMにはじめから あるクラスだけでも簡単な仮想環境を構築できます。 自分の仮想環境を構築する前に、一度ELMのデフォルトの クラスだけで仮想環境を構築し、その使用法をためして みるのがよいでしょう。

インストール方法

ELMはJavaで開発されているので、多くのプラットフォームで 動作しますが、ここではWindowsでのインストールを中心に解説します。 ELMをインストールするためには、以下のソフトウェアもあらかじめ インストールされている必要があります。

上に示したソフトウェアのインストール方法はそれぞれの ドキュメントを参照して下さい。ただ、 上に示してあるWeb3DのHowToInstallに示されているXj3Dの イントール方法は非常に大変なのでWWWサイトにある コンパイルずみのx3d.jarをダウンロードして インストールすると良いでしょう。(このコンパイルずみ x3d.jarはバージョンが古いので完全ではありませんが、 ELMを使用するには十分です。)

ELMはelm-ve-*.**.tgzまたはelm-ve-*.**.zipというファイル名で ダウンロードできます。

*.**の部分はバージョン番号なので、 なるべく新しいものをダウンロードしてください。これを 解凍すると以下のようなファイルとフォルダが展開されます。

COPYRIGHT
README.txt
build.bat
build.sh
bin/
examples/
release/
src/
... etc.

README.txtにコンパイルとインストールの方法が 説明してあります。上に示したソフトウェアが正しくインストール されていればコンパイルは簡単です。Windowsでコンパイルする 人はbuild.batとreleaseフォルダ内のbuild.batをそれぞれダブル クリックして下さい。releaseフォルダ内にelm.jarが作成 されるので、これをCLASSPATH環境変数に加えて下さい。

以上でインストールは終了です。

起動方法

Windowsでは、binフォルダ内のelm2.batをダブルクリックして 下さい。

最初に名前を聞かれるので、仮想環境内で使用する自分の 名前を入力してください。

これで、クライアントの起動ができます。通常 意識しませんが、ELMでは、クライアントが起動した 時点で、自動的にサーバも起動します。クライアントが 起動された時点で表示される内容は、そのサーバの 中の仮想環境です。このサーバは自分のローカルな マシンに起動されたプライベートなサーバで、 自分だけの仮想環境を構築することが可能です。

コマンド

ELMには3種類のクライアントがあり、それぞれに 操作法があります。しかし、全てのクライアントで 共通してテキストのコマンドを入力することが でき、全ての操作はテキストコマンドだけで可能に なっています。2次元クライアントや3次元クライアント はそれぞれ独自のGUIをもっていますが、その説明は ここでは、省略します。しかし、これらのクライアントの 操作は直感的にできるように(しようと)しています。 もし、わかりずらいと思う場合には、連絡ください。

移動のコマンド

cd

オブジェクト操作のコマンド

cct

コマンドの種類と拡張

上の節で説明したコマンドは全て英語のアルファベットで 始まるコマンドで、Avatarコマンドと呼ばれるものです。 ELMにはこの他にElmSetコマンドとElmObjectコマンドが あり、全部で3種類のコマンドがあります。これらのコマンドの 違いを説明するには、多少ELMのコマンド説明が必要です。

ELMのコマンドはクライアントから文字列として入力され、 文字列のまま、サーバの中にいる自分のアバタに送られます。 アバタはそれを解釈して、このコマンドを?章で説明した メッセージに変換します。そして、?章で説明された方法 で、メッセージが送信されます。このメッセージが どこに送信されるかによって、3種類のコマンドができる わけです。

Avatarコマンドはメッセージに変換された 後に、自分自身に送られるコマンドです。つまり、 Avatarコマンドを実行するとは、Avatarのメソッドをを 呼び出すことにほかなりません。基本的なコマンドは Avatarコマンドであり、Avatarコマンドにするべきです。 (コマンドは自分で追加、拡張できます。)それは、 あとで説明されるElmSetコマンドやElmObjectコマンド よりも、ちょっとだけ入力しやすいからです。

ElmSetコマンドはメッセージに変換された後に、 自分のいる部屋に送られます。つまり、ElmSetコマンド を実行するとは、自分のいる部屋のメソッドを呼び出す ことにほかなりません。ElmSetコマンドは全て以下の 形態をしています。

#コマンド名   引数1   引数2   ……

つまりコマンド名の最初に必ずシャープ記号がつきます。 このElmSetコマンドはデバッグの時などには便利ですが、 Avatarコマンドから間接的に呼び出せるように、Avatarに 同様の名前のメソッドを用意しておけば、基本的に必要 のないコマンドです。

ElmObjectコマンドはメッセージに変換された後に、 自分のいる部屋の中にいる他のElmオブジェクトに送られます。 つまり、ElmObjectコマンドを実行するとは、他のElmオブジェクトの メソッドを呼び出すことにほかなりません。ElmObject コマンドは全て以下の形態をしています。

##Elmオブジェクトの名前   コマンド名   引数1   引数2   ……
##object_name   command_name   arg1   arg2   ...

つまりコマンド名の最初に必ずシャープ記号が二つ つきます。このコマンドもAvatarコマンドから間接的に 呼び出せるように、Avatarに同様の名前のメソッドを 用意しておけば、基本的に必要のないコマンドでが、デバッグ には重宝します。

コマンドの説明

VESMA,ELMでは様々なタイプのクライアント(テキストベースクライアントや、 3次元クライアントなど)が使用できますが、どのクライアントでも基本的に、 コマンドが入力できれば何でもできます。

コマンドの種類

VESMA,ELMではコマンドを実行するとは、オブジェクトにメッセージを 送ることに対応します。どのオブジェクトにメッセージを送るかの違い で4種類のコマンドがあります。

  1. コマンド名引数1引数2…
  2. #コマンド名引数1引数2…
  3. ##オブジェクト名コマンド名引数1引数2…
  4. ###コマンド名引数1引数2…

「コマンド名 引数1 引数2 …」の形のコマンドは自分自身(アバタ)に対して メッセージを送ることに対応します。「コマンド名」のところには、メッセージ の種類を表す文字列が合てはまります。引数はコマンド名によって変ってきます。

2番目の「#コマンド名 引数1 引数2 …」の形のコマンドは、自分のいる部屋 に対してメッセージを送ることに対応します。どのようなコマンドが使えるかは、 その部屋のクラスによってかわります。

3番目の「##オブジェクト名 コマンド名 引数1 引数2 …」の形のコマンドは、 部屋の中にある任意のオブジェクトに対してメッセージを送ります。 「オブジェクト名」のところに、メッセージを送りたいオブジェクトの名前を 指定します。どのようなコマンドが使えるかは、そのオブジェクトのクラス によってかわります。

4番目の「###コマンド名 引数1 引数2 …」の形のコマンドは、 クライアントに対してメッセージを送ります。これはめったに使用しませんが クライアントの表示がみだれた場合に使う「###refresh」などが、それに 対応します。

ElmAvatarのコマンド

ELMで通常使用するコマンドを以下に挙げます。これらのコマンド名は UNIXで使用されるコマンド名と似ています。

ls

自分と同じ部屋にいる、全てのオブジェクトの名前を表示します。

cat

オブジェクトの詳細情報を表示します。

コマンドの練習

クラスとオブジェクト

以下の説明ではクラスとオブジェクトという言葉を使用しています。これを混 同しないように気をつけて下さい。オブジェクトは「物」を表わしクラスはそ の物のタイプを表わす言葉です。

ですから、ある一つのオブジェクトに注目すると、それにはオブジェクト名と クラス名の二つが付いていることになります。

「安達、金子、佐藤、菅原、中野渡、成田、松永、渡邊」がオブジェクト名で 「314研究室ゼミメンバー」がクラス名という感じです。

コマンドの入力

とりあえずvesma2.batをダブルクリックして起動します。

仮想環境が表示されている部分と、メッセージが表示されるテキストエリアの 間に、コマンドを入力するテキストフィールドがあります。そこにコマンドを 入力して実行できます。

ためしに、「ls」と入力してエンターキーを押してみて下さい。メッセージと して同じ部屋の中にあるオブジェクトの名前が表示されます。

VESMAを起動した後になにもしてなければ表示されるのは

ls
transpoter
client
kenji

のような3つの名前だと思います。transpoterとclientはHiddenオブジェクト なので画面上では見えませんが、システム内部の仕事をするオブジェクトです。 とりあえず気にしなくていいです。kenjiがVESMAにログインした際に入力した 名前です。あなたのアバタを表わしています。

さらに「cat kenji」でkenjiオブジェクトの詳細な情報を表示できます。

cat
cat   kenji
ac.hiu.j314.elmve.ElmAvatar(kenji):X=-5.0, Y=5.0, Z=0.0 \
    status=RUNNING
 My parent is ac.hiu.j314.elmve.TopElm(root)
//172.17.213.14/ElmVE

kenjiというオブジェクトがac.hiu.j314.elmve.ElmAvatarというクラスのオブ ジェクトでx,y,z座標が(-5.0,5.0,0.0)であることなどが表示されます。

「pwd」というコマンドを実行すると、自分が現在いる場所が表示されます。 例えば

pwd
//172.17.213.14/ElmVE

と表示されます。これは172.17.213.14というIPアドレスが割当てられている マシン上のElmVEという名前のサーバにアバタがいることを示しています。後 で見るように、仮想空間の奥深くに移動すると

pwd2
//172.17.213.14/ElmVE/building8/room103

のようになっていきます。

オブジェクトの作成

VESMAを起動してなにもしてなければ、仮想環境内には自分しかいません。な にかオブジェクトを作成してみましょう。

オブジェクトを作成するには、まず、どのタイプのオブジェクトを作成するか 指定する必要があります。このとき使用するコマンドは「cct」です。引数に は作成したいオブジェクトのクラス名を指定します。

cct
cct   ac.hiu.j314.vesma.Note

と指定すればVESMAのノートオブジェクトが指定されます。ここで指定できる クラス名のリストをこの文章の一番下に付けておきます。

cctコマンドを実行しても、まだ何も作成されません。touchコマンドを実行す ると実際にオブジェクトが作成されます。

touch
touch   note01

上のコマンドを実行すると、自分の背後になにかが新しく作成されたのがわか る思います。note01というのがオブジェクトの名前になります。

重なっていてはわかりずらいので、オブジェクトの場所を移動してみましょう。

locate
locate   note01   5.0   5.0   0.0

5.0 5.0 5.0はx,y,zの座標です。適当に変更してみて下さい。

作成したオブジェクトを消去するには「rm」コマンドを使用します。

rm
rm   note01

上のコマンドを入力するとnote01オブジェクトが消去されます。

一応、コマンドを説明しましたが、「touch」「rm」「locate」のコマンドは マウス操作で代用できます。マウスの真中ボタン(真中ボタンが無い場合はAlt キー+左ボタン)で背景の部分をクリックすると「touch」、オブジェクトをク リックすると「rm」の動作をします。マウスの左ボタンで普通にドラッグすれ ばオブジェクトの場所を移動できます(「locate」コマンド)。

メッセージ送信

ELM,VESMAの仮想環境各オブジェクトは、特定のメッセージを受け取ってその メッセージの内容に従って動作します。コマンドラインからメッセージを送る 方法があります。

メッセージの送信を試すためにac.hiu.j314.vesma.Noteクラスのオブジェクト をもう一度作成してみて下さい。「cct」コマンドは一度指定すると、以後有 効なので省略できます。

touch   note02  5.0   5.0   0.0

「touch」コマンドの引数として上のようにx,y,z座標を初めから指定すること も可能です。

note02オブジェクトが作成できたら、次のコマンドラインを入力してみて下さい。

##note02   openCustomizer

最初にシャープ「#」が2個付いているのがみそです。これは、note02という名 前のオブジェクトに対してopenCustomizerという名前のメッセージを送るとい う意味です。コマンドを実行すると、カスタマイザが開きます。VESMAのNote クラスのオブジェクトのカスタマイザはWebブラウザになってます。デフォル トでVESMAのオブジェクトのページが開かれたと思います。確認したら[done] ボタンでWebブラウザを閉じて下さい。

こんどは以下のコマンドを入力してnote02オブジェクトにsetSourceURLという 名前のメッセージを'http://www.do-johodai.ac.jp/'という引数付きで送りま す。

##note02   setSourceURL    'http://www.do-johodai.ac.jp/' &

なにも変化しませんが、もう一度カスタマイザを開くと北海道情報大学のペー ジに変っているのが確認できます。

実は「openCustomizer」コマンドの実行もマウス操作で代用できます。カスタ マイザを開きたいオブジェクトのアイコンをダブルクリックして下さい。

移動

ELM,VESMAの仮想環境は階層構造になっています。Windowsなどのファイルシス テムのような感じです。Windowsでは「フォルダ」というものがあって、その 中に他のファイルを保存できますが、VESMAではac.hiu.j314.vesma.Roomクラ スのオブジェクトの中に、他のオブジェクトを投入できます。

とりあえずac.hiu.j314.vesma.Roomのオブジェクトを作ってみて下さい。

cct   ac.hiu.j314.vesma.Room
touch   room01

ちっちゃな小屋のようなアイコンのオブジェクトが作成されたと思います。こ のちっちゃな小屋の中には、また別の仮想空間が存在しています。この小屋に 入ってみましょう。

cd   room01

背景が変化してroom01の小屋が消えたと思います。つまりroom01の中の別の仮 想空間に入ったということです。ここでもう一度、部屋を作ります。

touch   room02

また、小屋が作られます。さらに、この部屋に入てみます。

cd   room02

新しい仮想空間に入ったことが別ります。ここで自分の場所を表示するコマン ド「pwd」を入力してみて下さい。

pwd
//172.17.213.14/ElmVE/room01/room02

と表示されます。現在の仮想空間から外に出るには次のように入力します。

cd   ..

MS-DOSのコマンドでフォルダを移動する場合と同じです。ここで「pwd」を実 行すれば以下のようになるでしょう。

pwd
//172.17.213.14/ElmVE/room01

この「cd」コマンドを入力するかわりに、キーボードのカーソルキーでアバタ を移動して小屋に体当りさせてみて下さい。自動的に小屋の中に入ります。

サーバ間の移動

ここまでは、自分の目の前にあるパソコンの内部だけの話でしたが、 ELM,VESMAはインターネットを利用して他のサーバマシンの中の仮想空間をの ぞくことができます。以下のコマンドを入力して下さい。

go   //v314.do-johodai.ac.jp/ElmVE

314研究室の中に置いてあるVAIOのマシンのElmVEと名前が付いているサーバに に存在している仮想空間に移動できます。複数の人が、同じ仮想空間に入れば 互いに他のアバタが確認できます。また、次のコマンドで、会話もできます。 (VESMAを使っている場合。ELMでは会話はできません。)

whisperTo   ユーザ名   '会話内容'

自分のVESMAの仮想空間に戻るには「goHome」コマンドを使用して下さい。

VESMAで提供されているクラス

ac.hiu.j314.vesma.Room
ac.hiu.j314.vesma.Link
ac.hiu.j314.vesma.Exit
ac.hiu.j314.vesma.Note
ac.hiu.j314.vesma.Creature
ac.hiu.j314.vesma.Examination
ac.hiu.j314.vesma.VApplet
ac.hiu.j314.vesma.Media
ac.hiu.j314.vesma.Music
ac.hiu.j314.vesma.Scenshifter
ac.hiu.j314.vesma.WhiteBoard
ac.hiu.j314.vesma.Counter

ELM上でのプログラミング

ELMを使ってプログラムするとは、ELMの仮想空間の中で使 用できるオブジェクトを作っていくことになります。 最初のプログラムとして、定番のハローワールドをやってみましょう。

Hello Elm

ソースファイルを置く場所はどこでも良いのですが、とりあえず、 [Z:\semi\java\hello]あたりにHelloElm.javaを作って下さい。内容は以下の ようにします。

import ac.hiu.j314.elmve.*;

public class HelloElm extends RealElm {
    public void hello(Request r) {
        sendMessage(makeReply(r,"Hello Virtual World!"));
    }
}

コンパイル

ELM,VESMAのインストールが完璧ならば、コンパイルは簡単です。

コンパイル
javac   HelloElm.java

HelloElm.classができていれば成功です。

実行

実行は、ELMやVESMAの仮想空間内で行なうので、以下の手順をふむ必要があります。

VESMAを起動

最初にVESMAを起動します。このときVESMAを起動する時の場所が重要です。 HelloElm.classが置いてある場所で起動して下さい。でないとVESMAで HelloElmを読み込めません。具体的にはHelloElm.classが置いてある場所で、 vesma2.shを実行して下さい。

VESMAでHelloElmを生成する

VESMAでHelloElmを動かすためには、まず、VESMAの仮想空間内にHelloElmオブ ジェクトを生成します。次のコマンドを試して下さい。(VESMAのコマンドライ ンで。)

HelloElmの生成
cct   HelloElm
touch   hello   0.0   0.0

画面中央に「hello」というラベルが現れるはずです。ここで、ちょっと注意。 helloという名前はオブジェクト名で、実際には名前はなんでも良いです。で、 このhelloオブジェクトのクラス名がHelloElmということです。 これで、HelloElm実行の準備が整いました。

HelloElmを実行する

ELM,VESMA上でオブジェクトを動作させるには、そのオブジェクトにメッセー ジを送れば良いです。どのようなメッセージに応答するかは、そのオブジェク トの機能によります。HelloElmクラスのオブジェクトは「hello」というメッ セージに応答します。次のコマンドを入力してみて下さい。

コンパイル
##hello   hello

これはhelloというオブジェクト名のオブジェクトにhelloというメッセージを 送るコマンドです。上手くいけば、VESMAクライアントのメッセージ表示部に 「Hello Virtual World!」と出るはずです。

サンプル

日本語