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

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

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みたいなもんか。

構造最適化シミュレーションをCytoscapeで

以前、おもむろに思いついたLeadOptimizationのシミュレーターで、networkxはgml出力できてCytoscapeでimportすればいいじゃんということに気づいてヤル気が出た。

ついでにコードもちょっと直して、活性はpIC50とかそういうレンジにしてみて、μMオーダーから上げていくようにした。

projectsim

エッジは世代を表していて、黄色から緑にむけてすすんでいく。ノードの色は活性を表していて黒から赤になるにしたがって活性が向上する。最初の方は活性が振れるけど段々向上していって安定するようにしてみた。

リードホッピングとは選択されなかったより良い未来を選択しなおすことであるとするならばそのような希望はLO初期のあたりに存在すると思うのだ。

以下、書いたコード

from random import random
import networkx as nx

class Branch(object):
    """LeadOptimization flow
    potency: pIC50 or such
    weight : range for activity
    """

    count = -1

    @classmethod
    def inc_count(cls):
        cls.count = cls.count + 1
        return cls.count

    @classmethod
    def get_count(cls): return cls.count

    def __init__(self,potency,weight):
        self.id = Branch.inc_count()
        self.potency = potency
        self.weight  = weight
        self.activity = self.potency + self.weight * random()

    def make_child(self,num_childs,potency,weight):
        return [Branch(self.potency + self.weight * (random()-0.5)*2,self.weight * 0.5) for i in range(num_childs)]

if __name__ == "__main__":
    max_comps        = 500 # total compounds
    initial_branches = 1   # number of lead compounds
    lead_potency     = 5   # lead activity
    generation       = 0

    G=nx.Graph()

    heads = [Branch(lead_potency,2) for i in range(initial_branches)]
    map(lambda b: G.add_node(b.id, activity=b.activity),heads)

    while Branch.get_count() < max_comps:
        new_heads = []
        generation += 1
        for branch in heads[:int(2+5*random())]:
            for new_comp in branch.make_child(int(40*random()),branch.potency,branch.weight):
                G.add_node(new_comp.id, activity=new_comp.activity)
                G.add_edge(branch.id, new_comp.id, genneration=generation)
                if new_comp.activity > 7:
                    new_heads.append(new_comp)
        heads = new_heads
        heads.sort(key=lambda x:x.activity)
        heads.reverse()

    nx.write_gml(G,"test.gml")

WiFi Body Scaleが欲しい

これと無線の血圧計あれば完璧なんだけど。

Real World Haskell 後半

15章を境にpost-itが激減してる。

1286536364

PRMLの上下みたいなパターンだ

二周目はここからが本番。

セマンティックWebプログラミング

写経無しの流し読み。論理プログラミングっぽいとこはOn LispでやったかPrologの本読んだか、なんとなく追うだけで理解できたので。

ネットで得た情報を一度自分の中で整理するという目的においては本書は良かった。

ProductName セマンティックWeb プログラミング
Toby Segaran,Colin Evans,Jamie Taylor
オライリージャパン / ¥ 3,360 ()
在庫あり。

  • アプリケーションとアプリケーションが利用するデータは共進化する傾向があります
  • データをモデル化するための新しい方法
  • RDFはトリプルとして表現された文を使ってデータモデルを表現する言語
  • オントロジー
  • セマンティックデータはエンティティどうしの関係に焦点を当てている
  • micoroformat,RDFa
  • グラフデータをオブジェクトを結びつけるO/Rマッパーのようなもの
  • W3Cが勧告しているかは重要
  • コンテキストデータを保守するリソースはオーバーヘッド