初めてのPCにNVIDIA+Ubuntu+Docker+Tensorflow+ROS2等を入れて、なるべくMacっぽくする[第6版:2023年11月]

#### Ⅰ. やりたいこと
- NVIDIAのGPU入りのデスクトップPCを10諭吉程度で入手する<font color="Crimson">（更新 ③）</font>
- Ubuntu20.04をインストールして、22.04にアップグレードして、使い勝手をMacに合わせる<font color="Crimson">（更新 ③）</font>
- Ubuntu22.04にDockerをインストールして、以下のシステムをDocker上に構築する<font color="Crimson">（更新 ③）</font>
    - TensorFlow＋Keras<font color="Crimson">（更新 ③）</font>
    - ROS2<font color="Crimson">（一時保留 ③）</font>
    - PyTorch <font color="DarkOrange">（更新 ⑤）</font>

#### <details><summary> Ⅰ.Ⅰ. 使い勝手をMacに合わせる？</summary><div>
1. 『Spaceキー』の『左隣キー(左Superキー）』を『左Ctrlキー』に変えて、『左Ctrlキー』+『X／C／V』で「カット／コピー／ペースト」が出来るようにする（Macの『左⌘キー』と同じ使い方）：OK
2. 『Spaceキー』と『左Ctrlキー』で「英語／日本語』の入力ソース切替」が出来るようにする（MacのUSキーでの入力ソース切替と同じ使い方）：OK
3. 『左Altキー』+『a／s／z／x／c』で「半角カタカナ／半角英語／ひらがな／全角カタカナ／全角英語」に変換が出来るようにする（Macのことえりの『Option＋α』と同じ仕様）：OK
4. 『Capslockキー』も『Ctrlキー』にする（個人的趣味）：OK
5. 入力は『TrackPad』を使いたい（この20年ぐらい、Trackpadしか使ってないから）：NG

#### 結果は、4勝1敗でした
</div></details>
 
#### <details><summary> Ⅱ. 経緯</summary><div>
MacBookPro＋仮想環境に「Ubuntu18.04」をインストールして、その上で「DeepLeaning／ROS1」を走らせて遊んできましたが、**【真面目に『DeepLeaning』を始めよう＆『ゼロから作るDeepLeaning②』にはGPUが必要らしい】**と言うことで、MacBookProに繋がる**『eGPU』**を物色していたところ、
## 「DeepLeaning」には、『NVIDIAのGPU』が必須
との情報が！ **ずっと、AppleとNVIDIAは喧嘩中。** ただ、PCを買うのも悔しかった(所持金も少なかった)ので、色々とトライしましたが、

- Microsoft Azure：Linux初心者は右往左往しているうちに重課金
- Google Colab：90分タイムアウトにやられる
- 仮想環境では、GPUが上手く動かないという現実（教えてくれたCDLE(Community of Deep Learning Evangelist)メンバー、多謝）
  
の結果から「ROSでも使うし」と腹をくくって、Ubuntu専用のGPU入りPCを買うことを決意しました（その時、生まれて初めて、Mac以外のPCを買うという現実に気づき、経験値の低さにちょっとビビる）

</div></details>

#### Ⅲ. ミッション終了までの流れ
1. ハードウェアの確保<font color="Crimson">（更新 ③</font><font color="DarkOrange"> ⑤</font><font color="SteelBlue"> ⑥</font>）
2. UbuntuインストールとNVIDIAのドライバー動作確認<font color="Crimson">（更新 ③）</font>
3. 基本設定とキーボード設定をMacぽく<font color="Crimson">（更新 ③<font color="DarkOrange"> ⑤</font>）</font>
4. 内蔵HDDのマウント（OS用SSDとData用HDDを分けて使いたい）<font color="Crimson">（更新 ③）</font>
5. 基本環境とソフトのインストール<font color="Crimson">（更新 ③</font><font color="SteelBlue"> ⑥）</font>
6. 開発系の基本ソフトのインストール<font color="Crimson">（<font color="Crimson">更新 ③</font><font color="Green"> ④</font>）
7. Docker（NVIDIA用）のインストール<font color="Crimson">（<font color="Crimson">更新 ③</font><font color="Green"> ④</font><font color="DarkOrange"> ⑤</font><font color="SteelBlue"> ⑥</font>）
8. Docker上に<font color="Crimson">NGCイメージから</font>【TensorFlow＋Keras】の環境を構築<font color="Crimson">（更新 ③）</font>
9. Docker上に【ROS2】の環境を構築<font color="Crimson">（一旦、保留 ③）</font>
10. <font color="DarkOrange">Docker上に【PyTorch】の環境を構築<font color="DarkOrange">（更新 ⑤）</font>


#### Ⅳ. ミッション開始
### <details><summary> 1. ハードウェアの確保<font color="Crimson">（更新 ③ </font><font color="DarkOrange"> ⑤</font> <font color="SteelBlue">⑥）</font></summary><div>
- 1.1. PC本体(DeepLeaningの初学者レベル用)
    - Mac以外のハードを購入したことがないので、「CDLE」Slackで相談して、オススメスペックに近いBTOのゲーミングPCをNetショップ購入することに決めました（ゲーミング用PCには必ずGPUが入っており、トータルコスパが良いとのアドバイスから）

| 項目         | 相談結果                           | 現実                       |
| ------------ | ---------------------------------- | -------------------------- |
| CPU          | Core i7 or i5 Gen10以上            | i5 Gen9                    |
| memory       | なるべく多く                       | 16GB                     |
| GPU          | GeForce GTX1600 SUPER 程度         | GeForce GTX1600 SUPER      |
| SSD (OS用)   | 250GB x2個 (UbuntuとWinのDualBoot) | 480GB x1個 (Ubuntuのみ)                |
| HDD (Data用) |  -                                 | 2TB                        |
- オススメと現実との違いは、「各ショップの基本モデルの違い」「予算」の折り合いの結果です。結局、13諭吉ぐらいの金額になりました

**【CDLEメンバーからの教え】**
**・DeepLeaning用のPCは「GPUやGPU上のメモリサイズを重視」と書いてあるが、実運用上では、前処理のCPUやメモリがボトルネックになる事も多いので、バランス良い構成が望ましい**

**・BTOPCは、CPU／メモリ／GPUは後からある程度は変更できるので、まずは予算に合わせて購入して、やりたい事にあっているかをトライ＆エラーをして構成を変えていくのが良い**

<font color="SteelBlue"> **【私の経験則】**
**機械学習に使うGPUは、GPU上のメモリ量が大事でした。画像系を実装するには、『12G』程度のメモリが無いとバッチサイズが増やす事ができず、精度が上がりません。スピードが遅くても、メモリが大きいGPUを購入する事をお勧めします**</font>

**【トラブル】**
購入から1ヶ月後、『マザーボードから一度メモリを抜かないと8割の確率で起動しない』現象が発生。購入したNetショップに相談したところ、

- 自費でPCを送り返す
- 実店舗に持ち込む

の、2択
運良く、近所に実店舗があったので、持ち込みして4日入院後、メモリ交換で退院
ついでに『ASUSのマーザーボード』のLED色による起動ステータスの切り分け法も教えてもらう
結構焦ったので、近くに実店舗があって、本当に助かりました。次もその店で買います

**【教訓】**
**・安さとスペックがBTOPCには重要だが、初心者はトラブル対応を考慮して購入先を選ぶべき**

- 1.2.入力系
    - 作業スペースが狭いので、全て無線で構築しました<font color="Crimson">　→　キーボードは有線に変更 ③</font>

- 1.2.1．PC側:Bluetooth USBドングル
    - Newiy Start製 Ver4.0アダプター: 1個  →  2個<font color="Crimson">　→　1個 ③</font>

        - Amazonの商品説明に「Linuxでも使える」とあったので、購入。確かに動いたが、1個でマウスとキーボードの相手はしんどいらしく時々マウスカーソルが飛ぶなど動作がおかしくなるので、追加購入して2個に変更（でも時々、マウスが重くなる。原因はPC側？）
        - <font color="Crimson">キーボードを有線式に変えたので、1個に減らしました。今にして思えば、2個にして効果があったのか不明です③</font>
        - <font color="SteelBlue">急にBluetoothが繋がらなくなり、ドングルを買い替えました。Linuxで動作保証のある『CSR V4.0』のICが搭載されているドングルを購入。問題なくドングルを認識しましたが、マウスとキーボードが認識されず、6回ほど再起動を繰り返した結果、どうにか接続しました。⑥</font>
        - <font color="SteelBlue">Bluetoothのドングルを認識して、マウスを繋ぎましたが、カーソルがスムーズに動きません。調べたところ、「USB3.1」ではうまく動かない事があるとの事。USB2.0のポートに差し替える事で正常動作しましたい。[【サポートブログ】USB 3.0の端子と2.4GHz帯の電波を利用する周辺機器について](https://blog.tsukumo.co.jp/namba/2018/12/Supportblog1812_03_USB3_Wireless.html)⑥</font>

- 1.2.2.マウス(?)
    - Apple:Magic TrackPad(初代) → LogiCool:M337
 
        - 入力系をMacBookに合わせたくて、Magic TrackPad(初代)をヤフオクでGet

        - **【トラブル】**	
            - 『fusuma』というとても良いソフトでマルチタッチは良い感じになったのですが、カーソル自体の動きが気持ち悪く、丸2日色々「ググる＋設定＋再起動」を繰り返したがいま一つなじまず、逆にストレスがつのるばかり。すっぱり諦めてロジクールの安価な『Blurtoothマウス』に購入
            - 意外とマウスのボタン（左右のスクロール／ナビゲーションボタン）がUbuntu上でもキーアサインされており、「もう少しボタンの多いマウス」にすればよかったと少し後悔

- 1.2.3.キーボード
    - Apple wireless keyboard(US)  →  <font color="Crimson">サンワサプライ SKB-E3U③</font>
  
        - Apple wireless keyboard(US) は、Apple:Magic TrackPad(初代)と並べて見栄えが良いので、ヤフオクでゲット。キーは馴染んだUSキー(昔のMacはJISキー自体がなかったので、未だにUSキーしか使えません)

        - **【トラブル】**
            - 比較的順調に動いていますが、時々（スリープ時／OSの設定を変えて再起動したとき）接続が切れます。切れたら、有線キーボードを繋いで『Bluetoothの接続設定』して再起動しないと使えません。~~結構困っているので、【買い換えるか？】を思案中（キータッチは良いのですが）~~
            - <font color="Crimson">あんまり接続切れが多いので、有線キーボードに変更しました。手頃な価格のUSB接続のUSキーボードを購入 ③</font>
            - <font color="DarkOrange">【Apple Wireless Keyboard】は、起動時に一度キーを叩いて、Keyboard右上のLEDがON／OFFするまで2秒ほど待てば、正しく接続することがわかった（以前は我慢が足りなかった）ので、【Apple Wireless Keyboard】を再接続 ⑤</font>

**【教訓】**
**・Apple製品はLinuxに繋いだだけでは、Apple製品と同等のTouch&Feelは簡単には得られない。<font color="Crimson">結局、全滅。ヤフオクの海に帰っていきました(涙)③</font>**
**・緊急用の有線のキーボードとマウスは必須。手の届く範囲に準備しましょう**

</div></details>

### <details><summary> 2. UbuntuインストールとNVIDIAのドライバー動作確認<font color="Crimson">（更新 ③）</font></summary></summary><div>
#### 2.1. Ubuntu20.04(日本語版)のインストールイメージの準備
 
＜参考＞
  [Ubuntu 20.04インストールしてからやること](https://ohmyenter.com/things-to-do-after-ubuntu-20-04-installation/)

- Ubuntuは[Ubuntu日本公式サイト](https://www.ubuntulinux.jp/download) の20.04のイメージファイルをダウンロードします
    
    - このあたり、詳しいページが多数ありますので、そちらに譲ります。各自のインストール環境にあわせて探してみてください
        - 私は購入したPCに『DVDドライブ』がオマケについていたので、イメージファイルをライブDVDに焼きました
        - ubuntuのイメージファイルをDVDにそのまま焼けば、完了です

#### 2.2. Ubuntu22.04のインストール
- インストールメディアを入れて、マザーボードのBIOSに従った方法で『起動ディスクを各インストールメディア』にして変更して起動すれば、インストールが開始されます
- </font><font color="SteelBlue">Ubuntu20.04をインストール後、Ubuntu22.04にアップグレードしました。⑥</font>

**【注意点】**

   - NVIDIAのGPUを追加している場合、以下の手順が必要です（私は、はまりました）
    - ブートメニューで「Ubuntu (safe graphics)」を選択して「Ubuntu」を起動（普通は「Ubuntu」を選択）

![IMG_3614.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106178/28acfe84-dd6d-3152-c9c0-ed4dd1a484f4.jpeg)

- インストーラの「アップデートと他のソフトウェア」で「グラフィックスと・・・」の項目をオンにしてから、インストールを続行

![IMG_3613.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106178/2684e146-5d2b-b643-8411-d1a6cbac3af6.jpeg)


＜参考＞
[Ubuntu 20.04 その25 - Ubuntu 20.04 LTSの既知の問題](https://kledgeb.blogspot.com/2020/04/ubuntu-2004-25-ubuntu-2004-lts.html)

- nvidiaのドライバーインストールの確認
        - 　```$ nvidia-smi```コマンドで以下の様な表示がでれば、nvidiaドライバーは動作しています

```shell-session:
$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.100      Driver Version: 440.100      CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 166...  Off  | 00000000:01:00.0  On |                  N/A |
| 42%   37C    P8     8W / 125W |    249MiB /  5936MiB |      3%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1127      G   /usr/lib/xorg/Xorg                            35MiB |
|    0      2006      G   /usr/lib/xorg/Xorg                            94MiB |
|    0      2202      G   /usr/bin/gnome-shell                          97MiB |
|    0      6565      G   /usr/lib/firefox/firefox                       2MiB |
|    0      7875      G   /usr/lib/firefox/firefox                       2MiB |
|    0     10070      G   /usr/lib/firefox/firefox                       2MiB |
+-----------------------------------------------------------------------------+
```

</div></details>

### <details><summary> 3. 基本設定とキーボード設定をMacぽく<font color="Crimson">（更新 ③<font color="DarkOrange"> ⑤</font>）</font></summary><div>

#### 3.1. キーボード設定：USキーボードに対応
- 下記のコマンドでキーボードとマッチングするまで試してみてください

```shell-session:
$ sudo dpkg-reconfigure keyboard-configuration
``` 

- 3.1.1. USキーボードで有ることを設定を書き込む

```shell-session:
$ sudo nano /usr/share/ibus/component/mozc.xml
<layout>us</layout>
```

#### 3.2. ホーム内のディレクトリを英語にする
- ターミナル上からアクセスする時、日本語だと面倒くさいので英語に戻します

```shell-session:
$ LANG=C xdg-user-dirs-gtk-update
```	

- 3.2.1. うまく行かない場合は、```~/.config/user-dirs.dirs``` を以下のように編集します

```shell-session:
$ sudo nano ~/.config/user-dirs.dirs
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
XDG_DESKTOP_DIR="$HOME/Desktop"
XDG_DOWNLOAD_DIR="$HOME/Downloads"
XDG_TEMPLATES_DIR="$HOME/Templates"
XDG_PUBLICSHARE_DIR="$HOME/Share"
XDG_DOCUMENTS_DIR="$HOME/Documents"
XDG_MUSIC_DIR="$HOME/Music"
XDG_PICTURES_DIR="$HOME/Pictures"
XDG_VIDEOS_DIR="$HOME/Videos"
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
```

- 3.2.2. 実際のフォルダをリネームします

```shell-session:
$ mv $HOME/デスクトップ $HOME/Desktop
$ mv $HOME/ダウンロード $HOME/Downloads
$ mv $HOME/テンプレート $HOME/Templates
$ mv $HOME/公開 $HOME/Share
$ mv $HOME/ドキュメント $HOME/Documents
$ mv $HOME/音楽 $HOME/Music
$ mv $HOME/画像 $HOME/Pictures
$ mv $HOME/ビデオ $HOME/Videos
```

- 3.2.3.ログインしなおすとOKです（時々、サイドバーの表示が英/和混合になるけど諦めました）

#### 3.3. キーアサインをMacに合わせる
- 3.3.1 『Caps lockキー』を『Ctrlキー』に変更する
    - 3.3.1.1.Gnome Tweaks をインストール
        - Ubuntu Softwareからインストールします／【Tweaks】がプログラム名
        - 【Tweaks】 > キーボードとマウス
        - ~~アクティビティ画面のショートカットを『左super』から『右super』へ（『左superキー』を開ける為）~~<font color="Crimson">(キーボードレイアウトが変わったので、削除 ③）</font>
            - 【Tweaks】 > キーボードとマウス > 追加のレイアウトオプション > Ctrl position ＞ 『Caps LockをControlとして扱う』を選択（『Caps lockキー』を『Ctrlキー』に変更）
    - 【再起動】して、正常に動作する事を確認してください
	
![Tweak.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106178/bb4134f9-f75a-770b-f0b7-1c5060f54ebc.png)

- <font color="Crimson">3.3.1.2.『左superキー』まわりを変更(キーボードレイアウトが変わったので、全面改訂 ③）</font>
    - キー配列を以下のように変更する
        - <font color="Crimson">『Winキー』　→　『左Altキー』</font>
        - <font color="Crimson">『左Altキー』　→　『左Ctrlキー』</font>
        - <font color="Crimson">『右Altキー』　→　『左super(Win)キー』</font>
        - <font color="Crimson">『Menuキー』　→　『右Altキー』</font>
![IMG_3625.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106178/40668a7e-23b2-e733-7b97-1a9d779fa64c.png)
  
<details><summary> <font color="Crimson">3.3.1.3.Plan A：xmodmapを変更してキーアサインを変える ③</font></summary><div>
    - キーアサインのバックアップを取っておく

```shell-session:
$ xmodmap -pke > ~/.Xmodmap_default
```

- <font color="Crimson">各キーのキー番号を探す ③</font>
    - 下記のコマンドを打つと四角い窓が開きますので、それが見えた状態で『キー入力』するとキー番号が表示されます（私の場合は、以下の通りでした）
        - <font color="Crimson">『Winキー』　→　133</font>
        - <font color="Crimson">『左Altキー』　→　64</font>
        - <font color="Crimson">『右Altキー』　→　108</font>
        - <font color="Crimson">『Menuキー』　→　135</font>

```shell-session:
$ xev | grep keycode
``` 
![キー入力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106178/b118278f-5d14-1a52-5663-16897b232d99.png)

- スクショは、『Returnキー』を押した時の表示です

[キーバインドの変更 Xmodmapの基本的な設定方法](https://qiita.com/macinjoke/items/746c0c0adb74cfdeb9e7)

- <font color="Crimson">新しく”~/.Xmodmap”ファイルを作って、下記の内容を書く。記載内容は各自のキーボードレイアウトに合わせる事(新しいキーアサインに対応③)</font>

```shell-session:
$ nano ~/.Xmodmap
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
clear control
clear mod1
clear mod4

! win -> Alt_L
keycode 133 = Alt_L

! Alt_L -> Control_L
keycode 64 = Control_L

! Alt_R -> Super_L
keycode 108 = Super_L

! Menu -> Alt_R
keycode 135 = Alt_R

add control = Control_L Control_R
add mod1 = Alt_L Alt_R
add mod4 = Super_L Super_R Super_L Hyper_L
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
```

- 設定を反映させて、動作を確認する

```shell-session:
$ xmodmap ~/.Xmodmap
```
  
- 間違ったら、バックアップファイルに戻す 

```shell-session:
$ xmodmap ~/.Xmodmap_default
```  
- 【再起動】して、設定したキーアサイン通りなら完了

- <font color="Crimson">3.3.1.3.1.再起動したら、キーバインドが消える場合 ③</font>
    - <font color="Crimson">.bashrcにスクリプトを書き込んで、Ubuntu起動時にターミナルが自動起動させる事で、.bashrcと一緒に.Xmodmapを読み込ませます（③ Kimuraさん、多謝）</font>
        - <font color="Crimson">起動時のスクリプトは、絶対パスを指定する事 ③</font>

    - <font color="Crimson">ターミナルが自動起動するスクリプトを書く ③ </font>

＜参考＞
[Ubuntu起動と同時に自動でターミナルを開く](https://qiita.com/dfukunaga/items/a59e5b18172b048190ec)

```shell-session:
$ nano ~/.config/autostart/gnome-terminal.desktop
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
[Desktop Entry]
Exec=gnome-terminal
Type=Application
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
``` 
- <font color="Crimson">.Xmodmapを読み込ませるスクリプトを.bashrcの末尾に追記します ③ </font>
    - <font color="Crimson">```sleep 7```は、7秒待ちのことです。この値が短いと正しくキーバインドが切り替わらないことがあったので、我慢できる限界の「7秒」にしました。各環境で値を調整してください ③ </font>

```shell-session:
$ nano ~/.bashrc
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
# キーボード配列変更
/bin/bash -c "sleep 7; /usr/bin/xmodmap /home/#USER/.Xmodmap"
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
``` 
- <font color="Crimson">【再起動】して、設定したキーアサイン通りなら完了 ③ </font>

</div></details>

<details><summary> <font color="Crimson">3.3.1.4.Plan B：xkbを変更してキーアサインを変える  ③</font></summary><div>

- <font color="Crimson">xkbmapの変更："xkb"でキーアサインを変える方が主流的な記事があったので、トライ ③</font>

＜参考＞
[xkbでキーバインドを変更する（Ubuntu）](https://honmushi.com/2019/01/18/ubuntu-xkb/)
[XKBによるHHKB (US) のためのキーマップ変更 (Ubuntu 18.04 LST)]()
[xkbでキーバインドを変更する](https://blog.cnu.jp/2014/05/12/use-xkb/)

- <font color="Crimson">~/.xkbの設定を確認 ③</font>

```shell-session:
$ setxkbmap -print
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
xkb_keymap {
	xkb_keycodes  { include "evdev+aliases(qwerty)"	};
	xkb_types     { include "complete"	};
	xkb_compat    { include "complete"	};
	xkb_symbols   { include "pc+us+us:2+inet(evdev)+ctrl(nocaps)"	};
	xkb_geometry  { include "pc(pc105)"	};
};
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
```
- <font color="Crimson">~/.xkb用のフォルダを作成し、ベースとなる設定ファイルを格納する ③</font>

```shell-session:
$ mkdir -p ~/.xkb/keymap ~/.xkb/symbols
$ setxkbmap -print > ~/.xkb/keymap/mykbd
```

- <font color="Crimson">変更するキーバインドを設定する ③</font>
    - <font color="Crimson">```/usr/share/X11/xkb/symbols/```内のファイルが変更するキーバインドの参考になります</font>

```shell-session:
$ sudo nano ~/.xkb/symbols/myswap  
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
partial modifier_keys
xkb_symbols "swapkeys" {
  replace key <LWIN> { [ Alt_L ] };
  replace key <LALT> { [ Control_L, Control_L  ] };
  replace key <RALT> { [ Super_L ] };
  replace key <MENU> { [ Alt_R ] };
  modifier_map Control { <LCTL>, <RCTL>, <LALT> };
  modifier_map Mod1 { <LWIN>, <MENU> };
  modifier_map Mod4 { <RALT> };
};
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
```

- <font color="Crimson">コピー済みのxkbの設定を参考に、mykbdファイルを作成します ③</font>
    - <font color="Crimson">```xkb_symbols```の内容に```myswap(swapkeys")```を追加しただけです</font>

```shell-session:
$ sudo nano ~/.xkb/symbols/myswap  
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
＜before＞
xkb_symbols   { include "pc+us+us:2+inet(evdev)+ctrl(nocaps)"	};

＜after＞
xkb_symbols   { include "pc+us+us:2+inet(evdev)+ctrl(nocaps)+myswap(swapkeys")" };
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
```
- <font color="Crimson">作成したキーマップがログイン時に読み込むように、 .bashrcにスクリプトを書き込む ③</font>
    - <font color="Crimson">Ubuntu起動時にターミナルが自動起動させる事で、 .bashrcと一緒に.Xmodmapを読み込ませます（③ Kimuraさん、多謝）</font>
    - <font color="Crimson">起動時のスクリプトは、絶対パスを指定する事</font>

- <font color="Crimson">ターミナルが自動起動するスクリプトを書く ③ </font>

＜参考＞
[Ubuntu起動と同時に自動でターミナルを開く](https://qiita.com/dfukunaga/items/a59e5b18172b048190ec)

```shell-session:
$ nano ~/.config/autostart/gnome-terminal.desktop
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
[Desktop Entry]
Exec=gnome-terminal
Type=Application
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
``` 
- <font color="Crimson">.xkbを読み込ませるスクリプトを.bashrcの末尾に追記します ③ </font>

```shell-session:
$ nano ~/.bashrc
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
# キーボード配列変更
sleep 2
xkbcomp -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY 2> /dev/null
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
``` 
- <font color="Crimson">【再起動】して、設定したキーアサイン通りなら完了 ③ </font>

</div></details>

- <font color="Crimson">【xmodmap】と、【xkb】どちらのPlanにするか？お試し期間中です</font>
    - <font color="Crimson">どっちも、時々スクリプトが空振りしてます"涙"③ </font>

<details><summary> <font color="DarkOrange">3.3.1.5.Plan C：xmodmapを変更して【Apple Wireless Keyboard】を復活させる ⑤</font></summary><div>

- <font color="DarkOrange">【Apple Wireless Keyboard】は、起動時に一度キーを叩いて、Keyboard右上のLEDがON／OFFするまで2秒ほど待てば、正しく接続することがわかった（以前は我慢が足りなかった）ので、【Apple Wireless Keyboard】を再接続 ⑤</font>
- <font color="DarkOrange">合わせて、キーアサイン』を変更</font>
    - <font color="DarkOrange">『左commandキー』を『左Ctrlキー』へ変更</font>
        - <font color="DarkOrange">『左commandキー』＋『C/X/Vキー』で【コピー／カット／ペースト】が可能</font>
        - <font color="DarkOrange">『左commandキー』＋『左Optionキー』＋『▲/▼キー』で【Workspaceの切り替え】が可能</font>
    - <font color="DarkOrange">『右commandキー』を『左Superキー』へ変更</font>
        - <font color="DarkOrange">『右command』で【Workspaceの一覧表示】が可能</font>
    - <font color="DarkOrange">以下は、［3.3.1.3.Plan A：xmodmapを変更してキーアサインを変える］を参考にしてください。⑤</font>
    - <font color="DarkOrange">『左commandキー』と『右commandキー』のキー番号を確認します（私の場合は、以下の通りでした）⑤</font>
        - <font color="DarkOrange">『右commandキー』　→　133</font>
        - <font color="DarkOrange">『右commandキー』　→　134</font>

    - <font color="DarkOrange">キーアサインのバックアップを取っておく</font>
 
```shell-session:
$ xmodmap -pke > ~/.Xmodmap_default
```
[キーバインドの変更 Xmodmapの基本的な設定方法](https://qiita.com/macinjoke/items/746c0c0adb74cfdeb9e7)

- <font color="DarkOrange">新しく”~/.Xmodmap”ファイルを作って、下記の内容を書く。記載内容は各自のキーボードレイアウトに合わせる事(以下は、Apple Wireless Keyboardへの私の変更内容です)</font>

```shell-session:
$ nano ~/.Xmodmap

clear control
clear mod4
		
! Command_L -> Control_L
keycode 133 = Control_L
			
! Super_R -> Super_L
keycode 134 = Super_L
		
add control = Control_L Control_R
add mod4 = Super_L Super_R Super_L Hyper_L

```

- <font color="DarkOrange">設定を反映させて、動作を確認する</font>

```shell-session:
$ xmodmap ~/.Xmodmap
```
  
- <font color="DarkOrange">間違ったら、バックアップファイルに戻す </font>

```shell-session:
$ xmodmap ~/.Xmodmap_default
```  
- <font color="DarkOrange">【再起動】して、設定したキーアサイン通りなら完了</font>
- <font color="DarkOrange">再起動したら、キーバインドが消える場合は、 「3.3.1.3.1.」を参照の事③</font>


- <font color="DarkOrange">これで、【Apple Wireless Keyboard】が復活！！</font>
</div></details>

- これで、キーボードの左半分にCtrlキーが、『３個（左Super／Caps Lock／本来のCtrlキー）』というゴージャスなキー配列になりました 
    - これで、『左altキー』+『c』でコピーができます

- 3.3.3 『左Altキー』+『s』で『半角英語』に変換
    - mozcの設定：GUIツールのインストール
    - 標準では『mozc』のGUIツールがインストールされていないので、インストールします
        - <font color="Crimson">標準でインストールされているバージョンもあるようです。その時はスルーしてください ③ </font>

```shell-session:
$ sudo apt install mozc-utils-gui
```
- 設定 ＞ 地域と言語 ＞ 入力ソース ＞ Mozcの歯車アイコン ＞ キー設定の選択 ＞ ことえりを選択

- これだけで、『Option(Start)キー』+『s／a／c／x／z』で『半角カタカナ／半角英語／ひらがな／全角カタカナ／全角英語』という慣れたことえり風になります。Mozc、エライ

- 3.3.4.『左Superキー』＋『Spaceキー』で英／和の入力ソース切替（USキーボード用）
    - 入力ソース切り替えショートカットキーの変更（USキーボード対応）
        - 設定 ＞ キーボード・ショートカット ＞ タイピング~~ウィンドウ~~の「前の入力ソースへ切り替える」「次の入力ソースへ切り替える」を共に【無効】に

	- Mozcのプロパティウィンドウ ＞ キー設定の選択 ＞ 編集 ＞ Mozcキー設定画面 ＞『Hankaku/Zenkaku』入力キー（４箇所）＞【Ctrl+Space】に変更

- これで、『左Super(Ctrl)キー』＋『Spaceキー』で英／和の切替ができます

</div></details>


### <details><summary> 4. 内蔵HDDのマウント（OS用SSDとData用HDDを分けて使いたい）<font color="Crimson">（更新 ③）</font></summary></summary><div>
＜参考＞
[2TB以上のHDDをCentOSにマウントする方法](https://qiita.com/kubor/items/0a30c03a70a10c099df5)

- HDDを探す

```shell-session:
$ sudo parted -l
```
- <font color="Crimson">表示されたディスクのアドレスを記録しておく ③</font>

```shell-session:
ディスク /dev/sdb: 2000GB
```

- 2TBを超えているので「GPT」でディスクラベルをつける

```shell-session:
$ sudo parted /dev/sdb
(parted) mklabel gpt
(parted) p
```
- 全容量をext4、１パーティションとします

```shell-session:
(parted) mkpart primary ext4 0% 100%
(parted) p
```

- パーティションができたので、partedを終了させます

```shell-session:
(parted) quit
```
- 「ext4」でフォーマットする

```shell-session:
$ sudo mkfs.ext4 /dev/sdb1
```

- マウントポイントを作成して、HDDをマウントする。<font color="Crimson">Dockerから楽にアクセスしたかったので、userフォルダ内にマウントポイントを変更 ③</font>（マウントポイントって、単なるディレクトリでした。但し、この場所で良かったのかは、不明だったので、chmod777はやっておきました)
```shell-session:
$ sudo chmod 777 sda
$ sudo chmod 777 sda1
```
```shell-session:
$ sudo mkdir /home/#USER/Hdd_2nd
$ sudo mount -t ext4 /dev/sdb1 /home/#USER/Hdd_2nd
$ sudo mount
```
- 自動マウントの設定(/etc/fstab に情報を書き込む)

```shell-session:
$ sudo nano /etc/fstab
```
- 開いたファイルに以下の行を追加（文字間はSpaceではなく、【tab】。アクセス先の末尾には「/」は不要。ココでハマりました）

```shell-session:
/dev/sdb1       /home/#USER/Hdd_2nd   ext4    defaults        0       0
```

- <font color="Crimson">再起動して、#userフォルダ内に”Hdd_2nd”がマウントされていれば、成功です ③</font>

</div></details>

### <details><summary> 5. 基本環境とソフトのインストール<font color="Crimson">（更新 ③ <font color="SteelBlue">⑥）</font></summary><div>
＜参考＞
[Ubuntu 20.04インストールしてからやること](https://ohmyenter.com/things-to-do-after-ubuntu-20-04-installation/)

#### 5.1. 不要なソフトのアンインストール
- Ubuntu Software ＞ インストール済み ＞ 不要なソフトを『削除』する

#### 5.2. CopyQのインストール（コピー／ペーストの強化ソフト）：必要に応じて

```shell-session:
$ sudo apt install copyq
```

- 基本設定
    - 自動的に起動する オンに
    - グローバルショートカット マウスカーソルの下にメインウィンドウを表示をAlt+Ctrl+Vに

#### 5.3. dumpのインストール：バックアップソフト（システムのフルバックアップ用）：必要に応じて

```shell-session:
$ sudo apt install dump
```

- 実際のバックアップコマンド（データ用HDDにバックアップしてみました）<font color="Crimson">コマンドに誤記（保存元と保存先が逆）があったので修正 ③</font>
- <font color="SteelBlue"> 事前に/home/#USER/Hdd_2nd/Sys_Backup まではフォルダを作成すること⑥</font>

```shell-session:
$ sudo dump -0 -u -j -f /home/#USER/Hdd_2nd/Sys_Backup/backup_2021_04_04.dump /dev/sda2

```
- <font color="Crimson">実行して、最終的に以下の表示が出れば、バックアップ完了 ③</font>

```shell-session:
DUMP: DUMP IS DONE
```

#### 5.4. Google Chromeインストール(Google翻訳+Google Colabの専用ブラウザ）：必要に応じて<font color="SteelBlue">　⑥：コマンドが通らなくなっていたので修正 </font>
<font color="SteelBlue">5.4.1. [公式サイト](https://www.google.co.jp/chrome/)から「64 ビット .deb（Debian/Ubuntu用）」 を選択し、「同意してインストール」を選択します。</font>
![Screenshot 2023-08-27 at 12-11-17 Google Chrome - Google の高速で安全なブラウザをダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106178/3ac21d8e-8b2f-a7e7-6107-b3795e32bd6c.png)

<font color="SteelBlue">5.4.2. [ダウンロード]フォルダ から ダウンロードした .debファイルを右クリックして、「別のアプリケーションで開く」を選択します。</font>
<font color="SteelBlue">5.4.3. ソフトウェアのインストール から「 選択 」をクリックします。</font>
<font color="SteelBlue">5.4.4.「インストール」をクリックして、パスワードを入力します。 </font>

![Screenshot from 2023-08-27 12-48-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106178/95a80a87-343e-d310-0c49-f3dbe6b1d2d0.png)

<font color="SteelBlue">5.4.5.「インストール」が完了するので、ウィンドウを閉じます。 </font>

![Screenshot from 2023-08-27 12-50-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106178/e0f254e8-89fe-838c-6c29-a56339455115.png)

＜参考＞
[【図解】Ubuntu Desktop 22.04 LTS：Google Chromeインストール手順](https://inab818.site/ubuntu-desktop/22-04-lts-google-chrome-download-install/)
	
#### 5.5. Thunderbirdの設定

- iCloudのメールアカウントを設定するには、AppleIDホームページから「特別なパスワード」の取得が必要です
- それ以外は、普通です

#### 5.6. Mozcの辞書を強化
＜参考＞
[Mozc(Google IME)でカナ英・和英変換](http://blog.blueblack.net/item_442)
	
- 上記を参考に、「カナ英辞書v2.txt」と「和英辞書.txt」、「Google日本語入力強化辞書.txt」を「Mozc→辞書ツール」で「新規辞書にインポート」します（間違って、「選択した辞書にインポート」すると面倒くさいことになりました。ご注意ください）
- 辞書の優先順位が気になる方は、参考ページの「ユーザー辞書の優先回避」を参考にしてください

#### 5.7. ウィルスソフトを入れておく（メインPCとのやり取り用）
- ”Ubuntu Software” で”ClamTk”をインストール

#### 5.8. メインPCとのデータのやりとり
- 色々手法があるようですが、システム改変が不要なブラウザ経由でやり取りする以下のサービスが無難です
    - OneDrive
    - GoogleDrive
	
#### <font color="Crimson">5.9. Dock にゴミ箱を表示する ③</font>

```shell-session:
$ gsettings set org.gnome.shell.extensions.dash-to-dock show-trash true 
```

#### <font color="Crimson">5.10. フォント（沼ですので、趣味でどうぞ） ③</font>

- <font color="Crimson">標準フォントにTakaoフォントのインストール③</font>
    - <font color="Crimson">標準フォントの「Noto Sans CJK Regular」はアジア圏用なので、少し字体が日本語らしくない箇所があるそうです。気分の問題ですが、Ubuntu 16.04 の日本語環境の標準となっていたTakaoフォントをインストールします ③</font>

```shell-session:
$ sudo apt install fonts-takao
$ sudo fc-cache -fv
```

- <font color="Crimson">プログラミング用に白源(Hakugen)フォントのインストール（色々いれましたが、私にはこれが一番シックリきました） ③</font>

    - [プログラミングフォント 白源 (はくげん／HackGen)](https://github.com/yuru7/HackGen/releases)

- <font color="Crimson">上記のサイトから"HackGen_ヴァージョン.zip"をダウンロードし、フォルダ内に｢展開」して、保存</font>
- <font color="Crimson">ターミナルを立ち上げて、HackGenを展開した直下のフォルダに移動して以下のコマンドを実行</font>
- <font color="SteelBlue">[白源(HackGen)フォントをUbuntuにインストールする](https://zenn.dev/hideoka/articles/b6f86c8974a806)を参考にして、コマンドを入力 ⑥ </font>

```shell-session:
$ cp -r HackGen展開フォルダ ~/.local/share/fonts #現在のユーザーにインストール 
$ fc-cache -vf #キャッシュを更新して、再起動 
```
- <font color="Crimson">終わったら、Zipファイルと展開したフォルダを削除</font>
- <font color="Crimson">Tweaksの「フォント」で使用するフォントを設定</font>

![Screenshot from 2021-04-08 19-21-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106178/c03747e2-9eb2-269f-ac24-db0881d1732e.png)

#### <font color="Crimson">5.11. 見た目も個性的に（ここも沼ですので、趣味でどうぞ） ③</font>
- <font color="Crimson">サンプル：Papirusのインストール：Tweaksがインストール済みの前提です</font>

```shell-session:
$ sudo add-apt-repository ppa:papirus/papirus
$ sudo apt-get update
$ sudo apt-get install papirus-icon-theme
```

- <font color="Crimson">Tweaksの「外観」で使用するアイコンを設定します（スクショのアイコンは変更済みです）</font>
![Screenshot from 2021-04-11 13-31-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106178/2e96f35b-0577-0167-9f47-405e780b7084.png)


</div></details>


### <details><summary> 6. 開発系の基本ソフトのインストール（<font color="Crimson">更新 ③</font><font color="Green"> ④</font><font color="SteelBlue"> ⑥</font>）</summary><div>
#### 6.1 シェルのマニュアルの内容を日本語に：英語が苦手な方
- シェルの環境変数LANGが「ja_JP.UTF-8」で有ることを確認

```shell-session:
$ echo $LANG
```
- 違っていたら、変更

```shell-session:
$ export LANG=ja_JP.utf8
```

- 変更した内容を再確認

```shell-session:
$ echo $LANG
```

- 日本語のマニュアルをインストール

```shell-session:
$ sudo apt-get install manpages-ja
```

- 英語に戻したいときは、

```shell-session:
$ export LANG=en_US
```

#### 6.2 fishシェルとfisherのインストール：好きな人だけ
- 使いやすいと評判のシェルを入れてみました
    - <font color="Crimson">文字化けしない様にpowerline fontをインストール ③</font>

```shell-session:
$ sudo apt-add-repository ppa:fish-shell/release-3
$ sudo apt-get update
$ sudo apt-get install -y fish

$ sudo apt install curl　#curlがインストール済みなら不要
$ curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish
$ fish /fishを起動
$ fish > fisher -v #fisherのインストール確認
  fisher, version 4.3.0
$ fish > fisher install oh-my-fish/theme-bobthefish #テーマのインストール
$ fish > exit #通常のShellに戻る
```

- PowerLineに対応したフォントのインストール
    - fishシェルではフォントによって文字化けor文字ズレするらしいので入れます
    - 下記の"fonts-powerline"以外に"Cica"とかおすすめですが、私は"白源"を流用するのでインストールしていません

```shell-session:
$ sudo apt-get install fonts-powerline #powerline fontをインストール
```
- <先人からの教え>
    - ログインシェルはbashから変更しない事
    - fishをログインシェルに設定していません。terminator専用にしました

#### 6.3 terminatorインストール：好きな人だけ
- ROSでシェルを複数開けるので、入れておきます

```shell-session:
$ sudo apt install terminator
```
- 起動してします

```shell-session:
$ terminator
```
- ターミナル内で右クリックして『設定』します：以下は、お好みで設定します
    - 「プロファイル＞default＞背景＞背景」で背景を透過：0.80
    - 「プロファイル＞default＞コマンド」で、［ログイン・シェルではなく、カスタムコマンドを実行］にチェックを入れて ［/usr/bin/fish］ を入力
    - 「プロファイル＞一般＞Font」にてフォントを「○○○ for Powerline」等のPowerlineフォントに変更


#### 6.4. gitインストール：必要な人だけ
- 開発（特にROS）には必須ですが、必要になった時に入れましょう

```shell-session:
$ sudo apt install git
```

- 最低限の設定はしておきます

```shell-session:
$ git config --global user.name ユーザー名
$ git config --global user.email メールアドレス
$ git config --global core.editor nvim
```

- githubに公開鍵登録
    - gitプロトコル使う場合は鍵認証が便利です

```shell-session:
$ sudo apt install xclip 
$ bash
$ ssh-keygen -t rsa -b 4096 -C メールアドレス
$ #〜パスフレーズ使わない人はエンター連打〜
$ eval "$(ssh-agent -s)"
$ ssh-add ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub | xclip -selection c #xclipコマンドでクリップボードに生成されたSSH Keyがコピーされる
$ # githubのSettingsページの[SSH and GPG Keys]からSSH KEYを登録する
$ # xclipコマンドでクリップボードにコピーされた公開鍵をペーストする
```

#### 6.5. やっぱり、DeelL翻訳がUbuntuでも気軽に使いたい：必要に応じて
＜参考＞
[LinuxでDeepL翻訳(masan4444さん、グッジョブ！)](https://qiita.com/masan4444/items/030080c74b53a771c132)
    - Scriptはフルパスで書くことと記載がありますので、このソフトのフルパスは『sh /home/ユーザー名/deepl-clip/app.sh』となります
    - 私はScriptの起動を「~~Ctrl+B~~<font color="Crimson">Ctrl+Alt+C</font>」としたので、「Ctrl+C」+「<font color="Crimson">Ctrl+Alt+C</font>」でブラウザ上にDeepL翻訳の結果が表示されます。（<font color="Crimson">「Ctrl+B」だと、［TMUX］使用時にコマンドと干渉するので、キーアサインを変更</font>）

#### 6.6. Visual Studio Codeをインストール：オススメ
- Ubuntu上でのProgramEditorのデファクトスタンダード（だそうです）
    - 機能が多いので、慣れるために会社のWindowsと家のMacのEditorをVS Code に統一しましょう

    - [ダウンロードページ](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)からLinux版をダウンロードして、インストール

    - 設定
        - PATHが通っているか？
            - code -v
            - バージョンがでたらOK
        - PATHが通っていなかったら、
            - ［Command］＋［Shift］＋［P］キーを入力して、「コマンドパレット」を表示したら、・Shell Command: Install 'code' command in PATH）

    - 使いやすくする
        - 画面左のExtensionをクリックして、MARKETPLACEを開く
            - Remote Development　をインストール：Docker用
            - Docker　をインストール：Docker用
        - フォントの変更
            - 「ファイル＞ユーザー設定＞設定＞「設定の検索」を開き、「Font-Family」を検索する
                - お気に入りのPowerLineフォントを「Font-Family」リストの左端に記載する
                    - お気に入りの和英フォント1つだけでも無問題
    - 日本語化する
        - ＜参考＞
        - [Visual Studio Codeで日本語化する方法Windows](https://qiita.com/nanamesincos/items/5c48ff88a4eeef0a8631)

    - Visual Studio Codeを再起動

#### 6.7. 一区切りついたので、システムのバックアップを行う：必要な人だけ

- バックアップを行う<font color="Crimson">コマンドに誤記（保存元と保存先が逆）があったので修正 ③</font>

```shell-session:
$ sudo dump -0 -u -j -f /home/#USER/Hdd_2nd/Sys_Backup/backup_2021_04_25.dump /dev/sda2
```
(バックアップ元は尾番の数字(/dev/sda2の2)まで記載すること)

#### <font color="Green"> 6.8. ターミナル用のエディタをインストールする ④</font>
- <font color="Green"> "Vim"や"Emac"等、試してみましたが、初心者に優しい"nano"でも今一つ。全エディタともキーアサインが特殊すぎて、Ubuntuに戻った時に頭と手が切り替わりません</font>
- <font color="Green"> Ubuntuのキーアサインを「Mac」に寄せたので、ターミナル用エディタも寄せたい。調べてみたところ、"Micro"というエディタがDesktopのキーアサインに近いとの記事がありましたので、インストールしてみます</font>

<font color="Green"> ＜参考＞</font>
[Linux初心者の悩みを解消！「micro」を使って簡単ファイル編集](https://linuxfan.info/micro)
[Micro](https://micro-editor.github.io/)<font color="SteelBlue"> のホームページから「ダウンロード」して、ファイルを右クリックから「別のアプリケーションで開く」「ソフトウェアのインストール」の順番でインストールする ⑥ </font>

#### <font color="Green"> 6.9. 温度表示用のソフトをインストール ④</font>
- <font color="Green"> そろそろ暖かくなってきて、ファンの音が気になってきたので、温度表示用のソフトウェアをインストールします</font>
- <font color="Green"> CUIとGUIの両方で使えて、ディスクの温度もわかる"psensor"というソフトを入れてみました</font>
<font color="SteelBlue"> GUIでのみ使用するなら、『Ubuntu Software』を立ち上げて、【psensor】で検索してインストールする ⑥</font>

```shell-session:
$ sudo apt install lm-sensors hddtemp # 依存関係のあるソフトを事前にインストール
$ sudo apt install psensor
$ sudo sensors-detect # Hardwareの検出（結構な数を検出先を聞いてきますし、検出完了まで時間が掛かるものがあります。気長に待ちましょう）
```
- <font color="Green"> CUIでの確認</font>

```shell-session:
$ sudo sensors #ターミナルでの温度表示

coretemp-isa-0000
Adapter: ISA adapter
Package id 0:  +58.0°C  (high = +84.0°C, crit = +100.0°C)
Core 0:        +58.0°C  (high = +84.0°C, crit = +100.0°C)
Core 1:        +48.0°C  (high = +84.0°C, crit = +100.0°C)
Core 2:        +49.0°C  (high = +84.0°C, crit = +100.0°C)
Core 3:        +49.0°C  (high = +84.0°C, crit = +100.0°C)
Core 4:        +51.0°C  (high = +84.0°C, crit = +100.0°C)
Core 5:        +49.0°C  (high = +84.0°C, crit = +100.0°C)

acpitz-acpi-0
Adapter: ACPI interface
temp1:        +27.8°C  (crit = +119.0°C)

iwlwifi_1-virtual-0
Adapter: Virtual device
temp1:        +34.0°C  
```
- <font color="Green"> GUIでの確認</font>
    - <font color="Green">"アプリケーションボタン（9個の点）"をクリックして、検索ウィンドウに「psensor」と入力して、表示されたアイコンをクリックするとソフトが立ち上がります</font>
    - <font color="Green">起動時はグラフが表示されません。グラフは、画面の左端を左にドラッグすると出てきます</font>
![Screenshot from 2021-05-16 13-57-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106178/d93a90c7-f451-4c28-4789-71b35f3a7272.png)

#### <font color="DarkOrange"> 6.10. Screenshot用のソフト【Flameshot】をインストール ⑤</font>
- <font color="DarkOrange">『Ubuntu Software』を立ち上げて、【Flameshot】で検索してインストールする</font>
- <font color="DarkOrange">＜参考＞</font>
[NVIDIA Docker って今どうなってるの？](https://medium.com/nvidiajapan/nvidia-docker-%E3%81%A3%E3%81%A6%E4%BB%8A%E3%81%A9%E3%81%86%E3%81%AA%E3%81%A3%E3%81%A6%E3%82%8B%E3%81%AE-20-09-%E7%89%88-558fae883f44)

</div></details>

### <details><summary> 7. Docker（NVIDIA用）のインストール（<font color="Crimson">更新 ③</font><font color="Green"> ④</font><font color="DarkOrange"> ⑤</font><font color="SteelBlue"> ⑥</font>）</summary></summary><div>

<details><summary> <font color="Crimson">7.1.Plan A：NVIDIA推奨版 ③</font><font color="SteelBlue"> 以下、22.04で再トライ ⑥</font></summary><div>
 <font color="Crimson">NVIDIAの佐々木さんのアドバイスで新規追加</font>
 <font color="Crimson">＜参考＞</font>
[NVIDIA Docker って今どうなってるの？ (20.09 版)](https://medium.com/nvidiajapan/nvidia-docker-って今どうなってるの-20-09-版-558fae883f44)

- <font color="Crimson">7.1.1 NVIDIA ドライバのインストール</font>

 <font color="Crimson">＜参考＞</font>
[CUDA ToolkitのWeb サイト](https://developer.nvidia.com/cuda-downloads?target_os=Linux)

- <font color="Crimson">上記のサイトで自分の環境をセレクトすると、コマンドが発行されます（下記は私の設定と発行された結果です。必ずサイトから最新のコマンドを発行してください）</font>

![Screenshot from 2023-10-22 18-38-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106178/9315d7b9-766f-50b0-9628-8601e0122dbf.png)

```shell-session:
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-ubuntu2204.pin
$ sudo mv cuda-ubuntu2204.pin /etc/apt/preferences.d/cuda-repository-pin-600
$ wget https://developer.download.nvidia.com/compute/cuda/12.3.0/local_installers/cuda-repo-ubuntu2204-12-3-local_12.3.0-545.23.06-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu2204-12-3-local_12.3.0-545.23.06-1_amd64.deb
$ sudo cp /var/cuda-repo-ubuntu2204-12-3-local/cuda-*-keyring.gpg /usr/share/keyrings/
$ sudo apt-get update
$ sudo apt-get -y install cuda-toolkit-12-3
```
- <font color="Crimson">最後の行を```$ sudo apt-get install -y cuda-drivers``` に置き換えれば、最新のドライバだけがインストールされます</font>
- <font color="SteelBlue"> インストールが終わったら、一旦再起動 ⑥</font>

- <font color="Crimson">```$ nvidia-smi``` でステータスを確認すると2.2．の時よりドライバーのバージョンなどが上がっていました</font>

```shell-session:
$ nvidia-smi       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.39       Driver Version: 460.39       CUDA Version: 11.2     |
|-------------------------------+----------------------+----------------------+
```
- <font color="Crimson">この手順だと「nouveau」を手動で止める手間が不要だそうです</font>

- <font color="Crimson">7.1.2 Dockerのインストール</font>
    - <font color="Crimson">公式の便利Scriptが簡単そうだが"Using these scripts is not recommended for production environments"と書いてあるのに入れる勇気は無いので、以前失敗した通常インストールを再トライ</font>

 <font color="Crimson">＜参考＞</font>
  [Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/#install-using-the-convenience-script)

- <font color="Crimson">上記サイトの順番にインストールを行う(最新のサイト情報に従ってください)
    - <font color="Crimson">新規なので、アンインストールは不要

- <font color="Crimson">aptリポジトリを使用してインストールします</font>
- <font color="SteelBlue"> 新コマンドでインストール ⑥</font>

```shell-session:
# Add Docker's official GPG key:
$ sudo apt-get update
$ sudo apt-get install ca-certificates curl gnupg
$ sudo install -m 0755 -d /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Add the repository to Apt sources:
$ echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt-get update
```
- <font color="SteelBlue"> 最新パッケージのDockerパッケージをインストール ⑥</font>

```shell-session:
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

- <font color="SteelBlue"> Docker エンジンのインストールが成功したことを確認する ⑥</font>

```shell-session:
$ sudo docker run hello-world
```
- <font color="SteelBlue"> 上記のコマンドを走らせると、情報メッセージが表示されます。その中に以下の文言があれば成功です ⑥</font>

```shell-session:
Hello from Docker!
This message shows that your installation appears to be working correctly.
```
- <font color="Crimson">下記のコマンドを走らせると、sudo なしにDockerコマンドを実行できますが、それ以外にDockerコマンドで発生していたパーミッションエラーが発生しなくなりました！</font>

```shell-session:
$ sudo usermod -aG docker $USER
```

- <font color="Crimson">7.1.3 nvidia-docker2パッケージのインストール</font>

 <font color="Crimson">＜参考＞</font>
  [NVIDIA Container Toolkit:Installation Guide](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#supported-platforms)

- <font color="Crimson">上記サイトの順番にインストールを行う(最新のサイト情報に従ってください)</font> 

- <font color="SteelBlue"> Aptインストールするためのリポジトリーを設定する ⑥</font>

```shell-session:
$ curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list \
  && \
    sudo apt-get update
```
- <font color="SteelBlue"> インストール ⑥</font>

```shell-session:
$ sudo apt-get install -y nvidia-container-toolkit
```
- <font color="SteelBlue"> Docker の構成 ⑥</font>
- <font color="SteelBlue"> Dockerランタイムを構成 ⑥</font>
```shell-session:
$ sudo nvidia-ctk runtime configure --runtime=docker
```
- <font color="SteelBlue"> Docker デーモンを再起動 ⑥</font>
```shell-session:
$ sudo systemctl restart docker
```


- <font color="SteelBlue"> 動作確認 ⑥</font>

```shell-session:
$ sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi
# 以下の表示が出たら、成功
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 545.23.06              Driver Version: 545.23.06    CUDA Version: 12.3     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
```

- <font color="Crimson">後片付け</font>

```shell-session:
$ docker container prune # コンテナの全削除
$ docker image ls # イメージの表示
$ docker image rm  hello-world # Hello-worldした時のイメージを削除
$ docker image rm  2ec708416bb8 # nvidia/cudaは素直に消えてくれなかったので"IMAGE ID"でイメージを削除
```
- <font color="Crimson">無事にインストールできた様です</font>

</div></details>

<details><summary> <font color="Crimson">7.2.Plan B：2020年９月の実績あり版 ③</font></summary><div>
  ＜参考＞
  [DockerでのディープラーニングGPU学習環境構築方法](https://qiita.com/karaage0703/items/e79a8ad2f57abc6872aa)

- <font color="Crimson">3版（2021年4月）改版時は［7.2.］の再チェックを行っていません</font>

- 7.2.1. Docker-GPUの設定
- ~~7.2.1.1 セキュアブートの無効化~~
    - ~~Docker上でnvidia-smi コマンドが上手く通らないそうなので、必ず実施する事~~
    - ~~私の環境では、nvidia-smi コマンドは上手く通ったが、不安なのでちゃんと「無効化」する~~
    - ~~BIOSで変更します（ASUSのマザーボードは「セキュアブートキーの削除」で無効化表示になった）~~
        - <font color="Crimson"> 「セキュアブートの無効化は不要」とのアドバイスで削除 ③</font>

- 7.2.1.2 nouveauの停止確認
    - インストール時にGPUの設定時に止まっているはずなので、確認します

```shell-session:
$ lsmod | grep -i nouveau
```

- 何も表示がでなければOK

- 7.2.1.3 NVIDIAドライバーの更新
    - ソフトウェアとアップデート ＞ 追加のドライバーから（プロプライエタリ, 検証済み）のドライバーを選んで、【再起動】してください
![追加のドライバー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106178/737f9f29-62e2-d4a6-1007-020ec1a9d48e.png)
**【トラブル】**
「追加のドライバー」で（プロプライエタリ, 検証済)のドライバーを選択してインストールすると、

```shell-session:
$ nvidia-smi
$ Failed to initialize NVML: Driver/library version mismatch
```

と表示されました（本来、7.3.のGPUステータスが表示されるのが正しい）

コマンド入力でもインストールしても状況は変わらず

```shell-session:
$ sudo ubuntu-drivers autoinstall
```

- （プロプライエタリ, 検証なし)のドライバーだと正しく```$ nvidia-smi```コマンドの結果が（多分）正しく出るので、しばらくはこのままとします
	
- NVIDIAのホームページにはもう少し新しいドライバーがあるが、自分で入れるとハマる場合も多い様なので、ひとまずUbuntuさんの『2番めにオススメ』のドライバーで【良し】とします

- 7.2.2. nvidia-cuda-toolkit のインストール
    - NVIDIA社製GPUカードを汎用的な数値計算目的で利用したい場合に必要となるソフトウェアです
        - <font color=“DarkRed”>「NVIDIA Docker使うなら、NVIDIAのドライバさえ入れれば、CUDAもcuDNNもいれなくてよいです。NVIDIAのドライバが対応している範囲で好きなイメージ使えばよいです」 ①</font>

```shell-session:
$ sudo apt install nvidia-cuda-toolkit
```

- 7.2.3. Dockerのインストール
    - 正式版は手順が煩雑で、私も一度しくじったので、【からあげさん】の、[DockerでのディープラーニングGPU学習環境構築方法](https://qiita.com/karaage0703/items/e79a8ad2f57abc6872aa)に記載されているスクリプトを使わせてもらいます（からあげさん、多謝）

```shell-session:
$ sudo apt install -y curl（インストール済みなら不要）
$ curl -s https://raw.githubusercontent.com/karaage0703/ubuntu-setup/master/install-docker.sh | /bin/bash
```

- 【再起動】してください
- Dockerのインストール確認

```shell-session:
$ sudo docker run hello-world
```
- エラーがでなければOKです

- 後片付け

```shell-session:
$ docker container prune
$ docker image rm hello-world:latest
```

- 7.2.4. NVIDIA Container Toolkitのインストール
    - Dockerコンテナからホスト上のGPUを使用するためのソフトです
    - これも、『からあげさん』のスクリプトを使わせてもらいます（からあげさん、再多謝）

```shell-session:
$ curl -s https://raw.githubusercontent.com/karaage0703/ubuntu-setup/master/install-nvidia-container-toolkit.sh | /bin/bash
```

- 起動確認

```shell-session:
$ docker run --gpus all --rm nvidia/cuda nvidia-smi
```
- 何故かエラーが出るけど、無視 （からあげさんも無視してたし（笑））

</div></details>

- 7.3. Docker上でNVIDIA GPUの動作確認
    - <font color="Crimson">あえて、</font>TensorFlow公式のDockerイメージをrunする

```shell-session:
$ docker run --gpus all -it --rm --name tensorflow-gpu -p 8888:8888 tensorflow/tensorflow:latest-py3-jupyter bash
# （-p 8888:8888 は、jupyter notebookのポート用）
```

- ```$ nvidia-smi```コマンドで以下の表示がでれば、Docker上でGPUが動作しています

```shell-session:
$ nvidia-smi

+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 545.23.06              Driver Version: 545.23.06    CUDA Version: 12.3     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce GTX 1660 ...    On  | 00000000:01:00.0  On |                  N/A |
| 41%   31C    P8              12W / 125W |    187MiB /  6144MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

```
**【注意】**

- Docker上で```$ nvidia-smi```コマンドしても、プロセスの詳細が表示されません。これは仕様のようです
    - StackOverflowで質問したら、【You will not be able to see, due to driver not being aware of PID namespace.(DeepL翻訳：ドライバがPIDネームスペースを認識していないため、見ることができません)】と回答がありました

- この状態からJupyterNotebookにアクセスできます

```shell-session:
$ jupyter notebook
# もしくは
$ jupyter notebook --port 8888 --ip=0.0.0.0 --allow-root
```
- jupyter notebookが起動し、ターミナル上にアドレスが表示されます

```shell-session:
http://127.0.0.1:8888/?token=xxxxxxxxxxxxxx`
```
- アドレスを右クリックして、『アドレスを開く』を選択すると、ブラウザが開き、「Jupyter Notebook」が起動します
- 「New」から「Python3」を選択します
- 以下のコマンド実行して、GPUが表示されたらDocker上の「Jupyter Notebook」でGPUが認識されています

 ```python:
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
```
![Screenshot from 2021-04-13 19-09-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106178/93f42f60-6423-3c95-3536-0d1ca6dbc07d.png)


- 確認できたら、ブラウザの「Logout」をクリックして、"Jupyter Notebook"を止めます
- ブラウザを閉じで、以下の手順で"Jupyter Notebook"と"Docker"を終了させます

```shell-session:
# Ctrl+C："Jupyter Notebook"の動作を止める
$ exit # Dockerを止めて、通常のターミナルに戻る
```

- 7.4. お試しで走らせたDockerのcontainerとimageの削除

```shell-session:
$ docker container prune
$ docker image rm tensorflow/tensorflow:latest-py3-jupyter bash
```

- 7.5. Dockerのお勉強：必要な人だけ
    - 後々、Dockerの仕組みやコマンドは一通り知っている方が楽なので、この辺で少し勉強しておくと良いと思います
    - Dockerのインストールまでは終わっているので、それ以降を学べばOKです
    - 私は、Udemyの講座を（例の）セールで買いました
        - [Linuxコマンドから始めるDocker　～　BE A FIRST PENGUIN AND GROW AS WHALE](https://www.udemy.com/course/linuxdocker-be-a-first-penguin-and-grow-as-whale/)
            - この講座、「一日で終わるボリューム」と「パワポの資料がPDFで入手できる」「MacやWindowsの仮想環境上でのDocker構築も分かる」ところが良かったです

- 折角なので、Dockerhubのアカウントも取っておきます

</div></details>

### <details><summary> 8. Docker上に<font color="Crimson">NGCイメージから</font>【TensorFlow＋Keras】の環境を構築（<font color="Crimson">更新 ③</font><font color="Green"> ④</font>）</summary><div>
- NVIDAの提供しているNGCのTensorFlow イメージを使います。TensorFlow公式のDockerイメージにNVIDIAのGPUにチューニングしてあるらしいので、初学者の勉強用にはちょうどよいかなと思ってます
    - <font color="Crimson">「NVIDIAの推奨方法」で[NVIDIA Docker]をインストールした前提で全面修正 ③</font>

#### 8.1. ~~cuDNNのインストール~~ <font color="Crimson">NVIDIAのDriverとCUDAのバージョンの確認</font>
- ~~CuDNNも必要かどうか判らないのですが、NGCのイメージ決めにバージョンが必要なので入れます~~
- <font color=“DarkRed”>「NVIDIA Docker使うなら、NVIDIAのドライバさえ入れれば、CUDAもcuDNNもいれなくてよいです。NVIDIAのドライバが対応している範囲で好きなイメージ使えばよいです」 ①</font>


- "NVIDIA Driver"と"CUDA"のバージョン確認

```shell-session:
$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.39       Driver Version: 460.39       CUDA Version: 11.2     |
|-------------------------------+----------------------+----------------------+
```

- ~~CUDAのバージョン確認方法~~

~~$ nvcc -V~~

-~~[NVIDIA cuDNNのホームページ](https://developer.nvidia.com/cudnn)にアクセスします~~
    - ~~ユーザー登録して、インストールしたCUDAのバージョンに対応するdebファイルをダウンロードします~~
    - ~~ランタイムとDeveloper Libraryをダウンロードしました~~
        - ~~cuDNN Runtime Library for Ubuntu18.04 (Deb)~~
        - ~~cuDNN Developer Library for Ubuntu18.04 (Deb)~~

- ~~dpkgコマンドでインストールを実行します(インストールの順番は重要な様です)~~

~~$ sudo dpkg -i libcudnn7_7.6.5.32-1+cuda10.1_amd64.deb~~
~~$ sudo dpkg -i libcudnn8-dev_8.0.2.39-1+cuda10.1_amd64.deb~~
~~$ sudo dpkg -i libcudnn8-doc_8.0.2.39-1+cuda10.1_amd64.deb~~


#### 8.2. ~~NVIDIAのドライバーのバージョンを確認~~
- ~~CUDAのバージョン確認方法~~

~~$ nvcc -V~~

- ~~CuDNNのバージョン確認方法~~

~~$ cat /usr/include/cudnn.h | grep CUDNN_MAJOR -A 2~~
~~#define CUDNN_MAJOR 7~~
~~#define CUDNN_MINOR 6~~
~~#define CUDNN_PATCHLEVEL 5~~
~~--~~
~~#define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)~~

- ~~**この場合、「7.6.5」となります**~~

#### 8.3. TensorFlow用DockerをNGCイメージを選択
- <font color="Crimson">以下リンク先と"NVIDIA Driver"と"CUDA"のバージョンからPULLするイメージを決めます</font>
<font color="Crimson">＜参考＞</font>
[TensorFlow Release Notes](https://docs.nvidia.com/deeplearning/frameworks/tensorflow-release-notes/)

- <font color="Crimson">```nvidia-smi```コマンドで"Driver"と"CUDA"のバージョンは判りますが、リンク先の「Driver Requirements」のバージョン表示にはもう一桁あります</font>
        - <font color="Crimson">例：11.2　→　11.2.1</font>
    - <font color=“DarkRed”>NVIDIAのドライバが対応している範囲で好きなイメージ使えばよいです ①</font><font color="Crimson">を参考に、Driverのバージョンを主体にNGCイメージを決めます（正しい判断かは不明）</font>
- <font color="Crimson">PC上でわかっているバージョンは、"NVIDIA Driver:460.56／CUDA:11.2"です </font>
- <font color="Crimson">「TensorFlow Release 21.03」の場合、"NVIDIA Driver:460.32.03 or later／CUDA:11.2.1"となっているので使えると判断しました</font>
    - <font color="Crimson">結局、私の環境では「21.03」では"jupyter notebook"が正しく動作せず、「21.02」に変えました。「21.02」の場合、"NVIDIA Driver:460.27.04 or later／CUDA:11.2.0"です</font>
    - <font color="Crimson">```nvidia-smi```で表示されない桁は切り捨てるのが正解かもしれませんが、詳細は不明です</font>
    - <font color="Crimson">PCの環境を荒らさないDockerのイメージファイルなので、色々試してみてください</font>

- <font color="Crimson">以下のホームページから先程えらんだNGCイメージの「Pullコマンド」を入手します</font>
<font color="Crimson">＜参考＞</font>
[NGC|catalog TensorFlow](https://ngc.nvidia.com/catalog/containers/nvidia:tensorflow/tags)
	
    - <font color="Crimson">私の場合、**「TensorFlow Release 21.02」を選んだので、「21.02-tf1-py3」のNGCファイル**をPULLすることにしました</font>
        - <font color="Crimson">まだ、"TensorFlow2"を学習する予定が無いので、TF1を選んでます。ここは趣味でどうぞ</font>
    - <font color="Crimson">欲しい「NGC」ファイルの右端の「…」をクリックすると、「Pull Tag」と表示されます</font>
    - <font color="Crimson">「Pull Tag」をクリックすると、欲しいNGCイメージの「Pullコマンド」がクリップボードにコピーされます</font>
　　![Screenshot from 2021-04-19 18-26-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106178/e7af8cdb-01f4-385c-f550-dfb09a5235cf.png)

#### 8.4. TensorFlow用DockerをNGCイメージを取得して、containerを起動
- <font color="Crimson">TensorFlow用DockerをNGCイメージを取得</font>
    - <font color="Crimson">先程クリップボードにコピーされたコマンドを端末にペーストします</font>

```shell-session:
$ docker pull nvcr.io/nvidia/tensorflow:21.02-tf1-py3
```

- NGCイメージを「my_tensor_1」という名前でコンテナとして立ち上げます
    - <font color="Green">Host側の"~/Docker_File/sk_learn"フォルダとDocker内の"/workspace"フォルダを【-v】オプションで結合 ④</font>
        - <font color="Green">Host側のフォルダは好きなフォルダを選ぶ。Docker内のフォルダは、【-v】オプションなしでRUNさせて、中身を確認して選ぶ。ともに「絶対パス」で記載すること </font>

```shell-session:
# Before
docker run --name my_tensor_1 --gpus all -it -p 8888:8888 nvcr.io/nvidia/tensorflow:21.02-tf1-py3
# After
docker run --name my_tensor_1 --gpus all -it -v ~/Docker_File/sk_learn:/workspace -p 8888:8888 nvcr.io/nvidia/tensorflow:21.02-tf1-py3
```

#### 8.5. containerの内部ファイルをチェックして、不足する分をインストール
- 既にインストールされているプログラムをチェックします

```shell-session:
$ pip list
```
- <font color="Crimson">あとは必要に応じて、インストールしていきますが、この状態で「Jupyter Notebook上でkerasを使って、"matplotlib"描画できる」ぐらいはてんこ盛りにインストールされているので、とりあえずはこのままで良いと思います。</font>

- <font color="Crimson">以下のコマンドを行うとアップデートが必要なプログラムもてんこ盛りですが、パッケージの依存関係や互換性からすんなり「まとめてアップデート完了」というわけには行きません。（私もプログラムバージョンの依存関係を注意してアップデートしたのですが、結局デッドロックしてしまいました(笑)）</font>
- <font color="Crimson">実害がでるまでは、放置して楽しみましょう</font>

```shell-session:
$ pip list -o
```
- <font color="Crimson">私はとりあえず、以下を行いましたw</font>

```shell-session:
$ pip install --upgrade pip
```
- <font color="Crimson">参考：頑張ってアップデートする人用</font>

```shell-session:
$ pip install pip-review # あまりにアップデートが多いので一括アップデート用
$ pip install -U pip-review # 安心のために"pip-review"自体をアップデートを確認
$ pip-review --auto # アップグレードをまとめて処理
```

- 下記の章を参考に、同様に「jupyter notebook」の立ち上げと「GPU」の動作確認、と描画確認を行います
    - 7.3. Docker上でNVIDIA GPUの動作確認

#### <font color="Crimson">8.6. containerの停止と再起動</font>
 
- <font color="Crimson">8.6.1. containerを止めます</font>

```shell-session:
$ exit
```
- <font color="Crimson">8.6.1. containerを再起動します</font>

```shell-session:
$ docker start my_tensor_1 #(Container名)
# もしくは
$ docker restart my_tensor_1 #(Container名)
```

- <font color="Crimson">Containerを起動しても、Container内に入れない場合の対応</font>

```shell-session:
$ docker container ls -a # Containerが起動している事を確認
# "STATUS"に"Exited"と表示されていなければ、動いてます。
$ docker attach my_tensor_1 (Container名) # (多分)ターミナルがDocker表示に切り替わります
```

#### 8.7. 変更したcontainerの内容をDockerイメージファイルに保存する
- 本来、Dockerファイルで管理する方がディスク容量も食わずクールなのでしょうが、折角PULLしてインストールしたコンテナなので、修正したコンテナからDockerイメージを新たに作成します
- 今のNGCファイルだと追加インストールは不要かもしれませんが、今後のために記載
 
- 8.7.1. 保存したいDockerコンテナを止めます

```shell-session:
$ exit
```

- 8.7.2. 対象のコンテナが止まっていることを確認します
- 『STATUS』が『Exited』になっていればOKです

```shell-session:
$ docker container ls -a
CONTAINER ID   IMAGE                                     COMMAND                  CREATED          STATUS          PORTS                                                           NAMES
edbc4c5aacb8   nvcr.io/nvidia/tensorflow:21.02-tf1-py3   "/usr/local/bin/nvid…"   12 minutes ago   Up 47 seconds   6006/tcp, 6064/tcp, 0.0.0.0:8888->8888/tcp, :::8888->8888/tcp   my_tensor_1

```

- 8.7.3. イメージファイルに保存します
- 修正したコンテナを「my_tensorflow_img:1.0」という名前のイメージファイルとして保存します
- ここで、DockerHubに上げる事を考慮した場合、DockerHubのアカウント名(inata)が必要になります

```shell-session:
$ docker container commit -a "INA-Ta" my_tensor_1 inata/my_tensorflow_img:1.0
```
- ローカル保存だけなら、署名「-a "INA-Ta"」や「アカウント名」が無くても通ります

```shell-session:
$ docker container commit my_tensor_1 my_tensorflow_img:1.0
```

- 8.7.4. 修正したDockerイメージからコンテナ駆動する
- 今後、コンテナを新たに立ち上げる場合は、保存したイメージファイルから行えば、変更後の状態からスタートできます（セーブポイントですね）
- 「my_tensorflow_img:1.0」イメージファイルを「my_tensor_2」という名前でコンテナを立ち上げます

```shell-session:
$ docker run --name my_tensor_2 --gpus all -it -p 8888:8888 inata/my_tensorflow_img:1.0
```

#### 8.8. 変更したイメージファイルをDockerhubへ保存する
- DockerHubにログインします

```shell-session:
$ docker login
```
- 新しく作ったイメージファイルをDockerHubへプッシュします

```shell-session:
$ docker image push inata/my_tensorflow_img:1.0
```
![DockerHub.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106178/d2d38385-d308-73fb-f661-1fdcdfdb7164.png)



- 終わったら、ログアウトします

```shell-session:
$ docker logout
```

#### 8.9. 変更したイメージファイルをローカルフォルダ保存する／読み出す
- Dockerhubのファイルも「「6カ月間利用されていないコンテナイメージを削除する」そうなので、ローカルファイルにも保存します。保存先はデータ用のHDDとします。tarファイルで保存されます。<font color="Crimson">コマンドの誤記を修正</font>

```shell-session:
$ docker image save inata/my_tensorflow_img > /home/#USER/Hdd_2nd/Docker_Image/my_tensorflow_img_1.0.tar 
```

- ローカルファイルからイメージファイルを読み込みます。<font color="Crimson">コマンドの誤記を修正</font>

```shell-session:
$ docker image load  < /home/#USER/Hdd_2nd/Docker_Image/my_tensorflow_img_1.0.tar
```
<font color="Crimson">**【一旦、終了】m(_ _)m**</font>

</div></details>

### <details><summary> 9. Docker上に【ROS2】の環境を構築<font color="Crimson">【一旦、保留 ③】</font></summary><div>
- <font color="Crimson"> 2021年4月現在、"Docker"から描画させる事が思いの外難しく、Docker初学者が"Docker"上から"Gazebo"にアクセスなど絶対無理！という感じです</font>
- <font color="Crimson"> "Docker"＋"描画"の敷居がもう少し下がるまで、一時保留しますm(_ _)m</font>
- <font color="Crimson"> 「機械学習」と「ROS」を同じPC上で勉強している方は、私の様に色々やりすぎて本体側のPythonを壊してUbutn再インストールにならないように、[Pyenv]を使うか、[デュアルブート化]をおすすめします</font>

</div></details>

### <details><summary><font color="DarkOrange"> 10. Docker上に【PyTorch】の環境を構築【更新 ⑤】</font></summary><div>
- <font color="DarkOrange"> NGCイメージから【TensorFlow＋Keras】をPullしたところ、ソフトがてんこ盛りでイメージサイズが『14.5GB』もあったので、【PyTorch】環境は、なるべくシンプルを目指す事にします</font>

####<font color="DarkOrange"> 10.1. PyTorchの純正イメージをPullする </font>

```shell-session:
$ docker pull pytorch/pytorch:latest
```
- <font color="DarkOrange"> Pullされたイメージはv1.8.1、ホームページ上の最新はv1.9.0</font>
- <font color="DarkOrange"> CUDA等のVersionの問題だと思われるが、泥沼なので”これで良し”とします</font>
- <font color="DarkOrange"> dockerイメージが保存されていることを確認します</font>

```shell-session:
$ docker image ls -a
  REPOSITORY                  TAG             IMAGE ID       CREATED        SIZE
  pytorch/pytorch             latest          5ffed6c83695   4 months ago   7.25GB
```
- <font color="DarkOrange"> 直接比較はできませんが、『14.5GB』→『7.25GB』まで減ったので、少し嬉しい♪</font>

####<font color="DarkOrange"> 10.2. PyTorchの純正イメージからコンテナを生成する</font>
- <font color="DarkOrange"> dockerイメージを「my_torch_1」という名前でコンテナとして立ち上げます </font>
- <font color="DarkOrange"> データ用にマウント済みのHDD（Hdd_2nd）内の”pytorch”フォルダとDocker内の"/workspace"フォルダを【-v】オプションで結合します </font>

```shell-session:
$ docker run --name my_torch_1 --gpus all -it -v ~/Hdd_2nd/pytorch:/workspace -p 8888:8888 pytorch/pytorch
```
####<font color="DarkOrange"> 10.3. PyTorchコンテナの動作確認</font>
- <font color="DarkOrange">10.3.1. PyTorchフォルダとつながっているか？ </font>
    - <font color="DarkOrange">”~/Hdd_2nd/pytorch”内に仮フォルダ（test）を作成し、DockerのWorkspace上に表示されるか？ </font>

```shell-session:
root@33d8508ba18c:/workspace# ls -a
.  ..  test
```

- <font color="DarkOrange">10.3.2. GPUは繋がっているか？ </font>
    - <font color="DarkOrange">”nvidia-smi”コマンドでドライバー等が表示されれば、OK </font> 
    - <font color="DarkOrange">”nvidia-smi”コマンドでもプロセスは表示されません。7.3を参照ください</font>

```shell-session:
root@33d8508ba18c:/workspace# nvidia-smi
     
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.91.03    Driver Version: 460.91.03    CUDA Version: 11.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce GTX 166...  Off  | 00000000:01:00.0  On |                  N/A |
| 41%   35C    P8    11W / 125W |    666MiB /  5936MiB |      3%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+
```
####<font color="DarkOrange"> 10.4. PyTorchコンテナのインストール済プログラムをチェックして、不足分を追加する</font>
- <font color="DarkOrange"> 既にインストールされているプログラムをチェックします</font>

```shell-session:
root@33d8508ba18c:/workspace# pip list
```

- <font color="DarkOrange"> ざっと見て、必要そうなプログラムはインストール済みでした。”tensorflow”もいるし(笑)</font>

```shell-session:
tensorflow                       1.15.5+nv
tensorflow-estimator             1.15.1
```

- <font color="DarkOrange"> PythonのVersionは、以下の通り</font>

```shell-session:
root@33d8508ba18c:/workspace# python -V
Python 3.8.5
```

####<font color="DarkOrange"> 10.5. PyTorchコンテナのプログラムのアップデート</font>
- <font color="DarkOrange"> 以下のコマンドでチェックすると、アップデート可能なプログラムがてんこ盛りですが、【TensorFlow】でアップデートした時にプログラムの依存関係が崩れてコンテナ自体が動かなくなったので、実害がでるまで放置します</font>

```shell-session:
root@33d8508ba18c:/workspace# pip list o
```
- <font color="DarkOrange"> データ保存用にHDDをマウントさせているので、問題が出たらImageファイル自体のVersionを上げたほうが簡単だと思います</font>
- <font color="DarkOrange"> 動かそうとした途端、Jupyter系が入っていないことに気づき、そこだけインストールした。（上記のチェックでは気が付かず）</font>

```shell-session:
root@33d8508ba18c:/workspace# pip install --upgrade pip # pipするなら、アップデートはやっておこう程度の気持ち
root@33d8508ba18c:/workspace# pip install ipython==7.23.1 # jupyter labのインストール時にバージョンが古いと怒られたから。最低限のバージョンにアップデート
```

- <font color="DarkOrange">jupyterlabの場合</font>

```shell-session:
root@33d8508ba18c:/workspace# pip install jupyterlab  
root@33d8508ba18c:/workspace# jupyter lab --ip=0.0.0.0 --allow-root #  rootでは動かなかったので、とりあえず"--allow-root"を追加
```

- <font color="DarkOrange">jupyter notebookの場合</font>

```shell-session:
root@33d8508ba18c:/workspace# pip install notebook 
root@33d8508ba18c:/workspace# jupyter notebook --ip=0.0.0.0 --allow-root
```
- <font color="DarkOrange">matplotlibを追加インストールする</font>
    - <font color="DarkOrange">"matplotlib−inline"が入っていたので大丈夫かなと思っていたけど、エラーが出るので追加インストールする</font>

```shell-session:
pip install matplotlib
```
- <font color="DarkOrange">これで正常♪</font>

- <font color="DarkOrange"> 残件：Docker上でのrootを使わない方法を考えなきゃ</font>

####<font color="DarkOrange"> 10.6. PyTorchコンテナが再起動しない場合</font>
- <font color="DarkOrange"> 8.6を参照してください</font>

####<font color="DarkOrange"> 10.7. 【VSCode】からコンテナにアクセスできるようにする</font>
- <font color="DarkOrange"> インストールは、6.6を参照してください</font>
- <font color="DarkOrange">10.7.1. "Remote - Containers" をインストール </font>
    - <font color="DarkOrange">【VSCode】の『機能拡張』→『"Remote"と入力して、表示される【Remote - Containers】を選択』→『インストール』する。（スクショは、インストール済みの画面を加工しています。実際とは少し違うと思います。）</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106178/150cdec8-b777-9ffd-77b7-5da620f0423a.png)
- <font color="DarkOrange">10.7.2. 実行中のコンテナにAttachする</font>
- <font color="DarkOrange">【VSCode】の左下の緑色アイコンをクリックして、リモードウィンドを開く</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106178/c1b80244-4307-fb4d-3db8-a3a8723a0120.png)

- <font color="DarkOrange">リモートウィンドウに『At』と入力すると、『Attach to Running Container…』が補完表示されるので選択する</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106178/5415fe4b-a631-3b25-4b92-c7f0f1c82307.png)

- <font color="DarkOrange">『Attach』できるコンテナのリストが表示されるので、目的のコンテナを選択</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106178/7957d1dd-14b8-424c-4e63-c2fc99acca91.png)
- <font color="DarkOrange">これで、【VSCode】が目的のコンテナに接続されます。細かい設定は、使いながら考えます</font>

- <font color="DarkOrange">＜参考＞</font>
![Attach to a running container](https://code.visualstudio.com/docs/remote/attach-container)

</div></details>

# 変更履歴
#### 0版:2020年9月21日
#### <font color=“DarkRed”> 1版:2020年9月22日 ① </font>

   - <font color=“DarkRed”>からあげさんからのコメントを反映(多謝:からあげさん) </font>

#### 2版:2020年9月25日
- あんまり長いので、折りたたみ表示に変更

#### <font color="Crimson"> 3版:2021年4月25日 ③ </font>

   - <font color="Crimson">『NVIDIAの佐々木さん』と『Shunsuke Kimuraさん』からのアドバイスを反映(多謝:佐々木さん&Kimuraさん)</font>
       - <font color="Crimson">参考:[NVIDIA Docker って今どうなってるの？](https://medium.com/nvidiajapan/nvidia-docker-%E3%81%A3%E3%81%A6%E4%BB%8A%E3%81%A9%E3%81%86%E3%81%AA%E3%81%A3%E3%81%A6%E3%82%8B%E3%81%AE-20-09-%E7%89%88-558fae883f44)</font>
       - <font color="Crimson">壊れたUbuntuを治すべく、全ステップをやり直して、内容確認と修正</font>
        - <font color="Crimson">ここ半年の変化の追記と誤記修正</font>
        - <font color="Crimson">システム再インストール時に動かなかったScriptなどを修正</font>
        - <font color="Crimson">"xmodmap"か、"xkb"を変更してキーアサインを変え方法を併記</font>
        - <font color="Crimson">"Docker"のインストールを"Nvidia推奨"と"実績版"を併記</font>
        - <font color="Crimson">3章と4章を入れ替え</font>

#### <font color="Green">4版:2021年5月16日 ④ </font>
- <font color="Green">ターミナル用エディタに"Micro"を導入</font>
- <font color="Green">Host側のフォルダとDocker側のフォルダを同期させる </font>
- <font color="Green">温度表示のソフトウェアを追加 </font>

#### <font color="DarkOrange">5版:2021年8月22日 ⑤ </font>
- <font color="DarkOrange">Apple Wireless Keyboard 復活</font>
- <font color="DarkOrange">スクショ用ソフトの追加</font>
- <font color="DarkOrange">軽め（？）なPyTorch用のDockerを作成</font>
- <font color="DarkOrange">VSCodeでコンテナにアクセスできるようにする</font>
- <font color="DarkOrange">PyTorchコンテナにmatplotlibをインストールアクセス：2021年8月26日</font>
- <font color="DarkOrange">7.1.PlanA：NVIDIAの佐々木さんの書かれたNVIDIA Dockerの紹介ページのリンク先が変わっていたので修正：2021年9月6日</font>

#### <font color="SteelBlue">6版:2023年11月05日 ⑥ </font>
- <font color="SteelBlue">22.04.2へのアップデート時に「Emergency mode」から抜けられなくなって、再インストール。その際、7章まで記載内容の動作チェックを実施</font>