とんちゃんといっしょ

Cloudに関する技術とか日常とかについて書いたり書かなかったり

Herokuでの文字化けを直してみた

FluentdのPluginを書こうかなと思って公式HPのプラグイン作成を解説しているページを見たところ、サンプルコード内の日本語が文字化けしてた。

 

プラグインを書く | Fluentd(現在はPR出して修正済み)

 

どうも調べてみると、Herokuの上でCodeRayを使うと文字化けしてしまうらしい。

 

Herokuにデプロイすると、CodeRayでソースコードの日本語が文字化けする - SKKTM Lab Blog

 

ぐぐってみても日本語で直し方を書いてる人がいなかったので、調べて直してみたのでそのメモ。

 

ちなみに先に結論だけ述べておくと

  1. .buildpacksにRubyとlibxml2のbuildpackのURLを記載
  2. Gemfile.lockのnokogiriを1.6以上にする
  3. HerokuのConfigにBUILDPACK_URLにheroku-buildpack-multiを指定
  4. デプロイ

やり方はPRを見ていただければ何となくわかると思う。

update libxml2 and nokogiri to fix japanese comment rendering on heroku by Mahito · Pull Request #119 · fluent/fluentd-docs · GitHub

 

で、調べてから結論に至るまでは以下のとおり。

 

  1. CodeRayのソースコードを読む

    coderay/lib/coderay at master · rubychan/coderay · GitHub

    しかしどうもCodeRayが原因じゃないので別の原因を調べてみる

  2. rack-codehighligherを調べる

    wbzyl/rack-codehighlighter · GitHub

    fluentd-docの中でCoderayが直接呼ばれてるような形跡がなかったので調べてみたところ、rack-codehighligerが関係していたので、Mac上のローカル環境でデバッグするも再現しないのでHeroku上でデバッグ
    すごい時間がかかったがどうやら中でNokogiriがパースしてるところで文字化けが起きてる模様

    https://github.com/wbzyl/rack-codehighlighter/blob/64bf50520cb1d563432832ae30d85bbd94cec5bd/lib/rack/codehighlighter.rb#L40

  3. Nokogiriとlibxml2を調べる
    Nokogiriのバグっぽいということで追いかけていったが最終的にlibxml2に渡して帰ってきたらバグってることまでは突き止めたので同じ事例がないか調べてみたところこちらでヒット

    ruby on rails - Nokogiri adds characters during parsing on Heroku - Stack Overflow

    原因はHerokuのlibxml2がバグのあるバージョンを使っていることらしい。

  4. Nokogiriのバージョンを上げる
    Fluentd-docはNokogiriの1.5が使われていたが、1.6にするとNokogiriのインストール時にlibxml2を独自にビルドして使うことができるようになったのでbundle update nokogiriをして解決!
    ・・・と思ったらHeroku上でlibxml2がビルドされた形跡がなく問題解決に至らず

  5. buildpackでlibxml2をバージョンアップ
    buildpackをつかえばlibxml2のバージョンがあげられるということでやってみた。
    ・・・アプリが動かなくなったのでこれもボツ

  6. heroku-buidpack-multiを利用してRubyとlibxml2を導入してnokogiriをバージョンアップ
    PaaSといえば個人的にはこの人ということで@jacopenさんに相談したところ、libxml2を入れただけだとRubyが動かないのでbuildpack-multiでRubyとlibxml2を入れないとダメと教えていただいたのでその通りやってみたらようやくサンプルコードの日本語の文字化けが治った。

というわけで、1日ぐらいかかったけど問題も無事に解決できてPRをだしてマージ してもらって問題解決に貢献できた。

そしてこれを記事にしておいたので今後ググればこの記事がヒットして問題解決につながればと思う次第。

 

Herokuさんlibxml2のバージョン上げませんかね・・・?