Last Modified:
ぼくのかんがえたさいきょうのCMS #CMS
概要
はてなダイアリー「辞めたい」キャンペーンで書いた不満点を解消するために、自作CMSを書いて2013年1月1日にこのサイトを立ち上げました。
ブログやダイアリーはどうも書きっぱなしになって情報が陳腐化してしまうので、自作CMSはウィキに近い感じにしてます。
システム的には、動的にMarkdown→HTML変換する感じ。 記事は自由なファイル名でGitリポジトリに1ファイル1エントリで置いてます。 そのファイルが最初にコミットされた日付(リポジトリに追加された日付)がエントリのURI(Permalink)になります。 git pushするとpost-update hookによってブログに反映されるようにしてます。
今はリモートリポジトリにDropboxを使っているんだけど、修正内容が分かるようにGitHubに公開予定。
普段はEmacs+markdown-modeで編集していて、Chrome+Markdown Preview Plus(バグ対応パッチは0.2.5で取り込んでもらえました)でリアルタイムプレビューを見られるようにしてます。
移動中はiPhoneでNocsを使って編集&プレビューしてます。この辺りのパッチやテクニックについては別記事に書きます。
実装
- お名前.comのVPS(KVM)2GBプラン
- nginx-1.2.6
- perl-5.16.3
- Slack-develop
WAFは最初は慣れたCatalyst使ってて、Dancerに乗り換えたりしたんだけど、
- コードの見た目がダサくなる
- 融通がきかない
- 複雑で改造が大変
- 依存モジュールが多い
という感じで嫌になった。
他のWAFもしっくり来るものが無かったので、Plackに薄いラッパーを被せるSlackというWAFを書いた。 Slackについての記事Plack based WAF "Slack"で書いてます(が記事がだいぶ古くなってます)。
DONE
これまでに実現したこと
- 独自ドメイン使用
- ちょっとシャレっ気を出してrobar.io取ろうとしたら高かったので断念
- キレイなURI
- Permalinkはエントリ作成日の/yyyy/mm/dd形式
- /blogを前置するかどうか悩んだけど、今作ってるのがブログなのかどうか良く分からんし、 結局wwwドメイン内には文書しか置かないので、冗長だろうということで/にした。
- シンプルな記法
- Markdown記法+Template-Toolkit(INCLUDEできるのがすこぶる便利!)
- JavaScriptを実行可能
- テキストエディタから更新可能
- 記事がファイルシステム上のテキストファイル
- grepやsedなどのツールを駆使できます
- デザインのカスタマイズが自由自在
- シェア機能
- Google+
- はてなブックマーク
- コメント機能
- はてなブックマーク(お粗末なので調整する)
- Disqus
TODO(自分用)
- 記事の修正差分を視覚的に分かりやすくする
- 記事IDを指定すると常に最新版が表示される
- ブクマ分散を防ぐために、リビジョン違いのURLを生成しない(=全てJavaScriptで処理する)
- 分かち書きしてdiffする
- JAI: ソーシャルコメントは、閲覧中リビジョンの日時までのものにフィルタリングする
- 細かい修正は表示しない
- TODOの仕組み再考
- 抽出方法:
$ for i in * ; do sed -n "/.*\[\(.\+\)\]\[TODO\].*/s,,$i: \1\n,p" $i ; done
- 抽出方法:
- Markdownの改良もしくは代替
- メタタグ
- 引用元情報付き引用
- include
- カテゴリ設定
- JAI: meta要素に入れる
- カテゴリはアイコン付き
- リンク切れの検出
- リンクタイトルの自動挿入
- キーワード自動リンク
- 文章中のCPANモジュールを自動リンクする
- JAI: カテゴリに応じて
- 記事中のPerlモジュールやバージョン言及のあるコマンドに対し、最新版が存在するかどうか表示する
- 外部リソース(主にGitHub)をinclude
- JAI: XPath
- 引用ソースの変更を検知して、訂正すべき記事が分かる。
- 無効なlocation.hashを削除する
- キャッシュする PC版とモバイル版が同一URIでも大丈夫なようにする
- タイトルに[2/ ]みたいなページ指示があったら自動リンク生成
- 予約ポスト。未来の日付は404にする。
- obsolete的なステータスを付けられるようにする(言及サービスが終了している場合などに)。回答受付中なども。JAI:タグで
- Text::SmartyPants対応
- css,jsを結合&圧縮
- 記事のアクティビティや完成度を表示