rastam’s blog

東京在住のマレーシア人 Rubyist

Ruby Weekly #406: 日本語サマリー

職場の Slack 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。

http://rubyweekly.com/issues/406rubyweekly.com

Highlights

Running JRuby on the Graal JIT

Graal JIT 上に JRuby を動かす手順とパフォーマンスの比較。

Ruby Memory Environment Variables: Simpler Than They Look?

Ruby メモリ制御用環境変数の解説。おまけにアプリの最適な環境変数設定を記録してくれる EnvMem gem の紹介。

How Not to Structure Your Database-Backed Webapps

OSS Rails アプリ 12 個のパフォーマンスを調査した論文。ORM、DB 設計、アプリ設計などの問題点種別で集計。

Your Business Rules Are Objects Too

条件達成判定メソッドをルールオブジェクトとして抽出しようと提案した Avdi Grimm 先生。

Ecommerce at Scale: Inside Shopify's Tech Stack

Shopify を支えているインフラの進化。

  • 社内各システムの稼働率SSL 証明書有効性、脆弱性有無など一望できる ServicesDB という Rails アプリ
  • 巨大 MySQL DB → 出店者別シャード → 出店者別ポッド(個別 MySQL DB + Redis + Memcache + cron)
  • jQuery + prototype.jsBatman.js の SPA → 生 JS → React + TypeScript
  • GraphQL
  • Buildkite で 10 万テスト並列実行
  • ShipIt で継続的デプロイ
  • オンラインメンテで 100 以上ものシャードを非同期で db:migrate

Covered: An Experimental Coverage Tool Using Ruby 2.6 Features

カバー率計算用 gem。Ruby 2.6 の RubyVM::AST.parse を駆使することで、今まで計算できなかったテンプレートまで計算できるようになった。

Articles & Tutorials

Writing Testable API Documentation Using APIB and Dredd

Rails APIドキュメンテーションAPI Blueprint 形式で作成、実際の API との整合性を Dredd でテスト。

Ruby 2.6 Adds Syntax for Endless Ranges

Ruby 2.6 の無限 Range 0..0..nil でも書ける。

A Complete Guide to JSON Serialization in Rails

JSON シリアライズ関連 gem まとめ。

パフォーマンス的には、Fast JSON API + Oj が最も速い組み合わせ。

Visualizing and Optimizing JS Bundle Size in Rails/Webpacker Apps

webpack-bundle-analyzer で webpack の bundler の構成を可視化し、不要なものを webpack 設定から外す方法。

Notes on Writing Service Objects

筆者のサービスオブジェクト関連ルール。

  • public メソッドは 1 個のみ。SRP 守るように。
  • .new は明示的に呼ぶこと。引数は DI のみ。
  • インスタンス変数を設定するのは #initialize のみ。
  • private メソッドから他の private メソッドを呼ぶな。深い階層は読みづらい。
  • ローカル変数は遠慮せず。
  • ループではサービスオブジェクトのインスタンスを再利用しよう。
  • 戻り値はバリューオブジェクト。
  • モナド使おう。
  • 必要に応じて、上記ルール破って良い。

Custom Exceptions in Ruby

カスタム例外の使いこなし方。

Escaping the SPA Rabbit Hole with Modern Rails

モダン Rails (Turbolinks + Stimulus + SJR)で脱 SPA。SPA の複雑さなどの問題点とそれぞれを解決するモダン Rails 機能。

Rails 5.2 Added 'write_multi' Method to Cache Store

Rails 5.2 の ActiveSupport::Cache::Store#write_multi のおかげで複数キーを一括で書き込めるようになった。

Sidekiq-ifying Emails at Reflektive

非同期でメールを送信している Reflektive 社。メールの数が多くなると発送が遅くなってしまった DelayedJob から、高速かつ監視しやすい Sidekiq に移行した話。

Code & Tools

Snibox: A Self-Hosted Code Snippets Manager

コードスニペット管理ツール Rails アプリ。

Eps: Linear Regression for Ruby

線形回帰用 gem。

Sym: A CLI and Ruby API to Encrypt and Decrypt Sensitive Data

secret などの暗号化・復号化 CLI 用 gem。

WIP: Promote Webpacker to the Default JavaScript Compiler for Rails 6

Webpacker をデフォにしようとしている DHH のプルリクエスト。

OpenProject: Open Source Project Management Software

プロジェクト管理ツール Rails アプリ。

cache_with_locale: Automatically Add Locale to Your Cache Keys

ロケール別キャッシュを持たせるように、ロケールをキャッシュのキーに挿入してくれる gem。