Ruby Weekly #458: 日本語サマリー
Highlights
strong_password gem がハイジャックされた。メンテナが 2 段階認証を有効にしてなかったせいか、rubygems アカウントが乗っ取られちゃった。
問題の v0.0.7 は yank 済み。
時間計算 gem。ActiveSupport と違って、Fixnum などをモンキーパッチしてなくて、依存が少ない。
Rails 6 エラー画面の良いところ
- 例外、絶対パス、エラーメッセージが分かりやすく表示される
- 発生箇所のソースが分かりやすく表示される
- スタックトレースが分かりやすく表示される
- パラメータなど分かりやすく表示される
- ブラウザー内 REPL!!!
良くないところ
Did you mean?
が当たらないことがある。初心者がこいつに惑わされそう。#<#<Class::0x000000000ed0aee0>:0x000000000ed110b0>
といった出力が役立たず
Rails 6 Adds Hooks to Active Job Around Retries and Discards
ActiveJob の retry_on
、discard_on
マクロに渡すブロックは、Rails 6 以降 ActiveSupport::Notifications
フックで書けるようになる。
enqueue_retry.active_job
retry_stopped.active_job
discard.active_job
ApexCharts.rb: Interactive, Responsive Web Charts for Ruby Apps
JS チャート・グラフ用 gem。apexcharts.js ライブラリをラッピングしてるもの。
Articles & Tutorials
Discovering the Design Pattern at the Heart of Rack Middleware
Rack ミドルウェアをデザパタとして定義してる記事。(GoF デザパタ本には載ってないので新規提案)
応用例:
My Experience Architecting A Software Development Stack with JRuby, OpenJDK, and Roda
JRuby + Roda + Sequel + Puma + H2 データベース + いろんな Java ライブラリでレトロゲーム管理システム開発経験談。
JRuby メンテナー Charles Nutter 先生が「高スループット Ruby エンドポイントのベスト実装例」と賞賛するつぶやきでこの記事をバズらせた。
AnyCable を Capistrano + systemd でデプロイする手順。
AnyCable はパフォーマンス・安定性・スケーラビリティが ActionCable に勝るが、Capistrano でデプロイすることは安易ではない。
Grape vs Rack vs Rails の HTTP ヘッダー処理比較。
attr_encrypted などのデカい外部 gem に依存せずに、Rails の ActiveSupport::MessageEncryptor
だけで機密情報を暗号化する方法。
vcr gem を効率よく使う豆知識 10 点。
- cassette 名自動生成しよう
vcr_mode = :once
。あとヘッダー無視しよう- 外部へのリクエスト遮断しよう
- 環境変数で cassette 上書き
VCR.current_cassette.file
- vcr を使ってるテストでは FactoryBot の sequence を必要に応じて固定化しよう
- cassette が何回でも作れるように、テスト冪等化しよう
- 実行順、キャッシュは要注意
- cassette 内 URL 正規化しよう
- cassette 変更時の差分は無視して良し
Building Messaging Between Ruby/Rails Applications with ActiveMQ
Rails の非同期処理を ActiveMQ で実装した経験談。
STOMP プロトコルは stomp gem で対応。本番は AmazonMQ で。
TDD の壁とその乗り越え方。
- 結合テストなどの高レベルテストが落ちる原因が分かりづらい場合は、モデルなどの低レベルテストでテスト書こう。
- モックが多すぎるテスト = 関心ごとが多すぎるテストなので、高レベルテスト書いてから、リファクターしよう。
- context などのネストが深すぎて読み解けないテストは、context・before・shared_context などのコードを it/specify で書き写そう。理解できたら、元のテスト or it/specify のみのテストのどちらかだけ採用。
- テストがそもそもない場合は、現行挙動のテストを書こう。
- テストをどう書くか分からない = 仕様を理解し切れてない。仕様を聞こう or 既存コード調査しよう。
- テスト書く時間がない場合、正常ケースのテストとか低レベルテストだけでも重点的に書こう。