rastam on rails

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

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。

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

rubyweekly.com

Highlights

JIT and Ruby's MJIT

JIT、MJIT の比較的分かりやすい解説。

  • JIT でコードが速くなる一方で、メモリを食うのと、高速化までは時間がかかる
  • MJIT は Ruby の現行 JIT 実装(デフォはオフになってる)
  • MJIT が導入に至った経緯
  • Rails だと重くなる

Ruby, Where Do We Go Now?

Ruby 2.7 への不満をこぼした Rubocop のメンテナー。

  • たった 3 人の苦情で復活した flip flop 演算子
  • numbered parameters など機能追加しすぎ
  • revert 済みの |> 演算子はそもそも Elixir と挙動が違ってて完全に無意味
  • .: がボツになったのは残念だが Matz の決断力が良かった
  • parameter forwarding は大歓迎
  • Ruby への機能追加プロセスがカオスで、Ruby の成長を不安定にし、Rubocop などのメンテナーに負担をかけている

An Epic Collection of Ruby One Liners

巨大な Ruby ワンライナー集。

Articles & Tutorials

Decimating Deprecated Finders

Synvert gem で Rails の非推奨となった finder メソッドを書き換えた話。

Nested API Parameter Validation in Rails with ActiveModel::Validations

API のネストされていた JSON 引数を ActiveModel::Validations でチェックした話。各 JSON オブジェクトの ActiveModel オブジェクト定義してネスト用共通ロジックを親から継承している。

Working Around ActiveRecord Callbacks

テスト環境などで ActiveRecord コールバックを無効にした話。attr_accessor で定義したフラグというハックで。

Rails 6 Adds Ability to Block Writes to A Database

DB への書き込みを一時的に止めてくれる、ActiveRecord 6 の while_preventing_writes ブロック。DB 全体へのロックのようなもの。弾かれた書き込みは ActiveRecord::StatementInvalid エラーを投げ返される。

The Case for Stabby Lambda Notation

冗長な lambdaproc キーワードを書くのをやめて -> 書こうという主張。

  • 完結。
  • 視覚的に目立つ。
  • 複数行の lambda をデフォで lambda にする Rubocop ルールには反対。do ... end のせいで普通のブロックと間違えやすい。

How to Set Up an AWS RDS Database for Rails

EC2 上 Rails アプリ用 AWS RDS データベース構築手順。

Behind The Scenes of GitHub's Vulnerability Alerts

GitHub 脆弱性アラートの仕組み。Gemfile などに新規 gem 追加してコミットするたびに、該当 gem のメタデータRubygems から取得するバックグラウンドジョブが走る。それとは別に、米国立 National Vulnerability Database や gem メンテナーの注意書などの情報源を社内で集めている。この情報源をもとにした機械学習モデルが、CVE と gem のマッピングを結び、GitHub 社内リポジトリーに PR を出す。キュレーションチームが PR をレビューしてマージしたら、バックグラウンドジョブがその gem に依存しているリポジトリー宛にアラートを飛ばす。

Code and Tools

Win32::Screenshot: Capture Screenshots on Windows from Ruby

Windows でスクショを撮ってくれる gem。

Godmin 2.0: An Admin Framework for Rails 4

Rails 管理画面フレームワークDSL ではなく普通のコントローラなど生成し、共通機能をモジュールで include

Torch-rb: Deep Learning for Ruby, Powered by LibTorch

深層学習用 gem。裏は LibTorch で、APIPyTorch に合わせてる。

rack-mini-profiler: Profiler for Your Rack Apps in Dev or Production

パフォーマンス計測用 gem。

Opal 1.0.1: The Ruby to JavaScript Compiler

RubyJavaScript コンパイラーのパッチリリース。

Snabberb: A Simple Component View Framework for Opal

Opan 用フレームワーク