Blog
開発ツールPWAふりかえり

ツール5本リリース、サイトをPWA化した話

ここ最近で 5つのツール をリリースして、サイト本体も PWA化 した。 全部を一気に書くと長くなるけど、せっかくなので「何を作ったか」と「途中でやらかしたこと」を残しておく。

つくったもの

🎮 Space Invaders — スプレッドショット追加

既存のインベーダーゲームに パワーアップアイテム を追加。 インベーダーを倒すと15%の確率でシアン色の菱形アイテムがドロップして、取得すると 10秒間、弾が3方向(左斜め・真上・右斜め) に発射される。

リモート側にボス戦・サウンド・ハートアイテムが追加されていてマージコンフリクトになったけど、なんとか統合した。

📱 QR Code Generator

ゼロから作った高機能QRジェネレーター。

  • カスタムカラー / グラデーション(5方向 + 放射状)
  • コンテンツタブ:URL / テキスト / 連絡先(vCard・MECARD両対応)/ WiFi / Email / 電話
  • 背景透過対応
  • PNG・SVGダウンロード、クリップボードコピー
  • SNSシェアボタン(X / LINE / Facebook / Web Share API)
  • データ量に応じて自動でサイズを調整する密度インジケーター

📏 Unit Converter

10カテゴリ・100以上の単位を一括変換。

  • 長さ・重さ・面積・体積・速度・温度・圧力・時間・データ・エネルギー
  • 日本の伝統単位(寸・尺・間・里・匁・貫・坪・畳・合・升・斗)にも対応
  • 数値を入れるだけで全単位に同時変換、タップでコピー

リリース後、変換係数を全件再チェックして torr / mmHg のわずかな精度差まで修正した。

🚘 住所コード検索

自動車登録に使う「住所コード」を検索できるツール。 これは データ調達が一番の山場 だった(後述)。

  • 国土交通省が公開しているCSVデータ(全国95運輸支局分)を使用
  • 管轄をタップ → モーダルがスライドアップ → 市区町村 → 町名 → コード表示
  • コードはハイフン区切りで見やすく、コピーは連結値
  • 一度見つけた住所コードは画面上部のstickyバーに常時表示

💴 消費税計算

シンプルだけど絶妙に欲しいやつ。

  • 金額入力 + 内税 / 外税トグル + 10% / 8%トグル
  • 税込価格・税抜価格・消費税額を即時計算
  • それぞれタップでコピー

サイト本体の更新

Worksページをカテゴリ分け

Sites / Tools / Games の3カテゴリに整理。 カテゴリごとにカラードット・ラベル・グラデーションラインで視覚的に分けた。

PWA化

ホーム画面に追加してアプリのように起動できるようにした。 Service Worker でオフラインキャッシュも対応。 ファビコンとアイコンも青→紫グラデーションで全部刷新。


やらかし&学びメモ

イテレーションを重ねて完成したものほど、途中で「うわ、これ最初に気づくべきだった」が多い。

1. CORSを最後に確認するな

住所コード検索ツール を作る時、最初は「国交省のCSVを直接 fetch すればいい」と思って実装した。 動作確認したらブラウザでブロック。Access-Control-Allow-Origin がなかった。

対策: 全91支局のCSV(合計21MB)を自リポジトリにダウンロードしてGitHub Pagesから配信する方式に切り替え。 → 教訓: 外部APIを使う前に curl -I でCORSヘッダーを確認する。

2. ライブラリのAPIは思い込みで使うな

QRジェネレーターで qrcode-generator ライブラリの誤り訂正レベルを 数値 で渡していたら、QRが正しく生成されないバグになった。 正しくは 'L', 'M', 'Q', 'H'文字列 を渡す仕様。

教訓: 動かなかったら最初にライブラリのドキュメントとサンプルを読む。

3. やめる勇気

QRジェネレーターには最初「中央にロゴを埋め込む機能」を作ったけど、サイズ調整するとどうしても読み取り精度との両立が難しくて、最終的には機能ごと削除した。 コードは250行ほど消えたけど、結果的にUIが整理されてシンプルになった。

教訓: 「労力をかけたから残す」は技術的負債のはじまり。

4. 静的書き出しと動的ファイルの相性

MochiBullet Magazine をPWA化するとき、Next.js 15の app/manifest.ts(動的マニフェスト)を使ったらVercelのビルドが失敗した。 原因は next.config.tsoutput: "export" モードと相性が悪かったこと。

対策: public/manifest.webmanifest静的JSONファイル に変更して解決。 → 教訓: 静的書き出しモードでは「動的に生成される特殊ルート」が罠になりやすい。事前に制約を確認する。

5. UI迷走を減らすには「目的」から決める

QRジェネレーターのプレビュー位置を、開発中に 3回 変えた。 上に固定 → スクロール下部に移動 → また下部固定。 ユーザー側からは「設定後に確認したい」と「いつでも見たい」の両方の要望があったので、結局 下部固定 が正解だった。

教訓: 「どう見せたいか」より先に「いつ・どんな状態で見たいか」を決めてからレイアウトを組む。


次は?

「絶妙に役に立つやつ」シリーズをもう少し続けたい。 候補:

  • 多重割引計算(30%オフのさらに10%オフは結局…)
  • BPMタッピング
  • 画像のExif情報削除
  • PWAアイコン一括生成(自分が手動でやったやつの自動化)

作ったツールは Works にまとめてある。 スマホで「ホーム画面に追加」しておくと、思い出した時にサクッと使えて便利。