さくらのレンタルサーバー(スタンダード)でTrac-1.0.ja1+Subversionを使うメモ

もうtrac1.0日本語版がある!
http://www.i-act.co.jp/project/products/products.html

ということで、さっそく使おうとしたら、ひどい目*1に遭ったのでメモ。
文中の$HOMEは、実際の絶対パスに置き換える。

なにはともあれ、作業開始。
主にここを参考にした。
http://attosoft.info/trac/wiki/TracJaInstall

GenshiというTracの依存パッケージが絡むときにUnicodeDecodeErrorが出るかも、ということでデフォルトエンコーディングutf-8にしておく。

echo $PYTHONPATH
echo "import sys; sys.setdefaultencoding('utf-8')" > $HOME/usr/local/lib/python2.7/site-packages/sitecustomize.py

sitecustomize.pyは、.pthファイルみたく、pythonのサーチパスに置いておくと自動で読み込まれて、指定したスクリプトの実行前に走るファイル、らしい。

日本語のために国際化するので、Babelを先にインストール。
BabelがないとTracをインストールするときに国際化ファイルが作れない。

easy_install --prefix=$HOME/usr/local babel
easy_install --prefix=$HOME/usr/local http://www.i-act.co.jp/project/products/downloads/Trac-1.0.ja1.zip #依存関係を見てGenshiもインストールされる。

trac envを作る。ここではpublicという名前にした。

cd $HOME/trac
trac-admin public initenv
Project Name[My Project]>
Database connection string [sqlite:db/trac.db]> (何も書かないで改行)

cgiファイル生成・配置

trac-admin public deploy public
cp $HOME/trac/public/cgi-bin/trac.cgi $HOME/www/trac/public.cgi(ドキュメントルート以下ならどこでも)

$HOME/www/trac/public.cgiの最初の論理行として、これを書いておく。

import sys
sys.path.append("$HOME/usr/local/lib/python2.7/site-packages")
sys.path.append("$HOME/usr/local/lib/python2.7/site-packages/Trac-1.0.ja1-py2.7.egg")
sys.path.append("$HOME/usr/local/lib/python2.7/site-packages/Babel-0.9.6-py2.7.egg")
sys.path.append("$HOME/usr/local/lib/python2.7/site-packages/Genshi-0.6-py2.7.egg")

public.cgiの権限設定

chmod u+x $HOME/www/trac/public.cgi

SVNリポジトリ登録&resync

trac-admin $HOME/trac/public
repository add  
repository resync 

ここでエラー。はてな

TracError: Unsupported version control system "svn": Can't find an appropriate component, maybe the corresponding plugin was not enabled?

調べたところ、$HOME/trac/public/conf/trac.iniにこれを追記する。

[components]
tracopt.versioncontrol.svn.svn_fs.subversionconnector = enabled

trac-adminシェルをいったん閉じて、再度resyncすると、また別のエラー。はてな

TracError: Unsupported version control system "svn": No module named svn

調べたところ、svn-pythonというSubversionPythonバインディングが必要で、それはSubversionのソースファイルに含まれていて、インストールにはswigとやらが必要なんだそうな。
swigsvn-pythonをインストール。
http://www28.atwiki.jp/worktip/pages/14.html

wget http://prdownloads.sourceforge.net/swig/swig-2.0.8.tar.gz
tar zxvf swig-2.0.8.tar.gz
cd swig-2.0.8
./configure --prefix=~/usr/local
make
make install

tar zxvf subversion-1.6.16.tar.gz
cd subversion-1.6.16
which swig
./configure --prefix=~/usr/local \
 --enable-swig-bindings=python \
 --with-swig=~usr/local/bin/swig

make swig-py
make install-swig-py #installとswigの間にハイフンが要ることに注意

echo $PYTHONPATH
ln -s $HOME/usr/local/lib/svn-python/svn $HOME/usr/local/lib/python2.7/site-packages/svn
ln -s $HOME/usr/local/lib/svn-python/libsvn $HOME/usr/local/lib/python2.7/site-packages/libsvn

python -c "import svn"

これで万事OKのはず。またresyncする。

trac-admin $HOME/trac/public
repository resync 
Resyncing repository history for ...
1 revision cached.
Done.

いいぞ!その調子だ!
それで、svn commitと同時にtracリポジトリブラウザが更新されるように前に書いたpost-commitファイルを作っておく。
SVNリポジトリ配下のhooks/post-commit.tmplをhooks/post-commitにコピーして編集する。

#!/bin/sh

PYTHONPATH=※; export PYTHONPATH
※:これがないとhookスクリプトがtrac-adminを叩くときにImportErrorがくるけど、もう面倒なので※のところに、シェルでtrac-adminが動く状態でのpython -c "import sys; print ':'.join(sys.path)"の出力を貼っておく。

REPOS="$1"
REV="$2"

$HOME/usr/local/bin/trac-admin $HOME/trac/public changeset added "$REPOS" "$REV"

実行権限をつけておく。

chmod a+x post-commit

さて、hookスクリプトのチェックをしましょうかね、とsvn commitしたところでエラー。もうやだ。

svn: Commit failed (details follow):
svn: Couldn't perform atomic initialization
svn: Couldn't perform atomic initialization
svn: SQLite compiled for 3.7.9, but running with 3.7.6.2

調べたところ、リポジトリを古いバージョンのものとして作っておくといいそうな。
http://www.snowbotic.com/archives/61

svnadmin create --pre-1.6-compatible 

解決。hookスクリプトも走る。あー。

見るだけでログインしないし、trac.iniの[components]にこれを追記。

trac.web.auth.loginmodule = disabled

シンタックスハイライトを使う。
Pygmentsがおすすめなんだそうで。

easy_install --prefix=$HOME/usr/local pygments

おまけ:Pygmentsに好きなスタイルを追加する。

ここではhonzaさんのvim2pygmentsを使って、気に入っているVimのカラースキームを追加してみた。
vim2pygments.tar.gzのダウンロードページはここ

cp $HOME/usr/local/share/vim/vim73/colors/desert.vim ./
tar zxvf honza-vim2pygments-19a9339.tar.gz
python honza-vim2pygments-19a9339/vimpygments.py desert.vim > vim_desert.py
cp vim_desert.py $HOME/usr/local/lib/python2.7/site-packages/Pygments-1.5-py2.7.egg/pygments/styles/

エディターで$HOME/usr/local/lib/python2.7/site-packages/Pygments-1.5-py2.7.egg/pygments/styles/__init__.pyを開く。

#: Maps style names to 'submodule::classname'.
STYLE_MAP = {
  ...
  "Vim_Desert": "vim_desert::DesertStyle", # この行を追加する。vim_desert.pyにDesertStyleというクラスがあるってこと。
}

*1:レンタルサーバーならではの苦行だったというだけで、別にtrac1.0日本語版はなにもひどくない。

Tera TermでワンクリックSSHログイン

なにこれ便利。
http://ttssh2.sourceforge.jp/manual/ja/macro/
http://ttssh2.sourceforge.jp/manual/ja/macro/command/connect.html

autologin.ttl

; hostnameに自動でログインする Tera Term マクロ
; ttpmacro.exeに関連づけて使う

connect "hostname /ssh /2 /auth=publickey /user=username /passwd=password /keyfile=path\to\privatekey"

パスフレーズなしの鍵は/passwdを取ればおk。

Windows7のタスクバーに置くには、拡張子をいったん.exeにしてタスクバーにドラッグ&ドロップ、そのあと拡張子を.ttlに戻して、タスクバーに置いたアイコンを右クリック>ファイル名を右クリック>ショートカット>リンク先の拡張子を.exeから.ttlに変更する。

さくらのレンタルサーバー(スタンダード)に置いたSVNリポジトリを使う前にやること

サーバーにsubversionをインストールして、svnadmin create nanika
ここまではいい。
それをSSHでチェックアウトするとき、$HOME/binにsvnserveがないと具合が悪い。
だからこうしておく。

cd mkdir ~/bin
cd ~/bin
ln -s path/to/svnserve

こういうわけらしい↓
svnserve: command not found への対処@さくらインターネット
さくらインターネットに設置した subversion で ssh ログイン時に発生するエラー

TortoiseSVNでチェックアウトしようとすると、こういうエラーが出てくるものの、よくわからず、超ハマった。

To better debug SSH connection problems, remove the -q option from 'ssh' in the
[tunnels] section of your Subversion configuration file.

Ubuntuのシェルでsvn checkoutを叩くと、これが返ってきて、納得。そんなことかいな。

bash: svnserve: command not found

svn+sshでのチェックアウトでは、ログインシェルを開かないので.profileで設定したコマンドサーチパスが効かない。
ログインシェルを開かないで利用できるコマンドサーチパスには、とにかく$HOME/binが含まれている。
$HOME/binにsvnserveがあるといい。ないとだめ。それだけ。はあ…。

消えちゃ困るので引用しておく。

/usr/bin などの「普通のパス」に svnserve がインストールされている場合は何もしなくても SSH トンネリング経由でクライアント側からそれを実行できるが、そうでない場合はそのままでは実行できない。そして、サーバ側のログインシェルのパスの設定をいじってもそのような「普通でないパス」を検索できるようにはできない。というのも、SSH トンネリングではログインシェルを起動せずにコマンドの実行を行う必要があるからだ。 SSH は独自にコマンド検索パスを持っている。

調べたところ、これは ssh サーバ sshd の設定によって、 ssh 経由でリモートからコマンドを発行したとき、コマンドサーチパスである PATH をはじめとしたユーザ環境に制限がかけられているから、とのことらしい。なるほど、だから "command not found" なのだね。じぶんは、コマンドサーチパスのある場所にはインストールしていないのだから、このような結果となった。
すると、レンタルサーバゆえにサーバの設定は変えられないので、その制限された中で出来る事といえば、コマンドサーチパスのある場所に、 svn 関連コマンドを置く事、それしか、なさそうだ。--その唯一と思えたアプローチは、さいわいうまくいった。
リモートホスト、つまり ssh 接続先であるリポジトリを置いたレンタルサーバでは、次のように、コマンドサーチパスの設定の中に、じぶんのパーミッションが許されている場所があった。
$ ssh -l username hostname 'echo $PATH'
/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin:/home/username/bin
最後の "/home/username/bin" がそれで、とりもなおさずホームディレクトリの bin ディレクトリ。したがって、ここに、必要な svn 関連のコマンドを置いてしまえばよい、ことになる。
これで万事よし、というよりは、 sakura のレンタルサーバリポジトリに利用するには、このようにするほか、手段がないのかもしれない。

Windows7で、フォルダーの種類ごとに表示方法を設定する

2つのフォルダーがあるとする。

  1. サムネイルを見たいファイルがあるフォルダー「写真」
  2. そうでないフォルダー「その他」

「写真」フォルダーを開く。

  1. プロパティ>カスタマイズ>フォルダーの種類>このフォルダーを次の目的に最適化>「ピクチャ」に設定>OK
  2. 右クリック>表示>特大アイコン
  3. 整理*1>フォルダーと検索のオプション>表示>フォルダーに適用>はい>OK

「その他」フォルダーを開く。

  1. プロパティ>カスタマイズ>フォルダーの種類>このフォルダーを次の目的に最適化>「一般項目」に設定>OK
  2. 右クリック>表示>一覧
  3. 整理>フォルダーと検索のオプション>表示>フォルダーに適用>はい>OK

これで、フォルダーの種類を「ピクチャ」に設定したフォルダーは「特大アイコン」で表示され、フォルダーの種類を「一般項目」に設定したフォルダーは「一覧」で表示される。

フォルダーの種類を設定するとき「このテンプレートをすべてのサブフォルダーに適用する」を選択すると、そのフォルダー以下がすべてそのフォルダーと同じ種類になる。うまく分類するといい。

*1:ウィンドウの左上あたりにある

Pythonで、さくらのレンタルサーバー(スタンダード)のCGIを使う

さくらのレンタルサーバーではCGIを使うにあたってこういう決まりになってる。

どうもPythonスクリプトに.cgiという拡張子をつけて、$HOME/www/配下に置いたらいい様子。

ここではFlaskを使って、Hello Worldを表示してみる。

hello.cgi

#!/usr/local/bin/python
#coding: utf-8

from wsgiref.handlers import CGIHandler

from application import app

CGIHandler().run(app)

application.py

#coding: utf-8

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
  return "Hello World!"

レンタルなので、flaskをimportする前にサーチパスを書かないといけない。

import sys
sys.path.append("path/to/flask")