Real World Haskell 27章

UDPとTCPでsyslogサーバとクライアント作って通信させる。

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

28章はSTMだけどこれはJava並行処理プログラミング読んでからにしよう。

ProductName Java並行処理プログラミング ―その「基盤」と「最新API」を究める―
Brian Goetz,Joshua Bloch,Doug Lea
ソフトバンククリエイティブ / ¥ 3,990 ()


これで一通り読んだので、そのうちもう一度読む。二周目は練習問題解きながら。

「新世代日本酒が旨い」を読んだ

はじめて日本酒を飲むヒトのための本として書かれているが、最近の日本酒ガイドとしても良い。フレッシュでフルーティーさの強い日本酒を選んでいる。

入手しにくい銘柄もあるけど、日本酒リストとしての価値を考えるとお買い得感はある。

ProductName 新世代日本酒が旨い 角川SSC新書 いま飲むべき全国の36銘柄
かざま りんぺい
角川グループパブリッシング / ¥ 819 ()
在庫あり。

この先には燗をつける楽しみが待っているけど、燗つけて楽しいお酒とかは又違ってくるので続編をいま燗で飲むべき全国の36銘柄とかやって欲しいなぁ。

呑み飽きしない度で銘柄探したりとか、2000円以内で美味しい銘柄とか、入り口さえ超えてしまえば世界は広いと思う。

Real World Haskell 22章

HaXmlとHDBCを使ってXMLの構文解析とSQLiteのデータベース操作を組み合わせてpodcastのダウンローダーをつくるというなかなか楽しい章だが、このまえSQLAlchemyの本読んでたから、SQL文を直接埋め込むのはなんか面倒くさかった。

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

順調に消化するはずだったがHaXmlを使ったパーサーが文句を言う

PodParser.hs:40:11:
    `CFilter' is not applied to enough type arguments
    Expected kind `?', but `CFilter' has kind `* -> *'
    In the type signature for `channel':
      channel :: CFilter

んー?型が悪いの?

Prelude Text.XML.HaXml> :i CFilter
type CFilter i = Content i -> [Content i] -- Defined in Text.XML.HaXml.Combinators

あれ?type CFilter = Content -> [Content]じゃない。

多分これだな

「医薬品クライシス」を読んだ

風邪でノドが痛いので休んで読書の日。

ふたメルさん(笑)

ProductName 医薬品クライシス―78兆円市場の激震 (新潮新書)
佐藤 健太郎
新潮社 / 735円 ( 2010-01 )


製薬業界のことを大雑把につかむためにもおすすめの良書だと思う。 製薬業界の中の人だったら5章6章は面白いと思う。

成果主義とか危険だよね、つけが回ってくるのは確実だもん。あと、パラダイムシフトはあるよね多分。でもみんな割とのほほんとしてるよね、受け皿ないのに。

でも、オープンイノベーション的な事には触れてなかった気がする。もうちょっと技術に特化したかたちのベンチャーの垂直統合的なモデルはもうちょっと盛り上がってもいいと思っているのだけども、難しいのかな。SBDDとかアウトソースでいいような、自分でやっててアレだけど「これってコンサルだよなぁ」といつも思うもん。

Write Yourself a Scheme in 48 HoursComments (4章)

効率のよいエラーの仕組みを導入。

type ThrowsError = Either LispError

みたいなのが慣れない。Either a bがaとbの両方をとるみたいに感じちゃうからか。実際に下のようにしてみると納得出来るんだけど。

ここにあった例を

int_sqrt :: Int -> (Either Int Double)
int_sqrt x | fsdx * fsdx == x  = Left fsdx  
           | otherwise = Right sdx
 where sdx = sqrt $ fromIntegral x
       fsdx = floor sdx

このように変えてみた

type Leftint = Either Int

int_sqrt :: Int -> (Leftint Double)
int_sqrt x | fsdx * fsdx == x  = Left fsdx  
           | otherwise = Right sdx
 where sdx = sqrt $ fromIntegral x
       fsdx = floor sdx

まぁそうだよなと思う。

NodeBoxでiSightを使う

ここみた。

test

NodeBoxも楽しいなぁ

Write Yourself a Scheme in 48 Hours

Write Yourself a Scheme in 48 Hoursを3章まで読んだ。RWHのParsecの章を読んでたのと、やさしい Lisp の作り方Mooseでトレースしたことがあるので割とすんなりと進んだ。

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

Beginning the Evaluatorの章に

apply func args = maybe (Bool False) ($ args) $ lookup func primitives

ってのがあって、僕はちょっと前まで$を()の構文糖衣だと勘違いしてたのでなんか違和感が。

($ [1,2,3]) (map (1+)) :: map (1+) [1,2,3]

は見慣れれば楽なのかもしれないが。

Prelude> (($[1,2,3]).map) (2-)
[1,0,-1]

とかやるとmapがメソッドっぽく見える

平均値順にソート(Haskell)

mixiの課題丸投げ

import Data.List (sortBy,sort)
import Data.Ord (comparing)

meansort xs = sortBy (comparing (abs . ((average xs)-))) (sort xs)
    where
      average xs = sum xs `div` (length xs)

(続) 行番号付きでソースを出力(Haskellで)

前回の行番号付きでファイルの出力に、さらに5行出力するごとにファイル名行番号を反転表示した後、一時停止して、リターンを押したら出力を再開するプログラムをかけという問題が丸投げされていたのでやってみた。

import System
import System.Console.Readline (readline)

showNext xs file = showNext' 1 xs file

showNext' n xs f | next == [] = do mapM_ putStrLn $ zipWith (\n x -> show n ++ ": " ++  x) [n..]  this
                 | otherwise  = do mapM_ putStrLn $ zipWith (\n x -> show n ++ ": " ++  x) [n..]  this
                                   maybeLine <- readline $ "\ESC[7m" ++ f ++ "(" ++ show (n+4) ++"):\ESC[m"
                                   case maybeLine of
                                     Nothing   -> return ()
                                     Just ""   -> showNext' (n+5) next f
                 where
                   (this,next) = splitAt 5 xs

main = do
  file:_ <- getArgs
  content <- readFile file
  showNext (lines content) file

反転表示を戸惑ったのだけど、教えてもらって解決。

showNext'が冗長なので、もう少し綺麗に書きたい。Stateモナドとか使うといいのかなぁ。

pythonでユークリッド距離

haskellのK-meansのソース読んでたら

dist a b = sqrt . sum $ zipWith (\x y-> (x-y) ^ 2) a b

ってのがあって、pythonでzipWithってあったかなーと思って検索したら、自分のwikiが引っかかった。★付けたいところ。

これをつかうと

from math import *
zipWith = lambda f, xs, ys : [f(x, y) for x,y in zip(xs, ys)]
def dist(xs, ys): return sqrt(sum(zipWith(lambda x, y: (x-y)**2, xs, ys)))

となって、任意の次元にも対応出来る

>>> dist([1,2,3,4],[2,2,2,2])
2.4494897427831779