mieki256's diary



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)。

インストール :

gem install neri

使い方 :

動作させるには DevKit が必要になるらしい。

基本的には以下のような感じで呼び出せばいいらしい。
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 にわざわざ書いていたけど。妥当な発言だよなと…。

#2 [hsp] HSPの配列について勉強中

プログラミング言語 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 日分です。

過去ログ表示

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