Ruby Weekly #362: 日本語サマリー
職場の Slack の #ruby 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
Highlights
メトリックス計測ツール群 TestProf でテスト最適化。
- TagProf で重いテスト特定
- RubyProf、StackProf と併用して重いスタック特定
- EventProf で DB 処理の重いテスト特定
- EventProf で重いバックグラウンドジョブ特定
- FactoryGirl の不要なデータ作成を FactoryDoctor で特定
- RSpecStamp で動的に不合格テストにタグを張る
N+1 クエリ撲滅方法比較
preload
- 2
SELECT
eager_load
- 1
LEFT OUTER JOIN
joins
- 1
INNER JOIN
includes
- Rails 4 以前は、魔術で
preload
eager_load
joins
の中からベストを選択してくれた - Rails 5 以降は、
includes
=preload
。references
でJOIN
を強制させる(魔術の保守を諦めたコアチーム)
Q 学習アルゴリズムを Ruby で実装して、ゲームの AI を学習させた話。
synvert gem で
flash[:notice] = "Hoge" redirect_to root_path
の古い表記をよりなうい
redirect_to root_path, notice: "Hoge"
に書き換えた話。
好きな 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
Rails コアチーム新メンバー
Tutorial
N+1 クエリ解消策には eager loading、preloading のほかに バッチング策
もあった。筆者が Facebook の Haskell 制 Haxl ライブラリに倣って BatchLoader gem を作った。並列処理、GraphQL を活用例として挙げた。スレッドセーフでキャッシング完備。
イベントのチケット販売アプリのリマインダー通知を再起計算でスケジューリングした話。チケット購入直後とイベント開始直前のリマインダーは頻繁に、その間はもっと永い間隔で。
RSpec のブートを 50 倍速くした話。答えは spring。rvm のローカル gemset を最低限に減らしても大差はなかった。
ポリモーフィック関連付けの解説。レストランのレビューとイベントのレビューを表す Review モデルで例を挙げた。
Builder デザインパターンを Ruby で実装。ここであらすじ書かなくても原文のコードは読みやすくて分かりやすい! ★★★
Rails 5.1 の暗号化 Secret。
bin/rails secrets:setup
で下記ファイル生成:
- config/secrets.yml.key(キーファイル。コミットするな!絶対に)
- config/secrets.yml.enc(暗号化 Secret ファイル)
bin/rails secrets:edit
で修正。
キーファイルをサーバに置く方法:
- scp/sftp
RAILS_MASTER_KEY
環境変数
Story
Heroku CLI の進化。
v1〜v3
v4
- Go + Node
- Go だけでは動的ライブラリに対応できなかったので、プラグイン機能は Node で
- CLI コアまでプラグインに抽出
- 初回実行で Node + コアプラグインをダウンロード
- 2 年間じっくりかけた
v5
- Go + Node
- Node + コアプラグインを tarball に同梱
v6
- Node のみ
- Go を捨てた理由
- OS アップデートで Go 周りぶっ壊れる
- Go は比較的低レベルで、機能追加がしんどい
- プラグイン参照するたびに新規 Node プロセスを切るのに数百ミリ秒もかかった
- CLI フレームワーク cli-engine 抽出、OSS 化
- プラグインのインタフェースを ES6 に
- Node 7 の
async
/await
活用 - コア・プラグイン開発は
Tools
Fabrication vs FactoryGirl ベンチマーク。ネストしているモデルの場合は、Fabrication のほうが速い。create
は特に。
Code
新機能
belongs_to
、has_one
、has_many :through
アソシエーション- thor 捨てて hanami-cli gem 新規作成
- Entity のマニュアルスキーマ定義(ActiveModel の属性定義に相当)
- CLI からブートするアプリ指定
- ログの機密情報マスク(Rails の
filter_parameters
に相当)
DDOS 防止 Rack::Attack
gem
システムステータス告知用 Rails アプリ
bettercap: A Modular, Portable and Extensible MITM Framework
中間者攻撃用 gem。脆弱性検証でも使えるらしい。
k 近傍法による分類用 gem(機械学習)