rastam on rails

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

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

rubyweekly.com

Highlights

Bringing Encrypted Attributes to Active Record Models

Rails に DB データ暗号化 PR が上がってる。Hey から抽出したものなので、近々マージされるのを期待できるかも?

Articles & Tutorials

Boring Breadcrumbs for Rails

gem なく、poro だけでパンクズ作る方法。綺麗な実装だと思った。

Rails: How to Reduce Friction at the Authorization Layer

Flipper Cloud が pundit の上に DSL 設けて認可周りを DRY にした話。

  • resourceful じゃなくなったのが気になる。God オブジェクトの Policy の責務がデカくなるのでは?
  • Response オブジェクトは特に意義なし。

ちょっとやりすぎ感はあったが、Flipper Cloud 独自のニーズには合ってるかも?今度 pundit 周りで悩んでたら、この記事見返すといいかも。

Nested Forms in Rails

細かい gotcha の多い nested forms 用の神チートシート。今度 nested forms 実装したら絶対役に立ちそう。

Sharing Common Code Between Rails Controllers with the Scoped Concern Pattern

Basecamp が nested resources で使ってる controller concerns の Scoped パターン。

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

rubyweekly.com

Highlights

The Hidden Gems of Ruby's irb

$ irb
irb(main):001:0> IRB.send :easter_egg

実行すると面白いことが起きる。

Rails Design Patterns: The Big Picture

rails アプリでよく使うデザパタ。皆さんの大好きなサービスクラスとかフォームオブジェクトとかデコレータとか

Articles & Tutorials

Building a Redis-Based Rate Limiter

API の rate limit を超えないための仕組みを実装した話。〇〇秒後に expire するロックのレコードを Redis に登録することで。

オブジェクトの責務は綺麗に切り分けてるが、sleep しちゃってるのが気になる。キューとかに積んだほうがシンプルだろう。非同期でも OK であれば。

Simplifying Tests by Extracting Side-Effects

依存注入でテストのセットアップをシンプルにする話。

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

rubyweekly.com

Highlights

Adornable: A Way to Use Decorators on Ruby Methods

自分が認識してるデコレータとはかけ離れすぎていて使い道が見えない。

Articles & Tutorials

3 Tips to Tune Your VCR in Tests

不要な cassette を特定しやすくしてくれる vcr 設定。これ設定してみたいかも。

Don't Wrap Instance Variables in attr_reader Unless Necessary

外から呼ばなくていいインスタンス変数は attr_reader つけなくていい、というのは賛成する派ですね。

Tip: Use Rails' link_to_unless_current for Your Navigation Links

表示中画面 以外 のリンクを張ってくれる link_to_unless_current ヘルパー。

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

rubyweekly.com

Highlights

Building GitHub-Style 'Hovercards' with Stimulus and HTML-Over-The-Wire

Stimulus で Hovercard 機能実装手順。

  1. ビューに data 属性埋め込む
  2. どんな Hovercard でも取得できる汎用化 Stimulus コントローラ実装。
  3. Rails コントローラ・ビュー実装。
  4. Hovercard 吹き出しの尻尾を CSS で実装。

Factory Bot 6.0: A Library for Setting Up Ruby Objects as Test Data

enumtraits_for_enum 機能が追加された Factory Bot

Rails 6.0.3.2 Released

Rails セキュリティパッチ。

An Introduction to Web Scraping with Ruby

静的ウェブページをクローリングする場合

  1. Net::HTTP、HTTParty、open-uri などの HTTP クライアントでリクエスト発行。
  2. Nokogiri で HTML パース。

SPA などの動的ウェブページは、Kimurai フレームワーク + Selenium Chrome

The AWS SDK for Ruby v2 End of Life Dates Announced

AWSSDK v2 は 2021 年 11 月サポート終了。

Articles & Tutorials

Postgres Indexes for ActiveRecord Join Tables in Rails Apps

PostgreSQL での JOIN テーブル作成。

  • HABTM、create_join_table migration は非推奨。PK なしの拡張しづらいテーブルを作ってしまうから。
  • 複合インデックス 1 つだけで十分。

A Look at Ruby 2.7's Enumerable#filter_map

Enumerable#select + Enumerable#map = Ruby 2.7 の Enumerable#filter_map

Considering Rails Multitenancy in 2020

メンテされなくなった apartment gem から activerecord-multi-tenant に移行する手順。おまけに Carrierwave 添付画像の移行手順。

Graceful Request Retries in Ruby Applications

処理失敗時の再実行方法まとめ。

  • retry キーワード
  • retriable gem
  • Sidekiq や Resque の retry 設定
  • 各ツールの独自エラー処理

Build an App with Active Record + CockroachDB

CockroachDB の ActiveRecord アダプター。

Rails Architecture Tips From Route Helpers

7 つの CRUD アクション以外のアクションを生やすと、名詞_動詞 のキモいパスヘルパーができてしまう。ネストしたリソース切ろというヒントでもある。

Code and Tools

Comma: A CSV Generation Extension for Ruby Objects

配列や ActiveRecord オブジェクトから CSV を生成してくれる gem。

EBNF: An EBNF Parser and Generic Parser Generator

EBNF パース用 gem。

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

rubyweekly.com

Highlights

Why and How 'mkdev' Switched to Fullstaq Ruby

サーバに特化した Fullstaq Ruby に移行した mkdev 社。メモリ使用率はそんなに変わってないが、激しく変動してたのが安定になった。アラート閾値超えなくなった。

The RuboCop Name Drama Redux

米黒人暴行死の騒動で RuboCop 改名案の issue が挙がった。ユーザへの影響と工数が見合わないなどの理由を挙げたメンテナーは issue を閉じたが、その後も炎上した挙句、issue をロックすることに余儀なくされた。

RubyFlow: A Ruby Community Link Blog

GitHub アカウントを持っているなら誰でも投稿できる Ruby コミュニティブログ。Ruby Weekly のネタもここから。

ParallelTests 3.0: More Cores Equals Faster Tests

テスト並列実行用 gem。

Articles & Tutorials

Exploring Metaprogramming in Ruby

メタプロの使い道まとめ。

  • モンキーパッチ
  • マクロ
  • DSL
  • シングルトンクラス
  • 動的メソッド定義

Ruby Refinements

Refinement 解説。

  • モンキーパッチより影響範囲が限られてる
  • スコープは同一ファイル内 or 同一モジュール内 or 同一クラス内

I Created The Same App with Rails and 'No' JavaScript

JavaScript をほとんど書いてない ActionCable アプリを CableReady で実装した話。チャンネル定義が唯一の JS ファイル。

Code and Tools

TestBench: A 'Principled' Test Framework

シンタックスを必要最低限に抑えたテストフレームワーク gem。

ansible-rails: An Ansible Playbook for Rails App Deployment

Rails + Sidekiq + Puma + PostgreSQL + nginx 用 Ansible プレイブック。

redis-rb 4.2: The Ruby Client Library for Redis

redis クライアント用 gem。

Regexp::Parser: A Regular Expression Parser Library

正規表現パース用 gem。

Active Record SQL Server Adapter 6.0: The SQL Server Adapter for Rails

ActiveRecordSQL Server アダプター用 gem。

ROXML 4.1: Ruby Object to XML Mapping Library

XML 生成用 gem。

Amazing Print 1.2: Pretty Print Your Ruby Objects with Style

インデント・色付き出力で puts してくれる gem。

Pallets: A Simple Workflow Engine

タスクを依存順に実行してくれるワークフローエンジン gem。並列実行できるタスクは並列実行。

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

rubyweekly.com

Highlights

The Results of a Survey into RuboCop's Defaults

Rubocop ユーザ調査結果。多くは

  • シングルコーテーション使う
  • 1 行 120 文字まで
  • 配列・ハッシュ末尾に , 付けない
  • and or を一切使わない
  • !! を boolean 変換だけで使う
  • ハッシュ内にスペースを空ける
  • Kernel 系メソッドは () を使わない
  • CyclomaticComplexity cop が役に立つ
  • Rubocop のデフォ設定がまあまあ満足

delete_in_batches: A Fast Way to Delete with Active Record

大量の ActiveRecord を高速削除してくれる gem。

Creating a Ruby Gem with Rust

Rust で gem を作る手順。

Articles & Tutorials

Never Query the Same Thing More Than Once

同一レコードの多重 SELECT を減らす方法解説。ActiveRecord::Associations::Association#target を設定することで lazy load を阻止する。

From 25 Minutes to 7 Minutes: Improving the Performance of a Rails CI Pipeline

Gusto 社の CI 高速化戦略。

  • flaky テストを skip して担当者に解消してもらった
  • RSpec デフォに戻した(テスト順番ランダム化、Rails の autoloader 採用、テスト間依存断絶)
  • 2 分以上かかるテストを skip して担当者に軽量化してもらった
  • 各テストの実行時間を DB に保存して knapsack gem で均等に並列実行

Rails 6.1 Adds Support for Signed IDs to Active Record

JWT トークンなどとして使える、Rails 6.1 の signed_id

Two Commonly Used Rails Upgrade Strategies

Rails バージョンアップの 2 戦略のメリデメ比較。

筆者はデュアルブート推奨。

Speeding Up Rails with Memoization

メモ化の解説。

A Quick Comparison of Approaches to Multitenancy in Webapps

マルチテナント実装方法 3 通りの比較。

  • テナント識別用 FK
  • テナントごとに専用テーブル作成
  • テナントごとに専用 DB 作成

Code and Tools

pry-rescue: Start a Pry Session Whenever Something Goes Wrong

例外発生時に pry で入るための gem。

Dynamoid 3.5: A Ruby ORM for Amazon's DynamoDB

DynamoDB 用 ORM gem。

webmention-client-ruby: A Ruby Gem for Sending Webmention Notifications

ウェブメンション送信用 gem。

PgHero 2.5: A Performance Dashboard for Postgres

PostgreSQL 監視用ダッシュボード。

Rambulance: Dynamically Render Error Pages for Rails Apps

Rails エラー画面 or JSON レスポンスを返してくれる gem。

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

rubyweekly.com

Highlights

TruffleRuby Now Passes All RubyGems Tests

RubyGems は TruffleRuby でもテストが全て通るようになった。他に全部通ってるのは MRI だけ。JRuby でもテストしてるが、一部スキップせざるを得ない。

Why Does Rails 6 Include Both Webpacker and Sprockets?

Rails 6 が Webpacker になったのにもかかわらず Sprockets を維持してる理由。Webpacker が JS 経由で CSS・画像をインポートしてるのがキモイから。

Articles & Tutorials

Neural Networks in Ruby: A Not-So-Scary Introduction

RubyFann gem でニューラルネットワークを実装した話。

An Animation of the SHA-256 Hash Function in Your Terminal

SHA-256 暗号化の各工程をアニメーションで表現する CLI。そして各工程の説明が README に載ってる。

Rails 6 System Tests, From Top to Bottom

Rails 6 システムテスト各要素の説明。

  1. webdrivers gem はプラットフォームに合ったブラウザーの WebDriver を特定して用意してくれる。
  2. MiniTest から Capybara ヘルパーを呼ぶ。
  3. Capybara は selenium-webdriver を呼ぶ。
  4. selenium-webdriver は、webdrivers gem が特定したブラウザーの WebDriver を WebDriver プロトコールで呼ぶ。
  5. WebDriver がブラウザーを操作する。
ブラウザー WebDriver
Chrome chromedriver
Firefox geckodriver
MS Edge edgedriver
Safari safaridriver

Correct Ruby Threads and ActiveRecord Connections

マルチスレッドで DB を叩いたら発生する ActiveRecord::ConnectionTimeoutError の解消法。

  • 終了したスレッドが connection を解放してくれないから、最後に ActiveRecord::Base.clear_active_connections! 呼ぶこと。
  • pool が足りるように ワーカー数 * (スレッド数 + 1) で設定。

Run Rails 6 System Tests in Docker Using a Host Browser

docker コンテナ内のシステムテストをホストのブラウザで実行させる手順。筆者の Avdi Grimm 先生でも調べるのが大変だったらしい。

  1. webdrivers gem 削除。
  2. テストサーバノポート固定化。
  3. Capybara サーバ用環境変数を docker-compose.yml で設定。
  4. Capybara サーバ用環境変数を使うように test_helper.rb 設定。
  5. ApplicationSystemTestCase が remote ブラウザーを使うように設定。
  6. ホストに chromedriver インストール・起動。
  7. docker コンテナ内でテスト実行。

Upgrading a Trivial Rails App from Ruby 2.3 to 2.7 and from Rails 4.2 to 6.0

簡易 Rails アプリを Ruby 2.3→2.7、Rails 4.2→6.0 にアップグレードした話。

  • Ruby 2.3.1→2.3.8→2.4.10→2.5.8→2.6.3 のアップグレードは順調。
  • Rails 4 から一気に 5.2 にアップグレードしたら痛い目に会った。4→5.0→5.1→5.2 のように、マイナーバージョンごとに deprecation 解消していくことがオススメ。
    • manifest.js がないというエラーは、空っぽの manifest.js を用意することで解消。
    • 結合テストが実行できなくなってたのは、HTTP メソッド引数を最新 API に合わせることで解消。
    • uglifier gem 追加することで assets:precompile 実行できるようになった。
  • Rails 6 へのアップグレードは、sqlite gem だけ追加する必要があった。

Code and Tools

Limit Everything: Timeouts for Shell Commands in Ruby

暴走したシェルコマンドのせいで非同期ジョブのキューが停滞してしまった John Nunemaker 先生。posix-spawn gem に移行することでタイムアウトさせるようにできた。

Pry Remote: Connect to Pry Remotely

Foreman だと pry への入力が見れない問題を解消してくれる pry-remote gem。