22
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Go で Neo Cowsay を作った

Posted at

Code-Hex/Neo-cowsay - GitHub  GitHub stars

🐮 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 |
                ||     ||

ランダムで召喚します

asciicast

虹色(toilet っぽく)、グラデーションカラー(lolcatっぽく)、Bold

asciicast

何気に頑張ったスーパー🐮さんモード(マ○オっぽく)

このキャプチャ重いので、実際に動かしたほうが良いです。
asciicast

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 お待ちしております。是非遊んでみてください!!

22
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?