2015/03/23(月)MSYS2を試してみる

日頃、研究のための作業のほとんどをubuntu上で行っています。研究者の多くはunix系の環境で仕事をすることを好んでおり、
  • macを使う。
  • windowsでvmware等の仮想環境を作り、その中でLinux等を使う。
  • windowsでcygwinを使う。
  • Linux等をマルチブートで使う。
などいろいろあると思います。本当に素のwindowsで仕事をする人は少ない気がします。拙kvライブラリも一応Visual Studioでも動くもののunix系で開発している関係上やはりunix系OSが使いやすい気がします。研究室の学生を見ると、windowsでcygwinを使っている人が大半のようです。自分はLinuxを入れることを勧めているのですが、やはり不慣れなOSで生活するのはつらいようで。

さて、windows環境のままunix系コマンドを使えるようにするソフトウェアとしてはcygwinが有名で長く使われてきていますが、最近MSYS2という同様のソフトウェアのいい評判をよく耳にします。そこで、試しにちょっと使ってみました。

元々、cygwinの亜種でmingw+msysというwindows nativeのexeを生成するソフトウェアがあるのですが、それの後継という位置づけで、
  • 比較的アップデートが早く、最新のソフトウェアが使える。
  • Arch Linuxで使われているpacmanというパッケージマネージャが使える。
という特徴があります。
上のページを見ながら、試しにインストールしてみました。インストール先はwindows7 64bit。
  • 64bit版のexe (msys2-x86_64-20150202.exe) をダウンロード。
  • 普通にインストーラを起動してインストール。デフォルトのc:\msys64に入れた。
  • スタートメニューからmsys2 shellを起動、終了、を2回繰り返す。
  • msys2 shell上で、最新にアップデートする。
    pacman -Sy(repositoryのデータを最新に)
    pacman --needed -S bash pacman pacman-mirrors msys2-runtime (再起動の必要のあるものを先にupdate)
    (msys2 shellを再起動)
    pacman -Su (残りをupdate)
    
pacmanパッケージマネージャの使い方は、以下の通り:
  • pacman -Ss 名前 で検索。
  • pacman -S 名前 でインストール。
  • pacman -R 名前 で削除。
さて、ややこしいことに、MSYS2はmsys2, mingw32, mingw64の3種類のbinaryを含んでおり、それぞれインストール場所も分けられています。msys2は、(cygwinがそんな感じであるように)msys-2.0.dllというmsys2独自のDLLがリンクされており、MSYS2環境下でしか動かないbinaryです。mingw32, mingw64はそれぞれwin32, win64のbinaryで、単独で動作します。gcc等のコンパイラも3種あって、msys2コンパイラで生成したexeはmsys2のDLLに依存しますが、mingw32/64のコンパイラで生成されたexeは単独で動作します。また、スタートメニューに登録された起動バッチファイルはmsys2_shell.bat, mingw32_shell.bat, mingw64_shell.batの3種類あって、msys2_shell.batから起動するとmsys2なbinaryにしかパスを通しません。mingw32/64.batで起動すると、mingwとmsys2の両方のbinaryにパスが通され、mingwの方が先に登録されているので優先されます。なるべく全てのbinaryをwindows nativeにしたかったが、どうしても無理なものだけmsys2依存で作成している、ということだと思います。

自分は、mingw64_shell.batを常用することにしました。

いくつかパッケージを入れて開発環境を整えてみました。前述したようにgccは3種類ありますが、公式Wikiの"Contributing to MSYS2"にあるように
pacman -S base-devel
pacman -S msys2-devel
pacman -S mingw-w64-i686-toolchain
pacman -S mingw-w64-x86_64-toolchain
で主だった開発に必要なものは大体入ります。更に、
pacman -S vim
pacman -S mingw-w64-x86_64-boost
pacman -S openssh
あたりを入れてみました。

この環境でkvライブラリはちゃんとコンパイル出来ました。mpfrを使ったものも、-lmpfr -lgmpを付けるだけでOK。

アンインストールも試してみましたが、コントロールパネルからで普通にきれいさっぱり消せるようです。

gccは4.9.2、boostは1.57.0であり、sshの最近のバグも修正されるなど、最新の環境が楽に使えるのはとてもいいですね。しばらく注目していようと思います。

2015/03/23(月)kv-0.4.19

kvライブラリを0.4.19にアップデートしました。

主な変更点は、
  • mpfrである程度以上仮数部の長い数を扱ったとき、e, ln2, piの定数の 精度が不十分なため区間幅が小さくならない問題を修正。
  • atanhの端点処理をちゃんとやるようにした。
  • ddとmpfrにceilとldexpを追加。
です。特に最初のが重要な修正です。

区間演算では、テンプレートを使って、interval<double>ならdoubleにふさわしい精度で、interval<dd>ならdouble-doubleにふさわしい精度で数学関数の計算を行う仕組みになっています。この仕組みで困るのが定数の計算で、定数は入力を持たないのでどの精度で計算すべきか判断できません。そこで、(numeric_limits<T>の使い勝手に倣って) constants<T>::pi(), constants<T>::e(), constants<T>::ln2()を用意し、Tの型によって計算精度を変える仕組みを採用しています。で、これらの実装は、例えばpiなら、
template <class T> struct constants< interval<T> > {
    static interval<T> pi() {
        static const interval<T> tmp(
            "3.1415926535897932384626433832795028841971693993751",
            "3.1415926535897932384626433832795028841971693993752"
        );
        return tmp;
    }
}
のように文字列で上端下端を与えそれを上下に丸めることによって得ていました。この定数は10進数50桁で円周率の上界下界になっています。doubleとddしか無ければこれだけ精度があれば十分だったのですが、mpfrで50桁以上の精度を指定した場合、(精度保証は出来ているものの)定数の区間幅が広すぎてまともな精度が出ない事態になっていました。ここの仕組みを変えて、きちんとその型なりの定数の計算方法を書くようにしました。

2015/03/12(木)kv-0.4.18

前回からほとんど時間が経っていませんが、kv-0.4.18にアップデートしました。

0.4.17で、lgammaにdouble以外の型を入れるとコンパイルできないバグを混ぜてしまっていたので修正しました。いつもならもう少し修正が貯まってから公開するのですが、某所でlgammaが必要だったのですぐに公開しました。ついでに、第1種Bessel関数(整数次のみ)の簡単な実装を追加しました。

2015/03/07(土)kv-0.4.17

久しぶりに、kvライブラリを0.4.17にアップデートしました。

主な変更点は、
  • 特殊関数の説明文を書いた。特にガンマ関数の計算方法の詳細を書いた。
  • 内部で例外として使っていたrange_errorをdomain_errorに変更。
  • 数学関数を含む常微分方程式が正しく解けないことがあったバグを修正。
などです。

2番めの例外についてちょっと補足しておきます。区間演算やaffine arithmeticなどでゼロ除算や負の数の平方根などが出てきたとき、プログラムをただちに停止せず例外をthrowするようになっています。そして、常微分方程式や全解探索などの上位プログラムでは解くべき問題の関数評価をするときにtry-catchでこの例外をcatchし、例外が起きてもすぐに諦めずにステップ幅を小さくしたり区間を分割したりするような実装になっています。この例外として、0.4.16以前はrange_errorという例外を使っていたのですが、どうやらdomain_errorの方がふさわしそうなので、プログラム全体でdomain_errorを使うように変更しました。

普通に使ってるだけならあまり関係のない変更ですが、例えばaffine.hppをコピーして改造して使っているような方がいれば、同じように変更した方がいいでしょう。単に一括置換するだけで大丈夫ななずです。

忙しい1月2月を過ぎて、やりたいこともいろいろ溜まっているのでここから頑張ろう。
OK キャンセル 確認 その他