2014年9月8日月曜日

Git subtreeによるライブラリ管理について

前回は Git subtree merge について説明しましたが、今回はそれに深い関係がある Git subtree コマンドについての説明です。

まず基本的なこととして、 Git subtree は Git subtree merge と同じものではありません。 subtree merge はマージ戦略として subtree を指定したマージにすぎませんが、 Git subtree は明確に外部ライブラリの取り込みと submodule の代替を目的として設計された機能です。 Git 1.7.11 以降であれば、 Git subtree を使用するのが望ましいでしょう。

なぜなら、 Git subtree には、 Git subtree merge にはない、下記のような機能があるからです。

  • 取り込んだライブラリ側の歴史を"潰し"(squash)てコンパクトな歴史にできる。
  • 自分のプロジェクトでライブラリ側に変更を加えた場合、それをライブラリ側(上流)のリポジトリにプッシュしたり、プルリクエストしたりできる。
  • ライブラリの取り込みの初期化のためのコマンドが用意されており、3コマンドぐらい要するところを1コマンドで直観的に実施できる。
あとは、比較的小さな利点ですが、下記の特徴があります。

  • Squash したライブラリの歴史には、途中経過のすべては保存していないので、無駄なディスク容量を食わない。(ハッシュだけ記録している)
  • Squash の有無に関わらず、 Git subtree を実施したリポジトリは、 Git subtree に対応していないバージョンの Git でも扱える。たとえば Git subtree 担当者以外は、中央リポジトリや、他のプロジェクトメンバーの Git のバージョンが古くても運用できる。(ただ、 Git subtree に関係するコマンドが打てないだけ)


Git subtree の使い方については、 Atlassian Blog の下記エントリがもっともよくまとまっています。

しかし、原文が英語の日本語翻訳版なので、あらためて噛み砕いて違った角度から説明してみようと思います。


2014年9月7日日曜日

JISの最近接偶数への丸め(JIS Z8401-1999)について

今日はちょっと専門的な話ですが、数値の丸め処理についての記事です。

数値の丸めといいますと、12.34を小数点以下第1位まで丸めて12.3にするような操作で、四捨五入がおなじみですが、実はJISに規定があり、四捨五入は最善の方法とはされていません

JISの決まりでは、偶数丸めといわれる、あまりなじみのない丸め方法を使うことになっています。

偶数丸めは、有効桁の一つ下の、丸めたい桁以下が50000…であるときの挙動以外は、四捨五入と同じです。有効桁より下が50000…であった場合は、その上の桁が偶数であれば切り上げられ、奇数であれば切り下げられます。

たとえば、小数点以下を丸める場合、以下のようになります。

1.5 -> 2
2.5 -> 2
3.5 -> 4
4.5 -> 4
5.5 -> 6

JISの規格では、この偶数丸めを「規則A」、おなじみの四捨五入を「規則B」としており、「規則Aが一般的には望ましい。」としています。なぜなら、「一連の測定値をこの方法で処理すると丸めによる誤差が最小になるという特別な利点がある。」だそうです。

なるほど、と納得しかけますが、何か腑に落ちません。確かに、四捨五入は大きな数値へかたよる方向への丸めですが、偶数に丸めるなどという恣意的な手段が本当に最適なのでしょうか