「プログラミング」に関する日記(6)

プログラミング関係の話題。プログラミングコーナーを更新したとか、プログラミングの内容に踏み込んだ話とか。

<前 次>

リトルノア楽園の後継者とドラゴンクエスト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とTGWSAdmin

アンパンマンDB

「ドロリンとバケ〜るカーニバル」の作品情報を更新
キャラ「フワリー」を更新
映画のこと、書いてきました。
で、書き方で昨年の映画を参考にしていたら、昨年の映画のヒロインの情報が全然書けてなかったので、ちょっと追記しました。

TGWSAdmin

スマホで撮った縦長画像がうまく処理できていなかったので修正しました。
以下のサイトに、やりたかったことそのままのサンプルがありました。

EXIFの情報に基づいて画像を回転する - smdn.jp

PropertyItemsを見て回転、ですね。
サンプルは3種類の回転しか対応していなかったので、反転の方も対応して取り入れてみました。

GitHub CopilotとアンパンマンDB

GitHub Copilot

GitHub Copilot · Your AI pair programmer
コーディング補助システムですな。
ペアプログラミングのように、人が最初のコードを書いて、AIが続きを書いて、それを人が手直しして、という作業になるようです。
Visual Studioでもコードの続きを提案してくれる機能があるのですが、それをもっと大掛かりにしたようなイメージですね。
無料体験もあるようですが、その場合でも手続きが必要になるようなので、今のところ始めてはいません。

アンパンマンDB

昨日のやつ、キャッシュがあるときは24時間ごとにキャッシュ更新するというプログラムが、キャッシュがないときにしか働かないようになっていたのが原因でした。
なので、一度間違ったキャッシュを取得してしまうと、それをずっと表示し続けるようになっていたのです。
本来は、PA-APIの使い方として、24時間に一度更新しなければならないのですが、それもできていなかったようでした。

アンパンマン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として書けるのです。
ただ…見た目気持ち悪いですね…慣れるしかないか。

アンパンマンDB(みんなのタグ)とFlaky test対策

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

構想段階で全く着手していないアイディアなんですが、「共起度」というもの。
このタグとこのタグは一緒にいることが多いなってやつ。
これの統計を取っておいて、みんなのタグの編集画面での並び替えに活かしたいなと。
例えば、すでに「姫」のタグが付いていた場合、共起することが多い「女」を上の方に表示するとか。
「共起度」というのはわかりにくいから、「関連度」とかの用語にした方がいいかもしれないですね。

Flaky test対策

新VPSに移行してからはなぜか落ち着いているんですが、不安定なテストの対策。
ネットワーク関係など、プログラムが正しくても失敗してしまうテストがあります。
プログラムが正しいならそんなもの無視すればいいんですが、Flaky testだと思っていたものが実はプログラムミスだったということもざらにあるので、ネットワーク関係だからエラー無視、というわけにもいきません。
今のところ、毎回エラーの詳細を出力して、目視確認して、「これは今回だけの偶然だな」とか判断しているのですが、頻度が高いと面倒だし、精神衛生上もよくありません。
で、なんとかFlaky testを自動検出して、あるいはそうでなくとも、FlakyとわかっているテストはFlakyなりの判断基準を持たせて、ただFlakyなだけなら一応テスト成功として扱いたいなと。
実現するには、過去数回のテスト結果を保存しておいて、一定割合までの失敗なら許容する、くらいの扱いが現実的かと考えています。

参考:世界中のITエンジニアが悩まされている原因不明でテストが失敗する「フレイキーテスト」問題。対策の最新動向をJenkins作者の川口氏が解説(後編)。DevOps Days Tokyo 2022 - Publickey

美文のキャラ倉庫とTGWSAdmin

日記

昨日言っていた件、PHP側のバグを疑っていたんですが、日記の問題じゃありませんでした。
WordPressの記事に、不可視の制御文字が紛れ込んでいて、それがパース出来なくなっていたのでした。
そんな文字そもそもインターネットの記事に出すものじゃないので、記事から問題の文字を探して抹消して解決を見ました。

↓だいたいこいつのせい。
バナナゲーム2 – 美文のキャラ倉庫

TGWSAdmin

Twitter系のタスクで画像のALTに対応してみました。
Tweetinviを使っているので、以下のページを参考に。
Media Upload — Tweetinvi 5.0.4 documentation

まあ、ALTが最も必要になりそうなアンパンマン日替わり紹介botはTGWSAdmin使ってないんで関係ないんですけどね。

あと、ツイートの文字数計測を実際のTwitterに近い仕様にしました。
半角英数とかの7bit文字を全角の半分扱い、というやつです。
本当はほかにもいろいろなルール(URLは数に入れないなど)があるのですが、全部目指したらきりがないので、とりあえず今回の修正で妥協しました。

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

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

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

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

原神


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

mifumitter

どうやら検索等でもリツイートの省略の扱いは同じようです。
というより、ツイートを返すAPI自体が、Twitter API v2ではリクエスト・レスポンスともにほぼ共通する形式を持っていて、APIの目的ごとに追加のパラメータを持っているだけのようです。
となると、リツイートのメディアの補完に対応した共通部品を作るという方向性がいいかな。

mifumitter

リツイートのメディアがうまく取れない問題に遭遇。
まずそもそもの前提として、リツイートには、リツイートそのもののデータと、リツイートされた元ツイートのデータが含まれます。
そのリツイートそのものの本文は、「RT @○○: 元ツイートの本文」という形式になっているのですが、先頭に付く「RT @○○: 」の分だけ本文が長くなって、元ツイートが一定以上長いと末尾から省略されてしまいます。
で、どうやらリツイートに添付するべきデータは、Twitter API v2では本文末尾に付加されるURLを元に特定しているようで、末尾省略が発生すると、URLが消えたり不完全になったりして、特定できなくなってしまうようなのです。
解決するには、末尾省略を検出して元ツイートのデータを改めてリクエストする…とかかなぁ。

SelfRenamerとドラゴンクエスト10

SelfRenamer

mifumi323/SelfRenamer: 自分自身をリネームする実行ファイルの試み
以前試しに作ったものですが、普通はできない「実行ファイルが自分自身をリネームする」というのを、何とか実現してみるというやつです。
ソフトウェアの自動アップデートに使えそう…とはいっても、今どきならアップデータが別途あるものだし、実用的に使う機会はなさそうかなーというところ。
アップデータ自体の自動アップデートに使うか?

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

たいようのおどり
ァォィョッュのストーリー進めました。
アラハギーロ王国の神の碑石を守るクエストです。
ボス戦では、攻撃をちゃんと避けてたはずなのになぜか突然全員死んで一度負けたりしましたが、再戦で普通に勝てました。

ボス戦も含む当日の画像は以下から。
写真置き場「2022-04-24」

PHPUnit

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

PhpTestTemplateGenerator

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

PHPUnit


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

PHPUnit

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

PHP8.1

開発用サーバーが動くようになったので、本格的にPHP8.1移行を始めました。
バージョンアップでもひとまず動作は変わらないように、些細なエラーでも修正していきます。
ちょっと数が多すぎてCI自体が落ちている状況ですが…。

PHPUnit

カバレッジの変遷を自動で記録する仕組み作成中。
カバレッジが高いと、ある程度網羅的にテストができている証拠なので、高めておきたいのですが、何も考えずに開発していくとどんどん下がるんですよね。
下がっているのに気付いて対策を講じたり、上がっていくのを見て喜んだりなど、変遷を残しておくと、何かと使えると思うのです。

PHP7.4

PHP8にする前に、PHP7.4でもまだ動いていない部分がありました。
自動クロールで検出できない管理画面です。
PHPはバージョンが上がるにつれてセキュリティも向上していくのですが、そうすると当然、今はもうあてにできなくなった古いセキュリティ規格は打ち切られていくわけです。
そうはいっても他との兼ね合いで上げられないものは上げられないので、代替手段を探しています。
セキュリティ下げる形の話なので、これ以上詳しくは言いませんが。

PHP8とドラゴンクエスト10

PHP8

最終的には8.1まで上げてしまいたいので、もう8の動作チェックを始めています。
NULLチェックが7の頃よりさらに厳しくなって、NOTICEやらWARNINGが出ています。
ただ、ERRORやExceptionレベルのはなかったようで、その点は一安心です。

ドラゴンクエスト10

キング・ツリー
第10回アストルティア・クイーン総選挙!
毎年恒例バレンタインイベント開始です。
ひとまず、全員分クエストは終わらせました。
毎日投票に行くかどうかは気分次第。
こういうイベントで余計なネタバレ踏まないためにも、メインストーリーは進めておきたいんですがねぇ…。

セラフィ・リナーシェ・ナンナの像
景品の像も3キャラで全種類網羅しました。
衣装はダルメシアンモチーフで、特にバレンタインとは関係なさそうです。

WinUI 3とアンパンマンDB

WinUI 3

Windows App SDK を使用して新しいプロジェクトを作成する - Windows apps | Microsoft Docs
いつぞやのProject Reunionの正式版ですね。
ちょっと触った感じでは、UWPと大差ない感じ?
グラフィカルなツールが、エラーで使えませんでした。
やりたいことも別に定まってないし、まだまだ様子見かな。

アンパンマンDB

PHPバージョンアップに伴う微妙なエラー、アンパンマンDBを中心に起こっているので、そちらを重点的に修正中です。

<前 次>