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

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

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

Corne Cherryを作成しました

こんにちは、ミツバです。

この前、Corne Chocolateを作ったのですが、Cherryの方も欲しくなり本日作りました。

つくったもの

買ったキーキャップ

遊舎工房さんで以下のキーキャップを購入しました。 非常にきれいな色合いで文字列キーはいい感じでした。 エンターや記号系はキー数がそもそも少ないので、大分余ってしまいました。 なのでまた別のキーボードを作ったときにでも使いたいと思います。

mechanicalkeyboards.com

キーマップ

キーマップを載せておきます。 ADJUSTは未だに利用方法を開拓できていないので、特に設定はいじっていないです。

  [_QWERTY] = LAYOUT_kc( \
  //,-----------------------------------------.                ,-----------------------------------------.
        TAB,     Q,     W,     E,     R,     T,                      Y,     U,     I,     O,     P,  BSPC,\
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
      CTLTB,     A,     S,     D,     F,     G,                      H,     J,     K,     L,  SCLN,  QUOT,\
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
       LSFT,     Z,     X,     C,     V,     B,                      N,     M,  COMM,   DOT,  SLSH,  RSFT,\
  //|------+------+------+------+------+------+------|  |------+------+------+------+------+------+------|
                                  LOWER, GUIEI,   SPC,      ENT,   ESC, RAISE \
                              //`--------------------'  `--------------------'
  ),

  [_LOWER] = LAYOUT_kc( \
  //,-----------------------------------------.                ,-----------------------------------------.
        ESC,    F1,    F2,    F3,    F4,    F5,                     F6,    F7,    F8,    F9,   F10,  BSPC,\
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
      CTLTB,     1,     2,     3,     4,     5,                   LEFT,  DOWN,    UP, RIGHT, XXXXX, XXXXX,\
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
       LSFT,     6,     7,     8,     9,     0,                    F16,   F17,   F18,   F19,   F20, XXXXX,\
  //|------+------+------+------+------+------+------|  |------+------+------+------+------+------+------|
                                  LOWER, GUIEI,   SPC,      ENT,   ESC, RAISE \
                              //`--------------------'  `--------------------'
  ),

  [_RAISE] = LAYOUT_kc( \
  //,-----------------------------------------.                ,-----------------------------------------.
      XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,                  XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,  BSPC,\
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
       EXLM,    AT,  HASH,   DLR,  PERC,  CIRC,                   AMPR,  ASTR,  LPRN,  RPRN,  MINS,   EQL,\
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
       LSFT,  BSLS,   GRV,  LBRC,  RBRC, XXXXX,                   BSLS,   GRV,  LBRC,  RBRC, XXXXX, XXXXX,\
  //|------+------+------+------+------+------+------|  |------+------+------+------+------+------+------|
                                  LOWER, GUIEI,   SPC,      ENT,   ESC, RAISE \
                              //`--------------------'  `--------------------'
  ),

ファームウェア書き込みは以前の記事を参照してください。

mitubaex.hatenablog.com

最後に

よい自作キーボードライフを!!!!

Corne Chocolateを遊舎工房さんで作りました

こんにちは、ミツバです。

先日、corne-chocolate遊舎工房 で作りました。

遊舎工房さん

備品がたくさんあり、半田吸い取りなんかもできたりします。 それらの備品が最高でも1000円で使いたい放題なので、遊舎工房さんで作成は価値は十分にあると思います。

作成風景

f:id:MitubaEX:20190416094242j:plain
半田付け風景

f:id:MitubaEX:20190416094334j:plain
キースイッチ取り付け

f:id:MitubaEX:20190416094401j:plain
完成

キーマップ設定

  • qmk/qmk_firmware をforkしてきてcloneする
  • keyboards/crkbd/keymaps/default/keymap.c がキーマップの設定ファイルなので、これを編集します
  • 編集後、make crkbd:default して、 make crkbd:default:avrdude を実行し、リセットボタンを二回押す
  • 左が実行できたら右も実行して終わり

キーコードは こちら を見たら良さそうです

所感

自分で半田付けして、それが動くと感動するしこれが自作キーボードの良さなのかと感じました 自作キーボードだとこの配列にしたいというのが自由自在なので、すごく設定する楽しみがあり良さがすごいのでまた作っていきたいです