Ruby Weekly #471: 日本語サマリー
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 })
RuboCop メンテナー作 Minitest スタイルガイド。
OSS EC サイト Spree v4.0 リリース。Rails 6 対応するようになった。
ロンドンのアンカンファレンス。カンファレンスと違って、トークはなく、参加者間のディスカッションというフォーマットらしい。
Articles & Tutorials
ActionView リンクをフィッシングから守ってくれるヘルパー。rel="nofollow"
、rel="noopener"
属性を付けることで Tabnabbing 脆弱性回避。
GDPR 遵守のユーザデータ物理削除戦略。dependent: :destroy
漏れなどを防ぐために、テストで物理削除前後の各テーブルのレコード数を比較している Monolist 社。
Code and Tools
今までなかった RuboCop の Minitest 用拡張。
will_paginate 3.2: A Pagination library for Rails, Sinatra, and More
Ruby 2.7、Rails 6 対応の will_paginate v3.2 リリース。
並列実行用 parallel gem。
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 が提供してくれる機能もいくつか実装してる。 ü
などの発音区別符号を無視する機能とか。