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

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

<前 次>

バリューサーバーとAvalonia UI

バリューサーバー

ソフトウェアメンテナンス | メンテナンス・障害 | Value Domain(バリュードメイン)
2月にPHP8.4がうちのサーバーにもついに搭載されるようです。
既にPHP8.5も正式リリースされているので周回遅れ感はあるのですが、Deprecated属性が使えるようになるのは個人的に熱い!
結構既存の機能をDeprecated扱いにして段階的に削ったりしていましたからね。
私の作業のスケジュールとしては、手元のコードを8.3/8.4両対応にして自動テストを回しつつ、正式搭載後に切り替えて段階的に8.3のコードを置き換えていくことになるかな。

Avalonia UI

NuGet Gallery | Avalonia.ReactiveUI 11.3.8
浮き沈みランチャー2用に使おうとしていて、何もコーディングが進まないままほったらかしている間に、Avalonia.ReactiveUIが非推奨になっていました。
で、今後何を使うべきなのかというと、ReactiveUI.Avalonia。
同じじゃないですか!!

とりあえず、NuGetで入れなおして名前空間を入れ替えるだけで現状は済みそうでした。
開発が進む前に気付いてラッキーだったのか、前提が変わるまで進まなかったのがだらしないのか…

Qiitaとカービィのエアライダーとドラゴンクエスト10

Qiita

私がXServerを選ばなかった理由
無事公開されました。

カービィのエアライダー


オンラインとエアライドのクリアチェッカー埋め。
壊れかけの状態でゴールするお題に壊れやすいペーパースターで挑んだら、壊れかけを通り越して一撃死しました。
この後、タフなバトルチャリオットで場外ダメージを使ってダメージ調整し、クリアしました。


面白いのと言えば、コックカワサキで攻撃用の料理を作って自爆するやつ。
狭い通路で雑に乱打すれば確率でどうにかなります。
このお題のときにブルタンクを初めて長距離で使ってみたんですが、めちゃくちゃ癖が強い…というか、私自身の操作も癖が強かったですね。
ドリフト中に無意識にスティックを斜め後ろに倒してしまって、必要以上に減速しちゃってたんです。
それに気付くまでは、調子よく1位を走っていたと思ったら急にノロノロ運転になって最下位に転落するなんてことが何度もありました。
ドリフトは原則を抑えて曲がる走法なんだから、スティック倒す方向を意識するようにしたら、ずっと調子よく走れるようになりました。

(他プレイヤーの名前が出るので一応畳み)


オンラインはパドックでやってたんですが、誰でも入れる設定にしていたら、今日は何回か人が入ってきました。
何度かやり取りしてみて思ったけど、ゲーム内のメッセージ機能だけだと意思疎通満足にできないですね。
一応、やめる・続けるぐらいの意思表示はできるけど、どのモードで遊びたいかも聞けない。
人と遊ぶのも楽しいし、今日はいい人ばかり来てくれたけど、配信とかボイスチャットとかで繋がりながらじゃないとパドックは厳しいかも。
今後はとりあえずパスコード付けて一人パドックにしよう。


他にはこんな感じで一気に敵を倒す系のお題やったり。
クラッシュとかボムとかの一瞬で広範囲爆撃する技を、どこで使うのかというのがポイントでしたね。
爆発できるタイミングで周りに誰もいなくて結構周回数かかってしまいました。
残すところオンラインは3つ、基本の3モードはそれなりに残ってるけどオフラインでゆっくり埋めていけばいいかな。

他の写真は以下から。いつものごとく他のクリアチェッカー写真とかもあるよ。
カービィのエアライダー(2025/12/21)の写真

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

帝国の闇サンタたち

  • クエスト「もうひとつの星夜祭2」をクリアした!

イベント始まって一週間だしボスも伏せなくていいか!
しろいコキンもクリアしました。

ジングルジャケットセット(うしろ)
ァォィョッュは帽子が髪に埋まっちゃったけど、しろいコキンはまあまあいい感じ。
ポニテが収まるのか出るのかはっきりしないのは微妙だけど。

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

ゲーム記とQiita

ゲーム記

Nintendo Switch 2の画面写真がキャッシュ効いてなかったので、効くようにしました。
初回アクセス時は実感ないかもしれませんが、ページを戻ったり進んだりして同じページを開きなおしたときなんかは結構わかりやすく変わっていると思います。

Qiita

AIで記事を書く趣味はありませんが、AIに助言を受けるのはありだと思っているので、ちょっとChatGPTくんに読んでもらって微調整していました。

Avalonia UIとカービィのエアライダー

Avalonia UI

Avalonia UIでタイトルバーなしウィンドウ
無事記事公開しました。

カービィのエアライダー


最後のステージ手前でずっとでなおしリセマラ粘ってたらついにオール↑出た!!
これでロードトリップのクリアチェッカー完了!!
そのあとはまあ、すっきりと3周目もラスボスやっつけてクリア。


そしてエアライドもクリアチェッカーいくつか開けました。
ケイビオンの横穴探しも兼ねてフリーランをいろんなマシンで頑張ってみたり。
後はコックカワサキで順位を捨ててカレー投げるのに全力を注いだり…もしたけど、違うチェックばかり空きまくったなあ。

他の写真は以下から。
カービィのエアライダー(2025/12/13)の写真

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

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

来週の放送情報。
きしめんさん再登場早いな。

Avalonia UI

本当は今日記事書いてしまう予定だったんですけど、できないと思っていた最大化最小化禁止が、つい最近の更新で簡単にできるようになったことがわかりました。
ということで、記事書き直し中です。
さすがに明日には書き終わるかな。

ドラゴンクエスト10(全員)

第24回アストルティア★ハッピーくじ『年末大勝負くじ☆2025』 (2025/12/5)|目覚めし冒険者の広場
くじ買った!

ドラゴンクエスト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(システム)

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

<前 次>