2018年のキーボードを振り返る

この記事は、OpenStream Advent Calendar 2018 の2日目の記事です。昨日は miyatay さんの CognitoxAlexaアカウントリンクが大変だった話 でした。 さて、本当はOCamlの話を書きたいところでしたが、ぶっちゃけネタがなかったので、今年いろいろ進展があったキーボードや日本語入力まわりについて書こうかと思います。 <!–more–> プログラマーとして一番良く触るものは何か?と聞かれた時、大半の方はまず キーボード と答えると思います。もしかしたらマウスのほうが触っている時間が長い、という方もいるかもしれませんが。一日の大半をともに過ごすキーボードは、PCとのインターフェースでもあります。そんなキーボードについてちゃんと考えることは重要ではないかと思うんです。 道具にこだわるのは2流、とか言う意見 私も割といろいろキーボードを変えたり買ったりしていました。今まで買ったキーボードを古い順に時系列で並べると、こんな感じになりました。 HappyHackingKeyboard Pro Realforce Kinesis Ergodox EZ * 2 Iris Crkbd Ergodox EZが×2になっているのは、家用と仕事用に買ったからです。こう見ると結構買ってますね。 最近はあまり聞かなくなりましたが、少し前は、常駐先とかで配られるキーボード以外を使っていると、 なんでキーボードなんかにお金かけるの? と言われるときもありました。これは、道具に拘泥するな、という意味で言っていたと思います。 直近で書いた記事にも書きましたが、最近はつぎのように考えています。 仮にもプロフェッショナルなのであれば、自分が一番良く使う道具にお金をなんでかけないの?と逆に聞きたいです。スポーツでも職人でも、自分が使う道具は、自分の性能を100%発揮できるように調整したり変えたりするはずです。 弘法筆を選ばず かもしれませんが、弘法が自分で選んだ筆を使ったほうがいいものを書ける確率が上がるのは自明でしょう。 自作キーボードが増えてきた 今年は特に、日本での自作キーボード熱が盛り上がった年だと思います(個人の観測範囲では)。その理由としては、よく言われるように次のような要因が上げられると思います。 QMK Firmwareが事実上のデファクト化、高機能化 個人がPCBなどの設計をある程度気軽に行える環境が整ってきた 3Dプリンターやレーザーカッターを利用するハードルが下がった 個人販売をサポートするプラットフォームがある程度充実してきた 今年私が作った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キーしか無いキーボードでも、 ...

December 2, 2018 · derui

関数型と手続き型の違い

ふととあるところで、 関数型に書かれていない みたいな記述を見つけました。このときなんかモヤっとしたんですが、うまく言語化出来なかったので、ちょっと書いてみます。 <!–more–> まず始めに観測する 関数型 とか 手続き型 と言いますが、一体どういう基準で話しているかは、書き手・話し手に依存するようです。ただ、ある程度一貫しているのは 関数型という場合、多くの場合は関数がファーストクラス 手続き型という場合、低レイヤーな言語で書かれているようなものを指しているケースが多い 稀に、関数型言語と手続き型言語という感じでの使い方もされる様子 関数型言語としてはHaskell/Lispなど 手続き型言語としてはC/昔のJavaなど くらいのようです。私の観測範囲が狭すぎるのであれですが・・・。 関数型の書き方とは? Java7から8になったタイミングでよく言われたのは、 Project Lambda によって導入されたLambda式でした。私もご多分に漏れずよろこんで使っているわけですが。ただ、これはJavaという言語が関数を言語のファーストクラスにした、という意味ではなく、単純にあまりに冗長だった無名インターフェースを簡単に書けるようにした糖衣構文です。 例えばこういうのが Thread thread = new Thread(new Runnable() { @Override public void run() { ... } }); こうなります。 Thread thread = new Thread(() -> {...}); どう見ても後者の方が圧倒的に短いです。ですが、これは単に () -> {} が、 Runnableインターフェースの run メソッドの実装として扱われているだけです。IntelliJとかであれば、RefactorだったかSourceから、糖衣構文にした場合としない場合にそれぞれ変換できますので、やってみるとわかりやすいです。 同じくJava8で入った Stream は、このLambdaを使い倒して貰おうというのが明白なインターフェースをしています。大抵、このStreamとLambdaを組み合わせて書いたものを関数型的というケースが多いようです。 何がモヤッとするのか 一応今までに Haskell や Common Lisp、 OCaml(公式が表示されなかったので日本版) を触っていますし、OCamlは今も継続して使っています。Javaは仕事で大量に書きましたし、JavaScriptも大量に書いています。C/C++も普通に使っていました。それぞれ、関数型言語と言われたりオブジェクト指向言語であったり、手続き型(C++はあれですが)言語と言われていたりします。 そんな中でモヤっとするのは、 見た目だけで関数型かどうかは決まらないのに、スタイルで語るのはなんか違うのでは無いか と最近思ったりするからです。試しにやってみるとわかりますが、Stream + Lambdaで調子に乗ってベタ書きすると、すぐに再利用不可かつ、for文で書くよりも可読性の悪いものが出来上がります。 関数型と手続き型の狭間 では実際に、私の思う手続き型と関数型の違いをコードにしていってみます。ここでは私が一番Loveな言語であるOCamlを使います。 let () = let num = ref 12345 in let buffer = Bytes.make 5 ' ' in for i = 5 downto 1 do let n = !num mod 10 in let v = match n with | 1 -> '1' | 2 -> '2' | 3 -> '3' | 4 -> '4' | 5 -> '5' | _ -> assert false in Bytes.set buffer (pred i) v; num := !num / 10 done ; print_string (Bytes.to_string buffer) 12345 という数字を "12345" という文字列にするのを、ものすごく冗長に、かつrefや副作用バリバリで書いてみました。OCamlにはwhileもありますが、ここではforを使いました。OCamlでforを使ったのは初めてです。 ...

September 18, 2018 · derui

ブログをHugo + Netlifyで作りました

今まで放置しっぱなしだったはてなダイアリーが終了するというニュースを受けて、個人ブログ移行の問題が出てきました。 はてなブログに移行する、ということも考えました。しかし、ちょうどブログについて考えていたところだったので、過去を振り切って新しく作ってみました。なんか独自ドメインもあったので。 <!–more–> 移行時に重視した点 いざ移行を考えた時、以下のようなフローでやってみたくなりました。 Githubにpushしたら公開される ブログの内容が全部公開されるけども、そもそも公開してるので気にしない 独自ドメイン+HTTPS Hugoで生成 出来ればorg-modeで書きたい 最後は願望でしたが。 利用したツール/サービス このブログを作成するにあたり、以下のサービス・ツールを利用しました。 Hugo テーマとしては hugo-nuo を使わせてもらいました ox-hugo Netlify Github これは前提ですが なお、執筆環境は基本的にEmacs一択です。 ox-hugoからのexport ox-hugoは、 org fileをmarkdownにexportするbackend です。backendとは、Org modeにおいてorg fileを変換するための処理みたいなものです。 とにかく、markdownを生成するものなので、Github上には .org と .md の両方のファイルがcommitされていきます。これは、仮にOrg modeを利用しなくなっても、markdownをそのまま書けばいい、ということでもあります。この点を鑑みて、リポジトリの容量については一旦置いておくことにしています。 執筆フロー Org modeで書く TODO を付けてdraft化 draftになっている間は、pushしても表示はされない(はず) 保存すると自動的にox-hugoがmarkdownに変換 ローカルで確認 書き終わったら DONE にしてcommit/push というフローでやっていきます。 決めかねてる点 Hugoだと基本的に posts/<ファイル名> 、という形式になるようですが、個人的にはいつ書いたか?をURLに入れておきたいです。 ただ、色々な人の構成を見ている限りでは、日時はHugoに任せて、タイトルだけにしているケースが多いようでした。郷に入れば郷に従え、ということでとりあえず従っておきますが、なんかモヤモヤします。 所感 Qiitaの方はmarkdownで書いている+Webから登録する方が色々楽ということで、あっちはあっちで書いていきますが、こっちも充実させていければと思います。

August 30, 2018 · derui