aoiro’s blog

勉強を兼ねて記事を書きます

突然自作キーボードにハマりHelixとHelix Picoを作った話 その3: キーレイアウト編

Helix Picoのキーボードレイアウトの話

Helixを作った話はその1
Helix Picoを作った話はその2


背景

Helix Picoを作って使い始めたはいいが、せっかく自作キーボードを作ったのだから親指の位置にEnter, Backspaceを入れたかった。

Helix Picoのデフォルトレイアウトは一般的キーボードに合わせた作りになっており、あまりやんちゃしていないので、自分で作ることにした。 github.com


作ったレイアウト

github.com

せっかくだからHelix Picoについてたキー配列カードを参考に印刷用のレイアウト画像も作った

Qwertyはこんな感じ f:id:aoirohn:20181202201649j:plainf:id:aoirohn:20181202201653j:plain

他のレイアウト


考えたこと

  • いつもMacでやっている通りCtrlとEscapeはUS配列のCaps Lockの位置に置きたい
  • 親指でEnter, Backspace, Command, 英数, かなを押したい
  • あわよくばRaise, Lowerキーも親指で押したい
  • Tab, Deleteも親指に入れられればいいな
  • 右手に単体の矢印キーを置きたい
  • でもあわよくばホームポジションから右手を動かさずにQwertyのHJKLでカーソル動かしたい

細かい話

Modifierキー

  • Esc/Ctrlは単体で押すとEsc, 長押しするとCtrlになる
  • MacのEISU/⌘ は単体で押すと英数、長押しでコマンド。KANA/⌘は「かな」とコマンド
  • MacのHENK/Alt は単体で押すと変換、長押しでAlt。MHEN/Altは無変換とAlt
  • Tab/Lowerは単体で押すとTab, 長押しでLower切り替え
  • Enter/Raiseは単体で押すとEnter, 長押しでRaise切り替え

IME切り替え

WindowsIMEを切り替えるにはAlt + `を入力しなければならない。 デフォルト配列等では独自のキーを定義してWindowsMacで違うキーコードを入力できるようにしているが、QMKで長押し等でキーを切り替えるLayer SwitchingやModifiersの機能では独自キーが使えない?ようだったのでWindowsMacのレイヤーを分けた。

WindowsではIME切り替えキーの代わりに変換、無変換キーのコードが押されるようになっている。 IMEの設定で変換にIME ON, 無変換にIME OFFを入れることでMac同様の切り替えができる。(ただし、OS側でキー設定をしなくても同じように使えるという利点はなくなってしまっている)

Space, Backspace

SpaceキーとBackspaceキーには長押ししたときにキー配列を割り当てないようにしている。 他の人のレイアウトを見ていると親指にSpace, Backspaceを配置しているものが多いのだが、長押しに他のキーを割り当てると、Space, Backspaceを長押ししたときに連続入力ができない。個人的にこの2つのキーは連続入力したいことが多いので、長押し機能は入れないようにした。

Raise, LowerレイヤーのSpaceキー位置にはShift+Spaceを入れた。あんまりやっている人はいないが、変換時に変換候補の選択を戻るのに便利。 これはおすすめしたい。

矢印キー

右手だけでカーソル操作できるように単体の矢印キーを右手右下位置に置いたが、LowerレイヤーのHJKLでもカーソル移動ができるようにした。やはりホームポジションVim同様にカーソル移動できるのは便利。 (もしDovorakやEucalyn配列にしてもvimホームポジションでカーソル移動できる)

Menuキー

Windows用にレイアウトにMenuキーを入れたのだが、Macには該当するキーがないので入れるキーに困った。 特に入れるキーもなかったので最終的にCtrl + ⌘にした。一応Ctrl + ⌘ + Spaceで絵文字入力が簡単にできる。


まとめ

右手は矢印キーを入れたことでキーに余裕がないのに対し、左手はキーが有り余って入れるキーに困ってしまった。

まだ納得行って無い部分も多いがある程度満足できるレイアウトが作れた。とりあえずはこれで使って行きたい。

突然自作キーボードにハマりHelixとHelix Picoを作った話 その2

Helix Picoを作った話

Helixを作った話はその1


Helixを作っていつも通りAの左のキーをEsc, Ctrl, 矢印キーに変えていた頃だった

天下一キーボードわいわい会なるものが開催されることを知った。 connpass.com

会自体は残念なことに定員が一杯だったりでTwitterで見守ることしかできなかったのだが、会場でHelix Picoが売られているという情報を入手した。

「これは週明けに遊舎工房でも売られるパターンでは🤔」と思い監視していたら、本当に在庫が復活していたので一瞬でカートに入れた。

Helix Pico (LED付き) を作る

買ったのはHelixPico キーボードキットの蛍光グリーン。その他、スイッチは赤軸、キーキャップは白の刻印キーキャップを買った。

更に、前回のHelixでうまく実装できて調子に乗っていた自分はHelix PicoにもLEDをつけることにした。

工具について

工具は前回と基本的に同じ。今回はリードベンダーが滅茶苦茶活躍した。使い方がわからなかったけどググったら公式の動画があった。

組み立て

組み立て方の説明書が入っていて簡単だった。 やっぱりHelix Picoを最初に作るべきだったのでは?と何度か思った。

以下、気をつけるところ

MOGE対策

Helixの二の舞とならないよう最初に端子を接着する。大事。最初にやった。 f:id:aoirohn:20181119222432j:plain

LEDはダイオードより先につける

Helixではダイオードを先につけたが、Helix Picoではダイオードは表面側にくるので先にLEDを付ける必要がある。

f:id:aoirohn:20181119223011j:plain

ダイオードとLEDをつけた後の図。ダイオードは表側だがLEDは裏から実装するので先にLEDをつけたほうが良い。 f:id:aoirohn:20181119223154j:plain

今回も240℃くらいで実装したけど大丈夫だった。途中で間違って4つ270℃ではんだ付けしてしまって1つ壊れた。*1

完成

かわいい f:id:aoirohn:20181119223825j:plain

とてもかわいい f:id:aoirohn:20181119223931j:plain

結論

LED付きHelix Picoかわいいしコンパクトだし簡単だしおすすめ!

次はキーボード配列について書きます。

*1:240℃なら絶対壊れないと言っているわけではないです

突然自作キーボードにハマりHelixとHelix Picoを作った話 その1

きっかけは何だったか忘れたけど8月くらいに自作キーボードのことを知った。

その時は電子工作ほぼやったことないしいいやと思っていたのだが、Qiitaで自作キーボード記事がバズっていたのを見て作ることを決意した。 qiita.com

実装が簡単と言う点でHelix Picoが気になったのだが、残念なことに売り切れで買うことができなかった。

その後定期的に在庫を見ていたのだが復活しなかったので代わりにHelixを作ることにした。Helixも売り切れてて10月中旬発送の予約のみだったのだが、10/15に頼んだら次の日に発送された。

Helixが完成するまで

購入したのはアクリル5行版のバックライトのHelix組み立てキットである。キースイッチは赤軸にした。

電子工作は初心者もいいところだから、と言う理由でHelix Picoを買おうとしていたのに実装難易度の高いバックライトを買っているし、この時点ですでに道を踏み外している気がする。

とはいえ、一応電気電子工学科とか言ういかにもな学科出身だし、はんだ付けは大学で2回くらいやった*1ことあるし、何より半導体工学の評価は優であるという謎の自信があった。

電子工作工具について

自信はあっても電子工作は自分からしたことはないので工具を揃えるところから始めた。

以下のページを参考にした。これがなかったら絶対作れなかった。感謝。 キーボード自作、特に Helix キーボードキットの製作に最低必要な工具のメモ · GitHub

結局買ったものは以下の通り

買ったもの 概要
白光 ダイヤル式温度制御はんだこて FX600 みんな使ってるから買った。ちょっと高いけど不満はなかった。
白光T18-C2 こて先 2C型 コテ先の違いとかよくわからないけどおすすめされてたので。amazonで売り切れてたからヨドバシで買った。今見たらヨドバシのほうが安い。
白光(HAKKO) セラミックヒーターはんだこて専用こて台 クリーニングスポンジ付き 本当は金属ワイヤー式のこて先クリーナー買おうとしたけど予算の都合でこっちにした。一応別売の金属コテ先クリーナーがあるので今後欲しくなったら買うことにした。
グット 吸取線幅1.5mm長1.5m めっちゃ使いました。太めのやつも買っても良かったかも。安いし。
goot 両面プリント基板用はんだ 初心者は鉛フリーはんだは買うなとのこと
ホーザン(HOZAN) 先曲がりピンセット カーブタイプ 安かったからこれにした。ちゃんと先曲がってるやつ買ったほうがいい
エンジニア 卓上導電マット A4サイズ 買わなかったらはんだごてで机溶かしてた。大きさ的にもA4はちょうどよかった
goot ニッパー YN-10 初めて使ったとき感動した。そんなに高くないし良いニッパーだと思う
ARCHISS キートップ引き抜き工具 便利
精密ドライバー 適当に買った。プラスドライバの#0しか使わなかった。もっと適当なやつでも大丈夫だと思う
セメダイン ハイスーパークリア3 最初買ってなかったけど後で買うことになった。理由はお察しください。エポキシ系接着剤は絶対買いましょう
サンハヤト リードベンダー RB-5 作り終わるまで気づいてなかったのだけど、Helixを作る際は使わない。 Helix Picoを作るときには活躍した。
POWSEED デジタル マルチメーター イマイチ使い道がなかった。なくていいと思う。
ブレッドボード用ジャンパー線 デバッグ用に買ったけど使わなかった

Helix 作成

準備

組み立ては基本的に公式ビルドガイド見れば大丈夫です。 書いてあるけど、通しで全部読んでから取り掛かったほうがいい。自分は取り掛かるまでに2回全部読んだ。 github.com

その他参考にしたサイト:

これも作る前に全部読んでおいたほうがいい。

組み立て

f:id:aoirohn:20181118132126j:plain こんな感じで用意して制作スタート。

細かい組み立てに関しては上記サイト等にいろいろ書いてあるので省略。 以下、個人的に気をつけておいたほうがいいと思ったこと。

ダイオードが思ったより小さい

f:id:aoirohn:20181118132225j:plain 見て分かる通り、ダイオードが(LEDも)とても小さい。目が死ぬので拡大鏡とか用意しとけばよかった。

200℃でハンダが溶けない

LEDの実装は200℃以下ではんだ付けと書いてあるが、全然ハンダが溶けない。 仕方ないので240℃(FX600の270℃より一段階低い設定)で半導体工学の教授にお祈りしながらはんだ付けした。 結局LEDは一つも壊れなかった*2ので長時間はんだごてを当てたりしなければ大丈夫だと思う

LEDのはんだ付けはむずいけど頑張れ

これは自分のはんだ付けが下手なだけというのもあるけど、つけたLEDの半分くらいは4つあるはんだ付け部分のどれかが甘くて導通していなかった。

f:id:aoirohn:20181118133227j:plain 左手は最初2つしかつかなかったし、右手に至っては全く光らなかったので焦った。熱でぶっ壊れたかと思って絶望したけど、結局全部はんだ付けが甘いだけだった。

LEDが1つも点かなくても根気よくはんだ付けを修正しよう。 全部ついたときは涙が出た。 f:id:aoirohn:20181118133830j:plain

ちなみに左右接続に使っているケーブルはHelix作っている人がよく買っているっぽい ステレオミニプラグ オーディオケーブル、RAYWILL です。*3

キーボードのホームポジションについて

これは使い始めてから思ったが、キーキャップにホームポジションの突起が無いと打ちづらい。 ダイソーのUVレジンで突起を作ってみたら、簡単&触った感じもぷにぷにしてて良かった。 自分はEucalyn配列にしたのでTとIに突起を作った。 f:id:aoirohn:20181118140943j:plain

食卓では作るな

昼の2時から作り始めたら夜中までかかった。何も考えず食卓で作り始めたせいでまともなご飯が食べられず困った。作り終わった頃には頭がクラクラしたので食卓では作業しないほうが良い。 f:id:aoirohn:20181118133948j:plain OLEDの保護フィルム取り忘れてるけど 完成!!






したはずだった……

OLEDが壊れた

作って2日ほど放置していたら左手のOLEDがつかなくなった。分解していろいろ調査した結果、はんだ付け等の問題ではなく、OLED自体が壊れていそうだという結論に達した。

壊れたものは仕方ないので遊舎工房で単品で買おうとしていたときだった。

MOGEた😇 f:id:aoirohn:20181118135131j:plain f:id:aoirohn:20181118135221j:plain お亡くなりになった方々 f:id:aoirohn:20181118140006j:plain


ということで作り始める前に端子は必ず接着剤で保護しましょう

このあと滅茶苦茶接着した f:id:aoirohn:20181118140121j:plain

*1:中高ではやった記憶がない。周りは経験者ばっかだったので必修なのだろうか?だとしたらやったことになっている可能性もゲフンゲフン

*2:Helixの実装では。Helix Picoのときは1つ死んだ

*3:FX600のページの 「この商品を買った人はこんな商品も買っています」 の欄に出てきて笑った。他にも自作キーボード勢が買ってそうなもの多くて面白い

グループ化したGoogle Homeで時間になったら音楽を鳴らす

背景

Google Homeの二台目を購入してホームグループを作ったまでは良かったのだが、時間をトリガーにして音楽を流させようとしても1台のGoogle Homeでしか再生できなかった。 ということでホームグループに対して再生させる方法を調べた。

結論

ネットで検索すると真っ先にヒットするnode.jsのライブラリ、google-home-notifierではホームグループでの再生はできないのでpychromecastを使おう! *1

github.com

詳細

きちんと確認したわけではないけれど、Google Homeで音楽を鳴らしたり喋らせたりするとき、Google Homeのポート8080にアクセスすることで再生が始まる。しかし、グループに投げたいときはグループの親となっている(?)Google Homeの8080ではない特定のポートに対してアクセスしなければならない。

google-home-notifierでは使っているcastv2-clientか何かのライブラリがアクセスするポートを8080に固定してしまっており、グループのポートを指定できないためグループにキャストできない。たぶん。

この記事はただの定期実行だし、リスナー常駐させるほどじゃないなという方向けです。 外部からIFTTT等で喋らせたい場合は、同様にpychromecastを使っているgoogle-home-notifier-pythonを使いましょう。

github.com


必要な環境

  • Google Home 複数(グループ化しておく)
  • raspberry piなどのおうちハックできる環境
  • 音楽ファイルをおいておくためのローカルサーバー (raspberry piでも良い)

pychromecast インストール

  1. raspberry piにpython3環境を作っておきます
  2. pychromecastをインストール

    pip3 install pychromecast

音楽を鳴らすスクリプト

今回は曜日ごとに流す音楽を変えた

#### alarm.py ####

#!/usr/bin/env python3
#coding: utf-8

import pychromecast as pcc
import datetime as dt

chromecasts = pcc.get_chromecasts()
#print(chromecasts)

#再生するGoogle ホームの名前;グループ名でも単体の名前でもOK
chromecast_name = "ホームグループ" 
cast = next(cc for cc in chromecasts if cc.device.friendly_name == chromecast_name)

weekday = dt.datetime.now().weekday()

music_path = 'http://192.168.x.x/path_to_music_dir/';

if   weekday == 0: # mon
    music_path += 'Mon.mp3'
elif weekday == 1: # tue
    music_path += 'Tue.mp3'
elif weekday == 2: # wed
    music_path += 'Wed.mp3'
elif weekday == 3: # thu
    music_path += 'Thu.mp3'
elif weekday == 4: # fri
    music_path += 'Fri.mp3'
else:              # sat, sun
    music_path += 'Sat_Sun.mp3'

print(music_path)

cast.wait()
mc = cast.media_controller
mc.play_media(music_path, 'audio/mp3')
mc.block_until_active()

最後のmc.block_until_active()を忘れるとDefault Media Receieverがactiveのときしか再生されなくなるので注意

cronに登録

今回は朝家を出る時間に流してほしいのでcronで定期実行の登録をする

$ chmod 755 alarm.py
$ crontab -e

> 0 7 * * * /home/pi/path_to_dir/alarm.py

完成!


ということでgoogle homeのグループで音楽を流させる方法でした。 今回は音楽でしたが喋らせることも同様にできます。 ただしnode.jsのgoogle-home-notifierと違ってpychormecastでは一度音声を保存しないといけません。

そんなに難しくないので、やりたい方は同様にpychromecastを使っているgoogle-home-notifier-pythonの実装を参考にすると良いでしょう。

*1:Google homes are just chromecasts! らしい

「オブジェクト指向でなぜつくるのか 第二版」を読んだ

あまりいないと思うが、Objective-Cからプログラムに入り、今までC++Pythonなどの言語を使ってきた。オブジェクト指向の言語ばかり使ってきたせいか、オブジェクト指向について人に説明しようと思ってもうまく説明できない。加えて、そもそも自分の書いているプログラムは単にクラスを使っているだけのなんちゃってオブジェクト指向なんじゃないかという不安もあったので、オブジェクト指向以前のプログラムとの対比を含めて理解しようと思い立って読んだ。

感想

感想としては、オブジェクト指向プログラムの設計の指針となるような話題はあまりなく、これを読んでオブジェクト指向プログラミングの技術が上がるとかそういうことはないと思う。とはいえ、オブジェクト指向に至るまでの道筋について知れたのは良かったと思う。オブジェクト指向の背景を知ることで、他の言語(例えば関数型言語)と何が違うかを考えることができる下地ができるのではないかと思う。 また、個人的にはUMLなどの汎用の整理術やアジャイル開発に関しては触れたことがないので、そのあたりの手法を知る手がかりになったことと、それらの手法とオブジェクト指向との関わりを知れたのが良かった。

関数型言語について、怪しい黒魔術みたいなものだと思っていたのだが、オブジェクト指向言語とのつながりを知って親しみを感じる事ができた。そろそろ勉強してみたい。


覚書

その他思ったこと

他の人の感想を読むと結構辛辣なことが書いてあるのだが、あまり納得することができなかった(本の内容が正しいと思ったという意味ではない)ので書いておく。

d.hatena.ne.jp

プログラミングの歴史、理論、論文については正直全く知らないので、個人的に思ったことです。


たとえばC でも 翻訳単位をモジュールと見立てて、関数(サブルーチン)と変数を まとめたり、変数や関数の名前のスコープを限定したりすることは当たり前に出来て、「まとめて、かくす」は 普通にやっています。

クラスでは、変数と関数がクラスに属しているわけで、外部から呼び出すときもクラス名を書く必要がある。対して、C言語のexternで宣言されたグローバル変数や関数はその変数がどのモジュールに属しているかは、定義されているファイルを探して来ないといけない。 そういう意味で、Cのexternとオブジェクト指向の「まとめて、かくす」仕組みは違うんじゃないの?と思った。どちらかというとC++名前空間のほうがしっくり来る。

「まとめて、かくす」って言ってるけど、オブジェクト指向がそれまでの言語と違うのは「まとめる」方であって、「かくす」ことではないんじゃないかと個人的に思った。プログラム中で一つの単位として変数や関数のまとまりを扱えるということが重要なのだと思った。 実際Pythonとかだとprivateなインスタンスメソッドとか変数とかないし。カプセル化するときのカプセルが、透明で中が見えるものだろうが中の見えないものだろうが、どちらもカプセル化であって、オブジェクト指向にとって隠せる隠せないはどうでもいいんじゃないかと思った。


GOTO文があるからプログラムが解りにくいんじゃないです。だからGOTO文を排除しただけで(3大制御構造のみで記述しただけで)プログラムがわかりやすくなるんじゃないです。 GOTO文を廃止し、三大制御構造だけで制御フローを記述するのはなぜかというと、それはアルゴリズムを切り出して部品化を行う為です。

うーん、部品化を行うというのは、結局の所それがソフトウェアの抽象化に繋がり、人間にとってわかりやすいからではないのかな。 本には

プログラムを解りづらくしている元凶であるGOTO文を廃止

と書いてあるけれども、何が違うのかよくわからない。GOTO文が部品化を妨げるからプログラムを分かりづらくしている元凶であるというのは間違ってないんじゃないかと思った。

本の内容が正確ではないというのは、確かにそのとおりなのだろうとは思ったがもやもやする。

Boox Noteを買って1ヶ月経ったので使用感を書く

気になっていた電子ペーパー搭載のAndroidタブレット、Boox Noteが5月頭に日本でも発売された。

SKTさんのBoox note紹介ページ

前々から電子ペーパー電子書籍リーダーが欲しかったこともあり、SKTさんで発売されたその日に購入した。購入から約1ヶ月が経ったので使用感について軽くメモ程度に書く。詳しいレビューや写真は他の人のレビュー記事を見てほしい。

電子書籍リーダーとしての使用感

結論から言うと、電子書籍リーダーとしての使用感は結構いい。

まず、思っていた以上に軽い。Boox noteの本体重量は325gなので、スマホ2台分くらいしかない。SKTで買うとついてくるカバーを付けると流石に少し重みを感じるが、家の中で使う分にはカバーをつけなくても問題ない。

肝心のアプリの方だが、Kindleのほか、Perfect ViewerやCommitoNといった自炊本ビューワーも本にも寄るが結構サクサク動く。画面も大きいので、画面を横向きにして*1見開き表示にしても十分文字が読めるし、ページ送りも頻繁にしないですむ。 画面モードをA2リフレッシュモードにすれば、残像が残る代わりに描画時の色の反転が無くなるのでかなり快適にページ送りができる。

不満点としては、バックライトがないのが残念ではある。ベッドの上で寝転がって読もうとすると影になって読みづらいことが多々ある。 また、書籍全体が画像で提供されている大きめの本のKindle書籍(特に技術書)は動作が重いことがあり、画面の一部を拡大しようとしてイライラすることが多々ある。漫画とかなら大丈夫だと思う。

ノートとしての使用感

これは正直あまり期待しないほうがいいかもしれない。現状ではまともに使えるメモアプリがプリインストールしているメモアプリしかなく、正直あまり使う気にならない。一応pdfファイルになら、プリインストールのpdfビューアーを使えばメモできるが、あまり使う機会がなかったのでなんとも言えない。

ただ、筆圧検知やレスポンスは良かったので、使い方次第かもしれない。

その他

せっかくAndroid端末だし色々したいなーと思い、play storeで片っ端からアプリをインストールしていたら、かなりピッタリのアプリがあったので残しておく。

play.google.com

ナンプレである。

アプリがシンプルで軽いし、ネット環境不要だし、白黒で問題なく楽しめるナンプレ、完全に電子ペーパー端末のために作られたまである。

こういう新聞とか雑誌にもよく乗ってるパズルってよく考えたら電子ペーパーにもぴったりだよなーということで、今では毎日Boox noteでこういう古典パズルばっかりやっている。スリザーリンクとか楽しい。

*1:画面回転用アプリを入れる必要あり。play storeにある無料のもので十分使える

karabiner-elementsでcaps lockをescape, control, 矢印キーに変換する

背景

USキーボードのMacBook ProのTouch Barモデルを使っているのですが、escキーが無いので、caps_lock単体を押したときはesc、他のキーと組み合わせたときはcontrolになるようにしていました

これでそこそこ満足していたのですが、それに加えてcaps_lock + hjklキーでカーソル移動がしたくなったので設定を作りました

Karabiner-elementsの設定

以下の設定を~/.config/karabiner/karabiner.jsoncomplex_modificationsに記述します

caps_lockを単体で押したときはescキー。 hjklと組み合わせた場合は矢印キーに、その他のキーと押したときはcontrolになります

karabiner_complex_modification.json · GitHub

とりあえずcaps lockが押されたらcaps_lock pressedの変数を1にして、それ見て条件分岐するようにしました。 もっといい方法があれば教えてください

矢印キーへの変換がいらない人向け

caps lockを単体で押したときはescキーとして使い、他のキーと押したときはcontrolにしたいだけの場合は下のようにすれば十分です

{
    "description": "caps lockを単体で押したときに、escキーを送信する。 他のキーと押したときはcontrolにする。",
    "manipulators": [
        {
            "from": {
                "key_code": "caps_lock",
                "modifiers": {
                    "optional": [
                        "any"
                    ]
                }
            },
            "to": [
                {
                    "key_code": "left_control",
                    "lazy": true
                }
            ],
            "to_if_alone": [
                {
                    "key_code": "escape"
                }
            ],
            "type": "basic"
        }
    ]
}

参考

qiita.com

karabiner-elements-complex_modifications