Qiskit環境構築 [poetry版]  (1) Linuxの導入/設定 <Windows11, WSL2, openSuSE,  pyenv, pipx, poetry>

# Qiskit環境構築
当初はpoetryで環境を構築していましたが、uvの方が使いやすいため
下記のuv版の記事を参照してください。poetry版は参考のため残しておきます。

【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)

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

# 概要
　・Windows11/WSL2でのQiskit環境構築手順は需要があるかもしれないで記載します。
　・IBM Community Japanの2024年ナレッジモール研究に参加した際に
 　　使用したQiskit環境の構築手順となります。
　　[IBM Community Japan / ナレッジモール研究](https://community.ibm.com/community/user/japan/blogs/ibm-ibm-community-japan-office1/2022/08/05/knowledge-mall-research#content)
　・Qiitaの書き方などよくわかっていませんが、とりあえず勢いで投稿します。
　　後から徐々に修正します。
 
# 環境
　・手順では< Windows11, WSL2, openSuSE LEAP, pyenv, pipx, poetry >を
 　 組み合わせた環境を構築します。
　・poetryを使用すると、パッケージの依存関係を考慮したアップデートが
 　　可能になるため継続的にqiskitを扱っていく場合にメリットが出てきます。
　　　※自分は今後、pyenv/poetryをuvに置き換えようと思っています。
　・手順のディストリビューション差異を減らすことや、
 　 ツールの導入をhomeディレクトリなど最小限にするために、
    パッケージを使わずに各ツールをgitbubから導入する手順にしています。
　　このため、macのbrewコマンドを使った構築より大幅に面倒な手順になっています。
    ※ディストリビューションによってはパッケージで配布されている
    　pyenvが古く、新しいPythonが使用できないものもありました。
　・記事ではopenSuSE LEAPを使用していますが、ubunutuの手順との差は
 　　さほど無いので同様に環境構築できます。
 　　※gitやpythonなどの初期導入パッケージ状況が違う程度の差になります。
　・windowsのメモリは多い方がいいです。
 　　8GBの場合はかなり厳しい状態に追い込まれるため、
 　　windowsの仮想メモリ設定で増やした方がいいかも。

# 本ドキュメントの範囲
　WSL2の導入 -> poetry導入および設定まで。
  poetryによるPython仮想環境の作成 -> Qiskit >=1.0での量子回路実行は
  別ドキュメントで作成予定です。

# Qiskit環境構築手順
  WSL2 -> openSuSE LEAP -> pyenv -> pipx -> poetryの順に導入します。

### WSL2の導入
★windowsのGUI操作を実施します。
　※ubintuを導入する場合は、windows11のpowershell/コマンドプロンプトから
 　'wsl.exe --install"すればwsl2およびubuntu linuxまで自動で導入されるため、この手順は不要です。
　　本手順ではubuntuの導入を避けるため、windowsのコントロールパネルからWSL2を導入します。

　[windows11から下記を実施]
　スタートメニューにcont入力
　　-> コントロールパネル
　　　-> プログラムと機能

![wsl001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/889cb7c8-e68d-e5c6-78d7-06b1aeb6afeb.png)
![wsl002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/93f40913-a09b-71ee-0158-1a403bdb87c8.png)
![wsl003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/5a1476ca-1ffd-b2d7-2a54-79038471a7e6.png)

　「windowsの機能」画面で有効化選択
　　->下記にチェック入れてOK (OK実施後、)再起動要求があります。)
    　　　　■ Hyper-V
    　　　　■ Linux用 Windows サブシステム
    　　　　■ Virtual Machine Platform
![wsl004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/c3052694-db63-bbeb-06b1-79b6eb2b08e0.png)
![wsl005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/2621f47f-2d98-3443-9967-56205913fa77.png)
![wsl006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/f23558b1-724c-42d4-6749-2533f96d4b89.png)
![wsl007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/635032f1-f832-9877-3064-de5195b9ddc1.png)
![wsl007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/bdf2e195-19c6-3151-43f1-37fd838ca97d.png)

### wsl2のアップデート
★Powershellまたはコマンドプロンプトから実行します。
 Powershellまたはコマンドプロンプトを<管理者権限>で開きます。
![wsl009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/d3b9ce05-07fa-e4f3-8e03-56201e20666b.png)

下記コマンドを実行
```powershell:[Powershell]
wsl --update
wsl --version
```
![wsl010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/b13eae70-493c-6cd9-0478-c9bc662b536a.png)
![wsl011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/73b50c76-ef2c-216a-a750-531648bc1a2e.png)

### openSuSE LEAPの導入
★Powershellまたはコマンドプロンプトから実行します。
WSL2でインストール可能なディストリビューションの一覧を出力
```powershell:[Powershell]
wsl --list --online
```
![wsl012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/02c242ea-af58-5db9-3cd4-cffb635100cd.png)

openSuSE LEAP 15.6を導入します。
```powershell:[Powershell]
wsl --install -d openSUSE-Leap-15.6
```
導入の途中でncursesを使ったYaST2メニューのパネルが開きます。
YaST2では、tabキーを押しながら選択か所を切り替えつつ、エンターキーで実行します。
画像の例では、[Next]が選択されていて、この状態でエンターキーを押すことで実行となります。

Nextを実行します。
![wsl015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/d310d2be-b38e-43b1-14e2-96d49d5d9aab.png)

Licence Agreementパネルで Next 選択してエンター
![wsl016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/afa90094-92b1-1d37-03a1-e4ff3b6c3f40.png)

Local Userパネルでは、tabとキーボードを駆使して、ユーザ名、パスワードを登録します。
　　"[x] Use this password for system administrator"はxのまま選択でOK
　　" [ ] Automatic Login"は[ ]選択無しのままで大丈夫です。
登録後に Next 選択してエンター
![wsl017.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/3935b0ba-4bc9-818a-f02a-56174223031c.png)
![wsl018.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/6d44d112-756e-759a-144f-a8b68e994a9a.png)

"The password is too simple:"などcracklibの警告が出力された場合、tabで"Yes"選んでOK
※皆様はきちんとしたパスワードを設定してください。
![wsl019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/8dd28b08-dd66-94a1-6c5b-dd8b6a875663.png)

導入が進むのでしばらく待ち。
レポジトリのアップデート等が実施されています。
![wsl022.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/057faee2-bcd7-3ff2-1ccd-9b1dc46dd03c.png)

"Configuration Completed"パネルが出力されたら導入が完了しています。
Finishを選択して実行してください。
![wsl023.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/d19b411d-91f0-9aa7-1d8e-887a427fa773.png)

YaST2パネルが終了して、コンソールの画面に戻ります。
この段階ですでにコンソール上ではWSL2のlinuxにログオンしているので注意してください。
linuxのuname -aコマンドを実行すると"microsoft-standard-WSL2"版のlinuxであることがわかります。
exitでいったんコンソールを閉じます。
```bash:環境確認およびexit (Powershellのコンソールだがlinuxログオン状態となっている)
uname -a
exit
```
![wsl024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/edca3dd2-d948-1422-c8e3-74955416f687.png)


### openSuSE導入後確認
★Powershellまたはコマンドプロンプトから実行します。
wsl -l -vコマンドでwsl2に導入されたディストリビューションの稼働状態を確認します。
```powershell:[Powershell] ディストリビューション稼働状態確認
wsl -l -v
```
サンプルではopenSUSE-Leap-15.6が稼働中であることがわかります。g)
![waku.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/8079ca93-4ccc-eed6-b763-8592ff414443.png)

```
先頭の* : デフォルトのディストリビューション
openSUSE-Leap-15.6 : 環境名。export/import操作により変更可能。
Runnung : 稼働中
VERSION 2 : wslバージョン2
```
```powershell:[Powershell] 備考(ディストリビューション導入やり直し)
# 導入をやり直したい場合にディストリビューションを削除するコマンド例
wsl -l -v
wsl --unregister openSUSE-Leap-15.6
wsl -l -v
```

### openSuSEへのログイン
windowsのスタートメニューのプログラムに"openSUSE Leap 15.6"が追加されているので起動します。
※プログラムの実体はwindowsの"コンソール"プログラムですが、
　起動後にWSL2内で稼働する"openSUSE-Leap-15.6"にログインしています。
  「hostname,$PS1のカスタマイズやexport/import、ディストリビューション名変更」等のカスタマイズは別のエントリで記載予定。
 ![opensuse_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/9c5cec23-692d-cdd5-9ed2-f9766a7c4531.png)
![opensuse_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/45d7274f-d689-f8ca-e447-0588d0c2ec0c.png)

### openSuSEのアップデート
★linuxコンソールから下記コマンドを一通り実行
※openSuSEのレポジトリからの反応が遅い場合やパッケージの整合性がとれていないタイミングでは
　無理せず別のタイミングで実施してください。
```bash:opensuseのアップデート
# sudoのパスワードを聞かれた場合は、YaST2で設定したパスワードを入力
sudo zypper refresh
# 更新があった場合は "y" を入力してエンター
sudo zypper dup
```
![opensuse_005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/1b92cc99-1c86-edfb-80da-eb3f0fd7883e.png)
![opensuse_006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/89bc1cab-25a0-7f3f-627f-084d08cfa0c5.png)

"sudo zypper dup"の結果、
"They should be restarted to benefit from the latest updates."が出力されていたら
opensuse leapを再起動します。

### openSuSEの再起動
★前提作業としてopenSuSEのすべてのターミナルからexitしてください。vscode等起動していれば停止してください。
★openSuSEの再起動はwindowsのpowershellまたはコマンドプロンプトから実行します。

wsl -tオプションでディストリビューションを停止します。
実行後、STATE が "Stopped"になって停止したこと確認します。
```powershell
wsl -l -v
wsl -t openSUSE-Leap-15.6
wsl -l -v
```
![opensuse_007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/acc9ab60-aaa6-1a39-dadc-215dfd1b5453.png)

停止状態のディストリビューションを起動するには、windowsのスタートメニューのプログラムに"openSUSE Leap 15.6"を起動してログインすれば完了します。

### openSuSEのパッケージ導入

必須ではありませんが、パッケージを導入していきます。
Qiskit環境の導入としては下記が必要です。他は無理して入れる必要はありません。
    git(poetryの依存)
  　python311(system用Pythonのバージョンが古いため)
  　bash-completion,python311-argcomplete(pipx,poetryのコマンド自動補完).
何か聞かれたら、メッセージをちゃんと読んだうえでyを返答します。

```bash:基本パッケージ導入
# パッケージ導入後、前出の手順でopenSuSEの再起動を実施てください。
sudo zypper install -t pattern wsl_base
sudo zypper install -t pattern wsl_gui
sudo zypper install -t pattern wsl_systemd
sudo zypper install -t pattern kde
sudo zypper install git bash-completion python311-argcomplete python311 MozillaFirefox neofetch screenfetch tree
```
パッケージ導入後
![opensuse_008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/03404723-b061-0f7c-4c25-700bc5bbbe64.png)

## Python仮想環境の構築
linuxの基本的な導入が完了しました。
以降はPython仮想環境構築の手順になります。

### pyenvの導入
・複数バージョンのPythonをlinuxローカルユーザの環境にインストールしつつ、切り替えて使用するためのツールです。
・Pythonをbuildするための前提パッケージはディストリビューションにより異なります。
　[pyenv前提パッケージ](https://github.com/pyenv/pyenv/wiki#suggested-build-environment)
・linuxローカルユーザのhomeディレクトリ直下に導入します。

```bash:pyenv前提パッケージの導入(openSuSEの場合)
sudo zypper install gcc automake bzip2 libbz2-devel xz xz-devel openssl-devel ncurses-devel \
readline-devel zlib-devel tk-devel libffi-devel sqlite3-devel gdbm-devel make findutils patch
```

pyenvをhomeディレクトリの.pyenvにcloneします。
```bash:pyenv導入
git clone https://github.com/pyenv/pyenv.git ~/.pyenv ; echo $?
ls -a ~/
ls -l ~/.pyenv/
```
![suse001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/d9323040-beb4-15d1-24c6-865534e09ec4.png)

pyenv有効化
pyenvを~/.pyenvに配置したので、環境変数pathに通します。
```bash
# homeディレクトリに移動し、.bashrcをバックアップ
cd ~
pwd
cp -p ~/.bashrc ~/.bashrc_orig

# .bashrcをカスタマイズして、pyenvを環境変数pathに通す。
echo '' >> ~/.bashrc
echo '# env for pyenv' >> ~/.bashrc
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
echo '' >> ~/.bashrc
source ~/.bashrc

# pyenvのコマンド補完を有効化する。
sudo cp -p ~/.pyenv/completions/pyenv.bash /etc/bash_completion.d/
```
![opensuse_010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/8cf2052e-6f3c-0975-7034-3f892c2c073e.png)

pyenvコマンドの自動補完が効くことをテストします。
pyenvまで入力したらtabキーを押す
自動補完が効かない場合は、openSuSEに再ログインしてください。
```bash:自動補完確認
pyenv 
```
![opensuse_011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/5336605b-9e54-e491-330a-81a15dacdcbd.png)

pyenvでpython3.12.8導入
※記載時の最新安定板が3.12.8のため。
```bash:pyenvによるPython導入
# 現在pyenvで導入されているPythonの状態確認
pyenv versions

# 導入可能なPythonのバージョンのリスト出力
pyenv install --list

# Python3.12.8導入
pyenv install 3.12.8

# 導入後のPythonの状態確認
pyenv versions
```
![opensuse_014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/08fb25e5-5c92-b7b1-3580-d0fa55f0b7f1.png)


### pipxの導入
pipxはPythonのライブラリやモジュールを管理するためのツールです。
poetryの前提として導入します。

pipxの導入にあたり、まずはpipx.pyz (pipxもどき)を導入します。
pipx.pyzはpipxの導入や、pipx自体のアップデートを安全に行うために導入します。
今後もpipx自体のアップデートや削除で使用するため、わかりやすいフォルダに配置しておきます。
```bash:pipx.pyzの導入
#　pipx.pyz置き場を作成します。
# 本手順では~/tool/pipx.pyzに配置します。
ls -ld ~/tool
mkdir -p ~/tool ; echo $?
ls -ld ~/tool
cd ~/tool
pwd

# pipx.pyz導入
wget https://github.com/pypa/pipx/releases/latest/download/pipx.pyz
```
![opensuse_015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/056445b9-8092-86b6-c89e-ae2756148efa.png)

pipxの導入
pipxは導入する際に使用した際のpythonバージョンで稼働するため、
この段階でpyenvを使って、新しめのバージョンのPythonを使ってもよい。
```bash:pipxの導入
# opensuseの場合
# SYSTEM用Pythonが古いので追加導入したPython3.11を使用します。
python3.11 ~/tool/pipx.pyz install pipx ; echo $?

# Ubuntuの場合
# python3 ~/tool/pipx.pyz install pipx ; echo $?
```
![opensuse_016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/b1b10b58-a310-47b2-13bf-8424acf06645.png)

pipx設定
.bashrcを編集してpipxコマンドの自動補完が効くようにします。
自動補完が効かない場合は、openSuSEに再ログインしてください。
```bash:pipxの自動補完設定
#  ~/.bashrcの編集
cd
echo '' >> ~/.bashrc
echo '# env for pipx' >> ~/.bashrc
echo 'eval "$(register-python-argcomplete pipx)"' >> ~/.bashrc
echo '' >> ~/.bashrc

# ~/.bashrcの反映
source ~/.bashrc
```
```bash:pipxの自動補完の確認
#pipxコマンドの自動補完が効くことをテストします。
#pipxまで入力したらtabキーを押す
pipx

# pipxバージョン確認
pipx --version
```
![opensuse_018.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/b528758b-dc56-033b-c485-3e250d9bda57.png)

### poetryの導入
poetryはPython仮想環境の構築、ライブラリ/パッケージの依存管理を行うツールです。

```bash:poetryの導入
# 導入
pipx install poetry ; echo $?

# 自動補完設定
poetry completions bash >> ~/.bash_completion
source ~/.bash_completion

# 自動補完確認
# 自動補完が効かない場合は、openSuSEに再ログインしてください。
poetry

# poetryバージョン確認
poetry about
```
![suse002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/605462fa-4dea-887f-1f4c-c1cf04d2d52a.png)

poetryパラメータ設定
poetry仮想環境のフォルダごとにライブラリやパッケージを導入する設定を行います。
この設定により、「複数のproject があっても、フォルダを移動する事で環境を切り替え」たり
「projectに導入されたPython仮想環境をVSCodeが認識しやすく」なります。

```bash:poetryのvirtualenvs.in-projectパラメータ設定
poetry config --list
poetry config virtualenvs.in-project true ; echo $?  
poetry config --list
```
![suse003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760084/6dbcc6b6-9177-1bf1-171e-56edaaf30036.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)