flymakeがあるのが当たり前になってしまっているので、Haskellで書いてる時にもダメなところはダメって言ってもらわないとちょっと気持ち悪い。
Haskellでもflymakeを使えるようにするためにMac/emacsでHaskell環境を作るを参考に自分のflymake-init.elに追加した。
ついでにhaskell-modeも新しいのを入れるためにgit cloneしておいた。
おまけ
- Mac/emacsでHaskell環境を作るにあったel-getが気になるので後で調べる
flymakeがあるのが当たり前になってしまっているので、Haskellで書いてる時にもダメなところはダメって言ってもらわないとちょっと気持ち悪い。
Haskellでもflymakeを使えるようにするためにMac/emacsでHaskell環境を作るを参考に自分のflymake-init.elに追加した。
ついでにhaskell-modeも新しいのを入れるためにgit cloneしておいた。
おまけ
13062012 Haskell
13062012 Haskell
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
ranges-0.2.4をダウンロードしてきて
runghc Setup configure --prefix="$HOME/.cabal" --user runghc Setup build runghc Setup install
って普通にいれたら入った。
あとは再度上の手順でyesodをインストールした。
12062012 家庭菜園
サツマイモの間に撒いておいた枝豆の種が芽を出していた。


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

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

今年は去年の倍のゴーヤを植えた。
11062012 sake
葵天下は静岡の日本酒らしく、結構攻めてくる感がある。香りもそれなりにするしね。

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

11062012 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で計算をはしらせたけど、関数型はそういうのがないからなぁ、適用しろっていう文脈を持った型なのに、じゃぁどのタイミングで適用すんのよ?とよく分からなくなってきた。
暗黙的な何かなのか、それともそもそも自分の理解がどこか間違っているのか?
値コンストラクタと型コンストラクタをきちんと理解してなかった。型コンストラクタの型変数は引数として取るものだと思っていたが、単に型変数を表しているだけなのね。
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
10062012 life
黄金比だけでなく白銀比があるというのは知らなかったし、白銀比とA4やB5の話が面白かった。
数学とは直接関係ないのだが、割れにくいシャボン玉液の比率は参考になった。
内容はちょっとデザインよりかな。twitter の新ロゴデザインが美しすぎて調べてみたら、黄金比で構成されてた。なんかに興味があれば読んでみればいいんじゃないでしょうかね。
10062012 家庭菜園
コンパニオンプランツということで、サツマイモの畝に枝豆の種をまいてみた。で、ナスの畝にはつるなしインゲンを。

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


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

入門的な内容なんだけど、3章のMongoDBとPythonの頻出パターンは参考になった。
特にupsertの書き方(find_or_insertとか、insert_or_update)がいまいちわかっていなかったけど本書を読んだらすっきりしたので、これで気持ちよく書けそう。
あとはオフィシャルサイトのマニュアル(日本語訳)でも読めばいいかな。
スケーリングMongoDBも読んでみたいが使う場面がないのでとりあえずは後回し。
09062012 Python
MLに「FlaskでBDDやってる?」っていうスレッドが流れてて、2つのやり方が紹介されてた。僕は家庭菜園をやっている関係上、lettuceを選択せなあかんわなというわけで、あまり検討しないで、lettuceを使うことに決めた。
2つの違いはなんなの?ってあたりが気になるのだけどこれもsofにあった。
要するにpyccuracyはブラウザでのテストに特化しているがlettuceはもうちょっと汎用的な使い方ができる。実際にlettuceでselenium使いたい場合はlettuce_webdriverっていうプラグインみたいなのを別途導入する必要がある。
一方で、共通しているのはGherkin DSLを使っているということで、確かlettuceはcucumberのpythonポーティングだったから、そっちでググれば日本語の情報が出てくる。
featuresっていうディレクトリを作って、そこにテスト用のファイルを置く。 ディレクトリの構成はこんな感じ。
.
└── features
├── steps.py
└── 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はモジュールの設定とか色々やるみたいなんだけど、今回はwebdriverのほうに定義されているもの しか使わないのであまり書くことがない。
from lettuce import before, world from selenium import webdriver import lettuce_webdriver.webdriver @before.all def setup_browser(): world.browser = webdriver.Firefox()
実行するとseleniumパワーでブラウザが立ち上がり、テストが実行され結果が端末に表示される。テスト結果はカラー表示で分かりやすい。

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