2022-03 << 2022-04 >> 2022-05

2022-04-30 (土)

とても眠い.

* WebRTC Remote Desktop

使う人がいるかどうかわからないけど,Windows用にビルドしたバイナリをwebrtc-rdp/releasesに追加.

electron-builderを使ってビルドしたのだけど,やっぱりサイズ大きいな.実行ファイルが140MBもあるのはChromium+Node.jsが入ってるからか.それでも大きすぎな気がするけど.あと,asarの中にnode_modulesごと入ってるのか...一応,devDependenciesは除外されているけど,実行時に使われていないファイルが色々入ってしまうのは気になる.

* GitHub

何か作るとき何も考えずにGitHubにリポジトリ作ってるので,昔作ったもののリポジトリも全部GitHubに移動しても良い気がするな.すでに誰も使わないようなものばかりなのも気になるけど.

OSSの体で公開しているけどコミュニティも無い小さなプロジェクト,メンテナンス不可能だし,奇特な方がforkして修正してくれてたり,issueを登録してくれたりするのを見つつ,時間も興味も足りないので放置するしか無い...

2022-04-29 (金)

WebRTC Remote Desktop

複数の機器と同時に接続できるようにしたり,通常のブラウザでもElectron環境用に実装したやつと同じものが動くようにする.

0429webrtcrdp.png

UIはそのうちまともにしよう…….

2022-04-28 (木)

明日から休み.

とても眠い.

2022-04-19 (火)

書いた.マイナンバーカードでWindowsアプリケーションにコード署名をする

証明書のサブジェクト名,作成日や受付窓口の識別子から作られているっぽい謎の文字列になってるの.手っ取り早くユニークな名前を作りたかったんだろうけど,もう少しなんとかならなかったのかな.

2022-04-17 (日)

ダウンロードしたアプリケーションの実行時にWindowsが署名を確認するようになて久しいけど,証明書の取得に年間数万円かかるのはどうにかならないのかな…….

身元を証明するのにお金を払う仕組みに抵抗があってずっと放置してたけど,日本人なら誰でも入手できる強そうな電子証明書あったのを思い出して中身を確認してみる.

マイナンバーカードの電子証明書,keyUsage = digitalSignatureでcriticalフラグ付いてるので用途が限定されているけど,extendedKeyUsage はないっぽい.codeSigningはdigitalSignatureの一部みたいなので,日本の公的個人認証サービスが信頼されていれば,アプリケーション配布時のコード署名として有効なんだろうか.

* マイナンバーカードでexeファイルに署名を追加する

Microsoft Authenticodeの要求を満たしているのかは確認してないけど,とりあえずファイルのプロパティ上では有効な証明書が表示された.発行者は"Japan Agency for Local Authority Information Systems".

codesign.png

最初は,JPKI利用者ソフト入れて,Visual Studio に付いてる SignTool で署名したらよいくらいにしか思ってなかったのだけど,JPKI利用者ソフトはマイナンバーカードの証明書を読み込んだりできるけど,何か便利なAPI提供してくれてるものではないっぽい?

次に,ICカードの読み書きをするOpenSCがJPKIにも対応していて,Windows用のミニポートドライバを提供しているみたいなので入れてみる.signtoolコマンドの/cspと/kcオプションでスマートカードを使えるっぽい.ただ,No private key is available.と言われてしまう.マイナンバーカードの秘密鍵は読み取り不可なので署名の生成はICカード上で行わないといけないのだけど,方法が分からず諦める.

もっと分かりやすいツールあるだろうと思って探したら,osslsigncodeというのがあった.説明見る限りでは思った動作をしそうな気がする.OpenSC + OpenSSL + osslsigncode という組み合わせで署名できた.

osslsigncode sign -certs jpki.pem -pkcs11module .../opensc-pkcs11.so -pkcs11engine .../engines-1.1/pkcs11.so -key 1:2 -h sha256 -t http://timestamp.digicert.com -in test.exe -out test_signed.exe

署名しようとしたら,User Authentication PINが要求されてなんか変だなと思ったら,最初に現れる鍵を使ってしまってるっぽい.-key 1:2 オプションつけて署名用のDigital Signature Key を使うようにする.タイムスタンプもつけておいたほうが良さそうなので,DigiCertのタイムスタンプサーバを指定.

2022-04-16 (土)

眠い...

2022-04-12 (火)

リモートデスクトップ,とりあえずElectronアプリがひととおり動くようになったので,Chromeやマウス動かすためのプロセスを起動しておかなくてよくなった.

* Windows上のElectronアプリのdesktopCaptureの挙動

desktopCaptureモジュールでキャプチャしたウインドウの座標を取得したりするため挙動を確認したのだけど少し癖がある.

  • プロセスのDPI Awareness
    • DPI_AWARENESS_CONTEXT_PER_MONITOR_AWAREだった.いまのところWindows 10以降で実行した場合も_V2の方ではない.無理やり変更すると間違った領域がキャプチャされたりするので,他の設定はサポートされてなさそう.
  • DPIがシステムの設定と異なるウインドウをキャプチャするとマウスカーソルの位置がおかしい
    • ChromeのScreen Capture APIもダメだったので,そもそもChromiumが真面目にウインドウごとのDPI処理してなさそう.
  • SetForegroundWindowした瞬間に別のウインドウが映り込む
    • 対象のウインドウがフォアグラウンドかどうかでキャプチャ方法を切り替えてるみたいで,フォアグラウンドになる途中で重なったウインドウが表示されるっぽい.
  • ディスプレイのboundsの単位がdip(Device-Independent Pixels)
    • DPI_AWARENESS_CONTEXT_PER_MONITOR_AWAREなので物理座標だと思ってたけど違うっぽい.screen.dipToScreenPoint()で物理座標を取得できるけど,この関数はwin32以外ではundefinedっぽいのでplatformを見て処理を切りかえる必要がある.
  • getSources() がとても重い
    • デフォルトでは全ウインドウのサムネイルやアイコンを取得する.オプションで無効にできる.サムネイル取得するとかはAPI分けてほしかったけど,Chromeのようなスクリーンの選択画面を作ることを想定してるっぽい.
  • ディスプレイの電源切ったりするとgetSourcesしたときdisplay_idが空になる
    • 分からないでもないけど不便.display_idは無いけどキャプチャはできる.とりあえずプライマリディスプレイとして扱えば大丈夫?

2022-04-10 (日)

https://github.com/binzume/webrtc-rdp

ウインドウの切り替えは,通常のUIとWebXR両方実装するの面倒だったのでホスト側でウインドウ一覧を表示したストリーム作ってクリックして切り替えることにした.

ストリーム切り替え時,RTCPeerConnectionを使いまわそうと思って一度実装してみたけど,変なエッジケース多そうで面倒だったので新しく接続作ることにした.再接続に1秒くらい待たされるけど我慢できる範囲.

マウスとキー入力に robotjsを使ったのだけど内部でsleepしててスレッドをブロックするな...Issueも登録されてるけどあまりメンテナンスされてないっぽい.forkして開発されてるhurdle-robotjsが良さそう.

2022-04-09 (土)

いつのまにかOculus Quest起動時に表示されるロゴがMetaのロゴになってる.

2022-04-06 (水)

* ElectronとWebRTC

https://github.com/binzume/webrtc-rdp とりあえず,これのホスト側を単体のアプリケーションとして動くようにする.

一通り動いたけど,ストリームの選択画面が無いのでとりあえずデスクトップの共有だけ.ストリームの選択UIも映像に載せてしまってホスト側だけで完結させようと思ったけど,一つのRTCPeerConnectionで映像切り替えるの微妙に扱いにくいのと,Ayame-web-sdkに手を入れなきゃいけないか…….

RTCRtpSender.replaceTrack()が一番良いのだけど,常に使えるわけではなくてコーデックのオプションが変化するような場合は,removeTrack/addTrackが必要?あと,removeTrackしてもsenderは消えないっぽいけど増え続けるんだろうか…….

Electronアプリケーションをelectron-builderでビルドすると,electron-rebuildは不要だと教えてくれるのだけど,ネイティブモジュールのビルド時にError: Could not detect abi for version 17.3.1 and runtime electron. Updating "node-abi" might help solve this issue if it is a new release of electronとか言われて色々面倒なので,"npmRebuild": false を package.jsonに追加して,electron-rebuildでネイティブモジュールのビルドをするように戻す.

2022-04-04 (月)

https://github.com/OpenAyame/ayame-web-sdk を使ってたのだけど,複数のvodeo trackが含まれるMediaStream渡しても最初のしか見てくれないのか...

2022-04-03 (日)

Electron触る日.

ネイティブモジュールが読み込めないと思ったら,ElectronとNode.jsはABIが違うのか.ABI指定してビルドするか,electron-rebuildというの使うと楽っぽい.ただ,今度はNode.js側でロードできなくなるのでテストやデバッグ時に不便…….ネイティブモジュールのバイナリを環境ごとに指定できれば良いだけなのだけど,シンプルな方法が見当たらない.

とりあえずテストもElectron上で実行すれば大丈夫そうだけど,色々釈然としない.あと,ffiくらい標準で入っててくれれば細かい事気にせずOSのAPIや共有ライブラリ使えるのに…….

2022-03 << 2022-04 >> 2022-05