「プログラミング」に関する日記(3)

プログラミング関係の話題。プログラミングコーナーを更新したとか、プログラミングの内容に踏み込んだ話とか。

<前 次>

TGWS内部処理とPHP

TGWS内部処理

更新履歴ページのRSSはずいぶん前にURL変更していたんですが、各ページからのリンクがずいぶん長いこと古いURLのままだったので、修正しました。
あわせて、ずいぶん長いこと残っていたけど使われていなかったスタイルシートとかリダイレクトとかも整理しました。

PHP

DateTime関連で不思議なものを見つけたのでちょっと記事書いてます。

アンパンマンDBとUno Platform

アンパンマンDB(記事更新)

来週の放送情報。

Uno Platform


とりあえずプロジェクト作ってみたけど、UWPをベースにしてマルチプラットフォーム化した感じなのね。
私にとってUWPは今一つだったし、それがベースになってる時点で熱くないな、という印象。

最初のウィザードが充実して、最初の工程を手取り足取りやってくれるけど、その分、ウィザードが終わった瞬間複雑なプロジェクトが目の前に現れます。
Avalonia UIは「UIの他はMVVMだけ用意したから後は好きにやれ」みたいな初期状態だったので、この点は対照的ですね。
UWPをしっかり学んだあとのマルチプラットフォームを目指すステップだったらこの複雑さがむしろ嬉しくなるのかも。

あと、MVUXっていう聞いたことないアーキテクチャが。

がっつり使い倒す前提ならいいかもしれないけど、今の私には重いかな。

Avalonia UIとドラゴンクエスト10

Avalonia UI(Today I Learned)

どうやらウィンドウも普通に表示できる模様。
ビューモデルから親ウィンドウを直接たどる方法が見つからなかったので、メインウィンドウのインスタンスを静的プロパティに入れる必要があったけど、もっといい方法あるのかな。

ドラゴンクエスト10(しろいコキン)

カノック

  • クエスト「よみがえる王国/生きていた男」をクリアした!

突然、かつ今更、しかも季節外れのクリスマス衣装ですが、偽グランゼドーラのクエスト進めました。

(クエスト内容ネタバレ)

ひとくいドール
ボスのひとくいドール。
ニードルマンみたいなやつですね。
襲われてた人、めちゃくちゃモブ兵士顔で「誰?」って感じだったけど、たぶん塔に潜入してた時に何かされてた兵士かな。
ダイム老の孫という設定のようで、絶望に沈んでいた偽グランゼドーラにちょっとだけ希望が戻りました。

他の写真は以下から。
写真置き場「2025/02/25」

のんびりナマライザとAvalonia UIとドラゴンクエスト10

のんびりナマライザ

.NET Frameworkのバージョンを上げるだけの単純な修正。
CI関連の機能が古すぎて動かなくなっていたので、そっちも更新しました。
さて、特に新機能も本体のバグ修正もないわけだけど、いつリリースしようか…。

Avalonia UI(Today I Learned)

Avalonia UI
.NET向けのクロスプラットフォームUIフレームワーク。
Microsoftではなく、サードパーティ製です。
WPFみたいな感覚で使える模様。

ドラゴンクエスト10(しろいコキン)

人食い火竜 煉獄火炎

  • 食人火竜スレイヤーの称号を得た!

しろいコキンも人食い火竜やっつけました!
ミフミンのときの経験から、ハンマー盗賊が相性よさそうだったので、それ中心の編成で。

人食い火竜 獄炎テンペスト
ミフミンがやられたのはこの技、獄炎テンペスト。
さすがにこれが来るとわかっていれば、近寄ればいいだけなので難なくやり過ごせたのでした。
…と思いきや、効果範囲が正反対のスーパーノヴァをその後使われて、同じ感覚で近寄ったら、密着状態で見事に燃やされてしまったのでした。
まあ、最終的に炎耐性100%の優秀なサポたちがどうにかしてくれたわけですが。

QiitaとNeoMupl

Qiita

先月頑張ってたやつ、Qiitaの記事に書きました。

mifumi323/WinUI3MediaPlayerElementSnapshotSample
これがサンプルプロジェクトのリポジトリ。
動画はAIで作るのもありかとは思ったのですが、大した手間でもないし、一応自作しました。
サンプル目的に都合のいい、軽くて常に動いてて端から端まで被写体があるフリー素材がすぐ見つかればそれが一番だったのですが、まあ有名どころは大きくておしゃれだったり個性が強すぎたりしましたからね。

NeoMupl

細かいことですが、ソリューションファイルが昔のままになっていたので。

アンパンマンDBとWinUI3

アンパンマンDB(記事更新)

来週の放送情報。
歴史の長いキャラで固めてきた感じですな。
食パンとジャムって一番合うのにキャラの組み合わせとしてはこれが初なんだ。

WinUI3(Today I Learned)

先日悩んでた動画スクショの件、解決しました。
CopyFrameToVideoSurface メソッドを使えばよかったのでした。
実はあの時もそのことまでは突き止めていたものの、コピー先となるIDirect3DSurfaceをどう用意すればいいのかがわからなくて詰まっていたのでした。

MediaPlayer を使ったオーディオとビデオの再生 - UWP applications | Microsoft Learn #フレーム サーバー モードでの MediaPlayer の使用

答えは結局サンプルコードの中にあったのです。
使うのはCanvasDeviceとCanvasBitmapです。
WinUI3本体には入っていないので、NuGetでMicrosoft.Graphics.Win2Dを入れます。
VS2022に任せているとWinUI2用のWin2D.uwpを入れさせようとしてくるので注意です。

GitHub Copilotとふにゃ1とFamiTracker

GitHub Copilot

Announcing GitHub Copilot Free - GitHub Changelog
なんか無料枠ができてました。
以前からちょいちょいお試しで触ってはいたんだけど、本格的に使い始めてもよさそう。
まあ、あまり本格的過ぎると無料枠の限度に達してしまうかと思いますが。

ふにゃ1

今回はスクショなし。

この辺はバグ修正。
カウントダウンのほうは、メッセージ表示にダイアログボックスを使わなくなったことで発生した初期化漏れ。
キー入力のほうは、リセットのコードが解析で出てこなかったので、原作でももしかしたら発生していたかもしれません。

これは単にコードを移植しただけ。
先ほどのGitHub Copilotに一度書かせてから、手直しして作ったものです。
コミットメッセージは、全面的にGitHub Copilotに任せました。
基本的に全面的に信用してプログラミングを任せるのはありえないですが、修正する前提で案を出してもらうとか、少し変でも害の少ないコミットメッセージあたりに使うのがよさそうかな。

ここはメニューの機能の実装だけで、実際の読み込み処理はまだ作っていません。

FamiTracker

ふにゃ1にはもともとBGMはついていなくて、プレイヤーが好きな音楽をかけられるだけでした。
せっかくの移植だしここらで標準のBGMでも作ってみようかと思って思い出したのがこれ。

FamiTracker
ファミコン音源で音楽作れるやつです。
単に音がファミコンっぽいってわけではなく、しっかり制限事項も含めてファミコンの仕様で音が鳴ります。
前回使ったのが2008年だから、16年ぶりか…。

Unity

先日GodotのDPI対応について調べたので、今度はUnityも調べてみました。
画像は割愛しますが、Godotがシステムで、Unityはモニターごと(v2)。

システムは、解像度がメインモニター基準固定で、別ディスプレイに行くと機械的に拡大縮小されてぼやけます。
最初の解像度対応さえちゃんとすれば後は全自動で、Godotは最初の起動時の状態をドットバイドットの表示にします。

モニターごとは、各モニターごとに解像度が再設定されます。
そのため、画面が切り替わるごとに処理が発生します。
起動時の状態は、Unityでもドットバイドットになりますが、別モニターに行くと結局拡大縮小が発生します。
ここで、3Dならば、解像度をちゃんと切り替えたうえで、新しい解像度でドットバイドットになるようにレンダリングできます。
しかし、2Dの場合、SVGみたいなベクターグラフィックでまない限りは、ドット数固定で、別解像度など存在しないので、機械的に拡大縮小するしかなく、やはりぼやけてしまいます。

うーむ、3DならUnityのほうが強いけど、2Dだと実質変わらないってことか。
2Dの作りやすさでいえば、Godotのほうがやりやすく感じたし、2Dゲーム開発するときはGodotを先に考えるようにしてみよう。

Godot


ふにゃ1を移植することを念頭に、ドット絵が動表示されるのか確認。
メインディスプレイでは、1枚目のように、原寸で表示。
ディスプレイの拡大率は200%に設定されていますが、拡大されずに表示されています。
より正確に言うと、ゲーム本体ではない外枠だけが拡大されています。


これを、拡大率100%のサブディスプレイに移動すると、全体が200%→100%で半分サイズになって、ドットが潰れました。
ゲームはマルチディスプレイ環境でもメインディスプレイだけで遊ぶことがほとんどだとは思いますが、一応注意が必要かもしれませんね。

具体的にどう注意するのか…というと、それはまあ、ゲーム画面の物理ピクセル数を見て個別に判断する…ってことになるかなぁ。

アンパンマンDBとWinUI 3

アンパンマンDB(記事更新)

来週の放送情報。
再放送ですな。

WinUI 3

MediaPlayerElementで今表示されている映像を静止画として使いたいけどやり方がわからぬ…。
MediaPlayer.IsVideoFrameServerEnabled プロパティあたりを使えば何かできそうな気はするけど、これを使うと画面に表示されないし…。

WinUI 3(Today I Learned)

スレッド機能の移行 - Windows apps | Microsoft Learn
WinFormsでも厄介だった非同期処理でのUI処理。
WinFormsで使ってた方法そのままは無理なので、ちょっと違う方法になります。
とはいえ、使うメソッドが変わっただけで、メソッドを一枚噛ませてやるという構造自体は変わらない模様。

ListViewBase.ScrollIntoView メソッド (Windows.UI.Xaml.Controls) - Windows UWP applications | Microsoft Learn
そんでもってこっち。
ListViewはプログラムで選択を変えても自動でそこまでスクロールしないので、同じくプログラムでスクロールさせてやる必要がありました。
とはいえ、どこまでスクロールするかを指定する必要はなく、メソッド一つでよしなにしてくれます。

アンパンマンDBとWinUI 3

アンパンマンDB(記事更新)

コラムから転記。
転記元の時点で文章がおかしな部分があったので、コラムともども修正しています。

WinUI 3(Today I Learned)

データ バインディングの詳細 - UWP applications | Microsoft Learn
これまで「Binding」によるバインディングしか使ってなかったけど、「x:Bind」によるバインディングも調べてみました。
「Binding」が動的に解決するのに対して、「x:Bind」は静的に解決するということ。
つまりまあ、コーディング中にもう既にどこからデータが来るのかわかっているということですな。
で、コーディング中に既に分かっているので、インテリセンスがどんどん自動的に候補とかを出してくれるし、実行中にデータを探しに行ったりしないので、動作も高速と。
「Binding」でしんどい部分があったから「x:Bind」を調べ始めたんですが、思ったよりだいぶいいですね。
もちろん、やりたいことを全部簡単に完全にできるというわけではないですが。

アンパンマンDBと.NET 9

アンパンマンDB(記事更新)

来週の放送情報。

.NET 9

Visual Studio本体のバージョンを上げたら.NET9が使えるようになっていました。
WinUI3試してるプロジェクトでもさっそく適用。
今のところ、ビルドが問題なくできたのを確認できただけで、新機能とかはまだ見ていません。
C#13も使えるはずなんで、コードがもっといい感じになるはずなんですよね。
いつもの流れなら、普通にプログラムを組んでいたら、コード解析が新機能を提案してくるという形で触れることになると思いますが。

アンパンマンDBとWinUI3

アンパンマンDB(記事更新)

コラムから転記。

WinUI3(Today I Learned)

ピッカーでファイルやフォルダーを開く - UWP applications | Microsoft Learn
Windows App SDK, WinUI3, Desktopでファイル選択ダイアログを表示する #C# - Qiita
ファイルダイアログを開く方法。
やっぱりWinUI3でもファイルの読み書きはしたいですからね。
エラーなく動かすためには気持ち悪いおまじない書かないといけないというのが残念なところ。
将来的に開発が進んで不要になったらいいけど、マイクロソフトのこれまでから考えると、普及しないまま開発が止まって立ち消えるというのもありうる…。

WinUI 3

Config.Netで設定読み書きうまくいきました。
デフォルト値とか項目名の別名作れたりするし、初期値→設定ファイルで上書き→コマンドライン引数でさらに上書きみたいなこともできるし、ファイルから読み込んだ設定は自動で同じファイルに保存されるし、標準のWindows.Storage.ApplicationDataよりむしろ便利。
あとは、CommandBarでツールバー的なものを作ってみたり、ページ遷移で値を受け渡すのとかやってみたり。
着実に作りたいものに近付いてきた感があります。
まあ、作ってるのは一般公開しない自分専用ツールですけどね。

アンパンマンDBとWinUI 3

アンパンマンDB(記事更新)

来週の放送情報。

WinUI 3

Windows.Storage.ApplicationData使ったら使ったでエラーが起きました。
Unpackagedだと制限かかるみたいね。
昨日紹介した記事の後半に書いてあったConfig.Netならいけるのかな?

アンパンマンDBとWinUI 3

アンパンマンDB(記事更新)

Blu-rayの情報出るの待ってたんだけど、結局なさそうだったので、DVDの情報を追加。

WinUI 3(Today I Learned)


設定ファイルはどうするのかなって思って昔ながらのSettings.settings追加してみたらこの通り。
参照が足りないといわれつつも、必要な参照は候補に出ず、どうやら昔と同じ方法では動かないようです。

Recommended way of doing user settings with WindowsAppSDK 1.0? · microsoft/WindowsAppSDK · Discussion #1478
ここを見る感じ、UWPのやり方を踏襲して、Windows.Storage.ApplicationDataを使うのがいいのかな。

アンパンマンDBとXdebug

アンパンマンDB(記事更新)

コラムからの転記。
この程度なら毎日いっぱいやってもいいのにね。

アンパンマンDB(システム)

リストをNULL検索できないバグを修正しました。
ただ、今のところ、何もない項目はNULLじゃなくて空文字列が入っているので、実質的に影響はありません。

Xdebug

Xdebug - Debugger and Profiler Tool for PHP
Xdebug導入しました。
すなわち、Xdebug使わない縛り辞めました。

もともとデバッガとしては、PHP標準のphpdbgを使ってました。
PHPUnitのカバレッジもphpdbgだったんですが、PHPUnit10以降(最新版は11)には使えなくて、phpdbgのために古いのを使う続けるのも厳しいなって思ってました。

カバレッジ計測の選択肢としては、PCOVもあったんですが、あんまり更新されてなさそうだったし、カバレッジ「だけ」というのもどうかと思ったので、デバッグ並びにカバレッジ計測の定番、Xdebugを導入した次第です。

そもそもXdebugを避けてphpdbgを使っていたのは、XdebugはPHP標準に入っていないというのと、カバレッジ計測が遅いという話を聞いたからだったのですが、実測してみると、今はXdebugのほうがphpdbgより1割ほど早く終わりました。

WinUI 3(Today I Learned)

DataGrid - Windows Community Toolkit | Microsoft Learn
ListView クラス (Microsoft.UI.Xaml.Controls) - Windows App SDK | Microsoft Learn
これまでDataGridViewとかでやっていたことをやろうと思ったら、素直に考えればDataGrid。
ただ、WinUI 3では標準機能ではなく、NuGetでライブラリとして導入する必要があります。
標準機能にあるListViewは、ヘッダ表示とかは期待できませんが、テンプレートをうまく使えば、複数列表示も可能です。
外部依存を不必要に増やすのはあまり面白くないし、いったんListViewを試してみようかな。

Godot Engine

Godot Engine - Free and open source 2D and 3D game engine
インストールしてみました。
funyak、実質開発凍結みたいな状況ですが、あきらめたわけじゃないので、C#で作ったロジックを乗せられるゲームエンジンを、Unity以外でも考えてたんですよね。
で、とりあえず最新版の4.3をインストールしてみたんですが、C#+HTMLの組み合わせは4系ではまだできないらしかったので、3系最新の3.6も入れました。

Unityはシーン遷移がよくわからないまま積んでしまったので、Godotのほうはシーン周りを早めに調べておこうと思います。
やっぱりシーン遷移があると、タイトル画面を出せて、見た目にも映えますからね。

あと、Steamのゲームでよく見かける、日本語が中華フォントで表示する問題への対応は、早々に調べました。
言語設定をはっきり明示することでフォントの優先順位を正しくできるってことですね。
そう考えると、国際化対応は、言葉そのものだけじゃなく、言語設定やフォントにも気を使う必要があるってことになりますね。

<前 次>