天泣記

2007-11-01 (Thu)

#1

ミネアポリス、シャーロット

2007-11-02 (Fri)

#1

シャーロット

#2

Jim Weirich の話を聞いていて、ブロック内に記述された論理式から真偽値表を得ることについて考える。

最初、継続を使うことを考えたのだが、講演後に Jim と議論して継続は使わなくてもできることがわかった。

で、ちょっとつくってみる。

% cat truthtable.rb
class TruthTable
  class TruthTableObject
    def initialize
      @checked = {}
      @plan = {}
      @queue = []
    end
    attr_reader :plan

    def next_plan
      @log = {}
      @plan = @queue.shift
      @plan
    end

    def [](index)
      s = "v[#{index}]"
      if @plan.has_key?(s)
        v = @plan[s]
      else
        fplan = @plan.dup
        fplan[s] = false
        fkey = fplan.keys.sort.map {|k| "#{k}=#{fplan[k]}" }.join(' ')
        @plan = fplan
        v = false
        if !@checked[fkey]
          tplan = @plan.dup
          tplan[s] = true
          tkey = tplan.keys.sort.map {|k| "#{k}=#{tplan[k]}" }.join(' ')
          @queue.unshift tplan
          @checked[tkey] = true
          @checked[fkey] = true
        end
      end
      v
    end
  end

  def self.test(&b)
    r = []
    o = TruthTableObject.new
    begin
      result = b.call(o)
      inputs = o.plan
      r << [inputs, result]
    end while o.next_plan
    r
  end

  def initialize(&b)
    table = TruthTable.test(&b)
    @table = table
  end

  def formula
    r = []
    @table.each {|inputs, output|
      next if !output
      term = []
      inputs.each {|name, input|
        if input
          term << name
        else
          term << "!#{name}"
        end
      }
      r << term.join('&')
    }
    r.join('|')
  end
end

p TruthTable.new {|v| v[0] & v[1] }.formula
p TruthTable.new {|v| v[0] && v[1] }.formula
p TruthTable.new {|v| v[0] | v[1] }.formula
p TruthTable.new {|v| v[0] || v[1] }.formula
% ruby truthtable.rb 
"v[0]&v[1]"
"v[0]&v[1]"
"!v[0]&v[1]|v[0]&!v[1]|v[0]&v[1]"
"!v[0]&v[1]|v[0]"

2007-11-03 (Sat)

#1

シャーロット

#2

JRuby の発表を聞いていて、ObjectSpace.each_object が厄介で default では disable だという話があり、そういうものがあってもいいよな、と思った。

で、ObjectSpace.count_objects を思い出して、まつもとさんに尋ねてみると了解がとれたのでコミット。

2007-11-04 (Sun)

#1

シャーロット

#2

rspec の発表を聞いていて「要するに英語で書きたいのか?」という感想を持つ。

考えてみると、内部 DSL というのはプログラムの字面から、言語の意味ではない、別の意味を想起させる機構であるから、それは rspec の (DSL としての) 本質かもしれない。

parser combinator によるプログラムの字面から Haskell を飛ばして BNF の意味を想起させるのと同様に、rspec によるプログラムの字面から Ruby を飛ばして英語による仕様の意味を想起させると考えれば対応がつく。

そして、それによる効果を利用したなにがしかの方法論が構築されており、それが BDD ということなのかもしれない。

もう一回るびまの記事を読み直すか?

2007-11-05 (Mon)

#1

シャーロット、デトロイト

2007-11-07 (Wed)

#1

仕様を記述する方法はいろいろある。

自然言語で記述することもできるし、フォーマルな記述法もある。

rspec が英語による記述を Ruby 上で実現する言語内 DSL であるならば、英語以外の仕様記述を言語内 DSL として実現することも考えられるだろうか。

2007-11-08 (Thu)

#1

真理値表を最小の論理式に変換するクワイン・マクラスキー法 (Quine-McCluskey algorithm) というものがあるそうな。

調べてみると簡単に実装できそうなので、実装してみる。

しかし、最小のを求めるのは問題自体が難し過ぎる (NP困難) ようなので、あまり一般的につかえる話ではなさそうだ。

#2

いちおうライブラリとして仕上げたので、公開しておく。

truthtable

2007-11-09 (Fri)

#1

GNU の sha256sum の出力形式は以下の通りである。

% sha256sum /dev/null
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855  /dev/null

FreeBSD の sha256 の出力形式は以下の通りである。-r をつければ GNU の形式に近くなる。

% sha256 /dev/null
SHA256 (/dev/null) = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
% sha256 -r /dev/null
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 /dev/null

FreeBSD のデフォルトのほうがハッシュのアルゴリズムが入っていてよろしい感じがする。

また、GNU の sha256sum には -c オプションがあって、ハッシュの結果を実際のファイルと比較できるが、これは GNU の形式だけでなく、FreeBSD の形式も受け付ける。とすると FreeBSD の形式を好んで使っても問題ない感じがする。

#2

OpenBSD 4.0 の cksum は -c を持っていて、GNU の形式は受け付けないようだ。

sha1 コマンドや md5 コマンドの -c も SHA256 なものを受け付ける。これはちゃんとアルゴリズムを書いてあるせいであろう。

2007-11-11 (Sun)

#1

openssl dgst -sha256 は FreeBSD のに似た出力形式のようだ。

% openssl dgst -sha256 /dev/null
SHA256(/dev/null)= e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

ただ、空白の違いにより、sha256sum -c には受け付けられない模様。

#2

gpg でもハッシュを求められるが、出力形式は異なる。

% gpg --print-md SHA256 /dev/null
/dev/null: E3B0C442 98FC1C14 9AFBF4C8 996FB924 27AE41E4 649B934C A495991B
           7852B855

2007-11-19 (Mon)

#1

FreeBSD の ufs で、1秒より小さい単位の timestamp を用いるには

sudo sysctl vfs.timestamp_precision=2         # microsecond
sudo sysctl vfs.timestamp_precision=3         # nanosecond

とすればいいようだ。

2007-11-23 (Fri)

#1

double が 32bit という環境もあるのだそうだ。

<URL:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34040>

2007-11-24 (Sat)

#1

へー、IEEE754 って改訂が進んでたんだ。

<URL:http://grouper.ieee.org/groups/754/>

とりあえずドラフトを探してダウンロードしておく。

2007-11-28 (Wed)

#1

なんか、Mastering Regular Expressoins, 3rd Edition が欲しくなってきた。

1st Edition の日本語版と、2nd Edition の英語版・日本語版の計3冊も持っているというのに。

2007-11-30 (Fri)

#1

ふと、空飛ぶスパゲッティ・モンスター教のミートボールが気になった。なぜミートボールなのか。調べてみるとどうもミートボールスパゲッティというのがアメリカで定番らしい。なるほど。

しかし、個人的には食べた覚えがないのだが、日本ではどうなのだろうか。メニューにあっても目に入っていないだけ?

それはそれとして、空飛ぶスパゲッティ・モンスターのTシャツ で、触手があまりスパゲッティに見えない。イラストだと触手が先細りで尖っているのだが、それはスパゲッティらしくない。


[latest]


田中哲