Chrome OSを開発機にするまでの道のり

## モチベーション

業務ではmacOSを利用していますが、自宅での趣味プログラミングは開発する内容によりUbuntuを利用することが多々あります。
現在使用しているUbuntuはノートPCにインストールして使用していますが、メーカー側でサポートされていないOSのため以下のようなハードウェアに関連する問題がよく発生します。

- TouchPad、Wi-Fi、Bluetooth、カメラなどの周辺機器がうまく動作しない
    - 特にTouchPadの`カーソル飛んでく問題`はつらい
- バッテリーの減りが早い
- Suspend/Resumeがうまく動作しない

それでもソフトウェアの設定変更で対応できることも多いので現在でも愛用していますが、タブレット的に使うにはさらに難度が上がり、そもそも対応できないこともあります。

つまり、ハードウェア部分がサポートされたメーカー純正のLinuxノートPCが欲しいのです。
もちろんメーカー純正のLinuxノートPCは存在しますが選択肢は少なく、2in1などは見たことがありません（情報お待ちしております）。
そこで最近、ハイスペックな構成も選択でき、Linuxコンテナが起動できるChromebookであれば、上記の問題をクリアできそうなので検証をしたいと思います。

## 前提
- Chrome OSの情報
    - Version: 72
    - Channel: dev
- `Project Crostini`を利用
    - Linuxカーネルが古いデバイスはサポート外となるようなので注意が必要です
    - 対応デバイスは[こちらのリンク](https://chromium.googlesource.com/chromiumos/docs/+/master/containers_and_vms.md#supported)から調べられます。
    - 有効にする方法は[こちら](https://chromium.googlesource.com/chromiumos/docs/+/master/containers_and_vms.md#quickstart)
- OSSのChromium OSではなく、この記事では`Project Crostini`がサポートしているChromebookを利用しています

## 開発機にするため確認したこと
それでは開発機とするために、個人的に必要な要素を検証していきます！！

### LinuxコンテナのOSは？
Chrome OS v72ではdebian 9.5でした
<img src="https://qiita-image-store.s3.amazonaws.com/0/62029/38e943c7-a3c1-0c62-0aa4-6fc5fdeb0791.png" width="600"/>


### 日本語入力はできるのか？
一応できます！

日本語入力の設定はChrome OS側とLinuxコンテナ側、それぞれで設定が必要です。

#### Chrome OS
Mozcが入っているため、`入力方法の設定`でGoogle日本語入力に切り替えるだけです。
<img src="https://qiita-image-store.s3.amazonaws.com/0/62029/bfc13bcf-79da-0198-2921-cab17290e7ca.png" width="600"/>

ただし、Google日本語入力の`ひらがな`と`直接入力`を切り替えるショートカットが見当たりません。
一部の記事では`Alt+Shift`で切り替えられていますが、自分の環境では切り替えできなかったので、英語のキーボードも追加し`Ctrl+Space`で日本語と英語を切り替えています。
<img src="https://qiita-image-store.s3.amazonaws.com/0/62029/aff002c4-f423-5c4d-7647-2ab370aa4bb0.png" width="300"/>

#### Linuxコンテナ
Linuxコンテナの場合は、日本語入力をするためのソフトや設定が必要です。
以下の記事を参考に`fcitx-mozc`をインストールし`fcitx-configtool`で設定すれば動作します。

- [ChromeOSのLinux(Crostini)で日本語入力(自動起動対応)](https://www.axon.jp/entry/2018/10/18/201812)

自動起動の設定も記事の通りの設定で問題なく動作しました。感謝です！

設定画面では入力メソッドのショートカットなどが変更できます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/62029/473dade2-1617-2e1b-3d7d-6afb45f9711a.png" width="400">

入力中のスクリーンショットはこんな感じです。
<img src="https://qiita-image-store.s3.amazonaws.com/0/62029/f294a79d-3245-b16e-0a6b-4d13c0101481.png" width="400">

ただし、自分の環境では以下の現象が発生し、動作が安定しません。

- 日本語の変換中にフリーズが発生し、そのままChrome OSごとシャットダウン
- 変換ウィンドウが表示されなくなる
- 入力自体ができなくなる

上記の不安定な動作に加え、アプリケーションによっては変換ウィンドウが残念な位置になります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/62029/f5c0b78b-faf7-99aa-1cbb-edb41cedbcad.png" width="400">

### 標準のTerminalは十分に使えるのか？
普段iTermやgnome-terminalを使用しているので、それらと変わらない操作感を得られるか検証しました。

Chrome OSで用意されているTerminalは、`Shif+Ctrl+p`でプロファイルの変更ができます。
変更できる内容はAppearanceやKeyboardの設定変更が可能です。

プロファイルの変更画面の一部
<img src="https://qiita-image-store.s3.amazonaws.com/0/62029/2adf193f-0364-2923-e4e0-69d470db87ff.png" width="400">

自分としてはコピー＆ペーストなどのショートカットを、いつも使っているコンソールアプリと同じキーにしたかったのですが設定がなかったので、今回はgnome-terminalをインストールして使うことにしました。

そのほかにも地味な制限があり、インストールしたフォントが標準のTerminalでは読み込めないようです。
promptやtmuxをpowerline系の表示にしている方、Rictyなどのいつも使っている日本語フォントがある場合は標準ではないターミナルを使った方が良さそうです。

gnome-terminalとhyperの例
<img src="https://qiita-image-store.s3.amazonaws.com/0/62029/8dccc584-1e92-fa45-a870-be543f933bb4.png" width="600">


### エディターやIDEは使えるのか？
私が普段使っているエディターやIDEは以下になります。

- Vim
- Emacs
- Visual Studio Code
- IntelliJ IDEA Ultimate

（日本語入力部分を除けば）アプリケーション自体の動作は問題ありませんでした。
<img src="https://qiita-image-store.s3.amazonaws.com/0/62029/9ee5d595-d112-6366-3e76-521d42b00773.png" width="600">

### データ共有はできるのか？
Chrome OSとLinuxコンテナのデータ共有は、Crostiniの場合特別な設定は不要です。
Chrome OSのファイラーからLinuxコンテナのホームディレクトリが参照できるので、このインタフェースからデータの受け渡しが可能です。
<img src="https://qiita-image-store.s3.amazonaws.com/0/62029/d8283f9b-364b-16c8-1ba6-a81305dac254.png" width="600">

### Dockerは動作するのか？
動作します！

以下の記事を参考にLinuxコンテナの設定変更をします。

- [ChromeOS/Crostini で Docker が動かなくなる問題の解決 - Qiita](https://qiita.com/azumag/items/a834f8cce08a65570033)

またインストール方法によりますが、Dockerの公式ドキュメントの手順でインストールした場合、systemdのcontainer.service設定にある`ExecStartPre`を修正する必要があります。
詳細は以下の記事を参照ください。

[18.09: containerd depends on overlay · Issue #475 · docker/for-linux](https://github.com/docker/for-linux/issues/475)

### キーバインドは変更できるのか？
Chrome OS側で以下のキーが変更できます。
＊使用しているデバイスによって変わりそうな気がします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/62029/c8f4a729-7e51-3309-d40f-a09fb4284ee8.png" width="400">

上記の他は変更できないため、カスタマイズが必要な場合はIMEを自作する必要があります。
公式のサンプルや増井先生のIMEが公開されているのでそちらを参考にどうぞ。

- [mozc/src/chrome/sample_ime at master · google/mozc](https://github.com/google/mozc/tree/master/src/chrome/sample_ime)
- [Chaim](https://masui.github.io/Chaim/)

個人的にはMozcの挙動を保ちつつ、キーバインドだけを変えたかったのでMozcをカスタマイズビルドしてみました。
インストールもでき、入力メソッドとして認識はしましたが動作していません……現在も調査中です。

キーバインドの変更方法は他にもありそうなので、簡単な方法が見つかれば検証していきたいと思います。

### クリップボードの共有
Chrome OSとLinuxコンテナ間のクリップボードは、PRIMARYセクションは共有されず、CLIPBOARDセクションは共有されます。
通常のコピー＆ペーストであれば問題なく動作します。

## 最後に、結局Chrome OSを開発機にできたのか？
まだ開発機として使えてないです！！
キーバインドが変更できないとやる気が湧いてこないので絶賛改善中です。

逆に「キーバインドは変えません」派の方は、十分に開発ができるのではないでしょうか。