Skip to content

♻️ ロゴの取り込みをやめ、coderdojo.jp から直接読み込む - #44

Merged
yasulab merged 1 commit into
mainfrom
fix-stale-dojo-logos
Aug 27, 2026
Merged

yasulab merged 1 commit into
mainfrom
fix-stale-dojo-logos

Conversation

@yasulab

@yasulab yasulab commented Aug 27, 2026

Copy link
Copy Markdown
Member

何が起きたか

coderdojo.jp の PR #1890 で「地図に表示されるアイコンが旧画像です」という報告をいただきました(CoderDojo姫路)。

調べたところ姫路だけの問題ではなく、246 件中 7 件が古いロゴのままでした。姫路のファイルは 2023 年 1 月に取り込んだものでした。

地図(旧) coderdojo.jp(現行)
姫路 「ひめじ」の文字ロゴ 姫路城の意匠

原因

ロゴを coderdojo.jp から取り込んでリポジトリに置く仕組みでしたが、取り込みタスクにこの 1 行がありました。

next(puts "Skipped: #{filename}") if File.exist? "#{FILEPATH}/#{filename}"

同名ファイルがあれば無条件にスキップするため、Dojo がロゴを差し替えても地図側は永久に更新されません。

対処: 取り込みをやめる

当初は「Content-Length を比較して変わったものだけ取り直す」修正を実装しましたが、そもそも取り込みが必要なのかを確認したところ、前提が変わっていました。

2023 年に取り込みを始めた理由は PR #8 に記録されています。

結論: coderdojo.jp 側が WebP 画像に対して text/plain の Content-Type で返していたのが原因でした

現在は image/webp を返します。

$ curl -s -o /dev/null -D - https://coderdojo.jp/img/dojos/himeji.webp
HTTP/2 200
content-type: image/webp
cache-control: public, max-age=31556952

そこで取り込み層を丸ごと無くし、<img src> に coderdojo.jp の URL を直接書くようにしました。同期の仕組みを足して直すより、層ごと無くす方が「古いまま」という不具合が構造的に消えます

確認したこと

  • ロゴ 245 件すべて200 かつ image/* で配信されている
  • ヘッドレス ブラウザで外部 WebP を読み込めることを確認(390x400 で描画)
  • ページ読み込み時のロゴ取得は 0 件performance.getEntriesByType で計測)
    ポップアップの中身はクリックするまで DOM に入らないため、表示時に読むのは 1 件だけ
  • 生成されたポップアップの HTML を描画し、鞍手・姫路・三木のロゴが表示されることを確認
  • 海外 Dojo 用の /images/coderdojo.webp(1117 件が参照)は残存
  • 削除したパスへの参照はゼロ
  • bundle exec rake test_markers → 14 runs, 0 failures
  • jekyll build からロゴ取り込みの処理が消えている
  • CSP は設定されていないため阻害しない

副次的な効果

  • 毎ビルド 246 回の HTTP リクエストが無くなる(日次 + push ごとに coderdojo.jp へ投げていた)
  • リポジトリから 246 ファイル(約 4MB) が減る

変更点

ファイル 内容
_tasks/cache_dojo_logos.rb 削除
images/dojos/ 246 ファイル削除
_tasks/upsert_dojos_geojson.rb <img src> を coderdojo.jp の URL に
_plugins/build_hooks.rb 取り込みの呼び出しを削除
Rakefile タスク定義を削除
.github/workflows/*.yml git add images/dojos とコメントを更新
tests/markers_integrity_test.rb 期待値を新しい URL に

images/dojos/japan.webp は 2023 年の取り込み時の残骸で、どこからも参照されていませんでした。あわせて削除しています。

トレードオフ

coderdojo.jp が落ちるとロゴが表示されなくなります(地図・マーカー・名前・リンクは無事で、alt テキストになります)。同一団体の本体サイトが落ちている状況なので実害は小さく、「3 年間気づかれずに古いままだった」状態より、壊れ方が目に見える分ましだと判断しました。

マージ後に確認すること

  • Deploy to GitHub Pages が成功する
  • 姫路のポップアップが新しいロゴになる
  • マーカー総数が減っていない(現在 1313 件)
    curl -s https://map.coderdojo.jp/dojos.geojson | ruby -rjson -e 'puts JSON.parse(STDIN.read)["features"].size'
  • 海外 Dojo のフォールバック表示が従来どおり

「地図に表示されるアイコンが旧画像です」という報告を受けた。
cf. coderdojo-japan/coderdojo.jp#1890

## これまでの仕組みと不具合

ロゴを coderdojo.jp から取り込み、リポジトリに 246 ファイル置いていた。
取り込みタスクが「同名ファイルがあれば無条件にスキップ」していたため、
Dojo がロゴを差し替えても地図側は最初に取り込んだ画像のまま更新されなかった。
姫路のロゴは 2023 年のもので、246 件中 7 件が古いままだった。

## 取り込みをやめる

2023 年に取り込みを始めた理由は、当時 coderdojo.jp が WebP を text/plain の
Content-Type で返しており、外部から読み込めなかったため。
cf. #8

現在は image/webp を返す。実測して確認した。

  content-type: image/webp
  cache-control: public, max-age=31556952

取り込み層を無くせば「古いまま」という不具合が構造的に消える。同期の仕組みを
足して直すより、層ごと無くす方が確実。

## 確認したこと

- ロゴ 245 件すべてが 200 かつ image/* で配信されている
- ヘッドレス ブラウザで外部 WebP を読み込めることを確認した
- ページ読み込み時のロゴ取得は 0 件(ポップアップの中身はクリックするまで
  DOM に入らないため、表示時に読むのは 1 件だけ)
- 生成されたポップアップの HTML を描画し、ロゴが表示されることを確認した
- テスト 14 件すべて通過

## 副次的な効果

- 毎ビルド 246 回の HTTP リクエストが無くなる
- リポジトリから 246 ファイル(約 4MB)が減る

images/dojos/japan.webp は 2023 年の取り込み時の残骸で、どこからも参照されて
いなかった。あわせて削除する。海外 Dojo 用の images/coderdojo.webp は
coderdojo.jp 由来ではないので残す。
@yasulab
yasulab merged commit 4017c93 into main Aug 27, 2026
2 checks passed
@yasulab
yasulab deleted the fix-stale-dojo-logos branch August 27, 2026 17:18
yasulab added a commit that referenced this pull request Aug 31, 2026
見直しで、実装に無いものを案内している記述が見つかった。

## 存在しない cache_dojo_logos の案内 (6 箇所)

ロゴの取り込みは #44 でやめ、coderdojo.jp から直接読み込む方式にした。
その際 CLAUDE.md と README を直しておらず、実行するとエラーになる
コマンドを案内したままだった。

    bundle exec rake cache_dojo_logos    # このタスクは存在しない

`_tasks/cache_dojo_logos.rb` も Rakefile のタスクも無い。ビルドフックが
実行するのは upsert_dojos_geojson と compact_geojson の 2 つだけ。
`images/dojos/*.webp` も同じ理由で残骸になっていた。

## 実在しないスクリプト名 (3 箇所)

    get_dojos_from_earth.rb  -> get_data_from_earth.rb
    get_dojos_from_japan.rb  -> get_data_from_japan.rb
    get_events_from_japan.rb -> 存在しない (イベントは get_data_from_japan.rb が取得する)

## Slack 通知の対象が、スクリプトとワークフローで食い違っていた

upsert_dojos_geojson.rb のコメントは「uuid_not_in_clubs だけが要対応」の
ままだったが、#42 で no_uuid も通知対象にしている。no_uuid は coderdojo.jp
側の spec が防いでいるはずの状態で、出たら上流の保証が破れている。
club_excluded_by_status_or_coordinates を通知しない理由も併記した。

## ステータスの説明が不正確だった

「座標が無いか活動中ではない」と書いていたが、PLANNING (準備中) も地図に
出すため「準備中・活動中のどちらでもない」が正しい。coderdojo.jp 側の
手順書は直していたが、こちらを直し忘れていた。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant