2002-01-27
λ. 明日3科目もテストがあると思うと、気が重い。
λ. mingw32でのRuby/Gtkのextconf.rb
こないだファイルを添付しようとして失敗したのが怖かったので、今度は本文に直接パッチを書いたら……やってもうた。いい加減SourceForgeの使い方を覚えねば。[ #509066 ]
--- ruby-gnome.orig/gtk/extconf.rb Tue Oct 9 02:30:10 2001 +++ ruby-gnome/gtk/extconf.rb Fri Jan 18 13:49:48 2002 @@ -63,7 +63,7 @@ lib_ary = [] if /cygwin/ =~ PLATFORM - elsif /mswin32/ !~ PLATFORM + elsif /mswin32|mingw/ !~ PLATFORM lib_ary = [ ["X11", "XOpenDisplay"], ["Xext", "XShmQueryVersion"], ["Xi", "XOpenDevice"],
2003-01-27
λ. 称賛なんかよりも心暖まる言葉が欲しい
λ. 雨が冷たい。凍えそう。君は今一体何処で何をしているの?
λ. テスト
コンパイラ構成論は特に準備していなかったけど(予想通り)何とかなった。知的財産権論は……どうなんだろ? 企業会計論は決算を何故するのかが書けなかったのが悔しい。「会計公準に基づいて」という事で無ければ書けたかもしれない。ともあれ、今学期のテストは一応これでお仕舞い。残る敵は——
2004-01-27
λ. 土曜から風邪ひいてました。まだ少しダルイっす。
λ. 借りた本
- 『異端の数ゼロ — 数学・物理学が恐れるもっとも危険な概念』
- チャールズ・サイフェ (Charles Seife) [著], 林 大 [訳]
- 『そうだったのか! 日本現代史』
- 池上 彰 [著]
- 『ホントの話 — 誰も語らなかった現代社会学 全十八講』
- 呉 智英 [著]
- 『寝ながら学べる構造主義』
- 内田 樹 [著]
- 『説得できる英文Eメール200の鉄則 — IT時代のビジネス通信文はこう書く』
- 倉骨 彰, Travis T. Kurahone [著]
λ. javascript初心者
rubyで書いた
require 'win32ole' messenger = WIN32OLE.new('Messenger.UIAutomation.1') contacts = messenger.MyContacts nick = messenger.MyFriendlyName
は動くのに、javascriptで書いた
var messenger = new ActiveXObject('Messenger.UIAutomation.1'); var contacts = messenger.MyContacts; var nick = messenger.MyFriendlyName;
はMyFriendlyNameのところで「このオブジェクトではサポートされていない操作です」となる。なんでだろぅ〜!?
λ. 『声に出して読めないネット掲示板』, 荷宮 和子
某氏の机の上にあったのでパラパラめくってみたのだけど、なんつーか、イタイな。こんなイタイ本を見るのは久しぶり。
2005-01-27
λ. Bayesian Networks for Lossless Dataset Compression, Scott Davies and Andrew Moore
を読んだ。レコードの列を圧縮する際に、レコードのフィールド間の関係をベイジアンネットワークとして学習し、その確率分布の情報を使って算術符号化や(改良した)ハフマン符号化を行うことで、高い圧縮率を達成できるという話。こんなのにもベイジアンネットワークを使えるんだという点で私には新鮮だった。
λ. Probabilistic Logic Programming and Bayesian Networks, Liem Ngo and Peter Haddawy
を読んだ。
λ. Announce: 圏論勉強会(第三回)
そうそう。今週末は圏論勉強会の三回目がありますよ。堅苦しい集まりではないし、特に前提知識は必要ないので、圏論に興味のある人は是非お気軽に御参加下さい。(初参加の方は mixi:圏論勉強会(第三回) か haskell-jpメーリングリスト で参加を表明しておくと良いと思います)
- 日時
- 2005年1月29日(土曜) 13:00〜
- 場所
- タイムインターメディア様 2階会議室 (地図)
- テキスト
- Conceptual Mathematics: A First Introduction to Categories
λ. GHC 6.4 の ライブラリ
多少変わっているようなので、ちょっと覗いてみた。
- Data.FiniteMap
- deprecated。Data.Mapを推奨。
- Data.Map
- DDataから取り込まれた
- Data.Set
- DDataのそれに置き換わった。古いインターフェースはdeprecated。
- Data.Queue
- DDataから取り込まれた
- Data.IntSet
- Data.IntMap
-
DData.IntSetとDData.IntMapが取り込まれた。Int限定だけど、性能は汎用のものより結構良かったはず。以前あるプログラムで(DData.Setの実装になる前の)Data.FiniteSetとDData.IntSetを比較したときはこんな感じだった。
あるプログラムでの比較 Data.FiniteMap DData.IntSet total time 3.94 secs
(197 ticks @ 20 ms)2.88 secs
(144 ticks @ 20 ms)total alloc
(excludes profiling overheads)245,779,276 bytes 127,081,744 bytes - Data.FunctorM
-
mapをfmapに一般化するように、mapMをfmapMに一般化するクラス。
個人的には以下のように分配則(?)として表現するほうが好みかな。
class Functor f => DistOverM f where dist :: Monad m => f (m a) -> m (f a) fmapM :: (DistOverM f, Monad m) => (a -> m b) -> f a -> m (f b) fmapM f = dist . fmap f
- Data.Version
- ソフトウェアのバージョン番号を表すデータ型。Cabelで使ってる。
2006-01-27
λ. RDスタイルでプラグイン引数がエスケープされる問題へのパッチ
プラグイン呼び出しの引数がエスケープされてプラグインに渡されてしまうのを避けるためのパッチ。 [tDiary-devel] RDスタイルでプラグインの引数がエスケープされてしまう で報告、2006-09-13に取り込まれた。
λ. Haskell is not not ML. Ben Rudiak-Gould, Alan Mycroft, and Simon Peyton Jones.
<URL:http://lambda-the-ultimate.org/node/1248> より。
継続が否定の計算的解釈というのはもちろん知ってはいたけど、二重否定がliftingに対応するということには気づいてなかったし、call-by-name CPS translation と call-by-value CPS translation についても知らなかった。知らないことばかりで勉強になった。それにしても、こういう理論的な話と実装寄りの低レベルな話とがうまく結びついているのは好きだな。
IL は paraconsitent だという話があったが、paraconsistent logic というものがあるようだ。
2007-01-27
λ. HaskellでのPTQ実装
HaskellでPTQを実装しました。 英語の簡単な平叙文を内包論理ILの論理式に翻訳します。 まだ若干問題はありますが、PTQの例の多くを試すことが出来ます。
2008-01-27
λ. MiniSat binding for GHC
ちょっとSATソルバを使って遊んでみたいことがあったのと、ku-ma-meさんのruby-minisat とパズルのソルバ に触発されたのとで、MiniSatのバインディングを作成してみた。
C-SourcesにC++のファイルを指定しているので、GHCの使っているGCCがC++に対応していない場合、ビルドできないはず。 C-SourcesにC++のファイルを指定するというのもどうかと思うが、Distribution.Makeモジュールを使う方法は面倒くさすぎるし。
あと、インターフェースはRubyバインディングに比べてイマイチ。 特に、変数からリテラルに明示的に変換しなくてはいけないのが面倒くさい。 リテラルを変数のスーパータイプとして定義できると良いのだが……
【追記】 Githubにレポジトリを作成しました。 <URL:https://github.com/msakai/haskell-minisat>
2010-01-27
λ. “Stream fusion: from lists to streams to nothing at all” by Duncan Coutts, Roman Leshchinskiy, Don Stewart
リスト処理を、以下のようなストリーム型*1に対する処理に置き換えることによって、foldl等の最終的にリストを消費する関数以外は非再帰的な定義にする。そして、通常の最適化によって、中間データ構造を削除する。
data Stream a = ∃s. Stream (s -> Step a s) s data Step a s = Done | Yield a s | Skip s
例えば、sum (xs ++ ys) は、 sumの定義の展開と書き換え規則の適用によって foldl_s (+) 0 (append_s (stream xs) (stream ys)) となり、 定義を展開することで以下のようになる。
let next_stream xs = case xs of [] -> Done x : xs' -> Yield x xs' next_append (Left xs) = case next_stream xs of Done -> Skip (Right ys) Skip xs' -> Skip (Left xs') Yield x xs' -> Yield x (Left xs') next_append (Right ys) = case next_stream ys of Done -> Done Skip ys' -> Skip (Right ys') Yield y ys' -> Yield (Right ys') go z s = case next_append s of Done -> z Skip s' -> go z s' Yield x s' -> go (z + x) s' in go 0 (Left xs)
そして、ここからGHCのごく普通の最適化によって以下と同等のプログラムになる。
let go z (Left xs) = case xs of [] -> go z (Right ys) x:xs' -> go (z+x) (Left xs') go z (Right ys) = case ys of [] -> z y:ys' -> go (z+y) (Right ys') in go 0 (Left xs)
さらに、Constructor Specialization (Call-pattern specialisation) と呼ばれる最適化を用いると、以下と同等になる。
let go1 z xs = case xs of [] -> go2 z ys x:xs' -> go1 (z+x) xs' go2 z ys = case ys of [] -> z y:ys' -> go2 (z+y) ys' in go1 0 xs
簡単な書き換え規則とごく普通の最適化機能だけで、中間データ構造を除去できているのが素晴らしい。 また、foldr/build の short-cut fusion と比べても、zipWithのような複数引数のものや、concatMapのようなネストしたリスト構造を扱うものも融合出来ると。
*1 Haskell的には∃じゃなくて∀が正しいけど
ψ 石原 和音 [あっちむいてもテストこっちむいてもレポート]
ψ さかい [ほんと、こういう時期はシンドイ……]