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

週刊Railsウォッチ: Rails 7でbyebugがruby/debugに変更、GitHub Codespacesをサポートほか(20211004前編)

こんにちは、hachi8833です。

週刊Railsウォッチについて

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

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

🔗Rails: 先週の改修(Rails公式ニュースより)

公式更新情報が大量に出ているので、泣く泣く絞ってみました。


つっつきボイス:「Rails 7のフロントエンド周りの更新がいきなり増えましたね」

🔗 ByeBugがruby/debugに置き換わる

パッチの概要
このパッチでは、新しいアプリケーションのGemfileでdebugへの依存を生成するようになり、byebugが置き換えられる。
理由
debugはRuby 3.1に同梱されることになっている。この変更により、RailsをRubyに合わせる。
ByebugとZeitwerkの互換性は完全ではない。念のために言っておくと、これはどちらのgemのバグでもなく、技術的な制約である。詳しくはByebugのissue #564を参照。
注意
debugはrails/mainで十分なテストが行われたわけではなく、現時点では1.0.0 RC2だが(訳注: 本記事公開時点では1.2.2がリリースされています)、ちょっと試した感じでは切替は可能そう。
ねぎらい
Byebugは7年以上にもわたってRailsプログラマーによるアプリケーションのデバッグを支援してくれました。❤️
同PRより


つっつきボイス:「byebugにバイバイ」「debugという名前の方が明示的に書けるので個人的にもうれしい👍」「debugの使い方がまだわかってないです😅」「debugを使うインターフェースがツール側で整備されれば違和感なく使えるようになるんじゃないかな」「それもそうですね」「巻き戻しのような新しい機能を使うならツール側でdebugの新機能用のインターフェースを用意する必要がありますね」

# Gemfile#L120
  platforms :mri do
    gem "stackprof"
-   gem "byebug"
+   gem "debug", ">= 1.0.0.rc", require: false
  end

「debugといえば、次回の銀座Rails#38では作者の@_ko1さんがまさにdebugをテーマに登壇されますよ」「わお」「いいこと聞いた😋」「ぜひご登録よろしく」

参考: 【オンライン開催】銀座Rails#38 - connpass

🔗 PostgreSQLのgenerated columnがサポート

これは、基本的に#39368(PostgreSQLのgenerated columnのサポート追加)を友好的に引き継いだもの。この機能はPostgreSQL 12から利用可能。
(訳注: 元のプルリクが)2020年6月以来進捗がないので、@fanfilmuを引き続きauthorにしてカレントのmainにrebaseし、受け取ったフィードバックのほとんどを反映した。
同PRより


つっつきボイス:「generated column、今までサポートがなかったとは知らなかった」「これはPostgreSQL固有の機能でしょうか?」「たしかMySQLにも入っていますね」

参考: PostgreSQL 13.1ドキュメント 5.3. 生成列
参考: 【PostgreSQL 12 新機能】generated column を検証してみた | SIOS Tech. Lab
参考: 第150回 Generated Columnを利用してみる:MySQL道普請便り|gihyo.jp … 技術評論社

「まずgenerated columnがわからない😅」「generated columnは、いわゆるfunctional columnと少し似ています: 以下のChangelogのサンプルコードで言うとupper()がSQL関数で、functional columnではこの関数の結果を仮想的にカラムとして扱えるんですが、generated columnで生成された結果は実際にテーブルに保存される」「ふむふむ」「結果が実際に保存されるので、そのカラムにインデックスを張れるようになります」「あ〜なるほど」「functional columnだと仮想的なので、インデックスを張れたとしても通常のインデックスと挙動が違う可能性もあるでしょうね」

# 同Changelogより
create_table :users do |t|
  t.string :name
  t.virtual :name_upcased, type: :string, as: 'upper(name)', stored: true
end

「この改修で上のようにvirtualカラムでstored: trueと書けるようになったんですね」「そうそう」

「generated columnは検索用カラムが欲しいときなどにも使います: 名字と名前が別のカラムになっているけど、通しで検索することがとても多くて、毎回カラムを結合するととても遅くなってしまうときとか」「なるほど」

🔗 Railsで生成されるイニシャライザファイルを削減


つっつきボイス:「Railsのconfig/initializersディレクトリ以下のファイルが以下の7つに削減されるそうです」「前は10ファイル以上ありましたね」「これは賛成👍: Railsは基本的に『設定より規約』だから、イニシャライザファイルはジェネレータで手動生成できればいいぐらいに思っています」

参考: rails/railties/lib/rails/generators/rails/app/templates/config/initializers at main · rails/rails

🔗 GitHub Codespacesをサポート

概要
Github Codespacesによって、Railsの新しいコントリビュータたちがRailsの変更やテスト用の完全な環境を手軽に起動できるようになる。このリポジトリをCodespacesで動かすために少しコンフィグが必要なので、このプルリクに追加されている。
このDockerfileとboot.shは以下にインスパイアされている。

その他情報
このdevcontainerは動くが、ひとつマイナーな問題がある。
コードを即座に実行可能にするには、bundle installpostCreateCommandとして実行する必要がある。Gemfileが巨大なため、このコマンド実行にずいぶん時間がかかってしまう。
Codespacesが所要時間をユーザーに適切に表示しないので、ユーザーが「この環境の機能が不完全なのはどうして?」と混乱する可能性がある。まだ解決法を見いだせていないので提案求む!


つっつきボイス:「お〜、GitHub Codespacesをサポートですか🎉」「主にRailsフレームワークの開発に参加しやすくするためだそうです」「さらっとそれ用のDockerfileが追加されてる」「rails/railsリポジトリを自分のGitHubアカウントにforkして、自分のCodespacesで動かせるんでしょうね」

参考: Codespaces | GitHub

「そういえばCodespacesはもうリリースされたはずだけど、Organization持ってないせいかまだ使えてなかったな」「私も個人でベータ版申し込んでましたが承認まだです」「上の公式サイトを見たらまだベータユーザー募集中となってますね」「今季の大学の授業で使いたいと思っていたところだし、後でチェックしてみよう」

参考: GitHub Codespaces が GA しました(概要、課金など色々まとめ) - Qiita
参考: GitHub Codespaces を Organization で使ってみた - Qiita

「ところでCodespacesって何でしたっけ?😅」「GitHubがVM付きで提供するVSCodeベースの開発環境です」「お〜なるほど!」

以下はつっつき後に見つけたツイートです。

🔗 Turbo + import mapと互換性のあるCSP設定情報を追加

# railties/lib/rails/generators/rails/app/templates/config/initializers/content_security_policy.rb.tt#7
-# Rails.application.config.content_security_policy do |policy|
-#   policy.default_src :self, :https
-#   policy.font_src    :self, :https, :data
-#   policy.img_src     :self, :https, :data
-#   policy.object_src  :none
-#   policy.script_src  :self, :https
-#   policy.style_src   :self, :https
-#   # Specify URI for violation reports
-#   # policy.report_uri "/csp-violation-report-endpoint"
+# Rails.application.configure do
+#   config.content_security_policy do |policy|
+#     policy.default_src :self, :https
+#     policy.font_src    :self, :https, :data
+#     policy.img_src     :self, :https, :data
+#     policy.object_src  :none
+#     policy.script_src  :self, :https
+#     policy.style_src   :self, :https
+#     # Specify URI for violation reports
+#     # policy.report_uri "/csp-violation-report-endpoint"
+#   end
+#
+#   # Generate session nonces for permitted importmap and inline scripts
+#   config.content_security_policy_nonce_generator = ->(request) { request.session.id.to_s }
+#   config.content_security_policy_nonce_directives = %w(script-src)
+#
+#   # Report CSP violations to a specified URI. See:
+#   # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only
+#   # config.content_security_policy_report_only = true
# end

つっつきボイス:「CSPはContent Security Policyの略」「content_security_policy.rbを生成したときのCSPをTurboとimport mapに対応させたんですね」「CSPはできれば自分で設定せずに済ませたい気持ちがあるな〜」「ですね」

参考: コンテンツセキュリティポリシー (CSP) - HTTP | MDN

「そういえばimport map周りがどうなっているのか知りたくて、importmap-railsのREADME↓を今翻訳中です(近日公開予定)」「わ〜い」

rails/importmap-rails - GitHub

「そういえばimportmap-railsのREADMEによると、HTTP/2が登場したおかげで小さなJSファイルをimport mapで多数転送しても遅くならないようになったとありました」「そうそう、DHHの動画でも話していましたね↓」

参考: 普及が進む「HTTP/2」の仕組みとメリットとは | さくらのナレッジ

「importmap-railsでは、JSPMのようなCDNを使ってnpmパッケージを配信する: DHHのこういう発想はなかなか凄い」「Rails 7のこういう大胆な舵の切り替えはDHHならではという感じですね」「かなり思い切ったなという気持ち」

参考: JSPM - ES Module Package Manager and CDN - jspm.org

🔗Rails

🔗BasecampからRailsコンソールの保護と監査を行うgemがリリース

basecamp/console1984 - GitHub
basecamp/audits1984 - GitHub


つっつきボイス:「Rails 7のActive Record暗号化機能の記事↓をチェックしていて、HEY.com内部で使われていたconsole1984とaudits1984が8月にリリースされていたことを知りました」「暗号化を真剣に考えるならコンソールの保護と監査は必要ですね👍」

Rails 7のActive Record暗号化機能(翻訳)

1984は言うまでもなくオーウェルのディストピア小説が元ネタですね。

参考: 1984年 (小説) - Wikipedia

🔗 Railsでポリモーフィック関連を使った話


つっつきボイス:「永和システムマネジメントさんの技術ブログです」「STIとかを使わずにポリモーフィック関連(polymorphic association)を使ったんですね」「後からポリモーフィック関連にするのは大変そう」

参考: Active Record の関連付け - Railsガイド

「ポリモーフィック関連はRailsでも昔から使われていて、SQLではアンチパターンとされています」「そうそう、アンチパターン」「でもポリモーフィック関連がうまくはまるケースは確かにありますし、Railsでそれを避けようとすると工数が著しく増えることもあるので、一概にアンチパターンとして避けるものでもないと思います」「十分知ったうえで注意して使うならありですよね」「もちろんデータが育ってきて扱いが変わったら別ですが、それを事前に予測するのは難しい: 社内システムみたいに小規模にやるならポリモーフィック関連でいい場合もあるでしょうね」

参考: SQLアンチパターンを読んで (ポリモーフィック関連について) | MotiMoti++

🔗 SprocketsとWebpackerを両方使う話


つっつきボイス:「TechRacho翻訳記事でお馴染みのEvil Martiansの記事で、RailsアプリのSprocketsとWebpackerを両方ビルドするようにしたそうです」「Webpackerが登場した頃に移行のためにデュアルビルドしている人たちが結構いましたね」

「フロントエンドのコードにRubyを埋める場合はSprocketsの方がやっぱり便利なんですよ」「そうそう」「WebpackではRubyのコードを読み込めなくて、Rails側で生成したデータをWebpack経由で渡そうとするとmanifest.jsonとかに書き出したりするのがイケてないので、Sprocketsが使える方が便利」「そういえばWebpackにデータを渡そうとして苦労している記事をひと頃よく見かけましたね」「Sprocketsの頃はそれが当たり前にできてて、CSSの中にERB的なコードを書くことすら可能ですよ」「あ〜そうでした」

rails/sprockets - GitHub

「そういえばimportmap-railsのREADMEにも『必要なのはアセットパイプラインだけ』とありました」「アセットパイプラインも新しくなるんだったかな?どうだったかな?」「Rails 7の動きが激しくてよくわからない…」「たぶんリリースまでにまだまだ変わるでしょうね」

つっつき後、Railsのリポジトリにpropshaftというアセットパイプラインライブラリが追加されている↓と教わりました。Rails 7の選択肢として加わりそうです(現時点では#43261はマージされておらず、まだアルファ状態だそうです)。

rails/propshaft - GitHub

なお、先週Rails 7 alpha2でrails newしてみたところ、sprocketsとsprockets-railsが入っていました。

...
    sprockets (4.0.2)
      concurrent-ruby (~> 1.0)
      rack (> 1, < 3)
    sprockets-rails (3.2.2)
      actionpack (>= 4.0)
      activesupport (>= 4.0)
      sprockets (>= 3.0.0)
...

🔗 その他Rails


つっつきボイス:「このDoorkeeperの記事はとてもよかった👍」「いい記事でしたね」「Doorkeeperで開催されてたTokyo Rubyist Meetup(現在は休止中)という英語縛りのイベントにも2回参加しました」「特に以下の『今の自分の人生のステージにおいて』という言葉は自分の価値観にもフィットしますね」

今の自分の人生のステージにおいて、Doorkeeperよりもtokyodevに注力するほうが理にかなっているように思いました。技術的にはできるだけシンプルに作っているので、サーバもなく、あるのはスタティック型のウェブサイトだけです。AWSのS3やCloudFrontがダウンしない限り故障するものもありません。顧客リストは比較的少なく、でも高い価値のある顧客が並んでいます。ブートストラップビジネスの理想そのものだ、と考えました。
同記事より

「Doorkeeperはいろいろ頑張ってたと思います」「Railsで構築されているんですね」「Doorkeeperは幸い後を引き継いでもらえましたけど、こういうイベントサイトが仮に運営を終了することがあったとしてもサイトは閉じないで欲しいとつくづく思います: アーカイブもされずに閉じられてしまうとイベント関連の情報と歴史が消滅してしまうので」「わかります」「閉鎖はつらいですよね」

「こちらは10/10(日)のKaigi on Rails 2021のプレイベントです」「本番も10/23(金)〜10/24(土)だからそう遠くないですね」「LTに一応登録してます」「お〜、そういうの久しくやってなかった」「5分なら技術的に詳しい話をしようもありませんし、勢いで登録しちゃうのがおすすめですよ」

参考: Kaigi on Rails 2021
参考: Kaigi on Rails _2021_ new - Kaigi on Rails | Doorkeeper


前編は以上です。

バックナンバー(2021年度第3四半期)

週刊Railsウォッチ: Rails 7 Alpha 1と2が公開、Rubyハッシュのショートハンド記法、iCare Dev Meetupほか(20210921)

今週の主なニュースソース

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

Rails公式ニュース


CONTACT

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