この記事はand factory Advent Calendar 2018 Day 25の記事になります。
前日は@yst_i の「マルチモジュール 簡単なサンプル」でした。
概要
クリスマスなので、Goでクリスマスツリーをニョキッと生やすツールを作りました。
MacとLinuxでGoの環境があれば、たった以下の2コマンドであなたのCLI環境にツリーをお届けします。
go get github.com/gosagawa/xmastree
xmastree
オプションでサイズと速度を指定できます。モニタのサイズが許す限り大きいツリーを作れます。
xmastree -size=20 -speed=40
解説
ソースはこちら
https://github.com/gosagawa/xmastree
なんて事はないプログラムなのですが、ちゃんやろうとすると結構な労力を要するように思いました。
対応した事
- 文字の色を変える
- 同じところでアニメーションさせる
- これらを実現するためにエスケープシーケンスを使っています。Windowsだと動かないのはそのためです。
- Cliコマンドツールとして、オプションでサイズやスピードを指定できるように
- TravisCIとの連動
- readmeにGif動画を載せる
対応する前に力尽きた事
- テスト
- 文字は即時で出力してしまっているが、テスト用に文字列として書き出せるようにしておくのが良いです
- コードを読みやすくする
- パラメータ周りや表示部分が汚い
- もっとツリーらしく飾り付けをしたりとか。
一口解説、エスケープシーケンス
今回のツールを実現させるために"\033[xxxA" (xxxの部分は任意の数字)というエスケープシーケンスを用いています。これはxxx分カーソルを上に戻るといういうもので、これで書いて戻ってを繰り返して描画を行なっています。
for i := 0; i < size; i++ {
if i != 0 {
fmt.Printf("\033[%vA", maxHeight)
}
tree := newTree(i*2+5, i+1, 2, maxHeight)
tree.display()
time.Sleep(time.Duration(speed) * time.Millisecond)
maxWidth = tree.MaxWidth
}
また、以下定数で定義していますが各文字の色付けをエスケープシーケンスで設定しています
const (
// EscapeRed display red color
EscapeRed = "\033[31m"
// EscapeGreen display green color
EscapeGreen = "\033[32m"
// EscapeYellow display Yellow color
EscapeYellow = "\033[33m"
// EscapeReset reset color
EscapeReset = "\033[0m"
)
まとめ
ちょっとしたものですが、ちゃんと作り込もうとなるとそれなりに大変そうです。時間を区切って、何かこういうCLIツールを作るコンテストとかやると面白いかもしれませんね。
良いクリスマスを!