Go+Fyneで作ったデスクトップアプリを新WSL上で動かしてみる
こんにちは、株式会社SHIFT、自動化エンジニアの水谷です。
今回の記事はGoでのプログラミングではなく、どちらかと言うと時事ネタのようなものになります。
ご存じの方もいらっしゃると思いますが、少し前にWindowsの最新バージョン "Windows 11" がリリースされ、それに伴いWSL(Windows Subsystem for Linux)も新しいバージョンがMicrosoft Storeでプレビュー公開されました(2021年10月時点)。
この新しいWSLの大きな特徴の1つが、Linuxのコマンドやコマンドラインアプリだけでなく、LinuxのGUIアプリもWindows上で動かしてしまおうという、WSLgのサポートです。
WSLが登場したときに、「Windows上で本物のUbuntuが動く」というだけで驚いたものですが、ついにWindows上でシームレスにLinuxのGUIアプリまで動くことになってしまったのです! これはWindowsのターニングポイントの1つとして挙げられる出来事ではないかな、と個人的には思いましたので、今回の記事ではそのWSLgをインストールして、少し前の記事でGo+Fyneで作ったマンデルブロー集合描画のGUIアプリをWSL上のUbuntuで動かしてみたいと思います。
新WSLのインストール
先ほども書きましたが、新しいWSLは、Windows 11用として、現在プレビュー公開されています。Windows 11がインストールされているPCから、Microsoft Storeを開き、"WSL"のキーワードなどで検索すると見つけることができますね。アプリ名は「Windows Subsystem for Linux Preview」です。
上のスクリーンショットはインストール後のものですが、未インストールの場合は「インストール」(あるいは「Install」)ボタンのワンクリックでインストールができます。
※使用したPCには、以前のバージョンのWSL2がインストールされている状態でしたが、特に問題なくインストールできました。
試しにX11-appsを入れてみる
Microsoft StoreからUbuntu 20.04を新たにインストールして、さっそくWSLgを試してみたいと思います。
まずは、X11のデモ的なアプリが入っている"X11-apps"を入れてみて、有名な(?)"xeyes"などが動作するか見てみましょう。
> sudo apt install -y x11-apps
インストールが終ったら、xeyesとxcalcを実行してみます。
> xeyes &
> xcalc &
なんともあっさり起動してしまい拍子が抜けてしまいますw
WSLgのプレビュー版が出回った時には、これを動作させるだけでもとても多くの作業が必要で、「ちょっと手が出せないな」と思っていたのですが、この新しいWSLならほぼ何もせずにGUIアプリが動いてしまいます(少しトラブルがあった方が記事的には面白いのにw)。
Firefoxもインストールしてみる
続いて、Firefoxも試してみました。
> sudo apt install -y firefox
インストールはあっさり完了し、起動して見ると……。
ターミナルにいろいろメッセージは出たりはしますが、動いています。
ただ、https://www.shiftinc.jp を開いてみると、下のように文字化けしています。
これは単に日本語のフォントが入っていないだけなので、"Takaoフォント"を、下のようにインストールしてみます。
> sudo apt install -y 'fonts-takao-*'
これで、SHIFTのホームページもこのように表示されました。
まだ動画の再生には足りないものがあるようですが、とりあえずここまでにします。
※Chromeもチャレンジしたのですが、インストールは成功したものの、起動後数秒でフリーズしてしまいました。原因は不明です。
Go+Fyneで作ったアプリをWSLで動かす
それではGoで作ったGUIアプリはどうでしょうか? この記事で作ったアプリで試してみます。
Goのバージョン1.16をインストールして、Windows上で作ったアプリをディレクトリごとUbuntuのホームディレクトリにコピーし、おもむろにビルドを実行してみます。
もしかしたら、そのままビルドも通ってしまうのでは……、とちょっと期待したのですが、残念ながらビルドエラーが発生しました(なぜかここでちょっと喜ぶw)。
それもそのはず、libx11-devなどX11関連のヘッダーファイルやライブラリを1つもインストールしていないので、当然の結果と言えるでしょう。
もぐらたたき的に、エラーが出るたびに必要なパッケージをインストールしていき、結果的には下のように合計7つのパッケージをインストールするとビルドが通ることが分かりました。
> sudo apt install -y libx11-dev libxcursor-dev libxrandr-dev libxinerama-dev libxi-dev libgl1-mesa-dev libxxf86vm-dev
で、実行して見ると……、期待通りに動作しました!
Windows用にビルドしたアプリと並べて表示すると、このようになります。
同じソースコードから、別のOS用にアプリがビルドされ、それが同じマシンの同じデスクトップ上に並んで動作している姿は、なんとも不思議なものですね。
Windowsは元々から複数の「サブシステム」を組み合わせて構成されたハイブリッドカーネルのOSです(「Windowsは」と書くと誤解を招く可能性があるので、「Windows NT系OSは」とした方がよいですね)。古くからサブシステムの1つとしてPOSIXが動いていたり、Interixなんてのもあったりして、WindowsにはLinux系のコマンドが使えるような工夫が昔からありました。そして、ついにはLinuxのGUIアプリがシームレスに動いてしまうようになったのです。
もう少ししたら今度はWindows上でAndroidアプリも(エミュレーターではなく)サブシステムで動く、という話も出てきていますね。なんともすごい世界になってきたな、などと思ったりもしますが、四半世紀前からこんな将来を見据えてモノリシックでもなくマイクロでもない、絶妙な設計のハイブリッドカーネルでWindows NTを設計した(←かなり個人的な妄想です)カトラーはやっぱりすごい!(すごい!) と古参Microsoftファンの1人としては思ってしまったりしますw
ま、何はともあれこれでWindowsとUbuntuの両対応アプリの開発もより手軽にできるようになりますね!
――――――――――――――――――――――――――――――――――
★ 過去記事をまとめたマガジン「SHIFTエンジニアが学びながら解説するGo言語」もご参照ください。
お問合せはお気軽に
https://service.shiftinc.jp/contact/
SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/
SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/
SHIFTの導入事例
https://service.shiftinc.jp/case/
お役立ち資料はこちら
https://service.shiftinc.jp/resources/
SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/