2011年5月28日土曜日

DSでinferno



Infernoの動く環境をいくつか確保しておきたいということで、
DSでのInfernoの起動を試してみました。

必要なものは、ユーザープログラムをDSにロードする装置ですが、
今回試したのは

・R4i SDHC

・R4DS

の二種類です。前者はよくわからず最新ぽいのを買ってみたのですが、
残念ながら動きませんでした。
DSLinuxも駄目だったので、どうしょうもない。
無駄な出費でした。

R4DSではLinux、Inferno どちらも動作しました。
infernoは http://code.google.com/p/inferno-ds/で公開されているバイナリを使用しました。
icds.ndsというファイルです。

これをSDカードに入れてロードすると、infernoが立ち上がります。
上の画面には画像が表示されます。
下の画面はWMが表示され、タッチパネルでの操作ができます。
ボタン1,2,3の区別はL/Rボタンで行うようです。

起動時になにか音が出るので、サウンドも有効みたいですね。

keyboardというソフトウェアキーボードプログラムがあるので、
文字入力も可能です。

かっこよすぎ。

さて、次に行いたいのは自分でビルドして動かすことですが、
なぜか自分でビルドしたバイナリでは起動しませんでした(画面が白いまま)。
困った。
これを追うのは大変そうです。

2011年5月27日金曜日

infernoはjslinuxで動くか?

jslinuxというものがあります。
なんと、ウェブブラウザのJavascriptで386のエミュレーションをし、
その上でlinuxが動くというのです。

http://bellard.org/jslinux/

素晴らしいです。

さて、新しい環境が出てきたら、そこでinfernoが動くのか考察するのが礼儀です。

この環境は386上のLinuxということで、普通にLinux上でビルドすると動くような気がしますね。
結論から言うと、FPUが原因で動かなかったのですが。

キャラクターコンソールオンリー、ディスクスペースが全部で最大4Mbyteなどの制限があり、
ミニマムなビルドにしないと動かなそうです。

・手順

1. ローカル環境、ディスクの用意

http://blog.livedoor.jp/dankogai/archives/51683749.html
を参考にローカル環境と4Mbyteのディスクを作ります。

cpux86.js, cpux86-ta.js, index.html, jslinux.js, linuxstart.bin, root.bin, term.js, vmlinux26.binがあれば動くようです。

2. mkconfig の編集

普通にセルフビルドする設定にしておく。
SYSHOST=Linux, OBJTYPE=386。

3. ミニマムなビルドのためにいらないものを削る

emu/Linux/emu-gを編集。

dev: env, prof, dup, ssl, cap, indir, ip, eia, mem

mod: math, srv, keyring, crypt, ipints, loader

あたりをコメントアウト。

4. ビルド、strip

mk CONF=emu-g install

こうすると、GUIを持たないemu-gというプログラムが出来る。

strip emu-g でダイエットしておく。

5. 必要なファイルをディスクイメージにコピー

作ったemu-g、必要なライブラリ、必要なdisをコピーしておく。

emu-gは/binに、ライブラリは/libに、disは/root/inferno/dis/においた。
ライブラリはldd emu-gで表示されるライブラリをコピー(ホストのlinuxのものをコピー)。
libpthread.so.0も元々あるやつだとダメっぽいのでこれもコピー。

必要なdis は
lib/bufio.dis, lib/filepat.dis, lib/arg.dis, lib/string.dis, sh.dis, emuinit.dis。

6. 実行

jslinuxを立ち上げて(ブラウザでindex.htmlを開く)、
emu-g -r /root/inferno を実行すると・・・
うーん、動かず。

どうやらFPinit()でだめになるっぽいです。
そもそもCPUエミュレーターはFPUには対応していないようで、
inferno emuはFPU必須なのかも。

起動の流れが追えて勉強になりましたが、動かなかったのは残念。

ちなみに、emu-gのサイズは291kbyte、disは合わせて58kbyte。
共有ライブラリはでかいですが(全部で2Mbyteほど、ミニマムは不明)、
結構小さいですね。

私の技量ではここまで。
Native infernoをやるのはおそらく無理かと。
動けば、ブラウザ上でinfernoができてすごくいいんですけどね。
IEのプラグインはあるようですが、他のブラウザではまだなので、動くと良いのですが。

2011年5月26日木曜日

Acmeを使い込んでみる

最近脱emacsを計り、Acme-sacを使っています。
ちょっとずつコツが掴めてきました。
なお、windowsでの使用を想定しています。
OSXでもそれっぽいことができるとは思いますが、まだ試してはいません。

落ちることがあるので注意

Zeroxというコマンドでウィンドウを二重化できますが、
それをしたあと、片方のウィンドウをいじるとAcmeが固まるようです。
カーソルキーをおして、ctrl-s とかctrl-gとかおすと出ます。
条件はまだはっきりとしないのですが、zeroxした時だけ出るようです。
メーリングリストにはまだ報告していません。

なお、落ちたときに$home/acme.dumpというダンプファイルができることに気づきました。
もしエラーがでたら前バッファのバックアップを残してくれるようです。
知らなかった。

Acmeでメールの現実解

Acme上でMailを使うのは厳しいです。日本語がだめなので。
現実解としては、Thunderbirdの外部エディタにAcmeを指定することですね。
特に文字化けもなく使えることは確認しました。

Thunderbirdにはexternal editorとかいうアドオンをいれて、
外部エディタとして後述のバッチファイルを指定すればOK。

まだメインのエディタとしてmewを使っていますが、ゆくゆくは完全に移行したい。

Acmeにエクスプローラーからファイルを送る

エクスプローラーでファイルをAcmeでオープンできるように頑張ってみました。

やり方は、

・AcmeでWinのパス名をInferno上のパス名に変更するプログラムを作成
・Acme起動時にrstyxサーバーを立てる
・Acmeに対しrstyxでコマンドを送るバッチファイルを作成(emuをコールする)。

といった感じです。
無駄にHosted Infernoを使っています。
rstyxがいい感じです。

こうすると、メーラーから外部エディタとしてAcmeが使えたり、
バッチファイルのショートカットをデスクトップに置いておいて、そこにドラッグアンドドロップでファイルがAcmeで開けるようになったり、コンテキストメニューの「送る」に登録してみたり、といろいろできます。
残念ながら開いているAcmeへのドラッグアンドドロップは無理ですが。

やり方の説明は面倒なので、subversionのリポジトリをお知らせします。

http://www.assembla.com/code/yosinori_public/subversion/nodes/trunk/limbo/cmd/openwithacme

index.txt に説明があります。

Goog、Pediaを日本語対応に
Goog word、Pedia word、で単語のグーグル検索、Wikipedia検索が出来ます。
が、日本語に対応していないので、日本語対応をしてみました。
urlencodeというプログラムを作成し、それを挟むことで
日本語がコード変換されて、情報のgetが可能になります。
なお、プログラム名はurlencodeという大層な名前ですが、
ちゃんとはしておらず、ただ渡された文字列を%xx という形に書き出すだけです。

http://www.assembla.com/code/yosinori_public/subversion/nodes/trunk/limbo/cmd/urlencode.b

においておきます。
Acmeでテキストブラウズなかなかいい感じ。

矩形切り取り

バッファで矩形に切り取りたい箇所を選択し、rect を実行。簡単。
残念ながら、貼付けはできないっぽい。

固定幅フォント

Fontを実行するとそのバッファが固定幅・プロポーショナルが切り替わります。
Fontにフォントパスを引数として付けると、フォントの切り替えも可能です。

いっぱいバッファを開くとSortが便利

次々バッファを開くと訳が分からなくなりますが、
Sortを実行するとバッファがファイル名で並ぶので、
ソートされたバッファリストとして使えます。

2011年4月20日水曜日

スクリプト言語並みの気軽さで使える?

ちょっとしたフィルターを書くのに、perlを使うと、


while(<>){
if(/EXPR/){
# 処理
}
}


とさっと書けて便利です。
便利すぎて他の言語に移行できません。

これをlimboでやろうとすると、以下のように大量の記述が必要となります。
モジュールのロードが面倒。

implement filter1;

include "sys.m";
sys: Sys;
include "draw.m";
include "bufio.m";
bufio: Bufio;
Iobuf: import bufio;
iobuf: ref Iobuf;
include "regex.m";

filter1: module {
init: fn(ctxt: ref Draw->Context, artv: list of string);
};

init(ctxt: ref Draw->Context, artv: list of string)
{
sys = load Sys Sys->PATH;
bufio = load Bufio Bufio->PATH;

if (bufio == nil) {
exit;
}

stdin := sys->fildes(0);
iobuf = bufio->fopen(stdin, bufio->OREAD);
if (iobuf == nil) {
exit;
}

regex: Regex;
regex = load Regex Regex->PATH;
if (regex == nil) {
exit;
}

(re, nil) := regex->compile("EXPR", 1); # flg = 1
while (1) {
s := iobuf.gets('\n');
if (s == nil) {
iobuf.close();
break;
}

rslt := regex->execute(re, s);
if(rslt == nil) {
continue;
}

(a, b) := rslt[0];
# 処理
}
}


ということで、スクリプトの代わりにするのはきつい。
shと併用しなければだめっぽいですね。

2011年4月1日金曜日

Inferno日記(2)




いろいろあってこうなりました。
すごくおいしかったですよ〜^_^
ワインも今回すごくよくできていた。

2011年3月26日土曜日

wikifs いらなくないか?

Acmeでhowmっぽいことをしようと、wikifsを使っていたが、
よく考えたら、wikiを使わなくても普通にテキストファイルを使うだけで
howmに望むことが実現できるきがした。
webで公開するわけではないので、wikiにしなくても良かったなぁ。

ファイル名を書いておいたら右クリックでジャンプできるので、それだけでかなりのことができそう(あらためて、よく出来ていると思う)。
データはテキストで保存し、Dropboxで共有すれば完璧(あ~ぁInfernoで閉じられていない)。

日付の挿入


< date


検索してジャンプ


grep -n WORD パス

でOK。
検索結果を右クリックすればジャンプできる。
^=で検索すればタイトル行を抜き出せる。

TODO管理
→まだ自動では出来ていないが、TODOと記して検索に任せている


新規ファイル作成


現在時刻をYYYYMMDDhhmmssで出力するコマンドdate2を作成。

date=`{date2};echo '= '> $date.txt;plumb $date.txt


最近変更のあったファイル

ls -t


お、簡単。
最大?件とかする場合はheadで、、と思ったがheadがないぞ。むむ。
細かいソートをする場合はls かdu で詳細情報を出して、
カラムでソート、かな。カラムの取り出し方はどうするんだろう。awkがない。

ひとまずこのくらいで事足りている。
howmはもっと機能があるけどもともと使いこなしていないからOK。

※date2.b


implement Date2;

include "sys.m";
sys: Sys;

include "draw.m";
include "daytime.m";
include "arg.m";

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

usage()
{
sys->fprint(sys->fildes(2), "usage: date [-un] [seconds]\n");
raise "fail:usage";
}

nomod(m: string)
{
sys->fprint(sys->fildes(2), "date: cannot load %s: %r", m);
raise "fail:load";
}

init(nil: ref Draw->Context, argv: list of string)
{
sys = load Sys Sys->PATH;
daytime := load Daytime Daytime->PATH;
if (daytime == nil)
nomod(Daytime->PATH);
arg := load Arg Arg->PATH;
if (arg == nil)
nomod(Arg->PATH);
nflag := uflag := 0;
arg->init(argv);
while ((opt := arg->opt()) != 0) {
case opt {
'n' =>
nflag = 1;
'u' =>
uflag = 1;
* =>
usage();
}
}
argv = arg->argv();
arg = nil;
if (argv != nil && (tl argv != nil || !isnumeric(hd argv)))
usage();
now: int;
if (argv != nil)
now = int hd argv;
else
now = daytime->now();
if (nflag)
sys->print("%d\n", now);
else if (uflag)
#sys->print("%s\n", daytime->text(daytime->gmt(now)));
{
#time: ref Tm;
time := daytime->gmt(now);
sys->print("%04d%02d%02d%02d%02d%02d\n",
time.year + 1900,
time.mon + 1,
time.mday,
time.hour,
time.min,
time.sec
);
}
else
#sys->print("%s\n", daytime->text(daytime->local(now)));
{
#time: ref Tm;
time := daytime->local(now);
sys->print("%04d%02d%02d%02d%02d%02d\n",
time.year + 1900,
time.mon + 1,
time.mday,
time.hour,
time.min,
time.sec
);
}
}

isnumeric(s: string): int
{
for (i := 0; i < len s; i++)
if (s[i] < '0' || s[i] > '9')
return 0;
return 1;
}



ところで、今流行のorg-modeってどうなんだろう。
acmeに持ってくることは可能?

Plan9のソースコードを手軽に持ってくるには

Plan9のソースコードはbell-labsが保守しているようですが、
それを持ってくる手軽な方法を考えてみました。

linuxにu9fsを入れるのは面倒なので、infernoでマウントしてやります。


/ndb/dns
mount -A tcp!sources.cs.bell-labs.com!564 /n/source


ソースツリーはplan9/sys/src以下にあるようだ。
大抵の環境でinfernoが動くのですごく楽。