Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

週刊Railsウォッチ: puma_worker_killer、bundle_update_interactive gemほか(20240808後編)

こんにちは、hachi8833です。

週刊Railsウォッチについて

  • 各記事冒頭には🔗でパーマリンクを置いてあります: 社内やX.comでの議論などにどうぞ
  • 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
  • お気づきの点がありましたら@hachi8833までメンションをいただければ確認・対応いたします🙏

TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)

🔗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!:uniqpassword_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公式ニュースより)

zombocom/puma_worker_killer - GitHub


つっつきボイス:「ワーカーキラーというとUnicorn用のしか知らなかったんですけど↓、Pumaにもあったんですね」「ワーカーキラーが必要になるときは現場レベルではいつだってありますよ😆: ワーカープロセスのメモリがなぜか増え続けて解放されないという事態が発生したら、さしあたってワーカーキラーを使うしかなくなることは多々ある」

kzk/unicorn-worker-killer - GitHub

「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 updateRuby Weeklyより)

mattbrictson/bundle_update_interactive - GitHub


つっつきボイス:「お〜、bundle updateをCLI上でインタラクティブに確かめながら実行できるのはなかなかよさそう👍」「表示もキレイだし、深く考えずにbundle updateしてハマったりすることを減らせそうですね」「CIでこういうふうに表示できたらなお嬉しいかも」

「セマンティックバージョニングで色分けしたり、セキュリティ修正を真っ赤に表示したり、Railsフレームワーク内のgemの更新をrailsにまとめたりしてくれるんですね↓」




同リポジトリより

後で導入してみました↓。

🔗 ice_cube: iCalendar構文をRubyで書けるライブラリ(Ruby Weeklyより)

ice-cube-ruby/ice_cube - GitHub


つっつきボイス:「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)

参考: iCalendar - Wikipedia

「ところで"3日に1度"とか"2週間に1度"とか"3営業日後"みたいなのを英語で表すのは地味に面倒」「そういえば日本だとあまり見かけないけど、英語圏だと1年のうちの第n週目の第m曜日みたいなふうに表すのをちょくちょく見かけますよね」「第n週目方式だと月替りを考えなくていい分楽だったりするのかな?🤔」

後で調べると、ISO week dateという方式だそうです↓。たとえば1977-W52-7だと「1977年の第52週目の7日目(つまり日曜)」という感じだそうです。

参考: ISO week date - Wikipedia

🔗 その他Ruby

以下はつっつき後に見つけたx.com投稿です。


後編は以上です。

バックナンバー(2024年度第2四半期)

週刊Railsウォッチ: Rails 7.2 RC1がリリース、ストリーミングのレスポンス処理をRack 3で行うほか(20240807前編)

ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。

Rails公式ニュース

Ruby Weekly

Ruby on Rails Discussions


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。