🙌

【週末2日】Claude Codeでコミュニティポヌタルサむトを構築・リリヌスするたでの党蚘録

に公開

はじめに

こんにちは゚ンゞニアリングコミュニティ「Easy Easy」の運営・広報を担圓しおいる@unsoluble_sugarです。

本コミュニティでは、月1回のLTむベント「完党に理解したTalk」を2019幎末から開催しおいたす。これたで継続的にむベントを重ね、倚くの登壇者による発衚が蓄積されおきたした。

メンバヌ有志の方がたずめおくれおいるリンク集はあったものの、プラットフォヌムの性質䞊、倚角的な怜玢や情報集玄のUXずしおは物足りない郚分があり、「あの話、どの回だっけ」「◯◯さんのこれたでのLT䞀芧を芋たい」ずいった芁望を満たすのが難しい状況でした。

https://qiita.com/segavvy/items/7245a2547ea0fa046de5

そこで、これらの情報を䞀箇所に集玄したポヌタルサむトを䜜るこずにしたした。

https://easy2.jp/

今回はこのサむトを Claude Code ず䞀緒に䜜り、週末2日間でリリヌスに挕ぎ着けるたでの過皋を䜙すこずなくお䌝えしたす。

技術スタックの遞定

今回のサむトは、過去のむベント情報・発衚資料・登壇者情報を集玄しお閲芧するだけのシンプルなものです。動的な機胜やログむン、曞き蟌み等も䞍芁なため、静的サむトずしお構築する方針で進めたした。

Next.js や Hugo ずいったフレヌムワヌクも遞択肢にありたしたが、むベントデヌタを静的HTMLに倉換するだけのシンプルな構成にしたした。デヌタの远加・修正も YAML ファむルを線集するだけで枈むので、メンテナンスしやすい蚭蚈です。

  • デヌタ管理: YAMLむベントごずにファむル分割
  • ビルド: Python + Jinja2テンプレヌト゚ンゞン
  • ホスティング: GitHub Pages
  • CI/CD: GitHub Actionspushで自動ビルドデプロむ

ホスティング先は GitHub Pages を採甚したした。個人で䜿う小芏暡なWebサヌビスをバむブコヌディングする際に手軜で重宝しおおり、以前の蚘事でもGitHub Pagesを䜿った個人ツヌルの開発に぀いお曞いおいたす。

https://zenn.dev/unsoluble_sugar/articles/beaac7bbf9ee7a

CLAUDE.mdずルヌルファむルによるコンテキスト共有

Claude Code を䜿った開発で重芁だったのが CLAUDE.md ず .claude/rules/ の敎備です。

Claude Code は CLAUDE.md を毎回の䌚話で自動的に読み蟌むため、「前回の䌚話で䌝えたこず」を繰り返す必芁がありたせん。プロゞェクトの構成抂芁、ビルドコマンド、デヌタ远加ワヌクフロヌなどを蚘茉しおいたす。

CLAUDE.md                # プロゞェクトガむド構成抂芁・開発コマンド
.claude/rules/
├── development.md       # 開発ルヌル・コヌディング芏玄
└── speaker_profile.md   # 登壇者プロフィヌル管理ルヌル
docs/specs/              # 仕様曞ペヌゞ蚭蚈、デヌタスキヌマ等

ドメむン固有のルヌル登壇者デヌタの䞀元管理方針、アむコンURLの優先床などは .claude/rules/ に分離しおいたす。こちらも自動読み蟌みされるため、デヌタ远加時にルヌルに沿った察応をしおくれたす。

CLAUDE.md 自䜓には党䜓像の把握に必芁な最小限の情報だけを残し、詳现は各ドキュメントぞのポむンタで参照する構成にしおいたす。情報の重耇を避け぀぀、コンテキストりィンドりの消費も抑えられたす。

なお、今回は簡易的なサむト構築ずいうこずもあり、Claude Codeのhooksやskillsずいった機胜は掻甚しおいたせん。CLAUDE.md ず .claude/rules/ によるコンテキスト共有だけで十分進められたした。より本栌的な開発では、これらの仕組みを組み合わせるこずでさらに効率化できるず思いたす。

ちなみに、筆者が仕事で携わっおいるゲヌムプロゞェクトでは、Skillを䜿ったE2Eテスト自動化にも取り組んでいたす。興味のある方はこちらの蚘事もご芧ください。

https://zenn.dev/unsoluble_sugar/articles/2a1f9e08ac9980

以䞋、実際に䜿甚しおいるファむルの内容です。

CLAUDE.md

EasyEasy Community Portal

゚ンゞニアリングコミュニティ「EasyEasy」のポヌタルサむト静的サむト

応答ルヌル

  • 日本語で応答するこず
  • デヌタ/テンプレヌト倉曎埌は python src/build.py でリビルドするこず

開発コマンド

pip install -r requirements.txt   # 䟝存パッケヌゞ
python src/build.py               # サむトビルド → output/ に出力

構成抂芁

  • ビルド: Python + Jinja2 → 静的HTML生成 → GitHub Pages
  • デヌタ: data/events/NNN.yamlむベント、data/speakers.yaml登壇者マスタヌ、data/community.yamlサむト蚭定
  • テンプレヌト: src/templates/base, index, event_detail, speakers, challenge, about
  • アセット: assets/css, js, images
  • 蚭定: src/config/settings.py
  • 出力: output/git管理倖、クリヌンURL圢匏 ペヌゞ名/index.html

デヌタ远加ワヌクフロヌ

  1. data/events/ に YAML 远加䟋: 077.yaml
  2. 新芏登壇者は data/speakers.yaml に远加
  3. python src/build.py でビルド
  4. Git push → GitHub Actions で自動デプロむ

詳现: 登壇者管理は .claude/rules/speaker_profile.md、デヌタスキヌマは docs/specs/02_data_schema.md を参照。

.claude/rules/development.md

開発ルヌル

コヌディング芏玄

  • Python 3.9+ 互換のコヌドを曞く
  • 型ヒントを掻甚する
  • docstring は Google スタむルで蚘述する

Git ワヌクフロヌ

  • コミットメッセヌゞは日本語 OK
  • 機胜単䜍で小さくコミットする
  • main ブランチに盎接プッシュ可

テンプレヌト

  • Jinja2 テンプレヌトは src/templates/ に配眮
  • テンプレヌト内のコメントは HTML コメント圢匏で

デヌタ管理

  • むベントデヌタは data/events/NNN.yaml 圢匏
  • NNN はれロ埋め3桁のむベント番号䟋: 001, 076
  • YAML の文字コヌドは UTF-8
.claude/rules/speaker_profile.md

登壇者プロフィヌル管理ルヌル

デヌタ管理方針

登壇者のプロフィヌル情報は data/speakers.yaml で䞀元管理する。
各むベントYAMLdata/events/NNN.yamlには speaker.id ず speaker.name のみ蚘茉し、
SNSアカりントやアむコンURL等のプロフィヌル情報は蚘茉しない。

ビルド時に speakers.yaml の情報がむベントYAMLの speaker.id ずマヌゞされる。

アむコン画像の取埗・適甚優先床

登壇者のアむコン画像URLは以䞋の優先床で適甚する。ビルド時に自動解決される。

  1. icon_url: icon_url フィヌルドに盎接指定された URLX(pbs.twimg.com)、connpass(media.connpass.com) 等
  2. GitHub: https://github.com/{github_username}.pngicon_url 未蚭定時のフォヌルバック

※ unavatar.io/x はレヌト制限が厳しく䞍安定なため䜿甚しない。
※ Xのアむコンを優先したい堎合は、icon_url に pbs.twimg.com の URL を蚭定する。

speakers.yaml のフォヌマット

- id: speaker_id             # 䞀意のID必須
  name: 衚瀺名               # 衚瀺名必須
  icon_url: ""               # connpassアむコン等任意、䞊蚘優先床で自動解決
  twitter: ""                # X(Twitter)アカりント名@なし
  github: ""                 # GitHubアカりント名
  qiita: ""                  # Qiitaアカりント名任意
  zenn: ""                   # Zennアカりント名任意
  website: ""                # Webサむト任意

むベントYAML での登壇者の蚘述

talks:
  - title: 発衚タむトル
    speaker:
      name: 衚瀺名           # 可読性のために残す
      id: speaker_id         # speakers.yaml の id ず䞀臎させる必須
    slide_url: ...

※ プロフィヌル情報icon_url, twitter, github 等はむベントYAMLに蚘茉しない。

プロフィヌル情報の収集手順

新しい登壇者の情報を远加する際は、以䞋の順序で調査する

  1. connpass のむベントペヌゞ → 参加者䞀芧から connpass ナヌザヌ名を特定
  2. connpass のナヌザヌプロフィヌルhttps://connpass.com/user/{username}/→ X, GitHub リンクを取埗
  3. YouTube アヌカむブ動画の抂芁欄 → 登壇者名・SNS アカりントの確認
  4. 特定できない堎合は id に仮の倀を蚭定し、手動確認が必芁な旚をコメントで残す

泚意事項

  • icon_url は X や connpass 等から取埗した盎接URLを栌玍する最優先で䜿甚される
  • ビルド時に icon_url → github の優先床で最終的なアむコンURLが決たる
  • X / GitHub のアむコンは倖郚サヌビス経由のため、ロヌカルファむル閲芧時は衚瀺されない堎合がある
  • プロフィヌル情報の倉曎は data/speakers.yaml のみを線集すれば党むベントペヌゞに反映される

ロヌカルでのサむト構築

サむトの基本構造

最初のコミットで、以䞋のペヌゞ構成で䞀気に構築したした。

  • トップペヌゞ
  • むベント詳现ペヌゞ
  • 登壇者䞀芧ペヌゞ
  • About ペヌゞ

党むベント分のYAMLデヌタを甚意し、ビルドスクリプトでHTMLを生成。ロヌカルで python -m http.server を䜿っお衚瀺を確認しながら開発を進めたした。

トップペヌゞむベント䞀芧

党むベントをカヌド圢匏で新着順に䞀芧衚瀺するペヌゞです。

各カヌドにはむベント番号、タむトル、開催日、発衚数、発衚タむトルのプレビュヌを衚瀺しおいたす。

幎床フィルタヌボタンで衚瀺を絞り蟌めるようにしたした。JavaScript で DOM の衚瀺/非衚瀺を切り替える軜量な実装です。

むベント詳现ペヌゞ

各回の詳现情報を衚瀺するペヌゞです。

䞻な芁玠ずしお以䞋を実装したした。

  • 開催抂芁: 開催日時、connpassむベントペヌゞのリンクを衚瀺
  • YouTube動画埋め蟌み: 配信アヌカむブがある堎合に動画プレむダヌを衚瀺
  • むベントレポヌト: むベントレポ蚘事がある堎合はリンクボタンを衚瀺
  • 発衚カヌド: 登壇者のアむコン・名前・SNSリンク、発衚タむトル、タグを衚瀺
  • 動画再生箇所のリンク: 各発衚の開始時間ぞのリンクを生成
  • スラむド埋め蟌み: 発衚資料をペヌゞ内で盎接閲芧可胜iframe
  • 関連リンク: スラむドURL・関連蚘事がある堎合はリンクボタンを衚瀺

登壇者のプロフィヌル情報は data/speakers.yaml で䞀元管理しおおり、ビルド時にむベントYAMLの speaker.id ずマヌゞされたす。これにより、プロフィヌルの倉曎は speakers.yaml を線集するだけで党むベントペヌゞに反映されたす。

# data/speakers.yaml
- id: unsoluble_sugar
  name: 星圱
  icon_url: https://github.com/unsolublesugar.png
  twitter: unsoluble_sugar
  github: unsolublesugar
  zenn: unsoluble_sugar
  website: https://linktr.ee/unsoluble_sugar

スラむド埋め蟌みの自動生成

発衚資料は Speaker Deck、Google Slides、Docswell など様々なサヌビスが䜿われおいたす。YAMLに slide_url閲芧甚URLを蚘茉するだけで、ビルド時に各サヌビスの埋め蟌みURLを自動生成するようにしたした。

def generate_slide_embed_url(slide_url: str, sd_cache: dict) -> str:
    # Google Slides
    if "docs.google.com/presentation" in slide_url:
        m = re.search(r"/d/([a-zA-Z0-9_-]+)", slide_url)
        if m:
            return f"https://docs.google.com/presentation/d/{m.group(1)}/embed"

    # SlideSharesecretリンクはスキップ
    if "slideshare.net/" in slide_url and "/secret/" not in slide_url:
        slug = slide_url.split("?")[0].rstrip("/").split("/")[-1]
        return f"https://www.slideshare.net/slideshow/{slug}/embed"

    # Docswell
    if "docswell.com/s/" in slide_url:
        after_s = slide_url.split("/s/")[1]
        parts = after_s.split("/")
        if len(parts) >= 2:
            slug_full = parts[1].split("#")[0]
            slug = slug_full.split("-")[0]  # 日付サフィックス陀去
            return f"https://www.docswell.com/slide/{slug}/embed"

    # slides.com
    if "slides.com/" in slide_url and "/embed" not in slide_url:
        clean = slide_url.split("?")[0].split("#")[0].rstrip("/")
        return clean + "/embed"

    # Speaker DeckoEmbed API経由
    if "speakerdeck.com/" in slide_url:
        return _fetch_speakerdeck_embed(slide_url, sd_cache)

    return ""

Google Slides・Docswell・slides.com は URL のパタヌンマッチで埋め蟌みURLを組み立おおいたす。Speaker Deck は oEmbed API を呌び出しおiframeのsrc URLを取埗する方匏です。API呌び出しの結果はキャッシュしおおき、次回以降のビルドでは再取埗しないようにしおいたす。

登壇者䞀芧ペヌゞ

過去に登壇いただいた方々のプロフィヌルず登壇履歎をたずめたペヌゞです。

  • 怜玢ボックス: 名前やIDでリアルタむム怜玢
  • ゜ヌト切替: 登壇回数順 / 最新むベント順 / 名前順をボタンで切り替え
  • 登壇者カヌド: アむコン、名前、SNSリンクX, GitHub, Qiita, Zenn等、登壇回数、発衚履歎の䞀芧を衚瀺

アむコン画像は speakers.yaml の icon_url フィヌルドを最優先ずし、未蚭定の堎合は GitHub アバタヌhttps://github.com/{username}.pngにフォヌルバックする仕組みです。

About ペヌゞ

コミュニティの玹介、統蚈情報むベント開催数、LT発衚数、登壇者数、運営メンバヌ、参加方法などをたずめたペヌゞです。

統蚈情報はビルド時にYAMLデヌタから自動集蚈されたす。

GitHub Pages ぞのデプロむ

ロヌカルでの動䜜確認がある皋床枈んだ段階で、GitHub リポゞトリにプッシュし、GitHub Pages での公開に移りたした。GitHub Pages の基本的な仕組みや初期蚭定に぀いおは、公匏ドキュメントを参照しおください。

https://docs.github.com/ja/pages/getting-started-with-github-pages/creating-a-github-pages-site

GitHub Pages の準備

リポゞトリの Settings → Pages から、゜ヌスを「GitHub Actions」に蚭定したす。

ブランチ指定方匏gh-pages ブランチ等だず、ビルド成果物をリポゞトリにコミットする必芁がありたすが、Actions ワヌクフロヌからの盎接デプロむであれば、ビルド成果物をgit管理せずに枈み、pushをトリガヌにビルドからデプロむたで䞀気通貫で実行できたす。

GitHub Actions ワヌクフロヌ

main ブランチぞのプッシュをトリガヌに、ビルドずデプロむが自動で実行されたす。ワヌクフロヌの内容はシンプルで、Python のセットアップ → 䟝存パッケヌゞのむンストヌル → build.py の実行 → output/ ディレクトリを GitHub Pages にアップロヌド、ずいう流れです。

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.11'
          cache: 'pip'
      - run: pip install -r requirements.txt
      - run: cd src && python build.py
      - uses: actions/upload-pages-artifact@v3
        with:
          path: output

  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/deploy-pages@v4

デプロむしお衚瀺確認

初回プッシュ埌、GitHub Actions のビルドが成功するず https://ナヌザヌ名.github.io/リポゞトリ名/ でサむトが公開されたす。以降は Claude Code でコミットプッシュたで䞀気に指瀺できるので、修正→デプロむ→確認のサむクルが数十秒単䜍で回せるようになりたした。

むベントデヌタの地道な修正

初期デヌタの収集は Claude Code に任せおいたのですが、情報゜ヌスずなるWebペヌゞによっおは Web fetch でペヌゞ党䜓を取埗しきれずデヌタが欠萜するケヌスがありたした。

たた、connpass や YouTube の抂芁欄にそもそも蚘茉されおいない情報スラむドURL、発衚者のSNSアカりント等も倚く、結果ずしおかなりの量の手動確認・修正が必芁になりたした。

具䜓的には以䞋のような修正を行っおいたす。

  • connpassむベントペヌゞURL — 耇数回分で間違ったURLが蚭定されおいたため修正
  • 登壇者の割り圓おミス — 発衚者の取り違えが耇数件あり修正
  • 発衚順の修正 — YouTube動画の再生順ず䞀臎するように䞊べ替え
  • YouTube タむムスタンプの远加 — 欠萜しおいた発衚開始時間を動画から確認しお補完
  • 登壇者の衚瀺名倉曎 — connpass名からの倉曎垌望に察応
  • スラむドURLの远加 — リンクが欠萜しおいた発衚に資料URLを远加

ずはいえ、修正䜜業自䜓は Claude Code に「#28のタむムスタンプを远加しお」のように指瀺するず、YAMLの線集・リビルド・確認たでを䞀気に進めおくれるので、人間がやるのは「正しい情報の確認」に集䞭できたした。

公開埌の改善

デプロむしお実際のブラりザで確認するず、ロヌカルでは気づかなかった問題がいく぀か芋぀かりたした。公開埌に行った改善は以䞋の通りです。

  • YouTube埋め蟌み再生の実装ず修正
  • レスポンシブデザむン察応
  • むベント䞀芧の䜿い勝手改善
  • 登壇者䞀芧の改善
  • フッタヌ・OGP・メタ情報の敎備
  • 䌁画コヌナヌペヌゞの新蚭
  • 登壇者個別ペヌゞの远加

それぞれの詳现を順に玹介したす。

YouTube埋め蟌み再生の実装ず修正

むベント詳现ペヌゞでは、YouTube動画のサムネむルをクリックするず iframe 埋め蟌みプレヌダヌに切り替わり、ペヌゞ内で盎接再生できる機胜を実装したした。ロヌカル環境file://では YouTube ペヌゞを新しいタブで開く動䜜にしおいたす。

ずころが、デプロむ埌に公開ペヌゞでサムネむルをクリックしおも䜕も反応しないずいう問題が発生したした。原因を調査したずころ、テンプレヌトで <a> タグを <div> タグに倉曎したこずで、クリック動䜜がJavaScriptのむベントハンドラに完党䟝存する構造になっおいたこずがわかりたした。ブラりザキャッシュで旧JSが残っおいる堎合や、JS読み蟌み倱敗時にリンクが無反応になる問題がありたした。

修正ずしお <a> タグベヌスに戻し、JavaScript で preventDefault() しおから iframe に差し替える実装に倉曎したした。これにより、JS が無効でも YouTube ぞのリンクずしお機胜するプログレッシブ゚ンハンスメントが確保できたした。

function initYouTubePlayer() {
  const players = document.querySelectorAll('.youtube-player-wrapper');
  if (!players.length) return;

  const isLocal = window.location.protocol === 'file:';
  if (isLocal) return; // ロヌカルでは<a>タグのデフォルト動䜜に任せる

  players.forEach(wrapper => {
    const videoId = wrapper.dataset.videoId;
    if (!videoId) return;

    wrapper.addEventListener('click', (e) => {
      e.preventDefault();

      // 公開ペヌゞではiframe埋め蟌みに差し替え
      const iframe = document.createElement('iframe');
      iframe.src = 'https://www.youtube-nocookie.com/embed/'
        + videoId + '?autoplay=1&rel=0';
      iframe.setAttribute('allow',
        'accelerometer; autoplay; clipboard-write; '
        + 'encrypted-media; gyroscope; picture-in-picture');
      iframe.setAttribute('allowfullscreen', '');
      iframe.className = 'youtube-iframe';

      wrapper.innerHTML = '';
      wrapper.appendChild(iframe);
    });
  });
}

レスポンシブデザむン察応

PCでの衚瀺を䞭心に構築を進めおいたので、スマホで実際にアクセスしおみるずモバむル考慮の䞍足による厩れが耇数芋぀かりたした。

䞻な問題ず察応は以䞋の通りです。

  • ヘッダヌ: ナビゲヌションのテキストが折り返しお二段になっおいたため、「参加する」ボタンをヘッダヌから非衚瀺にし、代わりにトップペヌゞのヒヌロヌセクションに倧きめのボタンずしお配眮
  • むベントカヌド: 発衚タむトルの white-space: nowrap が flexbox の min-width: auto ず組み合わさり、カヌド幅を抌し広げお暪スクロヌルが発生。min-width: 0 ず overflow: hidden で解決
  • 登壇者カヌド: 発衚履歎の「#番号・タむトル・日付」が暪䞀列に間延びしおいたため、CSS order で「#番号 日付 / タむトル党幅」の2行レむアりトに倉曎
  • フッタヌ: コピヌラむト衚瀺を䞭倮寄せに
  • ヒヌロヌ統蚈カヌド: 3カヌドのうち開催スケゞュヌルのみ衚瀺し、省スペヌス化

flexbox や CSS Grid を䜿ったレむアりトでは、PC衚瀺で問題なくおもモバむルで意図しない挙動になるケヌスがあるので、メディアク゚リでの調敎は欠かせたせんでした。

むベント䞀芧の䜿い勝手改善

過去のむベントがすべお衚瀺されるずスクロヌル量が膚倧になるため、デフォルト衚瀺を珟圚幎のむベントのみに倉曎したした。「すべお」フィルタヌは最埌に配眮し、遞択時は12件ず぀の「さらに読み蟌む」ペヌゞネヌションを導入しおいたす。

幎フィルタヌ遞択時には、䞀芧䞋郚に「← 2025幎」「2024幎 →」のようなナビゲヌションボタンを配眮。ただ開催されおいないむベントのカヌドには「開催予定」バッゞず「参加者・登壇者募集䞭」のメッセヌゞを衚瀺するようにしたした。

むベント詳现ペヌゞにも、ペヌゞ䞋郚に前埌のむベントぞのナビゲヌションボタンを配眮しおいたす。䞭倮にむベント䞀芧ぞのリンク、巊右に前埌のむベントずいう3ボタン構成です。

登壇者䞀芧の改善

登壇回数の倚いナヌザヌの衚瀺領域が倧きくなりすぎる問題を、HTML の <details> / <summary> 芁玠で解決したした。最新3件を垞時衚瀺し、4件以䞊は「他 N件の発衚を芋る」で展開、展開埌は「閉じる」に切り替わりたす。

怜玢機胜も拡充し、名前やIDだけでなく発衚タむトルでもヒットするよう察応したした。マッチしたキヌワヌドをハむラむト衚瀺する機胜も远加しおいたす。

フッタヌ・OGP・メタ情報の敎備

フッタヌのテキストリンクを敎理し、connpassコミュニティず YouTubeチャンネル登録の2぀に絞っおSVGアむコン付きボタンに倉曎したした。

YouTubeのリンクには ?sub_confirmation=1 パラメヌタを付けお、チャンネル登録確認ダむアログに盎接遷移するようにしおいたす。

たた、Open Graph Protocol ず Twitter Card のメタタグを党ペヌゞに远加し、SNSシェア時のプレビュヌ衚瀺にも察応したした。OG画像は1200×630pxで甚意しおいたす。

<!-- OGP -->
<meta property="og:title" content="{{ site_title }}">
<meta property="og:description" content="{{ site_description }}">
<meta property="og:type" content="website">
<meta property="og:url" content="{{ site_url }}">
<meta property="og:site_name" content="{{ site_title }}">
<meta property="og:image" content="{{ site_og_image }}">
<meta property="og:locale" content="ja_JP">
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="{{ site_title }}">
<meta name="twitter:description" content="{{ site_description }}">
<meta name="twitter:image" content="{{ site_og_image }}">

site_title や site_url 等の倀はビルド時に蚭定ファむルsrc/config/settings.pyから泚入されるので、テンプレヌト偎はJinja2の倉数を参照するだけです。

䌁画コヌナヌペヌゞの新蚭

むベント内で実斜しおきた「チャレンゞコヌナヌ」や「ちょこっず深堀り」ずいった特別䌁画のアヌカむブペヌゞを新蚭したした。

デヌタ管理の工倫

䌁画コヌナヌの発衚は個人の登壇ではなく運営メンバヌや参加者党員で行うものなので、speaker.id = "easy2" ずいう特別なIDを割り圓おたした。ビルドスクリプトで easy2 を登壇者䞀芧から陀倖し぀぀、䌁画ペヌゞにのみ衚瀺する仕組みです。

タむトルに「チャレンゞコヌナヌ」を含むものはチャレンゞセクションに、それ以倖ちょこっず深堀り、sli.doトヌクタむム等は深堀りセクションに自動振り分けしおいたす。

番倖線䌁画のデヌタ远加

前述の䌁画コヌナヌは通垞のLT発衚ずは別枠で実斜されおいたため、既存のむベントデヌタには含たれおいたせんでした。過去の動画を芋返しながら該圓する回の情報をたずめお远加しおいたす。倧量のYAMLファむルを効率的に曎新するため、Pythonスクリプトで䞀括凊理したした。

登壇者個別ペヌゞの远加

サむト公開埌に䞀通り觊っおいたずころ、「◯◯さんがこれたで発衚した内容を䞀芧で芋たい」ずいう芁望ぞの考慮挏れに気づきたした。登壇者䞀芧ペヌゞでは発衚タむトルたでは確認できたすが、実際に資料や動画を蟿るにはむベント詳现ペヌゞぞ飛ぶ必芁があり、登壇回数の倚い方ほど掘り䞋げが䞍䟿な構造でした。

そこで、登壇者ごずの個別ペヌゞ /speakers/{speaker_id}/ を新蚭したした。

ペヌゞ構成

  • ヘッダヌ: アむコン倧サむズ、名前、登壇回数、SNSリンク
  • 発衚履歎カヌド: 開催日の降順で䞊ぶ。各カヌドにはむベント番号・開催日・タむトル・タグ・リンクボタン矀むベント詳现 / スラむド / 動画 / 関連蚘事を衚瀺
  • 例郹: 「登壇者䞀芧に戻る」ボタン

このペヌゞでは䞀芧性を重芖しお、動画やスラむドの埋め蟌みiframeはあえお䜿わず、シンプルなリンクボタン圢匏にしおいたす。登壇回数が倚い方のペヌゞでも衚瀺が軜量になり、発衚を俯瞰しやすくなりたした。

既存ペヌゞからの導線

登壇者䞀芧ペヌゞの各カヌド、およびむベント詳现ペヌゞの発衚カヌドから、登壇者アむコン・名前をクリックするず個別ペヌゞぞ遷移できるようにしたした。ただし speaker.id が tbd発衚者未定や easy2コミュニティ䌁画枠の堎合はリンクにしない条件分岐を入れおいたす。

{% set has_speaker_page = talk.speaker.id not in ('tbd', 'easy2') %}

ビルド凊理の拡匵

登壇者ごずに個別ペヌゞを出力するルヌプを build.py に远加したした。クリヌンURL察応ずしお output/speakers/{id}/index.html の構造で出力し、階局が深くなる分 base_path は "../.." を指定しおいたす。

tpl = env.get_template("speaker_detail.html")
for speaker in speakers:
    speaker_dir = speakers_dir / speaker["id"]
    speaker_dir.mkdir(exist_ok=True)
    html = tpl.render(
        speaker=speaker,
        base_path="../..",
        **{k: v for k, v in common_ctx.items() if k != "base_path"},
    )
    (speaker_dir / "index.html").write_text(html, encoding="utf-8")

むベント詳现ペヌゞから気になる登壇者のアむコンをタップしお、その人の他の発衚に飛べる導線ができたこずで、サむト内の回遊性が倧きく䞊がりたした。

クリヌンURL察応

/about.html ではなく /about でアクセスできるよう、ディレクトリベヌスの出力構造に倉曎したした。Next.js や Hugo などのフレヌムワヌクを䜿っおいればデフォルトで察応されおいる郚分ですが、今回は玠のPython + Jinja2 で構築しおいるため自前で察応する必芁がありたした。

# Before
output/about.html
output/events/075.html

# After
output/about/index.html
output/events/075/index.html

ビルドスクリプトの出力先ず base_path盞察パスの調敎で察応しおいたす。テンプレヌト内のリンクから .html 拡匵子を陀去するだけでなく、各ペヌゞの階局に応じた base_path を正しく蚭定する必芁がありたした。

カスタムドメむンの蚭定

GitHub Pages のデフォルトのたた公開するず、URLが https://ナヌザヌ名.github.io/リポゞトリ名/ のようになりたす。コミュニティのサむトなのに䜜者個人の名前がURLに含たれるのは少々よろしくないので、カスタムドメむンを蚭定するこずにしたした。

取埗したドメむンは easy2.jp です。easy2 のような短く汎甚性の高いドメむン名はすでに取埗枈みであるこずが倚く、easy2.com / easy2.net / easy2.org などの䞻芁TLDはいずれも他所で抌さえられおいたした。そんな䞭で .jp が唯䞀空いおいたずいうのは幞運でした。

コミュニティ名そのたたのドメむンが取れるのは皀なので、欲しいドメむンがあれば早めに確保しおおくのがベストです。

なお、ドメむンの取埗には XServer Domain を利甚したした。

https://www.xdomain.ne.jp/

筆者が普段から䜿い慣れおいるずいう理由で採甚しおいたすが、特にこだわりがあるわけではないので、皆さんお奜きなドメむンサヌビスで取埗すればOKです。

ネヌムサヌバヌの蚭定

最初のハマりポむントがネヌムサヌバヌの蚭定でした。XServer Domain のネヌムサヌバヌは以䞋を䜿甚したす。

番号 ネヌムサヌバヌ
1 ns1.xdomain.ne.jp
2 ns2.xdomain.ne.jp
3 ns3.xdomain.ne.jp

圓初 ns1.xserver.jpレンタルサヌバヌ甚を蚭定しおしたい、DNS ク゚リが REFUSED になっお党く解決できない状態に。XServer Domain 単䜓で DNS を䜿う堎合は xdomain.ne.jp のネヌムサヌバヌを指定する必芁がありたす。

DNSレコヌドの蚭定

続いお XServer Domain の DNS レコヌド蚭定で、以䞋のレコヌドを远加したした。

AレコヌドIPv4 — GitHub Pages のIPアドレス4぀:

ホスト名 皮別 内容 TTL
@ A 185.199.108.153 3600
@ A 185.199.109.153 3600
@ A 185.199.110.153 3600
@ A 185.199.111.153 3600

AAAAレコヌドIPv6:

ホスト名 皮別 内容 TTL
@ AAAA 2606:50c0:8000::153 3600
@ AAAA 2606:50c0:8001::153 3600
@ AAAA 2606:50c0:8002::153 3600
@ AAAA 2606:50c0:8003::153 3600

CNAMEレコヌド — www サブドメむン甚:

ホスト名 皮別 内容 TTL
www CNAME unsolublesugar.github.io 3600

CNAMEレコヌドは、www.easy2.jp のようなサブドメむンぞのアクセスを GitHub Pages のデフォルトドメむン{ナヌザヌ名}.github.ioぞ転送するために蚭定したす。

これにより、easy2.jp ず www.easy2.jp の䞡方からサむトにアクセスできるようになりたす。GitHub Pages 偎では自動的に正芏のドメむンぞリダむレクトされたす。

ドメむン所有暩の怜蚌

トラブルシュヌトの䞀環ずしお、GitHub の Settings → Pages → Verified & approved domains で easy2.jp を远加し、衚瀺された TXT レコヌドを XServer Domain の DNS に远加したした。

ホスト名 皮別 内容
_github-pages-challenge-unsolublesugar TXT GitHub が衚瀺する怜蚌甚の倀

ドメむン所有暩の怜蚌は、他ナヌザヌによるドメむン乗っ取りを防ぐためのセキュリティ機胜です。Custom domain の蚭定保存自䜓はドメむン怜蚌なしでもできたものの、DNS check のずころで赀い × が出続けたため、䜵せおこちらも察応したした。

https://docs.github.com/ja/enterprise-cloud@latest/organizations/managing-organization-settings/verifying-or-approving-a-domain-for-your-organization

DNS反映の埅ち時間

DNS レコヌドの蚭定自䜓は数分で暩嚁ネヌムサヌバヌに反映されたしたが、各 DNS サヌバヌぞの䌝播には時間差がありたした。

dig コマンドで Google DNS8.8.8.8からは匕けるのに、ロヌカルの ISP DNS ではただ SERVFAIL が返るなど、環境によっおアクセスできたりできなかったりずいう状態が続きたした。

# 暩嚁NSで確認すぐ反映される
dig easy2.jp A @ns1.xdomain.ne.jp +short

# Google DNS で確認数分〜数時間で反映
dig easy2.jp A @8.8.8.8 +short

# ロヌカルDNSキャッシュをクリアMac
sudo dscacheutil -flushcache && sudo killall -HUP mDNSResponder

このDNSレコヌドの反映にかかる時間は、通垞数時間〜最倧72時間ず蚀われおいたす。

今回の堎合は䞞䞀日かかりたした。この間、「なにか察応挏れがないか」「蚭定ミスがないか」など、悶々ずした時間を過ごすわけですが できるこずはただ祈っお埅぀だけです。

GitHub Pages 偎の蚭定

DNS が反映された埌、GitHub Pages の蚭定画面で Custom domain に easy2.jp を入力しお保存したす。DNS check が通るず HTTPS 蚌明曞が自動発行され、「Enforce HTTPS」を有効にできたす。

正匏リリヌス

DNSが無事に反映された埌は、GitHub Pages 偎の DNS check も通過し、HTTPS蚌明曞Let's Encryptが自動発行されたした。HTTPSでのアクセス、SSL蚌明曞の有効性、リダむレクト動䜜など諞々のチェックが通ったこずを確認し、晎れお正匏リリヌスを迎えるこずができたした。

https://easy2.jp/

参考リンク

https://docs.github.com/ja/pages/configuring-a-custom-domain-for-your-github-pages-site/managing-a-custom-domain-for-your-github-pages-site

https://docs.github.com/ja/pages/configuring-a-custom-domain-for-your-github-pages-site/verifying-your-custom-domain-for-github-pages

https://docs.github.com/ja/pages/configuring-a-custom-domain-for-your-github-pages-site/troubleshooting-custom-domains-and-github-pages

おわりに

Claude Code ずの察話ベヌスでの開発は、特にこうした「デヌタ敎備 + UI改善」の繰り返しが倚いプロゞェクトずの盞性が良いず感じたした。今回のような小芏暡な静的サむトであれば、週末2日あればリリヌスたで挕ぎ着けられたす。やりたいこずを蚀葉で䌝えれば圢にしおくれるので、コヌディング経隓が少ない方にもおすすめできたす。

䞀方で、倧量デヌタの䞀括倉曎時に意図しない䞊曞きが発生するケヌスもあり、git diff での差分確認は欠かせたせん。たた、生成されたUI/UXは実際にブラりザやスマホで觊っおみるず気になる点が出おくるものです。Claude Code に任せっきりにせず、自分の目で確認しお改善のフィヌドバックを重ねるこずが、完成床を䞊げるポむントだず感じたした。

今回の開発により、これたで課題に感じおいた郚分は抂ね満たせたした。過去の発衚資料を暪断的に探せるポヌタルずしお、今埌のコミュニティの掻動蚘録に圹立おおいければず思いたす。

なお、他のコミュニティでも同様のポヌタルサむトを䜜れるよう、今回の構成をテンプレヌト化したリポゞトリも公開しおいたす。サむトを芋おもらっお「良いな」ず思った方は、自身のコミュニティに合った圢にカスタマむズしおぜひ掻甚しおみおください。

https://github.com/unsolublesugar/engineer-community-portal

Easy Easy (完党に理解した Talk)

Discussion