RaspberryPiにx11vncを導入する手順

# 目的

これまではTightVNC(tightvncserver)を使用していた。

しかし、`opencv-python`を使用して、
リアルタイムにカメラのプレビューを表示しようとしたら、
下記のエラーが発生してしまった。

```
GdkGLExt-WARNING **: Window system doesn't support OpenGL.
```

「TightVNCは起動中のデスクトップとは別のデスクトップを作成して接続するもの」という記述を見かけたので、そうではない`x11vnc`をインストールしてみる。

# インストール

```
$ sudo apt-get install x11vnc
```

接続した際に`~/nohup.out`の権限が無いとPermission Deniedエラーが発生する。
よって、権限を与えておく。

```
$ sudo chmod 666 ~/nohup.out
```

# 実行

まずは接続する際のパスワードを設定する。

```
$ x11vnc -storepasswd
```

大体の記事で起動時に`-create`オプションを付けずに実行していたが、
私の環境ではなぜか以下のエラーが出た。

```
$ x11vnc -usepw -forever
 .
 .
 .
18/09/2017 00:21:56 *** XOpenDisplay failed (:0)

*** x11vnc was unable to open the X DISPLAY: ":0", it cannot continue.
*** There may be "Xlib:" error messages above with details about the failure.

Some tips and guidelines:

** An X server (the one you wish to view) must be running before x11vnc is
   started: x11vnc does not start the X server.  (however, see the -create
   option if that is what you really want).

** You must use -display <disp>, -OR- set and export your $DISPLAY
   environment variable to refer to the display of the desired X server.
 - Usually the display is simply ":0" (in fact x11vnc uses this if you forget
   to specify it), but in some multi-user situations it could be ":1", ":2",
   or even ":137".  Ask your administrator or a guru if you are having
   difficulty determining what your X DISPLAY is.

** Next, you need to have sufficient permissions (Xauthority) 
   to connect to the X DISPLAY.   Here are some Tips:

 - Often, you just need to run x11vnc as the user logged into the X session.
   So make sure to be that user when you type x11vnc.
 - Being root is usually not enough because the incorrect MIT-MAGIC-COOKIE
   file may be accessed.  The cookie file contains the secret key that
   allows x11vnc to connect to the desired X DISPLAY.
 - You can explicitly indicate which MIT-MAGIC-COOKIE file should be used
   by the -auth option, e.g.:
       x11vnc -auth /home/someuser/.Xauthority -display :0
       x11vnc -auth /tmp/.gdmzndVlR -display :0
   you must have read permission for the auth file.
   See also '-auth guess' and '-findauth' discussed below.

** If NO ONE is logged into an X session yet, but there is a greeter login
   program like "gdm", "kdm", "xdm", or "dtlogin" running, you will need
   to find and use the raw display manager MIT-MAGIC-COOKIE file.
   Some examples for various display managers:
```

`-create`オプションを付けることで治った。

```
x11vnc -usepw -forever -create
18/09/2017 10:07:21 -usepw: found /home/pi/.vnc/passwd
18/09/2017 10:07:21 x11vnc version: 0.9.13 lastmod: 2011-08-10  pid: 9992
18/09/2017 10:07:21 
18/09/2017 10:07:21 wait_for_client: WAIT:cmd=FINDCREATEDISPLAY-Xvfb
18/09/2017 10:07:21 
18/09/2017 10:07:21 initialize_screen: fb_depth/fb_bpp/fb_Bpl 24/32/2560
18/09/2017 10:07:21 
18/09/2017 10:07:21 Autoprobing TCP port 
18/09/2017 10:07:21 Autoprobing selected TCP port 5900
18/09/2017 10:07:21 Autoprobing TCP6 port 
18/09/2017 10:07:21 Autoprobing selected TCP6 port 5900
18/09/2017 10:07:21 listen6: bind: Address already in use
18/09/2017 10:07:21 Not listening on IPv6 interface.
18/09/2017 10:07:21 

The VNC desktop is:      raspberrypi:0
PORT=5900
```

ちなみに、

+ `-usepw`はパスワードを使用して接続するオプション
+ `-forever`は最初に接続したユーザーが切断しても、x11vncが終了しないようにするオプション

# 自動起動設定

Raspberry Piを立ち上げるたびにx11vncを起動するのは面倒なので、
自動起動設定もしておく。

TightVNCの自動起動設定していたので削除。

```
$ rm ~/.config/autostart/tightvnc.desktop
```

x11vncの自動起動設定を追加。

```
$ sudo vi ~/.config/autostart/x11vnc.desktop
[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=X11VNC
Comment=X11VNC
Exec=x11vnc -usepw -forever -create
StartupNortify=false
Terminal=false
Hidden=false
```

再起動する。

```
$ sudo reboot
```

# 接続確認

Raspberry Piを再起動してから起動完了するまでちょっとだけ時間を置いてから、
手元のMacで、`Finder => 移動 => サーバへ接続`と進み、

```
vnc://(Raspberry PiのIPアドレス):5900
```

と入力して`接続`ボタンを押す。

<img width="795" alt="cli.png" src="https://qiita-image-store.s3.amazonaws.com/0/172314/ec33d4c0-6f49-d9af-325e-013d49537bce.png">

む。。。なんか黒い。
あ、Raspberry Piの起動設定を`CLI`にしてたんだった。

```
$ sudo raspi-config
```

`Boot Options => Desktop / CLI => Desktop Autologin`を選択。
再起動を促してくるので、再起動する。

時間を置いてMacで接続し直すと・・・

<img width="1130" alt="desktop" src="https://qiita-image-store.s3.amazonaws.com/0/172314/13c88f74-f800-e596-2b38-9e45f6cdc9b8.png">

この環境では`Window system doesn't support OpenGL.`も出なくなった。

<img width="1126" alt="preview" src="https://qiita-image-store.s3.amazonaws.com/0/172314/5d39795d-ccf3-80d4-3758-0585a12f356c.png">

# まとめ

+ 基本的にTightVNCよりもx11vncを使用した方が制約が少ない。
+ x11vncの起動時に`-create`オプションを付与しないとエラーが起こった。
+ Raspberry PiをDesktopモードで起動しないと、表示が崩れる。