rastam’s blog

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

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

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

rubyweekly.com

Highlights

TestProf: A Doctor for Slow Ruby Tests

メトリックス計測ツール群 TestProf でテスト最適化。

  • TagProf で重いテスト特定
  • RubyProf、StackProf と併用して重いスタック特定
  • EventProf で DB 処理の重いテスト特定
  • EventProf で重いバックグラウンドジョブ特定
  • FactoryGirl の不要なデータ作成を FactoryDoctor で特定
  • RSpecStamp で動的に不合格テストにタグを張る

To Join or Not to Join?

N+1 クエリ撲滅方法比較

preload

  • 2 SELECT

eager_load

  • 1 LEFT OUTER JOIN

joins

  • 1 INNER JOIN

includes

  • Rails 4 以前は、魔術で preload eager_load joins の中からベストを選択してくれた
  • Rails 5 以降は、includespreloadreferencesJOIN を強制させる(魔術の保守を諦めたコアチーム)

Teaching An AI to Play A Simple Game Using Q-Learning

Q 学習アルゴリズムRuby で実装して、ゲームの AI を学習させた話。

Using 'synvert' to Rewrite and Refactor Code

synvert gem で

flash[:notice] = "Hoge"
redirect_to root_path

の古い表記をよりなうい

redirect_to root_path, notice: "Hoge"

に書き換えた話。

Sending Massive Emails Considered Harmful

好きな OSS リポから Issue を割り振ってくれるサービス CodeTriage。@schneems さんのバグでユーザに巨大メール送っちゃった話。

SendGrid の上限を超えちゃったある日。冪等になってなかった割り振るジョブが落ち、一時間ごとにリトライを繰り返した。SendGrid に追加課金した途端に、各ユーザの溜まった 400 以上もの Issue をメールで飛ばしちゃった。

Evented Rails: Decoupling Complex Domains in Rails with Events

イベント駆動 Rails で DDD の Bounded Context を疎結合に。

配車サービスを例に挙げ、密結合した 配車依頼 → 自動車マッチング → 依頼主・運転手通知 機能を Wisper gem の pub/sub で 依頼主 コンテキストと マッチング コンテキストを分離した。

News

3 New Committers Join The Rails Team

Rails コアチーム新メンバー

Tutorial

Use Batching to Avoid N+1 Queries

N+1 クエリ解消策には eager loading、preloading のほかに バッチング策 もあった。筆者が FacebookHaskellHaxl ライブラリに倣って BatchLoader gem を作った。並列処理、GraphQL を活用例として挙げた。スレッドセーフでキャッシング完備。

That One Time I Used Recursion to Solve A Problem

イベントのチケット販売アプリのリマインダー通知を再起計算でスケジューリングした話。チケット購入直後とイベント開始直前のリマインダーは頻繁に、その間はもっと永い間隔で。

How I Got RSpec to Boot 50 Times Faster

RSpec のブートを 50 倍速くした話。答えは spring。rvm のローカル gemset を最低限に減らしても大差はなかった。

A Guide to Using Polymorphic Associations in Rails

ポリモーフィック関連付けの解説。レストランのレビューとイベントのレビューを表す Review モデルで例を挙げた。

Quick Tip: The Builder Design Pattern in Ruby

Builder デザインパターンRuby で実装。ここであらすじ書かなくても原文のコードは読みやすくて分かりやすい! ★★★

Using Encrypted Secrets on Rails 5.1

Rails 5.1 の暗号化 Secret。

bin/rails secrets:setup で下記ファイル生成:

  1. config/secrets.yml.key(キーファイル。コミットするな!絶対に)
  2. config/secrets.yml.enc(暗号化 Secret ファイル)

bin/rails secrets:edit で修正。

キーファイルをサーバに置く方法:

Story

Evolution of the Heroku CLI: 2008-2017

Heroku CLI の進化。

v1〜v3

v4

  • Go + Node
  • Go だけでは動的ライブラリに対応できなかったので、プラグイン機能は Node で
  • CLI コアまでプラグインに抽出
  • 初回実行で Node + コアプラグインをダウンロード
  • 2 年間じっくりかけた

v5

v6

Tools

Fabrication vs FactoryGirl: Which is Faster?

Fabrication vs FactoryGirl ベンチマーク。ネストしているモデルの場合は、Fabrication のほうが速い。create は特に。

Code

Hanami v1.1.0 Beta 1 Released

新機能

  • belongs_tohas_onehas_many :through アソシエーション
  • thor 捨てて hanami-cli gem 新規作成
  • Entity のマニュアルスキーマ定義(ActiveModel の属性定義に相当)
  • CLI からブートするアプリ指定
  • ログの機密情報マスク(Railsfilter_parameters に相当)

Rack::Attack: Rack Middleware for Blocking and Throttling

DDOS 防止 Rack::Attack gem

Staytus: An Open Source Service Status App

システムステータス告知用 Rails アプリ

bettercap: A Modular, Portable and Extensible MITM Framework

中間者攻撃用 gem。脆弱性検証でも使えるらしい。

ruby-knn: A Simple k-Nearest Neighbors (kNN) Classifier

k 近傍法による分類用 gem(機械学習