回る長い猫のシェル芸

# 回る長い猫のシェル芸とは？
![x.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/22706fa1-31d4-47a2-ef28-d0cdbcd35db8.gif)
このgifアニメーションを生成するシェル芸です。

# コマンド
以下のコマンドで生成することができます。

```bash
$ eval "convert -delay 10 <(longcat -n 10 -o /dev/stdout) -flatten -scale 150x600! -rotate -90 -write mpr:a +delete `for i in {30..600..30};do echo -n "\( mpr:a -roll -$i+0 -wave 20x120 -distort arc 360 \) ";done`/images/x.gif"
```
# 前提条件
[longcat](https://github.com/mattn/longcat) と imagemagick がインストールされていること。

# コマンドができるまで
長い猫を生成します。

```bash
$ longcat -n 10 -o /images/0.png
```
![0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/94e8d944-b8f1-8868-627c-6d6685c60297.png)

長い猫を標準出力(/dev/stdout)を通してimagemagick に入力して、少し整形します。

```bash
$ convert <(longcat -n 10 -o /dev/stdout) -flatten -scale 150x600! -rotate -90 /images/1.png
```

``` -flatten ```で透過背景を白背景に変えて、```-scale```でサイズを指定して、```-rotate```で回転しています。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/57dbbd28-b54c-ae1a-c929-9328f4519373.png)

``` -wave ```で波打たせます。

```bash
$ convert <(longcat -n 10 -o /dev/stdout) -flatten -scale 150x600! -rotate -90 -wave 20x120 /images/2.png
```
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/3086eeb9-24cc-ff8d-6888-0b432af9ce6f.png)
```-distort arc 360```で丸めます。

```bash
$ convert <(longcat -n 10 -o /dev/stdout) -flatten -scale 150x600! -rotate -90 -wave 20x120 -distort arc 360 /images/3.png
```

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/50912e27-2110-c98b-e343-c94c00cd483b.png)

波打たせて丸める前の段階で、```-roll -30+0```して、左側に30ピクセルずらしてやると、

```bash
$ convert <(longcat -n 10 -o /dev/stdout) -flatten -scale 150x600! -rotate -90 -roll -30+0 -wave 20x120 -distort arc 360 /images/4.png
```
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/19329514-d9bf-1b08-78d9-adde1388d07f.png)
さきほどよりわずかに猫の頭が進んでいます。
さきほどは星型のへこんだところに猫が頭を突っ込んでいましたが、今は次の出っ張ってるところへ進んでいますね。
これを一周するまで繰り返します。

```bash
$ eval "convert <(longcat -n 10 -o /dev/stdout) -flatten -scale 150x600! -rotate -90 -write mpr:a +delete `for i in {30..600..30};do echo -n "\( mpr:a -roll -$i+0 -wave 20x120 -distort arc 360 \) ";done`/images/z.png"
```
![z-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/0c53bd58-6a20-b038-b0c2-1efdd8149b09.png)
![z-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/6e6719cb-bb49-7d28-f8aa-2a5784748b20.png)
![z-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/c342ec08-002c-1997-37dd-acf91427a772.png)
![z-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/6cad48c6-d608-865b-d416-82af8231cec2.png)
![z-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/df85637e-de66-512d-ecfe-b1db83fc7260.png)
![z-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/c747a755-2c61-0f10-cfdd-90769dacd5e8.png)
![z-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/8527373a-efd0-eeb6-c324-5248a36d12a9.png)
![z-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/cdea8150-453f-c3d6-6330-ccb85789edc7.png)
![z-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/f71f33e4-4ca6-62ff-3b54-89f341611f29.png)
![z-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/79439838-7df9-d7a7-48a7-89977f2b482b.png)
![z-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/876fccb1-a162-eaf1-817c-91006c6eabce.png)
![z-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/cdac14d4-4de7-197a-067f-11d92620577e.png)
![z-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/fe8d400f-78c0-a6e7-ecf5-a849a47a47d7.png)
![z-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/44d104e4-617d-4054-760b-6de4da5fc22a.png)
![z-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/e4b675ed-e4c8-2a59-9dcf-296db3f42623.png)
![z-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/604a75b5-a62c-a00b-f560-eb49c141d3b9.png)
![z-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/08e37a0a-bbcd-64a4-b74e-01caa4d82d24.png)
![z-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/7e934937-97aa-0794-346a-9c6730473ff2.png)
![z-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/817f6e5a-531f-59db-1595-0e5ae151ed50.png)
![z-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/30722c9d-09a3-e5bc-202b-6d60fdc2de07.png)

evalすることで、for文が展開された後の文字列を評価しています。evalのかわりにechoしてみて、for文がどのように展開されているか見ておきましょう。

```bash
$ eval "convert <(longcat -n 10 -o /dev/stdout) -flatten -scale 150x600! -rotate -90 -write mpr:a +delete `for i in {30..600..30};do echo -n "\( mpr:a -roll -$i+0 -wave 20x120 -distort arc 360 \) ";done`/images/z.png"
convert <(longcat -n 10 -o /dev/stdout) -flatten -scale 150x600! -rotate -90 -write mpr:a +delete \( mpr:a -roll -30+0 -wave 20x120 -distort arc 360 \) \( mpr:a -roll -60+0 -wave 20x120 -distort arc 360 \) \( mpr:a -roll -90+0 -wave 20x120 -distort arc 360 \) \( mpr:a -roll -120+0 -wave 20x120 -distort arc 360 \) \( mpr:a -roll -150+0 -wave 20x120 -distort arc 360 \) \( mpr:a -roll -180+0 -wave 20x120 -distort arc 360 \) \( mpr:a -roll -210+0 -wave 20x120 -distort arc 360 \) \( mpr:a -roll -240+0 -wave 20x120 -distort arc 360 \) \( mpr:a -roll -270+0 -wave 20x120 -distort arc 360 \) \( mpr:a -roll -300+0 -wave 20x120 -distort arc 360 \) \( mpr:a -roll -330+0 -wave 20x120 -distort arc 360 \) \( mpr:a -roll -360+0 -wave 20x120 -distort arc 360 \) \( mpr:a -roll -390+0 -wave 20x120 -distort arc 360 \) \( mpr:a -roll -420+0 -wave 20x120 -distort arc 360 \) \( mpr:a -roll -450+0 -wave 20x120 -distort arc 360 \) \( mpr:a -roll -480+0 -wave 20x120 -distort arc 360 \) \( mpr:a -roll -510+0 -wave 20x120 -distort arc 360 \) \( mpr:a -roll -540+0 -wave 20x120 -distort arc 360 \) \( mpr:a -roll -570+0 -wave 20x120 -distort arc 360 \) \( mpr:a -roll -600+0 -wave 20x120 -distort arc 360 \) /images/z.png
```
波打たせて丸める前の状態で``` -write mpr:a ```で mpr:a にイメージを格納して、``` +delete ```でイメージシーケンスをクリアして、その後は mpr:a を``` -roll ```して``` -wave ```して``` -distort ``したものを20個、イメージシーケンスに並べています。最後に /images/z.png とすることで、/images/z-0.png から /images/z-19.png の連番ファイルに出力します。
アニメーションにします。

```bash
$ eval "convert -delay 10 <(longcat -n 10 -o /dev/stdout) -flatten -scale 150x600! -rotate -90 -write mpr:a +delete `for i in {30..600..30};do echo -n "\( mpr:a -roll -$i+0 -wave 20x120 -distort arc 360 \) ";done`/images/x.gif"
```
出力ファイルパスの拡張子をgifにすることで、イメージシーケンスの全イメージをgifアニメーションとして書き込みます。
![x.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/6404968f-fb33-9108-35ba-a35e5a92ee04.gif)
完成。
-delay 10 はアニメーション1コマの時間指定です。高速回転にしてみましょう。

```bash
$ eval "convert -delay 3 <(longcat -n 10 -o /dev/stdout) -flatten -scale 150x600! -rotate -90 -write mpr:a +delete `for i in {30..600..30};do echo -n "\( mpr:a -roll -$i+0 -wave 20x120 -distort arc 360 \) ";done`/images/x.gif"
```
![x.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/eef29dd2-1f59-ba5c-43b2-ebfee3111106.gif)

以上。