好きなキーボードで、好きな配列で使え
が、私なりの結論だ。
この土日、少し時間が自由に使えたので、キーボードの配列やら、指の使い方やらを考えてみた。
事の発端は、
JIS配列キーボードはまともに使えるのか?
という事を考え始めてから。
実は、ここ数週間は他人の環境での作業など、汎用性を考えて、HHKを使わずに、JIS配列のキーボードを使って仕事をしていたのだが、どうにも右手小指が担当しているあたりのキーに違和感を感じていた。
具体的に言えば
・’「’ や ‘」’ などのちょっと遠い記号
・Enterキー、Backspaceキーの常用キー
が、どうにも押しづらいと感じるのだ。
HHKとJIS配列のフルキーボード程度の差であれば、2週間程度で配列そのものには慣れることが出来る。その結果、違和感として残ったのが上記の点だ。
そもそも、私はJIS配列キーボードに触れて育った世代なので、元々US配列は知らなかったのだが、それでも上記の点についてはかなり長い間悩まされていたように思う。
私のように運動神経が悪くてサッカーが苦手な人なら理解してもらえると思うが、あの「うまくボールが蹴れない感覚」だ。
それでは、その「違和感」の原因は一体なんなのか?
答えは簡単。
JIS配列のEnterキーやBackspaceキーは、物理的にホームポジションから遠すぎるのだ。
物理的に遠いキーを、5本の指の中で最も細かい動作をさせることが困難な小指を使って、正確に押下しなければならないのである。
私が知る限り、ほとんどの人はこれが出来ない。
そこで、私はこれを右手の位置をずらすことで対応しようと考えた。実際に、そうやって解決している人もいるにはいるようだ。
だが、これはこれで、人差し指の負荷増大という問題を引き起こしてしまい、結果として、諦めることになった。
(これは、QWERTY配列の上段に、「UIO」が連続して並んでしまっていることが原因のように思う。)
ここまで来て、US配列をJIS配列比べてみると、やはりキー1つ分、右手に近い。
これが正しい形なのだと感じた。少なくとも現在のQWERTY配列においては。
そう気づいてから、一気に汎用性などどうでも良くなってしまい、今すぐJIS配列から離れたいと思うようになってしまった。
——————-
なんてね。
まともなブロガー風に書いてみたけど、やっぱり俺の文章力じゃ無理ですw
結局のところ、HHKマンセーってことです。
JIS配列はやっぱりクソ過ぎないか?
どう考えてもBackspaceキー遠すぎるよw
Javaでは、オブジェクトが持つプロパティ(XXX)にアクセスする手段として、setter(setXXX), getter(getXXX)メソッドを定義するのが一般的。
プロパティが変更された際の振る舞いを設定することが出来るようになるから。
しかしこのsetter/getterは、ずーっと、メソッド呼び出しのオーバーヘッドがあるもんだと思ってました。
さっき知ったんですが、こいつらは最適化の対象になるため、そんなにオーバーヘッドはあるもんじゃないらしいです。
そりゃもちろん、振る舞いが定義されてればそれが実行されるというオーバーヘッドはありますが。
そこで、C++ではどうなんだろう?と思い、ちょっとやってみました。
class SetterGetter {
private:
int n;
public:
int getN() {
return n;
}
void setN(int value) {
this->n = value;
}
};
class NoSetterGetter {
public:
virtual ~NoSetterGetter() {}
int n;
};
int _tmain(int argc, _TCHAR* argv[])
{
SetterGetter *a = new SetterGetter();
NoSetterGetter *b = new NoSetterGetter();
a->setN(10);
b->n = 11;
printf("%d\n", a->getN());
printf("%d\n", b->n);
delete a;
delete b;
return 0;
}
これを最適化して、アセンブラで見ると↓こんな感じ。
int _tmain(int argc, _TCHAR* argv[])
{
004010C0 53 push ebx
004010C1 56 push esi
004010C2 57 push edi
SetterGetter *a = new SetterGetter();
004010C3 6A 04 push 4
004010C5 E8 42 01 00 00 call operator new (40120Ch)
004010CA 83 C4 04 add esp,4
004010CD 85 C0 test eax,eax
004010CF 74 0A je wmain+1Bh (4010DBh)
004010D1 C7 00 00 00 00 00 mov dword ptr [eax],0
004010D7 8B F8 mov edi,eax
004010D9 EB 02 jmp wmain+1Dh (4010DDh)
004010DB 33 FF xor edi,edi
NoSetterGetter *b = new NoSetterGetter();
004010DD 6A 08 push 8
004010DF E8 28 01 00 00 call operator new (40120Ch)
004010E4 83 C4 04 add esp,4
004010E7 85 C0 test eax,eax
004010E9 74 0A je wmain+35h (4010F5h)
004010EB C7 00 0C 48 40 00 mov dword ptr [eax],offset NoSetterGetter::`vftable' (40480Ch)
004010F1 8B F0 mov esi,eax
004010F3 EB 02 jmp wmain+37h (4010F7h)
004010F5 33 F6 xor esi,esi
a->setN(10);
b->n = 11;
printf("%d\n", a->getN());
004010F7 8B 1D 48 72 40 00 mov ebx,dword ptr [__imp__printf (407248h)]
004010FD C7 07 0A 00 00 00 mov dword ptr [edi],0Ah
00401103 C7 46 04 0B 00 00 00 mov dword ptr [esi+4],0Bh
0040110A 8B 07 mov eax,dword ptr [edi]
0040110C 50 push eax
0040110D 68 FC 47 40 00 push offset std::_Iosb::end+4 (4047FCh)
00401112 FF D3 call ebx
printf("%d\n", b->n);
00401114 8B 4E 04 mov ecx,dword ptr [esi+4]
00401117 51 push ecx
00401118 68 00 48 40 00 push offset std::_Iosb::end+8 (404800h)
0040111D FF D3 call ebx
ばっちり最適化されてますね。
結論:暇ならsetter/getter定義しとけ