Helixキーボードを組み立てた

f:id:horimislime:20180714180318j:plain

先月のHelixキーボードキット再販になんとか滑り込み、キーキャップ等の必要部品も届いて遂に組み立てられました。

準備

必要な部品は以下のものを揃えました。

キーキャップは微妙に数が足りないので、以前ergodox用に買って余っていたキャップを一部流用。

作業道具は キーボード自作、特に Helix キーボードキットの製作に最低必要な工具のメモ を参考に。お金をケチらずに最低限必要なものは全て揃えると無難そうです。最初テスターやフラックスは買わずに済まそうとしたけど、あとで困って買い足した…。

組み立て

helix/buildguide_jp.md at master · MakotoKurauchi/helix を読みながら、適宜組み立てた人のブログを見つつ作業。 レツプリ他自作キーボードまとめ - yhara.jp にまとめられているエントリを参考にさせてもらいました。

ハマったところ

パーツの実装はトラブルなく進められたけど、ファームウェア書き込みが以下のようなエラーで何度も失敗して悩みました。 

Connecting to programmer: .avrdude: butterfly_recv(): programmer is not responding

f:id:horimislime:20180716230633p:plain

以下のやりとりを見つけて、とりあえず故障ではないらしい事を確認。

リセットスイッチを連打→QMK Toolboxでデバイスの認識を確認→flash を何度か試してもなかなか成功せず、ほとんど諦めかけながら適当に繰り返していたら偶然成功。この現象は初回のファーム書き込みだけこの現象が起こるらしく、2回目以降の書き込みはサクッと成功するようです。

後から以下のエントリを見かけました。何度も連打しなくても2回クリックすれば成功する?

※ 初回のファームウェア書き込み時のみ, Leonardo Pro MicroでもSparkFun製と同様に素早く2回ショートさせる必要があるようです.

Pro Micro & QMK Firmware のセットアップガイド (Let's Split編) - Voxel Highway

所感

DIYキーボードキットの組み立ては挫折するほどではない適度な難易度で、回路実装からファームウェアのカスタマイズ・インストールまでハードウェア製作の一連工程を体験できて良いですね。自分でキートップやスイッチを選んでお気に入りのキーボード作りができるのはもちろん、本格的な電子工作にチャレンジする第一歩としてもオススメの題材です。

f:id:horimislime:20180714180550j:plain

Python3を書いている

ここ最近趣味で作っているツールの開発にPythonを使っている。Pythonの知識は4年以上前に仕事で2.7のスクリプトを書いていた頃で止まっていたんだけど、今回は個人開発だし一気に3.6へジャンプして色々新機能を試しながらコードを書くことにした。

今回はこの開発中に行った環境構築とか、使ってみて良いと感じたPython3の機能についてまとめる。

開発ツール

PyCharmを使うようにした。今では無償で利用できるCommunity Editionが出てるので、自分のようにちょっとした趣味でPythonを書くライトユーザでもPyCharm一択じゃないかと。

最初Emacsで書き始めるためにあれこれ設定を書いていたんだけど、やっぱりIDEインストールしてサッと書き始められる方がいい。PyCharmはキーバインド以外一切カスタマイズ無しで満足に開発できている。

Interpreter

HomebrewでPython3をインストールする。そういえば、まさにこれを書いている最中に色々とゴタゴタが話題になっていたようですね。 (参考:Homebrewでインストールされる/usr/local/bin/pythonが再びPython2に変更)

てっきり brew install python すると2.7が入るものだと思っていたので、インストールは普通にpython3 formulaを指定した。

$ brew install python3
$ python3 -V
Python 3.6.4

次に開発ディレクトリ用にパッケージのインストール空間を独立させる。Python3.3からはvirtualenv相当のvenvというのが標準で組み込まれているので、 python3 -m venv ./venv とするだけで仮想空間を作ることができる。pythonpip 等の実行ファイルも venv/bin 下に入り、PyCharmだと自動でこれを使用するinterpreterとして認識してくれる。

f:id:horimislime:20180312193829p:plain

自分の場合ソースディレクトリはGitでバージョン管理しつつ、iCloudで同期しているDesktop下に置いて複数端末で共有してる。venvも丸ごと同期してあると、開発端末が変わっても全く同じインタプリタとパッケージをすぐに使い始められて便利だった。

Python3以降で良いと感じた仕様

次に、実際にコードを書いていて重宝した新機能を抜粋。

文字化けしなくなった

Python初心者が真っ先にハマると思われるアレが無くなってた。Python3からはUTF-8がデフォルトのencodingになっており、ファイル行頭の coding: utf-8 記述も不要に。

文字列フォーマット

昔は文字列formattingに print 'hello %s' % nameみたいなことをしていたが、3.6からより直感的に書けるようになった。IDEを使っていればブラケット内で変数のメソッドを呼ぶ際補完も効く。

name = 'horimislime'
print('Hello {name.upper()}') # 'Hello HORIMISLIME'

Enum

3.4.1からEnumが標準で使える。classなので勿論メソッドも生やせて便利。

from enum import Enum

class HTTPMethod(Enum):
    Get = 'GET'
    Post = 'POST'
      ...

    def description(self):
        if self == HTTPMethod.Get:
            return '...'
        elif self == HTTPMethod.Post:
            ...

Pythonにはswitchが無いけれど、enumがあるとつい欲しくなってしまう。

async/await

非同期処理をasync/awaitで書けるようになった。promiseライクなことをやりたい時も簡潔に記述できる。

async def update():
    await execute_first()
    await execute_second()


async def execute_first():
    time.sleep(3)
    print('first operation')


async def execute_second():
    time.sleep(1)
    print('second operation')


asyncio.get_event_loop().run_until_complete(update())

Type Hinting

変数に型アノテーションを付けられるようになった。例えば以下のように関数を書いているとき引数に対して補完が効くようになり開発効率が上がった。

def greeting_message(name: str) -> str:
    return f'hello {name.upper()}' # nameに対して補完が効く

型を指定できるようになったので、型がマッチしない代入にも気づける事を期待してたんだけど、これに関しては少しPyCharmのサポートが弱かった。関数に渡す引数の型が合っていないと警告を出してくれるんだけど、以下のような変数への代入では警告が出ない。

def greeting_message(name: str) -> str:
    return f'hello {name.upper()}'

message = greeting_message(name=1234) # 引数にwarning
x: int = greeting_message(name='horimislime') # warningなし

これに関しては python/mypyでチェックをかけると検出できるらしい。ただPyCharmで使うには今のところ手動でmypyを実行するしかなさそうなので、今後のインテグレーション強化に期待。

以上

What’s New in Python — Python 3.6.4 ドキュメントなどを眺めながらここ半月くらいPythonを書いてきた。

元々ヘビーに書いていた訳ではないので、だいぶ初心者に近い視点でPython3を見ていると思う。けれどencoding周りの変更だったり、はじめの環境セットアップのややこしさ(pyenv・virtualenv・virtualenvwrapper…等のツールの乱立)が公式moduleの登場でシンプルになったりと、これからPythonを書き始める人にとっても嬉しい改善が多い気がする。

最近ずっとSwiftを書いていたのでだいぶモダン寄りな言語から入ってきた形になったけど、こうした環境面の改善だったり言語仕様のパワーアップでそんなに戸惑うこともなかった。むしろasync/awaitはSwiftでも使えると便利だなと思ったりもした。

HHKB Type-SをBluetooth接続できるようにした

f:id:horimislime:20180308154731j:plain

有線タイプのHHKB Pro2を無線化できる改造方法が公開されていたので、前からBluetooth版が出たら買い換えたいと思っていた手持ちのType-Sで試してみることにした。

この改造の良いところは手軽・安価・筐体を傷つけたりすることなくBT対応できるところ。上の写真の下側にある、USBポート等が乗っている基板を交換するだけでBluetooth対応ができる。基板は純正品とほぼ同じサイズで、バッテリー込みで筐体に収まるので見た目を損なうこともない。

上記リンク先で丁寧に解説がされているので特に書くことは無いけど、手順は以下の通り。

分解も楽なのですぐに組み上げられるはず。基板を交換するとこんな感じで、USB-Aポートの穴からBluetoothのON/OFFトグルを操作したり接続インジケータを確認できる。

リチウムイオンポリマー電池を積んでいてちょっと怖いので、外出中は充電を避けてBTも切ってる。今のところ全く問題なく使えていて、電池も2日くらい持ってるので満足してる。

見た目もHHKB BTモデルのような電池ボックスのでっぱりも無くスッキリしてるし、何より念願だったType-Sの無線化ができたので買ってよかった。

f:id:horimislime:20180308155543j:plain

MacBook Pro 2017 + LG Ultra Fine 5Kディスプレイを購入

f:id:horimislime:20180204115455j:plain

長いこと会社支給のMBP Late 2013を使ってたので、私物のMacを買うのは2012年にMBP Late 2011を購入して以来の6年ぶり。

買ったモデルはMacBook Pro 2017 15インチの最上位モデル(SSDだけ上限一個下の1TB)。整備済製品を買ったのでだいたい5万円くらい安く手に入った。ここ最近整備済MBPの在庫が潤沢なようで、今確認してもかなりのバリエーションが購入可能な様子。今回は同時にLG Ultra Fine 5Kディスプレイも買った。

2週間ほど使ったので感想を。

  • タッチバー
    • クリエイティブ系ツールをよく使う人は重宝するかも。写真.appのレタッチのスライダーを使う時に便利だった
    • ただし対応してないアプリが多い。メインで写真加工に使ってるLightroom CCも未だ非対応…
    • Touch IDは明らかに便利で、もう非搭載モデルには戻りたくない
  • USB-C
    • リビングにNintendo Switchがあるので、電源が足りなくなった時にMacのアダプタを持ってこなくても充電できて便利
    • 端末の左右どちらのUSBポートからも給電できるのは地味に嬉しい。ケーブルの取り回しが楽
  • Ultra Fine 5Kディスプレイ
    • USB-C一本で映像出力・充電できる。たかが一本繋ぐケーブルが減っただけでも快適
    • MBPのタッチバーで輝度調整ができたり、ちゃんと専用アクセサリーとして作られてるなぁという感じ
    • 画質は何も文句なし。写真を撮ったらこれに映すのが楽しみになる

マシンスペックは変化を感じられなかったけど、全体的に良い印象。新型MBPは割高・タッチバー無駄・不具合多すぎ などなど良い評判を聞かないので避けてたけど、個人的には満足してるしもっと早く買えば良かったなとも。5KディスプレイもMac用アクセサリとして本当に良くできてるので、両方長く使っていきたい。


追記:この記事を書き終わった後に突然内蔵キーボードの一部キーが全く反応しなくなり修理行き確定した。やっぱりキーボード周りは未だに不具合多くてダメっぽい・・・