Subversion 1.5への移行

Subversionの1.5より前のバージョンでは、内部ではリビジョン毎に同一ディレクトリにファイルが作成されるため、リビジョン数が大きくなるとかなり不安な状態になってしまう。*1
しかし、バージョン1.5からはshardingという仕組みが導入され、1000リビジョン毎に一階層深いディレクトリにファイルが作られるようになったので多い日も安心。
Improved support for large deployments on FSFS, via sharding


1.5では他にも新しい機能がいくつか追加されており、特にマージ関連の機能追加(Merge tracking)がうれしいのでバージョンアップしたいのだが、古いバージョンのクライアントが混在した場合にどうなるかが不安なので調べてみた。


検証に使用したのは以下のバージョン。

$ svn --version
svn, バージョン 1.5.3 (r33570)
   コンパイル日時: Oct 11 2008, 19:03:46
$ svn --version
svn, バージョン 1.4.2 (r22196)
   コンパイル日時: Mar 14 2007, 20:55:55

それぞれMacPortsCentOS 5.2での最新パッケージ。

Merge trackingを試してみよう

旧バージョンでの検証の前に、とりあえず新機能のMerge trackingを試してみよう。
サンプルとして svn://svn-server/trunk に rails のプロジェクトを作ってみた。

ブランチ作成

[~] $ svn copy svn://svn-server/trunk svn://svn-server/branches/first-test

trunkの作業コピーで適当なコントローラを作成

[~/trunk] $ ./script/generate controller -c login
[~/trunk] $ svn ci

first-testの作業コピーで適当なコントローラを作成

[~/first-test] $ ./script/generate controller -c profile
[~/first-test] $ svn ci

first-testの作業コピーにtrunkをマージ

[~/first-test] $ svn merge svn://svn-server/trunk
--- r2 から r4 までを '.' にマージしています:
A    test/functional/login_controller_test.rb
A    app/helpers/login_helper.rb
A    app/controllers/login_controller.rb
A    app/views/login

おぉ!

さらにtrunkの作業コピーで適当なコントローラを作成

[~/trunk] $ ./script/generate controller -c message
[~/trunk] $ svn ci

もう一度first-testの作業コピーにtrunkをマージ

[~/first-test] $ svn merge svn://svn-server/trunk
--- r5 から r6 までを '.' にマージしています:
A    test/functional/message_controller_test.rb
A    app/helpers/message_helper.rb
A    app/controllers/message_controller.rb
A    app/views/message

おおぉ!
手動でリビジョンを指定したり記録したりする必要がないぞ!


マージしたリビジョンはsvn:mergeinfoプロパティに記録されていた

[~/first-test] $ svn propget svn:mergeinfo
/trunk:2-6

最後にfirst-testブランチからtrunkへのマージ

$ svn merge --reintegrate svn://svn-server/branches/first-test
--- リポジトリ URL 間の差分を '.' にマージしています:
A    test/functional/profile_controller_test.rb
A    app/helpers/profile_helper.rb
A    app/controllers/profile_controller.rb
A    app/views/profile
 U   .

やったー

ただし、ブランチを作成してからtrunkにマージするまでの間にどちらかでディレクトリの移動(名前変更)又はコピーが行われていると、最後のマージで失敗してしまう。

[~/trunk] $ svn merge --reintegrate svn://svn-server/branches/first-test
svn: Cannot reintegrate from 'svn://svn-server/branches/first-test' yet:
Some revisions have been merged under it that have not been merged
into the reintegration target; merge them first, then retry.

その場合は以前と同じ方法でマージを行えば問題ない

[~/trunk] $ svn merge svn://svn-server/trunk@11 svn://svn-server/branches/first-test@11 .

古いバージョンでのマージ

ブランチ作成

[1.5:~] $ svn copy svn://svn-server/trunk svn://svn-server/branches/second-test

trunkの作業コピーで適当なコントローラを作成

[1.5:~/trunk] $ ./script/generate controller -c star
[1.5:~/trunk] $ svn ci

second-testの作業コピーで適当なコントローラを作成

[1.5:~/second-test] $ ./script/generate controller -c bookmark
[1.5:~/second-test] $ svn ci

1.4クライアントでsecond-testの作業コピーにtrunkをマージ

[1.4:~/second-test] $ svn merge -r 17:19 svn://svn-server/trunk
A    test/functional/star_controller_test.rb
A    app/helpers/star_helper.rb
A    app/controllers/star_controller.rb
A    app/views/star

trunkの作業コピーへさらに適当なコントローラを追加

[1.5:~/trunk] $ ./script/generate controller -c anond
[1.5:~/trunk] $ svn ci

1.5クライアントでsecond-testの作業コピーにtrunkをマージ

[1.5:~/second-test] $ svn merge svn://localhost/trunk
--- r17 から r21 までを '.' にマージしています:
A    test/functional/anond_controller_test.rb
A    test/functional/star_controller_test.rb
A    app/helpers/star_helper.rb
A    app/helpers/anond_helper.rb
A    app/controllers/anond_controller.rb
A    app/controllers/star_controller.rb
A    app/views/star
A    app/views/anond

重複してマージが行われてしまった。ファイルに一切変更がなければよきに計らってくれるみたいだけど、何らかの変更があると

--- r17 から r22 までを '.' にマージしています:
A    test/functional/anond_controller_test.rb
A    test/functional/star_controller_test.rb
A    app/helpers/star_helper.rb
A    app/helpers/anond_helper.rb
A    app/controllers/anond_controller.rb
'app/controllers/star_controller.rb' で競合が見つかりました。
選択: 延期 (p), 全差分 (df), 編集 (e),
        ヘルプでその他のオプションを表示 (h) : p
C    app/controllers/star_controller.rb
'app/views/star' を飛ばしました
A    app/views/anond

衝突する。

マージ作業を古いクライアントと混じりながら行う事は考慮されていないようだ。

まとめ

  • Merge trackingは便利
  • ブランチ作るならクライアントも1.5にした方が良い
  • 1.4以前でマージをすると不幸になる

*1:FSFSの場合

AutoRun


手元で確認したものでは、

  1. インターネット上からウィルスの本体をダウンロード(AutoRunで実行されるのはダウンローダ)
  2. 本体を実行
  3. (多分)本体が
    1. 各ドライブにAutoRunの設定をする
    2. 作成するファイルは読み取り専用隠しファイルのシステム属性
    3. 隠しファイルを表示しないようにレジストリの設定を変更
  4. ウィルスとしての本来の動作を行う(キーロガー?)

こういった事を行っているらしい。


作られる autorun.inf ファイルの中身はこんな感じ。
実際は所々にアンチウィルス避けと思われるランダムな文字列が含まれてた。

[Autorun]
open=virus.com
;shell\open=Open(&0)
shell\open\Command=virus.com
shell\open\Default=1
;shell\explore=Manager(&X)
shell\explore\Command=virus.com


Windows XPの場合、この状態ではドライブアイコンをダブルクリックしても、コンテキストメニューから開こうとしてもウィルスが実行されてしまうので、安全にドライブを開くには、ドライブ認識時のダイアログでフォルダを開いてファイルを表示するを選ぶか、エクスプローラのフォルダツリーからドライブを選択するかしないといけない*1


そんな変わった操作を完璧に行うのは大変なので、レジストリでAutoRunを無効にしてしまった方が良いと思う。
亜種だらけでアンチウィルスソフトもあまり役に立たないようなので。

http://www.mnet.ne.jp/~angie/kbase/xp-autorun.html

*1:コマンドラインとか他の方法もある

Time MachineでVMwareの仮想マシンがバックアップされるようになった

Time Capsuleを買ったで、VMware仮想マシンはTime Machineでバックアップされないようだと書いたのだけど、なんか最近バックアップの転送サイズが大きいなと思ったらバックアップされてた。


VWware Fusionのアップデート(1.1.1→1.1.2)をしたから?
置き場所が無かったアップデータのディスクイメージを仮想マシンフォルダに置いたから?


ともあれ仮想マシンを起動する度にバックアップが数GB単位で行われるので、嬉しいような悲しいような。


あと、関係ないけど先日操作ミスしてHDL-F300のデータを飛ばした。

HDL-F300をシャットダウンするスクリプト

眠りの浅くなったIO DATAのLANDISK HDL-F300を確実に寝かしつけるため、シャットダウンするスクリプトを書いてみた。

require 'net/http'
require 'uri'

HOST = '127.0.0.1'
PASSWORD = 'yourpassword'

Net::HTTP.version_1_2
Net::HTTP.start(HOST, 80) do |http|
    http.post('/gate/shutdown_set.cgi',
             ['adminpasshtm=' + URI.encode(PASSWORD), 'skipv=', 'submitbtn=OK'].join('&'))
end

電源をONにするためには本体のボタンを押さなければならないので、やり方としてはなんと言うかすごく…、エコ?

追記(2008/11/27) ファームウェア 1.02 以上ではこのスクリプトは機能しなくなった

I-O DATA LAN接続ハードディスク 「LANDISK」 300GB HDL-F300

I-O DATA LAN接続ハードディスク 「LANDISK」 300GB HDL-F300

Time Capsuleを買った

Time Capsuleの500GBを買った。
どうやら量販店にはまだ入荷していないみたいなので、ポイントを諦めApple Store渋谷で購入。35,800円。定価。
箱を入れてくれたリンゴマーク付きの袋が、背負うのでなければとても持ちづらい。これがAppleのおもてなしかっ!




箱の中身は、Time Capsule本体と電源ケーブル、あとは説明書等の冊子とAirMac ユーティリティインストール用ディスクのみ。LANケーブルは付いていないのであわせて買いたい。


底面はゴムのような素材になっていた。見えづらいけどアップルロゴ入り。


自宅のネットワークはルータと無線LANのアクセスポイントが別の機器になっているので、アクセスポイントを取り外してTime Capsuleを接続する。
AirMac ユーティリティをインストールし起動して選択肢を選んでいくだけで設定が終わる。Mac用なので、AP側をWPA-AESに設定したらつながらなくて*1頭を抱えるという事も無かった*2。とても簡単。
2008/11/12 追記
以前使用していたiBookはWPA-AESに対応していなかったらしいけど、現在のMacBookは対応している(WPA2 パーソナル)。非対応機器があるのでなければTime Capsule側はWPA/WPA2 パーソナルではなくWPA2 パーソナルに設定すべき。

Time Capsule自体もPPPoEを喋れるけど、WANポートからルータに接続して、ブリッジの無線LANアクセスポイントとして使う設定でも使えた。


Time Machineのバックアップは、初回は時間がかかると書いてあったので、初回のみ有線で行う事に。バックアップ対象は約100万ファイルの46GB。大体5-6分に1GBのペースで転送されている。netstatで見ると、TCPのポート548番を使って転送しているみたいだ。/etc/servicesによれば548番は「AFP over TCP」。AFP…。

バックアップは36GBくらいまで済んだ所で完了してしまった。残りの10GBは何のファイルだろうと思ったら、少なくとも5GBはVMware仮想マシンだった。ディスクイメージファイルが巨大だからだろうか。仮想マシンを起動する度に数GBのファイルが更新されるので、バックアップされたらされたで場所を取って困るけど。

その後の1時間毎のバックアップは数MB程度の転送なのですぐに終わる。ラップトップの場合、電源につながっていないとバックアップはしないそうだ。


仕様に

シリアルATAサーバグレードハードディスクドライブ

と書いてあったので静音性無視のマッチョなドライブが載っているのかと心配していたけど、ディスクアクセス時に多少カラカラ音がする以外は静か。空気の出入り口が見当たらないのでファンレスじゃないかと思う。本体を触ると結構温かいので夏場が心配。
追記: 分解写真を探してみたら、ファンは付いていた。

Time Capsule自体は静かだけど、Windowsファイル共有絡みのブロードキャストパケットを定期的に投げているため、I-O DATAのLANDISKがスリープに入ってもすぐ起きるようになってしまった*3。LANDISKはファンが回るので結構うるさい。なんてこった。

Apple Time Capsule 500GB MB276J/A

Apple Time Capsule 500GB MB276J/A

*1:現行機種は対応しているらしいけどはっきりしない

*2:WPA-TKIPを選択するとつながる Time CapsuleもWPA-TKIPになっていた

*3:もちろんTime Capsuleの問題というわけではない

Cookieの内容で認可を行うApacheモジュール

調べ事をしていたらmod_auth_hmacと似た事が実現できるモジュール(リリースはmod_auth_hmacよりずっと前!)をたまたま見つけたので、これはひとつまとめておかねばと思い、Cookieの内容で認可を行うApacheモジュールを探してまとめてみた。
そのつもりは無かったのに、なぜか開発者は日本人が多いような。

  • mod_auth_cookie
    • Apache 1.3.x / 2.0.x
    • ライセンス: Apache Software License(?)
    • Basic認証でのWWW-Authenticateフィールドの内容をCookieに移すものらしい
    • 配布元が見つからない
  • mod_auth_cookie_fu
    • Apache 2.0.x
    • ライセンス: MIT
    • モジュールは認可のみ行う
    • mod_auth_hmacより高機能
  • mod_auth_form
    • Apache 1.3.x
    • ライセンス: 未定
    • モジュールのみで認証と認可が可能
    • 認証部分は通常htpasswdを使用するが独自に実装する事も可能


一応mod_auth_hmacについても

  • mod_auth_hmac
    • Apache 1.3.x / 2.0.x
    • ライセンス: Apache License, 2.0
    • モジュールは認可のみ行う
    • UNIXタイムスタンプを使用しない

Google Analyticsはじめました

こういうレイアウトGIGAZINEぽくね?ぽくね?


それはさておき、最近セキュリティホール memo メーリングリストでも話題Google Analyticsを導入してみました。3ヶ月くらい前に。

レポートを見ると

という事なのだそうだ。

要するに、仕事で調べ事をしていてここに辿り着く人が多いようだ。
そして、かなり希有な"読者"の方は大体フィード経由で読んでおられるようで、全文配信にしてリンクをはてな記法じゃなくしている*2甲斐があったというもの。

なお、未だに検索して辿り着く人がいるMySQL Connector/ODBC(MyODBC)のSQLインジェクション等については書きたい事があるものの、都合により書けないため、使用を検討されている方には先立って十分な調査をお願いしたいわけですが、直帰率が95.74%なので多分ここは見ないと思う。

*1:両方とも全体に対しての割合

*2:はてな記法だとRSSでリンクにならずそのまま表示されてしまう