Heligoland / Massive Attack

ドープ目。

ProductName Heligoland
Massive Attack
Virgin / ¥ 1,820 (2010-02-09)
通常1~3週間以内に発送

  • Girl I Love You
  • Psyche
  • Saturday Come Slow
  • Atlas Air

あたりが好き。

Software Design 総集編 【2000~2009】(DVD付) (大型本)

手元に置いておきたい

ProductName Software Design 総集編 【2000~2009】(DVD付)

技術評論社 / ¥ 2,079 ()
近日発売 予約可

bayonで化合物クラスタリング

chemoinformaticsな用途でbayonを使ってみる。

データセットはPrimary screen for compounds that inhibit Insulin promoter activity in TRM-6 cells.でアクティブだった1153検体

ダウンロードしてきたsdfをopenbabelでフィンガープリントに変換

babel -imol pc_sample.sdf -ofpt pc_sample.fpt -xh -xfFP2

これをbayonでクラスタリングにするためのTSVに変換

python f2bayon.py pc_sample.fpt > pc_sample.tsv

f2bayon.pyのソース

def hex2bin(fingerprint):
   bf = ""
   h2b = {"0":"0000","1":"0001","2":"0010","3":"0011",
          "4":"0100","5":"0101","6":"0110","7":"0111",
          "8":"1000","9":"1001","a":"1010","b":"1011",
          "c":"1100","d":"1101","e":"1110","f":"1111",
          }

   for l in fingerprint:
       for c in l:
           b = h2b.get(c)
           if b: bf += b
   return bf

def convert(file):
   result = ""
   for data in open(file,"r").read().split("\n>"):
       fp = ""
       for list in data.split("\n")[1:]:
           fp += hex2bin(list)
       result += data.split("\n")[0].split(" ")[0] + " " + fp + "\n"
   return result

if __name__ == "__main__":
   import sys
   file = sys.argv[1]
   c = convert(file)
   for l in c.split("\n")[:-1]:
      id,fp = l.split()
      fps = ""
      for num,bit in enumerate(fp):
         if int(bit) > 0:
            fps += "\t%d\t%s" % (num,bit)
      print id + fps

でbayonで10クラスターに分割

$ time bayon -n 10 pc_sample.tsv > pc_sample.clust

real    0m0.859s
user    0m0.839s
sys 0m0.015s

超速い。

HaskellのArrow

Arrowを学ぶ。Programming with Arrowsを読んでから、「Arrowのはなし」というニコニコ動画をみるのがわかりやすい。イメージは3番目が参考になる。

Arrowを使って奇数列を作ってみる。 0から始まる数列を&&&で分岐させて一方はそのまま戻して、もう一方はtailすることで1から始まる数列にして、合流したら足し合わせる。

Prelude Control.Arrow> let odds = (tail) &&& id >>> (uncurry (zipWith (+)))
Prelude Control.Arrow> take 10 $ odds [0,1..]
[1,3,5,7,9,11,13,15,17,19]

他、参考にしたサイト

RWHではArrowは15.4.2にちょっとだけ触れられている。

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


「7割は課長にさえなれません」を読んだ

blogの内容をわかりやすくまとめた感じだけど、会社勤めの20代30代は必読的な内容。いや、ホント。

ProductName 7割は課長にさえなれません (PHP新書)
城 繁幸
PHP研究所 / 735円 ( 2010-01-16 )


成果主義+裁量労働とってる会社で組合の存在って意味あんのとか思ってるし、実際会合とかももう数年以上出てない。あいつらは社員の仕事の能力はそんなに変わらないから給料の最低と最高のレンジを20%以下に抑えろとか平気で言うし。あと、組合頑張るやつって基本大した仕事しないわりに、組合の役員やるのが昇進の道とか本気で信じてるし。

生涯賃金のピークがあと4,5年で来そうなのはわかりきってんのに、仕事の難度のピークがそれよりずっと先にある状況ってみんなおかしいって感じないのかな。そこらへん、やりがいとかでかたづけるのはぶっちゃけ暴論だろう。

今の30代くらいは、バブル世代の年功序列組(の使えないほう、使える組はとっとと偉くなってる)とガチでぶつかるんだけど、彼らのケツ拭きをしつつも、彼らのほうが給料が多いという状況を認識しないといけない。で、僕らが同じように下の世代にツケを回せるかというと絶対無理でしょう。

じゃぁ、辞めて移れば?となるんだけど、本書にも触れられているように、それはなかなか難しい気がする。あと、僕のいる業界はどこも似たような状況なんで、世代的に、年功序列と成果主義が中途半端に混じった状態のとこが多い気がする。

でも、だからといって現状に甘んじていることの言い訳にはならないんだよなぁ。というわけで、少し前向きに色々考えているんだけどねぇ。

Haskellでcat

bindの使い方メモ

import System.Environment

cat:: String -> IO ()
cat = (>>= putStr) . readFile

main = do (file:_) <- getArgs; cat file

追記10.02.13

コメントよりheadを使えば一行で書ける。

main=getArgs>>=readFile.head>>=putStr

チャイナカフェ 炎

以前から気になっていたチャイナカフェ炎へ。

1265883510

カニのあんかけチャーハンとラーメン

1265883504 1265883516

上海焼きそばと油淋鶏

1265883491 1265883498

ここは美味いし種類は豊富だし、近いうちにもう一度行きたいところ。

紀土の吟醸と梅酒

紀土の吟醸おりがらみをイワセさんで。

1265883179

若干苦味を感じるが、2Kきってるのでコストパフォーマンスは高い。

そして梅酒は奥さん用

1265883172

kikUUiki / サカナクション

予約した

ProductName kikUUiki(初回限定盤)
サカナクション
ビクターエンタテインメント / ¥ 2,800 (2010-03-17)
近日発売 予約可

PythonでK-means

Haskellな気分で。最後while入れたけど。

from itertools import groupby
from math import sqrt

zipWith = lambda f, xs, ys : [f(x, y) for x,y in zip(xs, ys)]
snd  = lambda x: x[1]
fst  = lambda x: x[0]
euclid  = lambda x, y : (x-y)**2

def distance(a,b): 
    return sqrt(sum(zipWith(euclid,a,b)))

def centroid(clusters): 
    sums = reduce(lambda x,y: zipWith(lambda a,b:a+b,x,y),clusters)
    return map(lambda x: x / float(len(clusters)), sums)

def closest(pts, pt):
    closest_ct = pts[0]
    for ct in pts[1:]:
        if distance(pt,closest_ct) > distance(pt,ct):
            closest_ct = ct
    return closest_ct

def recluster_(centroids,points):
    reclustered = [(closest(centroids,a), a) for a in points]
    reclustered.sort()
    return [map(snd,list(g)) for k, g in groupby(reclustered, fst)]

def recluster(clusters):
    centroids = map(centroid, clusters)
    concated_clusters = reduce(lambda a,b: a+b, clusters)
    return recluster_(centroids,concated_clusters)

def part(l,points):
    size = len(l)/points
    return [l[i:i+size] for i in range(0,len(l),size)]

def kmeans(k,points):
    cluster = part(k,points)
    newcluster = recluster(cluster)
    while(cluster !=  newcluster):
        cluster = newcluster
        newcluster = recluster(cluster)
    return newcluster

if __name__ == "__main__":
    pts = [[1,2,4],[1,3,3],[4,3,0],[2,5,1],[7,3,8],[0,0,0],[4,3,2],[6,1,8]]
    print kmeans(pts,3)