1. west2538

    No comment

    west2538
Changes in body
Source | HTML | Preview
@@ -1,127 +1,133 @@
個人開発の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か月が経ちました。いつも思うのですが、こうしてまとめると今回の事も簡単に出来るように見えてしまいます。実際は徹夜でしたけど...。精進します。
+
+### **2019年9月2日 追記**
+
+Herokuにデプロイして丸1日、効果を検証してみました。
+
+その結果、本番環境のHerokuではVipsをいったん無効化しました。一部の画像形式の変換がうまく動かなかったり、メモリ消費量の上昇でスワップが増えてしまったためです。VipsがHerokuで正式にサポートされていないせいでしょうか。ローカルの開発環境ではかなり快速に動作するのですが...。