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

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

<前 次>

アンパンマンDBとドラゴンクエスト10とAmazon CodeWhisperer

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

買った当時に一応確認はしたんだけど書いてなかったやつ、今更ながら書きました。
歌の勇気の花が開くときが'99バージョンで、新録はBGMのみでした。

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

ルネデリコの前で寝る

  • クエスト「闘争する芸術の夜明け」をクリアした!

ストーリー中で戦ってきたボスと再戦できる機能を解放するクエスト、やってみました。
クエストは案外簡単だったので、全キャラ一気にやってしまいました。

再戦の方ですが、普通の強さの方は、今まで通りで特に問題なし。
で、追加難易度となる「超強い」に関してですが、想像以上に超強くなっていました。
今のスペックなら通常攻撃ワンパンで倒せる初期村ボスが、超強いだとこっちが通常攻撃ワンパンで倒される強さ。
基本的にレベルMAXじゃなきゃ話にならなくて、それでいてノルマも結構厳しいので、現状一番強いミフミンでも安定しません。
とりあえず今のところは、ミフミンだけ欲しい報酬がもらえるところまでやりました。

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

Amazon CodeWhisperer


AI コードジェネレーター - Amazon CodeWhisperer - AWS
AIでコーディング支援してくれるツールです。
GitHub Copilotは有料なので、無料で試せるこっちをVSCodeに入れてみました。
今のところサンプルコードでしか試していませんが、前後の文脈を見てそれっぽいコードを書いてくれています。
やりたいことを書いたコメントからでも書いてくれるらしいのですが、そっちは試せていません。
GitHub Copilotと比べるともっさりしていると聞いたのですが、個人的には自動補完はちょっと待つぐらいがちょうどいいので、気にしてはいません。

Haxe(Today I Learned)


Haxe、興味は持ちつつも全然触ってなかったので、ちょっと手ごろなサンプルコードをAIに出してもらいました。
コマンドは少々修正が必要だったけど、コードの方は特に問題なくビルドできました。

出来上がったコードは、C#側は.NET Framework 2.0、PHP側はPHP 7.0相当のコードが出てきて、両者とも、Haxe自身の言語仕様やライブラリとの互換性のためのファイルがいくつか追加されていました。
C#の方は、丁寧にもDLLにまでビルドしてくれたので、コードで共有しなくても、このDLLをプロジェクトに追加すれば、Haxeで作ったライブラリをC#で使えることになります。
PHPの方は、パッと見た感じ、互換性用のファイルが、PHP 8.2ではエラーになりそうな感じだったので、何か追加対応をしてエラー解消するか、これのためのPHP 7.0サーバーを作るか、何か対応が必要そうです。

プロジェクト実質停止してるけど、funyakあたりでも何かしらの形で使ってみたいんですよね…。

PESPA(Today I Learned)

Webの次世代アーキテクチャ - PESPA - Qiita
Webアプリの作り方で、JavaScriptに頼らないシンプルなマルチページアプリは良くも悪くも愚直で、一見スマートなシングルページアプリは複雑怪奇、両方のいいとこどりをしたのがPESPAってとこかな。
こういうのは代表的なフレームワークを使って1個何か作ればよくわかる気がするけど…うーん、何を作ろうか。

アンパンマンDBとさかだちの街とカスタムURLスキーム

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

来週の放送情報。

さかだちの街


またちょっと進めました。
残るはあと1ステージ。

カスタムURLスキーム(Today I Learned)

カスタム URL スキーム の 設定 と 利用 - galife
HTMLのリンクから他のアプリを起動できる機能。
試してみたらうまく起動できないパターンもあったので何とかできないか検討中。
巧くいろんなアプリ起動できたらいろいろ捗りそう。

Twemoji

Twemojiが2023年になると表示されなくなる(かもしれない)問題に対処する
アンパンマンDBのコメント欄とか、プロフィールページとか、主にユーザーからの入力を表示するページで、環境によらず統一的な絵文字を表示するTwemojiを使っていたのですが、どうにもそのままの設定だと年末に使えなくなる可能性があるとのこと。
なので、スクリプト(twemoji.min.js)は自前ホスト、絵文字本体はjsDelivrを参照するように変更しました。
参照先を変えられるようになったので、仮にjsDelivrもダメになったとしても、GitHubのTwemoji本体が無くならない限りは置き場所を変えつつ継続可能なのです。

MisskeyとナマライザとGitHub Codespaces

Misskey

📛松田美文 (@matsuda323) | Misskey.io
登録してみました。
マストドンとはまた別の分散型マイクロブログだとか。
Twitterから移行するというよりは、あちこち様子を見てみたいという気持ちですね。

ナマライザ

ライブラリ更新 · mifumi323/Namalyzer@6dd8da4
昨日のWellKnownUriParserが期待通りに動いていたので、ナマライザに反映。
こっちはまた日を改めてリリースしようと思います。

GitHub Codespaces(Today I Learned)

GitHub Codespaces のドキュメント - GitHub Docs
で、ナマライザのリポジトリの操作のためにGitHubに行ったらこんなのがありました。
クラウドの開発環境で、月60時間までは個人だと無料だとか。
継続的に使うかどうかわかんない技術を手元の環境を汚さずに試せるし、時間にさえ気を付ければそのまま本格的に開発に入ってもいいってことかな。

サイトの近況とサマルトリア王子同盟とYarn

サイトの近況

最近、リファラを独自に解析した検索フレーズ一覧が、URLだらけになってきました。
詳しく調べてみたところ、「https://www.google.com/url?q=https://tgws.plus/anpandb/tekkanokomakichan&~」みたいな、検索のURLと似たパラメータを持つリダイレクト用のURLを誤認しているようでした。
最近はGoogleでも他の検索サイトでも、プライバシーのため本来のリファラを出さなくなったので、リファラを解析しても、間に挟んだ何の情報もないページしかわからなくなったんですね。
リファラ自体あまり来なくなったとはいえ、一応リダイレクトは除外するように対応しておこうかな…。

アキタラヤメル「サマルトリア王子同盟」

エラーログに微妙な警告が残っていたので対応しているのですが、維持し続ける必要あるのかなって思っています。
参加者は昔来てくれた3名だけだし、ファン活動で繋がりたいなら昔みたいな同盟サイトに頼らず各種SNSでやればいいし、むしろうちのサイトに記録が残るのはある種のデジタルタトゥーなのでは?と思ったりもします。

Yarn(Today I Learned)

Home | Yarn - Package Manager
JavaScript向けのパッケージ管理システム。
私はnpmしか使ったことなかったですね…。
そもそもあんまり大々的にJavaScriptを使いたい気持ちもないし、一応知識として知っておくだけ知っておこうかなというところ。

.NET MAUI


Build your first .NET MAUI app - .NET MAUI | Microsoft Docs
VS2022がバージョンアップして、.NET MAUIが普通に使えるようになりました。
とりあえず試してみたんですが、UI作るところではグラフィカルなデザイナは表示されないみたいですね。
今のところ、特に作りたいアプリもないので…どうしましょうかね。
自分用だとWPFで結局事足りそう。

ドラゴンクエスト10と更新履歴とSolidJS

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

お宝集めて大航海!「幻の海トラシュカ2022」 (2022/7/5)|目覚めし冒険者の広場
一日遅れですが、トラシュカ始めました。
まずはミフミンから始めたんですが…

幻の海トラシュカ2022
なんだ…

幻の海トラシュカ2022
なんだ…

幻の海トラシュカ2022
なんなんだ!!!

幻の海トラシュカ2022
オールスターどころか無法地帯じゃないか!

お宝は、いつもの宝石やら魚やらがらくたやらに加えて、キャラクターの像が落ちてきます。
通常の像はもちろんのこと、ドット絵像、ちびキャラ像など、何でもあり。

邪魔してくるモンスターたちも、いつものばくだん岩系統はもちろんのこと、例年だと高々一種類しか出なかった特殊仕様のモンスターが、遠慮なく続々降ってきます。
死角となる海面から飛び出してくるサメ、地面を揺らして足止めしてくるモアイ、視覚妨害してくるイカ、他にも何かいた気がするぞ。

お宝の方は、何が出てこようとも、出てきたものを取るだけなのですが、モンスターの方は予測不能だから対応しきれなくて、やるたびにスコアが乱高下します。
今回はよくできた………あれえええええ???…みたいなことになっちゃうことも。

景品とかの画像は一覧から見てください。
こっちはこっちでツッコミどころはあるものの、本編が突き抜けているので相対的に控えめです。
写真置き場「2022/07/14」 | ミフミンのDQ10メモ

更新履歴

根本的な作り直しの続き。
現行データからの移行ツールを作りました。
これで実際の運用に近い形で画面を見ながら開発していけます。
テストデータを使ったテストは随時行っていますが、やはり最終的には本物のデータが一番わかりやすいですからね。
もちろん、本稼働開始のときにも使えるツールなのです。

SolidJS(Today I Learned)

リアクティブJavascriptライブラリ
Reactの代わりに使えそうなJavaScriptのフロントエンドフレームワーク「SolidJS」。
別にReactで不満を感じていたわけではないのですが、フレームワーク自体のコードが小さい、それどころかビルドすると消えてなくなるというのはすごいですね。
Anpanatorあたり書き換えてもいいのかなとか思ったり思わなかったり。

@WIKIとアンパンマンDBとPHP

@WIKI

管理画面のメモ用Wiki、@WIKIに移転しました。
もともと非公開コンテンツだったので、@WIKIでもやっぱり非公開です。
ページ名だけはURLにアクセスすればわかってしまうのですが、まあ、URLも非公開なので多分大丈夫でしょう。

アンパンマンDB

「鉄火のコマキちゃんとミス・マリーネ」の作品情報を追加
「どんぶりまんトリオとオーロラ姫」の作品情報を追加
来週放送情報の追加。
美しい大人の女性のキャラクターがABともに出る感じですね。

PHP(Today I Learned)

PHP: 配列 - Manual
配列のアンパック。
array_mergeでやっていたような配列の結合を、[..$array1, ...$array2]みたいに記述できる機能です。
簡潔な構文で記述できて、性能もよくて柔軟性も高いそうです。

PukiWikiを復活させようと試行錯誤していた時に見つけました。
機能自体は7.4からあったのですが、うちのサイトでは7.4をすっ飛ばして一気に8.1まで上げてしまったので、気付けませんでした。
ネット上の記事では、JavaScriptでの同様に機能からの類推で、「スプレッド構文」と呼ばれることが多いようですね。

ただ、便利で、今後は積極的に使っていきたいとは思うのですが、性能がいいからと言って、過去のコードのarray_mergeまで全部置き換えるのはちょっと無謀かなって思いました。
というのも、array_mergeを削除するのはいいとして、丸括弧()で囲っていた部分を角括弧[]で囲ったうえ、両方の配列に...を付けるって言うのが、繰り返し間違いなく行うには結構複雑な手順なのです。
特に...忘れに関しては、エラーが出ずに、ただ望まない処理結果が返るだけなので、間違った修正をしても気付かずに、発見したころには元のコードを忘れていて修復不可能、ということが起こりそうなのです。

カバレッジ

カバレッジのグラフ
サイズがでかいので画像は直接貼りませんが、カバレッジの推移のグラフを表示する機能を作ってみました。
昨日紹介した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と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は数に入れないなど)があるのですが、全部目指したらきりがないので、とりあえず今回の修正で妥協しました。

<前 次>