Hatena::ブログ(Diary)

uzakadeuのブログ

2010-11-14

MacでOctave

GNU Octaveという数値解析ソフトウェアがあります。

これをいつも使ってるiMacで利用したいと思い立ちました。その顛末です。


MacPortでOctaveインストールする

まずMacPortでOctaveインストールしようとしました。

MacPortを使うのは初めてなので

辺りを参考に手順を進めます。

$ sudo port selfupdate
$ sudo port install octave

とすると、たくさんの依存関係があり、それを解決するためにいろんなものをインストールし始めました。

やがて curl-ca-bundle パッケージのインストールでchecksum errorが発生しました。


よく分かりませんが、パッケージ情報に紐づいてるチェックサムが間違ってるのでしょう。これはさっさと諦めます。


【追記】2010-11-20 01:53

コメントでチェックサムが修正されたことを教えていただきました。私もやってみてインストールできることを確認しました。


SourceForge.netからOctaveインストールする

次にSourceForge.netからOctavegnuplot、AquaTermをインストールしようとしました。

を参考にインストールを終えます。

で実行してみると...

octave-3.2.3:1> x=1:30
octave-3.2.3:2> plot(x,sin(x/pi))
dyld: Library not loaded: /usr/X11/lib/libfreetype.6.dylib
  Referenced from: /usr/X11R6/lib/libfontconfig.1.dylib
  Reason: Incompatible library version: libfontconfig.1.dylib requires version 13.0.0 or later, but libfreetype.6.dylib provides version 10.0.0

というエラーが出ます。


「libfontconfig.1.dylibはlibfreetype6.dylibのv13.0.0以降が必要なのに、今あるのはv10.0.0だよ」という意味です。いや、そう言われてもそれはAppleから提供されてるもんだし。。。


【追記】2010-11-15 04:15

otoolで見ると問題なさそうな気がするけど、見方間違ってるのかなぁ。

$ otool -L /usr/X11/lib/libfontconfig.1.dylib
    ...
    /usr/X11/lib/libfreetype.6.dylib (compatibility version 13.0.0, current version 13.0.0)
    ...
$ otool -L /usr/X11/lib/libfreetype.6.dylib
    /usr/X11/lib/libfreetype.6.dylib (compatibility version 13.0.0, current version 13.0.0)
    ...

【追記】2010-11-15 22:26

原因わかりました。octaveが古いライブラリのコピーを持ってて、そちらを先に参照させているようです。

$ otool -L /Applications/Octave.app/Contents/Resources/lib/libfreetype.6.dylib
    /tmp/deps-i386/lib/libfreetype.6.dylib (compatibility version 10.0.0, current version 10.18.0)
    ...

対策としては、octaveのソースを取得して再ビルドすべきかな。


私は/Applications/Gnuplot.app/Contents/Resources/bin/gnuplotを編集して次の一行を36行目辺りに追加しました。一応問題なく動いています。

DYLD_LIBRARY_PATH=$(echo $DYLD_LIBRARY_PATH | awk '{gsub(/[^:]*\/Octave\.app\/[^:]*:/,"");print}')

調べてみると、最近のMacOS Xアップデート(v10.6.4 → v10.6.5)から出始めた問題らしいです。知らんけど。


システムのライブラリを置き換えるのは躊躇われるので、これはあきらめます。


VirtualBox on MacUbuntuoctaveインストールする

次にMac上でVirtualBoxVMWareみたいなもの)を動かし、そのうえでUbuntuを動かし、Ubuntuoctaveインストールすることにしました。一応Mac上でoctaveが使うことになります。(^_^)

からVirtualBox仮想マシンイメージをダウンロードし、仮想マシンイメージをzip解凍してからVirtualBoxに登録します。


あとはUbuntu上で

$ sudo apt-get install octave
$ sudo apt-get install gnuplot-x11

とし、インストール完了。



意外に苦労しましたが、何とかoctaveiMac上で使うことができました。

nozawanozawa 2010/11/14 23:40 こんにちは。「How to install ”Octave” in Mac OS X Leopard - フェムトセカンド」の記事を書いたものです。
動かない理由は、gnuplotの描画をX11で行おうとしているからのようです。

gnuplotの描画をAquaTermで行うように設定を変更すれば、グラフが表示されるようになるのではないかと思います。
X11とAquaTermの切り替えについては以下のページを参考にしてくだしさい。

http://nozawashinichi.sakura.ne.jp/fs/2009/07/octavemac-x11-or-aquaterm.html

uzakadeuuzakadeu 2010/11/15 04:57 nozawaさん、コメント誠にありがとうございます。
  export GNUTERM=aqua
を追加してみたらどうか、という意味ですよね?

先に結果から報告すると、状況は変わりませんでした。

またこの問題は、gnuplotをoctaveから使う場合だけ発生し、gnuplot単体で使う場合は発生しません。

 (1) AquaTermを使う。
   $ GNUTERM=aqua gnuplot
   Terminal type set to 'aqua'
   gnuplot> plot sin(x)

     → AquaTermが開き、そこに正弦波が表示される。

 (2) Xを使う。
   $ GNUTERM=xterm gnuplot
   Terminal type set to 'xterm'
   gnuplot> plot sin(x)

     → Xにtektoronix(Tex)が開き、そこに正弦波が表示される。

それと本文にも追記しましたが、otool -Lでlibfontconfig.1.dylibとlibfreetype.6.dylibの見てみたのですが、そこに表示されるバージョンは依存関係は問題ないようです。otool -L を使うの初めてなので、出力の見方を間違っているかもしれませんが。。。

uzakadeuuzakadeu 2010/11/15 22:38 SourceForge.netから取得したOctaveからGnuplotを起動できない件、Octaveが古いライブラリのコピーを持っているのが原因でした。本文の【追記】をご参照ください。

takeshi_nagaetakeshi_nagae 2010/11/19 15:42 MacPorts のチェックサムが更新されたようですよ:
https://trac.macports.org/changeset/73578

port 1.9.2 にアップデート後,
sudo port clean curl-ca-bundle
sudo port install octave
でインストールできました.octave と同時に gnuplot,aquaterm もインストールされます.

uzakadeuuzakadeu 2010/11/20 01:50 takeshi_nagaeさん、情報ありがとうございました。私もインストールできることを確認しました。

ykkykk 2010/11/27 17:09 私もuzakadeuさんと同じエラーが出て困っています.追記のところを詳しく教えていただけませんか?

uzakadeuuzakadeu 2010/11/27 19:17 ykkさん、こんにちは。

MacPortsはchecksum情報の間違いが修正されて普通にoctaveを構築できるようになったので、MacPortsのことを尋ねているのではないですよね。もしMacPortsのことをお尋ねでしたらtakeshi_nagaeさんのコメントを参照して構築して下さい。



以下、SourceForgeから取得したOctaveとGnuplotのバイナリで発生するライブラリのバージョン不一致の話です。

まずエラーが発生する原因を順を追って説明します。推測も混じっていますので、そのつもりでお読み下さい。

 (1) Octaveからplotコマンドを実行するとGnuplotを起動します。この時、環境変数DYLD_LIBRARY_PATH の「先頭」に /Applications/Octave.app/Contents/Resources/lib などを挿入します。

 (2) GnuplotはGNUTERM環境変数に関わらず /usr/X11/lib/libfontconfig.1.dylib をロードします。libfontconfig.1.dylibはさらに libfreetype.6.dylib のv13.0.0をロードしようとします。

 (3) libfreetype.6.dylib は実は二カ所にあり、それぞれバージョンが異なります。
   - /Applications/Octave.app/Contents/Resources/lib/libfreetype.6.dylib v10.0.0
   - /usr/X11/lib/libfreetype.6.dylib v13.0.0

 (4) システムは環境変数DYLD_LIBRARY_PATH内で指定されたディレクトリ順にライブラリを探しますので、先に v10.0.0 である /Applications/Octave.app/Contents/Resources/lib/libfreetype.6.dylib を見つけてロードしようとします。

 (5) この段階で libfreetype.6.dylib に要求されているバージョン(v13.0.0)とロードしようとしているバージョン(v10.0.0)が一致してないというエラーが発生します。

以上がエラーが発生する原因です。


先のエラーの原因をみると、解決方法が少なくとも二つあります。
 案1. /Applications/Octave.app/Contents/Resources/lib/libfreetype.6.dylib を v13.0.0 に更新する。
 案2. /usr/X11/lib/libfreetype.6.dylib をロードするように環境変数DYLD_LIBRARY_PATHを変更する。


案1はOctaveをソースから再構築すればよく、こちらの対策がおすすめだと思います。英語のQ&Aサイトでうまくいったと報告が出ていました。ただ、私は試してませんのでやり方は知りません。

案2は簡単に実施できるので、私は案2を採用しました。以下案2について説明します。

 (1) /Applications/Gnuplot.app/Contents/Resources/bin/gnuplotはシェルスクリプトです。これを適当なエディタで編集します。オリジナルは適当な名前でバックアップしておいた方がいいと思います。

 (2) 73行目に次のような記述があると思います。

    DYLD_FRAMEWORK_PATH="${ROOT}/lib:${DYLD_FRAMEWORK_PATH}"

    # Set up the path where gnuplot searches for the local .gnuplot file

 (3) 上記に★の二行を挿入します。空行の方は挿入しなくても構いません。

    DYLD_FRAMEWORK_PATH="${ROOT}/lib:${DYLD_FRAMEWORK_PATH}"
  ★ 
  ★ DYLD_LIBRARY_PATH=$(echo $DYLD_LIBRARY_PATH | awk '{gsub(/[^:]*\/Octave\.app\/[^:]*:/,"");print}')

    # Set up the path where gnuplot searches for the local .gnuplot file

以上です。

ykkykk 2010/11/27 19:57 こんばんは。
早速回答ありがとうございます.
ただ勉強不足のため
/Applications/Gnuplot.app/Contents/Resources/bin/gnuplot
の開き方が分からないのですが,もしよろしければ教えてください.

ykkykk 2010/11/28 00:22 案2の方法で解決できました.ありがとうございました.

uzakadeuuzakadeu 2010/11/28 00:27 ykkさん、こんばんは。

(1) ドックの「アプリーケーション」フォルダをクリックします。
(2) 「アプリケーション」フォルダの中の「ユーティリティ」をクリックします。
(3) 「ユーティリティ」の中の「ターミナル.app」をクリックします。するとターミナルというアプリケーションが起動し、まずタブ一つとシェル一つが提供されます。
(4) そのシェルの中で次のコマンドを実行して下さい。エディタは使い方が簡単なpicoを例にしていますが、vimでもemacsでも得意なものにして下さい。

   $ cd /Applications/Gnuplot.app/Contents/Resources/bin
   $ pico gnuplot


もしこの説明で分からない場合、実際に横で一緒に見てくれる詳しい方のサポートが必要だと思います。お近くのMac OS XまたはUNIX/Linuxに詳しい方にお尋ねください。

ykkykk 2010/11/28 23:20 こんばんは.解決できました.すごく丁寧に解説していただきありがとうございます.

mnomno 2010/12/03 01:17 同じエラーで困っていましたが,記事を参考にさせていただいて解決できました.ありがとうございます.

kyabkyab 2011/03/11 01:55 同じく記事を参考にOctaveからgnuplotが使えるようになりました。説明も素晴らしいです。ありがとうございます。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

Connection: close