「PHP」に関する日記(2)

<前 次>

アンパンマンDBとアンパンマンワンドロ

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

来週の放送情報。
そういやあかちゃんまんは昔かきくけことの絡みもあったな。

アンパンマンワンドロ

提案者本人の希望により、お題ひとつ削除しました。

で、この作業をしてた時に気付いたんですが、先日のTableOfContents修正のタイミングで、ワンドロの企画サイトが動かなくなっていました。
TableOfContentsはPHP8.3以上対応で、ワンドロ企画サイトは設定が8.2のままになっていたのでした。
これはうかつだった…!

TableOfContents

mifumi323/table-of-contents - Packagist
Mifumi323\TableOfContents、Packagistで公開しました。
うちのサイトで使っているものはHtmlBuilderとAutoPageを組み合わせて極限まで楽できるようにしてあるのですが、OSSとしてはそこまでするのは責任範囲広げすぎなので、目次を生成する部分だけを抜き出してきました。

あと、今回はREADMEとかを英語で書くようにしてみました。
作ってる本人が日本語話者なんだから日本語で書いたほうが正確に意図を記述できるというのが私の考えなのですが、それはそうとして、読む側は英語話者が圧倒的に多いわけでして。
ほとんど機械翻訳ですが、同じ意図を伝えられそうかというチェックはしています。

で、うちのサイトに残されたTGWS\TableOfContentsのほうは、Mifumi323\TableOfContentsと同じ部分は抜き去られて、HtmlBuilder&AutoPageとの繋ぎ込みだけの役割になったので、実質行数4行まで小さくなりました。
テスト済みの長いコードが外部に出て行ったので、テストカバレッジは下がりました。

ドラゴンクエスト10とTableOfContents

ドラゴンクエスト10(ミフミン)

月世界

  • クエスト「大盗賊の伝説/カンダタ月へ行く」をクリアした!

ついに来た!
素朴なからくりで…第二宇宙速度を超えた!!

(なんか月が衝撃的過ぎてボスのネタバレとか些末なことにも思えるけど)

レプティリア

  • 【クエスト】「大盗賊の伝説/カンダタ月へ行く」レプティリアたちをはじめて倒した!

宇宙のガチャコッコ!
姫を助けに行ったら襲い掛かってきたという定番の流れなんだけど、むしろ倒されてからのほうが不憫でした。
カンダタなんちゅうところに飛んでくんねん!

どうやら月に来ただけで終わりではないようで、もうちょっとだけクエストがあるようです。

他の写真は以下から。コスモ○○なモンスターたちも。
写真置き場「2025/10/14」

TableOfContents(PHP)

まだコミットできる状況じゃないのですが、うちのサイトで使っている目次作成機能、PHPのライブラリとして公開するつもりです。
そのままだとTGWS専用機能に依存しているので、そこら辺を抜き取って純粋に目次を作成するだけの機能にしています。

アンパンマンDBとmifumitterとXfolioと日記

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

BGMの追加。

アンパンマンの日なので、「アンパンマン放送37周年おめでとう」を追加しました。

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

mifumitter(非公開ツール)

歴史的な理由で残ってたTwitterAPI1.1&2のデータを新しい形式に変換しました。
古いAPI用の処理ももういらないんですが、うっかり呼び出されてたりするといけないので、いったん非推奨として残して、時間を空けてから完全に削除します。
このあたり、非推奨用の属性として#[\Deprecated]があるんですが、うちのサーバーはちょっとPHPのバージョンが低いので、ドキュメントコメントとtrigger_errorで対応しています。

Xfolio

昔描いたポケモン系 - 松田美文のポートフォリオ
昔Pixivとかに上げてたやつをまとめてみました。
一応ポートフォリオだし、ゲーム作品の紹介とかをしてもいいのかもしれない。

日記

今後Xfolioに何か投稿するたびに日記に書くかもしれないし、日記のカテゴリに追加しておきました。

mifumitterとアンパンマンDBと日記とphpLiteAdmin

mifumitter(非公開ツール)

邪魔なものを見えなくするミュート機能の強化とか、API実質停止で無意味になった機能を消すとかしてた。
自分専用だけど、むしろだからこそ、使い勝手良くしたいんですよね。

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

商品情報の記入とか、タイトルの改行ポイントの指定とかひっそりやってました。

日記

昨日のと関連してですが、リンク先の本来のタイトルとリンクテキストが食い違う場合、aタグのtitle属性に本来のタイトルを入れていたのですが、titleってそういうことに使うものだったっけ?って思っていったんやめることにしました。
ここは今のところ信念ないのでまた方針変更あるかも。

phpLiteAdmin

うちで使っているデータベースはSQLiteで、管理にはphpLiteAdminを使っています。
しかし、数年前に更新が止まっており、最新のPHPに対応していません。
ということで、こっちで勝手に修正しつつ使っています。
今回は、大昔のPHPで使われていたwhileとeachの組み合わせを、foreachに置き換えるなど。

と思ってたけど、今ソース管理のリポジトリ見に行ったら正式版になってないだけで普通に去年まで更新されてたな。

PHPUnit

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

ドラゴンクエスト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

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

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内部処理

ここんとこ自動テストが開始まで時間がかかるようになったので、テスト初期化処理の改善をやっていました。
まずは、一部のテストでしか使わないファイルのコピー処理を実際に使うまで遅延させて、部分的なテストの場合に不要なコピーをしないようにするところから始めました。
ただ、計測したところ、ファイルコピーにはさほど時間はかかっておらず、逆にテストの邪魔になるファイルの削除が時間的には支配的でした。
ファイル検索に時間がかかっているようなので、RecursiveDirectoryIteratorあたり使ったらどうかなーとか思っています。

アンパンマンDBとそれいけ!アンパンマン ばいきんまんとえほんのルルン

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

「#2025年はアンパンマンでこんなエピソードが観たい」の追加です。

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

PHP: fputcsv - Manual
> escape が空の文字列("")以外に設定されているとき、 » RFC 4180 に準拠しない CSV が生成されたり、PHP の CSV 関数を介してラウンドトリップ(往復変換)でデータが壊れる可能性があります。
CSVが変な理由、これでした。
エスケープ方法設定したらバグるから設定消さなきゃいけないって完全に罠じゃねーか!!
アンパンマンDB以外のCSV出力機能も同じ罠踏んでそうな気がするので、他も確認してから修正版アップしようと思います。

それいけ!アンパンマン ばいきんまんとえほんのルルン


DVD買いました。
家でゆっくり見ても結局何食ってるのかよくわからなかった。

PHP8.3とドラゴンクエスト10

PHP8.3

メテオンもどきのあれ以外は特に問題なさそうだったので、本番適用。
今のところ問題は起きてなさげ。
PHP8.4もリリース間近ですが、しばらくは様子見です。

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

7.2で追加された強ボス一通りやってみました。
まあ基本的には昔の強ボスと同格なので、そんなに苦戦せず。

(ストーリーボスのネタバレなので)

邪教祖サダク強 ショック

  • 【強モード】邪教祖サダク強をはじめて倒した!

大切な家族を失った遺族の弱みに付け込んだド畜生。
こちらのレベルが高いこともあって、特に強さは感じなかった。

スイーツトロル強 ショック

  • 【強モード】スイーツトロル強をはじめて倒した!

飴舐めてるやつ。
強モードになっても飴舐めまくってたけど、まめちしきでは飴への言及なし。

グレイブディガー強 ショック

  • 【強モード】グレイブディガー強をはじめて倒した!

なんかピラミッドの奥で出くわしたやつ。
こいつだけちょっと強く感じた。
超ちからためからのノータイムはげしく斬り裂くで一度死んだ。

魔勇者アンルシア強 ショック

  • 【強モード】魔勇者アンルシア強をはじめて倒した!

本編では地獄の連戦であまりにしつこくしんどかった魔勇者。
強ボスでは闇のころももなく連戦もなく、聞き分けのいいお嬢様でした。
多分ネルゲル強のほうが強い。

キラーマジンガ ショック
そしてこちらが特に関係のないキラーマジンガ。

他の写真は以下から。
写真置き場「2024/11/11」

メテオンもどきとPHP8.3とNeoMupl

メテオンもどき

ゲーム本体はもうとっくに動かないんだけど、微妙な警告が出ていました。
PHP8.3の動作確認中だったのですが、バージョンアップの影響かどうかは不明です。
どのみち、良い傾向とは言えないので、修正しています。

PHP8.3

というわけで、ステージング環境的な場所で、動作確認中。
表示時にエラーが起きないかどうかだけなら、クローラーを走らせればいいだけなので楽。
まあ、でたらめに走り回るので、エラー発見効率はお察しですが。

NeoMupl

コミットメッセージが紛らわしいですが、アンドゥ・リドゥ機能の実装を始めました。
GitHub Copilot を試しに使ったんですが、チャット機能で生成させると微妙で、履歴の一動作に相当するインターフェースを作ってやると、それに沿っていい感じに作ってくれました。
アンドゥ・リドゥ機能自体はエディタ系のプログラムでは定番なので、お手本となるコードも豊富なんでしょうね。
こっから先の、各動作を実際にやり直す機能は、さすがに自力で実装しようと思います。

HTMLとアンパンマンDBとPHP8.3

HTML

とりあえず主要なファイルは一通りアップ終わりました。

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

また発動していないバグ修正。
話数が空欄じゃなくて「0」になっていた場合に、「第0話」とかになってしまうんですが、アンパンマンDB的には「0」も空欄扱いしたいので、空欄の処理に飛ぶようにしました。
さっきのHTMLと一緒にアップ済みです。

PHP8.3

もうそろそろPHP8.4の正式リリースも近そうですが、うちはまだ8.2だったので、ひとまず8.3まで上げることにしました。
とりあえず開発環境での動作は一部のライブラリ以外はコードの修正なしで大丈夫そう。
本番サーバーはオプションを変えるだけだからいいとして、DockerとCI環境も対応しておかないと。

アンパンマン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割ほど早く終わりました。

SearchQueryStructure

実装は特に進まず。
やっぱりエラー処理となると、やみくもに実装を始めるより、ちゃんと考えないと詰みますからね。
エラーが起きたときも、途中までのパース結果はエラー本体とともに返したい、というのは昨日言った通り。
どこでエラーが起きたかというのも返せると、修正もしやすくなりますね。
となると、字句解析の時点で、各シンボルに位置情報を埋め込む必要がありそう。
あと、空文字列を渡されたときの特別対応もあっていいかな。

SearchQueryStructure

旧来の機能をおおむね移植完了。
ただ、異常系に対しては、途中までの結果を返すのではなく、例外を投げたいので、もうちょっと調整が必要ですね。
できれば、専用の例外を作って、例外オブジェクトの中に途中までの結果を詰め込んで、例外をキャッチすれば失敗時も旧来の動きにできるという方向で作りたいですね。

SearchQueryStructure

やっと作り始めました。
美しい設計で作り直せるはずだと夢想して、「で、美しいって具体的には?」で止まって、長いことほったらかしになっていました。
これ、アンパンマンDBの検索機能の機能強化に使おうと思ってたんですよね。
だから、美しさを目指していつまでもスタートラインでぐるぐる回ってちゃアンパンマンDBも変われんのです。

ともかく、最初にやるべきことは旧来のコードのコピペと最初に決めたし、出力が美しければ中身が泥水でも結果は変わらんので、とりあえずほぼコピペでどうにかなる部分だけ持ってきました。
既にINodeインターフェースを用意していることからもわかるように、最終的な結果はINode実装クラスで返そうと思っています。

アンパンマンDB

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

昨日のふくろうおじさんの流れで今度はおじいさんを追加しました。

こっちはコラムから転記組。
元気倍率アップ系ですね。
300より200のほうが見た目豪華なのがポイント。

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

テストが不安定な問題、直接の原因は一応わかりました。
エラーコード0xC0000005(-1073741819)、アクセス違反です。
アクセス違反なら何でもこのエラーが出るので、このエラーコード一つで真の原因の特定はできません。
傾向として、カバレッジ計測なしだとエラーは起きず、計測ありのときだけエラーが出ることがあるので、カバレッジと何かの競合だと思われます。
落ちる部分のコードがやってることと言えば、同じPHPスクリプトを条件を変えて2回呼び出していることなので、ここで何らかのロックがかかってしまってカバレッジを邪魔しているのでは?と考えています。
完全解決までは、カバレッジ計測の頻度は減らすかなぁ。

目次

サーバーサイドでの自動生成の目次の仕組みを作って、各ページに適用中。

うちのサイトって、昔はいろんなページに自動生成の目次がありました。
ただ、それはInternet Explorer、それも古いバージョン専用だったので、もう動いてなかったんですよね。
静的HTMLファイルに労せず目次を取り付けたいという動機でJavaScriptを使ったのですが、動かなきゃ世話ないですね。
私の思想として、サイトの基本的な機能はなるべくJavaScript抜きでも動作するようにしたいというのがあり、この思想にも反する仕組みでした。
一方で、URL上は.html拡張子に見えるファイルは、現在は大部分をHTMLファイルに見せかけたPHPファイルを裏で動かしています。
詳しく言うと、ただのHTMLファイルに見せかけたPHPファイルが出力したただのHTMLファイルを最終的に表示しているのですが、とにかくサーバー側でいったん動的な処理を挟んでいるわけです。
この動的な処理の部分に目次自動生成を差し込めば、JavaScriptに頼らず、ブラウザに依存せず、それでいて労せず目次を作れるのです。

今のところ、自動生成の仕組みはできたので、今は各ページに適用するのを頑張っているところです。
先ほどまで自動化だの労せずだの言っていましたが、目次以前にまずHTMLそのものを修正しないといけないのです。
PHPを使う仕組みに切り替えた時点から、HTMLも4.01から5をすっ飛ばしてLiving Standardに切り替えているのです。

…切り替わってないのです!

PHPに切り替えた時点で、自動生成のヘッダとフッタにより、ガワだけはLiving Standardになりましたが、中身はほとんど手付かず。
4.01のままのHTMLからじゃ、Living Standard用のシステムで目次を自動生成はできないのです。
ブラウザはだましだまし動いてくれますが、ブラウザほど気を利かせてない自作システムは、だませないのです。

ということで、労せず目次を自動生成するために、現在、労しています。

<前 次>