私のWindows上でのWEB app開発やCLI環境の変遷

数年前からMacに飽きて自宅ではWindowsを使っているのだけど、やはり *nix で動くこと前提のWEB appやCLIのコードをちょろっと書いて動かすという用途には全く向いていない。とはいえ必要なので、今までいくつかの環境を試してきたものを、それぞれメモっておく。

ちなみに、目指す要件は以下のとおり。

* エディタはemacsキーバインド
* `grep` や `find` など含めた *nix ライクな shell
* `intero` (haskell) や `perl` 、 `python` 、 `rust` などをエディタから文法チェックなどに使う

2018年現在の愛機は、 [Surface Book2 15''](http://hiratara.hatenadiary.jp/entry/2017/12/11/090512) 。

## 自宅のMac ProへSSH接続

数年前にMacからWindowsへ乗り換えたときの最初の環境。やっぱり開発はMacのほうが慣れていたのと、発売直後の [Mac Proを衝動買いした](https://www.instagram.com/p/ih-H1wLJrx/) ので、それならリモートでMac使えばいいじゃんという発想。

emacsはCLIでターミナルから使う。日本語周りは、SSHクライアントとかMac側の環境変数の都合などでハマった記憶はあるが、その問題は解決してきちんと使えていた。

このアプローチは非常にうまくいった。今でも時々使う。

* PROS: Macなのでハマりどころがほぼない
* PROS: 開発環境が中央に集中するので、外出先でも自宅でも1つの環境で開発できて非常に効率がいい
* CONS: MacのGUIツールが使いたくなる(使えない)
    * dropboxとかも工夫がいるとか
* CONS: 外出先で安定したネットワークがないと開発できない
* CONS: 高級なノートブックを買ってもマシンリソースがまったく生かせない・・・

## emacs on windows + MSYS2

当時使っていた Surface Pro 3 はまあまあのスペックを持っていたので、やっぱりローカル環境を活かしたいよねと使い始めた環境。変なことをしなければうまくいく。

* PROS: ローカルで完結する
* PROS: (後述のCONSと矛盾するが)割と *nix な環境っぽく使える
* CONS: MSYS2(とMINGW)の考え方の理解が必要
* CONS: linuxのshellと思って使うと、微妙な挙動の違いが多々あって、ハマる
* CONS: ビルドできないもの、*nixとビルド方法が大きく違うものが多々あって、ハマる

## ubuntu GUI in VirtualBox or VMWare

MSYS2 に疲れてたどり着いた環境。デスクトップlinuxをVMとして使う。

* PROS: linuxなのでハマりどころがない
* PROS: VirtualBoxやVMWareはクリップボード共有があったりするので、Windowsとの相互利用は楽
* CONS: linuxデスクトップの環境構築がめんどい
    * 日本語入力とか高解像度の設定とか。慣れてれば問題ないはず
* CONS: 欲張ってOpenGLとかで遊ぼうという邪な感情が芽生え、そうなると厳しい
* CONS: GUIまでlinuxになってしまった今、Windowsとはなんだったのか？

## Docker for Windows (未使用)

[親愛なるkanさんがやってたやつ](https://medium.com/@kan./docker%E3%81%A7%E9%9B%91%E3%81%AB%E4%BD%BF%E3%81%88%E3%82%8B%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92%E4%BD%9C%E3%82%8B-e70d506aaede) 。環境構築しようとも思ったが、2つのCONSが大き過ぎると思って断念。

* PROS: 仮想化技術への依存がコンテナだけなので、必要最小限となる
* CONS: 開発環境はエディタと処理系を含むので、1コンテナ1プロセスというdockerの思想に反する
* CONS: Docker for Windows ならではの不安定な挙動があってハマる(特にディレクトリのバインドマウント周りとか)

## AWS Cloud9 (未使用)

最近発表されたやつ。使ってみたかったけど、emacsバインドなエディタとか文法チェックするという要件を満たせなかったので断念。

* PROS: 開発環境がAWS上に集中するので効率がいい
* CONS: Cloud9 のIDEをemacsバインドでうまく使えない
    * ctr-Xやctrl-Nが食われるとか (後述のkeyhac使っても挙動がおかしかった)
    * AWS 移行前はデスクトップappでこの問題を回避できたみたいなので、そのうちまた対応される？
* CONS: perlとHaskellはシンタックスハイライトくらいしか対応してない
* CONS: リモート環境なのでMac Proを使っていたときと同じCONS

## ubuntu in Hyper-V with docker (お試し中)

Docker for Windowsは動くようにしておきたかったのでHyper-Vを利用。GUIはWindows 10にまかせていいのではということでubuntu serverを利用。ubuntuのインストール作業に勤しむ意味はないので、vagrantに任せることに。emacsは文法チェックなどのため開発環境と同居したいので、vagrant内のものをSSH経由で利用。ディレクトリ共有は思い切って辞める。CUIやWEBに関する開発は全部VMの中だけでやる。

結果的に業務で使う開発環境に割と近づいた気がする。違うのは開発環境もvagrantに放り込んだこと。SSHは面倒なのでMSYS2のを使おうかと(Mac Proのときと同じ)。

* PROS: windowsが苦手なCUI一式を仮想化環境に任せていて、理にかなっている気がする
* PROS: ネットワークがなくても使える。SB2のマシンパワーを活かせる
* CONS: hyperv の VM は admin 権限が要るので、ちょいめんどい
    * PowerShell(Admin) を立ち上げて起動している
* CONS: エディタと開発環境が同居するので、本番環境と差異が大きい
    * とはいえ、それはWindowsでどう開発環境を作るかとは別の問題。 vagrant box 内でdocker使うのは、当然あり（ただし、できるかはまだやってない）
* CONS: GUIが絡む開発は無理。最近引き合いが多いデータのビジュアライズとか。ゲーム作りたくなったりとか

## やってないけど試したい環境

* AWS(もしくはGCP)にインスタンス立てて、そこで生きる
* PowerShellとともに生きる
* さらに F# も触ってみたいので、潔く余暇はそちらに費やすとか
* IntelliJとかwindowsと親和性のある [^1] IDE ＋ 仮想マシン or docker

[^1]: IntelliJがWindowsと親和性が高いかは使ったこと無いので知らない。

## 【2019年1月7日追記】WSL + Docker for Windows

http://hiratara.hatenadiary.jp/entry/2019/01/05/201505 の前半で書いている環境。 WSL が安定したと感じた2018年秋以降は、これを使っている。エディタは WSL 内の CLI の emacs 。

* PROS: VM不要で、 Windows との親和性が高い（多分）
* CONS: WSLから Docker for Windows への橋渡し部分でハマりやすい
    * 後者はVM内のlinuxなので

Docker 周りでハマるのがめんどいので、一周回って VMWare か VirtualBox に戻ってもいいかなと思ってるんだけど、たしか当時 VM 内でネットワークが不安定（VM内だけとても速度が遅い）問題に苦しんだ記憶がある（うろ覚え）ので悩む。

## おまけ1: Windowsの使いみち

WindowsといってもSurface関連製品しか使ってないので、実は [タブレットとして使っている](https://www.instagram.com/p/BRULhfbD7Mv) 。

PCを使う時間の大部分を費やすWEBブラウジング(動画含む)においては、OSの差異は関係ない(テキストエリアのキーバインディング以外は)。

Surface Book 2になって性能が上がったので、最近はsteamで遊んだりしている。対応ゲームがMacより圧倒的に多いのは利点。

逆に言うとその程度。

## おまけ2: その他開発ツール

[chocolatey](https://chocolatey.org/) をパッケージマネージャとして使っている。 docker や vagrant から chrome 、 [Rapid Environment Editor](https://www.rapidee.com/) まで、ほとんどのものを chocolatey で入れられるのでもう手放せない。

あと、まだインストールしただけなのだけど、 [keyhac](https://sites.google.com/site/craftware/keyhac-ja) はうまく使えば便利そう。Chromeのテキストエディタ(たとえばこのエントリの編集とか)でemacsキーバインド使えないのは発狂するので、カーソルキーを当ててあげるだけでかなり幸せになれそうな予感。