Haskell Platform 2013.2.0.0をインストールした

待望のHaskell Platformがリリースされたので早速入れてみる。

GHCが7.6.3になっていて64ビットでもYesodが動くので64bit版をインストールした。これで、curlもいけるかな。

それから、virthualenvがhsenvに変わっているので、virthualenvwrapperもhsenvwrapperに変えておこうっと。

型システム入門がきた

頑張って読んでいこうかと。

1364542311

ProductName 型システム入門 −プログラミング言語と型の理論−
Benjamin C. Pierce
オーム社 / 7140円 ( 2013-03-26 )


静岡プログラミング言語勢力図2013春版

13.03.23追記

皆さんのおかげでShizuoka.pyを開催することになりましたので楽しくやりましょう。

ProductName キングダム 1 (ヤングジャンプコミックス)
原 泰久
集英社 / 530円 ( 2006-05-19 )



静岡県は東西に長いので文化が結構違うのだが、実はプログラミングのカルチャーも違うのだ。 二年くらい前は西のRuby東のPythonと言われていたような気がするんだが最近は静岡県東部でHaskellerが勢力を伸ばし始めているのが認知されているらしく素晴らしいですね。

shizuoka_lang

西部にはHamamatsu.rbがあり、東部には三島Haskell無名関数の会があるのに、静岡でPythonの集まりがないのはアレなので、一度くらいはShizuoka.pyをやりませんか?

snake

巳年だしね。

Persistentでキーから検索する方法

昨日の三島Haskell無名関数の会(mishima.hs)で「PersistentのKeyってどうやって作るの?」っていう話になって、宿題として持ち帰ったので朝から調べていた。

Keyは

type Key val = KeyBackend (PersistEntityBackend val) val

で、KeyBackendのデータコンストラクタがKeyなので、PersistValueのデータコンストラクタで包めばいいみたい。

ひとつレコードを作って、キーを指定して年齢を変更した後、キーでレコードを取ってきて年齢が変わっていることを確認するサンプル。SQLitのキーがInt64なのでこのサンプルではPersistInt64データコンストラクタを使っている。

{-# LANGUAGE QuasiQuotes, TemplateHaskell, TypeFamilies, OverloadedStrings #-}
{-# LANGUAGE GADTs, FlexibleContexts #-}
import Database.Persist
import Database.Persist.Sqlite
import Database.Persist.TH
import Control.Monad.IO.Class (liftIO)
import Database.Persist.Store

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persist|
Person
    name String
    age Int Maybe
    loc String default="Japan"
    deriving Show
|]

main :: IO ()
main = withSqliteConn "test.db" $ runSqlConn $ do
    runMigration migrateAll
    kzfmId <- insert $ Person "kzfm" (Just 20) "Fuji"
    liftIO $ print kzfmId
    kzfm <- getJust kzfmId
    liftIO $ print kzfm
    kzfm2 <- replace (Key (PersistInt64 1)) (kzfm {personAge = Just 36})
    liftIO $ print kzfm2
    kzfm3 <- getJust (Key (PersistInt64 1))
    liftIO $ print (personAge kzfm3)

どういうメソッドがあるのかはDatabase.Persist の関数群を簡単に説明が参考になる。

三島Haskell無名関数の会 第2回目とホルモン

やりました。virthualenvを快適に使うためのvirthualenvwrapperの話と、

静的サイトジェネレーターのHakyllの話をしてきた。Hakyllは導入するとこで時間切れになってしまったので残念。結構便利だと思うので、もっと広まって欲しい。

懇親会は鈴木屋で。

1361621625

Virthualenvwrapperとは

Haskellでサンドボックス環境を構築するにはvirthualenvcabal-devがポピュラーだと思います(が後者は使ったことない)。

virthualenvを使う場合、仮想環境を構築したいディレクトリに移動してvirthualenvコマンドを叩いてファイルのコピーなどをした後に source .virthualenv/bin/activateで仮想環境に入る必要があるため、以下の問題があります。

  • 仮想環境が増えていくとディレクトリの管理が大変になってくる
  • virthualenv -> source .virthualenv/bin/activateはルーチンなので面倒くさい

Virthualenvwrapperはこれらを解決するものです。virthualenvwrapperを使うと、

  • 仮想環境は.virthualenvディレクトリ以下に作成される(mkvhenv)
  • 仮想環境のディレクトリに移動してactivateをするコマンドを提供(workhon)
  • 仮想環境のリスト(lsvirthualenv)
  • 仮想環境削除(rmvirthualenv)

なかなか便利です。

HakyllでJadeを使う

unixFilterを使えばよいが、jadeはstdinオプションがなかったので

cat $1 | jade

というbashスクリプトを用意してbin/sjadeとした。

hakyllでの設定はこんな感じ。

match (fromList ["index.jade", "about.jade", "member.jade"]) $ do
  route $ setExtension "html"
  compile $ getResourceString
    >>= withItemBody (unixFilter "bin/sjade" [])
    >>= loadAndApplyTemplate "templates/default.html" defaultContext
    >>= relativizeUrls

Hakyllとは何か?

pandocが組み込まれたWebサイト用makeというのが僕の印象。

Jekyllがブログっぽい静的サイトを生成するっていうイメージだったので、Hakyllも似た感じなのかなぁと考えていたけどちょっと違う感じ。

pandocとunixFilterのおかげでepub, docx出力なんかもできるのでちょっとした規模のサイトだったら構成ごとそのまま管理できると思う。

それからSphinxでサイト管理するよりは、もうちょっと柔軟に対応できそう。というよりサブディレクトリにSphinxを埋め込めればさらに快適になりそう。

haskellのソースコードもDSLっぽくなっていて、match -> route -> compileの流れは分かりやすい。

三島Haskell無名関数の会 第2回目やります

今週末です。発表者と参加者募集中。今のところ

  • virthualenvwrapperの紹介
  • persistent入門

をやる予定にしてますが、他にioDriveでHaskell使うとどんな感じなの?とかそんな発表も期待してます。

時間が余るようだったらHakyllのハンズオンでもやる予定にしてます。

僕の場合はマイクロフレームワークはFlaskで静的サイトジェネレータはHakyllを使っている。

フルスタックのフレームワークはあまり好きじゃないんだけど、使うならYesodを習得したいなぁと思っているが。


2/23@三島です。

内容はこれから更新していきますが、懇親会は鈴木屋でホルモンをいただく感じです(というかこっちがメイン)。

1360096263

僕はvirthualenvwrapperの話とoptparse-applicativeでなんかコマンドをつくるというネタでもやろうかなと思っている。

Haskellでbrewのcurlを使おうとしたが

Haskellでscpを使いたいなぁと思い、色々と調べてみたがヨサゲなのが見つからなかった。

そこで、あーそういえばcurl使えんじゃんと思い出して、職場のlinuxではcabal install curlでokだった。この勢いでMBAにも入れようとしてハマった。

osxに最初から入っているcurlはscpに対応していない

$ /usr/bin/curl -V
curl 7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smtp smtps telnet tftp 
Features: AsynchDNS GSS-Negotiate IPv6 Largefile NTLM NTLM_WB SSL libz

というわけでbrewで入れた(libssh2が必要)。ちなみにこんなのが出るのでln -sした。

$ /usr/local/bin/curl -V
curl 7.28.1 (x86_64-apple-darwin12.2.1) libcurl/7.28.1 OpenSSL/0.9.8r zlib/1.2.5 libssh2/1.4.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp 
Features: IPv6 Largefile NTLM NTLM_WB SSL libz

curlのほうはコレでOK。

続いてcabal installでcurlを入れるわけだが、brewのlibとかincludeを指定できないみたいなので、ソースを読んでみる。

curlc.cのincludeが

#include <curl/curl.h>

と決め打ちなので、ちょいと書きなおしてやる

#include "/usr/local/Cellar/curl/7.28.1/include/curl/curl.h"

これでコンパイル通るかなーと

通らない。

/usr/local/Cellar/curl/7.28.1/include/curl/curlrules.h:143:0:
     error: size of array ‘__curl_rule_01__’ is negative

/usr/local/Cellar/curl/7.28.1/include/curl/curlrules.h:153:0:
     error: size of array ‘__curl_rule_02__’ is negative
cabal: Error: some packages failed to install:
curl-1.3.8 failed during the building phase. The exception was:
ExitFailure 1

negativeってなんだよ?とググってみたらヒットした。要するに64bitのlibcurlを32bitのghcで使おうとしてエラーになっているらしい。

が、32bitじゃないと現状Yesodがうまく動かないのでこれ以上はどうしようもない感じ。

5月にHaskell Platform 2013.2.0.0が出たら再チャレンジするかな。またはlibssh2とかsshでなんとかするか。

virthualenvwrapperでmkvhenvしたら自動的にworkhonするようにした

mkvhenvっていうmkvirtualenvに対応するコマンドを用意した。mkvirthualenvしたあとにworkhonするのはめんどくさかったので、かなり快適になった。

「数学的推論が世界を変える」がおもしろい

Haskellなんかの型推論とか量子論をかじっているヒトが読むとかなり面白いと思う。述語理論、ゲーム理論、ゲーデルの不完全性定理なんかを説明して最後に確率的クリピキモデルに至るという内容。事例で金融の話が度々登場する。

僕はチューリングの定理(対角論法は知ってたけど)を理解できたのと、金融で不確定性原理が出てくるのが「原子の観測はミクロなのにマクロな市場でも表れるのか!」と驚いたが、結局介入しないと観測できないということから来てるんだろうなぁと解釈した。

  • 相互推論は様相論理の一つとみなすことができる
  • チューリングの定理が成り立つポイントはチューリングマシンを自然数で表すことができることである
  • ソロスの「再帰性」は「何の影響も与えることなく、外側から世界を理解することができない」ことを意味している
  • 確率的クリピキモデル

他にはボトムの意味をもうちょっと深く理解したのが、意外な収穫。

ProductName 関数プログラミング入門 ―Haskellで学ぶ原理と技法―
Richard Bird
オーム社 / 3990円 ( 2012-10-26 )


ゲーデルの不完全性定理を知るには数学ガールが良いとおもう。

ProductName 数学ガール ゲーデルの不完全性定理 (数学ガールシリーズ 3)
結城 浩
ソフトバンククリエイティブ / 1890円 ( 2009-10-27 )