AWS EC2の初期環境構築：Emacs, zsh, Python3(Miniconda)

# TL; DR

まっさらなEC2インスタンスにログインして作業環境を構築した際のメモ

- `emacs-nox`をリポジトリから導入
- `zsh`をリポジトリから導入
    - `/etc/passwd`を編集しシェルを変更
- `/etc/locale.conf`を編集し文字化けを解消
    - `.zshrc`を編集し変更を適用
- `Miniconda3`をインストーラから導入
    - `/path/to/conda init zsh`を実行



# はじめに

本記事ではAmazon Linux 2を使っているが，Ubuntu Serverを使う場合もあるため，以下に注意する．

- Amazon Linux 2のデフォルトユーザ名は`ec2-user`になる．Ubuntu Serverでは`ubuntu`になる．

- Amazon Linux 2はRedHat系なので，パッケージマネージャには`apt`ではなく`yum`を使う．


# リポジトリの初期化
```
$ sudo yum update
```

Debian系の`sudo apt update`と`sudo apt upgrade`に相当する．なお，`-y`オプションを追加すれば確認をスキップすることができる．


# 開発ツールのインストール
```
sudo yum groupinstall "Development Tools"
```

Debian系の`sudo apt install build-essential`に相当する．

インストールされるパッケージはgccやmake，gitなど．[^1]
[^1]: [yum groupinstall "Development tools" で入るパッケージ一覧（CentOS） - Qiita](https://qiita.com/old_/items/6f9da09b9af795c11b71)

# Emacsのセットアップ
```
$ sudo yum install emacs-nox
```

yumを使ってインストールしたら，自分好みの.emacs.dを用意する．

<details><summary>use-packageやleafを導入したいけどしてない人は注意（私です）</summary>
バイトコンパイルされたパッケージやログファイルなどはそのまま移行すると不具合を起こすので，`init.el`やリポジトリにないパッケージだけをコピーし，残りを`M-x package-list-packages`で用意した方が楽である．そのあと`--debug-init`でデバッグを行う．</details>

# zshのセットアップ
Amazon Linux 2のデフォルト環境では，`chsh`が使えないため少し面倒．

## インストール
```
$ sudo yum install zsh
```

## デフォルトのシェルをzshに
方法は2通りある．

- `util-linux-user`をインストールして`chsh`を使う方法 [^2]

   [^2]: [EC2インスタンスのbashをzshに変更するまで - Qiita](https://qiita.com/Kept1994/items/d19dc0ba86779b704841)


- `/etc/passwd`を直接編集する方法[^3]

   [^3]: [awsでzshを利用する方法 - Qiita](https://qiita.com/mikekuroe/items/b7e7da37c4e3564793c6)


今回は`/etc/passwd`を直接編集する方法を取った．

### `/etc/passwd`の編集
まず，該当するファイルを開く．

```
$ sudo emacs /etc/passwd
```

```sh:/etc/passwd
ec2-user:x:1000:1000:EC2 Default User:/home/ec2-user:/bin/bash
```

以下のようにして末尾のみ編集する．
※ユーザ名などは適宜読み替えること

```sh:/etc/passwd
#ec2-user:x:1000:1000:EC2 Default User:/home/ec2-user:/bin/bash
ec2-user:x:1000:1000:EC2 Default User:/home/ec2-user:/bin/zsh
```

### 変更の適用
`/etc/passwd`を編集する方法は，編集内容を間違えた場合にログインできなくなる可能性があるため，変更を行ったら別の端末を開いてログインすることを推奨する．

別の端末で`$ ssh -i [ダウンロードしたキー] ec2-user@[アドレス]`を実行し，新たにログインを行う．

## zshの初期設定
新しい端末でログインに成功し，zshに切り替わっていれば，おそらくzshの初期設定を促す画面に到達する．

私は以下のように設定した．


- `(1) Continue to the menu`を選択
- `(2)  Use the new completion system.`を実行
    - `(1)  Turn on completion with the default options.`を実行，メニューに戻る
- `(0)  Exit, saving the new settings.  They will take effect immediately.`を実行して設定を完了

設定が終われば，通常の画面に戻る．上の画面で設定した内容が反映された`.zshrc`などが作成されていることが確認できる．

あとは`.zshrc`を加えて編集するなどして，zshを自由にカスタマイズする．

# 日本語の文字化けを解消
デフォルトでは，ログインして`yum install hoge`などと実行すると，日本語が`????`のように文字化けしてしまう．これを直すには，以下の操作が必要である．[^4]

[^4]: [[Sy] Amazon Linux で 「sudo yum update」すると日本語が「????」と文字化けする場合の対処](https://utano.jp/entry/2018/08/amazon-linux-yum-garbled-characters/)

## `/etc/locale.conf`の編集

```
$ sudo emacs /etc/locale.conf
```

```sh:/etc/locale.conf
LANG=en_US.UTF-8
```

以下のようにして編集する．

```sh:/etc/locale.conf
#LANG=en_US.UTF-8
LANG=ja_JP.UTF-8
LC_CTYPE=ja_JP.UTF-8
```

## ロケール設定の有効化

```
$ emacs .zshrc
```

`.zshrc`に以下の行を追加する．

```sh:zshrc
source /etc/locale.conf
```

これで次のログインから文字化けが解消される．

# Python (Miniconda3)のインストール

`conda`を使った環境に慣れているため，大きな容量を必要としないMinicondaをインストールした．以下の方法で導入できる．[^5]

[^5]: [Installing on Linux - Conda documentation](https://conda.io/projects/conda/en/latest/user-guide/install/linux.html)

## インストーラの入手
以下の公式サイトからインストーラのURLを取得する．

[Miniconda - Conda documentation](https://docs.conda.io/en/latest/miniconda.html)

![Screenshot 2020-04-16 at 4.43.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320451/4e0e4932-0ec7-b290-cb9e-1ea245cb1429.png)

URLをコピーしたら，インスタンス上で目的のインストーラを取得する．

```
$ wget [コピーした最新のインストーラのURL]
```

## Minicondaのインストール
```
$ zsh Miniconda3-latest-Linux-x86_64.sh
```

インストーラを実行する．
※ファイル名は適宜読み替えること

```
Welcome to Miniconda3 4.8.2

In order to continue the installation process, please review the license
agreement.
Please, press ENTER to continue
>>>
```

以上のような画面に移り変わるため，まずは指示通りにENTERを入力する．

ソフトウェア利用許諾契約が表示されるので，`less`と同じようにして`q`で終了する．

```
[省略]

Last updated February 25, 2020


Do you accept the license terms? [yes|no]
[no] >>>
```

以上のように同意するかを尋ねられるので，`yes`と答える．

```
Miniconda3 will now be installed into this location:
/home/ec2-user/miniconda3

  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below

[/home/ec2-user/miniconda3] >>>
```

続けて以上のようにインストールする場所を尋ねられるので，`/home/ec2-user/miniconda3`で良い場合はENTERを入力する．

```
Do you wish the installer to initialize Miniconda3
by running conda init? [yes|no]
[no] >>>
```

さらに初期化の有無を尋ねられるが，ここでの初期化はbashにしか反映されないため，`no`と答える．

```
You have chosen to not have conda modify your shell scripts at all.
To activate conda's base environment in your current shell session:

eval "$(/home/ec2-user/miniconda3/bin/conda shell.YOUR_SHELL_NAME hook)"

To install conda's shell functions for easier access, first activate, then:

conda init

If you'd prefer that conda's base environment not be activated on startup,
   set the auto_activate_base parameter to false:

conda config --set auto_activate_base false

Thank you for installing Miniconda3!
```

以上のようにしてインストールが完了する．しかし，加えて初期化を行う必要がある．

```
$ /home/ec2-user/miniconda3/bin/conda init zsh
```

以上のように対象をzshに指定して初期化を行うと，以下のようなメッセージが表示される．

```
no change     /home/ec2-user/miniconda3/condabin/conda
no change     /home/ec2-user/miniconda3/bin/conda
no change     /home/ec2-user/miniconda3/bin/conda-env
no change     /home/ec2-user/miniconda3/bin/activate
no change     /home/ec2-user/miniconda3/bin/deactivate
no change     /home/ec2-user/miniconda3/etc/profile.d/conda.sh
no change     /home/ec2-user/miniconda3/etc/fish/conf.d/conda.fish
no change     /home/ec2-user/miniconda3/shell/condabin/Conda.psm1
no change     /home/ec2-user/miniconda3/shell/condabin/conda-hook.ps1
no change     /home/ec2-user/miniconda3/lib/python3.7/site-packages/xontrib/conda.xsh
no change     /home/ec2-user/miniconda3/etc/profile.d/conda.csh
modified      /home/ec2-user/.zshrc

==> For changes to take effect, close and re-open your current shell. <==
```

再度ログインし直すことで，`conda`の各種コマンドが使用可能になる．