ターミナルを開くたびにキャラクターにランダムなことを言わせる[cowsay][fortune]

```zsh
Last login: Wed Jan  3 18:13:10 on ttys000
 _______________________________________
/ Screw up your courage! You've screwed \
\ up everything else.                   /
 ---------------------------------------
  \
   \   \_\_    _/_/
    \      \__/
           (oo)\_______
           (__)\       )\/\
               ||----w |
               ||     ||
╭─ ~                                                          
╰→ 
```
※シェルにzshの[powerlevel9k](https://github.com/bhilburn/powerlevel9k)テーマを使っています。
全体の流れ：
[0] イントロ・前提
[1] cowsayのインストール
[2] Fortuneのインストール
[3] ランダムな牛にランダムなことを言わせるスクリプトを書く
[4] 起動時にランダムな牛がランダムなことを言うスクリプトが走るようにする

簡単な説明：`cowsay`と`fortune`を使ったコードを`.bashrc`ファイル（もしくはzshユーザーは`.zshrc`ファイル）に書くことで、ターミナルを起動するたびにランダムな牛がfortuneを口走るようにします。

---

###[0] 弘法筆を択ばず
毎日使うターミナル。
弘法筆を択ばずと言いますが、使うと決めた後のことは関係ないですよね。
エンジニアとして仕事を始めて1ヶ月、度重なるUbuntu環境再構築の修行を経て、癒しが欲しくなりました。
シェルスクリプトの練習と思い、ターミナルを開けるたびに牛などのキャラクターが声をかけてくれる設定をします。
**cowsay**と**Fortune**という二つのソフトをインストールして設定します。

#####[0 - 前提1/2] Macのセットアップについて書いています。
[macOS High Sierra Version 10.13.2 (公式)](https://support.apple.com/kb/DL1946)

```zsh
╭─  ~                                                         
╰→ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.13.2
BuildVersion:	17C88
```

#####[0 - 前提2/2] homebrew が必要
[Homebrew (公式)](https://brew.sh/index_ja.html)

```zsh
╭─  ~                                                         
╰→ brew -v
Homebrew 1.4.1
Homebrew/homebrew-core (git revision 97de0; last commit 2017-12-31)
```
Linuxを使っている方は`apt-get`コマンドで揃います。

---
###[1] cowsay をインストール
#####[1 - 前提] cowsayとは
[cowsay (公式)](https://web.archive.org/web/20120225123719/http://www.nog.net/~tony/warez/cowsay.shtml)　※インターネットアーカイブから
>cowsay is basically a text filter. Send some text into it, and you get a cow saying your text.
>>cowsayは基本的にはテキストフィルターです。何かしら文字を送り込めば、それを牛が言ってくれます。


#####[1 - 手順1/3] brew コマンドで cowsay をインストール

```zsh
╭─  ~                                                         
╰→ brew install cowsay
Warning: cowsay 3.04 is already installed
```
もうインストール済みのためインストール済みと出ました。

#####[1 - 手順2/3] which コマンドでインストールされたことの確認

```zsh
╭─  ~                                                         
╰→ which cowsay
/usr/local/bin/cowsay
```

#####[1 - 手順3/3] 試しに実行してみる

```zsh
╭─  ~                                                         
╰→ cowsay hi
 ____
< hi >
 ----
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
```

######応用を知る

```zsh
╭─  ~                                                         
╰→ man cowsay
.
.
.
SYNOPSIS
       cowsay  [-e  eye_string] [-f cowfile] [-h] [-l] [-n] [-T tongue_string]
       [-W column] [-bdgpstwy]
.
.
.
```
`cowsay` コマンドの後に、牛の目、牛の形（牛とは限らない）、牛の舌、吹き出しの大きさなどが指定できます。

```zsh
╭─  ~                                                         
╰→ cowsay -e ~~ -f www -T VV hi
 ____
< hi >
 ----
        \   ^__^
         \  (~~)\_______
            (__)\       )\/\
             VV ||--WWW |
                ||     ||
```

他のタイプ

```zsh
╭─  ~                                                         
╰→ cowsay -f sheep hi
 ____
< hi >
 ----
  \
   \
       __
      UooU\.'@@@@@@`.
      \__/(@@@@@@@@@@)
           (@@@@@@@@)
           `YY~~~~YY'
            ||    ||
```

全てのAsciiアートをみるには以下コマンドを実施しましょう

```zsh
╭─  ~                                                         
╰→ for i in $(ls /usr/local/Cellar/cowsay/3.04/share/cows/ | grep .cow); do
for> cowsay -f $i hello im $i
for> done | less

---
 _________________________ 
< hello im beavis.zen.cow >
 ------------------------- 
   \         __------~~-,
    \      ,'            ,
          /               \
         /                :
        |                  '
        |                  |
        |                  |
         |   _--           |
         _| =-.     .-.   ||
         o|/o/       _.   |
         /  ~          \ |
       (____@)  ___~    |
          |_===~~~.`    |
       _______.--~     |
       \________       |
                \      |
              __/-___-- -__
             /            _ \
 _______________________ 
< hello im blowfish.cow >
 ----------------------- 
   \
    \
               |    .
           .   |L  /|
       _ . |\ _| \--+._/| .
      / ||\| Y J  )   / |/| ./
     J  |)'( |        ` F`.'/
   -<|  F         __     .-<
     | /       .-'. `.  /-. L___
     J \      <    \  | | O\|.-'
   _J \  .-    \/ O | | \  |F
.
.
.

:
```

`q` を押すと表示画面から出ます。

---

###[2] Fortune をインストール
#####[2 - 前提] Fortuneとは
[fortune (公式)](http://fortune-gui.sourceforge.net/)
>The Fortune program is quite a simple program designed to display amusing random messages.
>>Fortuneプログラムは、面白い言葉をランダムに表示させるというとても単純なプログラムです。

#####[2 - 手順1/3] brew コマンドで Fortune をインストール

```zsh
╭─  ~                                                         
╰→ brew install fortune
Warning: fortune 9708 is already installed
```

#####[2 - 手順2/3] which コマンドでインストールされたことの確認

```zsh
╭─  ~                                                         
╰→ which fortune
/usr/local/bin/fortune
```

#####[2 - 手順3/3] 試しに実行してみる

```zsh
╭─  ~                                                         
╰→ fortune
If I felt any more SOPHISTICATED I would DIE of EMBARRASSMENT!
╭─  ~                                                         
╰→ fortune
Dying is one of the few things that can be done as easily lying down.
		-- Woody Allen
╭─  ~                                                         
╰→ fortune
File cabinet:
	A four drawer, manually activated trash compactor.
```
---

###[3] ランダムな形の牛がランダムなことをいうスクリプトを作る
cowsayの牛情報が入っているのは
`/usr/local/Cellar/cowsay/3.04/share/cows/`
この中です。
※バージョンが違う等の理由で別のフォルダに入っていることがあるかもしれないため、ご自身でご確認ください。

```zsh
╭─  ~                                                         
╰→ ls /usr/local/Cellar/cowsay/3.04/share/cows 
DragonAndCow.pm       daemon.cow            kosh.cow              stegosaurus.cow
Example.pm            default.cow           luke-koala.cow        stimpy.cow
Frogs.pm              dragon-and-cow.cow    mech-and-cow          supermilker.cow
MechAndCow.pm         dragon.cow            meow.cow              surgery.cow
Stegosaurus.pm        elephant-in-snake.cow milk.cow              telebears.cow
TextBalloon.pm        elephant.cow          moofasa.cow           three-eyes.cow
TuxStab.pm            eyes.cow              moose.cow             turkey.cow
beavis.zen.cow        flaming-sheep.cow     mutilated.cow         turtle.cow
blowfish.cow          ghostbusters.cow      ren.cow               tux.cow
bong.cow              head-in.cow           satanic.cow           udder.cow
bud-frogs.cow         hellokitty.cow        sheep.cow             vader-koala.cow
bunny.cow             kiss.cow              skeleton.cow          vader.cow
cheese.cow            kitty.cow             small.cow             www.cow
cower.cow             koala.cow             sodomized.cow
```

関係のない`.pm`ファイルが入っているので、この中から`.cow`で終わるファイルだけを表示させます。

```zsh
╭─  ~                                                         
╰→ ls /usr/local/Cellar/cowsay/3.04/share/cows | grep .cow
beavis.zen.cow
blowfish.cow
bong.cow
bud-frogs.cow
bunny.cow
cheese.cow
cower.cow
daemon.cow
default.cow
dragon-and-cow.cow
dragon.cow
elephant-in-snake.cow
elephant.cow
eyes.cow
flaming-sheep.cow
ghostbusters.cow
head-in.cow
hellokitty.cow
kiss.cow
kitty.cow
koala.cow
kosh.cow
luke-koala.cow
mech-and-cow
meow.cow
milk.cow
moofasa.cow
moose.cow
mutilated.cow
ren.cow
satanic.cow
sheep.cow
skeleton.cow
small.cow
sodomized.cow
stegosaurus.cow
stimpy.cow
supermilker.cow
surgery.cow
telebears.cow
three-eyes.cow
turkey.cow
turtle.cow
tux.cow
udder.cow
vader-koala.cow
vader.cow
www.cow
```
ここからシャッフルして一つだけ表示します。

```zsh
╭─  ~                                                         
╰→ ls /usr/local/Cellar/cowsay/3.04/share/cows | grep .cow | gshuf -n 1
dragon.cow
```
牛の形の欄にこのコードの結果が入るようにします。

```zsh
╭─  ~                                                         
╰→ cowsay -f $(ls /usr/local/Cellar/cowsay/3.04/share/cows | grep .cow | gshuf -n 1) hi
 ____ 
< hi >
 ---- 
     \
      \
       ("`-'  '-/") .___..--' ' "`-._
         ` *_ *  )    `-.   (      ) .`-.__. `)
         (_Y_.) ' ._   )   `._` ;  `` -. .-'
      _.. `--'_..-_/   /--' _ .' ,4
   ( i l ),-''  ( l i),'  ( ( ! .-'    

╭─  ~                                                         
╰→ cowsay -f $(ls /usr/local/Cellar/cowsay/3.04/share/cows | grep .cow | gshuf -n 1) hi
 ____ 
< hi >
 ---- 
  \
   \    (__)               
        o o\               
       ('') \---------     
          \           \    
           |          |\   
           ||---(  )_|| *  
           ||    UU  ||    
           ==        ==    
```
言わせる内容を`fortune`にします。

```zsh
╭─  ~                                                         
╰→ cowsay -f $(ls /usr/local/Cellar/cowsay/3.04/share/cows | grep .cow | gshuf -n 1) `fortune`
 _________________________________________ 
/ The energy produced by the breaking     \
| down of the atom is a very poor kind of |
| thing. Anyone who expects a source of   |
| power from the transformation of these  |
| atoms is talking moonshine. -- Ernest   |
| Rutherford, after he had split the atom |
\ for the first time                      /
 ----------------------------------------- 
   \         ,        ,
    \       /(        )`
     \      \ \___   / |
            /- _  `-/  '
           (/\/ \ \   /\
           / /   | `    \
           O O   ) /    |
           `-^--'`<     '
          (_.)  _  )   /
           `.___/`    /
             `-----' /
<----.     __ / __   \
<----|====O)))==) \) /====
<----'    `--' `.__,' \
             |        |
              \       /
        ______( (_  / \______
      ,'  ,-----'   |        \
      `--{__________)        \/

```
---

###[4] 起動時にランダムな牛がランダムなことを言うスクリプトが走るようにする
起動と同時にスクリプトを走らせるには`~/.bashrc`（zshを利用している場合は`~/.zshrc`）ファイルにコードを書き込みます。

```zsh
╭─  ~                                                         
╰→ vi ~/.zshrc
```

```vim
# vi
cowsay -f $(ls /usr/local/Cellar/cowsay/3.04/share/cows | grep .cow | gshuf -n 1) `fortune`
```
シェルを再起動させたら、トップにランダムな牛がランダムなことを言っていることを確認してください。

```zsh
Last login: Wed Jan  3 20:31:51 on ttys001
 _________________________________________ 
/ Good news is just life's way of keeping \
\ you off balance.                        /
 ----------------------------------------- 
  \
   \    (__)               
        o o\               
       ('') \---------     
          \           \    
           |          |\   
           ||---(  )_|| *  
           ||    UU  ||    
           ==        ==    

╭─  ~                                                         
╰→