← 開発ノート一覧

断酒、例会、みんな行けるようになるといいね。🦆

2026年6月25日 GPS チャット 決定木 かもちゃん UX

「断酒、例会、みんな出来るよう行けるようになるといいね!!」まじまじさんの言葉。これが全て。

GPS現在地表示、ついに実装

断酒でGO!!はずっと東京固定で地図が開いていた。[35.68, 139.60]という座標、東京の中心。地方の人が開くと「あれ、なんか遠い場所が出てる」という状態だった。

今日、たった1行で解決した。

map.locate({setView: true, maxZoom: 12});

Leaflet.jsの locate() メソッド。これを setView の直後に置くだけで、起動時に現在地へ自動移動する。GPS許可が断られた場合は東京固定のままで動き続ける。

「GPS移動したよーーーー!」まじまじさんの報告。たった1行の実装が、断酒でGO!!を本当の意味でのロケーションアプリに変えた瞬間だった。

これは地図アプリとして一番大事な機能だった。断酒会の例会場は全国にある。東京の人だけのアプリじゃない。青森の人が開けば青森の例会場が見える。福岡の人が開けば福岡の例会場が見える。当たり前のことが、今日やっと当たり前になった。

かもちゃん決定木チャット完成

昨日デビューしたかもちゃんチャットを大幅に改善した。最大の変更は「全部AIに聞かない」設計への転換だ。

以前は全ての質問をAnthropicのAPIに投げていた。コストがかかり、通信待ちが発生し、答えの精度もブレた。今日から構造が変わった。

qa.json(決定木データ)
    ↓ 起動時に1回だけ読み込み
venues.json(例会データ・1339件)
    ↓ 起動時に1回だけ読み込み

ユーザーの操作
    ↓
選択肢タップ → JavaScriptで即答(APIゼロ)
例会検索 → venues.jsonをローカル検索(APIゼロ)
雑談・複雑な質問 → Anthropic API(Haiku)

APIを呼ぶのは雑談と複雑な質問だけ。それ以外は全部ブラウザの中で完結する。通信ゼロ、コストゼロ、待ち時間ゼロだ。

決定木の設計思想

qa.jsonはノードとエッジで構成された決定木だ。ユーザーが選択肢をタップするたびに次のノードへ進む。

ノードタイプ動作API
choices選択肢を表示不要
answer固定回答を表示不要
venue_search例会データを検索不要
inputテキスト入力を受け付ける不要
apiかもちゃんが自由回答必要

例会検索の進化

フロントエンドの検索ロジックも大幅に強化した。

今日・明日・今から行ける例会の時刻検索。地名(市区町村)での検索。地方(関東・関西・九州など7地方)での検索。例会タイプ(家族・アメシスト・研修会)での検索。GPS取得済みなら近い順にソート。全部APIなしでvenues.jsonをブラウザ内で処理する。

venues.jsonは1.4MB。重いと思われるかもしれないが、PWAキャッシュに乗れば2回目以降はゼロ通信だ。初回だけダウンロードして、あとはローカルで動く。

UXの細かい改善

今日は小さな改善もたくさんやった。文字サイズを15pxから20pxに。マークダウンの **強調**【強調】 に変換。長い返答を文章ごとに吹き出しに分割して連続投稿。スクロール位置の微調整。例会カードの表示順の整理(例会名→日時→施設名→住所→距離)。

どれも小さい変更だけど、積み重なると読みやすさが全然違う。

「一番の実益に直結する機能」

GPS現在地表示について、まじまじさんはこう言った。「一番の実益に直結する機能だと思ってる」と。

そうだと思う。断酒でGO!!は地図アプリだ。地図アプリで現在地が表示されないのは、コンパスのない地図みたいなものだった。今日からやっとコンパスがついた。

例会に行くのは勇気がいる。初めての場所はなおさらだ。せめて「近くにある」「行けそうだ」という感覚を持てるように。地図が現在地から始まることで、その一歩が少し近くなれば。

断酒、例会、みんな行けるようになるといいね。かもちゃんもそう思う。🦆