トップ «前の日記(2025/02/03 (月) ) 最新 次の日記(2025/02/05 (水) )» 編集 RSS feed

HsbtDiary


2025/02/04 (火) [長年日記]

Ruby office hour

この日は Matz も来ない上に何も話題がなく虚無の時間のまま90分が経過という感じだった。自分はというとひたすら fiddle を消したら Windows で Ruby の動きがなんか変、という症状を追っていた。

fiddle を bundled gems にした

というわけで月曜火曜と結構な時間を使って調べたり、コードを書いて fiddle を bundled gems にした

https://github.com/ruby/ruby/pull/12616

pull-request の上部に書いているけどやや難しい問題として RJIT が rjit.rb という Ruby のインタプリタに組み込む技を使っているところで fiddle を使っているというのと、fiddle を消したら何故か Windows の CI が全部なんだかよくわからないエラー、gem installができない、とかそういうので落ちるのでちゃんと調べた。

まず RJIT については、暫定措置ではあるけど bundled gems でビルドした .so などのパスを rjit.rb に埋め込んで LOAD_PATH を通したらなんとか動くようになった。

if RubyVM::RJIT.enabled?
  begin
    fiddle_paths = %w[.bundle/gems/fiddle-*/lib .bundle/extensions/*/*/fiddle-*].map do |dir|
      Dir.glob("#{File.expand_path("..", __FILE__)}/#{dir}").first
    end.compact
    $LOAD_PATH.unshift(*fiddle_paths) unless fiddle_paths.empty?

    require 'fiddle'
    require 'fiddle/import'
  rescue LoadError
...

こういうテスト向けのコードを配布コードに入れるのは最悪なので、nobu あたりに相談してテストでだけ外からパスを差し込むようにしようと思う。

で、Windows の方はかなりむずくて Windows の開発機で試したらすぐに再現したのでなんだろう、と深追いをしたら RubyGems > resolv > win32/resolv > win32/registry > fiddle という順序で参照していることでネットワークの通信箇所で落ちているということだった。

色々考えてどうしたものか戦略を考えたら、win32/resolv は resolv に必要な DNS の情報などを win32/registry を使って取得していたので、これを win32/registry というか fiddle を使わないでレジストリから取り出せばいいのでは、ということで powershell を使って値を取り出すようにしたら無事動いた。

パスとキーを渡して値を取り出す、というのでやってることはこんな感じ。

def get_item_property(path, name, expand: false)
  if defined?(Win32::Registry)
    Registry::HKEY_LOCAL_MACHINE.open(path) do |reg|
      expand ? reg.read_s_expand(name) : reg.read_s(name)
    rescue Registry::Error
      ""
    end
  else
    cmd = "Get-ItemProperty -Path 'HKLM:\\#{path}' -Name '#{name}' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty #{name}"
    output, _ = Open3.capture2('powershell', '-Command', cmd)
    output.strip
  end
end

powershell の使い方は LLM に聞いては試しつつって感じで書いていた。こういうあまり詳しくない言語や環境でやりたいことをやる時には大変便利。

こんな感じに fiddle がなくても powershell を使って resolv が動くようになったところで困っていた Windows で動かないというのは解決できた。これ、resolv でレジストリを参照して色々複雑な処理でインターフェースごとに値を取り出しているけど、素朴に グローバルな DNS を使うだけじゃダメなんかなあ。

これで 2024 年に予告していた bundled gems 化はひと段落。ちょっと微妙なコードや処理が残っているので2月はその辺の「整頓」かなあ。頑張ろう。

Asakusa.rb 第 803 回

夕食の時間が遅くなってしまって、discord でチャットを眺めるというだけになってしまった。

https://asakusarb.esa.io/posts/1237

https://railsconf.org/ の cfp がオープンしたので honda さんと眺めながら、フィラデルフィアってどう行くのがいいのか?というのを軽く話していた。最初は乗り継ぎかなあとか思っていたけど、ニューヨークの JFK まで行ってしまって列車で移動、というのも楽で良さそうだった。

それはそれとしてまずは proposal を通さないとなー。