12012010 perl bioinformatics Python
最初サンプルみたときにはちょっと理解できなさそうだったので保留にしてたけど、bioperlとかpythonの話が面白そうだったのでポチッた。
12012010 perl bioinformatics Python
最初サンプルみたときにはちょっと理解できなさそうだったので保留にしてたけど、bioperlとかpythonの話が面白そうだったのでポチッた。
pylonsのRoutesがドキュメントみてもいまいちわからんとか思ってたんだけど、RoRのドキュメント読んだらさっくりと理解できそうな気がしてきたところで、routing.pyをいろいろいじってみたらなんとなく理解した感じ。
12012010 bioinformatics Python
そういえばpython magazineの最新号にbiopythonの特集が載ってたので買って読んだんだけど、なんていうか入門的な内容でいまいち楽しめなかった。
むしろpytableのほうが面白かった。pylabなんかと連携させて使うのがよいらしい。自分でオリジナルな計算かけたときのフォーマットとして使ってみようかな。
そうしないとこんなエラーが出る。
CompileException: Could not read template using encoding of 'ascii'. Did you forget a magic encoding comment? in file
最初わからなかったけれど、あーそういうことねというメッセージだった。
12012010 chemoinformatics Python jython java
次の二つの章が特に面白かった。
単なるjythonの使い方の本というよりは、jythonのような複数の言語を混ぜ合わせた処理系を通して見えるものを感じ取りましょう的な内容だったように思う。あとその場合に固さやわらかさの長所をうまくのばしてやるようなプログラミングのお作法はこんな感じですよみたいな指針。
perlでもInline系のモジュールを使えば直接他の言語を埋め込んだりできて他言語のライブラリを使えるけど、言語自体が両方の世界に干渉できるともっと楽ができる。
Inline::みたいなやり方でも、jythonみたいなシームレスな言語でも結局複数の言語を理解してないとうまいことやれないので、その分習得コストはかかると思うんだけど、シームレスな言語使うと楽しいのはスケッチするような感覚が得られることなのかなと思ってる。
そういう意味ではGainerも似たような感じかも。
あとシームレスな言語を使うっていうことはそれにあわせてライブラリのほうも対応していかないといくのが望ましいのかなとPybel as a generic API for cheminformatics libraries - proof of concept using CDKというエントリを見てふと思った。
chemoinformaticsだとopenbabelっていうc++の大きいライブラリとCDKっていうjavaのライブラリがあって、その上にpython(とruby)がまたがっている感じなのだけど、さらにこれらでいじくったデータを解析にもっていくためにRが必要だったりとかするのでRpyが役に立ったりする。
12012010 Python
Beautiful codeは予想してたよりも二倍くらい分厚かった。あとエッセイ集なので、好きなところから読み始める事ができるし、ちょっとした時間があるときに暇つぶし代わりに読めたりしてよさげ。
とりあえず、最初の方と最後のほうの対談を読んで、29章のまつもとゆきひろさんの「エッセイのごときプログラム」を読んで、そのうちRubyもなんて思った。
さて、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
最小と最大の数を与えられた時にそのレンジの数の最小公倍数を求める。
順繰りにかけていって、その際に最大公約数で割ってく。最大公約数はユークリッドの互除法で。
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
12012010 chemoinformatics perl Python jython jruby
jythonがmacbookにインストールできなかったのでとりあえずlinuxで。
といってもgcjだとエラーを吐くので、sunのjavaをインストール。 ここみて設定。alternativeコマンドを使うとjavaの共存ができるのね。いままで、シンボリックリンクを上書きしてたのでめんどいなーと思ってたけど、これだとらくちん。
jythonをインストールしたら、あとはopsinのjarを落としてきてクラスパスに通す。
>>> import uk.ac.cam.ch.wwmm.opsin as opsin
>>> opsin.NameToStructure().parseToCML("4-iodobenzoic acid").toXML()
二行でIUPAC名がCMLに。 すばらしい。
jrubyの例もある。
ちなみにjrubyはmacbookにさくっと入って、この例の通りにやれば動いた。
perlで同じ事をやる場合にはInline::Javaを使ってやればいいけど、Javaのライブラリを有効に利用するのはJavaで実装された言語処理系がやっぱ楽だ。
JRubyとかjythonとかはCGI書くのに苦労するよなとかつぶやいてみたけどjythonではSimpleHTTPSeverが使えることに気づいた。
% jython
Jython 2.2.1 on java1.6.0_06
Type "copyright", "credits" or "license" for more information.
>>> import SimpleHTTPServer
>>> SimpleHTTPServer.test()
Serving HTTP on 0:0:0:0:0:0:0:0 port 8000 ...
192.168.11.xx - - [26/Jun/2008 21:34:28] "GET / HTTP/1.1" 200 -
192.168.11.xx - - [26/Jun/2008 21:34:28] code 404, message File not found
192.168.11.xx - - [26/Jun/2008 21:34:28] "GET /favicon.ico HTTP/1.1" 404 -
あーでも、これだと、結局jythonスクリプトでCGI実行しないとあかんからうまくいかんわ。
というわけで、明日は会社にWebアプリ編を持ってってjythonでwebappサーバーつくるのにチャレンジ。
なんかやる気出てきた。
Programming Collective Intelligenceを読み始めた。
Programming Collective Intelligence: Building Smart Web 2.0 Applications英語だとスペースで分割すれば単語に分けられるのだけど、日本語は品詞分解できないと類似度を計れないしクラスタリングもできないので、まずMeCabを使えるようにしておく。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #!/usr/bin/env python # -*- coding: utf-8 -*- import sys,re,feedparser import MeCab d = feedparser.parse('http://blog.kzfmix.com/rss/') txt = '' for entry in d.entries: txt += re.compile(r'<[^>]+>').sub('',entry.summary_detail.value) try: t = MeCab.Tagger() m = t.parseToNode(txt.encode('utf-8')) while m: if m.stat < 2: if re.match('名詞',m.feature): print m.surface m = m.next except RuntimeError, e: print "RuntimeError:", e; |