---
title: ブログエンジンを自作した
description: 静的サイトジェネレータ flxble を自作して，ウェブサイトをそれに移行した
date: !!timestamp 2019-01-16T10:41:45.6672030+09:00
category: Programming
tags: ["F#"]
---

注: ウェブサイトを SvelteKit に移行したため，2025年現在は自作ブログエンジンを使っていません……

------

静的サイトジェネレータ [flxble](https://github.com/cannorin/flxble) を自作して，ウェブサイトをそれに移行した．

Markdown プロセッサは [Markdig](https://github.com/lunet-io/markdig) を使い，それ以外はテンプレートエンジンも含めて全て F# で自作した．

現在 1000 記事あるテスト用のブログを全部レンダリングしてタグや月別アーカイブ，RSS まで生成するのに合計 1.7 秒ほどしかかからないので，
Hugo ほどではないが十分高速なブログエンジンの部類に入るだろう．

他の多くのテンプレートエンジンと違ってわたしの自作したテンプレートエンジンは内部で mutable state を使っていないので[^immutable]，自動的にスレッドセーフになっている．

[^immutable]: F# の標準ライブラリの `List` や `Map` はすべて immutable なので，何も考えてなくても勝手にスレッドセーフになる．ここらへんは ML 系言語の面目躍如ではないだろうか．

そのお陰で安全に並列化できるのだが，並列化しなくても既存の end-user[^end-user] .NET テンプレートエンジンの中で[おそらく最速](https://github.com/cannorin/flxble/wiki/Flxble.Templating:-Benchmarks)になってしまった．

[^end-user]: 独自のスクリプト言語を採用しているなどの理由で任意コードの実行ができず，エンドユーザに使わせても安全なもの．Razor は無制限で C# を使えるのでこの枠には入らない．

せっかくなので Hugo にも勝ちたいが，プロファイラにかけたところ，実行時間のほどんどを Markdig の Markdown パーシング・レンダリングが占めていたので，
自分で書いた部分をいくら弄ってもこれ以上速くなる望みがあまりないことがわかった．

さすがに Markdown 処理系を自作したくはない．
