blob: 905cf5b56a52b86d1e59eb99180a285178d3e4ff (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
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="© 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=81dfc0b483beda175e3e17562faac7c9">
</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-site-generator-2026.md" rel="noreferrer" target="_blank">https://blog.nsfisis.dev/posts/2026-02-01/rewrite-this-site-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">
© 2021 nsfisis
</footer>
</body>
</html>
|