天泣記

2010-03-01 (Mon)

#1

pty を扱うかについて質問が出たのだが、PTY.open のドキュメントを読み直すと、使い方をすでに書いてあったことを思い出した。

# Change the buffering type in factor command,
# assuming that factor uses stdio for stdout buffering.
# If IO.pipe is used instead of PTY.open,
# this code deadlocks because factor's stdout is fully buffered.
m, s = PTY.open
system("stty raw", :in=>s) # disable newline conversion.
r, w = IO.pipe
pid = spawn("factor", :in=>r, :out=>s)
r.close
s.close
w.puts "42"
p m.gets #=> "42: 2 3 7\n"
w.puts "144"
p m.gets #=> "144: 2 2 2 2 3 3\n"

pty の用法は、とりあえず

というのが思いつくのだが、PTY.open を使えば前者はどうにかなる。

後者は制御端末を変えないといけないが、いまのところ spawn ではできない。(できるようにするなら spawn にオプションを追加することになる)

前者について制御端末を変えないでおくのは、pty を使っても Ctrl-C でプロセスを殺せるとか、むしろ利点のほうが多いのではないかと思う。

2010-03-02 (Tue)

#1

あと、Perl の open3 や Python の subprocess には触れられなかった。

発表の中にもあった、

zcat ruby.1.gz | nroff -man | less

というのをやってみよう。

まず、ruby の open3 だと (発表した中の機能を使って) こうなる。

require "open3"
Open3.pipeline(["zcat", :in=>"ruby.1.gz"], "nroff -man", "less")

perl だとこうである。(open3 じゃなくて open2 だが)

use IPC::Open2;
open F, "ruby.1.gz";
$pid1 = open2(*P, "<&F", "zcat");
$pid2 = open2(*R, "<&P", "nroff -man");
$pid3 = open2(">&STDOUT", "<&R", "less");
waitpid $pid3, 0;

python だとこうである。

from subprocess import Popen, call, PIPE
f = open("ruby.1.gz")
p1 = Popen("zcat", stdin=f, stdout=PIPE)
p2 = Popen(["nroff", "-man"], stdin=p1.stdout, stdout=PIPE)
call("less", stdin=p2.stdout) 

ただし、これだと、p1.stdout や p2.stdout が親プロセスで open されたままになる。これらはパイプの読み込み側なので大きな問題はないが、ちゃんと close するなら以下のようにする。

from subprocess import Popen, call, PIPE
f = open("ruby.1.gz")
p1 = Popen("zcat", stdin=f, stdout=PIPE)
f.close()
p2 = Popen(["nroff", "-man"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()
p3 = Popen("less", stdin=p2.stdout) 
p2.stdout.close()
p3.wait()

ところで、パイプラインの右側からコマンドを起動していくと以下のようになるが、ここでは close が必須である。

from subprocess import Popen, call, PIPE
p3 = Popen("less", stdin=PIPE)
p2 = Popen(["nroff", "-man"], stdin=PIPE, stdout=p3.stdin)
p3.stdin.close() 
f = open("ruby.1.gz")
p1 = Popen("zcat", stdin=f, stdout=p2.stdin)
p2.stdin.close() 
p3.wait()

close しないと、nroff や less は EOF を検知できず、うまく動かない。これは親プロセスにパイプの書き込み側が残っているためである。パイプの書き込み側がひとつでも残っている限り、カーネルはデータがまだ書き込まれる可能性があると想定し、読み込み側に EOF を発生させない。

ところで、perl でも、右側から起動していくと close が必要になる。

use IPC::Open2;
$pid3 = open2(">&STDOUT", *R, "less");
$pid2 = open2(">&R", *P, "nroff -man");
close(R);
open F, "ruby.1.gz";
$pid1 = open2(">&P", "<&F", "zcat");
close(P);
waitpid $pid3, 0;

しかし、左側から起動する場合、(python とは違って) 親プロセスで P や R が open されたままになるわけではない。これは、open2 は、"<&" で指定されたものを親プロセスで close するからである。

さて、perl の open2 や python の subprocess は、パイプでコマンドをつなぐということができる。これは、外からパイプ (や他の fd) を与えて使わせることができるからである。発表中でも触れたが、ruby の Open3.popen3 はパイプを無条件に新しく 3本作るので、これはできない。

しかし、パイプのつなぎかたによっては close が必要になる。perl の open2 の "<&" が close も意味するというのはなかなか役に立つが、副作用として自然とは思えないので、それを選ばなかった python に文句を言う気にはなれない。

ruby の Open3.pipeline は、親プロセスにパイプを残さない、別のデザインである。Open3.pipeline では、親プロセスにはパイプは残らない。perl の open2 や python の subprocess がコマンドをひとつずつ起動するという API になっている都合上パイプを呼出側が扱う必要があるのだが、Open3.pipeline ではライブラリ側ですべてやってしまい、コマンド間のパイプが呼出側に出てくることがない。そのため、ライブラリはためらうことなく適切にパイプを close することができる。複数のコマンドをいちどに指定可能な高位API には、ライブラリがそういう自由度を得られるという利点がある。

2010-03-03 (Wed)

#1

open は制御端末を獲得するか?

たしか、GNU/Linux ではするんだよねぇ、と思って試してみると、以下のように獲得しない。

% uname -mrsv
Linux 2.6.26-2-amd64 #1 SMP Tue Jan 12 22:12:20 UTC 2010 x86_64
% tty
/dev/pts/7
% ruby -ve '
Process.wait fork {
  p open("/dev/tty") rescue p $!
  Process.setsid
  p open("/dev/tty") rescue p $!
  p open("/dev/pts/7") rescue p $!
  p open("/dev/tty") rescue p $!
}'
ruby 1.8.7 (2008-08-11 patchlevel 72) [x86_64-linux]
#<File:/dev/tty>
#<Errno::ENXIO: No such device or address - /dev/tty>
#<File:/dev/pts/7>
#<Errno::ENXIO: No such device or address - /dev/tty>

だが、/dev/pts/7 じゃなくて、/dev/ttyUSB0 だと獲得する。

% ruby -ve '
Process.wait fork {
  p open("/dev/tty") rescue p $!
  Process.setsid
  p open("/dev/tty") rescue p $!
  p open("/dev/ttyUSB0") rescue p $!
  p open("/dev/tty") rescue p $!
}'
ruby 1.8.7 (2008-08-11 patchlevel 72) [x86_64-linux]
#<File:/dev/tty>
#<Errno::ENXIO: No such device or address - /dev/tty>
#<File:/dev/ttyUSB0>
#<File:/dev/tty>

ちょっと悩んだあと、/dev/pts/7 を制御端末とするプロセスがすでに存在するからかな、と予想して、以下のようにフレッシュな擬似端末で試したらちゃんと獲得する。

% ./ruby -rpty -ve '
m, s = PTY.open
Process.wait fork {
  p open("/dev/tty") rescue p $!
  Process.setsid
  p open("/dev/tty") rescue p $!
  p open(s.path) rescue p $!
  p open("/dev/tty") rescue p $!
}'
ruby 1.9.2dev (2010-03-02 trunk 26792) [x86_64-linux]
#<File:/dev/tty>
#<Errno::ENXIO: No such device or address - /dev/tty>
#<File:/dev/pts/8>
#<File:/dev/tty>
#2

竹内郁雄先生の最終講義を聴講した。

2010-03-04 (Thu)

#1

最終講義の中で、多人数のじゃんけんであいこを少なくする方法という話があったが、どう考えるか。

n人いて、各人が 0, 1, 2 のいずれかを提示したとき、3進法で n桁の整数が得られる。最小0, 最大 3**n-1 であり、これを n で割った余りをとって勝者を決めればいい? 厳密に勝率を等しくするため、n の倍数のうち 3**n 以下の最大のもの以上だったらあいことしてやりなおす

まぁ計算機の支援が必要になると思うが...

なお、両手を使うことにすれば、2n桁得られるのであいこの率を減らせる。(参加者はみんな器用で、両手の相関無しにグー・チョキ・パーを出せると仮定しよう)

両足も使えば 4n桁。(参加者はみんな器用で、ちゃんと足でグー・チョキ・パーを表現できると仮定しよう)

グー・チョキ・パーの 3つ以外になにか導入すればさらに減らせるがじゃんけんという題意を尊重してそれはやめておこう。

しかし、本当にうまくいくだろうか。各人が純粋にランダムに提示するならうまくいくが、そうでなければ?

2010-03-05 (Fri)

#1

いや、だめか。

n=3 なら、a*9+b*3+c % n = c になって、特定の参加者が勝者を決めることができてしまう。

n じゃなくて、nよりも大きく 3と互いに素な値で割ればいい? (余りが n 以上になったらあいことしてやりなおし)

#2

結局、ハッシュなのだろうとは思う。

SHA256 して nで割った余り、とかいっておけば素人はごまかせるかも。(玄人はごまかせない気がする)

2010-03-08 (Mon)

#1

pwd はどのような状況で失敗するか?

伝統的な pwd (あるいは getcwd()) の実装は、"." を stat して ".." を opendir/readdir/closedir して、inode を比較してパス名の最後の要素を求める。".." を stat して "../.." を opendir/readdir/closedir して最後から2つ目の要素を求める。"../.." を stat して "../../.." を opendir/readdir/closedir して最後から3つ目の要素を求める。以下同様にしてルートディレクトリに到達するまで (inode が変わらなくなるまで) 繰り返す、というものだったと思う。

とすると、stat と opendir の失敗が問題である。

あからさまに失敗の原因になりそうなのはパーミッションである。読み込み不能なディレクトリがあれば、opendir が EACCES になるだろう。

% mkdir -p /tmp/a/b/c   
% cd /tmp/a/b/c
% chmod 000 /tmp/a
% pwd
/tmp/a/b/c

なぜか失敗しない。

% uname -mrsv 
Linux 2.6.26-2-486 #1 Sat Dec 26 08:37:39 UTC 2009 i686
% strace pwd
...
getcwd("/tmp/a/b/c"..., 4096)           = 11
...

どうも Linux には getcwd というシステムコールがあるらしい。

#2

しかたがないので、pwd を自分で書いてみよう。

% cat /tmp/pwd
#!/usr/bin/ruby

wd = []

d1 = "."
d2 = ".."

while true
  s1 = File.stat(d1)
  s2 = File.stat(d2)
  break if s1.dev == s2.dev && s1.ino == s2.ino
  found = nil
  Dir.entries(d2).each {|n|
    next if /\A(?:\.|\.\.)\z/ =~ n
    s3 = File.stat(File.join(d2, n))
    if s1.dev == s3.dev && s1.ino == s3.ino
      found = n
      break
    end
  }
  unless found
    raise "target directory not found"
  end
  wd.unshift found
  d1 = d2
  d2 = File.join(d2, "..")
end

puts File.join("/", *wd)

こうすれば、ちゃんと EACCES になる。

% mkdir -p /tmp/a/b/c
% cd /tmp/a/b/c
% chmod 755 /tmp/a
% /tmp/pwd        
/tmp/a/b/c
% chmod 000 /tmp/a
% /tmp/pwd        
/tmp/pwd:13:in `open': Permission denied - ../.. (Errno::EACCES)
        from /tmp/pwd:13:in `entries'
        from /tmp/pwd:13
#3

ところで、Ruby の Dir には、readdir の結果の d_ino を取得する機能がない。そのためにここではいちいち stat している。

おそらく、d_ino を使えれば、stat をかなり減らせる。

ただ、d_ino がどのくらい信用できるかというと (マウントポイントのあたりとか) 微妙なところなので、stat して調べるのも fallback として実装しないといけないだろうな。

2010-03-16 (Tue)

#1

Issue 1696: panic by setsockopt - DragonFly issue tracker

2010-03-21 (Sun)

#1

transcode の変換テーブルの生成にいくらか手を入れてみた。

とりあえず 1週間ほど前から、生成する時に

generating newline.c ...
converter for universal_newline
converter for crlf_newline
converter for cr_newline
done.  (0.05user 0.00system 0.03elapsed)

というように消費時間を表示するようにしてあるので、それ以降の情報を chkbuild のログから取り出してグラフにしてみよう。

まず、ファイル名と消費時間の行だけ取り出す。

% zegrep 'generating.*\.\.\.|done\.  \(' tmp/public_html/ruby-trunk/log/201003*log* > ~/0

で、エディタで消費時間がないころのを削除して、以下のようなファイルにする。

tmp/public_html/ruby-trunk/log/20100313T065100.log.txt.gz:generating newline.c ...
tmp/public_html/ruby-trunk/log/20100313T065100.log.txt.gz:done.  (0.04user 0.01system 0.02elapsed)
tmp/public_html/ruby-trunk/log/20100313T065100.log.txt.gz:generating enc/trans/big5.c ...
tmp/public_html/ruby-trunk/log/20100313T065100.log.txt.gz:done.  (11.16user 0.14system 11.37elapsed)
...

これを以下のようにして gnuplot の形式にしたてる。

% ruby -e '  
h = {}
ARGF.each_slice(2) {|lines|
  t = lines[0][/\d{8}T\d{6}/]
  filename = lines[0][/[^\/ ]+(?=\.c)/]
  sec = lines[1][/[0-9.]+(?=user)/]
  (h[filename] ||= []) << [t, sec]
}
fs = h.keys.sort_by {|f| h[f].inject(0) {|s, (t,sec)| s+sec.to_f } }.reverse
puts "set timefmt \"%Y%m%dT%H%M%S\""
puts "set xdata time"
puts "set ylabel \"user time [s]\""
print "plot ", fs.map {|f| "\"-\" using 1:2 with linespoints title \"#{f}\"" }.join(",")
puts
fs.each {|f|
  puts h[f].map {|t,sec| "#{t} #{sec}" }, "e"
}
' ~/0 > ~/1

できあがったものは以下のようになる。まぁ、GB18030 は半分くらいになったか。

transcode-tblgen.png

transcode-tblgen.gp:

set timefmt "%Y%m%dT%H%M%S"
set xdata time
set ylabel "user time [s]"
plot "-" using 1:2 with linespoints title "gb18030","-" using 1:2 with linespoints title "big5","-" using 1:2 with linespoints title "japanese_euc","-" using 1:2 with linespoints title "korean","-" using 1:2 with linespoints title "gbk","-" using 1:2 with linespoints title "japanese_sjis","-" using 1:2 with linespoints title "chinese","-" using 1:2 with linespoints title "emoji_iso2022_kddi","-" using 1:2 with linespoints title "emoji_sjis_kddi","-" using 1:2 with linespoints title "emoji_sjis_softbank","-" using 1:2 with linespoints title "emoji_sjis_docomo","-" using 1:2 with linespoints title "single_byte","-" using 1:2 with linespoints title "emoji","-" using 1:2 with linespoints title "utf8_mac","-" using 1:2 with linespoints title "utf_16_32","-" using 1:2 with linespoints title "iso2022","-" using 1:2 with linespoints title "japanese","-" using 1:2 with linespoints title "escape","-" using 1:2 with linespoints title "newline"
20100313T065100 12.66
20100313T113000 12.75
20100313T161400 13.26
20100313T210700 13.01
20100314T015100 12.95
20100314T073900 13.00
20100314T121900 13.30
20100314T165900 13.57
20100314T224900 13.09
20100315T034200 9.60
20100315T082300 9.56
20100315T141600 9.83
20100315T201300 9.61
20100316T011400 9.87
20100316T061100 10.21
20100316T105300 8.60
20100316T163900 9.09
20100316T212700 8.59
20100317T030700 8.20
20100317T084600 8.16
20100317T163700 8.29
20100318T004701 8.70
20100318T062300 8.76
20100318T110100 7.90
20100318T154300 8.22
20100318T202000 6.88
20100319T020700 7.04
20100319T070300 6.68
20100319T114400 7.34
20100319T172300 7.03
20100319T221000 7.12
20100320T034800 7.08
20100320T114300 6.76
20100320T162700 6.18
20100320T210700 5.39
20100321T024600 5.51
20100321T072900 5.50
20100321T120700 5.63
20100321T164600 5.31
e
20100313T065100 11.16
20100313T113000 11.07
20100313T161400 10.91
20100313T210700 11.17
20100314T015100 11.07
20100314T073900 11.48
20100314T121900 11.70
20100314T165900 11.44
20100314T224900 11.68
20100315T034200 7.49
20100315T082300 7.86
20100315T141600 7.94
20100315T201300 7.76
20100316T011400 7.36
20100316T061100 7.37
20100316T105300 7.10
20100316T163900 7.10
20100316T212700 6.80
20100317T030700 7.03
20100317T084600 7.04
20100317T163700 6.91
20100318T004701 7.08
20100318T062300 6.59
20100318T110100 6.52
20100318T154300 7.27
20100318T202000 6.01
20100319T020700 6.22
20100319T070300 6.17
20100319T114400 6.18
20100319T172300 6.05
20100319T221000 6.14
20100320T034800 6.02
20100320T114300 5.79
20100320T162700 5.67
20100320T210700 5.30
20100321T024600 5.26
20100321T072900 5.22
20100321T120700 5.33
20100321T164600 5.38
e
20100313T065100 6.69
20100313T113000 6.89
20100313T161400 6.66
20100313T210700 6.60
20100314T015100 6.86
20100314T073900 6.94
20100314T121900 6.90
20100314T165900 7.14
20100314T224900 7.06
20100315T034200 5.12
20100315T082300 5.22
20100315T141600 5.28
20100315T201300 5.22
20100316T011400 4.93
20100316T061100 5.30
20100316T105300 4.92
20100316T163900 4.75
20100316T212700 4.74
20100317T030700 4.53
20100317T084600 4.57
20100317T163700 4.68
20100318T004701 4.63
20100318T062300 4.51
20100318T110100 4.56
20100318T154300 4.80
20100318T202000 4.17
20100319T020700 4.16
20100319T070300 4.22
20100319T114400 4.07
20100319T172300 4.26
20100319T221000 4.20
20100320T034800 4.30
20100320T114300 4.35
20100320T162700 4.14
20100320T210700 3.86
20100321T024600 3.83
20100321T072900 3.65
20100321T120700 3.66
20100321T164600 3.55
e
20100313T065100 4.84
20100313T113000 4.56
20100313T161400 4.71
20100313T210700 4.75
20100314T015100 4.84
20100314T073900 5.06
20100314T121900 4.86
20100314T165900 4.95
20100314T224900 4.90
20100315T034200 3.49
20100315T082300 3.64
20100315T141600 3.60
20100315T201300 3.63
20100316T011400 3.49
20100316T061100 3.54
20100316T105300 3.32
20100316T163900 3.28
20100316T212700 3.32
20100317T030700 3.21
20100317T084600 3.24
20100317T163700 3.32
20100318T004701 3.24
20100318T062300 3.22
20100318T110100 3.23
20100318T154300 3.09
20100318T202000 2.98
20100319T020700 2.93
20100319T070300 2.86
20100319T114400 2.95
20100319T172300 2.94
20100319T221000 2.98
20100320T034800 2.79
20100320T114300 2.82
20100320T162700 2.74
20100320T210700 2.55
20100321T024600 2.44
20100321T072900 2.48
20100321T120700 2.55
20100321T164600 2.44
e
20100313T065100 3.79
20100313T113000 3.58
20100313T161400 3.59
20100313T210700 3.78
20100314T015100 3.71
20100314T073900 4.00
20100314T121900 3.84
20100314T165900 3.79
20100314T224900 4.02
20100315T034200 2.73
20100315T082300 2.75
20100315T141600 2.81
20100315T201300 2.72
20100316T011400 2.92
20100316T061100 2.82
20100316T105300 2.52
20100316T163900 2.69
20100316T212700 2.57
20100317T030700 2.43
20100317T084600 2.41
20100317T163700 2.46
20100318T004701 2.52
20100318T062300 2.41
20100318T110100 2.42
20100318T154300 2.50
20100318T202000 2.19
20100319T020700 2.23
20100319T070300 2.29
20100319T114400 2.15
20100319T172300 2.19
20100319T221000 2.21
20100320T034800 2.20
20100320T114300 2.16
20100320T162700 2.12
20100320T210700 1.89
20100321T024600 1.80
20100321T072900 1.88
20100321T120700 1.87
20100321T164600 1.79
e
20100313T065100 2.92
20100313T113000 2.98
20100313T161400 3.02
20100313T210700 3.00
20100314T015100 2.97
20100314T073900 3.16
20100314T121900 3.31
20100314T165900 3.18
20100314T224900 3.16
20100315T034200 2.50
20100315T082300 2.62
20100315T141600 2.68
20100315T201300 2.58
20100316T011400 2.44
20100316T061100 2.48
20100316T105300 2.37
20100316T163900 2.28
20100316T212700 2.34
20100317T030700 2.34
20100317T084600 2.26
20100317T163700 2.35
20100318T004701 2.50
20100318T062300 2.38
20100318T110100 2.30
20100318T154300 2.32
20100318T202000 2.11
20100319T020700 2.14
20100319T070300 2.15
20100319T114400 2.14
20100319T172300 2.11
20100319T221000 2.17
20100320T034800 2.12
20100320T114300 2.05
20100320T162700 2.00
20100320T210700 1.85
20100321T024600 1.82
20100321T072900 1.84
20100321T120700 1.78
20100321T164600 1.83
e
20100313T065100 3.13
20100313T113000 3.16
20100313T161400 3.18
20100313T210700 3.09
20100314T015100 3.10
20100314T073900 3.22
20100314T121900 3.40
20100314T165900 3.48
20100314T224900 3.18
20100315T034200 2.53
20100315T082300 2.69
20100315T141600 2.68
20100315T201300 2.51
20100316T011400 2.54
20100316T061100 2.48
20100316T105300 2.34
20100316T163900 2.39
20100316T212700 2.22
20100317T030700 2.21
20100317T084600 2.20
20100317T163700 2.27
20100318T004701 2.22
20100318T062300 2.26
20100318T110100 2.23
20100318T154300 2.38
20100318T202000 2.05
20100319T020700 2.08
20100319T070300 2.06
20100319T114400 2.01
20100319T172300 2.06
20100319T221000 2.02
20100320T034800 2.03
20100320T114300 1.94
20100320T162700 1.84
20100320T210700 1.72
20100321T024600 1.76
20100321T072900 1.76
20100321T120700 1.75
20100321T164600 1.77
e
20100313T065100 1.97
20100313T113000 1.96
20100313T161400 1.94
20100313T210700 1.99
20100314T015100 1.86
20100314T073900 2.06
20100314T121900 2.15
20100314T165900 2.06
20100314T224900 2.19
20100315T034200 1.43
20100315T082300 1.36
20100315T141600 1.40
20100315T201300 1.31
20100316T011400 1.34
20100316T061100 1.35
20100316T105300 1.30
20100316T163900 1.28
20100316T212700 1.28
20100317T030700 1.35
20100317T084600 1.21
20100317T163700 1.23
20100318T004701 1.26
20100318T062300 1.26
20100318T110100 1.21
20100318T154300 1.34
20100318T202000 1.21
20100319T020700 1.18
20100319T070300 1.07
20100319T114400 1.15
20100319T172300 1.13
20100319T221000 1.14
20100320T034800 1.16
20100320T114300 1.10
20100320T162700 1.09
20100320T210700 1.05
20100321T024600 1.05
20100321T072900 1.02
20100321T120700 1.03
20100321T164600 1.13
e
20100313T065100 1.93
20100313T113000 1.88
20100313T161400 1.92
20100313T210700 1.82
20100314T015100 1.81
20100314T073900 2.01
20100314T121900 2.04
20100314T165900 2.02
20100314T224900 2.14
20100315T034200 1.35
20100315T082300 1.36
20100315T141600 1.31
20100315T201300 1.29
20100316T011400 1.30
20100316T061100 1.27
20100316T105300 1.23
20100316T163900 1.20
20100316T212700 1.18
20100317T030700 1.12
20100317T084600 1.20
20100317T163700 1.23
20100318T004701 1.20
20100318T062300 1.24
20100318T110100 1.18
20100318T154300 1.18
20100318T202000 1.05
20100319T020700 1.14
20100319T070300 1.00
20100319T114400 1.08
20100319T172300 1.10
20100319T221000 1.10
20100320T034800 1.12
20100320T114300 1.13
20100320T162700 1.10
20100320T210700 1.06
20100321T024600 1.02
20100321T072900 1.04
20100321T120700 1.00
20100321T164600 1.19
e
20100313T065100 1.78
20100313T113000 1.75
20100313T161400 1.76
20100313T210700 1.69
20100314T015100 1.69
20100314T073900 1.90
20100314T121900 1.87
20100314T165900 1.82
20100314T224900 1.90
20100315T034200 1.26
20100315T082300 1.29
20100315T141600 1.11
20100315T201300 1.25
20100316T011400 1.23
20100316T061100 1.21
20100316T105300 1.21
20100316T163900 1.21
20100316T212700 1.22
20100317T030700 1.17
20100317T084600 1.23
20100317T163700 1.12
20100318T004701 1.17
20100318T062300 1.15
20100318T110100 1.14
20100318T154300 1.19
20100318T202000 1.20
20100319T020700 1.06
20100319T070300 1.05
20100319T114400 1.08
20100319T172300 1.07
20100319T221000 1.04
20100320T034800 1.12
20100320T114300 1.02
20100320T162700 1.08
20100320T210700 1.02
20100321T024600 0.97
20100321T072900 0.98
20100321T120700 0.98
20100321T164600 1.12
e
20100313T065100 1.69
20100313T113000 1.68
20100313T161400 1.66
20100313T210700 1.73
20100314T015100 1.71
20100314T073900 1.76
20100314T121900 1.88
20100314T165900 1.82
20100314T224900 1.95
20100315T034200 1.24
20100315T082300 1.25
20100315T141600 1.26
20100315T201300 1.26
20100316T011400 1.24
20100316T061100 1.24
20100316T105300 1.17
20100316T163900 1.12
20100316T212700 1.18
20100317T030700 1.08
20100317T084600 1.16
20100317T163700 1.16
20100318T004701 1.15
20100318T062300 1.12
20100318T110100 1.12
20100318T154300 1.22
20100318T202000 1.03
20100319T020700 1.06
20100319T070300 1.08
20100319T114400 1.10
20100319T172300 1.02
20100319T221000 1.08
20100320T034800 1.03
20100320T114300 1.07
20100320T162700 1.03
20100320T210700 0.96
20100321T024600 1.02
20100321T072900 1.00
20100321T120700 0.98
20100321T164600 1.06
e
20100313T065100 1.15
20100313T113000 1.19
20100313T161400 1.16
20100313T210700 1.19
20100314T015100 1.10
20100314T073900 1.24
20100314T121900 1.25
20100314T165900 1.25
20100314T224900 1.28
20100315T034200 1.26
20100315T082300 1.22
20100315T141600 1.30
20100315T201300 1.21
20100316T011400 1.14
20100316T061100 1.09
20100316T105300 1.07
20100316T163900 1.03
20100316T212700 1.05
20100317T030700 1.06
20100317T084600 1.02
20100317T163700 1.06
20100318T004701 1.06
20100318T062300 1.10
20100318T110100 1.00
20100318T154300 1.06
20100318T202000 0.98
20100319T020700 1.04
20100319T070300 1.02
20100319T114400 1.02
20100319T172300 0.99
20100319T221000 0.97
20100320T034800 1.05
20100320T114300 0.98
20100320T162700 0.92
20100320T210700 0.89
20100321T024600 0.89
20100321T072900 0.88
20100321T120700 0.85
20100321T164600 0.82
e
20100313T065100 1.07
20100313T113000 0.98
20100313T161400 1.06
20100313T210700 1.00
20100314T015100 1.01
20100314T073900 1.12
20100314T121900 1.08
20100314T165900 1.14
20100314T224900 1.11
20100315T034200 0.69
20100315T082300 0.72
20100315T141600 0.67
20100315T201300 0.73
20100316T011400 0.68
20100316T061100 0.65
20100316T105300 0.57
20100316T163900 0.58
20100316T212700 0.60
20100317T030700 0.54
20100317T084600 0.59
20100317T163700 0.61
20100318T004701 0.58
20100318T062300 0.61
20100318T110100 0.60
20100318T154300 0.61
20100318T202000 0.52
20100319T020700 0.53
20100319T070300 0.54
20100319T114400 0.47
20100319T172300 0.55
20100319T221000 0.57
20100320T034800 0.52
20100320T114300 0.54
20100320T162700 0.52
20100320T210700 0.53
20100321T024600 0.46
20100321T072900 0.48
20100321T120700 0.48
20100321T164600 0.49
e
20100313T065100 0.65
20100313T113000 0.50
20100313T161400 0.53
20100313T210700 0.53
20100314T015100 0.53
20100314T073900 0.67
20100314T121900 0.53
20100314T165900 0.67
20100314T224900 0.66
20100315T034200 0.44
20100315T082300 0.52
20100315T141600 0.43
20100315T201300 0.46
20100316T011400 0.44
20100316T061100 0.50
20100316T105300 0.40
20100316T163900 0.49
20100316T212700 0.49
20100317T030700 0.49
20100317T084600 0.44
20100317T163700 0.48
20100318T004701 0.43
20100318T062300 0.46
20100318T110100 0.43
20100318T154300 0.41
20100318T202000 0.50
20100319T020700 0.44
20100319T070300 0.43
20100319T114400 0.50
20100319T172300 0.50
20100319T221000 0.37
20100320T034800 0.52
20100320T114300 0.42
20100320T162700 0.49
20100320T210700 0.34
20100321T024600 0.37
20100321T072900 0.36
20100321T120700 0.36
20100321T164600 0.36
e
20100313T065100 0.11
20100313T113000 0.08
20100313T161400 0.10
20100313T210700 0.12
20100314T015100 0.12
20100314T073900 0.12
20100314T121900 0.14
20100314T165900 0.14
20100314T224900 0.13
20100315T034200 0.09
20100315T082300 0.10
20100315T141600 0.09
20100315T201300 0.10
20100316T011400 0.06
20100316T061100 0.06
20100316T105300 0.06
20100316T163900 0.07
20100316T212700 0.05
20100317T030700 0.06
20100317T084600 0.05
20100317T163700 0.08
20100318T004701 0.06
20100318T062300 0.08
20100318T110100 0.06
20100318T154300 0.07
20100318T202000 0.09
20100319T020700 0.04
20100319T070300 0.06
20100319T114400 0.08
20100319T172300 0.08
20100319T221000 0.06
20100320T034800 0.06
20100320T114300 0.08
20100320T162700 0.06
20100320T210700 0.07
20100321T024600 0.07
20100321T072900 0.06
20100321T120700 0.07
20100321T164600 0.06
e
20100313T065100 0.07
20100313T113000 0.04
20100313T161400 0.06
20100313T210700 0.07
20100314T015100 0.06
20100314T073900 0.07
20100314T121900 0.06
20100314T165900 0.04
20100314T224900 0.07
20100315T034200 0.06
20100315T082300 0.06
20100315T141600 0.08
20100315T201300 0.07
20100316T011400 0.06
20100316T061100 0.06
20100316T105300 0.04
20100316T163900 0.06
20100316T212700 0.06
20100317T030700 0.07
20100317T084600 0.05
20100317T163700 0.06
20100318T004701 0.06
20100318T062300 0.06
20100318T110100 0.06
20100318T154300 0.07
20100318T202000 0.06
20100319T020700 0.06
20100319T070300 0.06
20100319T114400 0.06
20100319T172300 0.06
20100319T221000 0.07
20100320T034800 0.06
20100320T114300 0.07
20100320T162700 0.06
20100320T210700 0.05
20100321T024600 0.04
20100321T072900 0.05
20100321T120700 0.06
20100321T164600 0.06
e
20100313T065100 0.04
20100313T113000 0.05
20100313T161400 0.04
20100313T210700 0.05
20100314T015100 0.05
20100314T073900 0.06
20100314T121900 0.05
20100314T165900 0.05
20100314T224900 0.05
20100315T034200 0.04
20100315T082300 0.04
20100315T141600 0.04
20100315T201300 0.04
20100316T011400 0.04
20100316T061100 0.04
20100316T105300 0.03
20100316T163900 0.04
20100316T212700 0.05
20100317T030700 0.04
20100317T084600 0.06
20100317T163700 0.05
20100318T004701 0.04
20100318T062300 0.06
20100318T110100 0.05
20100318T154300 0.07
20100318T202000 0.05
20100319T020700 0.06
20100319T070300 0.05
20100319T114400 0.04
20100319T172300 0.04
20100319T221000 0.05
20100320T034800 0.06
20100320T114300 0.04
20100320T162700 0.06
20100320T210700 0.05
20100321T024600 0.05
20100321T072900 0.04
20100321T120700 0.07
20100321T164600 0.05
e
20100313T065100 0.04
20100313T113000 0.03
20100313T161400 0.03
20100313T210700 0.04
20100314T015100 0.03
20100314T073900 0.04
20100314T121900 0.04
20100314T165900 0.05
20100314T224900 0.03
20100315T034200 0.05
20100315T082300 0.04
20100315T141600 0.04
20100315T201300 0.05
20100316T011400 0.05
20100316T061100 0.04
20100316T105300 0.04
20100316T163900 0.05
20100316T212700 0.04
20100317T030700 0.02
20100317T084600 0.06
20100317T163700 0.06
20100318T004701 0.06
20100318T062300 0.04
20100318T110100 0.05
20100318T154300 0.05
20100318T202000 0.07
20100319T020700 0.04
20100319T070300 0.06
20100319T114400 0.04
20100319T172300 0.04
20100319T221000 0.03
20100320T034800 0.04
20100320T114300 0.03
20100320T162700 0.07
20100320T210700 0.07
20100321T024600 0.06
20100321T072900 0.04
20100321T120700 0.04
20100321T164600 0.05
e
20100313T065100 0.04
20100313T113000 0.05
20100313T161400 0.05
20100313T210700 0.02
20100314T015100 0.04
20100314T073900 0.05
20100314T121900 0.04
20100314T165900 0.03
20100314T224900 0.02
20100315T034200 0.02
20100315T082300 0.04
20100315T141600 0.04
20100315T201300 0.02
20100316T011400 0.03
20100316T061100 0.03
20100316T105300 0.03
20100316T163900 0.03
20100316T212700 0.02
20100317T030700 0.03
20100317T084600 0.02
20100317T163700 0.03
20100318T004701 0.04
20100318T062300 0.04
20100318T110100 0.03
20100318T154300 0.02
20100318T202000 0.03
20100319T020700 0.02
20100319T070300 0.02
20100319T114400 0.02
20100319T172300 0.01
20100319T221000 0.04
20100320T034800 0.03
20100320T114300 0.03
20100320T162700 0.03
20100320T210700 0.03
20100321T024600 0.03
20100321T072900 0.04
20100321T120700 0.02
20100321T164600 0.02
e
#2

しかし、gnuplot で時刻を扱うのに

set timefmt "%Y%m%dT%H%M%S"
set xdata time

と事前に設定が必要なのは何だかなぁ。

ISO 8601 であまり省略していない時刻ならそのまま認識してくれてもいいような気がするのだが。

gnuplot のデータファイルの形式はとても素晴らしいのだが、この時刻だけはいただけない。

2010-03-23 (Tue)

#1

じつは、transcode の変換テーブルの生成をさらに高速化する必殺技がある。

というのは、GC を切ってしまうという技である。(危険なので良い子は真似をしてはいけません。)

手元のマシンで、GB18030 は 17.44秒かかる。(user time で。こんなに遅いのは -O0 な影響もあるのだが。)

% time ./miniruby -I./lib -I.ext/common -I./- -r./ext/purelib.rb "./tool/transcode-tblgen.rb" -fvo "enc/trans/gb18030.c" "enc/trans/gb18030.trans"
generating enc/trans/gb18030.c ...
converter from GB18030 to UTF-8
converter from UTF-8 to GB18030
done.  (17.41user 0.13system 17.80elapsed)
./miniruby -I./lib -I.ext/common -I./- -r./ext/purelib.rb  -fvo    17.44s user 0.14s system 96% cpu 18.166 total

これを変えて、GC を切ると以下のように 13.60秒に高速化される。

% time ./miniruby -I./lib -I.ext/common -I./- -r./ext/purelib.rb "./tool/transcode-tblgen.rb" -fvo "enc/trans/gb18030.c" "enc/trans/gb18030.trans"
generating enc/trans/gb18030.c ...
converter from GB18030 to UTF-8
converter from UTF-8 to GB18030
done.  (13.46user 0.18system 13.80elapsed)
./miniruby -I./lib -I.ext/common -I./- -r./ext/purelib.rb  -fvo    13.60s user 0.20s system 96% cpu 14.328 total

22% くらい実行時間を削れる。

パッチはこうである。

Index: tool/transcode-tblgen.rb
===================================================================
--- tool/transcode-tblgen.rb	(revision 27012)
+++ tool/transcode-tblgen.rb	(working copy)
@@ -3,6 +3,8 @@ require 'erb'
 require 'fileutils'
 require 'pp'

+GC.disable
+
 class Array
   unless [].respond_to? :product
     def product(*args)

コミットする気にはならない。


[latest]


田中哲