マージソート

id:Voluntasとの会話で出てきたので書いてみた

#!/usr/bin/env python

def mergesort(a):
    if len(a) in (0, 1):
        return a
    p = len(a)/2
    f, b = a[:p],a[p:]
    return merge(mergesort(f), mergesort(b))

def merge(a, b, result=[]):
    if len(a) == 0:
        return result + b
    elif len(b) == 0:
        return result + a
    elif a[-1] < b[0]:
        return result + a + b
    elif b[-1] < a[0]:
        return result + b + a
    
    elif a[0] < b[0]:
        return merge(a[1:], b, result + [a[0]])
    else:
        return merge(a, b[1:], result + [b[0]])

def main():
    assert mergesort([]) == []
    assert mergesort([0]) == [0]
    assert mergesort([0, 1]) == [0, 1] 
    assert mergesort([1, 0]) == [0, 1] 
    assert mergesort([2, 0, 1]) == [0, 1, 2]
    import random
    dummy = [random.randint(0, 100) for x in xrange(100)]
    assert mergesort(dummy) == sorted(dummy)
    assert mergesort(sorted(dummy)) == sorted(dummy)
    assert mergesort(list(reversed(sorted(dummy)))) == sorted(dummy)


if __name__ == '__main__':
    main()

wsgiauthでopenid

wsgiauthはopenid認証にも対応してます。

そのまま使おうとしても足りないものがいくつか。
- python-openid
- python-urljr
- python-yadis
以上のモジュールが必要。
pypiに登録されてるのでeasy_installですぐ入れられます。

簡単な使い方

from wsgiauth.openID import openid
@openid("/Users/aodag/openidstore")
def app(environment, start_response):
    start_response("200 OK", [("Content-type", "text/html")])
    return ["Hello, %s!" % environment["REMOTE_USER"]]


port = 8000
httpd = make_server('', port, app)
httpd.serve_forever()

openidの引数には、ディレクトリを指定します。
このディレクトリは、openidの認証内容やなんか一時的な情報とか置くらしいです。

で、実行して、アクセスすると、非常に簡素な入力フォームが出てくるので、自分のopenidを入れると、openidサーバーにリダイレクトされます。
そして、認証許可すると、wsgiアプリに戻ってきます。
認証したユーザーの情報はREMOTE_USERで取得できます。