WerkzeugでBasic認証
ふと思い立ってWerkzeugでBasic認証してみた。BasicAuthMiddleware
でBasic認証を行い、認証が通ったら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」を献本していただきました。
- 作者: 藤原克則
- 出版社/メーカー: 秀和システム
- 発売日: 2013/02
- メディア: 単行本
- 購入: 3人 クリック: 3回
- この商品を含むブログ (5件) を見る
「入門ToritoiseHg+Mercurial」は同じ著者の「Mercurial入門」のスーパーセット的な内容になっています。 具体的には次の様な差分が有ります。
- 全編TortoiseHgを使ってGUIで操作!(コマンドラインも併記されています)
- Mercurial Queuesの解説がGUI!(TortoiseHgはMQの全ての機能を利用できる唯一のツールです)
- revsetsによる高度な履歴検索の解説
- graft、rebase、collapseなどを使った履歴改変方法の紹介
- 詳細なリビジョングラフの解説
内容も盛りだくさんですし、表題の通りTortoiseHgを使ってGUIでサクサクDVCSの使い方を学べる良い本だと思います。 これからMercurialを使う、すでにMercurialを使っている人は是非立ち読みして購入しましょう。
2013年の抱負
引っ越しかなぁ。いろいろ心機一転したいですが。
とりあえず直近の目標
RhodeCodeのメッセージの翻訳100%
- 新年一本目のPullRequestが取り込まれて95%位になったので、後もう少しです。
mercurialの本家wikiの翻訳のお手伝い
TokyoMercurial#7 の開催
- 2月くらいで良いですかね?
- と思ったけど、イベントたくさんあった。。1月か3月かな。。
- 2月くらいで良いですかね?
2012年って何やってたっけ?
ちょっと思い出してみます。
Mercurial
Mercurial的な活動だとこんな感じですかね。
- TokyoMercurial 開催
- mercurial-users.jpにMercurialのマニュアルの日本語訳を掲載
- 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
変換したリポジトリのグラフはこんな感じでマージが無いです。
--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
にマージしているグラフになっていますね。
--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のリポジトリの様にいい感じになってますね。
まとめ
リポジトリ変換時に履歴を整形する --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にまとめてみてください。