carrierwave (0.10.0)
mini_magick (3.8.1)
メモ書きです。
根っこが深くて大変でした。
FloatDomainError: Infinity が発生している理由
FloatDomainError: Infinity #1378
https://github.com/carrierwaveuploader/carrierwave/issues/1378
画像の大きさが0のときに飛んじゃいます。
だけど、問題になったのは、画像が十分な大きさ(縦横)を持っている時に発生したからです。
このissueでは、もっと説明的な例外を投げるべきだ!とおっしゃっています。その通りですね笑
::MiniMagick::Image
CarrierWaveでは::MiniMagick::Image
を通してImageMagickのコマンドを実行しているので、手打ちしてみるとこんな感じです。
image = ::MiniMagick::Image.new(current_path)
=> #<MiniMagick::Image:0x007fecdf008240
@path=
"/hogehoge/r100_9758679aaa3927799fb84f90740f0cb2e91f61a4c287e69bf949a7b65e7e1b7a.png",
@tempfile=nil>
image[:dimensions]
=> [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
情報が全くとれていません。
直打ちでidentify
すると、
identify /hogehoge/r100_9758679aaa3927799fb84f90740f0cb2e91f61a4c287e69bf949a7b65e7e1b7a.png
/hogehoge/r100_9758679aaa3927799fb84f90740f0cb2e91f61a4c287e69bf949a7b65e7e1b7a.png PNG 1436x320 1436x320+0+0 8-bit sRGB 543KB 0.000u 0:00.000
ちゃんとでますね。
さて、デバッガーで実行時のコンテキストから::MiniMagick::Image
のrun_command
を実行すると...
run_command( 'identify', '-format', MiniMagick::Utilities.windows? ? '"%w %h\n"' : '%w %h\n', path)
=> "sh: rvm_debug: line 1: syntax error: unexpected end of file\nsh: error importing function definition for `rvm_debug'\n1436 320\n"
RVMおまえか!!!!
コードの通りメソッドチェーンを実行すると確かに例の不思議な配列に。
run_command( 'identify', '-format', MiniMagick::Utilities.windows? ? '"%w %h\n"' : '%w %h\n', path).split("\n")[0].split.map { |v| v.to_i }
=> [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
いやこれ、このコードもひどいっしょ...
RVMがなぜこーなったかについては深堀りできていないんだけど、Shellshock関係あり?
ShellShock update issue temporarily affecting Slurm jobs and software modules
https://rc.fas.harvard.edu/shellshock-update-issue-temporarily-affecting-slurm-jobs-software-modules/
bashのパッチによって関数定義がどう変わるか、どうRVMに対して影響があるかは勉強してないので分かりません。
解決策
たまたま、MiniMagickが大幅リファクタリングをしていたみたいで、mini_magick
の4.0.0rc
でなおりました。
identify
の実行後の解析が悪いっちゃ悪いからね。
これまたもしbash
が原因だったとしたら、そのバージョンによって挙動変わるんでもう大変ですよ...