星田オステオパシー

プログラミング学習日記 2025/01/20〜

2025/02/06

話題その1 なんと「ゲームブックプレイ専用E-ink端末」が開発される!
 マジで!?専用ゲーム(?)も提供されるがエディタもついてて自作できるという!
 そう来たか〜・・実はいずれ作りたいアプリとして「ゲームブックつく〜る」的なのを考えてたんですよね!前にCametanさんに紹介してもらったイギリスの「ローンウルフ」シリーズとか勝手に移植するのにツールを作ろうと思ってたんですよねぇ。ま、でもきっと汎用性がそんなに無いと思うので、戦闘システムを選択したりルール自体をエディット出来るような仕組みでいつか作ってみたいと思っとります。自分で作ればタダだしね!


話題その2 Luaに他の言語の便利機能があるのか
 Rustでのdurationがアニメ処理に便利だったけどLuaでは時間経過で処理する場合どうやれば?ということで質問。へぇ〜dtって予約されてる時間経過の変数なのか・・

 第二案。同じ機能なら第一案で良いな

 ここでグッと実践的になる。
 おお・・animetionテーブルに各パラメータを突っ込んで、タイマー(dt)で内部を破壊的変更、そしてそれを参照するlove.drawで表示するquadが変更されるのでアニメーションするということか!やりますねぇ!

 いや、これは素晴らしい!でも、キャラクターが複数の場合はどうするんだろうか?

 なるほどね・・でもコレはさすがにちょっと幼稚なやり方じゃないか


 えっ?クラス風?


 いきなり面倒くさすぎる!普通にテーブルにキャラクタを放り込んでイテレータで回すとか出来ないのか?

 出来るんかーい!

 コレよコレ!

 だしょ?(死語)
 最初から提案してくれてるともっと良かったけどね!

 あと、条件分岐が面倒なのでMatchとかCaseみたいなの無いのか?と。

 うーん、まあ

 え〜・・?

 うげ〜・・

 まあ、1番は使えそう。でもその場のノリで実装するスタイルが取りにくそうだなぁ・・



2025/02/05 Luaの学習を進めて柔軟性に感動した&コード生成AI比較
 今日は思ったよりも早くclaude先生の制限が来てしまって話が進まなかったので対策として他の生成AIをサブとして使う事を考えた。無料でWEBベースで使えるとなると他にはgeminiとかwrtnとかあるけど、wrtnも制限あったしなぁ。geminiはどうか?なんと無制限、Racketの時には使い物にならなかったけどその後どうなっただろうか・・

 コード生成に特化したものがいくつかあるようで、meta社のLLMAだったかな?それがオススメとして上がってきた。直接ページに行ってみたけどWEBで質問を入れて・・って感じじゃなかったので、解説サイトでLLMAだか言うのを使用してる無料サービスに飛んで質問。制限はあるのかい?と。普通に使ってれば大丈夫じゃないかな?と。

 ではここでgeminiに今回のLove2Dでのスプライトバッチと他のグラフィック表示形式の併用についての質問をclaude先生と同じ文面で質問をしてみる(全体のコードも添付した)。

 いや、全然駄目(・_・;)
 質問の意図が伝わってない模様。なんと言うか文脈を理解してないって感じじゃないか?そう考えるとclaude先生はこっちの意図を見通して解説してくれてる感じがあるなぁ


 では続いて多分metaのLLMAを使ってるであろうサービスでも同様に試してみる

 いきなり的確!


 興味深いことに実装の仕組みがclaude先生と違う。こっちはpopとpushでマップを呼び出したりしてる。これはこのコードをclaude先生に持ち込んで比較をしてもらわないと・・

 その後、ちゃんとボタン表示部分も関数化してサンプルをつけてくれるLLMA先生。



 最後のまとめもしっかりとある

 続いてgeminiにQuadを転用して利用したい場合の解説を聞いてみる
 うーん、まあこんなもんか。でもちょっと質問の読みが甘いよなぁ・・スプライトバッチとの併用が可能かって流れで質問をしてるわけだから


 一方LLMAは・・


 ちゃんと文脈を捉えてスプライトバッチと併用が可能だって例文を出してくれてる!

 やっぱりgeminiは駄目だな。claude先生メイン、制限が来たらLLMAで続きを・・って方針で行くぜ!


2025/02/01 Love2Dのドキュメントを読んで次に作る物を決定した
 例の新たに発見したLove2Dの解説サイトに簡潔なLuaJITの解説なんかもあったのでザっと拝見。えっ!シンボル?に全角文字が使えるのか!これは・・変数が分かりやすくなるぜ!

 今までのパターンだとWORLDデータを持たせるための構造体を用意するところだけど・・どうも存在しない模様。こういうのはハッシュマップを入れたテーブル(Pythonでいうところの辞書)を使うようだ。まあ、考えてみれば何の問題もないな

 アクセスも簡単だな

 Mutな参照ってことだな

 ほうほう・・考えてみれば合理的な挙動だけど考えたことなかったな。

 ちょっとRustの後だとややこしいかな・・まあ、ややこしいので関数呼び出し方式でやるとしよう。

 キーを指定しないと自動で1からのIndexが設定されると

 一度は実行されてしまうってのは覚えておこう

 あ、どこでも無制限でReturnできるわけではないのか・・裏技として無理やりDO ENDでブロック扱いにする事もできると。

 オブジェクト指向では無いと思っていたがTypeはオブジェクトになってるのか。親で適用できるメソッドは子にも継承されて使用可能ということだが・・ま、慣れかな。

 さて、じゃあWORLDデータもハッシュテーブルで作ることが出来ると分かったので、早速ゲームを・・と思ったのだが!!

 今回桃鉄ライクなゲームに挑戦するということで、マップ作成が重要。これを今まで通りにテキストエディタに1とか2とか試行錯誤しつつ打っていくってのはいかにも非効率・・ここは・・マップエディタをLove2Dで作るしか無い!

 ということで、GUIでゲームを作る前にGUIのツールを作ることにしました!燃えてきたぜ!



2025/01/27 

話題その1 今年の抱負

 振り返りは終わったので今年の目標にも思いをめぐらしておくか・・と。

 まずはLuaのLove2Dを使ったプログラミングですかね。作ってみたくてゲームエンジンを利用するにふさわしいジャンルとしては・・やはり桃太郎電鉄ライクなボードゲームだろうか。たまたまだけどうちの甥っ子が鉄道マニアなので、彼を楽しませる事をモチベーションの一つとして設定したいと思う。僕が全く理解できなくて彼がやたらと拘るのが電車の警笛(・_・;)だったりするので、効果音などにはちょっとこだわってみたいかなと。あとは、ステージを本家では絶対に採用されない交野市近辺の交通網を使ったものにして、物件もローカルな店や神社などにしてみたらどうかな?と。対応してるか分からないけど、ネット対戦も出来るようにしたいなぁ・・これは巨大すぎる挑戦だけど。

 Love2Dのデモ版みたいなのを作った段階で、Pythonの2DゲームエンジンであるPyxelを使ったものも同様の素材を使って作ってみたい。今の所導入でヒーヒー言ってるけど、実は今月の27日にゲームエンジンの作者がからんでる入門書が発売されてるので、それを参照すればさすがに環境づくりとかドキュメントの読み方などは把握できるだろうと。

 あとはずっと放置してあるMatlabの入門書を使って数学的な事を勉強するのも実は楽しみかな。この世のコンテンツで本当に楽しめるものは宇宙とか物理とか数学とか金融の先端付近にあると思うんですけど、数学とか物理の素養がまったく無いのでアクセスできないんですよねぇ!それを徐々にでも何とかしていきたいと。

 あとはそうですねぇ・・かつてはMT4とかMT5のプログラミングをやって自動売買で少しでもエッジのある方法でも発見できれば・・とか思ってたけど、やっぱり幻想っぽいしなぁ。

 ま、そういう感じで!


話題その2 Lua、もうLove2Dに入っていこう

 エラトステネスの篩のコードを見て質問。Filterの引数にはストリーム生成関数Integerを束縛した変数Numsを送るんだけど()が無いのだが?と。なるほどそういうことか・・覚える努力をしておこう

 Filterと言いつつも内容がストリーム生成と同じ作りなので質問。


 え・・これはすごい!以前の状態が適用されたものに新たな条件を重ねたストリームを生成出来るとなると・・パッと使いみちは思いつかないけど、無限を都度、変化させることが出来るのか!しかも遅延評価ってことは再計算不要でですよね?ほぇ〜

 なんか凄さがちょっとは分かってきました

 続けてオブジェクト指向プログラミングについて・・って事なんだけど、Luaには無いけど(←多分)実装してみよう!って話なんですよね。いや、もともと無いものをわざわざ作らんでも・・勉強としては良いんだろうけど。


 メソッドも実装しようと。そのためのメタテーブルを使っての参照を共通させるってのは面白そうだったけど・・エルフ並の寿命があったら取り組みたいところだけど人間だからなぁ・・

 お気楽さんのところではこんな感じで盛りだくさんなんだけど・・とりあえずはLove2Dで動くものを作るのが目的なので、基本的な制御を習った今となっては別に良いかな・・と。

 というわけで、とっととLove2Dにとりかかることにしました。

 Love.loadで初期値などを読み込んで
 Love.drawで描画ってのが基本らしい


 ここんところ注意が必要かな


 キー入力

 マウス

 音楽ファイル

 BGMはストリーミングにしないとうまくいかないことがあるらしい。Beepとかの音源生成は無いっぽい?


 うーん・・入門サイトのサンプルはクリッカーゲームなので、画像を動かしたり別画面を表示したりというゲームっぽい動作を学習するのは容易なことでは無いぞコリャ。Love2Dで作られたゲームはすごく本格的なものがいくつもあるんだけど、どういうコードなのかは今の所発見できてないので・・そうそうに詰まる可能性もあるな。
 そう考えると環境造りは面倒そうだけどPyxelは作者も日本人(元コナミの人)だし本もあるしで・・悩ましいところではありますなぁ。ま、行けるところまで行ってみよう。


 追記:別の解説ページありました こちらはゲーム作りにすごく参考になりそう!


2025/01/26 ざっくり振り返り

 いちおうRustで動くものを作って別の言語に移ることにした・・ってタイミングなので雑感めいた振り返りでもしとこうかと。

 まず直近のRustについて、印象深かった点として思い出せるのは・・
○Crossterm最高
○Duration便利
●Trait使う気にならず
●メソッドの命名ルールをもう少しなんとかして欲しい
●所有権はやっぱり面倒

 って感じですか。正直、Crosstermを使わなかったらRustの学習は相当面白みのないものになってたと思う。逆に、ああいう簡易的に非同期入力で画面をコントロールできる仕組みが他の言語にもあったら、どの言語の学習も楽しめるようになると思うなぁ。特にDurationとの相性は感動ポイントで、キャラクターの移動やエフェクトなどを実質的に完全に制御出来ると感じました。あとはちゃんと音が出せればなぁ・・。このCrosstermに座標を対象としてビットマップグラフィックの表示機能が備わったら・・スムーススクロールとかスプライトが必要ないタイプのゲームだったら十分楽しめるものが作れそうだなと。もしかしてRacketのBig-bangも今から触ったらもっと楽しめるかも知れないが・・またいつか触ってみるかな?

 あとはオブジェクト指向部分的部分ですか・・まさか継承が無いとは。代わりになるのがトレイトって事だったんですが、全然楽ができないので全く意味がないなと。結局、別々にメソッドを書くのと同じかそれ以上の労力が必要で(ほとんどはコピペで済むけど)、なんのためにあるのか僕には謎な機能でした。書き手の管理になるけど、思い切ってフィールド名と型が同じであればメソッドは共通で使用できるって仕組みあったら便利だと思ったんですけどねぇ・・大きなプログラムだったらバグの元になるのかもだけど。

 メソッド関係で言えばメソッド名ですかね。Selfを破壊的に変更するのか、値を返すのかってのが先頭に”!”か何かをつけるとかで表現できるのに何もない。あと、クレートを入れるとシレっと超基本的なメソッドが上書きされてしまうとか・・そのためにUseで個別使用出来るようになってるとは言っても、デフォルトのメソッドと同じ名前はどうなんだ?と。

 最後は所有権ですかね・・必須で便利だったら他の言語にもどんどん採用されてると思うんですけどッ!?Racketとかみたいにデータをどんどん変化させながら先に持っていって・・ってをやるってのが(Claude先生にも)不可能。結果、一番表層にフラグデータを作り、それを破壊的変更してデータ更新をしないといけないってことで・・まあ、最初からそういうつもりでデザインしてたら良いかもだけど・・うーん・・マルチスレッドとかネットワークとかをやるとありがたみが分かるんですかね?

 そういえば結局Rustでネットワーク対戦とか並列処理なんかはやらなかったので・・2周目やるとしたら挑戦したいですかねぇ。

 Rustの感想が思いのほか長くなってしまった・・

 Rustでの激アツポイントはCrosstermとDurationの組み合わせでしたけど、同様のものをLisp(Racket)でいうと・・
 やっぱりFoldにリスト化したクロージャを食わせてのデータ連続更新を自分で書いた時ですかねぇ!それまでFoldについては(理解に苦労した割には)へぇ〜・・って感じだったんですけど、(ページごとの処理があまりにも違ってるせいでデジタル化を放置している山本弘さんの著作「四人のキング」に挑戦してる時に)、クロージャに各種イベントのパターンをクロージャ化して入れておくことで、メッセージの表示に買い物、戦闘・・と自由に組み合わせて処理をデザイン出来るmini処理系みたいな使い方ができて「あ、これだ!」と感じたことはずっと忘れないですねぇ。Cametanさんがおっしゃるように最初にLisp系やってあの体験が無かったら、もうプログラミング学習やめてたかも知れませんね。今回CrosstermでメインになるLoop内の処理は(今の僕では)順番にフラグを拾って処理をするだけで・・「Basicのリストみたいだ〜」って分かりやすいが興奮はあんまり無かったかな。

 あ、もうバイトに行かねば!ってことで今日はここまでということで〜



2025/01/25 
話題その1 LuaのCoroutine

 2日前に見ながら書いたコードだけど、早速忘れてるので出来るだけ思い出して書くようにして、分からないところをカンニングしてそれぞれ1回ずつ書いてみる。for_each member make_iterator permutationsの4つ。
 ちなみに、Permutationsの解説をClaude先生に頼んだけど明らかに間違ってる解説を開陳。Rustではほとんど問題なく解説してくれたのに・・やっぱり学習元になってるコードが「正確」で「大量」ってのが大事なんでしょうね・・

 このレベルだったら大丈夫なんですけどね・・なんでわざわざ引数をArgに束縛してから実行するのか・・所有権システムもないのに?と思ったけど、なるほど{}で囲ってテーブルにするためだったか

 これなんてとりあえず丸覚えしてから理解って方が良さそうかなと

 これとか

 これは良い


 こういうメソッド単体の質問はバッチリですよね

 えっ!?おかしくないか?

 これ嘘ですよね?

 ここはなるほど・・Else節が必須ではないのか。

 早く次のトピックに行きたいが素数を遅延ストリームで出力するというお話。

 なるほど理屈はOK(理解したわけではない)。ではいざコードを・・と思ったけど、宿直室の机は椅子に比べて低くてコレでPCと向かい合ってると腰が・・。まだ完全ではないので今日はココまで・・短時間でも毎日やるのが大事ということで・・一応毎日やってるから大丈夫


話題その2 Cametanさんの記事

 記事まで書いていただいてありがとうございます!m(_ _)m




 今回Rustでトランキライザーガンを書いてて、トラックが角を曲がるところでPanicを起こし、ようやく(Lisp系で)マクロじゃないとIfが書けないってのが体感で理解できました。なるほどこういう事か!と。画面上端で下を向いてないのに、下を向いた場合の計算をしてパニックになってるんで最初は焦りました。
 そしてさらなる驚き、RacketのLazy Racketって遅延評価版のRacketだったのか!ようやく謎が解けましたわ〜。引用画像部分の解説をお聞きすると、なるほどHakellの信者さんの気持ちも分かりそうなものですね〜

 遅延ストリームについても、Luaの遅延評価学習とCametanさんの補修でちょっとは分かって来ました。使いどころとしては・・いずれやろうと思ってる数学の勉強でなら使えそうですかねぇ?パッと調べた感じでは「遅延ストリーム ゲーム 応用」とか「遅延評価 ゲーム 応用」なんかでは全く引っかからないんですよねぇ・・

 Claude先生に聞くとこう。その遅延と違うんじゃないか?と思うんですが。

 一方で遅延評価で聞いてみるとそれっぽいのが出てきた。
 ロジックパズルはプレイするのも作るのも無理なのでスルーして・・2,3,4はいつか作ってみたいジャンルなので、その段階でマスターできるようにがんばります!

 なるほど汎用性あるのは良いですね!なんかDS(のエミュレータ)で動くゲームを作れるらしい・・って情報があったのが興味をもつきっかけだったんですよね。Crosstermじゃ物足りないけどUnityとかじゃ豪華すぎる・・GBAとかDS辺りの感触でゲームが作れたら個人の趣味としては最適なんじゃないかと。

 Rustへの挑戦が一段落したってことで、次回はLispのことも含めて現在までのプログラミング学習の振り返りと言うか感想なんかを一度書いてみようと思います!


2025/01/23 Lua
 ジャンク整理をしてて、前かがみになった時に・・腰にピキィ!やってしまった・・というわけで、この二日間回復とバイトに専念してました。これさえなければなぁ〜・・

 なんだコルーチンって?って感じで謎の概念だったので一度ザッと見て、二週目で理解に努めました。
 ふーん・・クロージャとか遅延評価でやってたデータの取り出しの応用みたいな考え方なのかな?解説だけではよくわからないが・・

 サンプルコードを見るとなるほど。うーん・・使いどころが無いなら意味がないからゲームとかで考えると・・メッセージの表示とかに使えそうかな?今は全然思いつかないけど、まとめておいたデータを好きなタイミングで順番に取り出すような必要に迫られたときには思い出せるようにしておこう。

 ふんふん、データの最後はfalseが出ることで判定できると

 おっ!こっちのサンプルを見ると使いみちがイメージ出来るかも。Yieldで返すというのが通じるか分からないけど、Yieldの引数に関数を取ることが出来るなら、例えば敵キャラの行動ルーチンを予めFunction(foo)にまとめておいて、ターン毎に呼び出すとかそういう風に使えそうかな?

 なんか苦手意識のある木構造。この高階関数を使って・・

 ほぉぉ・・Coruotine.wrap内にLamdaで作った...を引数に取る処理を書いておいて

 おお!こいつは面白い!使いどころは思いつかないが・・可変長の引数を取って高階関数をイテレータに出来るのか!

 更にForを使って自動実行も出来る。まぁ、メッセージ表示くらいしか今は活用法を思いつかないが。

 順列もなんか苦手なんですよね!苦手なところを巧みに突いてくるなぁ・・。苦手なので、さっきの木構造と順列は暗記して書けるようにしてしまおう。

 仕組みとしては・・(僕の嫌いな)パズル的な方法ですよね。これは別にマスターしなくていいかな

 コードでちょっと気になるところがあったので質問。Else節はいらんのか?と。あ、Returnで即座に脱出出来るのか!ふーん、なるほどねぇ・・これはちょっと使いみちがありそうなので覚えておこう(※覚えられるとは言ってない)。

 とりあえずお気楽さんのところを一通りやったらとっととLove2Dに行くで!


2025/01/20 コツコツLua
 PaizaのエディタはLuaは非対応なので困ったな・・と思ってたんですが、世の中は広いもんで、オンラインでLuaが実行できるサイトが2つも見つかった。UIが日本語対応のこちら、MyCompilerを使っていこうと。

 ダークモードはコチラ。ちょっと色が気に入らないかなぁ・・


 いきなりLove2Dに行っても良いんだけど、まあ最低限の書き方くらいはやっておくか・・とおきらくさんのところで発見したLua超入門で学習。再帰とかの復習にもなるし。


 Rustでイテレータの便利さを知ってしまったのでLuaにある概念なのか心配だったけど、思ってたよりも全然モダンな設計だった。もっとBasic的なものかと予想してたもので。


 Foldの実装。個人的にLeftの方が好きなんだが・・なんでRightがあるんだ?


 これは理由にはならないのでは?

 無限リストって・・感覚的にはむしろLeftじゃないと出来ないような気がするが?
 それよりも遅延評価か・・今までスルーしてきたので、この機会にちょっと質問をしてみるか


 その前にメモ化が出てきたのでこれを機会に・・。...って何?


 なるほど、可変長を取り扱うためのシンボルみたいなもんか


 うーん・・例によって理屈はなんとなく分かるんだけどねぇ・・いつか必要になって書きまくるようになったら分かるかな。クロージャの性質ってことだけ覚えておくか

 あと、遅延評価。なんか難しく考えてたけど、単純にクロージャ化すれば実行時に全部評価しないだけの話か(違うかもだけど)



 この説明は分かりやすい!

 多分、ずっと以前にCametanさんが解説してくれてるはずで申し訳ないですけど、ようやく実感を持って頭に入ってくるタイミングが来たって感じかも。
 ところでなんか書き方に作法と言うか共通点がありそうなのだが・・

 理解力が足りないので定番を知って帰納的に理解するしかねぇ・・ってことでパターンを教えてもらう。あ、Thunkか・・なるほど、1枚関数に包む事で遅延化出来ると

 メモ化もそうなのか?この例はメモ化って感じがあんまり無い気がするけど?

 これも遅延評価になるのか・・結局内部で無引数の関数を作って返してるからThunkと似たようなものになるのか?

  これはよく分からんが・・まあ、あんまり縁がなさそうな気がするから良いか

 コールバックもよく分からんが・・共通する特徴、コレが知りたかった。無引数関数でラップするってのはなるほど!そんでその中に計算を入れておくと?で、必要な時にその関数を呼び出すと計算が行われると。

 うーん・・結局使わないと身につかないので、何かゲーム的なものを作る中で必要となる場面が出ることを祈るのみか。
 
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「プログラミング」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事