ハクソク

世界を動かす技術を、日本語で。

自己更新型スクリーンショット

概要

Jellyのヘルプセンターでは、自動スクリーンショット取得システムを構築。
UI変更時も一括自動更新で、古い画像問題を解消。
Markdown内の特殊コメントで、柔軟にスクリーンショット指定。
Rakeタスクによる自動化で、運用負担を大幅削減。
コードとドキュメントの同期が容易になり、運用効率化を実現。

Jellyのヘルプセンター自動スクリーンショットシステム

  • ヘルプセンターやドキュメントサイト運用における最大の悩み:スクリーンショットの陳腐化問題

    • UI変更のたびに、手動で画像を撮り直し・加工・差し替えが必要
    • 古い画像が残ることで、ユーザー体験や信頼性が低下
  • Jelly独自の解決策:スクリーンショット自動取得&自動更新システムの開発

    • ビルド時に全スクリーンショットを最新状態で自動生成
    • UI変更後もコマンド一発で全画像を更新可能
  • Markdownベースのドキュメント管理

    • 記事はMarkdownで記述、Redcarpet経由でHTML変換し、RailsアプリでERBとしてレンダリング
    • Markdown内に特殊なHTMLコメント(例:<!-- SCREENSHOT: acme-tools/inbox | element | selector=#inbox-brand-new-section -->)を埋め込むことで、取得対象や方法を細かく指定
  • スクリーンショット取得の仕組み

    • RakeタスクCapybaraCupriteでヘッドレスChromeを起動
    • Markdownをパースし、SCREENSHOTコメントを抽出・チームごとにグルーピング
    • URL遷移・ログイン・DOM要素取得・キャプチャを自動化
  • 対応モードとオプション

    • element:CSSセレクタ指定のDOM要素のみをキャプチャ
    • full_page:ページ全体を指定範囲でキャプチャ
    • viewport:ブラウザウィンドウに見えている範囲のみキャプチャ
    • click:ボタン等を自動クリックし、動的UIの状態も取得可能
    • wait:アニメーション等の待機も指定可能
    • crop:キャプチャ後のトリミングも自動対応
    • torn:CSSでちぎり紙風のエフェクトを自動適用
    • hide:不要な要素(例:開発ツールバーやCookieバナー)を一時的に非表示
  • 運用フローの効率化

    • rails manual:buildコマンド一発で全プロセス自動化
    • UI変更時も画像の取り忘れや差し替え漏れゼロ
    • Markdownファイルはpublic/manual/にセクションごとで管理、ビルド後はapp/views/help/にERBとして整理
    • パンくずリストやセクションナビゲーションも自動生成
  • コードとドキュメントの同期性向上

    • 機能開発と同時にドキュメント更新が可能
    • 同じPRやコミットでコードと説明を一元管理

導入して感じた効果と学び

  • 最初は「手間の割にメリットが少ない」と感じて後回しにしていた

    • 実装には細かい例外処理(スクロール、ポップオーバー、不要部分の切り抜き等)が多く、想定以上に工数がかかった
  • 導入後は運用効率が劇的に向上

    • 摩擦がほぼゼロになり、ドキュメント更新頻度が大幅増
    • UI変更→ビルド→コミットで常に最新のヘルプセンターを維持
    • 手動キャプチャや画像編集の手間が完全になくなった
  • 「なぜもっと早くやらなかったのか」と感じる便利さ

    • 開発者・運用者双方の心理的負担を大幅軽減
    • ユーザーにとっても常に正確なドキュメント提供が可能

Hackerたちの意見

これ、何度も必要だったわ。ちなみに、これをミームにしたらいいと思う:「これがXで作った一番 neat なものかもしれないけど、誰も気づかないだろうな。」
超クールだね。俺がちょっとしたカジュアルゲームを vibe コーディングしてる時、いつもアプリが CLI でヘッドレスに動くところから始めるんだ。オフスクリーンテクスチャにレンダリングして、スクリーンショットコマンドやパフォーマンス計測もつける。これを含めるのに時間はかからないし、エージェントが UI を自動化して重要なことをチェックする手段を与えてくれる。エージェントがスクリーンショットを更新するのも簡単だしね。ビルドプロセスの一部になるほど neat ではないけど、今後それも追加するつもり。
これらのカジュアルゲームのリンクを共有してもらえないかな? vibe コーディングがゲーム開発をどう楽にするかに興味があるから聞いてるんだ。Adobe Flash があった頃はインディーゲームシーンがすごく活気があったけど、それ以来あの開発のしやすさには触れてないと思う。vibe コーディングはそれを超える最初のツールだと思うんだ。
俺も同じことやってるよ :-) オフスクリーンのスクリーンショットパスがあって、ワールドポジションやカメラビューのベクトル用の CLI 引数もある。ゲームのティック長さの名前付きセグメントの行があって、各セグメントに制御入力を持つシンプルなテキストベースの入力形式でベンチマークをスクリプト化してる。ゲームコードを作ってる間に、ビジュアルやパフォーマンスの A/B テストにそれを広く使ってる。
> これを含めるのに時間はかからない それがかかる場合もあるよ。どのエンジン?
同じく、俺も .#screenshots の派生を追加したよ。最初は手間がかかるけど、その後はほぼメンテナンスフリー。ボーナスとして、プログラム的にスクリーンショットを生成するから、アプリのライト/ダークテーマそれぞれのペアを生成して、prefer-color-scheme: dark に応じて入れ替えられる。GitHub の README でも要素が使えるよ: https://github.com/CyberShadow/CyDo#readme
モバイルプロジェクトにはすごく役立つよね。アプリストアはスクリーンショットを要求するけど、N枚の画像を NUMBER_OF_SCREEN_SIZES と NUMBER_OF_LOCALIZATIONS の掛け算で生成するのは大変だよね。昔は自分でスクリプトを書いてたけど、今は Fastlane[1] みたいなツールが助けてくれる。俺は論理パズルゲーム Nonoverse[2] に Fastlane を使ってるよ。App Store ページでサンプルスクリーンショットが見れる。複数のシーンを含む App Preview 動画の録画も自動化したし。もっと読みたい人がいたら教えてね、これって記事のいいテーマになるかも。 [1]: https://fastlane.tools/ [2]: https://apps.apple.com/us/app/nonoverse-nonogram-puzzles/id6...
それ、魅力的だね!でも、有料サービスなのかローカルOSアプリなのか、ちょっと分からないな。
このアプローチには賛成だね。Textual(Python の TUI ライブラリ)のドキュメントは、ドキュメントと一緒にスクリーンショットを生成するんだ。技術的にはスクリーンショットじゃなくて SVG なんだけど、原則は同じ。古くなることはないよ。 https://textual.textualize.io/widgets/markdown/#example
これめっちゃクールだね!https://voiden.md/で試してみようかな。
こういう場合、リアルタイムレンダリングのアプローチってどう?ツールのライブプレビューを四角の中に表示する感じ。ツールが軽ければ、視覚的にも最適だと思うよ。ブラウザのレンダリング設定、例えばアクセシビリティのパラメータやカスタムアドオンにも対応できるし。
それってセキュリティの問題にもなるかも?
Djangoの設定でDEBUG=Falseにした方がいいよ。
面白いアプリだね!ドキュメントの更新作業がかなり減りそう。
ねえ、モバイルでコードの例を横スクロールできるようにしてほしい!内容は文脈から推測できるけど、やっぱり不便だよね。