kumaryu日記
2010-06-18
_ [monotone] monotone 0.48
2010年6月13日(日) 22:13:53 UTC 0.48をリリース。 変更点 - 新しくリビジョンを作る際コミットメッセージ編集時にエディタに渡される 情報が増えました。作者、日付、ブランチ、チェンジログがエディタで直接 書き換えられるようになり、--branchオプションを使わずとも新しいブラン チを作ることができるようになりました。 これら以外の行は変更してはいけません。変更した場合コミットは中止され ます。 - edit_commentのLuaフックは、エディタでコミット情報を編集するための文 字列を引数として受け取るようになりました。デフォルトのフックを上書き してた場合はちゃんと動くように変更する必要があります。 - 'status'、'commit'、'log'で使われる長い形式の日時書式は整形と解析の サイクルの中で日付を正しく保つことが必須とされるようになりました。 このため'status'コマンドは書式が正しいかチェックし正しくなければ警告 を出すようになりました。また'commit'は正しくない書式のものが含まれ ると操作を中止します。 - 'status'コマンドと'log'コマンドの出力が'commit'で表示される新しい情 報の形式と揃えられました。この3つのコマンドはリビジョン情報を同じよ うに表示します。 - 'setup'コマンドがデフォルトの把握済みデータベースが存在しないこと、 コマンドラインやワークスペースのオプションでデータベースが指定され ていないことをチェックするようになり、その場合は新しいデフォルトデ ータベースを新しいワークスペースの記録ディレクトリ(訳注:_MTN)の外に 作るようになりました。これは'clone'コマンドと同じような動作です。 (新しい管理機能について詳しくは下を参照してください。 - monotone diffにおいて新しく追加されたファイルの変更元や削除されたフ ァイルの変更後として/dev/nullを使うようになりました。これはpatch(1) 互換の動作であり、これでpatch(1)で適切にファイルが追加されたり削除 されるようになります。この変更によりdiffが削除されたファイルの中身 を含めるようになります。以前のmonotoneではこの情報は含まれていませ んでした。 - 信頼性の無いcertは一致する信頼されたcertが無い時のみ警告が出るよう になりました。つまり誰かが信頼性のないブランチcertをコミットした時 も他の誰かがそのリビジョンを同じブランチとして承認すると警告が出な くなります。(monotone bug #8033の修正) - 'db check'がブランチヘッドのキャッシュ中のエラーをチェックするよう になりました。エラーは'db regenerate_caches'で修正ができます。 - Lua関数のprint()とio.write()の出力がmonotoneの標準プログレスメッセ ージストリームにリダイレクトされるようになりました。詳しくはドキュ メントの6.3章を見てください。 新機能 - monotoneに新しくデータベース管理機能が追加されました。 データベースをいくつかの特定の場所(Windowsではデフォルトで %APPDIR%/monotone/databases、Linuxでは$HOME/.monotone/databases、 フックにて変更可能)に置いておくと、":my-database.mtn"のようにデー タベースの名前を指定するだけでアクセスされるようになります。 また、'mtn db init -d ":my-database.mtn"'のようにすると、一番目の デフォルト位置に直接新しいデータベースを作成することができます。 'setup'や'clone'のようないくつかのコマンドはデータベースオプション が与えられなかった場合に自動的にデフォルトデータベース (":default.mtn"、フックで変更可能)を使用します。 さらに、管理されているデータベース毎にチェックアウトしたワークスペ ースを覚えているようになり、新しく追加された'list databases'コマン ドでそれらの"known"な(既知の)パスを表示します。 (monotone bug #8916への対応) - 対応する管理コマンド、'register_workspace'、'unregister_workspace'、 'cleanup_workspace_list'も追加しました。管理されたワークスペースを 移動や削除するのに使えます。 - ブランチのヘッドを変更するコマンド(approve、disapprove、pull、merge などなど)に'--update'オプションを渡せるようになりました。このオプシ ョンは対象ブランチのヘッドであるワークスペース内から実行し、さらに ローカルでの変更が無い場合に、ワークスペースを新しいヘッドに更新し ます。常にこの動作をして欲しい場合には get_default_command_options(cmd) フックをmonotonercで'定義してください。(monotone bug #17878の修正) - 間違ってやっちまった'drop'をアンドゥする'undrop'コマンドを追加しま した。(monotone bug #13604の修正) - 新しいautomateコマンド'update'を追加しました。動作は通常の'update' コマンドと同じです。 - 'ls tags'はタグがついてるリビジョンのブランチ名も出力するようになり ました。このためのスペースを確保するのにリビジョンID出力は最初の10 文字までに短縮されます。(monotone bug #12773の修正) - デフォルトのincludeとexcludeパターンがサーバ毎に記録されるようにな りました。たとえば、あるサーバと全部のデータを同期し、他のサーバと いくつかのブランチのみ同期としたい時に、includeパターンを渡すのを忘 れないように気をつけなくていいですし、他方のサーバ側に間違って全デ ータ同期を行うこともなくなります。 - 新しいLua拡張関数、change_workspace(directory)を追加しました。これ は一つのmonotoneインスタンスで複数のワークスペースを扱うカスタムコ マンドを作るのに使えます。 - 新しいLua拡張関数のserver_set_listening(bool)も0.47から追加されて います。これはmonotoneサーバをkillせずに行儀よく終了させることがで きます。 バグ修正 - 0.47でパイプを介したpush / pull / syncが正常に動作しなくなってしま っていたのを修正しました。(Debian bug 574512) - 0.46と0.47のバグでpullとおそらくcommitにおいて、前のブランチのヘッ ドが新しいヘッドと"近い(close)"関係に無い時に永遠に近い時間がかか ってしまうようになっていたのを修正しました。 - 指定されたファイルに必要な親ディレクトリが指定に含まれないという制 限に関連するいくつかのバグを修正しました。これにより'mtn add a/b/c' のすぐ後に'mtn commit a/b/c'をしてもちゃんとコミットされます。詳し くはマニュアルの制限のセクションを見てください。(monotone bug #15994、 #17499、#20447、#22044を修正) - コマンドが失敗した時には変更されたコマンドラインオプションを _MTN/optionsに保存しないようにしました。(monotone bug #22928 の修正) - --keydirオプションでディレクトリからキーファイルを読むなどで、ファ イルからパケットを読み込む時に、でかくてパケットデータを全く含まな いファイルがあるとそれを表示するまでにすごい時間をメモリを使ってい たのを修正しました。(monotone bug #28799の修正) - 指定されたデータベースに親のリビジョンが入ってないようなワークスペ ースで'log'コマンドを実行しても落ちないようになりました。 (monotone bug #29677の修正) - 'clone'コマンドで対象ディレクトリ"."がワークスペースを指していても 設定記録ディレクトリを削除しないようになりました。 (monotone bug #29927の修正) - monotoneのヘルプにおいてコマンド名がアルファベット順に出力されるよ うになりました。 - Windowsで割り込み(^C)をかけた時に0でない終了コードを返すように修正 しました。0.47で割り込みがかかった時に例外を投げないように修正しま したが、その時にこのバグが入ってしまっていました。 - 0.46と0.47において、特定のブランチについてどのリビジョンがヘッドな のか混乱する場合がありました。 これが起きる状況は、あるブランチのヘッドであるリビジョンのうちどれ かの祖先であるリビジョンに新しくブランチcertが追加された時で、複数 人により全く同じマージがされた物をnetsyncしてる時などが起こりやすい でしょう。これを修正しました。'db check'はこの問題を検出してくれま す。データベースの'heads'がおかしかったり'merge'で'mtn bug'があった りしたら、'mtn db regenerate_caches'で直すことができます。 - 0.46ではとても大きなデータ(ファイル、diff、リビジョンなど)の転送中 にネットワーク切断が頻繁の起きていました。これは0.47で修正されてい ましたがリリースノートに載せ忘れていました。(monotone bug #28991の 修正) その他 - diffuse merger (http://diffuse.sourceforge.net)への対応を追加しま した。
今回は久々に長い気がする。
ワークスペースの位置を覚えられちゃうのはどうなんだろうと思ったんだが、これはデフォルトのデータベースパスに置いたデータベースについてだけかな。まあなんだかんだ言ってデフォルト位置のデータベースとか使うと思うけど。:default.mtnとか何も考えなくていいよね。
いやでもワークスペースを別に作る時、checkoutしないで何気に単純コピーとかやっちゃったりするからな。そういうことはあんまりするなってことよね…。
cloneコマンドってなんだっけ。
_ [Ruby][Silverlight] Marshal.loadできないお…
IronRubyでSilverlightなお話。
Silverlightでゲームを作ってるんだけどどうも起動が遅い。
遅いところを調べたら起動時にデータ読み込んでるのが悪いようだ。特にBulletMLを読み込んでるところ。
つか何がそんなに重いのかと思ったらREXMLでXMLパースしてるところだわ。あー、そりゃそうかも。なんか重すぎる気もするが。
いろいろ解決方法は思い付くんだが、一番まともなのは必要になる前に非同期で読み込むようにすること。しかしいつ解放したらいいかも含めてめんどいめんどい。
パースが重いなら、手軽な方法として前もってパースしといてMarshal.dumpで書き出し、実行時にはMarshal.loadすればいいじゃない。
素敵なことにIronRubyはCRubyのMashalデータをちゃんと読んでくれるのである。 パースはRuby1.9でやれば速い。
で、試したら読み込めなかった。RubyObjectにデシリアライズコンストラクタがねーんだけど、的な例外が投げられる。あれー?
小さいコードでMarshal.dump/loadを試してみたらちゃんと通った…なーんて、だまされないよ。
コマンドライン版のir.exeでは動くんだが、やっぱりSilverlightでは動かない。ソースを見たらSilverlight版では確かにRubyObjectの該当コンストラクタが削られてたわー。なるほど残念。セキュリティ周りの関係でSilverlightでは実装できないっぽい?
ただMarshal.loadが全然使えないかっていうとそうではなく、RubyObjectじゃなければいけそうだ。具体的には、
##highlight ruby data = { 'foo' => [1, 2, 3], 'bar' => [4, 5, 6], } p Marshal.load(Marshal.dump(data))
これはSilverlightでも通ったから、少なくともHash、文字列、配列、Fixnumくらいは受け渡せるね。
サーバ側をRuby、クライアント側をIronRuby(Silverlight)にした時にデータの簡単な受け渡しにちょっと困るんだけど*1、この程度のデータならMarshalでおっけーだね。
あ、で、BulletMLは前もってRubyコードに変換しちゃうのが速そうなのでそれをやることにした。
*1 Silverlight版のIronRubyは標準のYamlライブラリが使えなくて、標準のJsonクラスもIronRubyからでは使いづらい