「PHP」に関する日記

次>

キャラ倉庫とスーパーカービィハンターズとバイオハザード レクイエム

キャラ倉庫

見せない特別ページ、単にErrorPageErrorを出すだけの実装にしていたんだけど、それだとソフト403(許可しないというメッセージが出るけどステータスコード200)になってしまうので、LocalSettings.phpを修正してちゃんとHTTP 403を出すようにしました。

// 一般ユーザーには見せないページ
$wgHooks['SpecialPageBeforeExecute'][] = function ( $special, $subPage ) {
	if ( $special->getUser()->isAnon() ) {
		switch ($special->getName()) {
			case 'Allpages':                 // ページ一覧
			// 中略
			case 'Whatlinkshere':            // リンク元
				break;
			
			default:
				HttpStatus::header( 403 ); // ←ここを追加
				throw new ErrorPageError( 'badaccess', 'badaccess-group0' );
		}
	}
	return true;
};

スーパーカービィハンターズ


そうびコンプ!
強化はゆうしゃミッションに係わるものだけ完了しています。
この先はしっかり戦って成績残していく必要があるなァ。

他の写真は以下から。
スーパーカービィハンターズ(2026/08/23)の写真

バイオハザード レクイエム

2026_08_23_22_59_43.png
今回はしっかり進展あった!
六角スパナの使いどころやっと見つけたのもですが、リストタグLv.2も手に入れて探索範囲が広がりました!

(ネタバレとか)

2026_08_23_22_51_34.png
以前太陽のクォーツを取ったときに見逃していたアイテム、今回、何の気なしに同じ場所再訪して適当にキー連打しながら歩いてたら知らない間に入手してました。

2026_08_23_22_53_04.png
この手帳のヒントで臓器輸送ケース開けて人工肺ゲット!

2026_08_23_23_00_05.png
六角スパナで扉開けた先で人工心臓もゲット!

2026_08_23_23_02_15.png
で、いつぞやの死体にはめ込んだら、動き出しました。
これがボスかと思ったら、案外弱かった!

2026_08_23_23_03_05.png
ということで、リストタグLv.2ゲット。

次回はリストタグLv.2使うところからですね。
動画は最低限の編集だけしてアップ中。

他の写真は以下から。
バイオハザード レクイエム(2026/08/23)の画面写真集

kawax/niconicoと浮き沈みランチャー2と美文のキャラ倉庫とC#用単位・数値変換クラス

kawax/niconico

Allow nullable search queries and update CI workflows (#6) · kawax/niconico@a867729
無事本家に取り込まれたようです。
…って、ついでの変更多いな。

浮き沈みランチャー2

実際使っていかないと開発のモチベも上がんないしなーということで、実際使いつつ開発も続けていくため、開発用データと実際使うためのデータを分けて扱うようにしました。

#if DEBUG
    private const string AppFolderName = "FLaunch2.Debug";
#else
    private const string AppFolderName = "FLaunch2";
#endif

まあ、プリプロセッサを使った古典的な制御ですな。

で、モチベがわいた結果、気になってきたやつ。
#102は実行は非同期でやってUIは即閉じれば良さそう。
#103は初期実装時の設定がおかしかっただけなんで、プロパティ調整でいけるかな。
#104は、イマドキらしく余白の多いオシャレなデザインに寄せた結果、情報密度が下がり、マウス動かす量も増えて微妙だなってやつ。
オシャレに振るのも悪くないとは思うので、確定的な変更ではなく、ユーザーのお好みで変えられるオプションとして課題立てました。
オプションなら、前作以上のギュウギュウ詰めにできたっていいかもね。

美文のキャラ倉庫

美文のキャラ倉庫
Wiki版キャラ倉庫、正式公開しました。
調整したいことはまだあるけど、情報自体はすでに全部入っていて、これ以上オフラインで粘ってもいいことないなって思ったんで、現状で公開しました。
以前も言った年齢順大きさ順とか、人気のページとか、やってみたいですね。
全部情報が入ったとはいえ、Wikiのやり方に合わないものを無理やり入れている部分もあるので、そのあたりの調整を先にやっといたほうがいいかも。

C#用単位・数値変換クラス

年齢順大きさ順といえば、キャラ倉庫の前前前世にあたるCharaBoxに搭載されていて、その部分は一応ライブラリとしても公開されています。
しかし、MediaWikiで使うLuaと違うというのは仕方ないにしても、文字コードがShift_JISだし、C#2向けに作られているし、今となっては使いにくい代物です。
Luaに移植する前に、今使えるライブラリとして、形を整えてみたいですね。
テキストテンプレートかコードジェネレータ使えばdouble以外の型にも対応できるか?

kawax/niconicoとcurl

kawax/niconico

修正自体は一瞬だったけど、プルリク受け付けない設定になってた!
AI Slop(AIによる低品質な量産品)対策でGitHubに搭載されたとは聞いていたけど、ここで出会うことになるとは。
メールは通じそうだったので、そちらで相談しています。

curl

で、念のためテストも回したんだけど、「cURL error 60: SSL certificate problem: unable to get local issuer certificate」というエラーが。
PHPに同梱されている証明書が若干古いのか、新しい証明書のhttpsにはつながらないみたいだったんですね。
curlのCA bundleから最新の証明書落としてきてPHPのcurlに登録して解決。

美文のキャラ倉庫とkawax/niconicoと日記

美文のキャラ倉庫

基本データ表示のためのLuaスクリプトほぼできた!
どうせサイトを公開したらスクリプトも全体公開になるのでソースコード置いときます。

(長いから折りたたむよ)

Module:BasicData

local p = {}

function p.process(frame)
    local args = frame:getParent().args
    local result = p.generate(args)

    return frame:preprocess(result)
end

function p.generate(args)
    local string_utils = require('Module:StringUtils')
    
    local fields = {
        { key = 'ふりがな', val = args['ふりがな'] },
        { key = '正式名称', val = args['正式名称'] },
        { key = 'フルネーム', val = args['フルネーム'] },
        { key = '英字表記', val = args['英字表記'] },
        { key = '他の名前', val = args['他の名前'] },
        { key = '公式サイト', val = args['公式サイト'] },
        { key = '登場作品', val = args['登場作品'] },
        { key = '種族', val = args['種族'] },
        { key = '性別', val = args['性別'] },
        { key = '年齢', val = args['年齢'] },
        { key = '大きさ', val = args['大きさ'] },
        { key = '一人称', val = args['一人称'] },
        { key = '二人称', val = args['二人称'] },
    }
    
    local info_rows = {}
    local cargo_rows = {}

    for _, field in ipairs(fields) do
        -- 値が存在し、空文字列でない場合のみ行を生成
        if field.val and field.val ~= '' then
            local key = field.key
            local value = field.val
            if key == 'ふりがな' then
                local sortkey = string_utils.sortkey(value)
                table.insert(cargo_rows, string.format('Furigana = %s', value))
                table.insert(cargo_rows, string.format('FuriganaSort = %s', sortkey))
                if args['表示用ふりがな'] and args['表示用ふりがな'] ~= '' then
                    value = args['表示用ふりがな']
                end
                value = string.format('%s{{DEFAULTSORT:%s}}', value, sortkey)
            elseif key == '登場作品' then
                local titles = mw.text.split(value, '、', true)
                local converted_titles = {}
                for _, title in ipairs(titles) do
                    if title == 'ふにゃ(ゲーム)' then
                        table.insert(converted_titles, '[[ふにゃ(ゲーム)|ふにゃ]][[Category:登場作品:ふにゃ]]')
                    else
                        table.insert(converted_titles, string.format('[[%s]][[Category:登場作品:%s]]', title, title))
                    end
                end
                value = table.concat(converted_titles, '、')
            elseif key == '種族' then
                local kinds = mw.text.split(value, '、', true)
                local converted_kinds = {}
                for _, kind in ipairs(kinds) do
                    table.insert(converted_kinds, string.format('[[%s]][[Category:種族:%s]]', kind, kind))
                end
                value = table.concat(converted_kinds, '、')
            elseif key == '性別' then
                value = string.format('%s[[Category:性別:%s]]', value, value)
            end
            table.insert(info_rows, string.format('<tr><th>%s</th><td>%s</td></tr>', key, value))
        end
    end


    local result = ""
    
    if next(info_rows) then
        result = string.format("%s<table class=\"wikitable\">%s</table>", result, table.concat(info_rows, ""))
    end
    
    if next(cargo_rows) then
        result = string.format("%s{{#cargo_store:_table = BasicData|%s}}", result, table.concat(cargo_rows, "|"))
    end

    return result
end

return p

Module:StringUtils

local p = {}

function p.sortkey(furigana)
    if furigana == "" then return "" end

    local sortkey_table = {
        {"が", "か"}, {"ぎ", "き"}, {"ぐ", "く"}, {"げ", "け"}, {"ご", "こ"},
        {"ざ", "さ"}, {"じ", "し"}, {"ず", "す"}, {"ぜ", "せ"}, {"ぞ", "そ"},
        {"だ", "た"}, {"ぢ", "ち"}, {"づ", "つ"}, {"で", "て"}, {"ど", "と"},
        {"ば", "は"}, {"び", "ひ"}, {"ぶ", "ふ"}, {"べ", "へ"}, {"ぼ", "ほ"},
        {"ぱ", "は"}, {"ぴ", "ひ"}, {"ぷ", "ふ"}, {"ぺ", "へ"}, {"ぽ", "ほ"},
        {"ゔ", "う"},
        {"ぁ", "あ"}, {"ぃ", "い"}, {"ぅ", "う"}, {"ぇ", "え"}, {"ぉ", "お"},
        {"ゃ", "や"}, {"ゅ", "ゆ"}, {"ょ", "よ"}, {"っ", "つ"}, {"ゎ", "わ"},
        {"あー", "ああ"}, {"いー", "いい"}, {"うー", "うう"}, {"えー", "ええ"}, {"おー", "おお"},
        {"かー", "かあ"}, {"きー", "きい"}, {"くー", "くう"}, {"けー", "けえ"}, {"こー", "こお"},
        {"さー", "さあ"}, {"しー", "しい"}, {"すー", "すう"}, {"せー", "せえ"}, {"そー", "そお"},
        {"たー", "たあ"}, {"ちー", "ちい"}, {"つー", "つう"}, {"てー", "てえ"}, {"とー", "とお"},
        {"なー", "なあ"}, {"にー", "にい"}, {"ぬー", "ぬう"}, {"ねー", "ねえ"}, {"のー", "のお"},
        {"はー", "はあ"}, {"ひー", "ひい"}, {"ふー", "ふう"}, {"へー", "へえ"}, {"ほー", "ほお"},
        {"まー", "まあ"}, {"みー", "みい"}, {"むー", "むう"}, {"めー", "めえ"}, {"もー", "もお"},
        {"やー", "やあ"},                   {"ゆー", "ゆう"},                   {"よー", "よお"},
        {"らー", "らあ"}, {"りー", "りい"}, {"るー", "るう"}, {"れー", "れえ"}, {"ろー", "ろお"},
        {"わー", "わあ"}, {"ゐー", "ゐい"},                   {"ゑー", "ゑえ"}, {"をー", "をお"},
    }

    for i, v in pairs(sortkey_table) do
        local from = v[1]
        local to = v[2]
        furigana = string.gsub(furigana, from, to)
    end
    
    return furigana
end

return p

まあ、おおむね引数で渡された項目を表に表示して、一部項目に特殊対応を入れている程度です。
ソートキー生成は、アンパンマンDB用にPHPで作っていたものをLuaに移植したもの。
文字列連結を繰り返すと遅くなるらしいので、ある程度はテーブルやstring.formatを使って連結を減らしています。
どこまで効果あるのか知らないですけどね。

欲を言えば、年齢や大きさも特殊対応入れたい。
昔作ったC#用単位・数値変換クラスをLuaに移植して、年齢順一覧とか大きさ順一覧とか作りたいんですよね。
ただ、ここで欲張ると公開がさらに先になっちゃいますからね。

kawax/niconico(TGWS内部処理)

PHPのバージョンを8.5に上げたいとか言ってましたが、思わぬところで問題が出ました。

kawax/niconico: ニコニコ動画API

ニコニコ動画の情報取得に使ってるこのライブラリ、誤動作とか致命的なエラーはないんですが、PHP8.4でDEPRECATEDが出るようになったのです。
場所を修正方法は把握していて、niconico/src/Search/Query.phpの16行目と、同29行目のパラメータです。
これが、null許可しないと明示されているのに初期値null扱いされているので、将来のバージョンでエラーにするから今のうちに直しとけよという警告を出してくれているというわけです。
昔のバージョンでは、null許可すると明示しなくても初期値nullにしておけば、暗黙的にnull許可扱いにしてくれていたんですが、それをやめることになったんですね。
だから、修正方針としては以下のように、型指定に「?」を付けて、null許可を明示します。

-    public function __construct(array $query = null)
+    public function __construct(?array $query = null)
-    public static function create(array $query = null): static
+    public static function create(?array $query = null): static

…というIssueとプルリクを明日出しとこう。そうしよう。

日記

さっきDIFFっぽいもの書きましたが、DIFFとしてのシンタックスハイライトは入れていません。
「```diff-php」とやればPHPのDIFFが出ると期待したんですが、コードブロック機能が壊れてしまいました。
なので、今は「```php」として、普通のPHPコード扱いでシンタックスハイライトを入れています。
今使っているシンタックスハイライトがDIFFに対応しているのかはわからないのですが、コードブロック機能が壊れるのは避けたほうがよさそうな気がします。
このコードブロック機能は私が作ったTgwsMarkの機能なんで、Issueとプルリクというより、自分で直すべき案件ですね。

映画ちいかわ 人魚の島のひみつとMifuminator

映画ちいかわ 人魚の島のひみつ

『映画ちいかわ 人魚の島のひみつ』公式サイト
観てきました。
せっかくなのでIMAXで。
なんかちいさくてかわいいだけじゃない、良い映画でありました。
後日何らかの形でもうちょっと詳しく感想書くかも。

Mifuminator

昨日のPHPのエラーの件、Anpanatorの本体部分であるMifuminatorのコードが一因でした。
PDO\Sqliteとfgetcsvの件の修正がメインです。
なお、コミットメッセージがふざけているのはMifuminatorではいつものことです。

アンパンマンDBとドラゴンクエスト10と美文のキャラ倉庫とTGWS内部処理

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

来週の放送情報。
SLマンとコキンちゃんは昔順序逆のやつがあったらしい。

ドラゴンクエスト10(おきがえリポちゃん)

あぶない浴衣
[DQXショップ] おきがえリポちゃん ~ あぶない浴衣 ~ (2026/7/22)|目覚めし冒険者の広場
いつもの月例貸衣装。
浴衣の片側が大きくはだけてインナーが丸出しになっている服。
ちなみに男はインナーなしなので片乳丸出しです。

あぶない浴衣
うーん、確かにこれは危ない男…。

他の写真は以下から。
写真置き場「2026/07/24」

美文のキャラ倉庫

モジュールを読み込んでくれない問題、XMLからモジュールをインポートしてたんですが、そこでのモデルとフォーマットの指定が通常の記事と同じだったので、モジュールじゃなくて記事扱いされていたのでした。
移行用プログラムを修正してScribuntoとして取り込まれるように修正しました。
そしてもう一つ、Luaの実行用バイナリに実行権限がついていなかったのも一因でした。
Windowsめぇ…。

TGWS内部処理

とりあえず、致命的な問題はなさそうなので、PHP8.4に上げてみました。
うーん、事前調査で出なかったDEPRECATEDがいっぱい出てたぞ…。

美文のキャラ倉庫とTGWS内部処理とドラゴンクエスト10

美文のキャラ倉庫

ScribuntoでLua書いてるけど、そもそもモジュールを読み込んでくれない!
何か操作が必要なのか?

TGWS内部処理

ともあれ、古いコードが残りすぎていたPukiWikiは完全に脱したので、PHPのバージョン上げ作業。
今のところ問題はなさそう。
8.4に無事上がったら、もうストッパーになるコンテンツはないので、エラーを見ながら8.5まで早々に上げる予定。

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

鉄鬼軍王キラゴルド

  • 鉄鬼軍王スレイヤーの称号を得た!

ミフミンも問題なく勝利!
今回はストームカイザー入りでやったんですが、都合のいい耐性のサポが見当たらなかったんで、ほぼ無策パーティーで特攻することに。
せっかくなのでミフミンも愉快なポーズでゴールドアストロンしたかったけど、キラゴルドさん全然こっち狙ってくれなかった!

ヘルクラウダー
またしてもついでにしばかれるヘルクラウダーさん。

他の写真は以下から。
写真置き場「2026/07/23」

バイオハザード レクイエムとAmazonストアフロントとQiita

バイオハザード レクイエム



動画投稿しました。
内容は同一です。
ゲーム音声と実況音声の音量バランスは調整したけど全体の音量調整してなかったなァ。
前回は出力設定で無茶して紙芝居になったし、動画作成手順をまとめておかないと。

Amazonストアフロント

アンパンマンDBから爆速で商品情報入れる方法思いついたので試してみた…けど、半分しか保存されてなかった!
どうやらこまめに確定させていく必要があるみたいだ。

Qiita

昔書いた記事の続編、今更書きました。
今アンパンマンDBで使っているコードほぼそのままです。
CSS、今も発展を続けているはずだけど、このCSSももっといい書き方が生まれてるのかなぁ。

あと、もう一つ別の記事も執筆中。
.NETです。

アンパンマンDBとRector

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

来週の放送情報。
ガレットさん着実に登場回数重ねてる?

アンパンマンナイトの情報が出たので。

Rector(Today I Learned)

Rector: Fast PHP Code Upgrades & Refactoring
PHP向けの静的解析。
エラーにはならずとも、リスクになるコードとか、きれいに書けるところなどを徹底的に見つけ出してくれます。
で、修正までしてくれる優れものなのですが、1400も修正箇所が出てきて、さすがにこれを丸投げするのは怖いなということで、--dry-runで様子を見ながら手作業で修正しています。
言うて新機能が追加されるわけでもなけりゃバグが直るわけでもないわりに修正ミスで壊れる可能性があるから労力掛けてまで頑張る必要ないかもしれんな。
古いコードの温床となってるWikiのWordPressへの移行のほうが先でいいかも。

PHP 8.4とプリンセスピーチ Showtime!とカービィのエアライダー

PHP 8.4

試しに検証環境で8.4を動かしてみて、致命的なエラーはなさそうなんですが、ちょっとDeprecatedが出てるので、そのあたりどうにかするためにCSV周り調整中。
標準関数の厄介ごとに巻き込まれたくないので、league/csvを使う方針です。

プリンセスピーチ Showtime!


ぽこ あ ポケモン気になるなーって思ってたけど、先に今持ってるゲームのほうを心残りがないように終わらせちゃおうということで、ちょっと進めました。
今回は人魚のキラリスタのステージ。
ある種の山場と言えるのがキラリスタ救出ステージなんだけど、今回は敵が出るでもなく長丁場になるわけでもなく、結構あっさりしていました。
こっちが飛ばした音符の魚を跳ね返してきたし、キラリスタが事実上のボスだったのでは!?

キラメキストーンコンプにこだわる必要はないかなって思いはしたけど取り逃しがわかりやすかったのと一周が短かったので、一応2周目で全部取っときました。

他の写真は以下から。
プリンセスピーチ Showtime!(2026/03/05)の写真

カービィのエアライダー


心残りって程でもないけどエアライダーもタイムアタックとかやってないコースがあったので。
クリアチェッカーはコンプ済みなので、今後もこだわらない程度にちびちびやっていこうかと。

バリューサーバーと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で入れなおして名前空間を入れ替えるだけで現状は済みそうでした。
開発が進む前に気付いてラッキーだったのか、前提が変わるまで進まなかったのがだらしないのか…

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

カービィのエアライダー


ひとまずクリアしました。
周回要素があるのは最初から分かってたし、クリアチェッカーもまだまだ残っているので、クリアはしてもまだまだこれからって感じですね。

(激しくネタバレ込みで語りたい)

伏せたからには遠慮しませんからね!


ロボボのときは「ギャラクティック・ノヴァをちゃんと再現しないとだめだな」とか思ってたけど、本家のほうが純度100%の邪悪じゃねーか!


途中から何度も絡んできてなんだかんだで腐れ縁感じてたノワールデデデくん、何も知らずに滅亡のスイッチ押しに来る善意の第三者に手をかけ続ける哀しい悪役だった…!


ラスボスのギガンテスはとにかくでかい!
どう戦ったらいいのか最初わからんかった。


どのキャラクターでも同じ展開なのはわかってるけど、もうこれロロロ&ラララが完全に主人公でしたね!
かわいくてかっこいいですね!
アドベンチャーズ・オブ・ロロロでしたね!
ラララも同じだけ活躍してたからアドベンチャーズ・オブ・ロロロ&ラララですね!!


ノワールデデデの本体であるゾラごとギガンテスを破壊してしまったので、なんだかんだで愛着感じてたノワールデデデくん…散りました。
バッドエンドですねバッドエンド!
世界を救うという一番大きなことは成し遂げたからノーマルエンド扱いにはなっているけど、気分的にはバッドエンドです。
ここから黒幕をぶちのめして、なんだかんだで好きだったノワールデデデくんも救うトゥルーエンドへ向かうのが周回要素ってわけですね。


2周目になるとさらなる高難度スーパーハードが現れました。
1周目は結局最初から最後までハードで無理なく(ミスなくとは言ってない)進めたんですが、まあ、そういうわけだったんですね。
ちょっと挑戦してみたんですが、やられるたびに強制的にステージの最初まで戻されて、途中セーブもできない仕様が、暇人むk…もとい、時間のある人向けって感じです。
この要素はストーリーのネタバレじゃないから伏せなくていいかなと思ったんですが、よそでネタバレについて苦言を呈した手前、一応慎重になっときます。


そうそう、ロロロ&ラララ2Pカラーも手に入れました。
ロードトリップは途中でライダーの変更ができないっぽいので2周目に使ってみたんですが、どうもキャラごとにクリアが記録される仕様っぽいので、やっぱり別キャラ使おうかと思ってます。
ちなみにこれをネタバレエリアに入れてるのは、左上に入手条件(最初は伏せられている)が書かれているからです。
過去の日記に参戦画像載せてないのも同じ理由。

他の写真は以下から。当然写真一覧にはネタバレがいっぱいあるけど、今回は4ページ目あたりから激しいよ。
カービィのエアライダー(2025/11/24)の写真

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

ドン・モグーラ

  • 土竜大将ブレイカーの称号を得た!

以前から引き続きテリー探しをしていて、途中でミネアからドン・モグーラカードを押し付けられたので、挑戦してみました。
一応アクセはプチドンで完成させていたんですが、そろそろどうにかなりそうな気がしたので、原種チャレンジです。
レベルが高いのは依然天地雷鳴士なんですが、レベルは低くても魔剣士のほうが火力が出るので、慎重を期す必要のある相手以外では魔剣士で行っています。
こいつの場合、混乱と大地揺らしにさえ気を付ければ大崩れする要素はないし、むしろ呼ばれる増援を手早く処理できたり、凍てつく波動でテンション解除できたりする魔剣士が適任でした。
カカロンは呼べないしHPも低くなったのでひやひやする場面がありましたが、終わってみれば無理なく(死なずにとは言ってない)勝てていました。

ゲーム記

ローカル環境で画像登録がうまく動かない件、一応解決しました。
フィル一覧を取得するのにDirectoryIteratorを使っていたんですが、scandirを使うようにしたら直りました。
なんで直ったのかは、皆目見当もつきません。

ドラゴンクエスト10とfnmatch

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

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

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

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

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

fnmatch(Today I Learned)

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

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

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

アンパンマン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に置き換えるなど。

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

次>