モナモナ言わないクイズ

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 で接続されているということ。問題が起きた時のログは拾えるのか?

環境

サーバ側設定

/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 のログファイルはすでに存在していたので今回は作成していないが、存在しない場合は手動で作成しておく必要があるっぽい。
すでに存在してたってことはログが混ざっちゃうってことだよな...。

クライアント側設定

AirMac ユーテリティーを起動し、「詳細」→「ログと統計情報」の 「Syslog 書き込み先アドレス」に MacBookIPアドレスを設定する。「アップデート」する。

Install PostgreSQL

開発環境で使っている DB を SQLite から PostgreSQL に変えることにした。
理由は、SQLite だと実行できる SQL でも、PostgreSQL だとエラーになることがある。Heroku は PostgreSQL なので、開発環境で問題なく動いていても、Heroku にデプロイしたとたんに動かなくなるということが結構あるので。
まぁ、自分の SQL の組み立て方が悪いだけなんだけど。

環境

手順 (サーバ側)

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'] || "開発環境での接続設定")

以上。

ヒゲ

デニス・リッチー氏の訃報。スティーブ・ウォズニアック氏が iPhone 4S 購入のための列の先頭に並んだという記事。この二つを見て久々に思い出したのが、ヒゲとプログラマーの関係。その関係とは、ヒゲが生えた(生やしている)プログラマーの方が成功する、というもの。
私はヒゲは薄い方なのでプログラマーとしてダメなんだろうか...。なんて。
プログラマーの為のヒゲ育成法」って本でも出せば売れるかな。