楽しそう。
cbs is a client/server system for allowing non-root processes to bind to local ports below port 1024.
SCM_RIGHTS と SCM_CREDS を使ってる...
温泉。飲む。
温泉。頭痛。発表。飲む。
温泉。帰宅。
以前 report した g++ の問題が 3.1 20020302 (prerelease) で 直っているという返事が来る。
(まだ確認してないけど)もしかしてこれで Grail が動くようになったのか?
... 動かなかった。 Internal compiler error in find_function_data
ちなみに error 自体は異なっているのでそれなりに進んだのではあろう。たぶん。
Perl Regular Expression Matching is NP-Complete
うぅむ。そうだったのか...
Partial Evaluation and Automatic Program Generation
うぅむ。download 可能ですか。
ついに Grail を i386 Linux 上の gcc で build することに成功してしまった...
べつに gcc を直したわけではなく問題を避ける方法を見つけただけだけれど。
しかし、開発が止まっているものにこだわってないで、 なにか他のを探すべきかも知れない。 あるいは自分で書くか。
空の directory を作らせるような patch ってできたっけ?
ふと、
などというものを書くと怪しげな人に受けるのではないかと思った。
いや、どう考えても入門じゃなくて応用になっちゃうか。
が、しかし、gcc 3.0 以降には -fguiding-decls がないので build できない。 ld が足りないとのたまう連中を個々に instantiate すればいいとは思うのだが、 とりあえず gcc 2.95 を install すれば済むので放置。
手元の i386 FreeBSD で build してパスに入れる。
あぁ、これでついに昔と同様にリモートログインしなくてもいつでも即座に Grail が使える環境に...
かなり前から悩んでいたが、ついに捕まえた、と思う。 CVS/Root と -d が異なると複数ディレクトリにまたがる diff や commit ができない臭い。
Valgrind is a GPL'd tool to help you find memory-management problems in your programs.
ふむ。Purify みたいなもん?
SoftwarePot is an encapsulated, transferable file system for secure software circulation.
温泉で聞いてきた奴。 sandbox の原理は ptrace の類によるシステムコールのトラップ。
Stacking them up: a Comparison of Virtual Machines
Java と .NET のバイトコードの比較。
Ruby/CVS が cvs という名前のディレクトリを使うので、 Windows では CVS ディレクトリと衝突する、か... まったく気にしていなかったがそうなのかも知れない。
ふむ。そうか、Subversion で管理すればいいのか?
神保町に寄る。しばらく前から気になっていた「総理大臣のえる!」を揃える。
うぅむ。しばらく前にどこかで handshake 抜きで TCP connection を無理矢理動かすという話を読んだのだが、 見つからない。 いったいどこで読んだんだろう?
SYN が落されてても大丈夫とか、 他のアプリケーションに bind されているポートを共用できるとか、 いろいろと怪しげな話が書いてあったのだが...
SendIP を試してみる。 うぅむ。使いかたがよくわからん。
The Functional Programming Language XSLT - A proof through examples
はるかな昔、順番に実行していくのと if と while があればなんでも書ける、 と教わった気がする。
だが、よく考えてみると、while を使って if を実現できるのではなかろうか?
if (A) B else C
は
t = A; f = true; while (t && f) { B f = false; } f = true; while (!t && f) { C f = false; }
としても実現可能だろう。
とするとプログラムに必要最低限な制御構造としては if は冗長なのではないだろうか。 どこで教わったか思い出せれば教科書を調べ直してみたいのだが... どこだっただろうか?
今月の新刊を買ったにもかかわらず 先月の新刊をいまだ読みおわっていないことに気がつく。
3種類の制御構造でどうにかできるというのはどうも 構造化プログラミングの話だった臭い。
構造化プログラミングというのは良いプログラムを書くという話だと思うので、 件の 3種類が必要最低限ではないことはべつに問題ないわけだな。 使えるものを少なくすれば良いプログラムになるというわけではないし。
そーいえば、構造化プログラミングの定義って何だろう?
ダイクストラの論文にあたるべきか?
情報科学辞典を見てみる。
なるほど。
いや、むろんもっといろいろ書いてあるわけで、 構造化プログラミングがこれだけで規定されるわけではないが。
while program も見てみる。
うぅむ。条件文が入っているな。 計算可能性関係だとまたなにか違うのだろうか?
今日は辞典をひくために職場にいった。(うそ)
ふむ。port は空でもいいのか。
qvalue = ( "0" [ "." 0*3DIGIT ] ) | ( "1" [ "." 0*3("0") ] )
というのは、どこをどうみても floating point ではなく、 fixed point だとおもう。
Content-Type: text/plain Content-Language: en-lisp coffee? t.
こうすれば誤解の可能性はなく、ちゃんと coffee が出てくる(はずだ)。
sgn-JP ってなんだ?
100 Continue を無理矢理出せるか?
ふむ。asis なのを HTTP/1.1 でリクエストすると chunked になるのか...
warn-text に ISO-8859-1 以外のを使う時は RFC 2047 を使えっていったって warn-text は quoted-string なんだからそれは無理というものであろう。
いや、より正確に記述すればこうか?
Content-Type: multipart/mixed; boundary="xx" --xx Content-Type: text/plain Content-Language: en coffee? --xx Content-Type: text/plain Content-Language: en-lisp t. --xx--
うぅむ。色羊ってコミックにまとまらないんだろうか。
ふと思ったのだが、raw socket をつかった port forwarder ってあるんだろうか?
なぜ、cpp の #if などはひどく読み難い書き方がまかり通っているのだろう? インデントもあまりしないし。
なんとなく visualize してみた。
nest = 0 max = 0 lines = [] ARGF.each_line {|line| case line when /^\s*#\s*if/ nest += 1 max = nest if max < nest when /^\s*#\s*endif/ nest -= 1 end lines << line } nest = 0 prefix = ' ' * max sep = '|' lines.each {|line| case line when /^\s*#\s*if/ nest += 1 prefix[nest-1] = ?A print prefix, sep, line prefix[nest-1] = ?| when /^\s*#\s*el(se|if)/ prefix[nest-1] = ?+ print prefix, sep, line prefix[nest-1] = ?| when /^\s*#\s*endif/ prefix[nest-1] = ?V print prefix, sep, line prefix[nest-1] = ?\ nest -= 1 else print prefix, sep, line end }
とりあえず、/usr/include 以下で nest が一番深かったのは /usr/include/g++/std/std_valarray.h であった。
|A |#ifndef alloca ||A |#ifdef __GNUC__ ||| |#define alloca __builtin_alloca ||+ |#else /* not GNU C. */ |||A |#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) |||| |#include <alloca.h> |||+ |#else /* not sparc */ ||||A |#if defined (MSDOS) && !defined (__TURBOC__) ||||| |#include <malloc.h> ||||+ |#else /* not MSDOS, or __TURBOC__ */ |||||A |#if defined(_AIX) |||||| |#include <malloc.h> |||||| | #pragma alloca |||||+ |#else /* not MSDOS, __TURBOC__, or _AIX */ ||||||A|#ifdef __hpux ||||||V|#endif /* __hpux */ |||||V |#endif /* not _AIX */ ||||V |#endif /* not MSDOS, or __TURBOC__ */ |||V |#endif /* not sparc. */ ||V |#endif /* not GNU C. */ |V |#endif /* alloca not defined. */
ただし、これは #elif を使えば一段で済むので余り面白くない。 (昔は #elif はなかったらしいので #elif を使わないことにはそれなりに意味があるけれど。)
ViewCVS でこういう情報を表示して各部分を対話的に折り畳めたら楽しいかもしれない。
HTML で表現するにはどうしたらいいか? table?
現象から考えると、 CVS/Root と -d が異なり、かつ、 カレントディレクトリのファイルとそれ以外のファイルを同時に commit しようとした場合、 カレントディレクトリのファイルを commit し忘れる、 のかな。
XML というのはよーするに素人向けの S式なわけであるが、 具体的にはどこらへんがどういうふうに素人向けか?
他には?
とりあえず、title 属性をつけてみた。
||A |#ifdef __GNUC__ ||| |#define alloca __builtin_alloca ||+ |#else /* not GNU C. */ |||A |#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) |||| |#include <alloca.h> |||+ |#else /* not sparc */ ||||A |#if defined (MSDOS) && !defined (__TURBOC__) ||||| |#include <malloc.h> ||||+ |#else /* not MSDOS, or __TURBOC__ */ |||||A |#if defined(_AIX) |||||| |#include <malloc.h> |||||| | #pragma alloca |||||+ |#else /* not MSDOS, __TURBOC__, or _AIX */ ||||||A|#ifdef __hpux ||||||V|#endif /* __hpux */ |||||V |#endif /* not _AIX */ ||||V |#endif /* not MSDOS, or __TURBOC__ */ |||V |#endif /* not sparc. */ ||V |#endif /* not GNU C. */ |V |#endif /* alloca not defined. */
が、w3m だと見えないか... mozilla なら tool tip に見えるのだが。
Ruby スクリプトのネストも同様にやってみる。インデントに依存しまくり。
||||A | def get_labels(limit=nil) ||||| | limit = @index if !limit || @index < limit ||||| | d = [] |||||A | while true ||||||A | case @data[@index] ||||||+ | when 0 ||||||| | @index += 1 ||||||| | return d ||||||+ | when 192..255 ||||||| | idx = self.get_unpack('n')[0] & 0x3fff |||||||A| if limit <= idx ||||||||| raise DecodeError.new("non-backward name pointer") |||||||V| end ||||||| | save_index = @index ||||||| | @index = idx ||||||| | d += self.get_labels(limit) ||||||| | @index = save_index ||||||| | return d ||||||+ | else ||||||| | d << self.get_label ||||||V | end |||||V | end ||||| | return d ||||V | end
もともとインデントされてるから可読性はそれほど向上しないな。 ただ、外側の情報がその場で得られるのが利点か。
本屋(カスミ)に行く。 コバルトの新刊が出ているので、乙女ちっく通信(折込広告)を眺める。 楽園の魔女たちが出ている... が、しかし、見当たらない。 平台には思わせぶりな穴が一つ。
即座に本屋のはしごをすることを決意し、 (マリア様と姫神さまと東方ウィッチクラフトの 3冊を買った後) 次の本屋に向かう。
幸いにして次の本屋(ダイエー)で発見・入手。 ただ... このダイエーって 5月で閉店しちゃうんだよなぁ。 あぁ、なんて悲しいのだろう。
住居の近くの本屋(友朋堂)に寄る。 暁の天使たち。
%flow; はどんな意味を表現したい時に使うのだ?
#PCDATA と P を並べてなんの意味がある?
よくわからん。
Exec Denier is a NetBSD kernel module that restricts exec syscalls for certain UIDs.
ぷー。
[latest]