pylonsにはpaster shell

pylonsで対話的にモデルを操作したい場合にはdevelopment.iniのあるディレクトリで

paster shell

とすればよいらしい。modelっていう変数に色々入っているので

session = model.Session
mol = model.Mol
for m in session.query(mol).filter(mol.MW > 199):
    print m

などとやるべしナ感じ。

c++のキャストとか

openbabelがC++で書かれているので、今年はC++を覚えようと。

int a = (int)('0'); // 48

これはpythonでいうord

>>> ord("0")
48

で、最初よく分からなかったのでこれ。

(char)(5 + '0'); // 5

結局

int a = 5 + '0'; // 53

となっているからint + charみたいなのもよろしくやっといてくれるっちゅう理解でいいのかな。

とりあえずクックブックでも買うべきか。

ProductName C++実践プログラミング
スティーブ オウアルライン
オライリージャパン / ¥ 6,090 ()
在庫あり。

ProductName C++クックブック
D. Ryan Stephens,Christopher Diggins,Jonathan Turkanis,Jeff Cogswell
オライリー・ジャパン / ¥ 4,515 ()
在庫あり。

jython+processingでwebカメラで取り込むサンプル

usbカメラを買ったので早速遊んでいる。ちなみに奥に見える黄色いのはjython本じゃなくて独習C++とかいう本。

webcam

drawメソッドでピクセルをいじくると色々とエフェクトがかけられるわけです。

from javax.swing import JFrame
from processing.core import PApplet
from processing.video import *

class Sketch(PApplet):
    def __init__(self):
        pass

    def getField(self, name):
        return self.class.superclass.getDeclaredField(name).get(self)

    def setup(self):
        self.size(320, 240)
        self.camera = Capture(self, 320, 240, 12)

    def draw(self):
        self.camera.read()        
        self.image(self.camera, 0,0)

def run(applet):
    frame = JFrame(title="Processing camera",
                   resizable = 1,
                   defaultCloseOperation=JFrame.EXIT_ON_CLOSE)
    frame.contentPane.add(applet)
    applet.init()
    frame.pack()
    frame.visible = 1

if __name__ == '__main__':
    run(Sketch())

jython本が待ち遠しい。

ProductName Jythonプログラミング
西尾 泰和
毎日コミュニケーションズ / ¥ 3,150 ()
在庫あり。

ビューティフルコード

最初サンプルみたときにはちょっと理解できなさそうだったので保留にしてたけど、bioperlとかpythonの話が面白そうだったのでポチッた。

ProductName ビューティフルコード
Brian Kernighan,Jon Bentley,まつもとゆきひろ
オライリージャパン / ¥ 3,990 ()
在庫あり。

pylonsのroutes.py

pylonsのRoutesがドキュメントみてもいまいちわからんとか思ってたんだけど、RoRのドキュメント読んだらさっくりと理解できそうな気がしてきたところで、routing.pyをいろいろいじってみたらなんとなく理解した感じ。

python magazine

そういえばpython magazineの最新号にbiopythonの特集が載ってたので買って読んだんだけど、なんていうか入門的な内容でいまいち楽しめなかった。

むしろpytableのほうが面白かった。pylabなんかと連携させて使うのがよいらしい。自分でオリジナルな計算かけたときのフォーマットとして使ってみようかな。

makoでutf-8を埋め込みたいとき

先頭行にcoding: utf-8と書いておけばいい。

そうしないとこんなエラーが出る。

CompileException: Could not read template using encoding of 'ascii'. Did you forget a magic encoding comment? in file

最初わからなかったけれど、あーそういうことねというメッセージだった。

jythonプログラミング読了

次の二つの章が特に面白かった。

  • 5 Pythonから見たオブジェクト指向
  • 7 Jythonの応用例

ProductName Jythonプログラミング
西尾 泰和
毎日コミュニケーションズ / ¥ 3,150 ()
在庫あり。

単なるjythonの使い方の本というよりは、jythonのような複数の言語を混ぜ合わせた処理系を通して見えるものを感じ取りましょう的な内容だったように思う。あとその場合に固さやわらかさの長所をうまくのばしてやるようなプログラミングのお作法はこんな感じですよみたいな指針。

perlでもInline系のモジュールを使えば直接他の言語を埋め込んだりできて他言語のライブラリを使えるけど、言語自体が両方の世界に干渉できるともっと楽ができる。

Inline::みたいなやり方でも、jythonみたいなシームレスな言語でも結局複数の言語を理解してないとうまいことやれないので、その分習得コストはかかると思うんだけど、シームレスな言語使うと楽しいのはスケッチするような感覚が得られることなのかなと思ってる。

そういう意味ではGainerも似たような感じかも。

ProductName Make: Technology on Your Time Volume 04
オライリー・ジャパン
オライリージャパン / ¥ 1,575 ()
在庫あり。

あとシームレスな言語を使うっていうことはそれにあわせてライブラリのほうも対応していかないといくのが望ましいのかなとPybel as a generic API for cheminformatics libraries - proof of concept using CDKというエントリを見てふと思った。

chemoinformaticsだとopenbabelっていうc++の大きいライブラリとCDKっていうjavaのライブラリがあって、その上にpython(とruby)がまたがっている感じなのだけど、さらにこれらでいじくったデータを解析にもっていくためにRが必要だったりとかするのでRpyが役に立ったりする。

pythonの辞書実装

Beautiful codeは予想してたよりも二倍くらい分厚かった。あとエッセイ集なので、好きなところから読み始める事ができるし、ちょっとした時間があるときに暇つぶし代わりに読めたりしてよさげ。

とりあえず、最初の方と最後のほうの対談を読んで、29章のまつもとゆきひろさんの「エッセイのごときプログラム」を読んで、そのうちRubyもなんて思った。

ProductName ビューティフルコード
Brian Kernighan,Jon Bentley,まつもとゆきひろ
オライリージャパン / ¥ 3,990 ()
在庫あり。

さて、18章はpythonにおける辞書実装の話。

[アルゴリズム百選 - ハッシュを再発明する](アルゴリズム百選 - ハッシュを再発明する)はリストを使う方法で実装していて、これはchainingと呼ぶらしい。

pythonはopen addressingという往々で空きスロットを探しているらしい。線形探査でなくとびとびに探していくことでブロックの発生を抑える効能があるらしい。

イメージできないのでスロットを探していく順番を見てみた。32個のスロットでハッシュ値が8の場合はまずスロット8を探すけど埋まっている場合に次はどこを探すのか。

use strict;
use warnings;
use Perl6::Say;

my $ma_mask = 31;
my $hash = 8;
my $pertub = $hash;
my $slot = $hash; 

for my $i (0..31) {
  $slot = (5 * $slot) + 1 + $pertub;
  $pertub >>= 5;
  $slot %= 32;
  say "[ $i ] slot:$slot, pertub:$pertub";
}

こんな感じ?

[ 0 ] slot:17, pertub:0
[ 1 ] slot:22, pertub:0
[ 2 ] slot:15, pertub:0
[ 3 ] slot:12, pertub:0
[ 4 ] slot:29, pertub:0
[ 5 ] slot:18, pertub:0
[ 6 ] slot:27, pertub:0
[ 7 ] slot:8, pertub:0
[ 8 ] slot:9, pertub:0
[ 9 ] slot:14, pertub:0
[ 10 ] slot:7, pertub:0
[ 11 ] slot:4, pertub:0
[ 12 ] slot:21, pertub:0
[ 13 ] slot:10, pertub:0
[ 14 ] slot:19, pertub:0
[ 15 ] slot:0, pertub:0
[ 16 ] slot:1, pertub:0
[ 17 ] slot:6, pertub:0
[ 18 ] slot:31, pertub:0
[ 19 ] slot:28, pertub:0
[ 20 ] slot:13, pertub:0
[ 21 ] slot:2, pertub:0
[ 22 ] slot:11, pertub:0
[ 23 ] slot:24, pertub:0
[ 24 ] slot:25, pertub:0
[ 25 ] slot:30, pertub:0
[ 26 ] slot:23, pertub:0
[ 27 ] slot:20, pertub:0
[ 28 ] slot:5, pertub:0
[ 29 ] slot:26, pertub:0
[ 30 ] slot:3, pertub:0
[ 31 ] slot:16, pertub:0

SRM162-DIV2-250

最小と最大の数を与えられた時にそのレンジの数の最小公倍数を求める。

順繰りにかけていって、その際に最大公約数で割ってく。最大公約数はユークリッドの互除法で。

def lcm(first,last):
    l =1  
    for i in range(first,last):
        l = l * i / gcd(l,i)
    return l 

def gcd(a,b):
    if(b==0): return a
    return gcd(b, a % b)

print lcm(1,5)
print lcm(4,5)
print lcm(1,12)

実行

/usr/bin/python  /Users/kzfm/python/lcmr.py 
12
4
27720