サーバログイン時にエモい画像を出してAORI駆動開発してみた話

## :point_up:はじめに:point_up:

![image.png](https://qiita-image-store.s3.amazonaws.com/0/136561/2aed42af-97da-1e2c-f621-6705db0b4b94.png)

![parrot_oji_test.gif](https://qiita-image-store.s3.amazonaws.com/0/136561/fe3cf2d6-89eb-bd1b-45da-1fe7efb0c572.gif)



　どうも、プラットフォーム開発部でサーバサイドエンジニアしている[egoa56](https://qiita.com/egoa56)です。
自己紹介はさておき、記事を書こうと思った背景と記事の概要を説明します。
最近テレビをつけたら、労働力人口の減少が深刻な社会問題として取り上げられており、
外国人労働者の受け入れを拡大する出入国管理法改正が国会で議論されていました:kiss_mm:
　しかし、外国人労働者の受け入れを拡大しても外国人労働者が増加するかは不明です。
誰も未来は分からないです。
そこで労働力人口が減少する問題に対し、1人1人の労働生産性を上昇させることで解決できないか考えた:question::thinking:
私はプログラマのため、普段の開発業務で労働生産性を上昇させる方法を模索した。
そして、高いモチベーションを保つための1つの方法を思いついた。
  **「AORI※1」により感情を高ぶらせ、高まった勢いで開発することで生産性を高めようとする方法です。
つまり、「:innocent: AORI駆動開発 :innocent:」！！**
　本記事では「:innocent: AORI駆動開発 :innocent:」の1つの取り組みとして、
サーバにエモい画像を出力し、テンション:arrow_heading_up: :arrow_heading_up:で開発環境に入る方法を紹介します。
(OS: Ubuntu18.04で検証してます)
:fist_tone5::fist_tone5: 常識な内容が多く含まれているため、興味あるところだけ読んで下さい :fist_tone5::fist_tone5:

### motd

Linuxサーバにログインした時に表示されるバナーをmotdといいます。
このmotdを良い感じにエモい設定にする方法を考えるにあたり、軽くmotdについておさらいします。

まずmotdでとても単純な "Hello world" と文字列を出力する方法を説明します。

```shell
ls -la /etc/update-motd.d
vim /etc/update-motd.d/99-hello

###### 99-hello の中身
#!/bin/bash
printf "hello world\n"

chmod 755 /etc/update-motd.d/99-hello
run-parts /etc/update-motd.d
```

`cat /etc/pam.d/sshd | grep motd` でsshログイン時のどのようにmotdが出力されているか確認すると、`/run/motd.dynamic` を参照してることが分かります
`/run/motd.dynamic`は `/etc/update-motd.d` 配下の `num-***` のスクリプトから動的に生成されているようです
そのため、`num-***` という命名でファイルを置いておくと表示することができます。
また、`num-***` の数字順で実行して出力しているので、表示順を変更したければ数字を変更します。
上記の 'Hello world' は一番下に出力するよう、`99-hello` にしています。
しかし、この表示のままでは非常に視認性が低いです。
そこで banner・[figlet](http://www.figlet.org/)・[toilet](http://caca.zoy.org/wiki/toilet)などで文字列をASCII Artで表示する方が多いかと思います。

### toilet・figlet

toilet・figlet は文字列を以下のようにASCII Artで表示するためのコマンドです。
ブラウザからfiglet出力内容を確認したければ、[コチラ](https://be3n.com/toybox/figlet/)のサイトなどが公開してくれています。
本記事では figlet/toilet　の使い方は割愛しますが、実際に　figlet/toilet を入れてみてください。
また、私はfontの種類を増やしたかったので[figlet-fonts](https://github.com/xero/figlet-fonts)を導入しました。

```shell
sudo apt install -y figlet
ls -la /usr/share/figlet/ # /usr/share/figlet/ または /usr/share/figlet/fonts/ にfontあるか確認
sudo apt install -y toilet
```

toiletコマンドを先程の `/etc/update-motd.d/99-hello` で以下のように記載すると、
表示がこのようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/136561/8ba5e69b-ef17-5bd9-beb4-976aeb382cba.png)

```
#!/bin/bash
toilet -f smmono12 'Hello'
```


また boxes などのASCII Artと組み合わせると、少しだけカッコよくなります

```
apt install -y boxes
toilet -f starwars 'Hello' | boxes -d santa -a hc -p h8
                              .-"``"-.
                             /______; \
                            {_______}\|
                            (/ a a \)(_)
                            (.-.).-.)
  ____________________ooo__(    ^    )________________________
 /                          '-.___.-'                         \
|          __    __  _______ __      __       ______           |
|         |  |  |  ||   ____|  |    |  |     /  __  \          |
|         |  |__|  ||  |__  |  |    |  |    |  |  |  |         |
|         |   __   ||   __| |  |    |  |    |  |  |  |         |
|         |  |  |  ||  |____|  `----|  `----|  `--'  |         |
|         |__|  |__||_______|_______|_______|\______/          |
|                                                              |
 \_____________________________________ooo____________________/
                            |_  |  _|  jgs
                            \___|___/
                            {___|___}
                             |_ | _|
                             /-'Y'-\
                            (__/ \__)
```

### terminalでのカラー出力

toilet・figletで　ASCII Artで文字を表示しても、味気ないので色をつけましょう:writing_hand:
まずカラーが何色出力できるか、以下のshellを実行して確認してみてください。

```shell
#!/bin/bash↲
↲
for i in {0..255} ; do↲
  printf "\x1b[48;5;%sm%3d\e[0m " "$i" "$i"↲
  if (( i == 15 )) || (( i > 15 )) && (( (i-15) % 6 == 0 )); then↲
    printf "\n";↲
  fi↲
done↲
```

色味が多くないとエモさが不足してしまいます。
ググれば色々とターミナルの色の設定の仕方が出てくると思うので、良い感じに `xterm-256color` でカラー表現できる環境にしてみてください。
（私はtmuxを使うので、tmux側の設定もいじって試しております）
設定ができていると、先程のshellで以下のような感じで256色でるようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/136561/6f9ecee1-c2b8-1f5f-0e91-48f43ad1721f.png)

さて、話が脱線しましたがエスケープシーケンスで文字色を変更していきます。
エスケープシーケンスで色指定する方法は、「[xterm-color.sql, xterm-color256.sql from TPT Script : SQL*Plusでカラー表示](http://cosol.jp/techdb/2013/12/xterm-colorsql-xterm-color256sql-from-tpt-script-sqlplus.html)」「[ターミナルのechoやprintfに256色で色をつける 完全版](http://vorfee.hatenablog.jp/entry/2015/03/17/173635)」を参考にすると非常にわかりやすいかと思います。

以下のように、出力したい文字を書くと文字列に色が付きます。
（ `\e[0m` しているのはデフォルトカラーに戻す。 `\n` があるのは改行したいためです）

```
vim /etc/update-motd.d/99-hello

###### 99-hello の中身
#!/bin/bash
printf "\e[お好きな番号m
適当な文字列
\e[0m\n"

run-parts /etc/update-motd.d
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/136561/94e32ed2-6189-5ad6-edc9-e7f012045f15.png)


* locat

エスケープシーケンスで文字制御するのはダルいという方は、
 `lolcat` で虹色な文字列出力をすることをオススメします。

```shell
sudo apt install -y lolcat
toilet -f starwars 'hello' | boxes -d cat -a hc -p h8 | /usr/games/lolcat -f
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/136561/e259355f-432c-e5b6-8771-27689fc11676.png)

### dot絵の出力

文字列をASCII Artでエモく変更していると、やはり色味が弱くてテンション:arrow_heading_down: :arrow_heading_down:

ちょっとググると、シャレオツなヤツを発見!

* [PngファイルをAsciiArt化する『ansize』](https://orebibou.com/2015/04/png%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92asciiart%E5%8C%96%E3%81%99%E3%82%8B%E3%80%8Eansize%E3%80%8F/)
* [AWSにsshログインした時にスライムを出現するようにしてみた。](https://qiita.com/tu-kun/items/d38452161bfb9da54bcd)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/136561/a45ff5ca-b72a-6165-7883-561279815aa9.png)

dot絵かわいいー :love_letter: 
自分で適当に作ったAORI力の高いdot絵表示したいーと思った。。。
:tea:圧倒的二番煎じ感:tea:

もうすでに紹介されているので、
誰か作成したモノを利用するのではなく、自分で作成したdot絵を出す方法だけ記載します。

やり方は超簡単:bangbang:
dot絵の表示は、単純に■にカラーを割り当て文字列出力するだけです:bangbang:
一番な簡単な例として「目玉」:eye:のdot絵を表示する方法を例に挙げると以下のようになります。

```
#!/bin/bash

printf "
\u2588\u2588\u2588\u2588\u2588\u2588
\u2588\u2588\e[38;5;0m\u2588\u2588\e[0m\u2588\u2588
\u2588\u2588\u2588\u2588\u2588\u2588
\n"
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/136561/6bf1c4f5-aeee-bf9d-fa01-651c179a8c99.png)

`\u2588` は■を表示するために使用しており、2つ並べることでdotの1つの■を表しています。
また、`e[38;5;0m` は文字列カラーの指定をしており、`e[0m` で文字列カラーをデフォルトに戻しています。
また、背景色と `space` を指定してdot絵を描くことも可能ですが、似たような内容なので割愛します。

* [Box-drawing_character](https://en.wikipedia.org/wiki/Box-drawing_character)

やり方が分かったところで、
画像から `printf` ないし `echo` で指定する文字列を設定するのは大変なので、
変換コードをサクッと作成することをおススメします:blush:

### GIFの出力

ここまで色々試してきたが、あることに気づきました。
そう、まったくAORI力が不足しており、感情が:hugging: :hugging: :arrow_heading_up: :arrow_heading_up:しません。
やはり、動きが必要なのです。
でも安心してください。そんなAORARの方々には[gif-for-cli](https://github.com/xero/figlet-fonts)がおススメ:bangbang:
こちらはREADMEのとおりに動かせば、簡単にGIFの出力ができます。

インストール方法等はREADMEにあるので、
説明は割愛しますが日本語記事で見たい方は「[gif-for-cli – 説明やウェブサイトは提供されていません](https://githubja.com/google/gif-for-cli)」をご覧ください。

ただし、`gif-for-cli` の実行shellを `/etc/update-motd.d` に配置しても、
動作しませんでした:skull::skull::skull:
仕方ないので `.bashrc` に実行コマンドを記載してログインすると、パロットが3回転するように設定しました。

![parrot_test.gif](https://qiita-image-store.s3.amazonaws.com/0/136561/dcde199e-3919-afcd-710c-d030e4cf458c.gif)


設定：`gif-for-cli -l 3 8275708` を`.bashrc` に追記

* `-l` はGIFのloop回数
* `8275708` は gif-for-cli が参照している [Tenor](https://tenor.com/) で検索したときのGIFのIDです（下記参照）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/136561/3bef8086-199f-78c8-e91d-c99573260000.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136561/280d7f05-f1b7-47b7-a684-10f1ef87c0f9.png)


### 今後の展望

`.bashrc` に記載したくないので、`/etc/update-motd.d` でGIF出力する方法も少し試した。
やり方は、dot絵を出す方法を応用して「1frameごとdot絵を出力しては消す」を繰り返すだけです。
下記のように、1つ出力するごとに `sleep` を行い、
入力した行数分 `tput cuul` `tput el` を行い前の frame の出力を消すことで可能です。

```
#!/bin/bash↲
printf "\u2588\u2588\u2588\u2588\u2588\u2588
\e[38;5;0m\u2588\u2588\e[0m\u2588\u2588\u2588\u2588
\u2588\u2588\u2588\u2588\u2588\u2588"
sleep 0.5↲
tput cuu1↲
tput el↲
tput cuu1↲
tput el↲
tput cuu1↲
tput el↲
printf "↲
\u2588\u2588\u2588\u2588\u2588\u2588
\u2588\u2588\e[38;5;0m\u2588\u2588\e[0m\u2588\u2588
\u2588\u2588\u2588\u2588\u2588\u2588"
sleep 0.5↲
tput cuu1↲
tput el↲
tput cuu1↲
tput el↲
tput cuu1↲
tput el↲
printf "↲
\u2588\u2588\u2588\u2588\u2588\u2588
\u2588\u2588\u2588\u2588\e[38;5;0m\u2588\u2588\e[0m
\u2588\u2588\u2588\u2588\u2588\u2588
"
```

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/136561/b04ec739-71ed-2a4a-40a1-21acc1b13696.gif)

需要があれば、motd用のshell generatorでも作って公開します:frowning2:

## おわりに

サーバログイン時にエモい画像を出すことの需要が高まることをお祈りしています:pray::pray::pray:
私も「:innocent: AORI駆動開発 :innocent:」でもっと生産力を上げることに尽力して参ります:muscle::kissing:

この記事は、富士通クラウドテクノロジーズ Advent Calendar 2018 の20日目でした。
昨日の[「NIFCLOUD で Elastic Cloud Enterprise」](https://tech.fjct.fujitsu.com/entry/2018/12/19/100030)は非常に有益な話をしてますね。
明日の「[ntoofu](https://qiita.com/ntoofu)」さんの「去年の続編的内容？」もきっと有益な話をされるので、是非お楽しみに。

※1 AORI: 感情を高ぶらせるための行為の総称。悪意を持たず、用法用量を守って適度に摂取してください:muscle: