削除されたコメントがプリフェッチしたのに残っていて読めてしまった。
まぁ、読めたからといってどうというものでもなかったが。
で、そういう機会を増やすべく、プリフェッチしたのを expire する基準を 個数だけでなく期間でも指定できるようにしてみる。
とりあえず 1日に設定して運用してみよう。
ふと、tabindex に興味をもち、 とりあえずまずは Tab を使ってみようと思って mozilla を操作してみる。 うぅむ。Alt-← で戻ると focus が先頭に戻ってしまうではないか。 使えん。
IE は戻らない。うむ。
w3m も戻らなくてよろしい。
ふと思ったのだが、ブラウザのブックマークを設定として利用するアンテナってあるのだろうか。
とゆーか、そういうのはアンテナとは呼ばない感じがしないでもない。
帰りに雨に降られる。
うぅむ。本屋に入ったときにはまだ降っていなかったのだが、出たら降っていた。
% google-count ふにふに ぷにぷに ぶにぶに 29200 ふにふに 20800 ぷにぷに 759 ぶにぶに
なんとなく、五月雨で tDiary のテーマを試してみる。
まぁ、個人的には w3m なので閲覧には関係なかったりするけれど。
でも、それはそれとして、tDiary のテーマは普及して欲しいと思う。 class が標準化されれば、五月雨で IgnoreClass を書きやすくなるので。
pathname.rb の習作として MANIFEST のチェッカを作ってみる。
#!/usr/bin/env ruby require 'pathname' manifests = {} Pathname.glob('**/CVS/Entries').each {|entries| entries.each_line {|line| next unless %r{\A/([^/]+)/} =~ line next if $1 == '.cvsignore' filename = entries.dirname.dirname.join($1).cleanpath nearest_manifest = nil included_manifests = [] d = filename.dirname while true f = d.join('MANIFEST').cleanpath if f.exist? manifests[d] = f.readlines.map {|g| g.chomp } else manifests[d] = nil end if manifests[d] nearest_manifest = f unless nearest_manifest if manifests[d].include? filename.relative_path_from(d).to_s included_manifests << f end end break if d.to_s == '.' d = d.dirname end if included_manifests.empty? puts "#{filename} should be included in #{nearest_manifest}" elsif 1 < included_manifests.length puts "#{filename} is included in #{included_manifests.join(', ')}" end } } manifests.each_pair {|d, m1| next unless m1 m2 = m1.dup if m2.uniq! h = {} m1.each {|e| h[e] ||= 0; h[e] += 1 } h.reject! {|e, n| n == 1 } puts "#{d.join('MANIFEST').cleanpath} has duplicates: #{h.keys.join(', ')}" end }
./ を生成しにくいように Pathname#+ を変えて書き直す。 cleanpath は不要になった。
#!/usr/bin/env ruby require 'pathname' EXTRA_FILE_IN_MANIFEST = /\A#{Regexp.union *['configure', 'parse.c']}\z/ EXTRA_FILE_IN_CVS = %r{(\A|/)\.cvsignore\z} entries_hash = {} Pathname.glob('**/CVS/Entries') {|entries| dir = entries.dirname.dirname entries_hash[dir] = arr = [] entries.each_line {|line| next unless %r{\A/([^/]+)/} =~ line filename = $1 next if EXTRA_FILE_IN_CVS =~ filename arr << filename } } manifests_hash = {} Pathname.glob('**/MANIFEST') {|manifest| dir = manifest.dirname manifests_hash[dir] = manifest.readlines.map {|g| g.chomp } } entries_hash.each_pair {|dir, entries| entries.each {|entry| filename = dir + entry nearest_manifest = nil included_manifests = [] d = dir loop { if manifests = manifests_hash[d] f = d + 'MANIFEST' nearest_manifest = f unless nearest_manifest if manifests.include? filename.relative_path_from(d).to_s included_manifests << f end end break if d.to_s == '.' d = d.dirname } if included_manifests.empty? puts "#{filename} should be included in #{nearest_manifest}" elsif 1 < included_manifests.length puts "#{filename} is included in #{included_manifests.join(', ')}" end } } manifests_hash.each_pair {|dir, manifest| manifest.each {|filename| f = dir + filename next if EXTRA_FILE_IN_MANIFEST =~ f if !entries_hash[f.dirname] || !entries_hash[f.dirname].include?(f.basename.to_s) puts "#{f} is not maintained by CVS" end } } manifests_hash.each_pair {|d, m1| m2 = m1.dup if m2.uniq! h = {} m1.each {|e| h[e] ||= 0; h[e] += 1 } h.reject! {|e, n| n == 1 } puts "#{d + 'MANIFEST'} has duplicates: #{h.keys.join(', ')}" end }
Pathname#+ に . との連結でもう一方をそのまま返すような処理をいれるのは ad hoc か? (入れてから考えるかね?)
% google-count {path,file}{name,}' algebra' 2 "pathname algebra" 1340 "path algebra" 28 "filename algebra" 328 "file algebra"
ふむ。path algebra というのがあるらしい。
それではないほう:
GPath -- A C Library for Path Algebras
徹夜(予)
LL3
Windows Media よりも Real のほうがちゃんと動くなぁ。
FrTime のデモには意表をつかれた。
時間に依存した値を扱うというアイデアはともかくとして、 そういう値をプロンプトから表示させて、 その表示がリアルタイムに変わっていく様子はなんとも異様。
ふむ。
% grep xxx tmp/* zsh: argument list too long: grep
がーん。五月雨で集めた中身を検索できない。
もちろん回避のしかたはいくらでもあるのだが、集めすぎかも。
% ls tmp|wc 3900 3900 161836
grep ARG_MAX /usr/include/**/*.h としてみると、131072=128K と出て来る。 たしかに越えている。
dirname の繰り返しで昇っていくのには upto という名前が適切なのではないかと思いつく。
つまり Pathname.new("foo/bar").upto(Pathname.new(".")) {|path| ... } というのはどうだろうかというわけで、 しばらくこの思いつきをひねくりまわしているうちに出来たもの:
class Pathname def to(target) relpath = target.relative_path_from(self) path = self yield path relpath.each_filename {|f| next if f == '.' if f == '..' path = path.dirname else path += f end yield path } end end
% ruby -rlib/pathname-ext -e ' Pathname.new("f/oo/bar").to(Pathname.new("f/uga/hoge")) {|x| p x}' #<Pathname:f/oo/bar> #<Pathname:f/oo> #<Pathname:f> #<Pathname:f/uga> #<Pathname:f/uga/hoge>
うぅむ。to は短すぎる。 でも、up でも down でもないしなぁ。
試しにテンプレートエンジンのプロトタイプを作ってみる。
目標:
module M def time(fmt) Time.now.strftime(fmt) end end data = { 'a' => 1, 'b' => 'x', 'c' => 'y&z', } puts Template.expand(<<'End', data, M) <root> <m1 id="template_root" _element_param="x"> <lf id="lf" _element_param="y"> y=<s1 _subst_self="y"/> </lf> <s2 _subst_self="x['a']"/> <s _subst_self="x['b']"/> <s _subst_self="x['c']"/> <lf2 id="lf2" _element_param="y"> <s _subst_self="y"/> </lf2> <call-lf _ref="lf" _arg="1"/> <call-lf _ref="lf" _arg="2"/> <repeat_self _repeat_self="[1,2,3]" _method="each" _param="v"> v=<s _subst_self="v"/> </repeat_self> <call-m3 _ref="m3" _arg="x['c']"/> <t _subst_self="time '%T'"/> <call-m4 _ref="m4" _arg="0"/> <call-m4 _ref="m4" _arg="1"/> </m1> <m2 id="m2" _element_param="y"> m2:y=<s _subst_self="y"/> </m2> <m3 id="m3" _element_param="x"> <call-m2 _ref="m2" _arg="x"/> </m3> <m4 id="m4" _content_param="x"> <choice-zero _cond="x == 0" _ref="m5" _arg=""> zero </choice-zero> </m4> <choice-nonzero id="m5" _element_param=""> non-zero </choice-nonzero> </root> End
とゆーのが
<m1> 1 x y&z <lf> y=1 </lf> <lf> y=2 </lf> <repeat_self> v=1 </repeat_self><repeat_self> v=2 </repeat_self><repeat_self> v=3 </repeat_self> <m3> <m2> m2:y=y&z </m2> </m3> 02:53:12 <choice-zero> zero </choice-zero> <choice-nonzero> non-zero </choice-nonzero> </m1>
となるくらいには動いた。
コンセプトは「テンプレート = EBNF + 導出制御」なのだが... 使うぶんにはあまり関係なさそうだな。
htree で html から xml へ変換するテスト -> 入力と出力の変化を調べるのに wdiff を使う -> 入力が日本語だったので化ける -> やっぱり jwdiff が欲しいよなぁということで作る -> kterm で日本語が bold で出ないことを思い出す -> debian のパッケージは無いかと探すもよく分からない -> intlfonts に入っている JIS X 0208 1990 の 16dot フォントを mkbold して作る -> 作ったものを kterm に使わせるのにリソースを調整する -> 確かめるのに bold を指定するエスケープシーケンスが必要だがそんなものは覚えていない -> tput(1), terminfo(5) を調べる -> 案の定 bold にならない -> 1990 だけじゃなくて、1983, 1978 も変換する -> なんとか bold が出る -> defoma なるもので管理されているんだっけと思い出し、 しばし defoma(1) を読むもレガシーな人にはあまり関係なさそう -> 気にせず cp/mkfontdir/xset fp rehash
w3m xxx.rd としたときに rd2 を呼び出すようにしてみる。
たしか continuation を使って web application を作るという話があったと思ったが、 continuation passing style を使って、という話はあるだろうか。
探してみる。
Lisp in Web-Based Applications, Paul Graham
なんかちょっと頭痛
web application に continuation を使うという話に対する疑問は、 継続はひとつでいーのか、ということである。
そういう話では、 継続は URL による名前がつけられ、 HTML に埋め込まれてブラウザに送られ、 ブラウザがその URL をアクセスしたときに 継続が起動する。
しかし、ひとつの HTML ページの中には複数の URL が含まれ得るわけで、 そういう複数の URL つまり複数の継続を生成するのには、 call/cc みたいなのが適切なのだろうかということである。
むしろ、複数の継続を自然に(対等に)扱える CPS のほうが適しているのではないだろうか。
さらに、ある URL を複数回アクセスする - たとえば「戻る」ボタンを使う - ということによるユーザの意図は、 継続を複数回起動するということに対応しているのだろうかという疑問がある。
page に form が含まれており、何か記入してから他のページに行き、 その後でそのページに戻った場合、 記入した内容が残っていて欲しいという場合がある。
この場合、その page を指し示す URL が継続だと考えると、 最初に呼び出したときは空(ないしデフォルト)の form が返って来て、 次に呼び出したときはユーザが以前に記入した内容の form が返って来るわけなので、 その継続が表現する処理が破壊的に変化していることになる。
そういう、変化を意図するものを、継続という形で表現するのは適切だろうか。
最近、設定ファイルなどを XML にするという話を読むたびに、 (パーザを書くのを省ける以外の点として) 「きっとその設定ファイルをいじくるツールを作る人にとっては嬉しいのであろう」 と思うようになった。
ただ、その次に浮かぶ「じゃ、それは誰が作るのか?」という疑問に関する答はよく分からない。
つくば
... うぅむ。出かけ先の情報量がいつもにも増して少ない。
浮動小数点のように、原点に近い場合はより細かく表現すると、 情報量がそろうかも知れない。
つくば
redirect について考える。
他の人はどういうことを考えているのか探してみる。
security problem with LWP::Simple::get in CGI scripts
うぅむ。
[latest]