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

<前 次>

PukiWiki

PHPのバージョンを8.1に上げてから、Wikiが動いていなかったので、Wikiのバージョンを上げました。
エラーが少なければ自前で解消したかったのですが、多すぎたので、PHP最新バージョンに対応したバージョンに切り替えました。

PukiWiki/Download/1.5.4 - PukiWiki-official

ただ、今あるWikiはもうどれも保守する気はないので、全面的に凍結しています。
管理画面にこっそり置いてるメモ用のWikiも、どっかのレンタルWikiに移行してしまうつもりです。

カバレッジ

カバレッジのグラフ
サイズがでかいので画像は直接貼りませんが、カバレッジの推移のグラフを表示する機能を作ってみました。
昨日紹介したRindow Math Plotは、ファイルへの保存は対応しているように見えて事実上対応していなかったので、直接表示するページを管理画面に作りました。
横軸はカバレッジ記録開始した日からの経過日数にして、上下に並べて時系列で傾向を見られるようにしました。
新機能を実装して複雑性が上がるとカバレッジが下がり、複雑性が上がらない間はテスト作成を頑張ったりしているのでカバレッジは上がる傾向があります。
今、日記の内部挙動を変えようと思っていて、内部挙動を変えても外部仕様が崩れないことを保証するために、日記の、特に管理画面のテストの作成を頑張っています。

リトルノア楽園の後継者とドラゴンクエスト10のプレイヤーイベントを検索および通知するサイトとRindow Math Plot

リトルノア楽園の後継者

リトル ノア 楽園の後継者 | Cygames
復活ですとっ!?
まあ、前作の完全版でもなければ続編でもないし、何ならゲームジャンルも全く別物だけど、なかったことになってなかったというのはちょっと嬉しいですね。

あと、買い切りというのも個人的には嬉しいところ。
前作は基本無料アイテム課金でストーリーをちょっとずつアップデートで足していく方式だったのですが、プレイ人口が減っていって録にアップデートされなくなり、重要人物だったはずの人が期間限定イベントで茶番劇やったまま、何も解決せず未完でサービス終了しちゃったんですよね。
買い切りなら、最初に出した時点でひとまずエンディングまでは到達できるようになっているはずなんで、その点安心なのです。

8月にスペシャルエディション(2000円)も出るらしいですが、価格と内容を見る限り、単に本編+有料DLC2種を値引きせずセットにしただけのようです。
念のため説明しておくと、全部個別に買う(本編1500円+DLC第1弾300円+DLC第2弾300円=2100円)よりは100円だけ安くなりますが、DLC1+2パックが500円で100円安くなるんで、“スペシャルエディションとしての”値引きはないということです。
わざわざ待たずとも、後でDLCを買い足したほうが無難そうですね。

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

メールがまだ変だったので、SPFレコードを再設定して、今度こそ解決しました。

Rindow Math Plot(Today I Learned)


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();

アンパンマンDBとPHPとVoidolとInternet Explorer

アンパンマンDB

Twitterのハッシュタグのページを更新
「アンパンマンポテト」を追加しました。
「アンパンマン」タグで検索していると、ちょくちょくおいしそうなポテトの写真が出てくるので。

PHP(Today I Learned)

PHP: プロパティ - Manual
プロパティ自体は昔から使っていたけど、8.1からはreadonlyが付けられます。
最初に代入した値以外に変更できなくして、想定外の変更によるバグを防ぐ、イミュータブルを実現できるというやつです。
で、もう一つ…

PHP: コンストラクタとデストラクタ - Manual
8.0から追加されたコンストラクタのプロモーション機能と組み合わせると、コンストラクタを書くだけで、最初にデータを全部受け取って保持するイミュータブルなクラスが簡単に書けてしまうというわけなのです。

まあ、今開発しているものは、ミュータブル(変更可能)なことに意味があるクラスなので、readonlyの方は使ってないのですが。
でも多分、今後どこかで必ず使うことになると思います。
…覚えていれば。

Voidol

Voidolを期間限定で無償配布します。PC Watch様にも取り上げていただきました。 | クリムゾンテクノロジー株式会社
ボイスチェンジャー、インストールしてみました。
私はあまり声出し配信とかしないのですが、VRChatをインストールしてたり、やっぱりたまには配信したくなるかもしれなかったりするし、そのときに地声から離れたらちょっとは抵抗感なくなるのかなと。
まだ試運転すらしていないですが、何かしら喋るネタでも探して試してみようかな。

Internet Explorer

IEはとっくにサポート終わってるわけですが、IEと一緒に使えなくなってしまったサイトが世の中にはいろいろとあったそうで、うちのサイトはどうなのか、というのを一応語っておこうと思います。

まず、そもそも当サイトTGWSは、Internet Explorerに対応していません。

一部のコンテンツ(具体的に言うとミディビ)だけは、IEにだけ残されたプラグイン機能に依存していましたが、そっちはそっちで、早々にプラグインの方がサポート外になったので、IEがサポートを続けようとももはや動きません。
このようなコンテンツは、歴史的な理由で残しているだけなので、今後も、特段の事情がない限りは、サポート外のまま残ります。

一方、ページ構成としては、一部を除き、JavaScriptやCSSが正常に機能しなくてもHTMLの基本的な機能だけで成り立つようになっています。
なので、IEでもそれ以外でも、何なら古いバージョンでも、多少崩れながらも意味が解る程度には表示できるかと思います。
おそらく、将来ブラウザが進化しても、それなりに表示できることでしょう。

なので、IEがサポート終了したことで、私のサイトが変わることはありませんし、移転や閉鎖の予定もありません。

アンパンマンDBとNeoMuplと更新履歴とPHP

アンパンマンDB

未実装のアイディア。
「ヤーダ姫」とか、「かつぶしまんと鉄火のマキちゃん」とか、タイトルだけで区別のつかない記事がいくつかあります。
そういうのに区別をつけるために、今は「ヤーダ国のヤーダ姫」みたいな説明的な名前を、「他の呼び方」に入れて対応しています。
こういう説明的なタイトルの、タイトルそのものじゃない補助的なテキストを、独立項目として作ろうかと考えています。
ヤーダ姫の例で言えば、「ヤーダ国の」や「ヤーダ星の」などを入れる形です。

NeoMupl

ファイルの場所を開く機能 · Issue #29 · mifumi323/NeoMupl
これまた未実装のアイディア。
ショートカットファイルを右クリックしたら出てくるメニューの項目みたいなやつです。
浮き沈みランチャーには同じような機能を実装しているので、そんな感じで。

更新履歴

先月やっていた根本的な作り直しの続き。
履歴項目の読み込みを作っている最中なのです。

PHP(Today I Learned)


で、そのときに、データベースから読み込んだ結果をPHPのクラスに変換する処理で、callableを渡す新しい書式。

PHP: 第一級callableを生成する記法 - Manual

PHP8.1から出てきた記法で、従来は「['NoteItem', 'fromArray']」と、文字列の配列で記述するしかなかったのですが、「NoteItem::fromArray(...)」という書き方で同じ意味を表現できるようになったのです。
文字列だと、プログラム的に意味があるのか単なるテキストなのか文法的には区別がつきませんが、「(...)」を使った記法だと、明確にプログラム的に意味のあるcallableとして書けるのです。
ただ…見た目気持ち悪いですね…慣れるしかないか。

美文のキャラボックス(仮)と原神

美文のキャラボックス(仮)

Advanced Custom Fieldsを使って記入したカスタムフィールドをいい感じに表示するためにInsert PHP Code Snippetを使ってみました。
一発で全部表示みたいな便利関数はなかったけど、その分自分で全部決められる自由度はあるので、まあこれはこれで…。

WordPressって標準機能の時点でそこそこ充実しているけど、細かい利便性はプラグインに任せているようで、細かいことですぐプラグインが必要になってきますね。
まあ、今回はテーマのファイルに手を加えたくなかったというのもありますが。

原神


原神、始めました。
とはいえ、よく見るコイツの名前をど忘れして確認のためだったのであまり真面目にやる気はないのですが。

ドラゴンクエスト10と日記

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

哭声のアイテム(名前忘れた)
昨日ぶち抜いた槍を掲げて、聖守護者のクエストはクリア。
そして、途中まで進めていたレベル上限解放クエストも、無事クリアしました。
昨日戦ったボスと同様、ブレス攻撃が苛烈だったので、今日もレンジャーで行きました。
ブレス以外の攻撃も全部強烈だったのですが、ブレスの頻度が高いので、ブレスを無効化し続ければ半分くらい無駄行動にさせられるのです。
それに加えて、柱のある地形なので、柱に引っ掛ければかなり長い間拘束できるというのもポイントでした。
というわけで、とりあえずミフミンのレベル上限が120→122になりました。

ボスの画像は写真置き場でどうぞ。
写真置き場「2022-03-20」

日記

内部的なリニューアル、一般用ページは完了しました。
Smartyを使っていたところを普通のPHPに置き換えるというのもやっていて、だいたい日記ページで1割前後早くなったようです。
管理ページのリニューアルが中途半端な状態なので、「古いコード残ってんぞ!」ってエラーを吐き続けながらこの日記を書いているわけですが…。

うん、日記に限らずなんですが、Smartyやめたいんですよね。
使ってる場所が多すぎて手を付けきれていないだけで。

PHPUnit

ちゃんとクラスになっている部分はテストできるのですが、サーバーから呼び出されるPHPファイルに直接あれこれ書いているものは、なかなかテストしづらいのです。
ちゃんと「呼び出すファイル」と「ロジックを書いているファイル」を分けていればいいのですが、小さいプログラムを手っ取り早く実行できるようにしようとすると、やっぱり呼び出すファイルに直接書いた方が早いし解りやすかったりするのです(Hello Worldするためだけにフレームワークのあちこちを飛び回るようなプログラムは書きたくない)。
こういうのをなんとか自動テストの仕組みに乗せるにはどうしたらいいかと考えたのですが、結局テストって入力に対する出力を見るだけなので、入力に使う変数($_POSTなど)を差し替える、出力をバッファリングして捕まえる、というのがある程度の落としどころかなと考えています。

PhpTestTemplateGenerator

mifumi323/PhpTestTemplateGenerator
昨日の日記で行っていたPHPのテストのテンプレートを自動生成するプログラムを作ってみました。
まあ、このプログラムの方はPHPじゃなくてC#でできているんですが。
あと、画面上で編集してから保存したかったり、一部分だけ抜き出して既存のテストコードに付け加えたかったりしたので、GUIになっています。
何もないところからの全自動生成ならCUIの方が有利なんですが、後付けで様子を見ながらの作業なので、状況が見える方が都合がいいのです。
一応一般公開していますが、自分用のツールなので、他の人にとっての使い勝手は知りませんし、実行ファイルの配布もなしです。

PHPUnit


テストコードを書いていない部分が多いものの、ゼロからテストコードを書く部分はしんどすぎるので、全部の機能に対して、テストの最初の一歩となるテンプレートを作ってみることにしました。
テンプレートのままでは未完成なテストなので、Incompleteばっかり出ますが、逆に言えば、このIncompleteを手掛かりにテストを作っていけばいいということになります。

PHPUnit

PHP8.1に上げたらエラーがいっぱい出たというのも、CIが落ちるようになったのも、テストが充分であればある程度防げたはずのことだったのです。
ということで、自動テストのカバレッジを上げる方向で、クローリングではテストできない編集機能周りを中心に、テストコードを増やしていこうと思います。

PHP8.1

とりあえずエラーが取れたので、CIが落ちる方を暫定対応。
落ちるテストをしなくしたというだけの、本当に解決にならない対応なんですけどね。
テストしなくなった対象のコードを使わなくする方向で根本対応を検討中です。

PHP8.1

ひとまず、今エラーが出ている部分は修正終わり。
Anpanatorはデプロイ方法の都合で明日に修正が反映されます。

PHP8.1

致命的じゃないけどどえらい数の細かいエラーが出ていました。
ちょっとアンパンマンDBの管理にも支障が出そう。

PHP8.1

バージョン上げました。
今のところは、致命的なエラーなどは起きていないようです。

PHP8.1

とりあえず、自動テストでCI自体が落ちるのと、サーバー由来のどうしようもないやつ以外はエラーが起こらなくなってきました。
自動テストの方は、エラーの前提から崩すことができるし、どうしようもないやつはバージョンにかかわらずどうしようもないので、そろそろ本番環境で上げてしまってもよさそうです。

PHP8.1

開発環境でもテストプログラム自体が落ちる件を再現できました。
どうやら、アンパンマンDBの古いコードのカバレッジを取ろうとしていると、落ちるようです。
まあ、新たに開発することがない以上、継続的にテストをしても仕方がないと言えばないのですがね…ただテストをなくして落ちなくするより、古いコード自体をなくしてそもそもテスト不要にするのが正攻法だと思われます。
放置案件になりかけてる新管理画面にいよいよ着手せねば…。

PHP8.1とドラゴンクエスト10(ミフミン)

PHP8.1

管理画面を中心に修正。
あと、あえてエラー抑止している部分を、ちゃんと抑止するようにしました。
NOTICEなんて半端なことはせずに例外としてぶん投げたいんですよね。

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

いよいよミフミンで…

不思議の魔塔 次のフロアへの階段
新生不思議の魔塔に挑戦!
うん、ストーリーは進んでないんです。
以前とは通常階の進み方もボスも大きく変わっています。
10階ぐらいまではわかりやすい謎解きなんですが、それ以降は、持ってないものを後出しで要求されてそのたびに作りに戻る感じになっていました。
とりあえず30階あるうちの20階までクリア。

ストーリーコンテンツじゃないのでネタバレもへったくれもないと思いますが、数が多いんで他の写真は写真置き場でご覧ください。
写真置き場「2022-02-13」

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

PHP8.1

とりあえず、エラーは一通り直したつもり…。
ただ、アップしてからエラーが発覚することもあり、油断せずに様子を見ておこうと思います。
あと、普通のエラーを直しても、CIが落ちるのは未解決なので、そちらの対処も考える必要がありそうです。

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

ウェブニー
バレンタインイベント、最終結果が出ました。
私がまだ進めていないストーリーに登場する、ウェブニーです。
こういうキャラクターに会うためにも、一番進んでいるミフミンでストーリーを進めたいわけですが、タイトルを見ての通り、今日はァォィョッュの方を進めたのです。
別に全員均等に進めたいわけではなく、単にその日その日の気まぐれです。

ダークネスマリン
進めたのはメインストーリーではなくサブクエストの方。
別に後回しでもいいと言えばいいのですが、メインストーリーがはるかに進んだ後に昔のサブクエストをやると、旬を逃した感が強くなってしまうので。
魔剣士のクエストは、5話あるうちの3話分までやってバシッ娘の回数消費したので、4話目の途中まで進めています。

飛べる回数が尽きた後は、回数無制限で飛べる五大陸範囲でできる、ジュレットの配信クエストなどをやっていました。
こちらは、時間の関係で、5話あるうちの4話目まで終わらせて、最後のボスを残すのみです。
写真置き場「2022-02-12」

<前 次>