mieki256's diary



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。

インストール :

LibUI は、gem でインストールすることができる。
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に入れて対処する場合もあるか…。
> 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ライブラリと思っておいたほうがよいのだろう…。

glimmer-dsl-libuiというライブラリもあるらしい :

LibUI を呼び出して使いつつ、記述が簡単になったライブラリ(フレームワーク?)もあるらしい。

_glimmer-dsl-libui の話 #Ruby - Qiita

ただ、画像表示に関しては、やはり難有りらしい…。Linux上で使う分には表示されるけど、Windowsでは表示されないと書いてある。

libui.dll入手時に表示されたメッセージのログ :

libui.dll を入手した際に表示されたメッセージを一応メモしておく。
> 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 とか一体ソレは何ですか? という知識状態なので、おそらく無駄な作業をしているような気がする。

以上です。

過去ログ表示

Prev - 2023/10 - Next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project