NodeBoxでiSightを使う

ここみた。

test

NodeBoxも楽しいなぁ

pythonでユークリッド距離

haskellのK-meansのソース読んでたら

dist a b = sqrt . sum $ zipWith (\x y-> (x-y) ^ 2) a b

ってのがあって、pythonでzipWithってあったかなーと思って検索したら、自分のwikiが引っかかった。★付けたいところ。

これをつかうと

from math import *
zipWith = lambda f, xs, ys : [f(x, y) for x,y in zip(xs, ys)]
def dist(xs, ys): return sqrt(sum(zipWith(lambda x, y: (x-y)**2, xs, ys)))

となって、任意の次元にも対応出来る

>>> dist([1,2,3,4],[2,2,2,2])
2.4494897427831779

迷路解いた(A*で)

A*で解いてみた。距離はマンハッタン使った。

迷路やった

maze = ["**************************",
        "*S* *                    *",
        "* * *  *  *************  *",
        "* *   *    ************  *",
        "*    *                   *",
        "************** ***********",
        "*                        *",
        "** ***********************",
        "*      *              G  *",
        "*  *      *********** *  *",
        "*    *        ******* *  *",
        "*       *                *",
        "**************************"]
start    = ()
goal     = () 
max = len(maze) + len(maze[0])

for (h,line) in enumerate(maze):
    for (w,word) in enumerate(line):
        if   word == 'S': start = (h,w)
        elif word == 'G': goal  = (h,w)

checked = [start]
sol = [start]

def add_route(r):
    (h,w) = r[-1]
    cand = [c for c in [(h+1,w),(h-1,w),(h,w+1),(h,w-1)] if c not in checked and not_wall(c)]
    if len(cand) == 0:
        return r[:-1]
    else:
        sol = (); cost = max
        for c in cand:
            c_cost = calc_cost(c)
            if c_cost < cost:
                cost = c_cost
                sol = c
        r.append(sol)
        checked.append(sol)
        return r

def not_wall(p): (h,w) = p; return  maze[h][w] != '*'
def calc_cost(p): return (abs(goal[0]-p[0]) + abs(goal[1]-p[1]))
def check_goal(sol): return sol[-1] != goal

def draw_sol(sol):
    solved_maze = ''
    for (h,line) in enumerate(maze):
        for (w,word) in enumerate(line):
            if (h,w) in sol[1:-1]:
                solved_maze += '$'
            else:
                solved_maze += word
        solved_maze += '\n'
    return solved_maze

while check_goal(sol): sol = add_route(sol)
print draw_sol(sol)

実行結果

$ python maze_aster.py
**************************
*S* * $$$                *
*$* *$$*$ *************  *
*$* $$* $  ************  *
*$$$$*  $$$$$$$          *
**************$***********
* $$$$$$$$$$$$$          *
**$***********************
* $$$$$*$$$$$$$$$$$$$$G  *
*  *  $$$ *********** *  *
*    *        ******* *  *
*       *                *
**************************

迷路やった

この問題

maze = ["**************************",
        "*S* *                    *",
        "* * *  *  *************  *",
        "* *   *    ************  *",
        "*    *                   *",
        "************** ***********",
        "*                        *",
        "** ***********************",
        "*      *              G  *",
        "*  *      *********** *  *",
        "*    *        ******* *  *",
        "*       *                *",
        "**************************"]
solution = []
start    = ()
goal     = () 
max = (len(maze)-2) * (len(maze[0])-2)

for (h,line) in enumerate(maze):
    for (w,word) in enumerate(line):
        if   word == 'S': start = (h,w)
        elif word == 'G': goal  = (h,w)

checked = [start]

def add_route(sols):
    newroute = []
    for sol in sols:
        (h,w) = sol[-1]
        if ((h+1,w) not in checked) and maze[h+1][w] != '*':
            nr = list(sol)
            nr.append((h+1,w))
            checked.append((h+1,w))
            newroute.append(nr)
        if ((h-1,w) not in checked) and maze[h-1][w] != '*':
            nr = list(sol)
            nr.append((h-1,w))
            checked.append((h-1,w))
            newroute.append(nr)
        if ((h,w+1) not in checked) and maze[h][w+1] != '*':
            nr = list(sol)
            nr.append((h,w+1))
            checked.append((h,w+1))
            newroute.append(nr)
        if ((h,w-1) not in checked) and maze[h][w-1] != '*':
            nr = list(sol)
            nr.append((h,w-1))
            checked.append((h,w-1))
            newroute.append(nr)
    return newroute

def check_goal(sols):
    for sol in sols:
        if sol[-1] == goal:
            print draw_sol(sol)
            exit

def draw_sol(sol):
    solved_maze = ''
    for (h,line) in enumerate(maze):
        for (w,word) in enumerate(line):
            if (h,w) in sol[1:-1]:
                solved_maze += '$'
            else:
                solved_maze += word
        solved_maze += '\n'
    return solved_maze

sols = [[start]]

for i in range(max):
    sols = add_route(sols)
    check_goal(sols)

ちょっと長い

$ python maze.py
**************************
*S* *$$$$                *
*$* *$ *$ *************  *
*$*$$$* $  ************  *
*$$$ *  $$$$$$$          *
**************$***********
* $$$$$$$$$$$$$          *
**$***********************
* $$$  *$$$$$$$$$$$$$$G  *
*  *$$$$$ *********** *  *
*    *        ******* *  *
*       *                *
**************************

ダイクストラ法とA*アルゴリズムの違いをあとで読む

pylonsはじめました

pylonsはじめました。なかなか面白そうです。

とりあえず、getting startedflickr search tutorialはやってみた。

catalystとかJiftyとかturbogearsとか(RoRもそうだっけか?)はとりあえずプロジェクトを用意して何も考えずサーバー起動してアクセスすると小洒落た画面がでてきて、おー!ってちょっとした感動を覚えたりするんだけどpylonsの場合はそういうのなしの方向で。

ただ、エラー吐かすとなんかすごいよ。エラーから入らせるとは、、、テストファースト?

QuickWiki Tutorialに続く、、、

python2.5でBioPythonを使う

python2.5に入れる場合はNumericがsourceforgeになかったり、MxTextToolsの古いバージョンを入れたりとか、いろいろとあれなので、ドキュメント読みましょうってことです。

で、RCSBからgz圧縮されたpdbファイルをとりにいってBioPythonで扱うサンプル

import urllib2, StringIO, gzip
from Bio.PDB.PDBParser import PDBParser

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

if __name__ == "__main__":
    p=PDBParser(PERMISSIVE=1)
    s=p.get_structure("1bgw", fetch_pdb("1bgw"))

    for model in s.get_list():
        for chain in model.get_list():
            for residue in chain.get_list():
                if residue.has_id("CA"):
                    ca_atom=residue["CA"]
                    print ca_atom.get_coord()

ところで、製薬系のドラッグデザインっていうかchemoinformaticsなSoftwareはpythonで拡張できるものが多いんだけれども、その割にはpythonでガリガリ書くよっていうヒトはあんまし見かけたことないんですよね。

pylonsでQuickWIki

またwikiかよ、、、と敬遠しがちなWikiを作ろうチュートリアルだけど、フレームワーク自体はじめてのヒト向けには素直に書かないといけないし、幾つかのフレームワークを渡り歩いたヒトにも新たな発見とか他のフレームワークとの違いを見せるようなサンプルにしないといけないので、意外と構成を考えるのが難しいですな。

そういった意味ではpylonsでwikiを作ろうチュートリアルはdeleteの実装がajaxでのドラッグドロップになってて、しかも簡単に実装できる!っていう喜びが得られてナイスな感じ。

  • modelまわり
  • 他のパッケージの依存や自動インストールのやり方
  • ルーティングの方法
  • Ajax関連

ルーティング周りをちょっとよく理解していないのと、Ajaxがあっさり書けすぎてて何をやっているのかわからなかったので、あとでpylonsでなんか作ってみよう。

Bioinformatics Programming in Python

Bioinformatics Programming in Python: A Practical Course for Beginners という書籍が出るらしい。

ProductName Bioinformatics Programming in Python: A Practical Course for Beginners
Ruediger-Marcus Flaig
Wiley-VCH / ¥ 7,525 ()
通常1~3週間以内に発送

TOC見る限りはあんま欲しいとは思わないけど、他にもpythonでbioinformaticsという本が2冊くらいは出るらしいので、そっちのほうに期待。

pythonで画像のリサイズ

PILを使うと簡単にかける

Image.open(f).resize((480,360)).save(outfile)

と書くだけで読み込んでリサイズして別名で保存できる。そんな感じで、とりあえずflickrのかわりに、リサイズして保存したらmarkdown書式でURLを出力するようなスクリプトを書いた。

import sys,datetime
import Image

if len(sys.argv) < 2:
  print sys.argv[0], " image_file"

for f in sys.argv[1:]:
  now = datetime.datetime.now().strftime('%s')
  outfile =  "/var/www/html/images/blog/" + now + ".jpg"
  Image.open(f).resize((480,360)).save(outfile)
  print r"![%s](http://www.kzfmix.com/images/blog/%s)" % (now,now + ".jpg")

1203853093

あとはドラッグドロップで転送するようにする

PILの画像の圧縮

昨日のPILのリサイズ後のザラザラ感が気になったので、フィルタを比較してみた。きろくを圧縮

左上から右下に向かってnearest,bilinear,bicubic,antialias

nearest bilinear bicubic antialias

antialiasが無難か。