Windows10 WSL2にLinux居城を爆誕させる

ひどい……こういうことする気でしょう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201962/0499762f-eba4-1bc7-142a-f56ccecb5022.png)


# するとどうなる？

## 知らんのか

### PowerShellすら不要になる

完


# 目次
WSLの中身は単純にUbuntu18.04の環境構築としても使えると思うんですけど (名推理)


- [WSL2とUbuntu18.04LTSを整備する](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#wsl2%E3%81%A8ubuntu1804lts%E3%82%92%E6%95%B4%E5%82%99%E3%81%99%E3%82%8B)
  - [WSL2とUbuntu18.04LTSのインストール (前提)](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#wsl2%E3%81%A8ubuntu1804lts%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB-%E5%89%8D%E6%8F%90)
  - [日本語化する](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%8C%96%E3%81%99%E3%82%8B)
  - [パッケージ (管理ツール)を最新化しておく](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8-%E7%AE%A1%E7%90%86%E3%83%84%E3%83%BC%E3%83%AB%E3%82%92%E6%9C%80%E6%96%B0%E5%8C%96%E3%81%97%E3%81%A6%E3%81%8A%E3%81%8F)
  - [WSL2のPATHからWindowsパスを抜く](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#wsl2%E3%81%AEpath%E3%81%8B%E3%82%89windows%E3%83%91%E3%82%B9%E3%82%92%E6%8A%9C%E3%81%8F)
  - [Vimをクリップボードに対応させる](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#vim%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%83%97%E3%83%9C%E3%83%BC%E3%83%89%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%95%E3%81%9B%E3%82%8B)
  - [デフォルトのPythonバージョンを3にする](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%AEpython%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%923%E3%81%AB%E3%81%99%E3%82%8B)
  - [開発用ディレクトリはWSLファイルシステム内にしておく](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#%E9%96%8B%E7%99%BA%E7%94%A8%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AFwsl%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E5%86%85%E3%81%AB%E3%81%97%E3%81%A6%E3%81%8A%E3%81%8F)
  - [WSL2が使えるメモリ量を制限する](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#wsl2%E3%81%8C%E4%BD%BF%E3%81%88%E3%82%8B%E3%83%A1%E3%83%A2%E3%83%AA%E9%87%8F%E3%82%92%E5%88%B6%E9%99%90%E3%81%99%E3%82%8B)
  - [IPv6を無効化する](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#ipv6%E3%82%92%E7%84%A1%E5%8A%B9%E5%8C%96%E3%81%99%E3%82%8B)
  - [Windows側からWSL2内のサーバに `localhost`で接続できるようにする](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#windows%E5%81%B4%E3%81%8B%E3%82%89wsl2%E5%86%85%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AB-localhost%E3%81%A7%E6%8E%A5%E7%B6%9A%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)
  - [WSL2内のサーバにlocalhostで接続できない問題が起きたら](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#wsl2%E5%86%85%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%90%E3%81%ABlocalhost%E3%81%A7%E6%8E%A5%E7%B6%9A%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E5%95%8F%E9%A1%8C%E3%81%8C%E8%B5%B7%E3%81%8D%E3%81%9F%E3%82%89)
  - [ALSAを使っているプログラム (たとえばChrome) から音を出す](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#alsa%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-%E3%81%9F%E3%81%A8%E3%81%88%E3%81%B0chrome-%E3%81%8B%E3%82%89%E9%9F%B3%E3%82%92%E5%87%BA%E3%81%99)

- [WSL2でDockerを使う](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#wsl2%E3%81%A7docker%E3%82%92%E4%BD%BF%E3%81%86)

- [WSL2でツール円舞する](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#wsl2%E3%81%A7%E3%83%84%E3%83%BC%E3%83%AB%E5%86%86%E8%88%9E%E3%81%99%E3%82%8B)
  - [Homebrew for WSLでパッケージインストールを楽にする](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#homebrew-for-wsl%E3%81%A7%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%92%E6%A5%BD%E3%81%AB%E3%81%99%E3%82%8B)
  - [Gitを最新化する](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#git%E3%82%92%E6%9C%80%E6%96%B0%E5%8C%96%E3%81%99%E3%82%8B)
  - [direnvでプロジェクトごとに環境変数を管理する](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#direnv%E3%81%A7%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%94%E3%81%A8%E3%81%AB%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B)
  - [jenvでJDKをバージョン管理する](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#jenv%E3%81%A7jdk%E3%82%92%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B)
  - [sbtenvでsbtをバージョン管理する](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#sbtenv%E3%81%A7sbt%E3%82%92%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B)
  - [pipenvでPython仮想環境を管理する](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#pipenv%E3%81%A7python%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83%E3%82%92%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B)
  - [goenvでGoをバージョン管理する](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#goenv%E3%81%A7go%E3%82%92%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B)
  - [tfenvでterraformをバージョン管理する](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#tfenv%E3%81%A7terraform%E3%82%92%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B)
  - [nvmでNodeをバージョン管理する](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#nvm%E3%81%A7node%E3%82%92%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B)
  - [avnでnvmによるバージョン切り替えを自動化する](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#avn%E3%81%A7nvm%E3%81%AB%E3%82%88%E3%82%8B%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%92%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B)
  - [LeiningenでClojureをいい感じに使う](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#leiningen%E3%81%A7clojure%E3%82%92%E3%81%84%E3%81%84%E6%84%9F%E3%81%98%E3%81%AB%E4%BD%BF%E3%81%86)
  - [sbtでScalaをがんばる](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#sbt%E3%81%A7scala%E3%82%92%E3%81%8C%E3%82%93%E3%81%B0%E3%82%8B)
  - [tmuxで1ターミナルをうまく使う](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#tmux%E3%81%A71%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%82%92%E3%81%86%E3%81%BE%E3%81%8F%E4%BD%BF%E3%81%86)
  - [tmuxinatorでtmuxのレイアウトを自動起動する](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#tmuxinator%E3%81%A7tmux%E3%81%AE%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88%E3%82%92%E8%87%AA%E5%8B%95%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B)

- [WSL2上で動かすSpacemacsのために便利な設定をする](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#wsl2%E4%B8%8A%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99spacemacs%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB%E4%BE%BF%E5%88%A9%E3%81%AA%E8%A8%AD%E5%AE%9A%E3%82%92%E3%81%99%E3%82%8B)
  - [Source Code Proフォントをインストールする](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#source-code-pro%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B)
  - [ispellでSpacemacsのスペルチェックをする](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#ispell%E3%81%A7spacemacs%E3%81%AE%E3%82%B9%E3%83%9A%E3%83%AB%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%82%92%E3%81%99%E3%82%8B)
  - [Clojureの掃除屋clj-kondoを雇う](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#clojure%E3%81%AE%E6%8E%83%E9%99%A4%E5%B1%8Bclj-kondo%E3%82%92%E9%9B%87%E3%81%86)
  - [jokerでClojureのlinterを充実させる](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#joker%E3%81%A7clojure%E3%81%AElinter%E3%82%92%E5%85%85%E5%AE%9F%E3%81%95%E3%81%9B%E3%82%8B)
  - [MetalsでScalaの定義ジャンプを効かせる](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#metals%E3%81%A7scala%E3%81%AE%E5%AE%9A%E7%BE%A9%E3%82%B8%E3%83%A3%E3%83%B3%E3%83%97%E3%82%92%E5%8A%B9%E3%81%8B%E3%81%9B%E3%82%8B)
  - [ScalastyleでScalaを自動フォーマットする](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#scalastyle%E3%81%A7scala%E3%82%92%E8%87%AA%E5%8B%95%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%81%99%E3%82%8B)

- [WSL2上でSpacemacsを動かしてGUI表示する](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#wsl2%E4%B8%8A%E3%81%A7spacemacs%E3%82%92%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6gui%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B)
  - [VcXsrvインストール](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#vcxsrv%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
  - [WSL2にデスクトップ環境をインストールする](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#wsl2%E3%81%AB%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E7%92%B0%E5%A2%83%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B)
  - [キー反応速度を上げる](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#%E3%82%AD%E3%83%BC%E5%8F%8D%E5%BF%9C%E9%80%9F%E5%BA%A6%E3%82%92%E4%B8%8A%E3%81%92%E3%82%8B)
  - [WSL2からVcXsrvに接続するための設定をする](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#wsl2%E3%81%8B%E3%82%89vcxsrv%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E3%81%99%E3%82%8B)
  - [Spacemacsをインストールする](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#spacemacs%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B)
  - [GNU Emacs26をインストールする](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#gnu-emacs26%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B)
  - [Spacemacsでまともな日本語入力をする](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#spacemacs%E3%81%A7%E3%81%BE%E3%81%A8%E3%82%82%E3%81%AA%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%85%A5%E5%8A%9B%E3%82%92%E3%81%99%E3%82%8B)
  - [プログラミングと相性の良いフォント Source Han Code JPを使う](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%A8%E7%9B%B8%E6%80%A7%E3%81%AE%E8%89%AF%E3%81%84%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88-source-han-code-jp%E3%82%92%E4%BD%BF%E3%81%86)
  - [Spacemacsで `日本語の漢字`の表示が `繁体字 (中国語)`になってしまう問題は](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#spacemacs%E3%81%A7-%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AE%E6%BC%A2%E5%AD%97%E3%81%AE%E8%A1%A8%E7%A4%BA%E3%81%8C-%E7%B9%81%E4%BD%93%E5%AD%97-%E4%B8%AD%E5%9B%BD%E8%AA%9E%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86%E5%95%8F%E9%A1%8C%E3%81%AF)
  - [よく使う単語を (デスクトップ環境を立ち上げずに)辞書登録する](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1#%E3%82%88%E3%81%8F%E4%BD%BF%E3%81%86%E5%8D%98%E8%AA%9E%E3%82%92-%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E7%92%B0%E5%A2%83%E3%82%92%E7%AB%8B%E3%81%A1%E4%B8%8A%E3%81%92%E3%81%9A%E3%81%AB%E8%BE%9E%E6%9B%B8%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B)




# WSL2とUbuntu18.04LTSを整備する

## WSL2とUbuntu18.04LTSのインストール (前提)
既に導入しているものとする。完

cf. [Windows10 HomeでLinuxに寄せた開発環境を整える](https://qiita.com/v2okimochi/items/c9da7df8d4f03283121b#wsl2--ubuntu1804lts)


## 日本語化する
日本語が表示されるようにする。

これらのコマンドでいけたような気がする。

```bash
sudo apt -y install language-pack-ja
sudo update-locale LANG=ja_JP.UTF8
sudo apt -y install manpages-ja manpages-ja-dev
```

cf. [【WSL入門】第2回　避けては通れないWSLとWindows 10との文字コードの違い](https://www.atmarkit.co.jp/ait/articles/1904/05/news027.html)

ちなみに、これらを試したのに未だ `□□□`みたいな表示になっている……という時は、 **WSL2ターミナルのフォント設定** が悪さをしている可能性もある。

たとえば僕が使っていた `DejaVu Sans Mono`だとどうもダメで、 `MSゴシック`とかなら問題なく表示できる。

(DejaVu、Spacemacsでは元気に日本語を表示するのに…どうして)



## パッケージ (管理ツール)を最新化しておく

```bash
sudo apt update
sudo apt upgrade
```

aptコマンドの使い方 => [aptコマンドチートシート](https://qiita.com/SUZUKI_Masaya/items/1fd9489e631c78e5b007)


## WSL2のPATHからWindowsパスを抜く
デフォルト設定ではWSL2の `PATH`環境変数にWindowsのパス (/mnt/c/～みたいなやつとか)が含まれている。

WSL2のタブ補完を重くするほか、SpacemacsがPythonを呼ぶ時に **Windows側のコマンドを探し始める (e.g. `/mnt/c/msys64/usr/bin/cmd`)** といった弊害があるため、予め排除したい。

`/etc/wsl.conf`に以下を追記することで排除できる。

```conf:/etc/wsl.conf
[interop]
appendWindowsPath = false
```

cf. https://github.com/microsoft/WSL/issues/4234#issuecomment-505609403


ただし、Dockerでは必要なパスがあったらしいので、そこだけ別途パスを追加する必要がある。

`docker-credential-desktop.exe`がパスに含まれていないと、 `docker login`時に以下のエラーが起こる。

```
Error saving credentials: error storing credentials - err: exec: "docker-credential-desktop.exe": executable file not found in $PATH, out: ``
```

僕はこうやった (めんどいのでディレクトリごと追加した)

```bash:~/.bash_profile
export PATH=$PATH:/mnt/c/Program\ Files/Docker/Docker/resources/bin
```


cf. [WSL2上のdocker-composeで認証エラー](https://roy-n-roy.github.io/Windows/WSL%EF%BC%86%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A/DockerDesktopError/)



## Vimをクリップボードに対応させる
どうもVim操作がクリップボードのコピーを共有しないみたい :innocent: 

(一応、Windows側のクリップボード内容はinsert modeで `Ctrl + Shift + v`によって貼り付けられるが……)

Vimのバージョン表示からクリップボードの情報を確認して、もし `-clipboard`だったらクリップボード非対応 :innocent: 

対応していれば、このように `+clipboard`と表示される。

```bash
$ vim --version | grep clip

+clipboard         +jumplist          +persistent_undo   +virtualedit
-ebcdic            +mouseshape        +statusline        +xterm_clipboard
```

クリップボード対応の `vim-gtk`をインストールする。

非対応のVimをアンインストールして入れ直す。

```bash
sudo apt purge vim
sudo apt install vim-gtk
```

cf. [Windows Subsystem Linux - Make VIM use the clipboard?](https://superuser.com/a/1345241)


## デフォルトのPythonバージョンを3にする
`python`コマンドで使えるPythonはバージョン2 :innocent: 

既にpython3が入っていれば、aliasコマンドで乗っ取っておく。

```bash:~/.bash_profile
alias python='python3'
```

※ pipenvやpyenvを使う上では、この措置はいらなさそう


## 開発用ディレクトリはWSLファイルシステム内にしておく
これは単なる意識の話だが、オススメなので。。。

WSL2でCドライブ下 (いわゆる `/mnt/c/`)を主戦場にしていると……

### ファイルシステムが重い
`magit status`がクソみたいに遅い (10秒くらいかかる)

`git status`については、同じ問題が既に報告されている。
cf. [git status is slow in WSL2](https://github.com/microsoft/WSL/issues/4401)

原因として考えられるのは、 **WSL2のファイルシステム外 (/mnt/)** にあるファイルを扱っているケース。

`/mnt`下のファイルシステムが劣悪パフォーマンスという報告がある (つまりCドライブ `/mnt/c`などにgitプロジェクトを置いていると激重)

cf. [[wsl2] filesystem performance is much slower than wsl1 in /mnt](https://github.com/microsoft/WSL/issues/4197)

ひとまずの対処としては、`/mnt`を避けることくらい。

WSL2側に `~/dev`ディレクトリを作って試しにcloneしてみると、あらゆるファイルアクセスがアホみたいに速い :tada: 
(元々WindowsビルドのEmacsで遅さに耐えていたためか3秒ラグくらいは許容できる身体になってて、今まで `/mnt`下へのアクセスがあんなに遅いとは感じていなかった :innocent: )

「WSL2のディレクトリなんて場所がわからん！ (わかったとしても遠いしアクセスもできんやんけ！)」という方もいそう。

WLS2のディスクはこのへんに存在するが、中身を見られない :innocent: 

```
C:\Users\v2okimochi\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\LocalState
```

cf. [WSLのホームディレクトリの場所@2019](https://qiita.com/kalafinalice/items/70a76d35398ab11af778)

WSL2内を一発で見に行く方法は **ファイルエクスプローラのURL欄に `\\wsl$`を入力してジャンプ**

cf. https://github.com/microsoft/WSL/issues/4328#issuecomment-513691337

はええ。。。普通にアクセスできている。。。


### npmなどのホットリロードが効かない
`npm run serve`など、「関連ファイルを変更・上書き保存すると自動で再ビルドされる」ホットリロード機能が **効かなくなる** 。

npm単独で起こるのではなく、ホットリロード機能について起こるようだ (?)

やはり `/mnt/`下で開発していると発生するようで、 `/home/` (WSL2のファイルシステム)下で開発していれば問題ない模様。 ~~Windows本体のファイルシステムは恨みでも買っているのか~~

cf. https://github.com/microsoft/WSL/issues/4417#issuecomment-628697567


## WSL2が使えるメモリ量を制限する
初期設定だと、WSL2で大量のメモリを消費した時にWindows本体がメモリ不足で詰む。

cf. [WSL 2 consumes massive amounts of RAM and doesn't return it](https://github.com/microsoft/WSL/issues/4166)

Windows側の `~/.wslconfig`を作って、以下の設定をする。
たとえばメモリを7GBまで、スワップを8GBまでにする。

```:~/.wslconfig
[wsl2]
memory=7GB
swap=8GB
```

cf. https://github.com/microsoft/WSL/issues/4166#issuecomment-622318211

もちろん必要な時には多くのメモリを使わせたい (極端に制限すればWSL2が低スペと化す :innocent: )ので、ホストマシンが耐えられるギリギリを模索していくことになりそう。


## IPv6を無効化する
ClojureのnReplサーバやAPIサーバがIPv6で立ち始めるので。。。

`/etc/sysctl.conf`に以下を追記する。

```conf:/etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
```

ターミナルから反映する。

```bash
sudo sysctl -p
```

cf. [Disable IPv6 on Ubuntu Linux and Windows 10](https://mobilefish.de/disable-ipv6-ubuntu-linux-and-windows-10)


## Windows側からWSL2内のサーバに `localhost`で接続できるようにする
初期設定ではできない。

### `.wslconfig`でホストフォワーディングする
楽に設定できる。

まず、Windows側の `~/.wslconfig` (つまりWSL2側から見た `/mnt/c/Users/v2okimochi(ユーザ名)/.wslconfig`)に `localhostForwarding`を加える。

```:~/.wslconfig
[wsl2]
localhostForwarding=true
```

cf. [WSL2内で立ち上げたサーバにWindows側からlocalhostで接続する](https://qiita.com/snaka/items/a8eee4cfc8f7d733e6ab)

~~デフォルトでtrueになってるらしいけど効かなかった疑惑が強いので明示的に設定するのが良さそう。~~


次に、WSL2側で立ち上げるサーバのホストIPは `0.0.0.0`を指定する ( `localhost`や `127.0.0.1`ではダメみたい :innocent: )

> For example, you may need to bind your application to 0.0.0.0 instead of 127.0.0.1. In the example of a Python app using Flask, this can be done with the command: app.run(host='0.0.0.0'). 

cf. [Comparing WSL 2 and WSL 1 - Connecting via remote IP addresses](https://docs.microsoft.com/en-us/windows/wsl/compare-versions#connecting-via-remote-ip-addresses)


### サーバのホストIPをイーサネットに合わせる
`.wslconfig`を設定せずにやる場合 (設定したほうが楽なのでたぶん非推奨。最初に載せた方法がコレなので残しているだけ)

WSL2側にWeb, APIサーバを立てていて、以下のようにAPIサーバ側のローカルアドレスが `localhost (or 127.0.0.1)`になっていると、Windows側から接続できない。Webサーバからも接続できない。

```bash
$ sudo netstat -tulpn | grep LISTEN

tcp        0      0 127.0.0.1:8080          0.0.0.0:*   <- 接続できない (API)
tcp        0      0 0.0.0.0:3000            0.0.0.0:*   <- 接続できる (Web)
```

Webサーバがあたかも大丈夫っぽい見え方だが、Windows側からはWSL側のイーサネット `eth0`アドレスを使わないと接続できなかった :innocent: 

多分同じ理由で、 `.wslconfig`を使わないならAPIサーバを単に `0.0.0.0`にしてもダメ。

サーバのホストIPは、WSL側の `eth0`アドレスと合わせる (172.29.29.80みたいなやつ)
※ Windows側から見えているWSLアドレスではない

すると、WSL2内の別サーバやWindows側から `eth0`アドレスで接続できる。

不要かもだが、もしeth0アドレスが変わっても機械的に取得するには、こういうコマンドを使う？

```bash
$ ip address show eth0 | grep inet | awk '{print substr($2, 0, index($2, "/") - 1)}'
```

※ eth0のアドレス情報からIP (172.29.29.80/20みたいなやつ)だけを抜き出し、さらにサブネットマスク (/20とか)を抜いて表示する


## WSL2内のサーバにlocalhostで接続できない問題が起きたら
WSL2のホストフォワーディングを有効にしてWSL2内サーバ側ホストIPを `0.0.0.0`にしたのにWindows側から接続できない (拒否される)というパターンがある。

WSL2の気分によって時折そうなる…と思ったらなんとPCを起動する度に発生する (cf. https://github.com/microsoft/WSL/issues/4636#issuecomment-634817484 (ビルド `19041.264`で観測))。

全般的な (?)issueも立っていた
cf. [Local sites running in WSL2 not accessible in browser](https://github.com/microsoft/WSL/issues/5317)

解決策としては、
- Windowsの高速スタートアップ設定を止める
- PCを再起動する
- WSL2を再起動する

### 高速スタートアップ設定を止める
Windows10にはPC起動を高速化する設定があり、これがWSL2に影響しているという説がある。

> To everyone subscribed on this thread: Turn off Fast Startup.
Until the bug is fixed turning off Fast Startup seems best solution for now on build 19041.

cf. https://github.com/microsoft/WSL/issues/4636#issuecomment-637821622
cf. [WSL2 localhost forwarding randomly stop working](https://github.com/microsoft/WSL/issues/5317)

Windows設定から高速スタートアップを止める方法：
cf. [Windows10 - 高速スタートアップを有効/無効にする方法](https://pc-karuma.net/windows-10-enable-disable-fast-startup/)

### PCを再起動する
解決するらしいが、しんどい
(毎日PCをシャットダウンしているので、毎日PC起動後に再起動せねばなるまい)

### WSL2を再起動する
[色々と不具合があるときも、WSL2を再起動して解決することがある](https://qiita.com/kotauchisunsun/items/8b1d879b8f682bb9d55a)。

PCを再起動せず、WSL2だけを狙って再起動するにはこうする。停止させれば、自動で再起動する。

```
wsl --shutdown
```

cf. [Rebooting Ubuntu on Windows without rebooting Windows?](https://superuser.com/questions/1126721/rebooting-ubuntu-on-windows-without-rebooting-windows)

`wsl -t Ubuntu18.04`みたいな使い方もあって気になっていたけど、うまく動かなくて断念。





## ALSAを使っているプログラム (たとえばChrome) から音を出す

cf. https://github.com/microsoft/wslg/issues/864

(WSL2と実機との間で音のやり取りをするPulseAudioはWSLg側にあるとかなんとか)

- WSL2上のUbuntuにPulseAudio各種がインストールされていることを確認する
- ALSA用の `libasound2-plugins` がインストールされていることを確認する
- `~/.asoundrc` に設定が書かれていることを確認する

```
pcm.default pulse
ctl.default pulse
```

最後の設定ファイルが無くてWSL2上のChromeから音が聞こえないという現象はあった。





# WSL2でDockerを使う
Docker Desktop for Windows v2.2.2.0以降をインストールする。

Dockerの設定から、 `Enable integration with my default WSL distro` or `Enable integration with additional distros (お好みのディストリビューション)にチェックを入れる。

完

cf. https://qiita.com/v2okimochi/items/c9da7df8d4f03283121b#docker-desktop-for-windows-v2220%E4%BB%A5%E9%99%8D






# WSL2でツール円舞する

## Homebrew for WSLでパッケージインストールを楽にする
ようこそ https://docs.brew.sh/Homebrew-on-Linux

ターミナルでコレを実行するらしい。

```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
test -d ~/.linuxbrew && eval $(~/.linuxbrew/bin/brew shellenv)
test -d /home/linuxbrew/.linuxbrew && eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)
test -r ~/.bash_profile && echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.bash_profile
echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.profile
```

Macのように、パッケージを楽にインストールできるようになった :tada: 

brewの使い方 => [今さらだけどHomebrewのコマンドをちゃんと理解して使おう](https://qiita.com/fuqda/items/db8aff0ba4068aea2cc6)


## Gitを最新化する
Ubuntu18.04LTSに入っているGitは2.17.1-1ubuntu0.7だった。これ以上バージョンが上がらない :innocent: 

Gitに脆弱性が見つかったというニュースがホットなので、かなり気になる。

cf. [Gitに深刻な脆弱性、認証情報など取得されるおそれ](http://www.security-next.com/114201)

aptのGitはアンインストールしてしまって、Homebrew for WSLでGitをインストールするのが良さそう。

```bash
sudo apt purge git

brew install git
```


## direnvでプロジェクトごとに環境変数を管理する
ようこそ https://github.com/direnv/direnv

Homebrewを入れたな？brewを打て

```bash
brew install direnv
```

`~/.bashrc`に設定を追記する。vimを使うならこう

```bash:~/.bashrc
export EDITOR=vim
eval "$(direnv hook bash)"
```

使い方 => [direnvを使おう](https://qiita.com/kompiro/items/5fc46089247a56243a62)


direnvは `.env`も読み込むけど、 `.envrc`を置いてあると `.env`を読まなそう。

`.env`を読みつつ `.envrc`で上書きもしたい場合はこんな感じに `dotenv`を使う

```bash:.envrc
dotenv
export OKIMOCHI_VERSION=2
```

(公式READMEによると)
> Note that this functionality is not supported in .env files. If the coexistence of both is needed, one can use .envrc for leveraging stdlib and append dotenv at the end of it to instruct direnv to also read the .env file next.


## jenvでJDKをバージョン管理する
ようこそ https://github.com/jenv/jenv

しかしHomebrewのjenvはうまく動かない :innocent: 

jenv公式に従い、Linux版の手動インストールをする。

Bashの場合はこれらのコマンドでいけそう。

```bash
git clone https://github.com/jenv/jenv.git ~/.jenv

echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(jenv init -)"' >> ~/.bash_profile
```

https://jdk.java.net/archive/ からopenjdk11や12を手動ダウンロードして、jenvに加える。

たとえばopenjdk13を使う場合は、これらのコマンドでいけそう。
手動ダウンロードしたJDKは `~/jdks/`に集める想定。

```bash
mkdir ~/jdks
cd ~/jdks
wget https://download.java.net/java/GA/jdk13.0.2/d4173c853231432d94f001e99d882ca7/8/GPL/openjdk-13.0.2_linux-x64_bin.tar.gz
tar xvfz openjdk-13.0.2_linux-x64_bin.tar.gz

jenv add ~/jdks/jdk-13.0.2
```

うまく入れば、JDKバージョンの候補に表示される。

```bash
$ jenv versions

  system
  13
  13.0
  13.0.2
  openjdk64-13.0.2
```

利用するJDKとして指定する。グローバルに使いたい場合は、たとえばこう。

```bash
jenv global 13.0.2
```

成功すれば、Javaコマンドのバージョン表示が変わる。

```bash
$ java --version

openjdk 13.0.2 2020-01-14
OpenJDK Runtime Environment (build 13.0.2+8)
OpenJDK 64-Bit Server VM (build 13.0.2+8, mixed mode, sharing)
```

JDKをバージョン管理できるようになった :tada: 


## sbtenvでsbtをバージョン管理する
ようこそ https://github.com/sbtenv/sbtenv

### sbtenvの用意
Homebrewを入れたな？brewを打て

```bash
brew install sbtenv
```

### 初期設定
`~/.bash_profile`に追記する

```bash:~/.bash_profile
export PATH="${HOME}/.sbtenv/bin:${PATH}"
eval "$(sbtenv init -)"
```

ターミナルを再起動する


### 予めGPG公開鍵を取り込んでおく
任意のsbtをインストールしようとすると多分こういうエラーが出るので予め準備しておく

```bash:たぶんこういうのが出る
gpg: 署名を検査できません: 公開鍵がありません

or

gpg: Can't check signature: No public key
```

こうする

```bash
$ gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv 99E82A75642AC823
```

cf. [sbtenv installでGPGのpublic keyがないと怒られたときの対処法](https://qiita.com/sawadashota/items/e9073ea3e68da132dacb)


### 任意のsbtをインストール
たとえば1.5.2でいく

```bash
# インストール可能なバージョン一覧を出す
$ sbtenv install -l

# インストールする
$ sbtenv install sbt-1.5.2
```

### 使用するsbtを決める
( `build.properties`にsbtバージョンが指定されていたらいい感じに読み取ってくれるらしい？)

```bash
# 全体的にデフォルトのsbtを1.5.2にする
$ sbtenv global sbt-1.5.2

# そのディレクトリでデフォルトのsbtを1.5.2にする
$ sbtenv local sbt-1.5.2
```


sbtをバージョン管理できるようになった :tada:


## pipenvでPython仮想環境を管理する
ようこそ https://github.com/pypa/pipenv

### pipenvの用意
Homebrewを入れたな？brewを打て

```bash
brew install pipenv
```


### pyenvの用意
どうも `pyenv` (Pythonのバージョン管理)が入ってこないみたい。

必要なライブラリを準備した上で、pyenvをインストールする。

```bash
sudo apt install zlib1g-dev
brew install pyenv
```

cf. [【pyenv】ubuntu16.04でのpython環境の構築](https://qiita.com/banaoh/items/00aea13fe045fab7e8ba)


Pythonの仮想環境を使えるようになった :tada: 


## goenvでGoをバージョン管理する
ようこそ https://github.com/syndbg/goenv

Homebrewを入れたな？brewを打て

```bash
brew install --HEAD goenv
```

`--HEAD`をつけてインストールしないとgoの最新バージョンを探せない :innocent: 

cf. [Supported go versions for installation (goenv 1.23.3)](https://github.com/syndbg/goenv/issues/143)

goをバージョン管理できるようになった :tada: 


## tfenvでterraformをバージョン管理する
ようこそ https://github.com/tfutils/tfenv

Homebrewを入れたな？brewを打て

```bash
brew install tfenv
```

terraformをバージョン管理できるようになった :tada: 


## nvmでNodeをバージョン管理する
ようこそ https://github.com/nvm-sh/nvm

Homebrewがサポートされていない :innocent: :innocent: :innocent: 

> Homebrew installation is not supported. If you have issues with homebrew-installed nvm, please brew uninstall it, and install it using the instructions below, before filing an issue.

断腸の思いで手動インストールする。
公式に従い、以下のコマンドでいけそう。

```bash
export NVM_DIR="$HOME/.nvm" && (
  git clone https://github.com/nvm-sh/nvm.git "$NVM_DIR"
  cd "$NVM_DIR"
  git checkout `git describe --abbrev=0 --tags --match "v[0-9]*" $(git rev-list --tags --max-count=1)`
) && \. "$NVM_DIR/nvm.sh"
```

`~/.bashrc`に環境変数を追加する。

```:~/.bashrc
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
```

cf. https://github.com/nvm-sh/nvm#manual-install

Nodeをバージョン管理できるようになった :tada: 

余談だが、WSL2では `npm run serve`のホットリロードが機能しない :innocent: 

cf. https://github.com/microsoft/WSL/issues/4417


## avnでnvmによるバージョン切り替えを自動化する
まずはnvmで適当なNodeバージョンを使うんだ (v12.18.0とか)

nvmによるNodeバージョン切り替えは、そのままだと手動で行う必要がある :innocent: :innocent: 
jenvがJavaバージョンを勝手に使い分けるみたいに、nvmもよしなにやってほしい。。。

自動化するため [avn](https://github.com/wbyoung/avn)をインストールする

```bash
$ npm install -g avn avn-nvm avn-n
$ avn setup

avn: profile already set up (~/.bash_profile)
avn: configuration unchanged (~/.avnrc)
avn-n: installation complete
```

cf. [ディレクトリごとに異なるバージョンのnodeを使いたいのでavnを使った話](https://qiita.com/jigengineer/items/6689ed1523335a6c6d43)


nodeのバージョンによっては、setup時に `error cb.apply is not a function`エラーが起こる。

v14.11.0やv14.12.0ではダメだった。v12.18.0ではsetupできた。

cf. https://github.com/nodejs/help/issues/2874#issuecomment-693368991

あとは任意のディレクトリに `.node-version`を用意すれば、そのディレクトリに入った時自動でNodeバージョンが切り替わる。

地味に面倒なので `echo "v14.12.0" > .node-version`みたいにスッと作ってしまう。

```:.node-version
v14.12.0
```

avnを入れたのはv12.18.0のはずだが、他のバージョンを使っている時でもちゃんとバージョン切り替えが発動する。なぜだ。。。


## LeiningenでClojureをいい感じに使う
ようこそ https://leiningen.org/

残念ながら手動操作が多い :innocent: 

> 1. Download the lein script (or on Windows lein.bat)
2. Place it on your $PATH where your shell can find it (eg. ~/bin)
3. Set it to be executable (chmod a+x ~/bin/lein)
4. Run it (lein) and it will download the self-install package

以下のコマンドでいけそう。

```bash
wget https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein
mkdir ~/bin
sudo mv ~/lein ~/bin/
sudo chmod a+x ~/bin/lein
echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc
lein
```

成功すれば、leiningenのバージョンを確認できる。

```bash
$ lein --version

Leiningen 2.9.3 on Java 12.0.2 OpenJDK 64-Bit Server VM
```

ClojureのビルドツールLeiningenを使えるようになった :tada: 


## sbtでScalaをがんばる
ようこそ https://www.scala-sbt.org/1.x/docs/ja/Hello.html

Homebrewを入れたな？brewを打て

```bash
brew install sbt
```

Scalaのビルドツールsbtを使えるようになった :tada: 


## tmuxで1ターミナルをうまく使う
ようこそ https://github.com/tmux/tmux

## tmuxをインストール
Homebrewを入れたな？brewを打て

```bash
brew install tmux
```

ターミナルの1画面を分割して使えるようになった :tada: 


## マウス操作やクリップボード共有を設定する
マウスで画面を切り替えたり、クリップボードを共有したりしたい。

まずクリップボード共有の前準備として、Windows側のクリップボードを使うために [win32yank](https://github.com/equalsraf/win32yank)を使う[^外部ツールを使う理由]。

[^外部ツールを使う理由]: /mnt/c/Windows/System32/clip.exeでもできるのかもしれないが、Windows側のパスは予め除外済みなので改めて加えるのが億劫だった。記事によっては既存コマンドに不足があってwin32yankを推すものもあったので、今回採択した。

```bash
wget https://github.com/equalsraf/win32yank/releases/download/v0.0.4/win32yank-x64.zip
unzip win32yank-x64.zip
```

win32yank.exeが出てくる。
一緒に解凍される `LICENSE`や `README.md`は削除しても良い。

今回は `~/bin/`に置いてパスを通すことを想定する。
予め実行権限もつけておく。

```bash
chmod +x win32yank.exe
mkdir ~/bin
mv ~/win32yank.exe ~/bin/
echo "export PATH=$HOME/bin:$PATH" >> ~/.bash_profile

source ~/.bash_profile
```


最後に、 `~/.tmux.conf`に以下を記述する。

```~/.tmux.conf
# マウス有効化
set -g mouse on

# マウススクロール
bind -n WheelUpPane   select-pane -t= \; copy-mode -e \; send-keys -M
bind -n WheelDownPane select-pane -t= \;                 send-keys -M

# ドラッグでコピー
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "win32yank.exe -i"

# copy-modeのコピー＆ペーストをviキーバインドにする
set-window-option -g mode-keys vi
setw -g mode-keys vi
bind-key -T copy-mode-vi v send -X begin-selection
bind-key -T copy-mode-vi y send -X copy-pipe-and-cancel "win32yank.exe -i"
unbind -T copy-mode-vi Enter
bind-key -T copy-mode-vi Enter send -X copy-pipe-and-cancel "win32yank.exe -i"

```

cf. [tmux 2.1 以降でもマウスを有効にする方法](https://qiita.com/polamjag/items/4a85aa09e49f8724dcea)
cf. [tmuxのおすすめconf設定@2019](https://qiita.com/kalafinalice/items/c02c0345293fe60af6e5#%E6%93%8D%E4%BD%9C%E7%B3%BB)


さらに、tmuxではコピー＆ペーストの挙動がまるで違うため、ひとまずtmux


## tmuxinatorでtmuxのレイアウトを自動起動する
ようこそ https://github.com/tmuxinator/tmuxinator

Homebrewを入れたな？brewを打て

```bash
brew install tmuxinator
```

開発環境でいつも使っているようなレイアウト・いつも使っている移動コマンドなどを登録して、コマンド1発で自動起動できる。

先に環境変数 `EDITOR`を追加しておく。tmuxinatorで使うエディタ。

```:~/.bash_profile
export EDITOR='vim'
```

たとえば `dev`という名前で、自動起動の設定を作る。

```bash
$ tmuxinator new dev
```

先ほど登録したエディタが立ち上がるので、Yamlで設定を書く。たとえばこう。

```yaml:~/.config/tmuxinator/dev.yml
name: dev
root: ~/

windows:
  - editor:
      layout: 8c65,205x39,0,0{102x39,0,0,0,102x39,103,0[102x19,103,0,1,102x19,103,20,2]}
      panes:
        - root-dir:
          - cd ~/dev/v2okimochi-apps
          - pwd
        - frontend:
          - cd ~/dev/v2okimochi-apps/frontend
          - npm run serve
        - spacemacs:
          - emacs
```

上記の設定では、こういうことをしている。

- 1ウィンドウを3分割している (左右2分割し、右側をさらに上下2分割)
  - レイアウトは用意されたものを使うこともできるし、自力で書くこともできる  
  > The layout setting gets handed down to tmux directly, so you can choose from one of [the five standard layouts](http://manpages.ubuntu.com/manpages/precise/en/man1/tmux.1.html#contenttoc6) or [specify your own](http://stackoverflow.com/a/9976282/183537).
  - 自力で書く場合は、tmuxで好みのレイアウトを作った状態で別のシェルから `tmux list-windows`すれば、レイアウト情報が表示される。
- 3分割したペインで、それぞれ別のコマンドを実行している
    - 1番目のペイン `root-dir`では `cd`と `pwd`
    - 2番目のペイン `frontend`では `cd`と `npm run serve`
    - 3番目のペイン `spacemacs`では `emacs`


作成済みの設定 `dev`を実行する場合はこう。

```bash
$ tmuxinator start dev
```

さらに `alias`を張って、WSL2の開始とともに一言でレイアウト起動することもできる。

```:~/.bash_profile
alias devstart='tmuxinator start dev'
```

いつものレイアウトでディレクトリ移動したりサーバを立ち上げたりする作業が自動化された :tada: 


# WSL2上で動かすSpacemacsのために便利な設定をする
Spacemacsをインストールする前にやっておくと、無駄なエラーが出なくて良さそう。

## Source Code Proフォントをインストールする
Spacemacsで推奨されているフォント `Source Code Pro`をUbuntuにインストールする。

以下の7コマンドをターミナルで打ち込む。完

```bash
mkdir /tmp/adodefont
cd /tmp/adodefont
wget https://github.com/adobe-fonts/source-code-pro/archive/2.010R-ro/1.030R-it.zip
unzip 1.030R-it.zip
mkdir -p ~/.fonts
cp source-code-pro-2.010R-ro-1.030R-it/OTF/*.otf ~/.fonts/
fc-cache -f -v
```

cf. https://kurenaif.hatenablog.com/entry/2016/10/28/193238
(元はコレ？ https://askubuntu.com/a/576263)


## ispellでSpacemacsのスペルチェックをする
言語を `ja_JP`にしていると、デフォルト設定では `ja_JP`に対するispellのスペルチェックがうまく働かない。

```
(エラー: No word lists can be found for the language "ja_JP".)
```

ispellの言語設定を `en_US`にする。なんと `aspell.conf`で良いらしい。

```bash
echo “lang en_US” > ~/.aspell.conf﻿
```

cf. [ispellで No word lists can be found for the language “ja_JP”](https://senooken.jp/post/2013/05/16/)


## Clojureの掃除屋clj-kondoを雇う
ようこそ https://github.com/borkdude/clj-kondo

Homebrewを入れたな？brewを打て

```bash
brew install borkdude/brew/clj-kondo
```

掃除屋を雇えた :tada: 


## jokerでClojureのlinterを充実させる
ようこそ https://github.com/candid82/joker

Homebrewを入れたな？brewを打て

```bash
brew install candid82/brew/joker
```

linterが増えた :tada: 


## MetalsでScalaの定義ジャンプを効かせる
Spacemacsの本体はEmacsなので、EmacsでMetalsを扱うためのドキュメントを参考にする。

手動インストール :innocent: :innocent: :innocent: <- いつの間にか勝手にインストールされるようになったかも？

手動インストールする場合は、これらのコマンドでいける模様 (最後のコマンドは `sudo`が必要)

```bash
curl -L -o coursier https://git.io/coursier-cli
chmod +x coursier
sudo ./coursier bootstrap \
  --java-opt -Xss4m \
  --java-opt -Xms100m \
  --java-opt -Dmetals.client=emacs \
  org.scalameta:metals_2.12:0.9.1 \
  -r bintray:scalacenter/releases \
  -r sonatype:snapshots \
  -o /usr/local/bin/metals-emacs -f
```

cf. https://scalameta.org/metals/docs/editors/emacs.html

Spacemacsでは `Space Space`から手動で `lsp-metals-build-import`を実行する必要があるかも。

(でないと `no build target`だの `Skipping build import for unsupported sbt version <unknown>`だのとエラーが出て定義ジャンプしてくれない場合がある)


## ScalastyleでScalaを自動フォーマットする
cf. https://github.com/syl20bnr/spacemacs/tree/develop/layers/%2Blang/scala#scalastyle

Homebrewを入れたな？brewを打て

```bash
brew install scalastyle
```

しかしこれだけでは機能しない :innocent: 

フォーマット設定のため、以下のようなxmlファイルを作る。たとえば `~/scalastyle_config/`に `default.xml`という名前で置く場合はこう。

```xml:~/scalastyle_config/default.xml
<scalastyle commentFilter="enabled">
 <name>Scalastyle standard configuration</name>
 <check level="warning" class="org.scalastyle.file.FileTabChecker" enabled="true" />
 <check level="warning" class="org.scalastyle.file.FileLengthChecker" enabled="true">
  <parameters>
   <parameter name="maxFileLength">800</parameter>
  </parameters>
 </check>
</scalastyle>
```

cf. http://www.scalastyle.org/configuration.html

次にSpacemacs側の設定を加える。 `user-config()`にxmlの場所を絶対パスで追記する (フォーマットはFlycheckで行う)

ホームディレクトリが `/home/v2okimochi`ならこう。

```.spacemacs
(defun dotspacemacs/user-config ()
  ;;; Scala

  ;; format style
  (setq-default flycheck-scalastylerc "/home/v2okimochi/scalastyle_conf/default.xml")
)
```

自動フォーマットされるようになった :tada: 





# WSL2上でSpacemacsを動かしてGUI表示する
Xサーバを利用してWSL2の描画をWindows側へ引っ張る。

## VcXsrvインストール
cf. [WSL上にXサーバをインストールしてGUIを実現する（VcXsrv編）](https://www.atmarkit.co.jp/ait/articles/1812/06/news040.html)

※ VcXsrvのインストールだけ参考にする。WSL2側の設定は色々カスタムすることになる。


## WSL2にデスクトップ環境をインストールする
インストールするデスクトップ環境は、わりと何でも良いかもしれない。

僕は `xfce4`をインストールした。軽量で有名みたい。

```bash
sudo apt install xfce4
```

cf. [初心者のためのWSL( 2 ) ~GUI設定,デスクトップ環境設定編~](https://qiita.com/yoshige/items/7a17bb7a3582d72a7e48#5%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89)


## キー反応速度を上げる
xfce4のデスクトップ環境上でキー反応速度を上げておくと、デスクトップ環境で起動したSpacemacs上のカーソル移動が捗る。

キーボード設定から `キー入力の設定`を変える。僕のオススメはこれ。

```
- リピートするまでの時間: 150 (ms)
- リピート速度: 30
```


## WSL2からVcXsrvに接続するための設定をする

### WSL2に `DISPLAY`環境変数を設定する
以下のように `~/.bashrc`に追記して、 `source ~/.bashrc`などで反映する。

```bash:~/.bashrc
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0
```

cf. https://github.com/microsoft/WSL/issues/4106#issuecomment-501885675


こんな記述をする理由は、WSL2のバグ (？)[^vcxsrv-env]や仕様 (？)[^wsl2-ip-addr]があるから。


[^vcxsrv-env]: VcXsrvに関する諸記事では `DISPLAY=:0.0`や `DISPLAY=:0`など **やたら省略できる**方法が紹介されているが、WSL2ではどうやら **通用しない**。
  cf. [WSL2の導入とGUI環境の構築とsshfsしたものもgnome-openしたい!!](https://qiita.com/momomo_rimoto/items/51d533ae9529872696ce#bashrc%E3%81%AE%E8%A8%AD%E5%AE%9A)
  `localhost`表記すら通じないらしく、 `DISPLAY=127.0.0.1:0.0`のようにIPアドレスを明示する必要がある。

[^wsl2-ip-addr]: WSL2のIPアドレスは起動の度に変わる :innocent: :innocent: :innocent: Windowsを起動する度にHyper-VスイッチのIPが変わるから、らしい。
  cf. https://github.com/microsoft/WSL/issues/4210#issuecomment-511105147
  cf. https://github.com/MicrosoftDocs/WSL/issues/418#issuecomment-511104330

デスクトップ環境が `xfce4`の場合は、DISPLAYに加えてこっちも必要かも。

```:~/.bashrc
export LIBGL_ALWAYS_INDIRECT=1
```

cf. [初心者のためのWSL( 2 ) ~GUI設定,デスクトップ環境設定編~](https://qiita.com/yoshige/items/7a17bb7a3582d72a7e48#5%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89)



### VcXsrvをグローバルアクセス可能にする
VcXsrvの `XLaunch`起動時に行うデフォルト設定で、手を加える。

まず `Extra settings`の `Disable access control`にチェックを入れる。
(全てのクライアントからアクセス可能にする)

cf. https://github.com/microsoft/WSL/issues/4106#issuecomment-502920377


同じく `Extra settings`の `Additional parameters for VcXsrv`欄に `-ac`を入力する。
(パブリックアクセス可能にする)

※ 僕はなくてもいけた

cf. https://github.com/microsoft/WSL/issues/4106#issuecomment-502989345

設定ファイル `config.xlaunch`を保存し、それをWindowsスタートアップに登録すれば、Windows起動時に同じ設定で `XLaunch`が立ち上がってくれる。

cf. [WSL2におけるVcXsrvの設定](https://qiita.com/ryoi084/items/0dff11134592d0bb895c#vcxsrv%E3%81%AE%E8%87%AA%E5%8B%95%E8%B5%B7%E5%8B%95%E8%A8%AD%E5%AE%9A)


### WindowsファイアウォールでVcXsrvのパブリックアクセスを許可する
cf. https://github.com/microsoft/WSL/issues/4106#issuecomment-502996546

VcXsrvインストール時に、ファイアウォールのパブリックアクセスを許可していれば設定不要。

もし許可していなければ、改めて設定から許可する。

`コントロールパネル > システムとセキュリティ > Windowsファイアウォールによるアプリケーションの許可`

描画されることの確認は、WSL2で `xeyes`などGUIのコマンドを打つ。


## Spacemacsをインストールする
ようこそ https://github.com/syl20bnr/spacemacs/tree/develop

```bash
git clone -b develop https://github.com/syl20bnr/spacemacs ~/.emacs.d
```

設定やトラブルシュートのあれこれはこっち cf. [Spacemacsメモとトラブルシューティング](https://qiita.com/v2okimochi/items/638c948e545118568ada)


## GNU Emacs26をインストールする
Homebrew for WSLでインストール可能な `emacs25`は相性が悪いようなので、GNU Emacsを使う。

(MacのHomebrewだと `emacs-plus`を使えるが、Ubuntuなのでまあ仕方ない)

27をインストールしてみる

```bash
$ sudo apt update
$ sudo apt install emacs27
```

apt-get使ってた頃はEmacsが候補に無かったのでリポジトリ追加とかしてた。
もしaptで同じ現象があれば以下で追加する

```bash
$ sudo add-apt-repository ppa:kelleyk/emacs
```

cf. [Emacsで快適な研究環境を整えよう~導入編](https://qiita.com/Maizu/items/44b0498597937480ca0a#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)


Emacs26から27にするぞ、をやる場合はパッケージ競合で昇天するので既存Emacsをアンインストールしてから新たなEmacsをインストールする必要がある。

うっかり既存Emacsを残すと依存関係エラーが出てinstallもuninstallもできなくなる

```bash
dpkg: アーカイブ /var/cache/apt/archives/emacs27-common_27.1~1.git86d8d76aa3-kk2+18.04_all.deb の処理中にエラーが発生しました (--unpack):
 '/usr/include/emacs-module.h' を上書きしようとしています。これはパッケージ emacs26-common 26.3~1.git96dd019-kk1+18.04 にも存在します
dpkg-deb: エラー: ペースト subprocess was killed by signal (Broken pipe)
処理中にエラーが発生しました:
 /var/cache/apt/archives/emacs27-common_27.1~1.git86d8d76aa3-kk2+18.04_all.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
```

やらかした場合は `dpkg`の `--force-overwrite`オプションでひとまず強制修復 (?)してから再インストールする手がありそう

```bash:こんな感じ
$ sudo dpkg -i --force-overwrite /var/cache/apt/archives/emacs27-common_27.1~1.git86d8d76aa3-kk2+18.04_all.deb
```

cf. [CUDAの依存関係でエラーが出た話](https://qiita.com/hibiki_810/items/b33eec36fef8191980fd)


## Spacemacsでまともな日本語入力をする
どうもデフォルト状態だと、日本語の変換機能が貧弱 ( `日本語`という変換すらできない :innocent: :innocent: :innocent: )

Google日本語入力で有名な `mozc`を導入する。

### 必要な機能のインストール
`emacs-mozc-bin`があれば良いらしい。
`emacs-mozc`をごっそり入れるとEmacsまでついてきてしまうらしいので、 `emacs-mozc-bin`を狙い撃つ。

```bash
sudo apt install emacs-mozc-bin
```

Spacemacsの設定でも `mozc`パッケージをインストールする。こんな感じで追加する。

```emacs-lisp:.spacemacs
   dotspacemacs-additional-packages '(mozc
                                      mozc-popup)
```

### IMEとキーバインドを設定
mozcをデフォルトの入力ソースに設定するついでに、キーバインドもつけておく。

```emacs-lisp:.spacemacs
(defun dotspacemacs/user-config ()

  ;;; 入力中のIME切り替え

  (setq default-input-method "japanese-mozc")
  (if (require 'mozc-popup nil t)
      ;; 'overlay: 入力直下にオーバーレイ表示, 'echo-area: Powerlineに表示, 'popup: 軽量なoverlay
      (setq mozc-candidate-style 'popup)
    (setq mozc-candidate-style 'echo-area))
  (defun start-mozc()
    "入力ソースがnilなら、日本語入力に切り替えるコマンド"
    (interactive)
    (if (equal current-input-method nil)
        (progn (toggle-input-method)
               (message "IMEを有効化しました"))))
  (defun end-mozc()
    "入力ソースがあれば、IME無しに切り替えるコマンド"
    (interactive)
    (if (not (equal current-input-method nil))
        (progn (toggle-input-method)
               (message "IMEを無効化しました"))))
  ;; insert stateでIME切り替え
  (define-key evil-insert-state-map (kbd "<henkan>") 'start-mozc)
  (define-key evil-insert-state-map (kbd "<muhenkan>") 'end-mozc)
  ;; command line (ex-completion)入力時にIME切り替え
  (define-key evil-ex-completion-map (kbd "<henkan>") 'start-mozc)
  (define-key evil-ex-completion-map (kbd "<muhenkan>") 'end-mozc)
  ;; `/`検索 (ex-search)入力時にIME切り替え
  (define-key evil-ex-search-keymap (kbd "<henkan>") 'start-mozc)
  (define-key evil-ex-search-keymap (kbd "<muhenkan>") 'end-mozc)
  ;; insert stateになったらIME無効化
  (add-hook 'evil-insert-state-entry-hook 'end-mozc)

  ;;; Helm

  (with-eval-after-load 'helm
    (bind-keys :map helm-map
               ;; IME切り替え
               ("<henkan>" . start-mozc)
               ("<muhenkan>" . end-mozc)))

)
```

cf. [spacemacsでmozcを用いた日本語入力](https://nasum.dev/2020/02/08/spacemacs-input-japanies/)
cf. [この春オススメしたい第三のエディタ](https://moneyforward.com/engineers_blog/2016/04/07/the-third-editor/)

壮大な設定を書かざるを得なかった :innocent: :innocent: :innocent: :innocent: :innocent: 

`current-input-method`を使った判定が ~~うまくいかなかった~~ うまくいったので、それを利用している。

普段は `変換`キーと `無変換`キーでIMEを切り替えているため、キーバインドも合わせねばならない。

しかもnormal stateにキーバインドを設定するとさらなる不具合に見舞われる[^normal stateの悲劇]ため、insert stateとcommand-line state (なぜかex-completionが該当するらしい)とhelm find mode (ファイル検索するときのアレ)を狙い撃つように設定した。


[^normal stateの悲劇]: 理由はわからないが、insert stateとnormal stateで **IME設定が分離している**かのような挙動をする。
  たとえばnormal stateでIMEを無効化したつもりが、insert stateに入ってみると変化していない。
  仕方ないので、 `(add-hook)`を使って `insert stateに入った時`にIMEを無効化することにしている (日本語入力は必要な時しか使わないので、普段はできるだけ無効化しておきたい)

また、日本語変換のポップアップ表示のためmozc-popupを使っている[^mozcのoverlayとmozc-popupの違い]。

cf. [Spacemacs Emacs 25.2(日本語入力) on Ubuntu 16.04 on VMware 8.5 on macOS Sierra](https://qiita.com/ShingoFukuyama/items/c7ee2bd3b0985b3f99c0)

[^mozcのoverlayとmozc-popupの違い]: mozcをただ使うだけなら `'mozc-overlay`でポップアップ表示される。
  しかし重くてラグがひどかったので、 `mozc-popup`をインストールして `'popup`のほうを使っている (動作が軽い)

### Ubuntu側のキー設定を無効化
Ubuntu側にもmozcのキー設定があって、デフォルト設定だと ~~変換キーと無変換キーが衝突するかもしれない~~。
見たところSpacemacs内ではキーバインドが独立しているような気がするので、大丈夫かも。


一応、無効化するためには、デスクトップ環境からmozcのキー設定を削る。

xfce4なら、ターミナル上で以下のコマンドを使えばデスクトップ環境が立ち上がる。

```bash
$ startxfce4
```

![mozc設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201962/80ee4344-b393-cbef-33c8-773f8cde37dd.png)

![キー設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201962/de6a8176-5f42-d679-752a-87d65796b005.png)

![henkan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201962/67722938-48ad-1d9c-f1f2-488eddd15186.png)

`Henkan`, `Muhenkan`がそれぞれ3パターンほど存在する。
選択して `編集`ボタンから削除する。


### 完了
良い感じに変換してくれるようになった :tada: 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201962/f2d68ca7-a8cb-88b2-3047-b37c3acdb6d8.png)

**変換候補ウィンドウの背景色が目に悪い**のが気になるが……


## プログラミングと相性の良いフォント `Source Han Code JP`を使う
プログラミングに役立つフォントは、チラっと見ただけでも結構ある。
たとえば日本語対応フォント。

> Source Han Code JP
Cica
Myrica
Ricty Diminished
VLゴシック
Migu 1M

cf. [【2019年版】プログラミングが捗るコーディングに適したフォント集](http://note.kurodigi.com/2019-programing-font/)

Spacemacsが激推しなのは[Source Code Pro](https://github.com/adobe-fonts/source-code-pro)。
Ubuntuにもインストールできる。

一時期は `会社`など旧字体のような表示があり[^漢字が旧字体になってしまう現象]、だいぶしんどかったのでフォントを `Source Han Code JP`に変えた。
(Cicaはうまくインストールできなかったので断念した)

[^漢字が旧字体になってしまう現象]: 原因は別のところにあったようで、今ではSource Code Proに戻しても不具合はない。これもunicode-fonts Layerが悪さをしたのかもしれない。まあ明示的に日本語対応しているSource Han Code JPを引き続き使っている


基本的にはこちらの通りにインストール。だいぶアレンジしてしまったので、その手順も残しておく。

cf. [Source Han Code JPをUbuntuにインストールしてデフォルトフォントに設定する](https://qiita.com/TomKid/items/2c914b691ab648627d40)

AFDKOとSource Han Code JPをcloneするのは同じ。今回は面倒なので、個別に仮想環境を作らず、pyenvで既に持っていたPython3.8に関連ライブラリを直接インストールしてしまった。記憶は曖昧

```bash
sudo apt install gcc-multilib g++-multilib
pip install fonttools

mkdir ~/fonts-download
cd ~/fonts-download
git clone https://github.com/adobe-type-tools/afdko/
git clone https://github.com/adobe-fonts/source-han-code-jp
cd afdko
python setup.py
```

addSVGtableに関する部分はやはりエラーが出るため、参考の通りにコメントアウトした。
このあたり。38-54行だった。

```bash:source-han-code-jp/commands.sh
 	if addSVGtable.py -s $svg ${nf} ; then :
 	else
 		echo Error
 		exit
 	fi
 		
 	if addSVGtable.py -s $svg ${inf} ; then :
 	else
 		echo Error
 		exit
 	fi
		
	if otf2otc -t 'CFF '=0 -o ${ttc} ${nf} ${inf} ; then :
	else
		echo Error
		exit
	fi
```

最後にOTFファイルを作成する。

```bash
cd ~/fonts-download
./commands.sh
```

だんだん考えるのがつらくなってきたので、フォントのインストールは `~/.fonts`を使った。

OTFファイルを置いておけば、コマンド1発でインストールできる。
※ `~/.fonts`内にフォント以外の変なファイルを置いたりすると表示がバグるので注意 (フォント関連のclone先を分けたのはそういう意図もある)

```bash
mkdir ~/.fonts
cp ~/fonts-donwload/source-han-code-jp/Medium/SourceHanCodeJP-Medium.otf ~/.fonts/
fc-cache -fv
```

cf. [フォントのインストール](http://omoiyari.nishinari.coop/ubuntu-tips/%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)

最後にSpacemacs側でフォント設定を変える。Spacemacsを再起動すればフォントが変わっているはず。

```.spacemacs
   dotspacemacs-default-font '("Source Han Code JP"
                               :size 16
                               :weight normal
                               :width normal
                               :powerline-scale 1.1)
```

ﾖｼ!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201962/869d5530-8a58-cdfc-6960-503490f0ca5c.png)




## Spacemacsで `日本語の漢字`の表示が `繁体字 (中国語)`になってしまう問題は
`unicode-fonts`Layerを使うと発生する (ので、さしあたりこのLayerを使えない)

cf. https://qiita.com/artoshimitsu/items/1ca1debba943f3ab7d39

Ubuntu側は言語もタイムゾーンも全て日本語化を終えてSpacemacsでもひらがなやカタカナは入力・表示できていたので、漢字だけ中国語になるのはわけがわからなかった :innocent: 
(多くの漢字に違和感を覚えたので、自分が意外と漢字の形状を認識して読んでいたことを気付かされた)





## よく使う単語を (デスクトップ環境を立ち上げずに)辞書登録する
いちいちデスクトップ環境を起動すればできるけど、ターミナルから突然辞書設定だけを開いて簡単に編集したい。

↑で入れたmozcならこうする

```
$ /usr/lib/mozc/mozc_tool --mode=dictionary_tool
```

突然設定画面だけ出てくるので、好きに編集する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201962/c62532f5-5be0-d0a4-412d-fcb859fc3df5.png)

cf. https://wiki.debian.org/JapaneseEnvironment/Mozc