• 作成日時:
  • 更新日時:

サイトのURL設計を変更しました

何故変更が必要なのか?

これまでこのサイトのエントリーはwww.ncaq.net/2017/11/07/のように,日付だけを含んでいました.

主にクールなURIは変わらない -- Style Guide for Online Hypertextを参考にした結果です.

これには問題があり,1日に複数のエントリーを投稿しようとしたら1つのページに複数の投稿が混ざってしまいます.

このサイトを作った当初は,興味深い特筆すべきことだけを記述していたので,1日に複数の投稿をすることは想定していませんでした.

しかし,だんだんこのブログは日記と化していき,1日のあったことをひたすらログしていったので,1日の記事に複数の項が含むことが多くなっていました.

これは非常に検索性が悪いですし,後から見返すのも大変です.

当初はこのサイトにも広告はありませんでしたし,自分の書き捨てる先みたいな扱いだったので,あまり可読性は気にしていませんでした.しかし,後から自分のメモを見返すことも多くなってきて,この状態だと参照性が非常に悪くて困っています.あと,広告を貼るようになって少し欲が出てきました.

なので,URL構造を変更することにしました.

既存のURLは変更しません

既存のURLは変更しないことにしました.

本来は複数のテーマを含む記事を分割して別のページにするのが良いのでしょう.しかし,過去の記事のURLを変えてしまうと,nginxのオートインデックスがあると言っても,リンクが切れてしまいます.また,複数のテーマを含む記事は大学が始まってからずっと書いてきたので,もう30記事ぐらいはあるので,切り分けるのがかなり面倒くさいです.

なので,過去のURLは変更しないことにしました.

現在,過去のURLを変更せずともサイト内で共存が出来ているというのも変更しない理由の1つです.

将来的に,年別,月別の記事一覧を表示するページを作りたくなってきたら,既存のURLが障害になってしまうので,変更したり分割作業を行うかもしれません.

新しいURLをどうするか

多くのサイトではURLをyear/month/day/title/のように,年月を書いた後に意味のある単語を載せています.

しかし,私はこれは嫌です.何故なら書く単語を決められないからです.例えば今回は何にすれば良い?url?今回はurlで良いんですが,日本語の概念を扱う時に困ります.ローカルのファイル名ですら,講義の名前を英訳する時に困っていると言うのに…

意味のある単語をURLに入れてしまうと,後で変えられなくて悩みます.

なので,year/month/day/number/として,その日の記事番号を末尾に貼り付けることにしました.

year/month/day/hour/minute/second/は流石に時間まで正直に入れるのは難しいですし,その日の記事の順序分けがあとからやるのが出来ないので没になりました.

はてなブログのように記事内で一意の連番を入れる選択肢もありましたが,既存の記事が分割されるかもしれないので,昔の記事の総数がわからないので,その手段は取れません.

最初から記事のURLが単なる数値のみになっていれば,悩むこともありませんでした.ファイル名は単なる数値にして,URLはentry/1/のようにして,書いた日時はファイル名から取らずに,markdownのyamlのブロックにdateとして埋め込めば良かったですね.

新しく静的サイトでブログを作ろうとする人は注意してください,ファイルとURLは連番の数値にしておいた方が良いです.

もし新しく仕事とかで新規にサイトを作ることがあれば,日時などを含まずに番号だけにすると思います.

昔はURLから内容が推測できることが重要でしたが,今はGoogleのクローラも賢いですし,Open Graph APIもあるので,あまり意味のある単語をURLに入れる意味はないと思います.

新しいファイル名を作成するEmacs Lisp関数を書きました

その日の連番を目で見て作成するのは面倒なので,その日に合わせた新しいファイル名を生成するEmacs Lisp関数を作りました.

(defun open-entry ()
  (interactive)
  (cl-flet ((entry-path (number)
                        (concat
                         "~/Desktop/www.ncaq.net/entry/"
                         (format-time-string "%Y-%m-%d" (current-time)) "-"
                         (number-to-string number) ".md")))
    (let ((n 1))
      (while (file-exists-p (entry-path n))
        (setq n (1+ n)))
      (find-file (entry-path n)))))

これは~/Desktop/www.ncaq.net/entry/以下に今日の日付をプレフィクスとして1を最小とした一番小さい連番のファイル名のバッファを開きます.

こういうのを書くならファイル名を2017-11-07のようにハイフンで区切らずにディレクトリで区切っても良かったのでは?ディレクトリで区切ればその場所に直接ファイルを置いてHakyllを使わずにPandoc単体でも変換できますし…と思いましたが,ディレクトリが深い場所にファイルを置くのは面倒なので,これはこれで良いので問題ないです.

そもそも,理想の形態は数値だけなので,ディレクトリを深く掘るのはバッドノウハウですね.

やっぱり時分秒にすることにしました

一回,日の連番で公開して,やっぱり時分秒をURLに入れるのが良さそうだと思って変更しました.

時分秒のメリット

  • 一貫している
  • 情報量が多い
  • 自動的に定まる

日の連番のメリット

  • URLが短い
  • 書き始めから公開するのに時間が空いている記事のファイル名を付けるのが楽
  • 後から既存の記事を分割する時に楽

やはり,私は一貫していることを大事にしたいです.

日の連番のメリットは少ないです.後から記事を公開する時も,少しファイル名を考えれば済む話ですね.

ファイル名に連番ではなく時刻を入れるという行為を最初にやってしまって,URLを変える予定がない以上,最後までやり通すべきだと判断しました.

後から記事を分割する時に困るかもしれないと思いましたが,仮として9時などを使えば良さそうですね

Emacs Lispスクリプトは以下のように変えました.

(defun open-ncaq-entry ()
  (interactive)
  (find-file (concat "~/Desktop/www.ncaq.net/entry/"
                     (format-time-string "%Y-%m-%d-%H-%M-%S" (current-time)) ".md"))**

問題は,今回は後から書き始めの時間をURLとしたので綺麗なURLになっているけれど,自動生成の場合そんな綺麗なURLにならないだろうという点ですね.

まあ,記事を寝かせた場合はその時は公開時をファイル名にするので,そこまで問題にはならなさそうです.

また,1秒に1記事以下という制限を設けているため,やはりこれは複数人が編集するサイトでは使える技ではありません.

最初から設計するなら素直に連番をファイル名に使います.

新規にサイトを作る人はURLに日時を入れるのはやめようね.