Pybelのペーパーが出てた

なかなか面白い内容だった。

Pybel: a Python wrapper for the OpenBabel cheminformatics toolkit

Pybelボンドとか扱えないような感じなんで、ちょっと複雑なことやろうとすると結局Openbabelのインターフェースからアクセスしちゃうんだよなー。OpenBabelのラッパーとしてPerlMolみたいなの書けばいいんだろうけど。

とか思いながら、OpenBabelのAPIなどみてたら、PerlMolと同等なものを書けそうな気がしてきたので少しやってみることにする。

pydevcamp08w終了

初めてpydevcampに参加したわけですが充実した三日間でした。幹事とセッションリーダーの皆様ありがとうございました。

さて、今回はユニットテストの話とかNodeBoxとか(mac持ってないけど)pylonsとか面白そうな話題が目白押しで色々目移りしたのだけど、電子工作力を強化してきた。

帰りの電車の中でpylonsまわりをいじってみたのだけどAuthKitのあたりがちょっと理解できなかったので、もうちょっとpylons力も強めないとなと思った次第。というか何か作ろう。あとpylonsのMLもできたナイス即参加。

あとは、折角参加するんだったら、なんか発表しないとだめだなぁと。次回はLTでなんか話す気概で臨む。

電子工作のセッション

Gainerというキットとpythonを使うと、信号を受け取ったり信号を外に送ったりとコンピュタの中だけで閉じるのではなく、現実世界へ干渉するということがおこなえると。 フィジカル・コンピューティングというらしいですが、これがわりとお手軽に出来てしまうので驚きですな。

初日はgainerに慣れるということで、LEDを光らせたりとかコードを読んだりとか何をやっているのかを知るのに時間がかかった。

こんな感じでLEDが交互に光るだけでかなり嬉しい。

出力に慣れたら今度は入力を受け取ってみる。センサとしてヴォリュームをつないで抵抗値を変えたりしてみた後は、みんな大好きな?加速度センサーをつないでみる。結構簡単な回路でOK。下のほうにちょこんと刺さっている黒い物体が加速度センサ(小さい)。

1205070143

ぶんぶん振ると、それに応じて入力が変わる。撮りかたが悪いので数字が分からないけど。

これだと、あまり面白くないのでpygameを使って、グラフィカルな表現にしてみる。

1205070128

x,y,zの傾きに応じて四角がそれぞれ動きます。おーすげー。

ここまでくるとあとは思い思いに好きなものをつくりはじめていきます。なんという集中力!ってな感じで黙々と作業。

隣のヒトのブロック崩し。傾きでブロックを打ち返すヤツを制御してる。楽しそう!。

えと、僕は傾きに応じて円の大きさや色を変えて、偽アートっぽいことをしてみたのだけど、うっかりとるのを忘れたので手元に動画がない、という。もう少し綺麗なのを作ったらアップしよう。

あと、リアルチョロQリモート操作がすごかった。電子工作2.0!

さらに、これいじると大空へ羽ばたけるかな?マイハンダごてとか欲しくなりますなー。

ProductName エアロソアラ タトアージュレッド(Bバンド)

タカラトミー / ¥ 2,625 (2006-07-15)


ビジュアル系だとNodeBox on jythonが立ち上がってるし、jythonからprocessing呼ぶっていう手もあるかなーと(それだったら最初からprocessingでって突っ込みは無しで)。

ProductName Built with Processing [改訂版]
前川 峻志,田中 孝太郎
ビー・エヌ・エヌ新社 / ¥ 3,570 ()


Built with Processing [改訂版] も出るらしいのでちょっとアツイかもしれませんな。

いろいろと刺激を受けた三日間だった

plutoでExactMass,分子量,化学式

というわけで、分子量とかformulaとか出せるようにしておいた。

CCC       propane
CC        ethane
c1ccccc1  benzene
CO        methanol

というsmilesを

babel -ismi test.smi -osdf testsdf

で変換したファイルを使った。ExactMassを計算する場合は

>>> from pluto import *
>>> mols = Molecule.readfile("test.sdf")
>>> for mol in mols:
...   print mol.exactmass
...
44.062600256
30.046950192
78.046950192
32.026214748

ついでに分子量と化学式も

>>> from pluto import *
>>> mols = Molecule.readfile("test.sdf")
>>> for mol in mols:
...   print mol.formula, mol.molwt
...
C3H8 44.09562
C2H6 30.06904
C6H6 78.11184
CH4O 32.04186

openbabelにはPerlMolでいうところのcombineみたいなメソッドがないので反応させるところで悩み中。

Elixirをさわってみた

SQLAlchemyにかぶせてActiveRecordとして扱えるらしいElixirを試してみた。チュートリアルを一通り。

面白かったのは継承っぽくかけるとこ。こんな感じでかける。

from elixir import *

metadata.bind = "sqlite:///test.db"
#metadata.bind.echo = True

class Artist(Entity):
    using_options(inheritance='multi')
    name = Field(Unicode(60))

    def __repr__(self):
        return '<Artist "%s">' % self.name

class Technoartist(Artist):
    using_options(inheritance='multi')

    def __repr__(self):
        return '<TechnoArtist "%s">' % self.name

class Houseartist(Artist):
    using_options(inheritance='multi')

    def __repr__(self):
        return '<HouseArtist "%s">' % self.name

class Dnbartist(Artist):
    using_options(inheritance='multi')

    def __repr__(self):
        return '<Drum\'n\'BassArtist "%s">' % self.name

if __name__ == "__main__":
    from model import *
    setup_all()
    create_all()

    technasia = Technoartist(name=u"Technasia")
    louievega = Houseartist(name=u"Louie Vega")
    joeclaussell = Houseartist(name=u"Joe Claussell")
    nutone = Dnbartist(name=u"Nu Tone")
    omnitrio = Dnbartist(name=u"OmniTrio")

    session.flush()

    print "Artist.query.all()"
    print Artist.query.all()
    print "\nDnbartist.query.all()"
    print Dnbartist.query.all()

Artistを探すと、サブクラスにあたるTechnoArtist,HouseArtist,Drum'n'BassArtistが探索される

Artist.query.all()
[<TechnoArtist "Technasia">, <HouseArtist "Louie Vega">, 
<HouseArtist "Joe Claus sell">, <Drum'n'BassArtist "Nu Tone">, 
<Drum'n'BassArtist "OmniTrio">]

Dnbartist.query.all()
[<Drum'n'BassArtist "Nu Tone">, <Drum'n'BassArtist "OmniTrio">]

チュートリアルによると、この先はSQLAlchemyのドキュメント読むのがいいんじゃねーかなと書いてあったので、読んでみる。

あと、このチュートリアルだけだとusing_optionsとかが分からないのでAPI Referenceも読むべしな感じ。

pygameと戯れてみた

Gainerを使うと色々なことが出来そう、且つ楽しそうなんだけど、リアル系の入力を受け取ってコンピュータでどう表示させるかとか、コンピュータからの出力をリアル系でどう表現するかとかいう表現力というか表現のための手段に関する知識が絶対的に不足してるのがもどかしい。

というわけで、pydevcamp2008で消化不良だったpygameのパウアを強めるべく、Pygame入門を一通り読んでみた。

サイズの変更方法とalpha値のいじり方、フルスクリーンのやり方がわかったので、適当に書いた。

コードは短い

import pygame
from pygame.locals import *
import gameutil as gu
from random import random

flip = pygame.display.flip
black = (0,0,0)
TR = pygame.transform

def main():
    screen = gu.init((800,600), 'Transform Test')
    flg_fullscr = False
    mychar = gu.load_image('zeroDB.jpg')
    myrect = mychar.get_rect()
    mode = 0

    while 1:
        screen.fill(black)
            for i in range(8):
            for j in range(5):
                nchar = TR.rotozoom(mychar, 0, random()*2)
                nchar.set_alpha(127)
                screen.blit(nchar, (100*i+random()*10,150*j+random()*10))

        flip()

        for event in pygame.event.get():
            if event.type == QUIT: 
                return
            if (event.type == KEYDOWN and
                event.key  == K_ESCAPE): 
                return
            if (event.type == KEYDOWN and
                event.key  == K_z): 
                if flg_fullscr:
                    screen = pygame.display.set_mode((640,480))
                    flg_fullscr = False
                else:
                    screen = pygame.display.set_mode((640,480),
                                                     pygame.FULLSCREEN)
                    flg_fullscr = True

if __name__ == '__main__':
    main()

zキーを押すとフルスクリーンになってエスケープで終了。

あーあとこの本が欲しい。

pygtkとかpycairoを入れるときのメモ

BKChemという分子構造式エディタがあって、pythonで書かれているうえに、スクリーンショットみると構造なんかも綺麗。で、バッチ処理もできるらしいので、ちょいとこれを使ってみるかなとWindowsのバイナリ配布のやつを入れてみた。

だが、ありがちなことに、このバイナリ版はバッチ処理が出来なかったのでソースから入れたけどpycairoを要求してきたのでGTK関連を一式インストール。

GTK+のバイナリはgtk.orgからAll-in-one bundleってのを落としてきて、c:\gtk2とでも名前を変えてパスを切っておく。

で、python bindingはここのを使った。というよりeasy_installではうまく入らなかった。

これでBKChemはすんなりインストールできる。実行ファイルはC:\Python25\Lib\site-packages\bkchem\bkchem.pyだった。

bkchem.py -b batch.py args

という書式でバッチ処理が行われるようになったのでsdf2pngみたいな処理を行わせればcdkの代わりに使えるはず。

pycairo自体も結構面白そうなのでsampleをやってみた。

triangle

他にもチュートリアルがあるのであとで読もう。

pycairoでアンパンマン

普段は娘にお絵かき先生で散々描かせられているのでアンパンマン、しょくぱんまん、バイキンまん、カレーパンまん、ドキンちゃん、ホラーマン位は鼻歌混じりでかけるようになってる。

というわけで、アンパンマンをpycairoで。

import cairo
import math

pi = math.pi
WIDTH, HEIGHT = 400, 400

# Setup Cairo
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, WIDTH, HEIGHT)
ctx = cairo.Context(surface)

# Set thickness of brush
ctx.set_line_width(15)
ctx.set_source_rgba (1, 0.2, 0.2, 0.7);
ctx.arc(200, 210, 180, 0, 360 * (pi/180.0));
ctx.stroke()

#左目と眉
ctx.arc(125, 150, 50, -180 * (pi/180.0), 0 * (pi/180.0));
ctx.stroke()
ctx.arc(125, 170, 30, -180 * (pi/180.0), 360 * (pi/180.0));
ctx.fill()

#右目と眉
ctx.arc(275, 150, 50, -180 * (pi/180.0), 0 * (pi/180.0));
ctx.stroke()
ctx.arc(275, 170, 30, -180 * (pi/180.0), 360 * (pi/180.0));
ctx.fill()

#はな
ctx.arc(200, 250, 40, 0, 360 * (pi/180.0));
ctx.stroke()

#ほっぺ
ctx.arc(90, 250, 40, -90 * (pi/180.0), 90 * (pi/180.0));
ctx.stroke()
ctx.arc(310, 250, 40, 90 * (pi/180.0), -90 * (pi/180.0));
ctx.stroke()

#くち
ctx.arc(200, 305, 60, 0 * (pi/180.0), 180 * (pi/180.0));
ctx.close_path()
ctx.stroke()

#ctx.arc(250, 100, 50, -90 * (pi/180.0), 90 * (pi/180.0));


# Output a PNG file
surface.write_to_png("anpan.png")

anpanman

pycairoで一筆書きってのも面白いかも。

あと、タブレットなお絵かき先生に、flickrっぽいアップロードサイトを組み合わせたサービスはどうだろうか?

お絵かき先生2.0ってな感じで、子供の落書きとその成長に合わせた写真をタグ付けしながら、アルバムにしたりできるサービスとデバイスを一緒に売りつけるみたいな。

pythonでファイル出力と標準出力を切り替える

コマンドラインのツール書いてるとデフォルトは標準出力に書き出して、オプションでファイル名を指定したときにファイルに書き出したいときはよくあることだと思う。 で、そんなコードの定石はあるのだろうかと。オプションはoptparseやgetoptを利用すればよいのだろうが、、、

import sys,getopt

opts, args = getopt.getopt(sys.argv[1:], "o:", ["output="])

f = sys.stdout

for o, a in opts:
    if o in ("-o", "--output"):
        f = open(a,'w')

f.write("python python\npppppython")

とりあえずこんな感じで書いてみたがもっといい書き方はあるのかな。

みえないラムダが見えてきたヨ(あと括弧)。

SICPのおともにpythonインタプリタとかperlshとかmochikitのインタプリタなんかを併用すんだけど。

mapで遊んでみるわけだ、

perlだと

main[118]$ @numbers = (1,2,3,4,5)
main[120]$ map $_+5 , @numbers
6
...
10

なわけで、pythonだと

>>> numbers = [1,2,3,4,5]
>>> map(lambda (x): x +5 , numbers)
[6, 7, 8, 9, 10]

さて、SICPでググルとすぐに目に飛び込んでくる『計算機プログラムの構造と解釈』についてに引用されている、あのフレーズを思い浮かべる。

弟子が尋ねた。「先生、私は先生がカッコをまるで魔術師の ように扱っているのを常々敬服しています。どうすれば先生のようになれ るのでしょうか?」 師「えっ? カッコ? あ、そうか。そんなものもあったな。いやあ、 すっかり忘れておったわ」

perlだと忘れてるどころか、そもそも括弧もないしラムダもないわけだ。でさらに、YAPC2006でのバベルの話が頭をよぎった。

つまり最近lispが楽しいのはperlのせいに違いないと。

ProductName 計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン,ジュリー サスマン,ハロルド エイブルソン
ピアソンエデュケーション / ¥ 4,830 ()
在庫あり。

しかし、SICP in other languagesにperlがないですな。

pythonでHTTPのgzipデータを読み込む

Fetching PDB files remotely in pure Python codeを見つけて、 数行でpdbのファイルをフェッチできるなんてやるなRCSBとpythonのコンボとか思ったんだけど、コメントに「生でフェッチすんのは環境に悪いでよ」とか書いてあった。

確かにPDB界ではgzip圧縮したpdbファイルをとってきてローカルで展開すんのが昔からのナラワシだよなと、試しにgzとかZをくっつけてwgetしてみるとその通りのファイルがダウンロードできた。をを。

で、おーこれは、数行スクリプトにgzipモジュールかませばいいだけなんじゃなかろうかと思て書き書きしてみたが、これってファイルしかとれないのかな?

zlibならどうだといじってみたけど、

>>> import urllib
>>> import zlib
>>> url = 'http://www.rcsb.org/pdb/files/1ab6.pdb.gz'
>>> text = urllib.urlopen(url).read()
>>> zlib.decompress(text)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
zlib.error: Error -3 while decompressing data: incorrect header check

なんかヘッダがーっておこられた。やっぱgzipでなんとかすべきなのか? ともうちっと追いかけたらGzipFileのほうを使えばよいらしいことに辿りついた。

>>> import gzip, StringIO, urllib
>>> url = 'http://www.rcsb.org/pdb/files/1ab6.pdb.gz'
>>> content = urllib.urlopen(url).read()
>>> sf = StringIO.StringIO(content)
>>> dec = gzip.GzipFile(fileobj=sf)
>>> data = dec.read()

ちと長いがこれで読めた。というわけで、

>>> import urllib, StringIO, gzip
>>> def fetch_pdb(id):
...     url = 'http://www.rcsb.org/pdb/files/%s.pdb.gz' % id
...     content = urllib.urlopen(url).read()
...     sf = StringIO.StringIO(content)
...     return gzip.GzipFile(fileobj=sf).read()

ちょっと長くなったけど帯域にやさしい。