Raspberry PiでScratchを動作させて画面だけ転送する方法

#はじめに
Raspberry PiでGPIOなんかと絡めながら簡単にScratchでプログラムを組んでいくことができますが、そのためにRaspberry PiにHDMIモニタやらキーボードやらマウスやらを接続するのは微妙にめんどくさいし、ケーブルが邪魔になったりします。

また、多くの場合は手元にRaspberry Pi以外の端末があると思いますので、例えばWindowsPCやMacなどでRaspberry Pi上のScratchの画面を直接操作できると、調べ物をしながらの作業でも効率がかなり良くなります。

そこで今回は、この画面を転送させる方法を2つ紹介します。

**※ この記事ではRaspbianの利用をしています。また、ネットワークの設定が終わっており、Raspbianに接続するためのIPアドレスも把握できていることを前提としています。**

#画面全体を転送する
画面転送だとVNCを利用する人が多い気がするのですが、個人的にはXRDPのほうが速度的にもクライアントの準備の手軽さ具合的にもオススメです。
ただし、日本語で使おうとすると少し工夫が必要なので注意しましょう。

##1. パッケージインストール
RasbianにXRDPパッケージを導入します。

```
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install xrdp
```
##2. 日本語キーボードの有効化
日本語キーボードを利用している場合は次のキーマップファイルを作成します。

```
cd /etc/xrdp
sudo wget http://w.vmeta.jp/temp/km-0411.ini
sudo ln -s km-0411.ini km-e0200411.ini
sudo ln -s km-0411.ini km-e0010411.ini
sudo ln -s km-0411.ini km-e0210411.ini
```
##3. LNAG変数の設定
日本語環境で画面が起動するようにLANG変数を設定します。
**Raspbianのデフォルトロケールが”LANG=ja_JP.UTF-8”の場合は、この設定は不要です。**

/etc/xrdp/startwm.shファイルを`sudo vi /etc/xrdp/startwm.sh`のようにエディタで編集します。
ここではviを指定していますが、nanoなどの他のエディタでも構いません。

ファイルは次の内容となるように更新します。コメントアウトするif文のブロックは削除でも構いません。

```
#!/bin/sh

#if [ -r /etc/default/locale ]; then
#  . /etc/default/locale
#  export LANG LANGUAGE
#fi

export LANG=ja_JP.UTF-8

. /etc/X11/Xsession
```
##4. xrdpサービスの再起動
設定を反映するためにxrdpサービスを再起動します。

```
sudo /etc/init.d/xrdp restart
```

##5. クライアントから接続

RDP接続が可能なクライアントからRaspberry Piに接続します。
WindowsならOS付属の「リモートデスクトップ接続」をそのまま利用できます。
Macの場合は[Microsoft Remote Desktop Connection Client for Mac 2.1.1
](http://www.microsoft.com/ja-jp/download/details.aspx?id=18140)をインストールして利用するとよいでしょう（[CoRD](http://cord.sourceforge.net)など、Mac用のRDP接続アプリは他にもあります）。

###CoRDでMacからRaspberry Piに接続した様子
![CoRDでMacからRaspberry Piに接続した様子](https://qiita-image-store.s3.amazonaws.com/0/35591/0ab52cf7-3cb7-c549-e15f-9b47f9e3e72a.png)

iPadやiPad miniなどからも接続が可能です。ただし、iOSではキーボードがUS配列として認識されますので、Raspbianのキーボード設定をJP配列としている場合は、[Pocket Cloud Pro](https://itunes.apple.com/jp/app/pocketcloud-rimotodesukutoppu/id326512817?mt=8)
のような接続時にキーボード配列を指定可能なアプリを利用すると良いでしょう。

###Pocket Cloud ProでiPad miniからRaspberry Piに接続した様子
![Pocket Cloud ProでiPad miniからRaspberry Piに接続した様子](https://qiita-image-store.s3.amazonaws.com/0/35591/44098b5f-81da-08dc-fa79-2c9797bf16f1.jpeg)

##6. Scratchの起動
あとは、通常と同様の方法でScratchを起動します。



#Scratchの画面だけを転送する
画面全体の転送は便利ではある反面、デスクトップ全体を起動して転送しなくてはならないのでそれなりにRaspberry Piに負担をかけてしまいます。

今回はScratchを使うのが目的ですから、Scratchだけを起動し、その画面を転送する方法を次に紹介します。

sshにはX11転送という、X Window Systemで画面描写するアプリケーションの画面だけをネットワーク越しに転送する機能があります。

この場合、ソフトウェアの処理自体はRaspberry Piで行いますが、実際の画面描写は接続した側（今回はWindowsPCやMac側）で行います。

その分、Raspberry Piにかかる負荷は軽減できますが、接続する側に事前にX11の画面を描写するための機能（X Server）が必要となります。

##1. 接続側の設定
X Windows Systemのサーバ機能を接続する側に準備します。

WindowsPCの場合は[Xming](http://www.straightrunning.com/XmingNotes/)を、Macの場合は[XQuartz](http://xquartz.macosforge.org)をインストールします。

今回はMacを例に説明を続けます。WindowsPCの場合は、事前にXmingの設定やSSHクライアントの設定が必要になりますのでご注意ください。

##2. SSH接続
通常と同じ要領でSSH接続しますが、その際に「-X」のオプションを指定します。
このオプションの働きにより、X11転送が可能となります。

```
ssh -X pi@RaspbianのIPアドレス
```

##3. Scratchの起動
ssh接続完了後は、X Window Systemで描写するアプリケーションをMacなどの接続側で操作できるようになります（leafpadなどを起動することも可能）。

ただし、Scratchの場合はそのまま`scratch &`として起動してもエラーが出て動きません。
ここでは少し長いですが、次のコマンドでscratchを起動します。

```
LANG=ja_JP.UTF-8 /usr/lib/squeak/4.10.2-2793/squeakvm -encoding UTF-8 -vm-display-x11 -plugins /usr/lib/scratch/plugins/:/usr/lib/squeak/4.10.2-2793/ -vm-sound-alsa /usr/share/scratch/Scratch20131203.image &
```

なお、このコマンドのうち、パスの途中にある"*4.10.2-2793*"と、最後の"*Scratch20131203.image*"の部分は、バージョンによって違う値かもしれませんので、お使いの環境に合わせた形でコマンドを実行してください。

毎回、こちらのコマンドを起動するのが億劫ならば、エイリアスを設定しておくのも良いでしょう。ただし、環境のアップデートをかけた時に上記のバージョン番号などが変化することがありますので、注意してください。

```
echo "alias xt-scratch='LANG=ja_JP.UTF-8 /usr/lib/squeak/4.10.2-2793/squeakvm -encoding UTF-8 -vm-display-x11 -plugins /usr/lib/scratch/plugins/:/usr/lib/squeak/4.10.2-2793/ -vm-sound-alsa /usr/share/scratch/Scratch20131203.image &'" >> ~/.bashrc
. .basic
xt-scratch
```

#まとめ
今回はScratchをテーマとして扱いましたが、他のアプリでも応用は効くと思いますので試してみてください。
特にXRDP想像以上にお手軽ですので、是非チャレンジしてみてください。

##おまけ
iOSアプリでもX Server機能を持つものがありましたが、実際やってみたところさほど操作感が良くなかったので、紹介は割愛しました。興味がある方はコチラも是非チャレンジしてみてください。