2023/10/16(月) [n年前の日記]
#2 [ruby] Ruby/Tk+Tk拡張を動かそうとしてハマった
久々に Ruby を触ったことだし、せっかくだからと、HDD内で眠ってた昔のスクリプトの動作確認をしていたのだけど。cairo + Tk + Tk拡張を使ったスクリプトを動かそうとしてハマってしまった。環境は Windows10 x64 22H2。
◎ cairo について :
cairo を使うと、アンチエイリアスがかかった奇麗な図形描写が簡単にできる。
_cairo: 2 次元画像描画ライブラリ
とりあえず手元の環境では、以下の組み合わせで動いてくれた。
Ruby 2.x 以降、かつ、DevKit がインストール済みの環境なら、基本的には以下でインストールできる。その Ruby のバージョン専用のバイナリを、DevKit を使ってビルドしてからインストールされる。
Ruby 1.9.x は注意が必要。cairo 1.12.4 以前のバージョンしか動かないので、バージョンとプラットフォーム(x86-mingw32、x64-mingw32等)を指定してインストールすることになる。
_mieki256's diary - cairo + Ruby Windows版が使えない
こんな具合なので、Ruby + cairo については今でも全然使えそうだなと感じたのだけど。
_cairo: 2 次元画像描画ライブラリ
とりあえず手元の環境では、以下の組み合わせで動いてくれた。
- Ruby 1.9.3 p551 i386-mingw32 (RubyInstaller) + cairo 1.12.4 x86-mingw32
- Ruby 2.3.3 p222 i386-mingw32 (RubyInstaller) + cairo 1.15.9 x86-mingw32
- Ruby 2.6.10 p210 i386-mingw32 (RubyInstaller2) + cairo 1.17.12
- Ruby 3.0.4 p208 i386-mingw32 (RubyInstaller2) + cairo 1.17.12
- Ruby 3.2.2 i386-mingw32 (RubyInstaller2) + cairo 1.17.12
Ruby 2.x 以降、かつ、DevKit がインストール済みの環境なら、基本的には以下でインストールできる。その Ruby のバージョン専用のバイナリを、DevKit を使ってビルドしてからインストールされる。
gem install cairo
Ruby 1.9.x は注意が必要。cairo 1.12.4 以前のバージョンしか動かないので、バージョンとプラットフォーム(x86-mingw32、x64-mingw32等)を指定してインストールすることになる。
gem install cairo --platform x86-mingw32 -v=1.12.4
_mieki256's diary - cairo + Ruby Windows版が使えない
こんな具合なので、Ruby + cairo については今でも全然使えそうだなと感じたのだけど。
◎ Ruby/TkをWindows上で使いたい :
cairo + DXRuby を使うスクリプトについては、どのバージョンの Ruby でもスンナリ動いてくれたのだけど、cairo + Tk(Ruby/Tk) + Tk拡張を使ったスクリプトが動かなくて困った。
Windows上の Ruby/Tk は状況が面倒臭くて…。
そんなわけで、Ruby + Tk + Tk拡張を使いたいと思ったら、Ruby 1.9.x を利用するしかない状況で…。
これがもし、標準的な Tk の機能しか使わないなら、Ruby 2.3 までのどれかを選べば ―― RubyInstaller (RubyInstaller2ではない) をインストールすればそれで済むのだけど…。
Ruby 2.4 以降で Ruby/Tk を使いたい場合は、これはもう一体何をどうしたらいいのかさっぱり不明。昔だったら、ActiveTcl もインストールして、とかやれたんだろうけど。
ちなみに、これが Python なら状況が全然違う。Python をインストールする際に Tk(tkinter)も一緒にインストールできるから、標準で Tk (tkinter) が使えるも同然なので…。そのせいもあるのか、もっと簡単に Tk を扱えるラッパーライブラリも登場していたりして、簡単なGUIアプリならすぐに作れる状態。
_Tkinterを使うのであればPySimpleGUIを使ってみたらという話 #Python - Qiita
_【PySimpleGUI】PythonでカンタンにGUIを作ろう! #Python - Qiita
Ruby が地獄だとしたら Python は天国。
Windows上の Ruby/Tk は状況が面倒臭くて…。
- Ruby 2.4 の時点で、標準ライブラリから Tk が外されてしまった。Ruby 2.4 以降は、gem install tk でインストールしないといけない。
- Ruby 2.3 までは、Windows の場合、RubyInstaller(RubyInstaller2ではない) をインストールすれば Tk も使えていた、らしい。インストール時に「Tcl/Tkも一緒にインストールする」的な指定項目があるので、そこにチェックを入れてインストールすれば Ruby/Tk が使えたのだとか。
- ただ、RubyInstaller に同梱されている Tk は、基本的な機能しか持っていない。Tk拡張を使ったスクリプトは動かない。
- Ruby 2.4 以降は、RubyInstaller ではなく RubyInstaller2 になったので、Tcl/Tk を一緒にインストールしてくれなくなった。Windows の場合、別途 ActiveTcl のインストールが必要になるのだとか。
- しかし ActiveTcl は有償になってしまった(らしい)。また、64bit版はあるけれど、32bit版はなくなった。Ruby 32bit版では Tk が使えない。
- Rub 1.9.x だけは、Tk拡張を含めた tcltklib.so が存在するので、その tcltklib.so と、元々入っていた tcltklib.so を交換するだけでTk拡張が使える。
そんなわけで、Ruby + Tk + Tk拡張を使いたいと思ったら、Ruby 1.9.x を利用するしかない状況で…。
これがもし、標準的な Tk の機能しか使わないなら、Ruby 2.3 までのどれかを選べば ―― RubyInstaller (RubyInstaller2ではない) をインストールすればそれで済むのだけど…。
Ruby 2.4 以降で Ruby/Tk を使いたい場合は、これはもう一体何をどうしたらいいのかさっぱり不明。昔だったら、ActiveTcl もインストールして、とかやれたんだろうけど。
ちなみに、これが Python なら状況が全然違う。Python をインストールする際に Tk(tkinter)も一緒にインストールできるから、標準で Tk (tkinter) が使えるも同然なので…。そのせいもあるのか、もっと簡単に Tk を扱えるラッパーライブラリも登場していたりして、簡単なGUIアプリならすぐに作れる状態。
_Tkinterを使うのであればPySimpleGUIを使ってみたらという話 #Python - Qiita
_【PySimpleGUI】PythonでカンタンにGUIを作ろう! #Python - Qiita
Ruby が地獄だとしたら Python は天国。
◎ 余談。RubyはGUIが鬼門 :
ポエムです。
昔から「RubyはGUIが鬼門」と言われてたりするのだけど、少なくとも Ruby/Tk に関してはこんな感じで、というかどう見ても死んでるけれど。他のGUIライブラリも軒並み開発が止まって死んでるわけで…。
だから、「RubyでGUIアプリを作ってみたい」と言い出す人が居たら、
「それは絶対に、絶対にやめておいたほうがいい」
「今は動いていても Ruby のバージョンが上がったらそのアプリは十中八九動かなくなるよ」
「そもそもライブラリが入手できなくなるから」
とアドバイスしたくなるというか…。いやまあ、さすがにこの状況で「RubyでGUIを」と言い出す人はそもそも居ないか。「今からCOBOL勉強します」と言い出すようなものかも。
もっとも、このあたりは Windows の場合の話で、Linux上ではまたちょっと違うらしいのだけど…。Linux の場合、システムに Tk や GTK が入ってくるので、「どうやって Tk を入れたらいいんだ」と悩まずに済むから Ruby/Tk や Ruby/GTK も比較的スンナリ使えるのかもしれない。
でもまあ、何にせよ、Windows上で動くちょっとしたGUIアプリを今から作りたいなら、Ruby より Python を選んだほうがいいですわな。Python ならGUIライブラリも選び放題だし。
Ruby 1.8 の頃は良かったな…。vruby とか良さそうに見えたっけ。言語本体だけがいくら頑張ってみてもダメなんだよなあ…。考えてみたら Tcl/Tk 自体がそうか。言語部分の Tcl はアレだけど Tk は使われ続けてたりするし。
ポエムです。
昔から「RubyはGUIが鬼門」と言われてたりするのだけど、少なくとも Ruby/Tk に関してはこんな感じで、というかどう見ても死んでるけれど。他のGUIライブラリも軒並み開発が止まって死んでるわけで…。
だから、「RubyでGUIアプリを作ってみたい」と言い出す人が居たら、
「それは絶対に、絶対にやめておいたほうがいい」
「今は動いていても Ruby のバージョンが上がったらそのアプリは十中八九動かなくなるよ」
「そもそもライブラリが入手できなくなるから」
とアドバイスしたくなるというか…。いやまあ、さすがにこの状況で「RubyでGUIを」と言い出す人はそもそも居ないか。「今からCOBOL勉強します」と言い出すようなものかも。
もっとも、このあたりは Windows の場合の話で、Linux上ではまたちょっと違うらしいのだけど…。Linux の場合、システムに Tk や GTK が入ってくるので、「どうやって Tk を入れたらいいんだ」と悩まずに済むから Ruby/Tk や Ruby/GTK も比較的スンナリ使えるのかもしれない。
でもまあ、何にせよ、Windows上で動くちょっとしたGUIアプリを今から作りたいなら、Ruby より Python を選んだほうがいいですわな。Python ならGUIライブラリも選び放題だし。
Ruby 1.8 の頃は良かったな…。vruby とか良さそうに見えたっけ。言語本体だけがいくら頑張ってみてもダメなんだよなあ…。考えてみたら Tcl/Tk 自体がそうか。言語部分の Tcl はアレだけど Tk は使われ続けてたりするし。
ポエムです。
[ ツッコむ ]
以上です。