rastam on rails

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

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

rubyweekly.com

Highlights

Ruby 2.7 to Deprecate Automatic Conversion of a Hash to Keyword Arguments

method({ k: 1 }) のハッシュ引数が method(k: 1) キーワード引数として評価されるのは Ruby 2.7 で deprecated になった。Ruby 3 では ArgumentError など発生するようになる。** で明示的に変換する必要が生じる method(**{ k: 1 })

The Minitest Style Guide

RuboCop メンテナー作 Minitest スタイルガイド。

Spree 4.0: The Rails-Based Ecommerce System

OSS EC サイト Spree v4.0 リリース。Rails 6 対応するようになった。

London Ruby Unconference 2019 on October 19

ロンドンのアンカンファレンス。カンファレンスと違って、トークはなく、参加者間のディスカッションというフォーマットらしい。

Articles & Tutorials

Save Your Links From Phishers

ActionView リンクをフィッシングから守ってくれるヘルパー。rel="nofollow"rel="noopener" 属性を付けることで Tabnabbing 脆弱性回避。

Fully Deleting User Data

GDPR 遵守のユーザデータ物理削除戦略。dependent: :destroy 漏れなどを防ぐために、テストで物理削除前後の各テーブルのレコード数を比較している Monolist 社

Code and Tools

RuboCop Meets Minitest

今までなかった RuboCop の Minitest 用拡張。

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

Ruby 2.7、Rails 6 対応の will_paginate v3.2 リリース。

Parallel: Parallel Processing Made Simple and Fast

並列実行用 parallel gem。

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

rubyweekly.com

Highlights

What's New in IRB in Ruby 2.7?

Ruby 2.7 の IRBシンタックスハイライトが実装された。

Ruby 2.6.5 Released (and 2.5.7, and 2.4.9)

Ruby 2.6.5、2.5.7、2.4.9 リリース。インジェクション脆弱封鎖パッチあり。

Sidekiq 6.0.1 Should Be '10-15% Faster'?

1 ヶ月前にリリースされたばかりの Sidekiq 6 はパフォーマンスが 10%〜15% も向上。

Articles & Tutorials

Using Ruby 2.7 Experimental Features in Production: Pattern Matching and Numbered Block Args

Ruby 2.7 の(実験的)新機能を試してみた話。

  • case ... in パターンマッチング
  • ブロック引数の番号指定

How I Wrote a Ruby Program to Manage EC2 Instances for Me

Exosuit という、Heroku っぽい EC2 インスタンス管理用 CLI ツールの紹介。

Building a Rails CI Pipeline with GitHub Actions

Rails の CI パイプラインを GitHub Actions βで実装してみた話。

  • CircleCI より重い。
  • 現時点ではキューがなくてどのジョブも即時実行。ジョブを複数定義することで並列実行。
  • 本番リリース後、外部 CI が減らせるのを筆者が楽しみにしてる。

Introducing RuboCop to Legacy Projects: Some TODOs and TODON'Ts

レガシーコードへの RuboCop 導入時に rubocop --auto-gen-config を実行するのが良くないという主張。

  • 違反しているコードを例外として扱ってしまう。統一性がなくなる。
  • 違反の多いコップは一部完全に無効化されちゃう。新規コードもチェックされなくなっちゃう。

Rails 6's Support for 'Actionable' Error Pages

Rails 6 の PendingMigrationError 発生時には、ブラウザー上のボタンから migration が実行できちゃう。これは ActiveSupport::ActionableError で実装されたもので、ブラウザーから解消可能なエラーを任意で作れるようになる。

Code and Tools

HexaPDF 0.10.0: PDF Generation and Manipulation in Ruby

PDF 生成だけでなく、編集までできる gem。

Peek: Take a 'Peek' Into Your Rails Applications

GitHub 社内プロファイリングツールを OSS 化したもの。

TestRocker: The Simplest Inline Ruby Testing Library

Ruby Weekly 編集長が 8 年前の CodeBrawl コンペで優勝した簡易テストフレームワークRuby 2.0 の refinements を活かすように最近改修した。

Wicked PDF: PDF Generation for Rails Apps

wkhtmltopdf をラッピングした HTML→PDF 変換 gem。

InvoicePrinter 2.0: Generate PDF Invoices from Ruby

請求書 PDF 生成 gem のメジャーバージョンアップ。

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

rubyweekly.com

Highlights

FriendlyId: Human-Friendly Slugs and Permalinks for Active Record

ActiveRecord のスラグやパーマリンク生成用 gem。

Chef's Contract with ICE Causes Gem Yanking Controversy

米移民・関税執行局(ICE)と契約を結んだ Chef 社。ICE の人権問題に反対した chef-sugar gem (2000 万 DL)のメンテナーが gem を yank した。ユーザがデプロイできなくなり、Chef 社が gem をフォークして著作権メタデータを改ざんしたが、コミュニティからバッシング受けて元に戻した。その後、Chef 社が所有権を RubyGems に主張し、chef-sugar の他、chef-apicommunity-zerostove gem を差し押さえた。

Puma 4.2 Released: A Rack Web Server Built for Concurrency

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

Articles & Tutorials

For Organizing Rails Projects, 'Domain Objects are Good and Service Objects are Bad'

サービスオブジェクトは隠れ手続き型アンチパターンで、よりオブジェクト指向ドメインオブジェクトにするべきだという主張。

Behind-the-Scenes of 'Geared Pagination' in Rails

DHH 作 geared_pagination gem の紹介とコードリーディング。無限スクロール UI などのページネーションのページ毎件数を動的に増やしてくれる。

Rails 6 Adds add_foreign_key & remove_foreign_key for SQLite3

SQLite 3 の FK 追加・削除用 add_foreign_keyremove_foreign_keyRails 6 に追加された。

Code and Tools

Chewy: A High-Level Elasticsearch Framework

公式 Elasticsearch クライアントをラッピングした ORM。

Erubi: A Small, Alternative ERB Implementation

軽量 ERB エンジン。メンテされなくなった Erubis のフォーク。

childprocess: Cross-Platform Library for Managing Child Processes

子プロセス起動・操作用 gem。UnixWindowsJRuby 対応。

Rubyzip: A Library for Working with .zip Files

.zip ファイル処理用 gem。

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

rubyweekly.com

Highlights

Faker 2 Released: A Library for Generating Fake Data

ダミーデータを生成してくれる faker gem のメジャーバージョンアップ。キーワード引数に変わった。

Ruby 2.6.4, 2.5.6, and 2.4.7 Released

RDoc の jQuery 脆弱性対策リリース。

Articles & Tutorials

A Double Splat (**) Operator Cheatsheet

** 演算子の用例集。Hash#merge としても使える、しかも Hash#merge より速い。

How to Store Large JSON Documents in Postgres with the Rails Attributes API

Postgres の BINARY 型カラムに巨大 JSON を保存するために、ActiveRecordattribute マクロで独自データ型を定義した話。

What is Module Autoloading in Ruby?

遅延評価の require をやってくれる Ruby コアの autoload 紹介。Rails 6 の Zeitwerk はこの autoload を裏で採用してる。

Exercises for curl Users

curl をフル活用するための練習問題集。

Faster Heroku Deploys with Rails and Webpacker

Rails + Webpacker の Heroku へのデプロイを高速化してくれる Yarn プラグイン clean-webpack-plugin 紹介。

Emoji Driven Development in Ruby

絵文字で書いた Ruby コードや gem 紹介。

Permitting Nested Arrays using Strong Params in Rails

ネストされた配列の引数は、strong params の一番最後に定義しないと無視されちゃう gotcha。

Ruby 2.7 Adds Time#ceil and Time#floor Methods

秒の切り上げ・切り捨てをやってくれる Ruby 2.7 の Time#ceilTime#floor

Code and Tools

Rein: Postgres Database Constraints Made Easy for ActiveRecord

Postgres のデータ完全性制約(FK、一意性など)を migration で設定できるようにしてくれる gem。

InvoicePrinter 2.0 Released: A Way to Quickly Create PDF Invoices

請求書 PDF 生成用 gem のメジャーバージョンアップ。

Bundler-Leak: Find Known Memory Leaks in Your Dependencies

メモリリークを起す gem を検知してくれる bundler プラグイン

A Ruby Wrapper Around the Google Places API

Google Places API クライアント gem。

Stripe Ruby Library 5: Use Stripe from Ruby

Stripe の Ruby ライブラリーのメジャーバージョナップ。

XGBoost and LightGBM Come to Ruby

機械学習ライブラリー XGBoostLightGBM はそれぞれ gem 化された。

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

rubyweekly.com

Highlights

Rails 6.0: Yes, It's a Big One!

待望の Rails 6.0 リリース。

  • Action Mailbox
  • Action Text
  • 複数 DB サポート
  • テスト並列実行
  • Zeitwerk

rest-client and Other Gems Yanked Due to Malicious Code

悪質コードの埋め込まれた rest-client gem の v1.6.13 が yank された。Gemfile.lock の中で使っていないことを確認しましょう。

Jekyll 4.0.0 Released

Jekyll メジャーバージョンアップ。

  • Ruby 2.4.0 以上
  • ビルド高速化
  • Sass 処理高速化
  • Pygments、RedCarpet、RDiscount サポート終了

Sinatra 2.0.6 Released

Sinatra パッチバージョンアップ。

Highlights from Git 2.23: New Alternatives for git checkout

git マイナーバージョンアップ。git checkout の 2 つの用途を明確な 2 コマンドに分けた。

  • git switch でブランチ切り替え
  • git restore で未コミットの修正を破棄する

Articles & Tutorials

A Ruby Gem Debugging Strategy

pry で gem をデバッグする戦略。

  1. 再現方法特定。
  2. binding.pry 張ってデバッグbundle show で gem 内に張る。
  3. バグ修正。

Active Storage File Upload Behind The Scenes

Active Storage のコードリーディング。

Code and Tools

Pong Written in 160 Lines of Ruby

Ruby 製ポン。Dragon Ruby Game Toolkit での実装例。

RailsAdmin 2.0: An Engine That Provides a Backend Admin Interface

管理画面用 Rails エンジン。

Rocketman: Event-Based/Pub-Sub Code in Ruby

Redis PubSub や Kafka に移行しやすい PubSub 思考 Ruby を書くための gem。

nonschema_migrations: Separate Schema From Data Migrations in Your Rails Apps

DB データの migration 用 gem。

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

rubyweekly.com

Highlights

Artichoke Ruby Playground: A New Ruby Interpreter

Artichoke という mruby ベースのインタープレターのコードをブラウザーで実行してみることができるページ。

Rails 6.0.0 RC2 Released

Rails 6 RC2 がリリースされた。ファイナルリリースは数週後の予定。

Articles & Tutorials

Consider Value Objects

ヘルパーからバリューオブジェクトを抽出する方法。

Infinity: How It Works and Why It Matters in Ruby

Ruby の Infinity オブジェクトいろいろ。

  • 0 で割った挙動いろいろ
  • 無限 Range(+ Ruby 2.6 の新しい表記)

Rails 6 Adds Support for Database Optimizer Hints

Rails 6 の ActiveRecordoptimizer_hints メソッドでクエリ軽量化ヒントを与えれるようになる。

Moving From Tagging with ActsAsTaggableOn to PostgreSQL Arrays

acts-as-taggable-on gem から PostgreSQL 配列カラムに移行した経験談。ネタバレ:migration だけでいけた!

Rails 5: Getting Started with Active Storage

Active Storage 導入手順。

3 Defensive Programming Techniques for Rails

デプロイ失敗の未然防止策。

  • concurrently オプションを指定しなかった add_index がエラーを起こすように prepend することで、DB をロックする migration 防止
  • rails server 起動時の FK チェックで、CASCADE による重大レコード削除防止
  • Net::HTTP への prepend で長い HTTP リクエストをタイムアウトさせる

Using Ruby's Array() and Array.wrap

配列であるかどうかの分岐を省略してくれる ActiveSupportArray.wrap

How Do You Tell Which Areas of a Project's Test Suite Need Attention?

所属していないプロジェクトのテストを重点的改善する方法。

  1. テストスメル特定
    • テストがない
    • 難解テスト
    • テストの重複
  2. チームに辛いところを聞き出す
  3. コード弄ってみる

Code and Tools

Geocoder: A Complete Ruby Geocoding Solution

位置情報用 gem。

Affect: Algebraic Effects for Ruby

関数型 Ruby の副作用を隔離してくれる gem。

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

rubyweekly.com

Highlights

regexp-examples: Generate Strings That Match a Given Regular Expression

正規表現に一致する文字列を生成する gem。Regexp#examples #random_example メソッドを生やす。

Goodbye ActiveRecord!

Rails モノリスを ROM マイクロサービスに分解した Aircall 社が ActiveRecord と ROM を比較した記事。

  • ActiveRecord の多岐に渡る責務 vs ROM の明確に分けた責務
  • ActiveRecord の疑問はググり放題 vs ほとんど ROM フォーラムで聞くことが多い

Lefthook, Crystalball, and Git Magic for a Smooth Development Experience

開発効率化案いろいろ。

  • lefthook で git hook 管理・チームと共有。push 前にテストを実行するフック登録。
  • crystallball で修正した差分のテストのみに絞る。
  • checkout 時に足りてない gem を自動的に bundle install するフック登録。
  • checkout 時に migration を自動的に実行するフック登録。

Articles & Tutorials

How We Migrated To Turbolinks Without Breaking JavaScript

メンテされなくなった PJAX を Turbolinks に移行した Honeybadger 社の注意点。

  • Turbolinks は SPA なので、遷移するたびに、ロードしたものをアンロードする必要がある
  • 破壊的リクエストを発行するたびにキャッシュをクリアする必要がある
  • 遷移した時点の DOM がその状態のままでキャッシュされるから、またそのページに戻ったら状態が初期化されてない覚悟を
  • <body> 内 JS を全部削除しないと、遷移するたびに実行されちゃう
  • 外部ライブラリを JS モジュールでインポートすること
  • デプロイを跨いだ遷移は古い JS・CSS に依存したままなので、 data-turbolinks-track 属性で強制リロード

Using strftime in a Rails View is a Mistake

Rails ビューで Date Time#strftime を直接呼ぶのをやめようという主張。 %Y-%m-%d 表記が読みにくいから。 #to_s(:symbol) で書こうと。 :symbolRails デフォのものからも選べれば、 Date::DATE_FORMATS[:symbol] `Time::DATE_FORMATS[:symbol] で独自定義もできる。

Minimum Viable Example of Calling Rust From Ruby without a Gem

RSpec コアチームの Sam Phippen 先生が gem なしで Rust を Ruby から呼んだ話。

Adding devise_token_auth to An Existing Rails App

既存 Rails アプリに devise_token_auth gem を導入する手順。

Rails 6 Adds ActiveRecord::Relation#annotate

SQL コメントを書く ActiveRecord::Relation#annotateRails 6 に登場。

Debugging MySQL Lock Errors in Rails Apps

Rails での Mysql2::Error: Lock wait timeout exceeded; try restarting transaction エラーの原因を突き止めた話。

50 秒以上かかるトランザクションがあるときに発生するエラーだが、そのトランザクションがどこにあるのかが謎。 ActiveRecord::Base.transaction のモンキーパッチで 50 秒以上かかるトランザクションをログに書き込むことで、犯人の正体が暴けた。トランザクション内でメールを送信する処理だった(非同期で送信してなかった)。

Dynamic Image Resizing with Ruby and the Serverless Framework

S3 上画像のサムネなどを Serverless フレームワークで生成する手順。Lambda 関数は Ruby、画像処理は MiniMagick gem で。

Code and Tools

Montrose 0.10: A Library for Defining Recurring Events

定期イベントを表すオブジェクト用 gem。オブジェクトをシリアライズすることで永続化できる。

Wasmer: A Ruby Library to Run WebAssembly Binaries

WebAssembly 実行用 gem。

Ahoy Email: Email Analytics for Rails

メールアナリティックス用 gem。送信・開封・クリック履歴、UTM タグ付けなどの機能付き。

Transproc: Transform Ruby Objects in Functional Style

proc を関数型っぽく書く gem。

A Bare Bones Starter Project for Sinatra Apps

Sinatra アプリの初期プロジェクト。clone して拡張していくもの。

pg_search: Build ActiveRecord Named Scopes using Postgres's Full Text Search

PostgreSQL 全文検索の複雑な SQLscope を生やしてくれる gem。なお Solr が提供してくれる機能もいくつか実装してる。 ü などの発音区別符号を無視する機能とか。