Qiskit環境構築 [uv/poetry共通]  (6) メンテナンス <Windows11, WSL2, openSuSE,  pyenv, pipx, poetry>

# 概要
　自分用メモ。コマンドの羅列だけ。

# 目次
 (1) 各種アップデート
 　　1-1. wsl
 　　1-2. openSuSE
 　　1-3. pyenv
 　　1-4. pipx
 　　1-5. poetry
 　　1-6. vscode
 　　1-7. powershell
 　　1-8. uv
 (2) wsl2ディストリビューション
 　　2-1. export
 　　2-2. import
 　　2-3. host名/デフォルトログインユーザの変更
 　　2-4. 割り当て量の変更
 　　2-5. bashのPS1変更

# (1) 各種アップデート
## 1-1. wsl
windowsのpowershellから実施
```powershell: [powershell]　wslのアップデート
# バージョン確認
wsl --version

# アップデート
wsl --update

# バージョン確認
wsl --version
```
## 1-2. openSuSE
linuxのターミナルから実施
```bash: [linux/bash] openSuSEのアップデート
# レポジトリ更新
sudo zypper refresh 

# アップデート
sudo zypper dup
```
windowsのpowershellから実施
wsl2からアクセスしているエントリを削除する。
稼働環境は消えるが、ベースとなるopenSuSEはアプリとして導入されたままとなる。
```powershell: [powershell] wslディストリビューション削除
wsl -l -v
wsl --unregister openSUSE-Leap-15.6
wsl -l -v
```

windowsからwslディストリビューション削除
openSuSEをアプリとして削除する。
```powershell: [powershell] wslディストリビューションのアプリ削除
# 削除前確認
winget list --id SUSE.openSUSE.Leap.15.6

# 削除
winget uninstall PowerShell

# 削除後
winget list --id SUSE.openSUSE.Leap.15.6
```
## 1-3. pyenv
linuxのターミナルから実施
```bash: [linux/bash] pyenvのアップデート
# バージョン確認
pyenv --version

# pyenv導入ディレクトリ確認
ehco $(pyenv root)

# clone
git clone https://github.com/pyenv/pyenv-update.git $(pyenv root)/plugins/pyenv-update ; echo $?

# アップデート
pyenv update

# バージョン確認
pyenv --version
```

```bash: [linux/bash] pyenvの削除
# pyenv用フォルダ削除
# 削除前に$(pyenv root)の中身が入っていることを確認
ehco $(pyenv root)

# pyenv用フォルダ削除
rm -rf $(pyenv root) ; echo $?

# bash自動補完設定削除
ls -l /etc/bash_completion.d/pyenv.bash
sudo -rf /etc/bash_completion.d/pyenv.bash ; echo $?
ls -l /etc/bash_completion.d/pyenv.bash
 
# ~/.bashrc中の下記の記載を削除またはコメントアウト
    # env for pyenv
    export PYENV_ROOT="$HOME/.pyenv"
    [[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
    eval "$(pyenv init -)"
```
## 1-4. pipx
```bash: [linux/bash] pipxのアップデート
# バージョン確認
pipx --version

# pipxそのものでpipxをアップデートするのは危険なため
# toolとして導入しておいたをpipx.pyz使用する。
# pipx.pyzを蹴るpythonは新しめで使える奴なら何でもいい。
python3.11 ~/tool/pipx.pyz upgrade pipx ; echo $?

# バージョン確認
pipx --version
```

```bash: [linux/bash] pipxの削除
# toolとして導入しておいたをpipx.pyz使用する。
python3.11 ~/tool/pipx.pyz uninstall pipx ; echo $?

# ~/.bashrc中の下記の記載を削除またはコメントアウト
    # env for pipx
    eval "$(register-python-argcomplete pipx)"
```

## 1-5. poetry
```bash: [linux/bash] Python仮想環境でのモジュールアップデート
# Python仮想環境ディレクトリへ移動
cd ~/work/vmPy/vqis
pwd

# モジュールアップデート
poetry update ; echo $?
```

```bash: [linux/bash] poetryのアップデート
# バージョン確認
poetry about

# poetryのアップデート
pipx upgrade poetry ; echo $?

# バージョン確認
poetry about
```
```bash: [linux/bash] 同じパッケージ依存のPython環境を作る
# "pyproject.toml"を受け渡し、Python仮想環境に配置したうえで
# 下記コマンドを実行。
# この方法の場合、ある程度は実行環境に合わせたパッケージ選択が行われるが、
# 実行環境やタイミングにより、完全に同じパッケージとなる保証はない。
poetry install --no-root ; echo $?
```

## 1-7. powershell
アップデート
windowsのpowershellから実施
```powershell: [powershell]
# バージョン確認
$PSVersionTable

# 最新版確認 
winget search Microsoft.PowerShell

#------最新版が出てれば更新
# 削除
winget uninstall PowerShell

# 導入
winget install --id Microsoft.Powershell --source winget

# バージョン確認
$PSVersionTable

# [参考] upgradeコマンド
winget upgrade PowerShell
```

## 1-8. uv
```bash: [linux/bash] uvのアップデート
# バージョン確認
uv --version

# アップデート
uv self update ; echo $?

# バージョン確認
pipx --version
```

```bash:パッケージの一括upgrade
# Python仮想環境のディレクトリに移動
cd ~/work/vmPy/vqis

#------ uv.lockの更新
#--- test実行
uv lock --dry-run --upgrade ; echo $?

#--- 更新
uv lock --upgrade ; echo $?

#------ uv.lockをもとにしたパッケージ導入
#--- test
uv sync --dry-run ; echo $?

#--- 実行
uv sync ; echo $?
```

```bash:[参考] uv削除
# ~/.bashrcの下記のエントリ削除
eval "$(uv generate-shell-completion bash)"

uv cache clean

# ex.　/home/nyanco/.local/share/uv/python
rm -r "$(uv python dir)" ; echo $?  

# ex. /home/nyanco/.local/share/uv/tools
rm -r "$(uv tool dir)"   ; echo $?  

rm -r ~/.local/bin/uv ~/.local/bin/uvx ; echo $? 
```

# (2) wsl2ディストリビューション
## 2-1. export
wsl2でexportを行うとlinux仮想環境を丸ごとバックアップできます。
★export前にlinuxからログオフ、vscodeも終了させてください。

```powershell: [powershell] export
wsl -l -v
wsl --shutdown
wsl -l -v

# windows側にバックアップ先ディレクトリ作成
# 保管用フォルダ作成(フォルダ名等は適当)
$dirTGTe = "C:\wsl2\bkup\"
$dirTGTe
Test-Path "$dirTGTe"
New-Item -ItemType Directory -Path "$dirTGTe"
Test-Path "$dirTGTe"

# export対象は "wsl -l -v" コマンド出力のNAMEを指定する。
wsl --export openSUSE-Leap-15.6 $dirTGTe\openSUSE-Leap.vhdx --vhd
```
## 2-2. import
exportした仮想環境のイメージをimportします。
import時に下記を変更できるためwsl2のディストリビューション導入後、
最初に実施するのがおすすめです。
　・仮想環境名(ディストリビューション名)。名前を短縮できるのがメリット大。
　・ファイルシステムの配置ディレクトリを管理しやすい場所に設定できる。
 ★import後のlinuxはなぜかrootでログインするようになるので、
 　後述のデフォルトログインユーザの変更を実施すること。
```powershell: [powershell] import
# windows側にバックアップ先ディレクトリ作成
# 保管用フォルダ作成(フォルダ名等は適当)
$dirTGTi = "C:\wsl2\img\suseLeap"
$dirTGTi
Test-Path "$dirTGTi"
New-Item -ItemType Directory -Path "$dirTGTi"
Test-Path "$dirTGTi"

# --importの引数が新仮想環境名
wsl --import suseLeap $dirTGTi $dirTGTe\openSUSE-Leap.vhdx --vhd

# import確認。新仮想環境名のlinuxが増える
wsl -l -v 
```

### importした新環境へのアクセス
(a) import操作によって自動的にwindowsターミナルのプロパティが作成されているため、
　　 windowsターミナルアプリのタイトルバーから新環境を選ぶとログオンできる。
![term.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/26fa5eac-2cb6-e768-3862-d791dda0c8e4.png)

(b) スタートメニューにあるwindowsターミナルアイコンのコピー方法がわからなかった。
　　 ショートカットアイコンやブログラムとしてのファイルの実体が見当たらない。
   　もしエントリが見つかれば、コピー&改造して新環境ログインに使用できるはず。

(c) 自分はwindowsターミナルではなく、wslttyを使用している。
　　 wslttyではインストーラーが自動的にスタートメニューへの登録してくれるほか、
　　 作成されたショートカットをコピーして、パラメータを変更するだけで他環境へログオンができるので管理がかなり楽。
   　cygwinで使用されているminttyに慣れているのならベスト。
   　★wslttyのインストーラをダウンロードすると、windowsの警告「一般的にはダウンロードされていません」
    　が出力されるので、ここでは説明しません。

## 2-3. host名/デフォルトログインユーザの変更
★/etc/wsl.conf.wsl_baseの変更/反映前にexportを取得すること。
　パラメータの設定によっては2度と起動しなくなることがあるので注意。
★openSuSEでは/etc/wsl.confから/etc/wsl.conf.wsl_baseへのソフトリンクが張られている。
　他のディストリビューションでは多分etc/wsl.conf。

```bash: [linux/bash] host名/デフォルトログインユーザの変更
# バックアップ
ls -l /etc/wsl.conf.wsl_base
sudo cp -p /etc/wsl.conf.wsl_base /etc/wsl.conf.wsl_base_orig ; echo $?

# 編集
sudo vi /etc/wsl.conf.wsl_base

# 確認
diff /etc/wsl.conf.wsl_base /etc/wsl.conf.wsl_base_orig ; echo $?
cat /etc/wsl.conf.wsl_base
```
/etc/wsl.conf.wsl_baseを下記の通り編集
　　[boot]のsystemdでsystemd有効化。
  　　　wsl_systemd導入前に設定してしまうと二度と起動しなくなる。
　　[network]のhostnameでホスト名を指定
　　[user]のdefaultでデフォルトのログインユーザを指定
　　[wsl2]のdnsTunnelingでdnsはwindowsからもらってくる
  
編集後、再起動して反映
```conf:/etc/wsl.conf.wsl_base

[boot]
systemd = true

[network]
hostname = suseLeap

[user]
default = nyanco

[wsl2]
dnsTunneling = true
```
## 2-4. メモリ割り当て量変更
WSL2ではPC全体のメモリの半分、または8GBのいずれか少ない方が設定される。
この量を手動で設定したい場合には、デフォルトユーザのホームディレクトリに
".wslconfig"ファイルを作成して設定する。

```bash: [linux/bash] メモリ割り当て量の変更
# メモリ割り当て量確認
free --giga

# 既存のファイル確認
ls -l ~/.wslconfig

# 存在しない場合は作る。
touch ~/.wslconfig
vi ~/.wslconfig

cat ~/.wslconfig

# 再起動後
# メモリ割り当て量確認
free --giga
```

12GB固定で設定する場合
```conf:~/.wslconfig
[wsl2]
memory=12GB
swap=0GB
```

## 2-5. bashのPS1変更
bashのPS1変数を変更してコマンドプロンプトを自分の好きな感じにする。
~..bashrcのに記載しておく

```bash:PS1によるコマンドプロンプト変更
echo 'export PS1="\[\e[0;36m\]\[$(ppwd)\][\u@\h]:\w\n> \[\e[0m\]"' >> ~/.bashrc
source ~/.bashrc
```
wslttyの場合
![wsltty.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/385eb013-c9a6-2b76-dc59-d8578dc1860b.png)

windowsターミナルの場合
![ps1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/3e72c7fc-e9d9-daee-ff59-eb3bf9741b64.png)

Qiskit環境構築
【uv版】
[(1) Linuxの導入/設定](https://qiita.com/reconcat/items/f30839f3c09600e2a6b2)
[(2) uvの導入/Python仮想環境の作成 ](https://qiita.com/reconcat/items/37a4273547ddd0f6006a)
[(3) vscodeからのPython仮想環境接続](https://qiita.com/reconcat/items/79e1ec4ca9989a08dcd0)

【poetry版】
[(1) Linuxの導入/設定](https://qiita.com/reconcat/items/78ca5bf02fda616d6561)
[(2) Python仮想環境の作成](https://qiita.com/reconcat/items/76507b2743a9f3c40d43)
[(3) vscodeからのPython仮想環境接続](https://qiita.com/reconcat/items/ad4cb6f7c9c273f0ae3f)

【uv/poetry共通】
[(4) シミュレータでの量子回路実行](https://qiita.com/reconcat/items/360d93adddc99a98a3c3)
[(5) IBMQ実機での量子回路実行](https://qiita.com/reconcat/items/4c50c67342d226cb5d7f)
[(6) メンテナンス](https://qiita.com/reconcat/items/50fde8ebf740995f9d7c)