12012010 Python
perlだとwarnだけどpythonだと
sys.stderr.write("なんか書く")
となる。
12012010 Python
perlだとwarnだけどpythonだと
sys.stderr.write("なんか書く")
となる。
12012010 Python
perlでいうファイルテスト演算子みたいなのはos.pathを使う。
os.path.isfile("query_file")
みたいに。isdirでディレクトリが存在するかどうかも評価できる。というかこっちを探してた。
今、ちょうどまさにSICPを読んでいる僕としては朝一の基調講演は気になるところなので、朝早くから出かけた。
ハッカー気質について。内容が面白かった。早起きした価値があった。 それにしてもプレゼンMeadowだよな。あれなんなんだろう?それがちょっと気になった。
luaってそういえば7,8年くらい前(もっと前かな?)に分子生物学会のポスターで見たことあったのを思い出した。
Pythonのプレゼンがわかりやすかった。
IronPython,Jythonが気になってたが、JRuby,IronRubyも面白そう。そういえばJRubyってDepth-Firstが使っていたような。僕はJythonから使ってみたりするわけですが。
IronPythonはPythonでDirectXとか使えるのが気になる。
プレゼンソフトをつくるお題。IT戦記の人のjavascriptのやつがすげーよくできてるなと。あとGauche面白そう。
盛り上がり
抽選会で本ゲット。やたらと重かった。
充実した一日だった。
12012010 Python
昨日よくわからなかったので
d = [2007, 8, 1]
datetime.date(d[0], d[1], d[2])
と書いたのだけど
datetime.date(*d)
でいいのね。
12012010 Python matplotlib
前週末から風邪がひどくて、会社を休んで寝ている。今日は多少ボーっとするけど昨日よりはずっと楽なので蒲団の中でノートパソコンと戯れたり。で、この前の血圧管理のグラフ化をやってみた。はてなのグラフを二つ重ねるというのは僕も考えたんだけど、CUIから
mybp -b 142,88
とか
mybp -b 142,88 -d 2007-07-31
とタイプするだけのほうがなんとなく長続きしそうだし(今までの経験から)。とここまでエントリを書いたところで、はてなグラフでそんなのやってるの思い出した。
むむーですよ。ま、pythonで書きたかった+綺麗なグラフが好きだった、、、ということで、書いたのはココ。
O/RマッパはSQLObjectで。クラスを定義したら、
class BloodPressure(SQLObject):
sbp = IntCol()
dbp = IntCol()
date = DateCol(default=datetime.date.today(), unique = True)
createTableメソッド呼ぶ
BloodPressure.createTable()
これで、実際にテーブルつくってくれるのでSQL文考えなくてよいし、テーブル作り直したいときにもdb消してもう一度createTableメソッド呼べばいいので心理的にも楽。
matplotlibは昨日書いたのを。データが少ないと目盛りがおかしいけど、1週間も続ければきちんとなるでしょう。

それにしても僕の血圧やたら高いなぁ。困った困った。
あとoptparseで固定引数の処理の仕方がよくわからなかったのだけど、パスワード生成スクリプトをきっかけにoptparseを使ってみましたを眺めたら解決した。
(options, args) = parser.parse_args()
ここのargsに固定引数が入ってんのね。
12012010 Python matplotlib
pythonのグラフ描画ライブラリであるmatplotlibで日付ごとにプロットするサンプル。
from pylab import *
from matplotlib.dates import MONDAY, WeekdayLocator
import datetime
start_date = datetime.date(2007, 5, 1)
end_date = datetime.date.today()
delta = datetime.timedelta(days=1)
mondays = WeekdayLocator(MONDAY)
dates = drange(start_date,end_date,delta)
s = rand(len(dates)) + 85
t = rand(len(dates)) + 80
fig = figure()
ax = fig.add_subplot(111)
ax.plot_date(dates, s, 'r--')
ax.plot_date(dates, t, 'bo-')
ax.xaxis.set_major_locator(mondays)
ax.autoscale_view()
ax.grid(True)
fig.autofmt_xdate()
title('My Blood Pressure')
xlabel('Date')
ylabel('Blood Pressure')
fig.savefig('datetest')

12012010 Python matplotlib
matplotlibを0.91.1にあげたら
NameError: name 'gtk' is not defined
とかでて動かなくなった。仕方ないのでsvnのrev4730を入れたら動いたけど、それでも
libpng: 1.2.22
Tkinter: Tkinter: 50704, Tk: 8.4, Tcl: 8.4
wxPython: 2.8.4.0
* WxAgg extension not required for wxPython >= 2.8
Gtk+: no
* pygtk present but import failed
Qt: Qt: 3.3.8, PyQt: 3.17.3
Qt4: no
Cairo: 1.4.0
となっている。pygtkは入ってんのになー
Mastering Algorithms With Perlビット演算を利用したアルゴリズム。Shift-ADDと違いdifference,insertion,deletionを考慮する。
可能性を論理和として積み上げていってShift-ORみたいなアプローチで評価するとこだと思う。いまいちちゃんと理解できてないが。
for j in range(1,k+1):
s[j] = (r[j] << 1) & Tc
s[j] |= (r[j-1] | s[j-1]) << 1
s[j] |= r[j-1]
s[j] |= 1
あと、perlで@a = @bとやれるところがpythonではa=bとできず、 b = copy.copy(a)なのね。
#!/usr/bin/env python
import copy
def amatch (T,P,k=-1):
text_length = len(T)
pattern_length = len(P)
po2 = map(lambda(x): 1 << x,range(31))
if k == -1: k = int(pattern_length/10) + 1
Table = [0] * 256
for i in range(pattern_length):
Table[ord(P[i])] |= po2[i]
r = [0] * (k+1)
for i in range(1,k+1):
r[i] = r[i-1] | po2[i-1]
mb = po2[pattern_length-1]
s = [0] * (k+1)
for i in range(text_length):
s[0] <<= 1
s[0] |= 1
Tc = Table[ord(T[i])]
s[0] &= Tc
for j in range(1,k+1):
s[j] = (r[j] << 1) & Tc
s[j] |= (r[j-1] | s[j-1]) << 1
s[j] |= r[j-1]
s[j] |= 1
if s[k] & mb:
return i - pattern_length + 1 if i > pattern_length else 0
r = copy.copy(s)
return -1
if __name__ == '__main__':
print "match: ", amatch("pearl","perl",1)
Mastering Algorithms With Perlこれもビット演算を利用したアルゴリズム。differenceを許容するけどinsertion,deletionは駄目。
#!/usr/bin/env python
from math import *
def shift_ADD (T, P, k=-1):
text_length = len(T)
pattern_length = len(P)
if k == -1: k = int(log(text_length)+1)
if k == 0: return T.find(P)
if pattern_length == 1: return T.find(P)
if pattern_length > text_length: return -1
if pattern_length == text_length and P == T: return 0
bits = int(log(k+1,2)) + 1 # ????
mask = 1 << ( bits - 1 )
ovmask = 0
for i in range(pattern_length):
ovmask |= mask
mask <<= bits
table = [ovmask >> (bits-1)] * 256
nmask = 1
for i in range(pattern_length):
table[ord(P[i])] &= ~nmask
nmask <<= bits
mask = ( 1 << ( pattern_length * bits )) -1
state = mask & ~ovmask
ov = ovmask
watch = ( k + 1 ) << ( bits * ( pattern_length - 1 ) )
for i in range(text_length):
state = ((state << bits) + table[ord(T[i])]) & mask
ov = ((ov << bits) | (state & ovmask)) & mask
state &= ~ovmask
if (state | ov) < watch:
return i - pattern_length + 1
return -1
if __name__ == '__main__':
print shift_ADD("perlpethonxx","python",2)
12012010 Python
int("101111",2)とかやると2進数の表現を10進数にできるということが分かったんだけど、逆に10進数で47を与えられたら101111といった2進数表現にするやり方がわからなかった。
Shift-ORのコード書いてるときに15って01111だよな~、5って00101だっけ?とか脳内変換はちょっと疲れた。4 | 1とか7 & 4とかいう脳内ビット計算も疲れる。