2009年8月28日金曜日

Infernoのスタートアップスクリプト

スタートアップスクリプトはどこにあるのか?

1. /lib/sh/profile

ここにコードを置くと良いらしい。
acme-sacにはここに色々と書かれている。
ホストOSのファイルシステムのマウントも書かれていて参考になる。


wm/wm
とか書いておくと、emu起動時にwmが立ち上がる。

2. /usr/[user]/lib/profile

これも呼ばれるらしい?

3. emuの引数に追加する(hostedの場合)

emu /dis/sh -c 'スクリプト'

といった感じで、任意のコードを実行できるらしいが。

emu [コマンド]

もOK。例えばデーモンプログラムを実行するとか。
VMであることを意識せずに起動できる。

参考
http://osdir.com/ml/inferno.general/2005-02/msg00008.html

2009年8月8日土曜日

分散プログラミング

どう書く?のお題の分散関数呼び出しがちょうどぴったりだったので、
Limboで書いてみました。

分散関数呼び出し
http://ja.doukaku.org/comment/9449/

リンク先には説明を入れませんでしたが、次のような方針です

・サーバーでは仮想ファイル(synthetic file)を用意する。
 このファイルに対し、リードしたりライトすることで、処理を実行させることが出来る。
 (今回の例では数字をライトすると、整形した文字列がリードできる)

・クライアントではサーバーのファイルをマウントし、そのファイルに対し読み書きを行う。
 こうすることで、実際の演算はサーバー側で行われ、クライアントでは結果の収集のみが行える。

これは面白い。

ポイントは、
・#sをbindしなければならない。#sという特殊なシンボルをsynthetic fileを置こうとするディレクトリにbindする。
・sys->file2chanでsynthetic fileを生成する。
・file2chanは戻り値がFileIO型だが、そのread, writeというメソッドで、
 そのファイルに書き込みが行われたとき、あるいは読み込みが行われたときの
 処理を記述する。

その他わかったこと

・サーバーとクライアントの通信プロトコルはstyxと呼ばれ、mount サーバーホスト名 マウントポイント という処理を行えば、サーバーのネームスペースをクライアントの特定のディレクトリにマウントできるようだ。
・altというのはcaseと似ているが、数値ごとの処理わけを記述するのではなく、チャネルごとの処理わけを記述する。列挙したチャネルのどれかでイベントが発生したらブロックの中の処理に移行するが、それまでは待ち状態になる。(selectにあたる?)


alt{
<- channel1 =>
# channel1のイベントが発生した時の処理
<- channel2 =>
# channel2のイベントが発生したときの処理
}


Limbo/TkでGUIプログラムを書く場合、イベント待ちのループを書く必要があり(マウスのクリックとか)、その場合にaltを使うようだ。

・定数の記述はcon


変数名 : con 初期化データ;

2009年8月6日木曜日

Inferios

検索してもオフィシャルな情報が見つからなくてアレですが、
プレステ2のOSはInferiosというInfernoベースのものだという噂を目にしました。
そうだったのか。
CPUはMIPSらしい。ふーん。

PS3ってどうなんだろう。

分散プログラミング事始

Infernoは分散環境に強いと言われているのに、まったくやったことが無いのでした。

そこで、分散プログラミングを始めてみることにしました。
目標はリモートのプロセッサで任意のプログラムを実行し、実行結果を受け取るところに設定します。

参考としたのはこのURLです。

http://www.resc.rdg.ac.uk/twiki/bin/view/Resc/CallingRemoteServices

そのものずばりのことを示しています。
リモートで実行されているのか、ローカルで実行されているのかがよくわからなくなりそうなところを、うまく工夫されていてすばらしいです。

いまさら自分が追記するようなことは特に無いのですが、一応試したことを記録しておきます。

○まずはテスト

二台のinferno環境を用意し、ネットワークでつなぎます。
別のホストOSで動いているとわかりやすいです。
今回はリモートをLinux、ローカルをcygwinで実験しました。

・remote


svc/net
bind -a '#C' /


サービス立ち上げて、/cmdをバインド(ホストOSのコマンド実行のため)。

・local

bind -a '#C' /
mount [remoteホスト] /n/remote
bind -b /n/remote/cmd /cmd


mountでremoteホストにstyxで接続、remoteの/cmdを上書きで(?)バインド。
-bがポイント。

os uname を実行すると、remoteのOS名(Linux)が表示される!
なお、バインドする前はもちろんos unameを実行するとlocalのOS名(cygwin)が表示されます。

○file2chanの簡単なテスト

・remote

svc/net
cd /usr/user
load file2chan
file2chan oschan {} { os uname}


oschanという名前のsynthetic file ができるらしいが正直よくわからない。

echo rubbish > oschan
とかやると、remoteのOS名が表示される。
なんなんでしょうね?
(echoする文字列は別にrubbishじゃなくていいんですが)

・local

svc/net
mount remoteホスト /n/remote
cd /n/remote/usr/user


echo rubbish > oschan
とすると、remoteのプロンプトにremoteのos名が表示される。
不思議。

○limboでプログラミング

・・to be continued.

file2chanモジュールをロードしてごにょごにょするはず。

○疑問点

・いまだにunion directoryがよくわかっていない。

・bindを解除する方法は?

・認証を絡めるには?