Haskell Type Class

いまだに慣れないのが、Haskellの型(と型クラス)。図を書いてみたがどうだろうか?

Sayonara Lou

Haskell Chartモジュール(インストールだけ)で一苦労

Haskell Chart パッケージでグラフ描画という記事を見かけて面白そうだったので早々にインスト−ルを試みたんだけど、あれやらこれやら面倒くさくて参った。

このパッケージには、cairo/pangoなんかが必要なんだけどports経由で64bit版オンリーでインストールしていたことをすっかり忘れてエラー続出。(ghcは32bit版だからね)カッとなって、手動でライブラリをインストールとかしているうちに依存関係ぐちゃぐちゃになったので、もうこの2日のことはなかったことにして

sudo port uninstall --follow-dependents cairo
sudo port uninstall --follow-dependents pango-devel
sudo port install cairo +universal
sudo port install pango-devel +universal

ライブラリを清算。(念のため32bitもインストールしてるところが嫌らしいですが...)ghcもいろんなバージョンがぐちゃぐちゃしてたので一度整理

sudo uninstall-hs --remove thru 7.6.3

思い切ってghcは64バージョンをインストールした後、あらためて

cabal install gtk2hs-buildtools
cabal install gtk
cabal install chart
cabal install chart-gtk

イェエイ!ようやくサンプルが動きました。

ようやくスタートライン。サブノートのLinux Mintはそれなりすんなりいった。

LibreOffice 4.1.0アップデート

Mac minのLibre Officeを4.1にアップデートしたので、Linux minも同じく4.1にアップデートした。Macの場合は上書きしただけなんだけど、mintのほうはほんの少しだけ面倒だ。

まず、バンドルされていたLibre Officeを削除しなきゃいけない。

体感する数学(竹内薫)を体感する(モンテカルロ法)

in

体感する数学という本を読んだ。少々こじつけっぽいところが多いなぁと思ったのだけれど1つくらいは実際に体感してみなくてはと思い、モンテカルロ法なるものを体感してみた。

例えば半径が5cmの円の面積を知りたいとします。(略)まず円にぴったりとくっつくように、正方形を描いてみましょう。そうすると半径が5センチの円ですから、正方形の一辺は10センチになります。その図を描いたところで、0から10までの乱数をいくつか発生させます。(略)1回目に3、2回目に5がでたら、正方形の左下の角を中心として右に3センチ、上に6センチ進んだところに点を打ちましょう。これを何度も何度も繰り返します。
点を100個くらい打ったら、円の内側に入っている点と、円の外側に出ている点の数を数えます。そうするとだいたい100個の点のうち78個前後が円に入っていると思います。(略)...で円の面積はだいたい78平方センチメートルであることがわかります。

ほんと?ということで実際やってみました。まず、1から10までの乱数。これは、Haskellで疑似乱数を生成する(自力で)からパクリました。

randList :: Int -> IO [Int]
randList n = sequence . take n . repeat . getStdRandom $ randomR (1, 10)

この疑似乱数を使って座標(x,y)を100個作成し、円の内側に入っている座標の数を数えます。(a,b)を中心点とする円の方程式は、

なので、生成した(x,y)が中心点を(5,5)とした25 = (x - 5)^2 + (y - 5)^2の内側にいくつ入っているかを数えれば良いということになります。

円

main :: IO()
main = do
  x <- randList 100
  y <- randList 100
  let ax = zip x y
  let cir = [ (x,y) | (x,y) <- ax, ((x-5)^2 + (y-5)^2) <= 25]
  print  (length cir)

で、実際に10回実行してみると

*Main> main
76
*Main> main
82
*Main> main
79
*Main> main
81
*Main> main
85
*Main> main
75
*Main> main
80
*Main> main
81
*Main> main
71
*Main> main
78
*Main> 

お見事!。10回やった平均で78.8。多少のバラつきはあるもののほぼ毎回78の近傍です。まぁ、肝心の「何故、そうなるのか?」の部分はあいかわらず?のままなんですが、とりあえず体感したということで...

体感する数学 体感する数学
竹内薫

エンターブレイン 2013-06-15
売り上げランキング : 6527

Amazonで詳しく見る by G-Tools

iWork系のMIME-Typeが取得できない

in

ほとんどのドキュメントのMIME-TYPEは

CFStringRef fileExtension = (CFStringRef)[filepath pathExtension];
CFStringRef UTI = UTTypeCreatePreferredIdentifierForTag
  (kUTTagClassFilenameExtension, fileExtension, NULL);
CFStringRef MIMEType = UTTypeCopyPreferredTagWithClass(UTI, kUTTagClassMIMEType);

で取得できるはずで、例えばLibreOfficeのスプレッドシートならUTIが"org.oasis-open.opendocument.spreadsheet"となりMIME-TYPEがちゃんと"application/vend.oasis.opendocument.spreadsheet”で返ってくる。

しかしながら何故かApple謹製のiWork系ではMIME-TYPE変換できない。UTIは"com.apple.iwork.pages.pages"とそれらしいものが取得できているのにMIME-TYPEはNULLを返してくる。なんでだろ?EvernoteでiWork系書類もインライン表示できるようになったけど、MIME-TYPEで判断しているわけじゃないのかな?いづれ調べてみるつもり。

http://stackoverflow.com/questions/1454777/apple-iwork-mime-types
https://issues.apache.org/jira/browse/TIKA-588にはapplication/vnd.apple.iworkみたいなpatchがあるけどこれでいいんだろうか

パッケージ管理(yum) 

in

日頃お世話になっているくせにいざLPIC問題を解いてみると悲惨な結果だったので、きちんとまとめてることにする。あずき本からの抜粋。

yumの設定は/etc/yum.confと/etc/yum.repos.d/ディレクトリ以下のファイルでおこなう。以下の表は、yumコマンドの主なサブコマンド。

サブコマンド 説明
check-update アップデート対象のパッケージリストを表示する
update パッケージ名 指定したパッケージをアップデートする
install パッケージ名 指定したパッケージをインストールする
remove パッケージ名 指定したパッケージをアンインストールする
info パッケージ名 全パッケージリストを表示する
list 指定したパッケージをアップデートする
search キーワード パッケージを検索する
grouplist パッケージグループをリスト表示する
groupinstall グループ 指定したパッケージグループをインストールする

とりあえず、しばらくは試験のためわかっていると思われることも再学習することにする。(だいたい曖昧だったりするからね。)

東電福島原発事故 総理大臣として考えたこと

安倍総理は施政方針演説において

原子力規制委員会の下で、妥協することなく安全性を高める新たな安全文化を創り上げます。その上で、安全が確認された原発は再稼働します(安倍首相:施政方針演説 原発再稼働明言 「安全確認なら」- 毎日jp(毎日新聞)

と言った。しかしながら完全な安全など絵に描いた餅であり、遠い天空の彼方から巨大な隕石が降ってくる事はあいかわらず想定外だし、想定震度はたかだか人間の想像範囲内でしかない。次の災いは決して我々が想像し得ない角度からやってくる。

浜岡原発停止を要請した後見舞われる強烈な「菅降ろし」がはじまる。まるで、事故のすべてが彼の無能によるものであるかのごとく扱われる報道。もちろん、本書は当事者の筆によるものだから管さんにとって都合の悪いことは書いていないかもしれない。しかし、マスコミの報道もまだ同様であることもまた同じである。

まず、私たち日本人が経験した福島原発事故が国家存亡の危機であったという共通認識を持ち、そこから再スタートすべきだ。それを忘れた議論、無視した議論はまさに「非現実的」な議論だ。

311以降、福島で起きたことのすべては、東電の無責任かつお粗末な対応や、もちろん総理をはじめとする政府の不手際もあるだろう。しかし辛うじて破滅を回避し今日を迎えることができた今、考えるべきは今後の国のあり方ではないか。

お手製の演台に「原発ゼロ」を掲げるたったひとり。彼を支持せざるを得ない。

東電福島原発事故 総理大臣として考えたこと (幻冬舎新書)
東電福島原発事故 総理大臣として考えたこと (幻冬舎新書) 菅 直人

幻冬舎 2012-10-26
売り上げランキング : 2021

Amazonで詳しく見る by G-Tools

二項関係の数

練習問題やった。解答がないのであっているのか...

n個の要素を持つ集合Aについてその二項関係の数

個。そいで、冪集合の要素数は、

個。そのうち、反射関係は

個、対称関係であるものは

個。おもしろい。

組合せ数の求め方

HaskellでProject Euluerとかその他パズルとか解くとき、組合せの数が必要になることがよくあるけどこれまでは公式どおり

combination :: Int -> Int -> Int
combination n k
  | n  < k    = 0
  | n == k    = 1 
  | otherwise = truncate((fromIntegral n') / fromIntegral((k' * kn')))
  where
    k'  = factorial k
    n'  = factorial n
    kn' = factorial (n-k)

みたいなコードを使ってたんだけどhaskellで組合せと順列 - 計算機と戯れる日々を発見。さすが、nobsun!

パスカルの三角数は生成するコードを書いたことはあったんだけどこのコードと比べるとなんとも垢抜けないコードでとても晒せない。こういうコードをサクっと書ける関数脳なプログラマになりたいものだ。

-- pascal's triangle
triangle :: [[Integer]]
triangle = [1]:[zipWith (+) ([0]++t) (t++[0])|t <- triangle]

combination :: Int -> Int -> Integer
combination = (!!) . (triangle!!)

スターリング数(漸化)

スターリング数の漸化式もあったので書き直してみた。

stirling' :: Integer -> Integer -> Integer
stirling' 0 0 = 1
stirling' _ 0 = 0
stirling' 0 _ = 0
stirling' n k = stirling' (n-1) (k-1) + k * (stirling' (n-1) k)

がミソ。組合せ数や階乗を求めない分多少効率が良いかもしれない。

スターリング数

-- スターリング数
stirling :: Integer -> Integer -> Integer
stirling n k = truncate((fromIntegral s) / (fromIntegral k'))
  where
    s  = sum [(-1)^i * (combination k i) * (k-i)^n | i <- [0..k] ] 
    k' = factorial k

ついでにベル数も。

-- ベル数
bell :: Integer -> Integer
bell n = sum [stirling n k | k <- [1..n]]

一応答えはでるものの、式をコードに書き直しただけで洗練されてない。それ以上にこのコードをきちんと説明できるか!自信がない。(combinationとfactorialはテキトーに作ってね)

プログラム意味論と「Basic Category Theory for Computer Scientists」

in

プログラム意味論を飛ばし飛ばし読んでるんだけど、5章の「カテゴリ理論の基礎」が、以前読んで挫折しかけていた「Basic Category Theory for Computer Scientists」の 「1. Basic Constructions」とほぼ同じであることに気づいた。読みながらとっていたメモと比べてもなかなかイケてる。でも、やっぱり日本語で読んだほうが理解が深まるかなぁ

まぁ、結局のところ日本語だろうが英語だろうがわからないことがでで来れば行きつ戻りつしながら、あるいは別の本を探しなら読み進めていくしかないわけで、小説なんかと違ってなかなか「読了!」ってわけにはいかず、少しでも「理解の小島」が大きくなることを信じてこれからも未読の山と格闘していくのだ...

プログラム意味論 (情報数学講座)
プログラム意味論 (情報数学講座) 横内 寛文

共立出版 1994-06
売り上げランキング : 89090

Amazonで詳しく見る by G-Tools

Basic Category Theory for Computer Scientists (Foundations of Computing) Basic Category Theory for Computer Scientists (Foundations of Computing)
Benjamin C. Pierce

The MIT Press 1991-08-07
売り上げランキング : 17712

Amazonで詳しく見る by G-Tools

禅とオートバイ修理技術

in

二十年?ぶりくらいに読み返し。当時はほとんどよくわからなくて読み飛ばしていた箇所も多かった(というかほとんど)けど、少しはわかる箇所もでてきた。

シルビアの苛立ちは、コンピューターのプログラミングが「創造的なこと」だと思っている、ある友人に対して向けられていたのだ

はぁ、少なからずぼくの家庭にも当てはまるのだろうなぁ。まだ、再読始めたばかりだけど今度はどこまで吸収できるかな。

本当のシステムは、私たちの体系的思考そのものー合理性ーによって構築されたもである。だから工場を破壊してもそれを生み出した合理性が残っているかぎり、その合理性が再び別の工場を築き上げるだろう。

禅とオートバイ修理技術〈上〉 (ハヤカワ文庫NF)
禅とオートバイ修理技術〈上〉 (ハヤカワ文庫NF) ロバート・M. パーシグ Robert M. Pirsig

早川書房 2008-02
売り上げランキング : 200421

Amazonで詳しく見る by G-Tools

反射閉包

例えば、

と、その関係

があるとき、Rの反射閉包は

である。つまり、Rそのものが含まれている必要があるんだね。

ミルカさんに言われるまでもなく例示が理解を助けるな。あたりまえだけど、内容を理解していないと日本語にはうまく訳せない。

問題なのは何故これがmost important closuresのひとつなのか?なんだけど...

コンテンツの配信