RMagick のインストールでコケる問題

昨日から、自分の Lion 環境上で rmagick を使う Rails プロダクトの Bundle install 時に、

/Users/xxx/.rvm/rubies/ruby-1.9.2-p290/bin/ruby extconf.rb
checking for Ruby version >= 1.8.5... yes
checking for /usr/bin/gcc-4.2... yes
checking for Magick-config... yes
checking for ImageMagick version >= 6.4.9... yes
checking for HDRI disabled version of ImageMagick... yes
checking for stdint.h... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/Users/xxx/.rvm/rubies/ruby-1.9.2-p290/bin/ruby
/Users/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/mkmf.rb:368:in `try_do': The complier failed to generate an executable file. (RuntimeError)
You have to install development tools first.
        from /Users/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/mkmf.rb:452:in `try_cpp'
        from /Users/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/mkmf.rb:834:in `block in have_header'
        from /Users/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/mkmf.rb:693:in `block in checking_for'
        from /Users/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/mkmf.rb:280:in `block (2 levels) in postpone'
        from /Users/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/mkmf.rb:254:in `open'
        from /Users/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/mkmf.rb:280:in `block in postpone'
        from /Users/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/mkmf.rb:254:in `open'
        from /Users/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/mkmf.rb:276:in `postpone'
        from /Users/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/mkmf.rb:692:in `checking_for'
        from /Users/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/mkmf.rb:833:in `have_header'
        from extconf.rb:193:in `<main>'

というエラーで rmagick のインストールに失敗するという現象に悩まされていたのですが、
単純にググってもそれらしい情報に行き当たらず、苦労していたので原因と解決方法をメモしておきます。

まず、この環境ですが、ImageMagick を brew で入れた時から怪しいところがありました。

% brew install imagemagick
==> Downloading http://downloads.sf.net/project/machomebrew/Bottles/imagemagick-6.7.1-1-bottle.tar.gz
File already downloaded in /Users/xxx/Library/Caches/Homebrew
==> Pouring imagemagick-6.7.1-1.bottle.tar.gz
==> Caveats
Some tools will complain unless the ghostscript fonts are installed to:
  /usr/local/share/ghostscript/fonts
ln: Wand.pc: Permission denied
Error: The linking step did not complete successfully
The formula built, but is not symlinked into /usr/local
You can try again using `brew link imagemagick'
==> Summary
/usr/local/Cellar/imagemagick/6.7.1-1: 1389 files, 32M

良く見ると、途中でエラーを吐いています。シンボリックリンクが作れなかったから、手動で brew link しろと。
単純に実行しただけだと ” ln: Wand.pc: Permission denied ” を解決できず同じ様に死んでしまうものの、 sudo で実行すると完了し、一見問題ないように見えます。
しかし、肝心の rmagick のインストール時には上記のようなエラーになってしまいました。

bundle が悪いのかと思って、単純に

% gem install rmagick

しても、同じでした。冒頭のエラーを良く見ると

Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers. Check the mkmf.log file for more
details. You may need configuration options.

とあるので、mkmf.log を読んでみる事に。

% less ~/.rvm/gems/ruby-1.9.2-p290/gems/rmagick-2.13.1/ext/RMagick/mkmf.log
checking for Ruby version >= 1.8.5... -------------------- yes

--------------------

find_executable: checking for /usr/bin/gcc-4.2... -------------------- yes

--------------------

find_executable: checking for Magick-config... -------------------- yes

--------------------

checking for ImageMagick version >= 6.4.9... -------------------- yes

--------------------

checking for HDRI disabled version of ImageMagick... -------------------- yes

--------------------

"/usr/bin/gcc-4.2 -o conftest -I/Users/xxx/.rvm/rubies/ruby-1.9.2-p290/include/ruby-1.9.1/x86_64-darwin11.0.1 -I/Users/xxx/.rvm/rubies/ruby-1.9.2-p290/include/ruby-1.9.1/ruby/backward -I/Users/xxx/.rvm/rubies/ruby-1.9.2-p290/include/ruby-1.9.1 -I.  -I/usr/local/Cellar/imagemagick/6.7.1-1/include/ImageMagick  -I/usr/local/Cellar/imagemagick/6.7.1-1/include/ImageMagick -fopenmp conftest.c  -L. -L/Users/xxx/.rvm/rubies/ruby-1.9.2-p290/lib  -L/usr/local/Cellar/imagemagick/6.7.1-1/lib -L/usr/X11/lib    -L/usr/local/Cellar/imagemagick/6.7.1-1/lib -lMagickCore -llcms -ltiff -lfreetype -ljpeg -L/usr/X11/lib -lfontconfig -lXext -lSM -lICE -lX11 -lXt -lbz2 -lz -lm -lgomp -lpthread -lltdl  -lruby.1.9.1-static  -lpthread -ldl -lobjc "
ld: library not found for -llcms
collect2: ld returned 1 exit status
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: int main() {return 0;}
/* end */

-llcms を見つけられないのが原因だったようです。
liblcms とはなんぞ、と思ってググったらこのページに引っ掛かりました。Libraries for the Little CMS Engine というものらしいので、 再度この名前でググると、どうやらカラーマネジメントシステムのライブラリみたい。

しかし、必要なら brew が依存性解決に入れてくれているだろうと見てみると

$ brew list
cmake          imagemagick     jpeg          little-cms     mysql          nkf          readline     zsh
gdbm          jasper          libtiff          mongodb          netcat          pidof          wget

案の定、little-cms というソレらしいのが居ます。
が、ここで先程、brew で ImageMagick 入れようとしたときにエラーが出ていたのを思い出しました。
依存性解決のために自動で入れる途中で、同じようなエラーに遭遇して、little-cms パッケージが正常にインストールされていないのではないかという仮説を思いつき、この腐った brew 環境を叩き直すために、お医者様の力を借りる事にします。

% brew doctor
Unbrewed dylibs were found in /usr/local/lib.

If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

Unexpected dylibs:
    /usr/local/lib/libmacfuse_i32.2.dylib
    /usr/local/lib/libmacfuse_i64.2.dylib
    /usr/local/lib/libosxfuse_i32.2.dylib
    /usr/local/lib/libosxfuse_i64.2.dylib

Unbrewed .pc files were found in /usr/local/lib/pkgconfig.

If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

Unexpected .pc files:
    /usr/local/lib/pkgconfig/osxfuse.pc

Unbrewed .la files were found in /usr/local/lib.

If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

Unexpected .la files:
    /usr/local/lib/libosxfuse_i32.la
    /usr/local/lib/libosxfuse_i64.la

/usr/local/lib/pkgconfig isn't writable.
This can happen if you "sudo make install" software that isn't managed
by Homebrew.

If a brew tries to write a .pc file to this folder, the install will\nfail during the link step.

You should probably `chown` /usr/local/lib/pkgconfig

Some "config" scripts were found in your path, but not in system or Homebrew folders.

`./configure` scripts often look for *-config scripts to determine if software packages
are installed, and what additional flags to use when compiling and linking.

Having additional scripts in your path can confuse software installed via Homebrew if
the config script overrides a system or Homebrew provided script of the same name.

/usr/X11R6/bin
    freetype-config libpng-config libpng15-config

brew doctor は概ね、勝手に /usr/local 以下に入ったosxfuseがお気に召さないようですが、

/usr/local/lib/pkgconfig isn’t writable.
This can happen if you “sudo make install” software that isn’t managed
by Homebrew.

If a brew tries to write a .pc file to this folder, the install will\nfail during the link step.

You should probably `chown` /usr/local/lib/pkgconfig

大事なのはおそらくここでしょう。
見ると osxfuse インストール時に作られたたらしいこのディレクトリは

drwxr-xr-x 4 root wheel 136 9 27 22:02 pkgconfig

と、root 権限で置かれていました。これを自分に chown し、

% brew uninstall little-cms
% brew install little-cms

としたら、案の定、/usr/local/lib/pkgconfig 内に、先程までは存在しなかった、lcms.pc というファイルが作られました。little-cms の環境がやはり不完全だったようです。
この状態で、ImageMagick も再インストールすると

% brew uninstall imagemagick
% brew install imagemagick

bundle install で RMagick のインストール時に失敗する事は無くなりました。
環境系のトラブルは面倒ですね。

CentOS 5 に Ruby 1.8.7 をセットアップする(ために checkinstall をセットアップする)

先日、弊社内の開発サーバがハードディスクトラブルにより起動不能になりました。
すぐさま別のサーバに環境を構築して引き継ぎを行なったのですが、短期間で行なった応急処置で100%完全に引き継げるはずもなく、ささいなトラブルはいくつか生じているようです。

例えば、先日のFlash Lite の中身を動的に変更するという記事に貼ってあった、サンプルの CGI が出力されなくなってしまいました。当該記事の中で入れた諸々のライブラリが、移転先サーバには入っていないせいですね。

今回はこれらをセットアップしようと思います。とはいえ、以前書いた内容をそのままやるだけだと思っていたんですが…。

まず、移転先サーバには、Ruby や RubyGems のインストールに用いた checkinstall が入っていませんでした。
CentOS 4 だった旧サーバでは、rpmforge のレポジトリを有効にしてやれば、yum コマンドで checkinstall をセットアップ出来たのに、CentOS 5になった移転先サーバではなぜか以下のように “Nothing to do” になってしまいます。
Continue reading »

Ruby で Excel を弄る

趣味です。

VBA の書き方はわからないけど、Ruby の書き方ならわかるんです。
Ruby で書いたって、win32ole 挟んだ状態で使ったら、そんなに VBA 書くのと変わんないコードになるんだけどね。

今回は、日毎に時間帯別の統計情報が記載されたテキストファイルをもとに整形された Excel ファイルを出力するのが目標。
テキストファイルは、こういう感じの内容。

集計対象名1 —–
2010/02/21 0 15
2010/02/21 1 8
(中略)
2010/02/21 22 21
2010/02/21 23 18

集計対象名2 —–
2010/02/22 0 15
2010/02/22 1 8
(中略)
2010/02/22 22 21
2010/02/22 23 18

(以下略)

最初に、

集計対象名(スペース)ハイフンx5

のヘッダが来て、それに続いて0時から23時までの

日時(TAB)時間帯(TAB)件数(TAB)

という行が繰り返されるこのセットを一日分として、数日分の内容が繰り返されて、更にそれが集計対象毎にも繰り返される。

そんなテキストデータをパースして、Excel化するのに用いたスクリプトが以下。
Continue reading »

preload preload preload