天泣記

2000/12/03

#1

muxconnect connects a child processes stdin and stdout to an accept()ed socket connection.

ぬぅ。

#2

透過できるようになるのか...

#3

GNU Visual Debugger

#4

Algorithms on Strings, Trees, and Sequences, Dan Gusfield をながめる。

目次を見ると BM や KMP が Classical Method に分類されていてうなる。

2000/12/04

#1

awk では 16進で数値を書けないことに気がつく。

2000/12/05

#1

ふと「永遠の 21歳」を主張するにはどのように基数を制御すればいいかについて考える。

「永遠の 10歳」なら自明だが 21歳だと... n = 2r+1 だから、基数を (n-1)/2 にすればいいわけか。

2000/12/06

#1

string 関連のアルゴリズムの本はあと一冊知っています。

Text Algorithms, Maxime Crochemore and Wojciech Rytter

(以前の)講座にあっただけで、今は手元にありませんが。

#2

for-each でメールを送りますか...

たしかに、for-each は有意な値を返さないので、関数として書きにくいのは確かなんですが。

#3

xmon は中継しているだけなので、 中継先のサーバ用の cookie をつかえばいいはずです。 単純な疑似サーバはだいたいそうみたいです。

中継によって cookie が変わる疑似サーバもないわけではありません。 ssh しか知りませんが。 (しかし、ssh は security extension で生成された cookie をサポートしないのだろうか?)

2000/12/07

#1

プロジェクト杉田玄白にはアリスがあるのか。

#2

イメージサーチャ for Java

2000/12/08

#1

cvs の compctl 設定は昔書きましたけどね。 (zshusers に送ったが誰も反応しなかった。コマンドひとつに 300行以上というのは非常識だったのかもしれない。 ま、いまや _cvs は 900行を越えているが。)

でも、-m の引数に Fix. と Update. を補完するのはなんというか... どうせなら Hoge. とか Moge. とか Arege. とか Guha. にするともはや感心するしかないのですが。

2000/12/09

#1

日記なら、そんなものかも知れませんねぇ。 私も update だけですし。 ただし、-m update は補完じゃなくて Makefile に書いて make commit としていますが。 (ってゆーか make com<TAB> だけど。)

それはそれとして、12/9 のぶんが ISO-2022-JP を US-ASCII とみたてて & と < と > を実体参照に変えたような変換がされているのは どうでもいいとしても、 option のところに CR があるのはなぜなのだろう?

#2
sed -e 's/&gt;/>/g' -e 's/&lt;/</g' -e 's/&amp;/&/g'

として &amp; が変換されなくて 1分悩む。

#3

はじめて truss を truss する。

truss は /dev/null を open して 0, 1, 2 を埋めてから exec することに気がつく。

2000/12/10

#1

ふと TurboLinux を使用してみると、 /etc/zshenv 等が気に食わなかったので、 home で zsh を作る時は --enable-etcdir を設定することにする。

#2

TurboLinux には /etc/redhat-release が存在しないことに気がつく。

2000/12/11

#1

zsh では 10 以上の file descriptor を指定できないことに気がつく。

いくつか試してみると... Bourne shell 系で 10以上が扱えるのは bash くらいのものなんだな。 rc は当然なんの問題もない。さすが構文からして違うだけのことはある。

2000/12/12

#1

zsh の exec はコマンドが存在しなくてエラーになっても制御が戻ってこないことに気がつく。

調べてみるとこれで規格通りらしい。

2000/12/14

#1

眠れなくて考えごとをしていると数年来の疑問が解ける。嬉しい。

正規表現中の位置に対応する文字列の位置を得ることを、 DFA の状態遷移で文字列中の位置を記録することによって実現できるか、 という疑問である。

(端的に emacs の match-beginning, match-end などと同様の機能を DFA で実現できるか、 とも表現できる。)

正規表現 p, q と文字列 s が与えられ、pq に s がマッチした場合、 s=vw であり、p に v がマッチし、q に w がマッチする文字列 v, w が存在する。 ここで、pq に対応する DFA 中の状態遷移でその状態遷移の起きた位置を記録することにより、 DFA によるマッチの終了後、|v| を得ることができるだろうか、とも表現できる。

曖昧な場合は当然うまくいかないと想像されるので、 実現できる条件は何か、 曖昧でなければうまくいくのか、 という疑問ともいえる。

曖昧でないとは、 正規表現 p, q に対して次のような文字列 v, u, w (|u|>0) が存在しないこと。 p に v および vu がマッチし、 q に uw および w がマッチする。

結局、曖昧でないだけではだめだったのだが。

p=ab|abb, q=b|bbb とすると、L(pq)={abb, abbb, abbbb, abbbbb} であり、 p と q の境目は曖昧ではなく、/ で表すと {ab/b, abb/b, ab/bbb, abb/bbb} である。 この場合、DFA が 4文字目を読んだ時点では p にマッチする文字列の長さが 2 であるか 3 であるかを判断できない。

実は、曖昧でないだけでなく、 u が L(q) の左端として現れないことが必要なのであった。

件のことが実現できる十分条件: 正規表現 p, q に対して次のような文字列 v, u, w (|u|>0) が存在しないこと。 p に v および vu がマッチし、 q に uw がマッチする。

つまり、曖昧でない条件から、q に w がマッチするという条件を外したわけである。 (¬∃ 内部の成立条件を外して弱めているので、全体としての条件は強まっている。)

一般に、p に対応する DFA P と q に対応する DFA Q を考え、 それらを連結して pq に対応する NFA R を作ることができる。 これは、P の受理状態から Q の開始状態への ε遷移を作ってつなげればよい。

一般に、NFA を subset construction で DFA に変換すると、 DFA の状態は NFA の状態の集合に対応する。 したがって、R を DFA R' に変換すると、R' の状態は R の状態の集合に対応する。

なお、R の構造から自明であるが、R' の各状態には P の状態はたかだかひとつしか含まれない。 これは P が DFA であるためで、非決定的な遷移が存在せず、状態が分裂しないからである。 Q も DFA であり、Q 内部では状態は分裂しないが、P から Q への遷移が複数回起こることにより、 Q の複数の状態が R' のひとつの状態に含まれ得る。

しかし、件の十分条件が満たされている場合には、R' の各状態には Q の状態もたかだかひとつしか含まれない。 まず、R' の開始状態では P の開始状態のみからなるので、Q の状態はひとつも含まれていない。 p にマッチする文字列 v を読み込んだ後、R' の状態は Q の開始状態を含むことになる。 つぎに文字列 u を読み込み(vu が p にマッチするとすれば), R' の状態はまた Q の開始状態を含む事になる。 しかし、q は u を先頭に持つ文字列にはマッチしないので、 その時点の状態はその Q の開始状態以外には Q の状態を含まないことが保証される。 (うぅむ。展開が甘いな。)

したがって、Q の開始状態に達した時点で毎回その位置を(上書きして)記録すれば、 その記録は R' の状態が Q の状態を含まなくなるまで保存される。 そして、R' の受理状態は Q の受理状態であるから、R' の受理状態では保存されている位置は正しく p と q の境を指していることになる。

捕捉: 正規表現 p, q, r があって、L(r) の要素がすべて同じ長さ l であり、 prq の境目を検出したい場合、r の左右どちらの位置を記録しても、 l を加えるか減じるかによってもう一方の位置を得ることができる。 しかし、この場合、p と rq ではなく、pr と q の境目を検出する方が件の条件を成立させやすい、 と思うのだが...

#2

なお、眠れない理由は単に早寝に挑戦したからである。これには失敗したわけだが。

2000/12/15

#1

むろん、そのとおりで右側の & のせいです。

#2

自動生成されるファイルが update で conflict するのに嫌気がさし、Sticky Tag をつける。

#3

一般に、bootstrap する類のものを cvs で管理するにはどうしたらいいだろうか?

#4

AIX のマニュアルは HTML であることに気がつく。

man を strings してみると /usr/bin/java という文字列が散見されることにも気がつく。

#5

UnixWare のマニュアルも HTML であることに気がつく。

2000/12/16

#1

FreeBSD でマニュアルが圧縮されていると neqn が動かないことに気がつく。 (たとえば、man XAllocColor として delim %% とかが出る。)

報告しておく。

2000/12/18

#1

更新時刻の推測に挑戦。

ruby のバグでしばらく悩む。

#2

2000/12/19

#1

単純なアルゴリズムでも非常に的確な推定が可能であることがわかる。

相手が cron だからだが。むろん。

#2

妹背山 * 1.5 (ないしは芙蓉 * 0.6)をつくって少しうける。(子供に)

2000/12/20

#1
#2
#3

Last-Modified: な時刻には必ずしもアクセスできないことに気がつく。 うぅむ。

2000/12/21

#1

conflict する、つまりリポジトリにはいっているものを .cvsignore でどうにかできるだろうか?

#2

(極小に陥ることを防ぐための)摂動が効き過ぎていたのでとりあえず無効にする。

2000/12/23

#1

世の中のすべてのリポジトリを好きにいじれるなら、 リポジトリに入れないという選択肢を 常に選べるんですけどねぇ。

#2

そうかも知れないし、そうでないかも知れない。 尋ねればわかるかも知れないが、 尋ねること自体が相手に影響を与えてしまうかも知れない。 難しいものだ。

#3

(低レベル)プロトコルライブラリの要件

プロトコルの種類を問わず期待したい性質としては他に何があるだろうか?

#4

FreeBSD/OpenBSD で non-blocking な socket を存在しない(ないしは落ちている)ホストに connect したとき、 EINVAL が生成されることに気がつく。

% ruby -e 'require "socket"; TCPSocket.open("non-existing-host", 80)'  
-e:1:in `open': Invalid argument - "connect(2)" (Errno::EINVAL)
        from -e:1
#5

cvs が automake 化されている...

2000/12/24

#1

subversion で UTF-8 の話が出ているな...

#2

read only だろうが他人の持ち物だろうが flock できることに気がつく。

#3

LIRS.pm を読む。タイトルに %5c とかを入れたくなる。

lirs.rb を読む。タイトルに %2c を入れたくなる。

たまてばこの lirs.rb を読む。タイトルを \ で終りたくなる。

2000/12/25

#1

たまに 408 Request Timeout が出る。

他のスレッドが getaddrinfo (あるいは gethostbyname?) で 80秒ばかりブロックするのが問題の模様。

ブロックする原因は AAAA な query に対して DNS server の返事(NXDomain)に時間がかかることらしい。 特定の名前を特定のサーバで引く時だけ遅れるというのが不思議。

その原因は... 疲れたので原因追求は少し中断。

#2

改善案

2000/12/26

#1

OpenVCS

2000/12/27

#1

「実際問題としては、自然発生的日常的な問題を、曖昧さを含まない一つただ一つの形で定義することなど不可能である。 だが一方、問題についてのなんらかの共通理解がなかったら、解答を出してみたところで、 まず間違いなく間違った問題に対する解答と成り終わる。」 ライト、ついてますか, ドナルド・C・ゴース, ジェラルド・M・ワインバーグ

読み直し始めたのだが... やはり思い当たる節が多すぎる。

2000/12/28

#1

broken.el の「宣言していないのは壊れていない」という性質が役に立つ。

良かったのか悪かったのか。

2000/12/30

#1

SunOS 5.6 の flock は LOCK_SH だろうが writable であることを要求することに気がつく。

2000/12/31

#1

80秒の意味を完全に理解する。

#2

つい書いてしまった resolv.rb を実際に使ってみる。

#3

プロトコル上は . を特別扱いする必要がないことに気がつく。


[latest]


田中哲