この記事は、OpenStream Advent Calendar 2018 の2日目の記事です。昨日は miyatay さんの CognitoxAlexaアカウントリンクが大変だった話 でした。

さて、本当はOCamlの話を書きたいところでしたが、ぶっちゃけネタがなかったので、今年いろいろ進展があったキーボードや日本語入力まわりについて書こうかと思います。

プログラマーとして一番良く触るものは何か?と聞かれた時、大半の方はまず キーボード と答えると思います。もしかしたらマウスのほうが触っている時間が長い、という方もいるかもしれませんが。 一日の大半をともに過ごすキーボードは、PCとのインターフェースでもあります。そんなキーボードについてちゃんと考えることは重要ではないかと思うんです。

道具にこだわるのは2流、とか言う意見

私も割といろいろキーボードを変えたり買ったりしていました。今まで買ったキーボードを古い順に時系列で並べると、こんな感じになりました。

Ergodox EZが×2になっているのは、家用と仕事用に買ったからです。こう見ると結構買ってますね。

最近はあまり聞かなくなりましたが、少し前は、常駐先とかで配られるキーボード以外を使っていると、 なんでキーボードなんかにお金かけるの? と言われるときもありました。これは、道具に拘泥するな、という意味で言っていたと思います。

直近で書いた記事にも書きましたが、最近はつぎのように考えています。

仮にもプロフェッショナルなのであれば、自分が一番良く使う道具にお金をなんでかけないの?と逆に聞きたいです。スポーツでも職人でも、自分が使う道具は、自分の性能を100%発揮できるように調整したり変えたりするはずです。

弘法筆を選ばず かもしれませんが、弘法が自分で選んだ筆を使ったほうがいいものを書ける確率が上がるのは自明でしょう。

自作キーボードが増えてきた

今年は特に、日本での自作キーボード熱が盛り上がった年だと思います(個人の観測範囲では)。その理由としては、よく言われるように次のような要因が上げられると思います。

今年私が作ったIris/Crkbdは、どちらも開発者の方が自分のEnd gameを目指して試行錯誤された結果出来たものです。無論、あくまでその開発者の人にとってのEnd gameを目指したものである以上、万人受けはしません。

ですが、各種設計がオープンソースとなっているので、元のキーボードに触発された個人がまた新しいキーボードを派生させていく様はみていて面白いです。

2018年のキーボードと配列

最近は左右分離+少キー構成がマイブームです。ErgodoxからIris/Crkbdに変えたのも、結局利用しづらいキーが多く、有効利用できなかったというのがあります。

あるキーボードを特徴づけるのは、キーの物理的な配列とキースイッチです。かつ、QMK Firmwareなどを利用しているキーボードでは、キーの論理配列=キーマップの自由度が、市販のキーボードとは比較出来ないほど高いです。 キーマップによっては、元々のキーボードとは全く違うものになる場合すらあります。

元々キーの論理配列と言えば、QWERTY配列を代表として、QWERTY配列から派生したColemak/Workmanや、Dvorak配列など色々ありますが、あくまでアルファベット部分の配列を指していました。それらも、キーボード自体がそういう配列になっているというわけではなく、何らかのツールで実現されていました。

そういった配列変更をキーボード単体で完結させることが出来るようになり、かつ他にも様々な機能を付加することも出来るようになりました。2018年の12月現在、私が利用しているCrkbdの配列はこんな感じになっています。

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [_QWERTY] = LAYOUT_kc( \
  //,-----------------------------------------.                ,-----------------------------------------.
        TAB,     Q,     W,     E,     R,     T,                      Y,     U,     I,     O,     P,  BSPC,\
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
       LCTL,     A,     S,     D,  GUIF,     G,                      H,  GUIJ,     K,     L,  SCLN,  QUOT,\
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
       LSFT,     Z,     X,     C,     V,     B,                      N,     M,  COMM,   DOT,  SLSH,  RSFT,\
  //|------+------+------+------+------+------+------|  |------+------+------+------+------+------+------|
                                 M_EISU,LOWER,SFT_SPC,  SFT_ENT, RAISE,M_KANA\
                              //`--------------------'  `--------------------'
  ),

  [_LOWER] = LAYOUT_kc( \
  //,-----------------------------------------.                ,-----------------------------------------.
        ESC,     1,     2,     3,     4,     5,                      6,     7,     8,     9,     0,   DEL,\
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
      CTLTB,  LCTL,  LSFT,  LALT,  LGUI, XXXXX,                  XXXXX,  RGUI,  RALT,  RSFT,  RCTL,   F11,\
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
       LSFT,    F1,    F2,    F3,    F4,    F5,                     F6,    F7,    F8,    F9,   F10,   F12,\
  //|------+------+------+------+------+------+------|  |------+------+------+------+------+------+------|
                                 M_EISU,LOWER, SFT_SPC,  SFT_ENT, RAISE,M_KANA \
                              //`--------------------'  `--------------------'
  ),

  [_RAISE] = LAYOUT_kc( \
  //,-----------------------------------------.                ,-----------------------------------------.
        ESC,  EXLM,    AT,  HASH,   DLR,  PERC,                   CIRC,  AMPR,  ASTR,  LPRN,  RPRN,  BSPC,\
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
      CTLTB, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,                   MINS,   EQL,  LCBR,  RCBR,  PIPE,   GRV,\
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
       LSFT, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,                   UNDS,  PLUS,  LBRC,  RBRC,  BSLS,  TILD,\
  //|------+------+------+------+------+------+------|  |------+------+------+------+------+------+------|
                                 M_EISU,LOWER,SFT_SPC,  SFT_ENT, RAISE,M_KANA \
                              //`--------------------'  `--------------------'
  ),

  [_NAGINATA] = LAYOUT_kc( \
  //,-----------------------------------------.                ,-----------------------------------------.
        TAB,     Q,     W,     E,     R,     T,                      Y,     U,     I,     O,     P, JA_AT,\
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
       LCTL,     A,     S,     D,     F,     G,                      H,     J,     K,     L,  SCLN,JA_CLN,\
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
       LSFT,     Z,     X,     C,     V,     B,                      N,     M,  COMM,   DOT,  SLSH,  RSFT,\
  //|------+------+------+------+------+------+------|  |------+------+------+------+------+------+------|
                                 M_EISU,LOWER,    NSS,      NSE, RAISE,M_KANA \
                              //`--------------------'  `--------------------'
  ),


  [_ADJUST] = LAYOUT_kc( \
  //,-----------------------------------------.                ,-----------------------------------------.
        RST,     1,     2,     3,     4,     5,                      6,     7,     8,     9,     0,   DEL,\
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
      XXXXX,  LCTL,  LSFT,  LALT,  LGUI, XXXXX,                   LEFT,  DOWN,    UP,  RGHT, XXXXX,   F11,\
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
       LSFT,    F1,    F2,    F3,    F4,    F5,                     F6,    F7,    F8,    F9,   F10,   F12,\
  //|------+------+------+------+------+------+------|  |------+------+------+------+------+------+------|
                                 M_EISU, LOWER,SFT_SPC,  SFT_ENT,RAISE, M_KANA \
                              //`--------------------'  `--------------------'
  )
};

Crkbd/Irisなどで利用されている QMK Firmware では、=layer= という概念を追加することで、物理的に42キーしか無いキーボードでも、

の打ち分け/切り替えを実現しています。こういったカスタマイズを施すことで、更に自分にあったキーボードを探求していけます。

現在利用しているキーマップには、以下のような特徴があります。

2018年の日本語入力

日本に住んでいて、日本語が第一言語である以上、キーボードで日本語を入力することを避けることは出来ません。

私の身の回りでは、基本的に全員がローマ字入力です。しかし、こと日本語入力に於いては、 カナ入力の方が確定的に速いです。

QWERTY配列とローマ字入力では、やたら指と手が跳躍し、単純に疲れやすいです。キーボードをErgodox EZに変えた辺りから、カナ入力に対する試行錯誤もはじめました。 カナ入力方式として、今まで次のような方式を試してきました。

これらの配列は、IMEのマッピングを変更したり、あるツールを導入しないと使えないものだったりします。しかし、QMK Firmwareではこれらの入力方式を キーボード自体に 実装することが出来ます。 そのため、OS/IMEに依らずに、これらの方式を利用していくことが出来ます。

実装はこの辺り

これらの入力に切り替えると、しばらくは泣きたくなるくらいタイピングが遅くなります。ただ、指に対する負担を減らすための投資として捉えています。 ただ、あんまりしょっちゅう切り替えていると、色々問題があるので、そこまで頻繁には行いません。

個人に最適化されたインターフェースへ

現代では、様々なものがpersonalizeされています。大抵は広告ですけど。 PCを利用する上で、キーボードは共通故に価値があるものでもありますが、より長い時間触っている人々にとって最適というわけではありません。

色々と環境が変わり、ツールなども様変わりしている今、キーボードだけ旧態依然となっている理由はないはずです。年末年始のタイミングですし、一度見つめ直してみるのもいいんじゃないでしょうか。