rastam on rails

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

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 用フレームワーク

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

rubyweekly.com

Highlights

Ruby 2.7 Adds Shorthand Syntax for Argument Forwarding

メソッドの引数を全部そのまま他のメソッドに渡せるようになる、Ruby 2.7 の ...

Main Takeaways From Matz's RubyConf 2019 Keynote

Matz の RubyConf 2019 キーノートあらすじ。

  • Ruby の第一優先はプログラマーの幸せ。
  • Matz は型アノテーション反対派なので、Ruby コアで実装されるのを期待しないほうがいい。どうしても欲しいという人は Sorbet。
  • Ruby 3 は来年 12 月リリース予定。
  • Ruby 2.7 新機能紹介。

Articles & Tutorials

Using Rubyfmt with Atom

Rubyfmt コードフォーマッターを Atom で使う手順。

Ruby Literals You May Not Know

知られざるリテラル

  • 分数用 Rationalr
  • 複素数Complexi
  • 文字列用 %
  • char 用 ?
  • 無限 Range..

From ActiveRecord Callbacks to Publish/Subscribe Pattern and Event-driven Design

Wisper gem でコールバックを pub/sub に移行することで ActiveRecord モデルの責務を減らす話。

Overpacking.. A Common Webpacker Mistake

webpack の precompile を重くする overpacking アンチパターン(packs 配下に application.js 以外のファイルを置くこと)。

raise Exception.new or raise Exception? They're The Same

raise Exception.newraise Exception が全く同じことの背景にある実装のコードリーディング。

Code and Tools

Strings::Inflection: Convert Between Singular and Plural Forms of English Nouns

英単語の単数形⇆複数形変換用 gem。

ImageProcessing: High-Level Image Processing Wrapper for Libvips and ImageMagick

ImageMagick、Libvips と併用できる画像処理 gem。

Statesman: A State Machine Library

ActiveRecord モデルに密結合してないことに拘るステートマシン用 gem。

Grape: An Opinionated Framework for Creating REST-like APIs

REST APIフレームワークの v1.2.5 リリース。

ProgressBar: A Progress Bar for Your Terminal Apps

CLI プログレスバー描画用 gem。

Rack::Cors: Rack Middleware for Handling Cross-Origin Resource Sharing (CORS)

CORS 対策用 Rack ミドルウェアの v1.1.0 リリース。

excon 0.70.0: A Fast, Simple HTTP 1.1 Client for Ruby

軽量 HTTP クライアント gem。

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

rubyweekly.com

Highlights

Ruby 2.7.0 Preview 3 Released

来月リリースされる Ruby 2.7 の最後の preview リリース。

The .: Syntax For Referencing Methods Is Cancelled

Ruby 2.7 から取り下げられた .:。重いと訴える記事は先々週の Ruby Weekly にも載ってた。

Using UUIDs in Rails 6 with Postgres and ActiveRecord

Rails 6 + Postgres の PK を UUID に移行させる手順。

Articles & Tutorials

Configurable Ruby Modules: The Module Builder Pattern

dry-rbShrine gem で活用されているモジュールビルダーパターンの解説。

Some Surprising Behaviour of Empty Arrays

[].all?true を返しちゃう GOTCHA。

Bulk Inserting Records in Rails 6

Rails 6 に追加された insert_allupsert_all。おかげで activerecord-import が不要になる。

Faking External Services in Tests with Adapters

アダプターパターンで外部サービスをテストから叩かないようにする方法。

Track Email Statuses in Rails with SendGrid

メール開封時のイベントなどで SendGrid のウェブフックから叩かれるエンドポイント実装手順。

Code and Tools

Artichoke: A Ruby Made with Rust

Rust 製 Artichoke VM を RubyConf で発表したスライド。

Rails 5.2.4 Released

メンテパッチだけの Rails 5.2.4 リリース。

Carmen: A Repository of Geographic Regions for Ruby

世界各国の地域情報用 gem。

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

rubyweekly.com

Highlights

Ruby Next: A Way to Transpile Modern Ruby Code to Run on Ruby 2.5 or mruby?

他の Ruby バージョンの機能を使えるようにしてくれるトランスパイラー gem。

Isolating Rails Engines with RuboCop

Rails Engine 責務の混合を防ぐための RuboCop 集を作った Flexport 社。

10 New Things in Active Record (in Rails 6)

Rails 6 Active Record の新機能。

  1. rails db:prepare = rails db:setup + rails db:migrate
  2. rails db:seed:replant = TRUNCATE + rails db:seed
  3. 接続先(メイン DB or レプリカ DB)の自動判定
  4. enumnot_ スコープ
  5. .extract_associated = .preload + .map
  6. .annotateSQL コメント補足
  7. .touch_all
  8. .destroy_by.delete_by = .find_by + .destroy/.delete
  9. .where でも無限 Range 使えるようになった
  10. .implicit_order_column

Rails 6: The Missing Developer Setup Guide

Rails 開発者向け Rails 以外 の環境構築手順書集。

Articles & Tutorials

How to Update Counter Caches in Your Rails App Without Active Record Callbacks

ActiveRecord を拡張してくれる hair_trigger gem で SQL TRIGGER を活かす方法の紹介。

How I Approach Test Coverage Metrics

テストカバレッジ 100% ではなく、90% + メンテしやすい雰囲気を目指すべきだ、という簡潔な主張。

Working with Capistrano: Tasks, Roles, and Variables

Capistrano のカスタムタスク作成方法。SSH でサーバにログインして rails console を立ち上げるタスクを例に。

Code and Tools

Browser: A Browser Detection Library

ブラウザー検知 gem。

A Tetris Game Powered by Ruby2D

Ruby2D で実装されたテトリス。1 ファイル、200 LOC 未満。

Chatwoot: Simple, Open Source Live Chat Software

チャット用 OSS Rails アプリ。

Shrine 3.1: The File Attachment Toolkit for Ruby Webapps

添付ファイル用 gem。

Ruby Trello API: An Implementation of the Trello API for Ruby

Trello API クライアント用 gem。

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

rubyweekly.com

Highlights

Prism: Build Frontend Web Apps with Ruby and WebAssembly

フロントエンドアプリ開発フレームワーク gem。mruby で Ruby を WebAssembly にコンパイル

The Hidden Cost of The Ruby 2.7 Dot-Colon Method Reference Usage

Ruby 2.7 の .: が重くて、キャッシュ・メモ化推奨。筆者は軽量化 PR 提出済み。

Rails 6.0.1 Released

Rails 6.0.1 マイナーバージョンアップ。

Articles & Tutorials

Persisted Queries in GraphQL: Slim Down Apollo Requests to Your Ruby Application

GraphQL の永続化クエリでリクエスト軽量化する手順。フロントエンドは Apollo GraphQL クライアントで、バックエンドは筆者自作 graphql-ruby-persisted_queries gem。

Use GitHub Actions for Rails CI with Postgres

PostgreSQL + Rails アプリの CI を GitHub Actions だけで実現する設定方法。

Code and Tools

Tabulo: A Terminal Table Generator with a DRY, Column-Based API

CLI 表描画用 gem。

Skunk: Combining Code Quality and Coverage to Calculate a 'Stink' Score

コード品質・カバレッジのスコア計算用 skunk gem の紹介。先週掲載された RubyCritic gem を裏で採用してる。

rspec-tap-formatters: TAP Formatters for RSpec 3

RSpec 実行結果のグループ別フォーマット用 gem。

How to Find the Unused Routes of a Large Rails App

未実装で不要な route を洗い出してくれるスクリプト。アクション・ビューの有無で判定。