EmacsでHaskellをつかうために

flymakeがあるのが当たり前になってしまっているので、Haskellで書いてる時にもダメなところはダメって言ってもらわないとちょっと気持ち悪い。

Haskellでもflymakeを使えるようにするためにMac/emacsでHaskell環境を作るを参考に自分のflymake-init.elに追加した。

ついでにhaskell-modeも新しいのを入れるためにgit cloneしておいた。

おまけ

Real World Haskell 3周目

すごいHaskellですっかりHaskellにスイッチしてしまったので、一年半ぶりにReal World Haskellを読んでみることにした。

理解がいまいちなとこにポストイットを貼り付けておいたので、すごいHaskell読んだ後の僕がどんだけ剥せるかちょっと楽しみではある。

1288005286

ProductName Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan
オライリージャパン / 3990円 ( 2009-10-26 )


ProductName すごいHaskellたのしく学ぼう!
Miran Lipovača
オーム社 / 2940円 ( 2012-05-23 )


それから、HackageでPDBtoolsってのを見かけたのであとでソースコードを読んでみる。

ソースコードリーディングするならHackageで探すのがいいのか、それともGitHubがいいのか

yesodをos10.7にインストール(解決)

yesodをインストールしようとしたら、エラーを吐いた。(Haskell Platform 2012.2.0.0 for Mac OS X, 32 bit)

$ cabal install yesod-platform
Resolving dependencies...
Configuring ranges-0.2.4...
Preprocessing library ranges-0.2.4...
Building ranges-0.2.4...
[1 of 1] Compiling Data.Ranges      ( Data/Ranges.hs, dist/build/Data/Ranges.o )

Data/Ranges.hs:9:6:
    Illegal datatype context (use -XDatatypeContexts): Ord a =>
cabal: Error: some packages failed to install:
email-validate-0.2.8 depends on ranges-0.2.4 which failed to install.
ranges-0.2.4 failed during the building phase. The exception was:
ExitFailure 1

rangesを別にインストールしてみたらもうちょい詳しいエラーが出た。

$ cabal install ranges-0.2.4
Resolving dependencies...
Configuring ranges-0.2.4...
Preprocessing library ranges-0.2.4...
Building ranges-0.2.4...
[1 of 1] Compiling Data.Ranges      ( Data/Ranges.hs, dist/build/Data/Ranges.o )

Data/Ranges.hs:9:6:
    Illegal datatype context (use -XDatatypeContexts): Ord a =>
cabal: Error: some packages failed to install:
ranges-0.2.4 failed during the building phase. The exception was:
ExitFailure 1

120613

ranges-0.2.4をダウンロードしてきて

runghc Setup configure --prefix="$HOME/.cabal" --user
runghc Setup build
runghc Setup install

って普通にいれたら入った。

あとは再度上の手順でyesodをインストールした。

今日の畑(120610)

サツマイモの間に撒いておいた枝豆の種が芽を出していた。

1339500541

1339500539

キュウリの花が咲いていた。まぁ、順調なのかな。

1339500543

ゴーヤはポット苗をさらに2つほど定植した。

1339500545

今年は去年の倍のゴーヤを植えた。

最近飲んだの

葵天下は静岡の日本酒らしく、結構攻めてくる感がある。香りもそれなりにするしね。

1339315193

四季桜は栃木の酒らしく、ちょっとまとわりつく感じ。まぁあそこら辺は濃い味付けの物が多いからなぁ。

1339315234

Haskellで関数は型、値コンストラクタは関数だとすると関数型の値コンストラクタって何?

朝カットに行って髪を切ってもらっている間、タイトルのようなことを考えていた。

Prelude Control.Arrow> :i (->)
data (->) a b   -- Defined in `GHC.Prim'
Prelude Control.Arrow> :k (->)
(->) :: * -> * -> *

であり、(->)は型として定義されている。すごいHaskell(p.232)の言葉を借りれば、適用しろという文脈の着いた型と考えればいいんだろう。

部分適用((->) r)のfmapは(.)なので関数合成なんだが、そういえばArrowか?などとControl.Arrowを探索しはじめた。

Prelude Control.Arrow> :i (.)
(.) :: (b -> c) -> (a -> b) -> a -> c   -- Defined in `GHC.Base'
infixr 9 .
Prelude Control.Arrow> :i (>>>)
(>>>) ::
  Control.Category.Category cat => cat a b -> cat b c -> cat a c
    -- Defined in `Control.Category'
infixr 1 >>>
Prelude Control.Arrow> :i (<<<)
(<<<) ::
  Control.Category.Category cat => cat b c -> cat a b -> cat a c
    -- Defined in `Control.Category'
infixr 1 <<<

というわけで、(.)と(<<<)は同等のものかな。

(.) :: (b -> c) -> (a -> b) -> a -> c

これは部分適用((->) r)を使えば

(b -> c) -> ((->) a b) -> ((->) a c)

結局(->)をcatに書き換えれば同じ物ができる。そういうあたりから考えるとArrowは関数合成を拡張(一般化?)したものと考えればいいのかなぁ。

とか考えていくうちに関数型の値コンストラクタって一体なんじゃろかねーという疑問が湧いてくるわけで。

14章で状態付きの計算をやったときとかのStateモナドはrunStateで計算をはしらせたけど、関数型はそういうのがないからなぁ、適用しろっていう文脈を持った型なのに、じゃぁどのタイミングで適用すんのよ?とよく分からなくなってきた。

暗黙的な何かなのか、それともそもそも自分の理解がどこか間違っているのか?

ProductName すごいHaskellたのしく学ぼう!
Miran Lipovača
オーム社 / 2940円 ( 2012-05-23 )


120611 追記

値コンストラクタと型コンストラクタをきちんと理解してなかった。型コンストラクタの型変数は引数として取るものだと思っていたが、単に型変数を表しているだけなのね。

data Maybe a = Nothing | Just a     -- Defined in `Data.Maybe'
data Either a b = Left a | Right b  -- Defined in `Data.Either'

なんだけど

read :: Read a => String -> a

見たら、なんか間違っていたと理解した。

それから、RWHのp.228

type InfoP a = FilePath
                   -> Permissions
                   -> Maybe Integer
                   -> ClockTime
                   -> a

デザインのための数学

黄金比だけでなく白銀比があるというのは知らなかったし、白銀比とA4やB5の話が面白かった。

ProductName デザインのための数学
牟田 淳
オーム社 / 2310円 ( 2010-10-23 )


数学とは直接関係ないのだが、割れにくいシャボン玉液の比率は参考になった。

内容はちょっとデザインよりかな。twitter の新ロゴデザインが美しすぎて調べてみたら、黄金比で構成されてた。なんかに興味があれば読んでみればいいんじゃないでしょうかね。

今日の畑(120606)

コンパニオンプランツということで、サツマイモの畝に枝豆の種をまいてみた。で、ナスの畝にはつるなしインゲンを。

1339286165

結局失敗した大根だが、風で飛ばされて畝から外れた大根が何故か育っている。

1339286170

1339286168

大根は秋にもう一度チャレンジだな。

MongoDB & Pythonを読んだ

Haskellのwebフレームワークyesodでもmongodbが使えるし 、今作ろうと思っているウェブアプリにMongoを使ってみようかなぁと思っていたので、MongoDB & Pythonを買って読んでみた(readiumってのを使ってます)。

MongoDB & Python

入門的な内容なんだけど、3章のMongoDBとPythonの頻出パターンは参考になった。

  • ドキュメント指向にユニークなパターン:埋め込み
  • 高速ルックアップ:MongoDBでインデックスを使う
  • 位置情報アプリとMongoDB:地理空間インデックス
  • ディフェンシブなコーディングでKeyErrorやその他のバグを防ぐ
  • 更新または挿入:MongoDBのアップサート
  • アトミックな読み書き変更を行う:MongoDBのfindAndModify
  • 高速アカウンティングパターン

特にupsertの書き方(find_or_insertとか、insert_or_update)がいまいちわかっていなかったけど本書を読んだらすっきりしたので、これで気持ちよく書けそう。

あとはオフィシャルサイトのマニュアル(日本語訳)でも読めばいいかな。

スケーリングMongoDBも読んでみたいが使う場面がないのでとりあえずは後回し。

FlaskでBDD(ブラウザUIテストの話)

MLに「FlaskでBDDやってる?」っていうスレッドが流れてて、2つのやり方が紹介されてた。僕は家庭菜園をやっている関係上、lettuceを選択せなあかんわなというわけで、あまり検討しないで、lettuceを使うことに決めた。

lettuceを使う方法

pyccuracyを使う方法

2つの違いはなんなの?ってあたりが気になるのだけどこれもsofにあった。

要するにpyccuracyはブラウザでのテストに特化しているがlettuceはもうちょっと汎用的な使い方ができる。実際にlettuceでselenium使いたい場合はlettuce_webdriverっていうプラグインみたいなのを別途導入する必要がある。

一方で、共通しているのはGherkin DSLを使っているということで、確かlettuceはcucumberのpythonポーティングだったから、そっちでググれば日本語の情報が出てくる。

lettuceを使ってみる。

featuresっていうディレクトリを作って、そこにテスト用のファイルを置く。 ディレクトリの構成はこんな感じ。

.
└── features
    ├── steps.py
    └── web.feature

web.feature

featueは普通に文章を書いているようで何をしたいかがわかりやすく表現できる。

Feature: Compute factorial
    In order to play with Lettuce
    As beginners
    We'll access google

    Scenario: Filling out the query form
      Given I go to "http://www.google.com"
       When I fill in "q" with "Hello World"
        And I press "btnG"
       Then I should see "Hello World"

steps.py

stepsはモジュールの設定とか色々やるみたいなんだけど、今回はwebdriverのほうに定義されているもの しか使わないのであまり書くことがない。

from lettuce import before, world
from selenium import webdriver
import lettuce_webdriver.webdriver

@before.all
def setup_browser():
    world.browser = webdriver.Firefox()

実行してみる

実行するとseleniumパワーでブラウザが立ち上がり、テストが実行され結果が端末に表示される。テスト結果はカラー表示で分かりやすい。

lettuce webdriver

Spine.jsやBackbone.jsなんかのクライアントサイドMVCのテストとかにも向いてるのかな?今度調べる。