This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
DojoMapは、全国のCoderDojoを地図上で探せるWebアプリケーションです。JekyllベースのシンプルなWebアプリで、Geolonia Mapsを使って地図を表示し、Clubs APIとCoderDojo JapanのAPIからデータを定期的に取得して更新しています。
# 依存関係のインストール
bundle install重要: Jekyll 4.3以降、jekyll build実行時に自動的にデータ更新タスクが実行されます(_plugins/build_hooks.rb)。
# 推奨: jekyll buildで全て自動実行
bundle exec jekyll build
# → 自動的に以下が実行されます:
# - upsert_dojos_geojson
# - compact_geojson
# または個別実行(必要な場合のみ)
bundle exec rake get_data_from_earth # 全世界のDojoデータ取得
bundle exec rake get_data_from_japan # 日本のDojoとイベントデータ取得
bundle exec rake upsert_dojos_geojson # GeoJSON生成
bundle exec rake compact_geojson # GeoJSON圧縮# ローカル開発サーバーの起動
bundle exec jekyll server
# 本番環境向けビルド
JEKYLL_ENV=production bundle exec jekyll build
# テストの実行(リンクチェックなど)
bundle exec rake test-
データ取得: 外部APIから最新のDojo情報を取得
get_data_from_earth.rb: Clubs API(旧CoderDojo Zen)からワールドワイドのデータを取得get_data_from_japan.rb: CoderDojo Japan APIから日本のDojoとイベントのデータを取得
-
データ統合: 複数のソースから取得したデータを統合
upsert_dojos_geojson.rb: 両方のAPIから取得したデータをマージし、重複を除去してGeoJSON形式に変換
_plugins/build_hooks.rbにより、jekyll buildまたはjekyll server実行時に自動的に以下のタスクが実行されます:
# Jekyll::Hooks.register :site, :after_init
1. upsert_dojos_geojson # GeoJSON生成
2. compact_geojson # GeoJSON圧縮(22.9%削減)メリット:
- ✅ ローカル開発でも本番環境でも一貫した動作
- ✅
_data/*.json更新後、jekyll buildだけで自動反映 - ✅ 手動でのRakeタスク実行が不要
実行ログ例:
🔄 Running pre-build tasks...
→ Updating dojos.geojson...
→ Creating dojos.min.geojson...
✅ Created dojos.min.geojson (22.9% reduction)
✅ Pre-build tasks completed
GitHub Actionsで毎日自動更新(日本時間 5:59):
- データ取得スクリプトを実行
- Jekyllビルド(プラグインが自動的にGeoJSON生成・圧縮)
- テスト実行(安全性確認)
- 変更があれば自動コミット
- GitHub Pagesへ自動デプロイ
ワークフローの手動実行:
# scheduler_daily.yml(データ更新+デプロイ)
gh workflow run scheduler_daily.yml
# ci.yml(ビルド・テスト・デプロイ。PR ではデプロイせずテストまで)
gh workflow run ci.yml
# 実行状況確認
gh run list --workflow=scheduler_daily.yml --limit 3
gh run watch # リアルタイム監視- Geolonia Maps: 日本に最適化された地図タイルサービス
- index.html: 日本のDojoに特化した地図
- world.html: 世界中のDojoを表示する地図
- マーカークリックでポップアップ表示(名前、説明、連絡先、イベント情報)
_data/dojos_earth.json: Clubs APIから取得した全世界のDojoデータ_data/dojos_japan.json: CoderDojo Japan APIから取得した日本のDojoデータ_data/events_japan.json: 日本のイベントデータ_data/dojos.json: 地図に載った日本のDojo一覧(生成物)。/dojos.jsonとして配信し、掲載後の反映確認に使うtmp/unmatched_dojos.json: 地図に載らなかったactiveなDojoと、その理由(生成物)dojos.geojson: 地図表示用の統合データ(GeoJSON形式、人間が読める形式)dojos.min.geojson: 圧縮版GeoJSON(本番環境で使用、22.9%削減)_plugins/build_hooks.rb: Jekyllビルド時の自動データ更新フック
html-proofer: HTMLの妥当性とリンクチェック- 外部リンクの検証を含む包括的なチェック
技術的に詰まったときや調査が必要なときは、o3 MCP(mcp__o3__o3-search)を活用して最新の情報を取得します。
実装前に必ずo3 MCPで以下を調査:
- 新しいGemを追加する前:
mcp__o3__o3-search "[gem名] Jekyll 4.3 Ruby 3.4 compatibility issues 2025" - APIエンドポイント変更前:
mcp__o3__o3-search "CoderDojo Clubs API endpoint migration breaking changes 2025" - GitHub Actions更新前:
mcp__o3__o3-search "GitHub Actions Ubuntu runner Jekyll build issues 2025"
# Jekyll 4.3のビルドエラー
mcp__o3__o3-search "Jekyll 4.3 [エラーメッセージ] Ruby 3.4 GitHub Pages 2025"
# Jekyll プラグイン互換性
mcp__o3__o3-search "Jekyll 4.3 [プラグイン名] compatibility Ruby 3.4 2025"
# Liquid テンプレートエラー
mcp__o3__o3-search "Jekyll Liquid template [エラー内容] syntax error 2025"# Geolonia Maps API
mcp__o3__o3-search "Geolonia Maps API [機能名] implementation JavaScript 2025"
# GeoJSON フォーマット
mcp__o3__o3-search "GeoJSON format [問題] mapbox compatibility 2025"
# マーカークラスタリング
mcp__o3__o3-search "Geolonia Maps marker clustering performance optimization 2025"# Clubs API (旧CoderDojo Zen)
mcp__o3__o3-search "CoderDojo Clubs API [エンドポイント] authentication Ruby 2025"
# APIレート制限
mcp__o3__o3-search "CoderDojo API rate limit handling Ruby retry strategy 2025"
# JSONパースエラー
mcp__o3__o3-search "[エラー全文] JSON parse Ruby 3.4 encoding UTF-8"# WebP変換
mcp__o3__o3-search "Ruby ImageMagick WebP conversion quality optimization 2025"
# 画像キャッシュ戦略
mcp__o3__o3-search "Jekyll static site image caching strategy WebP CDN 2025"# ワークフローエラー
mcp__o3__o3-search "GitHub Actions [エラー] Jekyll build Ruby 3.4 Ubuntu 2025"
# 自動コミット問題
mcp__o3__o3-search "GitHub Actions automated commit permission denied GITHUB_TOKEN 2025"
# GitHub Pages デプロイ
mcp__o3__o3-search "GitHub Actions Pages deploy Jekyll JEKYLL_ENV production 2025"- 初期調査: エラーメッセージ全文で検索
- 深堀り: 使用している技術スタック(Jekyll 4.3, Ruby 3.4, Geolonia Maps)を含めて再検索
- 検証: 公式ドキュメントや最新のGitHub Issuesを確認
# 複数データソース統合時の名前マッチング問題
mcp__o3__o3-search "GeoJSON data integration name mapping mismatch multiple sources 2025"
# ID ベースでのデータ突合
mcp__o3__o3-search "stable identifier vs name matching data integration best practices 2025"
# データ不整合のデバッグ手法
mcp__o3__o3-search "multi-source data integration debugging missing records troubleshooting 2025"o3の検索結果を使用する際は必ず:
- 情報の日付を確認(2024年以降の情報を優先)
- Jekyll/Ruby/APIのバージョン互換性を確認
- DojoMapの制約条件(静的サイト、GitHub Pages)と照合
- 小規模な変更でテストしてから本実装
Clubs DB と Japan DB は global_club_id (UUID) で突合している。表示されない場合、
ほぼ全て「UUID が一致していない」ことが原因なので、まず生成物の診断結果を見る。
-
地図に載らなかった Dojo と理由を確認する
bundle exec rake upsert_dojos_geojson cat tmp/unmatched_dojos.jsonreasonの意味は次のとおり。reason 意味 対応 uuid_not_in_clubscoderdojo.jp の global_club_idが指すクラブが Clubs DB に無いClubs 側で削除・ID 変更が起きている。 db/dojos.ymlの値を現在のものに更新するclub_excluded_by_status_or_coordinatesクラブはあるが、座標が無いか、準備中・活動中のどちらでもない Clubs 側の登録内容を直す(提携先の管理画面) no_uuidcoderdojo.jp 側に global_club_idが無いdb/dojos.ymlに設定する。通常は向こうの CI が防ぐ -
Clubs DB 側の現在の UUID を調べる
ruby -rjson -e 'JSON.parse(File.read("_data/dojos_earth.json")).select { |c| c["countryCode"] == "JP" && c["name"].include?("対象名") }.each { |c| puts "#{c["id"]} #{c["name"]} #{c["status"]}" }' -
coderdojo.jp 側を直す
db/dojos.ymlのglobal_club_idを更新し、PR を出す。地図側のリポジトリで 修正することはない(名前で突合していた頃と違い、こちらに手動のマッピングは無い)。 -
反映を確認する
bundle exec rake get_data_from_japan # coderdojo.jp のデプロイ完了後に実行 bundle exec rake upsert_dojos_geojson bundle exec rake test_matching
以前は dojo2dojo.csv で「Japan 登録名 → Clubs 登録名」を手で対応付けていたが、
次の理由で UUID 突合に切り替えた。
- 新しい Dojo を追加するたび CSV に 1 行足す運用が必要で、実際に漏れていた
- Clubs 側で改名されると追従できない(那覇の登録名が変わっていた)
- 同名クラブが二重登録されていると、先に現れた方を拾ってしまう(流山・古河)
- 表記ゆれ("Coderdojo XXX" vs "XXX"、"@" や "、" の有無、ローマ字と日本語)に そのつど対応する必要があった