aboutsummaryrefslogtreecommitdiffhomepage
path: root/services/nuldoc/public/blog/posts/2026-02-01
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-02-01 12:48:02 +0900
committernsfisis <nsfisis@gmail.com>2026-02-01 12:48:02 +0900
commitf866a23c9ad7842e6c832bae6d84bec953287c08 (patch)
tree440856073df7c2fec3431bf1ca2e133c2ea33c45 /services/nuldoc/public/blog/posts/2026-02-01
parent376781b3592203de7d3ceb01b1d7a07dc5bd87a7 (diff)
downloadnsfisis.dev-f866a23c9ad7842e6c832bae6d84bec953287c08.tar.gz
nsfisis.dev-f866a23c9ad7842e6c832bae6d84bec953287c08.tar.zst
nsfisis.dev-f866a23c9ad7842e6c832bae6d84bec953287c08.zip
feat(blog): new post /posts/2026-02-01/rewrite-this-site-generator-2026/
Diffstat (limited to 'services/nuldoc/public/blog/posts/2026-02-01')
-rw-r--r--services/nuldoc/public/blog/posts/2026-02-01/rewrite-this-site-generator-2026.md62
-rw-r--r--services/nuldoc/public/blog/posts/2026-02-01/rewrite-this-site-generator-2026/index.html158
2 files changed, 220 insertions, 0 deletions
diff --git a/services/nuldoc/public/blog/posts/2026-02-01/rewrite-this-site-generator-2026.md b/services/nuldoc/public/blog/posts/2026-02-01/rewrite-this-site-generator-2026.md
new file mode 100644
index 00000000..46ec8e7e
--- /dev/null
+++ b/services/nuldoc/public/blog/posts/2026-02-01/rewrite-this-site-generator-2026.md
@@ -0,0 +1,62 @@
+---
+[article]
+uuid = "32947eee-f737-4e4c-b3f3-2c847d9b36d2"
+title = "このサイトの静的サイトジェネレータを書き直した (2026)"
+description = "このサイトの静的サイトジェネレータを書き直したので、設計思想を書き記しておく。"
+tags = [
+ "note-to-self"
+]
+
+[[article.revisions]]
+date = "2026-02-01"
+remark = "公開"
+---
+# はじめに {#intro}
+
+このサイトを構築する静的サイトジェネレータをまた書き直した。
+
+[前回のリライトはこちら](/posts/2023-03-10/rewrite-this-blog-generator/)
+
+
+# 記事フォーマットの変遷 {#format-changes}
+
+ブログ記事を書くテキストフォーマットは次のように変遷している。
+
+1. Markdown
+1. AsciiDoc
+1. XML (Simplified DocBook)
+1. Djot
+1. Markdown
+
+結局最初の Markdown に戻ってきたことになる。
+AsciiDoc や Simplified DocBook を使っていた当時 (2023 年ごろ) との最大の差は、LLM である。
+これらの AI は Markdown をある種の lingua franca として採用している。
+
+Ruby on Rails の DHH 氏も同じことを述べているらしい。
+
+[Rails 8.1 のリリースノートより引用](https://guides.rubyonrails.org/8_1_release_notes.html#markdown-rendering)
+
+> Markdown has become the lingua franca of AI, and Rails has embraced this adoption by making it easier to respond to markdown requests and render them directly:
+
+ともかく世は猫も杓子も Markdown である。Simplified DocBook をベースにして Markdown へ変換することもできるが、そこまでするならもう最初から Markdown で書いてしまえというわけだ。
+
+Markdown の表現力の乏しさは変わらぬままではあるが、LLM は非構造化データの扱いがすこぶる得意であるので、多少 CommonMark 範囲から逸脱しようが大抵は意図を汲み取ってくれる。
+
+ところで、このブログも Markdown でのアクセスに対応しており、 <https://blog.nsfisis.dev/posts/2026-02-01/rewrite-this-blog-generator-2026.md> のような `.md` を付けた URL へアクセスすると Markdown が返る。また、HTTP で `Accept: text/markdown` を指定すると同じく Markdown が返る。
+
+
+# 実装 {#implementation}
+
+一つ前の実装は Deno + TypeScript で書かれていた。今回のリライトに用いた言語は Ruby である。
+Ruby を選んだのは Ractor を使ってみたかったからだったのだが、シンタックスハイライタが非対応だったので保留している。
+
+この移植は完全に AI 任せで、参考実装として TypeScript のソースコードを参照させつつ、出力される HTML ファイルの差分が無くなるまで走らせたところ数十分ほどで完成した。
+ざっと 4000 行ほどのコードである。
+いやはや、楽な時代になったものだ。
+
+なお、特に意図していなかったのだが、サイトをフルビルドしたときのパフォーマンスも 0.8 秒ほど改善した (2.2 秒 → 1.4 秒)。
+
+
+# おわりに {#outro}
+
+ということで次の式年遷宮まではこのジェネレータでやっていくことにする。
diff --git a/services/nuldoc/public/blog/posts/2026-02-01/rewrite-this-site-generator-2026/index.html b/services/nuldoc/public/blog/posts/2026-02-01/rewrite-this-site-generator-2026/index.html
new file mode 100644
index 00000000..d9ba2041
--- /dev/null
+++ b/services/nuldoc/public/blog/posts/2026-02-01/rewrite-this-site-generator-2026/index.html
@@ -0,0 +1,158 @@
+<!DOCTYPE html>
+<html lang="ja-JP">
+ <head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="author" content="nsfisis">
+ <meta name="copyright" content="&copy; 2026 nsfisis">
+ <meta name="description" content="このサイトの静的サイトジェネレータを書き直したので、設計思想を書き記しておく。">
+ <meta name="keywords" content="備忘録">
+ <meta property="og:type" content="article">
+ <meta property="og:title" content="このサイトの静的サイトジェネレータを書き直した (2026)|REPL: Rest-Eat-Program Loop">
+ <meta property="og:description" content="このサイトの静的サイトジェネレータを書き直したので、設計思想を書き記しておく。">
+ <meta property="og:site_name" content="REPL: Rest-Eat-Program Loop">
+ <meta property="og:locale" content="ja_JP">
+ <meta name="Hatena::Bookmark" content="nocomment">
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg">
+ <title>このサイトの静的サイトジェネレータを書き直した (2026)|REPL: Rest-Eat-Program Loop</title>
+ <link rel="stylesheet" href="/style.css?h=c171793a210d62f7ff2ddf54208f34e5">
+ </head>
+ <body class="single">
+ <header class="header">
+ <div class="site-logo">
+ <a href="https://nsfisis.dev/">nsfisis.dev</a>
+ </div>
+ <div class="site-name">
+ REPL: Rest-Eat-Program Loop
+ </div>
+ <nav class="nav">
+ <ul>
+ <li>
+ <a href="https://about.nsfisis.dev/">About</a>
+ </li>
+ <li>
+ <a href="/posts/">Posts</a>
+ </li>
+ <li>
+ <a href="/tags/">Tags</a>
+ </li>
+ </ul>
+ </nav>
+ </header>
+ <main class="main">
+ <article class="post-single">
+ <header class="post-header">
+ <h1 class="post-title">このサイトの静的サイトジェネレータを書き直した (2026)</h1>
+ <ul class="post-tags">
+ <li class="tag">
+ <a class="tag-inner" href="/tags/note-to-self/">備忘録</a>
+ </li>
+ </ul>
+ </header>
+ <nav class="toc">
+ <h2>目次</h2>
+ <ul>
+ <li>
+ <a href="#section--intro">はじめに</a>
+ </li>
+ <li>
+ <a href="#section--format-changes">記事フォーマットの変遷</a>
+ </li>
+ <li>
+ <a href="#section--implementation">実装</a>
+ </li>
+ <li>
+ <a href="#section--outro">おわりに</a>
+ </li>
+ </ul>
+ </nav>
+ <div class="post-content">
+ <section id="changelog">
+ <h2><a href="#changelog">更新履歴</a></h2>
+ <ol>
+ <li class="revision">
+ <time datetime="2026-02-01">2026-02-01</time>: 公開
+ </li>
+ </ol>
+ </section>
+ <section id="section--intro">
+ <h2><a href="#section--intro">はじめに</a></h2>
+ <p>
+ このサイトを構築する静的サイトジェネレータをまた書き直した。
+ </p>
+ <p>
+ <a href="/posts/2023-03-10/rewrite-this-blog-generator/">前回のリライトはこちら</a>
+ </p>
+ </section>
+ <section id="section--format-changes">
+ <h2><a href="#section--format-changes">記事フォーマットの変遷</a></h2>
+ <p>
+ ブログ記事を書くテキストフォーマットは次のように変遷している。
+ </p>
+ <ol>
+ <li>
+ Markdown
+ </li>
+ <li>
+ AsciiDoc
+ </li>
+ <li>
+ XML (Simplified DocBook)
+ </li>
+ <li>
+ Djot
+ </li>
+ <li>
+ Markdown
+ </li>
+ </ol>
+ <p>
+ 結局最初の Markdown に戻ってきたことになる。AsciiDoc や Simplified DocBook を使っていた当時 (2023 年ごろ) との最大の差は、LLM である。これらの AI は Markdown をある種の lingua franca として採用している。
+ </p>
+ <p>
+ Ruby on Rails の DHH 氏も同じことを述べているらしい。
+ </p>
+ <p>
+ <a href="https://guides.rubyonrails.org/8_1_release_notes.html#markdown-rendering" rel="noreferrer" target="_blank">Rails 8.1 のリリースノートより引用</a>
+ </p>
+ <blockquote>
+ <p>
+ Markdown has become the lingua franca of AI, and Rails has embraced this adoption by making it easier to respond to markdown requests and render them directly:
+ </p>
+ </blockquote>
+ <p>
+ ともかく世は猫も杓子も Markdown である。Simplified DocBook をベースにして Markdown へ変換することもできるが、そこまでするならもう最初から Markdown で書いてしまえというわけだ。
+ </p>
+ <p>
+ Markdown の表現力の乏しさは変わらぬままではあるが、LLM は非構造化データの扱いがすこぶる得意であるので、多少 CommonMark 範囲から逸脱しようが大抵は意図を汲み取ってくれる。
+ </p>
+ <p>
+ ところで、このブログも Markdown でのアクセスに対応しており、 <a class="url" href="https://blog.nsfisis.dev/posts/2026-02-01/rewrite-this-blog-generator-2026.md" rel="noreferrer" target="_blank">https://blog.nsfisis.dev/posts/2026-02-01/rewrite-this-blog-generator-2026.md</a> のような <code>.md</code> を付けた URL へアクセスすると Markdown が返る。また、HTTP で <code>Accept: text/markdown</code> を指定すると同じく Markdown が返る。
+ </p>
+ </section>
+ <section id="section--implementation">
+ <h2><a href="#section--implementation">実装</a></h2>
+ <p>
+ 一つ前の実装は Deno + TypeScript で書かれていた。今回のリライトに用いた言語は Ruby である。Ruby を選んだのは Ractor を使ってみたかったからだったのだが、シンタックスハイライタが非対応だったので保留している。
+ </p>
+ <p>
+ この移植は完全に AI 任せで、参考実装として TypeScript のソースコードを参照させつつ、出力される HTML ファイルの差分が無くなるまで走らせたところ数十分ほどで完成した。ざっと 4000 行ほどのコードである。いやはや、楽な時代になったものだ。
+ </p>
+ <p>
+ なお、特に意図していなかったのだが、サイトをフルビルドしたときのパフォーマンスも 0.8 秒ほど改善した (2.2 秒 → 1.4 秒)。
+ </p>
+ </section>
+ <section id="section--outro">
+ <h2><a href="#section--outro">おわりに</a></h2>
+ <p>
+ ということで次の式年遷宮まではこのジェネレータでやっていくことにする。
+ </p>
+ </section>
+ </div>
+ </article>
+ </main>
+ <footer class="footer">
+ &copy; 2021 nsfisis
+ </footer>
+ </body>
+</html>