- Ruby / Rails関連
週刊Railsウォッチ: puma_worker_killer、bundle_update_interactive gemほか(20240808後編)
こんにちは、hachi8833です。
🔗Rails: 先週の改修(Rails公式ニュースより)
🔗 permissions_policy.rbが新規Railsアプリではデフォルトで生成されなくなった
(
config/initializers/permissions_policy.rb
は)めったに使われない機能なので、デフォルトのフォルダ構造で目立つ場所に配置する必要はない。この機能そのものは引き続き利用可能だが、今後ドキュメントで利用法を見つける形になる。
同PRより
つっつきボイス:「お、permissions_policy.rbのデフォルトの設定サンプルファイルが生成されなくなるのね: たしかにこのファイルを設定することはめったになさそうではある」「ドキュメントには設定方法があるので大丈夫そうですね↓」
参考: 8.4 Feature-Policy
Header -- Rails セキュリティガイド - Railsガイド
🔗 マイグレーション生成オプションにnot-nullを生成する!
演算子が追加
- マイグレーションの属性にnot-null型指定子を指定する機能を追加。
生成コマンド:
bin/rails generate migration CreateUsers email_address:string!:uniq password_digest:string!
生成されるマイグレーション:
class CreateUsers < ActiveRecord::Migration[8.0] def change create_table :users do |t| t.string :email_address, null: false t.string :password_digest, null: false t.timestamps end add_index :users, :email_address, unique: true end end
DHH
同Changelogより
つっつきボイス:「プルリクに書かれているマイグレーションをよく見ると、email_address:string!:uniq
やpassword_digest:string!
みたいにカラムの型名の後ろに!
が付いていますね」「なるほど、カラムでnull: false
を指定するときのショートハンドなんですね: !
で指定するのは他の言語でも見たことあったかも」
「ちなみに自分はbin/rails g migration
で空のマイグレーションファイルを生成してからカラム指定を書き込んでいるので、コマンドの後ろにカラムオプションを指定することがほとんどなくて、この:uniq
とかも使ったことなかった」
🔗 コネクションが未定義の場合にわかりやすい例外を表示するようになった
- コネクションが未定義の場合にraiseする例外を追加
新しい
ConnectionNotDefined
例外は、リクエストされたコネクションの詳細情報「コネクション名」「シャード」「ロールアクセサ」を提供する。Hana Harencarova, Matthew Draper
同Changelogより
つっつきボイス:「従来のConnectionNotEstablished
例外をConnectionNotDefined
にリネームして、コネクション名やシャード名やロールアクセサも渡せるようにしたんですね: こういう詳細な情報も取れるのはいい👍」
# activerecord/lib/active_record/connection_adapters/abstract/connection_handler.rb#L230
- raise ConnectionNotEstablished, message
+ raise ConnectionNotDefined.new(message, connection_name: connection_name, shard: shard, role: role)
🔗Rails
🔗 Rails Worldで「ポッドキャストコンテスト」開催(Rails公式ニュースより)
つっつきボイス:「Rails Foundationがポッドキャストコンテストを開催するそうです🎉」「Rails Worldもいろいろ企画してますね」「当然英語のポッドキャストのみが対象でしょうね」「Buzzsproutという会社がスポンサー」「賞品はRails Worldチケットやマイクなどなど」
「審査のために全部のポッドキャストを聞くの大変そう」「ポッドキャストって10年ぐらい前の流行という印象だけど英語圏では今でも割と見かける感じかも」「ポッドキャストが制作しやすいのはたしかでしょうね」「米国みたいに自動車通勤している人が多い国だと、運転しながら聞きたいという需要があるのかもしれませんね」「それはありそう」
🔗 puma_worker_killer(Rails公式ニュースより)
つっつきボイス:「ワーカーキラーというとUnicorn用のしか知らなかったんですけど↓、Pumaにもあったんですね」「ワーカーキラーが必要になるときは現場レベルではいつだってありますよ😆: ワーカープロセスのメモリがなぜか増え続けて解放されないという事態が発生したら、さしあたってワーカーキラーを使うしかなくなることは多々ある」
「puma_worker_killerのREADMEにでかでかと、"STOP!使うならあくまで応急処置にとどめること"みたいなことが書かれていますね」「実際その通りで、ワーカーキラーは本来なら解放されるはずのメモリが解放されないという事態に対応するための"苦肉の策"という位置づけですね: AWS ECSとかでメモリに余裕がないような場合にはワーカーキラーも立てておかないとうまくいかない、ということは割とよくあります」
後で気づきましたが、puma_worker_killerは以前はRubyコントリビュータであるschneemsさんのリポジトリにありました(ウォッチ20190930)。
🔗 defined_enums
クラス属性のAPIドキュメントがない理由
つっつきボイス:「小ネタですが、defined_enums
というクラス属性がAPIドキュメントにない理由をdiscussionで質問していて、yahondaさんが以下の回答を示していました↓」「defined_enums
でわざわざ分岐するようなコードを書くべきではないという考え方なんじゃないかな」「なるほど」
defined_enums
はフレームワークのprivate APIであり、アプリケーションで使うべきではない。私たちはAPIを統一するため、そこには文字列キーのみを保存する設計を選んだ(チェックするのは文字列キーのみであり、文字列キーとシンボルキーを両方チェックすることはしない)。
ActiveRecord::Enum #defined_enums uses string as hash key?? · Issue #31775 · rails/railsより
🔗Ruby
🔗 bundle_update_interactive: CLIでインタラクティブにbundle update
(Ruby Weeklyより)
つっつきボイス:「お〜、bundle update
をCLI上でインタラクティブに確かめながら実行できるのはなかなかよさそう👍」「表示もキレイだし、深く考えずにbundle update
してハマったりすることを減らせそうですね」「CIでこういうふうに表示できたらなお嬉しいかも」
「セマンティックバージョニングで色分けしたり、セキュリティ修正を真っ赤に表示したり、Railsフレームワーク内のgemの更新をrails
にまとめたりしてくれるんですね↓」
同リポジトリより
後で導入してみました↓。
🔗 ice_cube: iCalendar構文をRubyで書けるライブラリ(Ruby Weeklyより)
つっつきボイス:「Every friday the 13th that falls in October
のようなフォーマットのスケジュールが欲しいときは以下のように書くとできるのか↓」「yamlやiCalenderやハッシュでも取り出せるんですね」「このフォーマットはSlackのリマインダー機能(/remind
)にそのまま渡せそう」
# 同リポジトリより
schedule = IceCube::Schedule.new
schedule.add_recurrence_rule(
IceCube::Rule.yearly.day_of_month(13).day(:friday).month_of_year(:october)
)
...
yaml = schedule.to_yaml
IceCube::Schedule.from_yaml(yaml)
hash = schedule.to_hash
IceCube::Schedule.from_hash(hash)
ical = schedule.to_ical
IceCube::Schedule.from_ical(ical)
「ところで"3日に1度"とか"2週間に1度"とか"3営業日後"みたいなのを英語で表すのは地味に面倒」「そういえば日本だとあまり見かけないけど、英語圏だと1年のうちの第n週目の第m曜日みたいなふうに表すのをちょくちょく見かけますよね」「第n週目方式だと月替りを考えなくていい分楽だったりするのかな?🤔」
後で調べると、ISO week dateという方式だそうです↓。たとえば1977-W52-7
だと「1977年の第52週目の7日目(つまり日曜)」という感じだそうです。
🔗 その他Ruby
以下はつっつき後に見つけたx.com投稿です。
https://t.co/86t8Zae6tshttps://t.co/OekT1JjMq2https://t.co/UGi9kG2KXo
今年は3つある地域Ruby会議に全て参加します。楽しみなコンテンツもたくさんありますし、懇親会でみなさんとお話するのも楽しいですね。まだどれも参加登録可能ですので、大阪・福岡・松江でお会いしましょう!
— 大倉雅史(OKURA Masafumi) (@okuramasafumi) August 5, 2024
[RubyKaigi 2024 follow up - connpass](https://t.co/OFkVFDvAuy) タイムテーブルをきれいに公開していただきました 夏の終わりにワイワイしましょう
— _ko1 (@_ko1) August 6, 2024
後編は以上です。
バックナンバー(2024年度第2四半期)
週刊Railsウォッチ: Rails 7.2 RC1がリリース、ストリーミングのレスポンス処理をRack 3で行うほか(20240807前編)
- 20240709 シャーディング用メソッドを追加、localsマジックコメント修正ほか
- 20240627後編 Railsのシステムテストを単体テストに置き換えるほか
- 20240625前編 Active Recordにstrict_loading_mode追加、to_time_preserves_timezoneの扱いほか
- 20240620後編 Ruby on Jets 6.0がRailsをサポートほか
- 20240619前編 Rails 8からPropshaftがアセットパイプラインのデフォルトにほか
- 20240529 Rails 8でKamalがデフォルトのデプロイツールになるほか
- 20240514後編 Ruby/Railsのアップグレード情報をscrapboxに集約ほか
- 20240513前編 Railsコンソールが最新のIRB APIに移行、assertionless_tests_behaviorほか
- 20240426後編 Prismの歴史と現況を振り返る、Steepの"narrowing"実装の内部ドキュメントほか
- 20240425前編 RailsからOpenStructを削除、Playwrightベストプラクティスほか
- 20240423後編 Kamalはゲームチェンジャーになるか、Solid Queueで使われているfugitほか
- 20240416前編 ジョブのエンキューをトランザクション完了時まで自動先延ばしほか
- 20240410後編 SeleniumでRubyの全クラスとモジュールにRBSが追加ほか
- 20240409前編 Rails公式の"rails-new"ツールでRailsプロジェクトをセットアップほか
- 20240402 solid_queueとmission_control-jobsが正式にRailsのgemに、Rubyの"チルド"文字列ほか
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。
週刊Railsウォッチについて
TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)