WerkzeugでBasic認証

ふと思い立ってWerkzeugでBasic認証してみた。BasicAuthMiddlewareBasic認証を行い、認証が通ったらappに処理を移譲する。

WerkzeugではHTTPヘッダに対応するクラスがあり、Authorizationヘッダーの情報はRequest.authorizationで、WWW-Authenticateヘッダーの情報はResponse.www_authenticateで取得、設定できる。

# -*- coding: utf-8 -*-

from werkzeug.wrappers import Request, Response

class BasicAuthMiddleware(object):

    def __init__(self, app, config):
        self.app = app
        self.username = config['username']
        self.password = config['password']

    def __call__(self, environ, start_response):
        request = Request(environ)
        autorization = request.authorization
        if autorization is not None and \
               autorization.username == self.username and \
               autorization.password == self.password:
            return self.app(environ, start_response)
        else:
            response = Response("Authorization Required", mimetype='text/plain', status=401)
            response.www_authenticate.set_basic(realm='authentication required, please input username/password')
            return response(environ, start_response)
    

class App(object):

    def __call__(self, environ, start_response):
            response = Response("Hello!", mimetype='text/plain')
            return response(environ, start_response)


def create_app():
    app = App()
    app = BasicAuthMiddleware(app, {
        'username': 'trot.thunder',
        'password': 'gmail.com',
    })
    return app


if __name__ == '__main__':
    from werkzeug.serving import run_simple
    app = create_app()
    run_simple('127.0.0.1', 5000, app, use_debugger=True, use_reloader=True)

入門TortoiseHg+Mercurial

著者の id:flying-foozyさんから「入門TortoiseHg+Mercurial」を献本していただきました。

入門TortoiseHg + Mercurial

入門TortoiseHg + Mercurial

「入門ToritoiseHg+Mercurial」は同じ著者の「Mercurial入門」のスーパーセット的な内容になっています。 具体的には次の様な差分が有ります。

  • 全編TortoiseHgを使ってGUIで操作!(コマンドラインも併記されています)
  • Mercurial Queuesの解説がGUI!(TortoiseHgはMQの全ての機能を利用できる唯一のツールです)
  • revsetsによる高度な履歴検索の解説
  • graft、rebase、collapseなどを使った履歴改変方法の紹介
  • 詳細なリビジョングラフの解説

内容も盛りだくさんですし、表題の通りTortoiseHgを使ってGUIでサクサクDVCSの使い方を学べる良い本だと思います。 これからMercurialを使う、すでにMercurialを使っている人は是非立ち読みして購入しましょう。

reviewboardとtornadoを組み合わせてapacheを使わずに動かす

reviewboardを動かす場合apacheが前提になっているのでだるいです。ドメインとかも入力させられるし。僕はとりあえず8080で動かしたいんだ!的な。

wsgiが動いて静的ファイルがサーブ出来ればいいだけなのに、、、

ということで、tornadoを使ってさくっと動かしてみました。

serve.pyをrb-siteで指定したディレクトリに設置して次のコマンドで動かします。

python serve.py --port=8080

tornadoが優秀なのかでっち上げなのに結構キビキビ動く感じがしますね。

2013年の抱負

引っ越しかなぁ。いろいろ心機一転したいですが。

とりあえず直近の目標

  • RhodeCodeのメッセージの翻訳100%

  • mercurialの本家wikiの翻訳のお手伝い

  • TokyoMercurial#7 の開催

    • 2月くらいで良いですかね?
      • と思ったけど、イベントたくさんあった。。1月か3月かな。。

2012年って何やってたっけ?

ちょっと思い出してみます。

Mercurial

Mercurial的な活動だとこんな感じですかね。

  • TokyoMercurial 開催
  • mercurial-users.jpMercurialのマニュアルの日本語訳を掲載
  • rhodecodeのメッセージの日本語を作成(今見たら翻訳率89%くらい)
  • mercurial-develにパッチを投げて一本でも取り込んでもらう」を達成

勉強会関連

いろいろやってた感。PyConJPで発表したのは本当成長した感がある。

  • TokyoMercurial を開催したりハンズオン開催
  • hbstudy #33 でMercurialハンズオン開催
  • アジャイルサムライ新宿道場#8で発表
  • Python Developers Festa で発表
  • PyConJP 2012 で発表
  • 継続的デリバリー座談会を開いて途中で飽きた
  • Mercurial Advent Calendar 2012 開催

とろこで、2012年の抱負を見てみる

今年の抱負を見てみましたが、達成した物もあるので良かったなと思います。新しい言語覚えていない感。。

その他、雑感

  • DVCS(Mercurial, Git)の利用やJenkins導入は当たり前になった。次のステップを探そう。
  • コードレビュー大事。BitbucketでPullRequestつかって開発してると大きなミス、勘違いが減らせる。
  • Pythonうまくかけないなー。
  • JAX-RSやSpringMVC等を使ったモダンなWeb開発してみたい。プロジェクトの分け方とかも学んだので。
  • 体重増えた。

来年も良い年にしたいですね。

hg convert --splicemap でリポジトリ変換時に履歴を繋ぐ #mercurialjp

このエントリは Mercuiral Advent Calendar 2012 の25日目です。

またまたid:flying-foozyさんからネタを提供していただきました。長かったMercurial Advent Calendarもこれが最後です。

単にhg convertで変換してみる

リポジトリ変換を行うhg convert。ブランチのあるsubversionリポジトリで変換を行うとマージの無い履歴が出来ます。

$ hg convert -s svn -d hg http://svn.apache.org/repos/asf/commons/proper/dbcp/ apache-commons-dbcp-no-splicemap
# https://bitbucket.org/troter/apache-commons-dbcp-no-splicemap

変換したリポジトリのグラフはこんな感じでマージが無いです。

f:id:troter:20121226004001p:plain

--splicemap で履歴にマージを作る

この履歴、マージが無いので--splicemapを使って無理矢理作って見ましょう。(というのも、DBCPはtrunkに変更を入れて、その変更をbranchに取り込むという方式、つまりgraftする運用なのでマージは不要なのです。)

slipemapファイルには二つの書式が有ります。今回はマージの場合を使います。

対象のリビジョン 対象のリビジョンの親1 # ブランチングの場合
対象のリビジョン 対象のリビジョンの親1 対象のリビジョンの親2 # マージの場合

splicemap

先ほど変換したリポジトリdbcp-hg/.hg/shamap を参考にDBCP_1_4_x_BRANCHの分だけ作って見ます。

svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1039158 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1028593 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1039158
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1055296 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1039158 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1055296
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1056867 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1055296 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1056867
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1088644 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1084406 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1088645
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1096257 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1096256 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1096255
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1096260 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1096257 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1096259
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1096546 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1096260 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1096543
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1096549 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1096546 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1096550
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1096567 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1096549 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1096567
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1096570 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1096567 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1096570
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1097625 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1097170 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1097630
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1098458 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1097625 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1098459
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1222740 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1214435 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1222742
svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1302397 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/trunk@1222740 svn:13f79535-47bb-0310-9956-ffa450edef68/commons/proper/dbcp/branches/DBCP_1_4_x_BRANCH@1302423

このsplimemapをつかってリポジトリを変換し直して見ましょう。

% hg convert -s svn -d hg http://svn.apache.org/repos/asf/commons/proper/dbcp/ --splicemap dbcp-splicemap apache-commons-dbcp-use-splicemap
# https://bitbucket.org/troter/apache-commons-dbcp-use-splicemap

変換したリポジトリのグラフを見るとDBCP_1_4_x_BRANCHからtrunkにマージしているグラフになっていますね。

f:id:troter:20121226004037p:plain

--datesortでスリムにする

さて、先ほど変換したリポジトリですが、DBCP_1_4_x_BRANCHのコミットが連続している為、グラフが左右にぐわーっと広がっています。これはhg convertはデフォルトで--branchsortで履歴をソートするからです。 マージを組み込むとこのソートだと不便なので、--datesortを使って日付順にしてみましょう。

% hg convert -s svn -d hg http://svn.apache.org/repos/asf/commons/proper/dbcp/ --splicemap dbcp-splicemap --datesort apache-commons-dbcp-use-splicemap-datesort
# https://bitbucket.org/troter/apache-commons-dbcp-use-splicemap-datesort

変換したリポジトリのグラフを見てみましょう。Mercurialリポジトリの様にいい感じになってますね。

f:id:troter:20121226004057p:plain

まとめ

リポジトリ変換時に履歴を整形する --splicemap について紹介しました。また、履歴のソート順を制御する--branchsort--datesortに付いても触れました。

hg convertには他にも--branchmap--authormapなど様々な方法でリポジトリの変換方法を制御出来ます。 詳しくはhg convertのマニュアルを参照して、きれいに変換してあげてください。

特別なブックマーク bookmark('@') #mercurialjp

このエントリは Mercuiral Advent Calendar 2012 の21日目です。

id:flying-foozy さんからアンドキュメンテッドなMercurialの仕様を教えていただいたのでそのことをネタにします。

bookmark('@')

最近Mercurialのリポジトリブックマークが付きました。 bookmark('@') 君。Mercurialリポジトリのブックマークを見てみると、この@マークのブックマークしか存在しないので、いかにも特別こんな感じがします。

で、実際に特別な存在なんです。それはcloneしてみるとわかります。

% hg clone http://selenic.com/repo/hg
複製先ディレクトリ: hg
全リビジョンを取得中
リビジョンを追加中
マニフェストを追加中
ファイルの変更を追加中
18095 個のリビジョン(35296 の変更を 2179 ファイルに適用)を追加
ブランチ default へ更新中
ファイルの更新数 998、 マージ数 0、 削除数 0、 衝突未解消数 0

クローンしたリポジトリのリビジョンを調べてみましょう。

% cd hg
% hg log -r .
チェンジセット:   17980:83aa4359c49f
ブックマーク:     @
親:               17978:55b367bff8d2
親:               17979:b3ec0b5fd777
ユーザ:           Matt Mackall <mpm@selenic.com>
日付:             Wed Nov 28 16:15:05 2012 -0600
要約:             merge with stable

% hg tip
チェンジセット:   18094:8ceabb34f1cb
タグ:             tip
ユーザ:           Adrian Buehlmann <adrian@cadifra.com>
日付:             Wed Dec 19 10:02:43 2012 +0100
要約:             test-pathencode: compare current pathencoding implementations

%

これでわかりましたね!

clone時にリビジョンを指定しない場合のデフォルトのリビジョン

次の順番で見つかったものにupdateします。

1. bookmark('@')
2. branch('default')
3. tag('tip')

実装はhg.pyの該当箇所を参考にしてみてください。

bookmark('@') の使い方

defaultブランチの最新リビジョン以外を参照させたい場合に利用できます。たとえば次のようなことができます。

  • 最新の安定板のタグが付いたリビジョンに@を付けることで、clone時に安定したバージョンを見せることができる。

いろいろ応用方法があると思います。見つけたら#mercurialjpでつぶやいたり、Blogにまとめてみてください。