cvs は Bounds checking gcc とかでコンパイルした方がいいのかもなぁ。 それとも Checker のほうがいいだろうか?
状態遷移図ってどんなのかなぁ。
(以前、状態遷移で表現する対象が全然違っていたという経験があるもので...)
Bounds checking gcc と Checker の印象はどっちもどっちというところ。
いきなり gcc-2.95.2/gcc/xgcc を起動させたり pointer + 64bit integer の扱いに難がある奴と、 md5.c のコンパイルが停止しない奴と、 どちらがマシだろうか。
cvs の cvs (とゆーとわかりにくいが端的にいえば ccvs)を Bounds checking gcc でコンパイルしてみたものを常用してみる。 cvs 側の修正点はいまのところ 3つ。
次期 cvs server への課題。
もし PRCS2 や Subversion が利用可能になる前に再構築する気になれば、の話だが。
課題、追記。
pdksh の restricted mode では exec が禁止されないことに気がつく。 これはひどく都合がいい - loginfo から cvs の pid を得られる - のだが、いいんだろうか。
ksh もマニュアルには exec 禁止とは書いていないようである。 実装は禁止しているが。
Single UNIX Specification, Version 2 にはそもそも restricted shell のことが書かれていない。
ふと思ったのだが、 sticky な directory に他人のファイルを作る(hard link する)のは禁止するべきではないだろうか? 消せないのと対になるように。
そうすべきでない理由はあるのだろうか?
頼むまでもなく sjis についてはすでにそうであったらしい。
(coding-system-put 'sjis 'translation-table-for-decode (make-translation-table `((?\\ . ,(make-char 'latin-jisx0201 92)) (?~ . ,(make-char 'latin-jisx0201 126)))))
しかし、この類の式を書く時にいつも思うのは . の後に , を書いていいのだろうか、ということである。 まぁ、動くから書いてしまうし、ここに ,@ を使いたくはないのだが...
,@ を使っても中身がリストじゃないのに使ってもいいのかという疑念が新たに芽生えるだけか...
情報提供によれば、XEmacs では
`(1 ,.(+ 1 1))
とかけるそうな。
そういえば、その昔、1.2 はひとつのトークンになるのだから、 a.b もやはり一つのトークンになるべきではないか、 と主張してあるひとを納得させかけたことがあったものだ。
ふとためしてみると... うぅむ。そのとおりになっている。
だが .a はならないようだ。.1 はなるのに。
情報提供に付記されてのだが、 Emacs でも中途半端に動くらしい。
(read "`(1 ,. 2)") => (\` (1 (\,\. 2))) (eval '(\` (1 (\,\. 2)))) => (1 (\,\. 2))
つまりリーダーはサポートしているが、backquote macro はサポートしていないということのようである。
なお、XEmacs では
(read "`(1 ,. 2)") => (backquote (1 (\,\. 2))) (eval '(backquote (1 (\,\. 2)))) => (1 . 2)
となる。
というわけで advice してしまえば動く模様。動いたからどうだというものでもないが。
(defadvice backquote-process (around commadot activate) (let ((s (ad-get-arg 0))) (if (and (consp s) (eq (car s) '\,\.)) (setq ad-return-value (cons 2 (nth 1 s))) ad-do-it)))
しばらく前から IRC が不調だった原因を調べてみる。 というわけで、とりあえず plum を strace する。
... 0.026955 time() = 965492648 <0.000110> 0.000415 stat("plum.conf", {st_mode=S_IFREG|0600, st_size=6220, ...}) = 0 <0.000935> 0.001519 read(6, "PING :irc.kyoto.wide.ad.jp\r\n", 1024) = 28 <0.000118> 0.001911 time() = 965492648 <0.000110> 0.000396 poll([{fd=4, events=POLLRDNORM}, {fd=6, events=POLLOUT|POLLRDNORM, revents=POLLOUT}], 2, 120000000) = 1 <0.000110> 0.001131 getsockname(4, {sin_family=AF_INET, sin_port=htons(6659), sin_addr=inet_addr("0.0.0.0")}}, [16]) = 0 <0.000152> 0.001173 door_info(0x5, 0xefffd4d0, 0x14, 0x2136c4, 0xef622eb4) = 0 <0.000113> 0.000337 door_call(0x5, 0xefffd4b8, 0, 0x13, 0xef622eb4) = 0 <0.000171> 0.000756 time() = 965492648 <0.000110> 0.000389 stat("plum.conf", {st_mode=S_IFREG|0600, st_size=6220, ...}) = 0 <0.000125> 0.000652 time() = 965492648 <0.000105> 0.000722 write(6, "PONG :irc.kyoto.wide.ad.jp\r\n", 28) = 28 <0.000172> 0.000550 time() = 965492648 <0.000104> 0.000912 poll([{fd=4, events=POLLRDNORM}, {fd=6, events=POLLRDNORM, revents=POLLRDNORM}], 2, 120000000) = 1 <90.472528> 90.473943 getsockname(4, {sin_family=AF_INET, sin_port=htons(6659), sin_addr=inet_addr("0.0.0.0")}}, [16]) = 0 <0.000172> 0.000702 door_info(0x5, 0xefffd4d0, 0x14, 0x2136a8, 0xef622eb4) = 0 <0.000118> 0.000350 door_call(0x5, 0xefffd4b8, 0, 0x13, 0xef622eb4) = 0 <0.005926> 0.006590 time() = 965492738 <0.000108> 0.000413 stat("plum.conf", {st_mode=S_IFREG|0600, st_size=6220, ...}) = 0 <0.000869> 0.002104 read(6, "ERROR :Closing Link: akr[akr@mule.m17n.org] (Ping timeout)\r\n", 1024) = 60 <0.000120> 0.001300 time() = 965492738 <0.000108> 0.000390 poll([{fd=4, events=POLLRDNORM}, {fd=6, events=POLLRDNORM, revents=POLLRDNORM}], 2, 120000000) = 1 <0.000109> 0.001133 getsockname(4, {sin_family=AF_INET, sin_port=htons(6659), sin_addr=inet_addr("0.0.0.0")}}, [16]) = 0 <0.000152> 0.000559 door_info(0x5, 0xefffd4d0, 0x14, 0x2136d8, 0xef622eb4) = 0 <0.000110> 0.000862 door_call(0x5, 0xefffd4b8, 0, 0x13, 0xef622eb4) = 0 <0.000174> 0.000760 time() = 965492738 <0.000110> 0.000388 stat("plum.conf", {st_mode=S_IFREG|0600, st_size=6220, ...}) = 0 <0.000126> 0.000646 read(6, "", 1024) = 0 <0.000113> 0.000587 close(6) = 0 <0.000228> 0.000451 llseek(0x6, 0, 0, 0x1) = -1 EBADF (Bad file number) <0.000101> 0.000328 close(6) = -1 EBADF (Bad file number) <0.000096> 0.001353 time() = 965492738 <0.001605> 0.001882 poll(
ぬぅ。サーバは Ping timeout といっているが、 届いた PING にはすべて PONG を返している。 ブロックしているのは poll だけだからブロック中に PING が来て timeout したというのも考えられない。 なにが起きている? write したのに届いていないってのか?
初期設定に入れる。
ついでに tibet を使って Sony のフォントの OVERLINE をまっすぐに延ばす。
cvs log -r1.492 doc/cvs.texinfo cvs diff -r1.491 -r1.492 doc/cvs.texinfo
ぬぅ。
情報提供のさらなる付記に、 ,. が Common Lisp 由来とあったのだが...
「",@" が用いられるところはどこでも、",." 構文が代わりに用いられる。 それは ",." の後に続くフォームが生成するリストを破壊しても良いことを表すためにである。 たとえば、もっと効率の良いコードを許すのに append の代わりに nconc を用いるようなものである。」 COMMON LISP 第2版, Guy L. Steele Jr.
とゆーわけで ,. というのは実は全然疑問の解答になっていないのであった。
結局、(Common Lisp 的な)解答としては結局 (1 . ,(+ 2 3)) が正しいらしい。
,@ の中にリスト以外をいれるというのは append の非最後尾の引数にリスト以外を与えるのと等価なのに対し、 . のあとに , というのはまさにそのものの定義があって問題なく使えるようである。
akanga is an rc based shell interpreter with additions for
Surfraw: Shell Users' Revolutionary Front Against the World wide web
CBE is revision control system with integrated make-like functions written in pure Java.
CBE can either be used file-based (like CVS) or with a database backend.
IRC をもう少し調べる。 とりあえず PING に PONG と答えるだけのクライアントを作ってみる。
#!/usr/local/bin/zsh coproc strace -rT -o/tmp/ping-pong -s200 socket irc.kyoto.wide.ad.jp 6669 echo pid:$! print -rp - \ 'PASS :ぱすわーど^M NICK :a0b1^M USER a0b1 * * :Tanaka Akira^M' while read -rp line; do print -r - "$SECONDS $line" if [[ "$line" == PING* ]]; then print -rp - "PONG${line#PING}" print -r - "[PONG${${line#PING}%^M}]" fi done
まぁ、zsh なのはご愛敬として、やはりしばらくすると Ping timeout する。
ためしに、PONG のあとにこっちから PING してみる。
#!/usr/local/bin/zsh coproc strace -rT -o/tmp/ping-pong -s200 socket irc.kyoto.wide.ad.jp 6669 echo pid:$! print -rp - \ 'PASS :ひみつ^M NICK :a0b1^M USER a0b1 * * :Tanaka Akira^M' while read -rp line; do print -r - "$SECONDS $line" if [[ "$line" == PING* ]]; then print -rp - "PONG${line#PING}" print -r - "[PONG${${line#PING}%^M}]" print -rp - "PING a0b1 irc.kyoto.wide.ad.jp^M" print -r - "[PING a0b1 irc.kyoto.wide.ad.jp]" fi done
Ping timeout する直前にはこちらからの PING に反応がない。
ついでにいえば、それ以外のタイミングでも PING への反応が数十秒かかることはざらであることが観測された。 むろん即座に返ってくることもあるのだが。
... 1 :irc.kyoto.wide.ad.jp 376 a0b1 :End of MOTD command. 92 PING :irc.kyoto.wide.ad.jp [PONG :irc.kyoto.wide.ad.jp] [PING a0b1 irc.kyoto.wide.ad.jp] 92 :irc.kyoto.wide.ad.jp PONG irc.kyoto.wide.ad.jp :a0b1 183 PING :irc.kyoto.wide.ad.jp [PONG :irc.kyoto.wide.ad.jp] [PING a0b1 irc.kyoto.wide.ad.jp] 214 :irc.kyoto.wide.ad.jp PONG irc.kyoto.wide.ad.jp :a0b1 306 PING :irc.kyoto.wide.ad.jp [PONG :irc.kyoto.wide.ad.jp] [PING a0b1 irc.kyoto.wide.ad.jp] 326 :irc.kyoto.wide.ad.jp PONG irc.kyoto.wide.ad.jp :a0b1 418 PING :irc.kyoto.wide.ad.jp [PONG :irc.kyoto.wide.ad.jp] [PING a0b1 irc.kyoto.wide.ad.jp] 474 :irc.kyoto.wide.ad.jp PONG irc.kyoto.wide.ad.jp :a0b1 566 PING :irc.kyoto.wide.ad.jp [PONG :irc.kyoto.wide.ad.jp] [PING a0b1 irc.kyoto.wide.ad.jp] 655 ERROR :Closing Link: a0b1[akr@mule.m17n.org] (Ping timeout)
また、最後以外のタイミングでも PING への反応が数十秒かかることはざらであることが観測された。
最後の PING からきっかり 90秒で ERROR が返ってくるところを見ると、 すくなくともサーバからクライアントへのデータ通信には問題なさそう。 どこで時間がかかっているのやら。
こうなるとクライアント側でできることはあまりないので、 ネットワークやサーバ側の事情を知っている人に尋ねるか、 あきらめるしかない。
とりあえずあきらめることにして、.org からつなげる他のサーバを使う。 ident/socks が通らないので、最初に接続する時にナニかの timeout を待たなければならないが、 bot 経由であればあまり問題はない。
課題、追記。
dia の man に書いてあるコマンドラインオプションが全く効かないことに気がつく。 --export-to-ps=OUTPUT が使えないと Makefile に .dia -> .eps なルールが書けないのでとても困る。 というわけで調べてみると、install するときに popt が必要だった、というオチであった。 というわけで、popt を install して作り直す。
% dia -e triangle.eps triangle.dia /dev/dsp: No such file or directory %
げーん。
% cd /dev % sudo sh MAKEDEV snd8 % dia /dev/dsp: Device not configured %
まぁ、そらそうだよな。
ふと、Ruby の class や module って Pascal の with に似てるよな、とか思う。
Zorp: Modular Proxy Firewall
ProPolice: Protecting from stack-smashing attacks
予備実験。127.0.0.2 で jail を作って動かすとしたら ipfw はこんな感じにすればいいのかなぁ。
00010 deny tcp from 127.0.0.2 to any setup 00011 allow tcp from 127.0.0.2 22,2401 to any 00012 deny ip from 127.0.0.2 to any 00013 allow tcp from any to 127.0.0.2 22,2401 00014 deny ip from any to 127.0.0.2
でも、(ipfw による制限の無い場合でも)jail 内のから 127.0.0.1 のサーバにつなげないのは謎だ。 jail でなければつなげるのに...
# netstat -a -n|grep 79 tcp4 0 0 127.0.0.1.79 *.* LISTEN # jail path-to-jail xxx 127.0.0.2 /telnet 127.0.0.1 79 Trying 127.0.0.1... telnet: connect to address 127.0.0.1: Connection refused telnet: Unable to connect to remote host # telnet -s 127.0.0.2 127.0.0.1 79 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'.
X11 forwarding 禁止の警告がうっとおしいという意見があったので、 ひさしぶりにcvs のはなし(committer 編)に書き加えてみる。 最初に思いついたのは cvs-rsh を使うことだが、 ふつーは ~/.ssh/config のほうが使いやすいだろうな...
ForwardAgent も同様らしいので書き足す。
chroot 内で sshd を動かしてみる。 ぬぅ。syslog は盲点だったな... どうするのがいいかなぁ。
もな?
ってわけでもないのかも知れないな...
syslog は unix domain socket を中継してやればいいのか。 でも、作らないといけないのかなぁ。どっかにないものか...
ちなみに、同じ device なら hard link でもかまわないらしい。
虫の知らせにより netpipes を調べると --unix オプションがある。 これは素晴らしいと思って試してみると... 悲しいかな netpipes は(当然のごとく) SOCK_STREAM を使うのだが、 syslog は SOCK_DGRAM でないといけないのであった。
まぁ、それはそれとして、専用の syslogd を(jail の外で)起動すればいいだけのことかもしれない。 syslogd に -p がないと困りそうだが...
いやシステムの syslogd に -l を加えるほうが適切か。 ってさらにポータビリティが落ちそうだよな...
serein (VAIO) の disk がクラッシュする。 手元にある唯一の Linux (Kondara-1.1) だったのに... Emacs 環境だったのに... とゆーか、メール・ニュース・IRC 環境だったのに...
ash の -x はシェルファンクション内に影響を及ぼさないことに気がつく。
Deぶan BNU/Linux不徹底入門 2000年夏号を読む。
zftp のいやなところ: resolv.conf を書き換えても zsh を再起動しない限り効かない。
cvs-proxy で、RCS ファイルに格納するようにしてみる。
なお、目的のリポジトリにアクセスするには cvs-rsh-pserver や cvs-rsh を 駆使しなければならないかも知れない。
思うのだが、elisp で記述されたアプリケーションを 単に elisp と表現する人が多いように思われるのはなぜだろうか?
単に elisp については個人的に気になるだけで他の言語でも同じなのだろうか?
.lockdir を CVSROOT 下においておくと、CVSROOT を co するとときに問題が出ることに気がつく。 まぁ、-l をつければ済むことだが。
cvs-proxy による mirror を実運用に近い形ですこし動かしてみる。 cron から起動する気にはなれないが...
でも木に竹を継いだような実装なので作り直しは確定かなぁ。
脈絡もなく生け垣オートマトンについて調べる。
久しぶりにリンク集を更新するべく google で探索。 The History of Anonymous CVS を見つける。 それはともかく、更新の結果、バランスが悪くなってしまったような気がする。
とある、もともとあまり正しくないコードを、 さらに少し改悪した場合、 その改悪が結果の正しさに影響を与えるかどうかについて考察する。
ratpoison: simple Window Manager like GNU screen.
いきなり xclock が全画面に出たのには驚いたね...
思いつき: IP マスカレードの類を使って、透過的な port forwarding を実現すると便利な人もいるかも知れない。
疑問: ssh の port forwarding はセッションの途中でポートとかを増やせるのだろうか?
LISPF4 is an Interlisp Lisp interpreter written in Fortran and ported to C (Windows and Linux).
[latest]