14032011 life
確率、組み合わせ、乱択アルゴリズム。
この後にPRMLに進むのもよいかもしれん。
14032011 life
確率、組み合わせ、乱択アルゴリズム。
この後にPRMLに進むのもよいかもしれん。
13032011 Python
contextlib — with -構文コンテキストのためのユーティリティ。
functoolsのwrapsで包んだヘルパー関数を返す
def contextmanager(func): @wraps(func) def helper(*args, **kwds): return GeneratorContextManager(func(*args, **kwds)) return helper
GeneratorContextManagerクラス(例外処理をのぞいて把握しやすくした)__enter__実行してからyieldして最後に__exit__が実行される
class GeneratorContextManager(object): """Helper for @contextmanager decorator.""" def __init__(self, gen): self.gen = gen def __enter__(self): return self.gen.next() def __exit__(self, type, value, traceback): if type is None: try: self.gen.next() except StopIteration: return else: raise RuntimeError("generator didn't stop")
実際に使う場合はこんな感じでジェネレータを包む
@contextmanager def tag(name): print "<%s>" % name yield print "</%s>" % name >>> with tag("h1"): ... print "foo" ... <h1> foo </h1>
functoolsのwraps
10.8. functools — 高階関数と呼び出し可能オブジェクトの操作
これはラッパ関数を定義するときに partial(update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated) を関数デコレータとして呼び出す便宜関数です。
13032011 Python
ソース読んでたらmain関数が
def main(): import getopt usage = """Usage: %s [-n | -t] url -n: open new window -t: open new tab""" % sys.argv[0] try: opts, args = getopt.getopt(sys.argv[1:], 'ntd') except getopt.error, msg: print >>sys.stderr, msg print >>sys.stderr, usage sys.exit(1) new_win = 0 for o, a in opts: if o == '-n': new_win = 1 elif o == '-t': new_win = 2 if len(args) != 1: print >>sys.stderr, usage sys.exit(1) url = args[0] open(url, new_win) print "\a"
ということなので
python -mwebbrowser -n "http://blog.kzfmix.com"
と打てば任意のURLをwebbrowserで開くことが出来る。
13032011 life
僕の住んでいるあたりは、震度4でそのまま夜中まで停電したのだが、朝には電気と水が復旧してたので一安心。
週末は家の冷蔵庫にほとんどなにも入ってないので、朝一で近所のスーパーに買物に行ったら混んでた。
特に年配の女性の方々がカート2つとか3つとか操って買い占めにはしっていたのは印象に残った。レジ待ちの際、前のおばさんの買い物っぷりが豪快すぎて、「おいおい溜め込むのは脂肪だけにしとけって」と軽く心の中で突っ込んだが、もしかしたら10人位の家族だったのかもしれないなぁ。
富士宮のジャスコではトイレットペーパー買いまくったりしてるんだってさ。被災地に送るのかな?これまたよくわからん行動様式だなぁ。
避難用品は登山用のザック(45-50L)に詰めてあるけど結構ギュウギュウで水なんてそんなに入れられない(必要最低限)。暖をとれるようなもののほうが重要かなぁ。軽くて暖かいシュラフはあったほうがいいかなぁ。一度見直す必要があるなぁ。
あと地震後はちょっと慌てるのでチェックリストにして玄関に置いておけばいいかもしれんな。
12032011 life
金曜は風邪で会社を休んでいたのだが、コード読んでたら15時くらいに自宅サーバーが突然停電と同時に落ちて、すぐに強い揺れ。
そのまま夜中まで停電に突入、マンションの上階に住んでいるので停電=断水を意味する。さらに昇降式の車庫を使っているので危うく車も出せないパターンであったが、たまたま妻の平置きの駐車場に一時駐車していたために、娘と息子を幼稚園に迎えに行けた。地下式駐車場に入れてたら、徒歩お迎えだし、もし御殿場に出社してたらどうなっていただろうと考えるとゾッとする。あんまり長距離通勤するのも考えものか。
固定電話はもちろん、携帯電話(softbank)は全然つながらずgmail経由で妻とやり取り。妻は最近はiPadを持って出かけて行くことが多くなったので連絡とれた。
夜は停電のためライトが何本か使えたがちょっと暗かった。emobileが使えたのでmacbookから共有させてみんなでネットにアクセスしてた。CQW-MRBは2時間くらいしかもたないから、D02HWをmacbookに差してもそんなに変わらんね。
災害用に水とか食料とかバッグに詰め込んであるのでいつでも抱えて出られる状態にはなっているのだけど、実際に停電、断水状態で夜を過ごしてみて気づいたことがいくつかあるのでメモっておく。
とりあえずLEDランタンは1つ発注しておこう。単三を単一として使うためのスペーサーも必要だな。
風邪はもちろん悪化した。
あとはスマートフォン用の予備電源確保かな
11032011 Python
今日も体調がすぐれないのというか、余計ひどくなった気がする(喉痛い)ので会社を休む。有休あまりまくってるしまぁここらへんで消費するのもいいかなと。
寝ながら本を読むにも軽めのちょうどいいのがないので、ソースコードリーディングでもとinspectを読んでみた。
getargs,getsource,classify_class_attrsあたりは参考になった。
こんな感じでK-meansのコードがあったとする。
from itertools import groupby from math import sqrt zipWith = lambda f, xs, ys : [f(x, y) for x,y in zip(xs, ys)] snd = lambda x: x[1] fst = lambda x: x[0] euclid = lambda x, y : (x-y)**2 def distance(a,b): return sqrt(sum(zipWith(euclid,a,b))) def centroid(clusters): sums = reduce(lambda x,y: zipWith(lambda a,b:a+b,x,y),clusters) return map(lambda x: x / float(len(clusters)), sums) def closest(pts, pt): closest_ct = pts[0] for ct in pts[1:]: if distance(pt,closest_ct) > distance(pt,ct): closest_ct = ct return closest_ct def recluster_(centroids,points): reclustered = [(closest(centroids,a), a) for a in points] reclustered.sort() return [map(snd,list(g)) for k, g in groupby(reclustered, fst)] def recluster(clusters): centroids = map(centroid, clusters) concated_clusters = reduce(lambda a,b: a+b, clusters) return recluster_(centroids,concated_clusters) def part(l,points): size = len(l)/points return [l[i:i+size] for i in range(0,len(l),size)] def kmeans(k,points): cluster = part(k,points) newcluster = recluster(cluster) while(cluster != newcluster): cluster = newcluster newcluster = recluster(cluster) return newcluster if __name__ == "__main__": pts = [[1,2,4],[1,3,3],[4,3,0],[2,5,1],[7,3,8],[0,0,0],[4,3,2],[6,1,8]] print kmeans(pts,3)
モジュールロード
>>> import kmeans >>> import inspect
どんな関数があったかなぁというのは、まぁdirでわかる
>>> dir(kmeans) ['__builtins__', '__doc__', '__file__', '__name__', '__package__', \ 'centroid', 'closest', 'distance', 'euclid', 'fst', 'groupby', 'kmeans', \ 'part', 'recluster', 'recluster_', 'snd', 'sqrt', 'zipWith']
引数どうだっけ?となったばあいにはgetargsつかえばいいけどコードオブジェクトを引数にとるのでfunc_codeを渡してる
>>> inspect.getargs(kmeans.distance.func_code) Arguments(args=['a', 'b'], varargs=None, keywords=None)
distanceって何の距離計算してんだっけ(マンハッタン?ユークリッド?)ソースみたいなあってなったらgetsource
>>> inspect.getsource(kmeans.distance) 'def distance(a,b): \n return sqrt(sum(zipWith(euclid,a,b)))\n' >>> inspect.getsource(kmeans.euclid) 'euclid = lambda x, y : (x-y)**2\n'
というわけでユークリッド距離で定義された距離でのK-meansのコードだということがわかる。
>>> inspect.getfile(kmeans.distance) 'kmeans.py' >>> inspect.getabsfile(kmeans.distance) '/Users/kzfm/python/kmeans.py'
getabsfileでファイルの場所探してemacsで開いて直接読んじゃうことのほうが多いかもしれんけど。
10032011 life
昨晩からここ二三日体調の悪かった娘の調子がさらに悪化して、ついでに一緒に寝ている僕にも直撃したらしく、妙にしんどかったので会社を休んだ。で、明日のことを見越して病児保育の付いてる病院に行ってきたんだけど2時間待った。iPadとDSとUnixネットワークプログラミングを抱えて行ったので待ち時間は苦にならなかったけどそれでほとんど半日がつぶれた。
その後、昼ごはんを食べたら眠くなって夕方まで昼寝をしていたが、娘は眠れずに病院で教えたうごメモにはまってとなりの布団で色々作ってたらしい。起きたら早速見せられた。
今はiPadでさっき購入したMr. Kumoという一筆書きパズルをやっている。こういう数学的なのを与えて数学耐性つけとこう。
そういえば、布団の中で数学ガール読みきった、面白かった。あとで感想書く。
あとtwitter追っかけてて、日本語訳でんのか思ったんだけど原著でもいいかな。
Statistical Computing with R (Chapman & Hall/CRC Computer Science & Data Analysis)まぁそんな感じでたいして進捗のない一日だった。
09032011 life
印刷とか紙の選び方でコストを抑えるっていう話がメイン。
デザインそのものの工夫って感じじゃなかったので想定していたのとはちょっと違う本だったが、眺める本としてはそこそこ楽しめた。素敵なフライヤーはアテンション獲得には必須だからなぁ。
名刺のデザインとかにも参考になる感じ(この前procaで作っちゃったけど)。
クラブイベントのフライヤーの手伝いしてたときはCMYK印刷だったよなぁとか思い出した。
08032011 家庭菜園
ジャガイモの植え方とか、ナスの仕立て方とかなかなか面白かった。入門者向けの本を鵜呑みにしないで色々試してみるといいということに気付かされたので良書。
ナスは第一花を摘みとる。三本仕立てにしないで主枝を切って二本仕立てにする。そして脇芽を伸ばしながら実のある枝ごと切って収穫する
切り戻しするときは株元から30センチ離れたところでスコップを入れて根切りをする
ピーマンは一番、二番花は摘みとる。また収穫毎に同じ節から内側に伸びてる脇芽を1つ摘みとる
四本立ちにすると実が硬くなるのを遅らすことが出来る
ヘアリーベッチを植える
ひと通り流し読みした。
職場の昼休みに読み進めてきたので結構時間がかかったし、流し読みなので理解できてないところも結構ある。
1-4章がPythonでテキスト処理するための基礎的な事柄の説明で、それ以降が英語を想定した自然言語処理。最後の方は内容が高度だが10章の「文の意味の解析」は面白かった。プログラミング言語も言語の一種だからね。12章が日本語版オリジナルでPythonでの日本語の取り扱いに関して。
章末問題が充実していて、この部分を解いて理解度をチェックしながら読み進むのがよいんだろうなぁと思いつつも、独習はちょっとやだなぁと思った。勉強会の題材にはいいのかなぁと。
今は自然言語処理へのモチベーションがそれほど高まってないこともあってざっと読んでみた。