2022年 11月 03日

JS+SVGで液晶画面風の表示をつくる

液晶風の画面は決まった形をオン・オフするだけなので、canvas にコードで描くのは大変なだけで無駄が多い。かといってセグメントを1つ1つ画像にわけて座標指定で配置していくのも面倒くさい。

と考えていくと SVG を埋めこんで、SVG の要素を JS で操作するのが効率が良い。ワークフローとしては SVG の作成と JS の実装で綺麗に境界を作ることができる。

Inkscape


Inkscape の良いところは以下の点

  • XML エディタが UI と連動している
    • レイヤーやオブジェクトを選択すると該当箇所にエディタ上で跳べる
  • 構造をコントロールしやすい
    • 画像を編集するというより SVG の XML を編集するUIというイメージ

Inkscape でオブジェクトに名前をつけると、svg 上では inkscape:label 属性に入る。これを利用して JS から操作すれば Inkscape で保存した SVG をそのまま利用できる。

JSで扱う

Inkscape で保存した SVG をそのままファイルとして置いて、fetch() で取得し、HTML5 な HTML で特定の要素の innerHTML に入れてしまうのが手っ取りばやい。(XML の Processing Instruction については Chrome ではコメントに変換されるが、仕様上パースエラーなので消しておく)

名前空間の扱いが謎だが、querySelector() の場合以下のような形で指定することができる (つまり名前空間を扱わず、prefix も含めて属性名とする)

svg.querySelectorAll('g[inkscape\\:label="digits"] > g')

あとは適当に style.visibility を操作するだけなので省略

svg の HTML Living Standard 的解釈

svg 要素は HTML では SVG 2 で定義されると書いてある。つまり「HTML は SVG を知っている」。SVG 2 では HTML 内でも svg が使えることを考慮して書かれている。

SVG の仕様上、HTML 内では SVG の名前空間は HTML パーサによって与えられると書いてある。このため、HTML 内 svg 要素には xmlns は必要ない。 https://svgwg.org/svg2-draft/single-page.html#struct-Namespace

HTML LS

In HTML, the xmlns attribute has absolutely no effect. It is basically a talisman. It is allowed merely to make migration to and from XML mildly easier. When parsed by an HTML parser, the attribute ends up in no namespace, not the "http://www.w3.org/2000/xmlns/" namespace like namespace declaration attributes in XML do.

また https://html.spec.whatwg.org/#elements-2 に例示があるが、HTML としては xmlns は何の効果もうみ出さない。例えば svg 要素の中に xmlns:foo="foo" という宣言と共に <foo:bar /> というのがあっても、これは HTML パーサによって自動的に与えられる svg の名前空間に属し、foo:bar という要素名になる。

13世代のIntelにPC更新

2016年の6月に組んでからCPUマザボを変更せずにきたが、この Core i7 6700 が Windows11 非対応だったり、今時さすがに4コア8スレだったり、PCIe レーン数が少なすぎて NVMe SSD が使いにくかったりで、そろそろかと思い組替えることにした。

ケースとグラボ以外はほぼ新調。ここに書いてない SATA のドライブは継続して接続している。あとはケースファンもすべて入れ替えた。

電源は 80+ Platinum で安かったやつ(1万円ぐらい)を買ってみたがパッケージやケーブルが良くできていて非常に豪華だった。

Intel か AMD か?

プロセスルールの数字が良いからなんとなく最近なら AM5 ソケットになった Ryzen 7000 シリーズかなと思っていたが、13th Intel が結構強いようだった。個人的には以下の点で Intel 優勢とおもった

  • アイドル時の電力が低め
  • DDR4 メモリが使える (DDR5 メモリが高い)
  • 12th (1年前) のマザーボードが使える
  • 性能的にはどっこいどっこい

DDR5 が十分性能と価格が落ちつくには何年もかかりそう。そして AM5 なマザーボードはだいぶ高い。Intel なら手元の DDR4 メモリも利用できる。

i5 か i7 か i9 か

i9 は水冷するような超ハイエンド向けというイメージがあり、i5 はちょっと微妙というイメージがある (別にそんなことないみたいだが)。

  • CPU ヘビーな状態が続くことはあまりないが時々ある
  • クーラーは空冷
  • Core i7 6700 でもそれほど苦痛になることはなかった (エンコードぐらい…)

と考えていくと理性的に最適なのは i5 ではないかと思うが、大は小を兼ねるので i7 とした。i9 は高すぎる。

フルロードせず電力制限をかけたとしても、その制限においてはクロックが上がるので上位CPUが無駄というわけではない。

Windows 11 のクリーンインストール

Windows 11 にアップグレード不可な PC に入っていた Windows 10 のライセンスだったが、普通に Windows 11 のインストールメディアをつくってインストールし、構成を変更したという宣言をしたら引き継ぐことができた。

電力消費

マザーボードデフォルト設定だとCPU電力無制限になるようだ。つまりサーマルスロットリングが常時起こるまで発熱し、クーラーの排熱性能上限ぐらいのパッケージ消費電力で落ちつくという挙動になる。

  • 電源にクランプして読むとアイドル時で50~60W程度
  • HWiNFO 読みで
    • CPU Package Power は最大 250W
    • GPU Power は最大 155W ぐらい

アイドル時の CPU の Package Power は 5W~10W ぐらい。GPU Power が 15W ぐらい。Z690チップセットが TDP としては 6W。

効率カーブが載っているPSU の評価結果 2% of spec = 13.2W 出力時の効率が 42% 程度で、20~30W ぐらいの効率は50~60%程度のように見える。つまりセンサ読み Package Power が 25W なら電源クランプで読むと 50W ぐらいになってしまう (実際はマザボ上のVRMの効率もあるわけで)。

なおこのマザボは多少光るけどオフにしても消費電力への影響は微々たるもの。

電力リミット

電力無制限で cinebench を回すと当然サーマルスロットリングが起き、最初は250Wぐらいだが徐々に Package Power が落ちて 220W 前後で落ちついてくる。これがこのクーラーの限界ということになる。実際、AS500 というクーラーはTDP 220Wまで対応と書いてあるので、実測でもその通りといえる。

あんまり限界性能を出すのも恐いので、UEFI から最大電力 (long / short duration power limit) を 180W に制限することにした。PL は原理的にシングルスレッド~数スレッドでは超えないので、全コア使い尽くすようなときに若干性能が下がるイメージだと思う。

定格は3.4GHz(Pコア)/2.5GHz(Eコア)ターボブーストで5.3GHz(Pコア)/4.2GHz(Eコア)。

なお Tjunction max はいわゆる絶対最大定格ではないようだ。Intel 的な絶対定格は内部に非公開で持っており、必要とあらばシャットダウンする仕掛けで、Tjunction max はこれを目標にサーマルスロットリングするぞという値。

つまり基本的には CPU 側で防衛しており、サーマルスロットリング自体も「問題ない」とされている。クーラーの性能上限(=サーマルスロットリングが起こる状態)までCPUは電力を消費して発熱する設計になっている。

Windows11 msedgewebview2.exe/Widgets.exe をアンインストール

Widgets.exe 関係で msedgewebview2.exe がやたら VRAM (GPUメモリ) を消費している。全く使わない機能なのでアンインストールする。

winget uninstall "windows web experience pack"
2022年 11月 01日

Error code: Wsl/Service/CreateInstance/MountVhd/E_ACCESSDENIED

Windows を再インストールして、

wsl --import-in-place Ubuntu D:\wsl\ubuntu\ext4.vhdx

みたいなことをしたら以上のようなエラーをいわれるようになってしまった……

ただ、管理者権限だと起動できる。該当する .vhdx ファイルのプロパティのセキュリティタブを見てみると変更権限などが一般ユーザになかったため追加したらうまくいった。

Windows 11でのIntel X520-DA1 (SFP+)

Windows11 にしたところ Intel X520-DA1 な NICが認識しなかった。

ドライバを検索しても「ないよ」と言われる。天下の Intel だぞおかしいと検索すると無情にも Intel 公式に「解決方法X520 対応の次のドライバーリリースは バグ修正のみであり、新しい機能や OS のサポートがないため、Windows 11 では X520 用のドライバーはありません。」 とか言われる。解決方法じゃない……

同様に困っている人はいるようだ。このエントリではセットアップファイルからドライバを抜き出して、手動で認識させる方法でうまくいっている。 のでこれを試してみた。

Windows 10 向けドライバダウンロードページから Wired_driver_27.6_x64.zip をダウンロードして、展開し、さらに 7-zip で Wired_driver_27.6_x64.exe を展開するとドライバファイルがでてくる。

デバイスマネージャからNIC選択し、ドライバを検索→手動でディレクトリを検索→展開したディレクトリを指定。でうまくいった。

2011年のQ2に発売された製品らしいから10年は経過してるから仕方ないのかもしれないけどウーン……

別PCのNTUSER.datから値をコピーしたいとき

regedit.exe で適当な場所 (HKEY_CURRENT_USER など) に新規キーを作る。ここでは OLD とする。OLD を選択した状態で「ファイル」→「インポート」して、ファイル種別に「レジストリハイブ」を選択すると NTUSER.dat を選択できる。

NTUSER.dat を選択する「OLD」以下を削除して置き換えるが良いか?という旨のダイアログが出るのでOKする。

これで読みこめるのでキーを探してなんとかする。

ただ以下のような問題があるのでお勧めできるかというと微妙……

この方法のやっかいなところ

Administrator アカウントでもアクセス不可能で削除もできず、アクセス許可も編集できないエントリができてしまう。どうやら SYSTEM アカウントでだけアクセスできるらしい。

sysinternals というツール集に含まれている psexec という実行ファイルを使うと SYSTEM アカウントで実行することができる。

.\PsExec64.exe -i -s c:\windows\regedit.exe

さらに SYSTEM 所有のレジストリエントリの子で TrustedInstaller が所有者になっているみたいなややこしいことなっている場合がある。この場合、所有者を SYSTEM にしつつ、SYSTEM にフルコントロールを与えると消せるようになる。とても面倒くさい。

親エントリで所有者を SYSTEM にすると (既にSYSTEMでも)「サブコンテナーとオブジェクトの所有者を置き換える」というチェックボックスがでる。これで一括でサブオブジェクトなどの所有権を置き換えできる。

2022年 10月 29日

3DプリンタでLCRメータDE-5000 のUSBシリアル出力アダプタを作る

オフィシャルのアダプタはかなり高い<ので https://www.thingiverse.com/thing:2551379 をプリントして USB シリアルを組合せた。

回路

使ったのは

Thingiverse の方法 (RX と GND に直接フォトトランジスタをつける) だと、FT234X ではうまくいかない。オシロで見た感じ立ちあがりが遅すぎたので、RX の内部抵抗が高いようだ。

なので普通に電源をとるようにした。FT234X は 5V トレラントなのでこれで問題ないはず。

読み出し

プロトコルは

あたりを参照すればわかる。

baudrate は 9600

2022年 10月 21日

サーマルカメラ UNI-T UTi260B の画像から文字を消す

UTi260B はなぜか表示されている文字を消す機能がない。常に時計やバッテリー表示などを含めてコピーされる。これが邪魔なので消したい。

スナップショットとして撮影して SD カードに保存される画像には bmp (画面のハードコピー) と jpg (光学カメラの画像) がある。bmp のほうは実は単純な画面のハードコピーではなく、グレースケールの元データと若干のメタデータも入っている。

このデータを元に画像を再生成するツールが UNI-T-Thermal-Utilities に uniTThermalImage.py として含まれている。

基本的にこれを使えばいいのだが、HTML+JS で作ってあればマウスホバーでカーソル位置の温度の表示とかいろいろ融通がききそうでいいかなと思い、移植した。

https://cho45.stfuawsc.com/uni-t-thermal-utils/

元の python 版と同様の温度補正機能もつけてあるので、ホバー時の温度の精度も若干マシになっている。

カラーパレットと最大・最小温度のマークを表示する機能もつけてある。

2022年 10月 18日

サーマルカメラの近距離分解能をレンズで改善する UNI-T UTi260B

サーマルカメラ UNI-T UTi260B を買ったが、近い距離だと結構ボヤっとしていて解像度が低い感じになる。そんなものなのかなーと思っていたが、Thingiverse で UTi260B にマクロレンズをつける例を見つけたので試してみた。

レンズ

UTi260B のスペック上、扱う波長は 8~14μm (遠赤外線)

通常の光学ガラスは赤外線を通さないのでサーマルカメラのレンズには適さない。

比較的安く入手性が良い CO2 レーザー (波長 10.6μm) 用のレンズである ZnSe レンズはだいたい 7~12μm あたりの透過性が高いらしいのでそこそこちょうどいい。

Aliexpress の WaveTopSign China PVD ZnSe Laser Focus Lens Dia.12 18 19 20mm FL38.1 50.8 63.5 76.2 101.6mm For Co2 Laser Engraving Machine というやつ。直径 20mm 焦点距離は 101.6mm で選んだ。約1500円程度。

小さいレンズとしては高いが、特殊用途のレンズとしてはかなり安い。

結果

近距離での撮影がかなり良くなった。

メリット・デメリット

メリット

  • 至近距離でより分解能が上がる

デメリット

  • 若干温度は低くでる (いくぶん透過性が下がるので)
  • レンズ中央以外の精度があやしい (光学レンズと同様、できるだけ大きいレンズを使うほうが安定する)

電力表示付きの Type-C 充電ケーブル

100W だと 20V 5A になる。1m

室温25℃で90Wの表示が出てる場合、しばらくすると52℃ぐらいまで上がる。

手元のケーブルテスタだと、ケーブル全体としてはコネクタも含め180mΩ。P = I^2 R なので 5A 流れているとき 4.5W はケーブル全体 (ケーブルそのものの抵抗 + 電流検出部) で消費される。

電流検出部のシャント抵抗が 10mΩ だとすると 0.25W 程度が電流検出部で消費される。定格1Wで定格電力比率25%程度だとすると25℃程度の温度上昇はだいたいそんなもんかという気がする。

AWG 24 の銅線だと 84.2 mΩ/m なので、シャント抵抗で無駄になる電力はそこまで支配的ではない (12cm 程度に相当する)。