都道府県クイズに統計編12ページを増設し、89問へ拡張した日
都道府県クイズに統計編12ページを増設し、89問へ拡張した日
何をやったか
朝の時点では4ページ24問しかなかった都道府県クイズに、統計編のページを8つ足して、最終的に12ページ89問まで広げた。さらにCodex(gpt-5.5)にレビューを通したら10件の致命的な誤りが返ってきて、夜にかけて全部直させた。
Phase 1: 復習モードを共通composableに切り出す
最初のページを書いていたとき、正誤の状態管理が各ページにバラバラに書かれているのに気づいた。localStorageから読んで、未正解だけフィルターして、リセットして、というロジックが4ページ分そっくり並んでいた。
これを usePrefectureQuiz という共通composableに抽出させた。
// 純粋関数として切り出し
const filterUnsolved = (questions: QuizQuestion[], solvedIds: string[]) =>
questions.filter(q => !solvedIds.includes(q.id))
副作用(localStorageの読み書き)はcomposable内の onMounted と watch に閉じ込めて、フィルタリングや正解判定は純粋関数に分けるよう指示した。4ページに展開してから後続のページを書き始めたので、追加ページではcomposableを呼ぶだけで済んだ。
Phase 2: 人口・地理(population, area-and-geography)
統計の元データはTurso DBの book-knowledge-base に格納してある『日本国勢図会2024/25』の付録IIから引いてもらった。47都道府県の人口、人口密度、15歳未満比率、65歳以上比率、1世帯あたり人員。
SQLは自分では書かない。「人口密度の上位5県と下位5県を一覧で出して」と日本語で頼むと、Claude Codeが裏でDBを叩いて該当セクションを引いてくる。
Phase 3: 非加算指標への対応(manufacturing, trade-and-port, finance-and-land)
製造業出荷額や貿易港の輸出入額は「47都道府県の合計」が出せる。だが地価(円/m²)や人口密度は単純に足せない。
最初の実装では全ページで「全国合計:◯円」をフッターに出していて、地価ページで「全国合計:750万円/m²」みたいな意味不明な数字が表示されていた。画面を見て違和感を拾い、QuizQuestion 型に totalLabel? を追加させた。
type QuizQuestion = {
// ...
totalLabel?: string // "1位の値: 5,432千円/m²" など
}
合算できる指標は「全国合計」、合算できない指標は「1位の値」を表示する分岐をフッター側に入れてもらった。
Phase 4: 観光・教育・防災
観光(tourism)、教育(education)、防災(disaster)の3ページを追加させた。「主要統計の1位を4択で当てる」というシンプルな形式に揃えた。
ここまでで実装済み12ページ。
「フェーズ」表記をやめて子供向けに整理
開発中は内部的に「Phase 1〜4」と呼んでいたが、目次ページの本番表示で「Phase 1」と出ているのを見て、対象読者の子供にはわからないと気づいた。
「📊 統計クイズ」「🗾 地図クイズ」の2カテゴリに分けて、フェーズという言葉を画面から消させた。各ページ末尾の「トップに戻る」も「目次に戻る」に変えてもらった。
Phase 8: 既存12ページの増問(55→89問)
12ページに本来欲しい問題数があと34問足りないと気づいて、増問パスを回させた。
| ページ | 増問前 | 増問後 |
|---|---|---|
| rice-and-grain | 4問 | 10問 |
| area-and-geography | 4問 | 8問 |
| finance-and-land | 3問 | 6問 |
| education | 3問 | 6問 |
| disaster | 3問 | 6問 |
| 他7ページ | 各2問 | 各+2問 |
合計55問→89問。
スマホ375px幅で4択が縦1列に崩れる
iPhoneサイズで4択ボタンが縦に1列に伸びて、画面の半分以上を占めているのを発見した。CSSの @media (max-width: 480px) で1列固定の指定になっていたのが原因。
ブレイクポイントを360pxに切り上げて、375px以上では2列を維持するよう12ファイル並列で直させた。
Codexレビューで10件の致命的誤りが噴出
ひと通り出来上がったところでCodex(gpt-5.5)にレビューを通した。返ってきた指摘がかなり厳しかった。
- 県内総生産の全国合計: ハードコードしてあった数字が古いと指摘されたので、約580兆円に直した
- 海岸線延長ランキング: 順序が違ううえ、解説に「半数以上」と書いてあった部分が事実と合わないと指摘された
- 港湾コンテナ取扱量: 「総数」と「輸出のみ」が問題ごとに混在していたので「総数」に統一させた
- 最深積雪ランキング: 山岳の私的観測を含んでいたので公式観測ベースに直させて、守門岳を追加した
- 活火山数: 「全国の活火山数」と「都道府県別の活火山数」が混ざっていたので都道府県別データに統一させた
- 平均標高ランキング: 順序が違ったうえ、解説の旧値も古いまま残っていた
- 人口密度低い順: 解説の中で順位の根拠が自己矛盾していると指摘された
- 軽種馬数値: ソース注記が弱いと指摘されたので、出典を強化させた
「画面の数字に違和感を持つ係」は自分でやり、修正案の生成と適用はCodexとClaude Codeに回す、という分担で全件片付けた。
目次トップに進捗バーを追加
12ページの正答率を1本のミニバーで集約表示するUIを目次トップに追加させた。実装済み12ページと「準備中」表示の管理もここでまとめてもらった。子供が「あとどれくらい残ってる」を一目で把握できる。
Phase 5-8 の計画書もCodexレビュー2回回す
夜に翌週以降の Phase 5-8(米・果物・畜産・水産など産業編)の計画書を書かせて、Codexに2回通した。
- Phase 6 の分割: 1ページに詰め込みすぎていると指摘されたので 6A/6B に分割させた
- Phase 7 の重複県: 同じ県が複数問の正解になりすぎる構成だと指摘されたので分散させる方針に切り替えた
- Phase 8 の「そば」を除外: 公式の都道府県別出荷データが存在しないと指摘されたので、そばの問題はスコープから外した
Phase 2-4 の指示書のときも別途3回レビューを回して、計9件の指摘を全反映させてから次セッションに引き継いだ。
学び
- 統計クイズは「データの信頼性」が命。出典に揺れがあると問題ごと事故る。Codexが拾った10件のうち半分はデータソースの揺れに起因していた
- 「全国合計」みたいな汎用UIは、合算できない指標が混ざった瞬間に破綻する。型に分岐を持たせる(
totalLabel?)と早期に詰められる - 復習モードは早めに共通化させたのが効いた。あとから12ページに足していったが追加コストはほぼゼロだった
関連ファイル
apps/web/app/composables/usePrefectureQuiz.tsapps/web/app/pages/prefecture-quiz/statistics/population.vueapps/web/app/pages/prefecture-quiz/statistics/area-and-geography.vueapps/web/app/pages/prefecture-quiz/statistics/manufacturing.vueapps/web/app/pages/prefecture-quiz/statistics/trade-and-port.vueapps/web/app/pages/prefecture-quiz/statistics/finance-and-land.vueapps/web/app/pages/prefecture-quiz/statistics/tourism.vueapps/web/app/pages/prefecture-quiz/statistics/education.vueapps/web/app/pages/prefecture-quiz/statistics/disaster.vue