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 とか一体ソレは何ですか? という知識状態なので、おそらく無駄な作業をしているような気がする。

#2 [linux] 日記ページのアーカイブ閲覧時のIDとパスワードを追加しておいた

ちょっとタイトルが間違ってる気もするけど…。アーカイブと言うか、外部ページのキャッシュだよな…。

このWeb日記ページは、ページ内の各リンクの先頭の「_」をクリックすると、外部サイトをキャッシュしたページが表示されるのだけど、一応、Webサーバ(Apache2)のBASIC認証を有効にして、IDとパスワードの入力を求めるようにしてある。

その際、ヒントとして、以下のメッセージが表示されるように設定してあった。
Cache Archive ID: Future Boy ***** PASS:***** Kopanda
宮崎アニメに詳しい人ならすぐ分かるはず。もっとも、全部小文字だったり、koじゃなくてcoになってる点がハマりそうではあるけど…。

しかし、いつの頃からか、各ブラウザがこの手のメッセージを表示しない仕様に変わってしまった。IDとパスワードのヒントが一切出ないので、今となってはキャッシュページを閲覧できる人は居ないだろうなと…。それどころか、このヒントメッセージが出なくなったことで、設定したはずの自分自身すらIDとパスワードを忘れてしまって、キャッシュが見れなくて毎回メモを探して右往左往している状態で…。ちょっと面倒臭くなってきた。

そんなわけで、今回、自分も忘れにくいように、ID:guest, PASS:guest を追加しておいた。とメモ。 *1

設定手順をメモ :

パスワードファイルは以下。念のために、ファイル名はちょっと変えておく。
/home/(USERNAME)/.htpasswd_axxxxxx

このパスワードファイルを使う旨は、以下のファイルで指定してある。
/home/(USERNAME)/public_html/archive/.htaccess_cxxxxx
AuthType Basic
AuthName "Cache Archive ID: Future Boy ***** PASS:***** Kopanda"
AuthUserFile /home/(USERNAME)/.htpasswd_axxxxxx
AuthGroupFile /dev/null
<Limit GET POST>
require valid-user
</Limit>

Debian Linux系の場合、パスワードファイルの作成や追加には htpasswd というプログラムを使う。これは apache2-utils というパッケージに入っている。インストールは以下。
sudo apt install apache2-utils

パスワードファイルを新規作成する場合は以下。一番最後に、初期ユーザ名を指定してることに注意。実行すると、設定すべきパスワードの入力を求められる。
htpasswd -c -B /home/(USERNAME)/.htpasswd_axxxxxx USERNAME

ID(USERNAME)とパスワードを追加する場合は以下。
htpasswd -B /home/(USERNAME)/.htpasswd_axxxxxx USERNAME

*1: って、こんなところにそんな情報書いちゃっていいの? いやまあ、どうせ誰も見てないWeb日記だし…。このWeb日記、未だにhttpsに対応してないせいか、Googleでも滅多にリストアップされなくなってきているので…。それにそもそも、リンク先の元ページがちゃんと生きてたらキャッシュを見る必要も無いのだから、キャッシュを見るためのIDとパスワードなんてそれほど重要な情報ではないよなと…。それに、今はWebArchiveがあるし。あっちはIDやパスワードなんて無くても見れるし。そういったことを考えると、ここにコレを書いたからと言ってソレが何なの、という気分になってきたわけで。

#3 [nitijyou] 日記ページをアップロード

2023/08/10を最後に日記をアップロードしてなかったのでアップロード。

以上、1 日分です。

過去ログ表示

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