天泣記

2003/11/03

#1

削除されたコメントがプリフェッチしたのに残っていて読めてしまった。

まぁ、読めたからといってどうというものでもなかったが。

#2

で、そういう機会を増やすべく、プリフェッチしたのを expire する基準を 個数だけでなく期間でも指定できるようにしてみる。

とりあえず 1日に設定して運用してみよう。

2003/11/04

#1

ふと、tabindex に興味をもち、 とりあえずまずは Tab を使ってみようと思って mozilla を操作してみる。 うぅむ。Alt-← で戻ると focus が先頭に戻ってしまうではないか。 使えん。

IE は戻らない。うむ。

w3m も戻らなくてよろしい。

2003/11/05

#1

ふと思ったのだが、ブラウザのブックマークを設定として利用するアンテナってあるのだろうか。

とゆーか、そういうのはアンテナとは呼ばない感じがしないでもない。

#2

帰りに雨に降られる。

うぅむ。本屋に入ったときにはまだ降っていなかったのだが、出たら降っていた。

2003/11/06

#1
% google-count ふにふに ぷにぷに ぶにぶに
29200   ふにふに
20800   ぷにぷに
759     ぶにぶに
#2

なんとなく、五月雨で tDiary のテーマを試してみる。

まぁ、個人的には w3m なので閲覧には関係なかったりするけれど。

でも、それはそれとして、tDiary のテーマは普及して欲しいと思う。 class が標準化されれば、五月雨で IgnoreClass を書きやすくなるので。

2003/11/07

#1

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
}
#2

./ を生成しにくいように 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
}

#3

Pathname#+ に . との連結でもう一方をそのまま返すような処理をいれるのは ad hoc か? (入れてから考えるかね?)

  1. ./. とかだと消えないから ad hoc だ
  2. 便利だから ad hoc でもいいのだ
  3. + を clean な path に閉じた演算にするという意味があり ad hoc ではない
  4. . は + における単位元だから、とコムズカシクいえば ad hoc ではない
#4
% google-count {path,file}{name,}' algebra'
2       "pathname algebra"
1340    "path algebra"
28      "filename algebra"
328     "file algebra"
#5

ふむ。path algebra というのがあるらしい。

箙(えびら)とは何か?

#6

それではないほう:

GPath -- A C Library for Path Algebras

hackerlab/fs

2003/11/08

#1

CLHS: Chapter 19. Filenames

#2

徹夜(予)

2003/11/09

#1

LL3

Windows Media よりも Real のほうがちゃんと動くなぁ。

#2

FrTime のデモには意表をつかれた。

時間に依存した値を扱うというアイデアはともかくとして、 そういう値をプロンプトから表示させて、 その表示がリアルタイムに変わっていく様子はなんとも異様。

2003/11/10

#1

風博士ブックマークエディタ

ふむ。

#2
% grep xxx tmp/*
zsh: argument list too long: grep

がーん。五月雨で集めた中身を検索できない。

もちろん回避のしかたはいくらでもあるのだが、集めすぎかも。

% ls tmp|wc
   3900    3900  161836

grep ARG_MAX /usr/include/**/*.h としてみると、131072=128K と出て来る。 たしかに越えている。

#3

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 でもないしなぁ。

2003/11/11

#1

試しにテンプレートエンジンのプロトタイプを作ってみる。

目標:

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&amp;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&amp;z
  </m2>
  </m3>
    02:53:12
    
    <choice-zero>
      zero
    </choice-zero>
  
    
    <choice-nonzero>
    non-zero
  </choice-nonzero>
  
  </m1>

となるくらいには動いた。

コンセプトは「テンプレート = EBNF + 導出制御」なのだが... 使うぶんにはあまり関係なさそうだな。

2003/11/12

#1

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

2003/11/13

#1

w3m xxx.rd としたときに rd2 を呼び出すようにしてみる。

2003/11/15

#1

たしか continuation を使って web application を作るという話があったと思ったが、 continuation passing style を使って、という話はあるだろうか。

探してみる。

Lisp in Web-Based Applications, Paul Graham

2003/11/16

#1

なんかちょっと頭痛

#2

web application に continuation を使うという話に対する疑問は、 継続はひとつでいーのか、ということである。

そういう話では、 継続は URL による名前がつけられ、 HTML に埋め込まれてブラウザに送られ、 ブラウザがその URL をアクセスしたときに 継続が起動する。

しかし、ひとつの HTML ページの中には複数の URL が含まれ得るわけで、 そういう複数の URL つまり複数の継続を生成するのには、 call/cc みたいなのが適切なのだろうかということである。

むしろ、複数の継続を自然に(対等に)扱える CPS のほうが適しているのではないだろうか。

2003/11/19

#1

さらに、ある URL を複数回アクセスする - たとえば「戻る」ボタンを使う - ということによるユーザの意図は、 継続を複数回起動するということに対応しているのだろうかという疑問がある。

page に form が含まれており、何か記入してから他のページに行き、 その後でそのページに戻った場合、 記入した内容が残っていて欲しいという場合がある。

この場合、その page を指し示す URL が継続だと考えると、 最初に呼び出したときは空(ないしデフォルト)の form が返って来て、 次に呼び出したときはユーザが以前に記入した内容の form が返って来るわけなので、 その継続が表現する処理が破壊的に変化していることになる。

そういう、変化を意図するものを、継続という形で表現するのは適切だろうか。

2003/11/20

#1

最近、設定ファイルなどを XML にするという話を読むたびに、 (パーザを書くのを省ける以外の点として) 「きっとその設定ファイルをいじくるツールを作る人にとっては嬉しいのであろう」 と思うようになった。

ただ、その次に浮かぶ「じゃ、それは誰が作るのか?」という疑問に関する答はよく分からない。

2003/11/21

#1

つくば

... うぅむ。出かけ先の情報量がいつもにも増して少ない。

浮動小数点のように、原点に近い場合はより細かく表現すると、 情報量がそろうかも知れない。

2003/11/22

#1

つくば

#2

redirect について考える。

2003/11/23

#1

他の人はどういうことを考えているのか探してみる。

security problem with LWP::Simple::get in CGI scripts

うぅむ。

2003/11/29

#1

五月雨俳句選集暫定版

2003/11/30

#1

俳句で覚える正規表現


[latest]


田中哲