MacbookProが壊れたのでUbuntuに開発・業務環境を乗り換えてみたら非常に簡単だった件（Ubuntu18.10 設定メモ）

# はじめに、事の顛末。

弊社では、JavaScript/Python/Goなどでの開発や、LaTeXによる文書作成やMicrosoft Officeによる業務作業について、そのほぼ全てをApple Mac(book Pro)にて行っている。[^1] 私も例にもれず、ほぼすべての業務をMacbook Proで行っていた。

[^1]: ただし、サーバや実験環境などはMacではなく、UbuntuやDebianなどを利用して構築することが多い。

が、そのMacbook Proが突如壊れた。故障の詳細は省くが、AppleCareをフル活用して早急に修理に出すことにした。しかし、修理完了・引取まで1週間〜10日との見積もり。あるコードが書け、ある程度の事務仕事がこなせるような最低限の代替手段を用意しなければならない。何かしら私物の計算機を購入しようとは思っていたので、即座にそれを購入してそれをあてがえば良かろう。しかしながら新型Macをプライベートで買うには少々予算オーバー。ビックカメラで呆然とする眼の前にはIntel NUC7i7BNHというCore i7 7567U搭載の超小型ベアボーン。それほど高くない。[^2] 天啓が降りた。

[^2]: 最新のMacbookProやMac mini比。Core i7, RAM16GB, SSD1TBで100k+JPYくらい。

この箱買って、最新型モバイルコンピューティング [^3] しよう。

[^3]: 箱とキーボードとマウスを持ち運んで出先でモニタにつないで作業する。NUCが軽量な上にパワフルで、想像以上に快適。

というわけで、このエントリはMacOSXの代替環境構築の記録である。弊社の業務であれば、Macでなくともだいたいこれでどうにかなる。

# OSインストール

異論はあると思うが、MacOSXでもLinux(Ubuntu)でもコードを書く分には大差ないだろうという判断の下、Ubuntu18.10を業務環境として選定。Windowsが必要になったらそのときに改めて仮想マシンで動かせばよろしい。

今回はUSBスティックからUbuntuのインストールを行った。この時点ではまだ手元に瀕死のMBPがあったため、MacOSX下でブートUSBスティックを作成した。

1. 適当なミラーサーバからUbuntu Desktop 18.10のディスクイメージ(iso)をダウンロード。(例えば[理研](http://ftp.riken.jp/Linux/ubuntu-releases/)さん。)
2. MacでisoファイルをブートできるようにUSBスティックに書き込む。[こちらの記事](https://qiita.com/sei1tani/items/d731d1a7165a42c0df65)を参考にisoをddで直接USBスティックへ流し込む。他のQiita記事でよくあるimgファイルへの変換は不要、isoを直接流し込めばよろしい。
   1. `$ diskutil list`でUSBスティックのデバイスパスを確認。仮に`/dev/diskX`とする。
   2. `$ diskutil unMountDisk /dev/diskX`でUSBスティックをアンマウント。
   3. `$ sudo dd if=ubuntu-18.10-desktop-amd64.iso of=/dev/rdiskX bs=1m`でUSBスティックへISOを流し込む。
   4. USBスティックが自動でejectされない場合、`$ diskutil eject /dev/diskX`でejectする。
3. Intel NUCにUSB スティックを差し込んでUbuntuを起動。Intel NUC7i7BNHの場合、起動ロゴが出た時点でF7を押せば起動できる。
4. パーティションなど、それぞれ自由に設定してインストール作業。この時点で日本語Localeで設定してもよいが、特に英語でも困らないのであれば全て英語のみで設定することを勧めたい。これは、以下の些末な理由による。
   - 後で日本語入力をmozc (Google Japanese Input)を入れる場合、デフォルトの日本語IMEは不要。
   - homeディレクトリ以下のDocumentsやPictureなどのフォルダ名が「ドキュメント」や「画像」などの日本語になってしまうため、ターミナルから使いづらい。[^4]
5. インストール完了。起動してログインする。OS全体をアップデートしておく。 

    ```shell
    $ sudo apt update; sudo apt dist-upgrade; sudo apt clean; sudo apt autoremove
    ```

[^4]: もちろんここだけあとから英語に変更可能。

# 日本語入力

英語のみでインストールを行った場合、当然日本語入力はできない。そのため、まずは日本語入力環境を設定する。入力エンジンとしてGoogle日本語入力 (Mozc) を採用。Ubuntu 18.10ではインプットメソッドフレームワークとしてiBusが採用されているため、iBus用のmozcを採用する。

```bash
$ sudo apt install ibus-mozc
```

GnomeShellのSettingアプリにおいて、Region & Language -> Input Sources から Input Source の `Japanese (Mozc)` を追加。これでMozcによる日本語入力が可能となる。しかし、**ショートカットキーによるInput Sourceのトグル変更では、直接英数入力とかな入力を快適にトグルすることが不可能である** ([参考](http://zaka-think.com/linux/ubuntu/ubuntu-mozc-setting/))。このため、かな入力と英数入力との切り替えはInput Sourceを変更するのではなく、MozcのInput Modeの変更で行う。すなわち、今後Input Source `English (US)`は使わない。ただし、これを消すとタスクトレイから入力状態のアイコンが消え去るので優先順位を下げてそのままにしておく。

続いて、ショートカットキーのキーバインドの設定を行う。MozcのInput Mode 英数入力 <-> 日本語入力をどの環境でも`Ctrl-\`([^5])で行いたいため、Mozc SetupアプリにおいてKeymap -> Keymap styleを選択し、以下の変更を行う。

- Mode: 'Direct input'・Command: 'Activate IME'のKeyを`Ctrl-\`に変更。

- Mode: 'Precomposition'・Command: 'Deactivate IME'のKeyを`Ctrl-\`へ変更。

また、もう使うことのないInput Source `English (US)` を誤って有効にしないよう、GnomeShell Settingsアプリの Devices -> Keyboardより、Input Sourceの切り替えのショートカットキーも普段全く使うことのないキーバインドにしておくといい。

[^5]: Emacsユーザなので…

ログインし直せば、上記でMozc Input Modeの英数入力とかな入力を`Ctrl-\`のトグルで変更可能になっているはず。

# コミュニケーション関係

まずは業務に関係するコミュニケーション関係のツールを入れていく。ブラウザなどは別途すでにGoogle Chromeなどが導入されていると仮定している。

## Slack

何はともあれSlack。しかしながら、Ubuntu SoftwareアプリからインストールしたSlackでは、日本語入力ができない。一方で[公式](https://slack.com/intl/ja-jp/downloads/linux)からダウンロードしたものをインストールすると、起動せずにSegmentation faultする。[この記事](http://ubuntuhandbook.org/index.php/2018/11/slack-app-not-launching-ubuntu-18-10/) (英語)を参考に、公式サイトからダウンロード・インストール後に`libnode.so`を上書きすることで対処する。

1. atom-betaをインストール (https://flight-manual.atom.io/getting-started/sections/installing-atom/)
2. `libnode.so`の場所を確認。

    ```
    $ sudo updatedb && locate libnode
    /usr/lib/slack/libnode.so
    /usr/share/atom-beta/libnode.so
    ```

3. Slackの`libnode.so`をatom-betaのそれで上書きする。

    ```
    $ sudo mv /usr/lib/slack/libnode.so /usr/lib/slack/libnode.so.old
    $ sudo cp /usr/share/atom-beta/libnode.so /usr/lib/slack/libnode.so
    ```

4. Slackを起動。

## メール

Thunderbirdは機能的な要件(GMail/Exchange対応)は満たすものの、幸いクラウドベースのメールサービスしか利用していなかったため、スタンドアロンクライアントを諦めてブラウザを利用することにした。Chrome系ブラウザに[Checker Plus for GMail](https://jasonsavard.com/Checker-Plus-for-Gmail)を利用することでリアルタイムでGMail(G Suite含む)のメール通知がでる。ユーザビリティも上々。

→ GearyとGNOME Calendarも導入した。GNOMEにGoogleアカウントを同期させてスタンドアロンでも動作するようにしている。(2020/04現在@Ubuntu 19.10)

# 開発環境

## JetBrains (PyCharm/WebStorm他)

JetBrains Toolboxを[ダウンロード](https://www.jetbrains.com/toolbox/app/)、そこからPyCharmやWebStormをインストールすればよい。

設定をMacから移行する場合、[Jetbrains Settings Sync](https://pleiades.io/help/idea/sharing-your-ide-settings.html)にIDEからログインすることで、JetBrainsアカウントを通じて設定が自動同期される。キーマップが全く反映されないことと、Super(Windows)キーを修飾キーとして使えないバグ(仕様？)があったので、WebStormなりのIDEから Help -> Edit Custom Propertiesで`idea.properties`に以下を追加。

```
keymap.windows.as.meta=true
```

参考: https://youtrack.jetbrains.com/issue/IDEA-144702

## VSCode

VSCode自身は、[公式サイト](https://code.visualstudio.com/docs/setup/linux)からdebファイルをダウンロード、指示通りにインストールを行えばよい。

```
$ sudo apt install ./<file>.deb
```

設定については、[こちらの記事](https://qiita.com/canpok1/items/a7c4c96e3c1c2a1cc532)を参考に、`~/.config/Code/User/settings.json`をDropboxやGitHubなどを経由して他の環境と同期している。extensionsの再取得は面倒なので、`~/.vscode`をMacからまとめてコピペした。

VSCodeを起動するとなんだかメモリが足りないとか言われるので、[こちらの記事](https://vscode-doc-jp.github.io/docs/setup/linux.html)を参考に、`/etc/sysctl.conf`の末尾に

```
fs.inotify.max_user_watches=524288
```

を追加している。

```shell
$ sudo sysctl -p
```

で反映される。

## Emacs

私はLaTeXを書く場合などはEmacsを利用するため、EmacsとEmacs用のmozcをインストールする。

```shell
$ sudo apt install emacs emacs-mozc
```

日本語入力については、IBusがemacsのキーバインド`Ctrl-\`をフックしてしまう。IBusの方でちゃんと入力できれば問題ないのだが、Emacsではインラインでは入力できないので非常にユーザビリティが良くない。このため、Emacsを起動しているときはIBusを無視することにする。また個人的な好みで、Super(Command/Windows)とAlt(Option)をEmacs利用時は入れ替えているため、これもUbuntuでも反映されるようにする。これらの追加設定を`~/emacs.d/init.el`に追加する。

```lisp:~/emacs.d/init.el
;; Ubuntuの場合、mozcを使って入力。Macの場合はOSの入力を利用。
(when (equal system-type 'darwin)
  (set-language-environment "japanese")
  (setq default-input-method "MacOSX"))
(when (equal system-type 'gnu/linux)
  (require 'mozc)
  (set-language-environment "japanese")
  (setq default-input-method "japanese-mozc")
  (global-set-key "\C-\\" 'toggle-input-method))

;; Swap super/command-key and alt/option key
(when (equal system-type 'darwin)
  (setq ns-command-modifier (quote meta))
  (setq ns-alternate-modifier (quote super)))
(when (equal system-type 'gnu/linux)
  (setq x-super-keysym 'meta)
  (setq x-meta-keysym  'super))
```

## Node.js

Macbook Proが壊れたのがJavaScriptのコードを書いているときだったので、まずはNode.jsを入れる。[こちらの記事](
https://qiita.com/seibe/items/36cef7df85fe2cefa3ea)を参考に、n packageを利用してMacOSXにおけるnodebrewみたいな感じで運用する。ただしnpmで入れるのはnpm自身とyarnだけ。

```bash
$ sudo apt -y nodejs npm
$ sudo npm i -g n
$ sudo n lts // 安定版がインストールされる
$ sudo apt purge -y nodejs npm
$ npm i -g npm yarn
```

あともうnpmを使わずすべてyarnで押し通す。`yarn global`で入れたパッケージの実行ファイルにパスを通すため、`~/.bashrc`へ以下を追記する。

```bash:~/.bashrc
### yarn global
export PATH="$PATH:`yarn global bin`"
```

## git関係

[AWSへ秘密情報をアップロードしないようにするための`git-secrets`](https://qiita.com/jqtype/items/9196e047eddb53d07a91)をインストールする。MacOSXはhomebrewから入れればよかったが、Ubuntuはソースからインストールする必要がある。

```
$ git clone https://github.com/awslabs/git-secrets.git
$ cd git-secrets
$ make install
```

`git commit -a`などで立ち上がるエディタがデフォルトでnanoなため、viへと変更する。([参考記事](https://qiita.com/methane/items/68093d6bc3f7c0e326e2))

```bash
$ select-editor 

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.tiny
  3. /usr/bin/emacs
  4. /usr/bin/code
  5. /bin/ed

Choose 1-5 [1]: 2
```

`~/.gitconfig`, `~/.gitignore_global`など各種設定ファイルは、Dropbox同期ディレクトリからのシンボリックリンクや、GitHubを駆使して同期。

# その他ソフトウェア

細々としたソフトウェアをインストールする。

- Mendeley: https://www.mendeley.com/guides/download-mendeley-desktop/ubuntu/instructions

- KeepassXC: Ubuntu Softwareアプリより。
  
- Virtualbox: Ubuntu Softwareアプリより。

- Dropbox: Ubuntu Softwareアプリより。

- Tweaks: Ubuntu Softwareアプリより。後述するGnomeShell Extensionの調整を行うのに必須。

# GnomeShell Extensions

素のGnomeShellをもう少し好みに近づけるため、Ubuntu SoftwareアプリよりいくつかExtensionを導入する。

- Suspend Button: スタンバイボタンをシャットダウンボタンの隣に配置。
- Bluetooth Quick Connect: Bluetooth機器への再接続をタスクトレイから。
- Sound Input & Output Device Chooser: 音声入出力デバイスをタスクトレイから変更。
- Frippery Move Clock: タスクバーの時計の位置を変更。
- Apt Update Indicator: ソフトウェアアップデートをタスクトレイで通知。
- Panel OSD: 通知のフロート位置を変更。
- Refresh WiFi Connections: SSID選択画面に接続可能SSIDの更新ボタンを配置。
- Status Area Horizontal Spacing: タスクトレイのアイコン間のスペースをもう少し狭くする。

# まとめ

Ubuntu18.10、たった半日程度で業務に必要な環境をほぼ一から整えることができた。[^6] 普段使うソフトウェアもUbuntu版とMac版でキーバインド以外に操作感にほぼ違いはなく、非常に快適な作業環境が得られている。またハードウェア面については、Intel NUC7i7BNHのポテンシャルも高く、そのパフォーマンスの割にファン音も静か・かつ非常に軽量である。Intel NUCによる可搬型小型キューブPCとLinuxの組み合わせによる最新型モバイルコンピューティング、あくまで間に合わせのつもりだったがしばらくメイン環境として運用していこうと思っている。

と思っていたところで、Appleストアジーニアスバー経由で修理に出してから、たった中2日でMacbookProは完調に戻って返ってきた。Appleの修理対応、非常に早くてまことに素晴らしい。しかしすぐにはMacOSXを今から再セットアップする気にはなれず、Intel NUCを今日も持ち運んでいる。

[^6]: オフィスソフトウェアをUbuntuで頑張って利用することは諦めて、VirtualboxでWindows10を起動してMS Officeを利用している。