友人の結婚式

もう一ヶ月以上経ってしまっているが、料理も式も素晴らしかった。

中身は白馬錦だったかな。

1336883657

前菜

1336883659

茶碗蒸し

1336883661

紹興酒

1336883663

フカヒレ

1336883666

オマール海老だったと思う

1336883668

肉旨かった

1336883670

1336883672

1336883673

1336883675

1336883677

Upside Down / Jazzanova

JazzanovaのRemix

Jazz-houseも結構好きなのでたまにつまむ。

ProductName Upside Down
Jazzanova
Sonar Kolektiv / 1890円 ( 2012-01-31 )


ファンクターからアプリカティブファンクターへ

この本は10章まではウォーミングアップみたいなもので11章からが本番です。

Applicativeに関してはあどけない話のApplicativeのススメを読んだ時にいまいちよく分からなかったのだけど、11章はFunctorから始めて、自然な流れでApplicativeの説明がしてあって非常に分かりやすい。もし、モナドを理解しているなら頭にこんな図を描きながら読むといいです。

<*>は関数の入っているファンクター値と値の入っているファンクター値を引数に取って、一つ目のファンクターの中身の関数を2つ目のファンクターの中身に適用する

ということなので、pure f <*> xfmap f x と等しく、f <$> xとも書ける。

ProductName すごいHaskellたのしく学ぼう!
Miran Lipovača
オーム社 / 2940円 ( 2012-05-23 )


理解した上でもう一度あどけない話のApplicativeのススメを読むと楽しいですね。

あとでパーサー書いてみようっと

XML-RPCでPYPIにパッケージ一覧の問い合わせをする

PYPIに登録してあるパッケージ全てのリストと、ここ一日の間で変更されたパッケージのリストを取ってくるサンプル。

import xmlrpclib
import time

proxy = xmlrpclib.ServerProxy('http://pypi.python.org/pypi')
proxy.useragent = 'pep381test/0.1'
packages = proxy.list_packages()
print len(set(packages))

lastweek = int(time.time()) - 60 * 60 * 24 * 1

changes = proxy.changelog(lastweek)

# [name, version, last_modified]
print len(changes)

acupは上手くいかなさそうだ

この前の思いつきでpipのキャッシュにインストールしないでダウンロードだけするスクリプトを書けばいいじゃんと思ったので、

pip install --no-install --no-deps packages

でいいんじゃないかなぁと軽く考えてたんだけど、pipのソースコード読んでみたらバージョンをpypiに問い合わせてから対応するバージョンのキャッシュがあるかどうかを調べる流れになっているので単純にキャッシュすればいいってわけじゃなかった。

バージョンを返すHTTPサーバーは必須みたいだなぁ。

すごいHaskellが届いた

たのしく学ぶために、鯨政宗でも呑みながら読むことにする

1337853565

ProductName すごいHaskellたのしく学ぼう!
Miran Lipovača
オーム社 / 2940円 ( 2012-05-23 )


pipでインストールしたパッケージをキャッシュしておきたい

virtualenv使っていると、仮想環境ごとに同じようなパッケージ(Flask,SQLAlchemy,pyqueryなんか)を何度もダウンロードすることになり、帯域の無駄遣いだよなと思っていた。それから、東京出張の際に新幹線の中でコード書いてることが多いんだけど、大抵三島-新横浜間のどこかで一度はイラッとするのもどうにかならんかと。

perlでいうところのminicpanみたいなのないかなぁと調べてみたらpep381client使えっていうやりとりをみつけたので調べてみた。ここなんかよくまとまっている。

ぱっと見ると、pep381clientがいいかなと思うんだけどPYPIのほぼ完全なミラーを作る感じだし、これはノートに入れて持ち歩くにはでかすぎるだろ(30Gくらいのストレージが必要)っていう理由で保留。まぁ、職場にミラーつくるんだったらいいんだろうなぁと思い、使ってみようかなとふとissue見たどうなんだろうね?って思った(パッチ当てたのもあるけどね)。

collective.eggproxyはキャッシュプロキシサーバーであり、キャッシュされてないパッケージはネットワークにつないでダウンロードする必要がある。これはローカルにミラーを用意したいという自分の用途には微妙に合わない。サーバー動かしておくのもなんかめんどくさいなーと。

決定打が見つからないまま悶々としたあげく、結局新しいパッケージを頻繁に入れることは少ないからキャッシュ使うっていう方法でも結構いけそうだからcollective.eggproxyでいこうかなぁと、pip installしたら、ふとpipにキャッシュのオプションあるんじゃないの?と調べたらあったというオチ。

export PIP_DOWNLOAD_CACHE=$HOME/.pip_download_cache

こんだけだった。pipのドキュメントにもchangelogのとこにちょろっと書いてあるだけだったので見逃してた。

pip自体にキャッシュの仕組みがあるんだったらダウンロードキャッシュにPYPIの最新パッケージだけをミラーするスクリプトを書けばpipからはきちんとPYPIに繋がって適切に処理しているように見えるからこのやり方でいいんじゃないかと思ったので、改めてこれをacupと名付けよう。

  • acup(上のやつ、やっつけスクリプト)
  • bcup(minicpan相当のやつ)
  • ...
  • fcup(pep381client)

という妙な脳内認識が出来上がってしまった。

参考

ProductName Pythonプロフェッショナルプログラミング
ビープラウド
秀和システム / 2940円 ( 2012-03-26 )


werkzeug.contrib.atomを使ってみた

このblogはfeedgeneratorを使っているんだけど、blohgのソースコードを読んでいたらwerkzeug.contrib.atomを使っていたのでちょっと興味があった。

最近あたらしいコードを書いていてせっかくなので使ってみた。調べたらFlaskのサイトにも書いてあった

実際使ってみるとrssを束ねて再配信するような場合にはちょっと考えなきゃいけないことが多いかなぁと。

rssにauthorとかそういう属性ないからどうしようかねぇ。

今日の畑(120519)

支柱を立ててなかったせいで、この前の強風と雹でぽっきり折れたキュウリを植え直した。

1337595517

ベランダで育ててたズッキーニも定植したが、なんか育ちが悪くて上手く行きそうな気がしない。とりあえず、マルチはしといたけど、もう花が咲きそう。

1337595519

全体像、今年の土地の利用効率は良い感じ。手前の雑草地帯は浅葱を植えてあるので、来週あたりに球根を掘り起こして堆肥を入れたらなんか別のものを植える予定

1337595521

Flask-WTFのCSRF対策でちょいはまった

ドキュメントによると

<form method="POST" action=".">
    {{ form.csrf }}
    {{ form.name.label }} {{ form.name(size=20) }}
    <input type="submit" value="Go">
</form>

って書いてあるんだけど、

'csrf_token': [u'CSRF token missing']

なんじゃこりゃーって感じで2時間ほどはまったあげく、form.csrfじゃなくてform.csrf_tokenだということに気づいた。

WTFormsのドキュメント読まないとわからん。