2023/10/21(土) [n年前の日記]
#1 [ruby] Rubyスクリプトをexe化できるneriを試用
Rubyスクリプトをexe化できるツールとしては ocra が一番メジャーかなと思うのだけど、ocra は必要になるファイルを1つのファイルにまとめて、exeを実行する度にテンポラリフォルダに展開するので起動が遅い。
あらかじめファイルを展開した状態にしてexe化できるツールはないのかなとググっていたら、neri というツールがあると知った。試しに使ってみることにした。
_neri | RubyGems.org | コミュニティのgemホスティングサービス
_GitHub - nodai2hITC/neri: One-Click Ruby Application Builder
_neri/README.ja.md at main - nodai2hITC/neri - GitHub
_Neri を使って Ruby スクリプトを実行ファイル(.exe)に変換して配布する #Ruby - Qiita
環境は Windows10 x64 22H2 + Ruby 2.6.10 p210 x86 (+ DevKit)。
あらかじめファイルを展開した状態にしてexe化できるツールはないのかなとググっていたら、neri というツールがあると知った。試しに使ってみることにした。
_neri | RubyGems.org | コミュニティのgemホスティングサービス
_GitHub - nodai2hITC/neri: One-Click Ruby Application Builder
_neri/README.ja.md at main - nodai2hITC/neri - GitHub
_Neri を使って Ruby スクリプトを実行ファイル(.exe)に変換して配布する #Ruby - Qiita
環境は Windows10 x64 22H2 + Ruby 2.6.10 p210 x86 (+ DevKit)。
◎ インストール :
gem install neri
◎ 使い方 :
動作させるには DevKit が必要になるらしい。
基本的には以下のような感じで呼び出せばいいらしい。
hoge.exe と、動作に必要なファイルをまとめてある systemフォルダが出来上がる。
今回は Ruby/Tk を使ったスクリプトをexe化してみたかったので、以下の指定をしてみた。
exe化を試みたスクリプトは以下。
_03_hello_tk.rb
しかし、出来上がったexeを実行してみると、以下のエラーが出る。
「unknown encoding name - utf-8; (ArgumentError)」とな…。
エンコード関係の .so が足りてないのだろうかと思ったけれど、system\lib\ruby\2.6.0\i386-mingw32\enc\ 以下に、大量にソレっぽい .so が入っていた。これだけじゃダメなのかな…。
色々試してたら、元のスクリプトの最初のあたりに以下の行があるかないかでエラーメッセージが違ってくることに気づいた。この行があると、utf-8 云々のエラーが出る…。これってエディタにファイルの文字コードを知らせるためだけの行じゃないの…?
今度は「tkが無い」と言い出した…。そもそも「fiddle と tk は無視する」と言ってるあたりも気になる…。systemフォルダ内には、tk86.dll とか tcltklib.so 等があるように見えるのだけど…。これだけじゃ足りないのかな…。
neri に、--enable-gems --gem tk --gem fiddle をつけてみたり、msys32以下のディレクトリの指定を無くしたり等してみたけれど、問題は解決せず。ハードルが高いツールだなと…。
基本的には以下のような感じで呼び出せばいいらしい。
ridk enable neri hoge.rb事前に ridk enable を実行しておくことに注意。
hoge.exe と、動作に必要なファイルをまとめてある systemフォルダが出来上がる。
今回は Ruby/Tk を使ったスクリプトをexe化してみたかったので、以下の指定をしてみた。
ridk enable neri 03_hello_tk.rb D:\Ruby\Ruby26-x86\msys32\usr\bin\msys-2.0.dll D:\Ruby\Ruby26-x86\msys32\mingw32\lib\tcl8.6 D:\Ruby\Ruby26-x86\msys32\mingw32\lib\tk8.6 --gem tk --enable-gems
> neri 03_hello_tk.rb D:\Ruby\Ruby26-x86\msys32\usr\bin\msys-2.0.dll D:\Ruby\Ruby26-x86\msys32\mingw32\lib\tcl8.6 D:\Ruby\Ruby26-x86\msys32\mingw32\lib\tk8.6 --gem tk --enable-gems === Running script '03_hello_tk.rb' to check dependencies. === Script '03_hello_tk.rb' end. === 576 files, 14769110 bytes dependencies. === Copying dependencies. === Creating datafile './system/03_hello_tk.dat'. === virtual_directory: D:/home/prg/ruby/_work_sample/tk/hello_tk === Creating exe_file '.\03_hello_tk.exe'. === Neri Finished.
exe化を試みたスクリプトは以下。
_03_hello_tk.rb
しかし、出来上がったexeを実行してみると、以下のエラーが出る。
> 03_hello_tk.exe Ignoring fiddle-1.0.9 because its extensions are not built. Try: gem pristine fiddle --version 1.0.9 D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:162:in `force_encoding': unknown encoding name - utf-8; (ArgumentError) from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:162:in `load_code' from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:84:in `load' from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:20:in `load' from -e:2:in `<main>'
「unknown encoding name - utf-8; (ArgumentError)」とな…。
エンコード関係の .so が足りてないのだろうかと思ったけれど、system\lib\ruby\2.6.0\i386-mingw32\enc\ 以下に、大量にソレっぽい .so が入っていた。これだけじゃダメなのかな…。
色々試してたら、元のスクリプトの最初のあたりに以下の行があるかないかでエラーメッセージが違ってくることに気づいた。この行があると、utf-8 云々のエラーが出る…。これってエディタにファイルの文字コードを知らせるためだけの行じゃないの…?
# -*- mode: ruby; coding: utf-8; encoding: utf-8 -*-
> 03_hello_tk.exe Ignoring fiddle-1.0.9 because its extensions are not built. Try: gem pristine fiddle --version 1.0.9 Ignoring tk-0.4.0 because its extensions are not built. Try: gem pristine tk --version 0.4.0 D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:85:in `require': cannot load such file -- tk (LoadError) from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:85:in `require' from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:68:in `require' from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:16:in `require' from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/03_hello_tk.rb:11:in `<main>' from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:88:in `eval' from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:88:in `load' from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:20:in `load' from -e:2:in `<main>'
今度は「tkが無い」と言い出した…。そもそも「fiddle と tk は無視する」と言ってるあたりも気になる…。systemフォルダ内には、tk86.dll とか tcltklib.so 等があるように見えるのだけど…。これだけじゃ足りないのかな…。
neri に、--enable-gems --gem tk --gem fiddle をつけてみたり、msys32以下のディレクトリの指定を無くしたり等してみたけれど、問題は解決せず。ハードルが高いツールだなと…。
◎ 雑感 :
サクッとexe化できるなら Python + tkinter + pyinstaller と比較できるかなと思ったけれど、全然サクッといかない感じなので…。
exe化の容易さ、exe化したモノの起動速度、外部ライブラリが将来的にも維持されそうか等々、そういった点を考えると、Python ではなく Ruby を使うメリットは皆無と言うか、むしろ Ruby を選択するのはデメリットだらけなのではないかと思えてきた…。まあ、あくまで、ローカルで動くGUIアプリを作ろうとするなら、という前提の話だけど。
Ruby から Qt を使えるようにする _qtbindings というライブラリの作者様も、「こんなの使うより Python 使いましょう」と README.md にわざわざ書いていたけど。妥当な発言だよなと…。
exe化の容易さ、exe化したモノの起動速度、外部ライブラリが将来的にも維持されそうか等々、そういった点を考えると、Python ではなく Ruby を使うメリットは皆無と言うか、むしろ Ruby を選択するのはデメリットだらけなのではないかと思えてきた…。まあ、あくまで、ローカルで動くGUIアプリを作ろうとするなら、という前提の話だけど。
Ruby から Qt を使えるようにする _qtbindings というライブラリの作者様も、「こんなの使うより Python 使いましょう」と README.md にわざわざ書いていたけど。妥当な発言だよなと…。
[ ツッコむ ]
#2 [hsp] HSPの配列について勉強中
プログラミング言語 HSP の配列の仕様について確認中。
HSPにおける配列は、最初に何個必要になるか要素数を宣言しておかないといけないのだけど、その最大個数を超えて要素を追加できないものかなと。要は、動的に配列の要素数を変更していきたい。Python なら append() でそういうことができた気がする。Ruby なら push() だっただろうか。
環境は Windows10 x64 22H2 + HSP 3.6。
あちこちの解説記事を見ると、大きいインデックス値を指定すれば自動で配列がそこまで増える、という記述も見かけたのだけど。実際試してみるとエラーになる。
_array_add.hsp
やはり、最初に用意した要素数を超えて、要素を増やすことはできないようだなと…。
となると…。一度、仮で、十分に要素数が多い配列を用意して、そこに値を入れていって、必要な要素数が判明した時点で別の配列を確保して、必要な分だけ値をコピーする…。そんな感じの処理しか思いつかない。もっと上手い方法はないのだろうか。
HSPにおける配列は、最初に何個必要になるか要素数を宣言しておかないといけないのだけど、その最大個数を超えて要素を追加できないものかなと。要は、動的に配列の要素数を変更していきたい。Python なら append() でそういうことができた気がする。Ruby なら push() だっただろうか。
環境は Windows10 x64 22H2 + HSP 3.6。
あちこちの解説記事を見ると、大きいインデックス値を指定すれば自動で配列がそこまで増える、という記述も見かけたのだけど。実際試してみるとエラーになる。
_array_add.hsp
; 一度確保した配列に要素を追加できるか確認 ; 要素の追加は無理っぽい。エラーになる onkey goto *jobend dim a, 5, 4 repeat 5 a(cnt, 0) = cnt a(cnt, 1) = cnt a(cnt, 2) = cnt a(cnt, 3) = cnt loop ; エラーになる ; a(5, 0) = 5 repeat length(a) pos 4, cnt * 24 mes "a(" + cnt + ", 0)=" + a(cnt, 0) loop stop *jobend end
やはり、最初に用意した要素数を超えて、要素を増やすことはできないようだなと…。
となると…。一度、仮で、十分に要素数が多い配列を用意して、そこに値を入れていって、必要な要素数が判明した時点で別の配列を確保して、必要な分だけ値をコピーする…。そんな感じの処理しか思いつかない。もっと上手い方法はないのだろうか。
[ ツッコむ ]
以上、1 日分です。