ミネアポリス、シャーロット
シャーロット
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]"シャーロット
JRuby の発表を聞いていて、ObjectSpace.each_object が厄介で default では disable だという話があり、そういうものがあってもいいよな、と思った。
で、ObjectSpace.count_objects を思い出して、まつもとさんに尋ねてみると了解がとれたのでコミット。
シャーロット
rspec の発表を聞いていて「要するに英語で書きたいのか?」という感想を持つ。
考えてみると、内部 DSL というのはプログラムの字面から、言語の意味ではない、別の意味を想起させる機構であるから、それは rspec の (DSL としての) 本質かもしれない。
parser combinator によるプログラムの字面から Haskell を飛ばして BNF の意味を想起させるのと同様に、rspec によるプログラムの字面から Ruby を飛ばして英語による仕様の意味を想起させると考えれば対応がつく。
そして、それによる効果を利用したなにがしかの方法論が構築されており、それが BDD ということなのかもしれない。
もう一回るびまの記事を読み直すか?
シャーロット、デトロイト
仕様を記述する方法はいろいろある。
自然言語で記述することもできるし、フォーマルな記述法もある。
rspec が英語による記述を Ruby 上で実現する言語内 DSL であるならば、英語以外の仕様記述を言語内 DSL として実現することも考えられるだろうか。
真理値表を最小の論理式に変換するクワイン・マクラスキー法 (Quine-McCluskey algorithm) というものがあるそうな。
調べてみると簡単に実装できそうなので、実装してみる。
しかし、最小のを求めるのは問題自体が難し過ぎる (NP困難) ようなので、あまり一般的につかえる話ではなさそうだ。
いちおうライブラリとして仕上げたので、公開しておく。
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 の形式を好んで使っても問題ない感じがする。
OpenBSD 4.0 の cksum は -c を持っていて、GNU の形式は受け付けないようだ。
sha1 コマンドや md5 コマンドの -c も SHA256 なものを受け付ける。これはちゃんとアルゴリズムを書いてあるせいであろう。
openssl dgst -sha256 は FreeBSD のに似た出力形式のようだ。
% openssl dgst -sha256 /dev/null SHA256(/dev/null)= e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
ただ、空白の違いにより、sha256sum -c には受け付けられない模様。
gpg でもハッシュを求められるが、出力形式は異なる。
% gpg --print-md SHA256 /dev/null
/dev/null: E3B0C442 98FC1C14 9AFBF4C8 996FB924 27AE41E4 649B934C A495991B
7852B855FreeBSD の ufs で、1秒より小さい単位の timestamp を用いるには
sudo sysctl vfs.timestamp_precision=2 # microsecond sudo sysctl vfs.timestamp_precision=3 # nanosecond
とすればいいようだ。
double が 32bit という環境もあるのだそうだ。
へー、IEEE754 って改訂が進んでたんだ。
<URL:http://grouper.ieee.org/groups/754/>
とりあえずドラフトを探してダウンロードしておく。
なんか、Mastering Regular Expressoins, 3rd Edition が欲しくなってきた。
1st Edition の日本語版と、2nd Edition の英語版・日本語版の計3冊も持っているというのに。
ふと、空飛ぶスパゲッティ・モンスター教のミートボールが気になった。なぜミートボールなのか。調べてみるとどうもミートボールスパゲッティというのがアメリカで定番らしい。なるほど。
しかし、個人的には食べた覚えがないのだが、日本ではどうなのだろうか。メニューにあっても目に入っていないだけ?
それはそれとして、空飛ぶスパゲッティ・モンスターのTシャツ で、触手があまりスパゲッティに見えない。イラストだと触手が先細りで尖っているのだが、それはスパゲッティらしくない。
[latest]