Happy Hacking Keyboard搭載のPCがないので作ってみた(4. 開発スタイル編)

4. 開発スタイル編

f:id:triwave33:20190327203846p:plain
完成したHHKB Pi

HHKBにRaspiとディスプレイをくっつけた持ち運び式のPCを作りました。これで外にいながら楽しいコーデイングライフが送れます。

これをみて同じものを作りたくなった方がどれくらいいるかわかりませんが、最後の記事として自分の開発スタイルを書いておきます。もちろん、それでないとできないわけではないので各自お好きな方法をとっていただければOKです。

コーディング環境

 必要なものは

  • tmux
  • vim
  • iPython

です。

tmux の設定

~/.tmux.confに

# Resize pane
bind-key -r H resize-pane -L 5
bind-key -r J resize-pane -D 5
bind-key -r K resize-pane -U 5
bind-key -r L resize-pane -R 5

# Change active pane
bind-key h select-pane -L
bind-key j select-pane -D
bind-key k select-pane -U
bind-key l select-pane -R

と書きます。これで

  • ctrl-b (prefix) + HJKL でペインの分割サイズ切り替え
  • ctrl-b (prefix) + hjkl でペイン間の移動

ができます。

hjklの順に左下上右です。ここらへんはvimバインディングと統一していますね。

vimの設定

 お好きにどうぞ。僕はvimですがemacsでもnanoでも構いません(宗教戦争コワイ)

Python でのコーディングスタイル

それでは、作成した開発環境で試しに以下のようなスクリプトと図を作成してみましょう。

import numpy as np
import matplotlib.pyplot as plt

N= 10
sigma = 0.1

# sample
x = np.random.rand(N) * 2* np.pi # [0, 2pi]
y = np.random.normal(loc=np.sin(x),scale=sigma,size=N)  # add Gaussian noise

# answer (Ground Truth)
x_gt = np.linspace(0,2*np.pi, 100)
y_gt = np.sin(x_gt)

# plot
plt.scatter(x,y)
plt.plot(x_gt, y_gt)
plt.savefig('test.png')
plt.close()

f:id:triwave33:20190407145547p:plain

 サンプル点から何らかの回帰分析をおこなって、回帰曲線を作図します。回帰曲線はなんらかの機械学習、統計処理で求めた予測値ですが、ここでは単純に正解(sine波)を使っています。

0. matplotlibの下準備

さて、CLIモードでは何もせずにpltクラスのメソッドを呼び出すとエラーが帰ります。これは、デフォルトで使われているmatplotlibのバックエンド(確か'TkAgg'だったっけな)がXサーバーを使うようになっているからで、Xサーバを使えないCLIモードではエラーが返ります。

これを防ぐために、matplotlibのバックエンドを変更しましょう。実行したいコードの先頭(pltのインポート前)に

import matplotlib
matplotlib.use('Agg')

と入れる方法でも良いですし、永続的に変えたい場合は

~/.config/matplotlib/matplotlibrc に

backend:    Agg

と加えます。

1.作業ウィンドウの準備

IDEのように、画面の上側にエディタ、下側にコンソール(コード実行画面)を配置します。

1.1 tmuxを起動

f:id:triwave33:20190407151814p:plain

1.2 画面を横分割

ctrl-b + "

(ctrl を押しながらbを押す。離してから " を押す)

f:id:triwave33:20190407152057p:plain

画面が分割されました。

注:最初の動画では縦分割にしてしましました。縦の方が好みの場合ctrl-b %を使ってください

1.3 画面のサイズを変更

現在アクティブなペインは下側になっています。このペインを下側に広げます。

ctrl-b + J

(ctrl を押しながらbを押す。離してから shift + jを押す)

f:id:triwave33:20190407152605p:plain

ペインのサイズが変わりましたね。上に広げるにはK、下に広げるにはJを押します。連続で押せば複数回変えられます。

1.4 上側のペインにエディタを起動

上側のペインに移動

ctrl-b + k

上側のペインでエディタを起動
vim test.py

1.5 下側のペインにiPythonを起動

下側のペインに移動

ctrl-b + j

仮想環境に入ってiPythonを起動
source activate py36
ipython

2. コーディング

2.1 上側のエディタにコードを書いていく

f:id:triwave33:20190407153738p:plain

変数x,yを定義しました。ここまでの結果を実行して変数x, yの値を確認したいとします。

2.2 下側のペインに移動し、スクリプトを実行

iPythonでは%runというマジックコマンドを使ってスクリプトを実行できます。(runという名前の変数を作らなければ%無しでもいけます)

ipythonコンソール上で

run test.py

と実行してみてください。(シェルのようにtab補完も効きます)

f:id:triwave33:20190407154955p:plain

ipythonコンソール上でスクリプトが実行されます。iPython上でスクリプトを打ち込んだのと同じ効果が得られるので、変数はiPython上にロードされています。

2.3 変数の確認

whoとコマンドを打てば、ipythonコンソール上の変数を確認できます。

f:id:triwave33:20190407155319p:plain

これで、下のipythonウインドウでインタラクティブな開発が可能になります。

f:id:triwave33:20190407160014p:plain

上の図ではiPythonコンソール上で、変数xやyを使って平均や標準偏差を求めて確認しています。

3. 作成した図の確認

上記のスクリプトを完成させて実行すると。test.pngがiPythonの作業ディレクトリ上に生成されているはずです。CLI上でこれを実行するには、fbiコマンドを使います。

3.1 インストール

sudo apt-get install fbi

3.2 画像の確認

fbi -a test.png

で表示されるはずです。(-aオプションは画像サイズの自動調整) tmux上で実行する場合には

fbi -vt 1 -a test.png

でいけるはずです。

qiita.com

Is it possible to run fbi inside tmux if the tmux if running in a virtual tty? - Unix & Linux Stack Exchange

iPython + エディタ開発のメリット

 CLI版(マウスを使わない)でiPythonを使ってデータ分析を行なっている最大の利点は、マウスを使わず、かつホームポジション上のキーのみで操作が完結するので、コーディングと実行・評価が圧倒的に早くなる点です。


  • HHKB:   タイプしやすい、無駄なキーがない
  • CLIモード: マウスを必要としないので、全てをキーボードで操作
  • vim:    矢印キーなどを行わず、ホームポジションで全ての動作を完結
  • tmux :   ペイン(アプリケーション)の高速切り替え
  • iPython:  1ライナーでコーディング途中にどんどんtry & errorができる

 手が遊んでいる暇をなるべく短くすることを突き詰めてこのスタイルになりました。もちろん、JupyterやVS codeなどのIDEも使いますが、

  • Jupyter: 人に見せたりするレポーティング用
  • VS code: 大規模なシステムの開発

 例えば、Jupyterで1ラインでコードを実行していって、「これ一々消すの面倒だな」と思ったことのある人はiPythonを使って見てください。(Jupyterのプラグインであったりして)

課題

CLIにしたことで犠牲にしている機能もあります。

つまるところ、Xサーバが使えないことに起因するものです。現在。

1) クリップボードの使用(エディタ上の行単位のコードをiPythonで実行) 2) plt.show()の使用(いちいち画像保存するのは面倒) 3) キーバインドの使用(矢印キーをctrl + hjklに)

ができません。1)は結構いたくて、エディタから1行コピーしてiPythonで実行させるときは

yy  (1行ヤンク(クリップボードにコピー))
ctrl-b (iPythonに切り替え)
paste (クリップボードの内容をiPythonで実行)

と一連の動作で2秒以内に実行できます。キーバインドも、iPythonで矢印キーを使うとホームポジションが崩れるので少し遅くなります。

 上記をどうしても使いたい場合は、GUIモードでログインしてターミナルを立ち上げて操作しています。結局GUIモードでCLIをしている、割合快適なのですが、ちょっと悔しいですね。解決方法があればコメントいただけると幸いです。

実行速度について

 

 最後にそもそもの疑問として、

Raspberry Piの処理能力でデータ分析ができるのか?」

というところですが、私は十分可能だと思います。さすがにGPUを使うようなディープラーニング系のフレームワークをバリバリ使うのは非現実的ですが、pandasで数万行のデータを読み込んで、numpy、matplotlibなどを駆使してEDA(探索的データ解析)を行うことは可能です。*1

 DLのコードを書くときも動作確認まではraspiで済ませて、しておいて、エラーがでなければ自宅のサーバやクラウドで実行という手も使えます。これは今後試してみるつもりです。

最後に

 特定のキーボードを使ってラズパイPCを作るというかなりニッチな記事になりました。シャレで作ったところもあるのですが、現在は完全にメイン機になっています。何せ、これを持ち運べばどこへいっても大好きなHHKBでコーディングができるのですから。好きなキーボードだけを使うことによるストレスからの解放とQOLの上昇はとてつもないものがあります。*2

 ご興味のある人はぜひトライして、僕に見せていただけたらと思います。また、自作キーボードへの興味も湧いてきましt。

 

 

*1:待ち時間を感じるときもありますが、そんなときは別ペインに切り替えてコーディングを行なっていれば良いのでそんなに区ではありません。

*2:これを気に、職場の据え置きPC、持ち歩きPCも全てHHKBにしました