学童保育の待機児童を住所で引く道具を、PHP1ファイルで作り直した——バックエンドが要るかの見分け方
住所を入れると、その自治体の学童保育(放課後児童クラブ)の待機児童数が出る道具を作りました。公開して、systemdに登録して、ポートを開けて、公開用のプロキシも置きました。
そこで言われました。「なんでポートが必要なの? PHPだけじゃないの?」
そのとおりでした。作り直したら、PHP1ファイルとJSONだけになりました。その日のうちに気づけなかった理由と、次から迷わないための見分け方を書きます。
- できたもの: https://kurage.exbridge.jp/kgakudo.php/?ref=vwork-php-enough
- オンプレミス版: https://kappstore.exbridge.jp/app.php?id=f2853d368ddf8e57&ref=vwork-php-enough
何を作りすぎたか
最初の構成はこうでした。
- FastAPI のアプリ(Python)
- venv と systemd の user unit
- ポート18382を開けて、ルーター越しに公開
- heteml 側に PHP の透過プロキシ、その設定ファイル
動くには動きました。ただ、最初の公開のときに 502 が出ました。原因は、プロキシの向き先のポートが外から見えていなかったことです。つまり、自分で作った依存で自分が転んだわけです。
作り直したあとの構成はこうです。
kgakudo.php(1ファイル)kgakudo_data/(JSON 29KB と CSV 2本)
以上。データベースも、常駐するサーバーも、ポートもありません。
なぜ気づかなかったか
直前に作っていたのが洪水・内水のハザードマップで、そちらは本当にバックエンドが要るからです。PostGIS に数百万面のポリゴンを入れて、点を含む面を空間検索します。PHPでは無理です。
その形が手に残っていたまま、次の製品を同じ型で作りました。要件ではなく、直前の成功体験で構成を決めてしまったということです。
見分け方(次からはこれで判断する)
作る前に、この4つを見ます。全部「いいえ」ならPHPで足ります。
| 問い | 学童保育ナビ | 洪水ハザードマップ |
|---|---|---|
| データは数十MBを超えるか | いいえ(29KB) | はい(数GB) |
| 空間検索や全文検索など、専用エンジンが要る計算をするか | いいえ | はい(PostGIS) |
| データが毎日・毎時変わるか | いいえ(年1回) | はい(発令は3分ごと) |
| 学習済みモデルや重いライブラリを使うか | いいえ | いいえ |
学童のほうは、やっている計算が「住所を都道府県と市区町村に正規表現で割って、JSONを引く」だけでした。この程度でバックエンドを立てるのは、ガスコンロで足りる料理に工場を建てるのと同じです。
逆に、1つでも「はい」があるならバックエンドを立てます。そこをPHPで無理をすると、今度は別の形で壊れます。
PHPにして良くなったこと
1. 故障の種が減った。 heteml の中で完結するので、うちのサーバーが落ちても動きます。502の原因そのものが消えました。
2. 売り物として強くなった。 買った人がやることが「ファイルを2つ置いて、.htaccess に1行書く」だけになりました。前の構成なら、Python・venv・systemd・ポート開放・プロキシの説明が要ります。説明が短い製品は、それだけで価値があると思っています。
3. 運用が消えた。 監視するプロセスがありません。年1回、国が新しいPDFを出したときにJSONを差し替えるだけです。
失ったものは、正直に言えばありません。強いて言えば、PHPでテンプレートエンジンなしにHTMLを書くので、コードは少し読みにくくなりました。1ファイル700行ほどです。
Pythonは捨てない。置き場所を変える
PDFから表を取り出す処理はPythonのままです。ただし製品には含めません。年1回、手元で動かしてJSONを作り、そのJSONを配布物に入れます。
この分け方が大事でした。「データを作る道具」と「データを見せる道具」は、動く場所も頻度も違います。前者は開発者の手元で年1回、後者はお客さまのサーバーで毎日。同じ言語・同じプロセスに詰める理由がないのに、最初はひとつの箱に入れようとしていました。
ちなみに取り込みの検算では、抜き出した数字を全部足して、PDFに書かれている全国値と一致するかを見ます。最初は待機児童が147人足りず、原因は名前が1文字の市(柏市・呉市)を落とす正規表現でした。直して、待機16,330人・クラブ25,928か所・登録児童1,570,645人の3つとも一致しました。合計の一致は、写し間違いがないことのいちばん安い証拠です。
まとめ
- 構成は、直前に作ったものではなく、目の前のデータの性質で決める
- データが小さく、更新が年単位で、専用エンジンが要らないなら、PHP1ファイルで足りる
- 依存を1つ増やすと、故障の種を1つ増やすことになる(実際に502で転んだ)
- 「作る道具」と「見せる道具」は分けて置く
作り過ぎに気づけたのは、他人に「なんでポートが必要なの?」と聞かれたからでした。作った本人は、自分の構成を疑いません。完成したあとに、いちばん素朴な質問をしてくれる人が、いちばん役に立ちます。