2024年5月24日金曜日

TvRockの予約録画時のスリープからの復帰方法について

 いまさらTvRockかとお呆れのかたもございましょうが、お許しください。

(成果物だけほしい方向け: `tvrock.schから補正'版はこちら、`TvRock単体で動作`版はこちらです)

表題の件ですが、タスクスケジューラとそれ以外があります。そして、今回はそれ以外のほうのお話をさせていただきます。

その前に、まず小ネタから。

0.9t8ではTvRockDTV.x64.dllがないためにTvTestとかTSTaskの64bit版が動かないとお嘆きの方に。実は0.9u2で生成させたTvRockDTV.x64.dllをそのまま保持しておいて0.9t8に戻せばTvTestやTSTaskの64bit版が使えます。

他は64bit化したものの、TvRockだけはどうにも余人を以て代え難く、しかし0.9u2はTvRockがOSのスリープを(powercfg /requestsoverrideしてしまわない限り)阻止し続けるので使いたくないという方向けのニッチすぎる情報でした。

さて、TvRockで録画を予約するときに「復帰処理をタスクスケジューラで行う」にチェックボックスを入れていなくてもきちんとスリープから復帰して録画が開始されますが、powercfg /waketimersを行ってもスリープ状態の解除タイマーはありません。

以前から気になっていたのですが、今回こんなネタを知ったのでスリープからの復帰時間の補正をするツールを書くついでにだいたい見当はつくけど確かめてみようということでghidraを用いてバイナリを紐解いてみました。

思った通りWM_POWERBROADCASTを受けたときにwParamがPBT_APMSUSPENDのとき、つまりスリープに入る直前にSetWaitableTimerして、レジュームした直後(PBT_APMRESUMEAUTOMATIC)にCancelしてました。

そのため、普段はpowercfg /waketimersを行っても見えません。普段は登録されていないのですから当たり前です。

ここで、先のACPI Wake Alarmによる遅延のために何とかしたいとする場合は、予約前の準備時間以上スリープしないようにシステムを設定しておくのが無難でしょう。

あえてプログラムを書こうという場合、いくつかアプローチがありますが、私はtvrockと同様にWM_POWERBROADCASTでPBT_APMSUSPENDを受けたときにtvrock.schから現在時刻からの直近で4時間以上未来の録画予約があれば予想遅延時間を引いた時刻でwaitable timerを設定しています。この方法だとPBT_APMSUSPENDをもらってから2秒以内にすべてを終わらせる必要があるのでCで書きました

でもこれは物好きだからやっているだけで、普段からtvrock.schを監視しておいて、変更されたらschtasksコマンドやpowershellを使ってタスクスケジューラ経由でスリープを解除させる方法が簡単だと思います。TvRock.exeではTvRock.schを開く際はCreateFile()で排他しているので書き込み中にリードしたりといった事故は起きないと思います。

ちなみにtvrock.schのSTARTはunix epochなJSTです。

tvrockを卒業することになるかと思いきや、解決策が見つかってしまったのでまだまだ使い続けることになりそうです。やっといてなんですが、もう録画してまで見るものがないのでした。

最後で恐縮ですが、TvRock, TvTest, RecTest, TSTask, Spinel, BonDriverProxyEx, BonDriver_PT3-ST, pt2wdm の作者様方のみならず、多くの関係者の方に心から感謝しています。

以上、このような駄文を読ませてしまい、誠に申し訳ございませんでした。

ACPI Wake Alarmによるスリープからの復帰における遅延時間のデータ (ASUS PRIME B760M-AJ D4)

 表題の件ですが、Windows10や11で使用したときにn時間以上スリープさせた場合、ACPI Wake Alarmによってレジュームすると予定時刻より遅れて復帰するということを知りました。

いやあ、全然知りませんでした。11年ぶりにPCを新調したらこんな落とし穴があったなんて。

先達はあらまほしき事なり、というわけで「アルチーナの魔法の島」さんの「Intel 300シリーズチップセット以降のスリープ解除遅延問題」を読ませていただきました。大変有用な情報をありがとうございます。

UFEIでレガシーなRTCを選べれば回避できるとのことですが、当方がWindows11で運用しているASUS PRIME B760M-AJ D4には項目がありませんでした。

そこで、まずはスリープからACPI Wake Alarmによって復帰というかレジュームというか起床したケースをPower-Troubleshooterが記録したイベントログから拾って表にしてみました。当方の環境では最低でも一日に一回必ず走るジョブがあるので、スリープ時間が一日以上のデータはないのが残念です。

実スリープ
時間
期待スリープ時間遅延秒数遅延秒/時
10:44:1210:39:3028226.45817045
12:23:3812:18:0733126.90631562
6:53:4106:50:4917225.12069455
9:57:0109:52:4126026.3209696
5:38:4205:36:2613624.25443377
14:25:1814:18:4938927.1769295
8:56:1908:52:2823126.02979842
4:33:1104:31:2810322.76522593
9:10:3209:06:3423826.1267305
18:33:0918:24:4150827.59161751
6:46:1106:43:2316824.98863777
7:51:0707:47:4720025.65290198
9:03:2108:59:2723426.02650848
10:44:2010:39:3728326.54715064
5:56:1005:53:4514524.59363958
7:07:2807:04:3017825.1590106
4:32:4204:30:5810423.02866281
4:33:4504:32:0110422.93977085
4:30:2504:28:4310222.77491782
4:57:3604:55:4011623.54002255

遅延秒数とあるのは期待スリープ時間と実スリープ時間との差分で、「本来復帰すべきだった時刻よりもどの程度遅れたか」を計算した秒数です。確かに遅れまくってます。

9時間スリープさせると3.85分の遅刻で、18時間33分では8.46分遅刻する、と。

表だけだとよくわからんので、googleさんにグラフ化してもらいました。

ACPI Wake Alarmによる復帰遅延秒数グラフ

グラフの右側の目盛りは左側の目盛りが合計の遅延秒数で、右側は1時間当たりの遅延秒数です。

先の先達のブログ様では3.5時間以上の場合にACPI Wake Alarmで起床するようになるという情報でしたが、当方でも4時間未満の起床は起床させたプロセスが正しく記録されていました。

一方、一時間おきに25秒程度づつ遅延するということでしたが、こうしてみると、私のケースでは一時間当たりの遅延秒数は、スリープ時間の合計時間によって放物線を描いていて少々異なるようです。

遅延秒数のほうはきれいに値が出ているので、xをスリープから復帰する時刻までの秒数、yを遅延秒数とすると、遅延時間を計算する式はだいたいy=0.008x-27.5くらいでよさそうです。

y切片がマイナスなのですか。長時間のスリープ時はホニャララするとかしないとかの省電力がらみなんでしょうか。でも遅刻はまずいんじゃないかなあ、と思うのは日本人だからでしょうか。

誰にも役に立たない情報ですが、まずは以上です。

ここまでお読みいただいてありがとうございました。

2024年4月18日木曜日

ファイルサーバ(Sambaサーバ)がWindowsから見えないよ(いまさら)

 前回の記事に関連して、いまさら言うような話でもないのですが、Windows7や8からアップグレードを重ねてWindows11まで来てしまったりすると気づかなかったりしますし、まあちょうどよい機会ですのでメモしておきたいと思います。

 Windows10の1709あたり以後、SMB1.0がデフォルトで廃止されたためLinuxやFreeBSD上で稼働しているsambaサーバがWindowsのエクスプローラの「ネットワーク」フォルダ(ややこしい)に表示されなくなったりします。

よっぽど古いNAS製品でもない限り、sambaのバージョンが3.5(おおよそ13,4年前です)以上ならSMB2以上に対応していますから、あくまでもエクスプローラの「ネットワーク」フォルダに表示されないのが問題なので、ファイル共有自体にはSMB1.0は不要です。

で、SMB1.0が入っていないとなぜエクスプローラの「ネットワーク」フォルダに表示されないのかというと、NETBIOS over TCP/IP(NBT)という仕組みでサーバの名前をばらまいたり受け取ったりしているのですが、その仕組みがSMB1.0と抱き合わせなので、SMB1.0を削除すると名前を受け取ったりできなくなります。

sambaはNBT以外で名前を解決する機能は持っておらず、別のプログラムが必要になります。

そこで、Windows VistaからはNBTとは別の名前の解決手段も有効になっていますので、例えばWSDという機能でもってSambaサーバが稼働しているマシン名をばらまくとめでたくSMB1.0なしで(NETBIOSを使わずに)エクスプローラの「ネットワーク」フォルダにsambaマシンが表示されるようになります。

ですので、sambaマシンでWSDをしゃべるデーモンを稼働させればいいわけです。

なお、そもそもエクスプローラの「ネットワーク」フォルダに表示されなくたっていい場合は、ネットワークドライブを割り当ててしまえばいいだけです。
そのほかにも、たとえばショートカットを新規作成し、その「リンク先」に

 \\192.168.x.x\shared_folder

というようにsambaマシンのIPアドレス(hostsやDNSが正しく設定されているなら名称でもOK)を与えてやれば、それ以後はいちいち手入力しなくても共有フォルダが開けます。

さて、sambaが稼働しているサーバがLinuxかFreeBSDだった場合(Windowsだった場合はそもそも必要はありませんよね)、pythonで記述されたWSDデーモンC言語によるそれがあるのですが、python版なら様々なLinuxディストリビューションやFreeBSDでパッケージ化されているので導入が楽だと思います。

python版で一点だけ注意が必要なのは、UbuntuやCentOSなど、使用しているディストリのカーネルオプション次第ではIPv6を使用するとエラーが出ます。その際は起動オプションで明示的にIPv4だけで稼働するよう指示(-4)を与える必要があります。また、WSDで名前を案内したいLANに接続されたネットワークインターフェース名(enp2s0やeth0など)も明示的に指定(-i)する必要があります。
いうまでもありませんが、ドメイン(-d)orワークグループ(-w)、および名前(-n)の指定は必要です。

たいしたことではないのに長くなってしまいました。

以上です。ここまでお読みいただいてありがとうございました。

2024年4月17日水曜日

VLC for Androidからユーザ名とパスワードで保護されたSMBプロトコルで共有されたネットワークフォルダにアクセスする方法

 タイトルが長いです。要するにAndroid版のVLC(ver.3.5.4)でIDとパスワードで保護されたWindows10,11,Samba鯖の動画を見ようって話です。

前置きです。

この頃は光回線などで有線LANを引いている多くの方が無線LAN基地局(WIFIルータなど)を設置しておいでと思います。
とても便利ですが、対インターネット経路だけでなく、隣近所や道路からの無線によるアクセスも簡単にできるということでもあります。WPA2-PSKだのなんだので保護されているといっても、故意であるなしにかかわらず、簡便な攻撃経路が一挙に拡大した事実には相違がないわけでして、昔のようにLAN内だからといって匿名ユーザにアクセスを許すような共有をするというのは以前にもまして危険となってきました。

Windows10や11も初期設定ではセキュリティホールが大きすぎてどうにもならなくなってメンテナンスが放棄されたSMB1.0は廃止され、SMB2や3であっても匿名アクセスは原則として無効とされています。

VLC for AndroidはSMB2以上に対応しているのですが、匿名アクセスを前提としたUIになっていてアカウント名とパスワードを指定してアクセスしたいな、というときに、ちょっとややこしいです。で、その手順をメモします、という記事です。

前置きは以上です。

さて、VLCを起動して以下の画面になったとします。

ここでSERVER1はWindows11などでIDとパスワードで保護されたフォルダだったとします。それを選択すると
こんなこと言われます。
ID(アカウント)もパスワードも聞いてくれません。悲しいです。

聞いてくれないので、「お気に入り」としてサーバを指定して対応してあげる必要があります。
最初の画像の左上の三点メニューを押下すると以下のメニューが表示されます。


そして、赤丸で囲った「お気に入りにサーバーを追加」を選択しますと、以下のような画面が表示されますので、それぞれ記入します。
  • プルダウンからSMBを選択します。
  • ポート番号は空欄のまま。
  • ネットワーク共有名は共有フォルダがあるサーバのIPアドレスを。
  • フォルダーパスは空欄のまま。
  • サーバ名は何でもいいです。

まだパスワードは入れていませんが、いったんOKを押して閉じます。

すると、次の位置(緑色の矢印の先)に今作成したserver1が登録されていますので、赤丸で囲った3点メニューを選択して再度編集します。

すると以下の画面が開きますので、「ユーザー名」の欄に、ユーザ名とパスワードをコロンで区切って1行で記述してください。

昭和を髣髴とさせる設定方法ですね。

以上です。

ここまでお読みいただいてありがとうございました。

2024年4月10日水曜日

タスクマネージャ上のCPUの「速度」

 タスクマネージャでCPUの乱の下部に、こんな感じで表示される「速度」。

黄みどり色のまるで囲ったところです。
(ピンクのまるで囲った「使用率」については前回の記事で触れたところです。)

この「速度」、CPUのコアがいっぱいあって、しかもコアごとに全部周波数が違うってえのにどこの「速度」なんでしょうね、と。

実際にはコアごとの平均らしいです。

で、パフォーマンスカウンタの「Processor Information」に「% Processor Performance」というのがあって、_Totalのインスタンスから平均値を100倍した値(percentだから)が取得できます。

何に対してのパーセンテージなのかというと、茶色のまるで囲んだ「基本速度」です。
「基本速度」をプログラムから取得するなら、たとえばパフォーマンスカウンタで取得するなら「Processor Information」の「Processor Frequency」を取得するか、WQLでWMIから取得するなら、
SELECT MaxClockSpeed FROM Win32_Processor;
とかで取得して1000で割ります(取得できる値がMHz単位なので)。

で、
「% Processor Performance」/ 100 *「Processor Frequency」/ 1000

という式を計算すると、黄緑のまるで囲った値(GHz)が得られます。

自力でこれらを計算する場合はintelの場合はコアごとにIA32_APERFとIA32_MPERFとTSC周波数とで何とかするのは見当がつきますがTSC周波数の計算も面倒だし、そもそも今はやりのAMDとかになるとさっぱりわかりません。FreeBSDやLinuxのcpufreqのソースが参考になるのかな。

それだけです。
ここまでお読みいただいてありがとうございました。

2024年4月3日水曜日

WindowsでのCPU使用率の計算について

 割と知られていないようなので一応。

実はWindows界隈ではCPUの使用率の計算に二派閥あったりします。
Windows8の時代から始まって、Windows11な現在でも続いています。

一つはタスクマネージャで表示されるCPU使用率です。CPUが処理に費やした時間ではなくて作業量で使用率を計算しています。作業量を評価する基準にCPUのベースクロックを意識しているので、ベースクロックを超えて動作するターボブースト機能を搭載した近年のCPUだと高負荷時には100%を超えます。
しかし計算結果が100%を超えても表示上は100%に丸めちゃっているので、見た目だけは矛盾が出ないようになっています。

もう一つは、SysinternalsのProcess Explorerなど、管理者向けツールなどでよく使われている方法です。これはWindows7まではタスクマネージャもこの方式でした。この派閥は実時間に対するCPU時間で計算しますので、もちろん100%を超えなくなり、タスクマネージャよりも低いCPU使用率が表示されます。

とりあえず、なぜタスクマネージャのCPU負荷の値があんな高い数値なの?という疑問の答えがこれですよ、ということで。

なぜそんな面倒なことをタスクマネージャがしはじめたかのかというと、当時動的にクロックが可変(speedstepとかもう覚えてないでしょ)にできるCPUが普及したことによって、クロック数が下がったまま動作しているマシンと下がっていないマシンではCPUの使用時間が同じだからって仕事量は違うよね同じ負荷とは言えないじゃん!という考えに基づいています。

一方でクロックが落ちてようがなんだろうが、実際にかかった時間との比率こそボトルネックを探すのに便利だろ!クロックは別に監視しとけばいいだろ!!という派閥もあって、それがProcess Explorerなどのツールです。

それぞれごもっともだし、たいていの場合はどちらの方法でもシステムの負荷の監視には役立つと思いますが、違いを知っておけばボトルネックの解消時の参考になるかもしれません。

ご参考: Powershellやプログラムでタスクマネージャと同じ計算結果を得るにはパフォーマンスカウンタ( "Processor Information" の "% Processor Utility" )を参照すれば取得できます。
Process Explorer方式の方法は上記以上にAPI、WMI、パフォーマンスカウンタなどなどから容易に取得可能で、主にCPU負荷の取得という記事があったらこの方法ばかりだと思いますので特に触れません。

PCを新調したのでLinuxサーバからPCを監視する自家製エージェントを仕込む際にふと思いたって記事にしてみました。

ここまでお読みいただいてありがとうございました。

DOSPARAからi5-14500+RTX4060のBTO(RM5C-R46)を購入

 使用しているパーツを明らかにしないDospara製のBTOパソコンを買うなんてどうかしているといわれそうですが、買ってしまったので使われていたパーツを列挙することにします。
型番はガレリアというブランドのRM5C-R46です。
なんのめぐり合わせかわかりませんが、これでガレリアブランドのPCは10年強のブランクを経て3台目です。自分でもびっくりです。

昔もそうでしたが今回も出荷された機器に添付される「構成表」にすら組付けたパーツの製品名がないこの会社のBTOパソコンは同じ型番でもCPUをはじめとしてパーツを変えて販売しても型番が変わらず、型番だけ記述しても意味がないので、2024年3月25日ごろに購入したRM5C-R46の主要パーツ一覧としてお読みください。

使用パーツ変更前
マザーボードASUS PRIME B760M-AJ D4-
メモリ(2枚)Samsung M378A2K43EB1-CWE16G
CPUCore i5-14500i5-14400F
GPUZotac RTX 4060 8 GB-
SSDSOLIDIGM SSDPFKNU010TZ0.5TB
光学ドライブHL-DT-ST DVDRAM GH24NSD5追加

上記にWindows11Proへの変更と電源容量を600Wから750Wに変更してギリギリ20万円弱でした。OSは例によってOEM版です。
ちなみに10年前の同ブランドのCore i7+GTX660マシンを16万円ほどで購入し使用していました。しかし数年前からあちこち故障が続発しているのをだましだまし使っていましたが、ついに面倒になってそのマシンの代替機としての購入です。
それよりも前に買った同ブランドのCore i3機もあったのですが、そちらは不運にも数年でぶっこわれました。再び購入することになって、なんだかご縁があるようです。

今回はVGAがPalitではなかったのは意外でした。
Palitは直接サードウェーブ社自身で仕入れていてASK税がかからないはずですが、今回はたまたま思うように出荷してもらえない事情ができたのでしょうか。ZotacはASK税はかかりますが、それは客に負担させればいいのでASKがいろいろ面倒を見てくれるので調達しやすかったのかな。
それはそれとして、そもそも私にはRTX4060はオーバースペックでした。GTX660で困ってなかったのは伊達じゃなかったみたいです。

ケースについて。
DosparaのBTOパソコンに限らず、あちこちのBTOを謳うブランドに共通する点に、ミドルタワーよりちょっと小さいだけなのにストレージ搭載可能量が少ないケースが採用されている傾向があります。

本機の場合はSKMケース(MicroATX)ver.2という名称で、5インチベイ(光学ドライブ向け)が1台、3.5インチベイ(HDD向け)が2台、2.5インチベイ(SATA-SSD向け)が2台搭載可能なケースです。今日日のミニタワーとしては標準よりやや多めで、殊に5インチベイの存在は省略されがちな昨今ではうれしいです。

当然、このケース内では、仮にRAID1を同種のストレージで組むとスペアが設置できません。それでも私にとっては2台づつでも搭載できるだけありがたいのですが、しかし多くの人にとってはシステム起動用とオフィスやゲームのバイナリ置き場しかいりませんのでマザーボード上に直接設置できるSSDで十分ですから、こんな半端なストレージしか載せられないケースってむしろコスト高になるだけでうれしくないでしょう。
いずれ外部ストレージを搭載可能なケースは、一般向けにはまず見かけなくなるのかな、という気がしています。USBもLANもとても速い時代なので、タワー型のPCであってもストレージ専用機器を外部に設置する流れになるのかな。

さて、本機のケースのメンテナンス性ですが、HDDを換装する際にはケースの正面から見て左側面側からHDD本体を設置し、そのHDDにケースの正面から見て右側面(マザーボードの背面側)から配線を行う必要があり、メンテナンス性が非常に低いです。

SATA接続SSDもケースの正面から見て右側面(マザーボードの背面側)に設置するタイプなので、SATAケーブルを接続するために左側面側からSATA端子にアクセスする必要があるので、これまたやっぱりメンテナンス性が非常に低いです。

なお、意味不明にケース前面のふちがピカピカ光る機能はUEFIの設定で殺せるので安心です。

SSD(M.2)はBTOで500GBから1TBに変更してSOLIDIGM SSDPFKNU010TZが入ってました。
室温24度の部屋/アイドル時で30度。よく冷えており、普段使いでは今のところ40度に達していないです。信頼性も性能も特段いいとも悪いとも言えませんが、ECCメモリも乗らないけど普段使いにそこそこなCPUで使うにはつり合いが取れているのかなと。
ちなみにSSD(M.2)にもう一枚自分でマザーの下側のスロットに「 LEGEND 800 ALEG-800-2000GCS-DP ドスパラ限定モデル」を取り付けました。BTOとして注文したものではないのでご留意ください。添付のヒートシンク利用で室温24度の部屋/アイドル時で40度。ちょっと大きいファイルをコピーするだけですぐに75度に達します。ヒートシンクは別に調達したほうがよかったです。TBWも非公開だし、2TBで14K円だったのですぐ壊れてもいいのでこのまま使います。ネタにできる壊れ方をしてくれるといいな。
また、3.5'HDDはこれまでバックアップ先として使用していた2台を本機に移設して引き続きバックアップ先として運用しています。

冷却(静音パックまんぞくコース)について。
ちょっと負荷がかかると低いうなりが聞こえます。
CPUは室温24度でアイドル時は33~38度の間をフラフラしています。それに追従して敏感にファンの回転数が変化して音が変化しますが、それが私には地味に耳障りです。
CPU-Zを用いてすべてのコアへ高負荷をかけると、ベンチ開始直後こそ4.2GHz程度での駆動で80度強に達してファンもうるさくなりますが、すぐに3GHz程度に落ち着いて53度ほどになり、ファン回転数も1000rpmを切ります。
冷却性能としては i5 14500 自体が熱くならない石なのでこれで十分です。10年前のガレリアの i7 4770 マシンの静音パックまんぞくコースは単にCPUに付属のリテールクーラーがくっついてただけでしたが今回はなんだかヒートパイプとかくっついた謎のサイドフロー式のCPUクーラーが搭載されています。個人的には音は i7-4770 付属のインテルのリテールクーラーのほうが静かでした。
14500なのでリテールクーラーが付属しているはずですが、それは付属品としては送ってこずに没収されました。送ってこられても困るので助かります。
GPUはVGAカードのファンをそのまま使っているだけですがアイドル時は28度からほとんど動きません。
ケースファンはアイドル時は600~700rpmで、最大負荷時は2000rpm程度まで上がります。

マザーボードのPCI Express 4.0 x16 スロットについて。
VGA用のほかにPCI Expressのスロットが2本(x4とx1)搭載されているものの、x1のスロットの位置がVGAカードに近すぎて実質的には使用が困難です。よほど小さいカードでなければVGA用の冷却ファンをふさいでしまいます。
そのため、VGAを使用するならば実運用上ではx4スロットが1本しか使えません。
インターフェイスカードや録画デバイスなどPCIeに複数のカードを設置するためにITXじゃない製品を選んだのに!とか泣けるシチュエーションに陥らないようにお気を付けください。

ところで、以前のマシンではBIOSに埋め込まれている情報があれもこれもほとんどTo Be Filled By O.E.M.になっていて薄みっともない感じ全開でしたが、今回は会社名とかはとりあえず埋めてきたようです。この辺は進化したといえましょうか(とはいえ、まだまだ残ってます)。

とりあえず気づいた点を列挙しました。

以上、ここまでお読みいただいてありがとうございました。