WindowsからリモートでLinux系OSのGUIを表示する

今回はボクが何かを開発するにあたって度々必要になったことがあるタイトルの内容を自分メモも含めてまとめたいと思います。

##要するにこういうことを実現する
![000.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/e83412d9-8dd8-c21a-30ba-2c25baaae2a6.jpeg)
遠隔でLinuxマシンに繋げた際に何かの実行結果にGUIの表示が必要な場合などに使えます。ん？リモートデスクトップでつないで直接使えばいいんじゃないん？という話になるかもですがヘッドレス化させてる個体だったりとにかく処理をダイエットさせたいケースとかに使えるかなと。実際色んな応用に使えると思うので覚えておいて損は無いと思います。あとなんかカッコいいことしてる感が無駄にでます。もう使う理由はこれが全て。
今回はWindows側でGUIの表示までを書いていきたいと思います。そこまでできればPythonか何かでカメラ映像を表示させるところまではきっとワケはないはず。

##概要偏
###X Window System
まずUnixやLinuxがどうGUIを実現させているのか。こやつらは <b>X Window System</b> というシステムの上でなりたっております。ほとんどのUNIX系システムで標準採用されており、いろーんな呼び方がありますがX11とかX Window Systemとかが良く見かけるそう。略して X とだけ呼ぶみたいです。(略しすぎ)
		
###クライアントとサーバー
![001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/594c0bdc-44ac-5eae-79b5-dc6aeeb9a1d4.jpeg)
1. キーボード等の入力端末からの情報
2. サーバーからクライアントへ入力データを送信
3. 受け取ったデータを元に処理結果をサーバーへ送信
4. 結果をディスプレイに表示
普段ボクたちが頭の中でイメージできるクライアントとサーバーの関係とは逆のイメージになりますね。

クライアントは端末エミュレータ、つまり今回で言うsshで繋げる先のマシンがクライアントになります。
逆に、サーバーはユーザーが実際に操作している接続元のマシンがサーバーとなります。
つまりクライアントはサーバーから送られてくる入力情報を解釈して描画命令を発行、サーバーはクライアントから描画情報を解釈してディスプレイに表示させます。

###ネットワーク上で動作可能<
![002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/f87c914f-98c0-d915-d6de-5e6cf508d6ce.jpeg)
必ずしもクライアントとサーバーが同一マシン上で動作する必要はなく、ネットワーク越しでクライアント、サーバーに分かれて動作することが可能です。
これらの通信には <b>X プロトコル</b>というOSに依存しない通信規約を用いているので、ハードウェア、OSに依存せずに扱う事が出来ます。便利なもんだ。
ざっくりと前提知識を雰囲気で理解したところで実際に動かしてましょう。まずはインストール偏からどうぞ↓


##インストール偏
###Step1
UNIX系OSがインストールされている端末を用意するか、手持ちのWindowsに<a href="https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-install" style="color: rgb(0,0,255)">WSL</a>をインストールしてください。今回の参考画像ではローカルのWindows内にWSLをインストールしてテストしていきます。

###Step2
なにかしらの形で用意できたら、次に前述した <b>X Window System</b> をお持ちのWindows上に用意します
今回はWindows側がサーバーとなるので、そのX serverを用意する為に専用のソフトウェアをダウンロードしてインストールします。このソフトウェアがまどろっこしいことにいくつかあるんですが、今回はフリーで使える「VcXsrv」を使用します。

[VcXsrv](https://sourceforge.net/projects/vcxsrv/)
![003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/133235a7-8a58-2b76-cae1-a8976e516ae3.jpeg)
![004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/5c6f43cd-7579-64a4-0306-b5fa6990e7fe.jpeg)
![005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/da230caa-850a-866e-c2c5-57477236ed4b.jpeg)
C:\Program Filesの中にVcXsrvフォルダが作成されているかと思います。この中にあるXLaunchというアプリケーションを使用します

![006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/ef34480d-d4c5-c051-8d07-28c6ed1bf47a.jpeg)
##設定偏
###クライアント側
環境設定をするためにホームディレクトリ以下にある.profile、もしくは.bash_profileを編集します。
どれやねん！ってなった方は $~/.bash_profileを編集してください。無い場合は

```
$ touch ~/.bash_profile
```

で作成します。そして次のコードを入力していきます。

```
$ echo export DISPLAY=localhost:0.0 >> ~/.bash_profile
$ source ~/.bash_profile
```

最後に以下のコードで設定が反映されているか確認します。

```
$ echo $DISPLAY
```			

これでさっき入力した localhost:0.0 がコンソールに出力されていれば成功です。
このDISPLAY環境変数で、Xサーバーの場所、つまり表示先を指定します。localhostがアドレスになっているので、もしローカル内にサーバーが無い場合は指定のIPをここに入力すればいいだけですね！簡単。ちなみにアドレスの後ろにある数字はディスプレイ番号を指定しています。接続先にディスプレイが複数ある場合に使用します。今回は0を指定しているので、デフォルトの画面が表示対象になります。

![007.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/9482ead9-8e4f-d528-4026-24f3ccba35ac.jpeg)

###サーバー側
先ほどインストールしたアプリケーション xlaunch.exe を立ち上げるだけです。

![008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/a7c3f318-67a9-98e2-bda3-f0fa596c35c8.jpeg)
![009.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/40b5e1a3-6738-c4fb-03f8-cf70ebeae6ad.jpeg)
![010.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/f3688b3b-f2ba-1bff-edae-d1d9cbc0ed98.jpeg)
![011.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/cb75d7ae-58f1-a3fd-cfaf-d27873c4fbd2.jpeg)


もしクライアントとサーバーが同一マシン内で動作しない場合は、先ほどインストールした VcXsrv にちょっとした変更が必要です。
VcXsrvのフォルダ内にX0.hostsというファイルがあるのでこれに一行追記します。
追記内容は、クライアントのIPアドレスです。管理者権限でないと編集できないのでご注意を

![012.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/56a4a267-9023-0e14-ac31-4b31f7718b92.jpeg)
クライアントのIPアドレスを追加
![013.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/4355a3b4-45c0-1d14-fa8b-8951f57bc45c.jpeg)
以上で準備は完了です


##実践偏
では実際に動かしてみましょう。WSLでやっている場合はまだ何もインストールされていないので、Xサーバー対応のアプリケーションを以下のコマンドでインストールします。

```
$ sudo apt-get install -y x11-apps
```

これで簡単なGUIアプリケーションをインストールできたので早速試してみましょう。以下のコマンドでアプリケーションを実行します。

```
$ xeyes
```

謎の目玉が表示されれば成功です。正しく設定されていない場合はエラーが表示されますので、その際は先ほど編集した~/.bash_profileか、接続先のIPを確認してください。

![014.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/5f721c2d-f6b6-c691-5596-f397ac488a1c.jpeg)
たまに起動すると謎に安らぐ(疲れてるワケじゃないです)

![015.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163667/52c6f52f-663c-ed96-10d1-c2939eae956b.jpeg)
他にも $ xclac で電卓を出せたりします。


##お疲れさまでした
色んなところで幅広く使えそうですが、それ使わなくてもこれが～みたいな最適解はケースによっていくつか存在しそうなので、状況をみながら適材適所で役立てていきたいですね