rastam on rails

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

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。

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

rubyweekly.com

Highlights

Mining for Malicious Ruby Gems: 700+ Gems Affected

gem 名 typo を狙ってる悪質 gem 760 個も検知した Reversing Labs 社。問題の gem は全部 RubyGems から削除済み。

悪質 gem の中で一番インストールされた gem は、Windows クリップボードにコピーされた仮想通貨ウォレットを攻撃者のウォレットで置き換えてる。

Full Text Search in Milliseconds with Rails and Postgres

PostgreSQL 12 以上の全文検索機能解説と Rails での導入方法。

  • to_tsvector 関数で単語正規化
  • to_tsquery 関数でクエリ正規化
  • ts_rank 関数でランク付け
  • pg_search gem
  • 正規化した単語をキャッシュするカラムを追加する migration

Rails Performance: When is Caching the Right Choice?

デメリットを伴うキャッシュを実装する前の代替案検討手順。

  1. rack-mini-profiler gem でネック特定。
  2. benchmark-ips gem で軽量化前後のパフォーマンス測定。
  3. ネックがビュー or DB or アプリコードのどれにあるか特定。それぞれ軽量化方法が違う。

Articles & Tutorials

RSpec Given/When/Then with Symbols

rspec-given で feature spec 可読性向上。

Looking Inside a Ruby Gem

gem build コマンドが生成する .gem ファイルの中身解説。

Logic-less Ruby Templates with Mustache

ビューへのロジック埋め込みを不可能にしてくれる mustache フレームワーク

Code and Tools

Impressionist 2.0: A Plugin to Log Impressions in Rails Apps

インプレッション数を DB で保存してくれる gem。ボット無視してくれる。メンテナー募集中。

acli 0.3: A Command Line Client for Action Cable

Action Cable クライアント用 CLI

Undercover: A Tool to Stop You Shipping Untested Code

変更したコードの差分内の、テストされてないコードを検知してくれる gem。

Bridgetown: A Modern Ruby (JAMstack) Web Framework

JAMstack 方式の静的サイト用フレームワーク。Webpack に対応した Jekyll フォーク。

net-ssh 6.0: A Pure Ruby Implementation of the SSH2 Client Protocol

SSH クライアント用 gem。

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

rubyweekly.com

Highlights

Super Bombinhas: An In-Development Platform Game in Ruby

Ruby で実装されたプラットフォーム・ゲーム。

70+ Ruby and Rails Security Best Practices and Vulnerabilities

Rails が提供してくれるセキュリティ機能。

  • X-Frame-Options ヘッダー
  • X-XSS-Protection ヘッダー
  • X-Content-Type-Options ヘッダー
  • X-Download-Options ヘッダー
  • X-Permitted-Cross-Domain-Policies ヘッダー
  • Referrer-Policy ヘッダー
  • Content-Security-Policy ヘッダー
  • Feature-Policy ヘッダー
  • SQL インジェクション防止
  • データサニタイズ
  • CSRF
  • セッション周りセキュリティ
  • SSL 制御

Rails 外セキュリティ機能。

A Few of My Favorite Things

Test Double 社エンジニアが愛用している CLI ツール集。

  • Homebrew brew
  • 簡略化した man ページを提示してくれる tldr
  • 高速検索用 ripgrep rp または The Silver Searcher ag
  • GitHub 操作用 hub または gh
  • localhost の URL 化用 ngrok
  • コピペ用 pbcopy (MacOS) または xclip (Linux)
  • ファジー検索用 fzf
  • ls 代替用 exa
  • cat 代替用 bat
  • 色付きログ出力用 grc
  • curl +αの httpie または curlie
  • JSON フォーマット・フィルター用 jq
  • git ログ閲覧用 tig
  • ポート調査用 lsof
  • xargs

The 'Citadel' Architecture?

AppSignal 社の Citadel アーキテクチャー解説。

  • 本体は Rails モノリス + React フロントエンド。
  • 監視データ収集がネックになるため別アプリ。元々は Sinatra だったが、今は Rust + Kafka。

Articles & Tutorials

Heredocs and How to Use Them

HEREDOC 使い方まとめ。

  • <<HEREDOC
  • <<-HEREDOC
  • <<~HEREDOC
  • <<-HEREDOC.strip_heredoc
  • <<~HEREDOC.squish

Our Rails Upgrade Process: How to Bundle Update Rails

FastRuby 社の Rails バージョンアップ手順。

  1. production.log、test.log の deprecation 撲滅
  2. next_rails gem で dual boot 設置
  3. 各 gem バージョンアップ可否調査
  4. 新規 Rails バージョン用ブランチ・PR 切る
  5. 非互換性 PR は新規 Rails バージョン用ブランチに向ける。それ以外は master。
  6. QA・動作確認
  7. 新規 Rails バージョン用ブランチを master にマージ

Why You (Probably) Don't Need PostGIS

PostgreSQL で位置情報を管理するだけなら、PostGISYAGNI。緯度・経度カラムだけで十分。距離も earth_distance 関数でできちゃう。

How to Restart Sidekiq Automatically for Each Deployment

デプロイ時 Sidekiq 再起動手順。

  1. sidekiq.service ファイル作成・設定
  2. 必要な環境変数を sidekiq.service の EnvironmentFile で設定
  3. systemctl enable sidekiq でサービス登録。
  4. service sidekiq start でサービス起動。

A Hands-On Tutorial to Debugging Your Code with pry-byebug

pry-byebug でデバッグするチュートリアル

  • binding.pry
  • next
  • continue

Code and Tools

Gruff Graphs: A Graphing Library for Ruby

グラフ画像生成用 gem。

amazing_print: Pretty Print Your Ruby Objects with Style

色付きでフォーマットされた Ruby オブジェクトを puts してくれる gem。

Slack-Ruby-Bot: A Generic Slack Bot Framework

Slack ボット用フレームワーク

Brutal: A Code-First Approach to Automate The Writing of Unit Tests

YAML を元にテストを生成せいてくれるテストフレームワーク

CSV Shaper: A DSL for Creating CSV Output

CSV 生成用 DSL を提供してくれる gem。

Chatwoot: Simple, Open Source Live Chat Software

OSS のチャット用 Rails アプリ。