PCの最近のブログ記事

RealTimeIsUniversalとVMWare

| コメント(0) | トラックバック(0)
ある程度知られている話のようですが、備忘録として。

Boot Camp環境に有用なRealTimeIsUniversal設定ですが、VMWare仮想PCはデフォルトでローカル時間を使うため、また9時間ずれが発生します。

これをUTCにするには、vmxファイルに下記の記述を追加します。セクションはないので、最下行にでも入れておけば良いでしょう。

rtc.diffFromUTC = "0"

Boot Campのvmxファイルはユーザーのライブラリの中にあります。

/Users/(アカウント名)/Library/Application Support/VMware Fusion/Virtual Machines/Boot Camp/(HDDのUNIXデバイス名)/Boot Camp partition.vmwarevm/Boot Camp Partition.vmx

VC++2010のsln

| コメント(0) | トラックバック(0)
仕事でもらったVisual C++ 2010 ExpressのslnファイルをダブルクリックしてもVisual Studio 2010 Professionalから開けないので試行錯誤したところ、UTF-8のBOMがないと受け付けられないとわかりました。

Version Selectorは共通でしょうから、ExpressだからといってBOMがないとは思えないので、何かの手違いでしょうが。

Vistaの言語パック

| コメント(0) | トラックバック(0)
Vista Ultimateに臨時で入れた言語パックをアンインストールしようとして、大量の時間を空費しました。

削除時に複数を選択できるように見えるのですが、最初の一つ以外は失敗しました。これが世間に言う「一つずつしか削除できない」ということのようです。

入れる時は複数同時に入るのに、効率が悪いことこの上ありません。しかも再起動しないと続行できず、またバッチ処理もできません。ただでさえ切り替えだけでも時間がかかるのに。

Vista/7の言語切り替えは、実際には非Unicode部の切り替えも必要になることが多く、再起動が必須になります。そしてVistaの再起動は遅いノートでは5~10分かかります。

人件費...外注の場合で1人月100万でしたか。全部合算すれば自社社員でもそれぐらいでしょうが、再起動1回で¥1000が飛ぶわけです。もちろん他の作業を別のPCでするといった運用面でのカバーはしますが、本質的に効率が悪いことに変わりはありません。

Mac OS Xの言語切り替えはログアウトだけででき、大変ありがたいのですが、Windowsはこの部分に関してはXPから進化していないのです。

言語パックの削除に関しては、全部入れたままにできればよいのですが、残念ながらHDDに余裕がありません。容量があっても切り替えでの再起動は問題なので、仕事が軽い時期に7200rpmのものにでも交換したいところです。

BootCamp環境で双方を移行する方法は、ディスクユーティリティとWinCloneの組み合わせが良さそうなので、折を見て挑戦してみます。

タブキーで確定同時タブ入力

| コメント(0) | トラックバック(0)
DFJ2を真似したキー設定で使い続けること14年、流れ流れてATOK。

DFJ2/WINがどうだったかは記憶の彼方ですが、VJE-Deltaでは確定前にタブキーを押すと、確定と同時にタブが入力されました。2.0/2.5/4.0共通の仕様だったはずです。

どうなるかというと、Webブラウザのフォームで日本語入力している時に便利なのです。例えば姓を変換してタブを押すと、姓を確定しつつ名の欄に移動する具合になります。

しかしATOK2008では、どう設定してもこれは実現できないようでした。

この場合、とりあえずタブに全文確定を割り当て、確定を検出してVK_TABを発行すれば良いわけです。

Spy++を眺めたところ、確定すると下記のようなメッセージが来ていました。

WM_IME_NOTIFY / IMN_PRIVATE / lParam:0x04
WM_IME_NOTIFY / IMN_PRIVATE / lParam:0x13
WM_IME_ENDCOMPOSITION

IMN_PRIVATEは必ず0x04~0x13の順ですが、変換してから確定するとWM_IME_ENDCOMPOSITIONが二つのIMN_PRIVATEより後(上記のままの順序)、変換前に確定するとWM_IME_ENDCOMPOSITIONが先になります。

Vista/7上のATOK2008とFirefoxの組み合わせではWM_IME_ENDCOMPOSITIONが来ず、また二度目以降の確定の場合は0x13のIMN_PRIVATEも来ませんでした。ということで、0x04のIMN_PRIVATEを処理すれば良いことになります。
XP上でVJE-Delta4.0とFirefoxの組み合わせだとWM_IME_ENDCOMPOSITIONは普通に来るのですが。

DeltaEndにこの仕組みを入れたテスト版で動作を確認できましたが、現在のメイン環境は64ビットです。64ビットEXEとDLLも用意しないと、64ビットアプリにフックが届きませんし、その場合はそれぞれDLLを別名にしなければならないということでした。

# Webブラウザぐらいでしか使わない機能だと割り切る選択肢もあり

32ビットをメインとし、64ビット動作用の子プロセスを呼ぶとして、設定の同期が課題です。まずは32ビットEXE~32ビットDLL間を共有メモリにしてみましょうか。

キーボードフィルタ

| コメント(0) | トラックバック(0)
キーボードフィルタドライバの使い方がわかってきました。いくらでも試して操作不能にできる仮想PC環境のおかげです。

例えば無変換キーを
  • KEYDOWNでKEYUPも発行
  • KEYUPは無視
  • リピート却下
とする場合、後述のようなコードになっています。

ベースのkbfiltrはWDK 6001.18002です。スキャンコード一覧はこちらにあります。その他、ここここここを参考にしまし た。

レイアウトドライバで無変換にVK_KANAを割り当てれば、遜色ないカナキーにすることができるわけです。

ローレベルの制御をドライバで完了できれば、管理者権限のユーティリティが不要になります。一般権限では管理者権限アプリをフックできませんが、カナインジケータ程度の監視ならポーリングのような、より普通の実装にすべきなのでしょう。

VOID
KbFilter_ServiceCallback(
  IN PDEVICE_OBJECT DeviceObject,
  IN PKEYBOARD_INPUT_DATA InputDataStart,
  IN PKEYBOARD_INPUT_DATA InputDataEnd,
  IN OUT PULONG InputDataConsumed
  )
{
  PDEVICE_EXTENSION  devExt;
  KEYBOARD_INPUT_DATA kana[1] = {0};
  PKEYBOARD_INPUT_DATA curInputData = InputDataStart;
  ULONG tempConsumed = 0;
  static int bInKana = 0;

  devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;

  while( curInputData < InputDataEnd )
  {
    switch ( curInputData->MakeCode )
    {
    case 0x7b:
      if ( ( InputDataStart->Flags & KEY_BREAK ) == 0 ) {
        if ( bInKana == 0 ) {
          bInKana = 1;

          kana[0].MakeCode = 0x7b;
          kana[0].Flags = KEY_MAKE;
          tempConsumed = 0;

          (*(PSERVICE_CALLBACK_ROUTINE) devExt->UpperConnectData.ClassService)(
            devExt->UpperConnectData.ClassDeviceObject,
            &kana[0],
            &kana[1],
            &tempConsumed);

          kana[0].Flags = KEY_BREAK;
          tempConsumed = 0;

          (*(PSERVICE_CALLBACK_ROUTINE) devExt->UpperConnectData.ClassService)(
            devExt->UpperConnectData.ClassDeviceObject,
            &kana[0],
            &kana[1],
            &tempConsumed );
        }
        else {
          curInputData++;
          continue;
        }
      }
      else {
        bInKana = 0;

        curInputData++;
        continue;
      }
      break;
    
    default:
      tempConsumed = 0;
      (*(PSERVICE_CALLBACK_ROUTINE) devExt->UpperConnectData.ClassService)(
        devExt->UpperConnectData.ClassDeviceObject,
        curInputData,
        curInputData + 1,
        &tempConsumed );
    }
    curInputData++;
  }

  *InputDataConsumed = ( InputDataEnd - InputDataStart );
}

デバッグシンボル

| コメント(0) | トラックバック(0)
何となく、ドライバ類からデバッグ用シンボル情報を削除する話をまとめます。

まず、rebaseする方法。Windows 2000 DDKぐらいまではこれ。Free Buildでも入るのでこうしたKBがあります。
[NT DDK] デバイス ドライバからシンボルを削除する方法

Server 2003 SP1 DDKはmakefile.newの修正が必要です。
LINKER_FLAGSにLINKER_DBG_SECTIONを追加している部分をFree Buildの場合に除外します。

LINKER_FLAGS = $(LINKER_FLAGS) $(LINKER_DBG_SECTION) -debugtype:cv $(LINK_OS_VERSIONS)
これを
!if $(FREEBUILD)
LINKER_FLAGS = $(LINKER_FLAGS) $(LINK_OS_VERSIONS)
!else
LINKER_FLAGS = $(LINKER_FLAGS) $(LINKER_DBG_SECTION) -debugtype:cv $(LINK_OS_VERSIONS)
!endif
こう。

WDKもmakefile.new修正ですが少し変わりました。6001.18002と7600.16385.1で共通です。

LINKER_FLAGS = $(LINKER_FLAGS) $(LINKER_DBG_SECTION) $(LINK_OS_VERSIONS)
これを
!if $(FREEBUILD)
LINKER_FLAGS = $(LINKER_FLAGS) $(LINK_OS_VERSIONS)
!else
LINKER_FLAGS = $(LINKER_FLAGS) $(LINKER_DBG_SECTION) $(LINK_OS_VERSIONS)
!endif
こんな感じに。

ただし2003 DDK以降は派手には残らず、pdbファイルへのフルパスが残る程度のものとなっています。ちょうどVisual C++でデフォルト設定のままReleaseビルドした状態に相当ですので、気にしない人には問題ありません。

VK_F

| コメント(0) | トラックバック(0)
時々Windowsのキーボードレイアウトドライバを弄っていますが、VK_F構造体(タグ名_VK_TO_FUNCTION_TABLE)の意味が何となくわかってきました。

# MSDNででも聞けば教えてくれるのでしょうが

NLSFEProcTypeがKBDNLS_TYPE_TOGGLEの場合、NLSFEProcSwitchが8ビットのフラグとしてNLSFEProc[8]の各状態に対応し、その組み合わせでキーが押されると、ビットが立っている状態に関してのみNLSFEProcAltと切り替わるようです。

NLSFEProcCurrentは初期状態をNLSFEProcかNLSFEProcAltのどちらにするか、でしょう。試していませんが2択なので変更する必要性もありません。

WDKのkbd106サンプルの場合、「英数」のNLSFEProcSwitchは2ですから、Shift同時押しでトグル動作です。
このShift同時押しでKBDNLS_SEND_PARAM_VKに従いVK_CAPITALを発行し、同時にNLSFEProcAlt側に切り替わります。次のShift同時押しはNLSFEProcAlt側が参照され、VK_CAPITAL発行と同時にNLSFEProcに戻ってくる、と。
NLSFEProcAltには同時押しのない単体(Base)にもVK_CAPITALが書かれていますが、発行されないことから、Shift同時押しだけが切り替わったものと考えられます。

「ひらがな」はNLSFEProcSwitchが8なのでShift+Ctrl同時押しが対応。VK_KANAと同時にNLSFEProcAltに切り替わり、同様に次にShift+Ctrl同時押しで戻ってきます。

ということに気付いたのは、無変換VK_KANAをKBDNLS_TYPE_TOGGLEで試している途中、NLSFEProcAlt側を全部KBDNLS_NULLのままにしていたら、戻って来られなくなったためですが(汗)。

しかしKBDNLS_TYPE_TOGGLEにしても、少なくともVK_KANAに関して御利益はないようで、相変わらずKEYUPまでON/OFFが変化しません。KEYDOWNで変化するのはCapsLock、NumLock、ScrollLockの特権のようです。

98配列USBキーボードでは、KEYDOWNで切り替えるためのフィルタドライバを別途用意していますが、この部分の書き方についてはまだ理解できていません。

モニタ選考

| コメント(0) | トラックバック(0)
結婚を機に引っ越すことになり、部屋が狭くなるのでPCモニタとテレビを統合する方向で調べています。

選考要素は色々あります。チューナー、解像度、スピーカー音質、光出力、デジタル同士PinP、ノングレアパネル。

まずチューナー。SONY BDZ-T70は居間に接収されると思われますが、Buffalo LH-H91DTVを流用する手があるので、必須ではありません。自室に籠もる時間など少なくなりますから、利便性は大した問題ではないでしょう。

WUXGAのI-O DATA LCD-TV241XBR-2からなので、解像度は少なくともフルHD。

スピーカー音質という点ではI-O DATA LCD-DTV223XBEが気になっています。強いこだわりはありませんが、昨今の液晶スピーカーは耐えられません。もっともONKYO SA-205HDを使えば済む話ではあります。

光出力がないと、せっかくのサラウンドヘッドフォンが宝の持ち腐れです。三菱 VISEOシリーズぐらいしか選択肢はありませんが、これもSA-205HDから出力させる手があります。

デジタル同士PinPは、大きさとして選択肢に入れられる範囲では、三菱RDT232WM-Z、EIZO FX2431(TV)、旧商品のI-O DATA LCD-MF241Xぐらいのようです。FX2431は完全に予算オーバー、LCD-MF241Xも新品だと予算オーバーです。配線が複雑になって構わなければ、子画面用に別途コンポジットを接続しても良いのですし、諦めましょう。

ただしSA-205HDに依存すると、音声切り替えと映像切り替えが分かれてしまうため、PinPはかなり使いにくくなります。

今回の選択肢に入るノングレアはLCD-DTV223XBE、三菱 RDT232WXMDT221WTFMDT243WGIIあたりです。光出力があり高音質なモデルがないのでSA-205HDは必須。となるとスピーカーの置き場所を考えないといけません。下置きの可能性があるとすると、画面の位置が上がるためKDL-19J5の経験に従いTNパネルは外れます。TNは上から見ると白く、下から見ると黒くなるのです。

RDT232WXとMDT243WGII。...MDT243WGII、行ってみましょうかね。

Bluetoothでプリンター

| コメント(0) | トラックバック(0)
プリントサーバーの話で少し書いた、キヤノンのプリンタとBluetoothの話。

実家で余生を送っているMP500にBT-MicroEDR2Xを食べさせて、ThinkPad X61 Tablet (Windows 7 x64)とペアリングしてみました。

「Bluetooth周辺デバイス」にドライバが当たりませんが、特に問題なく使えています。これはMicrosoftのスタックが持たないプロファイルのようで、気になるならばデバイスマネージャーから無効にして差し支えありません。

MP500ドライバのインストールの最後で、接続先の自動認識が走りますが、ここでは検出できないので、キャンセルして終了させることになります。

使用感ですが、写真や画像を印刷するには遅いです。しかし、そこらのWebページ程度なら実用範囲です。
Bluetooth 1.2時代(約0.7Mbps)のBU-20をオプションに設定していたプリンターですし、最近の機種が使えるBluetooth 2.0+EDRでも約2Mbpsですから、速度は期待するだけ無駄でしょう。

¥1500足らずで簡易的な共有ができるので、常用するのでなければ効果は充分と言えます。

VMWare Player 3.0.1のエラー

| コメント(0) | トラックバック(0)
気がついたらVMWare Player 3.0.1で、ホスト共有フォルダからのコピーが「無効なMS-DOSファンクションです。」というエラーを出すようになっていました。ホストXP SP3のゲストVista SP1の組み合わせにて。

VMWare Workstation 7.1 Betaのリリースノートにある既知の問題と同じらしく、VMWare公式の掲示板でも話題になっていました。

Explorer上でのドラッグ&ドロップでのみ起こるようで、リリースノートにもありますが、共有フォルダをZドライブ等に割り当ててxcopyを使えば回避できました。でも不便です。
<<前のページへ 910111213141516171819

アーカイブ

ウェブページ

Powered by Movable Type 5.2.13

ホームページ