グラフを描く (mingplot on FreeBSD)
人狼BBSの勝率の推移をグラフにしてみた。 Rubyでグラフを描くには、
- Ruby/GD, gruby を使う(PNGフォーマット)
- mingplot を使う(Flashフォーマット)
という方法が使えそうだけど、ここでは後者の mingplot を使うことにした。
mingplot はドキュメントが少ないので、使えるようになるまではちょっと大変。 まずは、mingplotインストールを参考にしながら、さくらのサーバにインストールした。mingplot を使うために必要なのは、
- ming-0.2a
- Ming/Ruby
- mingplot
の3つ。
それから、ming-0.2a をインストールするために BISONが必要だった(FreeBSDだからっぽい)。 それぞれを、自分のホームディレクトリにインストール。
BISON
これはいつもどおりの方法でOK。
$ wget http://ftp.gnu.org/gnu/bison/bison-1.875.tar.gz $ tar zxvf bison-1.875.tar.gz $ cd bison-1.875/ $ ./configure --prefix=$HOME $ make && make install
ming-0.2a
最新版は 0.3alpha だけど、Ming/Ruby が対応していなさそう。 なので、ちょっと古い0.2aを使う。
$ wget http://puzzle.dl.sourceforge.net/sourceforge/ming/ming-0.2a.tgz $ tar zxvf ming-0.2a.tgz $ cd ming-0.2a/ $ vi Makefile $ make && make install
ming には configure スクリプトが無かったので、Makefile の PREFIX を直接書き換えた (PREFIX = ${HOME} とした) 。
Ming/Ruby
これは setup.rb という Ruby スクリプトを使ってインストールする。 使い方が分からずに少々苦戦した。
$ wget http://madscientist.jp/~ikegami/sources/ming-ruby-0.1.6.tar.gz $ tar zxvf ming-ruby-0.1.6.tar.gz $ cd ming-ruby-0.1.6 $ ruby setup.rb config --prefix=$HOME ---> ext ---> ext/ming ---> ext/ming/ming /usr/local/bin/ruby18 /home/machu/src/ming-ruby-0.1.6/ext/ming/ming/extconf.rb checking for newSWFShape() in -lming... no <--- ext/ming/ming <--- ext/ming <--- ext
と、ここでエラーがでてしまう。 先ほどインストールした ming-0.2a が認識できていないみたい。 付属の README.ja を読むと、
もしも libming.a が標準のパスに無いなどの理由で、ruby setup.rb config に失敗するときは、
$ ruby setup.rb config -- --with-ming-dir=/usr/local
を試してみてください。
と書いてあった。 で、もう一度挑戦。
$ ruby setup.rb config --prefix=$HOME -- --with-ming-dir=$HOME $ ruby setup.rb setup $ ruby setup.rb install
今度は無事に成功。
mingplot
ようやく本命の mingplot 。 これも Makefile を編集して PREFIX = ${HOME} とした。
$ wget http://namazu.org/~satoru/mingplot/mingplot-0.3.tar.gz $ tar zxvf mingplot-0.3.tar.gz $ cd mingplot-0.3 $ vi Makefile $ make && make install
mingplot の実行 (1) … iconv モジュール
動作確認のために、 mingplot に付属の googleplot を実行してみる。 …と、いきなりエラー。
$ googleplot /home/machu/lib/ruby/site_ruby/1.8/mingplot.rb:12:in `require': No such file to load -- iconv (LoadError) from /home/machu/lib/ruby/site_ruby/1.8/mingplot.rb:12 from /home/machu/lib/ruby/site_ruby/1.8/googleplot.rb:12:in `require' from /home/machu/lib/ruby/site_ruby/1.8/googleplot.rb:12 from /home/machu/bin/googleplot:13:in `require' from /home/machu/bin/googleplot:13
iconv が無いとのこと。 Google で調べると、samidare導入……できずに死亡というページを発見。
ruby を FreeBSD の port からインストールした場合は iconv モジュール は別途 converters/ruby-iconv からインストールする必要があります。
Port は使えないので(たぶん)、iconv モジュールをソースからコンパイルしなきゃいけないみたい。 Rubyの公式サイトから Ruby 1.8.1 のソースツリーをダウンロードして展開する。そして、 ext/iconv ディレクトリへ移動。 こんどは、 extconf.rb というものを使ってインストールするみたい。
$ cd ruby-1.8.1/ext/iconv $ ruby extconf.rb --prefix=$HOME checking for iconv.h... no
…なんともつれないメッセージが。 さっきのページにも
FreeBSD+iconv.hで検索すると……なんかイヤーな感じが。あああああ。どうしよう。
って書いてあるし、いやな予感。 ここで悩むこと数時間、RubyとiconvとFreeBSDが突破口になる。
Ruby 1.9.0をインストールしようとしてもiconvモジュールがなかなかコンパイルされなくて、ようやく解決。メモメモ。 --with-iconv-dirというのに気づくまで時間がかかりました(^^;)。
このオプションをつけると、ちゃんとインストールできた…と思ったけど、--prefix オプションは有効じゃないかも。(Makefile を開いて、 prefix = $(HOME) とする必要があるかも?)
$ ruby extconf.rb --prefix=$HOME --with-iconv-dir=/usr/local checking for iconv.h... yes checking for iconv() 2nd argument is const... yes checking for main() in -liconv... yes creating Makefile $ make && make install
mingplot の実行 (2)
で、もう一度 googleplot を実行する。
$ googleplot /home/machu/lib/ruby/site_ruby/1.8/i386-freebsd4/ming/ming.so: Shared object "libming.so" not found - /home/machu/lib/ruby/site_ruby/1.8/i386-freebsd4/ming/ming.so (LoadError) from /home/machu/lib/ruby/site_ruby/1.8/mingchart.rb:12 from /home/machu/lib/ruby/site_ruby/1.8/mingplot.rb:16:in `require' from /home/machu/lib/ruby/site_ruby/1.8/mingplot.rb:16 from /home/machu/lib/ruby/site_ruby/1.8/googleplot.rb:12:in `require' from /home/machu/lib/ruby/site_ruby/1.8/googleplot.rb:12 from /home/machu/bin/googleplot:13:in `require' from /home/machu/bin/googleplot:13
あら…と思ったけど、$HOME/lib にインストールされた ming ライブラリが認識できていないことに気がつく。
$ export LD_LIBRARY_PATH=$HOME/lib
と LD_LIBRARY_PATH を指定しておくと、ちゃんと実行できるようになった。 (でも、もしかしたら CGI では使えないかも?)
ふぅ…前準備だけで半日仕事になってしまった。