Flutter webの設置方法
Flutter 備忘メモ
flutter build web
で生成されたブツをサーバーに設置したけど動かない。
ルート以外に置く場合は、パスを指定しないといけないぽい。
index.html
<base href="/hoge/hige/hage/">
Intel NUCのHackintosh化
Xcodeが必要になりそうなので、ほこりをかぶっていたMac mini(2014)を引っ張り出してきた。CPU2コア、メモリ8GB、ストレージはHDDと性能が心もとない。とりあえず分解して、余ってるSSDに換装してみた。
手順はこちらを参考にした。
割と難易度高い……。特殊ねじのドライバーも購入。
ということで、Hackintoshに挑戦してみた。Windows向けのマシンにMacOSいれるやつ。そこそこ高性能なNUC(BOXNUC8I5BEK)を余らせていたのでこいつを使う。CPU4コア、メモリ32GB、ストレージはSSD。
以下、NUCのHackintosh化の備忘メモ
基本的な手順はこちらを参考にした。
Kextを二つほど指定フォルダに入れて、config.plistを修正するだけ。
WiFiもいけそうだけど対応にクセがありそうなのと使わないので今回はオミット。
追加したKextのconfig.plistへの反映は、propertreeを使うことで自動でやってくれる。
内臓AudioデバイスとHDMIオーディオの対応は面倒そうだったのでパス。必要なときはBluetoothのデバイスを接続する想定。が、Audioデバイスが無い状態で動画を再生するとエラーがでていて不穏だったので(開発ツールが音出したときに落ちたら嫌だ)、とりあえず余ってるUSBオーディオをつないでおいた。USBポートに差すだけで認識するので便利。1000円くらいで売ってる。
Bluetoothデバイスのバッテリー残量を表示する
昨今はPC回りの機器がワイヤレス化して便利。机がすっきり。マウス、キーボード、ヘッドホン、ゲームパッド、充電もQiなどなど。
何かしらバッテリー情報を表示するガジェットがないかと探したけどなぜかなさそう。ならば自分で作るかとBluetoothについて少し勉強した。
バッテリー情報の取り方①
バッテリーサービス0000180f-0000-1000-8000-00805f9b34fbバッテリー情報キャラクタリスティック00002a19-0000-1000-8000-00805f9b34fb
バッテリー情報の取り方②
昔ながらのBluetoothClassicではハンズフリープロファイル(HFP)に対応していればそれに従ってバッテリー情報がとれる。RFCOMMというプロトコルでシリアル通信すればいい。HFPはプロトコルスタック的にはこのRFCOMMの上にのっかっている。
ヘッドセット(HFP)0000111e-0000-1000-8000-00805f9b34fb
※詳細な技術情報は上記のUUIDやら単語でググったりGitHUB検索すればいろいろ出るはず
しかし①はBLEのBatteryServiceに対応したデバイスは少なく、ほとんどの機器のバッテリー情報が取れない。またWindowsPCと接続をとりあっているのかすぐ接続が切れる。更新通知設定は動作しなかった(使ったデバイスが悪いだけの可能性もあるけど)。まぁ毎度接続しなおせばバッテリー情報は一応とれる。
②はそもそもヘッドホンとしてWindowsで接続中なので、ソケット横取りしてバッテリー情報を取ることはできない(多分)。ペアリングしたあと、手動で切断した状態ならシリアル通信できた。ドライバの層でやらないとダメそう。
バッテリー情報を取得するソフトないなぁと思ったけど、これらが理由かな。
でも色々調べまわってたらBluetooth Battery Monitorなるものを発見した。
おそらくドライバレベルで対応している。そして素晴らしいことにバッテリー情報を取得するAPIが提供されていた。でも、ガジェットとして常時表示できないのと、見た目が好みじゃなかった。。
Bluetooth Battery Gadget
・2022/03/09 追記
Windows11でウィンドウが角丸になるので、角丸にしないオプションを追加。ただし影もなくなります。
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バージョンアップされないかなぁ。。
CO2-miniによる二酸化炭素濃度取得
夏場に部屋を締め切ってエアコンをがんがんかけていると、ふと二酸化炭素濃度がどうなっているのか気になった。
1000ppm(0.1%)を超えるとぼーっとしたり眠くなったり人体に影響が出始めるそうだ。
ということで比較的安いCO2計測装置CO2-miniを購入して確認した。
換気すれば500ppm程度、窓を閉め切っているとすぐに1000ppmに。そのまま就寝・起床後は2000ppm程度まであがった。
とりあえずしっかり動作して目的は果たし、24時間換気の重要性を改めて知るのだけど、この装置気になることがある。こいつはCO2の計測だけではなく気温も測ってくれるのだが、CO2濃度と気温を交互に表示する仕様となっている。そのため、CO2濃度を見たい!と思ったときに気温が表示されててイラッとする。切り替わるまでが案外長い。ついでに給電が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();……}
成果物。