SRM408-DIV2-1000

MarblesInABag

最初は再帰で考えて

class MarblesInABag {
  double gp(int rc, int bc){
    if(rc > bc) return (double) 0;
    if(rc == 0) return (double) 1;
    if(rc == 1 && bc == 0) return (double) 0;
    return (double) rc /(rc+bc) * gp(rc-1,bc-1) 
    + (double) bc/(rc+bc) * gp(rc, bc-2);
  }
public:
  double getProbability(int redCount, int blueCount) {
    return gp(redCount,blueCount);
  }
};

でこれをメモ化すればいいと思ってたんだけど、それだと、4000*4000の配列を用意しないといけないのでダメだということに気づいた。

というよりここがスタートでO(N^2)をO(N)にするというのが問題の意図だったらしい。

トップのヒトの解答をみると2*5000の配列にしていて赤が一個の時の確率から始まって赤の数を増やしながら、表を更新していた。

ここでのループで解く場合というやりかたになるのかな。

静岡地酒プレゼント

とりあえず応募した。

誉富士誕生物語がなかなかおもしろかった。

気になるアイテム 夏の陣

ビショップの下巻は買うとして、

ProductName パターン認識と機械学習 下 - ベイズ理論による統計的予測
C. M. ビショップ
シュプリンガー・ジャパン株式会社 / ?円 ( 2008-07-11 )


このアルゴリズムデザインというのが気になる。

ProductName アルゴリズムデザイン
Jon Kleinberg
共立出版 / 15750円 ( 2008-07-10 )


さらに、これも気になる。

短冊に願い事を書いてみようかな

リアルアンパンマン

あれ、バタ子とおむすびってできてんだっけ?

娘と第一話から最終話まで一気にみた。 ようわからんけど、娘は「恐いアンパンマンだー」大喜びしていた。

というわけで、僕のmacbookがアンパンマン再生機にされかけておる。

jython+web.pyでお手軽Webアプリ

jython+web.pyがお手軽で、ちょっとしたことをやるならいい感じ。

jythonのosモジュールにはfstatがないのでtrunkのSimpleHTTPServerの静的ファイルの転送ができない。そのため、2.2.1のSimpleHTTPServerと入れ替えた。

import java.io.StringReader as StringReader
import org.openscience.cdk.interfaces.IMolecule
import org.openscience.cdk.io.CMLReader as CMLReader
import org.openscience.cdk.ChemFile as ChemFile
import org.openscience.cdk.layout.StructureDiagramGenerator as StructureDiagramGenerator
import uk.ac.cam.ch.wwmm.opsin as opsin
import net.sf.structure.cdk.util.ImageKit as ImageKit

import web

urls = (
    '/(.*)', 'img2d' 
)

class img2d:       
    def GET(self, name):
        cml = opsin.NameToStructure().parseToCML(name).toXML()

        str_reader = StringReader(cml);
        cmlr = CMLReader()
        cmlr.setReader(str_reader)
        chem = cmlr.read(ChemFile());
        mol = chem.getChemSequence(0).getChemModel(0).getSetOfMolecules().getMolecule(0)

        sdg = StructureDiagramGenerator()
        sdg.setMolecule(mol)
        sdg.generateCoordinates()
        mol = sdg.getMolecule()

        ImageKit.writePNG(mol, 300, 300, "./static/test.png")
        print '<h1>' + name + '</h1>' + '<img src="/static/test.png" />'

if __name__ == "__main__": web.run(urls, globals())

http://localhost:8080/(2,3-diethyl-benzyl)-isobutanolというURLにアクセスすると、IUPACを2次元構造に変換していい感じに描画して表示してくれる。

opsin_web

ImageKitが必ずファイルに出力するのでテンポラリのファイルを作ればいいのだけど、とりあえず動く事を確認したかったので決めうちの名前で。

牛臥でキス釣り

なんか最近釣りに行かなくなったんだけど、昨日は久々にボート釣りに行ってきた。 ボート釣りはやっぱ楽しいのお。

1214706404

5時半とちょっと遅めに漕ぎだして、10時くらいまで。雨が20%位という予報だったけど、ふらないどころか晴れてきた。

1214706407 1214706409

キスはまぁまぁ釣れて満足。

1214706402

沖のほうまで漕いでいくと結構いろいろ釣れて楽しい。後半アナハゼばかりで飽きたけど。

あと黄色いひげのある赤い魚を初めて釣った。アカイオジサンと命名したけど、やっぱおじさんと呼ばれているらしかった。正式名はヒメジというそうだ。

ペルソナ作って、それからどうするの?を読了

かなり消化不良だが読み終えた。

一応、僕はデザイン関係ではなくて、製薬の企業でデータマイニングとかの研究がメイン。マイニングするためのデータが欲しいという理由で、webのシステム組んだり、データを集約するための仕組みをあれこれ考えたりとかしている(今は)。だから、ターゲットとしている読者からは離れているかもしれない。

ProductName ペルソナ作って、それからどうするの? ユーザー中心デザインで作るWebサイト
棚橋 弘季
ソフトバンククリエイティブ / ?円 ( 2008-05-30 )


概要は正直辛かった。バックグラウンドが乏しいので、「誰の何とかが提唱したなんとかは」みたいに書かれても、なかなか自分の中でつながっていく感がなかった。ある程度分かっているヒトが読むとつながっていく感が感じられて面白いんだろうなとは思ったんだけど。第一部の概要は読んでて辛かったので途中で投げ出した、二週間くらい。他の本(ロベールとか)読んでて読むものがなくなってまた読み始めたって感じだった。

で、実践編はなかなか面白かった。ポストイットを張りながら読んだ。こっちを読んで考えながら一部の概論に立ち戻るという読み方が正解だったかなと、今は思う。

結局ペルソナっていうのは、TDDでのテストとかBDDの仕様に近いもんなのかなと。安心して戻ってこられるよりどころみたいな。

昔考えた人工無脳ケミストもそういった観点で捉え直せば、ケモインフォマティクスのためのアジャイルプロセス用ツールとして使えるかもしれんなと思った。

参考文献の中でおもしろそうなのを読んでいこうかな。

jythonでwebappサーバー

CherryPyはSignalがないぜよっていうエラーを解決できなさそうだったのであきらめた。

webpyはSSL関係のクラスをコメントアウトして830行あたりをちょっと修正すれば動く。

これで、cgiとかサーブレットみたいな面倒な手段をとらなくても、javaライブラリとwebserverをつなげられる。

例としてIUPAC名をCMLに変換するjavaライブラリであるopsinを利用したwebappを作る

import uk.ac.cam.ch.wwmm.opsin as opsin
import web
urls = (
    '/(.*)', 'hello' 
)
class hello:
    def GET(self, name):
        i = web.input(times=1)
        for c in range(int(i.times)):
            print opsin.NameToStructure().parseToCML(name).toXML()

if __name__ == "__main__": web.run(urls, globals())

http://localhost:8080/benzeneってアクセスするとbenzeneのCMLがブラウザに出力される。

jythonでGenerator

trunkをコンパイル

fedora8にantが入ってなかったのでyum install antで入れた。

あとはsvn coしたらantって打つだけでOK

% ./bin/jython
Jython 2.3a0+ (trunk:4809, 6 27 2008, 21:45:52) 
[Java HotSpot(TM) Client VM (Sun Microsystems Inc.)] on java1.6.0_06
Type "help", "copyright", "credits" or "license" for more information.
>>> def ytest(n):
...   for x in range(n):
...     yield x
... 
>>> it = ytest(10)
>>> it.next()
0
>>> it.next()
1
>>> it.next()
2

OK。でも2.2.1でもfrom __future__すればいけるようだ。

Jython 2.2.1 on java1.6.0_06
Type "copyright", "credits" or "license" for more information.
>>> from __future__ import generators
>>> def ytest(n):
...   for x in range(n):
...     yield x
... 
>>> it = ytest(10)
>>> it.next()
0
>>> it.next()
1

WEB+DB PRESS Vol.45

来た。

ProductName WEB+DB PRESS Vol.45

技術評論社 / ¥ 1,554 ()
通常24時間以内に発送

ケータイ開発とは無縁なので特集には惹かれないが、iKnowの話とかRubyでBDDあたりは面白そう。あと、openID,RESTあたりも。

perlはMooseの話。

というわけで、週末にちゃんと読もう。