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

社長は労働法をこう使え!

労働法に関して。組合が強すぎるのはいいことなのか悪いことなのかよくわからないが、僕は組合が嫌いだ。

会社にもめやすい土壌があり、そこにもめやすい社員が種をまき、労働組合や弁護士などが水をあげることで、揉め事の芽が出て花が咲く

権利ばかり主張して「いいから働けよ、おっさん」って言いたくなるようなバブル以前のたいして働かない社員もみてるし、そういう人達の雇用を守るために一生懸命組合を頑張る若手社員を見ててもなんだかなーと思ったりするし。

結局労使は労働法というルールを使ったゲームだな。だからルールは熟知しておく必要があるだろう。

ProductName 社長は労働法をこう使え!
向井 蘭
ダイヤモンド社 / 1680円 ( 2012-03-09 )


  • 日本の場合、賃金さえ支払えば労働者に仕事をさせなくてもかまいません。
  • 労働法では、「労働者は工場で働く弱者と考えている」「裁判官の常識でふれる」
  • 労働法は労働者の能力不足には寛大だが、遅刻や欠勤などの勤怠不良には非常に厳しい
  • 数億円の損害を出すのは許しても、数千円の横領は許されない
  • 会社の利益を労働者に還元する場合には、むやみに手当を増やすより、賞与を利用するのが安全
  • 日本の場合、使用者に義務付けられているのは労働組合との話し合いのテーブルにつくことだけ

ライフサイエンスQAにケミストリーな質問をしても良いらしい

先日のtwitterのやりとりが、FAQっぽかったので@32nmのススメもあってLSQAに投稿しておいた。LSQAは主にバイオインフォマティクス系の話題をとりあつかうもんだと勘違いしていたので、これからはもう少し質問しよう(回答も)と思った。

うちの職場でもOSQAを入れているのだが、なかなかアクティブにならないので、検索した時にヒットしなかったら別のサイトに検索書けるようにならんだろうか?P2PみたいにQAがつながらないかなぁと。GitHubみたいにQAがフォーク出来る感じだといいんだけど。

まぁ、ユーザー100人規模だとなかなかアクティブにしにくいのかなぁ?もっとずっと規模の大きい研究所で試してみたいなぁと思うこともあるが、それは甘えなのかな(多分そうなんだろう)。

ただ、個人的にはこういうことをやる場合のユーザー数は時間を超えた述べで考えないといけないのかなと思っていて(つまり一年後の自分は他人)、持続的で効率的な研究スタイルのためには絶対必要な仕組みだと思うんだけど、プロジェクトに張り付いていると、目先の問題を解くことで一杯一杯でなかなか理解してもらえないとこがもどかしい。

そういう意味では、ChEMBLはちょっとしたブレークスルーかもねーなんて思ったりする。従来メディシナルケミストリー的な情報は閉じていて出てこなかったのが、気軽にデータをあつかえるようになったから、個人の趣味レベルで色々やれるようになったし、パブリックデータベースに閑する質問はパブリックでやればいいだろうから、これからもっと面白い情報も出てくるんじゃないかなーと。

だれに承認されるとモチベーションが上がるのか?

承認とモチベーションという本を読んだ。

前半が一般論で、後半が事例というかたちで、前半はよくまとまっているので読むと面白いかもしれません。

ProductName 承認とモチベーション
太田 肇
同文館出版 / 1995円 ( 2011-07-09 )


学習とかゲーミフィケーションとか追いかけた経緯で大体知っていたが、承認という側面からまとめてあったので新たな発見があって良かったかな。

あと承認に関しても面白い考察を見つけた。それは専門職が高くなればなるほど、専門家仲間による承認を重視するようになるというものである。本書では看護師を例にとってあったけど、研究職でもそうだよなと思った。僕も社外発表のフィードバックを重視するしね。賞与的なものではね返ってきても自己肯定感に結びつくのは最初の一回くらいのもんだよね。

それから、IT系の技術者のブログでやりがいあるところに転職が決まるとブログかかなくなっちゃうってのも承認と関係あるのかな?と思った。

教え方を考える

理想としているのは少人数でやるようなIT系の勉強会とかワークショップに近いですね。

amazonのカスタマーレビューには講師とか教える側のヒトたちが低い星をつけているようだが、教える側には体験が共有しにくいかもしれんので、まぁそうなるかなと。

これまでの教え方は「工場モデル」 学びの主役は、一人ひとりの生徒であり、受講者です。教師や講師ではあり得ません

と書いてあるように、この本の対象読者は学習者じゃないかなと思う。

今までの教え方を「行動主義」に基づくものとしてこれからの教え方、学び方を考えていく

少なくともわが国の教育界で依然として幅をきかせているのが「行動主義」の考え方です。これはおしえることはすでにはっきりしていて、それをいかに効果的、効率的に教えこんでいくかが中心テーマです。これは、ネズミやサルやハトなどの動物実験で培われたノウハウを人間に応用している教育学のことです。

そして

今はその「予想のつく世界」が存在しなくなったり、変化のスピードがあまりにも早過ぎる状況になってきています。従って、もはや過去の知識や蓄積を覚えるだけでは不十分で、状況に合わせて授業や研修の仕方も当然変わることが求められています

単に知識の吸収だったらwebがあるから、そっちをうまく使えば良いですね。