ござるのブログ

覚え書きいろいろ

Lubuntu 14.04にrbenvとruby-buildで入れたRuby 2.1.5でRuby/Tkを使う

はじめに

ちょっとした数値データを処理してグラフを表示するためにRuby Gnuplotを使っていたのですが、ここを見てRuby/Tkの素晴しさを知り、早速Lubuntu 14.04にrbenvruby-buildで入れたRuby 2.1.5でRuby/Tkを使おうとしたところ、環境構築にてこずりました。

Tcl/Tk 8.5のインストール

まず、Tcl/Tkをインストールします。apt-gettk-devをインストールするとtk8.6-devが入りますが、現時点でRuby/Tkは8.6には対応してないそうなので(注: パッチを当てると使えます。こちらを参照のこと。11/23/14追記)(注: Ruby 2.2.0ではパッチが必要なくなったようです。こちらを参照のこと。12/02/15追記)、以下のようにtk8.5-devを入れます。

$ sudo apt-get install tk8.5-dev

Ruby 2.1.5のインストール

次にRubyRuby/Tkrbenvruby-buildでインストールします。普通は

$ rbenv install 2.1.5

だけでいいと思うのですが、今回はこのままではTcl/Tkのヘッダやライブラリを認識せず、Ruby/Tkコンパイルされません。ここでだいぶ時間をロスしました。こちらのサイトでは、必要なライブラリにシンボリックリンクを張って対応しています。それでも良いと思いますが、/usr/libにパッケージシステム管理外のシンボリックリンクがあるのは何となく気持ち悪いので、以下のようにconfigueのオプションでどうにかします。32bitの場合はx86_64-linux-gnui386-linux-gnuなどに適宜変更してください。

$ RUBY_CONFIGURE_OPTS="--with-tcltkversion=8.5 \
--with-tcl-lib=/usr/lib/x86_64-linux-gnu \
--with-tk-lib=/usr/lib/x86_64-linux-gnu \
--with-tcl-include=/usr/include/tcl8.5 \
--with-tk-include=/usr/include/tcl8.5 \
--enable-pthread" rbenv install 2.1.5 -v
$ rbenv global 2.1.5
$ rbenv rehash

私の環境では、これでRuby/Tkがインストールされました。サンプルを動かしてみます。

$ ruby ext/tk/sample/24hr_clock.rb

f:id:gzalt:20141122154755p:plain

うまく動いているようです。

最後に

そもそも拡張TkパッケージPlotchartを使いたくてがんばっているわけですが、まだ使えていません。

$ sudo apt-get install tklib

という感じでPlotchartを入れたのですが、サンプルを実行すると下記のようにエラーになります。

$ ruby ext/tk/sample/tkextlib/tcllib/plotdemos1.rb
/home/gzalt/.rbenv/versions/2.1.5/lib/ruby/2.1.0/tk/package.rb:86:in `rescue in require': TkPackage attempt to provide package Plotchart 2.1.0 failed: package Plotchart 2.0.1 provided instead (RuntimeError)

道のりは長い…

Plotchartのバグ(23/11/14追記)

ここによると、どうもPlotchartのバグのようです。下記のように修正します。

--- /usr/share/tcltk/tklib0.6/plotchart/plotchart.tcl.orig   2013-03-14 17:01:30.000000000 +1100
+++ /usr/share/tcltk/tklib0.6/plotchart/plotchart.tcl 2014-11-23 19:11:59.456417506 +1100
@@ -2849,4 +2849,4 @@
 
 # Announce our presence
 #
-package provide Plotchart 2.0.1
+package provide Plotchart 2.1.0

サンプルを動かしてみます。

$ ruby ext/tk/sample/tkextlib/tcllib/xyplot.rb

f:id:gzalt:20141123172838p:plain

うまく表示されました。