2026年8月の日記

<2026年09月 2026年07月>

浮き沈みランチャー2とバイオハザード レクイエム

浮き沈みランチャー2

行が広すぎる問題、対応しました。
オプションの受け渡し受け渡しで変更ファイル多くなっちゃったね。
ただ、余白0にしてもまだ余白がある模様。
リストボックス側に固定のパディングがあるパターンか?

ついでにこの課題も対応しようと思ったけど、コメント見ればわかるとおり、試行錯誤した結果、錯誤の結果しか残せませんでした。
なんか、どうあっても表示中の状態でしか表示の変化が起こらないようなんですよね。
表示リセットの課題ともども、根本的にやり方変えなきゃいけない気がします。

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

もう発売後半年たったし、重大なネタバレとグロ以外は畳まずに書いていくよー。

2026_08_31_23_33_58.png
隔離病棟に入ったら何事もなくリストタグLv.3ゲット!

病棟内のファイルから、あの強い変異体の名前はブリスターヘッドと判明。
ブリスター(Blister)は水ぶくれという意味。
あのぶくぶくの見た目通りってわけですね。
こいつへの変異を防ぐには破血アンプルが必要とのこと。
リメイク1の火葬みたいなものかな。

2026_08_31_23_41_11.png
そしていよいよ、白い少女エミリーとも直接対面。
目が見えないからこそ読めるものを読んでもらうために、隔離病棟に連れていく必要が出てきました。

他の写真は以下から。強敵警戒しまくった割りに全然出てこなかったから今回はグロ画像なし。
バイオハザード レクイエム(2026/08/31)の画面写真集

アンパンマンDB

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

バイキンメカ情報追加。

昨日の件へのデータ側からの対応として、リンクがない項目の記事化を進めていて、その中で実は記事が既にあるけど名前が違っていてリンクされていなかった項目がこれ。
他の完全新規になる記事は、数が多いのと、あくまでリンク用でほとんど中身がないので、ひっそりこっそり更新です。

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

管理メモの未記入スタッフ、大幅に機能拡張しました。
もともとリンクがない項目を見つけ出すためのページだったのですが、どこに記入された項目なのか、いくつ記入されているのかがわかるようになり、記入の優先順位をつけやすくなりました。

キャラ倉庫とアンパンマンDB

キャラ倉庫

とりあえず、統計用のリクエストは問題なく記録されている模様。
AIとも検索ともつかないよくわからないロボットが徘徊しているけど、統計への影響はないし、Metaみたいに狂った大暴れをしないのでひとまずは放置。
そろそろちゃんと記事の更新をして、統計をする意味がある状態を作っていきたいなァ。

アンパンマンDB(みんなのタグ)

なんかまたおかしなのが増えてきている模様。
本当はユーザー側で自主的にどうにかしてほしいけど、なんかまた対策考えるかなぁ。

アンパンマンDBとキャラ倉庫とJC-GP20XBK

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

来週の放送情報。
そうめん…残暑だからまだ季節か。

キャラ倉庫

Bot対策しつつアクセスログから人気のページを集計するための仕組み、作ってみました。

(技術的な話)
mw.hook('wikipage.content').add(function () {
    const id = mw.config.get('wgArticleId');
    if (id === 0) {
        return;
    }
    const d = new Date().getTime();
    setTimeout(async () => {
        try {
            const url = '/a.md?' + id + '-' + d + '-' + (new Date().getTime());
            await fetch(url, { method: 'HEAD' });
        } catch (error) {
        }
    }, 5000);
});

グローバルスクリプトのMediaWiki:Common.jsに処理を書くことで対応しています。
このスクリプトでやるのは、集計に使えるリクエストをサーバーに送ってアクセスログに残させるところまでです。
実際の集計は、後日、これとは別に作ります。

まず前提として、ここではJavaScriptを使って行います。
私の個人的なこだわりとして、JavaScriptを使わずに済むなら使わずに済ませたいのですが、MediaWikiの時点でJavaScript使いまくっているので、相対的にデメリットは少ないかなと。
そして、Botはページ本文だけ見に来て、JavaScriptの実行まではしないことがほとんどですからね。

mw.hook('wikipage.content')は、コンテンツロード後に関数が発動するする仕組みです。

で、最初にページIDを取って、有効なページのときだけ処理を進めるようにしています。
特別ページなど、記事じゃないページを集計しても仕方ないですからね。
ちなみに、このMediaWiki:Common.jsのページも記事IDを持つ立派な記事なので、みんながこのスクリプトを見に行くと、スクリプトが人気ページになります。
まあ、これは今後実際に集計する仕組みを作るときに除外すればいいだけの話かな。

処理が進んだら、時刻を記録してタイムアウトを仕込んで、サーバーにリクエストを送ります。
このときのリクエスト先URLは、できるだけ短い名前にした静的ファイルのa.mdに、パラメータでページIDとタイムアウト前後の時間を加えています。
URLに時刻を含めることで、リクエストせずキャッシュからレスポンスが返るのを防ぎつつ、URLと実際のリクエスト時刻を照合してリクエストの整合性を検証できるようにしています。
タイムアウト仕込む前とタイムアウト後の時刻両方を含むので、ちゃんと待ったかどうかの検証もできます。
Botが昔見つけたURLをもう一度叩いても期限切れなので意味がないというわけですね。
もちろん、人間のアクセスでも、ちゃんと読まずに一瞬で通り過ぎた場合は集計対象になりません。
なお、ただのタイムスタンプなので明確な悪意があれば偽装は容易ですが、そんなことする意味もないので、偽装するやつはいないという想定です。

ちなみに、わざわざ有効な静的ファイルを用意しているのは、MediaWikiの手を煩わせないためです。
静的ファイルがあればそれを直接読むように設定してあります。
もしファイルを置かなければ、MediaWikiに処理が渡り、a.mdというありもしない記事を探した挙句、本来必要のないエラーログを残して404エラーを出すことでしょう。
そうさせないための、静的ファイルです。

そして、サーバーへリクエストを送る際は、HEADメソッドで送ります。
目的はあくまでも「リクエストを送ること」までなので、レスポンスは要らないし、ましてやリクエスト先のコンテンツなんかも全く必要ありません。
なので、コンテンツを返さないHEADメソッドが無駄がなくてよいということになります。
厳密に言うと、レスポンスヘッダは返ってきますが、不要なので受け取らずに捨てています。
Botはむしろリクエスト先の中身が欲しいので、GETメソッドでリクエストするでしょうが、HEADメソッドではないので集計対象にはしませんし、もちろんリクエスト先のa.mdの中身は無意味なものしか入っていません。

一応、a.mdの中身は下記リンクから見えるようにしておきますが、本当に意味のないことしか書いていませんし、これを読んだところで人気ページ集計には寄与しません。
a.md

というわけで、まとめると、こうなります。

  • 文字化け対策:ページIDを使って確実にページ特定
  • Bot対策:時刻をパラメータに含めて検証&普段使わないHEADメソッドでリクエスト
  • 負荷対策:静的ファイルにHEADメソッドでリクエスト

JC-GP20XBK(ゲームコントローラ)

なんかPCが一挙手一投足ごとにタスク切り替えだのゲーム起動画面だのが出てきておかしいなと思ったら、ゲームコントローラが誤作動していました。
USBケーブル差しなおしたら改善したので、どうやら繋ぎっぱなしだったケーブルが外れかけて接触不良を起こしていたようです。

アンパンマンDBとX-Robots-Tag

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

はい、前回のを正式な情報に修正して、最新DVDの情報も入れました。
秋号はたぶんイレギュラーないかと。

X-Robots-Tag(Today I Learned)

Robots meta タグ、data-nosnippet、X-Robots-Tag の設定 | Google 検索セントラル  |  Documentation  |  Google for Developers
X-Robots-Tag ヘッダー - HTTP | MDN
最近キャラ倉庫やらDQPEの関係で外部からアクセスしてくるロボットの挙動を制御する必要が出てきて、調べていたら出てきた概念がこれ。
HTTPヘッダにX-Robots-Tagを付けて返すことで、HTMLのMETAタグに頼らずロボットの挙動を指示できるというやつです。
もちろん、METAタグと同様に、無視するロボットは無視しますし、なんなら比較的新顔で、標準化すらされていないので、METAタグより強制力は劣るものとみられます。
しかし、METAタグの書けない非HTMLコンテンツにも付けられますし、robots.txtより個別に細かく指定できます。
今からすぐに対応する必然性はなさそうですが、ちょっと存在だけは覚えておこうかと。

ドラゴンクエスト10とそれいけ!アンパンマン'26 秋号

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

マッシヴなダチモギ

  • クエスト「理想の鍛錬法」をクリアした!

ストーリー進捗思い出しがてらクエスト攻略。
そうそう、オルセコ進めてたんだった。

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

それいけ!アンパンマン'26 秋号

それいけ!アンパンマン'26 秋号 / 戸田恵子 - DVDレンタル ぽすれん
レンタル情報新しいの来てた。
ちょっとまたイレギュラーな収録とかあるかもしれないので一応慎重に見とこう。
まあ今月中にアンパンマンDBに反映できればいいか。

ドラゴンクエスト10

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

おきがえリポちゃん ~ ユキハのよろい ~
[DQXショップ] おきがえリポちゃん ~ ユキハのよろい ~ (2026/8/21)|目覚めし冒険者の広場
今月の貸衣装。
ストーリーについていってないから相変わらず知らない人の服だ…!
ちゃんと進めないとなァ。

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

幻の海トラシュカ2026
せっかくなのでミフミンは貸衣装のままトラシュカ挑戦。
報酬も一通り集まりました。

黄金のもろこし
いつもの謎景品、黄金食物ドルボード。
今回はトウモロコシですね。
闇夜に映えるぜ!

これでトラシュカは全員終わったかな。
昨日のフタバトラシュカがなんかやたら楽しかったのでしろいコキンはただ楽しむためにまたやるかも。

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

バイオハザード レクイエムとドラゴンクエスト10のプレイヤーイベントを検索および通知するサイトとキャラ倉庫とドラゴンクエスト10

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



動画アップしました。

ドラゴンクエスト10のプレイヤーイベントを検索および通知するサイト

先日言ってた調整、試しに実装してみたら、余計ひどいことになりました。
集計アルゴリズムを調整するよりロボットどもを集計から追い出さないとだめだ。
というか、robots.txtに検索結果ページを見に行くなと書いているんだから、見に行ったロボット全員ルール違反なんですよね。

キャラ倉庫

集計の話で思い出したけど、キャラ倉庫の集計も今のところうまくいかなそう。
アクセスログから集計できるかなと思ったんですが、アクセスログ、文字化けしてました。

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

ちいかわ好きな人語ろう集会
ちいかわ好きな人語ろう集会 - ハミィのプレイヤーイベント
プレイヤーイベント、行ってきました。
コスプレイベントじゃないけどせっかくなのでフタバコスで。

ちいかわ好きな人語ろう集会いってきた! - しろいコキンの冒険日誌
冒険日誌のほうに感想とか取り急ぎ書いてきました。

幻の海トラシュカ2026
ちいかわコスにしてもいろいろネタがある中、あえて島民のフタバだったのは、この姿でトラシュカもやりたかったから。
浮き輪なしで参加するとセイレーンから逃げ惑う島民の気分が味わえるぞ!!
ただまあ、浮き輪なしだとどうしても得点が伸び悩むので写真撮るための最初の2回だけにしましたが。
報酬はどうにか全種ゲットできました。

他の写真は以下から。今回はいっぱいあるよ。
写真置き場「2026/08/24」

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

キャラ倉庫

見せない特別ページ、単に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)の画面写真集

キャラ倉庫と浮き沈みランチャー2

キャラ倉庫

Metaからの爆撃はCloudflare側のセキュリティルールでブロックして、とりあえずサーバーまでは届かないようにはしました。
ただ、そもそもMetaに限らず、検索に出してほしいサイトでもAIに引用してもらいたいサイトでもないので、直接のシェア以外は全面的にロボットに見せないようにrobots.txtを調整しました。

# 全ボット(検索エンジン・AIクローラー含む)のクロールを拒否
User-agent: *
Disallow: /

# SNSのOGP取得クローラーのみ個別に許可
User-agent: Twitterbot
Allow: /

User-agent: line-poker
Allow: /

User-agent: Discordbot
Allow: /

量的には一応許容範囲には収まってきたので、ルール無視するbotは今後当面は放置する方針です。

浮き沈みランチャー2

とりあえず課題だけ立てといた。

アンパンマンDBとドラゴンクエスト10のプレイヤーイベントを検索および通知するサイトと浮き沈みランチャー2

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

来週の放送情報。
これは終始楽しい夏まつりになりそう。

ドラゴンクエスト10のプレイヤーイベントを検索および通知するサイト

ここもロボットが変なアクセスしがちなので、キャラ倉庫ほどじゃないけど、統計が程よくなるような調整を準備中。
今のところ、調整で変なバグが発生しないようにテストを整えたところです。

浮き沈みランチャー2

開発また滞っていますが、また改善したい部分が。
検索してから実行すると、次に画面を開いたときも検索結果が出るのですが、一度実行したものを何度も連続で実行することは少ないし、そもそも仕組み上、実行した項目は上に上がってくるから検索の必然性は減るし、画面を開くときは表示状態を毎回リセットしたほうがいいかなって感じました。
前作はこの辺の仕様どうだったかな…。

キャラ倉庫とtgws_rpg

キャラ倉庫

転送量増えた件、Metaの迷惑ロボットが別のロボットに切り替えて同じ迷惑行為を始めただけでした。
通常のウェブブラウザのユーザーエージェントを偽装するという徹底した悪質さだったから、もうMetaのロボットは全面排除でいいね。
MetaのAIだかFacebookからの流入だとかの話はあるけど、それももういらん。

というわけで、.htaccessで拒否。

# Metaは拒否
SetEnvIfNoCase User-Agent "developers.facebook.com" meta_spam=on
SetEnvIfNoCase User-Agent "facebookexternalhit" meta_spam=on
SetEnvIfNoCase User-Agent "meta-webindexer" meta_spam=on
SetEnvIfNoCase User-Agent "meta-externalads" meta_spam=on
SetEnvIfNoCase User-Agent "meta-externalagent" meta_spam=on
SetEnvIfNoCase User-Agent "meta-externalfetcher" meta_spam=on
RewriteCond %{ENV:meta_spam} on
RewriteRule  ^(.*)$ - [G,L]

まだ「developers.facebook.com」がユーザーエージェントに一応残っているので、それを判断材料にしてるけど、それすらなくなったらIPで弾くしかないかな。
403 Forbiddenで「見ちゃダメ」って表明しても1分後にまた同じ場所見に来るという意味不明挙動なので、410 Goneで「二度と見せない」のエラーコードを返しています。

ここんとこずっとMetaの迷惑ロボット対策ばっかりだったので、ここらで一応コンテンツの更新も。
メインページは、移行作業中の表記を外し、サイトタイトルを記載しました。
フナヨイは画像追加。

tgws_rpg(開発中止)

「テヅカイ」の一環として作ろうとしていたtgws_rpgでしたが、これのコンセプトはTGWS世界観測所でやるほうに舵を切ったので、tgws_rpgプロジェクトはいったん終了。
Visual StudioでTypeScript使って何かやるつもりだったみたいだけど、コード見ても何も思い出せませんでした。

キャラ倉庫とドラゴンクエスト10

キャラ倉庫


お昼ごろにやっとrobots.txtを読んでくれたようで、爆撃が収まりました。
なんかそれと入れ替わるように転送量が増えだしたんだけど、まあ、別件かな。
一応明日確認だけしておこう。

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

幻の海トラシュカ2026幻の海トラシュカ2026
お宝集めイベント、行ってきました。
今回は水流が新規ギミックかな?その割には対策アイテムがイカ絡みだったけど。
とりあえず、ァォィョッュの分は一通り報酬集まりました。
他二人については、ちょっと思いついたことがあるので、また後日…。

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

アンパンマンDBとキャラ倉庫

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

なんか面白そうなバイキンメカ見かけたので。

キャラ倉庫

とりあえず、例の行儀悪いbotはCloudflareのブロック機能で弾いても来るのやめないので、あえてrobots.txtだけ許可して、どこも見るなって名指しの指示だけ見えるようにしておきました。

# 行儀の悪いbotは拒否
SetEnvIfNoCase User-Agent "meta-externalagent" bad_ua=on
RewriteCond %{ENV:bad_ua} on
RewriteCond %{REQUEST_URI} !^/robots\.txt$
RewriteRule ^(.*)$ - [F,L]
User-agent: meta-externalagent
Disallow: /

さて、普通に書いたrobots.txtを無視しやがるあいつが従ってくれるか…。

浮き沈みランチャー2とPay Per CrawlとJC-GP20XBK

浮き沈みランチャー2

課題、立てました。

Pay Per Crawl(Today I Learned)

早期アクセスを取得:Cloudflareクロールごとに課金のプライベートベータ版 | Cloudflare
先日言ってたAIに閲覧料支払わせる件、Cloudflareがサービスとして作っているようです。
まだ早期アクセス版、つまり完成前のお試し版的なものらしいですが、とりあえず申し込んでみました。
問題は、現在支払い能力を持っているのが、ごく限られた事業者に限られるということ。
まあ、迷惑しかかけてこないMetaはブロックを続けるとして、他は期待しない程度に設定しようかと。

JC-GP20XBK(ゲームコントローラ)


ELECOM GAMING 有線スタンダードゲームパッド GP20X - JC-GP20XBK
昔買ったコントローラ(GameSir T4 Pro)が、物理的にも入力的にもだいぶボロボロになってきたので、買い換えました。
T4が早々に無線機能ぶっ壊れてただの優先コントローラになってしまったのと、背面キーを誤爆して思わぬ事故が起こったりしていたので、今回はシンプルな有線コントローラにしました。
十字ボタンとLRトリガーがちょっと固いことを除けば、まあまあ快適です。
接続コードは硬いのでちょっと邪魔になるかも。
T4はケーブル変えられたからめちゃくちゃ柔らかいのに換装してたんよね。

オークストリートの異変と浮き沈みランチャー2とTGWS世界観測所

オークストリートの異変


映画『オークストリートの異変』公式サイト
観てきました。
原題『The End of Oak Street』って、異変通り越して終焉じゃねえか!

(ネタバレとか)
  • 犬は無事。猫は死ぬ
  • ワームホールによる偶発的なタイムスリップがたまたま町全体で起きちゃったってやつ
  • 中盤、町全体が映る場面、「これ完全に詰んでるだろ」って思った。絶望感ってやつだ
  • からの、ワームホール説を思い出して希望を見出すの、学問ってやっぱ大切なんだな
  • 人の死体が町中にごろごろ。食わんかったんか?
  • 恐竜の濡れ場とか聞いてない!でも意外と大事なシーンだった。父ちゃんの最後の安らぎにして、存在した確たる証拠を残す時間
  • 父ちゃん、あまりにあっさり死んだ。捕食者だもの、覚悟なんかさせてくれないし、演出もしない。ただ食うだけ
  • ワームホール、タイミング間違ったら町と同じく「切り取られてしまう」のでは?だから慎重にタイミングを図っていたのか
  • 現代に戻ってからもうひと悶着あるんだろうなと思ったけど、結構思い切ったことやったな。タイムパラドックスか、あるいは平行世界か
  • 最後の行動、個人的には支持するよ。普通の家族なんだから、できる範囲で自分を助け、誰かを助け、将来の幸福を再構築するしかない
  • 母ちゃんが書いてた小説、リアリティありすぎて実話かと疑われまくってたけど一貫して創作という話だった。そして、最後に『The End of Oak Street』と題して終わる。意味深長だねぇ

浮き沈みランチャー2

実際使っていて、項目実行後に再初期開くとき、前回の結果が一瞬見えてから今の状態が表示される挙動が気になってきました。
後で課題でも立てとくか。

TGWS世界観測所

Bomber丸Worldの制作が全然進まないことから始まった「テヅカイ」というプロジェクトですが、これもこれで全然進んでいません。
一本のゲームを作ろうとすると、キャラグラフィックやシナリオだけでなく、ゲームを面白くするルール、遊びのバリエーションを増やす豊富なゲームデータ、町などの世界そのもの、音楽、効果音、途方もなくたくさんのものが必要となります。
ツールを使うことでプログラム作成の手間を極限まで減らせたとしても、それ以外もほとんどない今、作るのは途方もない話なのです。
ということで、この中で「世界そのもの」に絞って作ってみようかというのが、『TGWS世界観測所――TGWS World Observatory――』という構想です。
もちろん、世界そのものをつじつまを合わせて全部作るのも途方もない話ですなので、「観測所」から世界の断片を観測できるという形で、少しずつ世界の一部を作っていければと思うのです。
そして、実際にちゃんとしたゲームを作る段になったら、観測できる世界の一部を拝借してくれば、ゲーム作りの第一歩を踏み出しやすくなるのです。

バイオハザード レクイエムとそれいけ!アンパンマン パンタンと約束の星

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



動画、アップしました。
ゲーム記のページのほうにも動画へのリンク置いときました。

それいけ!アンパンマン パンタンと約束の星


アンパンマンナイト、やっと行ってきました。しかも轟音。
地面から響くほどの重低音でしたねぇ。
特典のポストカードも手に入りました。

アンパンマンDBとドラゴンクエスト10とバイオハザード レクイエム

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

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

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

古代オルセコ闘技場に落ちてる武具

  • クエスト「仮面のバトルマスター/剣となる者」をクリアした!

バトマスクエ完了。
写真は道中に落ちてたやつで、クエストとは関係ありません。

(一応ボスネタバレ)

闘士セインズ
再戦セインズ君。
昨日と同じノリで舐めプしてたら地味にダメージが蓄積してきたんで、最後は一気に倒しました。

ブランドンビースト
黒幕さんの愛玩動物ブランドンビーストちゃん。
あんまり舐めプできるような余裕もなさそうなので、即座に殴りました。
まあ、レベル差もあるんで、普通に戦えば、普通に一方的。

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

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

2026_08_14_23_40_45.png
新しい血液検体ゲット!
他に特に進展はないです。
そろそろストーリー進めたいな。
レクイエムの弾量産できるようになったからボス戦は近いと思うけど。

音声の録音は、設定調整などしたので、だいぶ聞こえやすくなりました。
まあ、その分私自身の活舌の悪さもクリアに聞こえるようになっちゃいましたが。

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

アンパンマンDBと手柄山温室植物園とドラゴンクエスト10

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

最近の放送に出てたので。

手柄山温室植物園


先日手柄山平和公園行ってたときに見かけたけど時間の都合で見送ってたやつ。
食虫植物展やってました。
常設の温室は、先日までの地獄のような酷暑を思い出す暑さでした。
いつぞや行った水族館と同じく、地元に寄り添った展示もありました。

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

ジェイコフ

  • クエスト「仮面のバトルマスター/バトリンピック・予選編」をクリアした!
  • クエスト「仮面のバトルマスター/バトリンピック・決勝編」をクリアした!

4年近くも放置していたバトマスクエ、進めました。
バトリンピックの選手たち、全員一撃で沈んでいった…。
敵のバトマスは今でもすてみ使うのね。

本当はバトマスクエ最後まで終わらせるつもりでしたが、持ち物がいっぱいになってしまったため中断です。

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

キャラ倉庫

お行儀の悪いbotへの対策をしてました。

robots.txtを見てくれる程度に理性が残っているならrobots.txtで。
特別ページを深掘りされても迷惑なだけなんで、そういう指定に。
ちなみに、robots.txtの設定が競合する場合、長いほうが勝つらしいです。

User-agent: *
Allow: /
Disallow: /w/
Allow: /w/images/
Disallow: /%E7%89%B9%E5%88%A5:
Disallow: /%e7%89%b9%e5%88%a5:
Disallow: /特別:
Disallow: /Special:

そもそもほとんどの特別ページはロボットに限らずただの閲覧者に見せる必要はないので、MediaWikiのLocalSettings.phpの中でアクセス制御。

// 一般ユーザーには見せないページ
$wgHooks['SpecialPageBeforeExecute'][] = function ( $special, $subPage ) {
	if ( $special->getUser()->isAnon() ) {
		switch ($special->getName()) {
			case 'Allpages':                 // ページ一覧
			// ... 見せていい特別ページだけ許可リスト方式で列挙
			case 'Whatlinkshere':            // リンク元
				break;
			
			default:
				throw new ErrorPageError( 'badaccess', 'badaccess-group0' );
		}
	}
	return true;
};

迷惑が過ぎる奴は、.htaccessで問答無用で弾く。

SetEnvIfNoCase User-Agent "meta-externalagent" bad_ua=on
RewriteCond %{ENV:bad_ua} on
RewriteRule ^(.*)$ - [F,L]

AI クローラに HTTP 402 を返して課金する。AWS WAF 新機能の仕組み - サーバーワークスエンジニアブログ
この記事に書いてあるような、AIクローラーに課金するシステムが使い物になるようになったら、3日間で同じコンテンツに4万アクセスでもしてくれていいんですがね。

映画ちいかわ 人魚の島のひみつとドラゴンクエスト10

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



また観てきたんであれこれ書いてました。

IMAXで観るためにちょっと遠くの映画館に行ってて、ついでに付近も歩き回ってたんですが、映画のタイミング的にあまりあれこれ見られず、特筆すべきようなところには…まあ、一応、手柄山平和公園。
時間的にほぼ通過して踵を返した形なんで、平和とかよくわかんなかったです。

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

8月11日(山の日)は「オーガの日」! (2026/8/4)|目覚めし冒険者の広場
オーガになれるやつ。

8月11日(山の日)は「オーガの日」!
変態だァ!

去年もやってたけど、去年もたいがい変態だった。

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

バイオハザード レクイエムとキャラ倉庫とドラゴンクエスト10

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



動画アップしました。

キャラ倉庫

メインページに主要カテゴリへのリンクを付けました。
人気のページの準備も進めています。

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

毎月10日はDQXで遊ぼう! ~夏のフレンド探し隊!~ (2026/8/3)|目覚めし冒険者の広場
テンの日。
フレンド探しは今してないので、いつもの回収作業。

プチムドー
ついでに面白ポーズで石化する遊び。

他の写真は以下から。全部コインボス。
写真置き場「2026/08/10」

キャラ倉庫とバイオハザード レクイエム

キャラ倉庫

一通り、データのチェックと最低限の修正は完了しました。
まあ、書式とかちゃんとしてないページも多々あるけど、それはもうWordPressのころからですしね。
そういうのは気が向いたら修正していこうと思います。
多分ほとんどのキャラは「設定上存在する」だけで本編登場は今後もなさそうだし、積極的に修正していくほどの意味は…ね。

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

2026_08_09_23_32_01.png
重かった一件以来やってなかったんだけど、とりあえず続きやってみました。
とりあえず、重さは解消していました。
当たり障りなさすぎるラクーン君の写真しかないことからわかるように、ストーリー面の進行は特になしです。
一応、今まで行ってなかった場所を開通し、ファイルをいくつか見つけて、変異体っぽいやつがたぶん一匹出てきました。
動画も撮っていたんだけど、再生確認したら声がガビガビになってた!

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

ドラゴンクエスト10とキャラ倉庫と更新履歴

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

ピケスラバンドピケスラバンドピケスラバンド
「ドラゴンクエスト」×『ジェラート ピケ』コラボ スペシャルアイテム販売&プレゼント (2026/8/7)|目覚めし冒険者の広場
ジェラピケコラボ。
販売されてるアイテムは買ってないけど、無料で配布されている分はもらっておきました。
いろんな髪型に対応させるためか、よく見ると結構分厚くなっています。

キャラ倉庫

ここでは「美文の」つけなくてもキャラ倉庫だけで通じるじゃろ。
ふりがながついていないページ中心に編集しました。
内容的にはほぼ追記とかはないので、具体的なページとかは割愛します。
特定の日付の更新情報ページを出す機能とかはなさそうね。

更新履歴

更新履歴ページのキャラ倉庫へのリンクも差し替えました。

美文のキャラ倉庫と浮き沈みランチャー2とアンパンマンDB

美文のキャラ倉庫

様子見ながら記事いくつか更新。
修正が必要ない記事なら「移行作業中」カテゴリを外すだけなので、今後はもっと早く多く修正できると思います。
一応こうやって更新情報は列挙できるけど、一度に多くに記事を修正することになるし、一つ一つの細かい報告はしないほうがよさそうですね。

浮き沈みランチャー2

とりあえず、軽めだけど見た目の印象が大きく変わる2件を対応。

完了を待たずに閉じる件は、以下のように、明示的にHideしてから、投げっぱなしasyncしています。

private void OnContextRunAsAdminClicked(object? sender, RoutedEventArgs e)
{
    if (GetSelectedItem() is { } item && DataContext is MainViewModel mainVm)
    {
        Hide();
        mainVm.ExecuteItemAsync(item, runas: true);
    }
}
internal async void ExecuteItemAsync(Item item, bool runas = false)
{
    await Task.Run(() => ExecuteItemCore(item, runas));
}

private void ExecuteItemCore(Item item, bool runas = false)
{
    // 省略
}

スクロールのほうは、単純にScrollViewerで囲っているだけです。

<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" AllowAutoHide="False">
  <!-- 省略 -->
</ScrollViewer>

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

来週の放送情報。
公式サイトは「フルーツのしま」名義だったけど、前例や放送された次回予告からすると、「フルーツ島」のほうが正しいはず。
確実な正解は次週を待て!

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とプルリクというより、自分で直すべき案件ですね。

アンパンマンDBとドラゴンクエスト10と美文のキャラ倉庫と日記

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

リンクにげんき100ばい!マーケットを追加しました。
公式のオンラインショップです。
DVDとかの円盤系はなくて、ぬいぐるみや雑貨とかのグッズ系が中心ですね。
絵本もあるけど原作はなくて、書籍目的なら書店のほうが良さげ。

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

水やり
第25回アストルティア★ハッピーくじ「アストルティア14周年お祝いくじ」 (2026/8/3更新)|目覚めし冒険者の広場
くじの結果が出たので、商品引き換えしてきました!
今回の参加賞は、水やりのしぐさです。
カメラが近付くとじょうろだけ消えるので、何か悪いことに使えそう。

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

美文のキャラ倉庫(MediaWiki)

ifという制御構造が入る以上、プログラミングなわけで、Wikiのマークアップ言語ではなくプログラミング言語のLuaで書くのが正攻法だったのです。
そうすれば、Wikiルールの余計なものが入るのも防げるのです。
…という方向で、修正中。

日記

共有ボタン、表示するようにしました。
こんな感じのHTMLになっています。

<a class="cp" href="javascript:navigator.clipboard.writeText('2026年8月3日の日記 https://tgws.plus/diary/20260803');" title="タイトルとURLをコピー">コピー</a>

まあ、昔ながらの、hrefに「javascript:」入れるやつです。
もっときれいにやる方法はもちろんあるんですが、機能しなくても困らないおまけみたいなボタンなんで、あんまりこだわる必要はないかなーと。

ドラゴンクエスト10とシェアボタン

ドラゴンクエスト10

アストルティア14周年カウントダウン
おしゃべりドラキーマのアストルティア14周年カウントダウン! (2026/7/24)|目覚めし冒険者の広場
14周年!
めでてえ!

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

ユリリスとアルベル

  • クエスト「よみがえる王国/真実に気づいた男」をクリアした!

グランゼドーラのクエスト終わらせました!
しろいコキンのときも言ったのですが、やっぱりこのカップルが気になっちゃいますねぇ。

(ボスネタバレ)

魔剣士テグラム

  • 【クエスト】「よみがえる王国/真実に気づいた男」魔剣士テグラムをはじめて倒した!

魔剣士テグラムがなんぼのもんじゃい!こっちはちゃんとダーマ神官の下で正式に転職した魔剣士ァォィョッュやぞ!!
貴様は魔剣士としても本物にはなれんのだ!

他の写真は以下から。ミフミンは変態写真を撮っていただけ。
写真置き場「2026/08/02」

シェアボタン

ページ下に表示される共有ボタンに「コピー」を追加しました。
タイトルとURLをコピーします。
アイコンはICOOON MONOさんのを使ってます。

そういえばこの日記には共有ボタン表示しない設定だったな。
検索インデックス許可するようにしたんだし、共有ボタンも解禁していいかも。

アンパンマンDBとスーパーカービィハンターズとドラゴンクエスト10

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

同じ日に登場した2人追加。

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


ログボでちまちま貯めたリンゴで強化続けてました。

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

ムーロンとメローラ

  • クエスト「夏の恋は嵐のごとく」をクリアした!

ミフミンも海イベント行って、これで全員分完了!

だいおうキッズ
最初タコメットで行ってたんだけどタコメット被りすぎてグダグダになってしまいました。
周回はだいおうキッズで行くとスムーズでした。

他の写真は以下から。人間だと変態になってしまう…。
写真置き場「2026/08/01」

このあと14周年もあるけど、それは明日の日記で。

<2026年09月 2026年07月>