2023/10/17(火) [n年前の日記]
#1 [ruby] LibUIというGUIライブラリを試用
昨日、「RubyでGUIアプリなんて書くものじゃない」と書いてしまったけれど、自分は天邪鬼なので、随分前から気になっていたGUIライブラリ、LibUI を試用してみることにした。
_インストールが簡単なRuby用のGUIライブラリlibuiのバインディングを作った話 #Ruby - Qiita
_GitHub - kojix2/LibUI: A portable GUI library for Ruby
_libui | RubyGems.org | コミュニティのgemホスティングサービス
_WindowsでRubyで作ったGUIのEXEを配布するときにlibuiを使う場合のメモ #Ruby - Qiita
_RubyでWindowsのGUIアプリを作る #Ruby - Qiita
画像表示に難有りという話があったので様子見してたのだけど、画像を表示しない用途なら使えるのではないかと思えてきたので…。バイナリのサイズが小さいからexe化する際に有利であろう点は魅力的。
環境は、Windows10 x64 22H2 + Ruby 3.2.2 x86。
_インストールが簡単なRuby用のGUIライブラリlibuiのバインディングを作った話 #Ruby - Qiita
_GitHub - kojix2/LibUI: A portable GUI library for Ruby
_libui | RubyGems.org | コミュニティのgemホスティングサービス
_WindowsでRubyで作ったGUIのEXEを配布するときにlibuiを使う場合のメモ #Ruby - Qiita
_RubyでWindowsのGUIアプリを作る #Ruby - Qiita
画像表示に難有りという話があったので様子見してたのだけど、画像を表示しない用途なら使えるのではないかと思えてきたので…。バイナリのサイズが小さいからexe化する際に有利であろう点は魅力的。
環境は、Windows10 x64 22H2 + Ruby 3.2.2 x86。
◎ インストール :
LibUI は、gem でインストールすることができる。
これでインストールできるはずなのだけど、動かない…。
おそらくだけど、gem でインストールされるのは Ruby x64(64bit版)のバイナリで、そのままでは Ruby x86 (32bit)上で動かないというオチなのではないか、という気がする…。
github上のページで、「32bit (x86) 版のDLLが欲しかったら」云々の記述があったので試してみる。何の作業をしてるのかさっぱりわからんけど…。
上記のコマンドを打ち込んでいったら、git clone したフォルダ内の vendor というフォルダの中に libui.dll というファイルが作られた。作られたというか、もしかしてダウンロードされたのだろうか。途中で、[Rake] Downloading Win-x86-shared-release.zip と表示されていたし…。
とりあえず、その libui.dll を、gem でインストールしたフォルダにコピーしてみる。以下のフォルダを開く。
この中に、libui.dll があるので、libui.dll.orig にリネームして一応バックアップ。そして、先ほど入手した libui.dll を件のフォルダにコピーする。
この状態にしたら、サンプルが動いてくれた。
どうやら Ruby x86 (32bit版) を使っているときは、libui.dll を差し替えないといけないようだなと…。その差し替え作業がこれで合ってるのかどうかわからんけど…。
ちなみに、こうして得られた libui.dll を、Ruby 2.6.10 p210 i386-mingw32 に対しても使ってみたら、libui を使ったサンプルが動いてくれた。どうやら、libui.dll 自体は、Ruby x86 と x64 で別のモノが必要になるけれど、Rubyのバージョンとは関係なく利用できる模様。
gem install libui
これでインストールできるはずなのだけど、動かない…。
> ruby 01_hello_libui.rb D:/Ruby/Ruby32-x86/lib/ruby/3.2.0/fiddle.rb:62:in `initialize': Exec format error (Fiddle::DLError) from D:/Ruby/Ruby32-x86/lib/ruby/3.2.0/fiddle.rb:62:in `new' from D:/Ruby/Ruby32-x86/lib/ruby/3.2.0/fiddle.rb:62:in `dlopen' from D:/Ruby/Ruby32-x86/lib/ruby/3.2.0/fiddle/import.rb:86:in `block in dlload' from D:/Ruby/Ruby32-x86/lib/ruby/3.2.0/fiddle/import.rb:77:in `collect' from D:/Ruby/Ruby32-x86/lib/ruby/3.2.0/fiddle/import.rb:77:in `dlload' from D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/libui-0.0.15/lib/libui/ffi.rb:10:in `<module:FFI>' from D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/libui-0.0.15/lib/libui/ffi.rb:5:in `<module:LibUI>' from D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/libui-0.0.15/lib/libui/ffi.rb:4:in `<top (required)>' from D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/libui-0.0.15/lib/libui.rb:20:in `require_relative' from D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/libui-0.0.15/lib/libui.rb:20:in `<module:LibUI>' from D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/libui-0.0.15/lib/libui.rb:5:in `<top (required)>' from <internal:D:/Ruby/Ruby32-x86/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:160:in `require' from <internal:D:/Ruby/Ruby32-x86/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:160:in `rescue in require' from <internal:D:/Ruby/Ruby32-x86/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:40:in `require' from 01_hello_libui.rb:7:in `<main>' <internal:D:/Ruby/Ruby32-x86/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:86:in `require': cannot load such file -- libui (LoadError) from <internal:D:/Ruby/Ruby32-x86/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:86:in `require' from 01_hello_libui.rb:7:in `<main>'
おそらくだけど、gem でインストールされるのは Ruby x64(64bit版)のバイナリで、そのままでは Ruby x86 (32bit)上で動かないというオチなのではないか、という気がする…。
github上のページで、「32bit (x86) 版のDLLが欲しかったら」云々の記述があったので試してみる。何の作業をしてるのかさっぱりわからんけど…。
git clone https://github.com/kojix2/libui cd libui bundle install bundle exec rake vendor:kojix2:windows_x86 bundle exec rake test rake vendor:kojix2:windows_x86
上記のコマンドを打ち込んでいったら、git clone したフォルダ内の vendor というフォルダの中に libui.dll というファイルが作られた。作られたというか、もしかしてダウンロードされたのだろうか。途中で、[Rake] Downloading Win-x86-shared-release.zip と表示されていたし…。
とりあえず、その libui.dll を、gem でインストールしたフォルダにコピーしてみる。以下のフォルダを開く。
(Ruby 3.2.2 x86インストールフォルダ)\lib\ruby\gems\3.2.0\gems\libui-0.0.15\vendor\
この中に、libui.dll があるので、libui.dll.orig にリネームして一応バックアップ。そして、先ほど入手した libui.dll を件のフォルダにコピーする。
この状態にしたら、サンプルが動いてくれた。
どうやら Ruby x86 (32bit版) を使っているときは、libui.dll を差し替えないといけないようだなと…。その差し替え作業がこれで合ってるのかどうかわからんけど…。
ちなみに、こうして得られた libui.dll を、Ruby 2.6.10 p210 i386-mingw32 に対しても使ってみたら、libui を使ったサンプルが動いてくれた。どうやら、libui.dll 自体は、Ruby x86 と x64 で別のモノが必要になるけれど、Rubyのバージョンとは関係なく利用できる模様。
◎ 余談。gem内の.dllや.soの入れ方について :
これは余談だけど。Rubyのバージョンを問わずに、x64 と x86 だけで libui.dll を使い分けるのであれば、gem に両方同梱しておいてくれても良さそうな気もするのだけどな…。
いや、そもそも、x86-mingw32 と x64-mingw32 で別々の gem にしておくのが一般的だろうか。昔はそういう構成にしてあるパッケージがほとんどだった気がする。各パッケージの履歴にも、x86-mingw32 と x64-mingw32 の文字列が並んでいることが多かった。
_fxrubyの全バージョン履歴 | RubyGems.org | コミュニティのgemホスティングサービス
_cairoの全バージョン履歴 | RubyGems.org | コミュニティのgemホスティングサービス
ただ、昨今は分けなくなったパッケージが多い印象もある。なんでだろ。そのあたり、誰かが何かを提唱してたりするのかしらん。
もっとも、DXRuby のように、Rubyのバージョン別、x86, x64別で、全部の .so を1つのgemに入れて対処する場合もあるか…。
いや、そもそも、x86-mingw32 と x64-mingw32 で別々の gem にしておくのが一般的だろうか。昔はそういう構成にしてあるパッケージがほとんどだった気がする。各パッケージの履歴にも、x86-mingw32 と x64-mingw32 の文字列が並んでいることが多かった。
_fxrubyの全バージョン履歴 | RubyGems.org | コミュニティのgemホスティングサービス
_cairoの全バージョン履歴 | RubyGems.org | コミュニティのgemホスティングサービス
ただ、昨今は分けなくなったパッケージが多い印象もある。なんでだろ。そのあたり、誰かが何かを提唱してたりするのかしらん。
もっとも、DXRuby のように、Rubyのバージョン別、x86, x64別で、全部の .so を1つのgemに入れて対処する場合もあるか…。
> tree /f dxruby-1.4.7 ... D:\RUBY\RUBY26-X86\LIB\RUBY\GEMS\2.6.0\GEMS\DXRUBY-1.4.7 └─lib │ dxruby.rb │ ├─2.5 │ dxruby.so │ ├─2.6 │ dxruby.so │ ├─2.6_x64 │ dxruby.so │ ├─2.7 │ dxruby.so │ ├─2.7_x64 │ dxruby.so │ ├─3.0 │ dxruby.so │ └─3.0_x64 dxruby.so
◎ 動作確認 :
github 上にサンプルファイル群があるので、ダウンロードして動作確認してみるのもよさそう。
_LibUI/examples at main - kojix2/LibUI - GitHub
大半のサンプルは動いてくれたけど、一部で問題もあった。
basic_table_image.rb を実行してみたところ、ウインドウが表示されるまで結構待たされた上に、ウインドウ上には画像らしきものが一切表示されなかった。やはり画像表示ができないGUIライブラリのようだなと…。
ただ、histogram.rb を実行したらグラフが表示されたので、自分で何か図形を描画する分には問題無く使えるのかもしれない。
と思ったが、turing_pattern.rb を実行しても、何も変化が起きない…。やはり現状では、視覚情報を表示する何かには使えないGUIライブラリと思っておいたほうがよいのだろう…。
_LibUI/examples at main - kojix2/LibUI - GitHub
大半のサンプルは動いてくれたけど、一部で問題もあった。
basic_table_image.rb を実行してみたところ、ウインドウが表示されるまで結構待たされた上に、ウインドウ上には画像らしきものが一切表示されなかった。やはり画像表示ができないGUIライブラリのようだなと…。
ただ、histogram.rb を実行したらグラフが表示されたので、自分で何か図形を描画する分には問題無く使えるのかもしれない。
と思ったが、turing_pattern.rb を実行しても、何も変化が起きない…。やはり現状では、視覚情報を表示する何かには使えないGUIライブラリと思っておいたほうがよいのだろう…。
◎ glimmer-dsl-libuiというライブラリもあるらしい :
LibUI を呼び出して使いつつ、記述が簡単になったライブラリ(フレームワーク?)もあるらしい。
_glimmer-dsl-libui の話 #Ruby - Qiita
ただ、画像表示に関しては、やはり難有りらしい…。Linux上で使う分には表示されるけど、Windowsでは表示されないと書いてある。
_glimmer-dsl-libui の話 #Ruby - Qiita
ただ、画像表示に関しては、やはり難有りらしい…。Linux上で使う分には表示されるけど、Windowsでは表示されないと書いてある。
◎ libui.dll入手時に表示されたメッセージのログ :
libui.dll を入手した際に表示されたメッセージを一応メモしておく。
自分、bundle とか rake とか一体ソレは何ですか? という知識状態なので、おそらく無駄な作業をしているような気がする。
> git clone https://github.com/kojix2/libui Cloning into 'libui'... remote: Enumerating objects: 2146, done. remote: Counting objects: 100% (369/369), done. remote: Compressing objects: 100% (164/164), done. Receiving objects: 99% (2125/2146)sed 255 (delta 201), pack-reused 1777 Receiving objects: 100% (2146/2146), 434.38 KiB | 5.30 MiB/s, done. Resolving deltas: 100% (1359/1359), done.
> bundle install Fetching gem metadata from https://rubygems.org/. Resolving dependencies... Fetching chunky_png 1.4.0 Fetching minitest 5.20.0 Fetching numo-narray 0.9.2.1 Fetching rubyzip 2.3.2 Installing minitest 5.20.0 Installing rubyzip 2.3.2 Installing numo-narray 0.9.2.1 with native extensions Installing chunky_png 1.4.0 Bundle complete! 6 Gemfile dependencies, 7 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed. Post-install message from rubyzip: RubyZip 3.0 is coming! ********************** The public API of some Rubyzip classes has been modernized to use named parameters for optional arguments. Please check your usage of the following classes: * `Zip::File` * `Zip::Entry` * `Zip::InputStream` * `Zip::OutputStream` Please ensure that your Gemfiles and .gemspecs are suitably restrictive to avoid an unexpected breakage when 3.0 is released (e.g. ~> 2.3.0). See https://github.com/rubyzip/rubyzip for details. The Changelog also lists other enhancements and bugfixes that have been implemented since version 2.3.0.
> bundle exec rake vendor:default rake aborted! Don't know how to build task 'vendor:default' (See the list of available tasks with `rake --tasks`) Did you mean? vendor:kojix2:auto (See full trace by running task with --trace)
> bundle exec rake vendor:kojix2:windows_x86 [Rake] Downloading Win-x86-shared-release.zip [Rake] Extracting Win-x86-shared-release.zip [Rake] Skip sha256sum check (development build) [Rake] Copying builddir/meson-out/libui.dll to D:/home/prg/ruby/_work_sample/libui/libui/libui/vendor/libui.dll
> bundle exec rake test Run options: --seed 17615 # Running: ****** Fabulous run in 0.045116s, 132.9917 runs/s, 288.1487 assertions/s. 6 runs, 13 assertions, 0 failures, 0 errors, 0 skips
> rake vendor:kojix2:windows_x86 [Rake] D:/home/prg/ruby/_work_sample/libui/libui/libui/vendor/libui.dll already exist. [Rake] Download the file and replace it. [Rake] Downloading Win-x86-shared-release.zip [Rake] Extracting Win-x86-shared-release.zip [Rake] Skip sha256sum check (development build) [Rake] Copying builddir/meson-out/libui.dll to D:/home/prg/ruby/_work_sample/libui/libui/libui/vendor/libui.dll
自分、bundle とか rake とか一体ソレは何ですか? という知識状態なので、おそらく無駄な作業をしているような気がする。
[ ツッコむ ]
以上です。