子供に邪魔されない開発環境を整える

[NIFTY Advent Calendar 2016](http://qiita.com/advent-calendar/2016/nifty) の9日目の記事です。
ここまでしっかりした内容が続いたのでここらで休憩としましょう。

# 経緯

子供が歩くようになってから、ノートPCを開くとキーボードを叩きにくるようになりました。
ここでいう叩くは指先によるものではなく、手のひらによるものです。

これではうかうかPCを開いていられません。
家で趣味の開発ができなくなってしまいます。

そうだ、**スマホで開発**しよう。

# 用意したもの

* Android端末
* Termux
  * https://play.google.com/store/apps/details?id=com.termux&hl=ja
* Bluetoothキーボード
  * http://www.logicool.co.jp/ja-jp/product/multi-device-keyboard-k480
  * Termux を使う上では必須です

# Termux

Termux については他にも多くの記事があるので詳しくは説明しませんが、
Android 上で簡易的な Linux 環境を提供してくれるアプリです。無料です。rootになる必要はありません。

またパッケージマネージャーが付いており `vim`, `tmux`, `golang` などがインストールでき、ちょっとした開発環境であれば簡単に構築できます。

他にどのようなパッケージが利用できるか興味ある方は以下のリポジトリを参照してください。

https://github.com/termux/termux-packages

ただ 2016/12/08 現在では Vim8 がインストールできても channel や job が有効になっていなかったり、 `Java` に対応してないという問題点があります。
特に `Java` 未対応は困ります。 Clojure の開発ができません。Perl と Clojure で8割の人がカバーできるこの世の中、Clojure開発ができないのでは開発環境とは呼べません。

* http://www.yasuhisay.info/entry/2016/06/27/083000

> 「えっ、Perlかよ」という人がいるといけないので、Clojureで構造化パーセプトロンを使った係り受け解析のサンプルコードへのリンクも張っておきます(2種類あります)。PerlもClojureもあれば8割くらいの人はカバーできそうなので、安心ですね。

# DigitalOcean on Termux

ここで気付きました。
Termux 上で Golang がインストールできるということは [DigitalOcean](https://www.digitalocean.com/) のコマンドラインツールである [doctl](https://github.com/digitalocean/doctl) がビルドできるということに。

DigitalOcean 上に開発環境を用意すれば `doctl` を使って Termux 上から droplet を作ったり消したりできますし、ネットワークさえあればいつでも使える自由な環境が手に入ります。
そしてスマホであればネットワークがないことを心配する必要はありません。

例えば以下のような `Makefile` を用意します。
デフォルトではシンガポールリージョンに一番安いプランで Ubuntu マシンを作ります。

* https://gist.github.com/liquidz/5cdba6b7b718292723697cfb20776bda

```basemake:Makefile
DROPLET_NAME = mytest
KEY_NAME     = termux
DOCTL        = $(GOPATH)/bin/doctl
CONFIG       = $(HOME)/.config/doctl/config.yaml
DO_REGION    = sgp1
DO_IMAGE     = ubuntu-16-10-x64
DO_SIZE      = 512mb

all: $(DOCTL) $(CONFIG)

$(DOCTL):
	go get github.com/digitalocean/doctl/cmd/doctl

$(CONFIG):
	doctl auth init

list:
	doctl compute droplet list

ssh-key-create:
	doctl compute ssh-key create $(KEY_NAME) \
		--public-key "$(shell cat ~/.ssh/id_rsa.pub)"

create:
	doctl compute droplet create $(DROPLET_NAME) \
		--region   $(DO_REGION) \
		--image    $(DO_IMAGE) \
		--size     $(DO_SIZE) \
		--ssh-keys $(shell doctl compute ssh-key list | grep $(KEY_NAME) | cut -f1)

delete:
	doctl compute droplet delete $(DROPLET_NAME)

ssh:
	doctl compute ssh $(DROPLET_NAME)
```

すると以下のように Termux 上からカジュアルに droplet の作成/削除ができるようになります。

```bash
$ git clone https://gist.github.com/5cdba6b7b718292723697cfb20776bda.git digitalocean
$ cd digitalocean
# (初回だけ) doctl のインストール、DigitalOcean の認証
$ make
# (初回だけ) ~/.ssh/id_rsa.pub を DigitalOcean に登録
$ make ssh-key-create
# droplet を作成
#   デフォルトではシンガポールリージョンに 512MB の Ubuntu 16.10 x64 を作成
$ make create
# ssh 接続
$ make ssh
# droplet を削除
$ make delete
```

端末上ではこのように見えます。

![digitalocean_create_droplet.png](https://qiita-image-store.s3.amazonaws.com/0/8491/8fbfd875-ab1a-5b65-74a5-8b645e3592cb.png)

あとは `chef` なり `ansible` なり `itamae` なり `mitamae` なりで用意してあるクックブックをプロビジョニングしてあげればよいだけです。これで勝つる。

# 結果

普段 HHKB を使っている身からすると logicool の Bluetoothキーボードの打鍵感はツライものがあるのですが、ここ1ヶ月以上、家でのコーディングをノートPCではなくスマホだけでやった結果からいうと大きな問題はなく普通に開発できてます。
READMEが全然書けていませんが、以下の Extreme Learning Machine の Clojure 実装は実際にスマホ上で開発したものだったりします。

* https://github.com/liquidz/elm.clj

また自宅以外で [VimConf2016](http://vimconf.vim-jp.org/2016/) へもスマホだけで乗り込んでみましたが、まわりが皆PCを開いている中1人スマホを見つめるという若干の気まずさを除けば、メモも開発もできるので当然問題はありませんでした。

ただ調べ物をするための `w3m` が JS 未対応であるために見れないページがあるのが唯一ツライところです。

# 最後に

子供がBluetoothキーボードを叩いたり、上に乗るようになりました。やめて。