Slide 1

Slide 1 text

推しの来鯖を見逃さない! サンドーム福井ライブスケジュールアプリを作った話 jig.jp 美園武蔵

Slide 2

Slide 2 text

自己紹介 美園武蔵 / jig.jp 自作キーボードと筋トレが好 き 2

Slide 3

Slide 3 text

私の推し 「LTのタイトルに推しを入れる」指定があったので、私の推しを考えてみました ジャンル スポーツ アーティスト ふわっち 推し 大谷翔平 さん / 岡本和真 さん 藤井風 さん 生ハムちゃん 3

Slide 4

Slide 4 text

藤井風さんのコンサート 8/4(火)・8/5(水) @ サンドーム福井 奇跡的に8/5(水) のチケットが取れました 4

Slide 5

Slide 5 text

動機 「今日サンドーム福井に〇〇さん来るらしいよ」 こういう情報を 直前に知ることが多い 知ってたら行きたかったな… が何度かあった 推しの SNS はフォローできても、全アーティストは追えない → サンドーム福井の公演予定とチケット受付期間をまとめて見られるWEBアプリを作りま した 5

Slide 6

Slide 6 text

作ったもの アプリ ソースコード sundome.take20m.dev github.com/take20m/ sundome-live-schedule 6

Slide 7

Slide 7 text

作ったもの sundome.take20m.dev 公演一覧と 販売中のチケット情報 + RSS フィード 7

Slide 8

Slide 8 text

仕組み 収集は毎晩 claude -p を叩くだけ。 claude -p は Claude のサブスク枠で動く 低運用コスト 8

Slide 9

Slide 9 text

システム構成 GitHub Actions cron 毎晩 JST 3:30 ↓ claude -p collector/prompt.md Claude Code (headless) WebSearch / WebFetch で調べて events.json を書く ↓ validate.mjs → POST /api/ingest Cloudflare Workers + D1 正規化 / 良い方だけ更新 / 差分検知 ↓ 公演一覧・詳細ページ / RSS 9

Slide 10

Slide 10 text

工夫① 収集は多方面から 会場起点 会場公式カレンダーで公演を確定 WebSearch起点 「"サンドーム福井" ツアー 2026 / 2027 / 2028」等で、会場公式に載る前の公演を探す 2段検索 1. 広く浅く … 全公演を一括収集 2. 狭く深く … 該当公演を抽出し、アーティスト単位で調査し、チケット受付期間を収集 10

Slide 11

Slide 11 text

公式に載る前に捕まえられた 会場公式カレンダーは 2026年11月までしか載っていなかった 発見した公演 会場公式 結果 Vaundy 2027/12 未掲載 ぴあ先行が受付中なのを検知 あいみょん 2027/2 未掲載 公式が coming soon の段階でキャッチ サカナクション 2027/4 未掲載 NF先行4種を期間付きで追跡 「公式カレンダーに載る前の公演も取れた 11

Slide 12

Slide 12 text

工夫② LLM は毎回ちょっと違うことを言う 同じプロンプト・同じ情報源でも、出力が揺れる 問題 内容 表記ゆれ FANTASTICS と FANTASTICS from EXILE TRIBE → 同じ公演がDBに2件 値の欠落 昨日取れていた受付期間が今日は null → 上書きで消えた 12

Slide 13

Slide 13 text

LLMの揺れを吸収する キーは決定的に ev-2026-10-11 … 日付を公演テーブルの主キー(単一ホールなので1日1公演) チケット申し込みは した名前のハッシュ + 期間一致で同一判定 情報は良くなる方にしか更新しない null で既知の値を上書きしない 期間付きの行は、期間を取れている収集でしか消せない 13

Slide 14

Slide 14 text

工夫② RSSフィードは有用な情報のみ更新 差分検知の材料から名前・URLを除外 … 表記が揺れても通知しない 過去公演 / 締切済み / 期間が全く不明の公演情報やチケット受付情報は通知しない 14

Slide 15

Slide 15 text

技術スタック 役割 使ったもの 収集 Claude Code ( claude -p ) + GitHub Actions cron 配信 Cloudflare Workers + Hono (SSR) データ Cloudflare D1 (SQLite) 15

Slide 16

Slide 16 text

まとめ LLM は「毎回ちょっと違うことを言う」前提で組む 揺らぎを吸収するために、良い情報でのみ更新する設計 決定的なキー + 正規化で表記ゆれを吸収 状態は一方向にしか変えない 事故って消えないように、既知の情報は良い情報でしか更新しない RSSフィードは有用な情報のみ更新 16