InltelliJ (Jetbrain製品) をWSL2上のUbuntuから直接起動する。

# はじめに
WSL2上で開発を進めるのにあたって、WindowsとWSL2をまたいだ開発環境、例えばIntelliJをWindows側で起動、ファイルはすべてUbuntu(WSL2)上にある場合、２つのファイルシステム間のファイルのやり取りが非常に遅いため、IntelliJ上のファイルのインデックスやコンパイルなど、許容しがたい遅延が発生してしまい、現実的に使い物にならない。

そのため[JetBrains Gateway(2023/9時点ではBeta機能）](https://www.jetbrains.com/ja-jp/remote-development/gateway/)を利用して、WSL2側にIntelliJをHeadlessとインストールし、Windows側のIntelliJからアクセス（WSL2側に対してVSCodeを使う場合の、VSCodeのアプローチと同等）する方法で問題ない応答速度で開発できていた。

しかし最近のWindows11のアップデートの影響でGateway (JetBrains製品全般）がWSL上の仮想インスタンスを認識しなくなってしまい、暫定的にWSL上から直接IntelliJを起動する方法を模索した。[詳しくはこのチケットを参照。](https://youtrack.jetbrains.com/issue/GTW-6301)

この記事ではWSL2上から直接IntelliJを使う方法を説明する。

# 筆者環境
- Windows 11 Pro
- Linux 5.15.123.1-microsoft-standard-WSL2 (Ubuntu 22.04)
- Zshを利用

## VcXsrvのインストール(Windows)
1. [SourceForge](https://sourceforge.net/projects/vcxsrv/)から、実行ファイルをダウンロード
1. 設定項目の選択ダイアログが出てくるが、すべてデフォルトのまま選択して次へ、でインストール (詳細は[この記事](https://www.kkaneko.jp/tools/win/vcxsrv.html)を参照)
1. デスクトップに以下のコマンドを起動するショートカットを作成
    ```terminal
    "C:\Program Files\VcXsrv\vcxsrv.exe" :0 -ac -terminate -lesspointer -multiwindow -clipboard -wgl -dpi auto
    ```
1. このショートカットをクリックしてVcXsrvを起動。

## Ubuntuの設定(WSL2)
1. Ubuntuを最新にアップデート
    ```terminal
    sudo apt update
    sudo apt upgrade
    ```
1. ディスプレイ設定
以下のコマンドを実行。自動的に起動したVcXsrvからディスプレイ情報を取得してくれる。
    ```terminal
    export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2; exit;}'):0
    ```
1. 試しにターミナルで以下のコマンドを実行して、`xeyes`が起動するか確認。
    ```terminal
    xeyes
    ```
1. xeyesが存在しない場合は以下のコマンドでインストール
    ```terminal
    sudo apt install x11-apps
    ```
ここまで正しく設定されていれば、`xeyes`が起動するはず。

## JetBrains Toolboxのインストール(WSL2)
1. [JetBrainsのToolbox AppをUbuntuにインストールするだけ](https://qiita.com/amanoese/items/cf50dcb984169b451a0e)の記事を参考にして、[jetbrains-toolbox-install](https://github.com/nagygergo/jetbrains-toolbox-install)を利用して、JetBrains Toolboxをインストール
    ```terminal
    $ curl -fsSL https://raw.githubusercontent.com/nagygergo/jetbrains-toolbox-install/master/jetbrains-toolbox.sh | bash
    ```
1. インストール後に出るプロンプトに従って、自分のシェルのPATHに以下を追加すること。
    ```terminal
    PATH="$PATH:$HOME/.local/bin"
    ```

## 起動
インストールした後は、以下の手順で起動できる。
1. Windows上に作ったVcXsrvのショートカットを起動
1. ターミナルで、[この](https://qiita.com/drafts/d7c13f3468231522381f/edit#ubuntu%E3%81%AE%E8%A8%AD%E5%AE%9Awsl2)プロンプトを実行してDISPLAY変数を設定する。筆者は起動コマンドシェルを作って、コマンドとして実行できるようにした。
1. 続いて`Ubuntu`のターミナルで以下をタイプ
    ```terminal
    jetbrains-toolbox
    ```
    するとXWindow内に`JetBrains Toolbox`が立ち上がる
1. JetBrains Toolbox内で、IntelliJを選択、起動すると自動的にインストールが始まり、IntelliJが起動される。

# まとめ
上記の方法でうまく行くのだが、XWindowsを起動するタイミングによって正しくToolboxやIntelliJが立ち上がらない状況に遭遇している。その際に自分がやっているのは
1. 再起動
1. Ubuntuのターミナルがアクセスできるまで待つ。
1. 立ち上がってから[この](https://qiita.com/drafts/d7c13f3468231522381f/edit#ubuntu%E3%81%AE%E8%A8%AD%E5%AE%9Awsl2)プロンプトを実行してDISPLAY変数をセット
1. jetbrains-toolbox　コマンドを実行

という手順で動かした。一度XServerを落とす（起動しているターミナルを落とす）と、ディスプレイへの接続などができずToolboxやIntelliJの画面が立ち上がってこなくなったりした。

ということで結論としては、

## ベストなアプローチ
Windows側でJetbrain Gatewayを利用して、VSCodeと同等のWSL2側をHeadless、Windows側をアプリケーションのフロントとした開発方法を利用する。

## 緊急避難的にWSL2上でのJetbrain製品直接起動を利用
Jetbrain製品をWSL2上でGUIアプリとして直接起動は可能だが、いろいろな制約やGUIの縮退がみられるため、現場で利用するにはあくまで緊急避難的な用途と考えた方がよさそう。

# 参考資料
- [VcXsrv のインストール（Windows 上）](https://www.kkaneko.jp/tools/win/vcxsrv.html)
- [How to install and run IntelliJ Idea for Linux in WSL2](https://nirisarri.github.io/2020-11-03-how-to-install-and-run-intellij-idea-for-linux-in-wsl2/)
- [X11 Forwarding and Windows Subsystem for Linux 2](https://thomasward.com/wsl2-x11/)
- [Setup and run IntelliJ in WSL2](https://stephencowchau.medium.com/setup-intellij-in-wsl2-a6349dd9d5d1)
- [JetBrainsのToolbox AppをUbuntuにインストールするだけ](https://qiita.com/amanoese/items/cf50dcb984169b451a0e)