12012010 Python
enumerateなんて知らんかった
>>> for i in enumerate(range(5,10)):
... print i
...
(0, 5)
(1, 6)
(2, 7)
(3, 8)
(4, 9)
12012010 Python
enumerateなんて知らんかった
>>> for i in enumerate(range(5,10)):
... print i
...
(0, 5)
(1, 6)
(2, 7)
(3, 8)
(4, 9)
12012010 chemoinformatics Python pluto
こんな感じで。 titleとかはmol.title("newtitle")にしたほうがいいのかこのままでいいのか決めかねているのでそのうちちゃんと考える。
エタンをエチレンに変えてみた
>>> from pluto import *
>>> mol = Molecule.readstring("CC\tethane")
>>> mol.bond([1,2]).order(2)
>>> mol.title = "ethylene"
>>> mol.writestring()
'C=C\tethylene\n'
あとはmolecule同士のの結合とatomの追加と削除を実装すればよさそう
12012010 chemoinformatics Python pluto
PythonでもPerlMolみたいに化学反応を手軽に扱えるツールが欲しいなぁという欲求があったので書いてみることにした。PybelみたいなOpenBabelのラッパーだけど。
そういえば、PyMOLやPyChemという、それっぽい名前は既に使われてるんですよな。
で、アトムにちなんでみた。
でも、国内しかわからなんだろうな。海外だとastro boyなんでしょ?まぁいいや。
>>> from pluto import *
>>> mol = Molecule.readstring("c1ccccc1O")
>>> mol.title = "phenol"
>>> mol.writestring()
'c1c(cccc1)O\tphenol\n'
とりあえず、readとwriteまではできた。SMARTSのクラスも作ってあるのだけどアトムばっか返ってきてボンドの返し方がよく分からん。
diels-alder反応ぐらいまで書けるようにするとこまではとっととやる。
12012010 Python
ここ数日unittest使ってみたんだけどなんかちょっと窮屈な感じがするのでもうちょっと楽にテストを書きたいなぁと思った。それから、自分ひとりで開発するときにはなんか変更を加えたタイミングでテストを走らせたいし、出来れば勝手に走るとうれしい。
そんな感じのテストのフレームワークはないかと探したところ、py.testにたどり着いた。ほぼ日本語化されたマニュアルもあった。
使い方は、例えばmodule.pyとtest_module.pyっていうファイルを作って
pytest -vf
と-fオプションをつけるとコマンドを実行したディレクトリを監視するようになって、ファイルが更新されるたびにテストが走るようになる(vは冗長モード)。
doctestもサポートしているらしいのでこれもあとで試してみる。
Python版のmodule-starterみたいなもんはないのかなとつぶやいたらPasteが使えることを教えてもらった。ありがとうございます。
しかしよりによってPasteがこんな風に使えるとは。
paster create -t pylons helloworld
pylonの組み込みコマンドの癖に-t pylonsってなんじゃそらとか思ってたのだけど実は組み込みコマンドじゃなかったという。
Pasteの使い方は
paster create mymodule
で対話的に入力していって答え終わると雛形完成。でディレクトリに移って
hg init
hg add
hg commit
までやるとあら不思議、分散リポジトリに管理されたPythonのモジュールスケルトンが数分で出来あがり。
ここまでやると、開発、実行(テスト)、リポジトリの管理がMeadowで全部出来るので楽チン。
あとsetuptoolsとか覚える
12012010 chemoinformatics Python
なかなか面白い内容だった。
Pybel: a Python wrapper for the OpenBabel cheminformatics toolkit
Pybelボンドとか扱えないような感じなんで、ちょっと複雑なことやろうとすると結局Openbabelのインターフェースからアクセスしちゃうんだよなー。OpenBabelのラッパーとしてPerlMolみたいなの書けばいいんだろうけど。
とか思いながら、OpenBabelのAPIなどみてたら、PerlMolと同等なものを書けそうな気がしてきたので少しやってみることにする。
初めてpydevcampに参加したわけですが充実した三日間でした。幹事とセッションリーダーの皆様ありがとうございました。
さて、今回はユニットテストの話とかNodeBoxとか(mac持ってないけど)pylonsとか面白そうな話題が目白押しで色々目移りしたのだけど、電子工作力を強化してきた。
帰りの電車の中でpylonsまわりをいじってみたのだけどAuthKitのあたりがちょっと理解できなかったので、もうちょっとpylons力も強めないとなと思った次第。というか何か作ろう。あとpylonsのMLもできたナイス即参加。
あとは、折角参加するんだったら、なんか発表しないとだめだなぁと。次回はLTでなんか話す気概で臨む。
Gainerというキットとpythonを使うと、信号を受け取ったり信号を外に送ったりとコンピュタの中だけで閉じるのではなく、現実世界へ干渉するということがおこなえると。 フィジカル・コンピューティングというらしいですが、これがわりとお手軽に出来てしまうので驚きですな。
初日はgainerに慣れるということで、LEDを光らせたりとかコードを読んだりとか何をやっているのかを知るのに時間がかかった。
こんな感じでLEDが交互に光るだけでかなり嬉しい。
出力に慣れたら今度は入力を受け取ってみる。センサとしてヴォリュームをつないで抵抗値を変えたりしてみた後は、みんな大好きな?加速度センサーをつないでみる。結構簡単な回路でOK。下のほうにちょこんと刺さっている黒い物体が加速度センサ(小さい)。

ぶんぶん振ると、それに応じて入力が変わる。撮りかたが悪いので数字が分からないけど。
これだと、あまり面白くないのでpygameを使って、グラフィカルな表現にしてみる。

x,y,zの傾きに応じて四角がそれぞれ動きます。おーすげー。
ここまでくるとあとは思い思いに好きなものをつくりはじめていきます。なんという集中力!ってな感じで黙々と作業。
隣のヒトのブロック崩し。傾きでブロックを打ち返すヤツを制御してる。楽しそう!。
えと、僕は傾きに応じて円の大きさや色を変えて、偽アートっぽいことをしてみたのだけど、うっかりとるのを忘れたので手元に動画がない、という。もう少し綺麗なのを作ったらアップしよう。
あと、リアルチョロQリモート操作がすごかった。電子工作2.0!
さらに、これいじると大空へ羽ばたけるかな?マイハンダごてとか欲しくなりますなー。
ビジュアル系だとNodeBox on jythonが立ち上がってるし、jythonからprocessing呼ぶっていう手もあるかなーと(それだったら最初からprocessingでって突っ込みは無しで)。
Built with Processing [改訂版] も出るらしいのでちょっとアツイかもしれませんな。
いろいろと刺激を受けた三日間だった
12012010 chemoinformatics Python pluto
というわけで、分子量とか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みたいなメソッドがないので反応させるところで悩み中。
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も読むべしな感じ。
12012010 Python
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キーを押すとフルスクリーンになってエスケープで終了。
Beginning Game Development With Python and Pygame: From Novice to Professionalあーあとこの本が欲しい。