Ruby Weekly #470: 日本語サマリー
Highlights
Ruby 2.7 の IRB にシンタックスハイライトが実装された。
Ruby 2.6.5、2.5.7、2.4.9 リリース。インジェクション脆弱封鎖パッチあり。
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
パターンマッチング- ブロック引数の番号指定
Exosuit という、Heroku っぽい EC2 インスタンス管理用 CLI ツールの紹介。
Rails の CI パイプラインを GitHub Actions βで実装してみた話。
- CircleCI より重い。
- 現時点ではキューがなくてどのジョブも即時実行。ジョブを複数定義することで並列実行。
- 本番リリース後、外部 CI が減らせるのを筆者が楽しみにしてる。
Introducing RuboCop to Legacy Projects: Some TODOs and TODON'Ts
レガシーコードへの RuboCop 導入時に rubocop --auto-gen-config
を実行するのが良くないという主張。
- 違反しているコードを例外として扱ってしまう。統一性がなくなる。
- 違反の多いコップは一部完全に無効化されちゃう。新規コードもチェックされなくなっちゃう。
Rails 6 の PendingMigrationError
発生時には、ブラウザー上のボタンから migration が実行できちゃう。これは ActiveSupport::ActionableError
で実装されたもので、ブラウザーから解消可能なエラーを任意で作れるようになる。
Code and Tools
PDF 生成だけでなく、編集までできる gem。
GitHub 社内プロファイリングツールを OSS 化したもの。
Ruby Weekly 編集長が 8 年前の CodeBrawl コンペで優勝した簡易テストフレームワーク。Ruby 2.0 の refinements を活かすように最近改修した。
wkhtmltopdf
をラッピングした HTML→PDF 変換 gem。
請求書 PDF 生成 gem のメジャーバージョンアップ。
Ruby Weekly #469: 日本語サマリー
Highlights
FriendlyId: Human-Friendly Slugs and Permalinks for Active Record
ActiveRecord のスラグやパーマリンク生成用 gem。
米移民・関税執行局(ICE)と契約を結んだ Chef 社。ICE の人権問題に反対した chef-sugar gem (2000 万 DL)のメンテナーが gem を yank した。ユーザがデプロイできなくなり、Chef 社が gem をフォークして著作権メタデータを改ざんしたが、コミュニティからバッシング受けて元に戻した。その後、Chef 社が所有権を RubyGems に主張し、chef-sugar の他、chef-api、community-zero、stove gem を差し押さえた。
Puma マイナーバージョンアップ。
Articles & Tutorials
For Organizing Rails Projects, 'Domain Objects are Good and Service Objects are Bad'
サービスオブジェクトは隠れ手続き型アンチパターンで、よりオブジェクト指向なドメインオブジェクトにするべきだという主張。
DHH 作 geared_pagination gem の紹介とコードリーディング。無限スクロール UI などのページネーションのページ毎件数を動的に増やしてくれる。
Rails 6 Adds add_foreign_key & remove_foreign_key for SQLite3
SQLite 3 の FK 追加・削除用 add_foreign_key
、remove_foreign_key
が Rails 6 に追加された。
Code and Tools
公式 Elasticsearch クライアントをラッピングした ORM。
軽量 ERB エンジン。メンテされなくなった Erubis のフォーク。
childprocess: Cross-Platform Library for Managing Child Processes
子プロセス起動・操作用 gem。Unix、Windows、JRuby 対応。
.zip ファイル処理用 gem。
Ruby Weekly #465: 日本語サマリー
Highlights
ダミーデータを生成してくれる faker gem のメジャーバージョンアップ。キーワード引数に変わった。
Articles & Tutorials
**
演算子の用例集。Hash#merge
としても使える、しかも Hash#merge
より速い。
How to Store Large JSON Documents in Postgres with the Rails Attributes API
Postgres の BINARY
型カラムに巨大 JSON を保存するために、ActiveRecord の attribute
マクロで独自データ型を定義した話。
遅延評価の require
をやってくれる Ruby コアの autoload
紹介。Rails 6 の Zeitwerk はこの autoload
を裏で採用してる。
curl
をフル活用するための練習問題集。
Rails + Webpacker の Heroku へのデプロイを高速化してくれる Yarn プラグイン clean-webpack-plugin 紹介。
絵文字で書いた Ruby コードや gem 紹介。
ネストされた配列の引数は、strong params の一番最後に定義しないと無視されちゃう gotcha。
秒の切り上げ・切り捨てをやってくれる Ruby 2.7 の Time#ceil
と Time#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 のメジャーバージョンアップ。
メモリリークを起す gem を検知してくれる bundler プラグイン。
Stripe の Ruby ライブラリーのメジャーバージョナップ。
Ruby Weekly #464: 日本語サマリー
Highlights
待望の Rails 6.0 リリース。
- Action Mailbox
- Action Text
- 複数 DB サポート
- テスト並列実行
- Zeitwerk
悪質コードの埋め込まれた rest-client gem の v1.6.13 が yank された。Gemfile.lock の中で使っていないことを確認しましょう。
Jekyll メジャーバージョンアップ。
- Ruby 2.4.0 以上
- ビルド高速化
- Sass 処理高速化
- Pygments、RedCarpet、RDiscount サポート終了
Sinatra パッチバージョンアップ。
git マイナーバージョンアップ。git checkout
の 2 つの用途を明確な 2 コマンドに分けた。
git switch
でブランチ切り替えgit restore
で未コミットの修正を破棄する
Articles & Tutorials
- 再現方法特定。
binding.pry
張ってデバッグ。bundle show
で gem 内に張る。- バグ修正。
Active Storage のコードリーディング。
Code and Tools
Ruby 製ポン。Dragon Ruby Game Toolkit での実装例。
RailsAdmin 2.0: An Engine That Provides a Backend Admin Interface
管理画面用 Rails エンジン。
Redis PubSub や Kafka に移行しやすい PubSub 思考 Ruby を書くための gem。
nonschema_migrations: Separate Schema From Data Migrations in Your Rails Apps
DB データの migration 用 gem。
Ruby Weekly #461: 日本語サマリー
Highlights
Artichoke という mruby ベースのインタープレターのコードをブラウザーで実行してみることができるページ。
Rails 6 RC2 がリリースされた。ファイナルリリースは数週後の予定。
Articles & Tutorials
ヘルパーからバリューオブジェクトを抽出する方法。
Ruby の Infinity オブジェクトいろいろ。
- 0 で割った挙動いろいろ
- 無限 Range(+ Ruby 2.6 の新しい表記)
Rails 6 の ActiveRecord の optimizer_hints
メソッドでクエリ軽量化ヒントを与えれるようになる。
Moving From Tagging with ActsAsTaggableOn to PostgreSQL Arrays
acts-as-taggable-on gem から PostgreSQL 配列カラムに移行した経験談。ネタバレ:migration だけでいけた!
Active Storage 導入手順。
デプロイ失敗の未然防止策。
concurrently
オプションを指定しなかったadd_index
がエラーを起こすように prepend することで、DB をロックする migration 防止rails server
起動時の FK チェックで、CASCADE による重大レコード削除防止Net::HTTP
への prepend で長い HTTP リクエストをタイムアウトさせる
配列であるかどうかの分岐を省略してくれる ActiveSupport の Array.wrap
。
How Do You Tell Which Areas of a Project's Test Suite Need Attention?
所属していないプロジェクトのテストを重点的改善する方法。
- テストスメル特定
- テストがない
- 難解テスト
- テストの重複
- チームに辛いところを聞き出す
- コード弄ってみる
Code and Tools
位置情報用 gem。
関数型 Ruby の副作用を隔離してくれる gem。
Ruby Weekly #459: 日本語サマリー
Highlights
regexp-examples: Generate Strings That Match a Given Regular Expression
正規表現に一致する文字列を生成する gem。Regexp
に #examples
#random_example
メソッドを生やす。
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
メンテされなくなった PJAX を Turbolinks に移行した Honeybadger 社の注意点。
- Turbolinks は SPA なので、遷移するたびに、ロードしたものをアンロードする必要がある
- 破壊的リクエストを発行するたびにキャッシュをクリアする必要がある
- 遷移した時点の DOM がその状態のままでキャッシュされるから、またそのページに戻ったら状態が初期化されてない覚悟を
<body>
内 JS を全部削除しないと、遷移するたびに実行されちゃう- 外部ライブラリを JS モジュールでインポートすること
- デプロイを跨いだ遷移は古い JS・CSS に依存したままなので、
data-turbolinks-track
属性で強制リロード
Rails ビューで Date
Time
の #strftime
を直接呼ぶのをやめようという主張。 %Y-%m-%d
表記が読みにくいから。 #to_s(:symbol)
で書こうと。 :symbol
は Rails デフォのものからも選べれば、 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 から呼んだ話。
既存 Rails アプリに devise_token_auth gem を導入する手順。
SQL コメントを書く ActiveRecord::Relation#annotate
が Rails 6 に登場。
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
定期イベントを表すオブジェクト用 gem。オブジェクトをシリアライズすることで永続化できる。
WebAssembly 実行用 gem。
メールアナリティックス用 gem。送信・開封・クリック履歴、UTM タグ付けなどの機能付き。
proc を関数型っぽく書く gem。
Sinatra アプリの初期プロジェクト。clone して拡張していくもの。
pg_search: Build ActiveRecord Named Scopes using Postgres's Full Text Search
PostgreSQL 全文検索の複雑な SQL 用 scope
を生やしてくれる gem。なお Solr が提供してくれる機能もいくつか実装してる。 ü
などの発音区別符号を無視する機能とか。
Ruby Weekly #458: 日本語サマリー
Highlights
strong_password gem がハイジャックされた。メンテナが 2 段階認証を有効にしてなかったせいか、rubygems アカウントが乗っ取られちゃった。
問題の v0.0.7 は yank 済み。
時間計算 gem。ActiveSupport と違って、Fixnum などをモンキーパッチしてなくて、依存が少ない。
Rails 6 エラー画面の良いところ
- 例外、絶対パス、エラーメッセージが分かりやすく表示される
- 発生箇所のソースが分かりやすく表示される
- スタックトレースが分かりやすく表示される
- パラメータなど分かりやすく表示される
- ブラウザー内 REPL!!!
良くないところ
Did you mean?
が当たらないことがある。初心者がこいつに惑わされそう。#<#<Class::0x000000000ed0aee0>:0x000000000ed110b0>
といった出力が役立たず
Rails 6 Adds Hooks to Active Job Around Retries and Discards
ActiveJob の retry_on
、discard_on
マクロに渡すブロックは、Rails 6 以降 ActiveSupport::Notifications
フックで書けるようになる。
enqueue_retry.active_job
retry_stopped.active_job
discard.active_job
ApexCharts.rb: Interactive, Responsive Web Charts for Ruby Apps
JS チャート・グラフ用 gem。apexcharts.js ライブラリをラッピングしてるもの。
Articles & Tutorials
Discovering the Design Pattern at the Heart of Rack Middleware
Rack ミドルウェアをデザパタとして定義してる記事。(GoF デザパタ本には載ってないので新規提案)
応用例:
My Experience Architecting A Software Development Stack with JRuby, OpenJDK, and Roda
JRuby + Roda + Sequel + Puma + H2 データベース + いろんな Java ライブラリでレトロゲーム管理システム開発経験談。
JRuby メンテナー Charles Nutter 先生が「高スループット Ruby エンドポイントのベスト実装例」と賞賛するつぶやきでこの記事をバズらせた。
AnyCable を Capistrano + systemd でデプロイする手順。
AnyCable はパフォーマンス・安定性・スケーラビリティが ActionCable に勝るが、Capistrano でデプロイすることは安易ではない。
Grape vs Rack vs Rails の HTTP ヘッダー処理比較。
attr_encrypted などのデカい外部 gem に依存せずに、Rails の ActiveSupport::MessageEncryptor
だけで機密情報を暗号化する方法。
vcr gem を効率よく使う豆知識 10 点。
- cassette 名自動生成しよう
vcr_mode = :once
。あとヘッダー無視しよう- 外部へのリクエスト遮断しよう
- 環境変数で cassette 上書き
VCR.current_cassette.file
- vcr を使ってるテストでは FactoryBot の sequence を必要に応じて固定化しよう
- cassette が何回でも作れるように、テスト冪等化しよう
- 実行順、キャッシュは要注意
- cassette 内 URL 正規化しよう
- cassette 変更時の差分は無視して良し
Building Messaging Between Ruby/Rails Applications with ActiveMQ
Rails の非同期処理を ActiveMQ で実装した経験談。
STOMP プロトコルは stomp gem で対応。本番は AmazonMQ で。
TDD の壁とその乗り越え方。
- 結合テストなどの高レベルテストが落ちる原因が分かりづらい場合は、モデルなどの低レベルテストでテスト書こう。
- モックが多すぎるテスト = 関心ごとが多すぎるテストなので、高レベルテスト書いてから、リファクターしよう。
- context などのネストが深すぎて読み解けないテストは、context・before・shared_context などのコードを it/specify で書き写そう。理解できたら、元のテスト or it/specify のみのテストのどちらかだけ採用。
- テストがそもそもない場合は、現行挙動のテストを書こう。
- テストをどう書くか分からない = 仕様を理解し切れてない。仕様を聞こう or 既存コード調査しよう。
- テスト書く時間がない場合、正常ケースのテストとか低レベルテストだけでも重点的に書こう。