0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

2日で完成、1週間で勝利⚾サーバレス構成で作る「背番号フラッシュ暗算」練習アプリ開発記録

0
Last updated at Posted at 2025-11-28

プロ野球ファン対抗企画「背番号フラッシュ暗算対決」に出場する妹をサポートするため、
2人日で“本番練習ができるWebアプリ”をAWS上に構築しました。

S3・API Gateway・Lambda・DynamoDBを組み合わせたサーバレス構成で、
短期間かつ低コストで動作する軽量アプリを設計。
今回の記事では、その開発プロセス・構成設計・学びをまとめます。

特別なフレームワークやCI/CDは使用せず、
「AWSの基本サービスのみで、どこまで素速く、実用レベルのアプリが作れるか」
という観点から、個人開発のリアルなワークフローを紹介します。


🏁 はじめに

それはある日のこと。妹からこんな電話がかかってきました。
「『背番号フラッシュ暗算対決』、出場することになったよ!」

──プロ野球ファン対抗イベントで、1秒ごとに選手画像が6枚映し出され、
背番号を暗算で合計して答える
という、記憶力+計算力の勝負。

「おめでとう。妹氏は計算大得意だし、きっと大丈夫。盛り上がるよ」
「でも、相手チームの選手の背番号、全然覚えてなくて……フラッシュ暗算もやったこと無いし……」

本番まで1週間。 不安そうな妹の声。
自慢の妹の晴れ舞台に少しでも花を添えたく、私は妹に申し出ました。

「お姉ちゃんが問題集アプリ、こしらえますわよ!」

「背番号フラッシュ暗算」参考動画

※この回に出場されている方は私の妹ではありません。
https://youtu.be/aBnVSL1a5s4?si=oPOw3fOnLDliNauY&t=137

  1. チームA・チームBの選手が1秒ごとに交互に、計6名分、表示される
  2. 「6人分の背番号の合計」を素早く(10秒以内に)暗算して答える

シンプルながら正答は難しく、ファン心をくすぐる楽しい企画です。

  • たしか2024年シーズンの交流戦から、千葉ロッテマリーンズがスタートした企画
  • これまでも正解者の数は少なめな印象
  • 一般的なフラッシュ暗算とは異なり「映った選手の背番号を思い出す」という工程がある

🕒 開発スケジュール

フェーズ 内容 所要時間
設計+基礎機能 DB設計、API接続、UI基本形 約0.5日
応用機能 出題モード追加、UI改善 約1.5日
合計 約2.0人日 で完成

基礎機能開発後は、妹に使ってもらいながら随時改修。
「基礎機能はウォーターフォール、応用機能はアジャイル」的な進め方でした。

⚙️ 使用技術と構成

カテゴリ 使用技術
フロントエンド HTML / CSS / JavaScript
バックエンド AWS Lambda(Python) + API Gateway
データベース DynamoDB
ホスティング Amazon S3(静的サイト)
ログ CloudWatch
レビュー/相談 ChatGPT 4o

⇒ いわゆる “S3 + API Gateway + Lambda + DynamoDB” の王道サーバレス構成です。

💡 DynamoDBを選んだ理由

  • 要件は「Key-Valueアクセスのみ」で十分(リレーショナル構造は不要)
  • オンデマンド課金モードで低コストに運用可能
  • データの変更が少なく、キャッシュ的に扱いやすい

💬 ChatGPTを使った開発支援

ChatGPTには以下の点でサポートを依頼しました:

  • LambdaとDynamoDB設計のレビュー
  • JS内での非同期処理構成の確認
  • CSSアニメーションの最適化提案
  • README / Qiita構成の整理

短期間開発では「考える時間の節約」が最重要だったため、
ChatGPTにはレビュー相手兼ペアプログラマとして並走してもらいました。
※「4o」なのは、当時の最新モデルのため。

🏗️ システム構成図

aws_architecture-bfm2025.png

構成の流れ:

  1. S3上にフロント(HTML / JS)と画像格納フォルダを配置
  2. JSからAPI Gateway経由でLambda関数を呼び出し
  3. LambdaがDynamoDBから選手データをランダム取得
  4. 結果をJSONで返却 → ブラウザで画像と背番号を表示
  5. ログはCloudWatchに送信

🧠 実装のポイント

🔹 Lambda(Python)でのランダム取得処理

  • get_random_items() 関数でDynamoDBを scan → ランダムに抽出
  • API Gateway経由で teamA, teamB, countA, countB のパラメータを受け取り
  • CORS設定をAPI Gateway側で制御
  • CloudWatchログで呼び出し状況を確認
  • JSONレスポンスとして返却

🔹 フロントエンドの工夫

  • 画像サイズの不統一をCSSの object-fit: cover; で吸収
    • 球団によってプロフィール画像のサイズが異なる
    • 手動トリミングを避け、ルールで自動調整
  • JavaScriptで出題順序とテンポ(1秒ごと切り替え)を制御
    • 「本番を意識したテンポでの練習」を提供

🔹 UI設計

  • 各モード(本番/練習/特化/チーム別)をワンクリックで切り替え
  • 出題パターンを定数管理し、短期間で柔軟に調整可能に

🔹 オマケ機能

  • 合計値「Total」を押下すると花吹雪が舞う(演出機能)
    • 練習のマンネリ化を防ぐ工夫

🌸 成果と学び

妹からの最終フィードバック

「めっちゃ助かった。思い出しているようでは勝ち目は無いので、このアプリでまるで本番のように
“写真を見て1秒以内に瞬時に背番号を浮かべ暗算”が実践できるのは大きい。
アプリのおかげで短期間でここまで仕上がった」

また、正答率が以下のように上昇したとのこと。アプリでの練習が、しっかり役に立ったようで良かったです◎

  • 【Before】アプリで練習開始直後:20%
  • 【After】本番当日:75%

結果は──

妹、本番で見事に正解!🎉

もちろん、妹の鍛え上げられた計算力があったからこその正解(勝利)ですが、妹のおかげで
“エンジニアリングが人の成功体験に直結した” 瞬間を実感できました。

🧩 今回の開発で学んだこと

  • 「誰かの課題を最小構成で解決する」ことは、AWSなどの技術を学ぶ上で最高の教材になる
  • ChatGPTを設計レビュー相手として使うことで、短期開発でもある程度品質を担保できる
  • AWSの基本サービスのみでも、十分実用的な体験を届けられる

📦 作成したwebアプリ「背番号フラッシュ暗算道場」デモ

※画像やチーム名などは差し替えています。
demo-bfm2025.gif

📁 ソースコード

GitHubリポジトリはこちら
👉 https://github.com/amomo0220/pub_baseball-flash-math-2025

🔚 おわりに

今回は、妹の挑戦を支えるために作った小さなアプリでしたが、
「自分の持っている知識や経験を使って素早く、誰かの成功に貢献できる」 という体験は
エンジニアとして大きな励みになりました。
結果にもつながり、エンジニア冥利に尽きる体験でした。楽しかったです!

💬 付記:著作権とデータ利用について

アプリ内で使用した画像は、NPBや各球団公式サイトから取得したものを
個人・家族間での学習目的 に限定して利用しました。
商用利用・公開サービスではなく、使用したデータおよびアプリはすでに削除済みです。
著作権は各球団に帰属し、問題があれば本記事を削除いたします。

  • 参考:著作権法第30条
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?