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

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

<前 次>

アンパンマン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を中心に起こっているので、そちらを重点的に修正中です。

Twitter API

Standard search API | Docs | Twitter Developer Platform
GET /2/tweets/search/recent | Docs | Twitter Developer Platform
Twitterの検索API調べてました。
検索クエリの上限文字数を知りたかったのですが、一般ユーザー向けとしては、以下のように書いてありました。

バージョン1.1:500文字
バージョン2:512文字

で、「文字(characters)」って何なの?ってことで、実測したのが以下のツイート。


バージョン1.1ではバイト数単位のようで、バージョン2は12文字増えたと思いきや500バイトすら検索できない模様。
マルチバイト文字で500バイト前後のパターンも試してみるか…。

スーパーマリオギャラクシーとComposer

スーパーマリオギャラクシー


ぼちぼち進めてます。
星船の最後の部屋と思われるロフトも開放。
現在スター53枚。

Composer

Twitter APIの件でライブラリをアップデートしまくっていたら、結構大きくバージョンが上がって、使いたくても使えなかった機能が実装されていたりしたので、他のも様子を見つつ上限を外してアップデートしています。
こういう時、ライブラリが自分の期待通りに動くかどうかの自動テストを作っておくと安心ですね。
個人的ツールのコメリストの新機能が作れそうです。

Twitter APIとドラゴンクエスト10

Twitter API

Twitter API v2開発準備してきました。
v1.1を利用中だと、審査なしで高度な方のElevated Accessが使えます。
で、

GET /2/tweets/:id/liking_users | Docs | Twitter Developer Platform
このAPIがアンパンマンワンドロのいいねチェックに使えないかなーって思って、試しているところです。

ドラゴンクエスト10

【2021再演】FFXIコラボイベント「シャントット博士来たる」
FF11コラボイベントの再演いつからだったかなと思ったら、とっくに始まっててもうすぐ終わりじゃないですか!!
新報酬があるのでその分だけでもやっておこう。

ちょうど今日始まったプリズランの方は、私の好みなイベントじゃないので、今回もパスの方向かな…。

PHPとドラゴンクエスト10

PHP

PHPのバージョンを上げたらSQLiteが使えない件ですが、サーバー会社に問い合わせたら、すでに対応が予定されていました。
とりあえずは待つだけで良さそうです。
ただ、SQLiteのための対応ではなくて、サーバー自体を根本的に新調するとのことで、メンテナンス時間はそこそこ長くなるようです。
その時が来たら、またお知らせします。

ドラゴンクエスト10

テリーとプーちゃん
テンの日。
バージョン6前夜祭だか何だか知りませんが、サーバー会社とのやり取りやVS2022で遊ぶのに忙しかったので、ドラクエ10の方は最低限の回収のみ。
この写真、右側にいるプーちゃんはテンの日にだけ出てきて、ボスカードをくれます。
左奥にいるテリーはランダムに表れて、ボスカードを渡すと倒してくれます。
つまり、このプーちゃんとテリーの組み合わせで登場すると、実質何もしなくてもボス討伐報酬がもらえます。
強敵は自分で倒してこそ、とは思うものの、ネトゲのボスは周回前提で正直だれるし、時間もないのでこういうのはありがたいのです。

<前 次>