article-data-structure-design

記事データの設計

ブログエンジンを作るにあたり、記事データをどのように作り、管理するかを決めます。記事のマークアップ言語は Markdown にしようと思います。特別な Wiki 文法のようなものを独自に考案するのも面白いですが、Markdown を採用するメリットは次のようにたくさんあります。

  • 既存エディタで上手く扱える
    • 自作ブログエンジンの初期バージョンには記事エディタを付けないので、ローカルでの編集性が高い方が良いでしょう。
  • 自作ブログ以外でも生かせる
    • Markdown で記事を書いておけば、自作ブログ以外でも活用できる可能性が高いです。やっぱり自作ブログはやめてはてなブログに移転しよう、とか。

uchan は数日前に Obsidian1 という Markdown エディタを知りました。直感的に良さを感じ、今、それを使ってこの記事を書いています。Obsidian はエディタというより、PKM(Personal Knowledge Management)と呼ばれる種類のツールだそうです。複数の Markdown 記事、あるいは記事中の段落単位でリンクでき、知識のデータベースを構築できます。手元に Wiki があるようなものです。

ということで、自作ブログは当面、Obsidian が上手く表示できるような記事に対応すべく開発する方針です。大枠は Markdown ですが、Obsidian 独自の細かい仕様があるので、そこに対応する必要があります。主なものを紹介します。

  • 内部リンク: [[記事名]] と書くと内部リンクとなり、当ブログ内の Markdown 記事へのリンクを張れます。
  • 脚注: [^1][^name] という形式で脚注(フットノート)へリンクします。

内部リンクは記事同士を有機的に接続する方法なので取り入れていきたいです。脚注は uchan がはてなブログで記事を書いていて便利だなと思う機能なので、自作ブログでも是非使いたいです。

この他、Scrapbox の 2 ホップリンクは取り入れてみたい機能のひとつです。2 ホップリンクは、2 つの記事が同じリンクを設定していた場合に、片方の記事から他方の記事をたどれるようにする機能です。例えば「OS」という記事と「CPU」という記事があるとします。その両方が「メモリ」へリンクしていたとき、「OS」ページに「CPU」へのリンクを表示します。たとえ「OS」ページに「CPU」へ直接のリンクが無いとしても。

ファイル名と連番

Markdown のファイル名をどうするかを決めておかないといけません。当初は「整数.md」という形式にしようと思っていました。そして、記事のタイトルは、記事中の最初に現れる # タイトル の部分を採用するのです。ブログエンジンの引数に、日本語を URL エンコードした長ったらしい文字列2が来るのが嫌なので、記事の ID は整数の連番にしたいです。だから、ファイル名を整数にしておけば、ブログエンジン内部で記事を探し出す作業がとても楽です。

しかし、Obsidian との連携に難がありました。Obsidian で内部リンク [[記事名]] を使おうと思うと、記事名にはファイル名を書く必要があるのです。ファイル名を整数としてしまうと、文中に「13 によれば」というようになってしまいます。

もちろん、ブログエンジン内部で 13 を H1 要素で置き換えるようにはできます。ブログ閲覧者に「美味しい飲食店の探し方 によれば」と表示することも可能です。しかし、uchan が Obsidian を用いて記事を書いている間は困ることになります。手元でもきちんとしたリンク表現になっていると嬉しいです。

そこで、ファイル名には記事タイトルを付けるようにし、連番から記事タイトルを引くための表をブログエンジン側で持つことにしました。ブログエンジンは、連番によって記事をリクエストされたとき、その表を使うことで正しくファイルを取得できるという仕組みです。これで、ブログの訪問者は連番によるすっきりした URL を見ることになります。

Rust の学習

ブログエンジンは CGI として作ろうと思っています。今どき CGI は無いだろう、と思う方が多いかもしれません。ごもっともだと思います。今どきはウェブサーバ全体を作ってしまうのが流行です。CGI なんて大量のアクセスを捌くのには適さないし、URL の設計の自由度がありません。

でも CGI には良いところもあるんです。ウェブサーバ全体を作る方式では、ルート権限がある VPS などをレンタルするのが普通だと思いますが、そうするとサーバ管理の仕事が発生します。CGI であれば、昔ながらのウェブホスティングサービスで十分です。また、CGI は環境変数と標準入出力さえ扱えれば作れるため、簡単です。Rust は学び始めたばかりなので、Rust でネットワーク処理を書くのはまだちょっと難しいだろうと思いました。

CGI を Rust で書くにあたり、まずは Rust をきちんと勉強しようと思いました。自作ブログ始めました で書いた通り、Rust 製の OS を読む会のために Rust を勉強したいという事情もあり、ちょっと真面目に取り組むことにしました。

Rust の勉強には プログラミングRust 第2版 を選びました。現在までに読んだのは 1 章~ 11 章、15 章~ 17 章の一部です。全部で 23 章あるのですが、全部読むまでブログエンジンを作り始められないのも退屈ですので、このあたりで作り始めてみようかなと。

と書きつつ、実際のコードを書く前にこの記事を書いているわけですが。ブログシステム自体があっても記事が無いとつまらないですからね。いい加減作り始めたいですけども。

フロントマター

フロントマター(frontmatter)は記事にメタデータを付与する方法です。現在普及している方法は、Markdown ファイルの先頭に 2 行の --- で囲んだ場所を作り、その中に YAML でメタデータを記述する方法です。例えば、この記事の先頭には次のようなフロントマターが記述されています。

---
number: 2
created: 2022-05-07T23:05:34+09:00
tags: [ソフトウェア, Rust, CGI, ブログエンジン]
author: "@uchan_nos"
---

フロントマターを採用することにより、記事のメタデータ(作成日時や著者名など)を別のファイル、あるいはデータベースに記載する必要がなくなります。記事本体にメタデータが付随することで、不整合が起きて対応関係が取れなくなることがありません。また、プレーンテキストとしても扱えるため、記事ファイルのポータビリティが高まります。

ブログエンジンによって記事を表示する際、フロントマターはそのまま文字列として表示するのではなく、適切な HTML タグに変換するなどして利用するつもりです。


  • [1]: 読み方は「オブシディアン」らしい
  • [2]: 例えば Wikipedia の「ユナイテッド航空232便不時着事故」という記事はこれです。 https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%8A%E3%82%A4%E3%83%86%E3%83%83%E3%83%89%E8%88%AA%E7%A9%BA232%E4%BE%BF%E4%B8%8D%E6%99%82%E7%9D%80%E4%BA%8B%E6%95%85 これなら、まだ Git のコミット ID の方がマシじゃないでしょうか。桁数的に。

作成:2022-06-04 22:10:12

最終更新:2022-07-05 14:21:37