Julia で GUI アプリに挑戦

蜜蜂天国のまとめに入っているところだが,足踏み状態だ.いろいろなパターンを試してみたいのだが,そのためにはもうちょっと準備が必要だ.Julia ではGUIを持った独立のアプリを作るというのが難しいので,C#への移植を考えている.C#なら何でもできるし,これまで作ってきた資産を活かすこともできる.そのためには少なくとも,BigFloatをサポートする環境を構築しなくてはならない.以前,C#にBigIntegerを導入しようとして挫折した経験があるので,二の足を踏んでしまうところだが,再チャレンジしてみたい.

C#のライブラリとしてGitHubに公開されているものとしては,Osinkoというのがある.これはベースがBigIntegerなので,多分 BigIntegerを先に導入する必要がありそうだ.Osinko の開発者は名前から想像付くように日本人のようだ.これを使ってみることにしよう.ただし,かなり古い.リリースされたのが10年以上前で最新の更新は8年前という感じ.計算結果がマシーンによって異なるというクレームも上がっている… nuget というディストリビューションもある.

いや,その前にもう一つ考えておかなくてはならないことがある.Julia には solve という関数があり,任意の方程式を解ける機能が備わっているが,この代替になるものがC#にあるだろうか?蜜天法で自力で解くという考え方もあり得るが… いまのところ現実性は薄い.むしろ,がんばって Julia で GUI アプリを作ってしまった方が早いかもしれない… ちょっとそのコースを試してみることにしよう.

https://goropikari.hatenablog.com/entry/julia_gui_app

Julia のREPLではサンプルコードを動かすことができたが,VS Code上ではエラーになってしまう.一行目の

win = Window(“Count Click”) # 大枠のWindowをつくる

でエラーが発生している.何かが不足しているのだろう.上記URLの筆者の記事はシリーズものなので,もう少し前まで遡る必要があるかもしれない.ここではGtkを使っているが,クロスプラットフォームGUIを生成するツールキット Qt.jlというのもある.また,WebベースのGUIアプリを作るWebIO.jlというのもある.PCを使っていないユーザもいるので,ブラウザで動くというのは有用かも知れない.
https://www.reddit.com/r/Julia/comments/wdeda0/help_with_gtkjl_in_vscode/?rdt=48792&onetap_auto=true&one_tap=true

VS Codeの中で,Julia のREPLから実行するという提案があり,実行できた.ただし,まだエラーは出ている.⇒エラーは出ないようになったが,クリックがカウントされない.つまり,イベントを拾っていない.このコードの作者はLinux環境でJuliaを動かしているようだ.別の選択肢としては,Jupyterというのがある.これはJuliaだけでなくPythonその他複数の言語をサポートしている.

VS Codeの右上メニューからJulia:Execute active file in REPL でウィンドウを開き,イベントを取るところまではできた.しかし,デバッグはできない.デバッグモードで実行しようとすると,sigatomic_end called in non-sigatomic region エラーが起きてしまう.クロスプラットフォームパッケージのQtをインストールしてみよう.Qtというパッケージは見つからないので,QT_jllというのをインストールしてみた.インストール時にエラーが起きている.VS Code内でJulia→pkgではエラーは起きなかった.⇒しかし,サンプルは動かない.

オリジナルのソースコードは反応するようになった.

image

デバッグはできないが,何とかアプリを構築できる目処は立ったとも言える.EXEに仕立てるには,PackageCompiler.jlというのが必要になる.⇒インストールできたが,ビルドできない.build_executableが未定義になってしまう.PackageCompilerではなく,ApplicationBuilder という名前が出てきた.以下のコマンドで動いた.

Julia> PackageCompiler
Julia> create_app(“密天GUI.jl”, “密天GUI”)

ただし,エラーが出ている.引数がまずいようだ.

using PackageCompiler
create_app("/path/to/Hello",         # this is the directory where Project.toml resides
           "/path/to/HelloCompiled") # target directory where you want your compiled app to be generated

project.tomlというファイルがどこかになくてはならないのだが… Julia にはプロジェクトという概念はなかったような気がするのだが… 実際,メニューにはそれらしきコマンドは見当たらない.⇒プロジェクトはpkgで生成されるようだ.

pkg> generate 密天GUI

現在のフォルダの下に指定した密天GUIというプロジェクトが生成され,同時に蜜天GUI.jlというファイルも作られる.密天GUIの中にはProject.tomlというファイルが作られ,そこにはsrcというフォルダができていて,その中にも蜜天GUI.jlというファイル作られている.いや,最初の蜜天GUI.jlは元々あったものだ.Project.tomlの内容は以下のようなものだ.

name = “密天GUI”
uuid = “d0bef8e6-be7e-4316-93e9-b4cd7ca35f8f”
authors = [“babalabo “]
version = “0.1.0”

src\蜜天GUI.jlの中身は,以下の3行だ.

module 密天GUI
greet() = print(“Hello World!”)
end # module 密天GUI

このファイルを実行すると,

Main.密天GUI

が出力される.しかし,greet()という関数が実行された気配はない.greet()の下に一行追加して

println(“密天GUI ############”)

実行すると,

WARNING: replacing module 密天GUI.
密天GUI ############
Main.密天GUI

が出力される.どうもよく訳が分からない… フォルダを変えて,新しいプロジェクトフォルダを見るようにしたら,上の警告が消えて,まともな動作になった.

密天GUI ############
Main.密天GUI

(@v1.10) pkg> activate .
   Activating project at `D:\蜜蜂天国GUI\密天GUI\密天GUI`

ビルドするときにはJuliaを以下の構文で起動する必要がある.

❯ julia -q –project ⇒エラーになる.

その後で,以下を実行する.

julia> create_app(“MyApp”, “MyAppCompiled”) [ Info: PackageCompiler: creating base system image (incremental=false), this might take a while… [ Info: PackageCompiler: creating system image object file, this might take a while…

ほとんど空に近いアプリだが,ビルドはかなりの時間が掛かる.⇒しかし,最終的にはエラーで終わってしまった.

ERROR: failed process: Process(setenv(`’C:\Users\babalabo\.julia\juliaup\julia-1.10.2+0.x64.w64.mingw32\bin\julia.exe’ ....

今回は39個しかDLLが生成されていない.(その前は54個?できていた)julia.exeを実行してもぱっとウィンドウが一瞬開いて閉じてしまう.ただし,今回はbinの他に,shareというフォルダができている.この中にはファイルが3個できているが,そのうちの一つはProject.tomlだ.⇒どうも,GtkはWindows向きにはできていないようだ.REPLでは動作しているようなのだが…

https://docs.gtk.org/gtk3/building.html

GtkをWindowsで使うためには,gvebuildが必要なようだ.これはPythonスクリプトで,VSを使ってGTKライブラリを構築する.

いつの間にか来訪者が20万の大台超え

蜜蜂天国のまとめに入っているところだが,find_zeroが動作していない.どうもtryブロック内の変数がローカルになっているようだ.global 宣言することで動作するようになった.

いつの間にか来訪者が20万の大台を超えていた.何かいいことあるだろうか?タバコが切れてからそろそろ一週間…

image

また軌跡の描線が出なくなっている

なぜだろう?また軌跡の描線が出なくなっている.アニメには出力されている.このサンプルでは例外は発生していない.昨日は完全に動作確認したつもりだったのだが…

image

ポイントは描画できているのに線分が描けないというのはどういうことだろう?2024-03-28-1 では出ている.最新版でまったく同じ設定にしてみたが,やはり動作していない.どうもよく分からないので,ここまで戻ることにする.

image

いや,それより後の28-2でも動作している.ここまで戻れば十分だ.

image

この後,どんな修正が入っているかが問題だ.この版にはすでにRootsは組み込まれていて,Find_zeroで不動点を検出している.実際画面にも描画されている.ここまでできれば立派なものだと思うのだが,何を追加しようとしたのだろう?まず,動線を描画できていないサンプル y=x^2-1.5 初期値α=1.8229を試してみよう.確かに画面には何も出てきていない.

image

ただし,これは計算や動作が誤っているためではない.開始点=(1+√7)/2 から出発した場合,値の変化が遅くて不動点の◯の外に出られないためだ.これを区間[1.8, 2.0] point:30で描画すると,以下が出力される.

image

ただし,ステップを増やして,point=34を超えると動線は消えてしまう.

1: 1.82287565553229535809
2: 1.82287565553229552433
3: 1.82287565553229613042

27: 1.84833257470943420165
28: 1.91633330673200616455
29: 2.17233334249042522319
30: 3.21903215089562309242
31: 8.86216798849970155839
32: 77.03802145638884645281
33: 5933.35674991502828268578
34: 35204720.82176222747503632359
35: 1239372368138217.42496308002819849062

36: 1536043866904533138569813670805.66483330243742956258
37: 2359430761055031115005960802378927230275224692180453704350907.12176434601263055879
38: 5566913516212723332117413654604965054786240836971452633864047785437413116991185624735519798218699259766451175951693774848.00000000000000000000
39: 30990526096991907041511225161593806680067925799018141776028714401452471138227479974234438992180424796522079841327601952168724719696008595440015069056256081311447418248647170548763107745965205691210096638929522670926745027633952745003478417408.00000000000000000000

のように変化するとき,39点目で例外が発生しているが,それよりも手前の35点目で描画上の問題が発生するものと考えられる.例外が発生した場合には,例外の発生点から先を切り捨てて自動再計算するようになっているが,動線を描画するためには,maxloopを68以下に設定する必要がある.下図では区間を[1.8-100.0]まで拡大して32点までを描画している.

image

いずれにしても,軌跡の動点数を調整しないと動線を描くことはできないということが分かった.ここで一度バックアップを取ってから,もう少し整理することにしよう.⇒配列XaとYaは廃止できるはずだ.⇒廃止した.⇒lastpos はループの中では更新せず,最後のsweetposから取り出すというのでよいのではないか?(正確に言うと,この点は描画されていない可能性はあるが…)この図は区間[1.8, 4.0]だが,稲妻型の発散としてはこのくらいが分かり易いのではないか?

image

とりあえず,一旦バックアップを取っておこう.ある程度整理が付いた.稲妻型の収束例として以下をピックアップしておこう.

image

スパイラル型の収束例が欲しい.これがスパイラルではないか?

image

そんな感じだ.通常のメルストロム型とはかなり違う.初期値0.5でもほとんど図柄は変わらない.しかし,x^2-1.5の標準図とは大きな違いだ.下図↓

image

ようやく片付いた

プログラムを少し改造する必要がある.

  1. precision を定数で与える ◯
  2. initialpointを冒頭で定義する ◯
  3. setprecision ブロック内の処理はすべて平場で実施する △
  4. 特性関数を y = (x-a)^2+b の形式に変更する X
  5. 特性方程式 x=(x-a)^2+b の解をあらかじめ取り出しておく ◯
  6. その他のパラメータも変数表示してあらかじめ計算しておく △

これは何だ?まだ午後9時というのに…

image

これはこれまでのレコードではないだろうか?ただし,それほど伸びなかったようだ.2000は超えなかった模様.

初期値を2から100に変更しただけでエラーが起きてしまった.10ならば動作する.-10にしたら,今度はDrawLinesで停止するようになった.⇒これはわたしのミスだ.根号の中の変数に負値を与えていた.√(5+x)なので,-5より小さい値は渡せない.しかし,√(20+x)としても,エラーは解消しない.今度は setprecision のエラーだ.

NaN result for non-NaN input

どうも,シグネーチャの異なる呼び出しを実行しようとしているようだ.⇒setprecisionを引数一つの一番シンプルなタイプに書き換えて動作するようになった.しかし,初期値100ではまだエラーになる.今度は UndefVarError: `Rounding` not defined に変わった.

初期値20なら動作する.初期値によって動作が変わるというところが気に食わないところだ.どうも,この setprecision という関数は本当に始末に悪い関数だ.今度は

BoundsError: attempt to access 920-element Vector{UInt8} at index [923]

どうなっているのか?訳が分からない.⇒わかった.おそらくこれは浮動小数点数の指数部のレンジローバーだ.ここでレンジオーバーするということはこの数値はすでに超巨大数になっていることを意味する.つまり,BigFloatでも扱えないほどの数ということになる.precisionは仮数部のビット数なので,これがどれほど大きくても無関係だ.⇒ざっと見た限りではこのレンジを変更する手段はないように思われる.ここでは,エラーで脱出するしかないだろう.

https://discourse.julialang.org/t/cumbersome-scoping-rules-for-try-catch-finally/4582

ようやく片付いた.以下のように手当して切り抜けた.

  1. 任意精度浮動小数点数では仮数部のビット数は指定できるが,指数部を設定できないので,巨大整数では例外が発生する.これを処理するために try・catch ブロックを設けたが,catch ブロックでは外部変数を参照できないなど,いろいろと制約がある.
  2. このため,try・catch ブロック を最上層に仕掛けて,catch ブロックの中ではフラグを立てるだけで抜けるようにした.後処理を catch ブロックの中で実行しようとすると,動作がおかしくなる.
  3. 後処理は最上層に戻ってから実行するようにした.後処理では,例外が発生してご破算になった計算を安全に計算できる範囲で再計算する.このために,maxloop を書き直して,CalcTrajectory を再実行している.

一応これで片付いたが,まだ軌跡は描画できていない.アニメには収録されているのだが… 多分これはどこかで調整できるだろう.⇒とりあえず出るようになったので,よしとしておこう.大部扱い易くなった.

image

あとは,最低限,不動点を描画するだけだが,これを自動計算することはできないだろうか?ともかく,一度バックアップしておこう.⇒Julia にはいくつかsolverパッケージがある.Roots.jl,NLsolve.jl… NLsolve には x=F(x)を解く機能まで備わっているようだ.NLというのはnon-linearという意味だ.Roots では探索範囲を指定しなくてはならないところがやや難だ.しかし,蜜天法よりはましかもしれない.蜜天法では見つかったとしても一つだけだ.NLsolveは二変数以上の方程式が解ける.今のところはそこまで必要ないので,Rootsでゆくことにする.⇒フォルダ名を蜜蜂天国に変えた.

どうも,find_zeroの引数xはFloat64までしか使えないようだ.

どうも,かなり難しい話になってきた

蜜蜂天国の空域の地割りをやろうとしているのだが,手強い.y=x^2-3/2の代わりにy=x^2を適用すると,初期値s<1の場合には単純に収束してしまう.つまり,この代数系の動作を決定しているのは曲線の形状だけではないということになる.

◎オフセット:-1.5 初期値:α=-0.5 α点を含む白地を残して塗り潰し

image

◎オフセット:-1.0 初期値:α=-0.5 無限ループ

image

◎オフセット:-1.5 初期値:α=-0.7071 卍字型循環経路

image

ミツバチ天国:ハニーポットを探せ

どうも,何か異変が起きている気配がある.初期値-1.5で10000ステップを実行しているところだが,停止しない.いや,これがノーマルなのではないか?これまでは1000と2000でテストしていたが,10000というのはやっていないと思う(以前に試したことはある).これではちょっと掛かり過ぎるので打ち切ることにしよう.グリーン・ゾーンの塗り潰しを見たいのだが,2000くらいでも十分なのではないか?制御が移ってしまっているのだろうか?SHIFT+F5で停止しない.CTRL+Dでターミナルを止めて停止した.

話が大部変わってきたので,タイトルも「無限プール・ゲーム」から「ミツバチ天国」に変えた.これまでは,スィートスポットはボールをすべて吸引するポケットと考えられてきたが,どうもそうではないらし.つまり,スィートスポットは孤立した到達不能点である可能性が高くなってきた.ミツバチ達はこの到達不能なスィートスポットを探して広い緑地空間を飛翔し続けるというストーリィだ.白丸が開始点で赤丸はスイート・スポットないしビタースポットだ.上の図では開始点がスイートスポットに重なっているため,赤丸は1個しか出ていない.

image

IPAMinchoをJapanese Fonts というところからダウンロードして,インストールした.ZIPファイルを解凍してTTFファイルを右クリックすると「インストール」というメニューが出てくるので実行するだけだ.しかし,エラーは消えない.”IPAMincho”を”IPA明朝”に変えても同じ.

ENV[“GKS_ENCODING”] = “utf-8”
gr(fontfamily=”IPA明朝”)

画面は日本語表示されているので,警告を止めるだけでもよいのだが… Plotly というバックエンドを使うと何もしなくても日本語が出るようだが… Plotly はもっぱらJavascriptで使われているようだ.我々はGRを使っているので,この上で動くものでなくてはならない.いや,Plotly はGRの上で動くのではなく,GRを置き換えるものだ.また,Plotlyではplotなどのコマンドはそのまま使えるようだ.Plotlyjsという名前にはなっているが,JavaScriptを使わなくてはならないということではないのではないか?これはPlotlyを使う一択なのではないだろうか?

とりあえず,JuliaのREPLで試してみることにする.しかし,どうにもネットワークが遅い.Plotlyで画面を出すには,electron と Blink.jl が必要なようだ.どちらもまだ入っていない.パッケージのダウンロード中にエラーが起きている.Kaleido で失敗している.やはり,ギガを買わないと無理なのではないか?この代金はポイントで支払えるので,多分決済できるだろう.⇒俄然早くなった.

PlotlyJSとは別にPlotlyというパッケージもある.ポイントがもったいないので,これもインストールしておこう.Electron と Blink も追加インストールした.しかし,まだ動かない.Blink.AtomShell.Install() を実行するように指示されたが,エラーになってしまう.Install を小文字かして install としたら動作した.しかし,まだまだエラーが取れない.

7z.exe というのがない.GITに繋がっていないためだろうか?存在するのに動作がブロックされているという可能性もある.PlotlyBase,PlotlyKaleidoをPkgで導入したが,インストールされていないというエラーになる.⇒インストールしたIPA明朝のファイル名を確認したら(C:\Wndowd\font),IPAMincho Regular となっていたので,このスペルで設定したら日本語表示できるようになった.Plots が使えるようになったので,Plotly などを持ち出す必要はなくなった.

開口部には外部から侵入できないようだ

無限ビリヤードだけで6436本もファイルが入っている.久留島喜内で100本だ..vscodeが入っている.インテリセンス用のデータベースだ.いや,ここにはsetting.jsnというファイルが1本入っているだけだ..condaに6千本以上詰まっている.これを追い出す必要がある.どうなるのか分からないが,とりあえず,.vscodeと.condaをCドライブに移動した.また,厄介なことにならなければよいが… ⇒VS Codeを再起動してみたが,とりあえず,問題なく立ち上がってきた.⇒ランさせてみたが,特に問題は起きていない.

公開サンプルでは,開始点から直下に下がったところで関数曲線にぶつかり,そこから左に向かったあと,曲線の反対側から螺旋運動が始まるような動作になっている.この螺旋運動の領域をハニーポットと呼んでいるが,最初に関数曲線に出会う点は図版ではハニーポットに含めていない.しかし,この点(X点としよう)は関数曲線上の点なのだから,軌跡の動く領域に含まれないというのもおかしい.100回ループを1000回に変えてみた.この図を見る限りでは,確かにX点はハニーポットの外側にある.これはなぜか?

image

10000回周回させると半日掛かってしまうので,2000回で取り直ししてみよう.2000回走らせると下図のようになる.

image

やはり,X点はハニーポットには入っていない.今度は,開始点を(0, 0)にしてみた.出力は開始点(1.5, 1.5)の場合とほとんど変わらない.

image

開始点を(-1, –1)に変えてみよう.この点はスィートスポットより左に位置する点だ.塗り潰しの濃淡はあるが,構図はほとんど変わらない.

image

開始点を(2, 2) とすると発散してしまうが,これは開始点がビターポイントの右にあるためと考えられる.開始点が(-2, –2)でどうなるか見てみよう.⇒発散してしまう.発散してしまうのはよいが,垂線1本とそれから水平に曲がる直線しか表示されない.多少は中間点が表示されてもよいと思うのだが…X, Yのレンジを巨大数まで拡げてみようとしたが,どうも難しい.このくらいが限界だ.

image

これ以上拡げると曲線がほとんど垂直線になって軌跡が見えなくなってしまう.ビタースポットの近傍からスタートした場合,内側ならハニーポットに入り,外側なら発散するという予想通りの結果になった.下図は,β-0.00000001からスタートした場合(2000ステップ)

image

スィートスポットはハニーポットの内部にあるが,この点からスタートした場合にはどういうことになるか?結果が出た.

image

この結果はビターポイントの左側の点はすべてスィートポイントに収束することを意味する.いや,ちょっと違うかもしれない.これは開口部の内側からスタートしたもので,開口部の外側からスタートした軌跡がこのスタート地点に到達することを意味するものではない.開口部の内部に少し階段線が出ているが,これは螺旋経路に入るまでのステップであり,おそらく,その後は通常の渦巻きになっているのだろう.逆に言うと,外側から開口部の内部に到達する経路は存在しないということになる!これはかなり予想外の結果だ.

開始点の座標は(α, α)になっているが,これはもちろん厳密値ではないから,真のα点からはスタートすることもできないはずだ.

x=-0.8228756555322951918404514665129771760095302098202120214329299482947099875218555

y=-0.8228756555322951918404514665129771760095302098202120214329299482947099875218555

Y=-0.8228756555322951918404514665129771760095302098202120214329299482947099875218555

どうも計算のどこかで桁落ちが起きているようだ.最初のステップでは確かにX=Y=αの状態になっているのに,どこかでそれが崩れている.次のステップで値が変化している.

x=0.8228756555322954654385375167383836510883458373747302040693228205013915750026478

データの受け渡しは sweetspot という変数を使って行っている.step!が3回目に呼ばれたときには値が変わっている.

-0.822875655532295358085548286908306181430816650390625
-0.822875655532295358085548286908306181430816650390625
-0.8228756555322951918404514665129771760095302098202120214329299482947099875218555

値が変わっているだけではなく,桁数も伸びている.CharacteristicFuncではx^2-3/2 の計算値を返している.⇒BigFloatを明示的に返すようにしたが,変化なし.CharacteristicFuncの値を見てみよう.

-0.8228756555322951918404514665129771760095302098202120214329299482947099875218555

α=-0.822875655532295358085548286908306181430816650390625 であるとすると,α’=CharacteristicFunc(α) で α≠α’ になっている.これは避けられないのではないだろうか?

Julia で x = x^2-3/2 という方程式を解けるだろうか?できそうだ.この値を使ってやればよいのではないだろうか?

printf のパッケージを導入する必要がある.Julia と VS Code のどちらに入れたらよいのだろう?VS Code で入れると現在のプロジェクトフォルダに入ってしまような気がするのだが… Julia の場合はUsers\babalabo\.julia に入る.

Base.@kwdef mutable struct BallPositionには,xとyという変数があるはずだが,アクセスできない.type SimpleVector has no field x 

BallPosition というのは,Base.@kwdefのインスタンスではなくて,型のようだ.変数を宣言することで動作するようになったが,日本語が出せない.フォント不在エラーになる.

ENV[“GKS_ENCODING”] = “utf8”
using Plots
gr(fontfamily=”IPAMincho”)

なんとか,画面に出せるようになった

なんとか,画面に出せるようになった.本当は実時間で描画したいのだが,適当なルーチンが見つからないので,最後にまとめて出力するような動作になっている.

image

アニメへの保存と画面出力は個別にはできるようになったが,両方やろうとすると,アニメに静止画像のデータが入ってしまう.おそらく,一つしかない画面なのでそのまま残ってしまうのだろう.画面クリアできればよいのだが…あるいは,先にアニメを保存してしまってから,画面を表示するというのも考えられる.その方式を試してみよう.⇒うまくいったような気がする.とりあえず,バックアップを取っておこう.

一つ不審な点がある.静止画面では出ているのだが,アニメでは開始点から下がって折れ曲がる線分が表示されていない.なぜだろう?⇒BallPositionは mutable になっているので,書き込まれてしまっているのだろう.開始点の座標を別に持つ必要がある.というか,2つのループを合体させてしまった方が早いのではないか?⇒できた.これでよいことにしよう.念のため,もう一度バックアップを取っておこう.

無限プールアニメが動き始めた

そろそろ作業に入れるのではないだろうか?目標はとりあえず,f(x)=x^2-3/2 のときの無限数列 x_n = f(x_{n-1}) をトレースするグラフを描画することだ.ローレンツ・アトラクタのグラフはこの仕様にかなり近いので,少しアレンジすればできると思う.本当は実時間で軌跡をトレースするようなものが作りたいのだが,とりあえず,GIF で出力するという方法から入ることにする.まず,このファイル(Lorentz attractor.jl)を解析してみよう.

Base.@kwdef mutable struct PoolGame

mutable というのは,可変という意味で,書き込み可能ということだが,Base.@kwdef というのは何だろう?Base は Julia の基本モジュールと考えてよいと思われるが,kwdef というのが分からない.

What does @kwdef do?
https://discourse.julialang.org/t/what-does-kwdef-do/51973

help?> Base.@kwdefで情報が取れる.

This is a helper macro that automatically defines a keyword-based constructor for the type declared in the expression typedef, which must be a struct or mutable struct expression. The default argument is supplied by declaring fields of the form field::T = default or field = default. If no default is provided then the keyword argument becomes a required keyword argument in the resulting type constructor.

これはある種の連想配列ないし辞書のようなもののように思われる.以のような使い方が想定されている.

julia> @kwdef struct Foo
              a::Int = 1         # specified default
              b::String          # required keyword
          end
   Foo

しかし,実際の使い方を見るとキーワードは指定されていない.

Base.@kwdef mutable struct PoolGame

    dt::Float64 = 0.02
    σ::Float64 = 10
    ρ::Float64 = 28
    β::Float64 = 8/3
    x::Float64 = 1
    y::Float64 = 1
    z::Float64 = 1

end

a, b という変数はデフォルトで使えるようになっているのだろうか?上の構造体では,7個の変数が定義されている.x, y, z は3D空間の座標と見られる.σ,ρ,βはなんだろう?Step! では,引数のPoolGameから座標値を取り出し,σ,ρ,βを使ってそれらを加工した後,x, y, z に戻している.つまり,この3つはあらかじめ初期化されたパラメータと見てよさそうだ.dtも同様のパラメータだ.

これは3Dなので2Dに変えようとしているのだが,うまくゆかない.plot3d という関数が3Dの作りになっているのだろう.⇒plot3dをplotに書き換えたら動作するようになった.あとは,座標を決めてやればとりあえず描画できるはずだ.⇒開始点が(X, Y)だとすると,次の点はもし,(X, Y)が関数y上の点であれば,(Y, Y) となるはずだ.もし,(X, Y)がy上の点でなければ,次の点は(X, f(x))となる,というのでよいだろうか?⇒一応動き始めた.

Infinte Pool Game

もう少しマニュアルを読み進めよう

Julia の入口で多くの人が躓く原因の一つが display であることは間違いなさそうだ.Julia は REPL (read-eval-print-loop) として開発されてきたので,GUI というのは元々想定されていなかったため,あちこつぎはぎだらけのバラック建築になってしまっている.いろいろな美辞麗句でその欠陥を覆い隠そうとしているが,隠しようもないというのが実態だ.従って,できる限り安定に動作する地点を探るしかない.ともかく,もう少しマニュアルを読み進めよう.

Visual Studio Code Tips and Tricks
https://code.visualstudio.com/docs/getstarted/tips-and-tricks#vscode

このマニュアルは Getting Started や User Guide の前に読むべきものと位置付けられている.Help→Welcome→Walkthroughsは自己案内ツアーになっているが,進捗管理されていて,すでに完了したことになっている?どうもよく分からない.画面と解説が一致しない.テーマはライト・ハイコントラストに決めた.VS Code のテーマは暗いものが多い.設定は階層化されているが,上位レイヤーの設定を継承するという選択肢がないというのは不便だ.

ことのついでにPythonをインストールしておこう.ついでにJavaも.JDK(Javaのランタイム)もインストールした.WalkthroughsでPythonコードファイルの作成という課題が出されたので,Fukuzo氏のコードをコピペして走らせたら,エラーになった.⇒今度は通った.Visual Studio Code Tips and Tricks は一通り読んだが,まだよく飲み込めていないところがある.まぁ,やってるうちに少しづつ慣れてくるだろう.Debugging in Visual Studio Code を読んでみよう.

これはPythonベースの解説のようだ.別にフォルダを作っておこう.Node.js は msi 形式で提供されている.上でインストールしたJDK(Jave ランタイム)と同じだ.いや,そもそも Node.js はJava スクリプトだ.⇒一通りすべての Introductory Videos を見た.

次は,Setting up Visual Studio Code だ.Gitもインストールすることにした.⇒Git を使うのか使わないのか?で揺れている.ネット上にバックアップがあるというのはいざというときの備えになるが,Git とのインタフェースは追加作業になる.それだけのコストメリットがあるかどうか?漏洩ということも考えておかなくてはならない.