自宅PCをWindows11にアップグレードしてWSLを触ってみた

初めて投稿します。
某インターネットプロバイダでSEとして従事して数十年のロートル技術者です。:sweat_smile:
一応まだ開発案件には関わっていますが、残念ながら最近は管理業務が中心で直接開発をしなくなってだいぶ経っている状況です。
ただ昔から新し物好きな性格は変わらず、業務外・プライベートではハードウェア、ソフトウェアに関わらず、色々手を出してはいます。

今回、とある事情により、Windows11アップグレードと簡単なWSL（Windows Subsystem for Linux）新機能の使用レポートを書いてみました。

# 今回やること
1. Windows11にアップグレードしてみる
2. Windows11にWSLをインストールする
3. WSL上でGUIプログラムを動かしてみる

## とりあえずWindows11にアップグレードしてみる
今さらですが、自宅PCをWindows11にアップグレードしてみました。

Windows11は他の方々の記事等を見ていましたが、「今のところ積極的に入れるメリットはないなぁ。まあ無料アップグレード配信が始まったら、インストールするでよいか」という感じでしばらく放置していました。
しかしなかなかアップグレードが始まらず、そろそろ待ちきれなくなってきて、ある日「強制アップグレードしてみよう」と思い立ちました。

詳細については別記事「Windows11のアップグレードしてみる」で記載しましたが、一応「PC 正常性チェック アプリ」で環境サポート状況を確認の上、強制アップグレードを行いましたが、特に問題なくあっさりWindow11にアップグレードできました。（数十分PCを放置していたら、いつの間にかWindow11になっていた・・・という感じ）

https://qiita.com/sugyam/items/905a8c3121da1f117725

## Windows11にWSLをインストールする
次は、WSL(Windows Subsystem for Linux）とUbuntuのインストールです。

WSLは、2020年5月にWSL1からWSL2にバージョンアップした際に大幅な見直しがありましたが、今回Windows11のWSLはWSL2になっています。
![WSL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369407/3db18bdc-31c1-0a27-dc5e-e6de01a14838.png)
その他はあまり目新しい変化はないですが、個人的には「WSLgの正式サポート」に着目ですかね。この機能は、Linux上でGUIプログラムを実行するための「X Windowサーバ」の機能が新たにサポートされました。これにより今まで別途必要だったWindows用のX Windowサーバアプリケーションが不要になっています。
![WSLg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369407/42d2db89-a78d-7d20-9d4b-152479ddd323.png)
インストールの詳細については、別記事「Windows11にWSLをインストールしてみる」で記載しましたが、こちらも特に問題なくインストールできました。ただ既にWindows10でWSL1を使っていた場合には、WSL2へのアップデートが必要ですので、ご注意ください。

https://qiita.com/sugyam/items/0ee4d823432c2b7492b6

それではWSL上で、Ubuntuをインストールした後、早速WSLgの機能を確認してみましょう。まず標準のX-Windowアプリが動くかの確認です。

```
$ sudo apt install x11-apps -y
$ xeyes&
```
初回起動は数秒程度待たされるので、じっと我慢していると、無事X11アプリが起動しました。
![xeyes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369407/3598210c-7206-e9b4-0655-6a47d91ccd21.png)


## WSL上でGUIプログラムを作ってみる
前述までで今回の目標は達成しましたが、今まではただインストールして動かしただけです。曲がりなりにも技術者と名乗っている手前もあり、これでは全然物足りません。
そこで今回構築したWSL上のGUI環境の稼働確認も含め、何と数十年ぶりに簡単なX Windowアプリを作ってみることにしました。

昔はC言語を使って、X WindowのAPI仕様書を見つつ、XlibやXToolkitとかを使ってゴリゴリ作るしかなかったので、結構大変な作業でした。
（学生時代、X Windowは無料でGUI環境が作れる唯一の選択肢だった。。。）

しかし最近はTkツールキットのTkinterライブラリもサポートしているPythonの「PySimpleGUI」とかもあるので、簡単にスクリプト言語を使ってLinux上でGUIアプリを作成することができるようです。（本当に便利な時代になりました）
![GUI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369407/b9fd983e-27bd-a20e-d624-fec00c3f7d5c.png)
それでは「PySimpleGUI」の環境構築のため、python3-tkとPySimpleGUIをインストールします。

```
$ sudo apt install python3-pip -y
$ sudo apt install python3-tk -y
$ pip3 install PySimpleGUI
```
これで環境が整ったので、早速簡単なGUIプログラムを作ってみましょう。
簡単なプログラムなので、コメント文だけで特に説明は不要でしょうね。

```
# coding: utf-8
import PySimpleGUI as sg

# 画面切り替えフラグ初期化
flag = 0

# ウィンドウ作成
cv = sg.Canvas(size=(400,400))
layout = [[cv]]
window = sg.Window('サンプルプログラム', layout, finalize=True)

# Canvas上への描画（赤）
tcv = cv.TKCanvas
tcv.create_oval(50,50,350,350, outline='#000000',width=5,fill='#ff0000')
tcv.create_oval(135,80,185,130, outline='#ffffff',width=20,fill='#000000')
tcv.create_oval(215,80,265,130, outline='#ffffff',width=20,fill='#000000')
tcv.create_oval(180,200,230,300, outline='#000000',width=5,fill='#ff8888')

# Canvasでマウスボタン押下イベントを検知できるようにする
cv.bind("<ButtonPress>","")

# イベントループ
while True:
  event , values = window.read()

  # ウィンドウクローズボタンを押すと、プログラム終了
  if event is None:
    print('プログラム終了')
    break

  # マウス押下イベント処理
  if event == "<ButtonPress>":
    if flag == 0:
      # Canvas への描画（緑）
      tcv.create_oval(50,50,350,350, outline='#000000',width=5,fill='#00ff00')
      tcv.create_oval(135,80,185,130, outline='#ffffff',width=20,fill='#000000')
      tcv.create_oval(215,80,265,130, outline='#ffffff',width=20,fill='#000000')
      tcv.create_oval(150,230,250,280, outline='#000000',width=5,fill='#ff8888')
      flag = 1
    else:
      # Canvas への描画（赤）
      tcv.create_oval(50,50,350,350, outline='#000000',width=5,fill='#ff0000')
      tcv.create_oval(135,80,185,130, outline='#ffffff',width=20,fill='#000000')
      tcv.create_oval(215,80,265,130, outline='#ffffff',width=20,fill='#000000')
      tcv.create_oval(180,200,230,300, outline='#000000',width=5,fill='#ff8888')
      flag = 0

# 終了処理
window.close()
```
上記のサンプルプログラムをファイルに保存した後、WSLのシェル上でpython3で実行します。

```
% python3 sample.py
```
すると、Canvasオブジェクトに書いた絵が表示され、この絵をクリックすると、交互に絵が切り替わるようになりました。:clap::clap:（パチパチ）
![sample2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369407/e6058262-eb1c-4fd2-8953-586ad853e599.png)

# 最後に
最近の開発者はMacを使うことが当たり前になっています。しかしさまざまな制約により、まだまだWindows上で開発している方もいらっしゃると思います。

今回はご紹介できませんでしたが、（Docker Desktop for Windowsではなく）WSL2上にdockerとかをインストールして動きますし、いざとなったらWSLを簡単にまっさらな状態から再構築することもできるので、かなり便利になってきています。

このように、ベースOS環境のWindowsとは完全に切り離された仮想Linux環境を使えるようになった今、もう一度Windows＋WSL2をローカル開発環境の選択肢として検討してみても良いかなと思いました。