鳰のような形をした僕の迂回路

My detour/diversion like a (little) grebe.

Planckキーボードのキーレイアウトの話 その2

f:id:CydonianBanana:20170702195744j:plain

最近、Planckキーボードのレイアウトを変えて大変しっくり来たので記録。

両手の小指の付け根でレイヤー切り替えを行う形。右下のキーは、右矢印キーとレイヤー切り替えキーを同居(tap/hold)。


 * ,-----------------------------------------------------------------------------------.                                                                                                                        
 * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  |  -   |                                                                                                                        
 * |------+------+------+------+------+-------------+------+------+------+------+------|                                                                                                                        
 * | LCtrl|   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  "   |                                                                                                                        
 * |------+------+------+------+------+------|------+------+------+------+------+------|                                                                                                                        
 * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  | Up   |                                                                                                                        
 * |------+------+------+------+------+------+------+------+------+------+------+------|                                                                                                                        
 * | Raise| Ctrl | Alt  |  GUI | eisu |Space |Enter | kana | GUI  | Left | Down |Lw/Rgt|                                                                                                                        
 * `-----------------------------------------------------------------------------------'                                                                                                                        
 */
[_MAC] = {
  {KC_TAB,   KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,   KC_Y,   KC_U,    KC_I,    KC_O,    KC_P,    KC_MINS},
  {KC_LCTL,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,   KC_H,   KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
  {KC_LSFT,  KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,   KC_N,   KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_UP},
  {MO(_RIS), KC_RCTL, KC_LALT, KC_LGUI, KC_LANG2,KC_SPC, KC_ENT, KC_LANG1,KC_RGUI, KC_LEFT, KC_DOWN, LT(_LWR, KC_RGHT)}
},

/* Raise                                                                                                                                                                                                        
 * ,-----------------------------------------------------------------------------------.                                                                                                                        
 * | Esc  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  |  =   |                                                                                                                        
 * |------+------+------+------+------+-------------+------+------+------+------+------|                                                                                                                        
 * |      |  F1  |  F2  |  F3  |  F4  |  (   |   )  |  F7  |  F8  |  F9  |   ~  |  ¥   |                                                                                                                        
 * |------+------+------+------+------+------|------+------+------+------+------+------|                                                                                                                        
 * |      |      |      |      |      |  [   |   ]  |      |      |      |      |      |                                                                                                                        
 * |------+------+------+------+------+------+------+------+------+------+------+------|                                                                                                                        
 * |      | Del  |      |      |      | Bksp | Bksp |      |      |      |      |Right |                                                                                                                        
 * `-----------------------------------------------------------------------------------'                                                                                                                        
 */
[_RIS] = {
  {KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,      KC_EQL},
  {_______, KC_F1,   KC_F2,   KC_F3,   KC_F4,   S(KC_9), S(KC_0), KC_F7,   KC_F8,   KC_F9,   S(KC_GRV), KC_BSLS},
  {_______, _______, _______, _______, _______, KC_LBRC, KC_RBRC, _______, _______, _______, _______,   _______},
  {_______, KC_DEL,  _______, _______, _______, KC_BSPC, KC_BSPC, _______, _______, _______, _______,   KC_RGHT}
},

/* Lower                                                                                                                                                                                                        
 * ,-----------------------------------------------------------------------------------.                                                                                                                        
 * |      |  !   |  @   |  #   |  $   |  %   |  ^   |  &   |  *   |      |  UP  |  +   |                                                                                                                        
 * |------+------+------+------+------+-------------+------+------+------+------+------|                                                                                                                        
 * |      | HOME |      | DEL  | RGHT |      | BKSP | Enter|      |      |   `  |  |   |                                                                                                                        
 * |------+------+------+------+------+------|------+------+------+------+------+------|                                                                                                                        
 * |      |      |      |      | PGDN | LEFT | DOWN |      |      |      |      |      |                                                                                                                        
 * |------+------+------+------+------+------+------+------+------+------+------+------|                                                                                                                        
 * |      |      |      |      |      |      |      |      |      |      |      |      |                                                                                                                        
 * `-----------------------------------------------------------------------------------'                                                                                                                        
 */
[_LWR] = {
  {_______, S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), _______, KC_UP,   S(KC_EQL)},
  {_______, KC_HOME, _______, KC_DEL,  KC_RGHT, _______, KC_BSPC, KC_ENT,  _______, _______, KC_GRV,  S(KC_BSLS)},
  {_______, _______, _______, _______, KC_PGDN, KC_LEFT, KC_DOWN, _______, _______, _______, _______, _______},
  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
},

Planckキーボードのレイヤー切り替えとかな/英数切り替え設定

f:id:CydonianBanana:20170415163642j:plain

Planckキーボードにおいてレイヤー切り替えキー(Raise/ Lower)は非常に押下頻度の大きいキーであり、できれば親指で押下できるエリアに配置したいものである。ところがMacの日本語キーボードにおけるかな/英数切り替え方法(スペースキーの両脇のかな/英数キーによる切り替え)に慣れ親しんだものにとって、Raise/ Lowerの位置にこそかな/英数キーを配置したいと思うのが人情である。

そこで、QMKファームウェアの”Momentary Switch with tap toggle”機能を使ってこのジレンマに終止符を打ったというのが本記事の趣旨である。

つまり、

LT(layer, kc)

を割り当てたキーをタップするとkcが入力され、長押しするとlayerに切り替わるので、Raise/ Lowerキーとかな/英数キーを2つのキーに割り当てることができる。

長押しと判定されるまでの時間は、デフォルトでは200(ms)に設定されている。ぼくの場合この設定は長すぎで、Raise+qと押下してqが入力されるといったことが頻発したので、

qmk_firmware-master/tmk_core/common/action_tapping.h

にて

/* period of tapping(ms) */
#ifndef TAPPING_TERM
/* #define TAPPING_TERM    200 */
#define TAPPING_TERM    75
#endif

としたらぼくにはちょうどよかった。

最後に、現在のWindowsマシン用のキー設定は以下の通り。なお、Windowsマシンではkeyhacにて、変換/無変換キーにIME切り替え機能を付与している。その他、左CtrlをemacsキーバインドのC-に、右Ctrlを普通のコントロールキーに設定している。

define _WIN 0
define _LWR 1
define _RIS 2

// Macro name shortcuts                                                                                                                                                                                         
#define WIN M(_WIN)
#define LWR M(_LWR)
#define RIS M(_RIS)

// Fillers to make layering more clear                                                                                                                                                                          
#define _______ KC_TRNS
#define XXXXXXX KC_NO

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

/* WIN                                                                                                                                                                                                          
 * ,-----------------------------------------------------------------------------------.                                                                                                                        
 * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  |  -   |                                                                                                                        
 * |------+------+------+------+------+-------------+------+------+------+------+------|                                                                                                                        
 * | lCtrl|   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  "   |                                                                                                                        
 * |------+------+------+------+------+------|------+------+------+------+------+------|                                                                                                                        
 * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  | Up   |                                                                                                                        
 * |------+------+------+------+------+------+------+------+------+------+------+------|                                                                                                                        
 * | Esc  | GUI  | Alt  | rCtrl|Raise |Space |Enter |Lower | rCtrl| Left | Down |Right |                                                                                                                        
 * `-----------------------------------------------------------------------------------'                                                                                                                        
 */
[_WIN] = {
  {KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_MINS},
  {KC_LCTL, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
  {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_UP},
  {KC_ESC, KC_LGUI, KC_LALT, KC_RCTL, LT(RIS,KC_MHEN), KC_SPC, KC_ENT, LT(LWR,KC_HENK), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT}
},

/* Raise                                                                                                                                                                                                        
 * ,-----------------------------------------------------------------------------------.                                                                                                                        
 * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  |  =   |                                                                                                                        
 * |------+------+------+------+------+-------------+------+------+------+------+------|                                                                                                                        
 * |      |      |      | rClic| lClic|  (   |   )  |      |      |   {  |   }  |  ¥   |                                                                                                                        
 * |------+------+------+------+------+------|------+------+------+------+------+------|                                                                                                                        
 * |      |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |  F7  |  F8  |  F9  |  F10 | mUp  |                                                                                                                        
 * |------+------+------+------+------+------+------+------+------+------+------+------|                                                                                                                        
 * |  Del |      |      |      |      | Bksp | Bksp |      |      | mLft | mDwn | mRgt |                                                                                                                        
 * `-----------------------------------------------------------------------------------'                                                                                                                        
 */
[_RIS] = {
  {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,      KC_5,    KC_6,    KC_7,    KC_8,    KC_9,       KC_0,       KC_EQL},
  {_______, _______, _______, KC_MS_BTN2,KC_MS_BTN1, S(KC_9), S(KC_0), _______, _______, KC_LBRC, KC_RBRC,    KC_BSLS},
  {_______, KC_F1,   KC_F2,   KC_F3,   KC_F4,     KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,      KC_F10,     KC_MS_UP},
  {KC_DEL,  _______, _______, _______, _______,   KC_BSPC, KC_BSPC, _______, _______, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT}
},

/* Lower                                                                                                                                                                                                        
 * ,-----------------------------------------------------------------------------------.                                                                                                                        
 * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |      |  UP  |  +   |                                                                                                                        
 * |------+------+------+------+------+-------------+------+------+------+------+------|                                                                                                                        
 * |      |      |      | DEL  | RGHT |  (   |   )  |      |      |   {  |   }  |  |   |                                                                                                                        
 * |------+------+------+------+------+------|------+------+------+------+------+------|                                                                                                                        
 * |      |      |      |      |      | LEFT | DOWN |  F7  |  F8  |  F9  |  F10 | Vol+ |                                                                                                                        
 * |------+------+------+------+------+------+------+------+------+------+------+------|                                                                                                                        
 * |  Del |      |      |      |      | Bksp | Bksp |      |      | Mute | Vol- | Next |                                                                                                                        
 * `-----------------------------------------------------------------------------------'                                                                                                                        
 */
[_LWR] = {
  {S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), _______,    KC_UP,    S(KC_EQL)},
  {_______,   _______, _______, KC_DEL , KC_RGHT, S(KC_9), S(KC_0), _______, _______, S(KC_LBRC), S(KC_RBRC), KC_PIPE},
  {_______,   _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_F7,   KC_F8,   KC_F9,      KC_F10,     KC_VOLU},
  {KC_DEL,    _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, _______, KC_MUTE,    KC_VOLD,    KC_MNXT}
},

Atreus62のキーマップの話

Atresu62が届いてキーマップも作ったのでご紹介。

f:id:CydonianBanana:20170205130847j:plain

ちなみにAtreus62とは、profet keyboardsにて販売されている60%キーボードである。肩を開いて打鍵できるエルゴノミクス設計と、親指で打鍵するエリア(ふつうはスペースバーがあるエリア)に複数のキーが配置されていることが特徴。日夜左手の小指を酷使し腱鞘炎と闘うemacserたちも、これを使えばたちどころに手首や肩への負担が軽減され見違えるような健康体となりらんらんと目が輝いてくることうけあいの超絶素敵アイテムであります。

この前のPlanckキーボードと同様に、QMKでファームウェアをビルドする。Flashingの手順は公式のビルドガイドに詳しい。

今回Atreus62用にぼくが考案したさいきょうのキーマップは以下の通り。

 default                                                                                                                                                                                                      
 ,-----------------------------------------.              ,-----------------------------------------.                                                                                                        
| Esc  |   1  |   2  |   3  |   4  |   5  |               |   6  |   7  |   8  |   9  |   0  |  =   |
|-----------------------------------------|               |-----------------------------------------|
| Tab  |   Q  |   W  |   E  |   R  |   T  |               |   Y  |   U  |   I  |   O  |   P  |  -   |
|------+------+------+------+------+------|               |------+------+------+------+------+------|
| Ctrl |   A  |   S  |   D  |   F  |   G  |               |   H  |   J  |   K  |   L  |   ;  |  "   |
|------+------+------+------+------+------|               |------+------+------+------+------+------|
| Shift|   Z  |   X  |   C  |   V  |   B  |-----.   ,-----|   N  |   M  |   ,  |   .  |   /  | Up   |
|------+------+------+------+------+------|     |   |     |------+------+------+------+------+------|
|  Fn  |  Win | Alt  | GUI  | MHEN |Space |  (  |   |  )  |Enter | HENK | GUI  | Left | Down |Right |
`-----------------------------------------------'   `-----------------------------------------------'

 _FN
,-----------------------------------------.               ,-----------------------------------------.
|   `  |  F1  |  F2  |  F3  |  F4  |  F5  |               |  F6  |  F7  |  F8  |  F9  |  F10 | PgUp |
|-----------------------------------------|               |-----------------------------------------|
|      |      |WHEEL+| END  |      |      |               |  F11 |  F12 | INS  |      |  Up  | PgDn |
|------+------+------+------+------+------|               |------+------+------+------+------+------|
|      | HOME |WHEEL-| DEL  | RGHT | Esc  |               | Bksp |      |      |      |      |  \   |
|------+------+------+------+------+------|               |------+------+------+------+------+------|
|      | rClic| lClic|      | PgDn | Left |-----.   ,-----| Down |      |      |      |      | mUp  |
|------+------+------+------+------+------|  [  |   |  ]  |------+------+------+------+------+------|
|      |      |      | DEL  |      | Bksp |  {  |   |  }  | Bksp |      |      | mLft | mDwn | mRgt |
`-----------------------------------------------'   `-----------------------------------------------'

ポイントは

  • 多用するスペースキーとリターンキーはもちろん親指で打鍵できるように配置した
  • MHENとHENKは無変換/変換キー。職場のWindows PCではこれらにIME ON/OFFを割り当てているので、Macの英数/かなキーと似た感覚で日本語の作文ができる。利用頻度の高さから親指エリアに配置した
  • 普段から日本語配列キーボードとUNIX配列キーボードを併用している身として一番困惑するのがパーレン・ブラケット・ブレイスの位置。日ごろの鬱憤を込めて親指エリアの一番大きいキーにまとめてアサインした
  • emacserの生命線であるCtrlキーは親指エリアに配置してもよかったけど、そうすると他のキーボードを使う必要に狩られた際に初めてキーボードを与えられた赤子のような手つきになってしまうので、いつも通りAの左側の定位置に配置した
  • Fnキー押下時にemacsキーバインドを再現しているのは、iPadiPhoneに接続したときのため。iOSは一部emacsキーバインドに対応しているが、なぜかC-nとC-pには対応していなくて不便なのだ
  • mLftとかrclicとかはマウス操作。wheel+とwheel-はマウスホイール。が、正直トラックポイントの方がずっと使いやすい。AtreusもTEX Yodaみたいにトラックポイント付きのモデル設計してくれないかな……

 

ちなみにぼくはLightning - USB 3カメラアダプタ経由でiPadiPhoneにメカニカルキーボードを接続しています(消費電力が大きいキーボードもバッテリーと同時に接続可能)。カフェドヤ活動等に便利ですが、こういう用途で作られた商品ではないので利用の際は自己責任でお願いします。

 

ねじれ双角錐群『望郷』@11/23水祝 文学フリマ東京

nejiresoukakusuigun.tumblr.com

 サークル『ねじれ双角錐群』の小説合同誌『望郷』を、11/23(水・祝)開催の第二十三回文学フリマ東京にて頒布します。ブースはイ-46です。その他、詳細情報、参加者および作品あらすじは上記リンクをご参照ください。

ぼくの小説はほんのりSF仕立ての幻想譚 feat.のじゃロリ狐ババアなものとなっております。文学フリマ東京にお越しの各位に於かれましてはふらっと購入しましょう。当日はcydonianbananaの影武者(5人いる)の内の一人が売り子をする予定です。よろしくお願いします!

新海誠『君の名は。』

「君の名は。」予告

 

1回目を見た感想を書く。2回目を見たら見解が変わると思う。

# overview
君の名は。』観たけどこれはもう秒速五センチメートルで約束の地を追われた俺たちがエジプトを出奔し過酷な放浪の末にようやくカナンにたどり着くまでのいきさつを描いた壮大な叙事詩の最終章だったというか、なんかもう新海誠作品群はメタな視点から見たときに新海誠の成長譚として受容されてしまいもはや主人公:新海誠といった状態なのでもう以降は『劇場版新海誠』と呼ばせていただくが、今回の『劇場版新海誠』は作中の全ての意図が説明ではなく描写によって解明されておりぼくはただただ涙を流すだけの機械と化してしまった。なんかもう「フィクションはこれにて完成です!有史以来ご苦労様でした!!解散!!!」という感じだった。生きてこの映画が見られて本当によかった。新海誠と同じ時代に生きていて本当によかった。ああ今はこの世界を創りたもうた神々に感謝することしかできないよ俺は。

# theme
思春期の残滓、青春の不可能性、一回性、二度と戻ってこないあの感覚を奇跡によって克服してしまった残酷な映画という感じがする。君の名を忘れてしまったら、もう二度と元には戻れない。それに気づいてそれでも前を向いて歩き出すのが『秒速五センチメートル』だったが、『君の名は。』では「君の名前は?」ともう一度聞くチャンスが、奇跡・偶然によってもたらされている感じがして残酷な救済という印象。序盤の交代するモノローグ、終盤のすれ違うシーンなどはそのまま『秒速五センチメートル』だが、本作ではその続きが奇跡によって成就してしまった世界が描かれている。これは残酷なのか?それとも、希望なのか?
三葉の父親は、宮水家の入れ替わり現象の情報を少なからず持っていたと思われる。それは、瀧in三葉に胸倉を掴まれたときのリアクションからそう思われる。彼はそれを妄言癖と形容していた。また一葉は、夢を見たことがあることを覚えている。
隕石事故を無くしてしまうということの意味をよく考えた方がいいかもしれない。忘却について。ラーメン屋のおやじについて。単なる物語や意味に回収できない不穏なもの、その集合が形成する結末の別の解釈を求めたい。
「ここではないどこかへ行きたい」「今の自分は本当の自分じゃないんじゃないか」という想いが新海誠作品にあらわれる分裂したふたつの世界として表出されていたが、本作では岐阜と東京だった。その間には時間の差異が横たわっており、しかしその跳躍にはSF的な説明は付されず、物語の波に乗る僕らと新海誠の感情に即して都合よく乗り越えられていく。こうなると、これまで描かれてきた、たどり着けなくてもなんとかやっていこうというポジティブさ、悲しいハッピーエンドは、どうなってしまうのか。それは、否定されて二度と戻ってこないのか? それを救うような解釈を、君の名は。に求めたい。ぼくはそれを考え続けたいと思う。
思春期の残滓、青春の不可能性、人生の一回性。君の名は。は二度と戻ってこないあの感覚を奇跡によって克服してしまった極めて残酷な映画なんじゃないか?という要約になる。君の名を少しずつ忘れながら生きていかざるをえない僕らにとって、忘却は最良の友であり温厚な看守であった。そのやさしくも冷たい孤独を苦悩の裡に受け入れ、それでも前を向いて歩き出した秒速五センチメートルの達成を、君の名は。は部分的に肯定するものの、「君の名前は?」ともう一度聞く機会を偶然によってもたらしている。これは、あまりに残酷すぎないか?ラーメン屋のオヤジの悲しみを、奇跡の名の下になかったことにしてもいいのか? ぼくにはまだ判断がつかない。


# Performance
- 瀧の中に入りたての三葉がカフェに行くシーン、司たちが木ぐみの天井に感銘を受けている場面で、三葉in瀧は当然そんなものには目もくれずにパンケーキに夢中なのだ。糸守に木ぐみの天井はありふれているらしいということがわかるシーン
- もしかしたら、三葉の自宅の天井を描いたシーンがあったのではないか?僕だったらそれを入れていく
- 勅使河原は序盤でオカルト好きであることが明示されているので、終盤に隕石が落ちてくるという話を信じたことの説明は一応できる
- 瀧の仕事で糸守の街を再建する未来が見える
- 三葉in瀧がバイトを初日からこなし始めるシーン。三葉ハイスペックすぎると思うが、夢だと思いながらヤケクソでやってるからなんか成立してる、という説明は一応できる
- 瀧in三葉が美術の時間に机を蹴って威圧するシーン、言の葉の庭と韻を踏んでいる
- 糸守の絵を見て瀧に協力する高山ラーメン屋のオヤジの視点は、視聴者の視点とシンクロしているので高ぶる。つまり、視聴者は美しい糸守の景色をこれでもかと見せられてきて、そしてそれが破滅してしまった現在の様子を見せられる。俺たちはその悲しさを、ラーメン屋のオヤジと共有しているんだ
- 糸守の湖を序盤に見ると、隕石湖かカルデラ湖か、といった印象を一発で与える。しかしそれについて説明はなく、描写して見せているだけなので、終盤に彗星の話が出てきたときに、物語の快楽を生じる。すなわち、視聴者の頭の中で情報が結合して快楽を生じる
- 御神体の中で口噛み酒を飲んだ直後のシーンの走馬灯
- 描写によって駆動するということは、シチュエーションを描くということであり、シチュエーションの中で物語の整合性などの理屈を描かなければならない。そのハードルは高い。新海誠はその点にそこまで成功していない、もしくは重視していないという指摘があるが、君の名は。に関して言えば、かなり成功しているように思える

 

思うところはたくさんあるけど結論としては、ぼくは新海誠の、映像と音声によって人間を強制的に快楽の坩堝に叩き落とす行為に共鳴するのでこの映画の評価は常に満点ということになります。人間は動物です。ありがとうございました。

ErgoDox組立てとキーマップの話

 

この前組み立てたInfinity ErgoDoxのキーマップが固まりつつあるのでご紹介。

f:id:CydonianBanana:20160604183713j:plain

ちなみにErgoDox とはオープンソースの左右セパレート型キーボードで、名前の通りエルゴノミクスな設計により肉体への負荷を軽減してくれるキーボードであり、朝起きてから寝るまでキーボードの前に座って腱鞘炎と闘うemacser御用達の素敵アイテムであります。

ErgoDoxの優れている点は、親指という最も強靭な指を効率的に使えるように広大な親指エリアが設けられていること、ファームウェアオープンソースなので自由なキーマップがプログラムできること、あと左右セパレート型なので肩や手首への負担が軽減できること、などです。

腕を開いて胸を張った自然な姿勢で打鍵していると、これがタイピングのあるべき姿なのだという感慨がふつふつと湧いてきます。ぼくは今から予言しておきますが、今後は左右セパレート型じゃないキーボードを会社が提供した場合即労災が適用されるようになってくると思います。

ErgoDoxの入手先

現状でErgoDoxの購入先は3つくらいある。

  1. IndiegogoにてErgoDox EZ(完成品)を注文することができる。高さ調節用のチルトが付いてたり、見た目に手作り感がなくてなんとなくクォリティが高い感じがする。 
  2. FalbaTechではパーツの素材やカラーに選択の自由がある。パーツによってはかなりキューティクルな見た目のErgoDoxに仕上げることも可能。
  3. MassdropにてInfinity ErgoDoxの組み立てキットが提供されており、半田ごてを用意して自分で組み立てる必要がある。僕の場合、Massdropで注文してからkitが届くまでに2,3ヶ月かかった。Infinity ErgoDoxには上部にLCDディスプレイが付いており、ファームウェアを書き換えることでLCDの発光パターンや表示パターンを自由に設定することができる。

ファームウェアについては、ErgoDox EZは前回のPlanckキーボードと同じqmk firmwareが提供されている。Infinity ErgoDoxについてはKiiBohd controllerが提供されている(WhiteFoxも同じ。Massdrop系はこっちっぽい)。

ぼくはしばしばMassdropで買い物してる流れでInfinity ErgoDoxを購入して組み立てました。

f:id:CydonianBanana:20160527224733j:plain

f:id:CydonianBanana:20160527225348j:plain

 

ファームウェアのビルド

ファームウェアをビルドする前にdfu-utilを用意する。Macの場合はhomebrewで準備するのが楽チン。

brew install dfu-util 

オープンソースFirmwareとしてKiiBohd controllerが提供されている。使い方としては、以下のシェルスクリプトを実行すると、

./controller-master/Keyboards/ergodox.bash

以下の2つのディレクトリができる。右手部分がICED-R、左手部分がICED-Lに対応している。

./controller-master/Keyboards/ICED-L/
./controller-master/Keyboards/ICED-R/

ファームウェアを上書きするときは、右手部分・左手部分それぞれについて、ErgoDox背面のリセットボタンを押した状態で下記コマンドを打てばいい。

dfu-util -D ./controller-master/Keyboards/ICED-L/kiibohd.dfu.bin

キーマップをいじるときは、ergodox.bashでDefaultMapに指定されているファイルを編集する。

./controller-master/kll/layouts/mdergo1Overlay.kll

キーマップをいじるとこを詳しく知りたい人はKiibohd.comを読む。もし単純なキーマップで事足りるならKLL Keyboard Configuratorでバイナリファイルを生成してくれるので楽チン。でもCtrl+Alt+Deleteとかマウス操作の設定とかは多分できない。あと、LCDディスプレイの表示をいじりたいときはCustomizing the Ergodox Infinity LCD Logoが参考になる。

キーマップ

これがぼくが考えたさいきょうのキーマップだ!

# Keymap 0: Basic layer
#
# ,--------------------------------------------------.           ,--------------------------------------------------.
# | Grv    |   1  |   2  |   3  |   4  |   5  |  Esc |           | CADel|   6  |   7  |   8  |   9  |   0  |   =+   |
# |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
# | Tab    |   Q  |   W  |   E  |   R  |   T  |  [   |           |   ]  |   Y  |   U  |   I  |   O  |   P  |   -_   |
# |--------+------+------+------+------+------|  {   |           |   }  |------+------+------+------+------+--------|
# | LCtrl  |   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |   ;  |   '"   |
# |--------+------+------+------+------+------|  (   |           |   )  |------+------+------+------+------+--------|
# | LShift |   Z  |   X  |   C  |   V  |   B  |      |           |      |   N  |   M  |   ,  |   .  |  /?  |   \|   |
# `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
#   | Hyper| RCtrl| LAlt | LGUI | MHEN |                                       | HENK | Left |  Up  | Down | Right|
#   `----------------------------------'                                       `----------------------------------'
#                                        ,-------------.       ,-------------.
#                                        |  L1  | PgUp |       | DEL  |  L2  |
#                                 ,------|------|------|       |------+------+------.
#                                 |      |      | PgDn |       | BSpc |      |      |
#                                 | Space|Lshift|------|       |------| LCtrl| Enter|
#                                 |      |      | SAlt |       | RAlt |      |      |
#                                 `--------------------'       `--------------------'

# Keymap 1: Func layer
#
# ,--------------------------------------------------.           ,--------------------------------------------------.
# |        |  F1  |  F2  |  F3  |  F4  |  F5  |  F11 |           |  F12 |  F6  |  F7  |  F8  |  F9  |  F10 |        |
# |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
# |        |      |mouseU|      |      |      |      |           |      |      |      |      |      |      |        |
# |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
# |        |mouseL|mouseD|mouseR|      |      |------|           |------|      |      |      |      |      |        |
# |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
# |        |      |      |      |      |      |      |           |      |      |      |      |LClick|RClick|        |
# `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
#   |      |      |      |RClick|LClick|                                       |      |mouseL|mouseU|mouseD|mouseR|
#   `----------------------------------'                                       `----------------------------------'
#                                        ,-------------.       ,-------------.
#                                        |  L1  |      |       |      |  L1  |
#                                 ,------|------|------|       |------+------+------.
#                                 |      |      |      |       |      |      |      |
#                                 |      |      |------|       |------|      |      |
#                                 |      |      |      |       |      |      |      |
#                                 `--------------------'       `--------------------'

ポイントは、

  • 親指でShift, Ctrl, Alt, Enterがそれぞれ押せること。Back SpaceについてはCtrl+Hで事足りる(Windowsのときはkeyhacでemacsキーバインドを再現してる)。
  • HENKとMHENとあるのは、変換キーと無変換キーで、WindowsではこれらをIMEのOn/Offにアサインしている。このため、Macと同じ感覚で、全角/半角の切り替えができる。
  • CADelとあるのはCtrl+Alt+Delete。
  • Hyperは Ctrl+Shift+Alt+GUI。ソフト側で変なショートカットを設定したいときに使う。
  • L1とあるのはファンクションキーで、これを押している間はレイヤー1のキーマップになる。レイヤー1には試験的にマウス操作を割り当てていて、この操作感がまあ悪くない。でもトラックポイントと比べるとやっぱり使いづらい。
  • 職場のWindows用を考えているので、メディアキーの割り当てとかはしていない。

という感じ。

左手小指を酷使しなくなるだけで、左手首や肘の痛みが楽になったことを実感できる。

未来感

最近はPlanckキーボードを中央に配置して未来感を演出するのにハマってる。

f:id:CydonianBanana:20160604183237j:plain

 

こちらからは以上です。

Planckキーボードの話

 

このまえ組み立てたPlanckキーボードに指がだいぶ慣れてきたのでこのタイミングでキーマップをさらす。

f:id:CydonianBanana:20160529230345j:plain

ちなみにPlanckキーボードとは、

The Planck is a DIY compact 40% ortholinear (as opposed to staggered) keyboard kit that optimises the use of your hands in a thumb-oriented layout.

である。OLKBが設計、最近はmassdropで買える。

このPlanckキーボードは、後でレイアウトを晒すけど、EnterキーやBackSPCキーが親指で押せること、emacsで多用するLCtrlキーまでの距離が相対的に近いことなどから、指や手首への負担を大幅に軽減してくれており、今や人生に欠かせない存在となっている。

そのうえ上掲の写真のとおりキューティクルなキーキャップを装備することでたいへん可憐な見た目のキーボードとなるポテンシャルを秘めており、ぼくに至ってはエレノアという固有名詞をつけて毎日愛でているという始末である。そういうわけで皆さんにも是非おススメしたいのでこの記事を書くことにした。

キーマップ作成環境

キーレイアウトを自由に編集するために必要となるファームウェアコンパイルおよび書き換え環境を Planck Firmware Guideに沿って整える。MacOSユーザーならhomebrewでやるのが楽チン。

ファームウェアのソースは デフォルトのソース を適宜いじってやればいい。

たとえば自分のkeymap.cを

/qmk_firmware-master/keyboard/planck/keymaps/hoge/keymap.c

に作った場合は、planckキーボードの背面のボタンを押した状態で

make clean && make KEYMAP=hoge dfu 

とすればファームウェアコンパイル、書き換えができる。

キーレイアウト

ぼくがかんがえた最強のキーレイアウトは以下の通り。

/* MAC
 * ,-----------------------------------------------------------------------------------.
 * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  |  -   |
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 * | Ctrl |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  "   |
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  | Up   |
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 * | Esc  | Ctrl | Alt  | GUI  |Raise |Space |Enter |Louwer| GUI  | Left |Right | Down |
 * `-----------------------------------------------------------------------------------'
 */
[_MAC] = {
  {KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_MINS},
  {KC_LCTL, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
  {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_UP},
  {KC_ESC,  KC_RCTL, KC_LALT, KC_LGUI, RAISE,   KC_SPC,  KC_ENT,  LOWER,   KC_RGUI, KC_LEFT, KC_DOWN, KC_RGHT}
},

/* Lower
 * ,-----------------------------------------------------------------------------------.
 * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  |  +   |
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 * |      |      |      |      |      |      |      |      |      |   {  |   }  |  |   |
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 * |      |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |  F7  |  F8  |  F9  |  F10 | Vol+ |
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 * |  Del |      |      |      |LANG2 | Bksp | Bksp |      |      | Mute | Next | Vol- |
 * `-----------------------------------------------------------------------------------'
 */
[_LOWER] = {
  {S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9),    S(KC_0),    S(KC_EQL)},
  {_______,   _______, _______, _______, _______, _______, _______, _______, _______, S(KC_LBRC), S(KC_RBRC), KC_PIPE},
  {_______,   KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,      KC_F10,     KC_VOLU},
  {KC_DEL,    _______, _______, _______, KC_LANG2,KC_BSPC, KC_BSPC, _______, _______, KC_MUTE,    KC_VOLD,    KC_MNXT}
},

/* Raise
 * ,-----------------------------------------------------------------------------------.
 * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  |  =   |
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 * |      |      |      |      |      |      |      |      |      |   {  |   }  |  ¥   |
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 * |      |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |  F7  |  F8  |  F9  |  F10 | Vol+ |
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 * |  Del |      |      |      |      | Bksp | Bksp |LANG1 |      | Mute | Next | Vol- |
 * `-----------------------------------------------------------------------------------'
 */
[_RAISE] = {
  {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_EQL},
  {_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LBRC, KC_RBRC, KC_BSLS},
  {_______, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_VOLU},
  {KC_DEL,  _______, _______, _______, _______, KC_BSPC, KC_BSPC, KC_LANG1, _______,KC_MUTE, KC_VOLD, KC_MNXT}
},

ポイントは、レイヤー1のRaiseキーとレイヤー2のLowerキーがそれぞれAppleキーボードのkanaキー(LANG1)とeisuキー(LANG2)に対応していること。これにより、日本語IMEと英数字との切り替えが、Appleワイヤレスキーボードと同じ感覚でできる1

ただ、このkanaキー(LANG1)とeisuキー(LANG2)を有効にするためにちょっとした作業が必要だった(以下)。

かなキーと英数キーを使えるようにするために

以下の経緯で改訂Rev.upされており、特に作業は発生しなくなった。

github.com

以下の議論のおかげで助かった。

Can't use KCLANG1 & KCLANG2 key

qmkfirmwareを読み解く

具体的な作業としては、

/tmk_core/protcol/lufa/descriptor.c

に対して以下の変更を加えることで、kanaキー(LANG1)とeisuキー(LANG2)が有効になる。

HID_RI_USAGE_PAGE(8, 0x07), /* Keyboard */
HID_RI_USAGE_MINIMUM(8, 0x00), /* Reserved (no event indicated) */
HID_RI_USAGE_MAXIMUM(8, 0xFF), /* Keyboard Application */
HID_RI_LOGICAL_MINIMUM(8, 0x00),
HID_RI_LOGICAL_MAXIMUM(8, 0xFF),

->

HID_RI_USAGE_PAGE(8, 0x07), /* Keyboard */
HID_RI_USAGE_MINIMUM(8, 0x00), /* Reserved (no event indicated) */
HID_RI_USAGE_MAXIMUM(8, 0x68), /* Keyboard Application */
HID_RI_LOGICAL_MINIMUM(8, 0x00),
HID_RI_LOGICAL_MAXIMUM(8, 0x68),

windowsマシンでの環境

windowsマシンで使う場合、macで言う所のcommandキーをctrlキーにしたいし、あとぼくはwindowsキーをlauncher代わりに使っているので、欲しい。そこでkeyhacを使ってキースワッピングをしている。

職場では普段HHKB Japaneseを使っているが、Planckキーボードを繋いでもErgoDoxを繋いでも、編集なしですぐ使えるように、以下のconfig.pyファイルでやっている。

# -*- mode: python; coding: utf-8-dos -*-

# coding-system: utf-8-dos
# file name:     config.py 
#

from time   import sleep
from keyhac import *

def configure(keymap):

    ########################################################################
    ## keymap-replace
    ########################################################################
    # for HHKB
    keymap.replaceKey( "(242)", "RCtrl" )
    keymap.replaceKey( "LWin",  "RCtrl" )
    # RWinと半/全の入れ替え
    keymap_global = keymap.defineWindowKeymap()
    keymap_global[ "D-(243)" ] = "RWin"
    keymap_global[ "D-(244)" ] = "RWin"
    keymap_global[ "U-(243)" ] = []
    keymap_global[ "U-(244)" ] = []

    # for Planck
    keymap.replaceKey( "RCtrl", "LWin" )# PlanckのRCtrlを、L-GUIにしてしまえば、この設定はいらない
    keymap.replaceKey( "RWin",  "RCtrl" )

    ########################################################################
    ## Basis
    ########################################################################
    # editor of config.py
    keymap.editor = "emacs"

    # True: 日本語キーボード
    # False: 英語キーボード
    is_japanese_keybord = True

    # emacs のキーバインドに"したくない"アプリケーションソフトを指定する(False を返す)
    # keyhac のメニューから「内部ログ」を ON にすると processname や classname を確認することができます
    def is_emacs_target(window):
        if window.getProcessName() in ("cmd.exe",            # cmd
                                       "mintty.exe",         # mintty
                                       "emacs.exe",          # Emacs
                                       "runemacs.exe",       # Emacs
                                       "emacs-w32.exe"):     # Emacs
            return False
        return True
    keymap_emacs = keymap.defineWindowKeymap(check_func=is_emacs_target)

    # mark がセットされると True になる
    keymap_emacs.is_marked = False

    # 検索が開始されると True になる
    keymap_emacs.is_searching = False

    # キーボードマクロの play 中 は True になる
    keymap_emacs.is_playing_kmacro = False

    # universal-argument コマンドが実行されると True になる
    keymap_emacs.is_universal_argument = False

    # digit-argument コマンドが実行されると True になる
    keymap_emacs.is_digit_argument = False

    # コマンドのリピート回数を設定する
    keymap_emacs.repeat_counter = 1

    ########################################################################
    ## IMEの切替え
    ########################################################################

    # toggling
    def toggle_input_method():
        # バルーンヘルプを表示する時間(ミリ秒)
        BALLOON_TIMEOUT_MSEC = 500
        keymap.command_InputKey("A-(25)")()
        if 1:
            if not keymap_emacs.is_playing_kmacro:
                sleep(0.05) # delay

                # IME の状態を取得する
                if keymap.wnd.getImeStatus():
                    message = "[あ]"
                else:
                    message = "[A]"

                # IMEの状態をバルーンヘルプで表示する
                keymap.popBalloon("ime_status", message, BALLOON_TIMEOUT_MSEC)
            

    # Switching
    #  @param flag      切り替えフラグ(True:IME ON / False:IME OFF)
    def switch_ime(flag):
        # バルーンヘルプを表示する時間(ミリ秒)
        BALLOON_TIMEOUT_MSEC = 500
        # if not flag:
        if flag:
            ime_status = 1
            message = u"[あ]"
        else:
            ime_status = 0
            message = u"[A]"
        # IMEのON/OFFをセット
        keymap.wnd.setImeStatus(ime_status)
        # IMEの状態をバルーンヘルプで表示
        keymap.popBalloon("ime_status", message, BALLOON_TIMEOUT_MSEC)
        
    def ime_on():
        switch_ime(True)
        
    def ime_off():
        switch_ime(False)

    ## 「IMEの切替え」のキー設定
    keymap_emacs["(28)"]  = ime_on
    keymap_emacs["(29)"]  = ime_off
    keymap_global["LC-Yen"] = toggle_input_method
#    keymap_global["LC-o"]   = toggle_input_method
(後略)

まとめると、MacでもWinでも文章を書く上で僕が一番気にするのがIMEの切り替えで、windowsの全角半角キーみたいにトグル式だと無駄に脳を使ってしまうので、がんばってAppleキーボードみたいな感じにしましたということです。

Apple Magic Trackpadとの相性f:id:CydonianBanana:20160529230432j:plain

NPKC Wooden Wrist RestsのTKL Wrist Rest: 13.98 x 2.95 in (35.5 x 7.5 cm)とMagic Trackpadとの相性が非常によく、上掲の写真の通りぴったりサイズであり、気持ちがいいのでおススメです。

  1. karabinerを使ってcommandキーワンショットでIME切り替えをするのと利便性は変わらないと思う。 ↩︎