2001-06-03
λ. CGIの付けたLast Modified: がそのまま返されない件
同じ悩みで悩んでる人はいないかな〜っと思って探してみると、「それにしても、Apache ってば、CGI が Last-Modified: つけたらそのまんま返してくれりゃいいのに。」と言うのを発見。でも、Sushi日記ではちゃんと Last-Modified: を返してくれるから、設定次第で何とかなるはずではあるんだけど…
λ. あ、わかった。やっぱり、CGI#rfc1123_dateの問題だ。(参考: [ruby-dev 12342]) それにしても、Apacheも、よくこんな偏執狂的なチェックをしてるよな〜。驚異だ。
λ. リューズ
腕時計のアレは、アジャスタじゃなくてリューズっていうのね。しかも、竜頭ですよ。本当にビックリ。
λ. 床屋
に行って、散髪。すっきりした。
2002-06-03
λ. 眠くて仕方がない。
λ. coalgebra
coalgebra に基づく考え方は Ruby では alternative でしかない らしいけど、coalgebra を前面に持ってきた言語って存在するのだろうか?
λ. 黒岩せんせ曰く
「テスト勉強はしても勉強しない学生。研究論文は書いても研究しない教授。」
λ. 第一印象占い
中村さんの日記の6/1より。やってみたけど、同じ結果だったので面白くなかった。
- Aタイプ:モヤーとした中にチラリと鋭さがのぞく
- 第一印象は「何を考えているか、よくわからない」というモヤーとした感じです。 ときどき内部に秘めた鋭敏さをチラリとのぞかせますが、他人との間に心理的な 境界線を引いていて、なかなか自分のホンネを出そうとはしないようです。その かわり、他人のことにもあまり関心を示さないタイプです。人とともに生きると いうより、自分の世界に沈着しようとする内向派です。独自の考え方と価値基準 をもち、専門分野で才能を発揮する可能性が大きいようです。
- ★アドバイス★
- あまり批判的にものを見すぎないで、素直にいくと上手くいきます。
2005-06-03
λ. 人狼審問: (538)バイオ村-ハイブ編-
を感染中、もとい観戦中。人狼審問は人狼BBSとはまた雰囲気が違っていて、いいですね。そして、バイオ村という設定に案外違和感がなくてビックリ。面白い。
λ. Type Theory and Functional Programming. Simon Thompson
田中君のところから。メモ。
2006-06-03
λ. 共通部分式の除去 (CSE, Common Subexpression Elimination)
命令型言語であっても共通部分式の除去が必ずしも性能を向上させるとは限らないが、純粋関数型言語では特にそうである。例えば、以下のようなリストの「冪集合演算」を考えてみる。
power :: [a] -> [[a]] power [] = [[]] power (x:xs) = power xs ++ map (x:) (power xs) main :: IO () main = print (length (power [0..30]))
このpowerの二つ目の等式の右辺には power xs が二回現れているので、これを一度変数に束縛して以下のようにすることが考えられる。しかし、こうするとxssがなかなかGC対象にならないのでメモリを食いつぶしてしまう。
power :: [a] -> [[a]] power [] = [[]] power (x:xs) = xss ++ map (x:) xss where xss = power xs
このようなことを避けるためにGHCはCSEを行わない……のかな(?)。FAQの Does GHC do common subexpression elimination? には「同じ式が既に変数に束縛されている場合」にのみCSEを行うという "opportunistic CSE" について書いてあるが、ちょっと試した限りでは実際にこれが起こるのを確認できなかった。
いずれにしても、、プログラマは計算結果を共有したい時には明示的に変数に束縛すべきだろう。なお、-fno-cseオプションを使うことでCSEを完全に無効化出来るようだ。
より効率の良い冪集合演算
なお、冪集合演算については、より効率の良い定義が存在する。 ただし列挙される順序は異なるが。
power :: [a] -> [[a]] power [] = [[]] power (x:xs) = xss /\/ map (x:) xss where xss = power xs -- interleave (/\/) :: [a] -> [a] -> [a] [] /\/ ys = ys (x:xs) /\/ ys = x : (ys /\/ xs)
2008-06-03
λ. セマンティクス
セマンティクスって? - ひげぽん OSとか作っちゃうかMona- あたりの話。すご〜〜く大雑把に説明してみる。
「(2*3)+(4*5)」という式は、(2*3)+(4*5) → 6+(4*5) → 6+20 → 26 と書き換えできるよね、というのが操作的意味論(operational semantics)。正確にはsmall-stepの操作的意味論。どういう書き換えが出来るかを通常は再帰的に定義する。操作的意味論は良く知らないので、詳しい人にお任せ。
「(2*3)+(4*5)」という式は26という数を表しているよね、とか「明けの明星」は金星を指す表現だよね、というのが表示的意味論(denotational semantics)。何を表しているか、何を指し示しているかが意味。発想としては一番簡単だと思う。こちらも部分式の意味から再帰的に意味を定義する。
公理的意味論(axiomatic semantics)は、命令型言語のプログラムというのは状態を書き換えるコマンドだという立場。それで、プログラムの実行前の状態で成り立っている条件と、プログラムの実行後の状態で成り立っている条件との間の関係によって、プログラムの意味を考えたり検証したりしましょうというアプローチ。例えば、「i = i + 1」というプログラムがあって、その実行後の状態で i==5 が成り立っていたら、実行前には i==4 が成り立っていたに違いない、とかそんなの。
すご〜〜く大雑把にしか説明してないけど、どれも本当は奥が深いです。
蛇足
操作的意味論も表示的意味論も言語の研究にはずいぶん使われているけど、一般のプログラマにとって馴染み深いのは「契約による設計(Design By Contract)」とかJMLとかの背景にある公理的意味論ではないかと思う。
ψ ひげぽん [ありがとうございます。 >(2*3)+(4*5)」という式は、(2*3)+(4*5) → 6+(4*5) → 6+2..]
ψ ただただし [ tDiaryを使おうと思ったら、Rubyは1.6.3以降でなければなりません(って書いとけ >おれ)。もしく..]
ψ さかい [どうもありがとうございます。とりあえず、CGI#rfc1123_dateをRuby 1.6.3のに置き換えることで対..]