トップ «前の日記(2023/04/18 (火) ) 最新 次の日記(2023/04/20 (木) )» 編集 RSS feed

HsbtDiary


2023/04/19 (水) [長年日記]

SwitchBotハブ2 を買った

SwitchBot が温湿度計付きのハブを発売したので買ってみた。

https://www.switchbot.jp/pages/switchbot-hub2

今はハブと温湿度計をそれぞれ設置しているのでそれらを一つにまとめるのが目的。買ってから気がついたんだけど、温度と湿度の計測には専用の給電ケーブルを使う必要があるぽく、Type-C なら適当なケーブルに繋げばデスクがすっきりするじゃんと思っていたのにそんなに甘くは無かった。これに時計がついていれば完璧だった。

オートメーションやリモコン学習はぼちぼちとやっていく。エアコンのオンオフがタッチ操作でできるのは便利そう。

RubyGems の gemrc 呼び出し箇所から Psych を消した

RubyGems では以下の2箇所で Psych つまり libyaml を内部で呼び出しており、その結果 2箇所に関係する処理については任意の Psych のバージョンを使うことが出来ない時がある。

  • 設定ファイルである gemrc を読み込む処理
  • rubygems.org から gem のパッケージ情報を読み込む処理

出来ない時がある、というのは RubyGems は割と中身が複雑になっていて、ふとしたタイミングで Psych が activate されてしまうということもあって、その時は任意のバージョンを使うことができないのだが、ちゃんと使う直前にのみ activate するという時は大丈夫というふわふわっとした状況になっている。

で、そんな Psych への依存を Bundler が持っているすごくシンプルな Pure Ruby な YAML パーサーに置き換えてしまった。

https://github.com/rubygems/rubygems/pull/6615

このパーサー、本当にすごくシンプルで foo: bar: buzz みたいな文字列を {"foo: bar" => "buzz"} としてパース出来てしまうのでちょっと大変なのだが、gemrc みたいな単純な設定ファイルをパースするならこれでよかろうという判断にした。YAML は相変わらず wild な仕様になっていて、Bundler の方で動いているんだから RubyGems でもなんとかなるだろうと思いきやそうは行かず以下のような parse 処理を入れないとダメだった。

content.transform_values! do |v|
  if v.is_a?(String)
    if v.match?(/\A:(.*)\Z/)
      v[1..-1].to_sym
    elsif v.match?(/\A[+-]?\d+\Z/)
      v.to_i
    elsif v.match?(/\Atrue|false\Z/)
      v == "true"
    elsif v.empty?
      nil
    else
      v
    end
  elsif v.is_a?(Hash) && v.empty?
    nil
  else
    v
  end
end

RubyGems の方で上のように Ruby のオブジェクトを期待している部分を単純な文字列で動くように書き換えるか Bundler の方を Ruby のオブジェクトにするように書き換えるかどちらかをやらないと統一はできなさそうで頭を抱えている。

とりあえず、部分的ではあるが外のライブラリへの依存を外せたのは良かった。