caravelle-bleを作ったのでやったことまとめ

こんにちは、ミツバです。 caravelleというキーボードを買って作成したので、困ったことを備忘として残します。

booth.pm

結論から言うと下の記事に大体書いています。

bigotor.com

はんだ付け

ビルドガイドを見て、やっていく感じです。 特に困ることは無さそう

github.com

ファームウェアのビルド

環境: mac os catalina(10.15.4)

ビルドガイドを見ながらやっていきます

環境変数について

export NRFSDK12_ROOT=<path> で定義する時にpathに~ とか入れていると、探せないので絶対パスを渡してあげて解決

qmk_firmware/quantum/quantum.c:927: undefined reference to `matrix_init_kb' と言われる

エラー内容はざっくり以下のような感じ

.build/obj_caravelle_ble_slave_default/quantum/quantum.o: in function `matrix_init_quantum'
qmk_firmware/quantum/quantum.c:927: undefined reference to `matrix_init_kb'

quantum/quantum.cで matrix_init_kb が見つからないらしいので、overrideしてあげることにした

+// @Override
+void matrix_init_kb(void) {
+  // call user level keymaps, if any
+  matrix_init_user();
+}

参考: github.com

ペアリングできない

ビルドガイドのトラブルシューティングを参考にする 基本ファームウェア書き変えたらやった方が良さそう

まとめ

なんとかなった

リモート生活で買ったものまとめ

リモート生活を始めて2ヶ月が経とうとしているので、リモート生活のために買ったものをまとめます。

PC周辺機器

僕は自宅ではPCを机の上に置くと狭いので別の場所に置いています。 そのため、PCのマイク、カメラを必然的に利用できない状況になってしまうので、別途購入しました。

以下購入したもの

イヤホン延長ケーブルは使い勝手が良くて、個人的にオススメです

bluetoothのイヤホンは特に利用していないので、利用するようになったら不要になりそうではある

机周辺

机でずっと作業する仕事をしているのでちょっとでも姿勢など楽にしたいなと思い色々買いました。

以下購入したもの

バランスボール

バランスボールの下に敷くやつ

足置き、バランスボールと合わせると最高

小さいラック、袋麺とかをストックしておく棚

結構インスタント麺を食べることが多くなって、人間として終わり始めてますがなんとか生きてる

飯関連

リモートで全部インスタント麺はさすがにやばいと思い、自炊をします。

以下買ったもの

5万円のすげぇ炊飯器

使い捨て三角コーナー(便利)

www.comp.jp

ご飯を炊いて、TKGにしたりふりかけで食べたり大体おかずはなし。

余ったご飯は、冷蔵して次の日チャーハンで食いまくる

飯が面倒になったら、COMP飲む。

髪関連

ヘアバンド

散髪に行きづらいので、ヘアバンドでギリギリ耐えてる

娯楽

百合小説は万病に効きそう

dash.shueisha.co.jp

まとめ

2ヶ月耐え抜いたので、これからも生きながらえます

オブジェクト指向設計実践ガイドを読みました

こんにちは、ミツバです。 今回は、以下の本を読みました。 ここでは、学びのあった部分を軽く触れておきます。

gihyo.jp

単一責任のクラスを作る

後述するコンポジションと近そうな話ですが、バイクがパーツの計算を持っているより、パーツをクラスとして切り出して管理した方がバイクはパーツのことをあまり知らなくて済むので楽だったりします。

デメテルの法則

直接関係のある隣のオブジェクトまでしかメッセージを送らない手法。 仮に二つ以上隣のものとメッセージを送り合っていると、その分密結合になってしまい、メンテが大変だったりします。

継承、モジュール、コンポジションでの柔軟な設計

それぞれis-a, behaves-like-a, has-a関係に利用できます。

それぞれの特徴

  • 継承は、抽象的なものを一つ考え、それの派生物を作成できます。
    • 本書では、自転車とロードバイクなど派生物を表現するのに利用されていました。
  • モジュールは、ロール(物)として別の扱いのものに共通の振舞いを与えることができます。
    • 本書では、スケジューリングが必要なものに振舞いを与えるために利用されていました。
  • コンポジションは、あるロールが持っている物を表現できます。
    • 本書では、自転車のパーツを表現するために利用されていました。

どういう時に利用するか

継承

基本的には、型による条件分岐が発生した時などはその分岐を消すことが可能です。本書では、バイクとロードバイクで処理を切り換えるみたいなことをしようとした時に、継承を用いて振舞いをクラスごとに実装することでその条件分岐を消せます。

モジュール

既存のクラスに振舞いを追加でき、後からでも柔軟に導入、変更が可能です。

コンポジション

has-aの場合は、基本利用したら良さそうですね。

まとめ

最初はRubyに慣れず読むのを断念してしまっていましたが、少し慣れた状態で読むことで理解度も上がり楽しく読めしました。 Rubyを利用して開発している人は、少し慣れた段階で読むのが良いかもです。 ぜひ。

buildersconに参加してきました #builderscon

こんにちは、ミツバです。 8/30, 31の二日間参加してきたので、ブログを書きます。

builderscon.io

前夜祭がありましたが、予定があったのでスキップしてしまいました。

一日目

メモはこちら

聞いたトーク

  • Open SKT: メルペイ開発の裏側
  • キーボードは好きですか?
  • 宣言的UI for React, Vue.js, SwiftUI, Jetpack Compose, Flutter
  • 現代フロントエンドに欠かせないwebpackとBabelを理解しよう!

スライドと感想

Open SKT: メルペイ開発の裏側

speakerdeck.com

決済関係はマイクロサービス化されており、それらの値をどうやって正確な値としてそれを保持していくかの論点が興味深かったです。

キーボードは好きですか?

speakerdeck.com

キーボードの知らないことを沢山知ることができ、スポンサートークとは思えない怒涛の気持ち良さが聞いていると押し寄せてきて凄かったです。

宣言的UI for React, Vue.js, SwiftUI, Jetpack Compose, Flutter

speakerdeck.com

なぜ宣言的UIなのかということから発展(hooks, redux)の話もあり、フロントの現状が凄くまとめられていました。凄かったです。

現代フロントエンドに欠かせないwebpackとBabelを理解しよう!

speakerdeck.com

babel, webpackをJavaScriptの歴史と共に辿っていき、そこから軽い使用例なども説明されています。

二日目

メモはこちら

聞いたトーク

  • フロントエンドのつくりかた - シンプルなコードを達成するためのセオリー
  • 0円自作キーボード(配列)入門
  • 設計した自作キーボードの基板を中国で小ロット量産するときの苦労、涙、理由

スライドと感想

フロントエンドのつくりかた - シンプルなコードを達成するためのセオリー

nrslib.com

フロントエンドの構成がどうなっているべきかに着目した発表でした。既存のアーキテクチャの考え方も説明されておりなるほど!が多い発表でした。

0円自作キーボード(配列)入門

speakerdeck.com

キーボードの話だったので、聞きに行ったのですがローマ字テーブルの書き換えという凄い高度なことをしていて感動してしまいました。

設計した自作キーボードの基板を中国で小ロット量産するときの苦労、涙、理由

speakerdeck.com

最近基盤を発注しているので、中の人がどんなことをして基盤を作っているのかの説明もありキーボードの世界を凄く知れた発表でした。

懇親会

キーボードの話しかせず終わりましたが、楽しかったです

まとめ

今年も興味深い発表が多くて、楽しめました。 来年も参加します(登壇でも)

cscs64を購入して作りました #cscs64

cscs64を作成しました。

github.com

[https://twitter.com/hatano/status/1134666427489607681:embed]

作業ログ

キースイッチソケットとダイオード、他諸々の部品は普通に半田付けしていきます。 cscs_family/buildguide.md at master · hatanoh/cscs_family に書いてある通り細かいパーツがキットには入っており、それを半田付けしたかったのですが悲しいことに紛失してしまいました。

なので秋月電子で、昇圧型DCDCコンバータ StepUP・DIP 3.3Vタイプ Ver2丸ピンICソケット ( 8P)を書いに行き半田付けしました。 ソケットを利用する場合は、14mmのスペーサで丁度良い感じでした。

後はBLE Pro microを取り付けて終了ですが、若干取り付け方が特殊だった(ピンをずらすなど)のでビルドガイドを良く読んで実装しました。

ファームウェア書き込み

ファームウェアの書き込み(無線)を読んで、cloneしてきます。

書き込む前に以下の設定を諸々済ませていきます。

Python周りのsetting

ここでは僕の環境であるMac OSX(High Sierra)を前提に説明していきます。 以下の流れでpyenvを入れて設定します。

# install
$ brew update
$ brew install pyenv

# setup
$ pyenv install 2.7.15
$ pyenv local 2.7.15
$ pyenv rehash
$ pip install nrfutil

Mac特有の変更

書き込み時にusb_serialが見つからないとエラーが出る場合(MacOSなど?)を参照

nRF5_SDKをダウンロード

nRF5_SDK_v15.x.xからnRF5_SDK_15.0.0_xxx的な名前のzipファイルをダウンロード それを解答して、僕はホームディレクトリに置いておきました。

その後、.zshrcなんかに以下の環境変数を追加しておきます。

export NRFSDK15_ROOT=$HOME/nRF5_SDK_15.0.0_a53641a

書き込み

今回はcscs64を購入したので、以下のコマンドで書き込みます。

make cscs64_ble/master:cscs64:nrfutil # 左
make cscs64_ble/slave:cscs64:nrfutil # 右

Detecting USB port, put your controller into dfu-mode now...........という表示が出たら、リセットボタンを押しながらBLE micro proにusbをさします。 すると、以下のような表記が出て書き込みが完了すると思います。 何かしら書き込みが失敗した場合、電源が入っているかもしれないので電池を抜いて再チャレンジします。

Detected controller on USB port at /dev/tty.usbmodem14511
Programming Started
  [####################################]  100%
Device programmed.

Python3周りでのエラー

Traceback (most recent call last):
  File "/usr/local/bin/nrfutil", line 10, in <module>
    sys.exit(cli())
  File "/usr/local/lib/python3.7/site-packages/click/core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/click/core.py", line 717, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.7/site-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python3.7/site-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python3.7/site-packages/click/core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python3.7/site-packages/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/nordicsemi/__main__.py", line 867, in generate
    package.generate_package(zipfile_path)
  File "/usr/local/lib/python3.7/site-packages/nordicsemi/dfu/package.py", line 407, in generate_package
    Package.normalize_firmware_to_bin(self.work_dir, firmware_data[FirmwareKeys.FIRMWARE_FILENAME])

というエラーが出て、python3.7系のライブラリを参照していました。 とりあえずライブラリを消して再インストールしたらエラーが出なくなりました。

$ pip3 uninstall nrfutil
$ pip uninstall nrfutil
$ pip install nrfutil

起動

キースイッチなどをソケットに挿入し、プレートをネジで締めます。 ネジをしっかり締めないと若干プレートが浮いてスイッチが効かないみたいなことになったので、しっかり締める感じです。

その後電池を入れて電源をON

cKANAキーとBを押すとペアリング待ち受けしてペアリングできると思います。 デフォルトでのcKANAキーは左手の右下から左に2番目のキーです。 keyboards/cscs64_ble/keymaps/cscs64/keymap.cで確認できます。

電池の消耗が早くなるけど、文字早く打てる環境が欲しい

デフォルトの状態だと早く打ちすぎると「っっっっっっっt」とかの状態になったりします。

これがつらかったので、keyboards/cscs64_ble/config.hに以下の設定を追加しました。

## ここは最初から書かれているので値を変更
#define BLE_NUS_MIN_INTERVAL 15
#define BLE_NUS_MAX_INTERVAL 40

## 追記
#define BLE_HID_MAX_INTERVAL 40
#define BLE_HID_SLAVE_LATENCY 7

これで頻度高めで左右やPCとの通信をしてくれるので快適にタイピングが可能になりました。

最後に

cscs64がまだ遊舎工房さんのショーケースにあるのかは不明ですが、もし興味が湧いた人がいたのなら買ってみてもいいかもしれないです。 良いキーボードライフを

Go Conference 2019 Spring に参加してきました

こんにちは、ミツバです。 縁があって、Go Conference 2019 Springに参加することができました。 ありがとうございました。

gocon.connpass.com

聞いたセッション

keynote

goproxyを作成しているケイティーさん

modulesはGoのバージョンの違いを吸収してくれて、Go Proxyではバージョン指定がきついのでプロキシを設けてバージョン問い合わせしたり、zipでの送受信ができるようにして、より楽にパッケージ管理が可能 (英語が危ういので違うかも)

checksumを設けて、本当に欲しいものだけを持ってこれるようにする

Case studies of designing developer friendly libraries

speakerdeck.com

izumin5210さん :Wantedly

developer friendlyとは、simple, easy

Easyだと開発効率が高くなる反面、少し複雑なことをすると爆発してしまう しかしEasyは悪ではない

Goのcontext.ContextはI/Oの時間がかかる処理に利用する メトリクス収集にも利用可能 パッケージでは良く利用されている (例: newrelic/go-agent)

middlewareなどの概念も重要

拡張性の話

Redigoパッケージ doメソッドに処理を書いていく Connをラップすることでロギング周りの処理を変更可能だったりする

google-cloud-goパッケージ optionをNewするときにオプションを受けとれるようになっていて、オプションをさし替えることでユーザのちょっとこったことを実現する

functional option patternが拡張性が高くていい感じ builder patternもパッケージで利用されてたりしていて、拡張性は高め

functional option patternは以下の記事がわかりやすかったです。 qiita.com

wireは最高

Boilerplate生成 環境変数を設定しておくだけで各種設定を読みこんでくれるようなライブラリを作っている 足回りのことはある程度ライブラリに任せる選択もありかもという話

Better asset bundling tool than the best

docs.google.com

shibu_jpさん: フューチャーアーキテクト

ne/httpのファイルシステムについて コンテンツの圧縮とかSPAとかで高速化を行っている

asset bundler から圧縮を解除してnet/httpに渡して、それを読んだ後、またまた圧縮してブラウザに返す処理をするそうなので、これを改善するやつを作ったよという話

brotliというcontent-encodingを利用すると爆速

Goならわかるシステムプログラミングを読みます

SPAの場合

buildしたやつをのローカルに置いておいて、それを読みにいく Goのバイナリ一個を持っていくことでできるようにする

assetsの暗号化もできる、便利

Goによる外部プロセス起動ベストプラクティス及びtimeoutパッケージ徹底解決

songmu.github.io

songmuさん

os/execパッケージで外部コマンドを実行できる TeeReaderを利用することで、teeコマンドのようなことが可能 command contextでタイムアウトとかが設定できる でも内部では、SIGKILLで止めてしまう

これによって、孫プロセスがずっと生き続けてしまうらしい SIGTERMを送りたいのだけど、Goはそれは各自でやってもらうという方針

そういうツールを開発 これはGNU timeoutを参考にしているらしい プロセスグループにもシグナルを送れる SIGCONTを送るようにもしておき、停止しているプロセスがあれば叩き起こす

Design considerations for container-based Go applications

speakerdeck.com

hgsgtkさん

環境変数を見て、それらを一つの構造体として取得ができるGoパッケージ

github.com

zapを使ってカスタムロガーが作れる

github.com

ヘルスチェックは、エンドポイント生やして確認する DBなどもアプリケーションのエンドポイントから行ったりするらしい

Design pattern for Image and text composition in Go

timakinさん

赤い四角を書きたければ、各ピクセルに色を入力して画像として吐くようにしたい 画像とテキストの合成を行なう

/image/fontパッケージ imageにテキストを書きこめる

読みこめるfontが足りないので、freeetype/truetypeを使って読みこもうとしたけど、ヒラギノsansが読みこめない (つらい)

デザインパターン

ごにょごにょする

rakyll/statikパッケージ、assets importするときに利用できる

テキストをどこかで画像として保存しておいて、それを画像として合成するのも良い GoでのFont周りは意外ときついらしい

Dive into Buildkit LLB with Go

speakerdeck.com

po3rinさん

mobyの機能を置き替える感じで Buildkitが登場 buildkitdというデーモンが立っていて、それをcliが叩く

buildkitctl のコードを見るとSolveが最終的に呼ばれている そして、llb.Definitionという定義がある

llbとは

ビルド時に利用しやすい構造になっているもの 非循環構造 DAG

llb2dotというツールを作成しこれを利用して、dot言語にして可視化ツールにながせる (便利)

buildkitには、Dockerfile2llbという関数があるので、それを使えば爆速でllb構造が手に入る

buildkitでDockerfileのparserがあるので、それを利用してASTを入手できる Dockerfile linterがお手軽に作れちゃう

Dockerfileを利用しなくてもllbは構築できるので、自作のファイル構造も利用可能

Fuzzy finder as a Go library

speakerdeck.com

ktr_0731さん

行指向なので、オレンジという曲名がたくさんあったら一番欲しいものが不明 fzfを利用しているライブラリはfzfをインストールしないと利用できなかったりする。

なので、Go用のfuzzy finderを作った

検索アルゴリズム

Needleman-wunsch: fzyが利用しているアルゴリズム Smith-Waterman : fzfが利用いしているアルゴリズム

fzy: ALGORITHM.mdにスコアリングのルールが書かれている fzf: algo.goにスコアリングのルールが書かれている

Building Modules Discovery (from Go Team)

Goのパッケージの評価、コードクオリティや依存の話から、モジュールをその評価情報などから検索できるサービスを提供しようとしているよという話 (英語が危ういので違うかも)

Goのパッケージが探しやすくなると非常に熱いムーブメントが起きそうだなと思いました。

全体感想

個人的にGoという言語は、CLIツールなどを簡単に作成できて大好きなので、非常にどのセッションも有意義なものでした。

英語が危ういので、英語を聞きとれるようになりたいなぁと思いました。

buildkitは楽しそうなので、暇があったら中身を見てみたいと思いました。

QMK Firmwareで絵文字を入力する

こんにちは、ミツバです。 この前、行われた天キーでいい感じのキーキャップを入手できたので少し特殊なことをしてみようと思いました。 キーボードは、ErgoDashを利用しています。

Ubuntuでの設定

今回はUbuntu 18.04でやっていきます。

keymap.cを編集

// 一番上に記述
#include "process_unicode.h"

// キーマップ定義の上ぐらいに記述
enum unicode_name {
  THINKING_FACE,
};

const uint32_t PROGMEM unicode_map[] = {
  [THINKING_FACE] = 0x1F914, // THINKING_FACE
};

// キーマップに追加
X(THINKING_FACE)

// 一番下に追加
void matrix_init_user(void) {
  set_unicode_input_mode(UC_LNX);
}

rules.mkを編集

UNICODE_ENABLE = no     
UNICODEMAP_ENABLE = yes 

これで指定したキーで絵文字が打てていると思います。

デモ

MacUbuntuで切り替えて同じことをやる

keymap.cに追記

#include "process_unicodemap.h"
#include "process_unicode_common.h"

enum custom_keycodes {
  QWERTY = SAFE_RANGE,
  LOWER,
  RAISE,
  ADJUST,

  THINKING_FACE_TYPE,  // 追加
};

// modeを変更するキーコードをキーマップに追加する
UNICODE_MODE_OSX

// THINKING_FACEのコードを追加する
THINKING_FACE_TYPE

// THINKING_FACE_TYPEが押されたときに、やる処理を書く
case THINKING_FACE_TYPE:
  if (record->event.pressed) {
    switch(get_unicode_input_mode()) {
      case UC_OSX:
        register_code(KC_RALT);
        SEND_STRING("D83E+DD14");
        unregister_code(KC_RALT);
        break;
    }
  }
  break;

あとは以下の手順をするだけです。

  • MacIMEUnicode Hex Inputを追加し、メニューバーから show emoji & symbols を選択。
  • 左上の歯車から、Customize Listを選択。
  • Code TablesからUnicodeにチェックを入れて準備完了。

これで UNICODE_MODE_OSX を押したあと、THINKING_FACEを打つと顔文字が出たと思います。

デモ

しかしLinuxでキーマップに設定する以外で、絵文字を入力する方法がよくわからなかったので諦めました。 何か良い案があれば教えてください。

解説

やっていることとしては、無理やりALTを入力してthinking_faceのUTF-16 code unitsを入力しています。 このUTF-16 code unitsは、このサイト で確認できるので入力したい絵文字を各自で調べてみてください。

参考にさせてもらった記事

skyhigh-works.hatenablog.com