芳泉閣でゆったりしませんか?

熱海でだらだらと温泉につかりながら、コード書いたり書かなかったりという場を設けました。キーワードはchemoinformatics,bioinformatics,R,Python,Rubyで製薬企業でコード書いているヒト多めです。僕はFlaskいじるかopenbabelのMCS実装かなんかをする予定です(でもいい日本酒がゲットできたら飲んでるかも)

  • 2010.10.29-30
  • 芳泉閣@熱海
  • 一泊二日で10500くらい

まだ何人か分の空きがありますので興味があれば私にメールかtwitterでメッセージを下さい。金曜から土曜にかけてという日程です。

今のとこの参加者

  • kzfm
  • zgmfx20a
  • bohohu
  • garuby
  • shirahakase
  • hiro_h

今日の畑(101024)

作業は主にほうれん草と春菊の間引きと茄子の処分。めんどくさいので穴掘って埋めた。

来年に向けて堆肥とか腐葉土ぶち込んで土づくりもしたほうがいいんだろうな。あと石ころ多すぎるのでふるいにかけたりしたほうがいいんだろうけど、借りてる菜園なのでどこまで力をいれるか考えてしまうなぁ。

そらまめの芽が出てきた。右はニンニク。

1287924781 1287924788

ラディッシュは先日間引いたのでのびのび育っている。ミョウガは枯れてきた。北側の端のほうは夏の終わりに枯れてしまい、ミョウガが出てこなかったので、根腐れしたのかななぁと思っているのだけど、地下茎掘り起こして植え直したほうがいいんだろうか?スペースもったいないし。

1287924794 1287924806

かなりすっきりしてしまった。今から植えるものがちょっと見つからないなぁ。

1287924800

「これからの思考の教科書」を読んだ

手放しで大絶賛する内容かと言われると疑問符が付くが、第三部の内容が言語化されていることが素晴らしい。第一部と第二部は今時の常識で、それを知らないヒトのために丁寧にベージを割いているといった感じ。でも、ラテラルシンキングは改めて読むといいことがたくさん書いてある。

特に

想像力だけで勝負できる場所などどこにも存在しないのであって、地道に積み上げたスキルの上に、そのスキルの文脈の範囲内においてのみ花咲くのが価値ある創造性

は、僕が普段「下からは見下ろせないよ」と表現するような感覚、つまりサイエンティフィックにより高いとこに登ってみて初めて見えてくる創造性の世界を言い表していて気に入った。結局、自分の能力の範囲を超えたセレンディピティなんか存在しないし、してはいけない(と強く思う)。

三部は、これからの思考というタイトルに関することなので垂直、水平思考を知っているヒトが読めばかなり面白いと思う。ただ、学びの場を企業内においているけど、実際は企業内で学ぶことよりも、それを離れた場所での学びの比重が増えてるからそういった部分は何かで補う必要があるかもしれない。

例えば、「ウェブで学ぶ」とか。

ProductName ウェブで学ぶ ――オープンエデュケーションと知の革命 (ちくま新書)
梅田望夫,飯吉透
筑摩書房 / ¥ 861 ()
在庫あり。

垂直思考

  • 事実、理由、提案以外の要素はビジネスの場において相手の理解を妨げるノイズ
  • ロジカルシンキングは武器であり、防具でもある
    • 念みたいなもの(バトルの基本)
  • 問題の発見は、問題解決にとって最も難しいステップ
    • 何がわからないかがわからないという状態を抜けるための力

水平思考

  • ラテラルシンキングは、直接対決を避けて競争相手を出し抜くための思考法
  • アブダクションこそ科学の諸概念や理論を生み出す唯一の論理操作
  • アブダクション
    • 驚くべき事実を見つけるための十分な知識
    • 説明仮設を立てる時のヒラメキ
  • シネティクス法
  • TRIZ
  • マンダラート
  • SCAMPER法
  • 意識的か否かにかかわらず、この世界には、それを求めている人にしか見えないことがたくさんある
  • 想像力だけで勝負できる場所などどこにも存在しないのであって、地道に積み上げたスキルの上に、そのスキルの文脈の範囲内においてのみ花咲くのが価値ある創造性

インテグレーティブシンキング

  • 洗い出された複数のアクションの「腹の底」に定着させて、それらの相反するアクションの良さを失わないままに、「融合」するような新たな解を産み出そうとする知的ステップ
  • 学びのプロセスは現実には自己完結的ではなくて、むしろ組織における複雑なインテグレーションによって回転している
  • 五感とは、実は人間が勝手に分けて考えているもので、本来これらは相互作用しながら一人の人間として統合されている

Senior / Royksopp

まったり。あまりピンとこなかった、聴いてるうちに良くなってくるのかな?

ProductName Senior
Royksopp
Wall of Sound / ¥ 1,717 (2010-09-13)
在庫あり。

チルの境地で。

小どうぶつしょうぎ

娘と息子がドミノとして遊んでいるが、小動物バージョンにすれば戦略性が高まっていいのではないかと思った。

  • プレーリードッグの近傍(桂馬の動ける位置)の味方は一度だけ避けることができる
  • もぐらはもぐららしく動く

みたいな。

ProductName どうぶつしょうぎ (日本女子プロ将棋協会公認)

幻冬舎エデュケーション / ¥ 1,500 (2009-09-05)
在庫あり。

どうぶつしょうぎは、ライオンを如何に取るかというよりは、自分のライオンを如何に相手の最終ラインに持っていくかの勝負だなと思った。

美しきかな、並列

Real World HakellのSTMの章がなんか消化不良だったのでなんかないかなぁと探したら、ビューティフルコードにSTMの章があったのを思い出したので、早速読んだ。

ちなみに英語のはここ

サンタクロース問題わかりやすい。ついでに動かしてみたけどControl.Monadもインポートしないと動かない@GHC6.12.3

module Main where
import Control.Concurrent.STM
import Control.Concurrent
import Control.Monad
import System.Random

meetInStudy :: Int -> IO ()
meetInStudy id = putStr ("Elf " ++ show id ++ " meeting in the study\n")

deliverToys :: Int -> IO ()
deliverToys id = putStr ("Reindeer " ++ show id ++ " delivering toys\n")

helper1 :: Group -> IO () -> IO ()
helper1 group do_task = do
  (in_gate, out_gate) <- joinGroup group
  passGate in_gate
  do_task
  passGate out_gate

elf1, reindeer1 :: Group -> Int -> IO ()
elf1      gp id = helper1 gp (meetInStudy id)
reindeer1 gp id = helper1 gp (deliverToys id)

data Gate = MkGate Int (TVar Int)

newGate :: Int -> STM Gate
newGate n = do { tv <- newTVar 0; return (MkGate n tv)}

passGate :: Gate -> IO ()
passGate (MkGate n tv) = atomically (do n_left <- readTVar tv
                                        check (n_left > 0)
                                        writeTVar tv (n_left-1))

operateGate :: Gate -> IO ()
operateGate (MkGate n tv) = do
  atomically (writeTVar tv n)
  atomically (do {n_left <- readTVar tv; check (n_left == 0)})


data Group = MkGroup Int (TVar (Int, Gate, Gate))

newGroup :: Int -> IO Group
newGroup n = atomically ( do g1 <- newGate n
                             g2 <- newGate n
                             tv <- newTVar (n, g1, g2)
                             return (MkGroup n tv))

joinGroup :: Group -> IO (Gate, Gate)
joinGroup (MkGroup n tv) 
    = atomically (do (n_left, g1, g2) <- readTVar tv
                     check (n_left > 0)
                     writeTVar tv (n_left-1, g1, g2)
                     return (g1,g2))

awaitGroup :: Group -> STM (Gate, Gate)
awaitGroup (MkGroup n tv)
    = do (n_left, g1, g2) <- readTVar tv
         check (n_left == 0)
         new_g1 <- newGate n; new_g2 <- newGate n
         writeTVar tv (n,new_g1,new_g2)
         return (g1, g2)

randomDelay :: IO ()
randomDelay = do
  waitTime <- getStdRandom (randomR (1, 1000000))
  threadDelay waitTime

elf :: Group -> Int -> IO ThreadId
elf gp id = forkIO (forever (do {elf1 gp id; randomDelay}))

reindeer :: Group -> Int -> IO ThreadId
reindeer gp id = forkIO (forever (do {reindeer1 gp id; randomDelay}))

santa :: Group -> Group -> IO ()
santa elf_gp rein_gp = do
  putStr "--------------------------\n"
  choose [(awaitGroup rein_gp, run "deliver toys"), (awaitGroup elf_gp, run "meet in my study")]
  where
    run :: String -> (Gate, Gate) -> IO ()
    run task (in_gate, out_gate) = do
                         putStr ("Ho! Ho! Ho! let's " ++ task ++ "\n")
                         operateGate in_gate
                         operateGate out_gate

choose :: [(STM a, a -> IO ())] -> IO ()
choose choices = do act <- atomically (foldr1 orElse actions)
                    act
    where 
      actions :: [STM (IO ())]
      actions = [do {val <- guard; return (rhs val)} | (guard, rhs) <- choices ]

main = do
  elf_group <- newGroup 3
  sequence_ [ elf elf_group n | n <- [1..10]]
  rein_group <- newGroup 9
  sequence_ [reindeer rein_group n | n <- [1..9]]
  forever (santa elf_group rein_group)

で、なんでputStrLn使わないのかなぁとか思いつつ、自分でputStrLn使って書いたコードを実行したら

--------------------------
Ho! Ho! Ho! let's deliver toys
Reindeer 4 delivering toys
Reindeer 6 delivering toysReindeer 5 delivering toysReindeer 7 delivering \
toysReindeer 2 delivering toysReindeer 3 delivering toysReindeer 9 \
delivering toysReindeer 8 delivering toysReindeer 1 delivering toys

みたいに文字が出力された後に改行がずらずら出力されることがある。

あー!と思ってソースを見たら

putStrLn        :: String -> IO ()
putStrLn s      =  do putStr s
                      putChar '\n'

という定義だった。というわけで、putStrじゃないといけない理由がわかった。

ProductName ビューティフルコード
Brian Kernighan,Jon Bentley,まつもとゆきひろ
オライリージャパン / ¥ 3,990 ()
在庫あり。

Real World Haskell 28章

STM

この章ちょっと短い。もうちょい厚くして欲しかったかも。

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

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

今日の畑(101020)

ラディッシュの間引きをした。

間引くのは結構手間だな。筋蒔きのテクに左右されるのか?

そら豆はほぼ全滅、かろうじて一つ生えてた。

あとはほうれん草と春菊も間引かないといけない

ProductName 一坪家庭菜園―狭い庭でもここまでできる
藤田 智
家の光協会 / ¥ 1,575 ()
在庫あり。

Real World Haskell 27章

ソケットとsyslog

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

UDPの写経したら飽きたのでTCPの例はやってない。基本的にCに対応する関数が用意されているらしいので、内容はわかりやすかった。