なぜだろう?実行しようとすると,precompiling Gtkというのが入るようになってしまった.ステータスバーでは Julia: Evaluateing…という状態が続いている.⇒Execute active file in REPLモードでは問題なく動作するようになったが,create_appでアプリが生成されていない.⇒REPLで動作するようにjulia_main()を追加したためだ.これを外すと今度はパネルのボタンイベントが無視されるようになる.アプリの場合にはやはりコードをすべて julia_main の中に置くしかないのではないか?どうもそういうことのようだ.バックアップに戻って確認してみよう.2024-04-10版を走らせるとパネルが2つも出た.いや,遅れてでてきたのを見落としていただけだ.
書き始めてから大部日時が経ってしまったが,続けよう.ようやく動いたが,エラーが出ている.
★★★★★ julia_main ENTER ★★★★★
(mitten.exe:10740): GLib-GObject-CRITICAL **: 14:44:46.180: g_boxed_type_register_static: assertion ‘g_type_from_name (name) == 0’ failed
(mitten.exe:10740): GLib-CRITICAL **: 14:44:46.180: g_once_init_leave: assertion ‘result != 0’ failed
(mitten.exe:10740): GLib-GObject-CRITICAL **: 14:44:46.180: g_boxed_type_register_static: assertion ‘g_type_from_name (name) == 0’ failed
(mitten.exe:10740): GLib-CRITICAL **: 14:44:46.180: g_once_init_leave: assertion ‘result != 0’ failed
(mitten.exe:10740): GLib-GObject-CRITICAL **: 14:44:46.180: g_boxed_type_register_static: assertion ‘g_type_from_name (name) == 0’ failed
(mitten.exe:10740): GLib-CRITICAL **: 14:44:46.180: g_once_init_leave: assertion ‘result != 0’ failed
★★★★★ julia_main INIT ★★★★★
クリックでフリーズし,以下が出る.
ともかく一度バックアップしておこう.
⠸ [00m:16s] PackageCompiler: compiling incremental system image★★★★★ julia_main ENTER ★★★★★
⣄ [00m:17s] PackageCompiler: compiling incremental system imagecould not load library “C:\Users\babalabo\.julia\artifacts\da6c2aa0d20a483437256f245d3c35b25e667c62\bin\libgtk-3-0.dll”
The specified module could not be found.
▲久留島喜内の道具箱でエラーが出た.α=2, ε=1000, γ=19
どこかでゼロ割が発生している.εを100まで落としても同じ.自動計算ではエラーにならない.更新ボタンを押したときエラーが起きるようだ.⇒これは後日見ることにしよう.
またEXEが作れなくなってしまったい.どこをいじるとどうなるという脈絡がよくわからない.REPLでもエラーが出ている.
仕掛版ではREPLでカウントアップによるアプリ終了が機能していない.というか,その処理が入っていないので停止しない.ウィンドウを閉じれば完了するが,signal_connect(win, :destroy)のところでエラーが出る.ここではnotify(c)というのを投げているがうまく通っていないようだ.グローバル変数で状態を渡したいところだが,gtk_mainで回っているだけなので,対応できない.以前,Gtk.gtk_mainの引数のところでループを回していたことがあるが,復活させてみよう.
nclickで離脱できるようになったが,エラーが出ている.MethodError: no method matching gtk_main(::Nothing) そもそもこの構文自体よく理解できないのだが…
Gtk.gtk_main(
while nclick < 21
println(“gtk_main:”, nclick)
sleep(1)
end
)
この構文もよくわからない.
@async Gtk.gtk_main()
wait(c)
C言語風に書けば,gtk_main(void)なので,エラーになるのは当然だろう.メソッドのオーバーロードというのはJuliaでは聞いたことがない… ⇒ notify(c)を2個所で呼び出していたのが,競合していたようだ.signal_connect(win, :destroy)を止めて動作するようになった.Julia の主画面とパネルが出るようになったが,動作していない.クリックイベントが受け付けられていない.やはり,以前と同じ mitten.exeは応答していませんになってしまう.とりあえずバックアップしておこう.
EXEを実行すると,主画面が表示され,ループが回りだしてプリント文を出すところまでは動いたが,クリックするとループが停止してしまう.これは生のループでもgtk_mainでも同じだ.つまり,クリックイベントを処理する段階でどこか野壺にはまってしまっているように思われるが,その場所を特定することができない.本体ループではないことは確かだし,REPLでは動作しているので,パネル上のパーツの動作でもなく,おそらく,イベント処理後の戻り道を見失ってしまっているのではないかという気がする.
元々Juliaではこのような構成は予定外なので「できない」と言ってしまえばそれまでなのだが… GTKやそれ以外にもJuliaにGUIを付け加えるためのモジュールは多数ある.また,パッケージを生成してスタンドアローンアプリを走らせるためのモジュールというのもあるにはあるのだが,それらを同時に実現した事例というのは見当たらない.あきらめるのが一番早いのかもしれないが,それではこれまでに費やした時間がすべてただの浪費になってしまう.
実際問題としてはJuliaのパッケージは一般に配布するには大き過ぎるので,これを定版とするというつもりは元々ないのだが… 次善策として,バッチファイルでジュリアのモジュールを走らせるということは可能だろうか?これができれば実質的にスタンドアローンアプリを走らせると同等のことができるようになり,かつ配布パッケージも極小のもので済むという利点がある.この構成なら現状でもなんとか動かせるのではないかと思う.これが現時点における現実策ではないだろうか?しかし,
julia mitten.jl
を実行しても何も起こらない.以下のURLでは
https://qiita.com/Authns/items/9b13655159f90715b2fd
「> julia 〇〇.jl してはいけないよ」とあり,理由としてコンパイル時間が掛かることを挙げているが,動いている気配がない.この記事ではむしろjuliaを開いてそのREPLから実行することを勧めている.しかし,REPLからmitten.jlを実行することもできない.(以前はこの方法で走ったような気がするのだが…)どうもモジュール自体をあらかじめpkgしておく必要があるという感じだ.ただし,エラーになった.
(@v1.10) pkg> add mitten
Updating registry at `C:\Users\babalabo\.julia\registries\General.toml`
ERROR: The following package names could not be resolved:
* mitten (not found in project, manifest or registry)
Suggestions: MieScattering MoistThermodynamics LimitOfDetection MicrostructureNoise mosquitto_client_jll
この方向なら行けるだろうと思っていたのだが,逆にますます嵌りそうだ.往くも地獄戻るも地獄の世界になってきた.
run(command, args…; wait::Bool = true)
というコマンドがある.これはどうだろう?juliaのREPLを開いておいて,そこにソースを流し込む方法で実行することはできる.これはVS Code内でもできる.モジュールをincludeしたりusingしたりするためにはその名前のパッケージが存在しなくてはならないようだ.このためにはgitに登録する必要があるのではないか?以前にできたというのはgitに登録したことがあったからではないだろうか?この辺りを習得するにはまた,かなりの習熟曲線が必要になりそうだ.
パッケージと呼んでいるものは,数百MBもあるフォルダのことを言っているのだろうか?ますますわからなくなってきた.ここまで粘って解けないというのも悔しいが,ここでは一旦打ち切って,juliaのREPL上で動かすことを考えてみよう.できれば,それをバッチファイルのようなものでアイコンから起動できるようなればベストなのだが… ⇒ともかく,includeで実行できることが分かった.たとえば,
julia> include(“./mitten/src/mitten.jl”)
ただし,その前にディレクトリをcd(パス名)で切り替えておく必要がある.コンソール出力はすべてJuliaのREPLに出力される.これで行くしかない.バッチコマンドから起動については後で考えることにする.