asciidoctorの編集環境をWSL上に構築する


## はじめに
今回はLinuxのVMで複数の AsciiDocファイルのhtml変換をする環境があった。
それを WSL に移行することが趣旨である。
VM と WSL に変えることで、必要なディスク容量が大きく削減できる。

WSL以外の導入方法もあって「参考: その他のアプローチ」にざっとまとめた。
Windows上のエディタとの連携が難しいので、万人にお勧めな方式ではないので注意してほしい。(WindowsとLinuxとでパスの対応付けが違うので、色々悩ましいことになる。)

* 環境: Windows 10 Pro 1909
  * Ubuntu 18.04
     * ruby 2.5
         * Asciidoctor 2.0.10

インストール自体は3行ぐらいなのだけど、WSLの導入部分をちゃんと書いたら膨大になってしまった。

## WSL に Ubuntu 18をインストールする

企業内の環境など管理者でStoreが禁止している場合もあるので、今回はMicrosoft Storeを使わない手順で導入した。

### Windows Subsystem for Linux を有効にする

1. **Windows Subsystem for Linux を有効にする**  
   設定 → アプリと機能 → プログラムと機能をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326797/9f45e97d-37d9-5f39-d806-a6638367e34e.png)
2. **「Windowsの機能の有効化または無効化」をクリックし、「Windows Subsystem for Linux」のチェックボックスをONにする。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326797/b45c9443-214f-e530-95c4-487b1db7e9b7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326797/4f96b6f3-3937-814e-fe86-9ff6833ae7df.png)
3. **再起動する**

### WSLの入手とインストール
次のサイトに従って導入する。今回は、Ubuntu18.04 を使用する。

* [Windows Subsystem for Linux (WSL) ディストリビューションを手動でダウンロードする | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows/wsl/install-manual)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326797/64ca681e-e7d7-80bc-48cb-5d8b94504e09.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326797/d95f54b5-fd26-0de4-c595-f6f557c8bf21.png)

なお、WSLを有効化していないと、次のようなエラーになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326797/1e1e6e79-282c-3626-89c3-8d592ff22df1.png)

## インストール後の設定

### 端末の色設定など
後回しでも良いが、参考のため書いておきます。

**~/.vimrc**
vi を使う時に黒背景に合わせた文字色にする。

```
set background=dark
```

**~/.bashrc**
コマンドプロンプトの色を変える。PS1の部分を置き換える。

```bash
PS1='\e[37;1m\u@\e[35m\w\e[0m\$ '
```

**端末が一々囀るのを黙らせる**

```shell-session
$ echo "set bell-style none" >> ~/.inputrc
$ exec $SHELL -l
```

### ネットワーク設定？
導入直後は、 `Temporary failure resolving 'security.ubuntu.com'` と名前解決に失敗している。別の環境(Windows 10 Pro 1909以前)ではこんなことをせずに動いたので、解決方法が腑に落ちないが、一応書いておく。

```shell-session
******@**********:~$ sudo apt update
[sudo] password for ******:
Err:1 http://security.ubuntu.com/ubuntu bionic-security InRelease
  Temporary failure resolving 'security.ubuntu.com'
Err:2 http://archive.ubuntu.com/ubuntu bionic InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:3 http://archive.ubuntu.com/ubuntu bionic-updates InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:4 http://archive.ubuntu.com/ubuntu bionic-backports InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Reading package lists... Done
Building dependency tree
Reading state information... Done
All packages are up to date.
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/bionic/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/bionic-updates/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/bionic-backports/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/bionic-security/InRelease  Temporary failure resolving 'security.ubuntu.com'
W: Some index files failed to download. They have been ignored, or old ones used instead.
******@**********:~$
```

名前解決に関する問題なのだろうが、WSL的にはどう直すか？
(WSLだと、resolve.conf は自動生成している模様)
こんな感じでうまくいった。

１. wsl.conf の作成

```shell-session
$ sudo vi /etc/wsl.conf
$ cat /etc/wsl.conf
[network]
generateResolvConf = false
$
```

２. 端末を閉じて、開きなおす。 

３．`sudo vi /etc/resolv.conf` で開いて、 `nameserver 8.8.8.8` を先頭に追加。

* [ DNS not working in fresh Ubuntu 18.04 that installed from Windows Store · Issue #3268 · microsoft/WSL · GitHub](https://github.com/microsoft/WSL/issues/3268)  
  wsl "Temporary failure resolving" ubuntu18
* [WSL 2 DNS not working · Issue #4855 · microsoft/WSL · GitHub](https://github.com/microsoft/WSL/issues/4855)
* [Fix DNS resolution in WSL2 · GitHub](https://gist.github.com/coltenkrauter/608cfe02319ce60facd76373249b8ca6)



## インストール

```bash
sudo apt update
sudo apt install -y ruby default-jdk graphviz
sudo gem install asciidoctor-diagram asciidoctor-rouge
```

`asciidoctor-pdf` と `asciidoctor-mathematical` を使いたい場合はさらに次のコマンドを実行する。

```bash
sudo apt install cmake ruby-dev bison flex libffi-dev libxml2-dev libgdk-pixbuf2.0-dev libcairo2-dev libpango1.0-dev fonts-lyx
sudo gem install asciidoctor-pdf asciidoctor-mathematical
```


## 参考: その他のアプローチ

とりあえず、Windows上に AsciiDoc環境を作るのにいくつか方法がある。
大雑把にメリットデメリットを書いておく。

今回は、LinuxのVMで複数の asciidoctor ファイルの変換をする環境があったが、それを WSL に移行することが趣旨なので 3. を採用した。Linux環境に資産がなければ、1., 2. の選択をするのが妥当と思われる。

1. エディタやプラグインで導入する  
  以下、あまり使い込んでいないので参考程度です。
  * AsciidocFX, ATOM, Visual Studio Code, etc.
    * PDF出力がうまくいかなかったり、使える拡張機能が限定されている
    * ランタイムが Ruby版とは違い Asciidoctor.js, AsciidoctorJ になっているので出来ることが制限されてくる。  
     → やりたいことができているなら、最良の選択。
2. Windows に Ruby版の asciidoctor を導入する
  * 拡張機能がそこそこ使える
  * `asciidoctor-mathematical` は導入できない  
    → mingw環境だとビルドに失敗する
  * ATOM, VS-Codeだとか、Windowsのアプリケーションとの連携ができる
3. Windows に WSL で Ubuntu の環境を用意して、asciidoctorを導入する
  * 拡張機能がそこそこ使える
  * apt コマンドなど Linux の導入ノウハウが **そこそこ** 通用する
  * VMより必要なディスク容量が少なくて済む
  * VS-Codeだとか、Windowsのアプリケーションとの連携がしにくい
3. Windows に WSL で Ubuntu の環境を用意して、Dockerで asciidoctor環境を用意する
  * **dockerのことを覚えれば**、asciidoctorのインストールの智識は不要になるかもしれない
  * 良くも悪くも docker上の環境なので、docker経由で実行することになる。コマンドがどうしても長くなりがちで、シェルスクリプトを書いて起動とか手間は増える。
  * WSL環境を複数作りたいといった状況なら、この方法の方が管理は楽かも。
4. Windows に VM を用意して asciidoctor を導入する
  * 拡張機能がすべて使える
  * apt コマンドなど Linux の導入ノウハウがそのまま使える

## 参考
* [Windows 10「Windows Subsystem for Linux」を有効にする方法 | SEECK.JP サポート](https://kb.seeck.jp/archives/8788)
* [Asciidoctor の環境を Docker on WSL にて作る – すらりん日記](https://blog.techlab-xe.net/post-5911/) 
* [WSLで同一のLinuxディストリビューションを複数インストールする方法 | 東京大学 佐々木淳 研究室 沿岸環境学 海岸工学 環境水工学 水環境学](https://estuarine.jp/2019/06/wsl-multiple-linux-instances/)
* [Asciidocの編集環境を作る - Qiita](https://qiita.com/hyt126/items/fdeff36f09bb221dfac0)

### 端末の色設定など
* [Fixing dark blue colors on Windows 10 Ubuntu bash - Iraklis Mathiopoulos - Medium](https://medium.com/@iraklis/fixing-dark-blue-colors-on-windows-10-ubuntu-bash-c6b009f8b97c)
* [windows subsystem for linux - How to change the dark blue in wsl to something brighter? - Super User](https://superuser.com/questions/1365258/how-to-change-the-dark-blue-in-wsl-to-something-brighter)
* [Introducing the Windows Console Colortool | Windows Command Line](https://devblogs.microsoft.com/commandline/introducing-the-windows-console-colortool/)