fmcsを使ってMaximum Common Substructure(MCS)を求める

openbabelはMCSを求められないのが難点なんだが、書けばいいよなと思いつつ実装してない。そうこうしているうちに、fmcsを見つけて、これ使えばいいかなーと思い始めた2者だけじゃなくて複数の化合物のMCSを求められるのも自分の求めていた機能だし。

fmcsを動かすにはRDKitをインストールする必要があって、「RDKitのインストールめんどいなー」とぶつくさ言ってたら@iwatobipensilicosを参考にしなはれと教えてもらった。

brewで入れられんのね。

> brew tap edc/homebrew-rdkit
> brew install rdkit

これでサクッと入った。

fmcsのほうは

hg clone https://bitbucket.org/dalke/fmcs
cd fmcs
sudo python setup.py install

で入る。

さて、MLによると、

This work has been funded by Roche, with the explicit hope that it be incorporated into RDKit.

ということなのだが、確かRSOAPはPfizerが出してたはずだし、海外はopensourceとかそういうのに理解が深いんだろうか?また、そういうのに積極的な日本の製薬企業はあるのだろうか?なんて思ったりした(自分の観測範囲ではゼロなんだが)。

そういうことも含めて貢献できるような社会がくればいいのになぁと思う。

ProductName Design and Use of Relational Databases in Chemistry
TJ O'Donnell
CRC Press / 12118円 ( 2008-11-25 )


Traktor Pro2のnmlを曲順のプレイリストとして書き出す

nmlのトラックリストのkeyがファイルのロケーションなのでタイトルとアーティスト名の辞書を作っておく。

import sys
from xml.etree.ElementTree import *

mdic = {}
play_lists = []
elem = parse(sys.argv[1]).getroot()

for e in elem.findall(".//ENTRY"):
    if e.get("TITLE") is not None:
        el = e.find("LOCATION")
        key = el.get("VOLUME") + el.get("DIR") + el.get("FILE")
        mdic[key] = e.get("TITLE").encode('utf-8') + " / " + e.get("ARTIST").encode('utf-8')

for e in elem.findall(".//PRIMARYKEY"):
    if e.get("KEY") is not None:
        print "    {}".format(mdic[e.get("KEY")])

ProductName NATIVE INSTRUMENTS TRAKTOR KONTROL S4

NATIVE INSTRUMENTS / 76999円 ( )


JekyllかHydeかHakyllかはたまたObrazか

GitHub Pagesを管理するのに、Jekyllっぽいstatic site generatorを探している。ついでに、さくっと開発するためのボイラープレートとかTipsとかも知りたいんだけど、僕の観測範囲では見つけることができなかった。

やっぱ、Siteのデザイン眺めて、ヨサゲなサイトのデザインとかCSSとかを参考にして自分用テンプレートを作って管理するしかないのかなぁ。

twitter bootstrapは便利なんだけど、twitter bootstrap臭が消えないよね(モバイルで見やすいので気に入っているんだけど)。もう少しミニマルなtwitter bootstrapの作り方みたいなのも知りたいなぁ。

Jekyll

JekyllはRuby製で日本語の情報も結構ある。

来月GitHubのハンズオンやるから、Jekyllってその後のハンズオンネタとしてちょうどいいんじゃないか?と思って色々調べてたんだけど、結局HTMLとかCSSにいっちゃうみたいなんで、最初の方に書いたような感じになっている。

Hyde or Obraz

HydeはDjangoのテンプレートエンジンとか使っているらしいんだけど、僕はJinja派なのでちょっと避けた。

最近、ObrazっていうテンプレートエンジンにJinja2を使っているstatic site generatorを見つけたので、こっち使ってみようかなぁと思っている。コードも500行未満らしいので一度読んでみようっと。

Hakyll

Haskell製のstatic site generator

Hakyll is a Haskell library for generating static sites, mostly aimed at small-to-medium sites and personal blogs. It is written in a very configurable way and uses an xmonad-like DSL for configuration.

Shizudevつくる会のgithub organizationsのサイトはこれを使ってみようと思っている。なぜなら、静岡東部にはHaskellerが3人以上存在するからだ。これは人口比率から考えてもそこそこ高いのではないかと思っているがどうなんだろ?

それから「静岡県の形は世界的にも有名なプログラム言語Haskellのロゴマークである「λ(ラムダ)」に似ているからね。

というわけで、いまはHakyllを使ってみようかなぁと考えている。誰か今度のつくる会で黙々してみませんか?

切れ味鋭いPython版underscore.js(knife)

まぁ、僕はSpine派なのであんまりunderscore.jsにそそられないんだけど、knifeってのを見つけたのでちょっと触ってみた。

>>> __(1,2,3,4,5).append(6).append(7).undo(1).peek()
[1, 2, 3, 4, 5, 6]

reduceというかfold系

>>> __(1, 2, 3).worker(lambda x, y: x + y).reduce()
knife.lazy.lazyknife ([IN: ([1, 2, 3]) => WORK: ([]) => HOLD: ([]) => OUT: ([6])]) 
>>> __(1, 2, 3).worker(lambda x, y: x + y).reduce().get()
6

覚えれば短くかけて便利なんだろうけど、覚えたらHaskellとかSchemeとかの構文とバッティングして混乱しそう。

reduceの例はHaskellだったら

Prelude> foldl1 (+) [1,2,3]
6

でいいので、OOPな感じにすると面倒くさそうに感じるかなぁ。

ProductName プログラミングHaskell
Graham Hutton
オーム社 / 2940円 ( 2009-11-11 )


Haskell版virtualenv (virthualenv)

最近Haskellばっかり書いているんだけど、パッケージの依存性に悩まされることが多い。

やっぱサンドボックス化できるほうがいいよねーと探したらPythonのvirtualenvインスパイアなvirthualenvがあった。いまはhsenvって名前が変わって開発されているようだけど、hackageに登録されてないようなのでvirthualenvを入れておく

cabal install virthualenv

使い方はvirtualenvと大体一緒

mkdir /tmp/anydbmTest
cd /tmp/anydbmTest
virthualenv

すると.virthualenvに色々設定されるのでactivateコマンドで仮想環境に入る

source .virthualenv/bin/activate
cabal install anydbm

hakyllとバッティングしていてインストールできなかったanydbm(MissingH)が入るのでPLEAC14章を解けるようになった。

仮想環境はdeactivateで抜けられて、要らなくなったらディレクトリを消せばいいので、ちょっと試したいパッケージを気軽に試せて良い感じ(まさにPythonで開発している気分)。

virthualenvwrapperがあればさらにいいんだけどね。

追記 121223

mkvirthualenvを書いてみたら快適になった。

PyccoをHaskellに対応させておいた

Pyccoを使ってソースコードリーディングすると、ソースとコメントが一緒に管理されるので調子いいんだけど、Haskellに対応してなかったのでやっといた。

今は出力した静的なドキュメントを単純にリンクしてるだけなんだけど、手間がかかるのでgithubにpushした時点でよろしくやってくれるようにしたいなぁと思っているんだが、いい方法が思い浮かばない。

MongoDB & Pythonを読んだ

Haskellのwebフレームワークyesodでもmongodbが使えるし 、今作ろうと思っているウェブアプリにMongoを使ってみようかなぁと思っていたので、MongoDB & Pythonを買って読んでみた(readiumってのを使ってます)。

MongoDB & Python

入門的な内容なんだけど、3章のMongoDBとPythonの頻出パターンは参考になった。

  • ドキュメント指向にユニークなパターン:埋め込み
  • 高速ルックアップ:MongoDBでインデックスを使う
  • 位置情報アプリとMongoDB:地理空間インデックス
  • ディフェンシブなコーディングでKeyErrorやその他のバグを防ぐ
  • 更新または挿入:MongoDBのアップサート
  • アトミックな読み書き変更を行う:MongoDBのfindAndModify
  • 高速アカウンティングパターン

特にupsertの書き方(find_or_insertとか、insert_or_update)がいまいちわかっていなかったけど本書を読んだらすっきりしたので、これで気持ちよく書けそう。

あとはオフィシャルサイトのマニュアル(日本語訳)でも読めばいいかな。

スケーリングMongoDBも読んでみたいが使う場面がないのでとりあえずは後回し。

FlaskでBDD(ブラウザUIテストの話)

MLに「FlaskでBDDやってる?」っていうスレッドが流れてて、2つのやり方が紹介されてた。僕は家庭菜園をやっている関係上、lettuceを選択せなあかんわなというわけで、あまり検討しないで、lettuceを使うことに決めた。

lettuceを使う方法

pyccuracyを使う方法

2つの違いはなんなの?ってあたりが気になるのだけどこれもsofにあった。

要するにpyccuracyはブラウザでのテストに特化しているがlettuceはもうちょっと汎用的な使い方ができる。実際にlettuceでselenium使いたい場合はlettuce_webdriverっていうプラグインみたいなのを別途導入する必要がある。

一方で、共通しているのはGherkin DSLを使っているということで、確かlettuceはcucumberのpythonポーティングだったから、そっちでググれば日本語の情報が出てくる。

lettuceを使ってみる。

featuresっていうディレクトリを作って、そこにテスト用のファイルを置く。 ディレクトリの構成はこんな感じ。

.
└── features
    ├── steps.py
    └── web.feature

web.feature

featueは普通に文章を書いているようで何をしたいかがわかりやすく表現できる。

Feature: Compute factorial
    In order to play with Lettuce
    As beginners
    We'll access google

    Scenario: Filling out the query form
      Given I go to "http://www.google.com"
       When I fill in "q" with "Hello World"
        And I press "btnG"
       Then I should see "Hello World"

steps.py

stepsはモジュールの設定とか色々やるみたいなんだけど、今回はwebdriverのほうに定義されているもの しか使わないのであまり書くことがない。

from lettuce import before, world
from selenium import webdriver
import lettuce_webdriver.webdriver

@before.all
def setup_browser():
    world.browser = webdriver.Firefox()

実行してみる

実行するとseleniumパワーでブラウザが立ち上がり、テストが実行され結果が端末に表示される。テスト結果はカラー表示で分かりやすい。

lettuce webdriver

Spine.jsやBackbone.jsなんかのクライアントサイドMVCのテストとかにも向いてるのかな?今度調べる。

Pythonのformatメソッド

いままでは、なんとなく慣れているという理由で昔ながらのformat(%dとか%s)を使っていたのだけど、最近stringのformatメソッドに切り替えたので、ドキュメントを読んでみた。

文字列のなかで中括弧で挟んで埋め込みを指定するようになっている。conversionは現状repr(!r)かstr(!r)を指定できるようになっているがあまり使わないのでformat_specのほうを。

replacement_field ::=  "{" [field_name] ["!" conversion] [":" format_spec] "}"

Format Specificationによると

format_spec ::=  [[fill]align][sign][#][0][width][,][.precision][type]
fill        ::=  <a character other than '{' or '}'>
align       ::=  "<" | ">" | "=" | "^"
sign        ::=  "+" | "-" | " "
width       ::=  integer
precision   ::=  integer
type        ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

fillは埋め込む文字(デフォルトはspace)

30文字幅で中央寄せでtestという文字を埋め込み、空いてるところは"-"で埋める

>>> "{:-^30}".format("test")
'-------------test-------------'

alignは配置

<は左寄せ、>は右寄せ、^は中央寄せ。=はよくわからん。

signは正負の記号をどう表現するか

正数のときどう表示するかだな。

>>> "{:+05}".format(33)
'+0033'
>>> "{:+05}".format(-33)
'-0033'
>>> "{:-05}".format(33)
'00033'
>>> "{:-05}".format(-33)
'-0033'
>>> "{: 05}".format(33)
' 0033'
>>> "{: 05}".format(-33)
'-0033'

widthは幅で0からはじまる場合は空いてる部分は0で埋める。

>>> "{:05}".format(20)
'00020'

precisionが精度で、小数点以下じゃなくて全体で何桁って感じ。

>>> "{:10.5}".format(10/3.0)
'    3.3333'
>>> "{:10.5}".format(100/3.0)
'    33.333'

最後にfをつけると固定長表記

>>> "{:10.5f}".format(100/3.0)
'  33.33333'
>>> "{:10.5f}".format(10/3.0)
'   3.33333'

comma(,)は1000桁毎にカンマを打つオプションwidthとprecisionの間に入れる

>>> "{:10,}".format(123456789)
'123,456,789'

最後に型指定

  • b: バイナリ
  • c: キャラクタ
  • d: Decimal Integer
  • o: 8進数表記
  • x: 小文字の16進数表記
  • X: 大文字の16進数表記
  • e: 小文字の指数表記
  • E: 大文字の指数表記
  • f:固定長表記
  • g:一般的な表記(デフォルト)

結構素直な表記なので文法見ながら追っかけていったら大体理解できた。