2009年11月14日土曜日

停滞中

いろいろイベントとかあって停滞中(いいわけ)。

が、そろそろメインテーマである組み込みとinfernoに復帰しないとね。

Googleが発表したGo言語ですが、Limboと似ていると各所で
言われています。
できればLimboそのものを使ってくれたらありがたかったのですが、
そうもいかなかったようで。
Go ←→ Limboのフロントエンドがあるといいなぁ。

Hello Worldを試しただけなのでどんなものかはまだわかっていないのですが、
セミコロンが省略されたりが怪しい感じ。

時間を見てLimboとの違いをまとめて行きたい。
(wikiが必要かなぁ…)

2009年10月14日水曜日

BeagleBoard 挫折

ひょんなことからBeagleBoardというARMの開発基板を使わせてもらうことになりました。

http://beagleboard.org/

小さいけどARM Corex-A8と、なかなか高性能(らしい)。

まずはLinuxを入れてみました。
方法については割愛。

・Angstroom

軽量のLinuxだそうです。
なんとなく動きました。
バイナリのカーネルを持ってきて、ルートファイルシステムも
できあいのものなので、そんなに難しくなさそう。

・Debian

こちらは、できあいのルートファイルシステムが見つけられず、
インストーラーを起動しなければならないようです。

結局うまくいっていないのですが。

やり方は2通り。

1.PCをネットワークアダプタに見せて、実機上でネットワークインストール

2.PC上でQEMUを立ち上げ、それを実機のエミュレーターとし、PCに取り付けたSDカードにネットワークインストール

どちらもなかなか興味深い手法です。
なんとなく今風な感じがします。

どちらの方法も試したのですが、

1:途中でネットワークがおかしくなる

2:あまりに時間がかかる(ひょっとしたら途中で止まっちゃった?それすらわからず)

と、しょんぼりな結果です。
一昔前のノートPCでやったのがまずかったのかも。

早いマシンがあればうまく行くんだろうか?
先輩にインストール済みのイメージをもらうのが早そうだ・・・

Linuxはさっさとあきらめて、Infernoに行くのも一考。

2009年10月2日金曜日

Inferno on Armadillo Linux 挫折

先日休暇をとりました。
暇な時間にArmadilloでInfernoでも動かすか、と
Arm-linux用のemuを動かそうとしてみました。

結果は失敗でしたが。

CFがなかったので、RAMディスクにemuのバイナリを置こうとしたら
容量不足・・・

いろいろ消して再度挑戦するも、起動せず。

面倒になって、バイナリ配布のものではなく自分で作ろうとしたが、
gccが落ちたり。

半端な気持ちでやっても成果は出ないですね。

次から本気出す。

2009年9月13日日曜日

ktrans移植難航

plan9の日本語入力環境のktransをlimboに移植しようかなー、と軽く考えてました。
元のktransはkenのccで書かれている。
おそらく実用的なレベルに達していると思われ、skk方式となっている。

辞書をハッシュテーブルに格納しているようなので、limboで書き直してみたところ、、、
うーん、どう書いていいかわからない。
リストにどんどん突っ込んでいったら、メモリがあふれたのか、segvで落ちた・・・
さて、どうしたものか。

アドレスをダンプできないから、具体的なメモリ配置がよくわからないのがつらいところ。


以下情報源。

・ktrans配布元

http://basalt.cias.osakafu-u.ac.jp/plan9/s39.html

・ktrans辞書配布元

http://basalt.cias.osakafu-u.ac.jp/plan9/s17.html


・SKK辞書をktrans用に変換する方法

http://plan9er.hp.infoseek.co.jp/plan9/9log.html

・acme-sacにはktrans.bが付属している(日本語非対応)

http://code.google.com/p/acme-sac/

戯れにktrans.bをちょっと書き換えて、ローマ字→ひらがな
変換を試してみた。

漢字変換を早く実現したい。

なお、acme-sac付属のktrans.bをwindows xp上のhosted infernoに
持ってくることは可能だった。
一時ファイル/n/tempがなぜかcreate出来なかったので、
ひとまず一時ファイル名を書き換え(ソース埋め込み)。

使い方は、wm/wm起動前に、

% pipefile -r ktrans /dev/keyboard


として、キーボード入力にフィルターとして追加する。
(起動時設定をしたい場合は、先日の日記にあるように、profileに処理を書いておく)

※acme-sacはinfernoを学ぶ上で避けて通れないな。

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を解除する方法は?

・認証を絡めるには?

2009年7月22日水曜日

meadow + alpaca.elのインストール

ご無沙汰です。
忙しくなりInfernoの研究は止まった状態です。
そろそろ再開の予定ではあります。
それまでinfernoに関係ない話題でつないでいこうかと思います。

alpaca.elという便利ソフトがあります。
.gpgという拡張子のファイルをpgp暗号化されているものと見なし、
ファイルを開くときに復号、保存のときに暗号するソフトです。
えらく便利。
各種ウェブサイトのログインパスワードの保存とかに使っています。

windows上でmeadow + alpaca.elする場合、なかなかインストールが面倒なので、
手順をまとめたいと思います。

1. cygwin, meadowのインストール

省略。
meadowはmeadowメモさんのパッケージがよさげです。
(http://www.bookshelf.jp/soft/meadow_8.html)

2. gpgのインストール

gpgのオフィシャルページからソースコードを持ってきてビルドします。
1.4系列のソースでなければならないようです。

tar jxvf gpg-1.4.x.bz2
cd gpg-1.4.x
./configure
make
make install

でOK。
(※configureのとき、--disable-nlsを付けろという記述がmeadowのwikiにアッたので、付けた方が良いかもしれません)

3. fakecygpty.exeのインストール

www.meadow.orgではmeadowのソースツリーのリポジトリを閲覧できます。
trunk/nt/fakecygpty.c
というソースコードを持ってきて、ビルドします。
gcc fakecygpty.c でOK(a.exeという名前のプログラムが生成)。
ファイル名が大事で、f_gpg.exeとしなければいけません。
a.exeをf_gpg.exeにリネームし、gpg.exeと同じところに置きます。
f_gpg.exeにパスを通し、meadowから実行できるようにしておきます。

gcc fakecygpty.c
cp a.exe /usr/local/bin/f_gpg.exe

4. alpaca.elのインストール

http://www.mew.org/~kazu/proj/cipher/en/
にalpaca.elがあるようです。
alpaca.elをダウンロードし、
meadowのインストールディレクトリの下のsite-lispの
中にコピーします。

5. meadowの設定

.emacsに
(autoload 'alpaca-after-find-file "alpaca" nil t)
(add-hook 'find-file-hooks 'alpaca-after-find-file)
(setq alpaca-program "f_gpg.exe")
と書きます。

以上。
あとは、拡張子.gpgのファイルをmeadowで新規に開いて編集し、
保存したらパスワードを聞かれることを確認します。

2009年4月12日日曜日

Limbo でパイプを扱う

どう書く.org
http://ja.doukaku.org/127/
指定コマンドを別プロセスで起動

を考えてみました。
以前の投稿
http://inferno-hell.blogspot.com/2009/03/blog-post.html
をベースにしてみました。

パイプでのやり取りが難しく、結局C言語(posix)っぽくなりました。
明示的にパイプをクローズするのが簡単にはできないようではまりました。

以下コードです。
インデントがうまくいかなく、みづらいので、
気になる方はどう書く.orgの方の参照お願いします。
http://ja.doukaku.org/comment/8800/


implement d127;

include "sys.m";
sys: Sys;
include "draw.m";
include "sh.m";
sh: Sh;

d127: module{
init: fn(ctx: ref Draw->Context, argv: list of string);
};

init (ctx: ref Draw->Context, argv: list of string)
{
sys = load Sys Sys->PATH;
sh = load Sh Sh->PATH;
buf := array[64] of byte;
fds := array[2] of ref Sys->FD;

argv = tl argv;
if(argv == nil){
return;
}
cmd := hd argv;

sys->pipe(fds); # open pipes
spawn child(ctx, fds[0], cmd);

# Read results of child process
n: int;
fds[0] = nil;
fdd := sys->open("/dev/cons", sys->OWRITE);
for(;;){
n = sys->read(fds[1], buf, len buf);
if(n == 0){
break;
}

# print result
sys->fprint(fdd, "%s", string buf[0:n]);
}
}

child (ctx: ref Draw->Context, fd: ref Sys->FD, cmd: string)
{
# duplicate stdout to the pipe
sys->dup(fd.fd, 1);

sh->system(ctx, cmd);

# pipe close
fdn := sys->open("/dev/null", sys->OWRITE);
sys->dup(fdn.fd, 1);
fd = nil;
}


ポイントはパイプをオープンして片方を子プロセスに渡すということと、
処理終了後になんとかパイプをクローズしているところです。

ファイルやパイプをクローズするにはcloseというシステムコールはなく、
どこからも参照しなくならないようにしなければなりません。
なので、三カ所で無理矢理パイプの参照を切っています。

1. 親プロセスの中、子プロセス呼び出し後、ファイルデスクリプタにnil代入
2. 子プロセスで、stdoutをパイプではなく、/dev/nullに
3. 子プロセスで、ファイルデスクリプタにnil代入

2009年4月10日金曜日

acmeでメールの受信(未完)

OSを日常利用するのに、ブラウザとメールと日本語入力は必須です。
ブラウザはcharonがあるので良いのですが、メールをなんとかして読みたいところです。

acmeでメールを読めるというのは聞いていたのですが、実際に試したことはありません。
そこでやってみました。

Windows上のacme-sacを利用しました。
acme-sacというのはInfernoを立ち上げなくてもネイティブっぽく動くacmeです。
やっていることはVMっぽいですが。

1. サーバーの設定

/lib/ndb/localを開き、pop3= にpopサーバーを指定します。
これはドメイン名そのままでよく、!等はいらないようです。

2. ユーザー名の設定

メールアカウントの設定はよくわからなかったので、
メールアカウントとInfernoのログインユーザをあわせました。

3. acme起動、空のウィンドウを開く

acmeを起動し、Newを中クリックすると空のウィンドウが開きます。

4. Mailpop3起動

Mailpop3と打ち込んで、中クリックします。
すると、別のウィンドウでpassword: と聞かれます。

5. メール受信

パスワードを打ち込むとメールの受信が始まります。

6. でもエラー

しかし、malformed headerとか言われてしまいます。
どうやらメッセージの読み込み処理で例外が発生しているようです。

どこで失敗しているか追わなければなりません。


メール送信はMailでいいのかな?
新規ウィンドウでMailと打ち込んで中クリックすると
それっぽい画面になるのだが、put mailをクリックしても無反応。

その後いろいろいじって(結局だめ)想像だが、
メール作成画面→put mailをクリック→メール一覧画面→postクリック→送信
といった流れではないだろうか。
返信機能もあるっぽい。

2009年4月4日土曜日

Plan9界隈に盛り上がりが

Google Summer of Codeの季節のようで、plan9関連のブログの書き込みが活発に
なりました。
もちろんテーマ案にはInfernoも含まれており、Infernoで何か面白い
成果が出るのを期待しています。

なかなか時間が取れず細々としか活動していないのですが、
現状報告と今後の予定をメモしておきます。
決意表明することでモチベーションをあげるねらいがあります。

○現状

・Infernoで日本語

Infernoで日本語の入力を考えます。
キーボードデバイスをフックして、変換プログラムをはさむとできそうです。
まずはanthy, poboxについて調査中です。
limboからのパイプの使い方も学習中です(前回の書き込みが該当します)。

・ARMでInferno

armadillo実機へのポーティングは原因不明のエラーで頓挫中です。
qemuへ開発プラットフォームを移そうと、現在qemuのインストール中です。
qemuを使えばデバッガが使えるのでもう少し作業が進むかもしれません。

・Infernoの学習

ウェブ、書籍での学習も開始しました。
- vita nuovaのサイト
- 各種日本語ブログ
- Inferno programmer's notebook
- principles of Operating systems (買っちゃった)

・日常利用

まずはacmeをなるべく利用すべく、チャンスがあれば使っています。

○今後

・Infernoで日本語入力

まずはホストOSの変換サーバーを利用して日本語入力を実装。
ゆくゆくは実機でサーバーも動かしたい。
組み込みという用途を考えるとpoboxがよいのではないだろうか。
ソフトウェアキーボードでの入力も考える。
limboでのサーバー実装を考えるとなかなか作業量はありそう。

・ARMでinferno

qemuで動かし、armadilloでのエラーの原因究明を行う。
ゆくゆくはもうひとつarmボードがあるのでそちらにもポーティングしたい。
タッチパネルつきのえらくリッチなボードを借りたので
なにか成果を出したいところ。

・学習

継続

2009年3月25日水曜日

外部コマンドを実行し、その実行結果をパイプで受け取る方法

早い話が、perlで、open("command |");というのをLimiboでやりたいのです。
ネットで調べてもずばりの情報が無く試行錯誤しました。
間違っているかもしれませんが、とりあえず現時点での解を示したいと思います。

なお、どう書く.orgにもタイムリーなお題が出ていたので、投稿しておきました。
http://ja.doukaku.org/242/

まずは外部コマンドの呼び出しです。
*.disをモジュールとしてロードしinitを呼ぶ、というのがよくある方法のようです。

hdl := Command "/dis/ls.dis"; # ls の例

その後、

hdl->init(ctx, nil); # ctxはメイン関数の第一引数を渡せばよい、第二引数はコマンドの引数リスト

としてやればコマンドが実行される。

spawn hdl->init(ctx, args);

といった感じで別プロセスでの実行も出来るようだ。

この方法とは別に、Shのsystemメソッドを使う方法もある。

sh := load Sys Sys->PATH;
sh->system(ctx, "command");

とするだけでよさそう。簡単。

次にどちらの方法でも良いが、立ち上げた外部プロセスとのパイプライン通信を考える。

Sys->pipeメソッドを使うとパイプからオープン済みのファイルデスクリプタが取得できる。
つまり、標準入出力をファイルI/Oに置き換えることが可能。

fds := array[2] of ref Sys->FD;
sys->pipe(fds);

とすると、fdsという配列が得られ、2つのパイプが得られる。
fds[0]に書き込むとfds[1]からそのデータが読まれ、
fds[1]に書き込むとfds[0]からそのデータが読めるようだ。

なので、外部プロセス実行前に標準出力をどちらかのパイプに結び付けてやり、
もう一方のパイプから読み出せば外部プロセスの出力結果が得られる。
それにはSys->dupを使用する。
Sys->dupの第一引数は結びつけるファイルデスクリプタ、第二引数は結びつける標準入出力の番号(0: stdin, 1: stdout, 2: stderr)。

以上をコードにすると、

sys = load Sys Sys->PATH; # sysのロード
c := load Command "/dis/ls.dis"; # 外部コマンドのロード

fds := array[2] of ref Sys->FD;
sys->pipe(fds); # パイプの取得

sys->dup(fds[0].fd, 1); # パイプ0に標準出力を出す

spawn c->init(ctx, nil); # コマンド実行


buf := array[64] of byte;
n := sys->read(fds[1], buf, len buf); # パイプ1から読み込むとコマンドの出力が得られる



上記コードはエラー処理がまったく入っていないのでよろしくない。

2009年3月21日土曜日

SSHを試みるも失敗

limboでのSSHの実装があるそうです。
http://www.ueber.net/code/r/ssh

コンパイルは問題なさそう。

が、実行に失敗しました。
まずはsshkeysとかいうファイルがないとかで失敗。

ソースをいじってサーバー認証をスキップしたところ、
nousernameという別のエラー。

どこかに認証情報を書いておかなければならないのかも。

とりあえず保留。

2009年3月19日木曜日

JIT

InfernoはJITに対応しているそうです。
just in timeコンパイル。
中間コードを解釈しながら実行するのではなく、起動時にコンパイルして
実行するもの(間違ってたらすみません)。

Infernoも対応していると各所で書かれているのですが、はて?どう使うものか。

で、調べたところ、おそらく次の手順でいけるはず。
実行時に切り替えられるっぽい。

echo 1 > /dev/jit

とするとON。

echo 0 > /dev/jit

とするとOFF。簡単。
現在の状態を見たければ、
cat /dev/jit

これであっているか確証は無いのですが、
ちょっと動作速度を計ってみました。

OFFのとき
; echo 0 > /dev/jit
; time ls
0.002l 0.031r 0.033t

ONのとき
; echo 1 > /dev/jit
; time ls
0.004l 0.027r 0.031t

ONにするとLoad Timeが増えて、Real Timeが減る。
で、この条件ではTotal Timeは減る。
なんかそれっぽく動いてますね。

/dev/jitに関するソースコードを見ようと思ったのですが、見つからず。
あれ?

2009年3月15日日曜日

macでinferno

mac osxでinfernoを動かしてみて分かったことを。

・インストール
どうやってインストールしたか忘れた。
オフィシャルサイトからツリーを持ってきて、osx 用のバイナリパッケージを
加えたんだったかも。
google codeから持っていった方が良いと思う。

・カーネルビルド
セルフコンパイルはまだやっていない。やるべし。
クロスコンパイルは特にハマった点はなし。

・wm/wm

マウスボタンが一つしかないのでタッチパッドでacmeは無理かと思いましたが、いけそうです。

左クリック: 普通にクリック
中クリック: option+クリック
右クリック: 指2本でクリック(OSの機能だと思うが)

ちなみにUSBスクロールマウスは普通に3ボタンマウスとして使えました。

Infernoでリモートのファイルシステムをマウント

懸案だったファイルシステムのマウントです。
listen, mountを使った方法はなにげにできていましたが、
認証を利用した方法はできていませんでした。

参考にしたサイトは
http://my.opera.com/csant/blog/show.dml/152654
です。
このページによると、インストールドキュメントに書いてあるとのこと。
まさかそんな所に情報があるとは。

・目的
リモートのInferno(serverとする)のファイルシステムを認証付きで
もう一方のInferno(clientとする)にマウントする。

・手順

- サーバー初回のみ

認証用のパスワード作成
% auth/createsignerkey [名前]
※名前、は何かのIDのようだが、なんなんでしょう。ユーザー名っぽいのをいれてみたが。

認証サービス起動?
% svc/auth
初回でキーを設定するようなので、任意のパスワードを入力

ユーザー作成
% auth/changelogin ユーザー
secretには秘密のパスワードを設定。
expiresには有効期限を。
※expireの書き込みでエラーが発生。無理やり回避した(後述)。

サーバーキー作成
% getauthinfo default
signer: localhost
user: ユーザー名
password: パスワード。たぶんさっきのsecret
save in file: yes

- サーバー運用時

ネットワークサービス起動
% svc/net

認証サービス起動
% svc/auth
初回の時に設定したキーを入力するはず

- クライアント毎回

謎の処理(たぶん接続する時に必須のサービス起動)
% ndb/cs

認証
% getauthinfo tcp!サーバーのIP
signer: サーバーのIP
user: ユーザー
password: secret
save in file: yes (保存すると次回からgetauthinfoしなくて良さそう)

マウント
% mount tcp!サーバーのIP /n/remote
tcp!いらないみたい。

・バッドノウハウ

先ほどの、changeloginでexpireが書き込めない件、力業で乗り切った。

手順
auth/changelogin ユーザー
expiresにpermanentを指定して、とりあえず正常終了させる
 (ただし、expireの書き込みには失敗)

/mnt/keys/ユーザー/expireに適当な数値文字列を書き保存

もう一度auth/changelogin ユーザー
expiresで正しいexpireを指定。たぶん正しい数値がファイルにかかれるはず。

2009年3月11日水曜日

Limboでネットワークプログラミング

なさけないことにARM上でinfernoは未だ挫折中です。
気分を変えてlimboでプログラミングをすることにしました。

ネットワークプログラミングの基本を学びました。
TCPソケット通信のやり方がなんとなく分かりましたので、公開します。

ネットで調べてもいまいちよく分からなかった所ですが、
httpdのソースを見ることでなんとなく分かりました。
付属のソースを取っ掛かりにするのはおすすめです。

以下ソースコードです。
これは、tcp通信のスループットを測るためのソフトを意図しています。
ttcpという既存のソフトウェアとの相互通信ができ、
ゆくゆくは完全互換のソフトになるのが目標です。
まだ作りかけですが、tcpでセッションを張り、データの受信はできています。

やってることは、
1. announce (ポートのopen?select?)
2. listen (着信待ち)
3. remoteのopen、read (相手のIPアドレス、ポートの取得、必須ではない)
4. dataのopen、read (データ受信)
です。

実行
- Inferno
このソフトを起動すると、待ち状態になるのでそのまま放置。

- 通信相手(Windowsとかunixとか)
ttcp またはwsttcp(Windows)を持ってきて
ttcp -t [InfernoのIPアドレス]
とする

こうすると通信相手からInfernoに対してtcpのセッションを張り、
データの通信が行われます。


# usage: ttcp [-t|-r]
# -t: send (not implemented)
# -r: receive

implement ttcp;

include "sys.m";
include "draw.m";

sys: Sys;

ttcp: module{
init: fn(ctx: ref Draw->Context, argv: list of string);
};

init(ctx: ref Draw->Context, argv: list of string)
{
buf :=array[64] of byte;

sys = load Sys Sys->PATH;

(ok, c):=sys->announce("tcp!*!5001");

if(ok < 0){
exit;
}

(ok2, nc):=sys->listen(c);

if(ok2 < 0){
exit;
}

l:=sys->open(nc.dir+"/remote", sys->OREAD);
n:=sys->read(l, buf, len buf);

sys->print("%s", string buf[0:n]);

b:=sys->open(nc.dir+"/data", sys->OREAD);
n=sys->read(b, buf, len buf);
sys->print("%s", string buf[0:n]);
}

※書きかけかつ詳細を理解していないので正直よろしくないコードです。
 各関数の意味を調べた上で書き直す予定ですのでご容赦を。


いい感じです。
直感的に書けるのでバグになりにくいかもしれませんね。
複数セッションをサポートする場合はスレッドを作りチャンネルでセッション情報を
渡せば良いのかもしれません。

ソースコード共有サイト(なのかな?)どう書く.org で細々とコードを書いているのですが、
最近あるブログにて私のエントリーを引用していただきました。
結構緊張しますが、励みにもなります。
どう書く.orgを勝手に自分用のコード置き場にしてしまっていましたが(テンプレート代わりに自分の投稿を使ってたりします。雛形を覚えられないのです。)、
少しは他の方の役に立てればうれしいです。

・今後の予定
ttcpを完成させ、スループットを評価する
グリッドコンピューティングを試してみる

2009年3月7日土曜日

audioについて

armadilloへのポーティングはタイマー割り込みが入るところまではいけましたが、
その際のプリエンプション処理でおかしくなるらしく、頓挫中です。へこむー

audioについて試してみました。
どうやらon MAC, on Linuxではaudioデバイスをサポートしていないようで、
on Windows, on FreeBSD では試せそうです。

emu/の下に各ホストOS用のemuのソースがありますが、
audio.cがあり、かつemuファイルに/dev/audioをサポートする旨書かれているのは
Win, BSDのみでした。
BSDがいけるならOSXにもポーティングできないものか?

それはさておき、Inferno日記を参考に、音を出してみました。
Windows XP上のemuで試しました。

(参考: http://www.ntl.co.jp/2/product/inferno/beginners/008.html いつもお世話になっております)

・オーディオデバイスのバインド

bind -a '#A' /dev

とすると/dev/audio, /dev/audioctlが現れました。
bindの意味はよくわかっていませんが。

・データの用意

付属のプレーヤーではwavファイルそのままでは再生できず、変換の必要があるそうです。
/appl/cmdに変換プログラムのソースがあるようで
cd /appl/cmd
limbo wav2iaf.b
として、生成したwav2iaf.disをどっかにコピー。
ひとまず/tmpにコピーしておいた。

wavを/tmpにおいて
wav2iaf test.wav > test.iaf
などと変換。
wavファイルはCDからEACというソフトで取り出しました。
EACおすすめ。CCCDもいける。

・再生
auplay test.iaf
とすると音が鳴りました。すばらしい!

ちなみにテスト音源はTOTOのFalling in Between。なかなか良い。

2009年1月16日金曜日

[misc]OLPCでinferno

InfernoをOLPCで動かしているプロジェクトがあるらしい
http://wiki.laptop.org/go/Inferno

OLPCというのはOL用のPCではなく、新興国の子供に安価なPCを行き渡らせるプロジェクト、、、なのかな?
旬を過ぎた話題ですが。

Infernoが動き、GUIも動いているっぽいです。
こんなコンピューターが子供のうちに使えるというのはなんかうらやましいなぁ。

Infernoの利点としては、
・動作が軽いのでスペックの低いマシンでも動く
・プログラミング言語の素性が良い、のかな
・ネットワークプログラミングがしやすい?
といったところか。

学習用であれば、マイナーOSであるのも許容範囲かも。

今ならNetbookでinfernoなんて旬かもしれない。

2009年1月15日木曜日

[arm]エミュレーター環境

Armadilloを動かす前に、ARMのエミュレーション環境で動かしてみました。

・QEMU
ARM用のQEMUをちょっと試してみました。
さくっとLinuxが動くのがすごい。

結局Inferno起動にはいたらず。

QEMUのエミュレーション環境のUARTについては
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0183aj/
が相当する。
UARTのベースアドレスは0x16000000、0x17000000
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0159b/I1035564.html

もう使うことはないとは思うが、一応メモ。

・Inferno-DS

Nintendo DSでInfernoを動かす試みがあるらしい。
http://code.google.com/p/inferno-ds/

とあるDSのエミュレーターで動かしてみたところ、起動したっぽい。

いいじゃん、と思ったが、
 ・キーボードが無いので、シェルとかどうすんの?
 ・そもそも任意のROMを起動するのはまずかろう
という理由から、実機で試すのは止めました。
DSで分散環境って夢があっていいんだけど。

2009年1月14日水曜日

[acme]ACMEに慣れ親しむ

InfernoではEmacsは永久にサポートされないので、
(http://plan9.bell-labs.com/magic/man2html/1/emacs)
ACMEなるエディタに慣れ親しむのが良いかと思います。

起動して途方にくれるのはvi, Emacs以来ですね。

とてもすばらしいチュートリアルがあります。
http://d.hatena.ne.jp/oraccha/20080228/1204158985

動画でつかいかたを教えてくれます。
これを見ると中央ボタンが必須っぽいですね。
まあコントロール+右クリックでもそれほど苦痛ではないですが。

ACMEを移植したプロジェクトもあるようです。
http://www.caerwyn.com/acme/

Windowsで動作を確認しました。
マウスホイールが使えるのが便利(だけどなれちゃうとInfernoのときにいらいらするかも)。

フォントを選べば日本語も表示できます。
Infernoからfont以下を持ってきて、acmeのfontにコピー。
acmeの起動オプションで
acme -f /font/misc..... (なんかunicodeっぽい名前のフォントのパス)
とするとOK。
ただ,acmeをインストールしたところがルートになるっぽいので、厄介です。
常用するには気合が必要。

[arm]Inferno on Armadillo

Armadilloの上でInfernoを動かす試みをしているところです。
まだなんとなくシェルが動いたところまでしか実現できていませんが、やったことをメモしていきたいと思います。

・環境

Armadillo
http://armadillo.atmark-techno.com/armadillo
ARM720Tの開発ボード
CF, Ethernet、AD、IO等がある。

クロス開発用のPCはLinux(Fedoracore3(あれ?6だったか?))
WindowsではいまいちビルドがうまくいかないのでLinuxで行った。

※一番良いのはPlan9かも知れないが、まだネイティブなPlan9環境は構築できていない。

・開発概要

ブートローダーはもともとArmadilloに入っているものを使用する。
本来はLinux用だが、gzipを展開してジャンプするだけなので、そのまま利用できる。

開発のベースはEvaluator7tという評価基板用のものを利用する。
これは、Infernoのツリーの、
os/ks32
にある。

※Evaluator7tというのが何者なのか、調べてもいまいち良くわからない。
 どうやらそれほど多機能なボードではなさそう・・・

・ファームウェアダウンロード方法

Armadilloの取り扱い説明書を参照。
ジャンパJP1をONにしてやるとシリアルからプログラムをダウンロードできる。
専用のダウンローダー(hermit)があるので、それを利用。
0x00010000に書き込む。
正確なコマンドラインは後ほど。

ジャンパJP1をOFFにして再起動すると、Flashの0x00010000にあるgzipファイルを
SDRAMの0xc0028000に展開する。
0xc0028000がリセットベクタにあたるので、そこに書かれているアドレスにジャンプする。

・ファームウェア作成のポイント

ファームウェアの改変ポイントは
  • uartドライバ作成
  • mkfileを編集し、ヘッダなしのgzipファイルとしてファームウェアが生成するようにする
  • MMUの設定
  • 割り込みベクタの書き方を変更
  • ルートファイルシステムを修正
  • プログラムをロードするアドレスの変更
作業詳細は次回以降。なぜなら、ブログを書いているPCと開発PCが別なので参照しづらいため。

・現状
シェルが起動する。
自分で作ったhelloworld が起動することを確認。
システムクロックが働いていないようで、sleep等時間関係の関数は動かないっぽい。
割り込みは入っているんだけどな。

※Hello WorldはLimbo言語で記述したもの。PCで動いていたバイナリがそのままArmadilloでも動くと、当たり前と思いつつも感動がある。

・今後の目標

Infernoをまともに動かす。
ネットワークを使えるようにする。
CFも可能であれば(優先度低)。
そしてゆくゆくはSH環境で動かす。
そうなると、SH用のコンパイラから作らなければならないかも。それはそれで楽しそうだ。

・所感

動いたときの感動は大きい。
開発の基にした基板とコアが同じなので簡単にいくかと思ったら甘かった。
ペリフェラルがぜんぜん違う。
割り込みコントローラーもタイマーもuartも全部書き直し。

※MMUはARMのアーキテクチャで決まっているので、使い方はほぼどれも同じと思われる。

Infernoを有用に使うにはネットワークは必須であろう。
EthernetコントローラーはCS8900A互換ということで、そのドライバはInfernoにすでに含まれている。
簡単に移植できるといいなぁ。

・参考文献

MMUに関してはInterface 2008 11月が参考になった。
Armadilloに関しては、ハードウェアマニュアル、ソフトウェアマニュアル、ブートローダーのソースコードが参考になる。
Infernoのカーネルビルドに関しては
https://umdrive.memphis.edu/blstuart/htdocs/inf_native.html
を取っ掛かりとした。
コンパイラ、アセンブラに関しては、manとかRob先生の説明を参照した。
コンパイラはGCC等とは若干異なるようで、違いはおさえておいたほうがよさそう。
http://www.cs.bell-labs.com/sys/doc/comp.html
もちろん、CPUのデータシートも必須。

[misc]使う上でのメモ

・コマンド

ns namespaceを表示する
netstat
svc/httpd/httpd ウェブサーバー起動
os ホストOSのコマンドを実行 os uname とか

・ファイルサーバー

サーバー側
listen tcp!*!ポート {export パス &}

クライアント側
mount -A tcp!アドレス!ポート マウントポイント
-Aは認証なし
mountを実行したプロセスのみ参照できる。

・wikifs

よくわからなかった

・DNS

よくわからなかった。
charonからは名前引きできてるところを見ると、DNS名前引きはアプリケーションレイヤーで行うのかな?

ndb/dnsquery ドメイン名
で名前引きはできるようだ。

(090311追記)
ちょっと分かったかも。
ndb/dns でサービスを立ち上げてから、
ndb/dnsquery が利用可能になる
dns サーバーアドレスは、/lib/ndb/localに書くのではなかろうか

・tftp

サーバー側はip/tftpdを実行するのみ。
初回は/services/tftpdディレクトリを作っておく。ここにファイルがおかれる。

クライアント側はコマンドラインプログラムは無いのかも。
モジュールはあるようなので、ちょっとしたプログラムを書けば作れるのではないか。

・icmp/ping

なんと、ネイティブまたはホストOSがplan9の場合でなければICMPは使用できないようだ。
pingが使えないのは痛い。

2009年1月11日日曜日

ブログ始めてみる

最近Infernoに興味がわいたのでブログに書いてみようかと。