rastam on rails

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

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

rubyweekly.com

Highlights

How to Build An App, Get Acquired by GitHub, Buy An App Back From GitHub and Then Sell It Again

Speaker Deck の経歴。

  • Ruby + ImageMagick で実装。
  • RubyConf で GitHub CEO に出会った。
  • GitHub に買収され、作成者が GitHub 社員となった。
  • GitHub では、(作成者に)メンテされてたが、あまり成長してなかった。
  • 作成者が GitHub から買収する決意をした。
  • GitHub は即刻、作成者が提案した値段よりも 90% 安く売ってくれた。なぜかというと、Microsoft 買収の話が決まってた。SlideShare を商品にしてる Microsoft に Speaker Deck を殺されたくなかったから。
  • 作成者は広告収入で運用費を一部賄ったが、コロナで広告収入 0。
  • 有料機能実装で初月から黒字化。
  • Box OutFlipper Cloud と同時に運営するのがストレスとなったから、Speaker Deck を売ることにした。

Articles & Tutorials

A VCR + WebMock "Hello World" Tutorial

VCR ようわからん人向けチュートリアル

Rails 7 Enables Scoping to Apply to All Queries

ActiveRecord.scoping メソッド知らなかった。

Code and Tools

Reform 2.6.0: Form Objects Decoupled From Models

フォームオブジェクトに特化した gem。nested attributes もいい感じにやってくれるらしい。

wt_activerecord_index_spy: Report Missing Database Indexes

あったほうがいいインデックスを検知してくれる gem。

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。