技術

27件の記事

2019年、SUZURIの怪事件

SUZURI Advent Calendar 2019の5日目の記事です。ちょっと遅れました。 SUZURIでエンジニアをしているしもじゅーです。最近はSUZURIのAndroidアプリを開発するために目下勉強中で、Android何もわからない…となっています。 今年自分が担当したのは目に見えない裏側部分や長い調査を必要としたものが多かったです。謎の不具合にも悩まされたのでそこからいくつか紹介します。 ご迷惑をおかけしたものもありますが、裏側ではこんなことやっているんだ、と感じていただければ幸いです。

Herokuでzip_code_jp gemの郵便番号データを定期更新したい

日本の郵便番号データを扱うRuby gemとしてはzip_code_jpが有名です。ECサイトなどでは郵便番号から住所を補完する機能はもはや当たり前になっていますが、そのような機能を作りたいときに便利なライブラリです。 この郵便番号データはZipCodeJp.export_jsonで更新できますが、このときgemのdata/zip_codeディレクトリ内にあるJSONファイルを直接更新します。 一般的なサーバ環境であればcronで回すなどすれば普通に更新できますが、Herokuの場合はローカルにファイルを書き込んでも再起動のタイミングで自動で消滅します。Heroku Schedulerなどで定期実行しても、既にパッケージされたslug内のデータは変更できないので意味がありません。 Release Phaseでいけないかな?とも思いましたが、Release Phaseはslugのビルド後に実行されるのでこれも使えません。

Sidekiq + Heroku RedisでERROR: ERR max number of clients reachedと言われたら

Redisの同時接続数制限が原因です。 Sidekiqのconcurrencyのデフォルトは25となっており、Redisにもその数だけ接続するため、デフォルトのままだと一気に25接続を消費します。Heroku RedisのHobby Dev(接続数制限20)のような低価格なプランでは、concurrencyの設定をせずにデプロイすると一瞬でログがエラーまみれになってしまうので注意しましょう……。 上記Wikiにもあるように、変更するにはsidekiq.ymlに以下のように書きます。RAILS_ENVごとに切り替えることもできます。

HerokuのRelease PhaseでDBマイグレーション忘れを防ぐ

HerokuにはRelease Phaseという機能があります。 これはアプリケーションのビルドが終わってリリースする直前に任意のコマンドを実行するもので、DBのマイグレーションやキャッシュの削除といった用途に使えます。 設定方法はProcfileにrelease: commandの形式で書くだけです。例えば、Railsでmigrateとseed-fuを実行するのであれば以下のようになります。 Procfile release: bin/rails db:migrate db:seed_fu web: bundle exec puma -C config/puma.rb DBマイグレーションを忘れて500エラーはあるあるな話ですが、これで防ぐことができます。 コマンドが失敗したとき(0以外のステータスで終了したとき)はもちろんデプロイは行われません。

WerckerでRailsアプリをCIしてSlack通知する

オラクルに買収されてから存在感が薄くなった(?)ような気がするWerckerですが、使う機会があったのでRailsでの設定をメモしておきます。 wercker.yml 1box: 2 id: ruby:2.5.1 3 4services: 5 - id: mysql:5.7 6 env: 7 # rails-database-yml stepはrootユーザーを使わないのでランダムパスワードにしておく 8 MYSQL_RANDOM_ROOT_PASSWORD: 'yes' 9 # 以下の3つを設定する必要がある 10 MYSQL_DATABASE: rails_test 11 MYSQL_USER: rails 12 MYSQL_PASSWORD: password 13 14 - id: redis:4 15 16build: 17 steps: 18 # Node.jsは入っていないのでインストールする 19 - script: 20 name: install node.js 21 code: curl -fsSL https://deb.nodesource.com/setup_8.x | bash - && apt-get install -qq nodejs 22 # bundleのキャッシュもしてくれる 23 # https://github.com/wercker/step-bundle-install 24 - bundle-install 25 # 自動的にdatabase.ymlの設定をしてくれる 26 # https://github.com/wercker/step-rails-database-yml 27 - rails-database-yml 28 - script: 29 name: copy .env 30 code: cp .env.sample .env 31 # Redisの接続先この方法でしか取れなかったけどもっといい方法ありそう 32 - script: 33 name: redis config 34 code: echo REDIS_URL=redis://$REDIS_PORT_6379_TCP_ADDR:$REDIS_PORT_6379_TCP_PORT >> .env 35 - script: 36 name: db setup 37 code: bundle exec rails db:schema:load db:seed_fu 38 - script: 39 name: rspec 40 code: bundle exec rspec 41 42 after-steps: 43 # Slack通知 44 # https://github.com/wercker/step-slack 45 - slack-notifier: 46 # 環境変数で設定 47 url: $SLACK_WEBHOOK_URL 48 channel: channel_name 49 username: wercker 環境変数はWeb画面上で設定し、wercker.yml内では$変数名で参照します。「Protected」にすると設定値が見えなくなるので、秘匿情報を設定するときに便利です。

better_errorsがやたら遅いときは最新版にアップデートするとよい

better_errorsが入ったRailsプロジェクトを最近触っているのですが、エラー画面の表示がやたら遅く、コンソールが使い物にならない状態になっていました。 Puma 3系で発生しており、リクエスト・レスポンス変数内のpuma.configのサイズが非常に大きく、通信に時間がかかってしまっているからのようです。 この対策として、最新バージョンの2.4.0(2017年10月リリース)でサイズの大きいインスタンス変数をフィルタする機能が追加されていました。フィルタ設定はデフォルトで有効なので、最新版にアップデートすればいい感じになります。 config/initializers/better_errors.rb # This will stop BetterErrors from trying to render larger objects, which can cause # slow loading times and browser performance problems. Stated size is in characters and refers # to the length of #inspect's payload for the given object. Please be aware that HTML escaping # modifies the size of this payload so setting this limit too precisely is not recommended. # default value: 100_000 BetterErrors.maximum_variable_inspect_size = 100_000 最近ではweb-consoleがあるのでbetter_errorsをやめることも検討したのですが、これで快適に使えるようになりました。

Scrapboxでリアルタイム共同日報をやってみた

この記事はGMOペパボ Advent Calendar 2017の17日目……になる予定だった記事です。 担当日に風邪を引いてしまって穴を空けてしまいましたが、なんとか年内に投稿してギリギリセーフの雰囲気を出していこうと思います😇 朝会の機能不全 どのようなチームでも、人数が増えてくると「誰が何やってるのかわからない」という状況は起こるのではないかと思います。そのための情報共有の場として朝会はよく実施されていますが、自分のチームでは有効に機能していない状態でした。

ImageMagickで画像処理に入門する

この記事は、ImageMagickと画像加工について発表したときの資料を文章に起こして加筆修正したものです。 ImageMagickとは 画像加工といえばこれという有名ライブラリ メジャーからマイナーまでさまざまな画像形式に対応 機能が多すぎて脆弱性もたびたび発見されるくらい… Cで実装され、多くの言語でバインディングがある Ruby:rmagick, mini_magick gem PHP:Imagick拡張モジュール Go:gographics/imagick インストール Mac Homebrew

Herokuはスケーラブルなアプリ養成ギプス

社内勉強会でHerokuでの本番運用について発表しました。 いま携わっているSUZURIはHerokuで運用しており、個人でもHerokuで運用しているアプリがあります。その中で経験したことや知見を話しました。 Herokuで本番運用する技術 目次を見るとわかるようにテーマは多岐にわたっており、ざっと&ゆるめに発表しようという趣旨です。 Herokuはスケーラブルなアプリ養成ギプス Herokuのいいところといえば、マネージドで手軽に使えること、開発者にとって便利な機能が豊富なこともそうですが、アプリケーション設計に良い影響を与える点もあります。

新卒エンジニア研修の座学でImageMagickと画像加工の話をした

ペパボの新卒エンジニア研修では、メニューのひとつとして「座学」を行っています。 メインの研修ではWeb開発・Webオペレーション・モバイルアプリ開発に順番に取り組んでいきますが、座学では知識と興味を広げることを目的として、社内のエンジニアにお願いして1時間自由に発表してもらっています。 たとえば、テストやチーム開発、モバイルの開発手法といった研修内容に関連した話や、あるいは3DCGのシェーダーやReactive Extensionsといった、研修では触れないような技術の話まで様々です。研修の内容については、ペパボの新卒エンジニア研修2017 Vol.1 - ペパボテックブログを見ると雰囲気がわかるかと思います。