LoginSignup
23
7

More than 3 years have passed since last update.

回る長い猫のシェル芸

Last updated at Posted at 2019-12-07

回る長い猫のシェル芸とは?

x.gif
このgifアニメーションを生成するシェル芸です。

コマンド

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

$ 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 と imagemagick がインストールされていること。

コマンドができるまで

長い猫を生成します。

$ longcat -n 10 -o /images/0.png

0.png

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

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

-flattenで透過背景を白背景に変えて、-scaleでサイズを指定して、-rotateで回転しています。
1.png

-waveで波打たせます。

$ convert <(longcat -n 10 -o /dev/stdout) -flatten -scale 150x600! -rotate -90 -wave 20x120 /images/2.png

2.png
-distort arc 360で丸めます。

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

3.png

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

$ 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
さきほどよりわずかに猫の頭が進んでいます。
さきほどは星型のへこんだところに猫が頭を突っ込んでいましたが、今は次の出っ張ってるところへ進んでいますね。
これを一周するまで繰り返します。

$ 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
z-1.png
z-2.png
z-3.png
z-4.png
z-5.png
z-6.png
z-7.png
z-8.png
z-9.png
z-10.png
z-11.png
z-12.png
z-13.png
z-14.png
z-15.png
z-16.png
z-17.png
z-18.png
z-19.png

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

$ 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 の連番ファイルに出力します。
アニメーションにします。

$ 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
完成。
-delay 10 はアニメーション1コマの時間指定です。高速回転にしてみましょう。

$ 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

以上。

23
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
7