興味があったのでドラム用品一式を揃えた🥁

電子ドラムのリアルさに驚くが・・・

電子ドラムが面白そうだなと思って調べ始めたことが興味を持つきっかけ。特にRolandはアプリ連動で奏法を学べる点が良さげだ。

www.roland.com

百聞は一見にしかずということで、楽器店に足を運んで実物に触った。ドラムを叩いたことのないど素人、わからないなりにドラムスティックでスネアをバシバシ、シンバルをバシバシと叩く。ヘッドホン越しに伝わる音はリアルだ。素人が言うまでもなく、強弱まで再現している。

音源のない、素の状態だとどんな音がするのかと思ってヘッドホンを外してシンバルをバシバシ。当然のことだがカツカツとそっけない感じ、まるでおもちゃのドラムを叩いているようだ。

動画を見ながら妄想を膨らませていたが、実物を叩いて感じたおもちゃ感。これにウン十万円の大金を出すのは、とりあえず叩ければいいレベルの素人には分不相応と思い、電子ドラムの購入は見送ったのだった。

続きを読む

WSL2+Ubuntu 20.04の時刻ズレ解消方法

よく見かける手段。
WSL上で下記コマンドを実行。

sudo hwclock --hctosys

これでも直らない場合。UTCになっているときなど。
PowerShellを管理者モードで起動してから以下のコマンドを実行してWSLを再起動。

wsl --shutdown

EdgeやChromeで発生するERR_NAME_NOT_RESOLVEDエラー

普段Edgeを利用しているが、ある日を境にERR_NAME_NOT_RESOLVEDが頻回している。Firefoxでは発生していないため、Edge(やChrome)の問題だ。

解決方法を調べている中でドンピシャの解決方法だったのが、下記質問スレッドに対する回答だ。

support.google.com

以下の回答。

Chrome だけという場合

Chrome の設定 → プライバシーとセキュリティ → セキュリティ
でセキュア DNS を使用するにチェックが入っていないかご確認いただけますでしょうか。

https://support.google.com/chrome/thread/189786058?hl=ja&msgid=189987378

これを参考に edge://settings/privacy にある「セキュアDNSを使用して~」で「サービスプロバイダを選択する」を選択し、Googleを選択。

無事にエラーが発生しなくなった。

起動に失敗するDocker Desktop for Windows。

ChocolateyでインストールしたDocker Desktopをアップデートすると、たまに発生するDocker Desktopの起動失敗。今回は4.15.0にアップデートしたら発生した。

まずはログを確認。

Start-Process $env:LOCALAPPDATA\Docker\log.txt

起動に失敗した付近の時刻に、以下のエラーを発見。

Wsl/Service/WSL_E_DISTRO_NOT_FOUND

Googleで検索してみたら解決したというIssueを見つける。

github.com

これによると、

wsl --unregister docker-desktop

を実行すると良いそうだ。

自分でも試してみたら無事にDocker Desktopが起動するようになった。

TWAINの処理シーケンス。

TWAINを使ってスキャナを操作するWPFアプリを作っていて、情報源の少なさにかなり苦労した。1週間ほど格闘した中でわかったのは、TWAINはStateによって実行できるコマンドが変わることだ。ここかなり重要だった。

twain.org

ここから参照できる仕様書(PDF)でしっかりとそのあたりに触れている。切羽詰まっていてちゃんと読んでいなかった・・・反省。

Stateについて触れているのは

  • The State-Based Protocol
  • Controlling a TWAIN Session from Your Application
  • Best Practices for TWAIN Compliant Applications

あたりだろうか。Stateで実行できるコマンドが変わるため、本来実行すべき箇所でコマンド実行せずに見当違いな箇所で実行してしまい、思ったような結果が得られずにネットで検索を行うも解決せず、トライアンドエラーを繰り返して遠回りし泥沼にハマるパターンが多かった。

ざっと流れを説明すると、以下のように状態が変わる。

  1. Data Source Managerを開く(Stateは2 -> 3)
    • Data Group: DG_CONTROL
    • Data Argument Type: DAT_PARENT
    • Message ID: MSG_OPENDSM
  2. バイスを選択する(Stateは3)
    1. Source Managerを使ってダイアログから選択できる
      • Data Group: DG_CONTROL
      • Data Argument Type: DAT_IDENTITY
      • Message ID: MSG_USERSELECT
    2.  またはSource Managerを使って全件取得し、利用したいものを探す
      • Data Group: DG_CONTROL
      • Data Argument Type: DAT_IDENTITY
      • Message ID: MSG_GETFIRST&MSG_GETNEXT
  3. Data Sourceを開く(Stateは3 -> 4)
    • Data Group: DG_CONTROL
    • Data Argument Type: DAT_IDENTITY
    • Message ID: MSG_OPENDS
  4. バイスの機能設定を行う(Stateは4)
    • Operation TripletsでValid States=4を利用できる
  5. Data Sourceを有効にする(Stateは4 -> 5)
    • バイスが提供する設定ダイアログを開くことができるし、開かずそのまま進めることもできる
      • Data Group: DG_CONTROL
      • Data Argument Type: DAT_USERINTERFACE
      • Message ID: MSG_ENABLEDS
  6. バイスから転送を始める(Stateは6 -> 7)
    • Data Group: DG_CONTROL
    • Data Argument Type: DAT_IMAGExxxxXFER
      • MSG_IMAGENATIVEXFER
      • MSG_IMAGEFILEXFER
      • MSG_IMAGEMEMFILEXFER
      • MSG_IMAGEMEMXFER
    • Message ID: MSG_GET
  7. 保留中の転送を確認する(Stateは7 -> 6)
    • Data Group: DG_CONTROL
    • Data Argument Type: DAT_PENDINGXFERS
    • Message ID: MSG_ENDXFER

Stateの状態を把握しておけば、下記のサンプルコードを使って思い通りの処理を作れるだろう*1。いつかTWAINを使った実装に関して、ケースバイケースで解説したい。

www.codeproject.com

その他、公式ドキュメントにはたくさんの実装する上で欠かせない情報が掲載されている。

  • 実装のチュートリアルは4章「Advanced Application Implementation」
  • エントリーポイント定義は6章「Entry Points and Triplet Components」
  • エントリーポイントを使ってコマンドを実行するときのパラメーター組み合わせは7章「Operation Triplets」

定数定義やデバイス機能設定(Capability)に関しても他の章で扱っている。とにかく困ったら一読することをおすすめする。

*1:WPFで使うならウインドウプロシージャでTWAIN機器からのメッセージを受け取る処理が必要