さぁ！クリスマスツリーを生やそう！


> クリスマスが今年もやって来る〜♪ 悲しかった ♫ 出来事を ♫ 消し去るように〜♬
さあ, パジャマを脱がずにクリスマスツリーを作りましょう！


この記事は [MicroAd Advent Calendar 2022](https://qiita.com/advent-calendar/2022/microad)  の 24 日目の記事です.

今年も去年に引き続きクリスマスの日がやってきました. ここ最近は寒かったり, リモートワークだったりで外に出ておらずクリスマス気分を味わえていない方も多いのではないのでしょうか.
そんなあなたに少しでもクリスマス気分を味わってもらうために今すぐ無料でできるクリスマスツリーの作り方を届けたいと思います.

## Step. 1 木を植える

まずは木の AA を作りましょう！昨今は流行りの chatGPT に言えば勝手に作ってくれるので簡単ですね. すごい！🎉
もちろん味わい深く手書きするも良いですし, 画像を AA に変えるようなプログラムなどを作って使うも良しです.

<!-- chatGPT の画像 -->

![ascii-tree.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906341/ab4782e9-4306-60b9-75d8-b369f632a6bf.png)

今回は非常にシンプルな木を用意したので, こちらを使っていきたいと思います

```
      *
     ***
    /...\
   /.....\
   /.....\
  /.......\
  /.......\
 /.........\
^^^^^[_]^^^^^
```

## Step. 2 飾り付けをする

まず今回は Bash スクリプトを用いるので実行可能な形に少し修正します.

```bash
printf "
      *
     ***
    /...\\
   /.....\\
   /.....\\
  /.......\\
  /.......\\
 /.........\\
^^^^^[_]^^^^^
"
```

一部の文字はエスケープシーケンス扱いになるので修正しています.
さて, ここからは楽しい時間です...！例えば次のように自由にツリーへ飾りを付けていきましょう...！

```bash
printf "
      *
     ***
    /...\\
   /.o...\\
   /..o..\\
  /.o..o..\\
  /.....o.\\
 /..o......\\
^^^^^[_]^^^^^
"
```

![tree.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906341/a2fb2859-2c31-ccac-d30d-aff06429183e.png)

いい感じのツリーは完成しましたか？しかしまだこのままではモノクロの木で味気がないです. いくつかの色を足しましょう.
色は `\e[属性;文字色;背景色m` で指定することができます.
この `\e[...` とかなんやねん...って人は [ANSI escape code](https://en.wikipedia.org/wiki/ANSI_escape_code) を読むと, この指定でターミナルの文字に色を付けたり, カーソル位置を変えたりといろいろ遊べそうなことがわかります.
さて, どんどんいろんなツリーを作って飾っていきましょう...！

```bash
printf "
      \e[1;33m*\e[38;5;22m
     ***
    /...\\
   /.\e[1;35mo\e[38;5;22m...\\
   /..\e[1;36mo\e[38;5;22m..\\
  /.\e[1;37mo\e[38;5;22m..\e[1;35mo\e[38;5;22m..\\
  /.....\e[1;36mo\e[38;5;22m.\\
 /..\e[1;37mo\e[38;5;22m......\\
^^^^^[_]^^^^^
"
```

これでカラフルなツリーが出来上がりました...！ 実行してみると...
![color-tree.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906341/9d8bc97d-97eb-971d-5e42-20a0c9c3fb97.png)
すばらしい...！👏

## Step. 3 いろんなイルミネーションパターンを作る

ところでイルミネーションは様々な色に変わったり, 光る位置が変わったりしますよね？
というわけで, いろんなイルミネーションのパターンの木を用意しましょう.
```
      \e[1;33m*\e[38;5;22m
     ***
    /...\\
   /.\e[1;35mo\e[38;5;22m...\\
   /..\e[1;36mo\e[38;5;22m..\\
  /.\e[1;37mo\e[38;5;22m..\e[1;35mo\e[38;5;22m..\\
  /.....\e[1;36mo\e[38;5;22m.\\
 /..\e[1;37mo\e[38;5;22m......\\
^^^^^[_]^^^^^
\e[;39m
```
とか
```
      \e[1;33m*\e[38;5;22m
     ***
    /...\\
   /...\e[1;35mo\e[38;5;22m.\\
   /\e[1;37mo\e[38;5;22m....\\
  /.....\e[1;36mo\e[38;5;22m.\\
  /.\e[1;35mo\e[38;5;22m..\e[1;37mo\e[38;5;22m..\\
 /....\e[1;36mo\e[38;5;22m..\e[1;35mo\e[38;5;22m.\\
^^^^^[_]^^^^^
```
です.



## Step. 4 イルミネーションを動かして眺める

最後は簡単です. ここで作った複数の木を順番に描画していき, ツリーのイルミネーションを楽しみましょう...！
適当な秒数で sleep し, リフレッシュしてループしながら再描画します.
```bash
while true
do
clear
printf "
      \e[1;33m*\e[38;5;22m
     ***
    /...\\
   /.\e[1;35mo\e[38;5;22m...\\
   /..\e[1;36mo\e[38;5;22m..\\
  /.\e[1;37mo\e[38;5;22m..\e[1;35mo\e[38;5;22m..\\
  /.....\e[1;36mo\e[38;5;22m.\\
 /..\e[1;37mo\e[38;5;22m......\\
^^^^^[_]^^^^^
"
sleep 1
clear
printf "
      \e[1;33m*\e[38;5;22m
     ***
    /...\\
   /...\e[1;35mo\e[38;5;22m.\\
   /\e[1;37mo\e[38;5;22m....\\
  /.....\e[1;36mo\e[38;5;22m.\\
  /.\e[1;35mo\e[38;5;22m..\e[1;37mo\e[38;5;22m..\\
 /....\e[1;36mo\e[38;5;22m..\e[1;35mo\e[38;5;22m.\\
^^^^^[_]^^^^^
"
sleep 1
done
```


## Step. 5 いつでも心を休められるようにする

いつ何時も心の安らぎを得られる環境はとても重要です.
先程作ったスクリプトを`bin`に配置して, パスを通してコマンドとして扱えるようにしておきましょう.

```bash
$ mkdir -p /usr/local/work/bin
$ touch /usr/local/work/bin/xmas-tree
$ vi /usr/local/work/bin/xmas-tree
$ chmod 777 /usr/local/work/bin/xmas-tree
$ export PATH="$PATH:/usr/local/work/bin/work"
$ xmas-tree
```

これで無事に`xmas-tree`でスクリプトが実行できるようになりました...！
実際に動かすと以下のようになります
![tree.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906341/2b420903-8253-c2d9-368b-5134a715e183.gif)

他にも様々な画像を AA に変換したりして gif にしてしまうのも楽しいかもしれません.

### _追伸_

忘年会後に酔いの勢いだけで書きましたが, 実際のところはこんなことをしていても悲しくなるだけなので, 外に出て本物のクリスマスツリーでも見に行きましょう.