Skipt to main content

Jekyllで記事を書き始めるためのRakeタスク

permalink

OctopressからJekyllにしてちょっとだけ困ったのが記事の書き始め。

Octopressには雛型っぽいものを作ってくれるRakeタスクがあった。Rakeの[〜]記法を使わなければならないのはいまいちだったが、なくなってみると困るものだ。そういうわけで、Octopressで不満だったところを自分なりの解消しつつ、なんとなくそれらしい感じに動くJekyll向けのタスクを書いてみた。(たぶんOctopressでも使えると思う。)

コード

まず新しく記事を書き始める手順。

% rake new

環境変数EDITORに従ってエディタが起動する。frontmatterのdateには現在の日時が入っている。layoutcommentsなど、基本的に決め打ちなので変更したければタスクをいじること。カテゴリやタグをいくつかに絞っているなら最込から列挙しておくとよいかも。

_filename_という見慣れないフィールドがあるが、これは_postsにファイルを保存する際、ファイル名として使う文字列を記述するために独自に使用しているもの。これとdateの内容からファイル名を構成する。

_filename_がなかったり、空だったり、初期状態のままだったりしたら無視される。そういうときにはdatetitleからファイル名を構成する。

なお、_filename_はこのためだけに勝手に使っている。ファイル名を構成したあとは用なしになるので、記事ファイルを_postsに保存すタイミングで削除される。

記事を書き終えたら公開するが、公開して、その直後に直しが入るなんてことはよくある。最後に編集した記事ファイルをもう一度開くタスクを用意した。

% rake last

mtimeが最も新しいものを選んでエディタを起動する。更新日時ではなく、ファイル名に含まれる日付が最も新しい記事ファイルを開くには次のタスクを使う。

% rake latest

frontmatterのdateまでは見ていなくて、あくまでファイル名から判断している。

重要なこと

rake newしてエディタを終了させたとき、何らかの理由でファイルの移動ができない状況になることがあるかもしれない。できる限り記事の中身を残すようにしたつもりだが、抜けがあるかもしれないので注意すること。

あと、変なバグでコケるとかあるかも。

様子をみながら使ってください。

Rubyのエンコーディングとファイル名

permalink

昨日のまとめ。

  • ファイルを操作するスクリプトを書いたら身に覚えのないinvalid byte sequenceをくらった
  • てっきりファイル名がへんなファイルのせいだと思っていたらコマンドライン引数で変なバイト列をくわせていたからだった
  • ARGVをいじくってうまく避けるしかないのかな

そう、ファイル名の問題ではなかった。だが、そうだとしてもファイルを扱う以上はファイル名にも同じように気を付けなければならい。そんなことを書いた後でこう思った。でもコマンドライン引数と違って、ファイル名ならEncoding.default_externalに従って扱えるよね? あれ?

Rubyのエンコーディングとコマンドライン引数

permalink

Ruby 1.9.3以降、ファイル名の扱いでひっかかりポイントがあったんだよな。なんだったっけ?

と、ここしばらく、頭の片すみにモヤモヤが居座っていた。ついさっき、どういうことだったかを思い出せた。

最初にひっかかったのはファイルを操作するスクリプトだった。ファイル名にまつわるところに何かある、と勘違いしてしまっていたのはそのせいだろう。しかしきちんと思い出してみると、ファイル名ではなくコマンドライン引数のエンコーディングにより生じる問題だった。ファイル名のほうを適当に直すという場当たり対処をついついしてしまったのも勘違いを深める要因だったかもしれない。

agをwheezyで使う

permalink

ackよりもagというのをどこかで見て、ag使ってみるか〜と思ったらwheezyにはまだきてなかった。

やはりsidに、と心動かされるが少しがまんして、手製backportパッケージを作ることにした。

といってもこういう小さなツールはそれほど手間をかけなくてもすむことが多い。おおまかな手順を以下に。

$ apt-get source silversearcher-ag
$ sudo aptitude builde-dep silversearcher-ag
$ cd silversearcher-ag-0.18.1+20131108
$ dch --bpo

いまどきはbpo向けバージョンにするのも簡単なんだなと思ったのだが、新規追加はsqueezeにしか対応していなかった。squeeze-backportsのための記述が入っているので、一行目のbpo60bpo70に、一行目と三行目のsqueezewheezyに書き換えておく。

silversearcher-ag (0.18.1+20131108-1~bpo70+1) wheezy-backports; urgency=low

  * Rebuild for wheezy-backports.

 -- akira yamada <akira@debian.org>  Sun, 08 Dec 2013 08:46:33 +0900

そしてパッケージの構築。

$ vim debhan/changelog
$ debuid -uc -us -sa -v0.18.1+20131108-1

パッケージのバージョン付け(changelogに加えた変更)やdebuilldの-vオプションはDebian backports contributeに従ったもの。

一般的なDebianパッケージ作成ではDebian policyに従っておくことで広い範囲で利用可能な品質になる。backportパッケージにもそのような慣習があるので、やはり従っておいたほうがよい。とりわけ、バージョンの付け方には注意しておく。

ともあれ、以上でもといたディレクトリにパッケージができているはず。パッケージの内容を確認(dpkg-deb -C)するなどした上でインストールして、動作を確認する。

$ sudo dpkg -i ../silversearcher-ag_0.18.1+20131108-1\~bpo70+1_amd64.deb
$ ag bpo
debian/files
1:silversearcher-ag_0.18.1+20131108-1~bpo70+1_amd64.deb utils extra

debian/changelog
1:silversearcher-ag (0.18.1+20131108-1~bpo70+1) wheezy-backports; urgency=low

debian/silversearcher-ag/DEBIAN/control
2:Version: 0.18.1+20131108-1~bpo70+1