2023-4-7 keyball61 のキーマップ

shishi.hatenablog.jp

keymap

// clang-format off
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [0] = LAYOUT_universal(
    TO(2)    , KC_1         , KC_2         , KC_3         , KC_4         , KC_5         ,                                          KC_6          , KC_7         , KC_8         , KC_9         , KC_0            , TO(3)         ,
    TO(2)    , KC_Q         , KC_W         , TD(TD_E)     , TD(TD_R)     , TD(TD_T)     ,                                          TD(TD_Y)      , KC_U         , TD(TD_I)     , KC_O         , KC_P            , KC_GRV        ,
    KC_MINUS , LGUI_T(KC_A) , LALT_T(KC_S) , LSFT_T(KC_D) , LCTL_T(KC_F) , TD(TD_G)     ,                                          TD(TD_H)      , RCTL_T(KC_J) , RSFT_T(KC_K) , RALT_T(KC_L) , RGUI_T(KC_SCLN) , LT(1,KC_QUOT) ,
    KC_EQL   , TD(TD_Z)     , TD(TD_X)     , TD(TD_C)     , TD(TD_V)     , TD(TD_B)     , KC_LNG1      ,          KC_LNG2        , TD(TD_N)      , KC_M         , KC_COMM      , KC_DOT       , KC_SLSH         , LT(2,KC_BSLS) ,
    KC_MEH   , KC_APP       , XXXXXXX      , XXXXXXX      , LT(3,KC_ESC) , LT(2,KC_SPC) , LT(1,KC_TAB) ,          LT(1,KC_ENTER) , LT(2,KC_BSPC) , XXXXXXX      , XXXXXXX      , XXXXXXX      , KC_PSCR         , KC_MEH
  ),

  [1] = LAYOUT_universal(
    TO(0)   , XXXXXXX  , KC_PEQL , KC_PSLS , KC_PAST , KC_NUM  ,                                 XXXXXXX    , XXXXXXX    , XXXXXXX     , XXXXXXX , XXXXXXX , TO(0)   ,
    TO(0)   , XXXXXXX  , KC_P7   , KC_P8   , KC_P9   , KC_PMNS ,                                 XXXXXXX    , A(KC_LEFT) , A(KC_RIGHT) , XXXXXXX , XXXXXXX , TO(0)   ,
    XXXXXXX , XXXXXXX  , KC_P4   , KC_P5   , KC_P6   , KC_PPLS ,                                 C(KC_W)    , KC_BTN1    , KC_BTN3     , KC_BTN2 , XXXXXXX , XXXXXXX ,
    XXXXXXX , XXXXXXX  , KC_P1   , KC_P2   , KC_P3   , KC_PENT , XXXXXXX ,            XXXXXXX  , C(S(KC_T)) , KC_PGUP    , KC_PGDN     , XXXXXXX , XXXXXXX , XXXXXXX ,
    XXXXXXX , XXXXXXX  , KC_0    , KC_PDOT , KC_PCMM , XXXXXXX , XXXXXXX  ,           XXXXXXX  , KC_DEL     , XXXXXXX    , XXXXXXX     , XXXXXXX , XXXXXXX , XXXXXXX
  ),

  [2] = LAYOUT_universal(
    TO(0)   , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX ,                                 XXXXXXX , KC_INS   , KC_SCRL , KC_PAUSE , XXXXXXX , TO(0)   ,
    TO(0)   , KC_F1   , KC_F2   , KC_F3   , KC_F4   , XXXXXXX ,                                 XXXXXXX , KC_HOME  , KC_END  , XXXXXXX  , XXXXXXX , TO(0)   ,
    XXXXXXX , KC_F5   , KC_F6   , KC_F7   , KC_F8   , XXXXXXX ,                                 KC_LEFT , KC_DOWN  , KC_UP   , KC_RGHT  , XXXXXXX , XXXXXXX ,
    XXXXXXX , KC_F9   , KC_F10  , KC_F11  , KC_F12  , XXXXXXX , XXXXXXX  ,            XXXXXXX , XXXXXXX , KC_PGUP  , KC_PGDN , XXXXXXX  , XXXXXXX , XXXXXXX ,
    XXXXXXX , KC_F13  , KC_F14  , KC_F15  , KC_BSPC , KC_SPC  , KC_ENTER ,            XXXXXXX , KC_DEL  , XXXXXXX  , XXXXXXX , XXXXXXX  , XXXXXXX , XXXXXXX
  ),

  [3] = LAYOUT_universal(
    TO(0)   , XXXXXXX  , XXXXXXX , XXXXXXX  , XXXXXXX  , XXXXXXX  ,                              XXXXXXX , XXXXXXX    , XXXXXXX    , XXXXXXX , XXXXXXX , TO(0)   ,
    TO(0)   , KBC_RST  , XXXXXXX , CPI_D1K  , CPI_I1K  , XXXXXXX  ,                              XXXXXXX , KC_LBRC    , KC_RBRC    , XXXXXXX , XXXXXXX , XXXXXXX ,
    XXXXXXX , KBC_SAVE , XXXXXXX , CPI_D100 , CPI_I100 , XXXXXXX  ,                              XXXXXXX , S(KC_9)    , S(KC_0)    , XXXXXXX , XXXXXXX , XXXXXXX ,
    XXXXXXX , XXXXXXX  , XXXXXXX , SCRL_DVI , SCRL_DVD , XXXXXXX  , RESET ,            EEP_RST , XXXXXXX , S(KC_LBRC) , S(KC_RBRC) , XXXXXXX , XXXXXXX , XXXXXXX ,
    RESET   , XXXXXXX  , XXXXXXX , XXXXXXX  , XXXXXXX  , KC_SPC   , XXXXXXX ,          XXXXXXX , KC_DEL  , XXXXXXX    , XXXXXXX    , XXXXXXX , XXXXXXX , XXXXXXX
  ),
};
// clang-format on
#pragma once

#define TAPPING_TERM 170
#define IGNORE_MOD_TAP_INTERRUPT

#ifdef RGBLIGHT_ENABLE
#    define RGBLIGHT_EFFECT_BREATHING
#    define RGBLIGHT_EFFECT_RAINBOW_MOOD
#    define RGBLIGHT_EFFECT_RAINBOW_SWIRL
//#    define RGBLIGHT_EFFECT_SNAKE
#    define RGBLIGHT_EFFECT_KNIGHT
//#    define RGBLIGHT_EFFECT_CHRISTMAS
#    define RGBLIGHT_EFFECT_STATIC_GRADIENT
//#    define RGBLIGHT_EFFECT_RGB_TEST
//#    define RGBLIGHT_EFFECT_ALTERNATING
//#    define RGBLIGHT_EFFECT_TWINKLE
#endif

#define TAP_CODE_DELAY 5

もうかなりの長い間これで固まっているので、一つの到達点になってそう。 キーマップ以外のカスマタイズでは指の配置のクセ上誤爆しやすい位置のキースイッチを重くしたりはしました。ピッタリ誤爆しなくなって満足。

keyball最高!!!!完全無線バージョンもほしい!!!!!!!!!!!!

スターフェスティバル株式会社に入社していました

shishi.hatenablog.jp

この記事からまた何社か変遷しまして、

会社
前々職 GMOペパボ株式会社
前職 株式会社如月システム
現職 スターフェスティバル株式会社

となっております。

前職は友人と数名のみで構成されていた会社であるため、ご存知のかたはいらっしゃらないかと思います。

現職で試用期間が過ぎ、クビにならなかったためこの記事を書いています。

現職ではRubyを全く使わず、TypeScriptしか書いていません。分かっていたことなのでそこに不満はないのですが、別の言語もやりたいなあと思っています。

気付くと前々職が最後に仕事でRubyを書いていたときでしたね。OpenAIのAPIで遊んでみたときにRubyを使ってみたりしたのですが、うおおおお楽しいいいいいいってなってました。

十分にレベルの高い同僚に囲まれ、日々教えを請いながら今までと毛色の異なる業務ができて、この歳ながらいちプログラマーとして未知と戦うことが許されており嬉しい限りです。

とはいえいただいている給料からしてもこのままゆっくり知らないドメインとの戦いばかりをしているわけにもいかないとは分かっていて、グランドデザイン的な設計にも今後取りくんでいかねばなりません。設計としても今までやってこなかったデータ指向なデザインなため、直接的に今までのウェブ回りの経験を活かすというより、モデリングの慣れを活かしていくことになりそうです。

同僚が優秀なので、自分が間違っても誰かが指摘してくれるという安心感があり、とりあえずやってみるかってノリでやっていこうと思っています。

他の会社のお手伝いは引きつづき他の時間にやっていて、今は現職とどちらに入社させてもらうか最後まで悩んだ会社さんを手伝わせてもらうことになっています。こちらは自分の得意領域を直接活かせそうなお仕事。

2022-8-6 Keyball61のキーマップ

shishi.hatenablog.jp

shishi.hatenablog.jp

Keyball61のキーマップの記録。

基本的にはErgodoxでQMKには慣れていたし、レイアウトやキー数も似ているし、Home Row Modという、ホームポジションに修飾キーを配置するという考え方も踏襲しているのであまり変更はしていません。

やはりトラックボールが付属しているというKeyball最大の特徴からポインタ操作をだいたいホームポジションから手をずらさずにできるようになってとても快適。だらっと操作したいときは今まで使っていたトラックボール

www.kensington.com

を相変わらず使っています。

だいたいのキーにTap Danceを設定してあってこの部分だけの画像はあまり意味ない気もする…せっかく好きなようにキーを配置できても修飾キーの位置がそのままって人は多くて、変えてみてほしいなあと思います。

github.com

Gateron の Yellow Milkというキースイッチがなかなか良い

shishi.hatenablog.jp

先の記事のkeyball61に合わせて新しいキースイッチをそろえることにしました。最近はファクトリールブという最初からルブされたものが人気のようでそのような商品が多いです。買ったのはこちら。

talpkeyboard.net

今まではZilient V2というスイッチを愛用していて、その静音性や打鍵感が気に入っていたのですが、今度はもうちょっとコトコト感が欲しくなり、Gateron CAP V2 Milk Yellow を買うことにしました。あまり一般的な色のラベリングではありませんが、商品映像と押下圧を参考にこちらにしました。

結果としては結構気にいっていて、茶軸などほどのうるささもなく、適度に打鍵音とコトコト感が得られています。ピンク軸になると打鍵感がおもしろくないと思っていたのでその中間みたいなところでしょうか。同じ感触が得られるなら押下圧45gともっと軽いものがあれば試してみたいぐらいの感じです。今までのZilentが重めのスイッチだったこともあり全然重くは感じないのですが。

ホットスワップで気軽にスイッチが変更できるとスイッチをポンポン変える楽しみもあるので、キースイッチをホットスワップできるキーボードはおすすめです。

keyball61というキーボードを買った

keyball61というキーボードを買った

プログラマの9割はキーボードから手を離さずにマウスを操作できないものかと考えたことがあるかと思います。僕も過去には視線追跡でなんとかならないかとか、ペンタブでやったら楽なんじゃないかとか試行錯誤してきましたが、今回はキーボードとトラックボールを一体化した分離キーボードとして注目していた keyball61 を買いました。

自作キーボード界隈はもちろんはんだづけなど自作スキルが求められますが、こちらには設計・販売の方による組立サービスも提供されており、僕は迷わずお願いしました。右利き用、左利き用、LEDの取り付けなど色々対応していただけます。

Ergodoxと数キーしか変わりませんが、ひとまわり小さくなり、コンパクトなサイズです。左右どちらでもPCと接続することができたり、僕はしませんでしたが、親指の部分だけをロープロファイルにすることができたりと、細かい心配りのあるキーボードです。リストレストがないとやはりボール部分が気になりますが、リストレストがあれば手の小さな僕でも手に隠れてほとんど気になりません。

類似品としてはUltimate Hacking Keyboardがありますが、トラックボールなどのポインティングデバイスの操作に難がありそうな小さいものであったこと、QMKに対応しておらず、カスタマイズ性が低そうなことがありました。

QMK

QMKは汎用のキーボードファームウェアです。多くのキーボードに対応しており、自作キーボード分野においてはデファクトスタンダードなものと思います。Ergodoxで導入して以来、すっかりこれがなくてはいけないようになってしまいました。省スペースなキーボードを使う人においては複数の機能をひとつのキーで実現することが当然必要になりますが、QMKではあらゆる配置を変えることはもちろん、複数の機能をおさめるためのレイヤ機能、タップダンスという連打の回数などによって出力キーを変えたり、キーボードに保存可能なマクロ、コンボキーなど、もうなんでもできるに近いものがあります。

今後購入するキーボードは分離キーボードであることとQMKへの対応は必須であると考えています。

REMAP

そのQMKを用いてカスタマイズする具体的な方法はいくつかありますが、keyball61はREMAPというウェブサービスからカスタマイズすることが可能です。

remap-keys.app

keyballで初体験しましたが、スムーズすぎて自作キーボード界隈の進化に驚きました。細かい設定ができなかったり、キーマップをエクスポートしておきたいというような要望はありますが、ほとんどの人の希望をこれだけで満たせると思います。

ただ僕の常用しているQMKの設定はREMAPからは設定不能、というよりREMAPが依存しているVIAが対応していない設定が必要であったため、従来のQMKをビルドする環境が必要になりました。

ErgodoxとOryx

configure.zsa.io

Ergodox EZはサポートが充実しているため、QMKの汎用ツールを使うことも可能ですが、専用のツールがいくつかあります。そのため販売もとによる専用のツールでファームウェアGUIで設定可能、ファームウェアflashGUIで可能です。基本的にErgodox使用時はこちらのツールに依存していましたが、QMKのビルド環境を自分で用意したこともありました。今回改めて環境を用意したところ、はるかに便利になっていると感じました。今はWindowsでも何も困ることなく環境を用意できます。

ビルド環境はQMK公式のビルド環境であるQMK WSLがあり、

qmk.github.io

ビルドしたファームウェアflashするのにも公式のQMK Toolboxですぐです。

github.com

以前はなんだかんだと困った記憶があったのですが、とてもスムーズで驚きました。あとはドキュメントを参照しながらこつこつ 'keymap.cconfig.h を編集するだけです。

Tap Dance

REMAPでできなくて必要だった設定はいくつかありますが、QMKの特徴的な機能のひとつにTap Danceがあります。

docs.qmk.fm

キーの連打やホールドで出力するキーを変えることができるという省スペースキーボードの使いこなしに大きく関わる機能です。連打などで変えることができるだけであって実際は任意の関数をはさめるのでなんでもできます。 僕 Ctrl-[hoge] をワンキーでやるためや各種かっこの出力に使っています。

最後にキーマップを貼っておきますが、チートシート出力に使わせてもらったREMAPが対応していないキーは全て任意キーコードとして表示されてしまうためちょっとわかりにくいです。この問題も自前でビルドすれば任意の方法で保存できるので、Githubで管理できるのも自前ビルド環境の良いところですね。

github.com

ストレスレスチェアショールーム大阪に行ってきた

PC作業には後傾するほうが良いというのは3年前にクルーズ&アトラスを買う前から思っていたことなんですが、最近はさらに後傾にしたくて、足の裏を床につけるよりオットマンに放りだすのが自然な姿勢になりたいと思っています。後傾姿勢をサポートするものはいまだ少なく、たまに新しい商品がないか検索しては今のクルーズ&アトラスで限界かと思っていました。

shishi.hatenablog.jp

後傾姿勢というとまず上記記事でエンジニア座りとして言及している座り方が腰に問題だと言われることがあります。他にも仙骨座り、社長座りなど様々な言い方があります。どれもヘルニアや、さらに車椅子などでは褥瘡の原因にもなるとされています。

shinkoiwa-shisei.com

carenote.jp

どれも圧力のかかり方が問題であることが言及されています。

一方、オカムラの研究では後傾のほうがPC作業に向くとされているようです。

www.okamura.co.jp

また、基本的にワーキングチェアがサポートする前傾姿勢というのは立位などより腰にかかる負担が高いことも分かっています。

つまり、圧力のかかり方に問題ないように後傾で座れれば理想のようです。

本題に戻ると、ワーキングチェアの範疇で探しているからだめだったのだということを以下の記事で理解しました。

r7kamura.com

椅子を飛びこえて介護用ベッドしか選択肢はないか…?と思っていたぐらいだった自分にとっては結構な青天の霹靂でした。以前に天井付近にディスプレイつけてみたこともあって、完全に寝っぱなしになると不健康具合が上がりすぎて良くないと理解していたこともありました。

そういう経緯でストレスレスチェアを調べてだいたいの買いたい商品の検討をつけ、大阪のショールームに行ってきました。大阪駅至近でアクセス便利。

上記記事の影響もあって、ストレスレストーキョー、もしくはオフィス向きとされているもので低座に向いてそうなストレスレスメトロオフィスというのを目当てにしていきましたが、ショールームにあったほぼ全ての椅子に座らせてもらって一番の候補としたのはストレスレスレノクラシックというリラックスチェアでした。

shop.stressless.com

ストレスレストーキョーにはキャスターのついてるバージョンもあったのですがこちらはなし。ただ話に聞いてみたところではこの脚部にキャスターを付けて使われる方もいらっしゃるとか。

当然ながら後傾すると普通は目線も持ちあがります。しかし首はヘッドレストにもたれつつ自然に目線は前に残したいと思っていたところ、自分の座った感触だとそれができるのがストレスレストーキョーとこのストレスレスレノでした。店員さんは「頭を残す」と表現されていました。そういう言い回しをするものなのかもしれません。そのうち、ストレスレストーキョーのほうが首の角度が若干持ちあがりすぎる感触があり、店員さんにもそれを指摘されました。あとひじかけ部がストレスレスレノの方が心地良く、しかも大きいので、これはErgodoxを加工なしでそのまま乗せられるぞ…となったこともポイントでした。手を前に伸ばすのも不自然な姿勢といえばそうなので、できるだけ体に近づけたい。

デザインとしてもストレスレストーキョーのほうがスッとしてかっこいいというのもあったのですが、ストレスレスレノは昔からの代表作品ということで、デザインとしては少しもっさりとしたところがあるものの、座ってみてやはりこちらを選ばれる方も結構いらっしゃると説明されました。

その後座面の高さの計測や搬入の際の問題など、訪問した甲斐のあることを教えていただき、直接販売はしていないとのことだったのでパンフレットをもらって帰りました。ちなみに大阪のショールームはオープンして1年目だそうです。仕事で使いたいという方はあまりいらっしゃらないということでした。現在東京のショールームは移転による閉鎖中で大阪のものが日本に唯一のショールームなので興味のあるみなさんも是非行ってみてください。座ってみてイメージがよりしっかりしました。

なおストレスレスレノの方が良さそうと言っておいてなんですが、ストレスレストーキョーオフィスは現在キャンペーン中だそうです。めちゃくちゃお得。

ストレスレストーキョーオフィスキャンペーン

そして今まで何度かあったそうなんですがこんなイベントも近々あるそうで、そこで購入を決めてしまうか中古を検討するかで今迷っています。

sale.heyagoto.com

ワーキングチェアで叶えられない要望ならワーキングチェアじゃなくせばいいじゃないというのは良い発想の転換でした。

「Zero2Production」 を読んだ

shishi.hatenablog.jp

www.zero2prod.com

読んでいるという記事を書いたのが1年前という衝撃。

段階的にリリースされる形態なので、1年前の状態からは結構変わったはずだけど、それにしても途中でずっと数学を勉強していた期間があったりエルデンリングをずっとやっていたりして時間がかかってしまいました。

今でも修正などが加えられているけども、今冬ぐらいにエピローグまで書かれた当初の本書完成版がリリースされた。当時と変わらず今でも上記記事の通り、Rustのウェブサービスを提供するための教材としては一番良くまとまっていると思います。 ほとんどの使用ライブラリのメジャーバージョンに追従できていて、段階的リリースしていた良い部分だと思います。特に actix-webtokio への対応で大幅に変化しました。対応前から書かれていて追従しているのはすごいことと思います。 実装するだけならば気にすることのない基本までさかのぼって解説することもあり、丁寧さは感じられました。

不満点として一番なのはテスト方法ですね。利用フレームワーク標準に則りにくいとして別の方法をとるのは良いとしても、変則的な方法であることを説明しなかったり、途中に後で解説するとしていた部分を説明しなかったり… 次には後になればなるほど説明が雑になる傾向があるところです。ものを作るときには最初の気合が持続しないというのは良くあることですが、最終版を早く出したくてプレッシャーもあったのかもしれません。解説の丁寧さが全然変わってしまっています。 たびたび解説のためとは言ってますが、本書での最終例が実際には採用したくない実装例もあり、そのままプロダクトで真似をして困るということもありそうです。

あとは個人的な英語力の都合で、イギリス英語の言いまわしや語彙の理解に思考を持っていかれることがありました。

不満点はあっても圧倒的に値段以上のものは得られましたので、ウェブサービスをつくるためにRust学習の教材を探しているみなさんは是非読んでください。