Rust ArchでPistonを動かそう

<!-- Rust ArchでPistonを動かそう -->
# 序文

Rustで書かれたゲームエンジン、[Piston](https://github.com/PistonDevelopers/piston)を見つけた。  

早速`git clone`してあれこれ書いて、`cargo run`で走らせる。  
どっきどっきわっくわっくしながら待っている。  

そして次の結果が出た。  
![20171227040130.png](https://qiita-image-store.s3.amazonaws.com/0/144852/ad535998-5232-9fe5-238d-67ac4d440b00.png)

<!-- 写真貼って -->


は？  

ということで、本記事ではManjaro Linux（Arch Linux）でPistonにご挨拶する方法を書き記す。  
タイトル詐欺だと？ManjaroもArchも似たようなもんじゃ((暴言  

# 解決法を探す

ということで吐かれたエラーをコピペしてググってみる。  

``` 
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: "Couldn\'t find any pixel format that matches the criterias."', /checkout/src/libcore/result.rs:906:4
note: Run with `RUST_BACKTRACE=1` for a backtrace.

```

やはり同じような悩みを抱える人間は存在するものである。  
[このページ](https://github.com/PistonDevelopers/piston/issues/1202)にたどり着く。  

圧倒的英語文献と天才的な英語力を持つ私との激しい戦闘の末、以下の文章を見つけた。  

>Now that Ubuntu 17.10 artful has been released with Mesa version 17.2.2 this issue will affect more people. Including me!
>
>The bug is indeed a regression of Mesa from the 17.1 branch to the 17.2 branch.


...よくわからないが((おい どうも`mesa`のヴァージョンが`17.2`だと動かないとか何とか。  

ということで`mesa`のヴァージョンを下げてみよう！！  
ちなみに2017年12月27日現在で最新版は`17.3.0-2`である。  
え？問題は`17.3`ではなく`17.2`と？同じエラー吐かれたのだから同じだろ。  

# 解決法 downgraderを使う

さっきのページを読み進めると解決法は示してあるが、Archにやさしい手段ではない。  

`mesa`はpacmanのパッケージにあるのだから、「pacman 古いバージョン」でググったら何か出るのではないだろうか。  

とググったらあった。[パッケージのダウングレード](https://wiki.archlinux.jp/index.php/%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89)  

色々方法はあるが、私は[downgrader](https://aur.archlinux.org/packages/downgrader/)を使った。  

AURのインストールがわからなかったら後述の追記を見てね。  

インストールが済んだらターミナル上で`downgrader mesa`と入力する。  
すると以下の文が出る。  

```
 Downgrade package: mesa  
1: mesa-9.2.5-1  (from ALA)
2: mesa-9.2.4-1  (from ALA)
3: mesa-9.2.3-2  (from ALA)
4: mesa-9.2.3-1  (from ALA)
5: mesa-9.2.2-1  (from ALA)
6: mesa-9.2.1-1  (from ALA)
7: mesa-9.2.0-2  (from ALA)
8: mesa-9.2.0-1  (from ALA)
9: mesa-17.3.1-2  (from ALA)
10: mesa-17.3.1-1  (from ALA)
11: mesa-17.3.0-2  (from ALA)
12: mesa-17.3.0-1  (from ALA)
13: mesa-17.2.6-1  (from ALA)
14: mesa-17.2.5-1  (from ALA)
15: mesa-17.2.4-1  (from ALA)
16: mesa-17.2.3-2  (from ALA)
17: mesa-17.2.3-1  (from ALA)
18: mesa-17.2.2-1  (from ALA)
19: mesa-17.2.1-3  (from ALA)
20: mesa-17.2.1-1  (from ALA)
21: mesa-17.2.0-3  (from ALA)
22: mesa-17.2.0-2  (from ALA)
23: mesa-17.1.8-2  (from ALA)
24: mesa-17.1.8-1  (from ALA)
25: mesa-17.1.7-2  (from ALA)
26: mesa-17.1.7-1  (from ALA)
27: mesa-17.1.6-1  (from ALA)
28: mesa-17.1.5-1  (from ALA)
29: mesa-17.1.4-1  (from ALA)
30: mesa-17.1.3-1  (from ALA)
>> Please enter package number, [q] to quit
```

ここで`17.1`にしたいのだから`23`を入力してみよう。  
するとえっちらおっちらダウングレードしてくれる。  

※最新版に依存しているパッケージがあると最悪動かなかったりする（多分）のでダウングレードする際は注意してね。まあ動かなくなるのはそのパッケージだけだからそんな気にしなくていい。  

ここで再びPistonのディレクトリで`cargo run`を入力する。

<!-- 画像貼るよ -->
![20171227040204.png](https://qiita-image-store.s3.amazonaws.com/0/144852/1417f0f6-f1cf-02ef-5299-c62e7c275ef0.png)


やったぜ！！

# 古いバージョンを維持する

ここで`pacman -Suy`でパッケージを更新すると、`mesa`もアップグレードしてしまう。  
苦労してダウングレードしたのに再びアップグレードされては困る。  

特定のパッケージをアップグレードして欲しく無いときは、`/etc/pacman.conf`ファイルの`#IgnorePkg =`を`IgnorePkg = mesa`と書き換えればいい。  
`#`はちゃんと消してね。  

なお編集する際は管理者権限でエディタを開く必要がある。例えば、`nano`を使う場合は`sudo nano /etc/pacman.conf`, `vim`を使う場合は`sudo vim /etc/pacman.conf`と入力すれば良い。  

これで`pacman -Suy`でパッケージを更新しても、`mesa`のバージョンは更新されない。  
やったぜ！！  
[参考文献（2017/12/27）](https://wiki.archlinux.jp/index.php/Pacman#.E3.82.A2.E3.83.83.E3.83.97.E3.82.B0.E3.83.AC.E3.83.BC.E3.83.89.E3.81.95.E3.81.9B.E3.81.AA.E3.81.84.E3.83.91.E3.83.83.E3.82.B1.E3.83.BC.E3.82.B8.E3.82.92.E8.A8.AD.E5.AE.9A)

# 結論

- Pistonを使うには`mesa`のヴァージョンを`17.1`にする必要がある
- `pacman`のパッケージのヴァージョンを下げるには幾つか方法があるが、私は`downgrader`を使った
- `pacman -Suy`によるパッケージの更新でパッケージをアップグレードさせないためには、`/etc/pacman.conf`に`IgnorePkg =  *パッケージ名* `を記述すれば良い

# 追記

疲れたから後で書く