DEZZ.net

2008/5/19 月曜日

キーボードと配列

カテゴリー: 日記 — nano @ 1:36:28

好きなキーボードで、好きな配列で使え

が、私なりの結論だ。

この土日、少し時間が自由に使えたので、キーボードの配列やら、指の使い方やらを考えてみた。

事の発端は、
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

2008/5/13 火曜日

setter/getter

カテゴリー: C++ — nano @ 2:02:15

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定義しとけ

Powered by WordPress