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

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

<前 次>

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

ドラゴンクエスト10(ァォィョッュ)

  • クエスト「ガンバライオンの戦士たち/限界突破! レベル136」をクリアした!

はい無事クリア!
またしても30分かかってしまいました。

Avalonia UI

mifumi323/AvaloniaHideTitleBarSample
こんなの作ってました。
Qiitaとかにまとめなおしてもいいかもとか言ってたやつ、書くために。
まあ、このリポジトリがシンプルに結論なんですが、Qiitaのほうはちょっと文章書きます。

日記

Avaloniaタグ追加しました。
これまでの日記をまとめるのもそうだし、今後も書いていきたいので。

Visual Studio 2026とAvalonia Accelerateと浮き沈みランチャー2

今日はゲーム記のカービィディスカバリーのページにスターリーワールドの情報でも追記しようかなーなんて思ってたけど…

Visual Studio 2026


Visual Studio 2026 リリース ノート | Microsoft Learn
最新版来てました!
リリースノートにいきなり「という意味でしたか?」とか出てきてたり、AIが進歩しても翻訳は相変わらずのMSDNクォリティですが、ソフト本体は今のところいい感じです。
新機能はあまり使っていませんが、.NET 10とC# 14が普通に使えるようになったというのは大きいです。

Avalonia Accelerate

Avalonia Accelerate
順序的にはこっち先にやったんですが、Avalonia UIの追加ツールです。
無料版をひとまず入れてみました。
メールアドレス関連でちょっと躓くところがありましたが、それ以外はおおむね順調でした。


VS2026でも問題なく動きました!

浮き沈みランチャー2

ソリューション構成調整 by mifumi323 · Pull Request #11 · mifumi323/FLaunch2
さっき画面写真出したけど、.NET10&C#14に移行して、ソリューションもVS2026向けに切り替えました。
あと、書き忘れてたライセンス表記も。

ドラゴンクエスト10とfnmatch

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

テンの日!
…は、ともかくとして。

あばれこまいぬにひばしら

  • クエスト「天地雷鳴士の式/交わらぬ水魚」をクリアした!

ちょっとずつでもクエスト進めていくよ。
今回はお使いの最後にヨイちゃんからちょっとしたご挨拶があったぐらい。

fnmatch(Today I Learned)

PHP: fnmatch - Manual
ファイル名のパターンマッチに正規表現使うのだるいなーシェルとかで使うような簡単なやつ使えないかなーとか思ってたら、ありました。

Pythonにもあるぞ!
Rubyにもあるぞ!
C言語にもあるぞ!…って、これがたぶん元祖だろうな。

どこでも使われるような当たり前の機能にはちゃんと標準ライブラリがついているんですね。
確か全く別の名前だけど.NETにもほぼ同じやつがあったはず。

非公開ツールとドラゴンクエスト10

非公開ツール

アンパンマンの録画をアンパンマンDBと連携させる系のツールのリリースビルド、復活しました。
最適化を有効にしていると、使われていないクラスとコンパイラによって判断されたものが削除されるのですが、System.Text.Json.JsonSerializerが復元するクラスは静的解析ではすべてを把握しきれないので、最適化があるリリースビルドではJsonSerializerでの復元は禁止されてしまいます。
これを解決するのが、SourceGenerationContext。
まあ…詳しくは以下のリンクで。

System.Text.Json でソース生成を使用する方法 - .NET | Microsoft Learn

ドラゴンクエスト10(ァォィョッュ)

隠者クエスト指定場所

  • クエスト「隠者は精霊とともに/精霊の役割」をクリアした!

隠者のクエスト進めました!
今回は純粋に見回りだけだったのでボスバトルなし。
ただ、ボスと思われる存在がちょっと登場。
クリア報酬で隠者装備一式手に入れたのですが、錬金のためいったんミフミンに預けているのでまだ着ていません。

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

PHPUnit

ここTGWSで使っているテストツールのPHPUnitをバージョン9から10に上げました。
以前11に一気に上げようとして、必要な変更のあまりの多さに撃沈してしまったのですが、10までならひとまず大きなトラブルもなくスムーズに移行できました。
まあ、そのスムーズさで300ファイルほど修正が必要だったんですけどね。
ほとんどが機械的な置き換えで済むシンプルなものだったので、普通の置換やコピペで済ませました。
最近はAIエージェントとかもありますが、変なところで独創性を発揮しちゃうことが少なくないので、AIに求めるのは助言程度にして、今回は自分で作業をしました。

PukiWiki

いつまでも残ってたPukiWikiのコンテンツ、必要なページだけ普通のHTMLに移して、PukiWikiで作ったページは閉じました。
うちは自作のシステムが中心となって動いているサイトなので、よそのシステムが入り込んでいると、扱いにくかったんですよね。
しかも、いまやメンテナンスしていない、ほんのわずかのコンテンツにしか価値がないものに、フルスペックのCMSが入っているので、大げさすぎるって言うのもありました。
この移設により、めでたくただのHTML1枚に収まりました。
まあ、内部的には自作のシステムがHTMLを生成してたりするんですが、それでも実質1ファイルなんで、シンプルにはなりました。

同じような境遇のページに、Bomber丸World開発室があるんですが、こっちは残したいコンテンツがまあまあいっぱい眠ってそうなんで、ゆっくりじっくり作業していきます。

ドラゴンクエスト10とアンパンマン日替わり紹介botとPHPとfunyak

ドラゴンクエスト10(ァォィョッュ)

幻の海トラシュカ2025
お宝集めて大航海!「幻の海トラシュカ2025」 (2025/7/23)|目覚めし冒険者の広場
お宝集めだ!
今回はなんだか例年以上にラグがひどいみたいで、何が起きてるかわからないうちに何度も海に落ちました。
普段ならラグ読みで早めに回避したりしていたんですが、そもそもいつの間にか画面から自分がいなくなってますからね。
本当は全員分一気に行く予定でしたが、今日のところは一回だけで終わらせました。
報酬集めるならもうちょっと空いてから周回かな。

他の写真は以下から。…って程にも多くないけどさ。
写真置き場「2025/07/30」

アンパンマン日替わり紹介bot


まだ本番環境には反映してないですが、紹介botの本日の情報、短縮表記を試しています。
TwitterAPIの制限が本当に厳しくて、なるべく情報量を落とさない範囲で投稿数を減らしたいんですよね。
で、実際に同じ日付の投稿と見比べてもらえればわかると思うんですが、投稿数を2から1に圧縮できました。
効果あるんだからさっそく使おう…と言いたいところだったのですが…


画像もまとまっちゃうので、その他大勢の合成画像が異様に縦長になっちゃう!
こっちもうまく対応できてから、本番適用と行きたいところです。

PHP(Today I Learned)

文字列(という名のバイト配列)から画像を読み込む関数。
紹介botに出す画像はPNGとJPEGなんですが、将来的にはWebPも使う可能性があるので、imagecreatefrompngとかimagecreatefromjpegとかを一つ一つ使っていたらきりがないなって思ったんですよね。
これなら、ファイルをメモリに読み込むのは自前でやる必要はありますが、ファイルフォーマットは自動で判別していい感じに読み込んでくれるはずです。
とりあえずは、本当に使えるかどうかの確認からかな。

funyak

このプルリク、どうしよう。
セキュリティ上の修正なんだから、本当ならとっとと採用したいところなんですが、これ、ビルドは通るけど実際に実行するとエラーで落ちるんですよね。
動かなかったらもうセキュリティもへったくれもないわけで。
さすがに不採用というわけにもいかないから、自分でエラーをどうにかしてマージかな。

ドラゴンクエスト10とアンパンマンDBとSQL

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

バウギス

  • クエスト「竜と契約せし者」をクリアした!

しろいコキンも魔法使いと魔法戦士のレベル上げて竜術士になりました!
さすがに3回目なんでムービーはスキップしたんですが、見てなくてもクイズに正解さえすればいいんですね。

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

キャラ数検索、まだテストコード上でしか確認できていませんが、修正しました。
画面上で何パターンか確認してからアップしようと思います。

SQL

上記の問題の原因、SQLの条件句における型の不一致が原因でした。

((SELECT COUNT(*) FROM list_anime_chara1 WHERE list_anime_chara1.page_id = page_anime.page_id) + (SELECT COUNT(*) FROM list_anime_chara2 WHERE list_anime_chara2.page_id = page_anime.page_id) + (SELECT COUNT(*) FROM list_anime_chara3 WHERE list_anime_chara3.page_id = page_anime.page_id))=:p

こんなSQLを条件に入れていたのですが、この右辺の:pにPHPの整数を入れても、SQLiteの内部的な整数型とは一致せず、常時不一致扱いとなっていたのです。
左辺が単純な項だったら型が自動変換されて大丈夫だったんですが、サブクエリとかの複雑な式だと無理だったようです。
というわけで、以下のようなキャストを明示的に入れて、型を合わせるようにしました。

((SELECT COUNT(*) FROM list_anime_chara1 WHERE list_anime_chara1.page_id = page_anime.page_id) + (SELECT COUNT(*) FROM list_anime_chara2 WHERE list_anime_chara2.page_id = page_anime.page_id) + (SELECT COUNT(*) FROM list_anime_chara3 WHERE list_anime_chara3.page_id = page_anime.page_id))=CAST(:p AS INT)

ふにゃ1(開発状況)

次期バージョンのリリース準備中。

次回で最後の予定ですが、リリース作業を簡単にするためのスクリプトというのも用意してまして、次のようになっています。
publish.ps1(funya1_wpf)

詳細はダウンロードして見てもらうとして、PowerShellのスクリプトです。
プロジェクトファイルからバージョンを抜き出してビルドしてCompress-ArchiveでZIPに固めてます。
昔のプロジェクトはmsbuildを呼び出していましたが、今はdotnetコマンドを使っています。
浮き沈みランチャーから流用した関係で、後ろのほうにflaunch.zipの名前が残ってますが、最後のコメント群で、リリース時の最終チェックを行っています。
次で最終版のはずだからもう修正はいいかな?

TGWSAdmin


こんなこと書いたので、今日書いたことでも。

StatusMessage = $"予約ツイートの予約時刻「{tweet.TweetDate}」を大幅に過ぎています。";
StatusDetail = tweet.ToString();
new ToastContentBuilder()
.AddText(StatusMessage)
.AddText("予期せぬ実行を防ぐため、予約時刻を100年後に延期します。")
.Show();

こんな感じ。
アプリ通知の内容 - Windows apps | Microsoft Learn
昔実装したやつだから新しくはないけど、StatusMessageプロパティで一度受け止めて、メッセージ内容を残すようにしました。
トースト通知、意外と目立たないんですよね…。

ドラゴンクエスト10とアンパンマンDBとNode.js

ドラゴンクエスト10(ァォィョッュ)

海上に浮かぶ夢幻郷
夢幻郷2回目!
実は時間になっても見えなくて、当てずっぽうでパシャパシャやってたんですが、見えてない写真で成功扱いになってしまいました。
これは成功後ちょっと待って見えるようになったから改めて取り直したやつ。
見えずに成功したやつは残っていません。

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

来週の放送情報。
例年よりちょっと遅くなりましたが、無事映画のテレビ放送となりました。

Node.js

うちのサイトの開発環境では、Node.jsを使っています。
だいぶ古くなってきたんで、新調したいと思うじゃないですか!
バージョン一気に上げすぎると普通どこかしらエラーが起きて動かないじゃないですか!!
検証必要じゃないですか!!!

しました。
何もエラー起きませんでした。
生成された成果物もまったくもって問題なしです。
こんなことってある!?

ユーザーページとfunyan

ユーザーページ

急ですが、ユーザーページの新規登録&パスワード変更画面のパスワードフォームに簡易的ですがパスワード強度チェックを付けました。
ないよりましレベルの簡易的なものなので、このチェックに頼るよりはパスワードマネージャーとかでパスワードを作ることをお勧めします。

実装は、ある程度AIに頼りながら書きました。
ただこれ、自分で書くよりAIに書かすより、誰かが作ったライブラリを探したほうが良かったかもなと思ってます。
人が気軽にAIに頼む程度の要求仕様じゃAIも気軽で雑な実装しか書かないし、それが正しい保証もない。
ライブラリなら、しっかり作り込まれたものであればという前提は必要だけど、仕様は練り込まれ、テストも入念に行われて、サンプルも充実し、使いやすく整備されているはずです。
と考えると、AIを使うのは直接コーディングさせるよりも、便利なライブラリを探させるのに使ったほうがいいのかも。

funyan

別に実装は進んでないです。
さっきあんなこと言ったけど、こっちのプロジェクトはむしろ直接コーディングさせるほうでAI活用したいんで、AIの都合に合わせた構成にしたいなーとか考えています。
例えば今GitHubではAmazon Q Developerを入れていますが、こいつはIssueを割り当ててやると、作業用ブランチを作って作業して、元のブランチへプルリクエストを出します。
だったら元のブランチになる候補は数を絞ったほうがいいなということで、フェーズごとのブランチを廃止して、小さな機能ごとでも開発が終わった分はmasterブランチに統合していくことにしました。

Phase2 by mifumi323 · Pull Request #6 · mifumi323/funyan
ということで、このプルリクエストです。
この日記を書くタイミングでプルリク出したので、AIのレビュー待ちでマージは保留しています。

PHPとCSSとアンパンマンDB

PHP

[PHP]DateTimeのtimezone_typeって何だ? #PHP - Qiita
記事投稿しました。
アンパンマンDBで日時の出力をDateTimeそのままjson_encodeしてみたら見たことないプロパティが出て来たんで不思議だったんですよね。
で、json_encodeに限らず出てくるので、題材としては変数の中身を見るためにより広く使われるvar_dumpのほうを挙げた次第です。
それはそうと…

【PHP】Qiita デイリーいいね数ランキング【自動更新】 #LGTM - Qiita
なんか1位になってました。
他誰もいないけどな!
鶏口となるも牛後となるなかれということわざがあるけど、鶏どころか単細胞生物ですな。

CSS

古いスタイルシート整理してました。
レスポンシブ対応前の古いページ用の古いスタイルシートもまだ残しているんですが、さすがに数が少なくなってきたので名前を変えたり。

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

コメントに関するちょっとした機能実装中。
関係あるのは一部の人に限られますが。

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 の使用

答えは結局サンプルコードの中にあったのです。
使うのはCanvasDeviceCanvasBitmapです。
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年ぶりか…。

<前 次>