2020-07-09
ブログをNextjsベースに変更しました

もともとUnteiという自作の静的サイト生成器を使っていましたが、ブログをNextjsベースに移行しました。CSSなどまだ以降しきってないので以前とだいぶ変わったものになっていますが、これはこれで気に入っています。

なぜ変更したのか:技術編

もともとは自作の静的サイト生成器(Untei)を使っていました。TypeScriptでパーサ部を実装してのこりをPythonで生成する、という構成になっていましたが、これを頑張って保守し続けてもなかなか能力の向上に繋がらないという印象がありました。というのは、Unteiは残念ながら使っている人がおそらく世界に僕1人だけなので、これを使いこなしてもその能力に何かしら価値がうまれる見込みはないです。

今回の変更ではNextjs + Reactjs + TypeScriptに変更しました。Nextjsは静的サイト生成器として世界中で広く使われているうえ、Vercelという企業が提供している静的ホスティング機能が強力にサポートしているのでずっと実用的です。また以前からウェブサイトを細分化したコンポーネント型付きで管理できるReactjs + TypeScriptの組み合わせには魅力を感じており、練習の機会を探していたので、能力向上のうえでもいい機会になりました。

なぜ変更したのが:ブログへの要求編

Markdownの文法は意外と複雑です。だいたいあっている物を作るだけならけっこう簡単なんですが、いくつかの境界的なケースに対応するパーサを自分で書くのはけっこう骨の折れる作業ですし、文法もぐちゃぐちゃしてきて自分で保守性の高い書き方をするのが厳しくなってきました。とくに部分的な変更をHTMLで表現したいときに、そのHTML自体が結構複雑であり、自分がブログに載せる情報を広げようとするとここがネックになってきました。

実は今回の変更で一部の独自の文法を諦めており、現在それを使っている過去記事では表示が思うようなものにはなっていません。たとえば、数学的な概念の定義を以下のように書くといい感じに囲って続きの本文と明確に区別する機能がありました。

def. 劣モジュラ関数
    $f: \mathbb{Z}^K \to \mathbb{R}$が劣モジュラである
    $\Leftrightarrow$ すべての$x,y \in \mathbb{Z}^K$について
    $$f(x) + f(y) \geq f(x\land y) + f(x\lor y)$$
    ただし
    $$x\land y = (\min(x_1, y_1), \min(x_2, y_2), \cdots, \min(x_k, y_k))$$
    $$x\lor  y = (\max(x_1, y_1), \max(x_2, y_2), \cdots, \max(x_k, y_k))$$

ただこの部分はそれほど複雑ではないので、その部分だけ検出してHTMLか何かに置き換えるパーサをあとで自作して追加するほうが、膨大な境界ケースにこれからずっと対応していくよりもずっと簡単になるだろうという判断です。また、「この独自機能をもっているが全体としてはもともとうまくできているパーサの劣化版」を自分でつくって提供するよりも、一機能に特化したパーサをつくって提供するほうが、技術者の共同体全体の生態系としても有用で豊かなものになります。

変更に伴って

これまではもともとあったファイルを配信しているだけで、閲覧のために以下のように記事のあるHTMLファイルをそのままリクエストしてもらう必要がありました。

https://hara-yuki.com/中国語には動詞と形容詞の区別がないかもしれない.html

新URLでは以下のように少し一般化されたものに変更しました。そのため、もし特定の記事にリンクを貼っていたりブックマークしてくださっている場合は必要に応じて対応お願いします。

https://hara-yuki.com/post/中国語には動詞と形容詞の区別がないかもしれない