〜2003年5月下旬〜
キーボードのレイアウトも変更できるし、設定は簡単だし、よさそうだ。
更新。
今月で切れる。さてどうしようかな。
表示されるフォントが1.1beta1と比べるとちょっと変わったようだ。 でも1.1beta1からはフォントの設定をいじらなくても日本語を扱えるから楽だよね。 Export as PDFがかなり役立っている。 メニュー等の表示が英語になってしまうのが気にならなければ十分このままで使える。
自分の好みはUS配列で、ESCは1の左、ControlはAの左、`はReturnの左。 つまりNEWSやAXのキー配列だ。
自分の思い通りに設定するには 窓使いの憂鬱を使うのが柔軟性もあっていいのだが、実は先日のトラブルの際、 C:\Program Filesのバックアップは取っていなかったため、 あれこれ設定した内容が失われてしまった。 全部~/.mayuに書いとけばねえと今さら言っても遅い。 また設定しなおしてもいいんだけど、 別の方法を探ってみよう。
Windows 2000でUS配列を実現するには簡単で、 コントロールパネル-キーボード-入力ロケールで追加(D)ボタンを押して、 入力ロケール(I)で英語(US)を選べばいい。 これで入力ロケールのホットキーが左Alt+Shiftになるので、 ホットキーでトグルになる。 ただし、US配列になるのは英語(US)に切り替えたときだけなので、 日本語入力時にはまた戻ってしまう。これではいまいち使えない。 プロパティ(P)のキーボード レイアウト/入力システム(K)で米国を選ぶと、 今度はIMEを起動できない。これはXKeymacsでC-oとかに割り当ててもだめ。
「キー」「配列」「変更」「windows 2000」でぐぐってみると、 面白い記述が見つかった。日本語106/109USB接続のキーボードがなぜか101配列 で動作してしまうという不具合だ。 これは101配列と同じPnP IDの106配列のキーボードが接続された場合に、 101キーボードと認識されてしまうため。対処としてはレジストリで
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters] "LayerDriver JPN"="kbd101.dll"
のkdb101.dllをkbd106.kbdに変更せよとあった。なるほど。 つまりおいらの場合はこの逆をすればいいわけだ。書き換えてリブート。okだ。 US配列に関してはこれで解決。
昨日の続き。あとはESC、Contrl、`の個別対応だけど、これは XKeymacsのキーボードレイアウトで変更する。 上のキーボードから下のキーボードへDnDするだけなので簡単。 実際は
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout] "Scancode Map"
を書き換えることになるので、administrator権限が必要。 つまりXKeymacsじゃなくても直接regeditでいじってもいい。 そのあたりの情報もぐぐるといっぱい出てくる。
ついでにXkeymacsのカスタマイズを使いAcrobat Readerでスペースバーがscroll-upになるように割り当てた。 それにしてもAcrobat Readerってなぜスペースバーが遊んでるんだろう? もったいない。
ついでのついでに、j, k, g, G, /も割り当ててlessのようにしてみる。 おぉ、いいじゃん。
PDFに変換すると[や]などの記号が90度右へ回転してしまう。うーむ。
会社ではAXキーボードを10年ほど使っているけど、 Windows 2000になってから選択枝にAXキーボードがなくなってしまった。 一昨日の件で、いろいろ見てたらkbdax2.dllを発見。 プロパティでバージョン情報を見てみると
JP Japanese Keyboard Layout for AX2
とあった。試すとちゃんと使える。いままでは 窓使いの憂鬱でいろいろいじっていただけにこれで楽になったね。 ついでに会社も XKeymacsに乗り換え。
変更したレジストリの内容を残しておこう。
REGEDIT4 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout] "Scancode Map"=hex:00,00,00,00,00,00,00,00,07,00,00,00,38,00,1d,00,\ 01,00,29,00,29,00,2b,00,1d,00,3a,00,2b,00,73,00,2b,00,7d,00,00,00,00,00
インド人からお便りをもらう。とにかく MinGWと MSYSでやりたいんだよろしくってことらしい。
I want to compile ruby on mingw by myself, with no DLL's etc, ONLY one monolithic executable of ruby. Is it possible to do so?
1.6なら特に何も考えずにconfigureすればいいし、 1.8なら--disable-sharedつきで。 あとはREADMEに書いてある通りext/Setupを編集して、 最初の行の#option nodynamicと望みの拡張ライブラリのコメントを外せばいい。
でもbisonがないからCVSからRubyのソースを取ってきた場合は注意。
と思ったら、1.8では-DRUBY_EXPORTをつけないと拡張ライブラリをスタティックにリンクできない。 今までと逆になるから、CCDLFLAGSってわけにはいかないし、ちょっと困ったな。
最新のMinGWで環境でこける 件を調べた。-D__USE_CRTIMP -Eした結果から、 __attribute__((dllimport))を二分法で削除していったら、win32/win32.cの
EXTERN_C _CRTIMP ioinfo * __pioinfo[];
が原因であることがわかった。_CRTIMPが定義されてなければ
#if !defined _CRTIMP #define _CRTIMP __declspec(dllimport) #endif
なのでいいんだが、今回のMinGW側の変更で/usr/include/mingw/_mingw.hが
# ifndef _CRTIMP # ifdef __USE_CRTIMP # define _CRTIMP __attribute__((dllimport)) # else # define _CRTIMP # endif
となったため、-D__USE_CRTIMPをつけないと
# define _CRTIMP
が生き残る。最終的には
extern ioinfo * __pioinfo[];
という宣言でmsvcrt.dllにあるこの変数をアクセスしてしまうので落ちてしまうわけだ。 MinGWではlibc相当を静的にリンクするという選択枝はない以上、 必ずdllimportにならないと困るわけで
#if !defined _CRTIMP || defined __MINGW32__ #undef _CRTIMP #define _CRTIMP __declspec(dllimport) #endif
とすればよさそう。これで-D__USE_CRTIMPは削除できる。
1.6と1.8のpipe_exec()に違いがないなどと書いているが、 1.6にはpipe_exec()などない。おれは何と比較したんだ?
更新。
会社のLinux BoxはまだPlamo 2だった。 locate -i(--ignore-case)が使いたくてインストール。
% CFLAGS=-Os ./configure \ --prefix=/usr --disable-nls --localstatedir=/var/locate
なんでgcc 3.xで-fnative-structが実装されないんだと思ったら、 -mms-bitfieldsという名前になったらしい。
`-mms-bitfields' If set, RECORD_TYPE bit-fields are laid out following the rules of Microsoft Visual C/C++, namely: (i) a bit-field won't share the same storage unit with the previous bit-field if their underlying types have different sizes, and the bit-field will be aligned to the highest alignment of the underlying types of itself and of the previous bit-field; (ii) a zero-sized bit-field will affect the alignment of the whole enclosing structure, even if it is unnamed; except that (iii) a zero-sized bit-field will be disregarded unless it follows another bit-field of non-zero size. Currently, this option is supported on `cygwin' and `mingw32'.
auto importを使えばdllimportする必要もないので、
#define RUBY_EXTERN extern
となるようにdefines.hを変更して実験してみる。
% ./ruby -r./ext/Win32API/Win32API -e0 ./ext/Win32API/Win32API.so: wrong argument type Fixnum (expected Class) (TypeError)
rb_cObjectがちゃんと伝わっていない。 ってことはauto importがうまく機能してないな。 というよりauto importをちゃんと調べよう。 ライブラリの作り方に秘密があるに違いない。
1.6だとrb_class_new()にCheck_Type(super, T_CLASS);がないので、 そのまま落ちているパターンだ。