Movable TypeからOctopressへの移行

2014年11月30日から、Blogの見栄えががらっと変えたのだが、実際のところCMSツールを完全に入れ替えて環境を移行した。
今回の移行の背景は大きくまとめると、

  • Movable Type Open Source(MTOS)の終了
  • MySQLとMariaDBの選択のなやみ(Oracle嫌いなんで)
  • MySQLのアップデート作業のめんどくささ(はっきり言って、ブログの記事更新よりDBのアップデートを頻繁にやっている本末転倒なことになってる。)
  • Movable Typeを維持するための種々のライブラリのアップデート、特にImageMagick
    となる。やはり記事数が1000個くらいでも、静的生成をしているならファイル単位での記事管理で十分だし、扱っている物が単純なテキストファイルであれば、種々のスクリプト言語を駆使していけば、適当にやっていけるだろうと。
    まあMTOSが終了したのは2013年7月なので、変えようと思い始めて1年以上経っているのだが、適切な移行先をなかなか見つけられないというか、ただ単に本業が忙しくて放置していただけで忘れていたのである。最近、一時は見捨てられた感があった静的生成ツールが復活したようで、いろんなツールが出回っている。メタ情報をYAMLで文書の先頭に付け、本体はプレーンテキスト・HTML片・Markdown・Emacs Orgなどで書くスタイルが一般的なようで、選べるツールは調べると気が遠くなるくらいありそう。(自分で実装できそうな気もするが・・・)
    ということで、前振りが長くなったが、今回は最近流行の静的生成ツールの中では割と出回っているOctopressを用いることにする。(他のツールと比べたが、ちとできることが古い気はするけれど。) Blogツール移行後の第1弾のネタは、Blogツールの移行自体を扱うこととしよう。

今回のツールの移行は、運用上放置していて不満に思っていた案件の解決も行ったので、ほぼ最終的な物と言える。これまでの日記・Blogシステムの履歴は以下の通りである。

  • 2001年5月〜2006年7月までは、広瀬雄二氏作のmkdiaryで静的生成
  • 2006年8月〜2006年11月までは、tDiaryを使用
  • 2007年以降は以下の2本立てであった。
    • 2006年以前の記事は1記事ごとにHTML片に変換し、bloxsomでRead-onlyで表示
    • 2007年1月から記事はMovableType4〜MTOS5.2で作成+公開
      今回の方針は
  • bloxsomに食わせていたHTML片
    1. もともとメタ情報付きのテキストファイルで本文がHTML
    2. Pythonのライブラリのhtml2textで本文部分をMarkdownに変換
    3. メタ情報はsh+sed+awkで適当にYAMLに変換して出力
  • MTOSで生成していた記事
    1. 本文内はMTタグがあるものの、本文はHTML
    2. 必要なメタ情報を付け加えて、HTML片を出力するテンプレートを書いて記事静的生成
    3. Meta情報とコンテンツに分割し、コンテンツをPandocでHTML片からGithub flavored markdownに変換。Meta情報をくっつけて再出力。
      とした。pandocを最初から使えばhtml2textいらんかった。pandocはもの凄く便利。強くオススメしたい。(Haskell+happyというのは・・・予想以上のことができるのね。) まあこのサイトはFreeBSDで運営されていて、ちょっとHaskellを使えるようにしておくのが大変で手を出せないんです。(ghcはわたしが野良Buildできなくて、結構前のバージョンで更新が止まっている。)
      今回YAMLによるメタ情報+Markdownと言う形式にしたため、もともとほぼそのような処理をしていた前者の変換は非常に簡単。問題はMovable Typeからの移動であった。正攻法?でMovable Typeでexportし、そのファイルを適当にパースすれば良いのかと。ただそう思うのは簡単で、日曜プログラマ(こういう言い回しは死語だな・・・)な私にとって、ものすごくめんどくさい。良い方法ないか?と思ったら、海外のサイトで「How to Export From Movable Type to Octopress」という記事を発見した。要はこういうアーカイブ・テンプレートを作成する。
---
title: "<$mt:EntryTitle$>"
date: <$mt:EntryDate format="%Y-%m-%d %H:%M"$>
comments: false
categories: [<$mt:EntryCategory$>]
tags: [<MTEntryIfTagged><MTEntryTags glue=","><$MTTagName$></MTEntryTags></MTEntryIfTagged>]
keywords: [<$MTEntryKeywords$>]
---
<$mt:EntryBody convert_breaks="0" $>?
<MTIf tag="EntryMore">
%%%%%%
<$MTEntryMore convert_breaks="0" $>
</MTIf>

ファイル名は欲しい規則で出力できれば良く、最終的に

2014-12-14-title.markdown 

という名前で欲しいので、テンプレートオプションでentry mappingを作り

%y-%m-%d-%F.text 

あとは本文をMarkdownに変換し、上記の%%%%%%の箇所を「続きを読む」を表示するための文字列にsedで置換。ほとんどの作業をsh+sed+awkでやってしまった。この手の作業では単純なテキストの処理なので、sedとawkはやたら役に立った。
あとは一貫性を保つためのリンクの修正やら、自動処理でやりきれない雑多な修正をgrepを使いながら見つけて手で修正。(まあ全部うまくいかんわね。) あとはOctopressに食わせて、現在のサイトとなった。
今回一連の作業により、そこそこ手を掛けて全体的にMeta情報+Markdownなテキストファイルになった。ここまで作業しておけば、また似たような作業で、Movable Typeに戻りたくなっても(たぶんならない)、WordPressに行きたくなっても(たぶんならない)、インポートデータは作れるだろう。
まあさしておもしろくも何ともない作業であったが、今まで書きためた物が1つの方法で扱えるようになったのは非常に大きいし、今回の作業で、「ああー、あの頃はあんなことを考えていたな」などと振り返る良い機会であった。ただし、残念ではあるがMTOSを使っていた時に付けられていたコメントとトラックバックは、すべて破棄してしまった。まあコメントにしてもトラックバックにしてももう仕組み自体をローカルに準備するのは過去の遺物であろうと言うことで問題なしと考えている。実際SPAMコメント・SPAMトラックバックの管理もうんざりなのだ。もしご意見があればSNS経由でいただきたい。(ひょっとしたらコメント欄は付けるかもしれないが・・・)