Viterbi Keyboardに変えよう

# 1. 要約

キーボードは，ユーザとコンピュータを繋ぐ重要なインターフェイスのひとつである．近年，スプリットキーボードが，入力体験を改善するキーボードとして注目を集めている．[Viterbi Keyboard (Keebio)](https://keeb.io/collections/split-keyboard-parts/products/viterbi-keyboard-pcbs-5x7-70-split-ortholinear)は，スプリットキーボードの中では，[行, 列] = [5, 7]の大型配列であるため，[Let's Split](https://mehkee.com/products/lets-split-pcb)などの小型スプリットキーボードとは異なり，US斜め配列キーボードと似たキー配置が可能となる．このため，Viterbi Keyboardは，通常のUSキーボードに慣れたプログラマにとって，スプリットキーボードへの移行に最適なキーボードとなり得る．

![DPYWz0pUEAAruiu.jpg-large.jpeg](https://qiita-image-store.s3.amazonaws.com/0/214914/4be038f5-77fc-edd8-85fc-954b3621d6cc.jpeg)

# 2. なぜキーボードを変えるのか

[最初期のデジタルコンピュータが開発されてから](https://ja.wikipedia.org/wiki/計算機の歴史)，コンピュータの処理能力は，[ムーアの法則](https://ja.wikipedia.org/wiki/ムーアの法則)が提唱されるほど急激に上昇している．ハードウェア・ソフトウェア・情報理論が著しく進化した結果，最新のコンピュータは高速に様々な処理を行うことが可能となり，10年前ではずっと時間のかかっていた計算も，今ではEnterキーを押した次の瞬間に結果が画面に出力されるほどである．**コンピュータの処理速度は十分に成熟した一方で，コンピュータを使う人間自身の入力速度や情報を理解する速度は，そこまで上昇していない．**簡単な事務作業では，たとえ市販の安いコンピュータを用いたとしても，計算自体は一瞬で終わる．そのため，**コンピュータを使う人間自身が，作業の律速要因の1つとなっている．**

人間側が抱える律速段階は，主に以下が挙げられる;

1. 情報を異なるアプリケーション間で利用できるように成型する
2. コンピュータ上の必要なファイルや情報を探してアクセスする
3. 出力された情報を正しく理解する
4. 情報を正しく入力する

1.と2.に関しては，ソフトウェアのレベルで，まだまだ工夫の余地が存在する．適切なAPIを用いれば，異なるソフトウェア間での連絡は容易に行うことができる．また，ローカルファイルへのアクセスは命名規則やタグ付けなどで検索速度が改善できる．これ以外にも，検索アルゴリズムの発展により，少ないキーワードからでも必要な情報が得られるようになってきた．今後は，第三次人工知能ブームの流れを受け，高度な作業が可能なAIを搭載したソフトウェアが，情報へのアクセスやアプリケーション間の連絡を助けることも予想できる．一方で3.に関しては，もちろんソフトウェア側で分かり易い図や文章を提供することで効率は上がるだろうが，個人の訓練に勝る理解力の強化法はなかなか思いつかない．この律速段階を改善する手法に関しては，何らかの技術革新が待たれる．

**本稿で注目するキーボードは，4.の項目について，人間の律速段階を改善する．**情報の正しい入力に関しては，ソフトウェア側からも様々な努力がなされてきた([Vim](https://ja.wikipedia.org/wiki/Vim)や[Emacs](https://ja.wikipedia.org/wiki/Emacs)に始まる[エディタ戦争](https://ja.wikipedia.org/wiki/エディタ戦争)を参照のこと．なお，筆者は~~ミーハーなだけの~~Vimmerであり，それについてもまた筆を改めたい．)．しかしながら，ソフトウェア側からの改善も成熟し始めており，入力速度をこれ以上に高めるためには，ハードウェア側からのアプローチが必要となっていた．このアプローチのひとつに，入力インターフェイスを改善するという手法がある．これらは，[HHKB](http://www.pfu.fujitsu.com/hhkeyboard/)などの打鍵しやすさを追求したキーボードや，エルゴノミックキーボードとして販売され，[Kinesis](https://www.kinesis-ergo.com/products/)や[NISSE](https://www.esrille.com/keyboard/ja-jp/)など，~~変態的な~~画期的なエルゴノミックキーボードが存在する．

今後，何らかの技術革新により，たとえば[ブレイン・コンピュータ・インターフェイス](https://ja.wikipedia.org/wiki/ブレイン・マシン・インタフェース)のような素早く確実な入力方法が確立される可能性はあるが，いまだ現実的な手法であるとはいえない．また，キー配置をQWERTY以外の配置に変更することや，新しくVimやEmacsなどのソフトウェアを使用するのは，学習コストが高い．それゆえ，**コンピュータを用いた作業の律速段階のひとつを改善するために，キーボードを入力に特化したものに変更するというのは，妥当かつ有用な手段であるといえる．**

# 3. Viterbi Keyboardは通常のキーボードからの移行コストが低い

近年，スプリットキーボードが注目を集めている．両手位置をエルゴノミックに配置したキーボードは，古くから作られてきた([コレ](https://www.amazon.com/SafeType-Keyboard-Black-Color-V902/dp/B0049PFYWQ/?tag=ate40-20)などは~~明らかに狂っている~~エルゴノミクスに特化し，進化の袋小路に入った例である)．スプリットキーボードは，肩を開いて入力することが可能であり，肩こりなどの防止につながる．企業が製品化したものとして有名なもののひとつとして，[Matias](http://www.diatec.co.jp/products/list.php?s[]=110:1008:10055)が挙げられる．またこの時期，キーボードのパーツを売り，スプリットキーボードを自作するというムーブメントが生まれた．このムーブメントにより，スプリットキーボードの中でも最も有名なキーボードの1つである[Ergodox](https://falba.tech/ergodox-parts/)が[日本でも流行](https://www.oreilly.co.jp/community/blog/2016/03/helthy-programmers-talk-training-part2.html)した．Ergodoxは，自作キーボードという分野を広く知らしめることとなり，多数のプログラマが，Ergodox以外の自作キーボード([Let's Split](https://mehkee.com/products/lets-split-pcb?variant=46050392207)や[Nyquist](https://keeb.io/products/nyquist-keyboard?variant=48309345990)など)の組み立てに挑戦し，ビルドログを執筆するに至った．

スプリットキーボードは，多くの場合Ortholiner配列が採用される．そもそも，従来の斜め配列キーボードが，タイプライターを継承した非効率な配列であったため，エルゴノミクスを主張するスプリットキーボードでは，斜め配列が採用されることは少ない．ここで問題となるのが，斜め配列とOrtholiner配列との間のキー差である．

|　　　　　　　　　| 斜め配列 総割り付けキー |斜め配列 左手 割り付けキー|斜め配列 右手 割り付けキー|
|--:|:--:|:--:|:--:|
|数字キー行|14キー|6キー (7キー説も)|8キー (7キー説も)|
|Tabキー行|14キー|6キー|8キー|
|CapsLockキー行|13キー|6キー|7キー|
|Shiftキー行|12キー|6キー|6キー|

![US_keyboard](https://upload.wikimedia.org/wikipedia/commons/thumb/5/51/KB_United_States-NoAltGr.svg/800px-KB_United_States-NoAltGr.svg.png)
[Wikimedia Commons](https://commons.wikimedia.org/wiki/File:KB_United_States.svg)より転載

(US配列の)斜め配列では，数字キー行・Tabキー行・CapsLockキー行・Shiftキー行の順に14キー・14キー・13キー・12キーが存在し，右手と左手の割り付けは，6,8・6,8・6,7・6,6キーとなっている．簡単にまとめると，**斜め配列では，両手合わせて1行に14キーが割り付けられ，左右の手に割り付けられたキー数は非対称である．**一方で，自作キーボードにおいて最も有名なもののひとつであるLet's Splitは，[行, 列] = [4, 6]の配列となっており，キー数が足りない．

|　　　　　| Let's Split 総割り付けキー |Let's Split 左手 割り付けキー|Let's Split 右手 割り付けキー|
|--:|:--:|:--:|:--:|
|最上段|12キー|6キー|6キー|
|第2段|12キー|6キー|6キー|
|第3段|12キー|6キー|6キー|
|第4段|12キー|6キー|6キー|

<img src="https://camo.githubusercontent.com/dfbf83ee712079b862fccb951aefbb508b8a631d/687474703a2f2f692e696d6775722e636f6d2f797551754e4a552e6a7067" width=50%>
[Github nicinabox/lets-split-guideより転載](https://github.com/nicinabox/lets-split-guide)

Let's Splitでは行数自体が少ないため，単純な比較は不可能だが，US斜め配列とくらべると，各行での総キー数はあまり満たされておらず，右手に割り付けられたキーが少ない．**このキー数差により，通常のUS配列では右手小指で叩いていた`[`, `]`, `\`といったキーの位置を，慣れ親しんだ位置から変更する必要が生じる．結果的に，Let's Splitに移行すると，それまで使っていたキー配置から異なる配列に変わるため，初期の学習コストが高くかかることになる**(Let's Splitなどコンパクトキーボードは，レイヤーによるキーマップを前提としているので，そもそも学習が必要ではあるじゃん，というのは言ってはいけない)．また，通常のキーボードでは，左手よりも右手にキーが多く割り付けられているため，右手は7キー以上を扱うキャパシティが存在する．しかしながら，Let's Splitでは，そのキャパシティを活かしきれていない．

Let's Splitと比較して，今回着目するViterbiキーボードは[行, 列] = [5, 7]の配列である．

|　　　　　| Viterbi 総割り付けキー |Viterbi 左手 割り付けキー|Viterbi 右手 割り付けキー|
|--:|:--:|:--:|:--:|
|最上段|14キー|7キー|7キー|
|第2段|14キー|7キー|7キー|
|第3段|14キー|7キー|7キー|
|第4段|14キー|7キー|7キー|

![DPYWz0pUEAAruiu.jpg-large.jpeg](https://qiita-image-store.s3.amazonaws.com/0/214914/4be038f5-77fc-edd8-85fc-954b3621d6cc.jpeg)

これは，US斜め配列における各行での総キー数を満たしており，左手・右手に割り付けられたキー数もほとんど変わらない．US斜め配列から相対的な位置変更を検討しなければいけないキーは`=`キーと`\`キーくらいであり，**Viterbiキーボードは，Let's Splitなどの小型キーボードと比べると学習コストが低いといえる．**Let's Split以外のキーボードを使用する頻度が十分低いのであれば，Let's Split配列に手を最適化することで投資した学習コストは回収できるが，ペアプログラミングなどで通常の斜め配列キーボードも使用する場合は，複数のキーボード配列を行き来することになり，効率的な打鍵が困難になる．一方，**Viterbiキーボードは，US斜め配列キーボードと類似した配置を保っているため，斜め配列キーボードとの行き来によって生じる問題が少ない．以上から，初めてOrtholinerキーボードに移行するプログラマにとって，Viterbiキーボードを選ぶことが最善の選択肢の1つとなり得るだろう．**