行きたい場所を、ときどき自分に差し出す¶
ツール: saved-places
Googleマップに「行ってみたい」と保存した場所は、保存した瞬間が興味のピークで、そのあと二度と開かれない。 行きたいと思った場所に、人はなかなか行かない。
この文書は、その状態をどう作り変えるかの設計メモ。
1. 何が問題なのか¶
保存という行為は、未来の自分へのメモのつもりで行われる。ところが Googleマップの保存リストは 引く(pull)ための道具 でしかない。 リストを開くには、まず「そういえば保存していたな」と思い出す必要がある。思い出せる程度に覚えている場所なら、そもそもリストは要らない。
つまり、いちばん助けが要る「忘れた場所」だけが、構造的に取り出せない。
- 保存は一瞬(1タップ)、取り出しは能動(アプリを開く → リストを選ぶ → 眺める)
- 場所は「行こう」と決めてから探すもの、という前提でUIができている
- 保存件数が増えるほど一覧は長くなり、眺める気力の必要量が増える
欲しいのは「偶然」の自作¶
自分でキュレーションしたものが、あとの自分を助けに来る。 偶然の再会に見えるものを、自分で仕込んでおく。差し出す側と受け取る側を、時間で切り分ける。
| 引く(いまのGoogleマップ) | 差し出す(作りたいもの) | |
|---|---|---|
| きっかけ | 自分が思い出す | 向こうから来る |
| 提示数 | 全部(数十〜数百件) | 1件 |
| 必要な気力 | 選ぶ気力が要る | 断るだけでいい |
| 忘れた場所 | 永久に埋もれる | むしろ出やすい |
2. 設計方針¶
- 1回に1件だけ出す。 一覧は「選ぶ」作業を強いる。選ぶ気力がない日でも、1件なら反応できる。
- 寝かせた場所ほど出やすくする。 新しく保存したものは記憶に新しい。助けが要るのは古いほう。
- 断る道を必ず用意する。 「今はいい」(一定期間しまう)と「もう出さない」(外す)。断れないリストは見るのが苦痛になり、開かれなくなる。
- 同じものを続けて出さない。 一度出したら一定期間は出さない。「またこれか」は仕組みへの信頼を壊す。
- 場所そのものより、保存したときの動機を出す。 メモ(なぜ行きたいと思ったか)は、名前より強く当時の自分を連れてくる。
- 偶然の入口をもう1つ持つ。 時間のきっかけ(日替わり)だけでなく、空間のきっかけ(いま近くにある)も使う。「近くまで来ていたのに気づかなかった」がいちばんもったいない。
3. 現実の制約(先に確かめたこと)¶
| やりたいこと | できるか | 理由 |
|---|---|---|
| Googleマップ自体にリマインドさせる | ✗ | 保存リストに対する通知機能はない |
| APIで自分の保存リストを読む | ✗ | 保存リスト(Saved / リスト)を読む公開APIはない。Places API は検索用で、自分の保存は扱えない |
| Takeout で書き出す | ✓ | 保存済み(Saved) を選ぶと、リストごとに CSV が出る |
| その CSV から地図に置く | △ | CSV に緯度経度が入っていない。URL に座標が埋まっている行だけ取れる |
| 座標つきで書き出す | △ | Takeout の マップ(自分の場所) で Saved Places.json(GeoJSON)が取れるが、一部の行が [0, 0] になる既知の不具合がある |
| 定期的に自動で書き出す | ✓ | Takeout はエクスポートを「2か月ごと・1年間」で予約できる |
| スマホのアプリから共有した1件のURLだけで名前が分かる | ✗ | Googleマップアプリの共有ボタンは maps.app.goo.gl/... という不透明な短縮URLを返す。中身(場所名・住所・座標)はGoogle側のサーバーだけが知っていて、リンク文字列自体には何も入っていない。ブラウザからその中身を読もうとしても、追跡先(maps.google.com)が第三者サイトからのフレーム埋め込み・CORS越しの読み取りを明示的に拒否している。バックエンドを持たないこのツールの立場では、その場で自動的に名前を割り出す手段がない |
| Googleマップの地図そのものを他サイトに埋め込む | △ | 無料のキー不要な埋め込み(output=embed)は廃止済み。埋め込みには公式の Maps Embed API とAPIキーが要る(無料枠あり、Google Cloud Console での登録が必要) |
つまり 手元にコピーを持つ以外に道がない。逆に言えば、コピーさえ手元にあれば、出しかたは自分で決められる。
短縮URLは「分からない」を隠さず出す¶
上の制約により、共有ボタンから貼った短縮URLは、貼った瞬間には名前も座標も分からない。ここで「とりあえずURLをそのまま名前として表示する」を選ぶと、今日のカードに読めない文字列だけが並ぶ状態になり、いちばん大事な「これは何の話か」が伝わらなくなる。
そこで、分からないものは 「名前未確認の場所」と正直に表示し、「マップで開く」→ 開いて確認 → 「名前をつける」 という最短3ステップの手動確認フローに倒した。自動化できない部分を隠さず、次にすべき1手だけをその場に置く、という考え方は docs/continuation-system.md のランブック思想と同じもの。
座標が分かっている場所(Takeoutの Saved Places.json、または @lat,lng を含む長いURL)には、無料のOpenStreetMap埋め込みで簡易プレビューを出す。本物のGoogleマップを埋め込みたい場合は、Google Cloud Console で取得した Maps Embed API のキーを設定画面に入れると切り替わる(任意・省略可)。
取り出しの手順¶
- takeout.google.com を開く
- 「選択をすべて解除」
- 保存済み(Saved) にチェック(マップのリストはここ。「マップ」の項目ではない)
- エクスポートを作成 → 届いたメールから ZIP をダウンロード
Takeout/保存済み/の中に、リストごとの CSV がある
座標も欲しい場合は、同じ手順で マップ(自分の場所) も選び、Saved Places.json を一緒に取り込む。
4. 作ったもの¶
saved-places.html — 1枚のHTMLで完結する。データはブラウザの localStorage に入り、どこにも送らない。
| タブ | 何をする |
|---|---|
| 今日 | その日の1件を大きく出す。マップで開く / 行った / 今はいい / もう出さない / 別のを引く |
| 近く | 現在地から半径内にある「行きたかった場所」を距離順に出す |
| 一覧 | 検索・状態やリストでの絞り込み・手入力での追加 |
| 取り込み | CSV / GeoJSON の読み込み、URL貼り付け、バックアップと書き出し |
| 通知 | 通知の許可、出しかたの調整 |
出す1件の決め方¶
候補は「行きたい」状態で、かつ「今はいい」の期間が明けたものだけ。そこから重みつきの抽選をする。
重み = 1
× (1 + min(保存からの日数, 540) / 180) # 寝かせるほど最大4倍まで出やすい
× 直近に出していたら下げる係数 # 冷却期間(既定60日)を過ぎるまで最小0.1倍
× (メモがあれば 1.3) # 動機が書いてあるものを優先
乱数の種は 日付 + 端末ごとの塩 から作る。同じ日に何度開いても同じ1件が出る(日替わりであること自体が信頼につながる)。「別のを引く」を押したときだけ種をずらす。
状態の持ち方¶
| 状態 | 意味 | 抽選 |
|---|---|---|
| 行きたい | 既定 | 対象 |
| 行った | 訪問済み | 外れる(記録は残る) |
| 見送り | もう出さなくていい | 外れる |
| (今はいい) | 一時的にしまう。既定45日 | 期間中だけ外れる |
5. 通知をどう届けるか¶
「ときどき通知される」がこの仕組みの核心だが、ブラウザだけでは 閉じている間に決まった時刻へ通知を出すことができない。 できること・できないことを踏まえて、経路を3本用意した。
| 経路 | 閉じていても届く | 用意するもの | 向いている場面 |
|---|---|---|---|
| このページからの通知 | ✗(開いている間だけ) | 通知の許可のみ | 開いた瞬間に1件を受け取る。近くに来たときの通知もこれ |
| iPhoneのショートカット | ✓ | places.json の書き出し + オートメーション設定 |
毎朝ランダムな1件を、確実に通知として受け取る |
| カレンダーの繰り返し予定 | ✓ | .ics の書き出し |
機種を選ばない。通知内容は固定で「開くきっかけ」だけ作る |
ショートカット(いちばん本命)¶
- アプリの「取り込み」タブで places.json を書き出す(行きたい場所だけが入る)
- iCloud Drive に置く(またはこのページを置いているサーバーに置いて URL で読む)
- ショートカットApp →「オートメーション」→ 時刻で起動
- ファイルを取得(またはURLの内容を取得)→ リストから項目を取得(ランダム) → 通知を表示
- 「すぐに実行」にしておくと確認なしで通知が出る
抽選をショートカット側の「ランダム」に任せるので、寝かせ期間による重みづけはかからない。重みも効かせたいなら、書き出す places.json の側を(重みの高い順に上位N件へ)絞ってから置けばいい。
なぜ Web Push を今は使わないか¶
iOS でも 16.4 以降、ホーム画面に追加した PWA なら Web Push を受け取れる。ただし押す側のサーバー(VAPID鍵を持って定期実行するもの)が要る。 このリポジトリには Cloudflare Pages Functions と D1 がすでにあるので、cron で毎朝プッシュするのは作れる。ただしそれは 場所のデータを自分のブラウザの外に出す ということでもある。 1枚のHTMLと localStorage で完結している今の形は、その代償を払っていない。まずはショートカットで足りるかを試す。
6. 運用¶
- Takeout の予約エクスポート(2か月ごと)を仕掛けておき、届いたら CSV を取り込む。重複は URL と名前で弾かれ、メモだけが更新される。
- 端末を移るときは「バックアップ(JSON)」を書き出して、移った先で同じ画面に読み込ませる。
- 「今はいい」を押した回数が増えてきた場所は、たぶんもう行きたくない。素直に「もう出さない」に落とす。リストの信頼度はここで決まる。
7. これから¶
- 文脈で選ぶ: 雨の日は屋内、平日の夜は近所、休日は遠出。営業時間が分かれば「いま開いている場所」だけを出す
- 近くの通知をバックグラウンドへ: いまはページを開いている間だけ。ジオフェンスをOSに任せる形(ショートカットの位置オートメーション)なら閉じていても届く
- 行った記録を返す: 「行った」を押した数を年単位で見せる。キュレーションが実際に自分を動かしたかが分かる
- 保存の瞬間に動機を書く導線: メモがある場所ほど強く効くので、保存直後にひとこと書く習慣とセットにしたい