at posts/single.html

グラフを描く (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 では使えないかも?)

ふぅ…前準備だけで半日仕事になってしまった。

関連する日記