2012年11月21日水曜日

macbook vmware windows keyboard setting 備忘録

 macbook で VMWare fusion 5 を使って、ウィンドウズ環境構築してますが、素のままだと、キーボードの挙動が???となってストレスが溜まります。探せば回避方法の情報は載ってるんですが、ミニマルなセットが無いのと、探すのに意外と時間を食われるので、備忘録として書いとく事にしました。

 どう考えても、ウィンドウズでは command キーと option キーは入れ替えた方がいいので、レジストリを設定してキーを入れ替える事にします。

以下の部分を、keymap.reg とかいうファイルに保存してダブルクリックすると、レジストリが設定されます。
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,03,00,00,00,38,00,5b,e0,5b,e0,38,00,\
  00,00,00,00

VMWare Fusion のキーボード設定では、まあ、ウィンドウズで使う場合のマックのショートカットはパスしておきたいところ
   
次に、Command キーは入れ替えたので、キーマッピングは無効にしておきたい所。
 
そんで持って、Control キーを押しながら複数選択すると、マウスの右ボタンが押された状態になって、個別複数選択ができないので、これも無効にします。
 
Fusion ショートカットは、お好みで… Command 系は違うキーにアサインした方がいいかもしれません。

ウィンドウズの場合、ファンクションキーをよく使うので、マックのキーボード設定にてファンクションキーを有効にすると…。



2012年11月20日火曜日

ATL-ISAPI の受難

 いやー、出るわ出るわ、どんどん風化しますわ。 まじ、ウィンドウズ上で、ATLとかWTLとかWCFとかWPFとか、もう使いたくないわwww。 ATLISAPI を利用した Soapサービスを C++ でゴリゴリ書いたんですが、捨てられる捨てられる。その捨てられっぷりが見事で、IIS7になったら、まともに動作しないwww。  デバッグしようと思っても、プロセスが開始されず、アタッチもされないし、プロセス、即終了するしwww。 どないせぇちゅうねん。たまたま、Soap じゃない ISAPI.dll も作ってて、そっちは動いてたんで、同じ名前のアプリケーション・プールでそっちを動かしてプロセス・アタッチする事で、手がかりは掴めました。  原因は、ここに書いてあるような事で、とにかく、おかしい。リソース・リークしてるかもしれんけど、デバッグできんので、下のように修正してデバッグを続ける事に・・・。
  ~CRevertThreadToken() throw()
  {
    // should have been Restore()'d by now.
#ifdef _DEBUG
  // *****BUG****
  // if(m_hThreadToken != INVALID_HANDLE_VALUE) DebugBreak();
#endif
}
 おかしい、トレースしている範囲では、特におかしそうな所は無さそう…だけど、ハンドラが全く呼ばれない!でも、当たりを付けて探ったら、見つけました。Code Plex の方に情報が! あー、思い当たる節あるわ…つい先日、リソースハンドルがNULLで(#^ω^)ってなってたのと、同じや。 とりあえず、疲れた。

2012年11月12日月曜日

gdal patch 結末

 前回投下したパッチですが、-optfile というオプション自体をテキストファイルで受け渡すオプション(ややこしい)が追加されており、これを利用すると、UTF-8の文字コードでオプションを渡しても文字化けが起きないので、パッチは不要という事になりました。  この方法は確かにスマートで、自分も base64 でオプションを指定するオプションとか、似たような事を考えてました。UTF-8でオプションが使える事の利点は、QGISなどの既にマルチ言語で動作しているアプリケーションから、複数の言語をチャンポンにして扱える事が挙げられます。  チケットでのディスカッションは、こちら。なかなか話が通じなくて、困りました。多分、どちらも、そう思っていた事でしょう。  ま、自分の投下したパッチも、まるっきり無駄では無くて、コンソール画面にエラーを出力する場合には利用できると思います。ただ、クリティカルでは無いので、取り込まなくても支障は無いでしょう。とりあえず、何のためにあるねん chcp 65001 アホけ?という辺りで締めたいと思います。

2012年11月2日金曜日

GDAL patch 投下

 とりあえず、QGisのコミュニティのCavaliniさんに、パッチを渡してみましたが、QGis の問題というよりもGDALの問題なんで、GDAL-developer ML に投下した方が良いのかも?  ただ前回、短いpatchだからOKかも?と思ってGDAL-dev MLにパッチ投稿したら、MLへのpatch投下は、やっぱり遠慮して欲しいと言われたので、説明をした上で、どなたかにパッチを送るという手順になりそう。 アカウントは登録されているはずなんだけど、OSGeo の track にログインできないので、track に直接投下できなくて、困ってるのだ…。 パッチは、version 'gdal-2.0dev' https://svn.osgeo.org/gdal/trunk/gdal のもので、新しくコマンドライン引数を管理するクラスが生成されていたので、ちょこっと直すだけで、コマンドライン型アプリ全部に適用されそうです。
*** ogr/ogrutils.cpp Fri Nov  2 10:47:34 2012
--- ../gdal_new/ogr/ogrutils.cpp Fri Nov  2 12:28:33 2012
***************
*** 754,760 ****
  /* -------------------------------------------------------------------- */
          else
          {
!             papszReturn = CSLAddString( papszReturn, papszArgv[iArg] );
          }
      }
  
--- 754,762 ----
  /* -------------------------------------------------------------------- */
          else
          {
!             char* pszTmp = CPLRecodeCommandInput( papszArgv[iArg] );
!             papszReturn = CSLAddString( papszReturn, pszTmp );
!             CPLFree(pszTmp);
          }
      }
  
*** port/cpl_string.h Fri Nov  2 10:47:29 2012
--- ../gdal_new/port/cpl_string.h Fri Nov  2 12:29:27 2012
***************
*** 177,182 ****
--- 177,184 ----
                                     const char *pszDstEncoding ) CPL_WARN_UNUSED_RESULT;
  int CPL_DLL CPLIsUTF8(const char* pabyData, int nLen);
  char CPL_DLL *CPLForceToASCII(const char* pabyData, int nLen, char chReplacementChar) CPL_WARN_UNUSED_RESULT;
+ char CPL_DLL *CPLRecodeCommandInput( const char* pszSource ) CPL_WARN_UNUSED_RESULT;
+ char CPL_DLL *CPLRecodeCommandOutput( const char* pszSource ) CPL_WARN_UNUSED_RESULT;
  
  CPL_C_END
  
*** port/cpl_recode.cpp Fri Nov  2 10:47:30 2012
--- ../gdal_new/port/cpl_recode.cpp Fri Nov  2 12:16:08 2012
***************
*** 324,329 ****
--- 324,372 ----
          return -1;
  }
  
+ 
+ /************************************************************************/
+ /*                    CPLRecodeCommandInput()                           */
+ /************************************************************************/
+ /**
+  * Convert a string from a platform encoding to UTF-8, effects only windows platform.
+  *
+  * There is a I/O problem in windows command line character arguments.
+  * Unfortunately, Run batch file written in UTF-8 fails some case.
+  *
+  * @return a NULL terminated string which should be freed with CPLFree().
+  */
+ 
+ char CPL_DLL *CPLRecodeCommandInput( const char* pszSource )
+ 
+ {
+ #ifdef _WIN32
+   return CPLRecode( pszSource, "CP0", CPL_ENC_UTF8 );
+ #else
+   return CPLStrdup(pszSource);
+ #endif
+ }
+ 
+ /************************************************************************/
+ /*                    CPLRecodeCommandOutput()                          */
+ /************************************************************************/
+ /**
+  * Convert a string from UTF-8 to a platform encoding, effects only windows platform.
+  *
+  * There is a I/O problem in windows command line character arguments.
+  *
+  * @return a NULL terminated string which should be freed with CPLFree().
+  */
+ char CPL_DLL *CPLRecodeCommandOutput( const char* pszSource )
+ 
+ {
+ #ifdef _WIN32
+   return CPLRecode( pszSource, CPL_ENC_UTF8, "CP0" );
+ #else
+   return CPLStrdup(pszSource);
+ #endif
+ }
+ 
  /************************************************************************/
  /*                    CPLClearRecodeWarningFlags()                      */
  /************************************************************************/
*** port/cpl_recode_stub.cpp Fri Nov  2 10:47:29 2012
--- ../gdal_new/port/cpl_recode_stub.cpp Fri Nov  2 11:43:30 2012
***************
*** 166,172 ****
          && strcmp(pszDstEncoding,CPL_ENC_UTF8) == 0 )
      {
          int nCode = atoi( pszSrcEncoding + 2 );
!         if( nCode > 0 ) {
             return CPLWin32Recode( pszSource, nCode, CP_UTF8 );
          }
      }
--- 166,172 ----
          && strcmp(pszDstEncoding,CPL_ENC_UTF8) == 0 )
      {
          int nCode = atoi( pszSrcEncoding + 2 );
!         if( nCode >= 0 ) {
             return CPLWin32Recode( pszSource, nCode, CP_UTF8 );
          }
      }
***************
*** 178,184 ****
          && strncmp(pszDstEncoding,"CP",2) == 0 )
      {
           int nCode = atoi( pszDstEncoding + 2 );
!          if( nCode > 0 ) {
               return CPLWin32Recode( pszSource, CP_UTF8, nCode );
           }
      }
--- 178,184 ----
          && strncmp(pszDstEncoding,"CP",2) == 0 )
      {
           int nCode = atoi( pszDstEncoding + 2 );
!          if( nCode >= 0 ) {
               return CPLWin32Recode( pszSource, CP_UTF8, nCode );
           }
      }
 
2012/11/05 追記:やっぱ、GDAL-dev ML に投下しました。

Windows CMD args character conversion problem.

 ウィンドウズ環境におけるコマンドプロンプトの問題を説明するために、簡単なプログラムを書いてみました。ここが理解できないと、パッチが受け入れられないだろうとおもったので・・・
//
// 'Command Prompt Argument' check program
//
//  To compile, type below
//
//  cl /EHa /GR /MD chkarg.cpp
//

#include <iostream>
#include <iomanip>


void showHex(const char* str) {
  for( const unsigned char* p = reinterpret_cast<const unsigned char*>(str); *p != 0; ++p ) {
     std::cout << std::hex << "0x" << (int)*p << " ";
  }
  std::cout << std::endl;
}


int main(int argc, char* argv[]) {
  if( argc <= 1 ) return 1;

  showHex(argv[1]);

  return 0;
}
これを実行するバッチファイルは、こんなんです。
@echo off
echo Bad case UTF-8 arg command check
echo This text file was written in UTF-8 with Kanji.
echo result must be 
echo 0xe5 0x85 0x88
echo ===> run chkarg.
chkarg 先
 実行結果は
Bad case UTF-8 arg command check
This text file was written in UTF-8 with Kanji.
result must be
0xe5 0x85 0x88
0xe5 0x85 0x81 0x45
となります。chcp 65001 を行なっても状況に変わりはありません。