rastam’s blog

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

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

rubyweekly.com

Highlights

strong_password v0.0.7 Ruby Gem Hijacked

strong_password gem がハイジャックされた。メンテナが 2 段階認証を有効にしてなかったせいか、rubygems アカウントが乗っ取られちゃった。

問題の v0.0.7 は yank 済み。

TimeCalc: A Simple, 'Next Gen' Time Arithmetic Library

時間計算 gem。ActiveSupport と違って、Fixnum などをモンキーパッチしてなくて、依存が少ない。

Rails 6 Errors: The Good, The Bad, The Ugly

Rails 6 エラー画面の良いところ

  • 例外、絶対パス、エラーメッセージが分かりやすく表示される
  • 発生箇所のソースが分かりやすく表示される
  • スタックトレースが分かりやすく表示される
  • パラメータなど分かりやすく表示される
  • ブラウザー内 REPL!!!

良くないところ

  • Did you mean? が当たらないことがある。初心者がこいつに惑わされそう。
  • #<#<Class::0x000000000ed0aee0>:0x000000000ed110b0> といった出力が役立たず

Rails 6 Adds Hooks to Active Job Around Retries and Discards

ActiveJob の retry_ondiscard_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 エンドポイントのベスト実装例」と賞賛するつぶやきでこの記事をバズらせた。

How to Deploy AnyCable with Capistrano and systemd

AnyCableCapistrano + systemd でデプロイする手順。

AnyCable はパフォーマンス・安定性・スケーラビリティが ActionCable に勝るが、Capistrano でデプロイすることは安易ではない。

Handling HTTP Headers in Grape with Rack and Rails

Grape vs Rack vs Rails の HTTP ヘッダー処理比較。

How to Store Secure Encrypted Data in Rails Without Gems

attr_encrypted などのデカい外部 gem に依存せずに、RailsActiveSupport::MessageEncryptor だけで機密情報を暗号化する方法。

10 Tips When Using the VCR Gem in Your Ruby Test Suite

vcr gem を効率よく使う豆知識 10 点。

  1. cassette 名自動生成しよう
  2. vcr_mode = :once。あとヘッダー無視しよう
  3. 外部へのリクエスト遮断しよう
  4. 環境変数で cassette 上書き
  5. VCR.current_cassette.file
  6. vcr を使ってるテストでは FactoryBot の sequence を必要に応じて固定化しよう
  7. cassette が何回でも作れるように、テスト冪等化しよう
  8. 実行順、キャッシュは要注意
  9. cassette 内 URL 正規化しよう
  10. cassette 変更時の差分は無視して良し

Building Messaging Between Ruby/Rails Applications with ActiveMQ

Rails の非同期処理を ActiveMQ で実装した経験談

STOMP プロトコルstomp gem で対応。本番は AmazonMQ で。

How to TDD When TDD Is Hard

TDD の壁とその乗り越え方。

  • 結合テストなどの高レベルテストが落ちる原因が分かりづらい場合は、モデルなどの低レベルテストでテスト書こう。
  • モックが多すぎるテスト = 関心ごとが多すぎるテストなので、高レベルテスト書いてから、リファクターしよう。
  • context などのネストが深すぎて読み解けないテストは、context・before・shared_context などのコードを it/specify で書き写そう。理解できたら、元のテスト or it/specify のみのテストのどちらかだけ採用。
  • テストがそもそもない場合は、現行挙動のテストを書こう。
  • テストをどう書くか分からない = 仕様を理解し切れてない。仕様を聞こう or 既存コード調査しよう。
  • テスト書く時間がない場合、正常ケースのテストとか低レベルテストだけでも重点的に書こう。