Windows10 Homeのプログラミング環境をWSLとchocoでセットアップしてみた話

今風のやり方でWindows10 Homeをプログラミング環境として使えるようセットアップしたログです。5,6年前とは大きく状況が変わりました。

- 高解像度ディスプレイ
- タッチパッドを複数本の指でタップして使う
- cygwinやMSYS２ではなく、WSLのubuntu環境でコンソールを使う
- GUIアプリケーションはインストーラをサイトからダウンロードせず、chocoコマンドから入れる
- 文字コードをUTF-8で統一し、SJISフリーになれる

# 対象マシン

2018年7月現在、一番安く入手できる4KノートPC(非タッチスクリーン) ASUS X570Uで行いました

- http://kakaku.com/item/K0001042167/

# 1. PC初期起動でのWindowsの設定

起動させると、Windows10のセットアップ画面で音声ガイドによる入力が促される。

- セットアップ後すぐにアップデートが必要になるので、電源にはつないでおく
- **WiFi設定は「スキップ」**して進める => Microsoftアカウントを必要とする多くの設定がなくなるので、セットアップがすぐ終わる
- プライバシー設定は**すべてOFF**に切り替える => ただしセットアップ後、設定からさらにOFFにする必要あり

# 2. WiFi設定

SSIDを公開しておらず一覧選択できない場合、以下のルートでSSIDの入力画面にたどり着く:

- スタートメニュー横の⚙アイコンで「設定」を開く
- 「ネットワークとインターネット」ボタン
- 左リストの「Wi-Fi」
- **「既知のネットワークの管理」リンク**
- 「＋新しいネットワークの追加」

でやっと、ネットワーク名(SSID)とWPA2パスを入れられるダイアログが出せる。

# 3. 4K等倍表示

「設定」の「システム」の「ディスプレイ」で、「拡大縮小とレイアウト」を変更する。

初期状態では「250% （推奨）」表示になっているので、「100%」に変える。解像度も「3840x2160 (推奨)」であることを確認する。

## ポインタサイズの拡大

「設定」の「簡単操作」の、「カーソルとポインタサイズ」で色や大きさを選べる。
ポインタは、黒塗りのほうが見失わないと思う。

## 使用GPU切り替え設定

X570Uには、GeForce GTX1050が搭載されているが、初期状態ではほぼ内蔵GPUだけを使うようになっており、GeForceは全く使用されない。
GeForceを使うするには、以下

- デスクトップ上でダブルタップしてコンテキストメニューから「NVIDIAコントロールパネル」を選ぶ
- ダイアログ左のツリーから「3D設定の管理」を選ぶ
- 「グローバル設定」および「プログラム設定」で、「優先するグラフィックスプロセッサ」で「高パフォーマンスNVIDIAプロセッサ」に切り替え、「適用」する

GPU使用状態は、「Ctrl+Shift+ESC」で立ち上がる「タスクマネージャ」の「パフォーマンス」で確認できる。


# 4. タッチパッドの右クリック無効化

タッチパッドを押しながらドラッグするつもりのときに、右側を押してしまいコンテキストメニューが出てしまうのを防ぐ。

「設定」の「デバイス」で右リストの「タッチパッド」を選び、**「右クリックするにはタッチパッドの右下を押します」のチェックを外す**。これでタッチパッドの右側を押しても、左クリック扱いになる。

(「２回タップしてドラッグすると複数選択」も不要かも)

## クリックロック設定

「追加の設定」リンクで立ち上がる「マウスのプロパティ」ダイアログで「クリックロックをオンにする」が選べる。
ただし、この**クリックロックはタップは非対応**であり、パッド手前側を力で押し込む必要がある。ポインタ位置を維持したまま押しこむのは結構難しい。

あとWindowsでは、三本指タップでのドラッグの設定はできない。

## ~~タッチパッドでのドラッグのために「主と副のボタンを切り替える」~~

~~タッチパッドで押し込みドラッグをするとき、**押し込む親指がタッチパッドの右側にくる場合**には、ボタンの主副を入れかえたほうがクリック認識されやすいようです。「主と副のボタンを切り替える」は、同じく「マウスのプロパティ」にあります。~~

(バージョン1903では、入れ替えなしでも右下押し込みでドラッグできるようになっていました。)


# 5. PC名の変更

「設定」の「システム」で、**左のリストの「バージョン情報」**から、「このPCの名前を変更」ボタンで変更できる。
新しい名前は、再起動後に反映される。

# 6. IMEのキーバインド

「変換」でIME-ON、「無変換」でIME-OFFにするモードレス設定。

- タスクトレーアイコンの「A」の上でダブルタップして「プロパティ」を選ぶ
- 出るダイアログの「詳細設定」ボタンを押す
- 出る「Microsoft IMEの詳細設定」ダイアログの「全般」タブの「編集操作」の「変更」ボタン
- 出る「設定」ダイアログの「キー設定」タブのテーブルを変更する
    - キー「無変換」の「入力/変換済み文字なし」を「IME-オフ」に変える
    - キー「変換」の「入力/変換済み文字なし」を「IME-オン」に変える

プログラミング向けの入力文字の設定

- 「全般」タブの「スペースの入力」は「常に半角」
- 「変換」タブの「詳細設定」で「変換文字制限しない」にして「OK」
- 「オートコレクト」タブの「全角/半角」の「記号」を「常に半角」にする


# 7. プレインストールソフトのアンインストール

すべて、「設定」の「アプリ」で、一覧から選んで「アンインストール」する。

- KingsoftのWPS Office: 不要
- iフィルター: プログラミング用にとしては、フィルタリングは問題を増やす存在
- - McAfee: 理由は http://takagi-hiromitsu.jp/diary/20180610.html のcoinhiveの扱い参照
- LinkedIn, Netflix: 使うにしてもブラウザで使う

とくに、**「マカフィー」はさらに「リブセーフ」なるライセンス監視システムが隠されている**。
**右の「プログラムと機能」リンク**から立ち上がる「コントロールパネル」の一覧に「リブセーフ」というのが残っているので、それをコンテキストメニューから「アンインストール」する

iフィルタのアンインストールで、再起動を促されるので保留し、これらすべてアンインストールしてから再起動する。
ただし再起動を始めると、「Windowsの準備をしています コンピューターの電源を切らないでください」が出て、10分程度では再起動の兆しもおこらないので、電源断したくなるのを我慢して**数時間は待つ**こと。

# 8. Windows10アップデート

「設定」の「更新とセキュリティ」を開いて、アップデートのダウンロード状態や再起動要求の確認をする。

- 注: リスト上で**ダウンロードが失敗**していて**「今すぐ再起動する」リンク**が出ている場合、まず再起動させ反映させることで、ダウンロードが進むようになる

何度か再起動し、終われば、Windows10 1803 (April 2018 Update)になる。

# 9. エクスプローラで拡張子を表示

「設定」の「更新とセキュリティ」から、左リストの「開発者向け」の「エクスプローラ」で、以下の項目を一括設定できるようになっている。

- ファイル拡張子表示
- 隠しファイル表示
- タイトルバーに完全パス名
- 別ユーザーで実行
- 空ドライブ表示

# 10. システムロケールをUTF-8化

「設定」の「時刻と言語」で左リストから「地域と言語」を開き、**右の「管理用言語の設定」リンク**を押す。

- 出る「地域」ダイアログで、**「管理」タブの「システムロケールの変更」**ボタンを押す。
- 出るダイアログで、「ベータ: ワールドワイド言語サポートでUnicode UTF-8を使用」にチェックを入れ「OK」し、「今すぐ再起動」させる

注: そのままではMSゴシックを使っている**ターミナルで日本語文字が文字化け**する。
文字化けを解消するには、ターミナルの「設定」で、フォントを「SimSun-ExtB」などに変える必要がある。

# 11. WSL(Windows Subsystem for Linux)を使えるようにする

「設定」の「アプリ」で、右の「プログラムと機能」のリンクから「コントロールパネル」を起動し、**左の「Windowsの機能の有効化または無効化」**を押す。

- 出るダイアログのツリーにある「Windows Subsystem for Linux」をチェックし「OK」して、「今すぐ再起動」する。

## "Ubuntu"をMicrosoft Storeから入れる

スタートメニューから「Microsoft Store」を起動。**右上の「検索」から「linux」と入力**すると、「WindowsでLinuxを実行する」が出る。

選んだページにて、Ubuntu, openSUSE, SUSE Enterprise Server, debian, Kali Linuxといったアイコンが出てくるので、Ubuntuを選ぶ。

このUbuntuページで「入手」ボタンを押すとインストールされる(要microsoftアカウントでのサインイン)。ダウンロードサイズは200M弱。

ダウンロードが終わるとボタンが「起動」に変わるので、押すとコンソールウインドウが立ち上がり「Installing, this may take a few minutes...」となっているので待つ。しばらくすると、「Enter user name:」と出るので、ユーザー名とパスワードを設定して、ubuntuで使うユーザーアカウントを作る。

インストール後の環境はUbuntu xenial(16.04)なので、すぐに**bionicへアップグレード**する。

```shell-session
$ do-release-upgrade -d
```

- 今のWSLでは、apt upgrade等で大きいパッケージファイルへのIP通信が途中で停止したままになりやすい。これは、**「管理者として実行」で起動させれば、止まらずに安定して通信できる**ようだ。
     - Ubuntuをタスクバーにピン留めしてから一度終了させ、ピン留めしたアイコン上でダブルタップし、さらに出たメニューの「Ubuntu」をダブルタップすると、そのメニューに「管理者として実行」がある。
- アップグレード中に、唯一対話入力になるsshd_configファイルは元のものを維持(keep)した (パスワードログインは無効になっている)

アップグレード後は、とりあえずlanguage-pack-ja、lv、aptitudeとemacs-noxを入れておく

```shell-session
$ apt install lv aptitude emacs-nox language-pack-ja
```

あと現時点では、systemdは対応しておらず、snapでのパッケージインストールはできない（docker等）。

- 注: コンソールのフォントは「SimSun-ExtB」にすると、日本語表示ができる。ただし、0とOの区別がしにくいので、Ricty Diminishedフォントをいれるか、wslttyなどの別ターミナルを使う。

## WSLのデータのありかと注意点

Microsoft Storeから入れたappはすべて、隠しフォルダである"c:/Program Files/WindowsApps"に入るようだ。Microsoft Storeから入れたWSLのUbuntuも同様である。

アンインストールは、スタートメニュー上のUbuntuアイコンのコンテキストメニューからあっさりと「アインインストール」できてしまう。当然/home以下も一緒に消えるので、**ユーザーデータは、Windows上のディレクトリへシンボリックリンクを貼って、そこに保管しておく**のが良いだろう(Windowsのファイルツリーへは、/mnt/cや/mnt/dでマウントされている)。

- Windows上のフォルダは、**WSL上ではアクセス権が777**になってしまうので注意

独自にWSLのボリュームを作ることもできる。そのためのツールとしてlxrunofflineがある。chocoでも入れられる。

- https://github.com/DDoSolitary/LxRunOffline

WSLでは、ボリュームにディストリビューション名等を設定して管理している。lxrunofflineのget-xxxコマンドはそういった情報を取得でき、set-xxxコマンドで上書きできる。

特にlxrunofflineでは、Microsoft Storeから入れた"Ubuntu"などのディストリビューション名(大文字小文字区別なし)にも無警告で上書きできしてまうので注意すること。

## Windows上のファイルでもアクセス権を設定できるmetadataオプションでマウントさせる

Ubuntu上で`/etc/wsl.conf`を以下のように作る:

```conf
[automount]
options = "metadata,umask=22,fmask=11"
```

このファイルを作ったら、一旦、**Windowsは再起動し**、再びWSLのUbuntuを立ち上げれば、/mnt以下にマウントされるWindows上のファイルのアクセス権が777でなくなっていることを確認できる。

この設定を行うことで、/homeディレクトリ全体をWindows上に移すこともできる。


## Ricty Diminishedフォントのインストール

(chocoからfonts-ricty-diminishedが入れられなかった場合)

似た文字の識別性の高いRictyフォントをインストールする。

- http://www.rs.tus.ac.jp/yyusa/ricty_diminished.html

このWebページの「バージョン」の「4.1.1 (2017年12月3日)」等がttfファイルの入ったtar.gzアーカイブへのリンクになっている。

- tar.gzアーカイブをダウンロードし、7zip等で展開する
- エクスプローラでttfファイルを選択して、ダブルタップでコンテキストメニューから「インストール」を選ぶ

## おまけ: WSLでdockerdを実行する方法

WSLでdockerdが実行できる条件はかなりシビアなので、以下を注意する必要がある(稼働報告の記事は多いけど、最後のWindows自体の再起動の必要性に言及した記事がないのでハマりやすい)。

- dockerdは、"Ubuntu-16.04"のパッケージのdocker.io(**versionは1.13.1**)だけがうまく動かせる
    - 1.17や1.18ではlayerのtarの展開で"invalid argument"が出て失敗する
- dockerdは**管理者で起動**のWSL上で動かす(管理者権限でないと、iptablesでErrorを出す)
- 起動に失敗した後、**再びdockerdを動かすにはWindowsの再起動が必要**な場合がある
    - 別のWSLでdockerdを動かしたあとは、必ずWindowsの再起動が必要(iptablesのせい?) 
- `-v`でのボリュームマウントがおかしい(古いデータが残ったままになったり、更新されなかったりする)等、いろいろ挙動が怪しく、WSL上のdockerdは**実用レベルのものではない**

別途「Microsoft Store」から"Ubuntu-16.04" (ubuntuで検索すると出てくる。"Ubuntu"でも、"Ubuntu-18.04"でもない)を入れる。これは、VMでのboot2dockerのようにdockerd専用で使うことにする。

"Ubuntu-16.04"をインストールして「起動」し、ユーザーを作ったら、「タスクバーにピンどめ」しすぐ閉じる。
タスクバー上でダブルタップし、そのメニュー上でダブルタップすると「管理者で起動」メニューが出るので、それを選んで起動する(実行の許諾ダイアログが出る)。以下を実行する

```shell-session
$ sudo apt update
$ sudo apt upgrade -y
$ sudo dpkg-reconfigure tzdata 
$ sudo apt install -y docker.io
```

(タイムゾーン設定は合わせておいたほうが良いです。)

終わったら一旦閉じ、**Windowsを再起動**します(とにかく、dockerdで困ったら**Windowの方**を再起動しましょう)。

再び、"Ubuntu-16.04"を「管理者で起動」し、dockerdを立ち上げる。

```shell-session
$ sudo su -
# cgroupfs-mount
# dockerd -H tcp://127.0.0.1
```

dockerdがErrorで終了せずに可動し続けていれば、"Ubuntu-16.04"は、このまま放置です。
Errorが出たなら、Windowsを再起動し、**真っ先に**"Ubuntu-16.04"のWSLを立ち上げ、dockerdを動かしましょう。

よくあるsudo経由やserviceコマンド経由ではなく、直接rootでdockerdを起動したほうが問題がわかりやすいです。
また、別のWSL "Ubuntu"で実行するdockerコマンドからアクセスするために、引数`-H tcp:127.0.0.1`を指定して**TCPでホスト**します。

別途、docker.ioやdocker-ceを入れたWSL "Ubuntu"を立ち上げ(管理者権限は不要)、以下のコマンドを実行して、"Hello from Docker! ..."メッセージが表示されれば、とりあえずは成功です。

```shell-session
$ docker -H tcp://127.0.0.1 run --rm hello-world
```

ちなみに、環境変数で、`DOCKER_HOST=tcp://127.0.0.1` を設定してdockerコマンドを実行しても同じです。


# 12. chocolateyのインストール

フリーなWindowsアプリは、すべて**chocoコマンド経由でインストールする**ことにします。手でインストーラーをダウンロードして実行させる、対話型インストールはなるべくしないようにします。

スタートボタン上でダブルタップして出るメニューから「Windows PowerShell **(管理者)**」を起動する。

そして、 https://chocolatey.org/install にあるPowerShell向けのインストールコマンドを実行する

```powershell
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
```

あとは、そのまま必要なアプリケーションをコマンド経由でインストールしていきます

```powershell
choco install googlechrome firefox atom xyzzy 7zip vlc
choco install cmder wsltty mobaxterm vcxsrv
choco install ctrl2cap noto
```

(ちなみに、fonts-ricty-diminishedパッケージもあるが、インストールに失敗した)

インストール場所は、`c:\Program Files`のほかに、ダウンロードベースなものは`c:\ProgramData\chocolatey\bin`や`c:\tools`などになる。

## chocolateyパッケージアップグレード

以下が、chocolatey自身を含む全パッケージアップグレードのコマンド

```powershell
choco upgrade all -y
```

ちなみに、`choco upgrade`の短い形として、`cup`コマンドが入っている(`cup all -y`でもよい)。

## capslockをctrlにする(ctrl2capを使う)

PowerShell(管理者)上で、

```powershell
cd /ProgramData/chocolatey/lib/ctrl2cap/tools
./ctrl2cap /install
```

リブート後に有効化される

- 注: ctrl2cap /installコマンドは、**各種sysファイルのあるディレクトリで実行**する必要がある。

## atomエディタのemacsキーバインディング

atomはOSごとにキーバインディングが違っていて、windowsでemacsバインディングを使うのは少し面倒。

- emacs-plus
- atomic-emacs
- disable-keybindings

の3パッケージを入れ、disable-keybindingのsettingsを開き、

- 「Disable Community Packages」へ`emacs-plus, atomic-emacs`を入れる
- 「Prefix Keys」へ、`ctrl-k`を入れる

これでWindows上でもemacsキーバインディングで操作できるようになる

# 13. WSL上のpythonでmatplotlibを使えるようにする

matplotlibを使うには、Xサーバが必要。今回、X Serverとして、mobaxtermを使う。

- [powershell] mobaxtermはchocoからinstall： `choco install mobaxterm`
- [bash] WSLで、python3-tk, python3-venv, fontconfig等を入れる: `apt install python3-venv python3-tk fontconfig`
- [bash] WSL内の `~/.bashrc` に`export DISPLAY=:0`を入れておく

mobaxtermでも"Session" "Shell"で"Ubuntu Bash (WSL)"で、WSLを起動できる。

しかし、mobaxtermの**"X server"ボタン**で起動していれば、pythonを実行するのは、mobaxtermのsession内でなくてもよい。(GUIのために、VcXsrvをXサーバとして使ってもよい)

## matplotlibで日本語フォントを表示させる

ubuntuのfonts-noto-cjkではいるのはttcファイルだが、**matplotlibからttcフォントは使えない**。そこで"Noto Sans CJK JP"等のotfファイルをダウンロードして使う必要がある。

- https://www.google.com/get/noto/

ここからダウンロードできるzipの中にあるotfファイルを、**`~/.local/share/fonts/`**に入れることで、ubuntuでは有効になる(`~/.local/share/fonts`を`/mnc/c/Windows/Fonts/`へのシンボリックリンクにしてもよいが、フォントキャッシュ作成にかなりの時間がかかる)。

- fontconfigにある`fc-list`コマンドで、入れたotfが読まれていることを調べられる

この時点でmatplotlibで日本語表示できるようになる。"Noto Sans CJK JP"を指定して漢字のラベルを使ったコード例は以下

- https://gist.github.com/bellbind/ede1466d17647a0133b3625afbf665c5

```shell-session
$ python -m venv np
$ ./np/bin/pip install numpy pandas matplotlib ipython scipy sklearn 
$ git clone https://gist.github.com/bellbind/ede1466d17647a0133b3625afbf665c5 pca
$ cd pca
$ ../np/bin/python pca-numpy.py
```

(フォントを入れる前にmatplotlibを起動したときなどは、`~/.cache/matplotlib`などを削除してから再実行するとよいかもしれない)

# 14. Google日本語入力のインストールと設定

```powershell
choco install googlejapaneseinput
```

でインストールできる。

以下は、変換/無変換キーによるON/OFF設定。

まず、タスクバーの「A」や「あ」の上でコンテキストメニュー「プロパティ」から、「Google日本語入力プロパティ」ダイアログを出す。
この「一般」タブから、「キー設定の選択」で、「編集」ボタンを押すと、「Google日本語入力キー設定」ダイアログが出る。
左下の「編集」ドロップダウンリストから「エントリーを追加」し、そこで以下の２つを設定する。


|モード|入力キー|コマンド|
|----|-------|-----|
|直接入力|Henkan|ひらがなに入力切替|
|入力文字なし|Muhenkan|IMEを無効化|

# 15. バージョン1903での対応

2019/07追記

## ダークモード化

「設定」の「個人用設定」-「色」で、

- 「色を選択する」を「黒」に変える

## WSLのコンソールを開くとすぐ閉じてしまう現象の対策

まず、PowerShellなど、起動してもすぐに閉じない標準のコンソールを開きます。
左上アイコンのコンテキストメニューで「プロパティ」でダイアログを開き、その「レガシーコンソールを使用する(...)」についているチェックを外し、「OK」して、一度このコンソールを閉じます。

すると、WSLのコンソールやWindows Terminalですぐ閉じることはなくなりました。




# つづく、かも