terminalの起動に遊び心を！~cowsay導入編~


## はじめに

:::note info
この記事は、[リンクアンドモチベーションアドベントカレンダー2024](https://qiita.com/advent-calendar/2024/lmi)の記事です。
:::

アドカレンダーに勢いで何日か枠を確保したものの、ネタが尽きてきたので今回かなりラフめな記事です🙏

ターミナルを開くたびに、ちょっとした遊び心があるとテンション上がりませんか？
以前、[こちらの記事](https://dev.classmethod.jp/articles/cowsay-believe-i-can-be-rainbow-color-in-ansible/)を見て面白いなと思ったので自分の環境にも導入しました。

![cowsay.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527942/4e22a9e6-bc8a-f083-0881-df79122226a0.gif)

## 使用するツール

- [cowsay v3.03](https://en.wikipedia.org/wiki/Cowsay): アスキーアートを生成するツール
- [toilet v0.3](http://caca.zoy.org/wiki/toilet): カラフルなテキストを生成するツール
- [fortune v9708](https://en.wikipedia.org/wiki/Fortune_(Unix)): ランダムなメッセージを生成するツール
- [lolcat v100.0.1](https://github.com/busyloop/lolcat): カラフルにテキストを表示するツール

## 環境構築

macOSではHomebrewを使用してインストールするのが簡単です。

```bash
brew install cowsay fortune toilet lolcat
```

## それぞれのツールの使用

### cowsay

アスキーアートが引数の文字列を出力します。
-tオプションでアスキーアートが出力する文字列、-fオプションでアスキーアートのキャラを選択できます。
なお、アスキーアートのキャラは`cowsay -l`で確認できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527942/cec1ad0c-9e78-0050-9c71-dc7aed675cad.png)

- -t
```
cowsay -t 'Hello, World!'
 _______________ 
< Hello, World! >
 --------------- 
        \   ^__^
         \  (--)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
```

- -f
```
cowsay -f tux -t 'hello'
 _______ 
< hello >
 ------- 
   \
    \
        .--.
       |o_o |
       |:_/ |
      //   \ \
     (|     | )
    /'\_   _/`\
    \___)=(___/
```

### toilet

ASCIIアートでテキストを表示できます。
例えば以下のような感じ。

```
echo 'hello' | toilet 
                                   
 #             ""#    ""#          
 # mm    mmm     #      #     mmm  
 #"  #  #"  #    #      #    #" "# 
 #   #  #""""    #      #    #   # 
 #   #  "#mm"    "mm    "mm  "#m#" 
                                   
                                   
```

### fortune
ランダムなメッセージを生成してくれます。

```
fortune 
If you have to hate, hate gently.
```

### lolcat
渡されたテキストをカラフルにして表示します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527942/fda886a4-a17a-a6c2-f203-7c2ba9a52fbf.png)


## .zshrcの設定し、起動時にアスキーアートを表示

.zshrcにコードを書き、起動時に諸々のツールが表示されるようにします。
僕のターミナルでは
- cowsayにfortuneの結果を出力させる
- cowsayのキャラをtoiletで出力させる
- 全体の出力をlolcatでカラフルにする
のような設定をしています。

```zsh
# cowsayのフォーマット一覧を配列で保持
cow_files=$(cowsay -l | tail -n +2 | tr -s '[:space:]' '\n')
cow_files_array=(${(f)${(s: :)cow_files}})

# 起動時にランダムにキャラが選択されるように乱数を生成
array_length=${#cow_files_array[@]}
random_index=$((RANDOM % array_length))
random_number=$RANDOM

# cowsayのキャラ名をアスキーアートで出力
toilet "$cow_files_array[$random_index]" | lolcat

# fortuneの戻り値をcowsayで出力
fortune | cowsay -f "$cow_files_array[$random_index]" | lolcat
```

`source .zshrc`で設定を読み込んでみると、意図した出力がされています。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527942/37e55274-9cc2-69cf-4237-20c1d92bc717.png)

## 日本語編

日本語での表示をしたい場合、[「名言教えるよ！」](https://meigen.doodlenote.net/api/json.php?c=1&e=1)のAPIを利用することで実現できます。
※.zshrcの読み込みごとにリクエストされるので注意。

```zsh
# cowsayのフォーマット一覧を配列で保持
cow_files=$(cowsay -l | tail -n +2 | tr -s '[:space:]' '\n')
cow_files_array=(${(f)${(s: :)cow_files}})

# 起動時にランダムにキャラが選択されるように乱数を生成
array_length=${#cow_files_array[@]}
random_index=$((RANDOM % array_length))
random_number=$RANDOM

# cowsayのキャラ名をアスキーアートで出力
toilet "$cow_files_array[$random_index]" | lolcat

# 名言APIか名言を取得
meigen_response=$(curl -s -X GET "https://meigen.doodlenote.net/api/json.php?c=1&e=1")

# レスポンスJSONからmeigen, autherを取得してcowsayの引数にして出力
meigen=$(echo $meigen_response | jq -r '.[0].meigen')
author=$(echo $meigen_response | jq -r '.[0].auther')
echo "$meigen\n $author" | cowsay -f "$cow_files_array[$random_index]" | lolcal
```

こんな感じで表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527942/27bcd49c-5671-f594-1aae-12b84ae34387.png)


## おわりに

何の生産性向上にも繋がりませんが、無駄なカスタマイズもいいですよね！