- Ruby / Rails関連
週刊Railsウォッチ: システムテスト用headlessドライバにCupriteが追加、rails-mini-profiler、Jeremy Evansインタビューほか(20210810)
こんにちは、hachi8833です。今回は短縮版でお送りします。
🔗Rails: 先週の改修(Rails公式ニュースより)
前回の公式情報の続きです。
🔗 redirect_to
にallow_other_host
オプションが追加
許可されていないオープンリダイレクトでエラーをraiseする。
redirect_to
にallow_other_host
オプションを追加。ActionController::Base.raise_on_open_redirects = true
でこの振舞いをオプトインできる。
Gannon McGibbon
同Changelogより
つっつきボイス:「許可されていないオープンリダイレクトをraise_on_open_redirects
コンフィグでエラーをraiseできるようになった」「ここで例外を出してくれるのは優しいですね」「基本的にはraise_on_open_redirects = true
にしたうえで、オープンリダイレクトを許す場合にのみredirect_to
やreirect_back_or_to
の引数にallow_other_host: true
を追加する感じで使うんでしょうね」
「URL直書きでよそのサイトにリダイレクトするのは基本的にはイレギュラーですが、その必要が生じることもありうるので、許可されてないサイトへのリダイレクトをraiseするかどうかを選べるのはいい👍」
参考: オープンリダイレクトとは(Open-Redirect) | 【情報処理 用語集】
後でガイドの更新を見ると、現行はデフォルトがfalseで、7.0になったらデフォルトでtrueにするようです。
# guides/source/configuring.md#1098
#### For '7.0', defaults from previous versions below and:
+- `config.action_controller.raise_on_open_redirects`: `true`
...
#### Baseline defaults:
+- `config.action_controller.default_protect_from_forgery`: `false`
🔗 システムテスト用に登録可能なheadlessドライバリストのpoltergeistとcapybara-webkitが非推奨化されてcupriteが追加
Poltergeistとcapybara-webkitは既にメンテされなくなっている。
* https://github.com/teampoltergeist/poltergeist
* https://github.com/thoughtbot/capybara-webkitたまたま以下の利用法を見かけた。
https://github.com/rails/rails/blob/main/actionpack/lib/action_dispatch/system_testing/driver.rb
近年はもっぱらSeleniumとHeadless Chromeが使われており、poltergeistやcapybara-webkitの利用は推奨されない。
CupriteはPoltergeistに代わるよい選択肢(参考)。
ガイドのPoltergeist関連部分はCupriteに置き換えるのがよいだろう。
同PRより
つっつきボイス:「お〜poltergeistとcapybara-webkitがついに非推奨化」「poltergeistはさすがに非推奨化でもいいかな」「今後はCupriteですか」「poltergeistとcapybara-webkitもしばらくは使えますね」「プルリクメッセージで引用されているEvil MartiansのCuprite記事は翻訳版が以下にあります↓」
「お、このプルリクを出したYusukeIwakiさんは、まさにこの間の銀座Rails#34でPlaywrightやCupriteなどのドライバについて発表していた人ですね↓(ウォッチ20210803)」「あ、ホントだ」
参考: なんだかんだで1年半くらいRuby向けにブラウザの自動操作ライブラリを作っている - YusukeIwakiのブログ
6/18(金)開催の銀座Rails#34、公募枠その2は @yi01imagination 「Railsのsystem specからPlaywrightを使う」に決まりました!
引き続き参加者募集中です。https://t.co/AYgOj0R89c— 銀座Rails (@GinzaRails) May 31, 2021
🔗 Float::NaN
とBigDecimal::NaN
のダーティーチェックを修正
- PR: Fix dirty check for Float::NaN and BigDecimal::NaN by marcelolx · Pull Request #42831 · rails/rails
Rubyの
Float::NaN
とBigDecimal::NaN
は特殊な値であり、==
で比較できない。
Marcelo Lauxen
同PRより
つっつきボイス:「Float::NaN
やBigDecimal::NaN
がゼロ除算などで生成されたときの問題が修正されたんですね」「#41663のバグを踏んで見つけたのか」
def test_changed?
type = Decimal.new
assert type.changed?(0.0, 0, "wibble")
assert type.changed?(5.0, 0, "wibble")
assert_not type.changed?(5.0, 5.0, "5.0wibble")
assert_not type.changed?(5.0, 5.0, "5.0")
assert_not type.changed?(-5.0, -5.0, "-5.0")
assert_not type.changed?(5.0, 5.0, "0.5e+1")
+ assert_not type.changed?(BigDecimal("0.0") / 0, BigDecimal("0.0") / 0, BigDecimal("0.0") / 0)
+ assert type.changed?(BigDecimal("0.0") / 0, 0.0 / 0.0, 0.0 / 0.0)
end
🔗 ActiveModel::Errors#inspect
のメッセージをスリム化
# 同PRより: 従来
#<ActiveModel::Errors:0x00007ff68cda24f8 @base=#<Foo id: 6, created_at: "2021-07-09 04:28:48.056662000 +0000",
updated_at: "2021-07-09 04:28:48.168576000 +0000", email: "user@example.com", name: "Foo Bar", company: "Foo",
activated_at: "2021-07-09 04:28:39.039853000 +0000">, @errors=[]>
# 修正後: Errorsが空の場合
#<ActiveModel::Errors []>
# 修正後: Errorsが空でない場合
#<ActiveModel::Errors [#<ActiveModel::Error attribute=base, type=invalid, options={}>]>
つっつきボイス:「ActiveModel::Errors#inspect
で@errors
がある場合はその配列を出力して、@base
を出力しないように変更したのか」「通常ActiveModel::Errors
のオブジェクトをinspect
するときは@errors
をチェックしたいはずなので、inspect
ではActiveModel::Errors
の@errors
に限定して配列を出力したいということかなと思いました」
🔗 Middleware#remove
を追加
削除するミドルウェアが存在しない場合にraiseする
Middleware#remove
を追加。
Middleware#remove
の動作はMiddleware#delete
と同様だが、ミドルウェアが存在しない場合はエラーをraiseする。
Alex Ghiculescu, Petrik de Heus
同PRより
つっつきボイス:「以前は存在しないミドルウェアを削除しようとしても何も起きなかったのをエラーをraiseするMiddleware#remove
が追加された」「割とシンプルな改修ですね」
「ところでMiddleware#remove
は最近見たような気がする🤔」「あ、以前の#42655↓はMiddleware#delete
を修正して存在しないミドルウェアでエラーをraiseするようにしたけど破壊的変更の影響範囲が大きかったので、#42821ではMiddleware#delete
を元に戻してからMiddleware#remove
を追加してこちらでエラーをraiseするようにしたのか」
🔗Rails
🔗 rails-mini-profiler(Ruby Weeklyより)
つっつきボイス:「rack-mini-profilerはよく使われていますけど、それとは違うんでしょうか?」「READMEによるとrack-mini-profilerやScount APMなどのAPMツールに強くインスパイアされてこのrails-mini-profilerを作ったそうです」
「お〜、なかなかいい感じにビジュアライズしている」「どのAPIが何秒かかるみたいなのが一覧できるんですね」
# rack-mini-profiler READMEより
# routes.rb
Rails.application.routes.draw do
...
mount RailsMiniProfiler::Engine => '/rails_mini_profiler'
end
「APIのみのRailsアプリでも使えるみたい」「さすがにproduction環境は想定してないようです」「でしょうね」「ローカル開発で便利そうだし、プロファイリングするリクエスト数を絞り込めるみたいなのでproductionでも使いようがあるかも: とりあえず入れてみてもよさそう👍」「後で入れてみようっと」「ハリネズミがかわいい❤️」
# rack-mini-profiler READMEより
RailsMiniProfiler.configure do |config|
config.enabled = proc { |env| env.headers['RMP_ENABLED'].present? }
end
Rails Mini Profiler: Performance Profiling for Rails, Made Simple - https://t.co/X7UImCK7Y8
— Ruby Inside (@RubyInside) July 29, 2021
🔗 RSpecでbullet gemを無視する方法(Ruby Weeklyより)
つっつきボイス:「この記事は、bullet gemに限らず、RSpecのテストで特定の機能を動かしたくないときに使える簡単なベストプラクティスという感じかな」「そうそう、こうやってテストヘルパーで無効にしたりしますね」
# 同記事より
config.before(:each, bullet: :skip) do
Bullet.enable = false
end
config.after(:each, bullet: :skip) do
Bullet.enable = true
end
🔗Ruby
🔗 Rubyの新しいデバッガを紹介
つっつきボイス:「先週紹介しそびれましたが、最近ruby/debugで頻繁にコントリビュートしているst0012さんの記事です」「お〜スタンくんが中の人になってる」「ruby/debugが触れるレベルになってきたところなのでこういう記事はありがたいですね👍」
🔗 Ruby 3でHTTPサーバーをスクラッチから作った(Ruby Weeklyより)
つっつきボイス:「RubyのFiberやRactorなども使ってHTTPサーバーをスクラッチから書く記事か」「久々のマルチスレッドサーバー系記事ですね」「こういうシンプルなコード例を手元で動かして試せるのがよさそう」
# 同記事より(コメントは省略)
def start
queue = Ractor.new do
loop do
conn = Ractor.receive
Ractor.yield(conn, move: true)
end
end
WORKERS_COUNT.times.map do
Ractor.new(queue, self) do |queue, server|
loop do
# this method blocks until the queue yields a connection
conn = queue.take
request = RequestParser.call(conn)
status, headers, body = server.app.call(request)
HttpResponder.call(conn, status, headers, body)
rescue => e
puts e.message
ensure
conn&.close
end
end
end
listener = Ractor.new(queue) do |queue|
socket = TCPServer.new(HOST, PORT)
socket.listen(SOCKET_READ_BACKLOG)
loop do
conn, _addr_info = socket.accept
queue.send(conn, move: true)
end
end
Ractor.select(listener)
end
「これで思い出したんですが、最近のPHP 8.1にもついにfiberが入ったという記事を見かけました」「お、このPHPのRFCですね↓」「fiberってRuby独自の概念かと思ってたけどコンピュータサイエンスの用語だったのか〜」
参考: PHP: rfc:fibers
参考: ファイバー (コンピュータ) - Wikipedia
『PHPは7以降、型関連の実装・機能追加が相次いで行われてきました。今ではもはや、下手な静的型付け言語よりずっと厳格な型運用を行うことすら可能になっています』 / “【PHP8.1】PHP8.1の新機能 - Qiita” https://t.co/e97tpRIaU9
— 徳丸 浩 (@ockeghem) August 3, 2021
🔗 Jeremy Evansインタビュー
つっつきボイス:「少し前の記事ですが、『Polished Ruby Programming』の著者であるJeremy Evansさんのインタビューです」「お顔初めて見ました」「Jeremy EvansさんはSequelのメンテナーやっているのが有名かも」
ブログ書きました。久々の書評ブログです〜📕
【書評】入門書は卒業したあなたに!"Polished Ruby Programming"を読みました - give IT a try https://t.co/2Vdi1OFkA7
— Junichi Ito (伊藤淳一) (@jnchito) August 2, 2021
「記事の方は、どうやらJeremy Evansさんが昨年のRubyPrize 2020で受賞したタイミングでのインタビューみたいですね」「へ〜、Jeremy EvansさんはOpenBSD版のRubyもメンテしているのか」「OpenBSD版のRubyはこの人にかかっているんですね」「この記事訳してみたいです」
🔗『Polished Ruby Programming』
「『Polished Ruby Programming』は自分も読んでいるところですが、Ruby中級者がスキルアップするのにいい本だと思いました」「自分も読んでみて同感です」
「同書の特徴は、Rubyに特化していて他の言語にはなかなか応用できなさそうなところ: Java的なオブジェクト指向やデザインパターンの流儀をRubyに持ち込んだ形で書かれた本はよくありますけど、この本はそれをいったん忘れてRubyならではの最適化された書き方を再定義しているところがありますね」「あ〜そういう感じですか」「この本でのRubyの書き方はたとえばJavaにはなかなか持ち込めないんじゃないかなと思ったりしました」「そうかも」「内容はとてもいいです👍」「今ポチりました〜」
「同書はRubyKaigiについてこられる中級者上級者なら問題なく読めると思います」「そうですね」「逆にRuby初心者にはハードでしょうね」「この本の書き方が当たり前だと思うと他の言語がやりにくくなったりして」
The official RubyKaigi Takeout 2021 novelty shops are open now! 🍔💨 https://t.co/pi1VvBGgOW#rubykaigi pic.twitter.com/QVetikCx8t
— RubyKaigi (@rubykaigi) August 10, 2021
🔗 その他Ruby(Ruby公式ニュースより)
つっつきボイス:「Ruby Award 2022の募集が始まった🎉」「毎年12月に福岡県で開催されているRubyのイベントですね」「自社でRubyやRailsを使った試みをやっていれば応募できます」
🔗 その他
🔗 n月刊ラムダノート
つっつきボイス:「Rubyコミッターのmametterさんがこの『n月刊ラムダノート』に寄稿していたのでさっきポチりました」「計算機好きのための技術解説情報誌ですか」「紙でしか買えないのかと思ったらPDF版も買えることにやっと気づきました」「PDF版の方がちょっと安い」「ページが多すぎなくて気軽に読めるのがよさそう」「まとめ版もあるのでポチってみた」
アニメ『Sonny Boy』に、ちょっとしたRubyプログラムを書きました。次回5話でプログラムの実行の様子が放送されます。最速の放送で8/12(木)深夜。よければ見てください~ #SonnyBoy #サニボ
(前のツイートには日付のミスとハッシュタグ忘れがあったので、自己リツイートしてます) https://t.co/ECumYMP9Pe
— Yusuke Endoh (@mametter) August 6, 2021
今回は以上です。
バックナンバー(2021年度第3四半期)
週刊Railsウォッチ: Rubyの可変長アロケーションプロジェクト、サーキットブレーカーgem、EC2-Classicが終了へほか(20210804後編)
- 20210803前編 SorbetでRailsアプリの型シグネチャを書く、activerecord-cte gemとanycable-client gem
- 20210720後編 ruby-gitでGit操作、最近のruby/debug、stdgems.org、Windows 365 Cloud PCほか
- 20210719前編 GitHubによるdisable_joins解説、MemoWise gemでメモ化、RailsのDDoS攻撃対策ほか
- 20210713後編 ruby-spacyで自然言語処理、Ruby製x86-64アセンブラ、『タイムゾーン呪いの書』ほか
- 20210712前編 AR::Relation#destroy_allがバッチ分割に変更、Active Record暗号化解説、sidekiq-unique-jobsほか
- 20210706後編 GitHub CopilotのAI補完、Pure Ruby実装のRuby JIT rhizome、PostgreSQLのPG-Strom拡張ほか
- 20210705前編 DI的な書き方が必要なとき、脆弱性学習用アプリRailsGoat、brakemanは優秀ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。
週刊Railsウォッチについて
TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)