2010/06/25

header_logo trac

Ubuntu を入れたんで Trac + Mercurial でも作ってみようかと
最近 build ばっかしてて疲れてきたので package でサクサクいきたいです

package をまず探したいんですがファイルから探したいので
auto-apt とか apt-file とか入れようと思って
auto-apt 入れようとしたら凄い依存関係が攻めてきたので apt-file で
でも、apt-file 遅いんだよなぁ
$sudo aptitude install apt-file
(略)
$ sudo apt-file update
(略)
$ apt-file search bin/tracd
trac: /usr/bin/tracd
お前はそこまでしないと trac という package みつけられないのか!

trac を入れようとすると沢山依存関係で入ります。apache とか。
まぁ apache でいいですよね。
あと mercurial にしたいので trac-mercurial も入れます。

で、ここからググると思うでしょ?
でも Debian ならググらなくてもいいんです。
/usr/share/doc の下にドキュメント揃っていますの。
  • /usr/share/doc/apache2/README.Debian.gz
  • /usr/share/doc/trac/README.Debian.gz
  • /usr/share/doc/trac-mercurial/README.Debian
みたいに README に Debian って付いてるのが
Debian 系の設定方法が書いてあったりするファイルになります

/usr/share/doc/trac/README.Debian.gz に trac 環境の作り方細かに書いてあって
  Trac can work without vcs repository, but you may want to create
one for you project before creating a Trac environment. With
Subversion this can be made with:

$ mkdir /path/to/repos
$ svnadmin create /path/to/repos

A new Trac environment is created with trac-admin:

$ trac-admin /path/to/projectenv initenv
なんかレポジトリ作ってそれ使って trac を initenv しろと
今回は mercurial でいきたいので svn? って聞かれるところを hg と答えます

で、apache で使えるようにするには
Configuring as CGI, WSGI, FastCGI
---------------------------------

For trac >= 0.11 the *gi scripts have to be generated using the deploy command:

trac-admin /path/to/env deploy /path/to/www/trac
deploy しろと
WSGI がお薦めらしいので
#Trac as WSGI on Apache
#extra info on http://trac.edgewall.org/wiki/TracModWSGI
#info about daemon mode http://code.google.com/p/modwsgi/
# http://code.google.com/p/modwsgi/wiki/IntegrationWithTrac
WSGIScriptAlias /trac /path/to/www/trac/cgi-bin/trac.wsgi
WSGIScriptAlias を設定しろと
なんでまぁ例えば /etc/apache2/sites-available/default なんかに
WSGIScriptAlias 設定すればいいのかー

で、apache 再起動したら動かなかったんですが
そういえば mod_wsgi を入れた覚えがなく
$ apt-file search wsgi.conf
libapache2-mod-wsgi: /etc/apache2/mods-available/wsgi.conf
なので libapache2-mod-wsgi を入れました

で、最後に /usr/share/doc/trac-mercurial/README.Debian を見て
  [components]
tracext.hg.* = enabled

(略)

[hg]
# -- Show revision number in addition to the changeset hash
show_rev = yes

# -- Changeset hash format
node_format = short
# hex: Show the full SHA1 hash
# short: Show a shortened hash for the changesets
って設定を trac.ini にコピりました

これで http://192.168.0.1/trac とかにアクセスしちゃうと
mod_wsgi 経由で trac が動いちゃってるという素敵

で、動いたんだけど左上のロゴが壊れてたのでググったら
Tracサイトのロゴを変えたい - hack my life
src = site/your_project_logo.png
ってあるので、
trac の下の htdocs に your_project_logo.png って画像置けば OK だそうでした

2010/06/24

lucid xen domu

定期的に何かを更新するとか面倒ですよね
放っておくといつの間にか VM image も熟成しています
フレッシュなのが欲しいね! ということで作ることにしました

流行りには乗る方向で今回は Ubuntu

Debian 系である Ubuntu には debootstrap っていう
最小構成なシステムをネット経由で構築してくれるツールがあるので
debootstrap_1.0.23_all.deb を拾ってきて
$ ar -x debootstrap_1.0.23_all.deb
$ tar xfz data.tar.gz
みたいなことすると中身が取り出せます
usr ってディレクトリができてて中に色々ありますが
usr/share/debootstrap ってのが debootstrap のシステムみたいなもんなので
$ export DEBOOTSTRAP_DIR=(前は色々あるでしょうけど)usr/share/debootstrap
ってしときます

で、root_dir ってディレクトリ作っといて
おもむろに
$ ./usr/sbin/debootstrap --arch i386 lucid root_dir ftp://ftp.riken.go.jp/Linux/ubuntu
と打てばダウンロードと展開が始まります

で、以下は ext4 な file が root_dir にマウントされてると思って読んでね

終わったらデータは揃ってるんですけどまだ設定ができてないので
root_dir/etc/fstab に
/dev/hda1      /       ext4    errors=remount-ro       0       1
なんて書いて
root_dir/network/interfaces に
auto eth0
iface eth0 inet static
address 192.168.0.2
network 192.168.0.0
netmask 255.255.255.0
broadcast 192.168.0.255
gateway 192.168.0.1
dns-nameservers 192.168.0.1
みたいなの追加したらいいと思います
ほんとは Network の設定は NeworkManager とか使うんでしょうけど
まぁ、いつか覚えましょう

で、kernel ですよね
Xen 用の kernel で準仮想化といきたいところなんですが
Ubuntu の場合は server 用の kernel 使うんだったかなーと思いながら調べると
Xen: Debian Lenny Dom0 with Ubuntu Lucid Guest — Agile Web Operations
linux-image-ec2 を入れろと書いてある!! そんなのありますか
おどろいた

インストールするには chroot しましょう
$ chroot root_dir
$ apt-get update
$ apt-get install linux-image-ec2
$ apt-get install libc6-xen
的なことをしまして chroot を抜けます

root_dir/boot に initrd と vmlinuz ができてるんで
こいつらをコピーして Xen に登録してやったら完成です
簡単だよ Ubuntu! 簡単だよ Debian!!

2010/06/05

python "クラス変数"

やっぱりクラス変数のこと良く分かってませんでした
クラス変数?インスタンス変数? - Ponsukeの日記
これこれ

例えば
class A(object):
n = 0
l = []

def __init__(self):
print self.n, self.l

self.n = self.n + 10
self.l.append(10)

print self.n, self.l

A()
A()
こんなの実行すると
0 []
10 [10]
0 [10]
10 [10, 10]
ってなって
「なんで self.n が 0 に戻るんだYo!!」
とか思うわけですが
  • 変数を参照するときはインスタンス変数探して無かったらクラス変数も見にいく
  • 代入するときはインスタンス変数で無かったらインスタンス変数作る
というわけで
    self.n = self.n + 10
この右辺はクラス変数を見てるけど左辺はインスタンス変数なのでした。

クラス変数もインスタンスから self.xxx でアクセスできるとあるけれど
何か混乱しそうなので注意するか別の方法をとるかした方がいいなぁ
と思いました

2010/05/20

"unicode-1-1-utf-7"

なんか、メールでエラーが、っつーことで調べようと良く見ると
unicode-1-1-utf-7 って何だよって思ってググってみたんだけど
や、UTF-7 か、そうか、ASCII で見れちゃうのかとやっとこさ気付き
In [1]: print('+ayEwblPXT+GABTB4MG6RTU/hMGtZMWVXMFcwfjBXMF8wAg-'.decode('utf7').encode('euc-jp'))
次の受信者への配信に失敗しました。
で読めたっていう
それだけの話なんですけどね。

特に Exchange 2000 Server を恨んだりはしていません。

2010/05/13

sni

ことの始まりは
http://twitter.com/k4403/status/13880245576
このつぶやき

Google Reader で証明書に関する警告が出るということで
画像を見てみると FQDN が www.google.co.jp になっていました
ほぉ、www.google.co.jp でもアクセスできるのか、なんて思いつつ
Firefox でアクセスしたら www.google.com にリダイレクトされてしまった
あらら

とりあえず引いてみると
$ host www.google.co.jp
www.google.co.jp is an alias for www.google.com.
www.google.com is an alias for www.l.google.com.
www.l.google.com has address 66.249.89.99
www.l.google.com has address 66.249.89.104
まぁこの辺は色々な仕組みで IP address 渡されてるんだろうけど
でもまぁ、www.google.com の CNAME ってことになってるようで

で、他のブラウザでも、と思って w3m で繋いでみると
Bad cert ident www.google.com from www.google.co.jp: accept? (y/n)
むむむ?
何故 Firefox と結果が違うのだ?
ちなみに https://www.google.com/reader はちゃんと見れるの

で、どうやら 1 IP address で複数の証明書を利用しようとしてるみたいで
それには
  • マルチドメインな証明書 (CN とか SubjectAlternativeName に沢山書く)
  • ワイルドカードな証明書 (* 使う、ホスト名部分だけウマー)
  • Server Name Indication (SNI)
で、google はこの SNI っぽい

SNI?
そもそも何でそんな小細工しないといけなかったかというと
SSL/TLS の handshake の際に IP address だけ使ってたんですって
でも、Virtual Host 的なことは色々なサービスで使いたいのでこれは不便
マルチドメインとかワイルドカードもあったけど根本的に解決しようということなのか
登場したのが SNI だと思うの多分
Server Name Indication - Wikipedia, the free encyclopedia

でまぁ、どうしてるかというと、client hello に繋ぐ先の FQDN 入れるの
そうよね、伝えちゃえばいいのよね
で、Firefox で www.google.co.jp に繋いだところを wireshark で見てみたら
しっかり www.google.co.jp って名前を伝えているようでした
Google は SNI を使っている!!

SNI には 1 つだけ悲しいところがありまして
Windows XP がサポートしていません。2003 もかな。
Windows は CryptoAPI とかいう API で暗号回りを処理してるんだけど
多分それが古いのかな?
で、それを使ってる IE とか chrome が SNI 使えないみたいです。
(chrome はそのうち TLS まわりを自分でもってくるかもしれないけど)

例えば Google App Engine の Roadmap に
App Engine For Business Roadmap - Google App Engine - Google Code
独自ドメインで SSL 使えるようにって書いてあったりしますけど
ワイルドカードはダメだからマルチドメインか SNI かと思い
(IP address をしこたま用意してあるってのもあると思うんですが)
SNI だったら XP 切るのかなぁ〜、と思いました

でも Google だったら証明書も用意してくれるかなって思ったりもしたけど
審査があるんだよなぁ、やっぱ、証明書は自前で用意かなぁ
秘密鍵と CSR を作成してくれて、証明書と中間が用意できるようになるのかなぁ
や、アプリ部分と同様に upload するのかなぁ

ちょっと楽しみ

2010/05/07

property python

gnutls を使って SSL な server から証明書を取りたい話

gnutls python でサーバーの証明書は取ってきていましたが
python-gnutls にはその上の証明書を取る関数がありませんでした
で、とりあえずソース見てみると connection.py に
    @property
def peer_certificate(self):
if gnutls_certificate_type_get(self._c_object) != GNUTLS_CRT_X509:
return None
list_size = c_uint()
cert_list = gnutls_certificate_get_peers(self._c_object, byref(list_size))
if list_size.value == 0:
return None
cert = cert_list[0]
return X509Certificate(string_at(cert.data, cert.size), X509_FMT_DER)
とありました。
サーバの提示する証明書全部取って、頭だけ出している!!

で、何か decorator 付いてるけどその辺り慣れていないのでググりました
Pythonでプロパティ - crazy()for(;;)you();
なるほど! () を省略したいんだな!!

というわけで書いてみました
from gnutls.connection import (
ClientSession, GNUTLS_CRT_X509, X509Certificate, X509_FMT_DER,
byref, c_uint, string_at,
gnutls_certificate_type_get, gnutls_certificate_get_peers,
)

def peer_certificate_chain(self):
if gnutls_certificate_type_get(self._c_object) != GNUTLS_CRT_X509:
return []
list_size = c_uint()
cert_list = gnutls_certificate_get_peers(self._c_object, byref(list_size))
ders = []
for i in range(list_size.value):
cert = cert_list[i]
ders.append(X509Certificate(string_at(cert.data, cert.size), X509_FMT_DER))
return ders

ClientSession.peer_certificate_chain = property(peer_certificate_chain)

if __name__ == '__main__':
import socket
from gnutls import connection

cred = connection.X509Credentials()
sock = socket.socket()
session = connection.ClientSession(sock, cred)

session.connect(('www.google.com', 443))
session.handshake()

for i in session.peer_certificate_chain:
print("%s <- %s" % (i.subject, i.issuer))
で、動かすと
$ python chain.py
C=US,ST=California,L=Mountain View,O=Google Inc,CN=www.google.com <- C=ZA,O=Thawte Consulting (Pty) Ltd.,CN=Thawte SGC CA
C=ZA,O=Thawte Consulting (Pty) Ltd.,CN=Thawte SGC CA <- C=US,O=VeriSign\, Inc.,OU=Class 3 Public Primary Certification Authority
$
うん、動いた

でも場当たりでメソッド足したりだなんて Python 的と言えないのでは?
と悩んだりもしました
う〜ん

2010/05/04

rfc kindle

Kindle DX を借りることができました
考えていた用途に「RFC をゴロゴロしながら読む」というのがあったので
ここぞとばかりに、と思って思考停止しました

Kindle DX は mobi/azw/html/txt/pdf などの format が読めるそうです
RFC は txt で配布されています

txt はブラウザで見るような感じで表示されるのですが
RFC は等幅フォント? monospace? で表示されることを前提としている風で
若干文章ががちゃがちゃするうえに
ページのヘッダとフッタが定期的に入ってきて少し憂鬱になります

pdf は 1 ページ毎に文字がある領域めいっぱいに最大化して表示してくれます
といっても Kindle だったら小さくて「もっと大きくしてくれよ!」と思うところ
Kindle DX であれば大きいのでそれなりに読めるようになります
がしかしどうも IETF の pdf はフォントが薄い
Courier で表示されてると思うのですが何だか薄くてちょっと辛い感じでした
pdf で無理矢理フォント入れかえ? ん〜

Kindle で RFC や Internet Drafts を読む: 日誌
なるページをググって見つけてみましたが
RFC 2629 な形式で書かれた RFC に関するもので全てがというわけではありません
多分、これはちょっと試してみたんですが良く分からず
若しかしたらどれでも読めるのかもしれません

txt である RFC を今から色々と編集するというのも手間で嫌なので
HTML やら epub -> azw という手順を踏むのも嫌だったので
pdf で何かフォントを入れかえてやれば良いのではないかと思いました

a2ps/a2psj/u2ps/enscript など txt を ps にしてくれるのはあるんですが
どうもこいつらは Courier やその Bold 辺りで決め打ちらしく
というかどのフォントに変更すればいいのか決めていませんでした
ワードパッドか? ワードパッドでフォント変えて pdf にしたらいいのか??

とここで、LaTeX を思いだしました
LaTeX なら色々と等幅フォントがあるに違いなく
少なくとも Computer Modern に Typewriter がある!!
txt に関しては verb な何かで囲んでやればいいと思ったので
簡単な tex soucre 生成スクリプトを作成
import fileinput

print r'''\documentclass[12pt,a4paper]{article}

\addtolength{\topmargin}{-4cm}
\addtolength{\textheight}{100cm}
\addtolength{\textwidth}{3cm}
\addtolength{\oddsidemargin}{0cm}
\addtolength{\evensidemargin}{0cm}
\pagestyle{empty}

\begin{document}
\begin{verbatim}'''

lines = fileinput.input()
lines.next()
lines.next()

for line in lines:
line = line.rstrip("\n")
if line.find("\x0c") > -1:
print (r'''\end{verbatim}
\newpage
\begin{verbatim}''')
else:
print(line)

print r'''\end{verbatim}
\end{document}'''
プリアンブルとか出して
^L の度に verbatim を閉じて開いてるだけです

こんなのに rfc の txt 通してみたら
少なくとも IETF のよりは見易い pdf を得ることができました
ほんとは mobi とかで欲しいけど!
これでゴロゴロしてみようかと思います