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

<前 次>

アンパンマンDB(システム)

ストリクトクエリの件、区切り子じゃないコロンをどうするかでちょっと悩んでます。
str_getcsvは区切りとして扱わない区切り子を考慮してくれますが、そのためには「"」など囲み記号が追加で必要になるんですよね。
単なるCSV(ここではCharacter Separated Values)であればそれでいいんですが、アンパンマンDBの検索構文では、ルーズクエリ・ストリクトクエリ両方に共通する文法で、スペースや「"」を含む単語は「"」で囲むという仕様があって、クオートの仕様がぶつかってしまいます。
一応ぶつかったところで、どちらにもエスケープ処理はちゃんとあるので、「"」で囲んだものを「"」でエスケープして「"」でさらに囲むみたいなことをすれば、不具合なく取り扱えるはずですが、ちょっとさすがにややこしいかなと。
ストリクトクエリの囲み記号を「"」以外にするか、そもそもstr_getcsvを使わずに完全に独自仕様にするか…。

あと、ストリクトクエリをパースするのとは逆に、ストリクトクエリを構築する機能もアンパンマンDBにはあるんですが、str_getcsvの逆をやる関数が実はPHPには今ないんですよね。
CSVの構築にはfputcsvがありますが、これはファイルに出力されてしまいますし、末尾に余計な改行も追加されます。
多分どうにかする方法はあるとは思うのですが、そこまでしてPHPの標準関数使うべきかな…と思ったり。

やはり独自仕様にする…かなぁ。

アンパンマンDB(システム)

昔のアンパンマンDB(アンパンマンDB3)では、編集画面でプレビューすると、どの項目が編集されたか、編集内容を編集前と編集後で比較表示できるようになっていました。
しかし、今のバージョン(アンパンマンDB4)になって、項目の取り扱い方が大きく変わったため、比較表示機能は失われてしまいました。


復活させました。
今回、編集内容の表示機能を復活させるに当たって、以前より見やすくしてみました。
編集前後を並べるのではなく、diffコマンドみたいに差分のあった行を色分けして強調表示しています。
欲を言うならもっとdiffコマンドに寄せて、追加行に+、削除行に-をつけたりするとかあってもよかったかもしれないですね。

これを作るに当たって使ったライブラリは、編集データの文字列化に使うsymfony/yamlと、できた文字列の差分表示に使うsebastian/diffの2つ。
差分表示のほうははJavaScriptでやっちゃおうかなとか思ってたんですが、しっくりくるものがなかったので、結局どっちもPHPでやりました。

symfony/yamlは、構造化されたデータを複数行のわかりやすくdiffの取りやすい文字列に変換(シリアライズ)してくれます。
diffを取りやすいというのがポイントで、JSONだと配列の要素の後ろ(または前)にコンマがつくかつかないかが要素の順序で変わったりして、実質変化のない行まで差分になってしまうのですが、YAML形式だとそういうのが起こりにくくなっています。
ただし、構造化されていないただの文字列を渡すと、JSON形式の一行の文字列にまとめられてしまうので、この場合だけはシリアライズ処理をせずにそのままdiffに渡します。

sebastian/diffは、おそらくPHPUnitにも使われている、行単位の差分検出ライブラリです。
シンプルに使えば、一発でいい感じのdiff文字列を出してくれるのですが、HTMLページに表示するにはdiff文字列ではちょっと都合が悪いので、配列形式のデータを一度出してもらって、そこから自力でHTMLを作るようにしています。
差分行の色は、GitHubと同じ色にしました。

PHP8.4(Today I Learned)

【PHP8.4】メソッド引数のデフォルトnullがついに禁止される #PHP - Qiita
function foo(int $x = null)みたいな、null許容指定していないのにデフォルト値null入れてたらnull許容(ここでは?int扱い)になるっていう気持ち悪い挙動が今後なくなるみたいです。
で、うちの場合、PHP-CSFixerで@Symfonyの設定を入れていて、これがデフォルト値nullを入れていたら方の左に付いているnull許容指定の?を自動で消しちゃうんですね。
見た目気持ち悪いけど@Symfonyの推奨ならいいかーって思って消されるままにしていたんですが、今後そういうのは通用しなくなっていくので、対応を入れました。
先程の記事にも書いてあるのですが、nullable_type_declaration_for_default_null_valueオプションで、逆に?が足りないところに自動でどんどん付けてくれるようになります。

GitHub Actions

動くようになりました。
Composerのバリデーションは神経質すぎるところがあるので実行しないことにして、本当にやりたい自動テストだけにしました。
phpdbg使えなかったけど、普通にPHPUnitを動かすだけでカバレッジは取れました。
アーティファクトがばらばらのファイルじゃなくてZIPアーカイブしかなさそうなので、HTML出力したカバレッジレポートを見て回ることはできないけど、まあ手元でZIP展開すれば見られるのでこれはまあOK。
あとは…そう、もういらなくなったCircleCIとの連携を切るだけ。

Docker DesktopとBluesky

Docker Desktop

なんかドメイン追加したらコンテナが立ち上がらなくなったんですが、設定ファイル内のコマンド順序を入れ替えたらなぜか動くようになりました。
カレントディレクトリがおかしい系のエラーみたいだったから、コマンド内部でひっそり変わってるのかもと思ってコマンド順序を入れ替えたのですが、ディレクトリの確認はしてないので、実際のところ本当にこれでよかったのかは謎です。
致命的ではないもののPHPのエラーも起きているようだし、もうちょっとしっかり設定を見直してみてもいいかもしれません。

Bluesky

とりあえず、自分のアカウントへのリンクをうちのサイトのトップページに追加しておきました。

Docker Desktop

dockerのphp8にGD ライブラリをインストール #PHP - Qiita
このへんを参考に画像ライブラリ入れてみました。
これでとりあえず画像は表示されるようになりました。
文字列の表示とかツイート文字数計測とか、なぜかうまくいかない部分がまだ残っていますが、ひとまず目立つ部分はいい感じに動くようになりました。

Docker Desktop

.htaccessの調整を進めたのと、PHPの画像関連の拡張の有効化。
ただ、まだローカル開発環境で画像は表示できてないです。
何が足りないんだ?

Docker Desktop

リダイレクトループの件は、リバースプロキシ兼TLSに使っているNginxとPHPの実行環境になるApacheの間の通信が暗号化なしのHTTP通信だったため、クライアントとの間がすでにHTTPSなのに気付けず強制HTTPSのリダイレクトを繰り返していたということでした。
強制HTTPSに条件を追加することでとりあえずは回避しました。
あとは、画像がうまく表示されないのをどうにかしないと。

PHPUnit

ちょっと前からテストが動かなくなっていたので、ちょっと修正していました。
ちょっと修正というにはちょっといろんなところを調べまわってちょっと大変だったのですが。
で、最終的に何が悪かったのかというと、ネットの疎通確認に確実に存在するURLとして http://example.com/ を使っていたら、https://example.com/ にリダイレクトされていて、httpの方に繋がらないぞという判定になっていたことでした。

大変だったのは、それを突き止めるために別ソフトの修正を行ったら、修正が何も反映されず古いビルドが使われ続けたこと。
こっちは、修正が反映されなくなり始める前のバージョンまでソースを差し戻して、そこから新たに修正し直しました。
こういうのをどうにかできるのはGitなどバージョン管理システムのいいところですね。

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あたりでも何かしらの形で使ってみたいんですよね…。

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

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

クイーンディオーレ号のシャンデリア

  • クエスト「リーネさんのセレブな日常/素敵なナイトクルージング」をクリアした!
  • クエスト「リーネさんのセレブな日常/刺激的なシーサイドラン」をクリアした!

以前別キャラで茶番茶番と言っていたあのクエスト、ァォィョッュでも途中まで進めました。
これ進めておかないとアクセ屋のカーメロさんがずっとうるさいのでね。
本当は一気に終わらせてしまうつもりだったのですが、記憶していた以上にあちこち走り回らされて、今日中には終わりませんでした。

しかし改めて同じクエストをやってみて、ドラクエ10は人間相手だと手ぬるいなぁ…と。
モンスターみたいに息の根を止めてはいけないにしても、元気に走り回れないぐらいダメージ与える(婉曲表現)とか、せめて身柄を拘束ぐらいはしないと…。

ともかく、他の写真は以下から。
写真置き場「2023/09/04」

アンパンマンDB(システム)

テスト環境でアップロードができない問題、解決しました。
サーバーとPHPを繋ぐFastCGIが、特に何も指定しない状態だと、ほとんど無に等しいアップロード容量になってしまうのが原因でした。
ここはPHPに合わせて、2GBまでアップ可能にしてみました。
まあ、動画サイトじゃないのでそんなにアップすることはないけど。

アンパンマンDB

テスト環境の方で、ファイルをアップロードできないトラブル発生中。
本番環境の方はアップロードできるので、運営には今のところ支障はないのですが、新機能の開発とかには影響があります。
PHPの方の設定には問題なさそうだから、Webサーバーあたりかなぁ。

バイオハザードRE4とPHP

バイオハザード RE:4 Chainsaw Demo

ゲーム記に『バイオハザード RE:4 Chainsaw Demo』を追加
ゲーム記にページ作りました。
体験版をやった限りでは高く評価してるんですが、製品版と買うかというと、ちょっと無理かなぁ…と思っています。
以前も書いたように、私がもう操作下手過ぎるんですよね。
視点操作が逆になりがちで、操作中に混乱することが昔から多いんです。
ただ、だからと言ってTPS・FPSを敬遠していると、そのジャンルの面白いゲームを一生楽しめないし、安売りしている過去作で練習してみるというのも一つの手かも…。

PHP

まだ開発環境でエラーが起きることがあるので、本番環境となるべく同じになるように設定を調整していました。
デフォルトでZIPが使えないのが盲点だった。

PHP8.2

開発環境もPHP8.2に上げました。
Windowsなんで無難にXAMPPでいいかーって思ってインストールしたら、まさかのPHPがバグってるバージョン(正確には拡張モジュール)。
バグってないバージョンでプログラムを上書きとかもしてみたのですが、うまくいかず。
結局、XAMPP抜きでインストールする手順で、最新版をFastCGIとして設定したら、期待通りに動作しました。
もともとXAMPPに入っていたPHP関連の設定は邪魔になるので全部消しました。

アンパンマンDBとPHP

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

「ロボリィとぽかぽかプレゼント」の作品情報を更新
監督が判明してたので追記しました。

PHP8.2

Composerもアップデートして、移行時に発生したDEPRECATEDは大体収まりました。
あとは開発環境を8.2にできれば完了だけど、今まで通りXAMPPにするか、今どきらしくDockerにするか…。
Windows版のPHP8.2は一度入れてみて、必要なモジュールがバージョン不整合で使えないみたいだったので、その法則で行くと、Windows版のXAMPPも危ないような気がしています。
不慣れで不安だけどDockerでどうにかしてみるか。

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

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

キャラ「ロボリィ」を更新
ゲスト声優が発表されたので、追記しました。

PHP8.2

切り替えました。
今のところ致命的なエラーは起きていませんが、PHPUnitがバージョン足りなくてテストできなかったり、DEPRECATEDが思ってもみなかった場所で出たりして、対応をしていました。

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

プレイベの通知メールです。
普通は一般ユーザー(閲覧者)が見るところではエラーはログにだけ残して非表示にしているのですが、メールが対応漏れてました。
今は修正完了しています。
こういうの、日記で事後報告じゃなくて、ちゃんと告知できるような仕組みも必要かなぁ。

PHP8.2

サーバー会社に問い合わせようと思って、起こっている問題の範囲を特定するため、PHPのバージョン別に確認しようとしたところ、PHP8.2が使えることが判明しました。
現在使っているのがPHP8.1なので、マイナーバージョン1段階アップです。
8.2の方ではWarningは出ないし、当然ながら新機能もあるので、切り替えてもよさそうです。
とりあえず、本番環境に限りなく近いステージング環境では、PHP8.2に上げてもDEPRECATED以外のエラーは出ていません。
DEPRECATEDは将来的になくなる機能を使っているという警告で、バージョンアップの際に必ずと言っていいほどぶつかるものの、次のバージョンアップまでに直せばいい類のものなので、切り替えのタイミングでは特に問題はありません。
ただ、開発環境の方が、なぜかモジュールのバージョン不整合を起こしており、切り替えに手間取る可能性がありそうです。

TGWS内部処理とPHPと美文のキャラ倉庫

日記に書けるような活動しとらん。

TGWS内部処理

常々やっていることですが、今日も細かいエラーを取ったりとか管理画面を微妙に便利にしたりだとかコードの効率化とかしてました。

PHP

先日から続いているWarningの件、様子見てても直る気配がないので、そろそろ問い合わせてみようかと思います。

美文のキャラ倉庫

XFREEのWordPressでやっていたのですが、去年書いたように、データベースの文字コードの問題で記入に不便があり、フリーのサーバーゆえにサポートもないので、やっぱり自前でホスティングしようかなとか考えています。

アンパンマンDBとPHP

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

記事…じゃないけどシステムじゃない方なんでこの見出しでいいか。

Twitterのハッシュタグのページを更新
#映画アンパンマンで衝撃的だったこと選手権を追加しました。

Twitter APIが使えなくなったらこの一覧の自動更新も止まりますが、一覧自体は残すつもりです。

PHP

未明の1時半あたりから、CRONで動かしているPHPが警告を出し続けています。
「Failed loading Zend extension 'opcache'」とのこと。
拡張機能がなぜかなくなっているようです。
うちはレンタルサーバーを借りている身なのでちょっと手出しができませんね…。
警告だからエラーで止まるわけじゃないけど、数日で直らなかったらまた問い合わせてみよう。

<前 次>