開発環境がMacからWindowsになったときにしたこと

# はじめに
オークファンの佐藤です。
2019年5月に念願かなって、開発マシンをMacからWindowsにチェンジしました！
というか、過去にがっつり使っていたThinkPadの感覚が忘れられず、タイミングを見て切り替えてもらいました。

結果として、Windows（入社前）～Mac(2017/10)～Windows(2019/5)と、OSを行き来することになったため、その体験談とツール設定を記載します。

入社時にMac環境をセットアップしたときの体験談は、昨年のアドベントカレンダー記事
[開発環境がWindowsからMacになったときにしたこと](https://qiita.com/s_satoh/items/5574194dca4d54944413)
をご覧ください。

（´-`）.｡oO（前回は、Windowsの経験に合わせてMacをセットアップしました。今回は、Windows経験をベースにしつつ、Macでの体験と業務経験を微妙にフィードバックしてあります）

# スタンダードはMacです
オークファンの開発部では、子会社も含めたグループ全体の開発業務を扱っています。
対象となるサービスの種類によって、開発環境もかなりまちまちです。
私の部署ではMacメインなので、Windows環境構築と同時に、「そもそも動くのか？」を調べながらのスタートでした。
とはいえ、エンジニアが全員Macというわけではないので（他グループはWindowsメイン）、なんとかなるだろうと期待しつつ、以下の目標をもとに環境を設定しました。

- Macユーザーの環境を破壊しない
- 自分が使い慣れている

Windowsで動かすためにGithub内を変更して、それをコミットして、Macユーザーの環境を壊しては本末転倒です。
Macを前提にした開発スタイルに、Windowsで合わせる形をとります。

# 環境について
以降の記述は、以下環境で実施したものです。

カテゴリ|スペック
---|---
OS|Windows 10 1809 ->1903
ハード|Lenovo ThinkPad T470s
CPU|Core i7-7600U
メモリ|24GB
ストレージ|SSD 512GB
キーボード|日本語キーボード **+TrackPoint**

# 開発用ツール
ここでは、Git for WindowsとWSLを両方インストールします。
Git for WindowsはVagrantの起動用に、WSLは基本のシェル環境として使い分けます。

（´-`）.｡oO（正直冗長ですが、シェル環境は使い慣れたUbuntuの方が好きです）

（´-`）.｡oO（LinuxとMacのオプションが違う問題も解消できる）

## [Git for windows](https://gitforwindows.org/)
### 改行コード問題
インストールオプションの注意として、`checkout as-is, commit LF`を選択する。
これによって、Windowsの改行コード`CRLF`がコミットされることはなくなります。
詳しくは後述します。


同時にGit bash(msysgit2)がインストールされます。
だいたいのLinuxコマンドが使えるため、Macのターミナルと同様に利用可能です。

Windows上のユーザーディレクトリは`/c/Users/[ユーザー名]`になります。

### git設定
ホームディレクトリ（c:/Users/名前/）以下に.gitconfigを作成し、

```shell
[core]
    autocrlf = input
    longpaths = true
    symlinks = true
[user]
    name = Hoge Fuga
    email = xxx@example.com
```
のように設定します。

#### autocrlf
Windowsの標準改行コードであるCRLFでファイルを作っても、コミットされる成果物はLFに変換する設定です。
インストール時にオプションを選んだため、この項目は記載されているはずです。

#### true? input? false?
いままでこの設定をずっとtrueにしていたのですが、 **Mac用のシェルスクリプトをWSLで実行する場合** 、チェックアウト時点でCRLFが入ってしまうため、input or falseが適切であることに気づきました。
https://qiita.com/uggds/items/00a1974ec4f115616580

で、falseの場合はコミット時に改行コードを変換してくれないため、今度はMacユーザーに影響を与える可能性があります。
inputはCRLF -> LFに変換するので、コミットのフィルタを通す限りはMac側でも大丈夫でしょう。

#### longpaths
Windowsは標準で**260文字**までのパスしか受け付けません。
chef関係など、階層が深かったりファイル名が長かったりで、ディレクトリが引っかかることがあるため、設定を追加します。
このあたり、確かにMacでは出会わない事象ですね。
https://qiita.com/pollenjp/items/8c70a5b55d46c1f03728

#### symlinks (追記2019/12/17)
composerで生成される、binディレクトリ以下へのシンボリックリンクが切れるため、明示的にonします。
また、`ローカルセキュリティポリシー` -> `ローカルポリシー` -> `ユーザ権限の割り当て` -> `シンボリックリンクの作成`で、自分のユーザー名を追加しました。
https://qiita.com/ucho/items/c5ea0beb8acf2f1e4772


### ssh設定
Git bashから`mkdir ~/.ssh/` し、中に鍵を作成します。

### config
PHPのライブラリ取得用に使うcomposerの一部で、`ssh://github.com/xxxx/hoge.git` 形式で記載されたリポジトリが書かれていることがあります。
これを処理するために、configを記載します。

```~/.ssh/config
Host github.com
  HostName github.com
  User git
```

## Windows Subsystem for Linux(WSL)
ほぼ独立した環境なので、Windowsで入れたプログラムや設定をこの中から使うのは手間がかかりますが、その分だけWindows環境を気にせずに実験できます。
私はUbuntuを選んでインストールしました。

ちなみに、Windows上のユーザーディレクトリは`/mnt/c/Users/[ユーザー名]`になります。

### Vagrantは使えません
WSLの制約により、WSL上からVagrantを起動させることはできません。Linux版のVagrant/Virtualboxをインストールしても起動できません。
このため、Vagrant周りだけはgit bashを使うことになります。

## WSLのセットアップ
WSL上でもひととおりのことができるよう、環境をセットアップしていきます。
以下はWSL内で実行するコマンドです。

### PHP
私の部署で使う環境はPHPメインなので、一応PHPが動かせるようにしておきます。

```sh
sudo apt-get update
sudo apt install php7.2-cli php7.2-xml php7.2-curl php7.2-mbstring php7.2-zip
```

### git/ssh設定を共有
設定が散らばらないようにするための作業です。

```sh
ln -s /mnt/c/Users/[ユーザー名]/.ssh ~/.ssh
ln -s /mnt/c/Users/[ユーザー名]/.gitconfig ~/.gitconfig
```

### Linuxで設定した権限を /mnt以下にも適用する
これがないと、SSHファイルの権限過剰でgitが失敗します。

```/etc/wsl.conf
[automount]
options = "metadata"
```

実行後WSLを再起動すると、`/mnt/`以下に権限が反映されるので、

```sh
chmod 600 ~/.ssh/*
```
します。

### 日本語設定
テキストファイルは日本語の可能性があるため、文字化けしないようにします。

```
 sudo apt -y install language-pack-ja
 sudo update-locale LANG=ja_JP.UTF8
```
実行後Ubuntu再起動

## Vagrant + Virtualbox
ここからは、Windows(Git for windows)に対してインストールします。

インストール後下記コマンドを実行
`vagrant plugin install vagrant-omnibus vagrant-vbguest`

### 仮想マシンへの初回sshに失敗する場合
Windows環境では、セットアップ時に

```
An error occurred in the underlying SSH library that Vagrant uses.
The error message is shown below. In many cases, errors from this
library are caused by ssh-agent issues. Try disabling your SSH
agent or removing some keys and try again.

If the problem persists, please report a bug to the net-ssh project.

timeout waiting for next packet
```
のエラーが出て失敗することがあります。
この場合、

```Vagrantfile
vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
```
の設定をコメントアウトすることで対応できます。

### 仮想マシンのセットアップに失敗する場合
#### common.sh
なぜか、Windowsのgit bashでは、シェルスクリプトの関数が使えません。
既存コードに関数が含まれている場合、それを除去する必要があります。

（´-`）.｡oO（オークファンでは、起動確認スクリプトに入っていたので、しれっと外しました）

## nvm + node.js + gulp
一部環境では、gulpがないとページが閲覧できません。
このとき、仮想マシンでなくOS側にnode.jsが必要です。
Windowsは標準でnode.jsがないため、インストールします。

### nvm & node.js
[Windows版NVM](https://github.com/coreybutler/nvm-windows)をインストーラ経由でインストールする。

```shell
$ nvm install 10.14.0
Downloading node.js version 10.14.0 (64-bit)...
Complete
Creating C:\Users\[ユーザー名]\AppData\Roaming\nvm\temp

Downloading npm version 6.4.1... Complete
Installing npm v6.4.1...

Installation complete. If you want to use this version, type

nvm use 10.14.0

$ nvm use 10.14.0
Now using node v10.14.0 (64-bit)

```
### gulp
gulpを入れるためにはビルドが必要で、ビルドのためにはpython2.7とwindows-build-toolsが必要です。

### windows-build-tools
https://ginpen.com/2017/09/06/vcbuild-exe/
の通り、`npm install --global windows-build-tools` すれば作業完了です。

pythonを個別に入れたい場合は以下の手順をたどります。

### python2.7
https://www.python.org/downloads/release/python-2716/
インストーラからインストール後、環境変数に`C:\Python27`を追加します。

git bash上で実行するgulpのインストーラ上で`which python2`を参照するが、インストール直後は `python.exe` しかなく、これだけではインストールできません。
このため、荒業ですが `C:\Python27\python.exe`を`python2.exe`に複製します。（ `ln -s` してもいい ）

さらに、そもそもgit bashではpythonコマンドが直に叩けないため

```
#.bash_profile
alias python2='winpty python.exe'
```
を設定して回避します。

## PHP
Windowsは標準でPHPが入っていません。
オークファンの開発ではGit for windows上からcomposerを動かすため、WindowsにPHPのインストールが必要でした。

### DL
PHPのオフィシャルから任意バージョンをダウンロードし、zip解凍する。
てっきりインストーラがあるかと思っていましたが、任意のディレクトリに配置すればOKなようです（ただし半角スペースを含むパスには置かないこと）

### パスを通す
システム-システムの詳細設定-詳細設定-環境変数の「PATH」に、PHPを配置したディレクトリを追記します。

### 実行できるようにする
1. `php.ini-development`を`php.ini`にリネーム
2. `Dynamic Extensions`に記載されているextensionリストから`openssl` `curl` `mbstring`のコメントアウトを外す

## OpenSSH
今のWindowsはTera Termなどの端末ソフトがなくてもSSH接続可能です。
「オプション機能の管理」-「機能の追加」からOpenSSHを選択し、「OpenSSHクライアント」「OpenSSHサーバー」を追加する。

サービス-「OpenSSH Authentication Agent」を「開始」すると、`/Users/[ユーザー名]/.ssh/config` に置いた設定が有効になり、Git bashから`ssh.exe [configの名前]`が利用可能。
http://www.freia.jp/taka/blog/windows-native-ssh-client/index.html

## [RLogin](http://nanno.dip.jp/softlib/man/rlogin)
ポートフォワーディング用にSSHクライアントを用意しました。

### RLoginでポートフォワーディング
オークファンでは踏み台サーバーを用いた本番運用を行っています。
Macならば`.ssh/config`に記載していく設定ですが、RLoginで踏み台サーバー経由のSSH接続を行い、MySQL Workbenchで接続できるようにします。
この設定については
https://qiita.com/ko-he-8/items/41bb79eedb920d80601d
の内容がほぼそのまま利用できます。

## Docker
オークファンの開発環境は、多くはVagrantですが、一部にDockerが入っています。
WindowsではVagrantとDockerを同時起動できないため、**Dockerを起動するためのVagrant**を用意して、その中でDockerを動かすことで対応します。
この点に関しては
https://qiita.com/sola-msr/items/00a47a22e548a7b3574c
https://qiita.com/suzuesa/items/00afb144a03cb3a0d262
の2記事に従って`Vagrantfile`を作成することで対応可能でした。

## PhpStorm
ライセンスはマルチOSなので、普通にインストールできます、Mac版とはちょっとグラフィックが異なるので、慣れるにはちょっと時間がかかります。
（´-`）.｡oO（検索速度はMacより重いですね）

## [SwitchHosts!](https://oldj.github.io/SwitchHosts/)
Windows/Mac共用で使えるツールで、hostsファイルを切り替えられるようになります。
オークファンではhostsファイルを使った開発が多いため、この対応は必須です。

### gas maskから移行する
Mac時代は、gas maskをメインで使っていました。
書式自体はほぼ同じなので、`File`->`Import`でインポート可能。あらかじめ `My Hosts`が用意してあるので、そこに張り付けても大丈夫です。

### 権限をつける
Windowsのhostsファイルは、アプリケーションを管理者で実行するだけでは書き換えられないため、権限の変更が必要になります。

https://github.com/oldj/SwitchHosts/issues/272
以上の手順に従い、 `C:\Windows\System32\drivers\etc\hosts`ファイルの `Users` に対する権限を編集し、`書き込み`権限を `許可` する

## Sourcetree
Version3から、かなり使い勝手が変わりました。
（´-`）.｡oO（私はあまり慣れませんが、グラフィックで内容を確認するには一番です）

## MySQL Workbench
（´-`）.｡oO（これは使い勝手がほとんど変わりません）

# 業務用ツール
## Microsoft Office
## Slack
このあたりは特記することはありません。
むしろWindowsのOfficeの安定さが際立ちますね。

# 便利ツール
## Visual Studio Code
Macとほぼ同じ感覚で使えるため、Mac->Windowsでも違和感ないはずです。
昔はサクラエディタばかり使っていましたが、Macでかなり慣れたため、こっちに移行しました。

## [WinMerge](http://winmerge.org/?lang=ja)
Macのどの比較ツールよりもわかりやすい！
これを使うためにWindowsに移行したといっても過言ではありません。

### [xdocdiff](http://freemind.s57.xrea.com/xdocdiffPlugin/index.html)
WinMergeで、xlsx形式ファイルの比較を可能にするプラグイン。
32bitでしか動かないようなことを書いてあるが、`Version 2.16.2.0 Japanese Unicode X64` で動作を確認しました。

## [Ctrl2Cap](https://docs.microsoft.com/en-us/sysinternals/downloads/ctrl2cap)
Capslockキーを押下したときの挙動をCtrlキーに変更します。
Macとは違い、修飾キーカスタマイズは標準で用意されていないためです。

インストール時は、管理者権限でコマンドプロンプトを実行し、`ctrl2cap /install` 
http://in-the-mirror.net/?p=763

## [CubeICE](https://www.cube-soft.jp/cubeice/)
Macでzipファイルを作ると、Windows環境ではファイル名が文字化けします。
このソフトでは、Mac環境で作成したzipファイルを文字化けせずに解凍でき、逆にMacで文字化けしないZipファイルを作成できます。

# 設定
Windows環境にも少しだけ手を入れます。

## 英語キーボード
### キーボード言語を変える
外付けキーボードが英語なので、Windowsの設定で英語キーボードとして認識させます。
https://enjoypclife.net/2016/10/17/windows-10-us-keyboard-layout-japan-tips/
これにより、ノートパソコンのキーボードも英語になりますが、そこは**慣れでカバー**！

（Macだと日本語キーボードと英語キーボードを併用できます。流石ですね）

（´-`）.｡oO（ちなみに、今私が使っているキーボード紹介記事はこちら）
https://qiita.com/s_satoh/items/345833c925dcadcf6386

## Microsoft IME
### [予測変換を切る](https://blog.wanichan.net/entry/2018/05/29/172136)
Mac標準の日本語入力がちょっと苦手で、Google日本語入力を使っていました。
しかし自宅のWindowsではATOKを使っていたため、今のWindowsの予測変換には全くなじめませんでした。


### 英語キーボード時のE/J切り替えをCtrl + Spaceに変更する
英語キーボードの場合、`Alt` +`Backquote`で日本語・英語切り替えを行います。
しかし`Slack`ではAltキーを押すと問答無用でコンテキストメニューを開いてしまうため、日本語・英語切り替え後のキー操作が全く効かなくなり、超不便です。
Mac時代に`Cmd` + `Space`で切り替えるようにしていたため、Windowsでも同じキー操作（`Ctrl` + `Space`）で切り替えられるようにします。

1. IMEバーを右クリック -> プロパティ -> 詳細設定 -> 編集操作「キー設定」の変更　
2. `Ctrl` + `Space`のキー定義を「半角/全角」キーと同じに設定する

これで対応可能です。

# あとがき
Windows -> Mac -> Windows というPC遍歴をたどる人は稀かもしれません。
ですが、会社によって必要な環境、与えられる環境は異なります。
こういう知識が役立つと信じて……。