作図にミスがあった

GeoGebraのIF文がどうやっても通らない.こんなつまらないところで躓くとは… 何かシンプルなサンプルはないだろうか?

q1とp1の交点T2(C_1)は辺CA上に乗っていない.わずかながらずれている.作図ミスと思われる.q1とp1はいずれも円だ.q1(l2, V), p1(T1, V).Vは円周上の点でV(c1, j)だが,これが間違っているのではないか?jは(L, C)という直線でLは直線i上の点だ.i(A, B)でこれは間違いようがない.どうもLは点Aを選択したつもりで新たな点として追加されたものと思われる.⇒これで正しく動作するようになった.Point(…)を総点検する必要がある.Lは削除しておこう.

GeoGebraで軌跡の方程式を求める

周長2等分線図の包絡線図を出せるようになった.できれば,この表示を切り替えるできるようにしたいのだが… オブジェクトの表示・非表示を切り替えるボタンを設置できるようになっている.チェックボックスにはオブジェクト・リストを選択できるようになっているので同時に切り替えが可能だ.ただし,オブジェクトの属性をここで切り替えることはできないので,直線を2種類作らなくてはならない.⇒それはそれでよいのではないか?しかし,このスイッチは表示・非表示を切り替えるだけなので,AとA’を切り替えることはできない…

リストを作るときにはオブジェクトを矩形で囲んで選択する.これは編集できるので,なんとかなりそうだ.ボタンを設置してスクリプトを書くという手も考えられる.オブジェクトの表示・非表示と属性(色と線の太さ)を変えたいのだが… 切断線は3本のはずなので,個別に書き換えてもそれほどの手間にはならないのではないか?

GeoGebraには軌跡の方程式を求める機能が備わっている!「数式処理 (CAS) エンジンでグレブナー基底を用いた計算を行い,軌跡の方程式を求めている」という.なんてこった!⇒ただし,求められるのは点の軌跡だけのようだ.つまり,直線の方程式を求めることはできない.まぁ,点の軌跡を得られればそれから割り出すことは可能だろう.

駆動点はなんらかの動線上の点でなくてはならない.P点をある円周上の点に設定し直すことはできるのではないか?その上で,小三角形上の点の軌跡の方程式を求めれば,その点とPを結ぶ直線の式は導き出せるはずだ.ただし,GeoGebraでは文字式は使えないので,方程式の係数はすべて数値になっているはずだ.それでも,方程式の形式がわかるだけでも有用性はあるだろう.⇒どうだろう?役に立つ場合もあるかもしれないが,あまり役には立たない気もする.

得られるのは軌跡の(駆動点とは独立の)方程式であり,駆動点との関係は捨象されてしまっている.このような式が与えられたとしても,それをどう利用すればよいのか?にわかには思いつかない.以下の記事ではGeoGebraを高校数学の授業に活用することを念頭に動作確認しているが,この機能にはまだまだかなりの限界があることが示されている.

https://www.kurims.kyoto-u.ac.jp/~kyodo/kokyuroku/contents/pdf/1951-15.pdf

三角形の周長2等分線図(包絡線)を投稿

久留島喜内の道具箱は結構作り込んであるつもりなのだが,まだまだだ.このツールは本来べき乗剰余の周期列を見るためのものだが,対象数の逆数をB進数表記で見ることもできるようになっている.べき乗と逆数には強い関連があるためだ.しかし,ときには対象数の逆というより,除数を分母としてみたい場合もある.そのような見地からすれば,現在の動作はγ=1の場合を見ているに過ぎない.

また,現状ではB進数表記にもかなり制約があるように思われる.対象数が大きくなると簡単に表示不能になってしまう.もっと桁数の大きい数値を扱えるようにする必要がある.1/αの表示形式にもやや問題がある.間仕切りの|は却って邪魔になっているような気がする※.仕様も使い方も忘れてしまったところがあり,stripeなどの意味もわからない.せめてヒントくらい出るようになっていないと… いや,ほとんど忘れてしまっていると言っても言い過ぎではない.マトリックスが2種出るようになっているが,なぜ2つも出しているのかも忘れてしまった.

※本家AMSツイッタの常連投稿者の pink @fourtyonerocks が4/13 = 0.(307692)という書き方をしている.これは読み易いような気がする.

前日のログで,「動作のおかしいところがある」としているが,やはりおかしいと思う.これらの点は⊿XYZの辺の延長と⊿ABCの辺の延長の交点だが,飛び出す点と飛び出さない点がある.飛び出さない点は上図にコーナーを回って隣の辺に移動している.この動作の方が正しいと思う.いや,それでは定義に反するものになるのではないか?たとえば,C1とC2はC点から等距離でなくてはならないはずだ.むしろそうなっていないA2の方が間違っている.A2はIntersect(L1, t1)となっているが,t1というのは⊿ABCそのものだ.

L1は線分ではなく,jとbの交点だ.いや,L1という点とL1という直線があるのではないか?L1というのはC点の別名のようだ.しかし,この修正はかなり難しい.1点を修正するとその副作用で複数の点が未定義になってしまう.A1, A2というラベルの付いている点は表示用で,オリジナルの点は直線上の点になっている.A1, A2のラベルの付いている点を非表示にして,オリジナルの点を表示するようにした.多分これで動くはずだ.⇒すべてのオブジェクトを表示設定して修正した.

三角形の周長2等分線図(包絡線)を GeoGebra に投稿した
https://www.geogebra.org/m/xa7nsrpg

周長2等分線図(全域版)をXに投稿

動作のおかしいところがある.

image

Aの左にグリーンの◯が飛び出している.いや,これはノーマルなのかもしれない.辺ACは短いので周長/4の点が延長に出てしまうのだろう.まぁ,これは現在の仕様では仕方ないのかも知れない.2個の点を線分で結んでおけばよいのではないか?

周長2等分線図(全域版)をXに投稿した.これを見たのかどうかは分からないが,おしろい(Face Powder)とOmolesho Quadry Abiodunがフォローしてくれた.これでフォロワーが4人になった.

https://twitter.com/Cabbage1946/status/1787243696062341419

結構いい線まで行っているのだが

結構いい線まで行っているのだが,てこずっている.要領は大体分かったので,作り込んでゆけばよいはずだ.目標は,P点を全領域で動かせるようになることだ.つまり,P点がデカルト平面上のどこにあっても,与えられた三角形の周長等分線が引けるというのがゴールだ.P点が三角形の内部にあるときは,場合によっては等分線が2本になる場合もある.このような場合にも正しく動作するようにしなくてはならない.図面に書き込んでいる円の個数は18個,多分これ以上増えることはないと思われるが,直線ないし線分の数はその何倍もあり,それをまた上回る数の点がある.おそらく,最終的にはオブジェクトの総数は数百個に達するのではないかという気がする…

この図面にはおそらく6個の象限があると推定されるが,現在のところそのうちの2.5象限しかカバーできていない.まだ未整備のところが多々あるためと考えられる.それらを潰してゆくしかないだろう.blueの領域がまったく出ていないのはなぜだろう.すでにF点は決めてあるのだが,N点が定まっていない.まず,ここから片付けることにしよう.F点というのは頂角の2等分線上の点でこの点とPの中点を中心とする円がN点の位置を決定することになっている.N点はL2上の点であり,L2というのは,3本の基線のうちの一つだ.

大体全域で動くようになった.ただし,まだ問題点がいくつかある.内部の三角形と小円が交差するとき,2点で爻わる場合,どちらを取るかという問題だ.どちらかを消さなくてはならないが,それを図形から判断できるだろうか?スクリプトを使って切り替えることができれば話は簡単なのだが… 実際,現在の実装では目視で明らかに2等分になっていない場合がある.⇒1本線を消したら正しく動作するようになった.⇒等分線が3本出てくる場合がある.この動作は正しい.

ナムの三角形周長2等分線作図問題の一般解

ナムの三角形周長2等分線作図問題の一般解をGeoGebraで書こうとしているのだが,なかなか難しい.できるだけ画面をすっきりさせたいのだが,余分なゴミが出てきてしまう.これはポイントが落ちてしまっているためだろう.たとえば,下図には3本千切れた尻尾出ている.

image

これの固着できない点はどこかの線分の延長上にあったのではないだろうか?⇒単純に消しておくだけでよいのではないか?どうも,そもそも仕様通りの動作になっていない.実装が悪いのか,設計が間違っているのか?もう一度作り直しするしかない.

image

真ん中の小さい三角形は包絡線図でかなり重要な図形になってくるが,⊿ABCの形状によっては描画できないことがある.線分との交点ではなく,延長上の交点を取ってみる.


特性関数を対話的に切り替える

また,CalcTrajectoryでエラーが出ている.⇒処理本体を関数化したため,変数が見えなくなっている.変数をトップスコープに移した.

PNGファイルの保存パスが存在しないというエラーになる.

png(“.\\PNG\\” * titleName())

現在の作業フォルダが蜜天GUIになっているためではないか?その下のmittenを開くようにした方がよい.⇒このフォルダは事前に作っておく必要がある.あるいは,むしろデスクトップに生成するようにした方が分かり易いかもしれないが…⇒これは後から考えることにして,とりあえずフォルダを作っておこう.

一応一通り動くようになった.⇒InfinitePoolGameをモジュール化したらまた動かなくなってしまった.isinteractiveをisinteractive()に変えたためだ.isinteractiveは変数ではないので,これまでそれが通っていたことの方がおかしいのだが,デバッガで走らせることはinteractiveには入らないのだろう.REPLからinclude(“src\\InfinitePoolGame.jl”)では想定通りの動作,つまり,isinteractiveはtrueになる.定数を切って切り分けるしかなさそうだ.技術的にかなり難しい問題が出てきた.

ようやく元のように動くようになった.特性関数を動的に切り替えるというのが目下の課題だ.julia には eval という関数があるのでなんとかなるのではないかと思っているのだが… まず,関数ポインタのようなものがあるかどうかを探さなくてはならない.⇒プロットを表示するのは以外と簡単にできた.

include(“InfinitePoolGame.jl”)

でInfinitePoolGame内の関数にアクセスできる.とりあえずは,これで十分だ.本当はimporないしusingでロードしたいのだが,まだパッケージになっていないためロードできない.includeは実行時に何回でも実行できるので,最悪の場合(他に打つ手がない場合)は,InfinitePoolGame.jlを直接書き換えて再ロードするということが考えられる.多分,これは不可能ではないと思われる.juliaは正規表現をサポートしているので,ソースファイルの書き換えはできるはずだ.一度ここでバックアップを取っておこう.

スタンドアローン型のJuliaアプリを断念

スタンドアローン型のJuliaアプリを作ろうとしていたのだが,断念した.ともかく,先に進むことにしよう.画面上にはまだボタン1つしか出ていないが,少なくとも,①関数入力用のテキストボックス,②グラフの範囲を設定するための数値ボックスx4,③実行ボタンが必要だ.ただし,それに入る前にこれまで開発したPlotsを使ったグラフ表示を組み込んで動作確認しておいた方がよい.

なぜだろう?Plotsが読み込めなくなっている.Juliah本体でも読めない.⇒pkgで読み直した.Rootsも入っていない.⇒追加した.最終版と思われるものを動かしているのだが,エラーになった.グラフは一応出ているが,軌跡は描画されていない.CalcTrajectoryの中でエラーが起きている.なぜだろう?メニューに中国語が出ている.

image

いままではGotoDefinitionが先頭にあったような気がするのだが… おかしい.元に戻っている.Julia には言語設定というのがあったろうか?CalcProjectoryの中でplot!を実行して例外が起きている.

ErrorException(“Cannot convert Float64 to series data for plotting”)

これまではこれで動いていたはずなのだが,Plotsをリロードしたことでバージョンが変わってしまったのだろうか?少しバージョンを戻したら動いた.多分,この辺りは仕掛りのままになっていたのだろう.蜜蜂天国 2024-04-05の前は2024-04-01で4日も空いている.ログを見てみよう.4月5日には「find_zeroが動作していない」というのがあり,修正して動作するようになったが,それ以上の記載はない.その一つ前は2024/03/29で「た軌跡の描線が出なくなっている」から始まる.

2024/04/05という日付のログは2本あり,2本目のログでは「蜜蜂天国のまとめに入っているところだが,足踏み状態だ.いろいろなパターンを試してみたいのだが,そのためにはもうちょっと準備が必要だ.」として,「まとめ」を打ち切り,「JuliaでGUIアプリ」という方向に走り出している.2024-04-01版ではCalcTrajectoryではplot!を実行する代わりにpush(plt,…)している.確かにこの違いは大きい.⇒論理を戻して動作するようになった.ただし,ウィンドウが出てこない.PNGとGIFは保存されている.どこが違うのだろう?⇒出た!show=:trueのコロンが落ちていた.うまく行ったようだ.アニメを作らないオプションでも動作するようになった.

image

これで行くしかない.

なぜだろう?実行しようとすると,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 ★★★★★

クリックでフリーズし,以下が出る.

image

ともかく一度バックアップしておこう.

⠸ [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

image

どこかでゼロ割が発生している.εを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に出力される.これで行くしかない.バッチコマンドから起動については後で考えることにする.

スタンドアローン型の julia アプリ

スタンドアローン型のアプリを作ろうとしているのだが,動作しない.必ずしもスタンドアローン型である必要はないのだが,生成されているのに動かないというのはおもしろくないので,もう少し粘ってみることにする.パッケージは800MBを超えてしまうので,これを毎回バックアップしていたのではたまらない.外部に置くことにしてD:の直下のcompiledに保存するようにした.ここに生成されたmitten.exeを実行すると,いままでよりは多少長い時間ウィンドウが表示されるようになった.と言っても数秒も立たないうちに閉じてしまうのだが…

ただこれではっきり分かったことは,Gtkではjulia_mainを実行しているということだ.この中にループを組んでやれば多分動作するようになると思う.ただし,動作を観ていると,Julia_mainでシェルは開かれてはいるが,UIの入ったウィンドウは開かれていないように見える.多分,これはどこかに書いてあったような気がするが,Julia_mainの中にすべての処理を突っ込まなくてはならないのではないかと思う.言い換えると,REPL用のコードとスタンドアローン用のコードが切り分けできるようになっていなくてはならない.

コマンドシェルでmitten.exeを実行すると,julia_main中のプリント文は表示されるが,すぐに抜けてしまう.また,EXEのダブルクリックによる実行では何も表示されず,プリント文も出ない.⇒julia_mainの中でwaitすることによって,下図までは動いた.

image

生成された小さいパネルも表示されているが,ボタンクリックでフリーズしてしまった.