Ruby Weekly #373: 日本語サマリー
職場の Slack の #ruby 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
Highlights
どんな Fat Controller でもサービスオブジェクト抽出で片付けちゃうのを否定する Avdi Grimm 先生。
- 多くの場合はプロシージャー型モジュールメソッドのほうが適切だと
- 間違ったオブジェクトを抽出よりも、オブジェクトを抽出しないほうがマシ
- サービスオブジェクトは依存し合いがち
- サービスオブジェクトはビジネスドメインよりも、インフラ層に相応しい(DDD 本もこう書いてある)
- ビジネスドメインのサービスオブジェクトがあったとしても、インフラ層のサービスオブジェクトから分離すべき
Bundler 1.16 リリース。
- 依存関係解決の新規アルゴリズムに切り替えたことでパフォーマンス向上・バグ解消。
bundle install
のeval
回数を減らしたことでパフォーマンス向上。
次のリリースは Bundler 2!
- master がすでに Bundler 2 となった。
- Bundler 2 機能は 1.16 にも入ってて、feature flag で無効となっている。Bundler 2 を試したい方は、ぜひ有効化を。
ランダムフォレストアルゴリズムで手書き数字の OCR を実装する手順。PyCall gem で Python の scikit-learn ライブラリーに投げてる。
メモリを意識した Ruby。
nil
true
false
はメモリを確保しないため、考慮しなくてもいい。-2^62
〜2^62-1
の整数もメモリを確保しないため、考慮しなくてもいい。Array
Struct
は要素 3 つまでは最低メモリの 40 バイトで収まる。- 空っぽの
Hash
は最低メモリの 40 バイトで収まる。 String
は 23 バイトまで最低メモリの 40 バイトで収まる。- オブジェクトはインスタンス変数 3 つまでは最低メモリの 40 バイトで収まる。
メモリ最適化の工夫:
- 上記ルールと
ObjectSpace.memsize_of
でメモリ計測していき、最も効率の良いデータ構造を選択。 - オブジェクトをできるだけ再利用する。
Array#map!
など破壊的メソッドでオブジェクトのインスタンス化を避ける。- allocation_tracer、memory_profiler などの gem でメモリ計測。
Rails トランザクションの罠いろいろ。全文日本語訳あり!
gem update --system
でバージョンアップしようぜ!
- 同梱 bundler を 1.16.0 にバージョンアップ。
- Bundler が
Gem.use_gemdeps
を使うように。 gem
CLI にsignin
コマンド追加。gem
CLI にログアウト機能追加。
News
Ruby 2.5 パフォーマンス向上。
- 文字列 interpolation が 72% 速く!
String#prepend
が 42% 速く!Enumerable#sort_by
Enumerable#min_by
Enumerable#max_by
が 50% 速く!String#scan
の文字列パターンは 50%、正規表現パターンは 10% 速く!Range#min
Range#max
が 60% 速く!
Tutorial
AWS 上の Sidekiq を自動スケーリングしている Honeybadger.io 社。
- Sidekiq 作業量が増えたら、CloudWatch アラームで新しいインスタンスを起動。
- 作業量が元に戻ったら、インスタンスを殺す。
実行中ジョブが完了するまで、インスタンスを殺すのを遅らせる、という要件を、原文のスクリプトで実装した。
よくある before_validate
コールバック悪用パターンと代替案。
- データフォーマット・正規化。
attr_writer
をオーバーライドしよう。
- データ設定。
- 例えばアソシエーションから取得した値をカラムに設定して非正規化。
- コールバックなしで普通に設定しよう。
linter で JSON API の RSpec テストを綺麗に。リクエストとレスポンスの
Content-Type
チェック- スキーマチェック
を JsonApiLint
オブジェクトに抽出して、
request spec の #app
を置き換えることで、
spec に残るのは
- HTTP ステータスチェック
- JSON 内容チェック
のみになった。
1 it
1 expect
ルールを厳守する Victor Shepelev さんの、引数パターン別メソッドの戻り値をテストする裏技。
subject
はObject#method
で取得したMethod
オブジェクト。its([引数])
で引数パターンを指定。
WEBrick・Rack・Sinatra のそれぞれの役割を分かりやすく描いた図。
Stripe で決済処理を行っている Rails アプリのテストを支える stripe-ruby-mock gem。StripeEvent gem で実装した Stripe Webhook の受信までテストできちゃう。
simplecov gem でテストのカバー率を測る手順。
Story
"".split("-")
は Ruby と Python で挙動が異なっている。
Python は
[""]
を返す。- Java、JavaScript、Elixir、Go、Haskell、PHP、Scala 同様。
Ruby は
25.hours.from_now
で日付が変わることを期待していたテストが落ちた話。実行したのは夏時間に切り替えた日。
Code
関数型 HTTP クライアント gem。
Rack::Session::SmartCookie: Smarter Session Cookies for Rack 2 Apps
Rack 2 セッションクッキーの問題点を解消してデフォにした gem。
Kaminari: A Powerful, Customizable Paginator for Ruby Webapps
松田明先生のアノ有名なページング用 gem。
SNS 投稿を一本化した gem。