2011年10月28日金曜日

QEMUでarm環境、そして



QEMUでARMをエミュレートしてLinuxを動かしてみました。

ARMのQEMUにDebianをnetinstallする
http://blog.kmckk.com/archives/2233167.html

を参考にインストールを試みましたが、インストーラーが途中で止まったので断念。

ビルド済みのユーザーランドを探しました(あ~あ)。

http://people.debian.org/~aurel32/qemu/armel/

にありました。debian lenny, squeezeがあるみたいです。
armel(EABI?)となっているやつじゃないとまずそうなので注意が要りそうです。

ダウンロードして、
qemu-system-arm -redir tcp:2222::22 -m 128 -M versatilepb -kernel vmlinuz-2.6.26-2-versatile -initrd initrd.img-2.6.26-2-versatile -hda debian_lenny_armel_standard.qcow2 -append "root=/dev/sda1"

であっさり起動。
redirオプションで外からSSHでつなげるようにしておいた。

で、infernoを動かしてみたところ、色が変になった。

2011年10月22日土曜日

フレームバッファでwm

フレームバッファでwmを表示させることができました(表示のみで、タッチパネルからのインプットはまだ)。
インストールガイド通りですが、感動。
Inferno 関係の人はパッケージングもビシっとするからすばらしい。

・環境
armadillo 440 液晶モデル相当。

OS:debianインストール済み。
ネットワーク:有線

・導入

足りないパッケージをapt-getでインストール

x-window-system-core
libxext-dev
gcc
make
mercurial

arm-gccコマンドがいるので、ln -s gcc arm-gccでリンク。

本流のOSを持ってくる。
cd /
hg clone https://inferno-os.googlecode.com/hg/

ひとまずそのままビルド
vi mkconfig
HOSTとTARGETとROOTを変更。
Linux/arm/binにパスを通す。
./makemk.sh
mk -s nuke mkdirs install
mk install

とりあえずarmで動くinfernoが作られる。

次に、フレームバッファ対応のコードを持ってくる。

hg clone https://bitbucket.org/santucco/inferno-fb

この中の、inferno-os/emu/を本流のemuの下に上書きコピー。
Linux-fbのmkfileを編集しろとのことなので、
vi mkfile
TARGETをなんか選べとのことなので、
TARGET=t42
とか適当にしておいた。

Linux-fbの下でmk installでビルドできるとのこと。

・実行
emu-fb
でemu起動。
wm/wmを実行すると。。。



すばらしい。
入力を受け付けないので操作はできないのですが、

wm/wm wm/bounce

とすると



と、アプリが動きます。

ちなみに、タッチパネルの種類をTARGETで選んだ理由は、出力ではなくて、
入力の都合なのではないだろうか。
t42を選ぶと、キーボードが/dev/input/event0、マウスがevent2とか選ばれるようだ。
入力についてはこれから調査予定。
USBマウスをつないでみたけど、使えなかった。

9fansメーリングリストより

9fansに衝撃の投稿が。

infernoがandroidの上で動く。(nexus sとnook)
http://9fans.net/archive/2011/09/308

ソース等
https://bitbucket.org/floren/inferno/wiki/Home

スラッシュドットでも話題に
http://linux.slashdot.jp/story/11/09/25/0718249/%E3%82%A2%E3%83%B3%E3%83%89%E3%83%AD%E3%82%A4%E3%83%89%E6%90%BA%E5%B8%AF%E3%81%A7Inferno%E3%82%92%E8%B5%B7%E5%8B%95

過去の投稿で、inferno phoneの構想をねったが、
AndroidのdalvikをDisで置き換えるという発想は出来なかった。
どうやら電話も可能らしく、かなりの力の入れよう。
動作を紹介した動画もすばらしい。

armadilloでトライしようかと考え中。
だったが、どうもAndroidが落ちるので難航しそう。

なお、メーリングリストではその他に、wmをフレームバッファで動かす試みも
話題になっていた。
これが出来ればxがいらなくなり、
linuxカーネル + Dis という環境でいけるかも。
起動時間の予測は、ハイバネーションなしで、カーネル20秒 + Dis 5秒くらいかな。
まずは、fb + linux on armadilloを試してみる予定。

2011年6月28日火曜日

Cのコードを移植

特に有用な内容は無いです。

以前
Cでモジュールを書く
でCで書いたモジュールをLimboから呼び出す試みをしましたが、
Limboで書くより若干速いというメリットの他に、
既存のCのプログラムが移植しやすいというメリットが有るのではないかと思いました。

そこで、既存のCのコードをコンパイルできるか試してみました。

サンプルは
plan9のcatです。
Cと言っても、ansiではなく、ken ccのように見えるので、
plan9由来のコードが移植しやすいと判断しました。

plan9のコードからcat.cを見つけて、
中身を以前試したexample.cにコピーしたところ、
ビルド自体は通りました。
わりとそのまま行ける感じです。

ただ、ファイルシステムへのアクセス方法がよくわからず、
使えていませんが。

plan9のls.cを参考に、ディレクトリサーチを試みましたが、
dirreadが無いと怒られ頓挫(openはできたっぽい)。
ヘッダにはプロトタイプがあるのにね。

2011年6月21日火曜日

charonで日本語が潰れる問題をとりあえず回避

charonで日本語の入ったページを表示させると、
小さい文字が「NUL」になることがあります。
どうすればよいかよくわかっていませんが、
とりあえずの回避方法を見つけました。

/fonts/charonのなんとか.tiny.font となんとか.small.font
をまとめて消してしまうのです。
これでひとまず表示できました。

良い方法ではないと思うけど。

2011年6月16日木曜日

tclはいけるが、tkはだめ

tcl/tkが使えるか試してみました。
tclshでtclスクリプトが実行出来ることは確認できました。

しかし、wishでtkを呼び出すことはできませんでした。
windowが出てくれないのです。

なお、shからtkを呼び出すのに、

load tk
wid=${tk window 'window'}
tk $wid update

とかしてみましたが、やはりウィンドウが表示されませんでした。
tkがだめ?

charonの実力を探る

ふと気になって、charonがどのくらい使えるのか調べてみました。

ECMAScript

ECMAScript 2 に対応とのことなので、試してみました。

このへん
Javascript入門ページのサンプルを実行してみたところ、
割といけました。
面白い。

特に引数に何も付けなくてもscriptは使えましたが、
ドキュメントによると、-doscripts 1 とか付けないとだめとなっていたので動かない場合はオプションに注意、ということで。

なお、alertはポップアップではなく、コンソールに出るようで。

ログインできるページ

今まで駄目だと諦めていたgmailにログインできることがわかりました。
ユーザー名、パスワード入力後エラーページが表示されますが、
その後もしつこくgmailをクリックすると、basic htmlにて
メールの表示ができました。
なんとメールの送信も可能です。

amazonもログイン可能でした。ただ、検索はできないようで。
怖いので購入は試していません。

mixiも行けました。mixiはほぼすべての機能が使えるのではないかと。

駄目だったのは、dropbox, evernote, twitter, facebookと、今流行りの
ウェブサービス。

2011年6月13日月曜日

AVR32 でROMライター無しの開発環境構築

無関係のAVR32の話題を。

最近LAN対応の小さいシステムとして、AVR32とH8をいじっています。
H8の方はtoppers+tinetであれば公式ドキュメントが完全に説明して
くれているのでなんとでもなりそうですが、
AVR32の方はなかなか大変でしょうね。
開発環境をインストールしたあと結構途方にくれるきがします。

TCP/IPをやりたい場合はlwipを使うのが良さそうですね。
ここではlwipの導入方法は説明せず(というか昔のことなのでやり方忘れた)、
ROM Writer無しで開発できる環境を作る方法について書き残しておこうかと思います。

本来こういったリソースの少ない開発ではボードとICEとセットで使い、
ICE経由でファームウェアを書き込むのが普通なのでしょうが、
このボードの場合はUSBをもち、PCと接続すると本体自身が
デバッガになるという機能があります。
デバッガになるためにはその機能を持つブートローダーを入れる必要があります。
Flashの先頭にはそのブートローダを書きこんでおきます。
後半はあけておき、PCから自由にファームウェアを入れることができます。
ファームウェア側にも変更が必要で、ブートローダーの分ずれたアドレスに
コードが 配置されるようにしなければなりません。

・環境

EVK1100。
どうやら最初からブートローダーが書きこまれているという話。
もし書きこまれていなければ、初回はやはりWriterが必要で、一度bootloaderを
書きこむ必要がある。
ブートローダーはDFUブートローダーと呼ばれています。

開発環境はAVR32 studioとそれに対応したコンパイラ。
DFUブートローダーを利用してファーム書き込みを行う場合は、
PC側にDFUのドライバが必要。
それはFLIP3というソフトウェアが必要となります。

ドキュメントは
「AVR UC3 USB DFU Bootloader」という名前のPDFがあります。
これを読めばすべて書かれているはずです。

・ビルド

trampolineという仕組みを含めてビルドします。
ドキュメントの「Adding or Removing the Trampoline」に書かれているとおりです。
たぶん。

・DFUブートローダーで起動

DFUブートローダーモードで起動するには、
スティックを押しながら電源を投入します。
電源はPCからのUSB給電がよいでしょう。
PCではEVK1100はDFUとして見えます。
Windowsであればデバイスマネージャーで見えるはずです。

初回はドライバのインストールが促されます。
予めFlip3をインストールしてあれば、Flip3のインストールディレクトリのUSBディレクトリ以下にドライバがあるはずです。

・AVR32 studioからDFUを使うように登録

AVR32のtargetというペインで、DFUを登録します。
これもドキュメントのとおりです。

・fusesの保存

targetを右クリックして、read fusesでファイルにfusesの内容を
保存しておきます。
そのファイルを開くとGUIでfusesをいじれますが、GPの値に注目してください。
0x7になっているかもしれません(ビット0x4が立っている。立っていないケースも有るかも。このビットはユーザーの書き込んだファームを実行するかどうかのフラグ)。
ファームを書きこむ際には、このビットを落とす必要があるので、
もし0x7とかになっていたら、0x3に直して保存しておいてください。

fusesはファームを書き込むときに使います。

・ファームウェアの書き込み

以降の手順はファームウェアを変更するたびに行います。

targetで右クリックし、programを選びます。
(runとかdebugからは実行できないのが残念)
ファームは、debug/〇〇.elfとかrelease/〇〇.elfとか
elfファイルです。

注意点としては、書きこむ前にflashの消去を行う必要があることです。
書きこむ画面で、unlock and erase のチェックボックスをチェックして下さい。

書き込みが終わったら、次にfusesの書き込みが要ります。
どうやらファームを書き込んだりfusesを読み込むと勝手にfusesが書き換わるようで、
ユーザーが書き込んだファームを実行するためには書き換えが必須です。

targetを右クリックしてprogram fusesを実行します。
保存しておいたfusesを選んで書きこんでください。

以上で、ファームウェアの書き込みが完了です。
ROMに書きこまれたので、電源を切ってもファームは残ります。

・実行

再起動するとユーザーフォームが立ち上がります。

以降は、

ビルド→DFUモードで再起動→ファームの書き込み→fusesの書き込み→再起動

という流れで作業を行います。
面倒ですね。

・まとめ

ほとんど公式のドキュメントに書かれているとおりですが、
Flashの消去を忘れない、ファーム書き込みの時にfusesも書きこむのを忘れない、
という注意点があります。

書籍


Principles of Operating Systemsのinternational版(ペーパーバック)があるそうです。
ハードカバーより高いという。

2011年6月9日木曜日

地獄の門を見逃した

先日東京に行った折、西洋美術館に行ったのですが、
入り口にあったロダンの地獄の門をスルーしてしまいました。
今から思えば、神曲を表す地獄の門を見ないのは、
Infernoエンジニアとしてあるまじきことでした。
あ〜あ。

次回は必ず見る。

ところで、考える人って地獄の門に含まれていたのですね。知らなかった。

Cでモジュールを書く

Cでモジュールを作成し、limboで使用する
http://powerman.name/doc/Inferno/c_module_en
だそうです。

ここに書かれている方法に従えばいけました。
OSX で試しましたが、ちょっとはまった点がありました。
紹介されている方法はLinuxが前提となっているので、OSX用にちょっと
手直しが必要でした。

emu/MacOSX/emuを編集し、modにexampleを追加します。

これでパフォーマンスが必要なところはCで書く、なんてことが可能になります。
クール。

ただ、JITの1.3-1.5倍速くなる、だそうで、もともとLimboのパフォーマンスは高いのでしょうね。

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が動くのですごく楽。

2011年3月8日火曜日

wikifs一部修正

メモ取り環境としてwikifsがいい感じです。Dropboxで共有することで、
各所で同じwikiにアクセスできます。

が、!で始まる行があるとputするたびに!のあとに空白がだんだんと増えていくようです。
これを抑制するのに、wiki.bを編集しビルドしなおしました。
場所は/appl/cmd/wikifs/wiki.b。


Wpre =>
if(inlist){
prefix = "";
inlist = 0;
}
if(inpara)
inpara = 0;
s = endlin(s, dosharp);
s += "! " + w.text + sharp;


とあるところの最終行、"! "となっており、空白がくっついています。
空白を取り除くと解消されました。

その他小技

行番号の表示。
行番号を表示するのは難しそうなので、
力業で行の先頭に行番号を挿入してやる。


Edit 0,$ |grep -n .*


こうすると行の頭に番号が振られる。

取り除くには、


Edit 0,$ s/^[0-9]+://g


とする。

選択範囲をパイプでコマンドに渡し、その結果で置換するには、
マウスで選択した後、| コマンド を実行するだけ。
たとえば、上で示したように、|grep を実行するとgrepの結果に置き換わる。

あと、困ったのが、HOST OSとのコピー/ペースト。
ペーストは問題無さそうだが、Acmeの文字列をsnarfすると、
ペーストするソフトによっては日本語が文字化けするっぽい。
ひとまず、クリップボード監視ソフトを使い、
クリップボードの内容を逐一テキストにダンプするようにし、
そのファイルをロードすることで日本語入りの文字列を取り出せるようにしておく。
ちょっと面倒だけどしょうがないか。

ちなみに、クリップボード監視ソフトのオススメは
!Mr.Clipboard
Windows7でも動いた。

2011年3月6日日曜日

Acme wikiでひらメソッド

wikiが安定して動いているようなので、wikiの利用を考える。

ひらメソッドが以前話題になっていたが、
今更手を出してみようかな。

カーネルのコードはC、アプリケーションはlimboで書かれている。
場合によってはシェルスクリプトもありそう。
コードを引用することが多発しそうなので、引用がしづらいと厳しい。

wikifsのルールでは引用は行頭に!が必要。
ブロックでの引用ができないのか・・・

そこで、簡単に引用できないか考えてみた。
置換を使うのがやりやすい。
引用するテキストを選択した状態で、


Edit s/^/!/g

これでOK。簡単。

wikifsの文法は、

・先頭行はwikiname(大文字小文字区別なし、スペース可)
・空行は段落
・*は箇条書き
・大文字の単語は見出し(日本語どうするんだ?)
・リンクは[タイトル|URL]
・!は引用

以上。潔い。
対応していない書式は多いが、いろいろ覚えるのも面倒なので、
このぐらいシンプルなほうがかえって良いかも。

さて、ページは関数ごと、ソースファイルごと、どの単位で分けるのが
よいのだろうか?

acmeでPOP3

この概要は表示できません。投稿を閲覧するには ここをクリック してください。

2011年3月5日土曜日

POP3でメール受信

TOEIC受験やらiPhoneアプリ開発やらで忙しくなってきたので手短に。

ようやくメールの送受信が何となくできました。
niftyのプロバイダメールで確認。

条件

・生のpop3 (apopではなく)
・smtp認証なし

ソフトウェア

・wm/readmail
・wm/sendmail

あらかじめndb/csを実行しておく。
readmailを立ち上げて、左端のconnectボタンを押し、
サーバー、アカウンと情報をいれる。
サーバー名はホスト名だけでOK。

新しいメールから一通ずつ表示される。
サマリー一覧は表示されないようだ。

メールを送信するときも同様。
ログイン名は@以下も必要とのこと。

日本語の入ったメールを受信すると文字化けしていた。
実用は遠い。

Acmeでのメール受信もやろうとしたが失敗。こっちが本命なんだけど。

ちなみにgmailはまだできていない。
TLSごしのPOPになるが、どうも認証エラーになる。

世の中にはnupasとかいうメールFSがあるようなのだけれど、
infernoにはまだないようだ。

2011年3月3日木曜日

wikifs + acme wiki

wikiを導入してみました。

参考: Inferno Wiki

すでにwikifsが組み込まれているacme-sacにて作業。

ローカルwiki

wikiの元になるディレクトリを用意。
空だとうまくいかなかったので、
このへん
から作成済みのディレクトリを持ってきた。

wikiディレクトリを/usr/USER/lib/wikiとして配置。


mount {wikifs -d $HOME/lib/wiki} /mnt/wiki

とする。
こうすると、/mnt/wikiにwikifsがマウントされる。
この状態でAcmeからアクセス可能。

acmeでWikiを記述し、中クリックするとWikiインターフェースが起動する。
カバーページがまず表示されるので、それを編集し、putすると更新される。
Newすると新規ページが作られる。
一行目にnameをつけてputするとその名前のページが作成される。
リンクは[名前]とする。
右クリックでジャンプ。

段落以外の改行はputの時に取り除かれるようだ。ちょっと面倒。

wikiをウェブで公開

wikiをウェブで公開可能。
/services/httpd/root/wikiディレクトリをつくっておく。
先程の/sys/lib/wikiの直下のファイルをそこに置いておこう(ウェブでwikiを編集するときに使われる)。


bind /mnt/wiki /services/httpd/root/wiki
svc/httpd/httpd &

とすると、wikiがhttp://ホスト/wiki というアドレスで参照可能となる。

ブラウザでアクセスするとカバーページが見える。
編集機能も使えるっぽいが、編集後のジャンプ先のページのURLがおかしいのと、
日本語が化ける問題がある。
ブラウザからは閲覧のみがよさそう。

ウェブ上のwikiをacmeで直接編集


ndb/cs
mount -9 tcp!plan9.bell-labs.com!wiki /mnt/wiki


とすると外部公開されているplan9のwikiがマウントできる。
編集はさすがに試していないが、ジャンプは可能だった。

自分で同じようなことをする場合は、


ndb/cs
listen -A tcp!*!wiki {export /mnt/wiki &}

とかするといいのかな?(公開するのは$HOME/lib/wikiじゃないよね?)

所感

なかなか使えそうなので使ってみよう。
分散してストアしたいが、それは今後の課題とする。
通常のhosted inferno、native infernoでもやってみる予定。

2011年2月27日日曜日

libinterp.aが見つからない

Native infernoをクロスビルドしようとすると、libinterp.aが見つからないと
言われることがある。
その対処法がなんとなくわかったのでメモ。

mkconfigを編集する。


SYSHOST=Linux
SYSTARG=Inferno
OBJTYPE=arm


などとする。
Linuxの上でarmのnative infernoをビルドする設定ね。


cd libinterp
mk install


とすると、Inferno/arm/libにライブラリがインストールされる。
なるほど。

2011年2月4日金曜日

Kuro-sheeva(sheevaplug)でInferno

どうしてもARMのNative Inferno環境が欲しくなったので、玄人志向のkuro sheevaを買ってしまいました。
コンパクトで非常にcoolです。

linuxにはそれほど興味はないので、いきなりinfernoを動かします。

○ビルド

過去の日記参照。
ビルド環境は、アットマークテクノで提供しているATDE3というVMware用のイメージを
つかわせてもらった。とても便利。

○シリアルの用意

windowsでつなぐことにした。
sheevaplugのサポートサイト?からドライバを持ってきてインストール。
kuro sheevaとUSBで接続すると、kurosheevaはUSBシリアルに見える。

なお、USBコントローラーはFTDIで、シリアルのブリッジをしている。
kuro sheevaがおかしくなったとしてもシリアルは無事の可能性が高い。
電源を切るとFTDIも落ちるのでちょっと不便だけど、こういった構成は今後も使われるであろう。

シリアルコンソールはteratermを使用した。
何でもいいんだけど。

○ubootでtftpブートの設定。

あらかじめPCではtftpを立ち上げておく。
poor tftp serverがとても良い感じ。
PCはIPアドレス192.168.12.12を割り当てておく。PCとkuro sheevaはEtherで直結。
ビルドでできたuisheeva.gzを持ってきて、
tftpのルートに置いておく。

kuro sheevaを立ち上げるとlinuxが立ち上がってしまう。
rootでログインし、shutdown -r nowでリブート。
hit any keyと言われるのでキー入力すると、ubootのコンソールに入れる。

そこで、

setenv ipaddr 192.168.12.11
setenv serverip 192.168.12.12
setenv bootfile uisheeva.gz
saveenv
tftpboot
bootm

とすると、一瞬でinfernoのシェルが現れる。


Inferno Fourth Edition (20101127)
Vita Nuova
conf sheeva (1293936724) jit 0

kirkwood 88F6281-A0

mvfeat 0x41410000
l2: on, ecc off, mode writethrough
icache on, 16kb, 4-way associative, 32 byte lines
dcache on, 16kb, 4-way associative, 32 byte lines
Initial Dis: "/osinit.dis"
sheevainit...
shell...
;


かっこ良すぎ。

○ネットワーク設定

はて、ネットワーク設定はどうやるのか?

/netrcというスクリプトを用意してくれていた。
dhcpもいけるようだが、今回は固定IPで試した。


sh /netrc


を実行するとstaticかdynamicか聞かれるので、staticと答える。
残念ながらIPは決め打ちになっていて、192.168.12.11が選ばれる。
このスクリプトをみると、ネットワーク設定の方法の参考になる。
マニュアルをみただけでは難しいのでありがたい。

設定を変えようにも、エディタがないので現時点では無理(不可能ではないけど面倒)。

○Telnetで接続

netrcに驚きの箇所が。


ndb/cs
listen -A net!*!telnet {sh -i >[2=1]} &


の一行でtelnetサーバーを立ち上げている。
listenの仕組みで即telnetができてしまうとは。
認証していないのでセキュリティ的にはアレですが。

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

・kuro sheeva側


listen net!*!styx {export /&}


・PC側
Infernoを立ち上げる。


ndb/cs
mount -A net!192.168.12.11!styx /n/remote


これで設定をacmeで変えられる。

○今後

wikiサーバーでも立ち上げようかと思ったけど、HTTPdは入っていなかった。
その前に、ストレージはどこまで対応しているのだろうか。
wikifsを使った個人用wikiがほしい。
インターネットにさらすのは恐いが。

2011年1月2日日曜日

Inferno 関連PDF

Inferno関連のPDFもあるようです。

inferno programmer's guide

ページが重く感じるのでPDFをダウンロードすることに。
そのためには、、、

・自分の所有するファイルをアップロードする

or

・お金を払う

どちらかをしなければなりません。
悩んだあげく、支援の意味を込めてお金を払うことに。
一度払うとある期間ダウンロードし放題なので、inferno、plan9関連のPDFをすべて落とした。

2011年1月1日土曜日

Infernoでtwitter

明けましておめでとうございます。

冬休みの自由研究の一つにInfernoでtwitterというものがありましたが、
ほぼコーディング無しで実現できました。

直接Twitterにアクセスするのは大変そうだったので、
IRCに変換する公開ゲートウェイをお借りしました(1)。

IRCクライアントはcaerwyn先生のacmeで動くircクライアントを
ベースにしました(2)。

(1) OpenTIG - TweetIrcGateway Hosted Service

(2)inferno programmer's notebook lab 44 - acme irc client

ircクライアントはそのままではうまく動かなかったので、一部修正しました。
コードは

https://subversion.assembla.com/svn/yosinori_public/trunk/limbo/twitter

にコミットしたので、参考までにどうぞ。
readmeja.txtに説明があります。
Acme上でタイムラインの読み込みと、tweetの投稿が可能です。

※本当は直接twitterにアクセスしたかったのですが、
認証とか大変そうなのでひとまずopentigをつかわせていただくことに。
余裕があればtwitter-fsを作るか。