Windows10 HomeでLinuxに寄せた開発環境を整える

LinuxというかUnixというかMac

※ WSL2が実用的なので、基本的に全てWSL2に委ねることを推奨できる => [Windows10 WSL2にLinux居城を爆誕させる](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1)
  本稿はPowerShellとかで頑張りたい人向けになってしまった。。。 :innocent: 

# 対象者
- 世の中はMac or Linuxだけど `Windows10 Home`で開発したい
- Unixコマンドがあっても `Windows10 Home`で開発したい
- Dockerが必要だけど `Windows10 Home`で何とかしたい
- [Spacemacs](https://github.com/syl20bnr/spacemacs)を使いたいけど `Windows10 Home`で何とかしたい
    - [ **Clojure** ](https://clojure.org/)が必要だけど `Windows10 Home`で何とかしたい
    - Scalaを使うこともあるけど `Windows10 Home`で何とかしたい
- Node.jsを使うことになったけど `Windows10 Home`で何とかしたい
- [Terraform](https://www.terraform.io/)とかインフラ周りも使いたいけど `Windows10 Home`で何とかしたい





# 目次
- [PowerShell (やWSLなど)を1つのウィンドウ内に複数タブで使う](https://qiita.com/v2okimochi/items/c9da7df8d4f03283121b#powershell-%E3%82%84wsl%E3%81%AA%E3%81%A9%E3%82%921%E3%81%A4%E3%81%AE%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E5%86%85%E3%81%AB%E8%A4%87%E6%95%B0%E3%82%BF%E3%83%96%E3%81%A7%E4%BD%BF%E3%81%86)
- [Zipコマンドを使う](https://qiita.com/v2okimochi/items/c9da7df8d4f03283121b#zip%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E4%BD%BF%E3%81%86)
- [Gitを使う](https://qiita.com/v2okimochi/items/c9da7df8d4f03283121b#git%E3%82%92%E4%BD%BF%E3%81%86)
- [まずWindows上のgitで改行コードが自動変換される罠を外す](https://qiita.com/v2okimochi/items/c9da7df8d4f03283121b#%E3%81%BE%E3%81%9Awindows%E4%B8%8A%E3%81%AEgit%E3%81%A7%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8C%E8%87%AA%E5%8B%95%E5%A4%89%E6%8F%9B%E3%81%95%E3%82%8C%E3%82%8B%E7%BD%A0%E3%82%92%E5%A4%96%E3%81%99)
- [Dockerを使う](https://qiita.com/v2okimochi/items/c9da7df8d4f03283121b#docker%E3%82%92%E4%BD%BF%E3%81%86)
  - [Docker Toolbox](https://qiita.com/v2okimochi/items/c9da7df8d4f03283121b#docker-toolbox)
  - [WSL2 + Ubuntu18.04LTS](https://qiita.com/v2okimochi/items/c9da7df8d4f03283121b#wsl2--ubuntu1804lts)
- [WSL2でもMacのHomebrewのようなパッケージ管理をする](https://qiita.com/v2okimochi/items/c9da7df8d4f03283121b#wsl2%E3%81%A7%E3%82%82mac%E3%81%AEhomebrew%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E7%AE%A1%E7%90%86%E3%82%92%E3%81%99%E3%82%8B)
- [Leiningenを入れてPowerShellからClojureを動かせるようにする](https://qiita.com/v2okimochi/items/c9da7df8d4f03283121b#leiningen%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6powershell%E3%81%8B%E3%82%89clojure%E3%82%92%E5%8B%95%E3%81%8B%E3%81%9B%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)
- [Spacemacsを入れて`cider-jack-in`から`lein repl`を使えるようにする](https://qiita.com/v2okimochi/items/c9da7df8d4f03283121b#spacemacs%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6cider-jack-in%E3%81%8B%E3%82%89lein-repl%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)
  - 環境変数を読み込めるようにする
  - cider-jack-inでreplを起動する
  - JVM文字化け問題を何とかする
  - TypeScript Layerで自動整形をかける
  - Scala Layerで定義ジャンプや補完機能を使う
  - その他いろいろ
- [PowerShellでSBTの文字コード問題を解決する](https://qiita.com/v2okimochi/items/c9da7df8d4f03283121b#powershell%E3%81%A7sbt%E3%81%AE%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89%E5%95%8F%E9%A1%8C%E3%82%92%E8%A7%A3%E6%B1%BA%E3%81%99%E3%82%8B)
- [nvm経由でnpmを入れて複数のnodeを切り替えられるようにする](https://qiita.com/v2okimochi/items/c9da7df8d4f03283121b#nvm%E7%B5%8C%E7%94%B1%E3%81%A7npm%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6%E8%A4%87%E6%95%B0%E3%81%AEnode%E3%82%92%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%89%E3%82%8C%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)
- [tfenv経由でterraformを入れて無双する](https://qiita.com/v2okimochi/items/c9da7df8d4f03283121b#tfenv%E7%B5%8C%E7%94%B1%E3%81%A7terraform%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6%E7%84%A1%E5%8F%8C%E3%81%99%E3%82%8B)





# PowerShell (やWSLなど)を1つのウィンドウ内に複数タブで使う
[Windows Terminal](https://www.microsoft.com/ja-jp/p/windows-terminal-preview/9n0dx20hk701?activetab=pivot:overviewtab) (Preview)を使う。

cf. [Windows Terminalで色やフォントや画面サイズを設定する](https://qiita.com/v2okimochi/items/299c5cf60614a7ba582d)




# Zipコマンドを使う
参考 => https://note.mokuzine.net/win-cmd-zip/

Windows10、GUIでは普通にZipできるしPowerShellには専用の [Compress-Archiveコマンド](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.archive/compress-archive?view=powershell-7)が用意されているが、LinuxやMacでおなじみのZipコマンドはない :innocent: 





# Gitを使う
これ https://gitforwindows.org/

Git GUIは使ったことないけど、便利かもしれない。
Git Bashは必須の予感 (ssh-keygenで大活躍しそう (ついでに[tfenvとterraform](https://qiita.com/v2okimochi/items/c9da7df8d4f03283121b#tfenv%E7%B5%8C%E7%94%B1%E3%81%A7terraform%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6%E7%84%A1%E5%8F%8C%E3%81%99%E3%82%8B)で大活躍した))




# まずWindows上のgitで改行コードが自動変換される罠を外す
参考 => [@uggds - 気をつけて！Git for Windowsにおける改行コード](https://qiita.com/uggds/items/00a1974ec4f115616580)

初期設定のままだとpullしてきた時に改行コードが自動変換されるため、`*.sh`を動かした時`'\r': command not found`のように怒られることがある。

本稿にも書くが原因は`~/.gitconfig`にあるコレ。

```
[core]
    autocrlf = true
```

falseにしよう。罠を外したら思う存分pullしよう。

気づかず `やってしまった`らこちらで対処していく => https://qiita.com/t-kuni/items/1c5c7512ee0827f200de





# Dockerを使う
## Windowsで使えるDockerは大きく3種類
- Docker Desktop for Windows
- Docker Toolbox
- WSL (Windows Subsystem for Linux) 2

まず、Docker Desktop for Windowsは仮想化技術としてhyper-vを使うので、Windows10 ProやEducationなどでしか使えない（Homeにはhyper-vが無い）。つらい。。。つらい。。。

Windows10 Homeで使える手段としては以下。

- Docker Toolbox
  - 仮想化技術としてHyper-vではなくVirtualBoxを使っている
- WSL2 + Ubuntu18.04LTS
  - ubuntuにdockerをインストール可能
- [Docker Desktop WSL2 Tech Preview](https://docs.docker.com/docker-for-windows/wsl-tech-preview/) (※ v2.2.2.0以降かな？)
  -  `HomeでもDocker Desktopをインストールできる`と話題になった
  - が、[version 2.1.0.0をHomeにインストールできないissueが報告されておりダメだったことがある](https://github.com/docker/for-win/issues/4378)。  
  どうやらTech Previewは `Hyper-vの一部機能のみを使う設計で、その一部機能はHomeでも使える`というカラクリらしい（[詳細はここか？](https://engineering.docker.com/2019/06/docker-hearts-wsl-2/)）  
  しかし当時のTech Previewには `古いDocker Desktop for Windowsの設計（Hyper-vの全機能を要求する部分）が紛れ込んでいる`とかで、結局Pro以上のEditionを求められインストール不可になっているとか。上記issueでは `全機能使うほうと一部機能使うほうを分離する`ことが提案されている。  
  [似たような問題にぶつかっているっぽい例も見られる](https://qiita.com/iridon0920/items/005a9224343413b74f78#%E5%AE%8C%E5%85%A8%E3%81%AB%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AB%E5%BC%95%E3%81%8D%E7%AF%AD%E3%82%82%E3%82%8B%E6%96%B9%E6%B3%95)。  
  やがて[v2.2.2.0](https://docs.docker.com/docker-for-windows/edge-release-notes/#docker-desktop-community-2220#docker-desktop-community-2220)がリリースされ、Homeで動くとの情報があった :tada:  公式曰く、`Windows 10 Home users can now use Docker Desktop through the experimental WSL 2 support. This requires Windows Insider Preview Build 19018 or later.`

以上3つのいずれかを使うことになりそう。
最近Docker Desktop WSL2 Tech Previewの成長がめざましいので、十分に実用できるかも。PowerShellではつらかった各種問題もWSL2では難なくクリアしてそう


## Docker Toolbox
### インストール
docker-composeを使うため、Docker Toolboxをインストールする。
https://docs.docker.com/toolbox/toolbox_install_windows/#step-2-install-docker-toolbox

Docker Toolboxインストールの参考：
- [D-jiro.Y - WindowsでDocker Toolbox＆docker-composeを動かす](https://nonsensej.xyz/articles/wp/1500)
- [ラボラジアン - Windows 10 Home のための、Docker Toolbox をインストールして WSL から使う方法](https://laboradian.com/use-docker-toolbox-with-wsl/)

手順通りにインストールすれば動く。
※VirtualBoxが既に入っている場合は、アンインストールしてDocker Toolboxでインストールすることを推奨。バージョンの壁なのかパスの壁なのか、動かないので…


### ポートフォワーディングで繋げる
上記（インストール）の参考リンクにも書いてある。
例えばdockerのコンテナで`0.0.0.0:8080->80/tcp`のようなポート設定をしている場合、VirtualBoxのポートフォワーディングでは以下のように設定する。

| 名前     | プロトコル | ホストIP   | ホストポート | ゲストIP | ゲストポート | 
| -------- | --------- | :-------: | ----------- | :------: | ----------- |
| okimochi | TCP       | 127.0.0.1 | 8080        |          | 8080        |


### おまけ：WSL1を入れてUbuntuのTerminalからdockerを動かせるようにする
`Ubuntu16.04LTS`ではなく `Ubuntu`を入れていたので、Ubuntuのバージョンは18.04だったかもしれない。。。

まずWSLインストール
参考 => [Windows Subsystem for Linuxをインストールしてみよう！](https://qiita.com/Aruneko/items/c79810b0b015bebf30bb)

- WSL上でCドライブは`/mnt/c/`にある。マウントしているとかなんとか。
- PowerShellとWSLとではホームディレクトリが別々…すなわち`.gitconfig`も別々なので注意（WSLで`core.autocrlf=true`のままだとどうなっちゃうんだろう）

いよいよWSL1でDockerを使えるようにする
「[ラボラジアン - Windows 10 Home のための、Docker Toolbox をインストールして WSL から使う方法](https://laboradian.com/use-docker-toolbox-with-wsl/#3_WSL_docker_daemon)」を参考にして、WSL上の`~\.bashrc`に以下を追記する。

```shell:.bashrc
export DOCKER_HOST=tcp://192.168.99.100:2376
export DOCKER_CERT_PATH=/mnt/c/Users/okimochi/.docker/machine/certs # ユーザ名がokimochiの場合
export DOCKER_TLS_VERIFY=1
export COMPOSE_TLS_VERSION=TLSv1_2
```

最後の`COMPOSE_TLS_VERSION=TLSv1_2`は、`SSL error: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version`を回避するために指定する。参考 => https://github.com/docker/compose/issues/6473

同じ目に遭っている人がいた。
- [@kodetto - DockerでのTLSV1エラー](https://qiita.com/kodetto/items/c5f6a58563909dd3e36e)
- [@atsu_kg - docker-compose up -d 実行したらSSL errorで起動しなかったのでTLS_VERSIONを指定した](https://qiita.com/atsu_kg/items/0f2b84ddc54d334eb53a)


## WSL2 + Ubuntu18.04LTS
### Windows Insider Previewアップデートをインストール
WSL2を使うにはInsider Previewにだけ存在するビルドが必要。[公式が発表している前提条件](https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-install)はコレ。

> WSL 2 は、Windows 10 ビルド18917以降でのみ使用できます。  
- WSL がインストールされていることを確認します (この手順についてはこちらを参照してください)。また、Windows 10ビルド 18917以降を実行していることを確認してください。
- ビルド18917以降を使用していることを確認するには、Windows Insider プログラムに参加して、"高速" リングを選択してください。
- Windows のバージョンを確認するには、コマンドプロンプトを開きver 、コマンドを実行します。
- "仮想マシン プラットフォーム" のオプション コンポーネントを有効にする
- コマンド ラインを使用して、WSL 2 によってサポートされるようにディストリビューションを設定する
- 現在のディストリビューションが使用している WSL のバージョンを確認する

要するにWindowsの更新設定から `Insider Program`に参加して `Fast`状態でアップデートすれば18917以降のビルドが手に入る。
Insider Previewはちょっとリスクもある気がする。

僕がアップデートした時点では `Build 18995`だった。


### WLS1とUbuntu18.04LTSをインストール
[上記のおまけ](https://qiita.com/v2okimochi/items/c9da7df8d4f03283121b#%E3%81%8A%E3%81%BE%E3%81%91wsl1%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6ubuntu%E3%81%AEterminal%E3%81%8B%E3%82%89docker%E3%82%92%E5%8B%95%E3%81%8B%E3%81%9B%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)と同じ方法で `WSL1`と `Ubuntu18.04LTS`をインストールする。
Insiderじゃなくてもできるので、こっちを先にやっても良い。

※Microsoftストアにある `Ubuntu` `Ubuntu18.04LTS` `Ubuntu16.04LTS`の違いは[単にバージョンらしい](https://forest.watch.impress.co.jp/docs/serial/yajiuma/1134055.html)。
`Ubuntu`は最新バージョンに都度更新されていくとのこと。 
`勝手にやらないで`のおきもちを込めて18.04LTSを使う。


### WSL2へアップグレード
[公式に従う](https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-install)。

もしアップグレード中にエラーが出たら↓

#### カーネル更新
> WSL 2 を実行するには、カーネル コンポーネントの更新が必要です

`Linux カーネル更新プログラム パッケージ`を公式サイトからダウンロード・インストールすれば解決。
cf. https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel

```powershell
PS C:\WINDOWS\system32> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-18.04    Stopped         1

PS C:\WINDOWS\system32> wsl --set-version Ubuntu-18.04 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
変換が完了しました。

PS C:\WINDOWS\system32> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-18.04    Stopped         2
```

#### ファイルの圧縮/暗号化
> システムの制限により、要求された操作を完了できませんでした。仮想ハードディスク ファイルの圧縮と暗号化が解除されている必要があります。また、仮想ハードディスク ファイルをスパースに設定することはできません。

これはWSL2のUbuntuディレクトリが圧縮されていると起こる。
[この解決策](https://teratail.com/questions/200953)に従い、Ubuntuディレクトリの圧縮を解除すれば良い（ディレクトリ以下すべて圧縮解除する）。

たとえばユーザ名 `v2okimochi`の場合、 `C:¥Users¥v2okimochi¥AppData¥Local¥Packages¥CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc`みたいなディレクトリがあるはず。

なお解除中に以下のようなエラーが出たら **全て無視**すればなんかいける。

> 属性の適用エラー
ファイルの属性の適用中にエラーが発生しました：
C:¥Users¥v2okimochi¥AppData¥Packages¥fsserver
ファイルにアクセスできません。



### WSLと仮想化機能の有効化
Windowsホームボタンから `Windowsの機能の有効化または無効化`を開き、以下3つにチェックが入っていることを確認する。
ホームボタンの検索で日本語を入力できない場合は、 `feature`を入力すれば出ると思う。英語でもいいんだ（未知との遭遇）

- [x]  Windows Subsystem for Linux
- [x]  Windowsハイパーバイザー プラットフォーム
- [x]  仮想マシン プラットフォーム

![features.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201962/75127e0a-f332-d462-b3f8-02b26619b784.png)

WSLのインストールで度々出てくる `機能の有効化`は恐らくこれ。


### WSL2 (Ubuntu18.04LTS)にDockerを入れる
#### Docker Desktop for Windows v2.2.2.0以降
Docker Desktop for Windowsをインストールする。

Dockerの設定から、WSL2との連携にチェックを入れる。

`Enable integration with my default WSL distro`にチェックを入れてしまっても良いし、 `Enable integration with additional distros`からディストリビューションにチェックを入れても良い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201962/845b7762-54c6-549b-1fd4-28bc9ef86577.png)

完

#### Docker Desktop for Windows v2.2.2.0より前
Docker Desktop for Windowsをインストールできない :innocent: :innocent: :innocent: 
Ubuntuに直接dockerを入れる。

Ubuntuなので ~~`apt-get`~~ `apt update`, `apt install`が使える。
※ `apt`は [`apt-get`の欠陥を克服しているらしい](https://www.debian.org/doc/manuals/debian-handbook/sect.apt-get.ja.html)（ので `apt-get`より `apt`推奨）

公式に従いdockerインストール
https://docs.docker.com/install/linux/docker-ce/ubuntu/

docker-composeインストール
https://docs.docker.com/compose/install/


### Dockerを動かす
※ **Docker Desktop for Windowsを使えていれば不要。**

PC起動する度に必要っぽい。

```shell
$ sudo /etc/init.d/docker start
```

ちな `/etc/init.d/docker status`で起動状態がわかる。


※止まっているのを忘れてDockerを動かそうとすると、以下のようなエラーが出る。

```
ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?

If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.
```

Dockerデーモンが動いてない的に怒られている。 `docker info`見るとこう。何このエラーみたいになった時これを思い出せたらいいな。。。

```
docker info
Client:
 Debug Mode: false

Server:
ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
errors pretty printing info
```


### Dockerコンテナへの接続
※ **Docker Desktop for Windowsを使えていれば不要。**

実は `Docker Toolbox`のようにlocalhostでバシバシ接続できない。
たとえば `mariadb`コンテナを立ててそのDBに接続しようとするとlocalhostじゃダメ。 `なんとWSL側もlocalhostでは繋がらない`（WindowsもWSLも同じ存在という扱いだし当然か？）

Dockerコンテナには **`WSL側のeth0 IPアドレスを使って繋ぐ`**。  `ifconfig`とか `ifconfig eth0`とかやれば出る。 `172.27.145.150`みたいなアドレスだった。

このアドレス、厄介なことに ~~**`PCを起動する度に変わる`**~~ [**WSL2を起動する度に変わる**](https://qiita.com/SoraKumo/items/8838d27814a87fb7cc77)。
つまりAPIサーバなどからDBへ接続する際のホスト名 (IPアドレス)を毎回変えてやらねばならない。
そして `static IPを無理やり付与した程度では直らないらしい`。つらい。。。

Github上でも [WSL2に静的IPアドレスを付けたいんだけど](https://github.com/microsoft/WSL/issues/4210) とか [ポートフォワーディングで回避しようぜ](https://github.com/microsoft/WSL/issues/4150#issuecomment-504209723) とか色々言われている。 **やり方を @v2okimochi に解説してくれ！！！**


### Webに `localhost`で接続
アドレスを固定化できないか探していたが、別件でこういう方法もあるらしい。
https://yukituna.com/2284/
https://devblogs.microsoft.com/commandline/whats-new-for-wsl-in-insiders-preview-build-18945/

Webはlocalhostでアクセスできた（設定のおかげかは不明）。





# WSL2でもMacのHomebrewのようなパッケージ管理をする
MacではHomebrewを使うことで、特に何も考えなくてもスッとパッケージをインストールできる。

WSL2内のUbuntu (Linux)では、自力で頑張る必要があった。

現在、そんなWSL2内のUbuntuでもHomebrewが使えることを教わった。

cf. https://docs.brew.sh/Homebrew-on-Linux

既に色々な紹介記事もある。
[Linuxbrew のススメ](https://qiita.com/thermes/items/926b478ff6e3758ecfea)
[【WSL】LinuxにHomebrewを導入する](https://qiita.com/cogome/items/96056450b51fb5b9b782)

これで、ドキュメントに `brew installしろ`としか書かれていないようなツールも気軽にインストールできる :tada: 

sbtやtfenvもスッと入る。





# Leiningenを入れてPowerShellからClojureを動かせるようにする
## Leiningenをインストール
参考 => [yohshiy - Clojure, Leiningen の Windows へのインストールと使い方](http://yohshiy.blog.fc2.com/blog-entry-249.html)

本稿でも補足をする。

- まずJDKを`Program Files`以外のディレクトリにインストールする
    - oracleがログイン必須みたいな状態なので、JDKは[adoptopenjdk](https://adoptopenjdk.net/)などがおすすめ
    - スペースが含まれるディレクトリにインストールすると、Emacsからのrepl呼び出しが失敗するらしい
- `lein.bat`推奨の予感
    - v2okimochiは参考リンクの`leiningen-win-installer`を使えなかった（JDKが認識されずインスコ止まる）
    - 予めWindowsの環境変数として`JAVA_HOME`=`C:\<jdkへのパス>\bin`を追加しておく
    - WindowsはWin32内のJavaなどを見に行く習性があるらしいので、環境変数の順番はWin32より上に置く
- `jenv`は使えない…のでJDKへの環境変数pathを変えて疑似jenvっぽく頑張る




# Spacemacsを入れて`cider-jack-in`から`lein repl`を使えるようにする
## Spacemacsインストール
公式にインストール方法がある => https://github.com/syl20bnr/spacemacs

Windows版は勝手が違うので補足する => [v2okimochi - spacemacs.md: Windowsでのインストール](https://github.com/v2okimochi/RAM1bit/blob/master/editor/spacemacs.md#windows%E3%81%A7%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

補足内容は以下のような感じ。
- 公式のインスコ方法だと日本語インライン変換（入力中の文字を表示してくれる機能）が詰むよね
- 環境変数を通す必要があるよね
- 初回起動は`--insecure`オプションが必要だよね

あとはSpacemacsのいい感じの設定方法については「[@lagenorhynque - Clojure/ClojureScript関連リンク集: Clojure開発全般](https://qiita.com/lagenorhynque/items/68c314c288b75a9492ba#clojure%E9%96%8B%E7%99%BA%E5%85%A8%E8%88%AC)」に全部載ってる。Clojure関連も全部載ってる。


## 環境変数を読み込めるようにする
SpacemacsがPCの環境変数を読む仕組みが微妙にアレ（悪いとは思わないけど、知ってないと罠なのでひどい。。。）
こういうやつなんだと知っていればおｋ。
https://qiita.com/v2okimochi/items/82c541ba67c81493976c


## cider-jack-inでreplを起動する
「[ayato-p - SpacemacsでClojureを書くために僕が行った設定](https://scrapbox.io/ayato-p/Spacemacs%E3%81%A7Clojure%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AB%E5%83%95%E3%81%8C%E8%A1%8C%E3%81%A3%E3%81%9F%E8%A8%AD%E5%AE%9A)」を参考にして、`.spacemacs`（コマンド操作`Space f e d`で開ける）にCider関連の設定を加える。

あとはClojureファイル（`*.clj`）を開いた状態で`Space , '`すればnrepl serverが動き出し、少し待てばcider replが起動する。


## JVM文字化け問題を何とかする
ClojureはJVMを使っているので、JVMの有名な日本語文字化け問題を引き起こす。
Leiningenではこうやって対処できる。
https://qiita.com/v2okimochi/items/40d0ebd2186657a44969


## TypeScript Layerで自動整形をかける
spacemacsはTypeScript Layerで `typescript-fmt-on-save t`を設定すれば自動整形できる。
が、Windowsにおいては一筋縄ではいかないかもしれない。

もし `"No such file or directory diff"`的なエラーが出たらコレで解決できるかもしれない。
https://qiita.com/v2okimochi/items/f3f4361d7842271454c6


## Scala Layerで定義ジャンプや補完機能を使う
Scalaには定義ジャンプや補完機能をもつバックエンド (Language Server?)としてEnsimeやMetalsが挙げられる。

[Ensimeを利用する方法](https://qiita.com/v2okimochi/items/bd5e8726599a45c70bcd)も[Metalsを利用する方法](https://qiita.com/v2okimochi/items/6a3c8f6285bb6419b952)もあるが、Spacemacs上ではEnsimeの定義ジャンプ機能が怪しいのでMetalsに軍配が上がりそう。


## 他にも色々あるが、
Windows10でspacemacs関連はもう面倒なので[spacemacsメモとトラブルシューティング](https://qiita.com/v2okimochi/items/638c948e545118568ada)にまとめた。





# PowerShellでSBTの文字コード問題を解決する
PowerShellを使っていると、SBTの起動や実行まわりでやはり文字コードの問題が起こる（単純なScalaコード上においても）。

[文字化けやjava.nio.charset.MalformedInputExceptionエラーを倒した例はこちら](https://qiita.com/v2okimochi/items/d966476b564ff05e8bd0)






# nvm経由でnpmを入れて複数のnodeを切り替えられるようにする
参考 => [@rapando - nvm-windows 導入](https://qiita.com/rapando/items/6e9d891789b9a652c318)
以上。シンプル。はや～い

**補足**
`Program Files`など **スペースが入ったディレクトリ内にインストールしてはいけない**
参考 https://github.com/coreybutler/nvm-windows/wiki/Common-Issues

また、バージョンは1.1.7でないとダメっぽい。 `Could not download npm for node`エラーが出てnpmを使えない。

この議論で示されているように `v1.1.7 Maintenance Release`で修正されている。
https://github.com/coreybutler/nvm-windows/issues/373

ここでも同じことが言われている。 https://one-it-thing.com/2294/


~~WSLを使うならUbuntuに入れれば良かったり~~






# tfenv経由でterraformを入れて無双する
AWSやGCPなどに用意されたCLIサービスをいい感じに使うためのterraformを、tfenvでバージョン管理する。

WSL2にHomebrew (for WSL)を入れて `brew tfenv`すれば勝ち。完

以下はWSLを使わず頑張る場合↓

## tfenvのインストール
公式はこちら https://github.com/tfutils/tfenv

そしてやはりMac基準… :innocent: (インストール手順にはbrewが描かれている)

曰く、

> Support
Currently tfenv supports the following OSes
- Mac OS X (64bit)
- Linux
　- 64bit
　- Arm
- Windows (64bit) - only tested in git-bash - currently presumed failing due to symlink issues in git-bash

Windows 64bit版は **Git Bash**でしかテストされていない
(テストしてないだけで動くんでしょと思ったらコマンド認識すらされなかった :innocent: :innocent: :innocent: )

しかも状況によっては失敗することが想定されているらしい………………

---

ひとまず、Windowsの場合は手動インストールとなる => 参照 https://github.com/tfutils/tfenv#manual

インストールだけならPowerShellでもいけた。

公式はMacやLinuxを想定してこう書いているが、

```shell
git clone https://github.com/tfutils/tfenv.git ~/.tfenv
```

PowerShellでcloneする場合は、 `~`が認識されず `~`ディレクトリを作成されて放り込まれる ( :innocent: )ので、ホームディレクトリで直接 `.tfenv`ディレクトリを作ってもらうのが良さそう。

```shell
git clone https://github.com/tfutils/tfenv.git .tfenv
```


## 環境変数を通す
binディレクトリまでの絶対パス (たとえば `C:\Users\v2okimochi\.tfenv\bin`)をWindows10の環境変数 `Path`に追加する。


## terraformのインストールと実行
環境変数を追加した以降にGit Bashを立ち上げると、Tabキーで `tfenv`コマンドが補完できるはず。
※ PowerShellだとコマンド認識されない :innocent: 

`.terraform-version`ファイルでバージョン指定しておき、そのディレクトリで `tfenv install`コマンドを実行すれば、指定したバージョンのterraformをインストールしてくれる。

そして `terraform`コマンドも動作するはず :tada: 

ちなみに Git Bashでは動いたのにWSLでは動かなかった。。。どうして。。。。。無双できない