FluentdのPluginを書こうかなと思って公式HPのプラグイン作成を解説しているページを見たところ、サンプルコード内の日本語が文字化けしてた。
プラグインを書く | Fluentd(現在はPR出して修正済み)
どうも調べてみると、Herokuの上でCodeRayを使うと文字化けしてしまうらしい。
Herokuにデプロイすると、CodeRayでソースコードの日本語が文字化けする - SKKTM Lab Blog
ぐぐってみても日本語で直し方を書いてる人がいなかったので、調べて直してみたのでそのメモ。
ちなみに先に結論だけ述べておくと
- .buildpacksにRubyとlibxml2のbuildpackのURLを記載
- Gemfile.lockのnokogiriを1.6以上にする
- HerokuのConfigにBUILDPACK_URLにheroku-buildpack-multiを指定
- デプロイ
やり方はPRを見ていただければ何となくわかると思う。
で、調べてから結論に至るまでは以下のとおり。
- CodeRayのソースコードを読む
coderay/lib/coderay at master · rubychan/coderay · GitHub
しかしどうもCodeRayが原因じゃないので別の原因を調べてみる - rack-codehighligherを調べる
wbzyl/rack-codehighlighter · GitHub
fluentd-docの中でCoderayが直接呼ばれてるような形跡がなかったので調べてみたところ、rack-codehighligerが関係していたので、Mac上のローカル環境でデバッグするも再現しないのでHeroku上でデバッグ。
すごい時間がかかったがどうやら中でNokogiriがパースしてるところで文字化けが起きてる模様
- Nokogiriとlibxml2を調べる
Nokogiriのバグっぽいということで追いかけていったが最終的にlibxml2に渡して帰ってきたらバグってることまでは突き止めたので同じ事例がないか調べてみたところこちらでヒット
ruby on rails - Nokogiri adds characters during parsing on Heroku - Stack Overflow
原因はHerokuのlibxml2がバグのあるバージョンを使っていることらしい。 - Nokogiriのバージョンを上げる
Fluentd-docはNokogiriの1.5が使われていたが、1.6にするとNokogiriのインストール時にlibxml2を独自にビルドして使うことができるようになったのでbundle update nokogiriをして解決!
・・・と思ったらHeroku上でlibxml2がビルドされた形跡がなく問題解決に至らず - buildpackでlibxml2をバージョンアップ
buildpackをつかえばlibxml2のバージョンがあげられるということでやってみた。
・・・アプリが動かなくなったのでこれもボツ - heroku-buidpack-multiを利用してRubyとlibxml2を導入してnokogiriをバージョンアップ
PaaSといえば個人的にはこの人ということで@jacopenさんに相談したところ、libxml2を入れただけだとRubyが動かないのでbuildpack-multiでRubyとlibxml2を入れないとダメと教えていただいたのでその通りやってみたらようやくサンプルコードの日本語の文字化けが治った。
というわけで、1日ぐらいかかったけど問題も無事に解決できてPRをだしてマージ してもらって問題解決に貢献できた。
そしてこれを記事にしておいたので今後ググればこの記事がヒットして問題解決につながればと思う次第。
Herokuさんlibxml2のバージョン上げませんかね・・・?