昔ながらの方法でMacに雪を降らす

# はじめに
もうすぐクリスマスですね。なのでMacで雪(もしくはペンギン)を降らそうと思います。
(書くことがあまり思いつかなかったので、これでお茶を濁すことにします。)

## 対象読者
タイトルを見ても何のことか心当たりがない方。
何のことか予想がつく方は多分その予想で合っているので、読まなくても大丈夫だと思います。

# 手順
以下を実施します。
(OSはmacOS Mojaveで、HomebrewとDockerがインストール済みでDockerが動いていることを前提としています。)

### XQuartzのインストール・設定

ターミナルを開いて以下を実行します。

```sh
$ brew update && brew cask install xquartz
# 途中でパスワードを入力する必要があるかもしれません
# "xquartz was successfully installed!"と表示されたら完了です
$ sudo launchctl load -w /Library/LaunchAgents/org.macosforge.xquartz.startx.plist
# パスワードの入力を求められたら、パスワードを入力します
$ open /Applications/Utilities/XQuartz.app
```
うまくいくとXQuartzというアプリケーションが起動しますので、設定を変更します。
<img width="263" alt="pref.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213647/0f5fa924-d8fa-55e0-c0e2-cdf6a1a7d5a0.png">

以下のように設定します。
<img width="696" alt="output.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213647/be3d2427-c992-eeef-6181-52758c7d6f8d.png">
<img width="696" alt="security.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213647/079e731f-ced7-2964-09f0-349ad09afd77.png">

### ログアウト & ログイン

設定を反映させるために一旦ログアウトし、再度ログインします。

### 実行

以上で準備は完了したので実行してみます。
ターミナルで以下を実行します。

```sh
$ git clone https://github.com/hirota745/snow-falls.git
$ cd snow-falls
$ sh fall.sh
# もし雪ではなくペンギンを降らせる場合は $ sh fall.sh penguin
```

上記を実行後、数分待ちます。

全てうまくいくと、画面が切り替わり雪が降ってくるはずです。おめでとうございます。
(ちなみにしばらく待つと雪が積もったり風が吹いたりしますので、じっと見ているのも良いかもしれません。)

画面が切り替わらない場合は、Command+tabを何度か押してXQuartzに切り替えます。
それでも画面が変わらない場合は、メニューから以下を選択します。
<img width="261" alt="fullscreen.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213647/b6190bb9-b384-00de-f539-d9c3cc5743e6.png">

### 終了方法

フルスクリーンを解除するためにメニューから以下を選択します。(メニューは画面上部にマウスカーソルを持っていくと表示されます)
<img width="261" alt="fullscreen.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213647/b6190bb9-b384-00de-f539-d9c3cc5743e6.png">
(たまにXQuartz自体が落ちてしまうことがありますが、終了させたいので無視して大丈夫だと思います。)
その後ターミナルでCtrl-cを入力すれば終了します。

もし再度実行したいときは、ターミナルで以下を実行します。

```sh
$ sh fall.sh
# もし雪ではなくペンギンを降らせる場合は $ sh fall.sh penguin
```

## 仕組み
何も説明がないのもよくないので、少しどういう風に動いているか説明します。

まず動いているアプリケーション自体は、xsnow(ペンギンの場合はxpenguins)というアプリケーションです。
これらはLinux上で動作しています(もしかするとMac上で直接動かすこともできるかもしれませんが、試していません)。パソコンに直接LinuxをインストールしたりVirtualboxにLinuxをインストールした場合、WindowsやMacと同様にGUIアプリケーションをLinuxの画面で表示・操作することができます。Linux上でGUIアプリケーションを動作させる場合X Serverというものが必要で(GUIアプリケーション自体はX Serverと通信するClientとなります)、通常はこのX Server自体もLinux上で動作しています。(下図)
![x1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213647/ee190839-51c1-2f72-00f4-c46d1cba2e23.png)

このX Server自体はClientアプリケーションが動作しているマシン上で動いている必要はなく、別マシンで動いていても問題ありません。今回の構成ではLinuxはMac上のDockerで動いていて(Debianが動いています)、Clientアプリケーション(xsnow)はそのLinux上で動いています。ただしX ServerはMac上で動かし、そこにLinuxで動いているClientアプリケーションが接続するようにしています。こうすることでMac上で直接xsnowが動いているように見えます。
(下図)
![x2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213647/ab917361-320f-a0ee-15af-ad85485d114e.png)


図の中の"Client App"は何でもよくて、例えばFirefoxやEmacsなども同様に動作させることができます。これらのアプリケーションの場合、今回動かしたxsnowとは違い独立したウィンドウで動作するものなので、XQuartzの「出力」タブで設定したフルスクリーンモードの設定が不要となります。そうすると、Mac上で直接動作している他のMacのアプリケーション(Finderなど)と同じ画面でLinux上で動作しているアプリケーションを表示・操作することができて、よりMac上で動いているように見えてきます。

# まとめ
あまり需要はないかもしれませんが、LinuxでGUIアプリケーションを動かしてそれをMac上で表示してみました。
最近ではDocker等を使ってどこでも比較的簡単にLinuxを動かすことができますが、通常はGUIアプリケーションを動かすのではなくターミナルなどからLinuxにログインしそこでコマンドラインで作業することが多いのではないかと思います。今回やってみたようにX Serverと組み合わせれば、LinuxのGUIアプリケーションも普段使っているOSで動かしているGUIアプリケーションのように動かすことができます。これを機会にLinuxのGUIアプリケーションも使ってみるのもよいかもしれません。

# 参考
- https://www.xquartz.org/