おれは CVS 大好き人間であり Persica の開発も asagi box の管理も CVS を利用している。
ところで Persica の開発は仕事場と自宅で行っているのだが、俸給生活者であり二児の父親でもあるおれにとってはそのどちらでもまとまった開発時間の確保は困難である。おのずと細切れの空き時間を寄せ集めて作業することになる。
ここで問題になるのは CVS リポジトリの扱いである。仕事場のファイアウォールはHTTPとHTTPSしか通さず、ネットワーク的に分断されているため、自宅の Linux サーバ上のリポジトリに仕事場からアクセスすることは出来ない。もちろんその逆も不可能である。
どちらの場所でも CVS を使う。それはおれの中では大前提である。しかし仕事場と自宅で別々にリポジトリを用意し、それぞれでコミットするなど論外もいいところで、一つのファイルを複数のリポジトリで管理した日には履歴が分散して CVS のメリットが損なわれてしまう。
なのでおれはミラーリングを行った。リポジトリそのものをコピーするのだ。手作業で。
具体的には帰宅前と就寝前にそれぞれの場所でリポジトリをアーカイヴし USB メモリに放り込み、出勤後と帰宅後にアーカイヴを展開してリポジトリを丸ごと入れ替えるのである。これなら一応編集履歴も一貫するし妙な衝突も起こらない。
しかし面倒は面倒なのだ。USB メモリを仕事場に置き忘れたりすると、その日が金曜なら週末丸々作業が停滞してしまう。というか一度実際に停滞した。これはストレスだ。
そこで業を煮やしたおれは仕事場から自宅にトンネルを掘ることにし、この度ついに開通に漕ぎ付けたのである。その立役者が stone だ。自宅サーバは固定 IP を持っていないので、その点で若干面倒を強いられているが、リポジトリを持ち歩く暴挙に比べれば屁でもない。
以下、その手順のメモ。
1.自宅 ADSL モデムの設定
→ ポート X へのアクセスはサーバに回す
2.自宅サーバの設定
→ stone はポート X への接続を ポート 22 に回す
→ stone はトラブル対策として cron で定期的に起動
3.仕事場マシン設定(常時)
→ Cygwin の $CVSROOT の設定
→ プロトコルは ext
→ ユーザ名は自宅サーバのもの
→ ホスト名は localhost
→ リポジトリパスは 自宅サーバのもの
4.仕事場マシン設定(利用時)
→ stone はポート 22 へのアクセスを自宅 IP のポート X へ回す
これで仕事場のマシン上の Cygwin から cvs コマンドを発行すると、localhost の stone が自宅サーバのポート X に転送してくれる。そして自宅サーバの stone がポート X へのアクセスをポート 22 に回し、これで仕事場と自宅との間に SSH 通信が確立するわけだ。
不便があると言えば仕事場の stone を起動する際にいちいち自宅サーバの IP を調べて stone.cfg を書き換えなければならない点だが、そのくらいは我慢しなければならんのだろうな。