<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel><title>RWH / Drkcore</title><link>http://blog.kzfmix.com/RWH</link><description>Programming, Music, Snowboarding</description><language>ja</language><lastBuildDate>Mon, 25 Oct 2010 20:25:47 +0919</lastBuildDate><item><title>Real World Haskell 26章</title><link>http://blog.kzfmix.com/entry/1288005586</link><description>&lt;p&gt;ブルームフィルター&lt;/p&gt;

&lt;p&gt;&lt;div class="awsxom"&gt;
&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873114233/ref=nosim/kaerutyuuihou-22"&gt;
&lt;img src="http://ecx.images-amazon.com/images/I/51rAJvgAkgL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
&lt;strong&gt;Real World Haskell―実戦で学ぶ関数型言語プログラミング&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
Bryan O'Sullivan,John Goerzen,Don Stewart &lt;br /&gt;
オライリージャパン / ￥ 3,990 ()&lt;br /&gt;
在庫あり。&lt;br /&gt;
&lt;br clear="all" /&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;3,4日かけて一応buildまではしたが、テストとか動かしてない。いまいち理解も追いついてなかったのが心残りだが、一通り読み終わったのでよしとしよう。それにしてもこの本はPerl的には「続・はじめてのPerl」くらいのレベル？「実用 Perlプログラミング 第2版」ではないでしょうなぁと。 &lt;/p&gt;

&lt;p&gt;みなさんこの先どうやって進んでいくんだろう？超気になるところ。&lt;/p&gt;

&lt;p&gt;一周目は&lt;a href="http://blog.kzfmix.com/entry/1286536472"&gt;15章以降がほとんど理解できなかった&lt;/a&gt;けど、今回読んだら結構理解できたのでよかった。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.kzfmix.com/images/blog/1288005286.jpg" alt="1288005286" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.haskell.shizu-dev.org/"&gt;プログラミングHaskell読書会&lt;/a&gt;にでて、問題もきちんと解いたってのも良かったのかも。&lt;/p&gt;

&lt;p&gt;&lt;div class="awsxom"&gt;
&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4274067815/ref=nosim/kaerutyuuihou-22"&gt;
&lt;img src="http://ecx.images-amazon.com/images/I/41pybn9bpCL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
&lt;strong&gt;プログラミングHaskell&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
Graham Hutton &lt;br /&gt;
オーム社 / ￥ 2,940 ()&lt;br /&gt;
在庫あり。&lt;br /&gt;
&lt;br clear="all" /&gt;
&lt;/div&gt;&lt;/p&gt;
</description><pubDate>Mon, 25 Oct 2010 20:25:47 +0919</pubDate><category>Haskell</category><category>RWH</category></item><item><title>Real World Haskell 28章</title><link>http://blog.kzfmix.com/entry/1287662197</link><description>&lt;p&gt;STM&lt;/p&gt;

&lt;p&gt;この章ちょっと短い。もうちょい厚くして欲しかったかも。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;STMモナドはI/Oを実行するものでも、非トランザクションの可変状態を扱えるようにするものでもない。トランザクションが保証するものを破るような操作を回避するもの&lt;/li&gt;
&lt;li&gt;retry,orElse&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;div class="awsxom"&gt;
&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873114233/ref=nosim/kaerutyuuihou-22"&gt;
&lt;img src="http://ecx.images-amazon.com/images/I/51rAJvgAkgL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
&lt;strong&gt;Real World Haskell―実戦で学ぶ関数型言語プログラミング&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
Bryan O'Sullivan,John Goerzen,Don Stewart &lt;br /&gt;
オライリージャパン / ￥ 3,990 ()&lt;br /&gt;
在庫あり。&lt;br /&gt;
&lt;br clear="all" /&gt;
&lt;/div&gt;&lt;/p&gt;
</description><pubDate>Thu, 21 Oct 2010 20:57:16 +0919</pubDate><category>Haskell</category><category>RWH</category></item><item><title>Real World Haskell 27章</title><link>http://blog.kzfmix.com/entry/1287573667</link><description>&lt;p&gt;ソケットとsyslog&lt;/p&gt;

&lt;p&gt;&lt;div class="awsxom"&gt;
&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873114233/ref=nosim/kaerutyuuihou-22"&gt;
&lt;img src="http://ecx.images-amazon.com/images/I/51rAJvgAkgL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
&lt;strong&gt;Real World Haskell―実戦で学ぶ関数型言語プログラミング&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
Bryan O'Sullivan,John Goerzen,Don Stewart &lt;br /&gt;
オライリージャパン / ￥ 3,990 ()&lt;br /&gt;
在庫あり。&lt;br /&gt;
&lt;br clear="all" /&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;UDPの写経したら飽きたのでTCPの例はやってない。基本的にCに対応する関数が用意されているらしいので、内容はわかりやすかった。&lt;/p&gt;
</description><pubDate>Wed, 20 Oct 2010 20:21:07 +0919</pubDate><category>Haskell</category><category>RWH</category></item><item><title>Real World Haskell 25章</title><link>http://blog.kzfmix.com/entry/1287486542</link><description>&lt;p&gt;プロファイリングと最適化&lt;/p&gt;

&lt;p&gt;&lt;div class="awsxom"&gt;
&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873114233/ref=nosim/kaerutyuuihou-22"&gt;
&lt;img src="http://ecx.images-amazon.com/images/I/51rAJvgAkgL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
&lt;strong&gt;Real World Haskell―実戦で学ぶ関数型言語プログラミング&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
Bryan O'Sullivan,John Goerzen,Don Stewart &lt;br /&gt;
オライリージャパン / ￥ 3,990 ()&lt;br /&gt;
在庫あり。&lt;br /&gt;
&lt;br clear="all" /&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GHCのランタイムには+RTS -RTSでランタイム専用の引数を渡せる &lt;/li&gt;
&lt;li&gt;-fforce-recompで強制再コンパイル&lt;/li&gt;
&lt;li&gt;ヒープの割り当て&lt;/li&gt;
&lt;li&gt;WHNFに注意&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;融合&lt;/h4&gt;

&lt;p&gt;ストリーム融合というやつ&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import System.Environment
import Text.Printf
import Data.Array.Vector

main = do
  [d] &amp;lt;- map read `fmap` getArgs
  printf "%f\n" (mean (enumFromToFracU 1 d))

data Pair = Pair !Int !Double

mean :: UArr Double -&amp;gt; Double
mean xs = s / fromIntegral n
    where 
      Pair n s       = foldlU k (Pair 0 0) xs
      k (Pair n s) x = Pair (n+1) (s+x)
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20100112/343099/?ST=ittrend"&gt;第37回　書き換え規則を使って不要な計算や中間データを除去&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20100706/349960/?ST=ittrend"&gt;第40回　Stream Fusionによる融合変換で処理系の最適化機能を生かす&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20100803/350961/?ST=ittrend"&gt;第41回　任意の再帰構造による処理を融合変換できるStream Fusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 19 Oct 2010 20:09:26 +0919</pubDate><category>Haskell</category><category>RWH</category></item><item><title>Real World Haskell 24章 10</title><link>http://blog.kzfmix.com/entry/1287227573</link><description>&lt;p&gt;MapReduce、ただし、&lt;a href="http://twitter.com/#!/kzfm/status/27278554858"&gt;サンプルの通りでは動かない&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;&lt;div class="awsxom"&gt;
&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873114233/ref=nosim/kaerutyuuihou-22"&gt;
&lt;img src="http://ecx.images-amazon.com/images/I/51rAJvgAkgL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
&lt;strong&gt;Real World Haskell―実戦で学ぶ関数型言語プログラミング&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
Bryan O'Sullivan,John Goerzen,Don Stewart &lt;br /&gt;
オライリージャパン / ￥ 3,990 ()&lt;br /&gt;
在庫あり。&lt;br /&gt;
&lt;br clear="all" /&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://hackage.haskell.org/packages/archive/parallel/3.1.0.1/doc/html/Control-Parallel-Strategies.html"&gt;Control.Parallel.Strategies&lt;/a&gt;を読むと&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NFDataはControl.DeepSeqに移った。&lt;/li&gt;
&lt;li&gt;rnfはもはやStrategyにはないのでかわりにrdeepseqを使え&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;とのことなのでそう書きなおしてみた。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ time ./LineCount +RTS -N1 -RTS test.log 
test.log: 2146144

real    0m1.273s
user    0m0.709s
sys     0m0.318s
$ time ./LineCount +RTS -N2 -RTS test.log 
test.log: 2146144

real    0m0.652s
user    0m0.781s
sys     0m0.373s
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;お、速くなった。&lt;/p&gt;

&lt;h4&gt;MapReduce.hs&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;module MapReduce
    (
      mapReduce
    , simpleMapReduce
    -- exported for convenience
--    , rnf
--    , rwhnf
    ) where

import Control.Parallel (pseq)
import Control.Parallel.Strategies

simpleMapReduce
    :: (a -&amp;gt; b)
    -&amp;gt; ([b] -&amp;gt; c)
    -&amp;gt; [a]
    -&amp;gt; c

simpleMapReduce mapFunc reduceFunc = reduceFunc . map mapFunc

mapReduce
    :: Strategy b
    -&amp;gt; (a -&amp;gt; b)
    -&amp;gt; Strategy c
    -&amp;gt; ([b] -&amp;gt; c)
    -&amp;gt; [a]
    -&amp;gt; c

mapReduce mapStrat mapFunc reduceStrat reduceFunc input =
    mapResult `pseq` reduceResult
    where mapResult    = parMap mapStrat mapFunc input
          reduceResult = reduceFunc mapResult `using` reduceStrat
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;LineChunks.hs&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;module LineChunks
    (
     chunkedReadWith
    ) where

import Control.OldException (bracket, finally)
import Control.Monad (forM, liftM)
--import Control.Parallel.Strategies 
import Control.DeepSeq (NFData, rnf)
import Data.Int
import qualified Data.ByteString.Lazy.Char8 as LB
import GHC.Conc (numCapabilities)
import System.IO

data ChunkSpec = CS {
      chunkOffset :: !Int64
     ,chunkLength :: !Int64
    } deriving (Eq, Show)

withChunks :: (NFData a) =&amp;gt;
              (FilePath -&amp;gt; IO [ChunkSpec])
           -&amp;gt; ([LB.ByteString] -&amp;gt; a)
           -&amp;gt; FilePath
           -&amp;gt; IO a

withChunks chunkFunc process path = do
  (chunks, handles) &amp;lt;- chunkedRead chunkFunc path
  let r = process chunks
  (rnf r `seq` return r) `finally` mapM_ hClose handles

chunkedReadWith :: (NFData a) =&amp;gt; 
                   ([LB.ByteString] -&amp;gt; a) -&amp;gt; FilePath -&amp;gt; IO a

chunkedReadWith func path =
    withChunks (lineChunks (numCapabilities * 4)) func path


chunkedRead :: (FilePath -&amp;gt; IO [ChunkSpec])
          -&amp;gt; FilePath
          -&amp;gt; IO ([LB.ByteString], [Handle])
chunkedRead chunkFunc path = do
  chunks &amp;lt;- chunkFunc path
  liftM unzip . forM chunks $ \spec -&amp;gt; do
                               h &amp;lt;- openFile path ReadMode
                               hSeek h AbsoluteSeek (fromIntegral (chunkOffset spec))
                               chunk &amp;lt;- LB.take (chunkLength spec) `liftM` LB.hGetContents h
                               return (chunk, h)

lineChunks :: Int -&amp;gt; FilePath -&amp;gt; IO [ChunkSpec]
lineChunks numChunks path = do
  bracket (openFile path ReadMode) hClose $ \h -&amp;gt; do
    totalSize &amp;lt;- fromIntegral `liftM` hFileSize h
    let chunkSize = totalSize `div` fromIntegral numChunks
        findChunks offset = do
          let newOffset = offset + chunkSize
          hSeek h AbsoluteSeek (fromIntegral newOffset)
          let findNewline off = do
                              eof &amp;lt;- hIsEOF h
                              if eof
                                 then return [CS offset (totalSize - offset)]
                                 else do
                                   bytes &amp;lt;- LB.hGet h 4096
                                   case LB.elemIndex '\n' bytes of
                                     Just n -&amp;gt; do
                                        chunks@(c:_) &amp;lt;- findChunks (off + n + 1)
                                        let coff = chunkOffset c
                                        return (CS offset (coff - offset):chunks)
                                     Nothing -&amp;gt; findNewline (off + LB.length bytes)
          findNewline newOffset
    findChunks 0
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;LineCount.hs&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;module Main where

import Control.Monad (forM_)
import Data.Int (Int64)
import qualified Data.ByteString.Lazy.Char8 as LB
import System.Environment (getArgs)
import LineChunks (chunkedReadWith)
import MapReduce (mapReduce)
import Control.Parallel.Strategies

lineCount :: [LB.ByteString] -&amp;gt; Int64
lineCount = mapReduce rdeepseq (LB.count '\n')
                      rdeepseq sum

main :: IO ()
main = do
  args &amp;lt;- getArgs
  forM_ args $ \path -&amp;gt; do
    numLines &amp;lt;- chunkedReadWith lineCount path
    putStrLn $ path ++ ": " ++ show numLines
&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Sat, 16 Oct 2010 20:16:51 +0919</pubDate><category>Haskell</category><category>RWH</category></item><item><title>Real World Haskell 24章 8,9</title><link>http://blog.kzfmix.com/entry/1287141831</link><description>&lt;p&gt;クィックソートを並列で。&lt;/p&gt;

&lt;p&gt;正規形(NF),頭部正規形(HNF),弱頭部正規形(WHNF)を理解した。&lt;/p&gt;

&lt;p&gt;&lt;div class="awsxom"&gt;
&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873114233/ref=nosim/kaerutyuuihou-22"&gt;
&lt;img src="http://ecx.images-amazon.com/images/I/51rAJvgAkgL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
&lt;strong&gt;Real World Haskell―実戦で学ぶ関数型言語プログラミング&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
Bryan O'Sullivan,John Goerzen,Don Stewart &lt;br /&gt;
オライリージャパン / ￥ 3,990 ()&lt;br /&gt;
在庫あり。&lt;br /&gt;
&lt;br clear="all" /&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;module Sorting where

import Control.Parallel (par, pseq)

parSort :: (Ord a) =&amp;gt; [a] -&amp;gt; [a]
parSort (x:xs) = force greater `par` (force lesser `pseq`
                                     (lesser ++x:greater))
    where lesser  = parSort [y|y &amp;lt;- xs, y&amp;lt;x]
          greater = parSort [y|y &amp;lt;- xs, y&amp;gt;=x]
parSort _ = []

force :: [a] -&amp;gt; ()
force xs = go xs `pseq` ()
    where go (_:xs) = go xs
          go [] = 1

sort :: (Ord a) =&amp;gt; [a] -&amp;gt; [a]
sort (x:xs) = lesser ++ x:greater
    where lesser  = sort [y|y &amp;lt;- xs, y&amp;lt;x]
          greater = sort [y|y &amp;lt;- xs, y&amp;gt;=x]
sort _ = []

parSort2 :: (Ord a) =&amp;gt; Int -&amp;gt; [a] -&amp;gt; [a]
parSort2 d list@(x:xs) 
   | d &amp;lt;= 0 = sort list
   | otherwise = force greater `par` (force lesser `pseq`
                                     (lesser ++x:greater))
       where lesser  = parSort2 d' [y|y &amp;lt;- xs, y&amp;lt;x]
             greater = parSort2 d' [y|y &amp;lt;- xs, y&amp;gt;=x]
             d' = d - 1
parSort2 _ _ = []
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;で実際に時間を測ってみると&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;-- parSort2
kzfm:ch24 kzfm$ ./SortMain +RTS -N2 -RTS 1000000
we have 1000000 elements to sort.
sorted all 1000000 elements.
11.419152s elapsed.

-- sort
kzfm:ch24 kzfm$ ./SortMain 1000000
we have 1000000 elements to sort.
sorted all 1000000 elements.
6.212093s elapsed.

-- parSort -N2
kzfm:ch24 kzfm$ ./SortMain +RTS -N1 -RTS 1000000
we have 1000000 elements to sort.
sorted all 1000000 elements.
6.188667s elapsed.

-- parSort -N2
kzfm:ch24 kzfm$ ./SortMain +RTS -N2 -RTS 1000000
we have 1000000 elements to sort.
sorted all 1000000 elements.
35.960397s elapsed.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;GCのせいかな、よくわからん。&lt;/p&gt;
</description><pubDate>Fri, 15 Oct 2010 20:26:10 +0919</pubDate><category>Haskell</category><category>RWH</category></item><item><title>Real World Haskell 24章 1-7</title><link>http://blog.kzfmix.com/entry/1287055038</link><description>&lt;p&gt;並行マルチコアプログラミング&lt;/p&gt;

&lt;p&gt;&lt;div class="awsxom"&gt;
&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873114233/ref=nosim/kaerutyuuihou-22"&gt;
&lt;img src="http://ecx.images-amazon.com/images/I/51rAJvgAkgL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
&lt;strong&gt;Real World Haskell―実戦で学ぶ関数型言語プログラミング&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
Bryan O'Sullivan,John Goerzen,Don Stewart &lt;br /&gt;
オライリージャパン / ￥ 3,990 ()&lt;br /&gt;
在庫あり。&lt;br /&gt;
&lt;br clear="all" /&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import Control.Concurrent

communicate = do
  m &amp;lt;- newEmptyMVar
  forkIO $ do
    v &amp;lt;- takeMVar m
    putStrLn ("received" ++ show v)
  putStrLn "sending"
  putMVar m "wake up!"
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Control.ConcurrentのforkIOを使う&lt;/li&gt;
&lt;li&gt;同期変数型MVarを使う
&lt;ul&gt;
&lt;li&gt;MVarはデッドロックの原因になることがある&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;tryTakeMVarとtakeMVarの違い&lt;/li&gt;
&lt;li&gt;スレッド間で一度だけ通信する場合にはMVarがよい。それ以外はChan型を使う&lt;/li&gt;
&lt;li&gt;MVar,Chanは非正格&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Thu, 14 Oct 2010 20:25:06 +0919</pubDate><category>Haskell</category><category>RWH</category></item><item><title>Real World Haskell 22章</title><link>http://blog.kzfmix.com/entry/1286968945</link><description>&lt;p&gt;webクライアントを作る章なのだけど、一度やったことあるのでHTTPまわりだけ。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import Network.HTTP

getGoogle = (simpleHTTP $ getRequest "http://google.com/") &amp;gt;&amp;gt;= getResponseBody
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;実行&lt;/p&gt;

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

&lt;p&gt;\nと\r\nが混じっておるな。&lt;/p&gt;

&lt;p&gt;&lt;div class="awsxom"&gt;
&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873114233/ref=nosim/kaerutyuuihou-22"&gt;
&lt;img src="http://ecx.images-amazon.com/images/I/51rAJvgAkgL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
&lt;strong&gt;Real World Haskell―実戦で学ぶ関数型言語プログラミング&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
Bryan O'Sullivan,John Goerzen,Don Stewart &lt;br /&gt;
オライリージャパン / ￥ 3,990 ()&lt;br /&gt;
在庫あり。&lt;br /&gt;
&lt;br clear="all" /&gt;
&lt;/div&gt;&lt;/p&gt;
</description><pubDate>Wed, 13 Oct 2010 20:24:31 +0919</pubDate><category>Haskell</category><category>RWH</category></item><item><title>Real World Haskell 21章</title><link>http://blog.kzfmix.com/entry/1286882475</link><description>&lt;p&gt;データベース&lt;/p&gt;

&lt;p&gt;&lt;div class="awsxom"&gt;
&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873114233/ref=nosim/kaerutyuuihou-22"&gt;
&lt;img src="http://ecx.images-amazon.com/images/I/51rAJvgAkgL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
&lt;strong&gt;Real World Haskell―実戦で学ぶ関数型言語プログラミング&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
Bryan O'Sullivan,John Goerzen,Don Stewart &lt;br /&gt;
オライリージャパン / ￥ 3,990 ()&lt;br /&gt;
在庫あり。&lt;br /&gt;
&lt;br clear="all" /&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.kzfmix.com/entry/1263378640"&gt;前回読んだとき&lt;/a&gt;はデータベース接続まではやったので、今回はUTF-8で出力させてみた。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;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 &amp;lt;- connectSqlite3 "drkcore.db"
  res  &amp;lt;- quickQuery conn "select title from entries" []
  mapM_ (mapM_ svToUTF8) (take 5 res)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;実行&lt;/p&gt;

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

&lt;p&gt;mapM_を二回適用させないとイケないのはいまいち理解していないが型のエラーがそんな感じだったので、適当に直したら動いた。いい感じ&lt;/p&gt;
</description><pubDate>Tue, 12 Oct 2010 20:21:39 +0919</pubDate><category>Haskell</category><category>RWH</category></item><item><title>Real World Haskell 20章</title><link>http://blog.kzfmix.com/entry/1286786361</link><description>&lt;p&gt;システムプログラミング&lt;/p&gt;

&lt;p&gt;&lt;div class="awsxom"&gt;
&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873114233/ref=nosim/kaerutyuuihou-22"&gt;
&lt;img src="http://ecx.images-amazon.com/images/I/51rAJvgAkgL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
&lt;strong&gt;Real World Haskell―実戦で学ぶ関数型言語プログラミング&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
Bryan O'Sullivan,John Goerzen,Don Stewart &lt;br /&gt;
オライリージャパン / ￥ 3,990 ()&lt;br /&gt;
在庫あり。&lt;br /&gt;
&lt;br clear="all" /&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;20.5のパイプの例がmac osxでは動かなかった&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;*RunProcessSimple&amp;gt; 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.
&amp;lt;interactive&amp;gt;: pwd: executeFile: unsupported operation (Operation not supported)
*** Exception: user error (Exited: Exited (ExitFailure 1))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;残念な感じ。&lt;/p&gt;
</description><pubDate>Mon, 11 Oct 2010 17:39:50 +0919</pubDate><category>Haskell</category><category>RWH</category></item></channel></rss>