ブログを移転します。
ブログを http://yamamoto.heroku.com/ に移転しました。
モナモナ言わないクイズ
http://mew.org/~kazu/material/2011-monad.pdf に3つ問題が出されていたので解いてみる。
lwrap, lbind (P. 26)
解答
-- lwrap :: a -> [a] と, しなかったのは -- fwrap :: a -> m a に合わせたので lwrap :: a -> [] a lwrap x = [x]
-- lwrap と同様に fbind :: m a -> (a -> m b) -> m b に合わせた lbind :: [] a -> (a -> [] b) -> [] b lbind xs f = [ y | x <- xs, y <- f x ] -- もしくは lbind xs f = concat $ map f xs -- もしくは lbind xs f = concatMap f xs -- 何回目のスタートHaskell だったかは忘れたが、concatMap は concat と map を合わせただけと -- どなたかが言われていたのを思い出したので concatMap も使ってみた.
答え合わせ
ghci> [1,2] `lbind` \x -> [3,4,5] `lbind` \y -> lwrap (x, y) [(1,3),(1,4),(1,5),(2,3),(2,4),(2,5)]
mmap (P.41)
解答
mmap :: (a -> b) -> Maybe a -> Maybe b mmap f Nothing = Nothing mmap f (Just x) = Just (f x)
答え合わせ
ghci> (+1) `mmap` Just 1 Just 2
第5回 スタートHaskell 感想
第 5 回は 10 章, 11 章が対象。10 章は 型とクラスについて書かれている。Haskell で一番特徴的な部分は? と訪ねられたら 型 と答えるかな(今のところ)。
モナド
@kazu_yamamoto さんによるモナドのチュートリアル。今回の勉強会における自分の中でのメインは、このモナドのチュートリアルだった。モナドのチュートリアルで使用された資料はここ http://mew.org/~kazu/material/2011-monad.pdf。
資料中に 文脈 という言葉が何度か出てくるけど、個人的に 文脈(コンテキスト)という言葉は何を指しているのかよくわからなかったりする。この資料でいう 文脈 とは 型 のこと。というか実現させたいこと、かな。Parser なら パーサ(解析)、IO なら副作用のように。
演習
いろいろあって演習の時間は少なくなってしまったけど、この問題は面白かった。具体的にどう面白かったってのは言いづらいんだけど(理解していない証拠)、型とはこの為にあるのだ、というのを垣間見た感じ。https://github.com/yuzutechnology/Community-StartHaskell2011/blob/master/exercises/chapter10/TreeMap-ja.lhs
まとめ
今回と前回で、ぼんやりだけれどもモナドについて理解できてきた気がする。あとは頭で覚えるよりも、体で覚えるぐらいコードを読み書きしないとな。
第4回 スタートHaskell 感想
今回は8章, 9章が対象。
本を読んでいてわかりにくくなってくるのがここから。でも Haskell として楽しくなってくるのはここから(@ruicc さん曰く)。
パーサー
型
パーサの型は関数。Int とか Char のように値ではなく関数。
type Parser a = String -> [(a, String)]
連結
これが本を読んでいていまいち理解できていなかった部分。
(>>=) :: Parser a -> (a -> Parser b) -> Parser b p >>= f = \inp -> case parse parse p inp of [] -> [] [(v, out)] -> parse (f v) out
この f がよく理解できていなかったんだけど、f は
p1 >>= \v1 -> p2 >>= \v2 -> ... pn >>= \vn -> return (f v1 v2 ... vn)
の
\v1 -> p2 >>= \v2 -> ... pn >>= \vn -> return (f v1 v2 ... vn)
の部分。だよね。
よくコードを読めばわかったハズだけど ...。
AirMac Express のログを syslog で受け取る
最近 AirMac Express の調子がおかしい。仕事から家に帰ってきてネットに接続しようとすると、タイムアウトが発生して AirMac Express に接続できない。電源を抜き差しすれば直るが、毎日そうするのも面倒だ。
とりあえず家を離れている間、どのようなことが起きているのか調べてみる。AirMac Express には syslog 経由でログを出力できるようになっているので、それを使うことにする。
問題は AirMac Express と syslog サーバの MacBook は無線 LAN で接続されているということ。問題が起きた時のログは拾えるのか?
環境
- MacBook (Mac OSX 10.6.8)
- AirMac Express (バージョン 6.3)
サーバ側設定
/System/Library/LaunchDaemons/com.apple.syslogd.plist を編集。もともとコメントアウトされている NetworkListener のセクションを有効にする。
<!-- Un-comment the following lines to enable the network syslog protocol listener. --> <key>NetworkListener</key> <dict> <key>SockServiceName</key> <string>syslog</string> <key>SockType</key> <string>dgram</string> </dict>
リロード、リスタート
% sudo launchctl unload /System/Library/LaunchDaemons/com.apple.syslogd.plist % sudo launchctl load /System/Library/LaunchDaemons/com.apple.syslogd.plist % sudo launchctl stop com.apple.syslogd % sudo launchctl start com.apple.syslogd
syslog のことはよく調べてわからないのだが、facility というのがあって、ログをグループ分けできるようだ。AirMac Express のログは local0 に属しているようだ(どこで設定されているかは不明...)。local0 のログファイルはすでに存在していたので今回は作成していないが、存在しない場合は手動で作成しておく必要があるっぽい。
すでに存在してたってことはログが混ざっちゃうってことだよな...。
Install PostgreSQL
開発環境で使っている DB を SQLite から PostgreSQL に変えることにした。
理由は、SQLite だと実行できる SQL でも、PostgreSQL だとエラーになることがある。Heroku は PostgreSQL なので、開発環境で問題なく動いていても、Heroku にデプロイしたとたんに動かなくなるということが結構あるので。
まぁ、自分の SQL の組み立て方が悪いだけなんだけど。
環境
- Ubuntu 10.10 (サーバ、クライアント共に)
- PostgreSQL 8.4
- Ruby 1.9.2
- Sequel 3.28.0
手順 (サーバ側)
PostgreSQLのインストール
sudo apt-get install postgresql
データベースの作成
インストール時に postgres というユーザーが(Ubuntuと, PostgreSQL 両方に)作成される。このユーザが MySQL でいうところの root にあたるので、そのユーザで DB を作成。
% sudo -u postgres createdb mydb
ロールの作成
% sudo -u postgres psql mydb mydb=# create role username with login; mydb=# ALTER USER username PASSWORD 'password';
設定ファイルの編集
別のホストから PostgreSQL にログインする場合にのみ必要。
/etc/postgresql/8.4/main/pg_hba.conf に以下の行を追加。
# TYPE DATABASE USER CIDR-ADDRESS METHOD host all all 192.168.0.0/24 password
/etc/postgresql/8.4/main/postgresql.conf の listen_addresses という値を * に変更。
listen_addresses = '*' # what IP address(es) to listen on;
サーバ再起動
% sudo service postgresql restart
手順 (クライアント側)
ライブラリのインストール
入れないと gem pg のインストールが失敗する。
% sudo apt-get install libpq-dev
gem pg のインストール
bundler を使っているので、Gemfile に次の行を追加。
gem 'pg'
続けてインストール。
% bundle install
プログラム中のDBへの接続箇所を修正
Sequel.connect("postgres://username:password@192.168.0.100/mydb")
Heroku で使うことが前提なら以下のようにした方が楽。
Sequel.connect(ENV['DATABASE_URL'] || "開発環境での接続設定")
以上。