<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Markdown on kenji.blog</title><link>http://kenji.blog/tags/markdown/</link><description>Recent content in Markdown on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>ja</language><copyright>kenjinote</copyright><lastBuildDate>Sun, 13 Sep 2026 02:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/tags/markdown/index.xml" rel="self" type="application/rss+xml"/><item><title>Hugoを使った静的サイトジェネレーター入門（WordPressからの移行手順）</title><link>http://kenji.blog/p/hugo-static-site-generator-wordpress-migration/</link><pubDate>Sun, 13 Sep 2026 02:00:00 +0900</pubDate><guid>http://kenji.blog/p/hugo-static-site-generator-wordpress-migration/</guid><description>&lt;img src="http://kenji.blog/p/hugo-static-site-generator-wordpress-migration/img/eyecatch.jpg" alt="Featured image of post Hugoを使った静的サイトジェネレーター入門（WordPressからの移行手順）" />&lt;p>現代のウェブ開発やブログ運営において、サイトの表示速度とセキュリティ、そして保守性は極めて重要な要素となっています。長らくブログやコーポレートサイトの基盤として圧倒的なシェアを誇ってきた「WordPress」は、柔軟なプラグインエコシステムと直感的な管理画面により多くのユーザーに愛用されています。しかし、データベースとの通信やサーバーサイドでの動的なページ生成（PHPによる処理）を伴うため、トラフィックの急増に対する脆弱性や、表示遅延（レイテンシ）といった課題も抱えています。&lt;/p>
&lt;p>そこで近年、急速に普及しているのが「静的サイトジェネレーター（SSG: Static Site Generator）」です。本記事では、数あるSSGの中でもGo言語ベースで開発され、その圧倒的なビルド速度で知られる「&lt;strong>Hugo&lt;/strong>」について深く掘り下げます。WordPressなどの動的CMS（Content Management System）との技術的アーキテクチャの比較から、具体的な移行手順、数理モデルを用いたパフォーマンス評価、そしてHugo固有のディレクトリ構造やテンプレートのルックアップ順序まで、徹底的に解説します。&lt;/p>
&lt;hr>
&lt;h2 id="1-動的cmswordpressと静的サイトジェネレーターhugoの技術的差異">1. 動的CMS（WordPress）と静的サイトジェネレーター（Hugo）の技術的差異
&lt;/h2>&lt;p>ウェブサイトを配信する仕組みにおいて、WordPressとHugoは根本的に異なるアプローチをとっています。&lt;/p>
&lt;h3 id="11-wordpressのアーキテクチャ動的生成">1.1 WordPressのアーキテクチャ（動的生成）
&lt;/h3>&lt;p>WordPressは、リクエストのたびにサーバーサイドでページを組み立てる動的CMSの代表格です。ユーザー（ブラウザ）からページへのアクセスがあると、ウェブサーバー（Apache, Nginxなど）がPHPスクリプトを実行し、MySQL（またはMariaDB）などのリレーショナルデータベースへクエリを発行します。データベースから取得したコンテンツ（記事データ、カテゴリ、タグ、サイト設定など）をテンプレートファイルと結合し、最終的なHTMLを生成してクライアントに返却します。&lt;/p>
&lt;p>この仕組みは、訪問者ごとに異なるコンテンツをリアルタイムで生成できる（例：ECサイトのカート、ログインユーザー専用ページ）という利点がありますが、キャッシュ機構（リバースプロキシやプラグイン等）を適切に設計しない限り、サーバーリソースを激しく消費します。&lt;/p>
&lt;h3 id="12-hugoのアーキテクチャビルド時事前生成">1.2 Hugoのアーキテクチャ（ビルド時事前生成）
&lt;/h3>&lt;p>一方、Hugoは「静的サイトジェネレーター」という名前の通り、コンテンツの生成を「リクエスト時」ではなく「ビルド時」に行います。コンテンツはデータベースではなく、Gitなどでバージョン管理されるローカルの「Markdownファイル」として保持されます。
開発者がコマンド（&lt;code>hugo&lt;/code>）を実行すると、HugoはMarkdownファイルを読み込み、指定されたHTMLテンプレート（レイアウトファイル）にデータを流し込んで、完成された純粋なHTML/CSS/JSファイルの集合体を生成します。&lt;/p>
&lt;p>生成されたファイル群（静的アセット）は、Amazon S3、Cloudflare Pages、Netlify、Vercel、あるいは単純なNginxサーバーなどの「静的ホスティング環境」に配置するだけで配信可能となります。データベースもサーバーサイド言語（PHP等）も不要なため、セキュリティリスク（SQLインジェクションやPHPの脆弱性など）が劇的に低下し、配信速度はCDN（Content Delivery Network）のエッジノードにキャッシュされることで極限まで高速化されます。&lt;/p>
&lt;p>以下に、それぞれのアーキテクチャの違いをMermaid図で示します。&lt;/p>
&lt;pre class="mermaid">
flowchart TD
subgraph WordPress[&amp;#34;動的CMS (WordPress)&amp;#34;]
direction TB
Req1[&amp;#34;ユーザーのリクエスト&amp;#34;] --&amp;gt; WebServer1[&amp;#34;Webサーバー (Nginx/Apache)&amp;#34;]
WebServer1 --&amp;gt; PHP[&amp;#34;PHP処理系&amp;#34;]
PHP &amp;lt;--&amp;gt; DB[&amp;#34;データベース (MySQL)&amp;#34;]
PHP --&amp;gt; HTML1[&amp;#34;HTML生成&amp;#34;]
HTML1 --&amp;gt; Res1[&amp;#34;レスポンス返却&amp;#34;]
end
subgraph Hugo[&amp;#34;静的サイトジェネレーター (Hugo)&amp;#34;]
direction TB
Dev[&amp;#34;開発者 / CI・CD&amp;#34;] --&amp;gt; HugoBuild[&amp;#34;Hugoビルド処理&amp;#34;]
Markdown[&amp;#34;Markdownファイル群&amp;#34;] --&amp;gt; HugoBuild
Templates[&amp;#34;テンプレート (HTML)&amp;#34;] --&amp;gt; HugoBuild
HugoBuild --&amp;gt; StaticFiles[&amp;#34;静的ファイル群 (HTML/CSS/JS)&amp;#34;]
StaticFiles --&amp;gt; CDN[&amp;#34;CDN / 静的ホスティング&amp;#34;]
Req2[&amp;#34;ユーザーのリクエスト&amp;#34;] --&amp;gt; CDN
CDN --&amp;gt; Res2[&amp;#34;即時レスポンス返却&amp;#34;]
end
&lt;/pre>
&lt;hr>
&lt;h2 id="2-数理モデルによるパフォーマンス評価">2. 数理モデルによるパフォーマンス評価
&lt;/h2>&lt;p>WordPressからHugoへの移行における最大のメリットの一つはパフォーマンス（表示速度）の向上です。これを定量的に理解するために、簡単な数式モデルで表現してみましょう。&lt;/p>
&lt;p>ページの読み込みが完了するまでの時間（Load Time: $T_{load}$）は、主にサーバーの応答時間（TTFB: Time To First Byte）と、ブラウザによるレンダリング・リソース取得時間（$T_{render}$）に大別されます。&lt;/p>
$$ T_{load} = T_{ttfb} + T_{render} $$&lt;p>動的CMS（WordPress）の場合、$T_{ttfb}$ は以下の要素の和になります。ネットワーク遅延（$T_{network}$）、サーバー側のスクリプト実行時間（$T_{php}$）、データベースのクエリ処理時間（$T_{db}$）です。&lt;/p>
$$ T_{ttfb\_wp} = T_{network} + T_{php} + T_{db} $$&lt;p>アクセスが集中した状態（高負荷時）においては、$T_{php}$ と $T_{db}$ は非線形に増加し、システム全体がボトルネックとなる可能性があります。数式で表すと、リクエスト数（$N$）に対して以下のような応答時間の悪化が見られます（$k$ は処理のオーバーヘッド係数）。&lt;/p>
$$ T_{php}(N) \approx O(N^k), \quad T_{db}(N) \approx O(N^k) \quad \text{where } k > 1 $$&lt;p>一方、静的サイトジェネレーター（Hugo）とCDNを組み合わせたアーキテクチャでは、サーバーサイドの動的処理（PHPやDBクエリ）が存在しません。コンテンツは世界中に分散配置されたエッジサーバーにキャッシュされているため、$T_{ttfb}$ は純粋にクライアントから最も近いエッジサーバーまでのネットワーク遅延（$T_{edge}$）のみに依存します。&lt;/p>
$$ T_{ttfb\_hugo} = T_{edge} $$&lt;p>これにより、$T_{edge} \ll (T_{network} + T_{php} + T_{db})$ が成立し、TTFBは数ミリ秒から数十ミリ秒程度へと劇的に短縮されます。また、リクエスト数 $N$ が増加してもエッジサーバーの負荷分散機能により応答時間はほぼ一定（$O(1)$）を保ちます。&lt;/p>
$$ \lim_{N \to \infty} T_{ttfb\_hugo}(N) \approx \text{Constant} $$&lt;p>これが、Hugo（静的サイト）がトラフィックのスパイク（バズった時など）に対して極めて堅牢である数理的な根拠となります。&lt;/p>
&lt;hr>
&lt;h2 id="3-hugoの基本構造と動作原理">3. Hugoの基本構造と動作原理
&lt;/h2>&lt;p>Hugoをマスターするためには、その独特なディレクトリ構造と、「Front Matter」「Template Lookup Order」の概念を理解することが不可欠です。&lt;/p>
&lt;h3 id="31-ディレクトリ構造の詳細解説">3.1 ディレクトリ構造の詳細解説
&lt;/h3>&lt;p>Hugoプロジェクトを新規作成（&lt;code>hugo new site mysite&lt;/code>）すると、以下のようなディレクトリ構造が生成されます。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">mysite/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── archetypes/ # 新規コンテンツ作成時のテンプレート（Front Matterの雛形）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── assets/ # Hugo Pipesで処理するファイル群（SCSS/Sass, JavaScriptなど）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── content/ # 実際のサイトコンテンツ（Markdownファイル群）。ここがDBの代わりとなる。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── data/ # サイト全体で利用する外部データや設定（JSON, TOML, YAML, CSVなど）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── layouts/ # サイトの見た目を決定するHTMLテンプレート群（Go html/templateを利用）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── public/ # ビルドコマンド実行後に生成された静的ファイルが出力される場所
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── static/ # そのままの形で公開される静的ファイル（画像、favicon、ロボット用テキストなど）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── themes/ # サードパーティ製、または自作のテーマディレクトリ
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└── hugo.toml # サイト全体の設定ファイル（以前は config.toml が主流でした）
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>WordPressにおいては、コンテンツはMySQLの &lt;code>wp_posts&lt;/code> テーブルに格納されますが、Hugoでは全て &lt;code>content/&lt;/code> ディレクトリ内のテキストファイル（主にMarkdown）として管理されます。これにより、コンテンツのバージョン管理（Git）が容易になります。&lt;/p>
&lt;h3 id="32-コンテンツ管理markdownとfront-matter">3.2 コンテンツ管理：MarkdownとFront Matter
&lt;/h3>&lt;p>Hugoの各記事ファイルは、最上部に「Front Matter（フロントマター）」と呼ばれるメタデータのブロックを持ち、その下に本文（Markdown）が続く構成となります。Front MatterはTOML, YAML, JSONのいずれかで記述できますが、YAMLが広く使われています。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">title&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Hugoのタクソノミーを理解する&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">date&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="ld">2026-09-13T10:00:00&lt;/span>&lt;span class="m">+09&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">00&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">draft&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">false&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">categories&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;技術解説&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">tags&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;Hugo&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;Go&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">aliases&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;/old-category/hugo-taxonomy/&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="l">ここからが本文です。**Markdown**で記述します。&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="l">Hugoの強力な機能について解説します...&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>ここで注目すべきは &lt;code>aliases&lt;/code> キーです。WordPressから移行する際、パーマリンク（URL）が変わってしまうとSEO的に大きなマイナスとなります。Hugoのエイリアス機能を使えば、旧URLを指定するだけで、Hugoが自動的にリダイレクト用のHTML（meta refreshによる転送）を生成してくれます。サーバー側のリダイレクト設定（.htaccessなど）が不要になるため、非常に便利です。&lt;/p>
&lt;h3 id="33-テンプレートのルックアップ順序template-lookup-order">3.3 テンプレートのルックアップ順序（Template Lookup Order）
&lt;/h3>&lt;p>Hugoの強力な機能の一つが、柔軟なテンプレート探索機構（Template Lookup Order）です。Hugoは特定のページをレンダリングする際、最適なテンプレートを見つけるために特定の順序でディレクトリとファイル名を検索します。&lt;/p>
&lt;p>例えば、&lt;code>content/post/hello-world.md&lt;/code> という単一の記事（Single Page）を描画する場合、Hugoは概ね以下の順序でレイアウトファイルを探します。&lt;/p>
&lt;ol>
&lt;li>&lt;code>layouts/post/single.html&lt;/code>&lt;/li>
&lt;li>&lt;code>layouts/post/list.html&lt;/code> （誤りではありませんが、通常はリスト用）&lt;/li>
&lt;li>&lt;code>layouts/_default/single.html&lt;/code>&lt;/li>
&lt;li>&lt;code>themes/&amp;lt;THEME_NAME&amp;gt;/layouts/post/single.html&lt;/code>&lt;/li>
&lt;li>&lt;code>themes/&amp;lt;THEME_NAME&amp;gt;/layouts/_default/single.html&lt;/code>&lt;/li>
&lt;/ol>
&lt;p>開発者はテーマのソースコードを直接書き換えることなく、自身のプロジェクトの &lt;code>layouts/&lt;/code> ディレクトリに同じ名前のファイルを作成するだけで、テーマのテンプレートを**上書き（オーバーライド）**することができます。これにより、ベースとなるテーマのアップデートを阻害することなく、独自のカスタマイズを施すことが可能です。&lt;/p>
&lt;h3 id="34-タクソノミーtaxonomy">3.4 タクソノミー（Taxonomy）
&lt;/h3>&lt;p>WordPressの「カテゴリー」や「タグ」に相当する分類システムを、Hugoでは「タクソノミー（Taxonomy）」と呼びます。
Hugoはデフォルトで &lt;code>categories&lt;/code> と &lt;code>tags&lt;/code> というタクソノミーをサポートしていますが、&lt;code>hugo.toml&lt;/code> を編集することで、自由にカスタムタクソノミー（例：&lt;code>series&lt;/code>, &lt;code>authors&lt;/code> など）を追加できます。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-toml" data-lang="toml">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># hugo.tomlの例&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="nx">taxonomies&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">category&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;categories&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">tag&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;tags&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">series&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;series&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">author&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;authors&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>これにより、多様な軸でコンテンツを整理・一覧化することが可能になります。&lt;/p>
&lt;hr>
&lt;h2 id="4-wordpressからhugoへの移行プロセスマイグレーション">4. WordPressからHugoへの移行プロセス（マイグレーション）
&lt;/h2>&lt;p>WordPressからHugoへの移行は、データベース内の動的コンテンツをいかにクリーンな静的ファイル（Markdown + Front Matter）に変換し、既存のURL構造を維持するかが成功の鍵となります。&lt;/p>
&lt;p>以下に、一般的な移行パイプラインのフローを示します。&lt;/p>
&lt;pre class="mermaid">
flowchart LR
WPDB[&amp;#34;WP Database&amp;#34;] --&amp;gt;|Plugin| Exporter[&amp;#34;Export Tool&amp;#34;]
Exporter --&amp;gt;|&amp;#34;Extracts Text, \nMeta, Images&amp;#34;| ZipFile[&amp;#34;Zip / Folder&amp;#34;]
ZipFile --&amp;gt;|Unpack| MarkdownFiles[&amp;#34;Markdown Files \n(content/)&amp;#34;]
ZipFile --&amp;gt;|Unpack| ImageFiles[&amp;#34;Images \n(static/wp-content/)&amp;#34;]
MarkdownFiles --&amp;gt; Formatting[&amp;#34;Review &amp;amp; Format \n(Fix Shortcodes)&amp;#34;]
Formatting --&amp;gt; Git[&amp;#34;Commit to Git&amp;#34;]
&lt;/pre>
&lt;h3 id="41-データの抽出とmarkdown化">4.1 データの抽出とMarkdown化
&lt;/h3>&lt;p>WordPressのデータをHugo用に出力するためには、専用のプラグインを使用するのが最も簡単で確実です。代表的なアプローチをいくつか紹介します。&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Jekyll Exporterプラグインの利用&lt;/strong>
Hugoは同じSSGであるJekyllとデータ構造が非常に似ているため、WordPress用の「Jekyll Exporter」プラグインを使用するのが一般的な手法です。このプラグインをインストールして実行すると、すべての投稿・固定ページがFront Matter付きのMarkdownファイルに変換され、画像ファイル群と共にZIPファイルとしてダウンロードできます。&lt;/li>
&lt;li>&lt;strong>WordPress APIを利用した自作スクリプト&lt;/strong>
PythonやNode.js等でWordPressのREST API (&lt;code>/wp-json/wp/v2/posts&lt;/code>) を叩き、JSONデータを解析して自前でMarkdownファイルを生成するスクリプトを作成する方法です。プラグインでは対応しきれない複雑なカスタムフィールド（ACF等）を多用しているサイトで有効です。&lt;/li>
&lt;li>&lt;strong>wp2hugo ツールの活用&lt;/strong>
Go言語などで書かれたCLIツールを利用して、WordPressのエクスポートXMLファイル（WXR）から直接Hugo形式へ変換するアプローチもあります。&lt;/li>
&lt;/ol>
&lt;h3 id="42-パーマリンクurl構造の維持">4.2 パーマリンク（URL）構造の維持
&lt;/h3>&lt;p>SEOの評価を引き継ぐため、WordPress時代のURLをそのまま維持することが極めて重要です。WordPressで &lt;code>https://example.com/2026/09/13/my-post/&lt;/code> のようなパーマリンク設定にしていた場合、Hugoの &lt;code>hugo.toml&lt;/code> でパーマリンクの構造を指定します。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-toml" data-lang="toml">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="nx">permalinks&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">post&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;/:year/:month/:day/:slug/&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>あるいは、記事ごとにFront Matter内で &lt;code>url&lt;/code> パラメータを直接指定して、URLを強制的に固定することも可能です。
さらに、URLが変わるページについては、前述の &lt;code>aliases&lt;/code> を使用してリダイレクトを設定します。&lt;/p>
&lt;h3 id="43-ショートコードの変換">4.3 ショートコードの変換
&lt;/h3>&lt;p>WordPress固有のショートコード（例：&lt;code>[gallery]&lt;/code>, &lt;code>[caption]&lt;/code>, 各種プラグインの独自コード）は、エクスポート時にそのままの文字列で残ってしまうことが多いため、対応が必要です。
これらは、置換スクリプト（sedやPython）を用いて一括削除するか、あるいはHugoの強力な&lt;strong>カスタムショートコード機能&lt;/strong>（&lt;code>layouts/shortcodes/&lt;/code> 内に独自レイアウトを作成）を利用して、Hugo側で適切にレンダリングされるように移行します。&lt;/p>
&lt;hr>
&lt;h2 id="5-hugoのcliツールとビルドデプロイ">5. HugoのCLIツールとビルド・デプロイ
&lt;/h2>&lt;p>移行作業が完了したら、いよいよHugoを用いてサイトをビルドし、世界へ向けて公開します。Go言語のバイナリとして提供されるHugoは、数千から数万ページのサイトであってもわずか数秒でビルドを完了する驚異的な速度を誇ります。&lt;/p>
&lt;h3 id="51-ローカル開発用サーバーの起動">5.1 ローカル開発用サーバーの起動
&lt;/h3>&lt;p>記事の執筆やデザインの調整を行う際は、ローカルサーバーを起動します。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 開発サーバーの起動コマンド（Draft記事を含める場合は -D）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">hugo server -D
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>このコマンドを実行すると、&lt;code>http://localhost:1313/&lt;/code> でサイトがプレビュー可能になります。Hugoには強力な「LiveReload」機能が内蔵されており、Markdownファイルやテンプレート、CSSを編集して保存した瞬間に、ブラウザの画面が自動的に高速更新されます。これにより、執筆・開発体験はWordPressの管理画面よりも遥かに快適なものになります。&lt;/p>
&lt;h3 id="52-本番用ビルドとパフォーマンス最適化">5.2 本番用ビルドとパフォーマンス最適化
&lt;/h3>&lt;p>本番環境にデプロイするための静的ファイルを生成するには、単に &lt;code>hugo&lt;/code> と打ち込みます。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 本番用ビルドの実行。--minifyオプションでHTML/CSS/JSを最小化&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">hugo --minify
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>このコマンドにより、サイト全体のファイルが &lt;code>public/&lt;/code> ディレクトリに出力されます。&lt;code>--minify&lt;/code> オプションを付与することで、不要な改行やスペースが削除され、ファイルサイズがさらに削減されます。前述した数学モデルにおけるネットワーク遅延（$T_{network}$）の削減に直接寄与します。&lt;/p>
&lt;h3 id="53-デプロイの自動化cicd">5.3 デプロイの自動化（CI/CD）
&lt;/h3>&lt;p>静的ファイルの生成を毎回ローカルのPCで行い、FTP等でアップロードするのは非効率的です。現代のSSG運用では、Gitリポジトリ（GitHub等）へのプッシュをトリガーとして、自動的にビルドとデプロイを行うCI/CD環境を構築するのがベストプラクティスです。&lt;/p>
&lt;p>例えば、GitHub Actionsを利用してCloudflare PagesやGitHub Pagesへデプロイする設定（YAMLファイル）の基本形は以下のようになります。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># .github/workflows/hugo.yml の例&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Deploy Hugo site to GitHub Pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">push&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">branches&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;main&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">workflow_dispatch&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">permissions&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">contents&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">read&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">pages&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">write&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">id-token&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">write&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">jobs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">build&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">runs-on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ubuntu-latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Checkout&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/checkout@v3&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">submodules&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">recursive&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># テーマをサブモジュールで管理している場合&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">fetch-depth&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Setup Hugo&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">peaceiris/actions-hugo@v2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">hugo-version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;latest&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">extended&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Build&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">hugo --minify&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Upload artifact&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/upload-pages-artifact@v2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">path&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">./public&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">deploy&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">environment&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">github-pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">url&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ steps.deployment.outputs.page_url }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">runs-on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ubuntu-latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">needs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">build&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Deploy to GitHub Pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">id&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">deployment&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/deploy-pages@v2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>このように設定することで、「Markdownで記事を書いてGitHubへPushする」というアクションだけで、数分後には最新のサイトが本番環境へ公開される自動化パイプラインが完成します。&lt;/p>
&lt;hr>
&lt;h2 id="6-移行後のseoと運用面のメリット">6. 移行後のSEOと運用面のメリット
&lt;/h2>&lt;p>WordPressからHugoへの移行を完了したサイト運営者は、多くの場合、以下の3つの顕著なメリットを実感します。&lt;/p>
&lt;h3 id="61-サイトスピードとcore-web-vitalsの劇的な向上">6.1 サイトスピードとCore Web Vitalsの劇的な向上
&lt;/h3>&lt;p>データベースクエリやサーバーサイドのレンダリングが排除された結果、ページのロード時間はミリ秒単位まで短縮されます。これはGoogleのランキング要因である「Core Web Vitals」（LCP, FID/INP, CLS）スコアの大幅な向上に直結します。ユーザーの直帰率の低下と、SEO評価の向上が期待できます。&lt;/p>
&lt;h3 id="62-セキュリティ脅威からの解放">6.2 セキュリティ脅威からの解放
&lt;/h3>&lt;p>WordPressは世界中で広く使われているため、常に攻撃対象となっています。プラグインの脆弱性を突かれた改ざんや、ブルートフォース攻撃によるログイン突破などのリスクがつきまといます。
しかし、Hugoによって生成された静的サイトにはデータベースもPHP環境も、管理画面（ログインフォーム）すら存在しません。ハッカーがサーバーに侵入してデータベースを書き換える余地がなく、セキュリティリスクは極限までゼロに近づきます。&lt;/p>
&lt;h3 id="63-メンテナンスフリーな運用">6.3 メンテナンスフリーな運用
&lt;/h3>&lt;p>WordPressの運用では、本体のバージョンアップ、プラグインの更新、PHPバージョンの追従など、絶え間ないメンテナンス作業が必要です。互換性問題によりサイトが壊れるリスクに常に怯える必要があります。
Hugoの場合、ツール自体のアップデートは必要に応じて行うだけで良く、サイトのコード自体は独立したテキストファイル群であるため、「放置していても壊れない」という圧倒的な安心感があります。&lt;/p>
&lt;hr>
&lt;h2 id="7-まとめ">7. まとめ
&lt;/h2>&lt;p>本記事では、WordPressのような動的CMSから、Go言語ベースの強力な静的サイトジェネレーター「Hugo」への移行について、技術的なアーキテクチャの差異から数理的モデルによるパフォーマンスの証明、そして具体的な移行手順までを詳細に解説しました。&lt;/p>
&lt;p>静的サイトジェネレーターへの移行は、初期の学習コスト（Gitの操作、Markdownの記法、ターミナルからのCLIコマンドの実行、テンプレートエンジンの仕様理解など）こそ必要ですが、それを補って余りあるほどの「圧倒的な表示速度」「強固なセキュリティ」、そして「メンテナンスフリー」というリターンをもたらします。&lt;/p>
&lt;p>もしあなたのウェブサイトが、頻繁なデザイン変更や複雑な動的処理（会員専用機能や高度なEC機能など）を必要とせず、主に情報発信（ブログ、メディア、コーポレートサイト）を目的としているのであれば、Hugoへの移行は最も効果的な技術的投資の一つとなるでしょう。ぜひ本記事を参考に、Hugoを用いた次世代のウェブサイト運営への第一歩を踏み出してみてください。&lt;/p></description></item><item><title>Markdownで書く技術ブログ：執筆スピードを倍増させるエディタ設定</title><link>http://kenji.blog/p/markdown-editor-setup-for-tech-blogs/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/p/markdown-editor-setup-for-tech-blogs/</guid><description>&lt;img src="http://kenji.blog/p/markdown-editor-setup-for-tech-blogs/img/eyecatch.jpg" alt="Featured image of post Markdownで書く技術ブログ：執筆スピードを倍増させるエディタ設定" />&lt;p>技術ブログを継続して執筆するためには、執筆環境の最適化が必要不可欠です。本記事では、Markdownを用いた技術ブログの執筆スピードを劇的に向上させるための、高度なエディタ設定について深く掘り下げます。Visual Studio Code (VS Code) や Neovim の極限までのカスタマイズ、スニペットの活用、日本語の文法チェックツールである textlint の導入から CI/CD パイプラインでの自動化、そして GitHub Copilot などの LLM を活用した最先端の執筆術まで、網羅的に解説します。&lt;/p>
&lt;h2 id="1-執筆スピード向上の数理モデル">1. 執筆スピード向上の数理モデル
&lt;/h2>&lt;p>エディタ設定の最適化がどれほど執筆時間に影響を与えるのか、まずは簡単な数式でモデル化してみましょう。ブログ記事を1本執筆する際の総入力時間を $T_{total}$ とします。&lt;/p>
$$
T_{total} = T_{think} + T_{type} + T_{format} + T_{review}
$$&lt;p>ここで、$T_{think}$ は思考時間、$T_{type}$ はタイピング時間、$T_{format}$ はMarkdownなどのフォーマット調整時間、$T_{review}$ は推敲・校正時間です。&lt;/p>
&lt;p>エディタのカスタマイズ（スニペット導入やLinter設定など）によって削減される時間 $T_{saved}$ は、ある特定のパターン（例えばHugoのショートコードやMarkdownの表）の出現回数 $N$ と、手動入力にかかる時間 $t_{manual}$、スニペット等の自動化によってかかる時間 $t_{snippet}$ を用いて次のように表せます。&lt;/p>
$$
T_{saved} = \sum_{i=1}^{k} N_i \times (t_{manual, i} - t_{snippet, i}) + T_{review\_saved}
$$&lt;p>さらに、自動フォーマッタやLintツールを導入することで、人間の目視による確認時間 $T_{review}$ が大幅に削減されます。この $T_{saved}$ の最大化こそが、本記事の目的です。&lt;/p>
&lt;h2 id="2-visual-studio-code-vs-code-の最強設定">2. Visual Studio Code (VS Code) の最強設定
&lt;/h2>&lt;p>VS Codeは、現在最も普及しているエディタの一つであり、Markdown執筆においても強力な拡張機能エコシステムを持っています。&lt;/p>
&lt;h3 id="推奨拡張機能">推奨拡張機能
&lt;/h3>&lt;p>執筆を高速化するために、以下の拡張機能を導入することを強く推奨します。&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Markdown All in One&lt;/strong>: ショートカットキーでの太字・イタリック化、リストの自動継続、目次 (TOC) の自動生成など、Markdown執筆に必要な基本機能がすべて揃っています。&lt;/li>
&lt;li>&lt;strong>markdownlint&lt;/strong>: Markdownの構文エラーやスタイル違反をリアルタイムで警告してくれます。&lt;/li>
&lt;li>&lt;strong>vscode-textlint&lt;/strong>: 日本語の技術文書向けルールセットを適用し、表記揺れや文法エラーを防ぎます。&lt;/li>
&lt;/ol>
&lt;h3 id="hugo向け独自スニペットの設定-markdownjson">Hugo向け独自スニペットの設定 (&lt;code>markdown.json&lt;/code>)
&lt;/h3>&lt;p>技術ブログとして Hugo や Docusaurus などの静的サイトジェネレータを利用している場合、Frontmatter や独自のショートコードを頻繁に入力することになります。VS Code のスニペット機能を使えば、これらを一瞬で展開可能です。&lt;/p>
&lt;p>コマンドパレットから &lt;code>Preferences: Configure User Snippets&lt;/code> を選択し、&lt;code>markdown.json&lt;/code> に以下の設定を追加します。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;Hugo Frontmatter&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;prefix&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;frontmatter&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;body&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;---&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;title: \&amp;#34;${1:タイトル}\&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;slug: \&amp;#34;${2:slug-name}\&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;date: \&amp;#34;$CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE T$CURRENT_HOUR:$CURRENT_MINUTE:$CURRENT_SECOND+09:00\&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;image: \&amp;#34;img/eyecatch.jpg\&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;math: true&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;mermaid: true&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;categories: [\&amp;#34;${3:Category}\&amp;#34;]&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;tags: [\&amp;#34;${4:Tag1}\&amp;#34;, \&amp;#34;${5:Tag2}\&amp;#34;]&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;---&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;${0}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;description&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Hugo用のYAML Frontmatterを展開します&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;Hugo Figure Shortcode&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;prefix&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;hfig&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;body&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;{{&amp;lt; figure src=\&amp;#34;${1:image.jpg}\&amp;#34; title=\&amp;#34;${2:画像タイトル}\&amp;#34; &amp;gt;}}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;description&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;HugoのFigureショートコード&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;Markdown Table&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;prefix&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;mtable&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;body&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;| ${1:Header 1} | ${2:Header 2} | ${3:Header 3} |&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;| :--- | :---: | ---: |&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;| ${4:Row 1} | ${5:Data} | ${6:Data} |&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;| ${7:Row 2} | ${8:Data} | ${9:Data} |&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;$0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;description&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;3列のMarkdownテーブルを生成&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>この設定により、&lt;code>frontmatter&lt;/code> と打ち込んでタブキーを押すだけで、現在時刻を含んだ YAML Frontmatter が瞬時に展開され、執筆の初速が劇的に上がります。&lt;/p>
&lt;h3 id="github-copilotを活用した執筆支援">GitHub Copilotを活用した執筆支援
&lt;/h3>&lt;p>VS Code上で GitHub Copilot を有効にしていると、文脈に応じたAI補完がMarkdownでも機能します。特に技術ブログの場合、「次に説明すべき構成」や「関連するコードブロック」をAIが先読みして提案してくれるため、タイピング時間 $T_{type}$ を大幅に削減可能です。&lt;/p>
&lt;h2 id="3-neovimでの極限カスタマイズ">3. Neovimでの極限カスタマイズ
&lt;/h2>&lt;p>VS CodeのGUIも優れていますが、ターミナル愛好家やVimmerにとっては、キーボードから一切手を離さずにすべてを完結できる Neovim が最強の選択肢となります。&lt;/p>
&lt;h3 id="neovim-lspアーキテクチャ">Neovim LSPアーキテクチャ
&lt;/h3>&lt;p>Markdown環境における Neovim の LSP (Language Server Protocol) および Linter のアーキテクチャは以下のようになります。&lt;/p>
&lt;pre class="mermaid">
classDiagram
class Neovim {
+&amp;#34;Text Buffer&amp;#34;
+&amp;#34;Keymaps&amp;#34;
}
class nvim_lspconfig {
+&amp;#34;marksman (Markdown LSP)&amp;#34;
}
class null_ls_or_none_ls {
+&amp;#34;markdownlint&amp;#34;
+&amp;#34;textlint&amp;#34;
}
class LuaSnip {
+&amp;#34;Dynamic Snippets&amp;#34;
}
class CMP {
+&amp;#34;Auto Completion Engine&amp;#34;
}
Neovim --&amp;gt; nvim_lspconfig : &amp;#34;Provides semantic features&amp;#34;
Neovim --&amp;gt; null_ls_or_none_ls : &amp;#34;Diagnostics &amp;amp; Formatting&amp;#34;
Neovim --&amp;gt; CMP : &amp;#34;Completion Request&amp;#34;
CMP --&amp;gt; nvim_lspconfig : &amp;#34;LSP Source&amp;#34;
CMP --&amp;gt; LuaSnip : &amp;#34;Snippet Source&amp;#34;
&lt;/pre>
&lt;h3 id="luasnipを用いた高度なスニペット展開">LuaSnipを用いた高度なスニペット展開
&lt;/h3>&lt;p>VS CodeのJSONスニペットよりも強力なのが、Neovimのプラグインである &lt;code>LuaSnip&lt;/code> です。Luaのロジックを用いて、動的にスニペットの中身を計算・展開できます。&lt;/p>
&lt;p>以下は、現在日時を動的に取得し、HugoのFrontmatterを展開するLuaSnipの設定例です。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-lua" data-lang="lua">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">local&lt;/span> &lt;span class="n">ls&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;luasnip&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">local&lt;/span> &lt;span class="n">s&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ls.snippet&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">local&lt;/span> &lt;span class="n">t&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ls.text_node&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">local&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ls.insert_node&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">local&lt;/span> &lt;span class="n">f&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ls.function_node&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- 現在のJST時刻を取得する関数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">local&lt;/span> &lt;span class="kr">function&lt;/span> &lt;span class="nf">get_current_date_jst&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">return&lt;/span> &lt;span class="n">os.date&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;!%Y-%m-%dT%H:%M:%S&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">..&lt;/span> &lt;span class="s2">&amp;#34;+09:00&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">end&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ls.add_snippets&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;markdown&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">s&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;frontmatter&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;---&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;title: &lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Title&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;slug: &lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;slug-name&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;date: &lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">f&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kr">function&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="kr">return&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="n">get_current_date_jst&lt;/span>&lt;span class="p">()}&lt;/span> &lt;span class="kr">end&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{}),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;image: &lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">img/eyecatch.jpg&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;math: true&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;mermaid: true&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;categories: [&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Category&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">]&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;tags: [&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Tag&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">]&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;---&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">s&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;mtable&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;| &amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Header 1&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34; | &amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Header 2&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34; |&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;|---|---|&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;| &amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Cell 1&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34; | &amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Cell 2&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34; |&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>このように、プログラミング言語(Lua)のパワーを借りることで、固定の文字列だけでなく、関数の戻り値を埋め込んだり、入力文字数に応じて動的にテーブルの列数を増減させるような変態的なスニペットを作成することも可能です。&lt;/p>
&lt;h2 id="4-執筆品質と速度を両立する静的解析-textlintと正規表現">4. 執筆品質と速度を両立する静的解析 (textlintと正規表現)
&lt;/h2>&lt;p>ブログの品質を担保するためには、誤字脱字や表記揺れを防ぐ必要があります。これを手動で行うと $T_{review}$ が爆発的に増加するため、&lt;code>textlint&lt;/code> による静的解析を導入します。&lt;/p>
&lt;h3 id="textlint-の導入と日本語ルールセット">textlint の導入と日本語ルールセット
&lt;/h3>&lt;p>Node.js環境下でtextlintをインストールします。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npm install -D textlint textlint-rule-preset-ja-technical-writing textlint-rule-prh textlint-filter-rule-comments
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>プロジェクトルートに &lt;code>.textlintrc.json&lt;/code> を作成し、以下のように設定します。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;filters&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;comments&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;rules&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;preset-ja-technical-writing&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;ja-no-mixed-period&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;periodMark&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;。&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;sentence-length&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;max&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">100&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;prh&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;rulePaths&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;./prh.yml&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;code>prh.yml&lt;/code> を作成し、技術用語の表記揺れを定義します。例えば、「サーバー」と「サーバ」、「Javascript」と「JavaScript」などを統一します。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">rules&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">expected&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;JavaScript&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">pattern&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Javascript&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">expected&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;サーバー&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">pattern&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;サーバ&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">expected&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;インターフェース&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">pattern&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;インターフェイス&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>これにより、エディタ上で文字を打つたびに、表記揺れがリアルタイムで警告されるようになり、校正の時間がほぼゼロになります。&lt;/p>
&lt;h3 id="正規表現を用いた一括置換構造化パターン">正規表現を用いた一括置換・構造化パターン
&lt;/h3>&lt;p>既存の記事をマークダウンに移行したり、外部からテキストを持ってきた場合、正規表現による一括置換が便利です。&lt;/p>
&lt;p>例えば、HTMLの &lt;code>&amp;lt;b&amp;gt;強調&amp;lt;/b&amp;gt;&lt;/code> タグを Markdown の &lt;code>**強調**&lt;/code> に変換する場合の正規表現：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>検索パターン&lt;/strong>: &lt;code>&amp;lt;b&amp;gt;(.*?)&amp;lt;/b&amp;gt;&lt;/code>&lt;/li>
&lt;li>&lt;strong>置換パターン&lt;/strong>: &lt;code>**$1**&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>不要な連続改行を一つにまとめる場合：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>検索パターン&lt;/strong>: &lt;code>\n{3,}&lt;/code>&lt;/li>
&lt;li>&lt;strong>置換パターン&lt;/strong>: &lt;code>\n\n&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>これらをVS Codeの検索・置換機能（正規表現モード）やNeovimの &lt;code>%s&lt;/code> コマンド (&lt;code>:%s/&amp;lt;b&amp;gt;\(.*?\)&amp;lt;\/b&amp;gt;/**\1**/g&lt;/code>) で実行することで、一瞬でフォーマットを統一できます。&lt;/p>
&lt;h3 id="cicdパイプラインによる自動チェック">CI/CDパイプラインによる自動チェック
&lt;/h3>&lt;p>さらに、GitHub Actions を用いて、ブログ記事を push した際に自動で textlint が走る CI パイプラインを構築します。これにより、ルール違反がある記事のデプロイを未然に防ぐことができます。&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;Author&amp;#34;] --&amp;gt;|Push changes| B[&amp;#34;GitHub Repository&amp;#34;]
B --&amp;gt; C{&amp;#34;GitHub Actions Triggered&amp;#34;}
C --&amp;gt; D[&amp;#34;Checkout Repository&amp;#34;]
D --&amp;gt; E[&amp;#34;Setup Node.js&amp;#34;]
E --&amp;gt; F[&amp;#34;npm install&amp;#34;]
F --&amp;gt; G[&amp;#34;Run textlint&amp;#34;]
G --&amp;gt;|Pass| H[&amp;#34;Build Hugo Site&amp;#34;]
G --&amp;gt;|Fail| I[&amp;#34;Report Error to PR/Commit&amp;#34;]
H --&amp;gt; J[&amp;#34;Deploy to Hosting (Vercel/Netlify)&amp;#34;]
&lt;/pre>
&lt;h2 id="5-llm時代のマークダウン執筆術">5. LLM時代のマークダウン執筆術
&lt;/h2>&lt;p>現代の技術ブログ執筆において、LLM (Large Language Model) の活用は避けて通れません。エディタ内蔵のAIツールを活用することで、執筆速度はさらに倍増します。&lt;/p>
&lt;h3 id="エディタ内でのプロンプトエンジニアリング">エディタ内でのプロンプトエンジニアリング
&lt;/h3>&lt;p>VS Code の GitHub Copilot Chat や、Neovim の &lt;code>ChatGPT.nvim&lt;/code> や &lt;code>Copilot.vim&lt;/code> などを使い、エディタを離れることなく以下のようなプロンプトを投げます。&lt;/p>
&lt;blockquote>
&lt;p>「以下の技術要素について、初学者向けにMarkdownの階層構造でアウトラインを作成して：Docker, Kubernetes, CI/CD」&lt;/p>
&lt;/blockquote>
&lt;p>すると、即座に見出しや箇条書きのマークダウンが生成されます。私たちはその骨組みに肉付けをしていくだけで済みます。&lt;/p>
&lt;p>また、複雑な Mermaid の図や数式 (LaTeX) の記述も、AIに指示を出すことで正確な構文を生成してくれます。例えば、本記事に掲載している数式や図表のレイアウトの基礎も、LLMとのペアライティングによって高速化されています。&lt;/p>
&lt;h2 id="6-まとめ">6. まとめ
&lt;/h2>&lt;p>Markdownで技術ブログを書く際の執筆スピードを倍増させるエディタ設定について解説しました。&lt;/p>
&lt;ol>
&lt;li>&lt;strong>数理モデルの意識&lt;/strong>: $T_{saved}$ を最大化するために、繰り返しの作業を撲滅する。&lt;/li>
&lt;li>&lt;strong>VS Codeの活用&lt;/strong>: 拡張機能と &lt;code>markdown.json&lt;/code> のスニペットで入力を省略。&lt;/li>
&lt;li>&lt;strong>Neovimの極限カスタマイズ&lt;/strong>: &lt;code>LuaSnip&lt;/code> による動的スニペットと完全なキーボード操作。&lt;/li>
&lt;li>&lt;strong>textlintと静的解析&lt;/strong>: 校正時間をゼロに近づけるための CI/CD とローカル Linter の統合。&lt;/li>
&lt;li>&lt;strong>LLMの統合&lt;/strong>: エディタ内で直接 AI にマークダウンの構成や図表のコードを出力させる。&lt;/li>
&lt;/ol>
&lt;p>これらの設定を自身の環境に取り入れることで、執筆の「面倒くささ」がなくなり、技術的なアウトプットの量と質が劇的に向上するはずです。まずは小さなスニペット登録一つからでも始めてみてはいかがでしょうか。&lt;/p></description></item></channel></rss>