新規環境でのセットアップメモ

# 新規環境でのセットアップメモ
ホストOSはWindows 10。VirtualBoxでUbuntu16.04

# Windows 10
## CtrlとAltを置き換える
Macキーボード的配置にする。レジスタ書き換え、又はSharpKeysで書き換える。

![os_01.jpg](https://qiita-image-store.s3.amazonaws.com/0/214268/764d3b39-d2ec-f6df-25bc-b966557bf4a5.jpeg)

## どこでもEmacsショートカット
どこでもEmacs同様のカーソル移動、Deleteを使えるようにする。Ctrl-a、Ctrl-d など。実際には、Ctrlキーではなく、Caps Lockキーを使う。Caps Lockキーだと同時押しに対応してないので、先ほどのSharpKeysでCaps LockキーをScroll Lockキーに変えておく。

Keyhacを使って、Scroll Lockと各キー同時押しをカーソル移動などに割り当てる

```py:config.py
import sys
import os
import datetime

import pyauto
from keyhac import *

def configure(keymap):
    keymap.replaceKey( "ScrollLock", 235 ) # for JP keyboard
    #keymap.replaceKey( "RCtrl", 235 ) # for JP keyboard
    #keymap.replaceKey( "CapsLock", 235 ) # for US keyboard
    keymap.defineModifier( 235, "User0" )
    keymap_global = keymap.defineWindowKeymap()
    keymap_global[ "U0-P" ] = "Up"
    keymap_global[ "U0-N" ] = "Down"
    keymap_global[ "U0-B" ] = "Left"
    keymap_global[ "U0-F" ] = "Right"
    keymap_global[ "U0-A" ] = "Home"
    keymap_global[ "U0-E" ] = "End" 
    keymap_global[ "Shift-U0-P" ] = "S-Up"
    keymap_global[ "Shift-U0-N" ] = "S-Down"
    keymap_global[ "Shift-U0-B" ] = "S-Left"
    keymap_global[ "Shift-U0-F" ] = "S-Right"
    keymap_global[ "Shift-U0-A" ] = "S-Home"
    keymap_global[ "Shift-U0-E" ] = "S-End" 
    keymap_global[ "U0-D" ] = "Delete"
    keymap_global[ "U0-K" ] = "S-End","Delete"
    keymap_global[ "U0-H" ] = "Back"
    keymap_global[ "U0-M" ] = "PageDown"
    keymap_global[ "U0-O" ] = "PageUp"
    #keymap_global[ "U0-RShift" ] = ""
    #keymap_global[ "U0-RShift-LShift" ] = "CapsLock"
    keymap_global[ "LCtrl-Q" ] = "Alt-F4" 
    keymap_global[ "LCtrl-W" ] = "Ctrl-F4" 
    #keymap_global[ "RWin-Enter" ] = "Alt-Enter"
    #keymap_global[ "U0-Tab" ] = "CapsLock"
    #keymap_global[ "U0-BackSlash" ] = "Insert"
    keymap_global[ "U0-Space" ] = "Ctrl-Space"
```

## インストールするソフト
- ブラウザ (FireFox, Chrome)
- プレイヤー (Irfan View, MPC-HC, VLC)
- エディタ (VSCode、Sublime、サクラエディタ)
- バイナリエディタ (Stirling)。右クリックの送るに追加しておく
- その他 (Tera Term、ftp、Git、WinMerge)


![クリップボード02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214268/01f0bb9d-1438-2ffc-9430-928339142bab.png)

## Git
```txt:.gitconfig
[user]
    name = iwatake2222
    email = xxx@gmail.com
[diff]
    tool = WinMerge
[difftool "WinMerge"]
    path = C:/Program Files/WinMerge/WinMergeU.exe
    cmd = \"C:/Program Files/WinMerge/WinMergeU.exe\" -f \"*.*\" -e -u -r \"$LOCAL\" \"$REMOTE\"
[merge]
    tool = WinMerge
[mergetool "WinMerge"]
    path = C:/Program Files/WinMerge/WinMergeU.exe
    cmd = \"C:/Program Files/WinMerge/WinMergeU.exe\" -e -u \"$LOCAL\" \"$REMOTE\" \"$MERGED\"
[alias]
    windiff = difftool -y -d -t WinMerge
    winmerge = mergetool -y -t WinMerge

[core]
	autocrlf = true
```

# Windows11
- 設定 → 個人用設定 → タスクバー → タスクバーの動作 → タスクバーの配置 → 左揃え
- エクスプローラ → 表示 → コンパクトビュー
- タスクバーのサイズ (regedit)
	- コンピューター\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced
	- 「新規」から「DWORD(32ビット)値」
	- TaskbarSi
	- 0
- スタートメニューを戻す (効果なし)
	- コンピューター\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced
	- 「新規」から「DWORD(32ビット)値」
	- Start_ShowClassicMode
	- 1
- エクスプローラのツールバーを戻す
	- reg.exe add "HKCU\Software\Classes\CLSID\{d93ed569-3b3e-4bff-8355-3c44f6a52bb5}\InprocServer32" /f /ve
- 右クリックを戻す
	- reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve


# Ubuntu
## その他
```sh
sudo sed -i 's/# set linenumbers/set linenumbers/g' /etc/nanorc 

gsettings set org.gnome.desktop.background picture-uri 'none'
gsettings set org.gnome.desktop.background primary-color '#2255AA'
```

- https://code.visualstudio.com/download

- SettingsのUsersでUnlockをクリックできない
    - sudo gnome-control-cente
- タイトルバーの高さのサイズを小さくする
    - https://askubuntu.com/questions/1358632/how-to-reduce-the-height-of-headerbar-titlebar-of-gtk3-apps-using-csd
    - ~/.config/gtk-3.0/gtk.css

```sh
headerbar entry,
headerbar spinbutton,
headerbar button,
headerbar separator {
    margin-top: 0px; /* same as headerbar side padding for nicer proportions */
    margin-bottom: 0px;
}

headerbar {
    min-height: 24px;
    padding-left: 2px; /* same as childrens vertical margins for nicer proportions */
    padding-right: 2px;
    margin: 0px; /* same as headerbar side padding for nicer proportions */
    padding: 0px;
}
```

## スワップ領域を追加する

```
sudo fallocate -l 64G /swapfile2
sudo chmod 600 /swapfile2
sudo mkswap /swapfile2
sudo swapon /swapfile2
free -h
```

永続化

```
echo "/swapfile2 swap swap defaults 0 0" | sudo tee -a /etc/fstab
```


## rmコマンドでうっかりファイル/フォルダを削除してもゴミ箱から復旧できるようにする
```
sudo apt install trash-cli
```

```sh:.bashrc
if type trash-put &> /dev/null
then
    alias rm=trash-put
fi

```


## 入力関係 (日本語、Emacsショートカット)
```sh
sudo apt install -y ibus-mozc gnome-tweaks mozc-utils-gui dconf-editor
ibus restart 
gsettings set org.gnome.desktop.input-sources sources "[('xkb', 'jp'), ('ibus', 'mozc-jp')]"

dconf-editor
# /org/gnome/settings-daemon/plugins/keyboard/active = 0

sudo apt-get install autokey-gtk
mkdir -p ~/.xkb/keymap ~/.xkb/symbols
setxkbmap -print > ~/.xkb/keymap/mykbd
setxkbmap -print > ~/.xkb/keymap/mykbd_remote
setxkbmap -print > ~/.xkb/keymap/mykbd_default
code .xkb/ &
xkbcomp -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY
nano ~/bin/load_xkbmap.sh
chmod +x ~/bin/load_xkbmap.sh 
nano ~/bin/load_xkbmap_default.sh
chmod +x ~/bin/load_xkbmap_default.sh 
```

```txt
.xkb/
├── keymap
│   └── mykbd
└── symbols
    └── myswap
```

```txt:.xkb/keymap/mykbd
partial modifier_keys
xkb_keymap {
	xkb_keycodes  { include "evdev+aliases(qwerty)"	};
	xkb_types     { include "complete"	};
	xkb_compat    { include "complete"	};
	xkb_symbols   { include "pc+jp+us:2+inet(evdev)+myswap(swapkeys)"
		// key <MUHE> { [Control_L, Control_L] };
	};
	xkb_geometry  { include "pc(pc105)"	};
};
```

```txt:.xkb/symbols/myswap
partial modifier_keys
xkb_symbols "swapkeys" {
    replace key <MUHE> { [ Control_L ] };
    // replace key <LALT> { [ Control_L ] };
    replace key <LCTL> { [ Alt_L ] };
    
    //  modifier_map Mod1    { <LCTL> };
    //  modifier_map Control { <LALT> };
    replace key <CAPS> { [ Meta_L] };
};
```

```txt:.xkb/keymap/mykbd_remote
partial modifier_keys
xkb_keymap {
	xkb_keycodes  { include "evdev+aliases(qwerty)"	};
	xkb_types     { include "complete"	};
	xkb_compat    { include "complete"	};
	xkb_symbols   { include "pc+jp+us:2+inet(evdev)+myswap_remote(swapkeys)"
		// key <MUHE> { [Control_L, Control_L] };
	};
	xkb_geometry  { include "pc(pc105)"	};
};
```

```txt:.xkb/symbols/myswap_remote
partial modifier_keys
xkb_symbols "swapkeys" {
    replace key <MUHE> { [ Control_L ] };
    // replace key <LALT> { [ Control_L ] };
    replace key <LCTL> { [ Alt_L ] };
    
    //  modifier_map Mod1    { <LCTL> };
    //  modifier_map Control { <LALT> };
    //  replace key <CAPS> { [ Meta_L] };
};
```

```txt:~/bin/load_xkbmap.sh
#!/bin/sh

if [ -s $HOME/.xkb/keymap/mykbd ]
then
    sleep 1
    xkbcomp -I$HOME/.xkb $HOME/.xkb/keymap/mykbd $DISPLAY 2>/dev/null
fi
```

```txt:~/bin/load_xkbmap_default.sh
#!/bin/sh

if [ -s $HOME/.xkb/keymap/mykbd_default ]
then
    sleep 1
    xkbcomp -I$HOME/.xkb $HOME/.xkb/keymap/mykbd_default $DISPLAY 2>/dev/null
fi
```

```txt:~/bin/load_xkbmap_remote.sh
#!/bin/sh

if [ -s $HOME/.xkb/keymap/mykbd_remote ]
then
    sleep 1
    xkbcomp -I$HOME/.xkb $HOME/.xkb/keymap/mykbd_remote $DISPLAY 2>/dev/null
fi
```

- Emacsショートカットの設定
    - Autokeyを開く
    - 既存の設定を消す
    - New -> Folder
        - ~/Settings/Autokey
    - ~/Settings/Autokey の中に下記を解凍する
        - https://github.com/iwatake2222/Autokey/archive/refs/heads/master.zip

- 自動設定
    - gnome-session-properties
        - `autokey`
        - `load_xkbmap.sh`
    - ログオフしたときは再度`load_xkbmap.sh` を実行する必要がある
    - リモートデスクトップの時は、キーバインド変更が競合しないように、`load_xkbmap_default.sh` を実行する
- その他
    - mozc -> settings -> keyboard shortcutで、Eisuのショートカットを全て削除
    - Chrome Remote Desktopで接続するとき
        - Remote: そのまま
        - Host: Autokeyはそのまま。 `replace key <CAPS> { [ Meta_L] };` だけ削除した設定を用意しておき、それを使う
- Ubuntu -> UbuntuにChrome Remote Desktopで接続するとき
    - remote先では`load_xkbmap_remote.sh` を使う
    - Mozcのキーボード設定から、Eisuのショートカットを全て削除する
    - `xmodmap -e "remove lock = Eisu_toggle"`

## Chrome Remote Desktop
- インストール

```sh
wget https://dl.google.com/linux/direct/chrome-remote-desktop_current_amd64.deb
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo dpkg -i google-chrome-stable_current_amd64.deb
sudo dpkg -i chrome-remote-desktop_current_amd64.deb
sudo apt install -f -y

sudo groupadd chrome-remote-desktop
sudo usermod -a -G chrome-remote-desktop $USER

touch ~/.chrome-remote-desktop-session
mkdir .config/chrome-remote-desktop
```

- 設定修正
  - https://qiita.com/ninose14/items/473369d76814174dd58f
  - displayは$DISPLAYで確認した値を使うべきだが、リモートデスクトップインストール後はずれる可能性があるので0にしておくのが無難。うまく行かなかったら1にする

```sh
/opt/google/chrome-remote-desktop/chrome-remote-desktop --stop
sudo nano /opt/google/chrome-remote-desktop/chrome-remote-desktop
```

```txt:/opt/google/chrome-remote-desktop/chrome-remote-desktop
FIRST_X_DISPLAY_NUMBER = 0

def get_unused_display_number():
  """Return a candidate display number for which there is currently no
  X Server lock file"""
  display = FIRST_X_DISPLAY_NUMBER
  # while os.path.exists(X_LOCK_FILE_TEMPLATE % display):
  #   display += 1
  return display

def launch_session(self, server_args, backoff_time):
  """Launches process required for session and records the backoff time
  for inhibitors so that process restarts are not attempted again until
  that time has passed."""
  logging.info("Setting up and launching session")
  self._init_child_env()  # コメントアウトした方がよいかも
  self.setup_audio()  # コメントアウトした方がよいかも
  self._setup_gnubby()
  # self._launch_server(server_args)
  display = self.get_unused_display_number()
  self.child_env["DISPLAY"] = ":%d" % display
  if not self._launch_pre_session():
    # If there was no pre-session script, launch the session immediately.
    self.launch_desktop_session()
  self.server_inhibitor.record_started(MINIMUM_PROCESS_LIFETIME,
                                    backoff_time)
  self.session_inhibitor.record_started(MINIMUM_PROCESS_LIFETIME,
                                   backoff_time)
```

- Authority設定
  - https://qiita.com/HirumaT/items/36a7209814a157f62cec

```sh
sudo nano /etc/polkit-1/localauthority/50-local.d/45-allow-colord.pkla

[Allow Colord all Users]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile
ResultAny=no
ResultInactive=no
ResultActive=yes

[Allow Package Management all Users]
Identity=unix-user:*
Action=org.debian.apt.*;io.snapcraft.*;org.freedesktop.packagekit.*;com.ubuntu.update-notifier.*
ResultAny=no
ResultInactive=no
ResultActive=yes
```

- カーテンモード
  - リモート操作中にHOST PC側のディスプレイを表示しない機能
  - Ubuntuだと未対応?
  - ディスプレイの電源を切る。または、ダミープラグを使う
    - 機種依存があるかもしれないが、DisplayPortだとディスプレイの電源を切ったら操作不可能になった。HDMIならディスプレイの電源を切っても操作可能だった


# Ubuntu (VirtualBox)
## VirbualBoxの設定
ICH9、I/O APIを有効化、PAE/NXを有効化、準仮想化インターフェース=Hyper-V、VT-X/AMD-Vを有効化、ネステッドページングを有効化、ビデオメモリ=256MB(ディスプレイ数を8にしてから1に戻す)、3Dアクセラレーションを有効化、コントローラSATAでタイプ=AHCI、ホストのI/Oキャッシュを使う

(ホストOSがWindowsの場合はHyper-V、Linux系の場合はKVMが良いみたい)

## インストール後

- ソフトウェアを最新にする (念のため、この順番が良い)
	- Ubuntu Softwareから全部Updateしておく (固まるかもしれないので、topで処理状況を確認する)
	- `sudo apt-get update`
	- `sudo apt-get upgrade`
- Guest Additions CDのインストール

## Windowsとの共有フォルダのマウント
- VBoxのメニューバー -> デバイス -> 共有フォルダ－ -> 共有フォルダ－設定 で共有フォルダ設定する (例. `win_share`。自動マウント、永続化する)
- マウントポイントをubuntu上で作る (例. ユーザ名 = tak)
	- `mkdir /home/tak/Desktop/win_share`
- マウントする
	- `sudo mount.vboxsf win_share /home/tak/Desktop/win_share`

```sh:mount.sh
#!/bin/sh
sudo mount.vboxsf win_share /home/tak/Desktop/win_share
```
Windowsのデスクトップフォルダ全体を共有すると、Read Onlyになってしまう。


- 追記(2020/02/12)
    - 以下の方が便利。
        - `sudo adduser iwatake vboxsf`
        - VirtualBoxの共有フォルダの設定に、マウントポイント = `/home/iwatake/Desktop/devel` などとし、「永続化する」にチェックを付ける。


## ターミナルのプロンプト変更
ユーザ名やマシン名を消して、カレントディレクトリのみ表示にする。`code ~/.bashrc`

```sh:.bashrc
if [ "$color_prompt" = yes ]; then
    # PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    # PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
    PS1='${debian_chroot:+($debian_chroot)}\w\$ '
fi
```

## ターミナルの言語設定
`code ~/.bashrc`で、最後の方に以下を追加。場合によっては、`export LANG=C`の方がいいかも。

```sh:.bashrc
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
```

## どこでもEmacsショートカット
どこでもEmacs同様のカーソル移動、Deleteを使えるようにする。Ctrl-a、Ctrl-d など。実際には、Ctrlキーではなく、Caps Lockキーを使う。(先ほどの設定でホストOSであるWindows上でCaps LockキーをScroll Lockにしているので、実際には、Scroll Lock-a、Scrol Lock-dになる。)

Scroll LockキーをMeta_Lキーに変更する。

```txt:/usr/share/X11/xkb/symbols/pc
省略
    // modifier_map Mod1   { <META> };
    modifier_map Mod2   { <META> };
省略
    //key <SCLK> {	[  Scroll_Lock		]	};
    key <SCLK> {	[  Meta_L		]	};
省略
```

Meta_Lキーを押したときに、メニューバーを選択しない (ALT的な動作をさせない)

```txt:/usr/share/X11/xkb/symbols/altwin
// Meta is mapped to second level of Alt keys.
partial modifier_keys
xkb_symbols "meta_alt" {
    //key <LALT> { [ Alt_L, Meta_L ] };
    key <LALT> { [ Alt_L ] };
    key <RALT> { type[Group1] = "TWO_LEVEL",
                 //symbols[Group1] = [ Alt_R, Meta_R ] };
                 symbols[Group1] = [ Alt_R ] };
    // modifier_map Mod1 { Alt_L, Alt_R, Meta_L, Meta_R };
    modifier_map Mod1 { Alt_L };
//  modifier_map Mod4 {};
};
```

Autokeyを使って、ショートカットキーを登録する。例えば、`Meta-f`というホットキーに、`keyboard.send_key("<right>")`を割り当てる。AutoKeyを開いて、New->Folderで、mysettings/Autokeyを開く。その中に、設定済みファイル (https://github.com/take-iwiw/Autokey/archive/master.zip) をコピーする。

![os_02.jpg](https://qiita-image-store.s3.amazonaws.com/0/214268/50296669-b803-fb71-10d5-e07ceb9264eb.jpeg)

Start Applications (gnome-session-properties)に登録する

![os_03.jpg](https://qiita-image-store.s3.amazonaws.com/0/214268/3397b21a-093e-d5cf-6ab0-3081ae8c2dc6.jpeg)


## その他
### shファイルを実行/編集選べるようにする
Files -> メニューバー -> Edit -> Preferences -> Behavior -> Executable Text Files -> Ask each time

### Filesでアドレスバー表示にする
Ctrl-Lで切り替える。または、
`gsettings set org.gnome.nautilus.preferences always-use-location-entry true`

## インストールするソフト
- Visual Studio Code (MSのサイトから.debでダウンロード)
- Autokey (Ubuntu Softwareから)

### VSCodeをsudoで開く

`sudo code --user-data-dir="." ファイル名`


## OpenCV(x86_64 linux)
```sh
apt update && apt upgrade -y
apt install -y build-essential cmake nano zip wget curl git
apt install -y python3-dev python3-pip
apt install -y ffmpeg libavutil-dev libavcodec-dev libavformat-dev libavresample-dev libswscale-dev libxvidcore-dev libx264-dev libxine2-dev libdc1394-22-dev
apt install -y libatlas-base-dev libopenblas-dev liblapack-dev libtbb-dev libeigen3-dev
apt install -y libgtk-3-dev
wget https://github.com/opencv/opencv/archive/refs/tags/4.5.3.zip
unzip 4.5.3.zip
cd opencv-4.5.3/
mkdir build && cd build

cmake .. -DWITH_TBB=ON -DWITH_FFMPEG=ON
make -j4
make install
ldconfig
```

# Python
## pyenv + venv
### Windows
- https://github.com/pyenv-win/pyenv-win/archive/master.zip をダウンロードして、`C:\iwatake\devel\python\.pyenv` に解凍
- 下記コマンドでパスを設定

```powershell:PowerShell
[System.Environment]::SetEnvironmentVariable('PYENV',"C:\iwatake\devel\python\.pyenv\pyenv-win\","User")
[System.Environment]::SetEnvironmentVariable('PYENV_HOME',"C:\iwatake\devel\python\.pyenv\pyenv-win\","User")
[System.Environment]::SetEnvironmentVariable('path', "C:\iwatake\devel\python\.pyenv\pyenv-win\bin;" + "C:\iwatake\devel\python\.pyenv\pyenv-win\shims;" + [System.Environment]::GetEnvironmentVariable('path', "User"),"User")
```

- 下記コマンドでpythonをインストールしたり、新規環境を作る

```powershell:PowerShell
pyenv install 3.8.9
pyenv shell 3.8.9
python -m venv C:\iwatake\devel\python\.venv\py38_test01
C:\iwatake\devel\python\.venv\py38_test01\Scripts\Activate.ps1
python -m pip install --upgrade pip
```

- シェルを実行できない場合は、必要に応じて管理者権限からPowerShellを起動して、 `Set-ExecutionPolicy Remotesigned`
- それでもできない場合は、pyenv.ps1を右クリック→プロパティ→セキュリティの項目の「許可する」をチェック

### Linux
- 下記コマンドでインストール

```sh
sudo apt-get update; sudo apt-get install make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile
echo 'eval "$(pyenv init --path)"' >> ~/.profile
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
```

- シェル再起動
- 下記コマンドでpythonをインストールしたり、新規環境を作る

```sh
pyenv install 3.8.9
pyenv shell 3.8.9
python -m venv ~/.venv/py38_test01
source ~/.venv/py38_test01/bin/activate
python -m pip install --upgrade pip
```


# WSL2 (Ubuntu)
基本的には、 https://docs.microsoft.com/ja-jp/windows/wsl/ の通り

## WSLのインストール
- WSLを有効にする、仮想マシンの機能を有効にする

```powershell:commandOnPowershell
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```

- 再起動
- Linux カーネル更新プログラムを実行する
    - https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
- WSL 2 を既定のバージョンとして設定する

```powershell:commandOnPowershell
wsl --set-default-version 2
```

- Microsoft Storeから、Ubuntuをインストールする
- 起動して、IDとパスワードを設定する

## 設定
### デフォルトのイメージの場所
C:\Users\iwatake\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState

### ホームディレクトリをWindows側に変更する (遅くなるらしいのでやらないほうが良い)
- sudo nano /etc/passwd
    - `pi:x:1000:1000:,,,:/home/pi:/bin/bash`
    - ↑の `/home/pi` を変更
- Windows Terminalの場合
    - Window Terminalで設定を開く
    - プロファイル -> Ubuntu-xx.xx -> ディレクトリの開始、を変更する

### WSL側のファイルにアクセスする
\\wsl$\Ubuntu-20.04\home\pi

### バックアップ
```powershell:commandOnPowershell
wsl --export Ubuntu-20.04 C:\iwatake\devel\wsl_backup\ubuntu-20.04_20210710_clean.tar
```

### イメージの削除
```powershell:commandOnPowershell
wsl --unregister Ubuntu-20.04
```

### 復元とデフォルトユーザ名変更
```powershell:commandOnPowershell
wsl --import Ubuntu-20.04 C:\iwatake\devel\wsl_image\Ubuntu-20.04 C:\iwatake\devel\wsl_backup\ubuntu-20.04_20210710_clean.tar --version 2
ubuntu2004.exe config --default-user pi
```

### GUI表示
- Windows
    - VcXsrvをインストール
        - 初回起動時の設定で、 `Disable access control` にチェックをつける
- Ubuntu
    - `export DISPLAY=192.168.1.2:0.0` または、 (IP省略は不可)
    - `export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0.0`
    - ↑を `.bashrc` に書いておく

### VSCodeから編集する
- Windows
    - VSCodeと `ms-vscode-remote.vscode-remote-extensionpack` をインストール
    - VSCodeインストール時にパスを追加しておく
- Ubuntu
    - `sudo apt install -y wget ca-certificates`
    - ターミナルから `code .` で起動

## Docker
### インストール
- Docker Desktop for Windowsをインストール
    - https://docs.docker.com/docker-for-windows/wsl/#download
    - Setting -> General -> `Use the WSL 2 based engine` にチェックがついていることを確認する
    - Setting -> Resources -> WSL INTEGRATIONで、Ubuntu-20.04を有効にする
    - `docker run hello-world` で動作確認
- VSCodeに `ms-azuretools.vscode-docker` をインストール

### PowerShellのコマンド補完

```powershell:commandOnPowershell
Install-Module -Scope CurrentUser posh-docker
notepad $PROFILE

以下を追記
Import-Module posh-docker
```

### Containerを作る (開発用。Windowsとの共有フォルダとX Display forwarding)

```powershell
docker pull ubuntu:20.04
docker run -v /C/iwatake/devel:/devel  -e DISPLAY="192.168.1.2:0" -itd --name="ubuntu_01" ubuntu:20.04
docker start ubuntu_01
docker exec -it ubuntu_01 bash
```

### Imageを作る
```powershell
docker commit --pause ubuntu_01 ubuntu:work_cv
```

# WSL2 + GPU + Docker on Windows 11
https://docs.microsoft.com/ja-jp/windows/wsl/install

## Install
### WSLのインストール
```ps:PowerShell
wsl --install -d Ubuntu-20.04
```

### いろいろ
- イメージ置き場
    - `C:\Users\iwatake\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState`
- WindowsからWSLファイルへのアクセス
    - `\\wsl.localhost\Ubuntu-20.04`
- WSLからWindowsファイルへのアクセス
    - `/mnt/c/`
- WSLのGUIアプリを実行する場合、Windows側にX表示用アプリ (VcXsrvなど) は不要。だけど、Docker上のGUIアプリを実行する場合は必要っぽい


### VSCodeのインストール
- ms-vscode-remote.vscode-remote-extensionpack をインストールしておく

```sh:WSL
sudo apt update && sudo apt upgrade
sudo apt install wget ca-certificates
code .
```

### NVIDIA CUDA in WSL のインストール
- 参考
    - https://docs.microsoft.com/ja-jp/windows/ai/directml/gpu-cuda-in-wsl
- NVIDIA Drivers for CUDA on WSLをインストール
    - https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=WSL-Ubuntu&target_version=2.0&target_type=deb_local

- メモ
    - インストール後 `nvcc -V` をしても `Command 'nvcc' not found, but can be installed with` となってしまう
    - 以下を.bashrcに追加
    ```sh
    export CUDA_HOME=/usr/local/cuda
    export PATH=${CUDA_HOME}/bin:${PATH}
    export LD_LIBRARY_PATH=${CUDA_HOME}/lib64:$LD_LIBRARY_PATH
    ```


### NVIDIA Container Toolkit のインストール
- 参考
    - https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html
    - https://qiita.com/ksasaki/items/ee864abd74f95fea1efa#wsl-2-%E4%B8%8A%E3%81%AE-linux-%E3%81%B8%E3%81%AE-nvidia-container-toolkit-%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%88%E3%83%BC%E3%83%AB

```sh:WSL
curl https://get.docker.com | sh
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
curl -s -L https://nvidia.github.io/libnvidia-container/experimental/$distribution/libnvidia-container-experimental.list | sudo tee /etc/apt/sources.list.d/libnvidia-container-experimental.list

sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo usermod -aG docker $USER
sudo service docker restart
sudo service docker start    # デーモンの登録はできないらしいので、毎回startが必要
```

- メモ
    - docker runすると、 `docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.` エラーが出る 
        ```sh
        sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
        sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
        ```

### 試す
```sh:WSL
docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark  
docker run --gpus all -it --rm -v /mnt/c/iwatake/devel/:/devel -e DISPLAY="192.168.1.2:0" nvcr.io/nvidia/tensorrt:21.11-py3
docker run --gpus all -it --rm -v /mnt/c/iwatake/devel/:/devel -e DISPLAY="192.168.1.2:0" nvcr.io/nvidia/cuda:11.4.2-devel-ubuntu20.04
docker run --gpus all -it --rm -e DISPLAY=$DISPLAY nvcr.io/nvidia/cuda:11.7.1-devel-ubuntu22.04
```