happy mergings about middleman-blog

middleman-blogに関連するいくつかのプルリクを送ったという話。ちょっとした問題を解決しようとしたら予想外にいろいろと引っかかったので覚え書きをしておく。実用的な情報はあまりない。

フィードが見つからない

r7kamura blogをフィードリーダーに登録しようとしたが、フィードが見つからなかった。

このサイトはMiddlemanを使って生成していて、GitHub Pagesを使って公開している。Middlemanを利用したブログサイトで、フィードは用意してしてもリンクを貼り忘れるというケースは時々あるようで、以前にもオートディスカバリーを追加するプルリクを送ったことがあった。GitHubのリポジトリをざっと眺めてみると、/feed.xmlがあるのが確認できた。よかったよかった。

フィードが壊れている

ところが、http://r7kamura.github.io/feed.xmlにアクセスしてみると、フィードのタイトルが”Blog Name”になっていて、何かおかしい。よく見ると記事のURLのホスト名もhttp://blog.url.com/になっている。フィードの設定がデフォルトのままになっているらしい。これでは読者である自分が困る、ということでfeed.xmlを修正するコミットをしてプルリクを出すことにした。

上記のコミットを見てもらえば分かるように、feed.xmlの実体はただのテンプレートだから簡単に書き換えることができる。ただ、site_urlという変数にホスト名を入れるという仕組みが気になった。これではブログのホストが変わるたびにフィードのテンプレートを書き換えないといけない。ホスト名抜きのURL(http://example.com/fooではなく/fooと指定するようなURL)ではいけないのだろうかと思って調べてみたが、Atomのentry要素のidプロパティは省略不可で、内容は完全なURLでなければいけないと定められているのでどうしようもない(参照:RFC 4287 - The Atom Syndication Format, Make feed.xml entry URLs absolute by rmm5t · Pull Request #130 · middleman/middleman-blog)。とりあえず、サイト名や著者名などがconfig.rbで定義されていたので、ドメイン名もそちらに書くように変更しておいた。

オートディスカバリーを追加する

ついでにオートディスカバリーも追加するプルリクを書こうとしたのだが、Middlemanにはブログを作るための拡張機能があるので、これを使えば簡単に雛形を生成できるという一文が気になった。middleman-blogの雛形を確認してみると、feed.xmlはあったが、オートディスカバリーはなかった。

そのまま/feed.xmlとURLを指定するよりスマートなやり方があるのではないかと思って、Sitemapとかasset_pathメソッドの実装とかをいろいろ調べた結果、結局URLを直接書くのがよさそうだということになった。pryでメソッドを呼び出したり変数を確認したりしつつshow-methodでメソッドのコードを確認していくのが楽でよかった。

Middlemanが壊れた?

Middlemanをサーバーモードで動かしているとき、http://0.0.0.0:4567/__middleman/にアクセスするとSitemapや設定がきれいに表示されて便利なのだが、気がついたらSitemapや設定一覧にアクセスできなくなってしまった。スタイルシートもなぜか当たっていない。設定を変更しても、これまでのコミットをリバートしても、新しいテンプレートを作っても動かない。関連しそうなGemを入れなおしてみるが改善されない。

一時間以上悩んだ気がするけど、原因は単純で、http://0.0.0.0:4567/__middlemanではなくhttp://0.0.0.0:4567/__middleman/を開かないといけないのだった。末尾の/が抜けていてもそのままページは表示されるのだが、ページ内のリソースやリンクはすべて相対URLで指定されていたので、たとえば本来なら/__middleman/configを読み込むべきところで/configを読み込んでしまう。

テストに失敗

気を取り直してmiddleman-blogのほうにAdd autodiscovery of feed.xml to layout.erbという変更を入れてから、念のためbundle exec rake testでテストを実行してみるとなぜか失敗した。調べてみると、もともとmiddlemanのほうに一時的にバグがあったらしい。以下のプルリクとコミットを参照。

必要なファイルをうっかり消していたのでrequireでエラーが出たという単純なバグ。上記のコミットによって修正されている。

bundle installに失敗

middlemanのバグを手元で修正してテストを走らせるべくbundle installを実行してみるとdebuggerというgemのインストールに失敗した。ruby2.1.0-preview1で実行していたのだが、「2.1は対応していないバージョンです」という感じのメッセージが出てインストールが強制的に終了してしまう。そもそもプルリクを出すときにpreview版を使っていたのがよくなかった。

rbenvで2.0系のリリース版を入れる。gemをインストールしなおすのが面倒なのでとりあえず2.1.0-preview1のgemsにシンボリックリンクを貼って動かしてみたが、確かffiが「なんとかかんとか.soファイルが見つからないです」という感じのエラーを出したのでくじけて寝た。

プルリクを送る

当初の目的からずいぶん離れてしまったので、とにかくfeed.xmlを修正するプルリクを送った。descriptionを書き足すために編集画面を開こうとしたらすでにマージされていて、その後もいくつかプルリクを送ったら即座にマージされるという感じでテンションが上がったので、middleman/middleman-blogにもエイヤッとAdd autodiscovery of feed.xml to layout.erbを送ったら、こちらもさくっとマージしてもらえた。

その後

フィードリーダーを開いたらhappyな記事が流れてきた。