自分のWordPressで学ぶPHP講座(AIの変更を判定する)

区分5 判定の型★★★

No.11 AIの変更をOK/NGにする5つの問い

ここまでの総まとめです。AIが変更を出してきた時に、毎回同じ5つの問いでOK/NGを出す型を作り、最後に卒業課題で自分のサーバーの実物に当てます。新しい知識は無く、型にして使えるようにする回です。この回はしっかりやります。
目次
  1. 第0章 前提知識
  2. 第1章 5つの問い
  3. 第2章 NGの時のAIへの返し方
  4. 第3章 卒業課題
  5. 確認問題

第0章 前提知識

① 5つの問い  :毎回同じ順で、同じことを聞く

AIの変更を見るたびに、ゼロから考えていると疲れますし、見落とします。 そこで、毎回同じ5つの問いを同じ順で当てます。

たとえ話にします。 飛行機のパイロットは、慣れていても毎回チェックリストを読み上げます。腕の問題ではなく、忘れないための仕組みだからです。

② 差分  :変更の前と後の違い

差分(diff)は、変更の前と後を比べて、足した行と消した行を示した物です。 No.06 で見たように、足した行は+、消した行は-で読みます。

判定する対象は、AIが「やりました」と言った文章ではなく、差分そのものです。

第1章 5つの問い

① 5つの問いの一覧 必ず覚える

問い 見ること 該当する単元
1 どのファイルの、いつ動く所か 場所と、動く時機(毎回か、特定のページだけか) No.01、02、05
2 外から来る値は、どこで、消毒(sanitize)されているか 訪問者が送れる値(URL の ? 以降、フォームなど)を使っていないか No.07
3 画面に出す値は、エスケープ(escape)されているか 画面に出る前に、無害な形に変えているか No.07
4 控えと戻し方はあるか。下見したか 変更前の控え、戻す手順、本番の前の確認 No.06、09
5 全員に効くのか、一部の人だけか 影響の範囲。意図と合っているか No.05、06

覚える順は、そのまま問いの番号で構いません。 5つのどれかに答えられなければ、その時点でOKは出さず、AIに聞き返します。

② 問い1と5:範囲を見る 必ず覚える

問い1は「どこの、いつ」です。 functions.php に足された処理が、全ページで毎回動くのか、フックを使って特定の場面だけ動くのかを読みます。

問い5は、その結果が「誰に効くか」です。 全員に出るはずの変更が、一部の人だけだったり、一部の人だけのはずの変更が、全員に出ていたりするのが、よくある事故です。

この2つは、AIの説明と、実際の差分が一致しているかを確かめる問いです。

③ 問い2と3:入口と出口を見る 必ず覚える

問い2は入口です。訪問者がURLやフォームで送れる値は、悪意のある物かもしれません。 値を使う前に、消毒(形を限定する、許可した値だけを通す)されているかを見ます。

問い3は出口です。画面に出す値は、エスケープ(HTMLとして働かない形に変えること)されているかを見ます。

どちらも No.07 で見た形です。 差分の中に、外から来る値が出てきたら、入口の消毒を探します。画面に出る値が出てきたら、出口のエスケープを探します。

④ 問い4:戻せるかを見る 必ず覚える

変更の前の控えと、戻す手順があるか。 本番に入れる前に、下見(本番とは別の場所で確かめること)をしたか。

AIの変更に、これらが書かれていなければ、聞きます。 控えと戻し方が答えられない変更は、内容が良くても保留(OKもNGも出さず、控えと戻し方が揃うまで止めておくこと)にします。

第2章 NGの時のAIへの返し方

NGを出す時は、「だめ」だけでなく、直す点を返します。 AIは、理由があれば直せます。

返し方の例を、問いごとに挙げます。

迷ったら、AIに聞き返します。 聞き方の例:「この差分を、5つの問いで自分で判定して。分からない問いは『分からない』と書いて」

AI自身の判定は参考にとどめます。最後にOK/NGを決めるのは、あなたです。

○ よくある勘違い:テストが通った=OK → 動くことと、安全なことは別です。問い2、3は動作では見えません
○ よくある勘違い:AIの説明が丁寧=正しい → 説明ではなく差分を読みます
○ 関係する単元:差分の読み方 No.06、入力と出力 No.07

第3章 卒業課題

① 課題の内容 必ず覚える

自分の子テーマに、AIが次のような追記をしたとします。 「URLの末尾に ?look=on を付けて開くと cookie が立ち、その人にだけ新しいデザインが出る」という物です。

この追記の差分を、5つの問いで判定して、OK/NGと、その理由を3つ書きます。

② 差分の出し方 必ず覚える

差分の本文は、この講座には載せません。あなた自身のサーバーに実物があるからです。 実物を読む練習なので、次の順で出します。

  1. ターミナルで ssh を使ってサーバーに入り、子テーマのフォルダへ cd で移動する
  2. 控えのファイル名を確かめる(ls でフォルダの中身が出ます)
  3. diff 控えのファイル名 functions.php と打つ。違う行が出る(+は足した行、-は消した行の形にしたい時は diff -u 控えのファイル名 functions.php)
  4. 出た差分を、5つの問いの順に読む

コマンドが分からない時は、AIに「子テーマの functions.php と控えの差分を出して」と頼めば出してくれます。 控えが無い場合は、AIに「追記の部分だけを、前後の行つきで出して」と頼みます。 それも問い4への答えになります。控えが無かったこと自体が、この変更の気になる点です。

③ ここを見る 必ず覚える

課題で最初に開く所を、先に2か所示します。どちらも、これまでの単元に載せた実物の写しです。

1つ目は、No.06 に載せた LOOK_FOR_ALL の定義行です。

if ( ! defined( 'LOOK_FOR_ALL' ) ) {
  define( 'LOOK_FOR_ALL', true ); // ← 本番切替はここ。true にすると、cookie が無い人にも全員に出る
}

2つ目は、No.04 に載せた lk_look_enabled の冒頭です。「新しい見た目を出すかどうか」を決める関数で、条件を上から順に調べ、最初に当たった所で return(答えを返して終わり)します。

function lk_look_enabled() {
  static $on = null;
  if ( null !== $on ) {
    return $on;
  }
  if ( is_admin() || wp_doing_ajax() || ( defined( 'REST_REQUEST' ) && REST_REQUEST ) ) {
    return $on = false;
  }
  if ( LOOK_FOR_ALL ) {
    return $on = true;
  }
  ...
}

この2つを並べて、LOOK_FOR_ALL の値が、関数の中のどこで効くかを読んでください。

④ 判定の観点の例 さらっと

次の観点を、問いに当てると、理由を3つ言いやすくなります。 ゲートは、見た目を出すかどうかを決める入口の関数や条件のことです。定数は、途中で変わらない名前付きの値のことで、LOOK_FOR_ALL がそれです。

理由は3つあれば十分です。 たとえ全部OKだったとしても、「どの問いで確かめて、何を見てOKにしたか」を3つ書けば、合格です。

5つの問い:①どのファイルの、いつ動くか ②外から来る値の消毒 ③出す値のエスケープ ④控えと戻し方・下見 ⑤全員か一部か。答えられない問いが1つでもあれば、OKは出さずに聞き返す。

確認問題

問1 AIが「この変更で問題ありません」と丁寧に説明してきました。まずやることは?

問2 変更の内容は良さそうですが、「元に戻す手順」と「変更前の控え」が書かれていません。どう判定する?

問3 差分に、URLの ? 以降の値をそのまま画面に出す行がありました。どの問いに引っかかる?

問4 第3章③の抜粋の通り、LOOK_FOR_ALL が true で定義されています。cookie を持たない訪問者が、?look を付けずにトップページを開いた時、lk_look_enabled は何を返しますか?

出典:php.net「$_GET」(https://www.php.net/manual/ja/reserved.variables.get.php)、php.net「setcookie」(https://www.php.net/manual/ja/function.setcookie.php)、developer.wordpress.org「Data Validation」「Securing (Escaping) Output」(https://developer.wordpress.org/apis/security/)。5つの問いは、この講座の No.01〜09 の内容をまとめた物。