CODH ツール群の暫定ミラー専用リポジトリを GitHub Pages で立てる — そあん(soan)の kuromoji 辞書欠落など

ROIS-DS 人文学オープンデータ共同利用センター (CODH) のホームページが長期メンテナンス中(2026年2月16日夕方よりサービス停止、再開時期未定)の間、各種ツール (vdiff.js / IIIF Curation Viewer / そあん / 等) を Wayback Machine 等から復元し、独立した GitHub Pages リポジトリ (codh-mirror) として公開する手順と、その過程で踏んだいくつかの落とし穴 (とくに『そあん』の kuromoji 辞書欠落) をまとめます。あくまで CODH のサービス再開までの暫定対応です。

codhiiifvdiffsoankuromojigithub-pagesmirrorarchive

台本(フルテキスト)

動画の掛け合いを書き起こしたものです。音声を再生しづらい場合はこちらをお読みください。

オープニング

  • CODH ツール群の暫定ミラーを GitHub Pages に構築
  • Wayback Machine からの復元と落とし穴の記録
つむぎ
今日は CODH のツール群をミラーリポジトリとして GitHub Pages に立てた記録を紹介します。
そら
CODH ってどんな組織なんですか?
つむぎ
ROIS-DS の人文学オープンデータ共同利用センターです。IIIF Curation Viewer やそあんなど、デジタルアーカイブ向けのブラウザツールを公開してきた組織です。
そら
そのサイトが止まっているんですか?
つむぎ
2026年2月から長期メンテナンス中で、再開時期は未定です。ツールを埋め込んでいたサイトが動かなくなったので、暫定ミラーを立てることにしました。
そら
ミラーはどうやって作るんですか?
つむぎ
Wayback Machine から各ツールのファイルを復元して、GitHub Pages のリポジトリに置く形です。

リポジトリの構成

  • ツール名のディレクトリを並べるシンプルな構造
  • 配信対象は約 210 MB、GitHub Pages の上限に収まる
そら
リポジトリはどんな構成にしたんですか?
つむぎ
ツール名のディレクトリを並べるだけのシンプルな構造です。vdiff、IIIF Curation 系、そあんをそれぞれサブディレクトリに入れました。
そら
ファイルサイズはどれくらいですか?
つむぎ
配信対象だけで約 210 MB です。そあんの古活字 PNG が 36,869 枚で 186 MB 含まれています。GitHub Pages の 1 GB 上限には余裕があります。
そら
GitHub Pages の有効化はどうやるんですか?
つむぎ
gh api コマンド 1 発で設定できます。branch に main を指定して POST すれば、1〜2 分でビルドが完了します。

落とし穴 1: そあんの古活字 PNG は絶対 URL で参照されていた

  • dataset/001.json の画像 URL が CODH の絶対 URL
  • 第三者ミラーから 36,869 枚を取得し相対パスに書き換え
そら
どんな落とし穴があったんですか?
つむぎ
まず、そあんの dataset の JSON が、画像の URL を CODH の絶対 URL で指定していたんです。停止中のサーバーを引きに行ってしまう状態でした。
そら
Wayback Machine からは取れなかったんですか?
つむぎ
36,869 枚のバイナリ画像は Wayback でほぼアーカイブされていませんでした。幸い、そあんの開発者の方が個人ホストで同じファイルを公開していたので、そこから取得しました。
そら
そんなに大量の画像を取得するのは時間がかかりそうですね。
つむぎ
xargs で 5 並列でダウンロードして、30 分ほどで完了しました。JSON の URL は相対パスに書き換えて、自サイトから配信できるようにしています。

落とし穴 2: kuromoji 辞書の実行時依存

  • HTML 上には依存が見えないが JS が辞書を動的に取得
  • Network パネルの 404 で原因を発見
そら
2 つ目の落とし穴は何ですか?
つむぎ
ファイルを全部揃えてデプロイしたのに、ブラウザのローディングスピナーが止まらなかったんです。curl でアクセスしても全部 200 OK で、原因が分からなくて。
そら
どうやって原因を見つけたんですか?
つむぎ
DevTools の Network パネルで見たら、kuromoji の辞書ファイルが 404 で並んでいました。そあんは内部で日本語形態素解析の kuromoji.js を使っていて、辞書を動的に取りに行く作りだったんです。
そら
HTML だけ見ていては気づけなかったんですね。
つむぎ
そうです。辞書の 12 ファイル、約 18 MB も Wayback ではアーカイブされていませんでしたが、同じ個人ホストから取得して解決しました。

落とし穴 3 と 4: CSS の依存とレート制限

  • CSS の url() 参照でフォント・画像が大量に欠落
  • Wayback のレート制限対策として sleep 3 秒を挿入
そら
他にも落とし穴はありましたか?
つむぎ
IIIF Curation Viewer などは CSS の url() でフォントや画像を大量に参照していて、HTML から依存をたどるだけでは全部拾えませんでした。
そら
どう対処したんですか?
つむぎ
CSS ファイルから url() を抽出して相対パスを解決するスクリプトを書きました。Wayback にない .eot や .woff は jsDelivr や unpkg から取得しました。
そら
Wayback のレート制限にもひっかかったと聞きました。
つむぎ
リクエスト間に 2〜3 秒の sleep を入れるだけで解決しました。それがないとツール 1 つで 19 件しか取れずに全部 000 になっていたんです。

認証・保存バックエンドとライセンス

  • Firebase 認証と JSONkeeper は動作しない(読み取り専用のみ)
  • ライセンスは MIT(CODH ソフト)・Apache 2.0(kuromoji)
そら
ミラーでもすべての機能が使えるんですか?
つむぎ
読み取り専用の利用は動きます。ただし Firebase 認証と保存バックエンドの JSONkeeper は、CODH 側が停止中なので動きません。
そら
ライセンスはどうなっていますか?
つむぎ
vdiff や IIIF Curation 系、そあんの UI は CODH が MIT ライセンスで公開しているものです。kuromoji 辞書は Apache 2.0 です。
そら
CODH のサービスが再開したらどうするんですか?
つむぎ
再開後はリポジトリをアーカイブする前提です。あくまで暫定対応として公開しています。

まとめ

  • HTML だけでは実行時依存を全部追えない(Network パネルが有効)
  • Wayback の取りこぼしは生きているミラーと CDN で補完
そら
今日のポイントを整理してもらえますか?
つむぎ
HTML だけ見ていても気付けない実行時依存があります。kuromoji 辞書のような動的ロードは DevTools の Network パネルで 404 を確認するのが最短ルートです。
そら
Wayback でアーカイブされていないファイルはどうすればいいですか?
つむぎ
生きている第三者ミラーや CDN を活用します。相手サーバの規模に合わせてダウンロードの並列度を調整するのも大切です。
そら
ミラー作業には想像以上に手間がかかるんですね。
つむぎ
ツールごとに依存関係の解析が必要で、CSS の連鎖参照など意外な落とし穴もありました。同様の作業をする方の参考になればと思います。