Andaseatの最高峰モデル「Kaiser3」の感想

www.andaseatjapan.com

人生初のゲーミングチェア。デスクワーク主体のため、いつかは良い椅子を買おうと考えていた。そしていろいろ悩んだ末にKaiser3を購入した。

まずは結論から

腰痛い。全然体に合わない。

それでいて10万円近く支払っているんだから困った。

「高いから良い」というものではないということを身をもって体験した。

中古のオフィスチェアで十分だと思った。

続きを読む

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機器からのメッセージを受け取る処理が必要

BackgroundWorkerでBitmapSourceを扱うときの注意点。

このオブジェクトは別のスレッドに所有されているため、呼び出しスレッドはこのオブジェクトにアクセスできません。

BackgroundWorker.RunWorkerAsyncの引数にList<BitmapSource>型のリストを渡して、BackgroundWorker.OnDoWorkなどでBitmapSourceを取り出して処理を行う場合、単純に作成したBitmapSourceオブジェクトだと上記のエラーが発生する。

解決策としては、リストに入れる前にBitmapSource.Freezeメソッドを実行する。これでオブジェクトを別スレッドで共有できるようになる。

情報源は以下のスレッド。

stackoverflow.com

ThinkPad X1 Carbon(Gen 9) 購入。

Inspiron 13 7300を購入してからまだ1年半も経過していないが、不満点が多く、作業中にイライラすることが多いので買い替えた。

イライラポイント

洗い出したらいろいろ不満点が多かったので、上位5つに絞った。

第1位:タッチパッド操作が固まる

いちばんイライラしていたところ。不満点の絶対王者

続きを読む

LaravelでManyToMany(多対多リレーション)するときの注意点。

Laravel 8.xの話*1

readouble.com

上記ページのテーブル構造を例にとると、users.idとroles.idそれぞれをUUIDなどのinteger以外の主キーにすると、中間テーブルにデータを登録するときに片方のidが0になる現象が発生する。

*1:他のバージョンでも同様と思う

続きを読む