1. west2538

    Posted

    west2538
Changes in title
+【Rails 6.0】Active Storageの画像変換を高速&省メモリのVipsに換装
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,127 @@
+個人開発のWebアプリ**「[まちかどルート](https://machiroute.herokuapp.com/)」**を**Rails 6.0**にアップグレードしました。
+
+せっかくなのでRails 6.0の新機能に挑戦したときのメモです。
+
+# 高速&省メモリのVIPS
+
+Railsの画像アップローダーである**Active Storage**ですが、[公式のドキュメント](https://railsguides.jp/active_storage_overview.html)によると
+
+Rails 6.0では
+
+> デフォルトの画像プロセッサはMiniMagickですが、**Vipsも使えます。**
+
+とあります。
+
+ネットでVipsのことを調べてみると高速かつ省メモリとのこと。
+
+さっそく導入してみようと思いました。
+
+# Railsの設定
+
+公式ドキュメントのとおり、下記のGemを導入します。
+
+```ruby:Gemfile
+# gem 'mini_magick' # この行があったらコメントアウトもしくは削除
+gem 'image_processing', '~> 1.2' # この行を追加
+```
+`bundle install`したら、こんどは下記の行を追記します。
+
+```ruby:config/application.rb
+config.active_storage.variant_processor = :vips
+```
+
+# 開発環境の設定
+
+Railsの設定だけで動くかと思いきや、そうもいかないようです。
+
+じぶんの開発環境のOSはCentOS Linux release 7.6.1810 (Core)つまり**CentOS 7**なのですが、ここにVipsをインストールしなければいけません。
+
+**Vips(libvips)**
+https://github.com/libvips/libvips
+
+```
+# wget https://github.com/libvips/libvips/releases/download/v8.8.2/vips-8.8.2.tar.gz
+# tar zxf vips-8.8.2.tar.gz
+# cd vips-8.8.2
+# ./configure
+# make
+# make install
+```
+このようにひとつずつコマンドを実行していきます。
+
+そして
+
+```
+# make check
+```
+というコマンドでVipsが正常にインストールされたかをしっかり確認します。とくに`no`と表示されたライブラリを
+
+```
+# yum install libpng
+# yum install libpng-devel
+```
+というように追加でインストールしていきます。
+
+そして
+
+```
+# cd vips-8.8.2
+# ./configure
+# make
+# make install
+# make check
+```
+を行い、`make check`のテスト結果に失敗(FAIL)がなくなればインストール成功です。
+
+# 画像変換のコードを書き換える
+
+従来だと
+
+```ruby
+post.image.variant(resize: "240x300", auto_orient: true, strip: true, quality: 60)
+```
+でしたが、Rails 6.0でVipsを使うには
+
+```ruby
+post.image.variant(resize_to_fit: [240,300], autorot: true, saver: { strip: true, quality: 60 })
+```
+と書き換えたら動きました。
+
+ちなみに`resize_to_fit`は画像の縦横比であるアスペクト比を変えないまま設定値以下に縮小するというもの。`autorot`はスマホでたまにあることですが90度回転して投稿されるのを補正してくれます。`strip`は画像に含まれる位置情報などのメタデータを削除します。`quality`は画像を軽くするための圧縮率です。ほかにもいろいろオプションがあるみたいですね。
+
+# Herokuにデプロイ
+
+以上で、ローカルの開発環境でVipsが動作しました。
+
+ところが、本番環境のHerokuにデプロイすると画像が表示されません。
+
+いろいろ調べたところ、下記の設定が必要でした。
+
+```
+heroku buildpacks:add --index 1 https://github.com/heroku/heroku-buildpack-apt
+heroku buildpacks:add --index 2 https://github.com/brandoncc/heroku-buildpack-vips
+```
+Herokuユーザーお馴染みのHeroku CIでこれらのコマンドを実行し、Vipsに必要なライブラリをダウンロード&インストールするためのビルドパックを準備します。
+
+つづいて下記を1行ずつ打ち込んでいきます。
+
+```
+$ cat <<EOF >Aptfile
+> libglib2.0-0
+> libglib2.0-dev
+> libpoppler-glib8
+> EOF
+```
+
+あとはいつものようにHerokuにデプロイします。
+
+```
+$ git add -A
+$ git commit -m "Add Vips"
+$ git push heroku master
+```
+じぶんのstackはheroku-18です。stackによってはビルドパックの`https://github.com/brandoncc/heroku-buildpack-vips`を別のリポジトリに変えたほうがよさそうでした。
+
+# あとがき
+
+Qiitaでまとめるようになって約8か月。Rubyでプログラミングを学び始めておよそ1年と2か月が経ちました。いつも思うのですが、こうしてまとめると今回の事も簡単に出来るように見えてしまいます。実際は徹夜でしたけど...。精進します。