rastam on rails

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

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

rubyweekly.com

Highlights

A Proposal for 'Endless' Method Definitions?

遠藤侑介さんの end なしメソッド案。

Ruby 2.7.1 Released (And 2.6.6, 2.5.8 and 2.4.10..)

Ruby のセキュリティパッチ。

Why Is Rails Boot Slow on macOS?

macOS 上の重い Rails ブート相談スレ。

RailsConf 2020.2: It's RailsConf, But From Your Couch

中止となった RailsConf 登壇社の一部が録画した自分のトークが 5/5 公開。

Articles & Tutorials

Changing the Approach to Debugging in Ruby with TracePoint

TracePoint.traceデバッグする方法。大量の puts を埋め込むより楽。

How an Index Route Without Pagination Could Hurt Your App

ページネーションのない API が叩かれて 560 万レコード返そうとした Puma プロセスがメモリ暴走で自滅した話。デバッグで学んだこと:

  • メトリックスがなければそもそもデバッグできなかった
  • サーバのログを追うには bashvim の基礎知識が必要
  • ページネーション実装しとこう
  • Puma はタイムアウトがない

Code and Tools

Optimism: A Drop-in Solution for Realtime Remote Validation in Rails

リモート validation 用 gem。サーバ側で validation 実行してからエラーをウェブソケットで返してくれる。

Open-Sourcing Vessel: A Ruby Web Crawling Framework by Evrone

クローラーフレームワーク

puma-status 1.0: Command-line Tool to Display Information About Puma Processes

Puma プロセス情報表示用 CLI ツール gem。

pg_query: Use Postgres's SQL Parser from Ruby

PostgreSQL クエリをパースしてくれる gem。

40+ Ruby on Rails Application Monitoring Tools

Rails モニタリングまとめ。

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

rubyweekly.com

Highlights

TableSmith: A Simple Terminal Table Renderer

ActiveRecord や PORO の集合体で CLI 表を描画してくれる gem。

'Fear-Free' Postgres Migrations for Rails

ダウンタイムを起こさない PostgreSQL 向け migration をコンパイルしてくれる Nandi gem。Nandi の DSL で書いた migration に対して rails generate nandi:compile 実行したら、ActiveRecord の migration が生成される。

RailsConf 2020 Cancelled

コロナで RailsConf が中止となった。参加費は全額返金。

Articles & Tutorials

How We Migrated From Timecop to Rails 5.2's Time Helpers

Timecop から ActiveSupport::Testing::TimeHelpers に移行した話。

  • Timecop.return してない Timecop.freeze がいくつかあった。ちゃんと freeze_time ブロックに書き換えた。
  • 終始 freeze_time したい spec は around フックで freeze_time 用メタタグ定義することで DRY にした。

Getting Started with Elasticsearch and Ruby

Elasticsearch 導入チュートリアル

(Make Your Tests) Necessary and Sufficient

テストは必要条件・十分条件を両方満たすべきだという、故 Jim Weirich 先生の名言解説。

  • 今後実装されるだろうという機能の YAGNI なテストや、実装コードで定義されてない分岐のテストがあれば、必要条件が満たされてない。
  • テストが仕様を網羅できてなければ、十分条件が満たされてない。
  • 満たしてない場合は、実装コードの設計に問題があるかもしれない。

Code and Tools

Barcharts: Simple Terminal Barchart Rendering

CLI 棒グラフ描画用 gem。

kt-paperclip: A Maintained Fork of Paperclip

deprecated となった Paperclip gem をフォークして継続メンテされている kt-paperclip

Delivery Boy: A Simple Way to Publish Messages to Kafka

Rails 用 Kafka クライアント gem。

Version Cake 4.0: An Unobtrusive Way to Version APIs in Rails or Rack Apps

Rails API のバージョン指定用 gem。JBuilder などのビューは *.json.v1.jbuilder といった拡張子で制御。

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

rubyweekly.com

Highlights

The Art of Writing a Good Ruby Gem Specification

gemspec の書き方。

項目 備考
name gem 名
version ソース内定数で設定することが主流。他 gem が参照できるように。
summary 簡易説明文。10 ワード以下がオススメ。
description 長めな説明文。
author または authors 作成者名
license 何でも OK なら "MIT"。迷ってたら https://choosealicense.com/ を参考に。
email 問い合わせ用メアド
homepage GitHub リポジトリの URL が主流。
metadata.bug_tracker_uri GitHub リポジトリの Issues URL など
metadata.changelog_uri CHANGELOG.md への URL(あれば)
metadata.documentation_uri rubydoc.info などの URL(あれば)
metadata.homepage_uri spec.homepage
metadata.mailing_list_uri メーリスへの URL(あれば)
metadata.source_code_uri GitHub リポジトリの URL など
metadata.wiki_uri GitHub リポジトリWiki URL など
metadata.funding_uri クラウドファンディングサイトの URL など
files テストファイルを外す gem が多い。gem のダウンロードを軽くするために。
test_files オワコン。スキップすることがオススメ。
require_paths %w[lib] が主流。
executables 公開する CLI コマンド名
bindir 公開する CLI コマンド保存先パス。exe がオススメ。bin だと開発環境用コマンドが紛れ込みがち。
extra_rdoc_files ソースないコメント以外の RDoc 生成用ファイル。普段は Dir["README.md", "CHANGELOG.md", "LICENSE.txt"]
rdoc_options RDoc 生成用オプション
required_ruby_version 互換性できてる最古 Ruby バージョン
platform OS など制限する必要がなければ、スキップすることがオススメ。
add_dependency 依存してる外部 gem。バージョンも指定しよう。
add_development_dependency 依存してる開発環境用外部 gem。バージョンも指定しよう。
cert_chain 公開鍵へのパス。certs フォルダー配下が主流。
signing_key 秘密鍵へのパス

Official Docs for Ruby 2.7's Pattern Matching

Ruby 2.7 のパターンマッチの新しく公開されたドキュメンテーション

RubyKaigi 2020 Postponed Due to Coronavirus

コロナのせいで 9 月まで延期となった RubyKaigi。

Spree 4.1: The Rails 6 Based Ecommerce Platform

EC サイト用 Rails エンジン。モバイル端末に最適化した UI をリリースした。

Articles & Tutorials

Using Hanami::API on Amazon AWS Lambda

AWS Lambda で Hanami::API を稼働する方法。

  • Lambda 関数が Rack 環境を用意するように書く。
  • bundler で依存してる gem を vendor して、ソースと一緒に zip。

Building a Rails App That Uses Multiple Subdomains

Rails アプリでサブドメ対応。

  • routes は constraints ブロックの subdomain 引数で指定。
  • サブドメの階層が深い場合は config.action_dispatch.tld_length 要指定。
  • 全サブドメでセッションを共有する場合は Rails.application.config.session_storedomain: :all 指定。
  • テストは host! ヘルパーでサブドメ切り替え。
  • 手元は /etc/hosts ファイル編集 or pow サーバ採用。

  • 開発環境から外部 API 叩いてる場合は、.localTLD を許容しない API が多々ある。
  • ロードバランサー用 healthcheck エンドポイントはサブドメ付けれない。
  • サブドメのない root パスに依存してる gem がそこそこある。

Converting Unix Epoch Timestamps to Ruby Objects

Unix タイムスタンプを Time オブジェクトに変換してくれる Time.at。時間帯は in 引数で指定。

Rails 6 Added 'Jitter' to ActiveJob::Exceptions.retry_on

大量の ActiveJob が同時に retry されることを防ぐために、retry 間隔をランダム化する Rails 6 の jitter 機能。

Faster Excel Parsing in Ruby

Excel スプレッドシートのパース用 gem をベンチマークした結果。xsv gem が最速。

A Secret Weapon For Your Rails Apps? RPC with RabbitMQ and Hutch

マイクロサービス間 RPC を RabbitMQ と Hutch gem で実装してみた話。

  • マイクロサービスは外部から叩かれる必要がなければ、それぞれの REST API や認証周りをわざわざ作る必要がない。
  • バックグラウンドジョブ感覚で社内 RabbitMQ に投げるだけ。
  • RabbitMQ 操作は Hutch が抽象化してくれる。
  • Hutch 自体は RPC 機能がないが、ちょっと書くだけで実装できちゃった。
  • RabbitMQ の amq.rabbitmq.reply-to 擬似キューでレスポンスまで返せちゃう。

Code and Tools

Spreadsheet Architect v4.0.0 Released

ActiveRecord や PORO の集合体をスプレッドシートCSV に変換してくれる gem。

Chaskiq: An Open Source Conversational Marketing Alternative

CS チャット用ウィジェット。管理画面は Rails アプリ。Intercom と違って OSS で自己ホスティングできる。

FakeRedis: An In-Memory Driver for redis-rb

Redis をテストでスタブしてくれる gem。

Valvat 0.9: Validates European VAT Numbers

ヨーロッパの VAT 番号 validation 用 gem。

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

rubyweekly.com

Highlights

Introducing Hanami::API

Hanami の APIフレームワーク登場。パフォーマンスが速いらしい。

AWS Lambda Now Supports Ruby 2.7

Ruby 2.7 も使えるようになった AWS Lambda。

RubyKaigi 2020 Schedule Revealed

4 月の RubyKaigi 2020 スケジュール発表。

Articles & Tutorials

How to Test Static Sites with RSpec, Capybara, and Webkit

Jekyll 静的サイトのリンクが全て遷移できるかどうかを、Capybara でテストした話。

Rails Mistakes That Could Break Your Production Servers

ダウンタイムをうっかり起こしちゃう方法。

  • ActiveRecord::Base.transaction 乱用
  • rails console --sandbox
  • 重い migration
  • DB コネクションプール不足
    • puma、sidekiq などの設定が config/database.yml の pool を超えないように要注意
    • PostgreSQLmax_connectionsPGTune で調整

Rails Has Added a 'Strict Loading' Mode to Prevent Lazy Loading

N+1 防止用 Rails 6.1 の strict_loadingincludes 付け漏れたら ActiveRecord::StrictLoadingViolationError を投げてくれる。

Using 'Pending' Cops in Rubocop to Make Upgrades Easier

Rubocop の新規 cop の Enabled フラグを明示的に設定するまでは警告を出力するようになった。

Deep Dive Into rackup

rackup コマンドのコードリーディング。.ru ファイルは Rack::Builder オブジェクトの binding で eval される。

Partitioning Parallel Tests On Heroku CI

Heroku CI でテストを並列実行するように設定する手順。。

Code and Tools

Better Errors: A 'Better Error Page' for Rack Apps

エラー調査に役立つ画面を表示してくれる Rack ミドルウェア gem。

Rpush 5.0: A Push Notification Service for Ruby

プッシュ通知用 gem。

will_paginate 3.3: A Pagination library for Rails, Sinatra, and More

ページネーション用 gem の Ruby 2.7・Rails 6 に対応したマイナーバージョン。

acts_as_list 1.0: An ActiveRecord Plugin for Managing Lists

ActiveRecord 表示準操作用 gem。

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

rubyweekly.com

Highlights

Ferrum: A High Level Ruby API to Control Chrome

Chrome ブラウザー操作用 gem。headless も non-headless も対応してる。

How I MITM'd RubyGems.org... Kinda

rubygems.orgtypo で打ってしまいそう rubgems.org ドメインを買ったエンジニアが、中間車攻撃してみた話。

  • gem install--source オプションを typo してても攻撃できなかったのでセーフ。
  • Gemfile の sourcetypo したら攻撃できちゃった。
  • 3 ヶ月で 101 人も rubgems.org 叩いちゃった。
  • rubygems、bundler などのメンテナーには報告済み。

The Top Ruby HTTP Clients for 2020

HTTP クライアントまとめ。

HTTP クライアント 備考
Ruby コアの net/http 使いづらい
Faraday gem ドキュメンテーション最高
http.rb gem 速い
rest-client gem 直感的なインタフェース
httparty gem 人気者
excon gem
Typhoeus gem 1 年以上更新されてない
curb gem

date-formatter: Format Dates by Example

January 02, 2006 などの文字列を渡したら、strftime フォーマットを返してくれる gem。

Articles & Tutorials

Linking a Webcam Directly to Rails' ActiveStorage

ウェブカメラで撮った写真を直接 ActiveStorage にアップロードした話。HTMLCanvasElement.toDataURL()base64 データを hidden_field に設定することで。

Ruby 2.7 Adds Enumerable#tally

配列の要素をグループ化したカウントは、Ruby 2.7 の Enumerable#tally で集計できるようになった。

Decoupling Ruby: Delegation vs Dependency Injection

prawn gem で PDF を複数生成してる Honeybadger 社が、各 PDF の要素をまとめた概要 PDF を生成することになった。

  • DRY にするために、Prawn::Document オブジェクトを依存性注入方式で注入することを検討したが、注入したオブジェクト経由で prawnDSL を呼ぶというオーバーヘッドが発生した。
  • 最終的に SimpleDelegatorPrawn::Document の擬似継承することにした。

How to Build a WhatsApp Chatbot with Ruby, Sinatra and Twilio

Sinatra + Twilio で WhatsApp チャットボットを作るチュートリアル

Migrating User Passwords From Django to Ruby

Django アプリのパスワードを Ruby 用に移行した話。Django の PBKDF2 アルゴリズム + SHA256 ハッシュの代替案として、pbkdf2 gem があったため、既存パスワードはそのまま使えた。

Putting All Your Mailer Views in One Place

ActionMailer 用ビューが ActinController 用ビューと一緒に紛れ込んでるのが辛くて、prepend_view_path で ActionMailer 用ビューを分けた話。

Code and Tools

Oga: An XML/HTML Parser Written in Pure Ruby

XML・HTML パース用 gem。libxml に依存していないため、nokogiri よりインストールしやすい。

Fake API: A Faster Way to Prototype an API in Your Rails App

API プロトタイプ用 gem。

Groupdate 5.0: A Simple Way to Group Temporal Data

DATETIME などのカラムで GROUP BY できるようにしてくれる gem。

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

rubyweekly.com

Highlights

Exploring Big-O Notation with Ruby

O 記法の解説。

Error Handling with Monads in Ruby

エラー処理の歴史と、モナドの実装例。

  1. 最初は GOTO で。
  2. GOTO が追いづらくなってたから、エラーを表す戻り値を返す関数や、エラー状態を表すグローバル変数に。
  3. 例外誕生。
  4. 例外は制御構造として悪用されるようになり、モナド誕生

実装例は

  1. Dry::Monads のブロック表記で初期実装。
  2. do 表記にリファクター。
  3. ActiveRecord など外部リソースへの呼び出し箇所を Try でラッピング。

Articles & Tutorials

How to Pass Arguments to Methods in Ruby and How It Affects Their Arity

メソッド引数まとめ。

  • hoge(**args) 不特定多数の引数。
  • hoge(*) 不特定多数だが使われない引数。
  • hoge(**nil) キーワード引数がない宣言(Ruby 2.7 以降)
  • 各種引数の arity を記事内で羅列

Deploying a Rails 6 App with Dokku

Heroku みたいなデプロイができる、セルフホスティングRails 6 アプリを Dokku で構築する手順。

Backward-Compatible Database Migrations

破壊的な migration を 2 段階でデプロイすることを怠った失敗談。

  1. rename_column migration をコードレビューで見落としてしまった。
  2. その上に、長時間の migration をマージしてしまった。
  3. デプロイ中に migration が走っている 10 分もの間に、rename されたカラムを参照しているコードがエラってしまい、数百人ものユーザがログインできなくなった。

今後の未然防止策

  • migration があった場合はレビューを催促する CI スクリプト設置
  • db/**/**CODEOWNER をデータチームで設定。DB ファイルを触るコミットが入ったらデータチーム宛に通知が飛ぶように。
  • strong_migrations 検討中。

Handling and Customizing Ruby 2.7 Deprecation Warnings

Ruby 2.7 の deprecation を Sentry に飛ばしてくれる、コア RubyWarning モジュールのオーバーライド。

このオーバーライドを楽にしてくれる ruby-warning gem は 2 週間前の Ruby Weekly で紹介されている。

What Kinds of Rails Tests I Write and What Kinds I Don't

Rails with Jason ポッドキャストの Jason Swett 先生が基本的に書いているテストは

書かないテストは

  • controller spec、request spec。コントローラのコードは最低限に抑えるべきだから。
  • view spec、routing spec。feature spec でカバーできてるから。

Lambdas Are Better Than Procs

proc よりも lambda を使うべきだという主張。

  • 引数間違えたら lambda がエラーを投げてくれる。
  • lambda 内の return は外部ブロックを return しない。
  • lambda の見た目はメソッドに似てて、誤解を招かない。

Pay No Attention: Behind the Magic of Ruby DSLs

Active AdminDSL のソースを潜った結果、instance_execmethod_missing を知り得たエンジニアの話。

Gemifying Your Style Guide to DRY Your CSS

Ombu Labs 社全プロダクトの UI を統一させるために、スタイルガイドと CSSRails engine として gem 化した話。

Code and Tools

ruby_detective: Investigating Your Ruby Code Dependencies

クラスの依存関係グラフを描画してくれる gem。

tty-exit: Human-Friendly Terminal Exit Codes

読みやすい API で終了ステータスを返してくれる gem。

Counter Culture: 'Turbo-Charged' Counter Caches for Rails Apps

Railscounter_cache カラムを提供してくれる gem。Rails と違うのは

  • アソシエーションを直接結んでるモデルだけでなく、そのさらに先のモデルのキャッシュカラムも作れる。
  • レコード数だけでなく、任意の集計もキャッシュできる。
  • など。

Ruby/Git: A git Wrapper for Use from Ruby

git コマンドを呼ぶ DSL を提供してくれる gem。

OctoLinker: Links Together What Belongs Together in GitHub Repos

GitHub 上コードの requireinclude 文を該当ソースファイルへのリンクに変換してくれるブラウザー拡張。

ParallelTests: 2 CPUs = 2x Testing Speed for RSpec, Test::Unit and Cucumber

テスト並列実行用 gem。

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

rubyweekly.com

Highlights

Modern Ruby Serializers

ActiveModel::Serializer より軽量・高速な SimpleAMS gem の紹介。

Rails is Fast: Optimize Your View Performance

Rails ビュー軽量化戦略。

  • SQL の N+1 解消。
  • 不要なカラムなど DB からロードしない。
  • ビューから直接 DB 叩いてるクエリをコントローラに移す。重複しているクエリに気づいきやすくなる。
  • ページネーション。
  • Turbolinks で HTML レンダリング減らす。
  • AJAX で HTML レンダリング減らす。
  • WebSocket で HTML レンダリング減らす。
  • ビューをキャッシュ。
  • SQL クエリをキャッシュ。
  • DB インデックスを張る。

ReverseCoverage: Find Which Tests Execute Which Lines of Code

コードをカバーしているテスト特定用 ReverseCoverage gem 紹介。

Articles & Tutorials

URI.escape is Obsolete? What Now?

obsolete となった URI.escape URI.encode の代替案。素 Ruby では、クエリパラメータのみ URI.encode_www_form_componentURI.encode_www_formエスケープ。RailsHash#to_query Hash#to_param で。

Changing a UI Control and DB Schema on a Production Rails App

ゼロダウンタイムで belongs_to or has_many のプルダウンを HABTM のチェックボックスに移行する手順。

  1. HABTM 用テーブル作成。
  2. コールバック or DB トリガーデ HABTM 用テーブルに書き込む。
  3. 旧データを HABTM ようテーブルに書き込む。
  4. 新旧データ整合性確認。
  5. has_and_belongs_to_many アソシエーション、チェックボックスに切り替える。
  6. 不要なカラム、コールバック、トリガー削除。

Ruby 2.7 Allows Placing of Comment Lines Between Fluent Dots

Class
  # コメント
  .method

Ruby 2.7 以降は、こういう行間コメントが書けるようになった。

The Basics of Migrating to Strong Parameters

Rails 3 以前の attr_accessible attr_protected をストロングパラメータに移行する作業を一部自動化してくれる rails_upgrader gem の紹介。

Rails Flaky Spec Solutions

flaky テスト解消練習用 rails_flaky_spec_examples リポジトリーの紹介。

Code and Tools

ruby-warning: Add Custom Processing for Warnings

指定した警告を無視 or カスタム処理定義できるようにしてくれる gem。

Byebug: A TracePoint-Powered Ruby Debugger

今週 Ruby 2.7 に対応するようになった、デバッグ用 gem。

crass: A Ruby CSS Parser Compliant with the CSS Syntax Level 3 Spec

CSS パース用 gem。

Cache Crispies: A Fast, Flexible Rails Serializer

キャッシングを優先したシリアライザー gem。メンテ状態があやふやとなった ActiveModel::Serializer の代替案。

Quickbooks-Ruby: Use the Quickbooks Online REST API V3 from Ruby

Quickbooks Online API クライアント gem。

Commander: A One Stop Shop for Building Command Line Tools

CLI ツール用フレームワーク gem。

Truemail 1.5.1: A Configurable Plain Ruby Email Validator

メアド validation 用 gem。

Loaf: Manage and Display Breadcrumb Trails in Rails Apps

パンくず用 gem。