<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description></description><title>Who moved my SPAM?</title><generator>Tumblr (3.0; @jbking)</generator><link>http://blog.jbking.org/</link><item><title>"突然の加盟店契約解除の理由につきまして株式会社JCBに問い合わせましたところ、加盟店解除の理由として伝えられましたのは、「常識から考えて、ホメオパシーは効果がある健康食品とは思えない。むしろ消費者に心配..."</title><description>“突然の加盟店契約解除の理由につきまして株式会社JCBに問い合わせましたところ、加盟店解除の理由として伝えられましたのは、「常識から考えて、ホメオパシーは効果がある健康食品とは思えない。むしろ消費者に心配を与える可能性を感じる。日本において社会的認知が無いことが問題と感じている。社会的認知があれば、ネット等に見られるようなホメオパシージャパンへの誹謗中傷は生じない。日本でも海外のようにホメオパシーに健康保険が適用されるほど社会的認知度が上がれば、その時にJCB加盟店への最加盟を検討する。ホメオパシー全体の話であり、ホメオパシージャパンに限る話ではない。海外も含め、解除可能な契約は全て解除する」というものでした。”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;p&gt;&lt;a href="http://www.homoeopathy.co.jp/20120121_info.html"&gt;クレジットカード決済中止についてのお知らせ - &lt;/a&gt;&lt;a href="http://www.homoeopathy.co.jp/20120121_info.html"&gt;ホメオパシージャパン株式会社&lt;/a&gt; (via &lt;a class="tumblr_blog" href="http://shibata616.tumblr.com/"&gt;shibata616&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;素晴らしい。&lt;/p&gt;

&lt;p&gt;(via &lt;a href="http://yoosee.tumblr.com/" class="tumblr_blog"&gt;yoosee&lt;/a&gt;)&lt;/p&gt;&lt;/em&gt;</description><link>http://blog.jbking.org/post/16569067079</link><guid>http://blog.jbking.org/post/16569067079</guid><pubDate>Fri, 27 Jan 2012 15:51:22 +0900</pubDate></item><item><title>logiq:

一人おかしい</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_lw9wl0HzfC1qzyazmo1_250.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://logiq.tumblr.com/post/14288197784" class="tumblr_blog"&gt;logiq&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;一人おかしい&lt;/p&gt;&lt;/blockquote&gt;</description><link>http://blog.jbking.org/post/16569018487</link><guid>http://blog.jbking.org/post/16569018487</guid><pubDate>Fri, 27 Jan 2012 15:49:33 +0900</pubDate></item><item><title>#しみずかわ できちゃった</title><description>&lt;p&gt;&lt;a href="http://logiq.tumblr.com/post/13153784963" class="tumblr_blog"&gt;logiq&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;しみずかわ語録botが空気を読みまくり、新婚の#しみずかわを襲う！&lt;/p&gt;
&lt;p&gt;&lt;img alt="できちゃったらしい" height="809" src="http://gyazo.com/7202e92610d09a057d1393aadddecca5.png" width="412"/&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="きらわれたらしい" height="352" src="http://gyazo.com/2b6181a1d444deefc67bb115cf6af0d6.png" width="358"/&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Pillowいれればできちゃうらしい" height="880" src="http://gyazo.com/a07a8db97bd44fc3032830cd6cf21234.png" width="594"/&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="PILなしだとできちゃうらしい" height="632" src="http://gyazo.com/9c81f8139c20360bfe2c9f0276d64bb6.png" width="529"/&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="冗談だったらしい" height="627" src="http://cache.gyazo.com/0f8577c5a59e9ec3f95836d8817058a8.png" width="478"/&gt;&lt;/p&gt;&lt;/blockquote&gt;</description><link>http://blog.jbking.org/post/16569013375</link><guid>http://blog.jbking.org/post/16569013375</guid><pubDate>Fri, 27 Jan 2012 15:49:22 +0900</pubDate></item><item><title>aodag 16: 19 &#13;</title><description>aodag 16:19 &lt;br /&gt;&#13;
buchoはTENGAつけっぱなしなんでしょ？&lt;br /&gt;&#13;
AE35 (Yosuke IKEDA) ( ´aωe｀) 16:20 &lt;br /&gt;&#13;
はやくUSB TENGAでないかなー&lt;br /&gt;&#13;
TAM(Isopa) 16:20 &lt;br /&gt;&#13;
aodagに弊社でTENGAの話をしてほしい&lt;br /&gt;&#13;
aodag 16:21 &lt;br /&gt;&#13;
buchoに頼めよ&lt;br /&gt;&#13;
TAM(Isopa) 16:21 &lt;br /&gt;&#13;
初心なaodagの装着感がしりてえんだよ&lt;br /&gt;&#13;
やまぐち/ymotongpoo 16:21 &lt;br /&gt;&#13;
wwwww&lt;br /&gt;&#13;
aodag 16:22 &lt;br /&gt;&#13;
ﾐ&lt;br /&gt;&#13;
TAM(Isopa) 16:22 &lt;br /&gt;&#13;
共通化する方法とか、簡単に使い回す方法を教えてけれ&lt;br /&gt;&#13;
feiz / azuma 16:22 &lt;br /&gt;&#13;
TENGAを？&lt;br /&gt;&#13;
aodag 16:22 &lt;br /&gt;&#13;
共通化ってどういうことだよw&lt;br /&gt;&#13;
TAM(Isopa) 16:23 &lt;br /&gt;&#13;
aodagなら共通化のプロでしょ&lt;br /&gt;&#13;
feiz / azuma 16:23 &lt;br /&gt;&#13;
BUCHOのあとのtengaとかやだなー&lt;br /&gt;&#13;
aodag 16:23 &lt;br /&gt;&#13;
共通化とかしないよ&lt;br /&gt;&#13;
AE35 (Yosuke IKEDA) ( ´aωe｀) 16:23 &lt;br /&gt;&#13;
コンドームしてから装着すれば、簡単に使い回せるね&lt;br /&gt;&#13;
TAM(Isopa) 16:23 &lt;br /&gt;&#13;
え&lt;br /&gt;&#13;
aodag 16:24 &lt;br /&gt;&#13;
アダプターを使えってことか&lt;br /&gt;&#13;
TAM(Isopa) 16:24 &lt;br /&gt;&#13;
なるほどな。しかし、Adapterは破損することがあるぞ！！&lt;br /&gt;&#13;
やまぐち/ymotongpoo 16:24 &lt;br /&gt;&#13;
片栗粉をお湯で溶かしてこねてからコップに入れたら&lt;br /&gt;&#13;
aodag 16:24 &lt;br /&gt;&#13;
そこは制御の反転で&lt;br /&gt;&#13;
やまぐち/ymotongpoo 16:24 &lt;br /&gt;&#13;
自作TENGAができるよ&lt;br /&gt;&#13;
aodag 16:25 &lt;br /&gt;&#13;
依存性を注入するんだよ&lt;br /&gt;&#13;
TAM(Isopa) 16:26 &lt;br /&gt;&#13;
Adapterが破損して注入してしまった場合に女の子に怒られないためにはどうしたらいいですか&lt;br /&gt;&#13;
aodag 16:26 &lt;br /&gt;&#13;
それは結合段階ですか？&lt;br /&gt;&#13;
TAM(Isopa) 16:26 &lt;br /&gt;&#13;
そうです&lt;br /&gt;&#13;
aodag 16:26 &lt;br /&gt;&#13;
最終的には受け入れ条件を満たせばいいんじゃないですかね&lt;br /&gt;&#13;
AE35 (Yosuke IKEDA) ( ´aωe｀) 16:27 &lt;br /&gt;&#13;
このログは保存しておこう&lt;br /&gt;&#13;
やまぐち/ymotongpoo 16:28 &lt;br /&gt;&#13;
だれか、Tumber、はよ&lt;br /&gt;&#13;
aodag 16:28 &lt;br /&gt;&#13;
まて&lt;br /&gt;&#13;
16:28&lt;br /&gt;&#13;
まって！&lt;br /&gt;&#13;
16:28&lt;br /&gt;&#13;
やめて&lt;br /&gt;&#13;
やまぐち/ymotongpoo 16:28 &lt;br /&gt;&#13;
http://tumblr.mozo.jp/post/1073643689/10-33-19-am-ymotongpoo&lt;br /&gt;&#13;
16:28&lt;br /&gt;&#13;
tumblrの被害者&lt;br /&gt;&#13;
TAM(Isopa) 16:28 &lt;br /&gt;&#13;
あきらめろ＞aodag&lt;br /&gt;&#13;
aodag 16:28 &lt;br /&gt;&#13;
ちょ、まじすんません</description><link>http://blog.jbking.org/post/16568438901</link><guid>http://blog.jbking.org/post/16568438901</guid><pubDate>Fri, 27 Jan 2012 15:29:19 +0900</pubDate></item><item><title>bgnori:

マカロニアンドチーズか。アメリカ人のソウルフード。マカロニアンドチーズ用粉とマカロニで作る・・・・。日本だったら...</title><description>&lt;img src="http://26.media.tumblr.com/tumblr_ly6odkQHdn1qcef46o1_500.gif"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://bgnori.tumblr.com/post/16289293379" class="tumblr_blog"&gt;bgnori&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;マカロニアンドチーズか。アメリカ人のソウルフード。マカロニアンドチーズ用粉とマカロニで作る・・・・。日本だったらインスタントを販売する所だが。って日清とか作ってないの？&lt;/p&gt;&lt;/blockquote&gt;</description><link>http://blog.jbking.org/post/16289987320</link><guid>http://blog.jbking.org/post/16289987320</guid><pubDate>Mon, 23 Jan 2012 00:28:59 +0900</pubDate></item><item><title>"どうか誤解しないで欲しいんだけど、僕は「全てを疑ってかかれ」なんていうつもりはない。いちいちなにもかも疑っていたら大変だし、なによりそんなのすごくつまらない。大切なのは「何が本当に正しいのか」じゃなくて..."</title><description>“&lt;p&gt;どうか誤解しないで欲しいんだけど、僕は「全てを疑ってかかれ」なんていうつもりはない。いちいちなにもかも疑っていたら大変だし、なによりそんなのすごくつまらない。大切なのは「何が本当に正しいのか」じゃなくて、僕がいま正しいと思っていることと、君がいま正しいと思っていることが違うということだ。「正しさ」というのは人によって違う、そのことを絶対に忘れちゃいけない。&lt;/p&gt;

&lt;p&gt;(中略)&lt;/p&gt;

&lt;p&gt;世界にあるのは「嘘と本当」の2種類じゃない。世界には沢山の「本当」があるだけなんだ。君がどの「本当」を選ぶのかは、君が自分で決めなくちゃいけない。誰かに選んでもらうことはできない。だから、よーく調べて、よーく考えて選ばなくちゃいけない。そして、一番忘れちゃいけないのは、君の目の前にいるあの人は、君とは違う「本当」を選んでいるかもしれない、ということだ。&lt;/p&gt;

&lt;p&gt;君の「本当」を誰かに押し付けるのはやめた方がいい。だからと言って誰かの「本当」を何も考えずに採用するのもあまりおすすめしない。君が努力すべきなのは、2つの「本当」をひとつにすることじゃなくて、それぞれの「本当」のどこが同じで、どこが違っているかをちゃんと理解することだ。&lt;/p&gt;

&lt;p&gt;(中略)&lt;/p&gt;

&lt;p&gt;もし君が「事実」とか「真実」とか「正しい」とか「本当」なんていう言葉に出くわしたら、まず考えなくちゃいけないのは、「それが誰にとって正しいのか」ということだ。君が見ている世界と、彼や彼女が見ている世界は違う。まず想像力をフル回転させて、彼や彼女の目から見たら、この世界はどんな風に見えるかを想像してみることだ。彼が嘘をついているわけじゃない、彼女が間違っているわけでもない。彼や彼女には世界がそういう風に見えているんだ。&lt;/p&gt;”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;a href="http://www.lizard-tail.com/isana/review/view.php?search_id=20050607141638" title="Junkyard Review - 検索サイトから来た君へ"&gt;Junkyard Review - 検索サイトから来た君へ&lt;/a&gt; (via &lt;a class="tumblr_blog" href="http://nanashino.tumblr.com/"&gt;nanashino&lt;/a&gt;)&lt;/em&gt;</description><link>http://blog.jbking.org/post/16289966126</link><guid>http://blog.jbking.org/post/16289966126</guid><pubDate>Mon, 23 Jan 2012 00:28:26 +0900</pubDate></item><item><title>デコレータについての諸々</title><description>&lt;p&gt;Pythonにおけるデコレータにはメリットとデメリットがある。それらを解説しつつ、そのデメリットをうまいこと回避するようにしているライブラリVenusianの紹介につなげます。&lt;/p&gt;

&lt;h2&gt;デコレータについて&lt;/h2&gt;

&lt;h3&gt;まずはおさらい&lt;/h3&gt;

&lt;p&gt;デコレータとは何か。一言で言えば関数をラップする関数を返す関数です。(以下、関数とメソッドを一括りに関数といいます。)&lt;/p&gt;

&lt;p&gt;例えば、こんなメモ化デコレータ。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def memorize(func):
    cache = {}

    def _func(*args):
        if args not in cache:
            result = func(*args)
            cache[args] = result
        else:
            print("hit cache!: %r" % (args,))
        return cache[args]
    return _func

@memorize
def sum(*args):
    j = 0
    for i in args:
        j += i
    return j

sum(1, 2, 3, 4)
sum(1, 2, 3)
sum(1, 2, 3, 4)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;実行するとこうなります。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;hit cache!: (1, 2, 3, 4)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;先ほど述べた「関数をラップする関数を返す関数」をマップしてみましょう。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def memorize(func):  # 関数 (4)
    cache = {}

    def _func(*args):  # ラップする関数 (2)
        if args not in cache:
            result = func(*args)  # 関数を (1)
            cache[args] = result
        else:
            print("hit cache!: %r" % (args,))
        return cache[args]
    return _func  # を返す (3)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;(1)はラップされた、この場合だとsum(*args)関数ですね。
なお、デコレータ構文が存在しなかった以前のバージョンではこうやってました。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sum = memorize(sum)
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;デコレータの性質について&lt;/h3&gt;

&lt;p&gt;デコレータはJavaのアノテーションとシンタックスは似ていますが、その関数の読み込み時に評価されます。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def print1(func):
    def _func():
        func()

    print(1)
    return _func

@print1
def foo():
    pass
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;このコードの場合、読み込み時に1が出力されます。foo()関数は定義されただけで、呼び出されてないことに気をつけてください。&lt;/p&gt;

&lt;h3&gt;複雑なデコレータ&lt;/h3&gt;

&lt;p&gt;こんなデコレータ付きの関数を見たこともあるでしょう。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@printn(10)
def foo():
    pass
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;デコレータに括弧がついてますね。これは括弧が付いてないデコレータと何が違うのでしょうか。&lt;/p&gt;

&lt;p&gt;種も仕掛けもないのでコードをのせます。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def printn(n):
    def _print(func):
        def _func():
            func()

        print(n)
        return _func
    return _print
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;一言で言うなら「関数をラップする関数を返す関数「を返す関数」」です。これでデコレータに渡すパラメータを、関数の定義時に切り替えることができますね。&lt;/p&gt;

&lt;p&gt;要件によって、このようにもデコレータをかけること、ありますよね。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@foo
@bar
def baz():
    pass
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;や&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@foo('bar')('baz')('qux')
def quux():
    pass
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;後者はまだ見たことがありませんが、こんなことになる前に何とかしましょう。:-)&lt;/p&gt;

&lt;h3&gt;デコレータのメリットとデメリット&lt;/h3&gt;

&lt;p&gt;雰囲気はつかめたでしょうか。デコレータには関数の主たる機能以外の付随的な機能をもたせると、関心事の分離ができコードの見通しが良くなります。login_requiredなどはビューの主たる機能ではないですよね。これがメリット。&lt;/p&gt;

&lt;p&gt;ただ残念なことに、デコレータはその定義の仕方から、オリジナルの関数の参照を隠してしまうという欠点があります。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sum = memorize(sum)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;デコレータ構文を使っても実質的にはこれと変わりません。オリジナルのsum(*args)関数は、もはやどこからもアクセスすることができなくなります。(実際にはクロージャなので中を見てくとかありますが、今回は本質的ではないので省きます。)&lt;/p&gt;

&lt;p&gt;参照できなくなることの何が問題なのでしょうか。あなたがテストコードを書かないのであれば、問題になることはまずないでしょう。&lt;strong&gt;ただそれはまた別の問題を近い将来に引き起こします。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;テストコードを書く人は、こういう問題にぶち当たったことがあるはずです。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@christmas_only  # クリスマスの日だけ有効な
@login_required  # ログインしているユーザだけ有効な
@dict_to_json  # 辞書をJSON形式に変換したレスポンスを返す
def merry_christmas(request):
    data = get_tree_data()  # クリスマスツリーデータを辞書で返す
    return data
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;このビューは「本質的にはクリスマスツリーのデータを返すビュー」です。しかし、問題点がいくつかありますね。&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;クリスマスの日だけ有効だとすると他の日ではどうやってテストするのするのでしょうか。&lt;/li&gt;
&lt;li&gt;ログインしているユーザのデータを毎回作る?&lt;/li&gt;
&lt;li&gt;辞書データをJSON形式へ変換しているので、テストコードで内容のアサーションをしようとするとjson.loads()で先に復元しなければなりません。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;これらの問題点はその関数の主たる機能ではないが、付随しているがためにテストコードの設計に影響を与え続けます。これがデメリット。&lt;/p&gt;

&lt;p&gt;もちろんそれらを回避する方法はあります。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def _merry_christmas(request):  # こっちの関数をテストする
    data = get_tree_data()  # クリスマスツリーデータを辞書で返す
    return data

@christmas_only  # クリスマスの日だけ有効な
@login_required  # ログインしているユーザだけ有効な
@dict_to_json  # 辞書をJSON形式に変換したレスポンスを返す
def merry_christmas(request):
    return _merry_christmas(request)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;DjangoのClassBasedViewもデコレータの観点からは同じ回避方法です。&lt;/p&gt;

&lt;p&gt;自作デコレータであれば、デコレータのアトリビュートにオリジナルの関数を紐付けるという方法もあります。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def dict_to_json(func):
    def _wrap(*args, **kwargs):
        d = func(*args, **kwargs)
        return json.dumps(s)
    dict_to_json.original_func = func  # これならテストできる
    return _wrap
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;だけど、ちょっと待ってください。そもそもデコレータがオリジナルの関数を置き換えなければ、こんな面倒なことはしないでよかったのです。そうでしょう?&lt;/p&gt;

&lt;h2&gt;Venusianについて&lt;/h2&gt;

&lt;p&gt;Venusianは主にフレームワーク作成者のためのライブラリですが、デコレータの使い方に特長があります。&lt;/p&gt;

&lt;p&gt;誤解を恐れずに言うならば「デコレータをアノテーションのように使います」。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# jsonized_view.py
import json
import venusian

def jsonify(wrapped):
    def callback(scanner, name, ob):
        def jsonified(request):
            result = wrapped(request)
            return json.dumps(result)
        scanner.registry[name] = jsonified
    venusian.attach(wrapped, callback)
    return wrapped

@jsonify
def object_view(request):
    return request.as_dict()
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Venusianは2段階に分けデコレータを解釈します。アタッチとスキャン。&lt;/p&gt;

&lt;h3&gt;アタッチ&lt;/h3&gt;

&lt;p&gt;上のコードのうちアタッチのフェーズで何をやっているのかみてみましょう。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def jsonify(wrapped):
    def callback(scanner, name, ob):
        ...
    venusian.attach(wrapped, callback)  # コールバックをアタッチして
    return wrapped  # オリジナルの関数を返す
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;奇妙なことにデコレータに渡ってきたオリジナルの関数をそのまま返してます。
作用だけみると、ラップされていない関数がモジュール内に戻されて、配置されるのがわかります。&lt;/p&gt;

&lt;p&gt;でもこれでうまくいくのでしょうか。&lt;/p&gt;

&lt;h3&gt;スキャン&lt;/h3&gt;

&lt;p&gt;Venusianはスキャナによるスキャンをおこなうことで、アタッチされた関数を走査します。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import venusian
import jsonized_view

registry = {}
scanner = venusian.Scanner(registry=registry)
scanner.scan(jsonized_view)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;アタッチされた関数には、Venusian用のコールバックcallback(scanner, name, ob)が設定されているので、それをスキャナが呼びます。
あのコードだとregistryにデコレータでラップした関数を登録していますね。
スキャン後のregistryはこのようになるでしょうか。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{'object_view': &lt;function jsonified at 0x1004ef230&gt;}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;結局どうなったの&lt;/h3&gt;

&lt;p&gt;整理してみましょう。&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;関数の定義箇所では、オリジナルの関数がそのまま配置されている。&lt;/li&gt;
&lt;li&gt;スキャナでスキャンした結果、関数とそのデコレータしたあとの関数の対が得られる。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;このような状況になりました。&lt;/p&gt;

&lt;p&gt;テストのしやすさは改善したでしょうか。モジュール内にはオリジナルの関数がそのまま配置されているので、テストではデコレータの作用を気にせずにコードを書けそうです。&lt;/p&gt;

&lt;p&gt;実はVenusianでおこなう事はこれが全てです。
あとはスキャンした結果を利用するフレームワークが、自身でURLマッピングにそのデコレートされた関数を使用したりします。有名なものではPyramidがVenusianを採用していますね。&lt;/p&gt;

&lt;p&gt;上で述べたように、このフレームワークの仕組みは、デコレータの中身はデコレートされた関数を返すことを要求しないので、関数のカテゴライズや、アノテーション付与のみの目的での利用など、幅広い利用パターンが考えられます。&lt;/p&gt;</description><link>http://blog.jbking.org/post/16013710368</link><guid>http://blog.jbking.org/post/16013710368</guid><pubDate>Wed, 18 Jan 2012 03:06:00 +0900</pubDate></item><item><title>"会社をやめるので仕事の引継ぎをしているが、自分の後任の人が引き継がれた仕事をやりたくないという理由で自分より早く退職するという、訳のわからない状況になっている。"</title><description>“会社をやめるので仕事の引継ぎをしているが、自分の後任の人が引き継がれた仕事をやりたくないという理由で自分より早く退職するという、訳のわからない状況になっている。”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;a href="https://twitter.com/Hirowa3/status/159122645479206914"&gt;Twitter / @Hirowa3&lt;/a&gt; (via &lt;a class="tumblr_blog" href="http://shibata616.tumblr.com/"&gt;shibata616&lt;/a&gt;)&lt;/em&gt;</description><link>http://blog.jbking.org/post/16005985411</link><guid>http://blog.jbking.org/post/16005985411</guid><pubDate>Tue, 17 Jan 2012 22:51:50 +0900</pubDate></item><item><title>"【コピペして使ってね】さっきマックで女子高生が「彼氏が（   ）だったんだけど」「マジで別れた方がいいよ」「そうだよね・・・私も（   ）なんかやめて（  ..."</title><description>“【コピペして使ってね】&lt;br/&gt;さっきマックで女子高生が「彼氏が（   ）だったんだけど」「マジで別れた方がいいよ」「そうだよね・・・私も（   ）なんかやめて（   ）にしようよって何度も言ってるんだけど」「そういう問題じゃないよ（   ）じゃない男とかあり得ない」とか言ってた”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;a href="http://blog.livedoor.jp/manamerit/archives/65537617.html"&gt;マック女子高生メソッドの威力 - さまざまなめりっと&lt;/a&gt; (via &lt;a href="http://komatak.tumblr.com/" class="tumblr_blog"&gt;komatak&lt;/a&gt;)&lt;/em&gt;</description><link>http://blog.jbking.org/post/15608603392</link><guid>http://blog.jbking.org/post/15608603392</guid><pubDate>Tue, 10 Jan 2012 14:42:55 +0900</pubDate></item><item><title>sqlalchemy-migrate</title><description>&lt;p&gt;チュートリアルみれば一発だけど、備忘録にメモしておく。&lt;/p&gt;

&lt;h2&gt;準備&lt;/h2&gt;

&lt;h3&gt;インストール&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;% pip install sqlalchemy-migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;migrateコマンドができる。名前があれなのでvirtualenvがあったほうがいいと思う。&lt;/p&gt;

&lt;h3&gt;リポジトリ作成&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;% migrate create リポジトリパス リポジトリ名
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;my_repositoryってパスで作成するとこんな構成になる。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;% find my_repository
my_repository
my_repository/__init__.py
my_repository/manage.py
my_repository/migrate.cfg
my_repository/README
my_repository/versions
my_repository/versions/__init__.py
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;tip&lt;/h3&gt;

&lt;p&gt;酒徳さんの&lt;a href="http://labs.unoh.net/2007/09/migrate.html"&gt;記事&lt;/a&gt;にあるようにmanage.pyに設定を直接書き込んじゃうのは、結構よくあるようなので設定しておくと楽。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;% cat my_repository/manage.py
#!/usr/bin/env python
from migrate.versioning.shell import main

if __name__ == '__main__':
    main(debug='True',
         repository='my_repository',
         url='sqlite:///project.db')
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;マイグレーション用にセットアップ&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;% python my_repository/manage.py version_control
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;通常作業&lt;/h2&gt;

&lt;h3&gt;マイグレーションスクリプトの作成&lt;/h3&gt;

&lt;p&gt;先の記事に書かれてたワークフローより簡略化されてて、&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;% python my_repository/manage.py script 説明
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;でナンバリングされたそのスクリプトがリポジトリパス/versions配下に置かれるので、そのまま編集する。&lt;/p&gt;

&lt;h3&gt;バージョン確認&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;リポジトリのバージョン確認
% python my_repository/manage.py version
適用されてるデータベースのバージョン確認
% python my_repository/manage.py db_version
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;アップグレード/ダウングレード&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;アップグレード
% python my_repository/manage.py upgrade [バージョン]
ダウングレード
% python my_repository/manage.py downgrade [バージョン]
&lt;/code&gt;&lt;/pre&gt;</description><link>http://blog.jbking.org/post/14796757009</link><guid>http://blog.jbking.org/post/14796757009</guid><pubDate>Mon, 26 Dec 2011 13:41:50 +0900</pubDate></item><item><title>logiq:

一人おかしい</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_lw9wl0HzfC1qzyazmo1_250.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://logiq.tumblr.com/post/14288197784" class="tumblr_blog"&gt;logiq&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;一人おかしい&lt;/p&gt;&lt;/blockquote&gt;</description><link>http://blog.jbking.org/post/14300399382</link><guid>http://blog.jbking.org/post/14300399382</guid><pubDate>Fri, 16 Dec 2011 15:37:07 +0900</pubDate></item><item><title>PyPy Advent Calendar 2011 八日目 - What is ObjectSpace?</title><description>&lt;p&gt;この記事は&lt;a href="http://atnd.org/events/22078"&gt;PyPy Advent Calendar 2011&lt;/a&gt;の八日目の記事です。&lt;a href="https://sites.google.com/site/pypyja/pypy-advent-calendar-2011"&gt;まとめ&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;総帥に続きまして、&lt;a href="http://twitter.com/jbking"&gt;ユウスケ@jbking&lt;/a&gt;です。&lt;/p&gt;

&lt;h3&gt;普通の奴らの下を行け&lt;/h3&gt;

&lt;p&gt;皆さんももうご存知のこととは思いますが、CPythonはCで書かれており、PyPyは(R)Pythonで書かれています。今回はPyPyの仕組みのうち、ObjectSpaceについてです。&lt;/p&gt;

&lt;h3&gt;What is ObjectSpace?&lt;/h3&gt;

&lt;p&gt;ObjectSpaceとは簡単にいうと環境や空間と表されるもので、その中にオブジェクトを閉じ込め、その内の空間とグローバル空間とを分けるもの、です。&lt;/p&gt;

&lt;p&gt;CPythonではバイトコードインタプリタが、それに対応するオペレーションのCの関数を直接実行しますね。
PyPyではバイトコードインタプリタが、それに対応するオペレーションをObjectSpaceに委譲し、移譲された側のObjectSpaceがそのオペレーションを実行します。&lt;/p&gt;

&lt;p&gt;よく使われるObjectSpaceの実装にStdObjSpaceとFlowObjSpaceがあります。
それぞれ、標準的にPyPyで使われるもの、翻訳(Translate)に使われControl-Flowを作るものです。&lt;/p&gt;

&lt;h3&gt;ObjectSpaceをさわってみよう&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;変換されていないCPythonで実行される&lt;/strong&gt;py.pyインタプリタを使うと、本来なら環境であり触ることのできないObjectSpaceをさわることができます。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;% ./bin/py.py
[platform:execute] gcc -c -arch x86_64 ... 環境チェックとかが走る。
faking &lt;type 'module'&gt;
faking &lt;type 'member_descriptor'&gt;
PyPy 1.7.1-dev0 in StdObjSpace on top of Python 2.7.2 (startuptime: 29.72 secs)
&gt;&gt;&gt;&gt;
&gt;&gt;&gt;&gt; i = 3
&gt;&gt;&gt;&gt; print(i)
3
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;“&gt;”が4つありますね。これがPyPyインタラクティブシェルです。&lt;/p&gt;

&lt;p&gt;では一旦、インタプリタレベルのインタラクティブシェルに出てみましょう。MacOSXではCtrl-Cで出られます。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Traceback (most recent call last):
  File "/Users/yusuke/src/pypy/pypy/tool/runsubprocess.py", line 38, in &lt;module&gt;
    operation = sys.stdin.readline()
KeyboardInterrupt
Python 2.7.2 (default, Sep 16 2011, 10:30:52) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
*** Entering interpreter-level console ***
&gt;&gt;&gt; dir()
['__builtins__', 'buffer', 'compile', 'console_compiler_flags', 'console_locals', 'filename',
 'space', 'tracelevel', 'verbose', 'w___builtins__', 'w___name__', 'w___package__', 'w___pytrace__', 'w_i']
&gt;&gt;&gt; space
StdObjSpace
&gt;&gt;&gt; w_i
W_IntObject(3)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;さて、ここで興味をひくものが2つ表示されました。&lt;em&gt;space&lt;/em&gt;と&lt;em&gt;w_i&lt;/em&gt;です。spaceはこのセッションで使われているObjectSpaceで、w_iは先に定義した変数で、spaceで管理されているオブジェクトです。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&gt;&gt;&gt; space.unwrap(w_i)
3
&gt;&gt;&gt; space.add(w_i, space.wrap(5))
W_IntObject(8)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;spaceの中から値を取り出したり、spaceの中で計算してみるとこんなかんじになります。&lt;/p&gt;

&lt;h3&gt;これの何が嬉しいの?&lt;/h3&gt;

&lt;p&gt;何が嬉しいんでしょうかね?&lt;/p&gt;

&lt;p&gt;冗談です。:-)&lt;/p&gt;

&lt;p&gt;複数のObjectSpaceの実装があることは既に述べましたが、実はすでに紹介したもの以外にもあります。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://pypy.readthedocs.org/en/latest/objspace.html"&gt;Object Spaces — PyPy 1.6 documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;これらはPyPy自体で使用されているか、PyPyを(で)開発するためにあります。&lt;/p&gt;

&lt;p&gt;また、このObjectSpaceの仕組みはインターフェースが整備されているので、独自の実装に切り替えることができます。Thunkで拡張したものとかみると、その面白さが伝わるかもしれません。&lt;/p&gt;

&lt;p&gt;Haskellのように遅延評価を行うPyPy処理系を作ることも、そんなに難しくはないでしょう。誰か書いて来年のアドベントカレンダーでドヤ顔する姿が目に浮かびます。&lt;/p&gt;

&lt;h3&gt;次の人&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://twitter.com/aodag"&gt;@aodag&lt;/a&gt;先生お願いしますー。&lt;/p&gt;</description><link>http://blog.jbking.org/post/13916338823</link><guid>http://blog.jbking.org/post/13916338823</guid><pubDate>Thu, 08 Dec 2011 19:16:50 +0900</pubDate></item><item><title>oc151:

Thumbs up ! stamp：</title><description>&lt;img src="http://28.media.tumblr.com/tumblr_lvpwy2ngOn1r34fvoo1_400.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://oc151.tumblr.com/post/13770830954/thumbs-up-stamp" class="tumblr_blog"&gt;oc151&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Thumbs up ! stamp：&lt;/p&gt;&lt;/blockquote&gt;</description><link>http://blog.jbking.org/post/13914676080</link><guid>http://blog.jbking.org/post/13914676080</guid><pubDate>Thu, 08 Dec 2011 17:20:11 +0900</pubDate></item><item><title>Mercurial Advent Calendar 2011 八日目</title><description>&lt;h2&gt;hgrc&lt;/h2&gt;

&lt;p&gt;この記事は&lt;a href="http://partake.in/events/902cd6d9-0215-4ea3-b51f-b8ff32e56426"&gt;Mercurial Advent Calendar 2011&lt;/a&gt;の八日目の記事です。&lt;/p&gt;

&lt;p&gt;皆さんhgrcでMercurialカスタマイズしてますか?&lt;/p&gt;

&lt;p&gt;今回は私の~/.hgrcからいつも使ってる設定をいくつか紹介します。&lt;/p&gt;

&lt;h3&gt;晒してみる&lt;/h3&gt;

&lt;p&gt;extensionsは皆さんご存知ですね。エクステンションを有効にします。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[extensions]
hgext.mq=
hgext.convert=
color=
graphlog=
rebase =
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;aliasはhg [sub_command]の部分を独自に定義できます。既存のコマンドの再定義もできるので強力ですね。1.x時代に定義したので、いくつかもっとスマートに定義しなおせる気もします。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[alias]
glog = glog --color=always
latest = glog -l 5
diff = diff --color=always
lob = !$HG log -b `$HG branch` $@
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;見やすさは正義。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[color]
mode = ansi
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;pythonはそのソースコードと同じ場所にコンパイルされたバイトコード(pyc)を配置するのですが、ソースコードの配置を変えてコミット、違うブランチへアップデートしなおしたとき、もちろんソースコードの場所は変わるのですが、コンパイルされたファイルは元の場所のままに。これが予期せずデバッグのときに読み込まれると、作業がはかどらないのでフックで消してます。
意外に便利です。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[hooks]
update.clean = find . -name \*.pyc -or -name \*.orig | xargs rm -f
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ホスト特有の設定など環境依存の部分は外出しにしておくと、.hgrcのリビジョン管理がはかどります。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;%include ~/.hgrc.local
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;hgrcは便利だよ&lt;/h3&gt;

&lt;p&gt;hg help configでみると膨大なドキュメントが出てきますが、じっくり腰をすえて読んでみると、皆さんの手元で起きているイケてない課題を一発で解決できるかもしれません。皆さん年末の*rcファイルの大掃除に大忙しのことと思いますが、そこにhgrcも含めてみたらいかがでしょうか? :-)&lt;/p&gt;</description><link>http://blog.jbking.org/post/13903638920</link><guid>http://blog.jbking.org/post/13903638920</guid><pubDate>Thu, 08 Dec 2011 11:51:41 +0900</pubDate></item><item><title>Python3 Advent Calendar 二日目 - What is ABC?</title><description>&lt;p&gt;ということで、&lt;a href="http://twitter.com/shomah4a"&gt;@shomah4a&lt;/a&gt;さんから引き継ぎました、&lt;a href="http://twitter.com/jbking"&gt;@jbking&lt;/a&gt;です。&lt;/p&gt;

&lt;h2&gt;ABCって何だ?&lt;/h2&gt;

&lt;h3&gt;三行で。&lt;/h3&gt;

&lt;ul&gt;&lt;li&gt;AbstractBaseClassesの略で&lt;a href="http://www.python.org/dev/peps/pep-3119"&gt;PEP 3119&lt;/a&gt;に仕様があります。&lt;/li&gt;
&lt;li&gt;組み込み関数であるisinstanceやissubclassに作用を与える紳士協定的(Pythonらしい!)フレームワークです。&lt;/li&gt;
&lt;li&gt;動的言語に静的言語のメリットの一部を取り込んだかんじ。&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;論よりコード&lt;/h3&gt;

&lt;p&gt;ということで、動きを見てみましょう。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;% ipython3
Python 3.2.2 (default, Sep  6 2011, 16:21:14) 
Type "copyright", "credits" or "license" for more information.

IPython 0.11 -- An enhanced Interactive Python.
?         -&gt; Introduction and overview of IPython's features.
%quickref -&gt; Quick reference.
help      -&gt; Python's own help system.
object?   -&gt; Details about 'object', use 'object??' for extra details.

In [1]: from abc import ABCMeta, abstractmethod

In [2]: class A(metaclass=ABCMeta):  # ※1
   ...:     @abstractmethod
   ...:     def foo(self):
   ...:         pass
   ...:     

In [3]: A()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/Users/yusuke/&lt;ipython-input-3-3cd318a12eea&gt; in &lt;module&gt;()
----&gt; 1 A()

TypeError: Can't instantiate abstract class A with abstract methods foo

In [4]: class B(A):
   ...:     pass
   ...: 

In [5]: B()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/Users/yusuke/&lt;ipython-input-5-1c5ecc61f85b&gt; in &lt;module&gt;()
----&gt; 1 B()

TypeError: Can't instantiate abstract class B with abstract methods foo

In [6]: class C(A):
   ...:     def foo(self):
   ...:         print(42)
   ...:         

In [7]: C()
Out[7]: &lt;__main__.C at 0x101f59c90&gt;

In [8]: issubclass(B, A)
Out[8]: True

In [9]: issubclass(C, A)
Out[9]: True
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;※1 これはPython3のメタクラス指定の構文です。Python2では__metaclass__でした。&lt;/p&gt;

&lt;p&gt;こんな感じに動きます。&lt;/p&gt;

&lt;h3&gt;でもこれってJavaの抽象クラスと違いないんじゃない?&lt;/h3&gt;

&lt;p&gt;はい、静的言語というかJavaの抽象クラスっぽく見えますね。ただABCは&lt;strong&gt;紳士協定的&lt;/strong&gt;なフレームワークなので実際のところ上記の継承関係を&lt;strong&gt;強制するわけではありません&lt;/strong&gt;。あなたがこれはあるABCの必要実装を満たしていると宣言したければ、そのABCを継承しなくとも、また実際には全部を実装をしなくとも、必要要件を満たしているとみなします。&lt;/p&gt;

&lt;h3&gt;えっ、なにそれ?&lt;/h3&gt;

&lt;p&gt;引き続き見てみましょう。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;In [10]: class D(object):
   ....:     pass
   ....: 

In [11]: A.register(D)

In [12]: D()
Out[12]: &lt;__main__.D at 0x101f75310&gt;

In [13]: issubclass(D, A)
Out[13]: True
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;クラスDは実際にはクラスAを継承してませんし、実装も足りてません、がissubclassはクラスDはクラスAのサブクラスだと判断しました。&lt;/p&gt;

&lt;p&gt;これがABCのAbstract(抽象的な)の意味です。これと比べるとJavaの抽象クラスはConcreteっぽくも見えます。どちらがいいかは明言しませんが。 :-X&lt;/p&gt;

&lt;h3&gt;挙動はわかったけど、何が嬉しいの?&lt;/h3&gt;

&lt;p&gt;あるものと見なせるというのは強力です。そしてそれを意図的に操作できるならばもっと柔軟で強力です。前者はpolymorphismで皆さんが理解されていることだと思いますが、さらに発展して後者を考えてみましょう。&lt;/p&gt;

&lt;h3&gt;is-a&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;ダックタイピングを説明するときに出てくる有名なフレーズですね。今まで「アヒルのように歩いて」「アヒルのように鳴くならば」それは「アヒルであるとみなす」ことをやってきました。&lt;/p&gt;

&lt;p&gt;Pythonで書くとこんなかんじですね。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;In [14]: def is_duck(obj):
   ....:     return getattr(obj, 'walk', False) and getattr(obj, 'quack', False)
   ....: 

In [15]: is_duck(object())
Out[15]: False
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ABCを導入すると最後の「アヒルであるとみなす」を型として定義できるようになります。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;In [16]: class Duck(metaclass=ABCMeta):
   ....:     pass
   ....: 

In [17]: class Human(object):
   ....:     pass
   ....: 

In [18]: Duck.register(Human)

In [19]: an_human = Human()

In [20]: issubclass(Human, Duck)
Out[20]: True

In [21]: isinstance(an_human, Duck)
Out[21]: True
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;具体的なメリットとして&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;今まで暗にそれとみなしていたオブジェクトを型で操れる。(fileライクオブジェクト、iteratorable、generator、etc…)&lt;/li&gt;
&lt;li&gt;テストしやすく、かつ堅牢なコードになる。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;があります。前者についてはioモジュールやcollectionsモジュールでのABCで定義されたクラスの仕様を参照してください。後者は一言で言うと「getattrで行なっていたライクオブジェクトの型チェックをちゃんとできるようになる」です。&lt;/p&gt;

&lt;p&gt;他の使い方は今は思いつきませんが、きっと近い未来素晴らしいハッカーが、素晴らしい使い方を編み出してくれるでしょう。 :-)&lt;/p&gt;

&lt;h3&gt;蛇足&lt;/h3&gt;

&lt;p&gt;気づいた方もいらっしゃるかと思いますが、IPythonはPython3でも動きます。インストールちょっと気を付けないと(pipだとインストールできない)、動かないのですがやっぱり便利です。&lt;/p&gt;

&lt;p&gt;IPythonなにそれ?な人は四の五の言わずに入れましょう。&lt;/p&gt;

&lt;h2&gt;次の人&lt;/h2&gt;

&lt;p&gt;New GIL実装に興味があり、早く知りたいので&lt;a href="http://twitter.com/methane"&gt;@methane&lt;/a&gt;さん、お願いします。&lt;/p&gt;</description><link>http://blog.jbking.org/post/13626447256</link><guid>http://blog.jbking.org/post/13626447256</guid><pubDate>Fri, 02 Dec 2011 15:48:00 +0900</pubDate></item><item><title>blahxxx3:


Google 画像検索結果:...</title><description>&lt;img src="http://29.media.tumblr.com/tumblr_lvc2q3QCMY1qeifrio1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a class="tumblr_blog" href="http://blahxxx3.tumblr.com/post/13411228518/google"&gt;blahxxx3&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://www.google.co.jp/imgres?q=yattanetaechan&amp;um=1&amp;hl=ja&amp;client=firefox-a&amp;sa=N&amp;rls=com.google:ja:official&amp;biw=1270&amp;bih=655&amp;tbm=isch&amp;tbnid=Ly8orv78DfT1iM:&amp;imgrefurl=http://unkar.org/r/mental/1263398394&amp;docid=bUYQjlO27ZnC5M&amp;itg=1&amp;imgurl=http://7.media.tumblr.com/tumblr_ku979dvLtK1qz4hsdo1_500.jpg&amp;w=500&amp;h=505&amp;ei=YYvSTrLyD-Td0QG19Kws&amp;zoom=1&amp;iact=hc&amp;vpx=573&amp;vpy=219&amp;dur=3986&amp;hovh=226&amp;hovw=223&amp;tx=112&amp;ty=252&amp;sig=115157582310688180740&amp;page=1&amp;tbnh=136&amp;tbnw=135&amp;start=0&amp;ndsp=18&amp;ved=1t:429,r:8,s:0"&gt;Google 画像検索結果: &lt;/a&gt;&lt;a href="http://7.media.tumblr.com/tumblr_ku979dvLtK1qz4hsdo1_500.jpg"&gt;&lt;/a&gt;&lt;a href="http://7.media.tumblr.com/tumblr_ku979dvLtK1qz4hsdo1_500.jpg"&gt;&lt;/a&gt;&lt;a href="http://7.media.tumblr.com/tumblr_ku979dvLtK1qz4hsdo1_500.jpg"&gt;&lt;a href="http://7.media.tumblr.com/tumblr_ku979dvLtK1qz4hsdo1_500.jpg"&gt;http://7.media.tumblr.com/tumblr_ku979dvLtK1qz4hsdo1_500.jpg&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://blog.jbking.org/post/13624700749</link><guid>http://blog.jbking.org/post/13624700749</guid><pubDate>Fri, 02 Dec 2011 14:41:17 +0900</pubDate></item><item><title>なぜ私がTuningathon 2で4位に入ったか?</title><description>&lt;p&gt;初参加のTuningathonで4位に入りました。これといった特別なことが出来なかったので、スコアが発表されたときは正直何が起こったのかよくわからずキョドってしまいましたが、一つ仮説が浮かんだので書いておきます。&lt;/p&gt;

&lt;h3&gt;今回の環境とレギュレーション&lt;/h3&gt;

&lt;p&gt;今回はAMIが2インスタンス提供され、それぞれにapache+mysql構成のWikipediaクローンがインストールされていました。レギュレーションは、&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;/var/www/html/mediawiki配下の編集と、&lt;/li&gt;
&lt;li&gt;データベース内のデータの改ざんが不可。&lt;/li&gt;
&lt;li&gt;それ以外は何してもよし、2フロントエンドも可。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;そして計測は紆余曲折がありつつですが、&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;http_load -parallel 4 -fetches 100 urlsで、urlsは元のクローンが200を返すURLがランダムに1000件入ったもの。&lt;/li&gt;
&lt;li&gt;2フロントエンドならば50リクエストずつ。&lt;/li&gt;
&lt;li&gt;Writeは全くないReadのみが計測の対象。&lt;/li&gt;
&lt;li&gt;レスポンスが200でない場合はペナルティがつく。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;と発表されました。&lt;/p&gt;

&lt;h3&gt;先ず仮説&lt;/h3&gt;

&lt;p&gt;今回私のスコアが高くなった背景には「スケールアウトとスケールアップ」のコンテキストで、図らずも私がスケールアウトの恩恵を受けられたからではないか、と考えられました。
「私が」というのは正確でなく、デフォルトの2フロントエンド構成のままだと恩恵を受けられたのではないか、ですが。&lt;/p&gt;

&lt;p&gt;今回の初期計測値は、デフォルトの構成のまま、1インスタンスに対して同セグメントから計測したところ0.9req/secでした。なので2フロントエンドでならば処理はたがいに完全に独立しているので、内部ネットワーク上では0.9*2req/secは理想値として妥当そうです。これがもしWeb+DB構成にすると、たしかにリソースの無駄は抑えられるでしょうが、その理想値以上の値はでたのかな、と思います。&lt;/p&gt;

&lt;p&gt;私の自己計測での最終スコアは1インスタンスについて2.3req/secでしたので、*2して外部からリクエストしたときのオーバーヘッドを差っ引いて、3.25req/secになったのかなぁと後々考えました。まぁ計測時にはTLに流れてた3オーバーreq/secの速報をみててもうオワタ気分でしたが。&lt;/p&gt;

&lt;p&gt;もしかしたら私含め数人、上位の方でなんで速くなったのか分からないってのはこれかもしれません。_o_&lt;/p&gt;

&lt;h3&gt;でお前は何をやったのよ?&lt;/h3&gt;

&lt;ol&gt;&lt;li&gt;http_loadのビルド&lt;/li&gt;
&lt;li&gt;テスト用のURLリストの作成&lt;/li&gt;
&lt;li&gt;PHP 5.4.0 beta1のビルド -&gt; no symbol php__pcre_default_tables -&gt; make clean -&gt; インストール成功 Wikipediaクローンもパッと動いてる様&lt;/li&gt;
&lt;li&gt;# pecl install apc &lt;- この時点で2.3req/sec&lt;/li&gt;
&lt;li&gt;3と4をもう一台のインスタンスにも反映&lt;/li&gt;
&lt;li&gt;cherokeeのインストール &lt;- fcgi連携で失敗(Rewriteがうまくいかない)&lt;/li&gt;
&lt;li&gt;nginxのインストール &lt;- fcgi連携で失敗(Rewriteがうまくいかない)&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;apc最強。というか今回のケースだとPHP実行しているところが重いのはtopで一目瞭然だったのでそこの計算消費リソースをどう減らすか、から計画しました。どうやるかは前回のtuningathonで使用率が高かったapcをとりあえずインストールしてみるかぁ、とマニュアルざっとみてみたらいいかんじだったので、今回はそのまま選びました。インストール出来てよかったです。キャッシュヒット率が96%とか、うまくはまりました。他php-fpmがapc有効にしてると落ちたりあれな感じだったのですが、まぁそこはそれ。&lt;/p&gt;

&lt;p&gt;あと私はもうちょっとRewriteに慣れたほうがいい。&lt;/p&gt;

&lt;h3&gt;感想&lt;/h3&gt;

&lt;p&gt;innodb_pluginやmod_disk_cache、GNU parallelなど知らない単語が増えたので誰かに教えてもらいたいな、と思いました。調べるのはもうちょっとの間お腹いっぱいです。あと上の仮説が正しければですが、今回は運がよく良いスコアがでたので、次回参加できるならもうちょっと真面目にチューニングしたいな、と。OSとかインフラ周りのパラメータチューニングとか面白そうですよね。ぜひコンテスト内で自分を追い込んで勉強したいです。&lt;/p&gt;</description><link>http://blog.jbking.org/post/10893172630</link><guid>http://blog.jbking.org/post/10893172630</guid><pubDate>Sun, 02 Oct 2011 01:33:28 +0900</pubDate></item><item><title>bgnori:

カレログの正しい使い方 - orangestarの日記</title><description>&lt;img src="http://30.media.tumblr.com/tumblr_lqrrv33oJM1qzdyppo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://bgnori.tumblr.com/post/9610840123" class="tumblr_blog"&gt;bgnori&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/orangestar/20110830/1314708340"&gt;カレログの正しい使い方 - orangestarの日記&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;</description><link>http://blog.jbking.org/post/9614680776</link><guid>http://blog.jbking.org/post/9614680776</guid><pubDate>Wed, 31 Aug 2011 12:30:28 +0900</pubDate></item><item><title>ack</title><description>&lt;h3&gt;ack?&lt;/h3&gt;

&lt;p&gt;ackは一言で表すならば高機能版のgrepです。
環境によっては、ack-grepという名前になっていることもあります。
grepに比べ以下のような特徴があります。&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;code&gt;ack pattern&lt;/code&gt;が&lt;code&gt;grep -r pattern .&lt;/code&gt;タイプ量が減る！！&lt;/li&gt;
&lt;li&gt;検索対象をタイプ(後述)で識別し、余計なファイルを検索しないため、効率良く結果を得られる。&lt;/li&gt;
&lt;li&gt;よく知られてるPerlの正規表現を使える。&lt;/li&gt;
&lt;li&gt;~/.ackrcでデフォルトの挙動を設定できる。&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;私のファイルFOOが検索対象にならないんだけど&lt;/h3&gt;

&lt;p&gt;前述のとおりackは検索する対象をタイプで絞るので、もしかしたら未定義のタイプかもしれません。:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ack -f --show-types unknown.foo
unknown.foo =&gt; binary
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;このようになったらタイプを指定しましょう。:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ack -f --show-types --type-set foo=.foo unknown.foo
unknown.foo =&gt; foo,text
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;うまくいきましたか？
詳しくは、&lt;code&gt;ack --man&lt;/code&gt;の”Defining your own types”を参照してください。
いつも使うオプションであれば、~/.ackrcに追記しておきましょう。&lt;/p&gt;

&lt;h3&gt;うちの.ackrc&lt;/h3&gt;

&lt;p&gt;ハイライトとCoffeeScriptのタイプを定義しています。:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cat ~/.ackrc
--color
--type-set
coffee=.coffee
&lt;/code&gt;&lt;/pre&gt;</description><link>http://blog.jbking.org/post/9457627714</link><guid>http://blog.jbking.org/post/9457627714</guid><pubDate>Sun, 28 Aug 2011 00:42:57 +0900</pubDate></item><item><title>noseがbranch coverage(C1)に対応したようなので、jenkinsでレポートを作成した</title><description>&lt;h3&gt;はじめに&lt;/h3&gt;

&lt;p&gt;ベースはkuma8のこの記事&lt;a href="http://d.hatena.ne.jp/kuma8/20110204/1296828869"&gt;JenkinsとPythonの連携&lt;/a&gt;だが、ただしいくつかアップデートがある。
現時点でのnoseのリリースバージョンは1.1.2なので、それを対象にする。&lt;/p&gt;

&lt;h3&gt;noseにパッチをあてる&lt;/h3&gt;

&lt;p&gt;coverage(ver. 3.5)はbranch coverageをサポートするがnoseはリポジトリにパッチが取り込まれただけなので必要に応じて&lt;a href="http://code.google.com/p/python-nose/issues/detail?id=370"&gt;このパッチ&lt;/a&gt;をあてる。&lt;/p&gt;

&lt;h3&gt;noseを実行してcoverage.xmlとnosetests.xmlをえる&lt;/h3&gt;

&lt;p&gt;こんなかんじに:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;nosetests --with-xcover --cover-branches --with-xunit --with-doctest  # --cover-branchesが対象のオプション
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;実はnosexcoverを入れなくても.coverageは出来てるので:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;nosetests --with-coverage --cover-branches --with-xunit --with-doctest
coverage xml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ででもいい。
これなら追加プラグインは要らない。&lt;/p&gt;

&lt;h3&gt;jenkinsの実行&lt;/h3&gt;

&lt;p&gt;あとは元記事と以下同文。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lposs7CWsx1qz5tqq.png" alt=""/&gt;&lt;/p&gt;

&lt;h4&gt;tips&lt;/h4&gt;

&lt;p&gt;よくvirtualenvwrapperを使ってるのでjenkinsのビルドでシェルの実行をする冒頭に:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;. /Users/yusuke/.virtualenvs/foo-env/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;とかやって対象の環境をアクティベートするといい感じ。&lt;/p&gt;</description><link>http://blog.jbking.org/post/8712844376</link><guid>http://blog.jbking.org/post/8712844376</guid><pubDate>Wed, 10 Aug 2011 09:51:27 +0900</pubDate></item></channel></rss>

