Mac開発環境のいろいろなものを Dropbox に移してみた

# 1. 目的
* その昔、Gmail と Chrome の登場によって、PCリプレース時 や セカンドPC利用時に google アカウントを設定するだけで メール や ブックマーク がそのまま使えることに感動したことを今でも覚えている。
そんな事を懐かしみながら、開発環境のいろいろなものを Dropbox に置いて、セカンドPCでもちょっと設定するだけでメインPCと同じ開発環境のように普通に作業ができるか試してみた。

* Dropbox に置いてみたもの
 * iTerm2 の設定
 * ~/.bash_profile
 * ~/.vimrc （基本的な設定のみ。Unite.vimとかのプラグインものはまだ試してない。）
 * ~/.ssh/config
 * SSH private key
 * anyenv, pyenv, pyenv-virtualenv
 * aws cli コマンド
 * IAM アクセスキー ID と シークレットアクセスキー



# 2. 準備、確認、必要なもの
### MacOS
* macOS Mojave バージョン10.14.3
* シェルは Bash 
* pyenv で python3.7.2 をインストールする際に、システム管理者権限が必要になる

### Dropbox
* Dropbox アカウント
    * 今回は無料版<br />https://navi.dropbox.jp/dropbox-pay
    * 2 段階認証を有効にする<br />https://help.dropbox.com/ja-jp/security/enable-two-step-verification

* Mac版Dropboxアプリインストール
    * https://www.dropbox.com/ja/downloading
    * インストールディレクトリは、/Users/ユーザー名/Dropbox/ （＝ $HOME/Dropbox）

* Mac版Dropbox設定
<img src="https://qiita-image-store.s3.amazonaws.com/0/148868/ea05f57d-a50f-aa31-f2bd-3eb87db70d8b.png" width=50%>

# 3. 設定

## Dropbox上に設定ファイル置き場を作る
```
$ mkdir $HOME/Dropbox/config
```

## iTerms の設定を Dropbox に置く
参考
https://qiita.com/reoring/items/a0f3d6186efd11c87f1b

iTerm2ファイルを置く場所を作成

```
$ mkdir $HOME/Dropbox/config/iterm2
```
iTerm2 ⇒ Prefernce ⇒ General の Preferences ⇒ 
Load preferences from a custom folder or URL にチェックを入れる
Save changes to folder when iTerm2 quits にチェックを入れる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/148868/0f39ea9d-92bd-54b6-f39c-18ccc01824fd.png)
セカンドPCでも同じ設定を行うことで、iTerm2 の設定を共有できる。

## ~/.bash_profile を Dropbox に置く

bash_profile ファイルを置く場所を作成

```
$ mkdir $HOME/Dropbox/config/bash
```

空の bash_profile ファイルを作成する

```
$ touch $HOME/Dropbox/config/bash/bash_profile
```

~/.bash_profile に「source ~/Dropbox/config/bash/bash_profile」という行を追記する


```
$  echo "source ~/Dropbox/config/bash/bash_profile" >> ~/.bash_profile
```

## ~/.vimrc を Dropbox に置く

vimrc ファイルを置く場所を作成

```
$ mkdir $HOME/Dropbox/config/vim
```

~/.vimrc を $HOME/Dropbox/config/vim ディレクトリにコピーする

```
$ cp ~/.vimrc $HOME/Dropbox/config/vim/vimrc
```

Dropbox の bash_profile （$HOME/Dropbox/config/bash/bash_profile） に次の行を追記する

```
alias vim='vim -u ~/Dropbox/config/vim/vimrc'
```

シェル再起動

```
$ exec $SHELL -l
```

エイリアス確認

```
$ alias vim
alias vim='vim -u ~/Dropbox/config/vim/vimrc'
```

## ~/.ssh/config と SSH private key を Dropbox に置く<br />（ついでに、ワンファイルカオス状態の ~/.ssh/config の分割整理）
参考
https://qiita.com/masa0x80/items/ecb692ad93f7d06a07b0

ssh config と SSH private key ファイルを置く場所を作成

```
$ mkdir $HOME/Dropbox/config/ssh
$ mkdir $HOME/Dropbox/config/ssh/config
$ chmod 700 $HOME/Dropbox/config/ssh/config
$ mkdir $HOME/Dropbox/config/ssh/privatekey
$ chmod 700 $HOME/Dropbox/config/ssh/privatekey
```

> 移行手順メモ

(1)  「~/.ssh/config」 の Host 設定をサービス毎用・途毎にファイルを分けて $HOME/Dropbox/config/ssh/config ディレクトリに置く（パーミッションを600にする）

(2) SSH private key ファイルを $HOME/Dropbox/config/ssh/privatekey ディレクトリに置く（パーミッションを400にする）

(3) $HOME/Dropbox/config/ssh/config の各Host情報の IdentityFile パスを Dropbox 上の private key ファイルへのパスへ変更する

(4) Dropbox へ移した設定を「~/.ssh/config」 から削除して、「Include ~/Dropbox/config/ssh/conf/*」 行を追記する


> 移行例

(1) 用途ごとの config ファイルを作成 → $HOME/Dropbox/config/ssh/conf/gitlab （パーミッション600）

```
Host gitlab
    Hostname <real host name>
    Port 22
    User git
    IdentityFile ~/ssh/privatekey/gitlab
```
(2) gitlab サーバの秘密鍵を置く → $HOME/Dropbox/config/ssh/privatekey/gitlab （パーミッション400）
(3) IdentityFile のパスを Dropbox 上の private key ファイルへのパスへ変更する

```
Host gitlab
    Hostname <real host name>
    Port 22
    User git
    IdentityFile ~/Dropbox/config/ssh/privatekey/gitlab
```

(4) 「~/.ssh/config」の設定（今回 「~/.ssh/config」をすべて移した）

```
Host *
    ServerAliveInterval 60
    TCPKeepAlive yes
    UseKeychain yes
    UserKnownHostsFile=/dev/null
    StrictHostKeyChecking no
    PasswordAuthentication no
    IdentitiesOnly yes

Include ~/Dropbox/config/ssh/conf/*
```

## anyenv, pyenv, pyenv-virtualenv を Dropbox に置く
参考
https://qiita.com/zaburo/items/8ac16133c3823c6e6ad6
https://medium.com/@riywo/anyenv-all-in-one-for-env-6423d23b0838

### anyenv のインストール
* Dropbox上にインストールする

```
$ git clone https://github.com/riywo/anyenv ~/Dropbox/anyenv
```

* $HOME/Dropbox/config/bash/bash_profile に次の行を追記

```
export ANYENV_ROOT="$HOME/Dropbox/anyenv"
export ANYENV_DEFINITION_ROOT="$ANYENV_ROOT/anyenv-install"
export PATH="$ANYENV_ROOT/bin:$PATH"
```

* シェル再起動（上記設定を即時反映させる）

```
$ exec $SHELL -l
```

* 初期化

```
$ anyenv install --init

Manifest directory doesn't exist: /Users/nishimura.toru/Dropbox/anyenv/anyenv-install
Do you want to checkout ? [y/N]: y
Cloning https://github.com/anyenv/anyenv-install.git master to /Users/nishimura.toru/Dropbox/anyenv/anyenv-install...
Cloning into '/Users/nishimura.toru/Dropbox/anyenv/anyenv-install'...
remote: Enumerating objects: 44, done.
remote: Counting objects: 100% (44/44), done.
remote: Compressing objects: 100% (39/39), done.
remote: Total 44 (delta 1), reused 43 (delta 1), pack-reused 0
Unpacking objects: 100% (44/44), done.

Completed!
```

* $HOME/Dropbox/config/bash/bash_profile に次の行を追記

```
ln -nfs $ANYENV_ROOT/libexec/anyenv $ANYENV_ROOT/bin/anyenv
eval "$(anyenv init -)"
```

※ Dropbox に入れた anyenv や pyenv を複数PCから 使う場合は、bashログイン時に強制的にシンボリックリンクを張り直す設定を入れておく必要がある。

* シェル再起動（上記設定を即時反映させる）

```
$ exec $SHELL -l
```

* インストールできる **env の種類を確認

```
$ anyenv install -l

Renv
crenv
denv
erlenv
exenv
goenv
hsenv
jenv
luaenv
nodenv
phpenv
plenv
pyenv
rbenv
sbtenv
scalaenv
swiftenv
```

### pyenv のインストール
* $HOME/Dropbox/config/bash/bash_profile に次の行を追記

```
export PYENV_ROOT="$HOME/Dropbox/anyenv/envs/pyenv"
```

* シェル再起動（上記設定を即時反映させる）

```
$ exec $SHELL -l
```

* pyenv をインストール

```
$ anyenv install pyenv
```

* $HOME/Dropbox/config/bash/bash_profile に次の行を追記

```
ln -nfs $PYENV_ROOT/libexec/pyenv $PYENV_ROOT/bin/pyenv
eval "$(pyenv init -)"
```
※ Dropbox に入れた anyenv や pyenv を複数PCから 使う場合は、bashログイン時に強制的にシンボリックリンクを張り直す設定を入れておく必要がある。

* シェル再起動（上記設定を即時反映させる）

```
$ exec $SHELL -l
```

* 確認

```
$ anyenv versions

pyenv:
* system (set by /Users/nishimura.toru/.anyenv/envs/pyenv/version)
```
※ pyenv はデフォルト（system）を指している


* インストール可能な Python バージョンの確認(2019/03/18時点での最新 3.7.2）

```
$ pyenv install --list

Available versions:
  2.1.3
  2.2.3
  2.3.7
  〜
```

* pyenv 3.7.2 インストール

参考
https://qiita.com/HeRo/items/c8649469922990163eab

```
$ sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
$ brew install openssl@1.1
$ CONFIGURE_OPTS="--with-openssl=$(brew --prefix openssl@1.1)" pyenv install 3.7.2
```
※openssl@1.1 インストールするときにシステム管理者権限が必要になる

* 確認

```
$ anyenv versions
pyenv:
* system (set by /Users/nishimura.toru/Dropbox/.python-version)
3.7.2
```
※3.7.2が追加された。

* 3.7.2 に変更する

```
$ pyenv local 3.7.2

$ anyenv versions
pyenv:
system
* 3.7.2 (set by /Users/nishimura.toru/Dropbox/.python-version)

$ python -V
Python 3.7.2
```

* system バージョンに戻る場合は

```
$ pyenv local system
$ anyenv versions
pyenv:
* system (set by /Users/nishimura.toru/Dropbox/.python-version)
3.7.2
```

### pyenv-virtualenv のインストール

* $HOME/Dropbox/anyenv/envs/pyenv/plugins の中にインストールする

```
$ git clone https://github.com/yyuu/pyenv-virtualenv.git ~/Dropbox/anyenv/envs/pyenv/plugins/pyenv-virtualenv
```

* $HOME/Dropbox/config/bash/bash_profile に次の行を追記

```
eval "$(pyenv virtualenv-init -)"
export PATH="$HOME/Dropbox/envs/pyenv/shims:$PATH"
```

* シェル再起動（上記設定を即時反映させる）

```
$ exec $SHELL -l
```

## aws cli コマンド を Dropbox に置く

* pyenv-virtualenv で awscli 環境を作る

```
$ pyenv virtualenv 3.7.2 awscli
$ pyenv rehash
$ pyenv local awscli
```

* 確認

```
$ anyenv versions
pyenv:
  system
  3.7.2
  3.7.2/envs/awscli
* awscli (set by /Users/nishimura.toru/Dropbox/anyenv/envs/pyenv/bin/.python-version)
```

* aws cli をインストール

```
(awscli) pip install --upgrade pip
(awscli) pip install awscli
(awscli) aws --version
aws-cli/1.16.125 Python/3.7.2 Darwin/18.2.0 botocore/1.12.115
```

* system環境に戻る

```
$ pyenv local system
$ anyenv versions
pyenv:
* system (set by /Users/nishimura.toru/Dropbox/anyenv/envs/pyenv/bin/.python-version)
  3.7.2
  3.7.2/envs/awscli
  awscli
```

## IAM アクセスキー ID と シークレットアクセスキー Dropbox に置く

参考
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-envvars.html

* IAMキーファイルを置く場所を作成

```
$ mkdir $HOME/Dropbox/config/aws
$ chmod 700 $HOME/Dropbox/config/aws
```

* $HOME/Dropbox/config/bash/bash_profile に次の行を追記

```
export AWS_CONFIG_FILE="$HOME/Dropbox/config/aws/config"
export AWS_SHARED_CREDENTIALS_FILE="$HOME/Dropbox/config/aws/credentials"
```

* シェル再起動（上記設定を即時反映させる）

```
$ exec $SHELL -l
```

* 「~/.aws/config」 ファイルを $HOME/Dropbox/config/aws/config ディレクトに置く
* 「~/.aws/credentials」 ファイルを $HOME/Dropbox/config/aws/config ディレクトに置く

* awscli 環境に入って aws cli 動作確認」

```
$ pyenv local awscli
$ aws s3 ls --profile <プロファイル名>
```

# 4. セカンドPC側の設定

* Mac版Dropboxアプリインストール

* ~/.bash_profile

```
source ~/Dropbox/config/bash/bash_profile
```

* ~/.ssh/config

```
Host *
    ServerAliveInterval 60
    TCPKeepAlive yes
    UseKeychain yes
    UserKnownHostsFile=/dev/null
    StrictHostKeyChecking no
    PasswordAuthentication no
    IdentitiesOnly yes

Include ~/Dropbox/config/ssh/conf/*
```