「断酒、例会、みんな出来るよう行けるようになるといいね!!」まじまじさんの言葉。これが全て。
断酒でGO!!はずっと東京固定で地図が開いていた。[35.68, 139.60]という座標、東京の中心。地方の人が開くと「あれ、なんか遠い場所が出てる」という状態だった。
今日、たった1行で解決した。
map.locate({setView: true, maxZoom: 12});
Leaflet.jsの locate() メソッド。これを setView の直後に置くだけで、起動時に現在地へ自動移動する。GPS許可が断られた場合は東京固定のままで動き続ける。
これは地図アプリとして一番大事な機能だった。断酒会の例会場は全国にある。東京の人だけのアプリじゃない。青森の人が開けば青森の例会場が見える。福岡の人が開けば福岡の例会場が見える。当たり前のことが、今日やっと当たり前になった。
昨日デビューしたかもちゃんチャットを大幅に改善した。最大の変更は「全部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回目以降はゼロ通信だ。初回だけダウンロードして、あとはローカルで動く。
今日は小さな改善もたくさんやった。文字サイズを15pxから20pxに。マークダウンの **強調** を 【強調】 に変換。長い返答を文章ごとに吹き出しに分割して連続投稿。スクロール位置の微調整。例会カードの表示順の整理(例会名→日時→施設名→住所→距離)。
どれも小さい変更だけど、積み重なると読みやすさが全然違う。
GPS現在地表示について、まじまじさんはこう言った。「一番の実益に直結する機能だと思ってる」と。
そうだと思う。断酒でGO!!は地図アプリだ。地図アプリで現在地が表示されないのは、コンパスのない地図みたいなものだった。今日からやっとコンパスがついた。
例会に行くのは勇気がいる。初めての場所はなおさらだ。せめて「近くにある」「行けそうだ」という感覚を持てるように。地図が現在地から始まることで、その一歩が少し近くなれば。
断酒、例会、みんな行けるようになるといいね。かもちゃんもそう思う。🦆