Keep on moving

あんまりまとまってないことを書きますよ

自作キーボード入門ーErgo42 をつくった

2019年あけましておめでとうございます。 前から気になってた自作キーボード作成に挑んでみました。

ちなみに電子工作は高校の技術の授業以来でした。はんだづけがひさしぶりすぎてだいぶ苦戦しました。 軽くメモをのこしておきます。

モチベーション

https://ergodox-ez.com/

職場でErgoDoxを使っていて非常にまんぞくしています。 家とかカフェでも使いたいなーと思うんですが、ただコレを持って歩くのは割と重いし大きいしなんかいいのないかなーと ずっと思ってました。

自作キーボードの話は知っていたのですが、さすがにはんだ付けが必要って話を聞いていて二の足をふんでましたが、年末に時間があるなってことに気づいて思い切って始めてみました。

キーボードの選定

ergo42を選んでみた.キーキャップ選んだりするのが醍醐味だってのがわかりつつまずは1個つくってみたくてキーキャップなどが全部ついてるコンプリートキットを選んでみた。

booth.pm

ちなみにDSA White Keycap + Kailh Pro Burgundyを選びました。正直何を選ぶべきかよくわかんなくて上から一番目をえらびました。笑

組み立てるためにかったもの

キーボード自作、特に Helix キーボードキットの製作に最低必要な工具のメモ · GitHub

こちらを参考に色々買いました。必須って書かれてるものはほんとちゃんと買うといいと思います。 追加で買ったコテ先は使いやすかったです、腕と経験はもので補えるんだなってことを痛感しました。 あとリードベンダー-は作業しててまじでほしくなりました。

組み立て方

qiita.com

色んな人が書いてくれてますがこちらのページを参考にしました。 はんだ付けは高校の授業以来なんで大分苦戦しました。テスターの使い方も説明書をちゃんと読まないとわかんなくてほんと大変だったんですが、 その分キーボードが動いてくれたときの感動はひとしおでしたね。

現在のキーボード配置

ErogoDoxにくらべてキー数が減った分スゴく悩んでます。

    /* BASE
   * ,------------------------------------------------.   ,------------------------------------------------.
   * | ESC  |  `   |   Q  |   W  |   E  |   R  |  T   |   |  Y   |   U  |   I  |   O  |   P  |   [  |   ]  |
   * |------+------+------+------+------+------+------|   |-------------+------+------+------+------+------|
   * | META | LCtrl|   A  |   S  |   D  |   F  |  G   |   |  H   |   J  |   K  |   L  |   ;  |   '  |   \  |
   * |------+------+------+------+------+------+------|   |------|------+------+------+------+------+------|
   * | SYMB | LSft |   Z  |   X  |   C  |   V  |  B   |   |  N   |   M  |   ,  |   .  |   /  |  UP  | RSft |
   * |------+------+------+------+------+------+------|   |------+------+------+------+------+------+------|
   * | LGUI | TAB  |      |      | LAlt | RAlt | Bksp |   |Space |Enter |   -  |   =  | LEFT | DOWN | RIGHT|
   * `----------------

ちなみに僕が欲しいなーと思ってると配列は以下のような感じで日々設定を書き換えてる感じです。 - 右手の親指でスペース、エンターキーを叩きたい - 左手の親指でバックスペースキーを叩きたい - LAltで英語、RAltで日本語を入力できるようにしたい。(コレは英字キーボードで僕がよくやる設定)

,まとめ

作るときは大変だったんですが、組み上げて動いてみてくれると本当にウレシイもんですね。 正直できあがりは割とキーの高さが不揃いだったりで正直あんまりきれいじゃないんですが、使ってみるとそれがまたかわいいですね。

ほんとたのしいんでみんなぜひ一度手を出して欲しいなーと思ってます。

参考

qiita.com

kuenishi.hatenadiary.jp テスターでどのモードで確認するかとかはこちらで学ばせてもらいました。

pyiファイルに2つの意味ではまってるはなし(仮)

仕事でPython を使っていた型チェックがほしいときがあって、今Pyiファイルをつくっています。

TL;DR

pyi ファイルからpyiファイルを読み込むと型情報が落ちてしまうらしい。

github.com

要は以下のようなフォルダ構成を考える

   ├── hello-stubs
│   │   ├── __init__.pyi
│   │   ├── api.pyi
│   │   └── operation.pyi

api.pyiはoperation.pyiのメソッドをimportしているとする。 このときに残念ながらimportのところの型チェックでそんなメソッドはないぞっていうエラーがでてしまう。 続きはまた明日書く

「響け!ユーフォニアム」という文字列だけで遊ぶシェル芸をPython ワンライナーでも遊ぶ

そのまんまです。

TL;DR

問題文

togetter.com

自分なりの回答

echo 響け!ユーフォニアム | python3 -c 'print("\n".join([a[i:] + a[:i] for sys in [__import__("sys")] for a in [sys.stdin.readline().rstrip()] for i in range(len(a))]))'

[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ

面白い世界があるもんですねー。

教えてもらったもっと短くかける方法

なるほどー、以下2点知らなかったー。教えてもらってありがたい!!

ThirdPartyLibrary + GraalVM+native-imageでCLIをつくってみる

masahito.hatenablog.com

でっかいエビーです。 これの続きを書きたいと思います。

name version
ubuntu 18.04 amd64
graalVM 1.0.0 RC2

TL;DL

  • GraalVM+native-image するときはFtatJar つくっちゃうと楽っぽい
    • 割と楽
  • native-image の実行は glibcが必要

  • Reflection/ Annotationが絡むと実行時エラーになるっぽい

    • Apache Commons とかは安心して使える. Spring系とかはかなりはまるかも

ラフに説明

用意するものがたくさんあるのでラフに説明します。exampleをつくってみたので以下を軽くみていただけると

github.com

3rd party library の使い方

ビルド時にclasspath宣言をしてビルドすることで3rd-partyライブラリを使うことが可能です。 例えばこんな感じ。

native-image --classpath=.:hoge.jar HelloWorld

ただ、数が増えてくると大変なのでfatJar(3rd-party Libraryをかためて一個にしたやつ , e.g. SpringBootとかでつくられる超でっかいJar)をつくるといいとおもいます。 ちなみにFatJarの場合はこんな感じでnative imegeがつくれます

native-image --jar=hoge.jar

これでhoge っていう名前の実行ファイルができます。

実行には glibcが必要

これでできたイメージを実行できるようになりました。 こんな感じでDocker Fileに実行ファイルをコピーするだけでとりあえず実行できるようになります。

graalvm-java-cli-native-demo/Dockerfile at master · masahitojp/graalvm-java-cli-native-demo · GitHub

$ docker build -t graalvm-test/run-test .
$ docker run -it -t graalvm-test/run-test:latest /bin/sh -c "./clitest -m test"

注意点が一個だけ。 native-image で生成された実行ファイルはglibcが必須です。 なるべく小さいdocker-imageが作りたくて素の alpine+dockerを試したんですが、 実行するとnot foucdっていう無情なエラーが出るだけでした。 alpine-glibcだと無事動作しました。 

ちなみにこの例だと19MiBくらいのdocker-imageになるようです。わりとちいさくまとまりますね1

github.com

Reflection/Annotation

もともとは Args4j を使ってexampleを書いてたんだけど、native-imageは作れるんだけど、 実行時にReflecttionのエラーがでちゃう。

ってのをTwitterでつぶやいたら教えてもらった。

ってのを教えてもらった。ありがたい。

medium.com

こちらのブログによると、

github.com

こんな感じでReflectionの対象になるであろうクラスを列挙したjsonをつくって渡してやればいいっぽい

[
  {
    "name": "io.netty.channel.socket.nio.NioServerSocketChannel",
    "methods": [
      { "name": "<init>", "parameterTypes": [] }
    ]
  }
]

まー今回は動かすのが目的なのでこの辺を調べるのはかつあいしました。詳しい方是非僕に説明よろしくです。

まとめ

結構かんたんにGraalVM+ native-imageをでnativeな実行ファイルを作れるようになりました。 JavaでFatJarつくれればそこから割とかんたんに作業をすることができるので、いろいろ遊んでみるといいと思います. Docker imageも20MiBくらいに収まりそうだし、ある程度遊べそうです

参考

先人の皆様に感謝します

  • sampleのcliの仕様はここからいただきました d.hatena.ne.jp
  • 信頼と実績のApache commons cli(reflection 使ってないっぽいので今回は悩まないために使った) Commons CLI – Home

  • 信頼と実績のkohsuke ware. Args4j

args4j parent - Args4j


  1. Go+scratchに比べると大きいけどね。

GraalVMとJavaでnative-cliを書いてみる

このTweetみて超興味がわいて、GraalVM+Javaでnative cliを書く練習をしてみた

navme version
Ubuntu 18.04
graalVM 1.0.0-rc2

install

download here

github.com

tar xzvpf graalvm-ce-1.0.0-rc2-linux-amd64.tar.gz 
mv ./graalvm-ce-1.0.0-rc2 /opt/graalvm

native imageにコンパイル

github.com

これに従ってやってみる

import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

class ListFiles{
    public static void main(String[] args) {
        Path dir = Paths.get(".");

        try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*")) {
            for (Path file : stream) {
                System.out.println(file.getFileName());
            }
        } catch (IOException ignored) {
        }
    }
}
$ /opt/graalvm/bin/java ListFiles
$ /opt/graalvm/bin/native-image ListFiles <= 一回Java classに変換してからnative-imageでビルドする
$ ls
ListFiles.class
listfiles* <= native imag3!!!
ListFiles.java
$ ./listfiles 
ListFiles.java
listfiles
ListFiles.class

こんな感じでJava環境なしでも動くイメージがつくれた。

Next

つぎは3rd-partyライブラリの使い方をしらべたいところ

Fabric2ファーストインプレッション

はい、Python界隈のレアキャラです。 ついに出るでるといってなかなかでなかったFabric2がでたのでかるくまとめます。

TL;DR

  • メジャーバージョンアップだけあってインターフェースがだいぶ変わった
  • invokeベースで書くことができる
  • 単純なタスクならFabric1からの置き換えはそこまで難しくなさそう。複雑なやつはどうなんだろ、もう少し調べる
object detail
chage date 2018/5/12
version fabic 2.0.0
os ubuntu 18.04
python 3.6.5

fabric2はPython2.7/Python3.4+でうごく

pypi

https://pypi.org/project/fabric2/

document

http://www.fabfile.org/

install

$ pip install fabric2 # fabric2を指定する
$ pip freeze
asn1crypto==0.24.0
bcrypt==3.1.4
cffi==1.11.5
cryptography==2.2.2
fabric2==2.0.0
idna==2.6
invoke==1.0.0
paramiko==2.4.1
pyasn1==0.4.2
pycparser==2.18
PyNaCl==1.2.1
six==1.11.0

Python3でインストールするとエラーがでる

https://github.com/fabric/fabric/issues/1740 どうやらwheelの作り方のもんだいっぽい

upgrade 1.x to 2.x

http://docs.fabfile.org/en/latest/upgrading.html

実行コマンド変更

pip install fabric でいれると fabコマンドで pip install fabric2 でいれると fab2

ここでは fab2で統一する

Installing — Fabric documentation

Fabric1のスクリプトそのままではうごかない

from fabric.api import local

def hello():
    local("uname -s")
$ fab2 hello
fab2 hello
Traceback (most recent call last):
  File "/home/masahito/python-env/fabric2/bin/fab2", line 11, in <module>
    load_entry_point('fabric2==2.0.0', 'console_scripts', 'fab2')()
  File "/home/masahito/python-env/fabric2/lib/python3.6/site-packages/invoke/program.py", line 321, in run
    self.parse_collection()
  File "/home/masahito/python-env/fabric2/lib/python3.6/site-packages/invoke/program.py", line 399, in parse_collection
    self.load_collection()
  File "/home/masahito/python-env/fabric2/lib/python3.6/site-packages/fabric2/main.py", line 74, in load_collection
    super(Fab, self).load_collection()
  File "/home/masahito/python-env/fabric2/lib/python3.6/site-packages/invoke/program.py", line 588, in load_collection
    module, parent = loader.load(coll_name)
  File "/home/masahito/python-env/fabric2/lib/python3.6/site-packages/invoke/loader.py", line 75, in load
    module = imp.load_module(name, fd, path, desc)
  File "/home/masahito/python-env/fabric2/lib/python3.6/imp.py", line 235, in load_module
    return load_source(name, filename, file)
  File "/home/masahito/python-env/fabric2/lib/python3.6/imp.py", line 172, in load_source
    module = _load(spec)
  File "<frozen importlib._bootstrap>", line 684, in _load
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/home/masahito/src/python/try-fabric2/fabfile.py", line 1, in <module>
    from fabric.api import local, run, put
ModuleNotFoundError: No module named 'fabric'

こんな感じでかくと fab2でうごく

$ cat fabfile.py 
from invoke import task

@task
def hello(c):
    c.run("uname -s")
$ fab2 hello
Linux

invokeだと tasks.pyに書くのだけど、これを fabfile.pyに名前をかえて fab2から呼ぶことで ssh経由で呼べるようになる

fab2 -H 192.168.0.1 hello ってやると ssh経由で helloを実行することが可能

sudoするところはまた明日以降で

RenovateをつかってJSでのパッケージアップデートをbotにおまかせする

React書いててnpmパッケージのバージョンアップがちょっとめんどいときってありますよね。 基本的にこまめにnpm のバージョン上げてったほうがアップデートに追従するのがらくなんですけど、 いかんせんそれはそれでちょっとめんどくさいですよね。 というわけで近頃使い始めた外部サービスの紹介します

TL;DR

Renovate をつかうとパッケージがアップデートしたときにPR おくってくれる。

renovatebot.com

How to use

つかいかたは超かんたん。 github, bitbucket etcでサインインするだけ。あとは自分で使いたいレポジトリを指定するだけであとはRenovateがパッケージのアップデートを調べて PR を送ってくれる。

github.com

あとはこんな感じでアップデートするパッケージ単位でPR おくってくれる

github.com

ぜひぜひ使ってみてほしい