Chromebookで開発するメモ

Chromebookを開発マシンとして使おうと数日設定したときのメモ。

# 結論 (ChromeOS 86の時点)

結論としてはLinux開発マシンとして十分使える。
特にWebアプリ開発や外部サーバーにSSHでつなげて作業する場合は便利。

しかし課題は２つ。（１）GUIアプリの動作が不安定、（2）日本語入力が不安定。
ターミナル上で軽い編集作業をしたり、Linuxをサーバーとして使う分には問題ない。


# CrostiniとTermuxを組み合わせて使うと便利

Chromebook上でLinuxを使う場合、たくさんの選択肢がある。多いことは良いことだがどれにしてよいか悩む。

 - ChromeOS標準のLinuxコンテナのcrostini --- Debian
 - AndroidアプリのTermux --- Androidとの親和性高し
 - AndroidアプリのUserLand --- 好きなOSを選べる
 - ChromeOSを開発者モードにして使うcrouton --- 開発者モードにする必要がある

まず、手軽に始められてDebianが使えるのがcrostini。ChromeOSの設定アプリでLinux(ベータ)をオンにするだけで使い始めることができる。

そして、ChromeOS/Androidとの親和性が高いのはTermux。Termuxは別途Termux-APIをインストールすると、クリップボードの操作やいろいろコマンドラインからAndroidの機能が操作できる。任意のURLを開いたり、クリップボードを連携したりChromeOSと組み合わせて使うのに便利。

Termuxもcrostiniも別個のアプリとしてインストールされるので、ディスクスペースに余裕があるなら、両方入れて良いところどりすると良いかも。個人的には、crostiniとTermuxの二刀流を選択している。軽い作業にはTermuxで、Termuxで動かないものはcrostiniで動かすという感じ。ほとんどTermuxで動くけど。

ただし、ChromeOSでは、Termuxアプリのコマンドライン上では日本語が一切入力できないというデメリットがある。(sshサーバーを実行してSecure Shellと組み合わせることで回避できる。)

### BenchMark

TermuxとCrostiniで性能に差があるのか調べてみました。[UnixBench](https://github.com/kdlucas/byte-unixbench)を使ってベンチマークを取ってみました。参考までにRaspberry Pi 3B/ 4Bと比較してみます。

| 環境 | Score | CPU | Memory | 
|---------|-------|-----|--------|
| IdeaPad DuetでTermux | 1237.2 | P60T(ARMv8)x8 @ 2.0GHz | 4GB |
| IdeaPad DuetでCrostini | 1313.3 | P60T(ARMv8)x8 @ 2.0GHz | 4GB |
| Raspberry Pi 4 Model B | 864.1 | ARMv7 x 4 @ 1.5GHz | 4GB | 
| Raspberry Pi 3 Model B | 303.3 | - | - |
| vivo v17 proでTermux | 1002.5 | x6 @ 2.0 GHz | 8GB |
| MacbookAir 2019で仮想マシンUbuntu | 2021.8 | Intel Core i5 x4 @ 1.6GHz | 16GB |

上記のように結果が出ました。TermuxもCrostiniもそれほど性能に違いはありませんでした。

## crostiniのメモ

Debian、基本的に便利。ただし、GUIアプリの日本語サポートが微妙。PythonのIDLEなど、Tkベースのコンポーネントでは問題なくMozcで日本語入力できた。

crostiniの端末画面では、マウスで文字を選択するとクリップボードにコピーされる。[ctrl]+[shift]+[v]で文字を端末に貼り付けできる。

Pythonの簡易エディタ環境のIDLEなどでは問題なく日本語入力できる。まともに入力できるターミナルには、mate-terminalがある。インストール後Linuxを完全に再起動したら、meta-terminal上で日本語入力できるようになった。

- [(参考)IMEの設定 - Clostini on Cloud...]( https://leaves2min.blogspot.com/2019/05/clostini-on-cloudready-ime-2019517.html)

なお、xselを使うとChromeOSのクリップボード連携もできる。`xsel --bi`でコピー。`xsel --bo`でペースト。

Linux（ベータ版）　... いろいろ苦心してcrostiniを使っていたが、ある日突然、起動しなくなった。。。β版であることを意識して使うべき。


## Termuxの設定メモ

Termuxの設定については以下に詳しく手順を書いた。

 - [Termuxを素早く設定](https://qiita.com/kujirahand/items/8e34e05e7296134b55cd)

Termuxの端末画面では、マウスで文字を選択するとクリップボードにコピーされる。[ctrl]+[alt]+[v]で文字を端末に貼り付けできる。


## ChromeOSとLinux側の連携

Termuxを使えば、クリップボード(termux-clipboard-set, termux-clipboard-get)で読み書きできる。

ネットワークは安全性を考慮され隔離されているので、linux側でサーバーを起動しても、ChromeOSのブラウザ(chrome)側からアクセスはできないようになっている。

```
# crostiniの場合
sudo ifconfig | grep inet

# Termuxの場合
ifconfig | grep inet
```

筆者のIdeaPad Duetでは、`100.115.92.xxx`が表示された。Chromeブラウザでこのアドレスにアクセスすると正しくアクセスできた。

例えば、php7のサーバー機能を使う場合、以下のようにしてポートを指定してサーバーを起動。

```
php -S 0.0.0.0:8888
```

crostiniではChromeOSのLinux設定で`ポート転送`の8888を指定する必要がある。Termuxでは指定不要。

ブラウザで、`http://100.115.92.xxx` にアクセスすると、正しくPHPのプログラムを実行できた。拙作の[KonaWiki3](https://kujirahand.com/konawiki3/) で確認した。

クラウドに保存するときは、Googleドキュメントでも良いが、WIKIを動かせばローカルにいろいろメモできて便利。

また、`http://penguin.linux.test`というアドレスが割り振られているので、このアドレスにアクセスするのも便利。


## VSCodeを快適に使う方法

crostiniではVisual Studio Codeをインストールして使うことも可能。

- 以下が参考になる
- https://qiita.com/tac0x2a/items/ce4b969e9179cca19886

また、[サーバー版のVSCode](https://github.com/cdr/code-server)をインストールして、ChromeOS側からアクセスすることもできる。

残念ながらTermuxではうまくいかなかったが、crostiniで下記コマンドでサーバー版のVSCodeがインストール可能。

```
curl -fsSL https://code-server.dev/install.sh | sh
```

そして、ChromeOSのLinuxの設定でポート転送を有効にする。

![Screenshot 2020-10-18 at 10.44.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33180/2ac7b4c4-7e19-b465-a728-dc82b658784f.png)

そして、以下のようにコードサーバーを起動する。

```
code-server --bind-addr 0.0.0.0:8080
```

そして、上記で紹介したようにブラウザ側でLinux側のIPアドレス:ポート番号にアクセス。

![Screenshot 2020-10-18 at 10.49.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33180/8f54086f-0c55-ffe6-603e-006e61e4b615.png)

VSCode、ブラウザの中で動いてとても便利。


## TermuxでChromeOS側にデータを保存したとき - Permission Deniedの罠

Termuxではtermux-setup-storageを実行すると、ChromeOS側のダウンロード(download)やギャラリー(dcim)にアクセスできるようになる。

しかし、ChromeOSではシステム領域とユーザーが使うストレージ領域が明確に分離されており、ストレージ領域ではスクリプトの実行も拒否される設計となっている。

Go言語など、ChromeOS側でも共通のファイルを編集しようとdownload内にGOPATHを設定していたのだが、download内で作成したバイナリはTermux内にコピーしても実行できなかった。ストレージ領域ではシェルスクリプトも実行できない。

ただし、ストレージ領域でスクリプトファイルを作成し、システム領域にあるコマンドを実行することはできる。例えば、download内でa.pyというファイルを作成し、`python a.py`とすればa.pyを実行することはできる。ただし、a.pyの一行目に#!のシェバンを書いて実行権限を与えても実行はできない。

# 外部公開 - 外部端末からChromebookのサーバーにアクセス

Linux設定の`ポート転送`を指定し、Linuxで何かしらのサーバーを起動する。すると、外部の端末からChromebookにアクセスできるようになる。

ただし、Chrombook端末のLinux側のifconfigで端末アドレスは見ることはできない。ChromeOSの設定のWifi設定で接続先の詳細を見るとローカルアドレスを知ることができる。

# macOSを置き換えできるか

ターミナル上で仕事が片付くならできる。

ターミナル上での作業について、購入した端末IdeaPad DuetとMacbook Airで値段が3倍以上違うので単純に比較できないが、コンパイル作業が必要ないPHPやPythonなどのWeb系の仕事はほとんど大差なく使える。Go言語でコンパイルが必要なプロジェクトでは、Macbookだと一瞬でコンパイルが終わるものが、IdeaPadだとコンパイル時間に少しストレスを少し感じた。

## 参考

 - [Chrome OSを開発機にするまでの道のり](https://qiita.com/watawuwu/items/26cd2c823b7023131b1c)
 - [Chromebookを快適な開発環境にするためのプチノウハウ群](https://qiita.com/komde/items/25b4c80598d7e2b679f6)
 - [2019年末版：Chromebookを開発に使う](https://qiita.com/shibukawa/items/7200bd9d0afa6c0d4ed1)