2014年2月9日日曜日

Docker を使って IACA 2.1 を CentOS 6.4 で動かしてみる

注) acaptured の検索で飛んできた人はこちらにどうぞ。
http://outofsearch.blogspot.jp/2012/10/dmm.html

それでは CentOS 6.4 で IACA が動くまでの手順を書いていきます。

1. Docker で Ubuntu 12.04 環境を用意する

Docker とそれに必要な LXC は yum で簡単にインストールできます。
$ sudo yum -y install docker-io
会社などで http proxy を使用している環境では、/etc/sysconfig/docker に proxy 関連の環境変数設定を書いておきます。 /etc/profile.d/proxy.sh 等を置いている人は単にそれを読み込むだけでも良いでしょう。下記のような感じです。
$ cat /etc/sysconfig/docker
. /etc/profile.d/proxy.sh
other_args=""
yum install 直後は docker が動いていないので手動で起動します。
$ sudo service docker start
Starting docker:                                           [  OK  ]
次に Ubuntu 環境を用意します。今回 IACA 実行の為に欲しいのは Ubuntu 12.04 ですので、docker pull ubuntu:12.04 として ubuntu のバージョン 12.04 を指定して pull します。
$ sudo docker pull ubuntu:12.04
Pulling repository ubuntu
8dbd9e392a96: Download complete
pull が完了したら、試しに bash でも動かしてみましょう。
$ sudo docker run -i -t ubuntu:12.04 /bin/bash
root@6c4d0f4c3390:/# uname -a
Linux 6c4d0f4c3390 2.6.32-431.3.1.el6.x86_64 #1 SMP Fri Jan 3 21:39:27
UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
root@6c4d0f4c3390:/# cat /etc/issue
Ubuntu 12.04 LTS \n \l
確かに Ubuntu 12.04 です(^^)

2. IACA アーカイブの展開と配置

インテルの IACA のページから zip をダウンロードして、/opt/intel 以下に展開します。
下記のような感じに展開されます。
$ tree iaca-lin64
├── bin
│ ├── iaca
│ └── iaca.sh
├── include
│ └── iacaMarks.h
└── lib
    ├── libiacaArchDataHSW.so
    ├── libiacaArchDataIVB.so
    ├── libiacaArchDataNHM.so
    ├── libiacaArchDataSNB.so
    ├── libiacaArchDataWSM.so
    ├── libiacaLoader.so
    ├── libiacaLogicHSW.so
    ├── libiacaLogicIVB.so
    ├── libiacaLogicNHM.so
    ├── libiacaLogicSNB.so
    ├── libiacaLogicWSM.so
    ├── libiacaXED2HSW.so
    ├── libiacaXED2IVB.so
    ├── libiacaXED2NHM.so
    ├── libiacaXED2SNB.so
    └── libiacaXED2WSM.so

3. IACA 実行用シェルスクリプトの作成

最後に IACA を Docker で動かす為のラッパースクリプトを書きます。
まずオリジナルの iaca 実行ファイルを iaca-bin という名前にリネームします。
$ sudo mv iaca iaca-bin 
続いて下記内容のシェルスクリプトを iaca という名前で作成します。
#!/bin/bash
IACA_DIR=/opt/intel/iaca-lin64
sudo docker run \
  -v /home:/home -v /opt:/opt \
  -w $PWD \
  -e LD_LIBRARY_PATH="$IACA_DIR/lib" \
  ubuntu:12.04 \
  $IACA_DIR/bin/iaca-bin $@
このスクリプトの要点は、/home と /opt を mount することで Docker 内でも同じ場所で参照できるようにしているところです。
後はこのファイルに実行権限を与えて、使いやすいように /usr/local/bin/iaca にシンボリックリンクを張るなどすれば良いです。 ついでに iacaMarks.h も /usr/local/include/iaca.h にシンボリックリンクを張っておきます。
$ sudo chmod a+x iaca
$ cd /usr/local/bin
$ sudo ln -s /opt/intel/iaca-lin64/bin/iaca .
$ cd /usr/local/include/
$ sudo ln -s /opt/intel/iaca-lin64/include/iacaMarks.h .
確認の為に iaca を引数無しで実行してみます。
$ iaca
Intel(R) Architecture Code Analyzer Version - 2.1
Usage: iaca [options] 
  -32   32-bit input file (default)
  -64   64-bit input file
  -arch   Architecture type: NHM, WSM, SNB, IVB, HSW (default)
  -analysis  Analysis type: LATENCY, THROUGHPUT (default)
  -o   Output file (default: stdout)
  -graph   Analysis graph output file for use with graphviz
  -mark   Show code section  when there are multiple marked code sections. Use -mark 0 to show all.
  -max32  Max generated 32-bit obj files
  -max64  Max generated 64-bit obj files
  -ignore  Ignore added pop ebx / push ebx markers (default: true)
  -nogather  No gather bottleneck analysis
  -no_interiteration No interiteration bottleneck analysis
  -reduceout  Output is reduced
  -report  Generate error report
できました。

IACA 2.1 は、そのままでは CentOS 6.4 で動かない

注) acaptured の検索で飛んできた人はこちらにどうぞ。
http://outofsearch.blogspot.jp/2012/10/dmm.html

IACA(Intel® Architecture Code Analyzer) は Intel の x86 CPUで最適化を行う人達にとっては無くてはならないツールですが、そのままでは CentOS 6.4 環境では動きません。
色々考えた末、Docker を使えば CentOS でも簡単に IACA を使えることがわかりましたので、二回に分けてその方法を書いていきます。

そもそもなぜ IACA が CentOS 6 で動かないのか?

  • IACA はバイナリ配布で実行形式がダイナミックリンクされている。(static リンクでは無い)
  • CentOS 6.4 で動かすとダイナミックリンクしている libstdc++.so のバージョンが古い為、 version `GLIBCXX_3.4.15' not found と言われて実行できない。(IACA-2.1(Haswell 対応版)の場合)
  • libstdc++ は glibc のバージョンにも依存しているので、おいそれと入れ替えるわけにはいかない。

CentOS 6 で IACA を動かす方法いろいろ

  • Fedora 19 以降とか Ubuntu 12.04 以降の環境を別に用意してそちらで動かす(物理でも仮想でもOK)
    • まぁ普通です。メイン環境とアカウント共有してホームディレクトリの共有とかすればそれなりに使いやすくはできますが、いまいちスマートではありません。こんな作業をしていると 「バイナリでしか配布されないソフトウェアだから不自由なんだ。こんな不自由なソフトウエアでなく Copyleft な自由ソフトウェアを使うべきだ。」と違う方向に気持ちが行ってしまいます。
  • Gentoo Prefix で CentOS 上に Gentoo 環境を用意する
    • 漢らしい方法です。ただ IACA コマンド1個を動かしたかったはずなのに気がつけば make.conf を調整しているという泥沼に陥りそうで。。。 Prefix といえど Gentoo 怖いです。
  • chroot で新しい glibc と libstdc++ な Linux ユーザランドを用意する
    • IACAが動かないのはライブラリの問題だけですので chroot 環境で対応可能なはずです。しかし、CentOS で chroot 環境を簡単に構築するツールが無いため、殆ど手作業での構築となります。IACA コマンド一個を動かしたいだけなのに釣り合わない作業量で空しくなります。
  • Docker を使って CentOS 内に Ubuntu 環境を用意する
    • LXC 環境を超簡単に構築する Docker が CentOS で使えるようになりましたので、Docker で ubuntu 環境を導入してそちらで IACA を使えば良いはずです、CentOS 6.3 以降であれば devicemapper でホスト側のファイルシステムを共有できるのでシームレスに IACA を動かすことができそうです。
ぐだぐだ書いてしまいましたが、要は Docker 使えば CentOS 6 でも簡単に IACA 使えるようにできますよ。ということでした。

次回はその設定方法を書いていきます。

2013年5月21日火曜日

git を使いこなす為のエイリアス10選

注) acaptured の検索で飛んできた人はこちらにどうぞ。
http://outofsearch.blogspot.jp/2012/10/dmm.html

今回は git でみんなこれぐらいのは alias 登録して使っているでしょ?という例を幾つかあげたいと思います。

あまり表だって言われていないのが不思議ですが、 git の一番の特徴は、

頻繁に使うコマンドがオプション引数を付けて使うこと前提になっている。 すなわちオプション引数無しだと使いにくいったらありゃしない。


につきると思っています、個人的に。
例えば Bazaar の啓蒙文書の一つ Why Switch to Bazaar ? では、git log --help が 26 ページにものぼることを dis ってたりもします。確かに git log のオプションは凄まじいものがあります。

さて、本題にいきます。
これから紹介するエイリアスはどれも私が2年以上使用してきたものです。私の趣味で2文字〜5文字の短い名称となっていますが、名称よりもコマンドと引数の組み合わせを参考にして頂けたらと思います。

#1 gsm

# git status for modified files only
alias gsm='LANG=en_US.utf-8 git status --untracked-files=no'
修正したファイルをリストアップするコマンドです。 引数なしの git status だと大量に Untracked files: が表示されることがあったりして使いにくいのです。
ちなみに先頭の LANG=en_US.utf-8 は git からのメッセージを grep 等でひっかけやすいように英語にするためです。表示メッセージが日本語でもいい人や、そもそも普段の LANG が en_US な人は必要ありません。

#2 glogg

# git log with graphical tree
alias glogg='env LANG=en_US.utf-8 git log --graph --date-order --format="%h (%an) %s %d" --branches'
git のレビジョンツリーを全てのローカルブランチに渡ってグラフィカルに表示するコマンドです。 git log --graph だけだと表示フォーマットが微妙でいまいちなのが git らしいと思います。

#3 glog

# git log with short statistics
alias glog='env LANG=en_US.utf-8 git log --stat --decorate --date-order'
さきほどと同じくのログ表示のエイリアスです。こちらは詳細にログを見たい場合に使用します。 コミットをレビューしたいときには -p オプションを足して glog -p とかすれば diff も表示してくれます。

#4 giffc, #5  giff

# git diff for candidate files
alias giffc='env LANG=en_US.utf-8 git diff --staged '
alias giff='env LANG=en_US.utf-8 git diff '
git diff に --staged って引数があるとは知らずに、ステージングした変更を確認するにはどうするんだろうとその昔さんざん探しました。
修正確認は頻繁に使いますのでステージング用と未ステージング用のエイリアスをそれぞれ登録しておきましょう。
ステージング済みの変更確認用に giffc, ステージング前の変更確認用に giff です。

#6 gba, #7 gbr, #8 gb

# git branch both local and remote branch
alias gba='LANG=en_US.utf-8 git branch --all '
# git branch for remote branch
alias gbr='LANG=en_US.utf-8 git branch --remote '
# git branch for local branch
alias gb='LANG=en_US.utf-8 git branch '
git を使用していると、頻繁にブランチの確認をしますよね?
ローカルブランチ表示用に gb, リモートブランチ表示用に gbr, 全てのブランチ表示用に gba の3種のエイリアスを登録しておきます。

#9 gri, #10 gricontinue

# git rebase interactive
alias gri='LANG=en_US.utf-8 git rebase -i '
# git rebase continue
alias gricontinue='LANG=en_US.utf-8 git rebase --continue '
git に慣れてくると頻繁に git rebase -i をしませんか? 履歴の書き換えは git の醍醐味ですよね。
補完があれば git rebase --continue もそんなに面倒ではありませんが、git rebase -i を素早くちゃちゃっと行うのが git 上級者ですので(笑)、 gri で git rebase -i 開始、各コミットを編集後の再開は gricontinue としておけば素早く履歴の書き換えができるでしょう。

以上、git でよく使うコマンドと引数の組み合わせをエイリアス10選として紹介しました。

2012年10月23日火曜日

DMM電子書籍ビューアのアンインストール

1. はじめに

いつも使っている MacBook Pro でふと目に止まったアクティビティモニタ、acaptured というプロセスが妙にメモリを食っている。ん? システムのサービスデーモンか何かしらと思ってググってみるもそれらしい情報が見つからない…

ということで今回は DMM電子書籍ビューアが一緒にインストールする怪しげなものと、そのアンインストール手順を説明します。

2. acaptured はどこから来たのか

アクティビティモニタで acaptured を発見してから次にしたことは、locate コマンドで何処に acaptured が居るのか探すことでした。 locate はターミナルから使うコマンドですが Spotlight と違ってオプションを指定しなくてもディスク全体からファイル名検索ができるので何かと便利です。
$ locate acaptured
/Library/LaunchDaemons/jp.co.cyphertec.CypherGuard.acaptured.plist
/usr/local/bin/acaptured
/usr/local/etc/acaptured.plist
うぉ、こいつ /usr/local/bin にいるぞ!? 自分としては homebrew とかで入れた覚えないし、野良ビルドした覚えもない。LaunchDaemons に plist があるということはサービスとして常に起動するようになっているっぽいな。 CypherGuard ってなに?とググってみるとCypherGuard for PDF というのが引っかかる。
どうも acaptured というのは CypherGuard for PDF の中の1ファイルと見るのが妥当のようです。

とはいえ CypherGuard という製品をインストールした覚えは全くありませんので、他のソフトと一緒にインストールされたようです。
なんにせよ LaunchDaemon から起動するサービスデーモンを /usr/local/bin とかに勝手に置かれるのは違和感ありまくりです。

3. pkgutil --files で探す

では acaptured がどのインストールで入ってしまったのかを探すことにしましよう。
幸い Mac OS X であればパッケージインストーラでインストールした全てのファイルのリストが /var/db/receipts 以下に保存されています。 pkgutil コマンドを使えばどんなファイルがインストールされたかのリストを表示できますので、順番に pkgutil --files を実行して探していきます。(もちろん for や xargs 使って一気に検索しても良いでしょう。腕に覚えがある人は試してみてください)
さて、acaptured があるファイルはこんなんでした。
$ pkgutil --files com.DMM.dmm電子書籍ビューア.Daemon.pkg
acaptured
acaptured.plist
jp.co.cyphertec.CypherGuard.acaptured.plist
はいDMM電子書籍ビューアが acaptured をインストールしていたことがわかりました。
DMM電子書籍ビューアの Receipt は他に4つあり、計5つの pkg ファイルがインストールされたことがわかりました。その中にはカーネルエクステンションも2つ入っていました。
$ pkgutil --files com.DMM.dmm電子書籍ビューア.10_6.pkg
CExeGuardDrv.kext
CExeGuardDrv.kext/Contents
CExeGuardDrv.kext/Contents/Info.plist
CExeGuardDrv.kext/Contents/MacOS
CExeGuardDrv.kext/Contents/MacOS/CExeGuardDrv
CExeGuardDrv.kext/Contents/Resources
CExeGuardDrv.kext/Contents/Resources/English.lproj
CExeGuardDrv.kext/Contents/Resources/English.lproj/InfoPlist.strings
CTracGuardDrv.kext
CTracGuardDrv.kext/Contents
CTracGuardDrv.kext/Contents/Info.plist
CTracGuardDrv.kext/Contents/MacOS
CTracGuardDrv.kext/Contents/MacOS/CTracGuardDrv
CTracGuardDrv.kext/Contents/Resources
CTracGuardDrv.kext/Contents/Resources/English.lproj
CTracGuardDrv.kext/Contents/Resources/English.lproj/InfoPlist.strings

$ pkgutil --files com.DMM.dmm電子書籍ビューア.EncryptBinaryTool.pkg
EncryptBinaryTool

$ pkgutil --files com.DMM.dmm電子書籍ビューア.ImageViewer.pkg
ImageViewer.app
ImageViewer.app/Contents
ImageViewer.app/Contents/Info.plist
ImageViewer.app/Contents/MacOS
ImageViewer.app/Contents/MacOS/ImageViewer
ImageViewer.app/Contents/PkgInfo
ImageViewer.app/Contents/Resources
... 途中省略 ...
ImageViewer.app/Contents/Resources/zoom_out_mouseover.png

$ pkgutil --files com.DMM.dmm電子書籍ビューア.Offline.pkg
OfflineInfo

4. 手動アンインストール

さて、怪しげな kext とデーモンをしれっとインストールしてくれたDMM電子書籍ビューアをアンインストールすることにします。 一応アンインストールの方法をググって見ると、下記が出てきました。
http://www.dmm.com/help/faq_40_html/=/ch_navi=faq/#Q7
Q.DMM電子書籍ビューアのアンインストール方法を教えてください。
A. DMM電子書籍ビューアのアンインストールは、下記手順で行います。
【Windows版】
1. コントロールパネルの「プログラムの追加と削除」から、「DMM電子書籍ビューア」を選択 2. 「変更と削除」をクリック 3. 「DMM電子書籍ビューアをアンインストールしますか?」のメッセージで「はい」を選択
【Mac版】
1. アプリケーションフォルダから「DMM電子書籍ビューア」を削除してください。
※DMM電子書籍ビューアをアンインストールすると、ダウンロードしたdmmb形式ファイルは閲覧できなくなります。 dmmb形式ファイルを閲覧する場合は、DMM電子書籍ビューアをインストールし直してください。
この通りにDMM電子書籍ビューアを削除しても、カーネルエクステンションと /usr/local/bin/acaptured は残ったままです。だめですね。
ということでこの情報はあてにならないので、pkgutil で見れる情報をたよりに手動でアンインストールしていきます。 Mac OS X 10.6 Snow Leopard の人ならば下記のリンクを参考に pkgutil --unlink コマンドで簡単アンインストールできるみたいです。
Snow Leopardの新コマンド「pkgutil」でパッケージを削除する
残念ながら私の Mac は 10.7 Lion ですので、下記のリンクを参考に一個ずつファイルを手動削除していきます。
https://wincent.com/wiki/Uninstalling_packages_(.pkg_files)_on_Mac_OS_X
$ pkgutil --pkg-info com.DMM.dmm電子書籍ビューア.10_6.pkg
package-id: com.DMM.dmm電子書籍ビューア.10_6.pkg
version: 1.0
volume: /
location: System/Library/Extensions
install-time: 1331130970
$ sudo \rm -rf /System/Library/Extensions/CExeGuardDrv.kext
$ sudo \rm -rf /System/Library/Extensions/CTracGuardDrv.kext
$ sudo pkgutil --forget com.DMM.dmm電子書籍ビューア.10_6.pkg
Forgot package 'com.DMM.dmm電子書籍ビューア.10_6.pkg' on '/'.
$ sudo \rm -rf /usr/local/etc/acaptured.plist 
$ locate jp.co.cyphertec.CypherGuard.acaptured.plist
$ sudo \rm -rf /usr/local/bin/acaptured 
$ sudo \rm -rf /usr/local/etc/acaptured.plist 
$ sudo \rm -f /usr/local/etc/.cache 
$ sudo \rm -f /usr/local/etc/.info
$ sudo \rm -f /usr/local/etc/.list

$ sudo launchctl remove jp.co.cyphertec.CypherGuard.acaptured
$ sudo \rm  /Library/LaunchDaemons/jp.co.cyphertec.CypherGuard.acaptured.plist
$ sudo pkgutil --forget com.DMM.dmm電子書籍ビューア.Daemon.pkg
Forgot package 'com.DMM.dmm電子書籍ビューア.Daemon.pkg' on '/'.
最後にアプリケーションフォルダにある DMM電子書籍ビューア.app をゴミ箱に捨てて削除すればアンインストール終了です。ふぅ。 おつかれさまでした。