SwitchBot が温湿度計付きのハブを発売したので買ってみた。
https://www.switchbot.jp/pages/switchbot-hub2
今はハブと温湿度計をそれぞれ設置しているのでそれらを一つにまとめるのが目的。買ってから気がついたんだけど、温度と湿度の計測には専用の給電ケーブルを使う必要があるぽく、Type-C なら適当なケーブルに繋げばデスクがすっきりするじゃんと思っていたのにそんなに甘くは無かった。これに時計がついていれば完璧だった。
オートメーションやリモコン学習はぼちぼちとやっていく。エアコンのオンオフがタッチ操作でできるのは便利そう。
RubyGems では以下の2箇所で Psych つまり libyaml を内部で呼び出しており、その結果 2箇所に関係する処理については任意の Psych のバージョンを使うことが出来ない時がある。
出来ない時がある、というのは 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 のオブジェクトにするように書き換えるかどちらかをやらないと統一はできなさそうで頭を抱えている。
とりあえず、部分的ではあるが外のライブラリへの依存を外せたのは良かった。