Ubuntu on WSL にSATySFi v0.0.3 を導入する

# はじめに
Ubuntuなるものを人生であまり使ったことがない人がSATySFiを導入してみたので、同じ沼にはまる人が出ないように、導入方法を書きます。

アドバイスをくれた方々、本当にありがとうございました。

# 前提条件
- 筆者はあまりUbuntuとかWSLに詳しくありません
- 導入するSATySFiのバージョンは0.0.3ですので、バージョンが変われば必要になる依存ソフト等も変わるので気をつけてください
- OSはWindows10です
- 困ったらTwitterで有識者に質問するのが一番です
- コピーしたテキストをUbuntuの"黒い画面"に貼り付ける時は右クリックできます

# WSLのインストール
まずは生のWindowsにWSL(Windows Subsystem for Linux)を入れます。
WSLの意味や仕組みについては各自調べるのが良いでしょう。

- コントロールパネル -> プログラム -> プログラムと機能 -> Windowsの機能の有効化または無効化　を選び、専用画面を開く
- 「Windows Subsystem for Linux」にチェックを入れる
- 再起動するかどうか聞かれるので再起動する

# Ubuntuの導入と初期設定
- マイクロソフトストアを起動させて「Linux」と検索する
- Ubuntuを選択してインストールする
- Ubuntuを起動する
- 名前とパスワードを入力することを求められるので入力する（半角英字と半角数字だけを使うのが安全です）
- 日本語言語パックのインストールをします

~~~
$ sudo apt -y install language-pack-ja
~~~

- ロケールを日本語に設定します

~~~
$ sudo update-locale LANG=ja_JP.UTF8
~~~

- ここで一旦閉じてもう一度起動させる

この程度だと思います。それ以外にも適当に設定してみて良いんじゃないでしょうか

# 依存ソフトウェアをインストールする
ここがわりと重要です。これがないと進みません。「[事前に必要なもの](https://github.com/gfngfn/SATySFi/blob/master/README-ja.md#%E4%BA%8B%E5%89%8D%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E3%82%82%E3%81%AE)」を読んで導入していきましょう。

~~~
$ sudo apt update
$ sudo apt install bzip2
$ sudo apt install build-essential
$ sudo apt install git
$ sudo apt install m4
$ sudo apt install make
.
.
.
$ sudo apt install ruby
~~~

みたいな感じで適当に入れていきます。ココらへんは本当に適当にやりましたが、「[事前に必要なもの](https://github.com/gfngfn/SATySFi/blob/master/README-ja.md#%E4%BA%8B%E5%89%8D%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E3%82%82%E3%81%AE)」にかかれているものは**全て**導入する必要があります。

あとはきちんとメッセージを読んで、インストールに失敗しているものが出ないようにしましょう。出たらきちんと入れ直しましょう。

# opam 2.0のインストール
~~~
$ sh <(curl -sL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh)
~~~

でインストールできます。

# ocaml 4.06.0のインストール
ここでやり方がわからず、沼りました。やり方さえ分かれば簡単に終わります。途中質問がされますが、きちんとメッセージを読んで答えましょう（筆者はどちらにもyと答えました）。
この行程はかなり時間がかかりますが、終わるまでのんびり待ちましょう。TeXLiveのインストールのようなものです。

~~~
$ opam init --comp 4.06.0 --disable-sandboxing
$ eval $(opam env)
$ opam repository add satysfi-external https://github.com/gfngfn/satysfi-external-repo.git
$ opam update
~~~

opamとOCamlがきちんと入ったかを確かめるには以下のように入力し、このように出力されれば成功です。

~~~
$ opam --version

2.0.0

$ ocaml --version

The OCaml toplevel, version 4.06.0
~~~

バージョン番号がずれていたら

~~~
$ rm -rf ~/.opam
~~~

をして

~~~
$ sh <(curl -sL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh)
~~~

からやり直します。

# ビルド
まずはSATySFiの[リポジトリ](https://github.com/gfngfn/SATySFi)をクローンして、次にその中でビルドします。

~~~
$ git clone https://github.com/gfngfn/SATySFi.git
$ cd SATySFi

$ opam pin add satysfi .
$ opam install satysfi
~~~

これでビルドが終わり、SATySFiを使うことができるようになります。

~~~
$ satysfi -v

  SATySFi version 0.0.3
~~~

上のようになれば成功です。

# コンパイルのための設定

**つい最近からフォント周りのインストール方法が変わりました。**
download-fonts.shを実行するとフォントをダウンロードします。
install-libs.shを実行するとパッケージとフォントが適切な位置に置かれます。
なので、このようにすると完了します。

```
$ sudo ./download-fonts.sh
$ sudo ./install-libs.sh
```


---
以下古い方法

昔は自力でフォントを用意しなければいけませんでしたが、今はフォントは全て用意されています。しかし、SATySFiが認識できる場所にパッケージや、その他必要なファイルが無いため、それの設定を行います。

~~~
$ mkdir ~/.satysfi
$ cp -r ~/.opam/4.06.0/share/satysfi/dist ~/.satysfi
~~~

これを実行することでSATySFiをエラーなくコンパイルすることができます（demoファイルをコンパイルするにはsatysfi-demo.jpgファイルが必要ですが）。

# Windowsにあるファイルをコンパイルする
Ubuntuの方でファイルを作って編集してコンパイルするというのはかなりハードルが高いので、Windowsの方で編集等をして、Ubuntuの方でコンパイルするというのが現実的だと思います。

Windowsのターミナルで`wsl`と打ち込むとUbuntuが起動して、SATySFiを実行できるようになります。

なので

```
# Ubuntuの起動
$ wsl
#コンパイル
$ satysfi main.saty
# Ubuntuの終了
$ exit
```

などのようにしてやるとよいでしょう。


# SATySFiを更新する
さて、一度環境を構築しても更新できなければあまり意味はありません。特にまだ若くて更新が活発なSATySFiならなおさらです。

まず、SATySFiのパッケージ等が更新された時は、

~~~
$ git pull origin master
~~~
をして、中身を最新のものにした後、

~~~
$ opam uninstall satysfi
~~~
をして一旦アンインストールをします。そして

~~~
$ opam reinstall satysfi
~~~
を実行して再インストールします。

opamやocamlのバージョンアップが必要になった場合は、

~~~
$ opam update
~~~

などをして諸々の情報を上げておけば良いでしょう

# SATySFiにパッケージを追加する

SATySFiで使える便利そうなパッケージを見つけたら、追加したくなると思います。しかし、現在はパッケージマネージャが無いため、自力で追加するしかありません。

しかし、WindowsからWSL上のファイル構造をそのまま弄るのは危険すぎるので、上手くやらなければいけません。

とは言っても意外と方法は簡単で、ダウンロードしたファイルを `~/.satysfi/dist/packages`に移動させるだけです。

Windows本体にダウンロードするなり、`$ git clone`するなりした後、フォルダに行き、

~~~
$ cp hoge.satyh ~/.satysfi/dist/packages
~~~

とするだけです。勿論、これはUbuntu上に`$ git clone`した場合でも同じです。

もし、そのパッケージがあった場合にはその最新版のパッケージがあるフォルダに移動してもう一度上記のコマンドを実行するだけです。

# おまけ
[make-satysfi.sh](https://gist.github.com/zr-tex8r/0ab0d24255ecf631692c1f0cbc5ca026)を使えば自動でできます。また、やり方がわからなくなったらこれを参考にすれば手打ちでも可能だと思います。
ZRさんありがとうございます。