三島haskell無名関数の会に参加しました

Haskell好きが集まってHakellに関してワイワイガヤガヤするという三島haskell無名関数の会が4年ぶりに開催されたので参加してきました。

ていうか、@karky7と二人だけだけだったw。

karky7に会うのは2年ぶりくらい?会場はリパブリュー

java とかscalaの話から入って、Goどうなんかな?みたいな

1512873372

ポテトにアンチョビをまぶしたのをつまみつつ、型システムと遅延評価、Hakyllいいよねっていう

1512873374

ラムチョップ美味いですね。からの麺や七彩おすすめという話と銀座のラーメン屋制覇しつつ、 pythonでrangeで添字付けながらループ回すのC++の影響なの?ww

1512873378

リュウゼツランのビールからなんで製薬会社は論文出すの?秘密にしないの?に対してGitHubにコードあげないと優秀なひと来ないでしょ? ソフトウェア開発会社は?みたいに返してなるほどされた話とか。

1512873380

うしとらモザイクマッドネスから、SBDDとかLBDDのしごとって何なの?とかあとマッドネスなネタをはさみつつ。karky7はユーチューバーになりたいヒトなんですか?とか

今元気が出るテレビの画像抽出を(haskellで?)やっている話とか、

「あーそう言えば僕のgmailアドレスは」

「あー知ってる知ってる、あれでしょ、山田太郎、メロリンキュー」

とバレていたりとかw

1512873382

リパブリューの5作目を飲みつつ、子供にプログラミング教育でスクラッチは甘えじゃないのか、だまってCとか 教えろやっていう話とか。

1512873384

ムール貝から、来年は伊東の浜でBBQやりつつ勉強会するかという話と、おもむろにカウンターでGentoo起動させ始めてyesodに関してのアツいスライドが。

1512873387 1512873389

モーモースタウト飲みながら、ワンコ愛について語る感じで

1512873391

尚、ビールは全てパイントですw結局5時間しゃべりっぱなしだったというw とても楽しかったので、Haskellなどの関数型言語に興味がある方は次回参加されるといいと思います。Python,Java,C,C++,Scalaといった言語全般に関しても語り合えると思います。Gentooに関してはkarky7に任せますw

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するのはめんどくさかったので、かなり快適になった。