fish起動時にサイゼリヤ1000円ガチャの結果を表示する

# 背景

サイゼリヤ1000円ガチャが昨日（2019/05/09）から話題になっています。
[サイゼリヤ1000円ガチャをつくってみた(Heroku + Flask + LINEbot) - Qiita](https://qiita.com/marusho_summers/items/a2d3681fac863734ec8a)

このガチャ結果をfish shell起動時のウェルカムメッセージに設定することで、起動する度にガチャを引けるようにしてみます。

# fish起動時のウェルカムメッセージを変更するには？

fish起動時には、デフォルトだと `Welcome to fish, the friendly interactive shell` というメッセージが表示されます。これは、 `config.fish` の中で `fish_greeting` という値を設定、または関数を作成することで変更できます。

> Q. How do I change the greeting message?
> A. Change the value of the variable fish_greeting or create a fish_greeting function. 
> [fish: Frequently asked questions](https://fishshell.com/docs/current/faq.html)

これを参考に、以下のように設定を行います。

```sh:~/.config/fish/config.fish
function fish_greeting
    timeout --preserve-status --signal=KILL 1 curl --silent 'https://saizeriya-1000yen.herokuapp.com/get' | pup 'div.box > h2 text{}' | cowsay -n -f (cowsay -l | tail -n +2 | tr ' ' '\n' | sort -R | head -1)
end
```
これで、以下のようにfishを起動する度にサイゼリヤ1000円ガチャが表示されます。

```:結果1
 _________________________________________________ 
/ ティラミス(アイスケーキ)             \
| セットドリンクバー                     |
| 冷たいパンプキンスープ(季節限定) |
| チョコレートケーキ                     |
| 冷たいパンプキンスープ(季節限定) |
\ 計 986円　507kcal　塩分 2.0g              /
 ------------------------------------------------- 
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
```
デザートが多く嬉しいですが、メインが無いですね。もう一度やってみましょう。

```:結果2
 ____________________________________ 
/ リブステーキ                 \
\ 計 999円　621kcal　塩分 1.5g /
 ------------------------------------ 
  \            .    .     .   
   \      .  . .     `  ,     
    \    .; .  : .' :  :  : . 
     \   i..`: i` i.i.,i  i . 
      \   `,--.|i |i|ii|ii|i: 
           UooU\.'@@@@@@`.||' 
           \__/(@@@@@@@@@@)'  
                (@@@@@@@@)    
                `YY~~~~YY'    
                 ||    ||  
```

牛が燃えていますね。これがそのままステーキになりそうです。

```:結果3
 ____________________________________ 
/ プロシュート(Wサイズ)     \
| セットドリンクバー        |
\ 計 988円　324kcal　塩分 3.6g /
 ------------------------------------ 
  \   ^__^
   \  (oo)\_______        ________
      (__)\       )\/\    |Super |
          ||----W |       |Milker|
          ||    UDDDDDDDDD|______|
```
搾乳されています。ドリンクバー用でしょうか。ところで牛乳が飲めるドリンクバーってなぜ無いんでしょうか。

さて、このようにウェルカムメッセージをランダムなものにすることで、シェルを起動する度に楽しくなることができます。よかったですね。

# 追記2019-05-10T20:20:22+09:00
bashやzshでは以下のようなワンライナーを実行することで同様の表示ができます。シェルを起動する際に表示したい場合、 `.bashrc` や `.zshrc` に記載してください。

```bash
timeout --preserve-status --signal=KILL 1 curl --silent 'https://saizeriya-1000yen.herokuapp.com/get' | pup 'div.box > h2 text{}' | cowsay -n -f "$(cowsay -l | tail -n +2 | tr ' ' '\n' | sort -R | head -1)"
```
# 蛇足：使っている各コマンドの説明
## timeout
`curl` のレスポンスが遅く、シェルが起動出来ないと困るためタイムアウトを設定しています。上記では、1秒以上時間がかかった場合にSIGKILLを送信するようになっています。

[Man page of TIMEOUT](https://linuxjm.osdn.jp/html/GNU_coreutils/man1/timeout.1.html)

## curl
サイゼリヤ1000円ガチャのエンドポイントを叩いて結果を取得します。結果はHTMLで返ってくるため、 `pup` に渡してパースします。

[1000円サイゼリヤガチャ](https://saizeriya-1000yen.herokuapp.com/get)
[サイゼリヤ1000円ガチャをつくってみた(Heroku + Flask + LINEbot) - Qiita](https://qiita.com/marusho_summers/items/a2d3681fac863734ec8a)

## pup
HTMLをパースし、CSSセレクタを利用して項目を表示するツールです。今回は各メニューと合計価格などを表示しています。

`go get github.com/ericchiang/pup` でインストールすることができます。
[ericchiang/pup: Parsing HTML at the command line](https://github.com/ericchiang/pup)

## cowsay
標準入力から受け取った内容を牛に喋らせるコマンドです。

`echo 'Hello, World' | cowsay` とすることで、以下のような出力が得られます。牛が喋っていますね。

```
 ______________ 
< Hello, World >
 -------------- 
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
```

また、牛以外を喋らせることが可能です。そこで、cowfileの一覧を `cowsay -l` で出力できますが、やや人間可読でないため以下のようにして一覧をパースしています。

```sh
cowsay -l | tail -n +2 | tr ' ' '\n' | sort -R | head -1
```

最初の1行が不要なメッセージなので `tail` で読み飛ばし、スペースで区切られているので `tr` で改行に変換し、 `sort` でシャッフルして `head` で一つ選んでいます。

そして、その結果を `cowsay` に渡しています。

```sh
cowsay -n -f (cowsay -l | tail -n +2 | tr ' ' '\n' | sort -R | head -1)
```

`-n` で改行をそのまま取り扱い、 `-f` で利用するcowfileを指定しています。

# おまけ

```:結果4
 __________________________________________________ 
/ キャベツのペペロンチーノ(Wサイズ) \
| シチリア産レモンのソルベ             |
\ 計 969円　1499kcal　塩分 7.0g              /
 -------------------------------------------------- 
   \
    \              ....       
           ........    .      
          .            .      
         .             .      
.........              .......
..............................

Elephant inside ASCII snake
```
[これが何なのか? もちろんウワバミに食べられた象だよ。](https://ja.wikipedia.org/wiki/Aptitude)