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))

残念な感じ。

来年の家庭菜園の作付計画に悩む

今のところ、こんな感じで植えている(括弧内は区画が空く時期)。

plan

来年は

  • ジャガイモ (2月)
  • 里芋 (4月)
  • ミニトマト (5月)
  • 甘長美人 (5月)
  • オクラ (6月)
  • ゴーヤ (5月)
  • スイカ (4月)
  • 茄子 (5月)
  • モロヘイヤ (5月)

を考えているのだけど、明らかに無理な感じ。特に里芋植えたところには夏野菜を植えられないので、どこにアサインしようか悩む。ジャガイモの後にはピーマンでもイケるかな。この流れだとスイカは多分無理だな。

あと、ゴーヤのネットをどこに張るかも結構重要。というのは草取り結構大変なのと、ツルに絡まられるので。

今日の畑(101011)

ミョウガ花咲きまくっとるがな!

1286780927 1286780933

一応花も食べられるようなんだけど、普通のミョウガが食べたいので一気に収穫。

1286780921

その後、ラディッシュ、春菊、ソラマメ、ほうれん草の種を撒いてきた。

1286780914

Real World Haskell 19章

エラー処理

Eitherを利用すると失敗の場合にも成功の場合にもデータ(Right)が付随する。

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

tryとhandleも使える。

try :: IO a -> IO (Either Exception a)
handle :: (Exception e) => (e -> IO a) -> IO a -> IO a

19.3.1

import Control.Monad.Error
import Control.Monad.State
import qualified Data.ByteString.Char8 as B

data ParseError = NumericOverflow
                | EndOfInput
                | Chatty String
                  deriving (Eq, Ord, Show)

instance Error ParseError where
    noMsg  = Chatty "oh noes!"
    strMsg = Chatty

newtype Parser a = P {
      runP :: ErrorT ParseError (State B.ByteString) a
    } deriving (Monad, MonadError ParseError)

liftP :: State B.ByteString a -> Parser a
liftP m = P (lift m)

satisfy :: (Char -> Bool) -> Parser Char
satisfy p = do
  s <- liftP get
  case B.uncons s of
    Nothing ->  throwError EndOfInput
    Just (c, s')
         | p c ->  liftP (put s') >> return c
         | otherwise -> throwError (Chatty "satisfy failed")

optional :: Parser a -> Parser (Maybe a)
optional p = (Just `liftM` p) `catchError` \_ -> return Nothing

runParser :: Parser a -> B.ByteString -> Either ParseError (a, B.ByteString)
runParser p bs = case runState (runErrorT (runP p)) bs of
                   (Left err, _) -> Left err
                   (Right r, bs) -> Right (r, bs)

Real World Haskell 18章

モナド変換子

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

  • モナドの上に積み上げる
  • IOは常に底

この章はあとでもう一度読みなおす。

初ベーグル

娘が、ベーグルを作りたいと言い出した。えーんなもん作ったことないよといいつつ本を見ながら格闘。

生地を作って休ませる。

1286667501

等分して球にして休ませて、穴をあけて形を整えてさらに休ませる。

1286667520 1286667508

茹でて、オーブンで焼く。

1286667495

ドーナツみたいに真ん中を広げすぎたのと表面がザラザラになってしまった。これは納得いかない。

表面に艶を出すには茹でる温度は80度くらいで湯の中に砂糖とか蜂蜜を入れればイイ。あと、今回の生地はゆるかったので、次回はもう少し水分量を減らす。あと、穴の大きさは程々に。

Real World Haskell 15章

モナドを使ったプログラミング

ProductName Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan
オライリージャパン / 3990円 ( 2009-10-26 )


持ち上げの一般化(15.2)

liftM2 :: (Monad m) => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
Prelude Control.Monad> :t liftM

liftM :: (Monad m) => (a1 -> r) -> m a1 -> m r
Prelude Control.Monad> :t ap
ap :: (Monad m) => m (a -> b) -> m a -> m b

liftM(N)はliftMとapを使って一般化できる。

Readerモナドを大体理解した(15.6)。

newtype Reader e a = R { runReader :: e -> a }

instance Monad (Reader e) where
    return a = R $ \_ -> a
    m >>= k  = R $ \r -> runReader (k (runReader m r)) r

ask :: Reader e e
ask = R id

askで得た環境を引き回す。

*Main Data.Char> runReader (ask >>= \x -> return (x*3)) 2
6

askで常に同じ環境が返ってくる、読み取り専用のStateみたいなもんか。