Ubuntu の ImageMagick を OpenMP 無効でリコンパイルする

今日は、画像処理に PythonMagick を使っている箇所で以下のようなエラーが出て困っていました。つい先日まで全く同じコードで動いていたのでおかしいなと思ったのですが、調べてみるとどうやら OpenMP のマルチスレッドがらみのエラーのようです。そういえば、この Ubuntu の VM の割り当て CPU 数を最近増やしたのでした。

python: magick/cache-view.c:729: GetCacheViewVirtualPixels: Assertion
 `id < (int) cache_view->number_threads' failed.

というわけで、OpenMP を無効にしてパッケージをコンパイルし直すことにしました。

% sudo apt-get buil-dep imagemagick
% apt-get source imagemagick
% cd imagemagick-6.7.7.10

rules ファイルを編集して --disable-opnemp のコンパイルオプションを追加します(58行目くらい)。ついでにRGBを内部で8bitで扱うようなオプションも設定します。これによりCPU/メモリ使用量が削減できます。

% vi debian/rules

    --x-includes=/usr/include/X11 \
    --x-libraries=/usr/lib/X11 \
    --disable-openmp \
    --with-quantum-depth=8

    # Patch the generated libtool to avoid passing -rpath when linking,

ビルドしてパッケージを入れ替えます。

% dpkg-buildpackage -b
% sudo apt-get remove --purge libmagick++5
% cd ..
% sudo dpkg -i libmagickcore5* libmagick++5*
% sudo apt-get install python-pythonmagick

サーバの CentOS では発生していないので、きっとUbuntu 12.04だけの問題なんでしょうね。最後に簡単なテストプログラムで動作確認をして完了です。

import PythonMagick

img = PythonMagick.Image("himekyun.jpg")
img.sample(PythonMagick._PythonMagick.Geometry(100,100))
img.write("himekyun_small.jpg")

関連リンク:
PerlMagick が OpenMP 有効だと高負荷になる件 :: drk7jp
ImageMagickとOpenMPの件 - blog.nomadscafe.jp

Mac で特定のドメインだけ別の DNS サーバを参照する設定

LAN 内でだけで参照するDNS サーバを立てることはよくあると思いますが、諸般の事情によりDHCPサーバの設定をいじれない場合に特定のドメインだけ別のDNSサーバを参照させる方法です。

1. /etc/resolver というディレクトリを作成

% mkdir /etc/resolver

2. 例えば *.intra を特定の DNS サーバで検索させたい場合は、1.で作成したディレクトリに intra というファイルを作成し、中に nameserver のIPアドレスを記述します。

% vi /etc/resolver/intra
nameserver 192.168.1.250
search_order 1

クライアントPCのDNS設定を変更してもいいのですが、モバイル環境で接続するネットワークが頻繁に変わる場合などにいちいち設定を変更するのが面倒なので、僕はこのように設定しています。

ELB の Health Check ログを隔離する(nginx)

Amazon ELB 配下で nginx を動かしているとこんなログが大量に表示されて鬱陶しいので隔離することにしました。

10.120.21.xxx - - [01/Feb/2013:17:53:39 +0000] "-" 400 0 "-" "-"
10.120.21.xxx - - [01/Feb/2013:17:54:09 +0000] "-" 400 0 "-" "-"
10.120.21.xxx - - [01/Feb/2013:17:55:29 +0000] "-" 400 0 "-" "-"

基本的に名前ベースのバーチャルホストで運用しているので、それ以外を隔離すればOK。access_log off でもいいですが、障害時の切り分けが難しくなるのでできるだけ出力するようにしておいたほうがいいと思います。

server {
    listen 80;

    access_log /var/log/nginx/elb.log;
    error_log /var/log/nginx/elb_error.log;

    location = /health_check {
        empty_gif;
    }
}

あと、うちでは Health Check 用のエンドポイントを /health_check として空のGIFファイルを返すようにしています。こんな感じで ELB からアクセスが来ます。

10.120.21.xxx - - [01/Feb/2013:17:56:10 +0000] "GET /health_check HTTP/1.1" 200
 43 "-" "ELB-HealthChecker/1.0"

iTerm2 を Visor のように使う方法

Visorと聞いて、お!と思った人もいるかと思いますが、Palm の名機 Handspring Visor の話ではありません。

かつて Mac OS Xのターミナル用プラグインとして Visor というのがありました(今もあると思います)。Visor は、画面上部を覆うようにしていつでもターミナルを呼び出せるようにしてくれる便利なソフトウェアでした。あの QuickSilver と同じ人が作ってたらしいです。iTerm2が便利なので自分は使っていなかったのですが、iTerm2でも同様の設定ができることに最近気づきました。

設定方法は簡単です。

1. Profiles の Window -> Style を"Top of Screen"、Space を "All Spaces"に変更します。また、Setting for New Windows -> Rows が表示されるウィンドウの高さになります。

2. Keys にて Hotkey をお好きなものに設定します。僕はF1キーに割り当てています。

これでF1キーを押せばいつでもどこにいてもターミナル画面が最初のスクリーンショットのように表示されるようになります。便利。