アプリ置き場

アプリ置き場

http://www.moreread.net/

C#でAnimated WebPのディレイを取る

Webpの画像はWin10ならWIC経由で取得可能だったけど、各フレームのディレイの取得方法がわからなかったので自作。
下記のWebPのファイルフォーマットを参照した。
developers.google.com

List<int> delay = new List<int>();
byte[] buff = new byte[stream.Length];
stream.Read(buff, 0, buff.Length);

// WEBP
if (System.Text.Encoding.ASCII.GetString(buff, 0, 4).Equals("RIFF"))
{
    for (int i = 12; i < buff.Length - 8; i += 8)
    {
        string chname = System.Text.Encoding.ASCII.GetString(buff, i, 4);
        int chsize = BitConverter.ToInt32(buff, i + 4);

        if (chname.Equals("ANMF"))
        {
            int offset = i + 8 + 12;
            byte[] dbuff = { buff[offset], buff[offset + 1], buff[offset + 2], 0 };
            delay.Add(BitConverter.ToInt32(dbuff, 0));
        }
        i += chsize;
    }
}

return delay.ToArray();

これで自分用ツールのビューワをAnimatedWebPに対応。

Apple Wireless Keyboardの「英数」「かな」キーを「半角/全角」キーにしたい

HHKで打つとカタカタ音がして夜中に使うのは忍びないので、ここ数年はApple Wireless Keyboardを使っている。Windowsで使うにあたり、キーの機能をカスタマイズしてくれるツールがこちら。
 
Apple Keyboard Bridge

 

このありがたいフリーソフトのおかげで、Apple Wireless Keyboardの「英数」「かな」キーを「半角/全角」キーとして利用できていた。しかしながら、Windows 10 バージョン 2004 (Windows 10 May 2020 Update)のアップデートのせいで「英数」「かな」キーがApple Keyboard Bridgeで認識されなくなった。IME関連の更新もあったし、たぶんおま環じゃないとは思う……。デフォルトでそれぞれのキーが、IME Off、IME Onとして動作するようになっている。そうじゃなくてトグルする「半角/全角」キーにしたい。
 
仕方がないのでキーフックして「半角/全角」のイベントにすり替えるツールを作ったので置いておきます。 「英数」は0x1A、「かな」は0x16のキーコードが来るようになったみたい。
 
// Apple Keyboard Bridgeバージョンアップされないかなぁ。。
 

 

 

■追記

Apple Keyboard BridgeのコードGithubにあった。。

ありがたく使わせていただきます。修正して使用ちゅう。

github.com

 

CO2-miniによる二酸化炭素濃度取得

夏場に部屋を締め切ってエアコンをがんがんかけていると、ふと二酸化炭素濃度がどうなっているのか気になった。
1000ppm(0.1%)を超えるとぼーっとしたり眠くなったり人体に影響が出始めるそうだ。
ということで比較的安いCO2計測装置CO2-miniを購入して確認した。

 
換気すれば500ppm程度、窓を閉め切っているとすぐに1000ppmに。そのまま就寝・起床後は2000ppm程度まであがった。
とりあえずしっかり動作して目的は果たし、24時間換気の重要性を改めて知るのだけど、この装置気になることがある。こいつはCO2の計測だけではなく気温も測ってくれるのだが、CO2濃度と気温を交互に表示する仕様となっている。そのため、CO2濃度を見たい!と思ったときに気温が表示されててイラッとする。切り替わるまでが案外長い。ついでに給電がUSBなのだが横からケーブルが生えるので設置したときの見た目も微妙にイケてない。
 
解決方法としてはPCのソフトがある。
Amazonのコメントに書かれていたのだが、CO2 MeterというところのOEMらしく、本家のほうのソフトウェアが動作する。USB接続で情報を取得しPC上で常に監視できる。グラフ化もできる。
 
しかしながらこのソフトがまたイマイチ……。グラフ表示がメインなので無駄に大きいし、最小化最大化ボタンがなぜか反応せず。
ということで、とにかくリアルタイムでCO2濃度を見るというだけのシンプルなガジェットがほしかったので、自分で作ることにした。
偉大な先人方がハックして情報がそろっているらしく簡単に制御できた。
 
いつも通りC#で組み始めたのだが、HidLibraryというものを使うと制御できそうなので、NuGetしてくる。USBの制御方法なんて雰囲気しか知らないがなんとかなった。
製品IDとベンダーIDでデバイスを特定し、WriteFeatureDataでキーを送ると、データを取得できるようになる。
キーとか暗号化の解除方法とかは上記のページが詳しい。
//ProductHexId = "0xA052"
//VendorHexId = "0x04D9"
HidDevice deviceList = HidDevices.Enumerate().ToArray();
HidDevice co2miniList = deviceList.Where(x =>x.Attributes.ProductHexId == "0xA052" && x.Attributes.VendorHexId =="0x04D9").ToArray();
HidDevice co2mini = co2miniList.Length > 0 ? co2miniList[0] : null;
if(co2mini != null){
co2mini.OpenDevice();
co2mini.WriteFeatureData(feature_data);
……
HidDeviceData data = co2mini.Read();
……
}
成果物。

 

リマスター版 ロマンシング サガ3

リマスター版のロマサガ3(Steam)をやりこんで、サラ一人旅で真破壊するもの討伐で〆。

 
プレイするにあたって不便だったので簡単なツールを作成した。
①決定ボタン連打機能
 自動戦闘によるレベルあげ用
 スライムやロアリングナイトに
 ロアリングナイト先生では先に進むのをキャンセルしてくれる
②なんちゃってソフトリセット機能
 手元ソフトリセットがなくなっていて超不便なので作った
 PS4コンだとPSボタンを押すとアプリを強制再起動
 ウィンドウ位置を覚えておいて再配置してくれる
③HPチェック機能
 プロセスメモリ開いてHPを見る
 ラスボスのHPがどうにもおかしいので確認したくなった
 バグなのか仕様なのかわからんけど、
 真破壊するものでターン毎に1万以上回復することがあった

 

 

Windows10の動画キャプチャで保存場所が変更できない

備忘メモ。

 

Windows10のゲーム画面の動画キャプチャ機能で、保存場所を別ドライブに変更していたが、その保存先が含まれるドライブを取り外したところ、保存先が

C:\Users\UserName\AppData\Local\Temp

になってしまい、変更できなくなった。

 

レジストリを探したところ、それまでの保存先が下記にあったので、この部分を存在するディレクトリにすることで保存先を変更できた。

コンピューター\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders

 

ワットチェッカー

PCの消費電力が気になってしょうがない。
ワットチェッカーは持っているんだけど、いつも見える位置に配置しようとすると電源ケーブルをかなり延長する必要がある。Bluetoothで飛ばす製品もあるみたいだけど、結構なお値段する。

ということで、ありものの明暗センサLEDライト+ワットチェッカーWebカメラを使ったソリューション。Webカメラにマグネットシールを張り付けて、PCケース背面に設置、ワットチェッカーを監視。フレキシブルなUSBケーブルとかあればそっちのほうが便利かもしれない。暗くても見えるように近くに明暗センサLEDライトも設置しとく。

OpenCvSharpを使えばWebカメラからキャプチャできるらしい。NuGetしてきて適当にプログラムを書く。PictureBoxIplというコンポーネントがあったので、これを使えば表示できそうな気がする。

namespace WattCheck
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            timer1.Interval = 1000;
            timer1.Start();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            CloseCaptureDevice();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            UpdateCapture();
        }

        VideoCapture cap = null;

        private void UpdateCapture()
        {
            if(cap != null && cap.IsOpened()) {
                pictureBoxIpl1.ImageIpl = cap.RetrieveMat();
                System.GC.Collect();
            }
            else
            {
                OpenCaptureDevice();
            }
        }

        private void OpenCaptureDevice()
        {
            for (int i = 0; i < 0x8; i++)
            {
                cap = new OpenCvSharp.VideoCapture(i);
                if (cap.IsOpened())
                {
                    break;
                }
                else
                {
                    CloseCaptureDevice();
                }
            }
        }

        private void CloseCaptureDevice()
        {
            if (cap != null)
            {
                cap.Release();
                cap.Dispose();
            }
        }
    }
}

やったー。
f:id:nazenaninadesico:20181123104530p:plain
PC+ディスプレイの消費電力。
LEDライトは0.2ワットだから気にしない。

あとは文字認識させてロギングしたいけど適当なOCRのライブラリってあるんだろうか。
探してみるとtesseract-ocrというものを使うと良いらしい。
適当に画像を2値化して食わせてみたけど……。

f:id:nazenaninadesico:20181123104536j:plain

反射光やら影やらのせいでうまく認識しない。
7セグ数字くらいなら自前でテンプレートマッチングしたほうが手っ取り早そうな気がしないでもない。そのうちなんとかしよ。

AirPodsをPCで使うとシークでノイズが出たり音が止まったり

PCで使う用にAirPodsを購入。超便利。
 
しかしながら、FireFoxで動画サイトを見ているときにシークバーを弄ると、ノイズが走ったり音がでなくなったりしてしまうことが多々。接続が切れているわけではない。おま環なのか、AirPods+PC(FireFox)のユーザーが少ないのかわからないが、ググっても情報が見つからない。
・MM-BTUD43 (Bluetoothドングル)
Intel NUC (Win10)
しょうがないので自分で少し原因調査してみたが、音の停止と再生を素早く行うと発生しやすい気がする。プログラムを書いてMCIで音を連続再生してみても起こった。
多分に推測が入るが、Bluetoothドングルか、そのドライバか、またはAirPodsかでサウンドの入力が0になったときに、節電モード的なもののスイッチが入るが、ほぼ同時に再生が開始すると入力を取りこぼすか検知できないかで問題が起きてそうな気が。
 
仮説が正しいとすると裏で音楽をかけっぱにしとけば問題はおこらないはず。ためしにMPCでMP3を低音量で垂れ流しておくと、FireFoxで動画をシークしても問題はおこらなくなった。
 
ということで、可聴領域外(5hz)&低音量で音を垂れ流すページを作った。FireFoxでこのタブを開いとけばシークでぶつぶつノイズが走ったり音がでなくなったりすることはなくなるはず。なんという力技。
とりあえず別の方法が見つかるまではこれでしのぐ……。