Goでクリスマスツリーを表示する 

この記事は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

xmastree.gif


解説

ソースはこちら

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ツールを作るコンテストとかやると面白いかもしれませんね。

良いクリスマスを!


参考にしたもの、インスパイヤされたもの