セミの羽化を観察

犬の散歩してたら蝉の幼虫を拾ったので、家の網戸に貼り付けて観察してみた。

1345342904

ちょっと目を離した隙に、ニョロっと出てきた。セミのように蛹を経ずに羽化するのを不完全変態というらしい。

1345342905 1345342907

羽が固まるまで結構時間がかかるみたい。

1345342909 1345342914

朝起きたら抜け殻が残っていた。無事に飛び立っていた。

1345342916

娘の模写

1345342910 1345342912

ザリガニさいばん

多数決というのは少数の反対意見を握りつぶす行為であって、合意の形成(全員の落としどころをみつける)とは違うというか、そういう皮肉はこめられているよなぁと。

子どもが読んでも面白さは伝わらないけど、大人(ちょっとすれた)が読むと面白い。

ProductName ザリガニさいばん (どうわがいっぱい)
阿部 夏丸
講談社 / 1155円 ( 2001-07-12 )


ストーリーはナマズにこぶができてて近くにザリガニのハサミが落ちてて、犯人としてザリガニが疑われたんだけど、嫌いだという心情で多数決で有罪にされたけど、ロジカルに突き詰めていくとなんかおかしいと。結局ナマズがザリガニを食べた時に抵抗して暴れた時の傷だったというオチ。

その過程が面白い。

東京都知事選の泡沫候補の政見放送がループすんね。

WEB+DB PRESS Vol.70

オートマトンの特集が読みたくて買ってしまった。

ProductName WEB+DB PRESS Vol.70
成田 一生
技術評論社 / 1554円 ( 2012-08-24 )


WEB+DB PRESSの特集は、その性格上妙に入門っぽい部分が多かったりして、思ったより満足感が得られなかったりするから最近はあまり買ってなかったんだけど。

どっちかっていうと、数ページくらいの連載とかコラムのほうが好きだったりするが、今回もそんな感じだった。

オートマトンの特集以外では

  • Software is Beautiful
  • Comparators
  • Perl Hackers Hub
  • フロントエンドWeb戦略室

が面白かった。

チケット駆動開発の本を読み返した。

2月くらいからredmineを使い始めて、中規模なサイトを2,3個作って、チケットの粒度とか運用サイクルとかリズム(トヨタ生産方式でいうタクトに近いかな)なんかについて色々とわかってきたので改めて読んでみた。

ProductName Redmineによるタスクマネジメント実践技法
小川 明彦
翔泳社 / 3444円 ( 2010-10-13 )


最初は複数人で使うつもりで啓蒙してみたりしたんだけど、予想通り難しかったので、他人にふった仕事もIssueとして全て自分で管理したら、うまくまわった。4.2節の権限ポリシーをワークフロー型に振って、他人に仕事をアサインするっていうタスクをチケットとして切ったことになるのかな。

他人への仕事のアサインを不確実性のあるタスクとして登録して、タイムアウトしたら自分に再アサインするというやり方にしたわけだけど、これで淡々とこなせるようになったし、さらにイライラしなくなって精神的にも都合が良かった。

ついでにチケットも会議と紐付けるようにしたので、会議を定期的にやれば、プロダクトの開発サイクルもそれにつられてタイミングが揃うようになったし、会議の議題とかチケットの粒度も次の会議までの期間でできそうな(3週間くらい)に揃えやすくなった。

変化を受け入れる技術、プロジェクト管理、開発環境がなければ、アジャイル開発は絵に描いた餅です

これはそうだよなとしみじみと思った。というわけで、これも読む予定

ProductName チケット駆動開発
小川 明彦
翔泳社 / 3444円 ( 2012-08-24 )


その他

化合物の合成を1つのチケットにしてbacklogsプラグイン使えば、かなり便利に使えると思うんだけどどうかな?と思った。そのうち試してみたい。

MongoDBで配列のサイズがある数より大きいとか小さいとかいう問い合わせをするには

最初

{$size: {$gt:1}

とやったが結果が返ってこなかったのでおかしいなぁと調べてみたらsofにあった。

$whereを使って問い合わせをするらしい。つまり、

{ $where: "this.name.length > 1" }

という形になる。とはいえ、

{$size: {$gt:1}

は直感的だと思うんだけどね。

ProductName MongoDB: The Definitive Guide
Kristina Chodorow
Oreilly & Associates Inc / 3200円 ( 2010-09-23 )


ポケモンタイピングDSのbluetoothキーボードは安くて便利

以前購入したのだけど、予想通り遊ばなくなったので、僕のiPhone用のキーボードとして職場に持ち込んで使っているが便利だ。

iPhoneに認識させるのも簡単で、iPhone側のbluetoothをONにしておいて、キーボードのfnを押しながら電源を入れるだけで認識する。

結合を切断しながらMatched Molecular Pair(MMP)を求める

論文読んでたら、コンベンショナルなMMPの求め方が載ってたので、似たようなやり方を考えてみた。

要するに網羅的に結合を切断していって

{Scaffold; [fragment, fragment, fragment]}

っていうハッシュを作っていく。fragmentは共通のScaffoldを持つので配列中の任意のフラグメントのペアがMMPということになる。

僕の切断ルール

僕の切断ルール

  • シングルボンド
  • 環の一部ではない
  • ボンドのどちらかの端がCであること

CHEMBL327743の結果

('CC[C@@H]([C@H](NC(=O)[C@@H]1CCCCN1CC(=O)*)/C=C/c1ccccc1)C', 'COc1cccc(c1*)OC', 'CHEMBL327743')
('CC[C@@H]([C@H](NC(=O)[C@@H]1CCCCN1C*)/C=C/c1ccccc1)C', 'COc1cccc(c1C(=O)*)OC', 'CHEMBL327743')
('CC[C@@H]([C@@H](/C=C/c1ccccc1)N*)C', 'COc1cccc(c1C(=O)CN1CCCC[C@H]1C(=O)*)OC', 'CHEMBL327743')
('CC[C@@H]([C@H](NC(=O)*)/C=C/c1ccccc1)C', 'COc1cccc(c1C(=O)CN1CCCCC1*)OC', 'CHEMBL327743')
('CC[C@@H](C(NC(=O)[C@@H]1CCCCN1CC(=O)c1c(OC)cccc1OC)*)C', '*/C=C/c1ccccc1', 'CHEMBL327743')
('COc1cccc(c1C(=O)CN1CCCC[C@H]1C(=O)N[C@H](/C=C/c1ccccc1)*)OC', 'CC[C@H](C)*', 'CHEMBL327743')
('*c1ccccc1', '*/C=C\\[C@H]([C@H](CC)C)NC(=O)[C@@H]1CCCCN1CC(=O)c1c(OC)cccc1OC', 'CHEMBL327743')
('*OC', 'CC[C@@H]([C@H](NC(=O)[C@@H]1CCCCN1CC(=O)c1c(*)cccc1OC)/C=C/c1ccccc1)C', 'CHEMBL327743')
('*OC', 'CC[C@@H]([C@H](NC(=O)[C@@H]1CCCCN1CC(=O)c1c(*)cccc1OC)/C=C/c1ccccc1)C', 'CHEMBL327743')
('*CC', 'COc1cccc(c1C(=O)CN1CCCC[C@H]1C(=O)N[C@@H](C(C)*)/C=C/c1ccccc1)OC', 'CHEMBL327743')
('CC[C@@H]([C@H](NC(=O)[C@@H]1CCCCN1CC(=O)c1c(OC)cccc1OC)/C=C/c1ccccc1)*', 'C*', 'CHEMBL327743')
('*C[C@@H]([C@H](NC(=O)[C@@H]1CCCCN1CC(=O)c1c(OC)cccc1OC)/C=C/c1ccccc1)C', 'C*', 'CHEMBL327743')

コード

どこで切断されたかどうかを明確にするために切断されたボンドにダミーアトム(atomicnumが0のアトム)をおいた。

canonicalSMILESで出力して.の文字でsplitした文字列をそのままキーに使っているが、openbabelのcanonicalizationアルゴリズムはMorgan Algorithmを改変したものを使っているのでおそらく大丈夫。

下のコードでは標準出力に書きだしたが、実際はデータベース化することになる。多分Mongo使う。

smi_string,id = clone.write(format="can")[:-1].split('\t')
frag1, frag2 = smi_string.split('.')
dbh.mmp.update({"core": frag1}, {"$push": {"frags": (frag2, id)}}, True)
dbh.mmp.update({"core": frag2}, {"$push": {"frags": (frag1, id)}}, True)

こんな感じだろうか。

以下MMPを求めるのに使ったコード

import pybel
import openbabel
import sys

input = sys.argv[1]

def mkclone(mol):
    obc = openbabel.OBConversion()
    obc.SetInAndOutFormats("mol", "mol")
    molstring = obc.WriteString(mol)
    new_mol = openbabel.OBMol()
    obc.ReadString(new_mol, molstring)
    return new_mol

def ring_member(rings, atom):
    for i, ring in enumerate(rings):
        if ring.IsMember(atom):
            return i
    return -1

def is_same_ring_member(rings, a1, a2):
    a1_idx = ring_member(rings, a1)
    a2_idx = ring_member(rings, a2)
    if a1_idx == -1 or a2_idx == -1:
        return False
    return a1_idx == a2_idx

def detect_del_bonds(mol):
    rings = mol.OBMol.GetSSSR()
    del_bonds = []
    for a in mol:
        if a.atomicnum == 6:
            for na in mol:
                n_a = na.OBAtom
                b = a.OBAtom.GetBond(n_a)
                if b != None and b.GetBondOrder() == 1 and not is_same_ring_member(rings, a.OBAtom, n_a):
                    if a.OBAtom.GetIndex() < n_a.GetIndex():
                        del_bonds.append((a.OBAtom.GetIndex(), n_a.GetIndex()))
    return del_bonds

for mol in pybel.readfile("sdf", input):
    chembl_id = mol.data["CHEMBL ID"]
    print chembl_id
    del_bonds = detect_del_bonds(mol)
    for a1, a2 in del_bonds:
        clone = pybel.Molecule(mkclone(mol.OBMol))
        # !!! index starts 0 but GetAtom starts 1 !!!
        ob_a1 = clone.OBMol.GetAtom(a1 + 1)
        ob_a2 = clone.OBMol.GetAtom(a2 + 1)
        bond = ob_a1.GetBond(ob_a2)
        clone.OBMol.DeleteBond(bond)

        new_atom1 = clone.OBMol.NewAtom()
        new_atom1.SetAtomicNum(0)
        new_bond1 = clone.OBMol.NewBond()
        new_bond1.SetBegin(ob_a1)
        new_bond1.SetEnd(new_atom1)
        new_bond1.SetBondOrder(1)

        new_atom2 = clone.OBMol.NewAtom()
        new_atom2.SetAtomicNum(0)
        new_bond2 = clone.OBMol.NewBond()
        new_bond2.SetBegin(ob_a2)
        new_bond2.SetEnd(new_atom2)
        new_bond2.SetBondOrder(1)

        smi_string, id = clone.write(format="can")[:-1].split('\t')
        frag1, frag2 = smi_string.split('.')
        #print (frag1, chembl_id)
        #print (frag2, chembl_id)
        print (frag1, frag2, chembl_id)

「渋滞」の先頭は何をしているのか?

最後のほうは生産方式のボトルネックを潰す話になってて面白い

ProductName 「渋滞」の先頭は何をしているのか? (宝島社新書 291)
西成 活裕
宝島社 / 756円 ( 2009-06-10 )


渋滞の種類

  • 自然渋滞
  • ボトルネック渋滞
  • ダンゴ型渋滞

自然渋滞をなくすには、

  • 不安定な流れをなんとかして安定化させる
  • 不安定な流れをつくらない

その他

  • 人間は立ち止まっていると体感待ち時間が増え、それがストレスにつながる
  • タクトの重要性

学校は誰のものか

本書は2007年に出版されているが、最近の学校絡みの事象はその当時に指摘されまくっていて改善なんかこれっぽっちもされてないのがわかる。

親、子ども不在の不毛な議論はもうごめんだ「よい先生」のいる「よい学校」に学びたい。こんな簡単な望みがどうして叶わないのか。学習者の立場から教師、校長、教委の「しがらみ共同体」にメスを入れる。

というような、教師が如何に駄目かを語る本だった。

個人的には教育バウチャーは賛成かな。弊害があるとしても、今より悪くなるってことはないだろうし、そのうえで揺り戻しがあってもいいのかなーと。教師は聖職者じゃなくて労働者だという認識を持ったほうがいいでしょう。

公立学校はお客が増えようが減ろうが、あるいはまったくこなくても統廃合すればいいし、校長、教員は転勤すれば済む

僕は分校みたいな小さな小学校を出たのだけど、そういう学校にはちょっと頭のおかしい教師が送られてくるんだよね。お盆に実家に帰った時もばぁば(つまり母)がその当時の話を語ってたけど、自分の記憶とほとんどズレてなかった。「お前の学年は1,2年生の時はマトモな授業してなかったんだよねー」とか語りだして、「もうちょっと問題にしとけよ」と思った。まぁ、田舎の学校はPTAの癒着もすごいからねー。

で、多分小学校一年のときは担任が三人くらい変わっていて、そのうちの二人(一人は確実)は精神病院に入った気がする。二年の時も一回代わってたかなぁ。まぁそんな感じでw

結構色々、覚えてるんだけど幾つか。

二年の時のおかしい男性教師は、あるひ女子生徒がいたずらでおとなしい男子生徒の椅子を休み時間中に隠しちゃって、授業が始まっても椅子が見つからず困っているその生徒に対していきなりブチ切れて、すげー勢いでぶん殴られ突き飛ばされて、まぁ当たり前に鼻血はでてまわりの机もドンガラガッシャンで。その後少し経ったら消えたんだけどw。なんだったんだろあれ?とか書いてたら思い出したけど臨時教師だったかもしれん。

一年生の時のも覚えていて、更年期障害みたいなばあさん先生が、下校中に奇声を発しながらいきなり追いかけてきて、同じ下校グループの女の子を道路から1メートルくらい下にある田んぼに着き落としてた。

たしかその女教師はすぐに消えたはず。

あーいうの経験してるから、教師は選べるようにして欲しいなぁと思うし、選べないなら何かあった時のペナルティを厳しくして欲しいなぁと思うんだけどね。

学校はムラ社会

  • ムラ長に異議をとなえない
  • 二重規範になっている
  • 内部の恥を外部に晒さない

ふもとっぱらにキャンプにいってきた

夏休みの最後のイベントとして、ふもとっぱらにいってきた。去年はこどもの国に泊まったけど、今回はこどもの国とちがって犬連れオッケーなので、犬同伴で。

1345973577

だだっ広い原っぱの好きなところにテントを張れる。途中によった青木養鶏場の焼き鳥を焼きながら、夕食の準備。

1345973575 1345973579

夜は、八月の終りでもかなり冷えるのでフリースか、それなりの寝袋は必須。震災時のことも考えていいやつを買っておくとよい。子供もどうせ大きくなるので大人用を買っておくのがコスパがいいらしい。

朝起きて、椅子に座りながらtwitter+日の出待ち。

1345973580

日が出たので撮った。

1345973582

カモが隊列を組んで池に向かって歩いていったので、息子と娘が最後尾からついていった。

1345973583

帰りにミルクランドでジェラートを食べて終了。

1345973585