11102010 家庭菜園
ミョウガ花咲きまくっとるがな!

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

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

11102010 家庭菜園
ミョウガ花咲きまくっとるがな!

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

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

エラー処理
Eitherを利用すると失敗の場合にも成功の場合にもデータ(Right)が付随する。
Real World Haskell―実戦で学ぶ関数型言語プログラミングtryとhandleも使える。
try :: IO a -> IO (Either Exception a)
handle :: (Exception e) => (e -> IO a) -> IO a -> IO a
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―実戦で学ぶ関数型言語プログラミングこの章はあとでもう一度読みなおす。
10102010 life
娘が、ベーグルを作りたいと言い出した。えーんなもん作ったことないよといいつつ本を見ながら格闘。
生地を作って休ませる。

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

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

ドーナツみたいに真ん中を広げすぎたのと表面がザラザラになってしまった。これは納得いかない。
表面に艶を出すには茹でる温度は80度くらいで湯の中に砂糖とか蜂蜜を入れればイイ。あと、今回の生地はゆるかったので、次回はもう少し水分量を減らす。あと、穴の大きさは程々に。
モナドを使ったプログラミング
持ち上げの一般化(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みたいなもんか。
09102010 chemoinformatics Python network cytoscape
以前、おもむろに思いついたLeadOptimizationのシミュレーターで、networkxはgml出力できてCytoscapeでimportすればいいじゃんということに気づいてヤル気が出た。
ついでにコードもちょっと直して、活性はpIC50とかそういうレンジにしてみて、μMオーダーから上げていくようにした。

エッジは世代を表していて、黄色から緑にむけてすすんでいく。ノードの色は活性を表していて黒から赤になるにしたがって活性が向上する。最初の方は活性が振れるけど段々向上していって安定するようにしてみた。
リードホッピングとは選択されなかったより良い未来を選択しなおすことであるとするならばそのような希望は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")
09102010 life
これと無線の血圧計あれば完璧なんだけど。
08102010 RWH
15章を境にpost-itが激減してる。

PRMLの上下みたいなパターンだ
二周目はここからが本番。
08102010 work
写経無しの流し読み。論理プログラミングっぽいとこはOn LispでやったかPrologの本読んだか、なんとなく追うだけで理解できたので。
ネットで得た情報を一度自分の中で整理するという目的においては本書は良かった。
kzfmのブックマーク / kdi (38)
kzfmのブックマーク / itk (12)