スキマ時間を活用するためにAndroidスマホに開発環境を構築してみた。

こちらは[フロムスクラッチ Advent Calendar 2017の21日目](https://qiita.com/advent-calendar/2017/fromscratch)の記事です。

# はじめに
移動中の電車の中や待ち合わせで人を待つ間など、日常の中にはちょっとした空き時間ができることはよくありますよね。
そういうとき、どのようにしてその時間を過ごすことが多いですか？
自分の場合、スマホでニュースサイトを見たり、ぼーっとして過ごすことが多いです。しかし、仕事やプライベートも忙しくなるにつれ、もっとスキマ時間を有効活用したいなーと思うようになりました。
そこで、自分が常に持ち歩いているAndroidスマホに開発環境を構築し、いつでもどこでも開発ができる状態を作ってみました。

# 対象読者
- スキマ時間を有効活用したい人
- スマホに開発環境を入れて、持ち運びたい人

# 環境
手持ちのスマホにRailsの開発環境を作ってしました。

- HUAWEI P9 lite
- Android 7.0
- Rails 5.1.4

# ゴール
Android上でRailsを動かせる状態を目指します。


# AndroidにTerminal環境を準備する。
Railsを動かすためにはTerminal環境が必要です。AndroidはLinuxをベースに作られているのでrootをとることで直接Terminalをいじれたり、導入することででLinuxのTerminalが使えるようになるアプリが公開されています。今回はTermuxというアプリを使います。

[Termux](https://termux.com)

このアプリはAndroid 5.0以上に対応していて、root権限がなくてもTerminal環境を提供してくれるすごいやつです。
Google Play Storeからアプリをダウンロードしましょう。

# PCからAndroidにsshで接続する。
Termuxのインストールが完了したらアプリを起動してみましょう。黒いTerminal画面が現れると思います。
そのままAndroid上で作業を進めても問題ありませんが、PCから操作できたほうが便利なのでsshの設定をします。
必須の作業ではありませんので、お好みで。
（あくまで環境構築のために一時的にPCを使用しています。「PC使えるならそっちでやればいいじゃん。」とは言わないで。。。）

すでに利用してるssh鍵があればそれをTermuxにコピーし、なければ新規にssh鍵を作成しましょう。
※[公式の手順](https://termux.com/ssh.html)によると、パスワードによるログインはできないようなのでsshを利用する場合は鍵認証が必要です。

```shell
# Termix上でssh鍵を作成する場合
bash-4.4$ ssh-keygen -t rsa
bash-4.4$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
bash-4.4$ chmod 600 ~/.ssh/authorized_keys 
bash-4.4$ # （よしなに id_rsa をPCに移動する。）
```

鍵を作製したらopen-sshをインストールし、sshdを起動しましょう。

```shell
bash-4.4$ pkg install openssh
bash-4.4$ sshd
```

無事起動できたらPCから接続してましょう。

```shell
pc$ ssh xxx.xxx.xxx.xxx -p 8022 -i /path/to/id_rsa # androidのipは `ip -4 a` で確認できます。またデフォルトのポートは`8022`です。
Welcome to Termux!

Wiki:            https://wiki.termux.com
Community forum: https://termux.com/community
IRC channel:     #termux on freenode
Gitter chat:     https://gitter.im/termux/termux
Mailing list:    termux+subscribe@groups.io

Search packages:   pkg search <query>
Install a package: pkg install <package>
Upgrade packages:  pkg upgrade
Learn more:        pkg help
bash-4.4$
```

接続できましたね。

# Ruby/Railsをインストール。

Terminal環境が準備できたので、必要なパッケージを入れていきましょう。
グローバルインストールしていますがgemのインストール先はローカルでも問題ありません。

```
# rubyとbundleをインストール
bash-4.4$ pkg install -y ruby
bash-4.4$ gem install bundle
bash-4.4$ gem install rails
bash-4.4$
```

これで上手くインストールできればよかったのですが、依存関係にあるGemがなかなか入ってくれず、はまりました。
エラーログを見つつ不足していたパッケージを追加していきました。

```
bash-4.4$ pkg install -y ruby-dev
bash-4.4$ pkg install -y clang
bash-4.4$ pkg install -y make
bash-4.4$ pkg install -y libxml2
bash-4.4$ pkg install -y libxml2-dev
bash-4.4$ pkg install -y libxslt
bash-4.4$ pkg install -y iconv
bash-4.4$ pkg install -y pkg-config
bash-4.4$ gem install nokogiri -- --use-system-libraries
```

上記パッケージをインストールした後に、`gem install rails`でうまくいきました。

```shell
bash-4.4$ gem install rails
Fetching: concurrent-ruby-1.0.5.gem (100%)
Successfully installed concurrent-ruby-1.0.5
  :
  :
Successfully installed rails-5.1.4
33 gems installed
bash-4.4$
bash-4.4$ rails -v
Rails 5.1.4
bash-4.4$
```

# railsプロジェクトの作成
railsをインストールできたらプロジェクトを作成します。

```
bash-4.4$ rails new hello_world  --skip-bundle
bash-4.4$ cd hello_world
```

追加したいGemをGemfileに追記したら、`bundle install`します。
ここも、すんなりGemが入ってくれず追加で設定・パッケージを入れました。

```
bash-4.4$ bundle config build.nokogiri --use-system-libraries
bash-4.4$ apt install -y libffi-dev
bash-4.4$ pkg install -y libsqlite-dev
bash-4.4$ pkg install -y nodejs
```

パッケージ追加後は `bundle install` でうまくいきました。

```shell
bash-4.4$ bundle install
  :
Bundle complete! 16 Gemfile dependencies, 70 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
bash-4.4$
```

# サーバー起動＆接続確認
必要なGemのインストールが完了したら、サーバーを起動してみましょう。

```shell
# 起動
bash-4.4$ rails s -b 0.0.0.0
```

スマホのブラウザから「http://127.0.0.1:3000 」にアクセスすると、welcome画面が見れます。
もちろんPCからIP指定しても同じ画面が確認できます。

![Screenshot_20171222-010832.png](https://qiita-image-store.s3.amazonaws.com/0/165376/8dfe23e5-40ae-b3d5-2787-214ee57dc880.png)

これで、開発環境を持ち運べるようになり、時と場所を選ばず、Railsの開発ができるようになりました。

# まとめ
- 今回は環境を構築したところまでしかできていないので、今後試して行こうと思います。
- Termuxを使えば、Ruby on Rails に限らず好きな言語の開発環境を構築できるはずです。
- Termuxは神。