Gikot FAQ

back

Last modified: Sat Sep 21 15:48:47 2002


1. Gikot っていったいなに?

正確には Gikot はアプリケーションではありません。 Gikot をひとことで表現すれば

ASCII Arts 達にアニメーションをさせるためのプラットフォーム
ということになるでしょうか。

もともとは、デスクトップ上に置いた ASCII Art (以下AA) 達に 何かアニメーションさせるソフトをつくりたいな、と思ったことが きっかけでした。けれども決まったアニメーションをさせるだけでは 面白くないし、かといって Flash のようなオーサリングソフトを 作るのは大変です。第一それらは UNIX 的ではありません。 せっかくアニメーションをさせるなら、それらを他の用途 (時計など) と 組み合わせたり、別のプロセスから呼び出したりして、有機的に 統合しなければ面白味がないでしょう。 そこで、簡単に組めるスクリプト言語をつかって、 手軽にアニメーションが実現できるような環境を作ろうと思ったのです。 それが Gikot の基本コンセプトです。


2. Gikot は最終的には何をめざしているの?

はっきりとはわかりません。ひどいことに作者自身でさえ Gikot を 何に使っていいのかよくわかっていないんです。 いまのところヘルプエージェントなどいくつかの 応用らしきものを考えてはいますが、 できるかどうかはなんとも言えません。またできたところで、 どれくらい需要があるのかもわかりません。 ただの 2ちゃんねらー用マスコットで終わるという可能性も十分あり得ます。

正直なところ、Gikot をただのアプリケーションとして使っても さほど面白くはないでしょう。むしろ Gikot は何かを「作る」という 行為自体を楽しむ人のためにつくりました。 似たような試みとして、Python を使って 3D グラフィックスを手軽に動かす Alice Project というのがあります。 これは完成したグラフィックスの品質よりも、むしろ手軽に 動かすというプログラミングの楽しみや教育に重点が 置かれています。それなら 2ちゃんねるの AA を題材にしてプログラミングを 楽しむという環境があってもいいと思ったのです。

エージェント同士の (ネットワーク透過な) 通信がサポートされれば、 もっと別のアイデアを形にする手助けにはなるかもしれません -- でもそれがなんであるか、はっきりとしたビジョンはありません。 「こういうことに使いたい」という意見があれば教えてください。


3. Gikot の原理について教えて。

Gikot システムはおもに 2つの種類のプログラムからなっています:

Gikot サーバ

Gikot サーバは ASCII Art 達が動きまわるための仮想世界を 提供し、それを実際の X ディスプレイ上に反映させるプログラムです。 これはクライアントからの要求を受けて 画面上の AA キャラクタ達 (Gikot では「エージェント (Agent)」と呼ばれる) を管理します。配布パッケージの中では worldserver および xgikot がこれに相当します。


図1. Gikot のアーキテクチャ

Gikot クライアント

もうひとつのプログラムは Gikot クライアントで、 これは Gikot サーバに指令を送って実際のアニメーションを制御するものです。 X11 を知っている方なら、これらは X サーバおよびクライアントと 同じ関係だといえばわかってもらえるでしょう。 gbiffgclock がこれに相当します。

Gikot はクライアント-サーバ間の通信プロトコルとして CORBA を使っています。画面上に表示される独立した (X 的に別々のトップレベルウインドウをもつ) エージェントは、 それぞれが Gikot サーバ内で一個の CORBA オブジェクトとして 表されます。Gikot クライアントはこれらのオブジェクトに対して 独立にメソッドを呼びだすことができます。

現在、Gikot はサーバ・クライアントともに Python と ORBit を 使って書かれています (さらに Gikot サーバは ORB を担当する Python プログラム worldserver と X11 の表示を担当する C プログラム xgikot に分かれています)。 しかし CORBA は言語に依存しないプロトコルであるため、 これとは別の言語を使ってクライアントを実装することも可能です (Gikotパッケージ中の IDL ファイルを見てください)。 また、CORBA では IIOP を使うことにより ネットワーク経由でもエージェントを制御することができます。


4. CORBA ってなに? IIOP って?

CORBA は 分散オブジェクト指向プログラミングを実現するための枠組みのひとつです。 CORBA はようするにリモートプロシージャ呼び出し (RPC) の発展形です。 CORBA を使うと、異なるプロセスのオブジェクトに対して (たとえそのプロセスがネットワーク上の別のホストで動いていても) メッセージを送ることができます。

最初のきっかけは、Gikot をつくったさいに、 エージェントをいろいろなプロセスから遠隔操作させたいと思ったことでした。 そのためには、エージェントに外部から なんらかのコマンドを送ってやる必要があります。伝統的な方法では、 UNIX の IPC を使うか、TCP/IP を使うのが一般的です。しかし、 このためには独自のプロトコルをゼロから設計しなければいけないし、 セッション管理なども厄介です。

Gikot では、ひとつのエージェントがひとつの CORBA オブジェクトに なっており、これらのオブジェクトは Gikot サーバで管理されています。 アニメーションをおこなう Gikot クライアントは、このサーバと 通信して各エージェントへの参照 (IOR) を取得したのち、コマンドを 送ることができます。また、CORBA は IIOP と呼ばれる 通信プロトコルを使うことができ、これは TCP/IP 経由で ネットワーク透過な (オブジェクトが異なるホスト上にあっても意識せずに使える) メソッド呼び出しを可能にします。

作者はまえまえから CORBA には興味がありましたが、 実際に使ってみる機会はありませんでした。Gikot は CORBA の 勉強がてらこしらえたものです。多くの技術がそうであるように、 CORBA もまた実際に使ってみることで理解がずっと容易になる技術の ひとつです。Gikot では CORBA オブジェクトが実際の画面上の オブジェクトと 1対1で対応しています。そういった意味では、 これは CORBA を勉強する人の教材にもなるかもしれません。 また、現在はまだサポートしていませんが、エージェント間の 通信ができるようになれば並列分散プログラミングの演習にもなり得ます。 アニメーションというのは結果が見えやすいので、 並列プログラミングの課題としては適切でしょう。


5. IOR ってなに?

IOR (Interoperable Object Reference) とは、 CORBA オブジェクトへの参照を表したものです。 これは "IOR: …" ではじまる 200バイト程度の文字列です。 ここには通信に使うプロトコルや、ネットワーク上のサーバの位置などの 情報が格納されています。Gikot では、クライアントは エージェントにアクセスするのにまず仮想世界全体をあらわす オブジェクト (GWorld オブジェクト) への IOR を入手することが必要です。 ふつうこれは、/tmp/gikot-ior というファイルに 格納されています。ただし当然これは同一のホストからしか見えないので、 ネットワーク経由でクライアントを使う場合は、何らかの方法で リモートホストの IOR を取得する必要があります。

6. なぜに Python?

単に Python が好きだから。また、Orbit-Python が非常に簡単に 使える CORBA とのインターフェイスだったからということもあります。 また X11版「何か。」である ninix が Python を使っていたから ということもあります。とくに技術的に参考にしたわけではないのですが、 Python にはこの手の可能性もあるということを示した点で ninix は称賛に値すると思います。


7. リモートホストからエージェントを動かすにはどうすればいいの?

Gikot クライアントは、起動時に GWorld オブジェクトへの IOR をオプションとして取ることができます (デフォルトではこれは /tmp/gikot-ior というファイルに 格納されていると想定しています)。これを変更すれば ネットワーク上のエージェントを操作することが可能です。

まず、~/.orbitrc というファイルを作り、 以下のような内容のテキストを追加します:

ORBIIOPIPv4=1

この後 Gikot サーバ worldserver を起動すると、 サーバは IIOP を使用するようになり、IIOP 用のポートが bind されます。このさい --ior オプションに ファイル名を指定すると IOR を /tmp/gikot-ior 以外のファイルに出力できるので (ファイル名として - を 指定すると標準出力)、これを何らかの方法でクライアント側のホストに 送ってください。

クライアント側では、Gikot クライアントを起動するときに 入手した IOR ファイルへのパスを --ior オプションに 与えます (IOR 文字列をそのまま与えることもできます)。 これでクライアントは指定された IOR のホストにある エージェントを動かします。リモートホストに IOR を渡すための 手軽な方法はまだ存在しません。これは今後の課題です。

セキュリティ上の注意: IIOP は、不特定番号のポートを bind します。 エージェントには IOR の情報がなければアクセスできないはずなので、 おそらく IOR さえ他人に漏れなければこのポートが濫用されることは ないでしょう (ただし、ORBit のセキュリティがどれほどのものかは不明です)。 IIOP が bind するポートを固定できれば SSH のポート転送などを 使って暗号化する手もあるでしょうが、 いまのところ IIOP が使うポート番号を指定することはできないようです (なんらかの原因により ORBit の ORBIPv4PORT オプションが作動しない)。


8. エラーが出て起動しない。

worldserver のエラー

ImportError: No module named Gikot
Orbit-Python が IDL ファイルをモジュールとしてロードできていません。 環境変数 IDLPATH が正しくセットされていないのが 原因です。
ImportError: No module named ...
モジュールが見つかりません。 Orbit-Python がインストールされていないか、 環境変数 PYTHONPATH が正しくセットされていないのが 原因です。
worldserver: set the environment GIKOT_DIR.
環境変数 PYTHONPATH が正しくセットされていません。
Gikot.InternalError: User exception with no menbers
xgikot が存在しないか、あるいは予期せず終了したことを意味します。 worldserver は $GIKOT_DIR/lib/xgikot/xgikot を実行しようとします。
IOError: [Errno 13] Permission denied: '/tmp/gikot-ior'
IOR ファイルを作るパーミッションがありません。 誰かほかの人が同一ホストで Gikot サーバをすでに 起動していることが原因です。--ior オプションを 使って、別の場所に IOR ファイルを作ってください。

Gikot クライアントのエラー

ImportError: No module named Gikot
Orbit-Python が IDL ファイルをモジュールとしてロードできていません。 環境変数 IDLPATH が正しくセットされていないのが 原因です。
ImportError: No module named ...
モジュールが見つかりません。 Orbit-Python がインストールされていないか、 環境変数 PYTHONPATH が正しくセットされていないのが 原因です。
IOError: [Errno 2] No such file or directory: '/tmp/gikot-ior' または
IOError: [Errno 13] Permission denied: '/tmp/gikot-ior'
IOR ファイルが見つからないか、パーミッションがありません。 Gikot サーバが起動していないか、別の場所に IOR ファイルを 作っているのが原因です。
CORBA.COMM_FAILURE: Minor: 0, Completed: CORBA_COMPLETED_NO.
Gikot サーバに接続できません。 Orbit-Python がインストールされていないか、 環境変数 PYTHONPATH が正しくセットされていないのが 原因です。

9. ウインドウがおかしくなるんだけど…

Gikot はその性質上、ウインドウのタイプを特殊な形 (OverrideRedirect) にしています。 これは一部のウインドウマネージャによっては正しく扱えないことがあります。 そのようなときは worldserver の --windowmode を 変えてみてください。

(ここらへんについてはまだ別の環境でのテストが十分でないので 要改訂)