🐮 cowsay written in Go
Go で cowsay を作ってみました。以前「高速でダウンロードできるツールを Go で実装した。」という記事で、asciinemaを使ってターミナル上の様子をキャプチャしたのですが、この時に、「初めに出てくる cowsay の方が気になる」という評価をいただいたことがありました。
この cowsay は toilet というコマンドにパイプを渡して作っていました。
# Colorful Cowsay using fortune
function random_cowsay() {
fortune -s -n 100 | cowsay -f `ls -1 /usr/local/Cellar/cowsay/3.03/share/cows/ | sed s/\.cow// | tail -n +\`echo $(( 1 + (\\\`od -An -N2 -i /dev/random\\\`) % (\\\`ls -1 /usr/local/Cellar/cowsay/3.03/share/cows/ | wc -l\\\`) ))\` | head -1` | toilet --gay -f term
}
if which fortune cowsay >/dev/null; then
while :
do
random_cowsay 2>/dev/null && break
done
fi && unset -f random_cowsay
このコードを zshrc
に書き込んで呼び出していました。
このように「ランダムで虹色な cowsay 」を実行するために毎回シェルの起動が重いというのに耐えていたわけですが、そろそろ限界だったので今回上記のような cowsay を作成しました。
🐄 パッケージとして使う
何かしらパッケージを作る際に、遊び心で cowsay を実行できるようになるといいなと思い、 cowsay を文字列として受け取れるようにしました。
README にも書いてますが、こんな感じで使うこともできます。
package main
import (
"fmt"
cowsay "github.com/Code-Hex/Neo-cowsay"
)
func main() {
say, err := cowsay.Say(&cowsay.Cow{
Phrase: "Hello!!",
Type: "default",
BallonWidth: 40,
})
if err != nil {
panic(err)
}
fmt.Println(say)
}
🐃 コマンドを使う
$ cowsay Hello
_______
< Hello >
-------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
オリジナルでは不可能だった日本語にも対応してます。go-runewidth のおかげですね!
____________________
< 今から講義があります... >
--------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
ランダムで召喚します
虹色(toilet っぽく)、グラデーションカラー(lolcatっぽく)、Bold
何気に頑張ったスーパー🐮さんモード(マ○オっぽく)
gopher も喋る!!
___________
< Go 最高!! >
-----------
\
\ ,_---~~~~~----._
_,,_,*^____ _____``*g*\"*,
/ __/ /' ^. / \ ^@q f
[ @f | @)) | | @)) l 0 _/
\`/ \~____ / __ \_____/ \
| _l__l_ I
| [______] I
| | | | |
| ~ ~ |
| |
| |
🐂 インストール
パッケージとして
go get -u github.com/Code-Hex/Neo-cowsay
cowsay コマンド
go get -u github.com/Code-Hex/Neo-cowsay/cmd/cowsay
cowthink コマンド
go get -u github.com/Code-Hex/Neo-cowsay/cmd/cowthink
最後に
動かせれば良いや!という勢いで作ったので Pull Request お待ちしております。是非遊んでみてください!!