GBBS
旧掲示板…動かなくなってたんでPHPへの移行を試みていたのですが…もともとShift_JISだったのに加えてPerlの全力で活用&複雑なレイアウトのやつだったので難航しています。
そもそも役割は新掲示板に引き継いで旧掲示板は動いているころからすでに閲覧専用だったので、これはもう、レイアウトを全面的に捨てて過去ログをシンプルに表示するだけでいいかなとか思い始めています。
どう考えても主要じゃないシステムに時間がかかりすぎている。
旧掲示板…動かなくなってたんでPHPへの移行を試みていたのですが…もともとShift_JISだったのに加えてPerlの全力で活用&複雑なレイアウトのやつだったので難航しています。
そもそも役割は新掲示板に引き継いで旧掲示板は動いているころからすでに閲覧専用だったので、これはもう、レイアウトを全面的に捨てて過去ログをシンプルに表示するだけでいいかなとか思い始めています。
どう考えても主要じゃないシステムに時間がかかりすぎている。
古いCGIの移行作業として、GBBSの設定周りをPHP化していました。
未定義のグローバル変数多用しててつらい…。
更新履歴管理が動かなくなっていたので修正していました。
PHPに型宣言がなかったころからアンパンマンDBがあって、その頃はドキュメントコメントで型を書いていたのですが、実は管理画面ではこれを守っていなかったんですね。
で、PHPのバージョンを上げて、型宣言が正式にできるようになったので、コメント通りの型を指定したら、というわけです。
こういうの、自動テストをちゃんと書いていれば見つかる類のものですし、実際、修正の際には自動テストを書きました。
今、TGWS全体で、テストが必要なコードのうち、実際にテストできているのは54%。
残りの46%は、何かが起こっても自分で見に行くまでは何もわからないのです。
やはり、カバレッジ(コード網羅率)を上げていかねば。
500エラーが多い件、問い合わせたらPHPのバージョンを変えて様子を見てほしいと言われたので、同一サーバー内の別ドメインに検証環境としてアンパンマンDBのPHP8.1版と7.4版を作り、2ヶ月ばかしひたすら突っついていました。
その結果、2ヶ月間ほぼエラーは起こらず。
PHPのバージョン違いか、サーバー内の何かのプログラムが無差別killしているかだと思っていたのですが、どちらも違っていたようでした。
去年のサーバーリニューアルのときからだから、新サーバーへの移行時に何かのファイルが壊れたり、ハードウェア的に不安定な場所に配置されたり、そんなあたりか…とか想像するけど、その根拠も特にないんですよね。
新規に作った検証環境ではエラーが起きないから、それと同じになるように、全ファイル再配置してみるか?

デスマスターの職業クエスト、全5話中4話まで。
なんというか…叙述トリックでしたなあ。
物語の真相がわかって、いよいよすっきりと決着をつける、という段階です。
他の写真は以下から。ボス戦もあるよ。
写真置き場「2022/08/09」 | ミフミンのDQ10メモ
ずいぶんご無沙汰ですが、うちのサイトのリンク集、古いバージョンのPerlで作られたCGIで、いろいろと今の運用と合わないので、PHPで書き直し中です。
ついでに、昔のデザインのままだったのも、現在のデザインに合わせようと思っています。
ただ、データ形式だけは、昔のままを維持するつもりです。
現在のPerlCGIはランダムバナーリンク集として配布していますが、リニューアル後はTGWSに特化して作るので、配布しないつもりでいます。
配列のアンパック、バージョンは合ってるはずなのになぜか公開用サーバーでは使えませんでした。
テスト用サーバーでは大丈夫だったのに…。
早まって全部置き換えなくてよかった。
また見てきました。
今回気付いたことも、アンパンマンDBに追記してきました。
管理画面のメモ用Wiki、@WIKIに移転しました。
もともと非公開コンテンツだったので、@WIKIでもやっぱり非公開です。
ページ名だけはURLにアクセスすればわかってしまうのですが、まあ、URLも非公開なので多分大丈夫でしょう。
「鉄火のコマキちゃんとミス・マリーネ」の作品情報を追加
「どんぶりまんトリオとオーロラ姫」の作品情報を追加
来週放送情報の追加。
美しい大人の女性のキャラクターがABともに出る感じですね。
PHP: 配列 - Manual
配列のアンパック。
array_mergeでやっていたような配列の結合を、[..$array1, ...$array2]みたいに記述できる機能です。
簡潔な構文で記述できて、性能もよくて柔軟性も高いそうです。
PukiWikiを復活させようと試行錯誤していた時に見つけました。
機能自体は7.4からあったのですが、うちのサイトでは7.4をすっ飛ばして一気に8.1まで上げてしまったので、気付けませんでした。
ネット上の記事では、JavaScriptでの同様に機能からの類推で、「スプレッド構文」と呼ばれることが多いようですね。
ただ、便利で、今後は積極的に使っていきたいとは思うのですが、性能がいいからと言って、過去のコードのarray_mergeまで全部置き換えるのはちょっと無謀かなって思いました。
というのも、array_mergeを削除するのはいいとして、丸括弧()で囲っていた部分を角括弧[]で囲ったうえ、両方の配列に...を付けるって言うのが、繰り返し間違いなく行うには結構複雑な手順なのです。
特に...忘れに関しては、エラーが出ずに、ただ望まない処理結果が返るだけなので、間違った修正をしても気付かずに、発見したころには元のコードを忘れていて修復不可能、ということが起こりそうなのです。
PHPのバージョンを8.1に上げてから、Wikiが動いていなかったので、Wikiのバージョンを上げました。
エラーが少なければ自前で解消したかったのですが、多すぎたので、PHP最新バージョンに対応したバージョンに切り替えました。
PukiWiki/Download/1.5.4 - PukiWiki-official
ただ、今あるWikiはもうどれも保守する気はないので、全面的に凍結しています。
管理画面にこっそり置いてるメモ用のWikiも、どっかのレンタルWikiに移行してしまうつもりです。
カバレッジのグラフ
サイズがでかいので画像は直接貼りませんが、カバレッジの推移のグラフを表示する機能を作ってみました。
昨日紹介したRindow Math Plotは、ファイルへの保存は対応しているように見えて事実上対応していなかったので、直接表示するページを管理画面に作りました。
横軸はカバレッジ記録開始した日からの経過日数にして、上下に並べて時系列で傾向を見られるようにしました。
新機能を実装して複雑性が上がるとカバレッジが下がり、複雑性が上がらない間はテスト作成を頑張ったりしているのでカバレッジは上がる傾向があります。
今、日記の内部挙動を変えようと思っていて、内部挙動を変えても外部仕様が崩れないことを保証するために、日記の、特に管理画面のテストの作成を頑張っています。
リトル ノア 楽園の後継者 | Cygames
復活ですとっ!?
まあ、前作の完全版でもなければ続編でもないし、何ならゲームジャンルも全く別物だけど、なかったことになってなかったというのはちょっと嬉しいですね。
あと、買い切りというのも個人的には嬉しいところ。
前作は基本無料アイテム課金でストーリーをちょっとずつアップデートで足していく方式だったのですが、プレイ人口が減っていって録にアップデートされなくなり、重要人物だったはずの人が期間限定イベントで茶番劇やったまま、何も解決せず未完でサービス終了しちゃったんですよね。
買い切りなら、最初に出した時点でひとまずエンディングまでは到達できるようになっているはずなんで、その点安心なのです。
8月にスペシャルエディション(2000円)も出るらしいですが、価格と内容を見る限り、単に本編+有料DLC2種を値引きせずセットにしただけのようです。
念のため説明しておくと、全部個別に買う(本編1500円+DLC第1弾300円+DLC第2弾300円=2100円)よりは100円だけ安くなりますが、DLC1+2パックが500円で100円安くなるんで、“スペシャルエディションとしての”値引きはないということです。
わざわざ待たずとも、後でDLCを買い足したほうが無難そうですね。
メールがまだ変だったので、SPFレコードを再設定して、今度こそ解決しました。

Rindow Math Plot : Rindow Mathematics : Rindow
PHPのグラフ作成ライブラリです。
「php グラフ」でGoogle検索してもピンとくるものがなかった(PHPから出力したデータをJavaScriptでグラフ化するというPHPの意味がないものが多かった)ので、Composerで「composer search plot」で検索したら、目的に近そうなのがありました。
とりあえず、上に置いた画像みたいなグラフが描けます。
少々見た目が殺風景ですが、演出にこだわりたいわけじゃないし、むしろ個人的にはこのくらいのシンプルさが好きです。
グラフを並べられるのは見ての通りですが、第2軸(右側にも軸を作って、スケールの違うものを同じ図に表示)の実現方法は今のところよくわかっていません。
以下、ソース。
header('Content-Type: image/png');$mo = new \Rindow\Math\Matrix\MatrixOperator();
$plt = new \Rindow\Math\Plot\Plot(null, $mo);
[$fig, $axes] = $plt->subplots(1, 2);
$x = $mo->array([0, 0.2, 0.4, 0.6, 0.8, 1.0]);
$y1 = $mo->op($x, '**', 2);
$y2 = $mo->array([
[0.0, 0.0], [0.3, 3.0], [0.7, 4.0], [1.2, 3.0], [2.8, 1.0], [5.0, 0.0],
]);
$axes[0]->plot($x, $y1, null, 'y1');
$axes[0]->legend();
$lines = $axes[1]->plot($x, $y2, null, 'y2');
$axes[1]->legend($lines, ['data0', 'data1']);
$plt->show();
Twitterのハッシュタグのページを更新
「アンパンマンポテト」を追加しました。
「アンパンマン」タグで検索していると、ちょくちょくおいしそうなポテトの写真が出てくるので。
PHP: プロパティ - Manual
プロパティ自体は昔から使っていたけど、8.1からはreadonlyが付けられます。
最初に代入した値以外に変更できなくして、想定外の変更によるバグを防ぐ、イミュータブルを実現できるというやつです。
で、もう一つ…
PHP: コンストラクタとデストラクタ - Manual
8.0から追加されたコンストラクタのプロモーション機能と組み合わせると、コンストラクタを書くだけで、最初にデータを全部受け取って保持するイミュータブルなクラスが簡単に書けてしまうというわけなのです。
まあ、今開発しているものは、ミュータブル(変更可能)なことに意味があるクラスなので、readonlyの方は使ってないのですが。
でも多分、今後どこかで必ず使うことになると思います。
…覚えていれば。
Voidolを期間限定で無償配布します。PC Watch様にも取り上げていただきました。 | クリムゾンテクノロジー株式会社
ボイスチェンジャー、インストールしてみました。
私はあまり声出し配信とかしないのですが、VRChatをインストールしてたり、やっぱりたまには配信したくなるかもしれなかったりするし、そのときに地声から離れたらちょっとは抵抗感なくなるのかなと。
まだ試運転すらしていないですが、何かしら喋るネタでも探して試してみようかな。
IEはとっくにサポート終わってるわけですが、IEと一緒に使えなくなってしまったサイトが世の中にはいろいろとあったそうで、うちのサイトはどうなのか、というのを一応語っておこうと思います。
まず、そもそも当サイトTGWSは、Internet Explorerに対応していません。
一部のコンテンツ(具体的に言うとミディビ)だけは、IEにだけ残されたプラグイン機能に依存していましたが、そっちはそっちで、早々にプラグインの方がサポート外になったので、IEがサポートを続けようとももはや動きません。
このようなコンテンツは、歴史的な理由で残しているだけなので、今後も、特段の事情がない限りは、サポート外のまま残ります。
一方、ページ構成としては、一部を除き、JavaScriptやCSSが正常に機能しなくてもHTMLの基本的な機能だけで成り立つようになっています。
なので、IEでもそれ以外でも、何なら古いバージョンでも、多少崩れながらも意味が解る程度には表示できるかと思います。
おそらく、将来ブラウザが進化しても、それなりに表示できることでしょう。
なので、IEがサポート終了したことで、私のサイトが変わることはありませんし、移転や閉鎖の予定もありません。
未実装のアイディア。
「ヤーダ姫」とか、「かつぶしまんと鉄火のマキちゃん」とか、タイトルだけで区別のつかない記事がいくつかあります。
そういうのに区別をつけるために、今は「ヤーダ国のヤーダ姫」みたいな説明的な名前を、「他の呼び方」に入れて対応しています。
こういう説明的なタイトルの、タイトルそのものじゃない補助的なテキストを、独立項目として作ろうかと考えています。
ヤーダ姫の例で言えば、「ヤーダ国の」や「ヤーダ星の」などを入れる形です。
ファイルの場所を開く機能 · Issue #29 · mifumi323/NeoMupl
これまた未実装のアイディア。
ショートカットファイルを右クリックしたら出てくるメニューの項目みたいなやつです。
浮き沈みランチャーには同じような機能を実装しているので、そんな感じで。
先月やっていた根本的な作り直しの続き。
履歴項目の読み込みを作っている最中なのです。

で、そのときに、データベースから読み込んだ結果をPHPのクラスに変換する処理で、callableを渡す新しい書式。
PHP: 第一級callableを生成する記法 - Manual
PHP8.1から出てきた記法で、従来は「['NoteItem', 'fromArray']」と、文字列の配列で記述するしかなかったのですが、「NoteItem::fromArray(...)」という書き方で同じ意味を表現できるようになったのです。
文字列だと、プログラム的に意味があるのか単なるテキストなのか文法的には区別がつきませんが、「(...)」を使った記法だと、明確にプログラム的に意味のあるcallableとして書けるのです。
ただ…見た目気持ち悪いですね…慣れるしかないか。
Advanced Custom Fieldsを使って記入したカスタムフィールドをいい感じに表示するためにInsert PHP Code Snippetを使ってみました。
一発で全部表示みたいな便利関数はなかったけど、その分自分で全部決められる自由度はあるので、まあこれはこれで…。
WordPressって標準機能の時点でそこそこ充実しているけど、細かい利便性はプラグインに任せているようで、細かいことですぐプラグインが必要になってきますね。
まあ、今回はテーマのファイルに手を加えたくなかったというのもありますが。
なるほど、パイモンか。「イ」しか合ってねーじゃねーか! pic.twitter.com/vo6N8z7SjE
— 📛松田美文 (@matsuda323) May 19, 2022

昨日ぶち抜いた槍を掲げて、聖守護者のクエストはクリア。
そして、途中まで進めていたレベル上限解放クエストも、無事クリアしました。
昨日戦ったボスと同様、ブレス攻撃が苛烈だったので、今日もレンジャーで行きました。
ブレス以外の攻撃も全部強烈だったのですが、ブレスの頻度が高いので、ブレスを無効化し続ければ半分くらい無駄行動にさせられるのです。
それに加えて、柱のある地形なので、柱に引っ掛ければかなり長い間拘束できるというのもポイントでした。
というわけで、とりあえずミフミンのレベル上限が120→122になりました。
ボスの画像は写真置き場でどうぞ。
写真置き場「2022-03-20」
内部的なリニューアル、一般用ページは完了しました。
Smartyを使っていたところを普通のPHPに置き換えるというのもやっていて、だいたい日記ページで1割前後早くなったようです。
管理ページのリニューアルが中途半端な状態なので、「古いコード残ってんぞ!」ってエラーを吐き続けながらこの日記を書いているわけですが…。
うん、日記に限らずなんですが、Smartyやめたいんですよね。
使ってる場所が多すぎて手を付けきれていないだけで。
ちゃんとクラスになっている部分はテストできるのですが、サーバーから呼び出されるPHPファイルに直接あれこれ書いているものは、なかなかテストしづらいのです。
ちゃんと「呼び出すファイル」と「ロジックを書いているファイル」を分けていればいいのですが、小さいプログラムを手っ取り早く実行できるようにしようとすると、やっぱり呼び出すファイルに直接書いた方が早いし解りやすかったりするのです(Hello Worldするためだけにフレームワークのあちこちを飛び回るようなプログラムは書きたくない)。
こういうのをなんとか自動テストの仕組みに乗せるにはどうしたらいいかと考えたのですが、結局テストって入力に対する出力を見るだけなので、入力に使う変数($_POSTなど)を差し替える、出力をバッファリングして捕まえる、というのがある程度の落としどころかなと考えています。
mifumi323/PhpTestTemplateGenerator
昨日の日記で行っていたPHPのテストのテンプレートを自動生成するプログラムを作ってみました。
まあ、このプログラムの方はPHPじゃなくてC#でできているんですが。
あと、画面上で編集してから保存したかったり、一部分だけ抜き出して既存のテストコードに付け加えたかったりしたので、GUIになっています。
何もないところからの全自動生成ならCUIの方が有利なんですが、後付けで様子を見ながらの作業なので、状況が見える方が都合がいいのです。
一応一般公開していますが、自分用のツールなので、他の人にとっての使い勝手は知りませんし、実行ファイルの配布もなしです。
テストを一個一個個別に完成させていこうとすると何をどこまでテストしたかわからなくなってくるので先に未完成のテストを一通り作っておく。 pic.twitter.com/h9k248W0rM
— 📛松田美文 (@matsuda323) February 25, 2022
PHP8.1に上げたらエラーがいっぱい出たというのも、CIが落ちるようになったのも、テストが充分であればある程度防げたはずのことだったのです。
ということで、自動テストのカバレッジを上げる方向で、クローリングではテストできない編集機能周りを中心に、テストコードを増やしていこうと思います。
とりあえずエラーが取れたので、CIが落ちる方を暫定対応。
落ちるテストをしなくしたというだけの、本当に解決にならない対応なんですけどね。
テストしなくなった対象のコードを使わなくする方向で根本対応を検討中です。
ひとまず、今エラーが出ている部分は修正終わり。
Anpanatorはデプロイ方法の都合で明日に修正が反映されます。