天泣記

2005/08/01

#1

任意団体も固定資産を持てば税金を払うという話を聞く。

とすると、任意団体で物を持つのは面倒臭いものなのかも。

2005/08/05

#1

VMware に入れた FreeBSD は、たまに disk アクセスでエラーが起きて、ダイアログボックスが出て仮想マシンが止まってしまうという問題が出たのだが、それはどうやら disk が大きすぎたらしい。 デフォルトの 4G を 2台つなげる設定にしてからは数日経ってもエラーにならず動いている。

というわけで、定期的に gcc をつくってそれを使って ruby を作り、build 中のメモリの使用状況を調べられる。

http://www.rubyist.net/~akr/chkbuild/freebsd-5.4/

調べてみると、gcc を build するときには、 最大で 80M くらいメモリを使っている。 ただ、swap が起きているのでもっと使っているのかも知れない。 仮想マシンのメモリを増やすべきか。

ruby は、最大で 60M弱という感じである。 こっちは、swap は起きていない。

2005/08/06

#1

メモリを増やしてみると、gcc の build でも swap が起きなくなり、 maximum resident set size は 140M 程度になった。

2005/08/08

#1

65599 * 2390421439 - 0x100000000 * 36510 = 1

2005/08/09

#1

ruby の build は 60M くらいだから、余裕を見て制限を 100M にしてみる... と、 boron での build が dl.c で失敗してしまった。

やはりシステム毎に消費メモリは違うので、どうにかして FreeBSD 以外でも測定すべきか。

あるいは、dl.c に文句をつけるべきか。

2005/08/11

#1

あるサービスを使うときに、特定の使いかたをすると普通よりも高い負荷をサーバにかけられるとしよう。

これは DoS 脆弱性か?

#2

cvs.m17n.org の移行の前に、まず commit ML を移動する。

(自分の管理下にない) fml に移行したので、アドレスに + が入っていた人は移行できなかった...

2005/08/12

#1

ふと、木構造として実装された文字列を regex でマッチすることを考える。

regex が DFA ならとくに難しいことはなさそうである。 文字列の木構造を再帰的にたどって、個々の文字を順に DFA に放りこんでいけばいい。

でも、バックトラックでやっていたらどうだろう? ここで、バックトラックは文字列の左から右に向けての再帰で実装されると想定するが、 文字列をたどること自体も再帰なので、うまく組み合わせるだろうか?

むろん、継続を使えば可能だろう。 また、文字列内の位置を表現するオブジェクトを作ってもいいだろう。

では、それらを使わず、ふたつの再帰を再帰のままで書けるだろうか?

#2

もうすこし考えてみると、ふたつの stack は入れ子でなく動作する。

regex の再帰を普通に行うと、バックトラックのときに tree の再帰状態が以前の状態に戻る。 戻る状態は戻る前よりも深い再帰レベルの場合もあり得る。

もし、tree の再帰を普通に行うと (つまり文字列を順にたどるだけにすると)、 regex で複数の可能性を試すために再帰で分岐するところで、すべての分岐を同時に進めていく必要がある。

どっちにしても片方を普通の再帰にすればもう一方は普通の再帰ではすまない。 というわけで両方とも再帰で書くのは無理である。

だから、どちらかを再帰が不要な形にしなければならない。

スタックを (継続でも CPS なクロージャでもノードのリストでもなんでもいいが) first class object として保持するのも、 文字列のインデックスから毎回木をたどるのも、 DFA にするのも、 結局は再帰に縛られないためである。

#3

この知見を一般化すると、再帰的なデータ構造はその形以外の再帰をユーザから奪う、というところか。

... そういえば、リストが左から始まるのは右から再帰する可能性をかなり奪っているな。

#4

それはそれとして、ふと木から葉をリストみたいに取り出すコードを call/cc で書いてみる。

gosh>
(define (acc f seed tree)
  (cond
    ((null? tree) seed)
    ((char? tree) (f seed tree))
    ((pair? tree) (acc f (acc f seed (car tree)) (cdr tree)))))
acc
gosh> (acc (lambda (val ch) (display ch)) () '((#\a #\b) () (#\c . #\d)))
abcd#<undef>
gosh> (acc cons () '((#\a #\b) () (#\c . #\d)))
((((() . #\a) . #\b) . #\c) . #\d)
gosh>
(define (make-traverser tree)
  (lambda ()
    (call/cc (lambda (k) 
      ((acc
        (lambda (k ch)
          (call/cc (lambda (k2)
            (k (cons ch (lambda () (call/cc k2)))))))
        k       
        tree) #f)))))
make-traverser
gosh> (define t (make-traverser '((#\a #\b) () (#\c . #\d))))
t
gosh> (t)
(#\a . #<closure 0x815f020()>)
gosh> ((cdr (t))) 
(#\b . #<closure 0x8165dc0()>)
gosh> ((cdr ((cdr (t)))))
(#\c . #<closure 0x8165a40()>)
gosh> ((cdr ((cdr ((cdr (t)))))))
(#\d . #<closure 0x81655e0()>)
gosh> ((cdr ((cdr ((cdr ((cdr (t)))))))))
#f

まぁ、call/cc なんて使わずに CPS で書いたほうが簡単だった気はする。

2005/08/13

#1

Linux 2.6 の wrong checksum の UDP の select の話は (だいたい) 直っていたのか...

[ruby-talk:151776]

#2

chkdisk を動かしている(実体の)マシンの disk の調子が悪い。 うぅむ。

#3

Xen を試そうと思い立つ。

が、VMware の中では動かない感じ?

2005/08/14

#1

80G の disk を買ってきて増設し、とりあえず (VMware から) sarge を入れてみる。

#2

LVM を少し試す。

2005/08/15

#1

既存の disk を外し、新しい disk だけにして boot してとちゃんと起動することを確認する。

#2

Xen を実マシンにいれて少し試す。

VMware Workstation と比較して、とりあえずいくつか利点・欠点を感じた。

もしかすると、Xen で運用する仮想マシンを VMware からインストールすれば面倒がないのかも知れない。 まぁ、カーネルは Xen に port されたのを domain0 に用意するので、そこは手動になるけれど。

install には他の emulator を使うという手もあるか?

2005/08/20

#1

若狭家のメニューについて考えてみる。

海鮮丼で具が 12種類あり、 具が1種類、2種類、3種類のがメニューに載っている。

組合せでは 12C1 + 12C2 + 12C3 = 298 種類になるが、 12C3 の部分はすべてはメニューに載っていない感じである。

抜けている部分に規則性はあるだろうか? (食い合わせとか?)

2005/08/21

#1

ruby 1.8 に ripper を install してみる

% cvs -d :pserver:anonymous@cvs.ruby-lang.org:/src co ruby
% cd ruby                                                 
% autoconf                                                
% ./configure                                             
% make
% cp lex.c ext/ripper
% cd ext/ripper
% rm ripper.o
% vi depend
% cvs diff depend
Index: depend
===================================================================
RCS file: /src/ruby/ext/ripper/depend,v
retrieving revision 1.9
diff -u -p -r1.9 depend
--- depend      6 Jun 2005 07:37:07 -0000       1.9
+++ depend      21 Aug 2005 15:22:56 -0000
@ -3,23 +3,11 @@ common: src rb
 src: ripper.c eventids1.c
 rb: $(srcdir)/lib/ripper/core.rb
 
-ripper.o: ripper.c $(hdrdir)/lex.c eventids1.c $(srcdir)/eventids2.c
+ripper.o: ripper.c
 
 .y.c:
        bison -t -v -o$@ $<
 
-ripper.y: $(hdrdir)/parse.y $(srcdir)/tools/preproc.rb
-       $(RUBY) $(srcdir)/tools/preproc.rb $(hdrdir)/parse.y > $@
-
-eventids1.c: $(hdrdir)/parse.y $(srcdir)/tools/generate-eventids1.rb ids1
-       $(RUBY) $(srcdir)/tools/generate-eventids1.rb ids1 > $@
-
-ids1: $(srcdir)/tools/list-parse-event-ids.rb $(hdrdir)/parse.y
-       $(RUBY) $(srcdir)/tools/list-parse-event-ids.rb -a $(hdrdir)/parse.y > $@
-
-ids2: $(srcdir)/tools/list-scan-event-ids.rb $(srcdir)/eventids2.c
-       $(RUBY) $(srcdir)/tools/list-scan-event-ids.rb -a $(srcdir)/eventids2.c > $@
-
 $(srcdir)/lib/ripper/core.rb: $(srcdir)/lib/ripper/core.rb.in ids1 ids2 $(srcdir)/tools/generate-ripper_rb.rb
        $(RUBY) $(srcdir)/tools/generate-ripper_rb.rb $@.in ids1 ids2 > $@
 
% cp ripper.c ripper.c-
% vi ripper.c
% diff -u ripper.c- ripper.c
--- ripper.c-   2005-08-22 00:15:49.000000000 +0900
+++ ripper.c    2005-08-22 00:10:46.000000000 +0900
@ -10020,13 +10020,13 @@
     while (c = nextc(), ISALPHA(c)) {
        switch (c) {
          case 'i':
-           options |= ONIG_OPTION_IGNORECASE;
+           options |= RE_OPTION_IGNORECASE;
            break;
          case 'x':
-           options |= ONIG_OPTION_EXTEND;
+           options |= RE_OPTION_EXTENDED;
            break;
          case 'm':
-           options |= ONIG_OPTION_MULTILINE;
+           options |= RE_OPTION_MULTILINE;
            break;
          case 'o':
            options |= RE_OPTION_ONCE;
@ -13834,6 +13834,7 @@
 
     return Data_Wrap_Struct(0, parser_mark, parser_free, p);
 }
+#endif
 
 /*
  *  call-seq:
@ -13851,7 +13852,6 @@
     Data_Get_Struct(vparser, struct parser_params, parser);
     return ruby__end__seen ? Qtrue : Qfalse;
 }
-#endif
 
 #ifdef RIPPER
 #ifdef RIPPER_DEBUG
% ruby-1.8 extconf.rb 
% make
% make install

まぁ、ripper 自体は ruby 1.9 のものであり、ruby 1.9 の文法を受け付けるが。

2005/08/24

#1

ふと、w3m が inline image の表示先のウインドウをどうやってみつけているかを調べる。

w3mimg/x11/x11_w3mimg.c :

if ((id = getenv("WINDOWID")) != NULL)
    xi->window = (Window) atoi(id);
else
    XGetInputFocus(xi->display, &xi->window, &revert);

というわけで、WINDOWID があればそれを使い、なければフォーカスのあるウインドウを使うらしい。

#2

ある人物と議論し、Scheme への夢を壊してしまった...

Scheme の仕様を誤解しており、special form や macro の値を動的に扱えると信じておられた。

たしかに、ある程度そういうことを許す実装はあり得るし、 また scm の実装を読んだことがあるそうで、 そういえば、scm の procedure->macro とかはそういう匂いがするし、 scm は macro の定義が変わったら展開しなおすという話もあるのだが... 仕様としてはそういうわけではないんだよなぁ。

2005/08/25

#1
% google-count 台風{が,の,で,に,を,は}足止め
4       台風が足止め
22      台風の足止め
1040    台風で足止め
101     台風に足止め
9       台風を足止め
0       台風は足止め

2005/08/29

#1

ふと思ったのだが、event driven と thread の表現能力がだいたい同じだとすれば、 全部 thread なスタイルでやる GUI ライブラリというのもあり得るのだろうか。

#2

exim で .forward-xxx を使う方法を調べる


[latest]


田中哲