<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/rss.xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Sveltekitblog Engine</title>
        <link>https://sveltekitblogblog.pages.dev</link>
        <description>新しいブログへようこそ。（設定でこの文章を修正してください。）</description>
        <language>ja</language>
        <atom:link href="https://sveltekitblogblog.pages.dev/ja/rss.xml" rel="self" type="application/rss+xml"/>
        <lastBuildDate>Mon, 22 Jun 2026 08:35:34 GMT</lastBuildDate>
        <item>
            <title><![CDATA[ブログと管理者機能の統合紹介]]></title>
            <link>https://sveltekitblogblog.pages.dev/ja/general-guide/general-integration-guide</link>
            <guid isPermaLink="true">https://sveltekitblogblog.pages.dev/ja/general-guide/general-integration-guide</guid>
            <pubDate>Sat, 20 Jun 2026 02:54:35 GMT</pubDate>
            <description><![CDATA[ブログアプリのレイアウトやコミュニケーション機能、管理者モードの多言語執筆、リアルタイムデザイン設定など、主要な機能紹介ドキュメントを統合して紹介します。]]></description>
            <content:encoded><![CDATA[<h1 id="ブログと管理者機能の統合紹介">📖 ブログと管理者機能の統合紹介</h1>
<p>本ドキュメントは、ブログサービスおよび管理者機能（管理画面）の主要構成を一覧できるよう、個別の機能紹介ドキュメントを整理して案内します。</p>
<p><em>参考：各機能の具体的な連携手順や詳細なマニュアルは、後日個別の投稿を通じて順次案内される予定です。</em></p>
<hr>
<h2 id="主要機能の紹介一覧">📂 主要機能の紹介一覧</h2>
<ul>
<li><strong>管理者（管理画面）機能紹介</strong><ul>
<li><strong><a href="../admin-guide/admin-install-and-deploy">CMDワンクリックインストールとデプロイ紹介</a></strong>: コマンド一行でブログのインフラをCloudflareにデプロイし、復旧する手法の概要を扱います。</li>
<li><strong><a href="../admin-guide/admin-getting-started">管理者初期設定とログイン</a></strong>: 初期パスワードログイン、接続許可IP（ホワイトリスト）管理およびワークスペース設定の概要について紹介します。</li>
<li><strong><a href="../admin-guide/admin-core-features">管理者主要機能とデュアルエディタ紹介</a></strong>: ビジュアルHTMLエディタとMarkdownエディタを切り替えながら執筆し、デバイス別レイアウトウィジェットを配置する方法を紹介します。</li>
<li><strong><a href="../admin-guide/admin-design-editor">デザインエディタと背景設定紹介</a></strong>: ブログのテーマカラーおよび単一色、グラデーション、背景画像、キャンバススクリプトなどの背景設定について紹介します。</li>
<li><strong><a href="../admin-guide/admin-faq">管理者よくある質問 (FAQ)</a></strong>: バックアップ・復元の原因把握、および画像ストレージ設定時の主な確認事項を確認します。</li>
</ul>
</li>
<li><strong>ブログ機能紹介</strong><ul>
<li><strong><a href="../blog-guide/blog-getting-started">ブログ初期画面構成とログイン</a></strong>: ブログの画面レイアウト構成とメール・ソーシャルログイン方式を紹介します。</li>
<li><strong><a href="../blog-guide/blog-core-features">読者対話と多言語サービス紹介</a></strong>: 記事本文のリアルタイム言語切り替え方式、およびコメントや非公開ゲストブックを通じたコミュニケーション構造を扱います。</li>
<li><strong><a href="../blog-guide/blog-faq">読者よくある質問 (FAQ)</a></strong>: 退会時の作成データ処理原則、およびサービス利用制限措置に関して確認します。</li>
</ul>
</li>
</ul>
<hr>
<h2 id="ブログ管理の基本プロセス">🚀 ブログ管理の基本プロセス</h2>
<p>管理者の権限を設定し、執筆を開始する基本的な流れの概要です。</p>
<h3 id="1-ip許可リストの適用とログイン">1. IP許可リストの適用とログイン</h3>
<ul>
<li>初めて管理画面にアクセスする際、セキュリティのため訪問者のグローバルIPアドレスが許可リスト（<code>ALLOWED_IP</code>）に登録されている必要があります。</li>
<li>ログイン画面で設定された管理者マスターパスワードを入力して接続を確立します。</li>
</ul>
<h3 id="2-多言語記事の一括保存">2. 多言語記事の一括保存</h3>
<ul>
<li>記事作成メニューに用意された多言語タブを切り替えながら本文をそれぞれ入力し、下部の保存ボタンをクリックしてデータベースへ多言語の記事データを一括で保存します。</li>
</ul>
<h3 id="3-リアルタイムテーマの適用">3. リアルタイムテーマの適用</h3>
<ul>
<li>デザインエディタでテーマカラー、フォントの種類、背景効果（Canvas、画像など）を保存すると、再ビルドなしに訪問者のブラウザ画面へリアルタイムで即座に反映されます。</li>
</ul>
]]></content:encoded>
            <category>統合ガイド</category>
        </item>
        <item>
            <title><![CDATA[読者ポリシーとよくある質問 (FAQ)]]></title>
            <link>https://sveltekitblogblog.pages.dev/ja/blog-guide/blog-faq</link>
            <guid isPermaLink="true">https://sveltekitblogblog.pages.dev/ja/blog-guide/blog-faq</guid>
            <pubDate>Sat, 20 Jun 2026 02:50:33 GMT</pubDate>
            <description><![CDATA[退会時の作成データ（コメント、ゲストブック）の取り扱い方針や、利用制限に関する基本原則を紹介します。]]></description>
            <content:encoded><![CDATA[<h1 id="読者ポリシーとよくある質問-faq">❓ 読者ポリシーとよくある質問 (FAQ)</h1>
<p>本ドキュメントは、ブログサービス利用時に発生する可能性のある退会に伴う個人情報および作成データの処理方法、利用制限ポリシーなどの基本原則を紹介します。</p>
<hr>
<h2 id="q1-退会した場合これまで作成したコメントやゲストブックはどうなりますか">🚪 Q1. 退会した場合、これまで作成したコメントやゲストブックはどうなりますか？</h2>
<p>ブログシステムは、読者の個人情報保護とサイト内における対話の流れの整合性を同時に維持するため、**「作成者の匿名化処理ポリシー」**を適用しています。</p>
<h3 id="退会時の個人情報処理原則">💡 退会時の個人情報処理原則</h3>
<ol>
<li><strong>個人識別情報の削除</strong>:<ul>
<li>退会処理が行われると、ログインメールアドレス、ソーシャルプロファイル画像、ニックネームなど、会員を識別できる固有データはデータベースから即座に削除されます。</li>
</ul>
</li>
<li><strong>作成データの保持</strong>:<ul>
<li>作成されたコメントやゲストブックの投稿は、これまでの会話の流れや文脈を保持するため、テキスト内容は画面上にそのまま維持されます。</li>
</ul>
</li>
<li><strong>ニックネームの匿名化処理</strong>:<ul>
<li>作成者ニックネームとアカウント間の連携情報が解除され、作成者表示名は自動的に <strong>「作成者不明」</strong> に一括で切り替わります。これにより、以前の作成者が実際に誰であったかをシステム的に逆追跡することが防がれます。</li>
</ul>
</li>
</ol>
<ul>
<li><em>参考：管理者が会員情報を直接完全に削除した場合には、作成されたコメントやメッセージも一緒に削除されることがあります。</em></li>
</ul>
<hr>
<h2 id="q2-コメント登録などの活動が制限されたり案内メッセージが表示されたりします">🚫 Q2. コメント登録などの活動が制限されたり、案内メッセージが表示されたりします。</h2>
<p>スパム広告や誹謗中傷などの運営ポリシー違反により、サービスの一部利用制限（Ban）措置が適用された場合の確認事項です。</p>
<h3 id="利用制限適用時の確認事項">💡 利用制限適用時の確認事項</h3>
<ol>
<li><strong>機能の制限</strong>:<ul>
<li>利用制限措置が適用されると、ログイン状態は維持されますが、コメント作成、返信登録、ゲストブック登録など、サイト内における直接的な活動が一時的に制限されます。</li>
</ul>
</li>
<li><strong>制限情報の照会</strong>:<ul>
<li>制限措置の適用時、画面上の案内メッセージや会員情報ページを通じて、具体的な制限事由や制限解除の時点（満了日）を確認できます。</li>
</ul>
</li>
<li><strong>活動の再開</strong>:<ul>
<li>管理者が一時的に指定した制限期間が経過するか、運営ポリシーの再検討を通じて措置が解除された場合、以前の状態と同様に正常な活動が再び可能になります。</li>
</ul>
</li>
</ol>
]]></content:encoded>
            <category>ユーザーガイド</category>
        </item>
        <item>
            <title><![CDATA[ブログの主要機能と多言語サービスの概要]]></title>
            <link>https://sveltekitblogblog.pages.dev/ja/blog-guide/blog-core-features</link>
            <guid isPermaLink="true">https://sveltekitblogblog.pages.dev/ja/blog-guide/blog-core-features</guid>
            <pubDate>Sat, 20 Jun 2026 02:47:24 GMT</pubDate>
            <description><![CDATA[記事本文のリアルタイム言語切り替えと手動翻訳データの代替表示ロジック、階層型コメント構造、非公開ゲストブックなど、ブログサービスの主要機能を紹介します。]]></description>
            <content:encoded><![CDATA[<h1 id="ブログの主要機能と多言語サービスの概要">🌐 ブログの主要機能と多言語サービスの概要</h1>
<p>本ドキュメントは、訪問者がブログの多言語翻訳記事を閲覧し、コメントやゲストブックを通じて他のユーザーと対話するための主要機能を紹介します。</p>
<hr>
<h2 id="1-記事本文のリアルタイム言語切り替え-i18n">🌐 1. 記事本文のリアルタイム言語切り替え (i18n)</h2>
<p>このブログは、メニューやボタンなどの基本的なUIだけでなく、<strong>作成された記事本文データ自体</strong>も選択した言語バージョンに切り替えて閲覧できる、リアルタイム多言語翻訳ビューアを提供しています。</p>
<h3 id="動作方式と特徴">⚙️ 動作方式と特徴</h3>
<ul>
<li><strong>言語別URLルーティング</strong>: 上部の地球儀アイコンまたは記事タイトル横の言語選択ボタンをクリックすると、URLアドレスに言語コードのプレフィックス（例：<code>/en</code>, <code>/ja</code>）が付与され、該当言語の専用ページへ即座にルーティングされます。デフォルトで提供される言語（韓国語、英語、日本語）だけでなく、管理者が多言語翻訳辞書（ディクショナリ）を追加定義することで、新たな言語バージョンを制限なく追加発行できます。</li>
<li><strong>手動作成データの読み込み（自動翻訳ではありません）</strong>: システムが自動的にリアルタイムで機械翻訳を行うわけではありません。作成者が各言語タブの翻訳記事本文データを直接執筆して個別に保存しておくと（外部AIや翻訳機で加工したものをデータベースにそれぞれ登録）、訪問者が選択した言語に対応する記事データをデータベースから正確に呼び出し、画面にレンダリングする方式です。</li>
<li><strong>本文およびメタデータの同時読み込み</strong>: 単純なテキストの置き換えにとどまらず、データベースに各言語向けに登録されているタイトル、概要、タグ、本文HTMLが、完全に選択した言語の個別データに切り替わって出力されます。</li>
<li><strong>未翻訳記事の代替（フォールバック）表示</strong>: 作成者が特定の言語の翻訳記事を登録していない場合、訪問者がコンテンツを閲覧できなくなるのを防ぐため、「翻訳準備中」の案内メッセージとともに、デフォルトの作成言語（例：韓国語本文）で記事内容を代替表示し、スムーズな読書をサポートします。</li>
</ul>
<hr>
<h2 id="2-コメントおよび返信スレッド機能">💬 2. コメントおよび返信（スレッド）機能</h2>
<p>各記事の下部には、ゲスト訪問者や会員が意見を交換できるコメント領域が配置されています。</p>
<ul>
<li><strong>意見の共有</strong>: ログインユーザーは、コメント入力欄に内容を記入して登録することで、即座に意見を共有できます。</li>
<li><strong>階層型の返信（スレッド表示）</strong>: 特定のコメントに対して返信を行うことができ、スレッドの対話の流れをツリー構造でわかりやすく整理します。</li>
<li><strong>セキュリティと完全性の維持</strong>: 自分が作成したコメントは削除が可能です。ただし、すでに返信がついているコメントを削除する場合、会話の階層構造が崩れるのを防ぐため、「削除されたコメントです」というメッセージにマスク処理され、構造自体は保持されます。</li>
</ul>
<hr>
<h2 id="3-ゲストブックと非公開メッセージの作成">📖 3. ゲストブックと非公開メッセージの作成</h2>
<p>ゲストブック（Guestbook）を通じて、ブログの開設者とプライベートにコミュニケーションをとる機能をサポートしています。</p>
<h3 id="非公開ゲストブック機能">⚙️ 非公開ゲストブック機能</h3>
<ul>
<li><strong>非公開メッセージの作成</strong>: メッセージ入力時に <strong>[🔒 非公開で作成]</strong> チェックボックスを有効にすることで、非公開メッセージの送信が可能です。</li>
<li><strong>表示権限の制限</strong>: 非公開で保存されたメッセージは、第三者（他の訪問者や未ログインの他ユーザー）のリストからは完全に除外されます。</li>
<li><strong>安全なメッセージ送信</strong>: メッセージを作成した本人（ログイン状態）とサイト管理者のみに本文が表示され、安全に対話を行うことができます。</li>
</ul>
]]></content:encoded>
            <category>ユーザーガイド</category>
        </item>
        <item>
            <title><![CDATA[ブログの初期画面構成とログインについて]]></title>
            <link>https://sveltekitblogblog.pages.dev/ja/blog-guide/blog-getting-started</link>
            <guid isPermaLink="true">https://sveltekitblogblog.pages.dev/ja/blog-guide/blog-getting-started</guid>
            <pubDate>Sat, 20 Jun 2026 02:41:11 GMT</pubDate>
            <description><![CDATA[ブログアプリのトップ画面レイアウト構成と、基本的な会員登録およびログイン手順の概要を紹介します。]]></description>
            <content:encoded><![CDATA[<h1 id="ブログの初期画面構成とログインについて">🌐 ブログの初期画面構成とログインについて</h1>
<p>本ドキュメントは、ブログ（<code>apps/blog</code>）トップ画面のレイアウト構成と、基本的な会員登録およびログイン方式の概要を紹介します。</p>
<hr>
<h2 id="1-ブログの画面構成とレイアウト">🎨 1. ブログの画面構成とレイアウト</h2>
<p>ブログの画面は、訪問者が情報を迅速に見つけられるよう、直感的なレイアウト（ヘッダー、本文、サイドバー、フッター）で設計されています。</p>
<ol>
<li><strong>ナビゲーションヘッダー (Header)</strong>:<ul>
<li><strong>サイトロゴ</strong>: クリックするといつでもトップ画面に戻ります。</li>
<li><strong>ショートカットメニュー</strong>: カテゴリへのショートカットや外部リンクなど、主要なリンクが表示されます。</li>
<li><strong>多言語切り替え</strong>: 地球儀アイコンをクリックすると、メニュー言語や記事の翻訳版をリアルタイムで切り替えて表示できます。</li>
</ul>
</li>
<li><strong>サイドバー (Sidebar)</strong>:<ul>
<li>PC画面では、カテゴリ一覧、運営者プロフィールカード、人気タグなどが表示され、自由な探索をサポートします。</li>
<li>モバイル端末からのアクセス時には、本文の視認性向上のため自動的に非表示になります。</li>
</ul>
</li>
<li><strong>メインコンテンツ領域 (Main Content)</strong>:<ul>
<li>最新の記事一覧とカテゴリフィルターが、カードデザイン形式で配置されています。</li>
</ul>
</li>
</ol>
<hr>
<h2 id="2-会員登録とログイン">🔑 2. 会員登録とログイン</h2>
<p>コメントの入力やゲストブックへのメッセージ作成に必要な、アカウント作成およびログイン機能をサポートしています。</p>
<h3 id="ログインおよび登録サポート方式">⚙️ ログインおよび登録サポート方式</h3>
<ul>
<li><strong>標準メールログイン/登録 (Default)</strong>:<ul>
<li>インストール直後にデフォルトで有効化されているログイン方式です。メールアドレス、表示名（ニックネーム）、パスワードを登録して新規登録でき、登録後は即座に自動ログインが適用されます。</li>
</ul>
</li>
<li><strong>ソーシャルログイン (Better-Auth)</strong>:<ul>
<li>内部的にBetter-Authエンジンを搭載しており、Google、GitHub、カカオ、ネイバーなどを含む <strong>計21種のソーシャルプロバイダーログイン</strong> をサポートしています。</li>
<li>ただし、ソーシャルログインは、サイト構築後に管理者が各ソーシャルプラットフォームから取得したクライアントIDおよびシークレットキーを設定用の環境変数に手動で挿入する必要があります。入力されていない場合、ログイン画面にソーシャルボタンは表示されず動作しません。（プロバイダーごとの具体的な連携手順は、後日別のドキュメントで案内予定です。）</li>
</ul>
</li>
<li><strong>ログイン状態の表示</strong>:<ul>
<li>ログインが完了すると、右上ボタンがユーザーのプロフィール画像アイコンとマイページへのショートカットに切り替わります。</li>
<li><em>参考：ユーザーのプロフィール写真を実際に連携して表示する機能は現在開発中のため、デフォルトの画像アイコンで代替表示される場合があります。</em></li>
</ul>
</li>
</ul>
]]></content:encoded>
            <category>ユーザーガイド</category>
        </item>
        <item>
            <title><![CDATA[管理者のよくある質問 (FAQ)]]></title>
            <link>https://sveltekitblogblog.pages.dev/ja/admin-guide/admin-faq</link>
            <guid isPermaLink="true">https://sveltekitblogblog.pages.dev/ja/admin-guide/admin-faq</guid>
            <pubDate>Sat, 20 Jun 2026 02:34:34 GMT</pubDate>
            <description><![CDATA[データのバックアップ/復元、外部画像ストレージ設定時のエラー原因、ダッシュボード統計チャートの設定などを確認します。]]></description>
            <content:encoded><![CDATA[<h1 id="管理者のよくある質問-faq">❓ 管理者のよくある質問 (FAQ)</h1>
<p>本ドキュメントは、管理画面の管理時に発生する可能性のあるバックアップ復元、外部画像ストレージの連携、ダッシュボード統計に関するよくある質問の原因と確認事項を紹介します。</p>
<hr>
<h2 id="q1-バックアップデータの復元restore時にエラーが発生します">🗄️ Q1. バックアップデータの復元（Restore）時にエラーが発生します。</h2>
<p>バックアップファイルを選択して復元を実行した際にエラーが発生する場合の確認事項です。</p>
<h3 id="主な確認事項">💡 主な確認事項</h3>
<ol>
<li><strong>ファイルの破損</strong>:<ul>
<li>ダウンロード時にテキストが正常に保存されなかった場合、復元に失敗することがあります。<code>.json</code> ファイルをメモ帳等で開き、正常なデータ形式であるか確認してください。</li>
</ul>
</li>
<li><strong>メニューの不一致</strong>:<ul>
<li>データの種類に応じた復元メニューを使用する必要があります。記事データは <strong><code>コンテンツバックアップ</code></strong> メニューの <strong><code>データバックアップ＆復元</code></strong> セクション、画像等のメディアファイルは <strong><code>コンテンツバックアップ</code></strong> メニューの <strong><code>メディアバックアップ＆復元</code></strong> セクション、システム全体データは <strong><code>サイト設定</code></strong> メニューの <strong><code>システム全体バックアップ＆復元</code></strong> セクションで復元を実行する必要があります。</li>
</ul>
</li>
<li><strong>データベース (D1) のバインディング</strong>:<ul>
<li>Cloudflareのデータベース（D1）接続情報が正常に連携されているか、管理者コンソールで確認してください。</li>
</ul>
</li>
</ol>
<hr>
<h2 id="q2-画像ストレージ変更後にアップロードまたは表示のエラーが発生します">📂 Q2. 画像ストレージ変更後にアップロードまたは表示のエラーが発生します。</h2>
<p>標準のストレージ（KV）からR2、Supabase、ImageKitなどに変更した後、アップロードエラーが発生したり画像が表示されなくなったりする場合の原因分析です。</p>
<h3 id="主な確認事項-1">💡 主な確認事項</h3>
<ol>
<li><strong>Cloudflare R2</strong>:<ul>
<li>プロジェクト設定で <code>IMAGES</code> R2バケットバインディングが接続されているか確認します (<code>wrangler.json</code>)。</li>
</ul>
</li>
<li><strong>Supabase Storage</strong>:<ul>
<li>入力したAPIエンドポイント (<code>supabase_storage_url</code>)、サービスロールキー (<code>supabase_storage_key</code>)、バケット名 (<code>supabase_storage_bucket</code>) の正確性を確認します。特にバケットのアクセス権限が <strong>Public (公開)</strong> に設定されている必要があります。</li>
</ul>
</li>
<li><strong>ImageKit.io</strong>:<ul>
<li>エンドポイントURL (<code>imagekit_url_endpoint</code>) の形式を確認し、クロスオリジンリソース共有 (CORS) 設定をチェックします。</li>
</ul>
</li>
<li><strong>アップロード容量制限</strong>:<ul>
<li>エッジサーバー環境の1回あたりの転送容量制限により、大容量の画像はアップロードに失敗することがあります。あらかじめ画像の解像度やサイズを調整してアップロードしてください。</li>
</ul>
</li>
</ol>
<hr>
<h2 id="q3-ダッシュボードの統計グラフがデモデータのみで表示されます">📊 Q3. ダッシュボードの統計グラフがデモデータのみで表示されます。</h2>
<p>メインダッシュボードに実際のトラフィック統計ではなく、デモ用データが表示される場合の確認事項です。</p>
<h3 id="主な確認事項-2">💡 主な確認事項</h3>
<ul>
<li><strong>原因</strong>: Google Analytics 4 (GA4) APIの環境変数が入力されていない、または正しくない場合、ダッシュボードのクラッシュを防ぐためにダミー用のデモデータが代替表示されます。</li>
<li><strong>設定手順</strong>: Cloudflare Pagesの設定に以下の環境変数を入力し、再度デプロイを行ってください。<ul>
<li><code>GA4_PROPERTY_ID</code>: Google Analytics プロパティ ID</li>
<li><code>GA4_CLIENT_EMAIL</code>: Google Cloud サービスアカウントメールアドレス</li>
<li><code>GA4_PRIVATE_KEY</code>: Google サービスアカウント秘密鍵</li>
</ul>
</li>
<li><strong>Google AdSense</strong>: 収益ダッシュボードの連携を行いたい場合、<code>ADSENSE_ACCOUNT_ID</code> 環境変数が正しく入力されているか確認してください。</li>
</ul>
]]></content:encoded>
            <category>管理者ガイド</category>
        </item>
        <item>
            <title><![CDATA[リアルタイムデザインエディタと背景演出の概要]]></title>
            <link>https://sveltekitblogblog.pages.dev/ja/admin-guide/admin-design-editor</link>
            <guid isPermaLink="true">https://sveltekitblogblog.pages.dev/ja/admin-guide/admin-design-editor</guid>
            <pubDate>Sat, 20 Jun 2026 02:26:20 GMT</pubDate>
            <description><![CDATA[再ビルドと再デプロイ不要の1秒リアルタイムテーマ反映]]></description>
            <content:encoded><![CDATA[<h1 id="リアルタイムデザインエディタと背景演出の概要">🎨 リアルタイムデザインエディタと背景演出の概要</h1>
<p>本ドキュメントは、再ビルドや再デプロイを必要とせずにテーマ設定を即座に反映するシステムと、4つの背景設定（単一色、グラデーション、背景画像、カスタムJavaScriptキャンバス）の基本構成について紹介します。</p>
<hr>
<h2 id="1-リアルタイムデザインエディタの概要">🌌 1. リアルタイムデザインエディタの概要</h2>
<p>デザインエディタで設定値を変更して保存する際、ブログサーバーやCDNサービスを再ビルド・再デプロイする必要は一切ありません。保存するとデータベースが即座に更新され、<strong>訪問者のブラウザ画面にCSS変数と背景レンダリングモジュールが1秒で反映</strong>されます。</p>
<h3 id="テーマの基本カスタマイズ">🎨 テーマの基本カスタマイズ</h3>
<ul>
<li><strong>カラー設定</strong>: メインテーマ色（Primary）、サブ色（Secondary）、本文テキスト色（Text）、アクセント強調色（Accent）、カード背景色（Card Bg）、枠線色（Border）などを調整できます。</li>
<li><strong>レイアウト設定</strong>: 左右余白（Side Margin）、画面の最大幅（Max Width）、カード角の丸み（Border Radius）、立体感を与えるシャドウ効果（Box Shadow）をサポートしています。</li>
<li><strong>タイポグラフィ設定</strong>: Google Fonts一覧から任意のフォント名を記入して適用できるほか、本文フォントの種類や基本文字サイズ（Base Font Size）を設定できます。</li>
</ul>
<hr>
<h2 id="2-デバイス別の独立ウィジェット配置">🧱 2. デバイス別の独立ウィジェット配置</h2>
<p>レイアウト設計時には、ドラッグ＆ドロップでサイドバーや本文領域のウィジェット位置と順序を調整できます。また、訪問者の画面サイズ（デバイスタイプ）に応じてレイアウトを動的に切り替えるフィルタリング機能を提供します。</p>
<ul>
<li><strong>Desktop (デスクトップ専用)</strong>: 画面幅の広いPC環境でのみ、指定されたウィジェット（例：タグクラウド、カテゴリツリーなど）を表示します。モバイル接続時には、読み込み速度を維持するため、HTML送信段階で該当要素をあらかじめ除外します。</li>
<li><strong>Mobile (モバイル専用)</strong>: デスクトップ環境では非表示にし、スマートフォンなどのモバイル解像度でのみモバイル向けに表示されるよう制限します。</li>
</ul>
<hr>
<h2 id="3-4つの背景設定の種類">🌈 3. 4つの背景設定の種類</h2>
<p>ブログ全体の雰囲気を決定する背景画面として、以下の4つのタイプがサポートされています。</p>
<h3 id="solid単一色背景">① Solid（単一色背景）</h3>
<ul>
<li>任意のHEXコード（例： <code>#3b82f6</code>）またはHSLカラーコードを指定して、最もシンプルで記事本文に集中しやすい画面を構成します。</li>
</ul>
<h3 id="gradientグラデーション背景">② Gradient（グラデーション背景）</h3>
<ul>
<li><strong>グラデーションビルダー</strong>ツールを使用して、複数のカラーがスムーズに混ざり合う線形グラデーションを作成します。</li>
<li>角度（Direction）スライダーの調整やカラーストップ（Stops）の追加・移動により、開始色、中間色、終了色を自由に配合できます。</li>
</ul>
<h3 id="image背景画像グラスモフィズム効果">③ Image（背景画像＆グラスモフィズム効果）</h3>
<ul>
<li>背景に使用する画像のURLを入力するか、アップロード（Upload）ボタンを使用してメディアファイルをライブラリに追加します。</li>
<li><strong>アップロード画像の最適化</strong>: 画像を登録すると、システムが自動的にWebP形式へ変換し、読み込みパフォーマンスの低下を防ぎます。</li>
<li><strong>グラスモフィズム効果</strong>: 背景画像がテキストの視認性を妨げないよう、以下の設定を組み合わせて半透明なガラス窓風のスタイルを構成できます。</li>
</ul>
<table>
<thead>
<tr>
<th align="left">設定項目</th>
<th align="center">推奨値の範囲</th>
<th align="left">詳細説明</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>背景のぼかし (Glass Blur)</strong></td>
<td align="center"><code>5px ~ 15px</code></td>
<td align="left">本文カードの下部レイヤーに半透明なすりガラス風のフィルターを適用します。</td>
</tr>
<tr>
<td align="left"><strong>オーバーレイ不透明度 (Overlay Opacity)</strong></td>
<td align="center"><code>10% ~ 30%</code></td>
<td align="left">カードコンテナの背後に敷く半透明マスクの不透明度を決定します。</td>
</tr>
<tr>
<td align="left"><strong>オーバーレイ色 (Overlay Color)</strong></td>
<td align="center"><code>#000000</code> または <code>#ffffff</code></td>
<td align="left">マスクの色をダーク（暗）またはライト（明）に設定し、テキストのコントラストを確保します。</td>
</tr>
</tbody></table>
<h3 id="custom-javascriptカスタムjavascriptcanvas背景">④ Custom JavaScript（カスタムJavaScript＆Canvas背景）</h3>
<ul>
<li>クライアントのブラウザ背景にインタラクティブなCanvasアニメーションを描画するため、カスタムJavaScriptの入力をサポートします。</li>
<li>背景キャンバス要素（<code>canvas id=&quot;bg-canvas&quot;</code>）に対して直接描画を制御できます。連動するセキュリティ制限や省電力ポリシーの詳細は、以下の <strong>[4. カスタムJavaScript連携仕様]</strong> で説明します。</li>
</ul>
<hr>
<h2 id="4-カスタムjavascript連携仕様">⚡ 4. カスタムJavaScript連携仕様</h2>
<p>セキュリティリスクを防止し、モバイル端末のバッテリー消費を抑えるため、以下のサンドボックス環境および省電力システムが適用されています。</p>
<h3 id="サンドボックスcspによるセキュリティ制限">🔒 サンドボックス＆CSPによるセキュリティ制限</h3>
<p>悪意あるスクリプトの混入による脆弱性を防ぐため、以下のセキュリティ対策が常時稼働しています。</p>
<ol>
<li><strong>隔離されたサンドボックス構造</strong>: キャンバスコードは、スクリプト実行のみが許可された隔離された <code>iframe</code> 内で動作します。親ページのDOMノードやログイン情報などへのアクセスは技術的に遮断されます。</li>
<li><strong>コンテンツセキュリティポリシー (CSP) 制限</strong>: 外部サーバーへのネットワーク通信や外部スクリプトの呼び出しが全面的に遮断されます。これにより、外部サーバーへデータを流出させることが不可能です。</li>
<li><strong>JS APIの制限</strong>: セキュリティ上のリスクとなる <code>fetch</code>, <code>XMLHttpRequest</code>, <code>WebSocket</code>, <code>eval</code>, <code>new Function</code>, <code>document.cookie</code>, <code>localStorage</code> などのAPIが検出された場合、検証スクリプト（<code>jsValidator.ts</code>）によって自動的にコメント処理（<code>/* f_e_t_c_h (blocked) */</code>）されます。</li>
</ol>
<h3 id="バッテリー消費の最適化省電力技術">🔋 バッテリー消費の最適化（省電力技術）</h3>
<ul>
<li><strong>画面外での自動一時停止</strong>: ユーザーがスクロールして背景アニメーションが完全に視野から外れると、ブラウザが不要にCPU/GPUを消費しないよう、レンダリングループを <strong>スリープ状態（一時停止）</strong> に切り替えます。再び画面に表示されると、即座に再開されます。</li>
<li><strong>モバイル用フレーム制限</strong>: スマートフォンやタブレットでアクセスする場合、発熱を抑えるためデフォルトで背景スクリプトの実行を停止します。<strong>「モバイル端末でもアニメーションを実行」</strong> オプションを明示的に有効にした場合は実行が可能となり、その際もパフォーマンスに負荷がかからないようパーティクル数を自動的に削減する制御パラメータが適用されます。</li>
</ul>
<hr>
<h2 id="5-サンプルスクリプト3種">📝 5. サンプルスクリプト3種</h2>
<p>背景設定メニューから <strong>[Custom JavaScript]</strong> を選択し、以下のコードのいずれかをコピーして適用できます。</p>
<blockquote>
<p>[!NOTE]<br>スクリプトを作成する際は、描画対象のキャンバス要素を取得するために必ず <code>document.getElementById(&#39;bg-canvas&#39;)</code> のID名を使用してください。</p>
</blockquote>
<h3 id="サンプルa-冬の雪snowfall">❄️ サンプルA. 冬の雪（Snowfall）</h3>
<p>画面上部から雪の結晶がゆっくりと舞い落ちる背景アニメーションです。</p>
<pre><code class="language-javascript">(function() {
  const canvas = document.getElementById(&#39;bg-canvas&#39;);
  if (!canvas) return;
  const ctx = canvas.getContext(&#39;2d&#39;);
  
  let width = canvas.width = window.innerWidth;
  let height = canvas.height = window.innerHeight;
  
  // モバイル省電力の判定
  const divisor = (window.bgConfig &amp;&amp; window.bgConfig.mobileThrottleDivisor) || 1;
  const maxSnowflakes = Math.floor(100 / divisor);
  const snowflakes = [];
  
  class Snowflake {
    constructor() {
      this.reset();
      this.y = Math.random() * height; // 初期ランダム高度
    }
    
    reset() {
      this.x = Math.random() * width;
      this.y = -10;
      this.radius = Math.random() * 3 + 1;
      this.speed = Math.random() * 1 + 0.5;
      this.opacity = Math.random() * 0.6 + 0.2;
    }
    
    update() {
      this.y += this.speed;
      // 緩やかな揺らぎ
      this.x += Math.sin(this.y / 30) * 0.5;
      
      if (this.y &gt; height || this.x &lt; 0 || this.x &gt; width) {
        this.reset();
      }
    }
    
    draw() {
      ctx.beginPath();
      ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2);
      ctx.fillStyle = `rgba(25, 25, 255, ${this.opacity})`;
      ctx.fill();
    }
  }
  
  // パーティクルの生成
  for (let i = 0; i &lt; maxSnowflakes; i++) {
    snowflakes.push(new Snowflake());
  }
  
  function animate() {
    ctx.clearRect(0, 0, width, height);
    
    for (let i = 0; i &lt; snowflakes.length; i++) {
      snowflakes[i].update();
      snowflakes[i].draw();
    }
    requestAnimationFrame(animate);
  }
  
  // リサイズハンドラ
  window.addEventListener(&#39;resize&#39;, () =&gt; {
    width = canvas.width = window.innerWidth;
    height = canvas.height = window.innerHeight;
  });
  
  animate();
})();
</code></pre>
<hr>
<h3 id="サンプルb-星座ネットワークconstellation-network">🕸️ サンプルB. 星座ネットワーク（Constellation Network）</h3>
<p>浮遊するノードパーティクル同士が近づいた際に、薄い半透明の線で結ばれ網状のネットワークを形成する背景アニメーションです。</p>
<pre><code class="language-javascript">(function() {
  const canvas = document.getElementById(&#39;bg-canvas&#39;);
  if (!canvas) return;
  const ctx = canvas.getContext(&#39;2d&#39;);
  
  let width = canvas.width = window.innerWidth;
  let height = canvas.height = window.innerHeight;
  
  const divisor = (window.bgConfig &amp;&amp; window.bgConfig.mobileThrottleDivisor) || 1;
  const particleCount = Math.floor(80 / divisor);
  const particles = [];
  const connectionDistance = 100;
  
  class Particle {
    constructor() {
      this.x = Math.random() * width;
      this.y = Math.random() * height;
      this.vx = (Math.random() - 0.5) * 0.8;
      this.vy = (Math.random() - 0.5) * 0.8;
      this.radius = Math.random() * 2 + 1.5;
    }
    
    update() {
      this.x += this.vx;
      this.y += this.vy;
      
      // 境界での反射
      if (this.x &lt; 0 || this.x &gt; width) this.vx *= -1;
      if (this.y &lt; 0 || this.y &gt; height) this.vy *= -1;
    }
    
    draw() {
      ctx.beginPath();
      ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2);
      ctx.fillStyle = &#39;rgba(99, 102, 241, 0.4)&#39;; // パステルインディゴ
      ctx.fill();
    }
  }
  
  for (let i = 0; i &lt; particleCount; i++) {
    particles.push(new Particle());
  }
  
  function drawLines() {
    for (let i = 0; i &lt; particles.length; i++) {
      for (let j = i + 1; j &lt; particles.length; j++) {
        const dx = particles[i].x - particles[j].x;
        const dy = particles[i].y - particles[j].y;
        const dist = Math.sqrt(dx * dx + dy * dy);
        
        if (dist &lt; connectionDistance) {
          const alpha = (connectionDistance - dist) / connectionDistance * 0.18;
          ctx.beginPath();
          ctx.moveTo(particles[i].x, particles[i].y);
          ctx.lineTo(particles[j].x, particles[j].y);
          ctx.strokeStyle = `rgba(99, 102, 241, ${alpha})`;
          ctx.lineWidth = 1;
          ctx.stroke();
        }
      }
    }
  }
  
  function animate() {
    ctx.clearRect(0, 0, width, height);
    for (let i = 0; i &lt; particles.length; i++) {
      particles[i].update();
      particles[i].draw();
    }
    drawLines();
    requestAnimationFrame(animate);
  }
  
  window.addEventListener(&#39;resize&#39;, () =&gt; {
    width = canvas.width = window.innerWidth;
    height = canvas.height = window.innerHeight;
  });
  
  animate();
})();
</code></pre>
<hr>
<h3 id="サンプルc-穏やかな波fluid-sine-waves">🌊 サンプルC. 穏やかな波（Fluid Sine Waves）</h3>
<p>画面下部でパステル調の半透明な複数の波が緩やかに揺れる背景アニメーションです。</p>
<pre><code class="language-javascript">(function() {
  const canvas = document.getElementById(&#39;bg-canvas&#39;);
  if (!canvas) return;
  const ctx = canvas.getContext(&#39;2d&#39;);
  
  let width = canvas.width = window.innerWidth;
  let height = canvas.height = window.innerHeight;
  
  let wave1 = {
    y: height * 0.85,
    length: 0.005,
    amplitude: 25,
    frequency: 0.012
  };
  
  let wave2 = {
    y: height * 0.88,
    length: 0.008,
    amplitude: 15,
    frequency: 0.022
  };
  
  let increment = 0;
  
  function animate() {
    ctx.clearRect(0, 0, width, height);
    
    // 背景の波の描画 (半透明ティール)
    ctx.beginPath();
    ctx.moveTo(0, height);
    for (let i = 0; i &lt; width; i++) {
      ctx.lineTo(i, wave1.y + Math.sin(i * wave1.length + increment) * wave1.amplitude);
    }
    ctx.lineTo(width, height);
    ctx.fillStyle = &#39;rgba(45, 212, 191, 0.1)&#39;;
    ctx.fill();
    
    // 手前の波の描画 (半透明スカイブルー)
    ctx.beginPath();
    ctx.moveTo(0, height);
    for (let i = 0; i &lt; width; i++) {
      ctx.lineTo(i, wave2.y + Math.sin(i * wave2.length - increment * 1.5) * wave2.amplitude);
    }
    ctx.lineTo(width, height);
    ctx.fillStyle = &#39;rgba(56, 189, 248, 0.15)&#39;;
    ctx.fill();
    
    // デバイスの設定に応じた速度の調整
    const speedFactor = (window.bgConfig &amp;&amp; window.bgConfig.mobileThrottleDivisor) ? 0.3 : 1;
    increment += wave1.frequency * speedFactor;
    
    requestAnimationFrame(animate);
  }
  
  window.addEventListener(&#39;resize&#39;, () =&gt; {
    width = canvas.width = window.innerWidth;
    height = canvas.height = window.innerHeight;
    wave1.y = height * 0.85;
    wave2.y = height * 0.88;
  });
  
  animate();
})();
</code></pre>
<hr>
<h2 id="6-モバイル個別背景設定">📱 6. モバイル個別背景設定</h2>
<p>利用環境に合わせて背景設定を変えることで、システムのパフォーマンスを最適化できます。</p>
<ol>
<li><strong>デスクトップ背景</strong>: PC環境では <strong>Custom JavaScript</strong> を選択し、任意のCanvasアニメーションを実行できます。</li>
<li><strong>モバイル個別背景チェック</strong>: <strong>「モバイルデバイスでデスクトップと異なる背景設定を使用する」</strong> トグルを有効にします。</li>
<li><strong>モバイル背景の軽量化</strong>: 独立したモバイル設定パネルから背景を <strong>Solid</strong> または <strong>Gradient</strong> に設定し、モバイル端末のプロセッサ負荷を最小限に抑えます。</li>
<li><strong>効果</strong>: スマートフォン接続時には軽量な背景を選択することでバッテリーを保護し、PC接続時には豊かなビジュアルモーション効果を最大限に表現するというイネーブル化が可能です。</li>
</ol>
]]></content:encoded>
            <category>管理者ガイド</category>
        </item>
        <item>
            <title><![CDATA[管理者機能とデュアルエディタの概要]]></title>
            <link>https://sveltekitblogblog.pages.dev/ja/admin-guide/admin-core-features</link>
            <guid isPermaLink="true">https://sveltekitblogblog.pages.dev/ja/admin-guide/admin-core-features</guid>
            <pubDate>Sat, 20 Jun 2026 01:23:13 GMT</pubDate>
            <description><![CDATA[多言語記事の同時保存、ビジュアルとMarkdownのデュアルエディタ切り替え、デバイス別独立ウィジェット配置など、管理者のコア機能を簡単に紹介します。]]></description>
            <content:encoded><![CDATA[<h1 id="管理者機能とデュアルエディタの概要">🎨 管理者機能とデュアルエディタの概要</h1>
<p>本ドキュメントは、多言語記事の同時パブリッシュ、デバイス別レイアウト設定、リアルタイムデザインテーマ設定など、管理者（管理画面）が提供する主要機能の基本構成と概要を紹介します。</p>
<hr>
<h2 id="1-多言語記事の作成およびデュアルエディタ">📝 1. 多言語記事の作成およびデュアルエディタ</h2>
<p>記事作成メニューに入ると、複数の言語タブが1つの画面に並んだ多言語作成環境が提供されます。</p>
<h3 id="多言語記事の一括作成と保存">① 多言語記事の一括作成と保存</h3>
<ul>
<li><strong>作成フロー</strong>: 上部の言語タブ（KO、EN、JAなど）を切り替えながら、各言語に応じたタイトル、概要、スラッグ（URLパス）、本文を入力します。</li>
<li><strong>一括保存</strong>: 下部の <strong>[すべてのタブを同時に保存する]</strong> ボタンをクリックすると、入力したすべての言語の記事がデータベースに一括で保存されます。 <strong>「公開」</strong> 設定がされていない言語は自動的に <strong>「下書き」</strong> として保存され、入力されていない言語タブはデータが生成されずにスキップされます。</li>
</ul>
<h3 id="デュアルエディタのサポートビジュアル-vs-markdown">② デュアルエディタのサポート（ビジュアル vs Markdown）</h3>
<ul>
<li><strong>ビジュアルHTMLエディタ（Visual）</strong>: 一般的なWebエディタのように、書式を設定したりメディアを埋め込んだりして直感的に作成する方式です。画像ファイルはツールバーのアップロードボタンから簡単に挿入できます。</li>
<li><strong>Markdownエディタ（Markdown）</strong>: Markdown構文を好むユーザー向けに提供されています。タイトル、概要、カテゴリ、タグなどの情報は、ヘッダー領域にYAML Front Matter（<code>---</code>）形式で自動的に管理されます。保存時には、Markdownソースと変換後のHTML本文が一緒に保存されます。</li>
</ul>
<h3 id="代表画像サムネイルの自動指定">③ 代表画像（サムネイル）の自動指定</h3>
<ul>
<li>サムネイル画像が手動で指定されていない場合、システムが本文を分析して代表画像を自動的に設定します。<ul>
<li><strong>第1優先</strong>: 本文内で最初に使用されている画像。</li>
<li><strong>第2優先</strong>: 本文に画像がなく、YouTubeのリンクやiframe埋め込みが含まれている場合、その動画の公式高解像度サムネイルURL。</li>
</ul>
</li>
</ul>
<hr>
<h2 id="2-デバイス別デスクトップモバイルの独立ウィジェット配置">🧱 2. デバイス別（デスクトップ/モバイル）の独立ウィジェット配置</h2>
<p>レイアウトエディタでは、ドラッグ＆ドロップでサイドバーや本文領域のウィジェットカードの並び順を調整できます。また、訪問者のデバイスタイプ（デスクトップまたはモバイル）に応じて、独立したウィジェット露出設定を構成できます。</p>
<figure data-align="left"><img src="/images/posts/admin-core-features/desktop/img-admin-guide-admin-core-features-001.webp" alt="img-admin-guide-admin-core-features-001" data-align="left" data-caption="デスクトップ/モバイル選択ボタン" /><figcaption>デスクトップ/モバイル選択ボタン</figcaption></figure><h3 id="デバイス別のウィジェット表示条件">⚙️ デバイス別のウィジェット表示条件</h3>
<ol>
<li><strong><code>デザインエディタ</code></strong> メニュー内の <strong><code>ブログ構造</code></strong> タブから、全体のレイアウト構成と横幅の比率を選択します。</li>
<li>各ウィジェットの追加・編集時に、露出デバイス条件（Device）を指定できます。<ul>
<li><strong>Desktop (デスクトップ専用)</strong>: PC画面にのみウィジェットを表示し、モバイル接続時には不要なリソースの読み込みを遮断します。</li>
<li><strong>Mobile (モバイル専用)</strong>: PC画面では非表示にし、スマートフォンやタブレットなどのモバイル解像度でのみ表示されるように制限します。</li>
</ul>
</li>
<li><strong>効果</strong>: モバイルユーザーに対して不要または重いウィジェットのレンダリングや読み込みをスキップすることで、ページの読み込み速度とスクロールパフォーマンスを最適化します。</li>
</ol>
<hr>
<h2 id="3-リアルタイムデザインエディタとテーマ設定">🎨 3. リアルタイムデザインエディタとテーマ設定</h2>
<p>デザインエディタで変更したテーマカラーやスタイル情報は、サーバーの再ビルドやデプロイを行わずに、保存後すぐに訪問者のブラウザのCSS変数へ反映されます。</p>
<ul>
<li><strong>4種類の背景タイプ</strong>: 単色（Solid）、グラデーション（Gradient）、背景画像（Image）、HTML5 Canvasアニメーション（Canvas）から選択できます。</li>
<li><strong>グラスモフィズム効果</strong>: 背景画像を使用する際、テキストの視認性を確保するために不透明度（Opacity）とぼかし（Blur）を調整するガラス越しのような効果の設定をサポートしています。</li>
<li><strong>インタラクティブCanvas</strong>: サンドボックスで隔離された安全なキャンバス内で、雪、波、星座などの動きのあるモーションアートワークを背景として駆動できます。</li>
</ul>
<blockquote>
<p>[!TIP]<br>背景設定オプションの種類とサンプルスクリプトは、<strong><a href="./admin-design-editor.md">デザインエディタ設定の紹介</a></strong> 文書でご確認いただけます。</p>
</blockquote>
<hr>
<h2 id="4-メディアストレージのサポート">💾 4. メディアストレージのサポート</h2>
<p>本文で使用するメディアが保存されるクラウドストレージを、必要に応じて柔軟に切り替えて運用できます。</p>
<ol>
<li><strong><code>メディアライブラリ</code></strong> メニュー下部の <strong><code>ストレージ設定</code></strong> 領域へ移動します。</li>
<li>連携するストレージタイプを選択し、情報を入力します。<ul>
<li><strong>Cloudflare KV</strong>: エッジノードのKVストレージにアセットを保管し、迅速に配信します。</li>
<li><strong>Cloudflare R2</strong>: 大容量オブジェクトストレージを使用し、コスト効率よく画像を管理します。</li>
<li><strong>Supabase Storage</strong>: Supabaseのストレージバケットパスにメディアをアップロードして安全に保管します.</li>
<li><strong>ImageKit.io</strong>: グローバル画像CDNプラットフォームと連携し、アップロードした画像の解像度最適化や圧縮処理を活用します。</li>
</ul>
</li>
<li><strong>ストレージのリアルタイム切り替え</strong>: 変更を保存すると、アップロードエンジンが指定したストレージへ即座に切り替わります。</li>
</ol>
<blockquote>
<p>[!NOTE]<br><strong>標準メディアストレージ (Cloudflare KV) のエクスプローラー機能の制限</strong><br>Cloudflare KVは、Workersの使用量とコストの最適化のため、画像エクスプローラー内での一覧表示（読み取りAPIの呼び出し）をサポートしていません。一方、Cloudflare R2、Supabase Storage、ImageKit.ioなどの外部ストレージを設定して接続した場合は、アップロードされた画像の一覧表示やプレビュー機能をすべて利用できます。</p>
</blockquote>
]]></content:encoded>
            <category>管理者ガイド</category>
            <enclosure url="/images/posts/admin-core-features/desktop/img-admin-guide-admin-core-features-001.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[管理者画面への初回アクセスと環境設定]]></title>
            <link>https://sveltekitblogblog.pages.dev/ja/admin-guide/admin-getting-started</link>
            <guid isPermaLink="true">https://sveltekitblogblog.pages.dev/ja/admin-guide/admin-getting-started</guid>
            <pubDate>Sat, 20 Jun 2026 00:55:48 GMT</pubDate>
            <description><![CDATA[管理者がブログシステムを制御するために管理者アプリへ安全にアクセスし、ログインセッションを維持して、多言語UI辞書を活用する方法について案内します。]]></description>
            <content:encoded><![CDATA[<h1 id="管理者画面への初回アクセスと環境設定">🔑 管理者画面への初回アクセスと環境設定</h1>
<p>本ドキュメントは、ブログシステムを制御するために管理者が管理者（アドミン）ページへ安全にアクセスし、ログインセッションを維持して、画面上の様々なテキスト（多言語辞書）を簡単に管理・編集する方法を案内します。</p>
<hr>
<h2 id="1-管理者ログイン前のipセキュリティ制限ポリシー">🔒 1. 管理者ログイン前のIPセキュリティ制限ポリシー</h2>
<p>本ブログエンジンは、外部からの不正アクセスや投稿権限の乗っ取りを完璧に防ぐため、厳格な<strong>接続IPフィルタリング</strong>セキュリティポリシーを採用しています。デプロイ時に検出された管理者のパブリックIPアドレスのみが、サーバーの許可リスト（<code>ALLOWED_IP</code>）に登録され、アクセスが許可されます。</p>
<blockquote>
<p>[!IMPORTANT]</p>
<h3 id="安全地帯中心の運用原則公共の場所での使用禁止">🛡️ 安全地帯中心の運用原則（公共の場所での使用禁止）</h3>
<p>本ブログの管理者画面での操作は、必ず<strong>自宅や信頼できるオフィスなど、物理的・ネットワーク的なセキュリティが確保された場所</strong>でのみ行ってください。<br><strong>セキュリティ漏洩を防止するため、不特定多数が利用しハッキングのリスクに直接さらされるPC房（ネットカフェ）、図書館、公共Wi-Fi環境などの公共の場所では、管理者画面への接続自体を一切推奨せず、避けていただきますよう強くお願いいたします。</strong></p>
</blockquote>
<p>接続許可された安全な場所であっても、ルーターの再起動やインターネット回線の都合によりパブリックIPアドレスが変更され、<code>403 Forbidden</code>ブロック画面が表示された場合は、以下の手順に従って許可リストを手動で更新する必要があります。</p>
<h3 id="接続許可ipアドレスの更新手順再デプロイが必要">⚙️ 接続許可IPアドレスの更新手順（再デプロイが必要）</h3>
<ol>
<li>変更されたインターネット環境下でターミナルを開き、ブログサービスの管理者アプリを再度**再デプロイ（Redeploy）**するコマンドを実行します。</li>
<li><strong>作業プロセスの案内</strong>: データベース内部を直接編集してIPを強制的に書き込む極端な動作方法よりは安全ですが、再デプロイコマンドが実行されるたびにビルドプロセスとファイルアップロードの待機時間が数分間発生するため、実質的にはかなり面倒で手間の伴う作業です。</li>
<li>デプロイスクリプトの実行中に、現在接続されているコンピュータの新しいパブリックIPアドレスを検出し、リモートサーバーの許可IPリストを最新のものに更新します。</li>
<li>デプロイ処理が完了した後に管理者URLへ再アクセスすると、正常にログイン画面が再び有効になります。</li>
<li>管理者ページのみを再デプロイしてください。</li>
</ol>
<hr>
<h2 id="2-管理者ログインおよびセッション管理">🔑 2. 管理者ログインおよびセッション管理</h2>
<p>ログインのブロックが正常に解除されたら、初期構築時に設定した管理者マスターパスワード（<code>ADMIN_PASSWORD</code>）を入力して接続します。</p>
<ul>
<li><strong>安全なセッションの維持</strong>: ブラウザの専用セキュアクッキー設定を利用して、30日間管理者のログインセッションが安全に維持されます。</li>
<li><strong>公共のコンピュータおよび危険区域へのアクセス禁止</strong>:<br>セキュリティが保証されていないネットカフェや公共の共有デバイス環境では、管理者ログイン自体を試みないことが最も確実な防衛策です。万が一、やむを得ない事情で公共の環境からログインした場合は、作業終了直後に必ず管理者画面下部の**[ログアウト]**ボタンをクリックし、さらにターミナルで<code>npx wrangler logout</code>を実行して、そのコンピュータに記録されたCloudflare管理者アカウントの連携情報まで確実に解除（ログアウト）してください。</li>
</ul>
<blockquote>
<p>[!WARNING]</p>
<h3 id="管理者ページのアクセスurlドメイン露出の最小化を推奨">🔒 管理者ページのアクセスURL（ドメイン）露出の最小化を推奨</h3>
<p>管理者画面はIP許可リストにより二重で安全に保護されていますが、攻撃対象領域（Attack Surface）そのものを最小化することが最も堅牢なセキュリティ対策です。</p>
<p>そのため、<code>admin.myblog.com</code>のような分かりやすいカスタムドメインをわざわざ紐付けるのではなく、Cloudflare Pagesからデフォルトで提供されるランダムなサブドメインアドレス（例：<code>[プロジェクト名].pages.dev</code>）をそのまま使用し、管理者用のアクセス経路を秘密にしておくことを強く推奨します。</p>
</blockquote>
<hr>
<h2 id="3-多言語辞書i18n設定ガイド">🌐 3. 多言語辞書（i18n）設定ガイド</h2>
<p>記事の本文以外の、サイト画面に固定されている共通テキスト（メニューラベル、コメント送信ボタン、ログインプロンプトなど）は、ソースコードを1行も修正することなく、管理者の辞書編集機能を通じて英語、韓国語、日本語などに即時書き換えることができます。</p>
<ol>
<li>管理者画面の左側メニューから**<code>言語設定</code>**メニューに移動します。</li>
<li>現在サイト全域で使用されている各翻訳キーと保存されたテキストの一覧が、下部の**<code>UI多言語辞書エディタ</code>**セクションに表示されます。</li>
<li>編集したいキーの入力フィールドに希望のテキスト（韓国語、英語、日本語）を入力し、その行の右端にある**<code>保存</code>**アイコンをクリックします。</li>
<li>保存と同時にライブサイトへ即時に反映され、訪問者がブログの言語を切り替えた際、変更後のテキストでリアルタイムかつスムーズに翻訳表示されます。</li>
</ol>
]]></content:encoded>
            <category>管理者ガイド</category>
        </item>
        <item>
            <title><![CDATA[CMDワンクリックインストール＆Cloudflareデプロイガイド]]></title>
            <link>https://sveltekitblogblog.pages.dev/ja/admin-guide/admin-install-and-deploy</link>
            <guid isPermaLink="true">https://sveltekitblogblog.pages.dev/ja/admin-guide/admin-install-and-deploy</guid>
            <pubDate>Sat, 20 Jun 2026 00:27:52 GMT</pubDate>
            <description><![CDATA[ターミナル（CMD/PowerShell）環境で対話型インストールスクリプトを実行し、Cloudflareエッジインフラの構築と管理者/ブログアプリのデプロイ・同期を同時に行う最も簡単な方法を解説します。]]></description>
            <content:encoded><![CDATA[<h1 id="cmdワンクリックインストールcloudflareデプロイガイド">🚀 CMDワンクリックインストール＆Cloudflareデプロイガイド</h1>
<p>本ガイドは、ターミナル（CMDまたはPowerShell）環境で自動化コマンド（<code>npm run setup</code>）を実行してCloudflareエッジインフラを構築し、管理者アプリとブログアプリを同時にデプロイ・同期する、最も簡単かつ安全な方法を案内します。</p>
<hr>
<h2 id="1-ワンクリックデプロイ自動化の紹介">🛠️ 1. ワンクリックデプロイ自動化の紹介</h2>
<p>SvelteKitブログエンジンは、複雑なサーバーリソースの生成や設定ファイルの編集プロセスを、ターミナル上の<strong>対話型インストールツール</strong>を通じて完全に自動化しました。</p>
<p>ブログのソースコードを解凍するか、<code>git clone</code>でPCに保存した後、ターミナルを開いてプロジェクトのルートフォルダーに移動し、以下のコマンドを順番に実行するだけです。</p>
<pre><code class="language-bash"># 必要なパッケージのインストール
npm install
</code></pre>
<ul>
<li><strong>依存関係ライブラリのインストール</strong>: ターミナルで<code>npm install</code>を入力して、必要なパッケージをすべてインストールします。インストール完了後にセキュリティ警告（vulnerabilities）メッセージが表示された場合は、<code>npm audit fix</code>コマンドを実行して最新のセキュリティパッチを適用することをお勧めします。</li>
</ul>
<p>パッケージのインストールが終わったら<code>npm run setup</code>を実行します。ターミナル画面の案内に従って、以下のプロセスが自動的に処理されます。</p>
<ul>
<li><strong>Cloudflareアカウントの簡単認証</strong>: クリック1回でデプロイアカウントの連携が完了します。</li>
<li><strong>DBおよびストレージリソースの生成</strong>: ブログ専用のD1データベース2個と画像保存用のKVストレージを自動的に新規生成します。</li>
<li><strong>設定ファイルのリアルタイム更新</strong>: 生成されたデータベースの固有IDを検出し、モノレポの設定ファイル（<code>wrangler.json</code>）に自動的に注入します。</li>
<li><strong>データベースの初期データ注入</strong>: テーブルを生成し、選択したデフォルト言語に合わせてサンプル記事と基本環境設定情報を自動的に登録します。</li>
<li><strong>環境変数とアクセス許可IPのアップロード</strong>: 管理者アクセス用に、デプロイ実行者の現在のパブリックIPアドレス（<code>ALLOWED_IP</code>）と管理者パスワードをクラウドへ自動送信します。</li>
<li><strong>統合ビルドおよびWebサービスのデプロイ</strong>: ブログと管理者のSvelteKitプロジェクトを統合ビル드し、Cloudflare Pagesへ即時にアップロード・デプロイします。</li>
</ul>
<hr>
<h2 id="2-デプロイ前の確認事項">📋 2. デプロイ前の確認事項</h2>
<p>安全にインストールを開始する前に、以下の準備がすべて整っているかご確認ください。</p>
<ol>
<li><strong>Node.jsのインストール</strong>: パソコンでNode.js（バージョン18以上）が動作している必要があります。</li>
<li><strong>Cloudflareアカウント</strong>: ブログサイトとデータベースをホスティングするCloudflareアカウント（無料枠で十分対応可能です）が必要です。</li>
<li><strong>環境変数ファイル（.dev.vars）の生成（必須）</strong>:<ul>
<li>デプロイを開始する前に、<code>apps/admin/</code>フォルダと<code>apps/blog/</code>フォルダの配下に、それぞれ<code>.dev.vars</code>ファイルを<strong>手動で作成</strong>する必要があります。</li>
<li><code>apps/admin/.dev.vars</code>ファイルには、<code>ADMIN_PASSWORD=管理者ログインパスワード</code>を記述します。</li>
<li><code>apps/blog/.dev.vars</code>ファイルには、<code>BETTER_AUTH_SECRET=任意の文字列</code>を記述します。</li>
<li><blockquote>
<p>[!WARNING]<br>これらの環境変数が設定されていない場合、<code>npm run setup</code>の実行直後に、正常な動作のために<strong>インストールツールが中断</strong>されます。</p>
</blockquote>
</li>
</ul>
</li>
</ol>
<hr>
<h2 id="3-npm-run-setup-ステップ別解説">⚙️ 3. npm run setup ステップ別解説</h2>
<p>ターミナルを開き、ブログプロジェクトのルートディレクトリで<code>npm run setup</code>を入力してEnterキーを押します。</p>
<h3 id="step-0-環境変数の事前検査pre-validation"><strong>Step 0. 環境変数の事前検査（Pre-Validation）</strong></h3>
<ul>
<li>実行直後に、管理者およびブログフォルダ内の<code>.dev.vars</code>ファイルと、必須の環境変数（<code>ADMIN_PASSWORD</code>、<code>BETTER_AUTH_SECRET</code>）が入力されているか検査します。</li>
<li>未入力の項目がある場合は、ガイドログを表示して終了しますので、事前に必ず記載しておいてください。</li>
</ul>
<h3 id="step-1-デプロイプロジェクト名ドメインurlの設定"><strong>Step 1. デプロイプロジェクト名（ドメインURL）の設定</strong></h3>
<ul>
<li>読者がブログにアクセスする際に使用するアドレス（例：<code>[入力したプロジェクト名].pages.dev</code>）を決定する段階です。</li>
<li>デプロイターゲットであるブログと管理者の2つの名前を入力します。復元モード（<code>--restore</code>）で実行する場合、既存のバックアップ情報ファイル（<code>wrangler.backup.json</code>）から既存の名前を自動的に読み込んで設定します。</li>
</ul>
<h3 id="step-2-cloudflareアカウントのログイン認証"><strong>Step 2. Cloudflareアカウントのログイン認証</strong></h3>
<ul>
<li>Cloudflareの認証を確認します。すでにログイン履歴がある場合は、自動的にセッションを検出してこの手順をスキップします。</li>
<li>ログインしていない場合は、ブラウザウィンドウが開き認証要求画面が表示されます。**[Allow / 許可]**をクリックしてアカウント連携を承認してください。</li>
<li><em>セキュリティ情報：本自動化ツールは、インフラ生成およびデプロイに必要な最小限のアカウントAPI権限のみを要求するため、安心してお進みください。</em></li>
</ul>
<h3 id="step-3-リソース生成および設定の連携"><strong>Step 3. リソース生成および設定の連携</strong></h3>
<ul>
<li>実際のサービス動作に必要なデータベースとメディアストレージをクラウドに生成する段階です。ターミナルの案内に従って、適切な番号を入力してください。<ol>
<li><strong><code>1</code>（新規インストール / Fresh Install）</strong>: 以前に作成されたデータベースとストレージを<strong>完全に削除して新しく作成し直します。</strong> 既存のデータはすべて消去されるためご注意ください。</li>
<li><strong><code>2</code>（既存データの維持 / Keep Existing Data）[推奨]</strong>: すでに生成されたリソースがある場合、データを安全に保持したまま接続情報のみを紐付けます。</li>
</ol>
</li>
<li>連携完了後、新しく発行されたDBおよびKVの固有IDがモノレポの各設定ファイル（<code>wrangler.json</code>）に自動的に反映されます。</li>
</ul>
<h3 id="step-4-webプロジェクトの事前生成"><strong>Step 4. Webプロジェクトの事前生成</strong></h3>
<ul>
<li>デプロイの安定性を高めるため、Cloudflare Edge上に空のWebプロジェクトをあらかじめ登録・確保します。</li>
<li>すでに同じ名前のアドレスが占有されている場合は、<strong>既存のアドレスを再利用</strong>して次のステップへ自動的に移行します。</li>
</ul>
<h3 id="step-5-環境変数のリモート同期"><strong>Step 5. 環境変数のリモート同期</strong></h3>
<ul>
<li>ローカルで作成した<code>.dev.vars</code>内のマスターパスワードなどの秘密の値をCloudflareへ安全にアップロードして同期します。</li>
<li><strong>アクセス許可IPの自動登録</strong>: 特にこの段階で、デプロイを実行している管理者PCのパブリックIPアドレスをリアルタイムで検出し、<code>ALLOWED_IP</code>変数として自動的に注入します。これにより、デプロイ直後の初回ログイン時にIP制限でアクセスできなくなる事態を防ぎます。</li>
</ul>
<h3 id="step-6-データベーステーブルの構築デフォルトテーマの設定"><strong>Step 6. データベーステーブルの構築＆デフォルトテーマの設定</strong></h3>
<ul>
<li>ブログ機能の動作に必要なDBテーブルを構築し、初期設定値を移植します。</li>
<li>画面の案内に従って使用するデフォルトの言語（韓国語、英語、日本語）を選択すると、翻訳システムが構築され、サンプルカテゴリ、ヘッダーメニューの骨組み、およびデフォルトのウェルカム記事が自動的に設定されます。</li>
</ul>
<h3 id="step-7-webサービスのビルド最終デプロイ"><strong>Step 7. Webサービスのビルド＆最終デプロイ</strong></h3>
<ul>
<li>モノレポ全体のアプリの統合ビルドを実行し、Cloudflareサーバーへのデプロイコマンドを自動実行してインストールプロセスを完了します。デプロイが完了すると、ブログと管理者のPagesアクセス用URLが表示されます。</li>
</ul>
<hr>
<blockquote>
<p>[!TIP]</p>
<h3 id="環境変数の自動設定と即時アクセスサポート">💡 環境変数の自動設定と即時アクセスサポート</h3>
<p>本プロジェクトのインストールプロセスは、リソースの生成からWebプロジェクトの確保、環境変数の送信までを一貫して処理します。<br>デプロイ完了と同時に、ログインパスワードやIPアクセス許可設定がリモートサーバーに設定されるため、追加の手動操作なしで即座に動作します。</p>
</blockquote>
<hr>
<h2 id="4-ブログのアップデートとデータ復元デプロイnpm-run-restore">🔄 4. ブログのアップデートとデータ復元デプロイ（npm run restore）</h2>
<p>ブログの運用中に<strong>新しいパッチバージョンやバグが修正された最新リリースのコードが配布された際</strong>、これまでに作成した記事データやアドレスを失うことなく、新しいコードへ安全に画面を差し替える方法です。</p>
<h3 id="新バージョン移行の4ステップ手順">💡 新バージョン移行の4ステップ手順</h3>
<p>管理者のデータバックアップと**<code>npm run restore</code>**コマンドを使用すれば、データ消失のリスクなく安全にアップグレードを完了できます。</p>
<ol>
<li><strong>[ステップ1] 既存データおよびデプロイ設定のバックアップ</strong>:<ul>
<li>稼働中の管理者アプリの**<code>コンテンツバックアップ</code><strong>メニュー、および</strong><code>デザインエディタ</code>**メニューの下部バックアップセクションから、記事データとテーマデザイン設定をそれぞれパソコンへダウンロードします。</li>
<li>また、**<code>コンテンツバックアップ</code>**メニューの「設定バックアップダウンロード」ボタンをクリックして、[wrangler.backup.json]ファイルをPCに保存します。（これは、既存の運用データベースの固有ID連携を維持するための最も重要なファイルです。）</li>
</ul>
</li>
<li><strong>[ステップ2] 新コードの分離テスト</strong>:<ul>
<li>新しく入手した新バージョンのコードフォルダ配下で<code>npm run setup</code>を実行し、<strong>テスト用の仮DB</strong>と<strong>テスト用のPages仮デプロイ名</strong>を入力して別個にデプロイします。</li>
<li>仮デプロイされた新しい管理者にログインし、ステップ1で保存したバックアップデータファイルをインポートして、データが正常に読み込まれるか事前に確認します。</li>
</ul>
</li>
<li><strong>[ステップ3] 既存の運用サーバーへのバインディング復元（<code>npm run restore</code>）</strong>:<ul>
<li>検証が終了したら、新バージョンプロジェクトのルートディレクトリに、ステップ1で保存した<code>wrangler.backup.json</code>ファイルをコピーして貼り付けます。</li>
<li>ターミナルで**<code>npm run restore</code><strong>コマンドを実行します。スクリプトがバックアップファイルに記述された</strong>既存の運用DBおよびKVの固有ID情報**を読み込み、新しいコードの設定ファイルへ上書きの形で自動接続します。</li>
</ul>
</li>
<li><strong>[ステップ4] スキーマ同期と上書きデプロイ</strong>:<ul>
<li>復元スクリプトは既存の運用DBのテーブル構造スキーマのみを安全に最新仕様へ更新するため、<strong>すでに蓄積されている実際の記事やデータは破損または削除されず完璧に保持</strong>されます。</li>
<li>続いて、<code>npm run deploy:blog</code>と<code>npm run deploy:admin</code>をそれぞれ実行します。使用していたドメインそのままで、<strong>最新にアップグレードされたブログシステムが安全に上書きデプロイ</strong>されます。</li>
</ul>
</li>
</ol>
<hr>
<h2 id="5-バックアップファイルの種類と機能">📦 5. バックアップファイルの種類と機能</h2>
<p>管理者のバックアップメニューで安全にインポートおよびエクスポートできる各ファイルの役割は、以下の表をご参照ください。</p>
<table>
<thead>
<tr>
<th align="left">バックアップファイルの種類</th>
<th align="left">抽出経路</th>
<th align="left">フォルダ・ファイル名（推奨）</th>
<th align="left">機能・保存内容</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>1. コンテンツDBデータ</strong></td>
<td align="left"><strong><code>コンテンツバックアップ</code></strong> メニュー</td>
<td align="left"><code>blog-content-backup-[日付].json</code></td>
<td align="left">作成されたすべてのブログ記事本文、作成済みのカテゴリ情報、タグ一覧、および基本的なシステム設定値を保存</td>
</tr>
<tr>
<td align="left"><strong>2. デプロイ設定バックアップ</strong></td>
<td align="left"><strong><code>コンテンツバックアップ</code></strong> メニュー</td>
<td align="left"><code>wrangler.backup.json</code></td>
<td align="left">Cloudflare D1 DBおよびKVストレージ連携に必要なデプロイ名と固有のUUID情報を安全に保存（<strong>サーバー移行時に必須</strong>）</td>
</tr>
<tr>
<td align="left"><strong>3. メディアファイルバックアップ</strong></td>
<td align="left"><strong><code>コンテンツバックアップ</code></strong> メニューの「メディアバックアップと復元」セクション、または <strong><code>メディアライブラリ</code></strong> メニュー右上の「[バックアップ / 復元]」ボタン</td>
<td align="left"><code>[ストレージ名]-images-backup-[日付].zip</code> <br>(例: <code>r2-images-backup-[日付].zip</code>)</td>
<td align="left">有効化されている画像ストレージ（R2、Supabaseなど）にアップロードされたすべての画像ファイルをZIP形式で圧縮ダウンロードして保存</td>
</tr>
<tr>
<td align="left"><strong>4. デザイン設定バックアップ</strong></td>
<td align="left"><strong><code>デザインエディタ</code></strong> メニュー下部</td>
<td align="left"><code>blog-design-backup-[日付].json</code></td>
<td align="left">デザインエディタで設定したブログのテーマカラー情報、背景タイプ、およびデバイス別（PC/モバイル）のウィ젯配置構造を保存</td>
</tr>
<tr>
<td align="left"><strong>5. システム全体のバックアップ</strong></td>
<td align="left"><strong><code>サイト設定</code></strong> メニュー下部</td>
<td align="left"><code>full-system-backup-[日付].json</code></td>
<td align="left">2つのデータベース（BLOG_DB, USER_DB）内のすべてのテーブルの元データを1つのJSONファイルにまとめ、全体のバックアップおよび復元を実行</td>
</tr>
</tbody></table>
]]></content:encoded>
            <category>管理者ガイド</category>
        </item>
    </channel>
</rss>