「数学ガール/乱択アルゴリズム」は数学ガールシリーズの中で一番読みやすかった

確率、組み合わせ、乱択アルゴリズム。

ProductName 数学ガール/乱択アルゴリズム
結城 浩
ソフトバンククリエイティブ / 1995円 ( 2011-03-02 )


この後にPRMLに進むのもよいかもしれん。

ProductName パターン認識と機械学習 上 - ベイズ理論による統計的予測
C. M. ビショップ
シュプリンガー・ジャパン株式会社 / 6825円 ( 2007-12-10 )


Pythonのcontextlibモジュール

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) を関数デコレータとして呼び出す便宜関数です。

Pythonのwebbrowserモジュール

ソース読んでたら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で開くことが出来る。

地震の次の日

僕の住んでいるあたりは、震度4でそのまま夜中まで停電したのだが、朝には電気と水が復旧してたので一安心。

週末は家の冷蔵庫にほとんどなにも入ってないので、朝一で近所のスーパーに買物に行ったら混んでた。

特に年配の女性の方々がカート2つとか3つとか操って買い占めにはしっていたのは印象に残った。レジ待ちの際、前のおばさんの買い物っぷりが豪快すぎて、「おいおい溜め込むのは脂肪だけにしとけって」と軽く心の中で突っ込んだが、もしかしたら10人位の家族だったのかもしれないなぁ。

富士宮のジャスコではトイレットペーパー買いまくったりしてるんだってさ。被災地に送るのかな?これまたよくわからん行動様式だなぁ。


避難用品は登山用のザック(45-50L)に詰めてあるけど結構ギュウギュウで水なんてそんなに入れられない(必要最低限)。暖をとれるようなもののほうが重要かなぁ。軽くて暖かいシュラフはあったほうがいいかなぁ。一度見直す必要があるなぁ。

ProductName Coleman(コールマン) キッズマミー/0 オレンジ 170S0205J

Coleman(コールマン) / 3680円 ( 2008-09-18 )


あと地震後はちょっと慌てるのでチェックリストにして玄関に置いておけばいいかもしれんな。

地震で停電が夜中まで続いた

金曜は風邪で会社を休んでいたのだが、コード読んでたら15時くらいに自宅サーバーが突然停電と同時に落ちて、すぐに強い揺れ。

そのまま夜中まで停電に突入、マンションの上階に住んでいるので停電=断水を意味する。さらに昇降式の車庫を使っているので危うく車も出せないパターンであったが、たまたま妻の平置きの駐車場に一時駐車していたために、娘と息子を幼稚園に迎えに行けた。地下式駐車場に入れてたら、徒歩お迎えだし、もし御殿場に出社してたらどうなっていただろうと考えるとゾッとする。あんまり長距離通勤するのも考えものか。

固定電話はもちろん、携帯電話(softbank)は全然つながらずgmail経由で妻とやり取り。妻は最近はiPadを持って出かけて行くことが多くなったので連絡とれた。

夜は停電のためライトが何本か使えたがちょっと暗かった。emobileが使えたのでmacbookから共有させてみんなでネットにアクセスしてた。CQW-MRBは2時間くらいしかもたないから、D02HWをmacbookに差してもそんなに変わらんね。

災害用に水とか食料とかバッグに詰め込んであるのでいつでも抱えて出られる状態にはなっているのだけど、実際に停電、断水状態で夜を過ごしてみて気づいたことがいくつかあるのでメモっておく。

  • 固定電話も携帯電話もつながらなかった。twitter,gmail,skypeのほうが災害時の通信手段としてはより良い
  • 停電時の夜の明かりは重要。ライトだとそんなに明るくないし、安心感を得る為にもLEDランタンを常備しておく必要性はある
  • マンション上階だと水はちょっと多めに用意しておく必要がある、断水前に風呂に水を貯めるとかできない(停電と同時に断水してしまうので)

とりあえずLEDランタンは1つ発注しておこう。単三を単一として使うためのスペーサーも必要だな。

風邪はもちろん悪化した。


110312 追記

あとはスマートフォン用の予備電源確保かな

Pythonのinspectモジュールを読んでみた。

今日も体調がすぐれないのというか、余計ひどくなった気がする(喉痛い)ので会社を休む。有休あまりまくってるしまぁここらへんで消費するのもいいかなと。

寝ながら本を読むにも軽めのちょうどいいのがないので、ソースコードリーディングでもと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で開いて直接読んじゃうことのほうが多いかもしれんけど。

娘の体調が優れない(+自分にも飛び火した)のでゆったり休日気分で

昨晩からここ二三日体調の悪かった娘の調子がさらに悪化して、ついでに一緒に寝ている僕にも直撃したらしく、妙にしんどかったので会社を休んだ。で、明日のことを見越して病児保育の付いてる病院に行ってきたんだけど2時間待った。iPadとDSとUnixネットワークプログラミングを抱えて行ったので待ち時間は苦にならなかったけどそれでほとんど半日がつぶれた。

その後、昼ごはんを食べたら眠くなって夕方まで昼寝をしていたが、娘は眠れずに病院で教えたうごメモにはまってとなりの布団で色々作ってたらしい。起きたら早速見せられた。

今はiPadでさっき購入したMr. Kumoという一筆書きパズルをやっている。こういう数学的なのを与えて数学耐性つけとこう。

ProductName 最短経路の本
R. ブランデンベルク
シュプリンガー・ジャパン株式会社 / 3675円 ( 2007-12-13 )


そういえば、布団の中で数学ガール読みきった、面白かった。あとで感想書く。

ProductName 数学ガール/乱択アルゴリズム
結城 浩
ソフトバンククリエイティブ / 1995円 ( 2011-03-02 )


あとtwitter追っかけてて、日本語訳でんのか思ったんだけど原著でもいいかな。

ProductName Statistical Computing with R (Chapman & Hall/CRC Computer Science & Data Analysis)
Maria L. Rizzo
Chapman and Hall/CRC / 6031円 ( 2007-11-15 )


まぁそんな感じでたいして進捗のない一日だった。

予算がなくてもステキなデザインのフライヤー・コレクション

印刷とか紙の選び方でコストを抑えるっていう話がメイン。

デザインそのものの工夫って感じじゃなかったので想定していたのとはちょっと違う本だったが、眺める本としてはそこそこ楽しめた。素敵なフライヤーはアテンション獲得には必須だからなぁ。

名刺のデザインとかにも参考になる感じ(この前procaで作っちゃったけど)。

クラブイベントのフライヤーの手伝いしてたときはCMYK印刷だったよなぁとか思い出した。

「伝承農法を活かすマンガでわかる家庭菜園の裏ワザ」を読んだ

ジャガイモの植え方とか、ナスの仕立て方とかなかなか面白かった。入門者向けの本を鵜呑みにしないで色々試してみるといいということに気付かされたので良書。

ProductName 伝承農法を活かすマンガでわかる家庭菜園の裏ワザ
木嶋 利男
家の光協会 / 1365円 ( 2010-01 )


ナス

ナスは第一花を摘みとる。三本仕立てにしないで主枝を切って二本仕立てにする。そして脇芽を伸ばしながら実のある枝ごと切って収穫する

切り戻しするときは株元から30センチ離れたところでスコップを入れて根切りをする

ピーマン

ピーマンは一番、二番花は摘みとる。また収穫毎に同じ節から内側に伸びてる脇芽を1つ摘みとる

オクラ

四本立ちにすると実が硬くなるのを遅らすことが出来る

冬季の土づくり

ヘアリーベッチを植える

入門自然言語処理

ひと通り流し読みした。

職場の昼休みに読み進めてきたので結構時間がかかったし、流し読みなので理解できてないところも結構ある。

1-4章がPythonでテキスト処理するための基礎的な事柄の説明で、それ以降が英語を想定した自然言語処理。最後の方は内容が高度だが10章の「文の意味の解析」は面白かった。プログラミング言語も言語の一種だからね。12章が日本語版オリジナルでPythonでの日本語の取り扱いに関して。

ProductName 入門 自然言語処理
Steven Bird
オライリージャパン / 3990円 ( 2010-11-11 )


章末問題が充実していて、この部分を解いて理解度をチェックしながら読み進むのがよいんだろうなぁと思いつつも、独習はちょっとやだなぁと思った。勉強会の題材にはいいのかなぁと。

今は自然言語処理へのモチベーションがそれほど高まってないこともあってざっと読んでみた。