Windows の開発環境を作りなおした ver.2019

2016 年頃に WSL が使えるようになってからというもの
ずっと WSL で開発を続けてきました。
JavaScala に js に fish shell に Emacs
最近では Visual Studio Code と Remote WSL でかなり快適でした。
ファイルアクセスが遅いので git やビルドがもたつくことと、
WSL のプロセスが動いていると WMI Provider Host が
CPU を数 % だけずっと消費しつづけることが少し不満でしたが、
それでも昔に比べれば随分と快適でした。

にもかかわらず、魔が差して全てを消してしまったのでした。。

最近使えるようになった WSL2 を試してみたのが全てのきっかけ。
WSL1 に超最適化された環境と比べるといまひとつなところが多かったので
Insider Preview から戻したのですが気がついた時は手遅れ。
WSL2 から WSL1 に戻さずに Windows のバージョンを戻してしまったのです。
結果、WSL 環境がまっさらになりました。(*自分の責任)
もう一度 Insider に上げてみても状況は変わらず。。

ということで 1 から開発用の環境を構築しはじめたのでした……。

VirtualBox

もとのとおり WSL1 を使っても良かったのですが、
せっかくなので WSL 以前に使っていた VirtualBox を使うことにしました。

通常どおりインストールして、
ホストマシンとはホストオンリーアダプタで通信するように設定。
OS は趣味で Manjaro にしてみました。

あとは起動用にウィンドウを表示しないオプション headless を付けた

VBoxManage startvm manjaro --type headless

と bat ファイルを用意しておいて、
Windows のタスクスケジューラでホストマシン起動時に
この bat を実行させることで、
VM も自動でバックグラウンド起動するようにしています。

SSH

Windows 用の OpenSSH-Win64 が一番動きが良く表示崩れが無いようでした。
一番新しい v7.9.0.0p1-Beta でないと接続時に

warning: agent returned different signature type ssh-rsa (expected rsa-sha2-512)

と表示され鍵認証できませんでした。
はじめから入っている ssh は 7.7p1、署名のアルゴリズムが古い……。

Samba or SSHFS

vboxsf でホストのディレクトリをゲストと共有できますが、
ビルドなど主な作業をおこなうゲスト側からのアクセスが遅く
git や sbt でのビルド・パッケージングの際にもっさり感があります。
ソースをゲストに置けば速度の問題は解決しますが、
今度はホストの Windows で動かしたい IDE などが使えないことに。

そこでゲストマシンで Samba の設定をしておいて、
開発に使うリポジトリソースコードの類はゲスト側に置いて、
Windows からはネットワークドライブとしてマウントしています。

また、Samba と併用してみているのが SSHFS。
Samba の設定が面倒なのとファイルの権限や所有者の問題が発生したので
SSHFS ならどうかなとテスト中です。
利用したのは

の 2 つ。
WinFsp 2019.3 B1 をインストール後に SSHFS-Win 3.5 BETA をインストールしました。

するとエクスプローラのアドレスバーに
\\sshfs\ユーザー名@ゲストVMのIP と入力すれば SSHFS にアクセスできるようになります。
GUI でマウントの管理をするなら sshfs-win の README で

が紹介されていましたが、少し UI が独特でなんとも……。
単にネットワークドライブとして割り当ててしまえば良い気がします。
Samba よい安定していて良ければ乗り換え予定。

クリップボード共有

Windows 側から Hyper や Windows Terminal で Manjaro に繋いでいますが、
そのままでは tmux でコピーしても Windowsクリップボードに入りません。
これを lemonade で解決しています。

Manjaro は AUR にあるので

yay -S lemonade-git

でインストール完了。
Windows 用には実行時に黒い窓無しのバックグラウンドで起動できるように
-ldflags="-H windowsgui" を付けてビルドしたいので、
Manjaro の yay がビルドに使ったファイルを流用して

GOOS=windows GOARCH=amd64 go get -u -ldflags="-H windowsgui" github.com/pocke/lemonade

とすると Windows 用の exe が $GOPATH/bin/windows_amd64 にできるので、
これを Windows へコピーします。

Windows 側は

start /b C:\Users\ko-yamamoto\bin\lemonade.exe server --allow="VMのIP"

のような bat を作っておいて、
これもタスクスケジューラでログイン時に起動するようにしています。

tmux の設定は ↓ を参考にさせていただきました。

if-shell 'which lemonade' \
  'bind ] run-shell "lemonade paste | tmux load-buffer -" \; paste-buffer ; \
   bind -T copy-mode-vi y send -X copy-pipe-and-cancel "lemonade copy"'

google-ime-skk

Windows では CorvusSKK を使って日本語を入力しています。

辞書に無い言葉を簡単に変換できるように google-ime-skk を利用します。
Manjaro 側で

gem install google-ime-skk

としてインストールしたら、

sudo vim /etc/systemd/system/google-ime-skk.service

ExecStart のパスは環境にあわせて変更してください。
以下は linuxbrew で Ruby をインストールしている場合です。

[Unit]
Description=google-ime-skk

[Service]
ExecStart=/home/linuxbrew/.linuxbrew/bin/google-ime-skk

[Install]
WantedBy=multi-user.target

あとは

sudo systemctl enable google-ime-skk
sudo systemctl status google-ime-skk

としておけば Manjaro 起動時、上で設定したので Windows 起動時に
自動的に google-ime-skk が使えるようになっています。

CorvusSKK の設定から VM の IP を「SKK辞書サーバ」に指定すれば OK です。

その他

  • Windows 側では Git Bash を使っています
  • Visual Studio Codecode に PATH を通すと Git Bash から VScode が起動できて便利
  • Hyper も見た目が良いけど Windows Terminal が表示崩れが少ない気がします

おわりに

バックグラウンド起動とコピペ(クリップボード)共有は
設定しておくと使い勝手がかなり良くなるので良いですね。

WSL に慣れてしまっていたので VM の git や sbt がきびきび動いて気持ち良いです!

その後(2019/06/27 追記)

VPNVM のホストオンリーアダプタが使えないことが判明。。
Windows の開発環境を作りなおした ver.2019 の後日談 - あじーん-0.0.2-SNAPSHOT