- Ruby / Rails関連
週刊Railsウォッチ: Rails 7でbyebugがruby/debugに変更、GitHub Codespacesをサポートほか(20211004前編)
こんにちは、hachi8833です。
🔗Rails: 先週の改修(Rails公式ニュースより)
公式更新情報が大量に出ているので、泣く泣く絞ってみました。
- Bye-bye Byebug, Hello jsbundling and cssbundling! | Riding Rails
- Rails 7 alpha released | Riding Rails
- Autumn is here, and so is Rails 7 Alpha 2! 🍂 | Riding 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
- assets.rb
- content_security_policy.rb
- cors.rb
- filter_parameter_logging.rb
- inflections.rb
- new_framework_defaults_7_0.rb
- permissions_policy.rb
https://github.com/rails/rails/tree/main/railties/lib/rails/generators/rails/app/templates/config/initializersより抜粋
🔗 GitHub Codespacesをサポート
概要
Github Codespacesによって、Railsの新しいコントリビュータたちがRailsの変更やテスト用の完全な環境を手軽に起動できるようになる。このリポジトリをCodespacesで動かすために少しコンフィグが必要なので、このプルリクに追加されている。
このDockerfileとboot.shは以下にインスパイアされている。
- Development Dependencies Install — Ruby on Rails Guides
- rails-dev-box/bootstrap.sh at master · rails/rails-dev-box
その他情報
このdevcontainerは動くが、ひとつマイナーな問題がある。
コードを即座に実行可能にするには、bundle install
をpostCreateCommand
として実行する必要がある。Gemfileが巨大なため、このコマンド実行にずいぶん時間がかかってしまう。
Codespacesが所要時間をユーザーに適切に表示しないので、ユーザーが「この環境の機能が不完全なのはどうして?」と混乱する可能性がある。まだ解決法を見いだせていないので提案求む!
つっつきボイス:「お〜、GitHub Codespacesをサポートですか🎉」「主にRailsフレームワークの開発に参加しやすくするためだそうです」「さらっとそれ用のDockerfileが追加されてる」「rails/railsリポジトリを自分のGitHubアカウントにforkして、自分のCodespacesで動かせるんでしょうね」
「そういえばCodespacesはもうリリースされたはずだけど、Organization持ってないせいかまだ使えてなかったな」「私も個人でベータ版申し込んでましたが承認まだです」「上の公式サイトを見たらまだベータユーザー募集中となってますね」「今季の大学の授業で使いたいと思っていたところだし、後でチェックしてみよう」
参考: GitHub Codespaces が GA しました(概要、課金など色々まとめ) - Qiita
参考: GitHub Codespaces を Organization で使ってみた - Qiita
「ところでCodespacesって何でしたっけ?😅」「GitHubがVM付きで提供するVSCodeベースの開発環境です」「お〜なるほど!」
以下はつっつき後に見つけたツイートです。
昨日からやってる案件でCodespacesを初めて使ったんですが、ブラウザでまんまvscode開くし、自分のvscodeでも開けるしスゲーと思いました。
ただSouceTreeとかGithub Desctopみたいなものには対応してない?みたいでコミットとかめんどくさそう。(知らないだけかも)https://t.co/QZyLeCJNKC
— やま🏔|フリーランスエンジニア (@MHkfree) September 28, 2021
🔗 Turbo + import mapと互換性のあるCSP設定情報を追加
- PR: Suggest a CSP that's compatible with Turbo + import map by dhh · Pull Request #43227 · rails/rails
# 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↓を今翻訳中です(近日公開予定)」「わ〜い」
「そういえば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がリリース
つっつきボイス:「Rails 7のActive Record暗号化機能の記事↓をチェックしていて、HEY.com内部で使われていたconsole1984とaudits1984が8月にリリースされていたことを知りました」「暗号化を真剣に考えるならコンソールの保護と監査は必要ですね👍」
1984は言うまでもなくオーウェルのディストピア小説が元ネタですね。
🔗 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的なコードを書くことすら可能ですよ」「あ〜そうでした」
「そういえばimportmap-railsのREADMEにも『必要なのはアセットパイプラインだけ』とありました」「アセットパイプラインも新しくなるんだったかな?どうだったかな?」「Rails 7の動きが激しくてよくわからない...」「たぶんリリースまでにまだまだ変わるでしょうね」
つっつき後、Railsのリポジトリにpropshaftというアセットパイプラインライブラリが追加されている↓と教わりました。Rails 7の選択肢として加わりそうです(現時点では#43261はマージされておらず、まだアルファ状態だそうです)。
なお、先週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
ローンチから10年以上経て、この度、Doorkeeperの全株式を譲渡しました。売却の理由とその時の経験について記事も書きましたので、よかったら読んでください。Doorkeeperのローンチから売却までの道のりをサポートしてくれた皆さん、ありがとうございました! https://t.co/BSG82AW435
— Paul McMahon (@pwim) September 29, 2021
つっつきボイス:「この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)
- 20210907後編 責任あるモンキーパッチの当て方、gem脆弱性スキャンツール、Docker Desktop課金プラン改定ほか
- 20210906前編 ActiveRecord::QueryLogs追加、spring gemがデフォルトから削除、fast_gettextほか
- 20210901後編 TruffleRubyでdig_fetchを実装、ruby/debug gem、AWSハンズオン教材ほか
- 20210830前編 Rails 7でのimport maps導入、Steepで型を導入、KubernetesでRailsを動かすためのガイドほか
- 20210823後編 SorbetのRuby AOTコンパイラが公開、「Compiler Explorer」にRubyが追加、Ractorで非同期通信ほか
- 20210818前編 カウンタキャッシュをスレッドセーフに更新、Journey::Ast追加、GitLabをAWS Graviton2で動かすほか
- 20210810 システムテスト用headlessドライバにCupriteが追加、rails-mini-profiler、Jeremy Evansインタビューほか
- 20210804後編 Rubyの可変長アロケーションプロジェクト、サーキットブレーカーgem、EC2-Classicが終了へほか
- 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ウォッチタグ)