Real World Haskell 24章 1-7

並行マルチコアプログラミング

ProductName Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。

import Control.Concurrent

communicate = do
  m <- newEmptyMVar
  forkIO $ do
    v <- takeMVar m
    putStrLn ("received" ++ show v)
  putStrLn "sending"
  putMVar m "wake up!"
  • Control.ConcurrentのforkIOを使う
  • 同期変数型MVarを使う
    • MVarはデッドロックの原因になることがある
  • tryTakeMVarとtakeMVarの違い
  • スレッド間で一度だけ通信する場合にはMVarがよい。それ以外はChan型を使う
  • MVar,Chanは非正格

Real World Haskell 22章

webクライアントを作る章なのだけど、一度やったことあるのでHTTPまわりだけ。

import Network.HTTP

getGoogle = (simpleHTTP $ getRequest "http://google.com/") >>= getResponseBody

実行

*Main> getGoogle
Loading package HTTP-4000.0.9 ... linking ... done.
"<HTML><HEAD><meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n \
<TITLE>301 Moved</TITLE></HEAD><BODY>\n<H1>301 Moved</H1>\n \
The document has moved\n<A HREF=\"http://www.google.com/\">here</A>. \
\r\n</BODY></HTML>\r\n"

\nと\r\nが混じっておるな。

ProductName Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。

Vestax Typhoonが欲しい

超欲しい!

Spinも気になるけど、やっぱTyphoonやな

最初は子供と一緒に遊ぶのにIONのおもちゃっぽいやつでいいかなと思ってたんだが、これはオーディオインターフェースが別に必要らしい(だったらSpinかTyphoonのほうがいいじゃんと)。

「食料自給率のはなし」を読んだ

割と客観的な内容かな。最後の章は読んでないけど、「自給率100%を目指すべき」とか「日本は食料大国」とかいう極論ではない。

大規模農家って少ないの?JA的にはそのほうがありがたい?

ProductName 食料自給率のはなし -食卓から考える「40%」
日本生活協同組合連合会
コープ出版 / ¥ 630 ()
在庫あり。

  • そもそも、「自給率の向上」というテーマに反対するヒトはいない
  • 現在政府が発表している食料自給率という数値目標はまぼろしにすぎない
  • 消費を無視した食料自給率の議論は愚かで無意味
  • カロリーベースの数字のトリック
    • 農地面積に依存
    • 豚肉を食べること自体が餌の消費量を増やし、結果としてマイナスに傾く。つまり国産豚肉を食べないことが自給率の向上に貢献する
  • そもそも日本は世界中から食料を買える、だから自給率は低くなり、これは必然。
  • インドの食料自給率は98%だが、これを目標にすべきなのだろうか?
    • 食料自給率は低いが様々な食品をとっているほうが豊かでは?
  • カロリーベースの計算をする国は少ない
  • 食品廃棄を減らそう

そういえば、今日のめざましに出ていた米農家のひとはJAに米を買っていただいているというオーラが出てたな。

麺家ごとう

だんごのたむらの近く。土地勘ないとちょっと分かりにくい立地かも。

1286881882

割とオーソドクスな感じの豚骨醤油。量は少なめかな、それとも太麺だからそう感じるのかな。

1286881886

カウンターがメインなので家族連れにはつらいかも。というか我が家の構成だとつらいな。

1286881880

Real World Haskell 21章

データベース

ProductName Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。

前回読んだときはデータベース接続まではやったので、今回はUTF-8で出力させてみた。

import Database.HDBC
import Database.HDBC.Sqlite3
import qualified Data.ByteString as B
import Control.Monad

svToUTF8 (SqlByteString s) = B.putStrLn s

main = do
  conn <- connectSqlite3 "drkcore.db"
  res  <- quickQuery conn "select title from entries" []
  mapM_ (mapM_ svToUTF8) (take 5 res)

実行

$ ghc --make dbtest.hs
[1 of 1] Compiling Main             ( dbtest.hs, dbtest.o )
Linking dbtest ...
$ ./dbtest 
blogを変えてみた
卓次郎商店でつけ麺
かど乃やで黒びしおラーメン
drkcore
はてなスターつけたヨ

mapM_を二回適用させないとイケないのはいまいち理解していないが型のエラーがそんな感じだったので、適当に直したら動いた。いい感じ

Sphinx+Mercurialで原稿管理

SAR News No19に寄稿しました。この号はSVM,RFとかの統計手法を使ったSARから可視化とかグラフっぽい処理とか、ToolKitを使ったプログラミングとか、日本ではあまり見かけない内容なので面白いのではないでしょうか?

余談ですがハッカソンっぽい場もあるので、ちと書いてみるか(または飲んでみるか)という方がいれば連絡を下さい(まだ空きあります)。僕はOpenBabelを使ってGAMESSの量子化学計算で構造最適化をするラッパーを書く予定にしています。それかHaskellのchemoinformaticsライブラリのソース読んでます。

さて、今回の原稿を書くのにSphinxを使った。これ最高ですな、EPubも出力できるし、超便利。ただ、今回は原稿の提出がwordだったのでwordの行間調整したりとかよくわからない部分で難儀したけど(word嫌い)。でも履歴管理の仕組み(変更モードって言うの?)はメールでやり取りするときに便利だったけど。

あとバージョン管理はMercurialを使った。Gitに比べてwebアクセスが簡単に設定できたのでチョイス、あと文書管理だとそんなに複雑な操作しないし。

ProductName 入門Mercurial Linux/Windows対応
藤原 克則
秀和システム / ¥ 2,310 ()
在庫あり。

スレッドでgzip(Haskell)

RWH 24.2はなんかいろいろハマったのでメモ。まずzlibとreadlineのパッケージをmacbookにインストール。

perlのcpanに対応するコマンドはhaskellではcabalというものがある。

cabalコマンドの使い方

Cabal は Haskell のパッケージ管理システムです。枠組みとしての Cabal と、コマンドの cabal があり、間違いやすいです。

間違ってた。

zlibをcabalでインストール

sudo cabal install zlib

続いてreadlineを。

sudo port install readline

sudo cabal install readline

readlineが見つからないというエラー。仕方ないのでアーカイブをダウンロードしてきて

runhaskell Setup.hs configure \
--configure-option=--with-readline-includes="/opt/local/include" \
--configure-option=--with-readline-libraries="/opt/local/lib"
runhaskell Setup.hs build
sudo runhaskell Setup.hs install

で入れた。でもcabal に--configure-option渡してもOKな感じはする。

コードもControl.ExceptionではなくてControl.OldExceptionをインポートする。

import Control.Concurrent (forkIO)
import Control.OldException (handle)
import Control.Monad (forever)
import qualified Data.ByteString.Lazy as L
import System.Console.Readline (readline)

import Codec.Compression.GZip (compress)


main = do 
  maybeLine <- readline "Enter a file to compress> "
  case maybeLine of 
    Nothing   -> return ()
    Just ""   -> return ()
    Just name -> do
         handle print $ do
                   content <- L.readFile name
                   forkIO (compressFile name content)
                   return ()
         main
  where compressFile path = L.writeFile (path ++ ".gz") . compress

で、コンパイル

ghc --make Compressor.hs

これが動かなくて悩んだ。というかコンパイルできるんだけど、圧縮ファイルが作成されない。

なんでかなー?とReal World Haskellのコメント見てたら、-threadオプションが必要とのこと。

ghc --make -threaded Compressor.hs

で無事に動いた。

ProductName Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。

追記 101012

cabal install readline --configure-option=--with-readline-includes="/opt/local/include" \
--configure-option=--with-readline-libraries="/opt/local/lib"

でいけた。

でも、実行したらエラー

/Users/kzfm/.cabal/lib/readline-1.0.1.0/ghc-6.12.3/HSreadline-1.0.1.0.o: unknown symbol `_rl_basic_quote_characters'
ghc: unable to load package `readline-1.0.1.0'

栗剥きで凹んだ

栗を頂いたので、ヒーヒーいいながら剥いた。

子供の頃はあんまり苦じゃなかったんだけどなぁ。ゆで方にコツでもあったんだろうか?あとで親に聞いてみよう。

1286795632

栗剥きマシンでもないとやってられない。

ProductName 諏訪田製作所 栗の皮むき鋏 栗くり坊主II 11172

諏訪田製作所 / ¥ 2,625 (2005-05-30)
在庫あり。

Real World Haskell 20章

システムプログラミング

ProductName Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。

20.5のパイプの例がmac osxでは動かなかった

*RunProcessSimple> runIO $ ("pwd", []::[String])
Loading package array-0.3.0.1 ... linking ... done.
Loading package bytestring-0.9.1.7 ... linking ... done.
Loading package containers-0.3.0.0 ... linking ... done.
Loading package syb-0.1.0.2 ... linking ... done.
Loading package base-3.0.3.2 ... linking ... done.
Loading package mtl-1.1.0.2 ... linking ... done.
Loading package regex-base-0.93.2 ... linking ... done.
Loading package regex-posix-0.94.2 ... linking ... done.
Loading package regex-compat-0.93.1 ... linking ... done.
Loading package filepath-1.1.0.4 ... linking ... done.
Loading package old-locale-1.0.0.2 ... linking ... done.
Loading package old-time-1.0.0.5 ... linking ... done.
Loading package unix-2.4.0.2 ... linking ... done.
Loading package directory-1.0.1.1 ... linking ... done.
Loading package process-1.0.1.3 ... linking ... done.
<interactive>: pwd: executeFile: unsupported operation (Operation not supported)
*** Exception: user error (Exited: Exited (ExitFailure 1))

残念な感じ。