rastam on rails

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

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。

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

rubyweekly.com

Highlights

Ruby Next: Make All Rubies Quack Alike

別バージョンの Ruby にトランスパイルしてくれる Ruby Next gem の紹介。

  • gem の Ruby バージョン間互換性を維持するために作った Vladimir Dementyev 先生
  • メソッドだけなら refinements で簡単・安全にバックポートできるが、シンタックスはトランスパイルするしかない
  • parser gem で生成した AST を unparser gem で対象 Ruby バージョンに書き出す
  • アプリで使う場合は run-time モードで実行中にリアルタイムトランスパイル
  • gem で使う場合は CLI でトランスパイルしたファイルを生成して .gem パッケージに組み込む

Take the 2020 Ruby on Rails Survey

今年の Rails 利用者調査は 7/15 まで実施。

Articles & Tutorials

How to Set Up Factory Bot on a Fresh Rails Project

新規 Rails アプリに FactoryBot を導入する手順。

  1. factory_bot_rails gem インストール
  2. Factory 定義
  3. Faker gem インストール
  4. rails_helper.rb に config.include FactoryBot::Syntax::Methods 追記

5 Uses for 'Splats'

* の使い道例。

  • 配列を配列に挿入 [:foo, *middle, :qux]
  • メソッドの全引数を配列で参照 def foo(*bar)
  • 配列を最初・最後・その他の要素に分解 first, *, last = [1, 2, 3, 4, 5]
  • 単一オブジェクトを配列に変換 *1
  • 配列をハッシュに変換 Hash[*[:foo, 1, :bar, 2, :baz, 3]]

Running Multiple Instances of Webpacker

Webpacker のポート番号は webpacker.yml で設定できるが、環境変数YAML 内 ERB では設定できない。

Performing Asynchronous HTTP requests in Rails

JavaScriptfetch() メソッドで RailsAJAX 機能を実装する話。レスポンスは partial の HTML で、そのまま DOM を置き換える。

How to Use AWS SimpleDB from Ruby

AWS SimpleDB まとめ。

  • DynamoDB よりシンプル・安い
  • Lambda などの一時的永続化に向いてる
  • aws-sdk-simpledb gem で

Code and Tools

Rodauth 2.0: Ruby's 'Most Advanced' Authentication Framework

どんな Rack アプリでも使える認証用 gem。

Business: Business Day Calculations for Ruby

営業日数計算用 gem。祝日自由に定義可能。

Lockbox: Modern Encryption for Rails

ActiveRecord カラムを暗号化してくれる gem。

split: The Rack Based A/B 'Split' Testing Framework

Rack アプリ向け AB テスト用 gem。