rastam’s blog

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

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

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

http://rubyweekly.com/issues/373rubyweekly.com

Highlights

Enough With the Service Objects Already

どんな Fat Controller でもサービスオブジェクト抽出で片付けちゃうのを否定する Avdi Grimm 先生。

  • 多くの場合はプロシージャー型モジュールメソッドのほうが適切だと
  • 間違ったオブジェクトを抽出よりも、オブジェクトを抽出しないほうがマシ
  • サービスオブジェクトは依存し合いがち
  • サービスオブジェクトはビジネスドメインよりも、インフラ層に相応しい(DDD 本もこう書いてある)
  • ビジネスドメインのサービスオブジェクトがあったとしても、インフラ層のサービスオブジェクトから分離すべき

Bundler 1.16 Released (But 2.0 Is Close)

Bundler 1.16 リリース。

  • 依存関係解決の新規アルゴリズムに切り替えたことでパフォーマンス向上・バグ解消。
  • bundle installeval 回数を減らしたことでパフォーマンス向上。

次のリリースは Bundler 2!

  • master がすでに Bundler 2 となった。
  • Bundler 2 機能は 1.16 にも入ってて、feature flag で無効となっている。Bundler 2 を試したい方は、ぜひ有効化を。

Implementing OCR using a Random Forest Classifier in Ruby

ランダムフォレストアルゴリズムで手書き数字の OCR を実装する手順。PyCall gem で Pythonscikit-learn ライブラリーに投げてる。

Memory Conscious Programming in Ruby

メモリを意識した Ruby

  • nil true false はメモリを確保しないため、考慮しなくてもいい。
  • -2^622^62-1 の整数もメモリを確保しないため、考慮しなくてもいい。
  • Array Struct は要素 3 つまでは最低メモリの 40 バイトで収まる。
  • 空っぽの Hash は最低メモリの 40 バイトで収まる。
  • String は 23 バイトまで最低メモリの 40 バイトで収まる。
  • オブジェクトはインスタンス変数 3 つまでは最低メモリの 40 バイトで収まる。

メモリ最適化の工夫:

  • 上記ルールと ObjectSpace.memsize_of でメモリ計測していき、最も効率の良いデータ構造を選択。
  • オブジェクトをできるだけ再利用する。
  • Array#map! など破壊的メソッドでオブジェクトのインスタンス化を避ける。
  • allocation_tracermemory_profiler などの gem でメモリ計測。

Transactions in Rails and Atomic Bugs

Rails トランザクションの罠いろいろ。全文日本語訳あり!

RubyGems 2.7.0 Released

gem update --system でバージョンアップしようぜ!

  • 同梱 bundler を 1.16.0 にバージョンアップ。
  • Bundler が Gem.use_gemdeps を使うように。
  • gem CLIsignin コマンド追加。
  • gem CLI にログアウト機能追加。

News

5 Performance Improvements in Ruby 2.5

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

Cleanly Scaling Sidekiq

AWS 上の Sidekiq を自動スケーリングしている Honeybadger.io 社。

実行中ジョブが完了するまで、インスタンスを殺すのを遅らせる、という要件を、原文のスクリプトで実装した。

The Case Against Exotic Usage of :before_validate Callbacks

よくある before_validate コールバック悪用パターンと代替案。

  • データフォーマット・正規化。
    • attr_writer をオーバーライドしよう。
  • データ設定。
    • 例えばアソシエーションから取得した値をカラムに設定して非正規化。
    • コールバックなしで普通に設定しよう。

Make Your JSON API Tests Clean with a Linter

linter で JSON APIRSpec テストを綺麗に。リクエストとレスポンスの

JsonApiLint オブジェクトに抽出して、 request spec の #app を置き換えることで、 spec に残るのは

  • HTTP ステータスチェック
  • JSON 内容チェック

のみになった。

A Useful RSpec Trick for Testing Methods with Arguments

1 it 1 expect ルールを厳守する Victor Shepelev さんの、引数パターン別メソッドの戻り値をテストする裏技。

  1. subjectObject#method で取得した Method オブジェクト。
  2. its([引数]) で引数パターンを指定。

WEBrick, Rack, and Sinatra's Responsibilities Visualized

WEBrick・Rack・Sinatra のそれぞれの役割を分かりやすく描いた図。

Testing Stripe with Rails and RSpec

Stripe で決済処理を行っている Rails アプリのテストを支える stripe-ruby-mock gem。StripeEvent gem で実装した Stripe Webhook の受信までテストできちゃう。

Use Simplecov in Your Rails Test Suite

simplecov gem でテストのカバー率を測る手順。

Story

Splitting Strings in Ruby vs. Python

"".split("-")RubyPython で挙動が異なっている。

Python

Ruby

  • [] を返す。
  • PerlAWK に倣った。

A Bug That Only Appears Once A Year

25.hours.from_now で日付が変わることを期待していたテストが落ちた話。実行したのは夏時間に切り替えた日。

Code

RequestVia: A Functional HTTP Client That Wraps Net::HTTP

関数型 HTTP クライアント gem。

Rack::Session::SmartCookie: Smarter Session Cookies for Rack 2 Apps

Rack 2 セッションクッキーの問題点を解消してデフォにした gem。

Kaminari: A Powerful, Customizable Paginator for Ruby Webapps

松田明先生のアノ有名なページング用 gem。

Postwill: Post to Popular Social Media Networks from Ruby

SNS 投稿を一本化した gem。