Categories

Latest comments

Ruby 4.0でrdocを追加インストールするとwarningが出るようになる

wakairo @wakairo

Ruby 3.4の場合

Rubyの3.4系列では、default gemの1つとして、rdocが標準添付されています。 ここにrdocを追加インストールしてもwarningが出るようにはなりません。

以下はdockerを使ってこのことを確認した様子です。

$ docker run --rm -it ruby:3.4.9 bash
root@90a5523af58f:/# gem -v
3.6.9
root@90a5523af58f:/# gem install rdoc -v 7.2.0
Fetching rdoc-7.2.0.gem
Successfully installed rdoc-7.2.0
1 gem installed

A new release of RubyGems is available: 3.6.9 → 4.0.11!
Run `gem update --system 4.0.11` to update your installation.

root@90a5523af58f:/# gem -v
3.6.9
root@90a5523af58f:/# gem list --exact rdoc

*** LOCAL GEMS ***

rdoc (7.2.0, default: 6.14.0)
root@90a5523af58f:/#
0
Raw
https://www.techtips.page/en/comments/1174

Ruby 4.0でrdocを追加インストールするとwarningが出るようになる

wakairo @wakairo

Ruby 4.0の場合

Rubyの4.0系列では、bundled gemの1つとして、rdocが標準添付されています。 ここにrdocの最新バージョンをインストールするようなシチュエーションで、rdocを追加インストールするとwarningが出るようになります。

この現象は、dockerを使うと、以下のように簡単に再現できます。 ruby:4.0.3において、始めはgem -vコマンドの実行でwarningは出ませんが、 rdocをインストールすると、同じgem -vコマンドでwarningが出ていることが確認できます。

$ docker run --rm -it ruby:4.0.3 bash
root@601c809deee7:/# gem -v
4.0.6
root@601c809deee7:/# gem install rdoc -v 7.2.0
Fetching rdoc-7.2.0.gem
Successfully installed rdoc-7.2.0
1 gem installed

A new release of RubyGems is available: 4.0.6 → 4.0.11!
Run `gem update --system 4.0.11` to update your installation.

root@601c809deee7:/# gem -v
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc/version.rb:8: warning: already initialized constant RDoc::VERSION
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc/version.rb:8: warning: previous definition of VERSION was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc.rb:68: warning: already initialized constant RDoc::VISIBILITIES
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc.rb:68: warning: previous definition of VISIBILITIES was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc.rb:74: warning: already initialized constant RDoc::DOT_DOC_FILENAME
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc.rb:74: warning: previous definition of DOT_DOC_FILENAME was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc.rb:79: warning: already initialized constant RDoc::GENERAL_MODIFIERS
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc.rb:79: warning: previous definition of GENERAL_MODIFIERS was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc.rb:84: warning: already initialized constant RDoc::CLASS_MODIFIERS
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc.rb:84: warning: previous definition of CLASS_MODIFIERS was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc.rb:89: warning: already initialized constant RDoc::ATTR_MODIFIERS
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc.rb:89: warning: previous definition of ATTR_MODIFIERS was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc.rb:94: warning: already initialized constant RDoc::CONSTANT_MODIFIERS
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc.rb:94: warning: previous definition of CONSTANT_MODIFIERS was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc.rb:99: warning: already initialized constant RDoc::METHOD_MODIFIERS
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc.rb:99: warning: previous definition of METHOD_MODIFIERS was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc/markdown.rb:257: warning: already initialized constant RDoc::Markdown::KpegPosInfo
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc/markdown.rb:257: warning: previous definition of KpegPosInfo was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc/markdown/entities.rb:5: warning: already initialized constant RDoc::Markdown::HTML_ENTITIES
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc/markdown/entities.rb:5: warning: previous definition of HTML_ENTITIES was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc/markdown/literals.rb:86: warning: already initialized constant RDoc::Markdown::Literals::KpegPosInfo
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc/markdown/literals.rb:86: warning: previous definition of KpegPosInfo was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc/markdown/literals.rb:446: warning: already initialized constant RDoc::Markdown::Literals::Rules
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc/markdown/literals.rb:446: warning: previous definition of Rules was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc/markdown.rb:584: warning: already initialized constant RDoc::Markdown::EXTENSIONS
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc/markdown.rb:584: warning: previous definition of EXTENSIONS was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc/markdown.rb:589: warning: already initialized constant RDoc::Markdown::DEFAULT_EXTENSIONS
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc/markdown.rb:589: warning: previous definition of DEFAULT_EXTENSIONS was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc/markdown.rb:16430: warning: already initialized constant RDoc::Markdown::Rules
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc/markdown.rb:16420: warning: previous definition of Rules was here
4.0.6
root@601c809deee7:/# gem list --exact rdoc
(同様のwarningなので省略)
*** LOCAL GEMS ***

rdoc (7.2.0, 7.0.3)
root@601c809deee7:/#
0
Raw
https://www.techtips.page/en/comments/1173

Ruby 4.0でrdocを追加インストールするとwarningが出るようになる

wakairo @wakairo

Ruby 4.0では、rdoc gemについて最新バージョンなどを追加インストールすると、gemコマンドの実行で大量のwarningが表示される状態に陥いります。

なお、開発サイドもこの状態を把握しているようですので、個人的には解決されるまで様子を見ようと思っています。

0
Raw
https://www.techtips.page/en/comments/1172

Docker Composeのサービス名にappやdevを使うとSeleniumのHTTP接続がSSLエラーになる原因と対策

wakairo @wakairo

要点

Docker Compose の compose.yaml でサービス名を付ける際は、HTTP での接続先となるコンテナのサービス名には appdev といったトップレベルドメイン(TLD)として実在する文字列を使わないほうが安全です。

具体的な対策

HTTP で接続するサービス(コンテナ)には、ハイフン(-)を用いて複数の単語を組み合わせた名前をつけるのが、簡単な解決策です。

  • 避けるべきサービス名の例app, dev
  • 推奨されるサービス名の例rails-app, web-server

なぜエラーになるのか

Docker Compose のネットワーク内では、サービス名で名前解決をして他コンテナへアクセスできます。そのため、Selenium コンテナ内のブラウザから http://app/ のようにアクセスする設定にすることがあります。

しかしブラウザは、その app を Docker 内部の名前としてではなく、通常のホスト名として扱います。 appdev は実在の TLD であり、しかも HSTS(HTTP Strict Transport Security)を強制する対象なので、ブラウザは http://app/https://app/ に書き換えます。 接続先が HTTPS 非対応なら、結果として ERR_SSL_PROTOCOL_ERRORAre you trying to open an SSL connection to a non-SSL Puma? のようなエラーになります。

一方、rails-app のように、TLD と一致しない名前にすれば、HSTS 強制の対象から外れ、HTTPS に書き換えられないため、エラーを防ぐことができます。

背景:何が起きているか

Docker の compose.yamlservices で定義したサービス名は、Docker ネットワーク内で他コンテナへアクセスする際のホスト名として使えます。ここでのホスト名とは、http://example.com/example.com に当たります。

サービス名にドット(.)が含まれていない場合、単一ラベルのホスト名となり、ブラウザはその名前を TLD として扱います。例えば、app というサービス名は、app という TLD のみからなるホスト名として認識されます。

TLD のみのホスト名のうち、appdev は HSTS 強制の対象となっており、HSTS プレロードリストなどの仕組みにより、HTTPS 接続が強制されます。そのため、http://app/ という HTTP での接続になるよう設定しても、ブラウザは強制的に https://app/ という HTTPS での接続へと書き換えて接続しようとします。

結果、appdev のような HSTS が強制される名前を持つサービス(コンテナ)に対して、Selenium コンテナ内のブラウザは、HTTP で接続するよう設定されていても、HTTPS で接続してしまいます。 さらに、接続される側のコンテナが HTTPS に対応していない場合、接続がエラーとなります。

このように、E2E テストやシステムテストでは「ブラウザがどう解釈するか」は無視できない事項です。 コンテナ間疎通の都合だけで名前を決めるのではなく、ブラウザが特殊な扱いをする名前ではないか、という観点も持っておくとトラブルを減らせます。

注意点

  • TLD、及び、HSTS が強制されるホスト名は追加が続いています。そのため、将来のトラブルを防ぐ観点では、現状でトラブルになる名前だけでなく、今後トラブルになりそうな名前全般を避けたほうが無難だと考えられます。
  • HSTS はホスト名ベースで効き、ポート番号では回避できません。つまり http://app:3000/ のような URL でもエラーになり得ます。
  • ホスト名にドットを含めることは、本件の SSL エラーの確実な回避策とはなりません。なぜなら、HSTS 強制の対象となっているホスト名としては、TLD のみのホスト名だけではなく、facebook.comwww.amazon.com といったドットを含むホスト名も多数存在するためです。

接続エラーに遭遇した状況

compose.yaml において、selenium/standalone-chromium イメージの Selenium コンテナからサービス名が app のコンテナへ HTTP で接続する設定をしたところ、以下のエラーが発生しました。

2026-03-25 05:37:53 +0000 HTTP parse error, malformed request: #<Puma::HttpParserError: Invalid HTTP format, parsing fails. Are you trying to open an SSL connection to a non-SSL Puma?>
[Screenshot Image]: /x/tmp/screenshots/failures_test_should_destroy_Article.png
E

Error:
ArticlesTest#test_should_destroy_Article:
Selenium::WebDriver::Error::UnknownError: unknown error: net::ERR_SSL_PROTOCOL_ERROR
  (Session info: chrome=145.0.7632.109)
    test/system/articles_test.rb:38:in 'block in <class:ArticlesTest>'

なお、サービス名を app から rails-app に変更したところ、無事意図したとおりに動くようになりました。 HSTS 強制の対象となる TLD(app)との一致を回避した結果、ブラウザが HTTPS へ強制的に書き換えなくなったためと考えられます。

参考資料

0
Raw
https://www.techtips.page/en/comments/1139
❤️1

PmRails v1.1.0 をリリースしました。

wakairo @wakairo

リリースの概要

  • 新コマンド pmrails-new-plus : アプリの作成・gem のインストール・.gitignore の更新を1ステップで自動化します。
  • プロジェクトローカルなruntimeディレクトリ .pmrails/var/ : gem・キャッシュ・設定ファイルなどをプロジェクトごとに隔離して管理するようになりました。
  • SELinux / Fedora Immutable サポート : 全コマンドに Podmanの --userns=keep-id オプションを追加しました。

アップデート時の注意:ランタイムディレクトリ変更のため、pmbundle installの再実行が必要です。

リリースノートと変更履歴はGitHubで確認できます: https://github.com/wakairo/pmrails/releases/tag/v1.1.0

0
Raw
https://www.techtips.page/en/comments/1123
🎉1
❤️1

Rails 8.0からRails 8.1への移行(アップデート、アップグレード)で必要な作業

wakairo @wakairo

Rails 8.1におけるconfig.content_security_policy_nonce_auto

config.content_security_policy_nonce_autoは、 Rails 8.1で追加された「CSPのnonceを自動で追加する機能」を有効にするかどうかの設定です。

rails newで生成されるconfig/initializers/content_security_policy.rbにおいて、 8.1からは以下のようにこの設定のコードが追加されました(この変更のPRこの変更のCommit)。

+#   # Automatically add `nonce` to `javascript_tag`, `javascript_include_tag`, and `stylesheet_link_tag`
+#   # if the corresponding directives are specified in `content_security_policy_nonce_directives`.
+#   # config.content_security_policy_nonce_auto = true
+#

デフォルトではCSP設定自体がコメントアウトされており、この機能の設定もコメントアウトされています。

Railsガイドでは、CSPについての説明が「Content-Security-Policyヘッダー」の項目にあり、 このnonceを自動で追加する機能の説明が「nonceを追加する」の項目にあります。

0
Raw
https://www.techtips.page/en/comments/1122
😄1

vscodeのdevcontainerでCodexを使うのを今は見送りにした理由

wakairo @wakairo

Codex(OpenAIのコーディング・エージェント)をdevcontainer(開発用コンテナ)の中に閉じ込めて動かすのは、 セキュリティの確保もできて、なかなか良いアイデアなのではと思いました。 ところが、vscodeで実際に試してみたところ、Codexのセキュリティの仕組みと絡んで、不都合な挙動があったので、 このやり方は公式にサポートされるまでは様子見が良いかなと今は思っています。

確認したこと

まずvscodeでdevcontainerを起動しました。 設定ファイル.devcontainer/devcontainer.jsonの中身は以下の通りです。

{
        "name": "Ruby",
        "image": "mcr.microsoft.com/devcontainers/ruby:3-3.4"
}

次に、Codex拡張をインストールしました。 その次に、Codexにソースファイルの一部を変更する指示を出したところ、 apply_patchが上手くいかないのでsedなどを代わりに使うという返答で、 変更前後のdiffが見づらい形になりました。

なお、devcontainerの設定で指定するimageは以下の2つも試しましたが、 同じ現象に遭遇しましたので、特定のイメージでのみ発生する現象ではありません。

  • ruby:3.4(Rubyの公式イメージ)
  • ghcr.io/openai/codex-universal:latest(OpenAIが公開している参考Dockerイメージ)

apply_patchが失敗する背景

Codexが言うには、apply_patchはbwrapという一種のコンテナの中で動かす仕組みらしく、 devcontainerというコンテナの中でbwrapというコンテナを動かす、 つまり、コンテナの中でコンテナを動かすのに失敗しているらしいです。 具体的には、devcontainerの中でbwrapのコンテナのために新しいnamespaceを作ろうとして、 permissionの問題に遭遇しているとのこと。

Codexがbwrapを使うのはセキュリティを高めるためだと思いますので、 安易な設定変更などでapply_patchを出来るようにするのは、 セキュリティ上のリスクがあると見ています。

0
Raw
https://www.techtips.page/en/comments/1121

Rails 8.0からRails 8.1への移行(アップデート、アップグレード)で必要な作業

wakairo @wakairo

Rails 8.1におけるRails.configuration.action_view.remove_hidden_field_autocomplete

config.action_view.remove_hidden_field_autocompleteは、hiddenフィールドからautocomplete="off"属性を除去するかどうかの設定です。 (この機能のPRこの機能のCommitbin/rails app:updateコマンドが生成する config/initializers/new_framework_defaults_8_1.rbには、 以下のようにこの設定を有効にするコードがあります。

+  # Highlight code that triggered redirect in logs.
+  config.action_dispatch.verbose_redirect_logs = true
+

この機能が導入された背景

この機能は、HTML標準へ より準拠したHTMLをRailsが生成するように追加されました。

具体的には、この機能を有効にしない場合、Railsは以下のようなautocomplete="off"属性を付けたhiddenフィールドを生成していました。

<input type="hidden" name="authenticity_token" value="abc123..." autocomplete="off">

このautocomplete属性付きのhiddenフィールドはHTML標準に沿っておらず、 Nu Html Checkerは 以下のメッセージとともに「エラー」として指摘していました。

An “input” element with a “type” attribute whose value is “hidden” must not have an “autocomplete” attribute whose value is “on” or “off”.

0
Raw
https://www.techtips.page/en/comments/1120

Rails 8.0からRails 8.1への移行(アップデート、アップグレード)で必要な作業

wakairo @wakairo

Rails 8.1におけるconfig.action_dispatch.verbose_redirect_logs

config.action_dispatch.verbose_redirect_logsは、リダイレクトのソース位置を関連するログ行の下にログ出力するかどうかの設定です。

rails newで生成されるconfig/environments/development.rbにおいて、 8.1からは以下のようにこの設定を有効にするコードが追加されました(この変更のPRこの変更のCommit)。

+  # Highlight code that triggered redirect in logs.
+  config.action_dispatch.verbose_redirect_logs = true
+

development環境でデバッグする際に使える情報が増える形になると思いますので、既存アプリでもこの設定を追加しても良いかもしれません。

0
Raw
https://www.techtips.page/en/comments/1119

Rails 8.0からRails 8.1への移行(アップデート、アップグレード)で必要な作業

wakairo @wakairo

基本的にはRailsガイドの手順に従えば良いと思います。

ガイドの手順にもありますが、ぜひbin/rails app:updateコマンドを活用しましょう。

Rails 8.1への移行で対応が必要そうな個別の作業について、以下のコメントでそれぞれ取り上げますので、ご参考になれば幸いです。

0
Raw
https://www.techtips.page/en/comments/1118
😄1