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でもやってみる予定。