2006:05 06 07 08 09 10 11 12
2007:01 02 03 04 05 06 07 08 09 10 11 12
2008:01 02 03 04 05 06 07 08 09 10 11 12
2009:01
最新

blog/2006-07-28

プロファイリング

GHCで最適化オプションを付けるとヒープが溢れる.
最適化を付けないと,速度が大分落ちるのでこれでは困る・・・
解決しようにも,どこがヒープを食ってるのかさっぱり分からないので
GHCのドキュメントを読んでみた.
どうやらGHCにはプロファイリングの機能が付いているようだ.
http://www.haskell.org/ghc/docs/latest/html/users_guide/flag-reference.html#id3131041
http://www.haskell.org/ghc/docs/6.4.2/html/users_guide/hp2ps.html
こんな感じに使う(ps2pdfはGHCに付属しません)

ghc --make -prof -auto-all Main.hs
./main.exe +RTS -h
hp2ps.exe main.exe.hp
ps2pdf main.exe.ps main.pdf

これでプロファイリングの結果がPDFでみれる.
今度まとめておこう.

ついでに,実行時に+RTS -Bでガベージコレクトが行われる度に,ビープ音を鳴らしたり

  1. RTS -A100m等で,ヒープを100m使うまで,GCをしないみたいな事もできる.
    オプションの指定はコンパイル時じゃなくて,実行時なのが面白い.

blog/2006-07-26

Haskell vs. Ada vs. C++ vs. Awk vs. ...

  • Haskell vs. Ada vs. C++ vs. Awk vs. ... An Experiment in Software ...
    アメリカの大学と海軍が1994年に行った,開発期間を抑えれるのに有効なプログラミング言語
    を調べる為に行った実験に関する論文.
    「Aegis Weapons Systems」中の「海上のオブジェクトの位置等を受け取って,ごにょごにょ」する部分のプロトタイプを書き
    プログラムの行数と,開発にかかった時間を比べたようです.
Language             Lines of code     Lines of documentation     Development time (hours)
(1) Haskell          85                465                        10
(2) Ada              767               714                        23
(3) Ada9X            800               200                        28
(4) C++              1105              130                        ?
(5) Awk/Nawk         250               150                        ?
(6) Rapide           157               0                          54
(7) Griffin          251               0                          34
(8) Proteus          293               79                         26
(9) Relational Lisp  274               12                         3
(10) Haskell         156               112                        8

HaskellとLispすげー.C++やべー.
Lispで3時間で書けるプログラムが,C++だと60時間かかっても書けないって...
夏休み中はSchemeでもやってみよう.


blog/2006-07-25

WIFIの電界強度を蒸し器でアップ

うちの大学のサークル棟には,インターネットに接続できる環境がありません.
ちょっと不便なので,「一番近くに住んでいるメンバの家から,無線LANの電波を飛ばそう」
という計画がありました(なんと窓と窓の間に,壁が全く無いのです.)
少し距離があるので,指向性のあるアンテナを買おう,とか話をしている時に
冗談で,「中華鍋でいいじゃん」というような話をしていたのですが
Uni-Directional WIFI Range Extender
蒸し器を使って,似たような事をやっている人がいました・・・.

>This works even better than I thought it would.
『思った以上に効果があったよ.』

信じ難いです^^; 同じタイプの蒸し器を持っているので,試したい衝動に駆られます.


blog/2006-07-19

再帰を使わないように

研究室にHaskellを始めた人がいる.
その人が,Haskellでプログラムを書く時には,どうしても再帰が沢山出てきて
慣れが必要だなぁ.とぼやいていた.

Haskellはリストを処理して,ほとんどの処理をする事になるので
再帰を使うと綺麗に処理する事ができますが
たしかに,何でも再帰を使って書くのは面倒だ.

関数型言語では,全ての関数を等号で繋ぐ事で,プログラムを書いていく.
つまり,やりたい事=分割された問題...
をひたすら書いていく事になる.これは,何をやりたいのか,という事を等号で繋ぐだけなので
うまく表現できると,ソースコードがそのままコメントになるほど美しいコードが書ける.
しかし,例えば乗算をする関数を考える.

mult _ 0 = 0
mult a b = a + mult a (b-1)

マイナスの値でかけれなかったりで, 色々バグだらけだが,再帰で書くとこんな感じだろう.
しかし,乗算を子供の頃に
「りんごが3個入った籠が2個あると,全部でりんごがいくつ?」
と習ったであろう私達には違和感がある.
実際,multの定義は
「3*2は 3*1 に3足した物」
となっている.まぁだから再帰なのですが...
再帰は確かに便利だが,コードが直感的でなくなる事がよくあるように思う.
それなら,再帰をなるべく使わずに書いてみよう.というか,再帰の部分は標準ライブラリに任せてしまおう.
と寝る前に考えてみた,再帰を使わないmult2の定義はこんな感じ.

mult2 a b = foldl1 (+) $ replicate a b

「b個のりんご,がa個あると全部でいくつ?」
直感的なコードになっていると思います


blog/2006-07-15

キャンプ

友達8人で,大町のキャンプ場でキャンプをした.
天気は生憎の雨でしたが,湖で泳いだり騒いだり.

キャンプ場の駐車場に,怪しい車が大量に止まっていた...


blog/2006-07-14

Meadowのツールバーを消す

エンボス加工されたテトリスをプレイする為に,Meadowのバージョンを3.0にあげてみた.
大きいツールバーが邪魔だったので,公式のマニュアルで消し方を探したが,ややこしい方法しか書いていなかった.
M-xしてtool[tab]としたら,tool-bar-modeが見つかったので,.emacsに
(tool-bar-mode nil)
を追加しといた.


blog/2006-07-13

Eitherのリストを二つのリストに分ける

研究室のTkd君がHaskellを始めた.よし

それとは別で,Eitherな型を返すリストから,種類別にリストを得たい.
つまりこんな関数 hoge :: [Either Fuu Bar] -> ([Fuu], [Bar])

newtype Odd  = Odd  Integer deriving Show
newtype Even = Even Integer deriving Show

nums       :: [Integer]->[Either Odd Even]
nums []     = []
nums (n:ns) = if n `mod` 2 == 0 
              then Right (Even n):nums ns
              else Left  (Odd  n):nums ns

o_e       :: [Either Odd Even]->([Odd], [Even])
o_e []     = ([],[])
o_e (n:ns) = let (os,es)= o_e ns
             in case n of
                  Left  o -> (o:os, es)
                  Right e -> (os  , e:es)
Prelude> o_e $ nums [1..6]
([Odd 1,Odd 3,Odd 5],[Even 2,Even 4,Even 6]

作った後で,今回は他の方法でいけると気づいたので,結局使わなかったけれど... メモ


blog/2006-07-11

関数のリストのデバッグ

Haskellにはデバッガという物が存在しません.
これは,一般的にHaskellがバグフリーと言われている事と,対話環境との親和性が高いからだと思います.
実際,関数を定義した後には,deriving Showされたデータを対話環境を使って表示し
正しく動いているかを確認する事ができます.

Prelude Xml> atoi \"3456789876545678\"
3456789876545678

所が,(a->a)のように,deriving Show出来ないデータ型も存在します.
私が今書いているプログラムでは,「関数のリスト を返す 関数」の動作が肝なのですが
ちゃんと動いているか不安です.
仕方が無いので

newtype Hoge a = Hoge (String, a->a)
instance Show (Hoge a) where
    show (Hoge h) = fst h

とかやってデバッグしてみたのですが,型構築子のせいで普通のalistとして扱えません.少し不便.

instance Show (String, a->a) where
    show (s,_) = s

みたいにできたら便利なのですが...(遅延評価で何とかならないのでしょうか...)


blog/2006-07-10

Haskell版atoi

Haskellでパーサを書いている時に,Cのatoi的な事をやらせたくなったので書いてみた.

atoi :: Integral a=>String->a
atoi s = foldl1 (+) $ zipWith (*) (map (10^) [0..]) (reverse $ map (fromIntegral.digitToInt) s)

もっと綺麗に書けないかなぁ(汗
そもそも,標準ライブラリにありそうな気がする.

で,XMLのパーサを書いていたのだが,100行程度のコードであっという間に書けた.
HaXMLで,exampleすらコンパイルできずに苦労していたので
最初から自分で書けばよかったと後悔...
やっぱり,Parsecは便利だ(perl + 正規表現の方が楽かとも思いますが


blog/2006-07-07

ビア樽祭最終日

今日は大学生協のビア樽祭(ビアガーデン)最終日.
天気が悪く,水,木とお客さんが少なかったので,週末の最終日には期待していたのですが
結局,例年の半分ほどのお客さんしか来ませんでした.
それでも,今年は知り合いが(声をかけてない人を含めて)沢山きてくれたので,私は楽しかった.

片づけが終わってからは,余ったお酒やおつまみ,それと生協からの差し入れのお寿司で飲み食い.
12時頃に,生協を後にしてNTRの家で二次会.

生協学生委員に今年入った後輩とは,4月の花見以来会ってなかったので,3ヶ月ぶり.
今年も面白い後輩が沢山いるみたい.夏合宿が楽しみだ.


blog/2006-07-04

SPAMフィルタ

「ハッカーと画家」を読んだ.
「Lisp最高,Microsoft最悪」な著者が,一流のハッカーについて(と近づく方法)全16章で語っている.
独特の語り調が面白くて,一気に読む事ができた.
この作品の特徴は,読者の創作意欲を一気に引き出す点だと思う.
大学のプログラミングのカリキュラムでは,C言語の文法に半年もかけるよりは,この本を読ませ
「さぁ何か作ってみない? 分からない点があれば自分で調べて.」と言った方が効果的な気がする.
素質のある人は,それで勝手に動き出すと思う.
ちなみに,この本はWeb上で全編公開されています.というよりは,Web上のエッセイを本にまとめた物です.
私も,過去に何章分か読んだ事があったのでびっくりした.面白いので,興味のある方はぜひ読んでみてください.
日本語訳は「プロジェクト杉田玄白」(うちのリンク集にありますね^^;)上で公開されています.
ここを辿っていけば,見つける事ができるはずです.グレアム、ポールで探せば見つかるはず.(それぞれの章が別のテキストとして公開されています.)

で,「ハッカーと画家」に影響されてbsfilterというSPAMフィルタを入れてみる事にした.
POP proxyとしても動作させれるので,Windowsのクライアント側でも使える.
少し使ってみたけれど,良い感じに動作している.



blog/2006-07-03

国内予選は通過

ACM/ICPCの国内予選はなんとか通過しました.
35位=>重複を除くと21位でした.上位を狙う事も不可能で無い事は確認できたので,アジア予選はもっと上位を狙います.