どうもこんにちは、最近Motchiyくんのサーバー権利を奪取し、アルティメットプログラムを構築しているさいほうへいきです。ところでMotchiyって誰?
みなさんslって知ってますか? 蒸気機関車のSLでもまあ間違ってないんですが。
Linuxに触れてるとたぶん三日目くらいで耳にすると思うのですが、まあ一種のジョークコマンドですね。
lsをタイプしようとして逆になると、ふわーんって蒸気機関車のアスキーアートが画面を流れていくあれです。
はい。
あんな感じのを作りましょう!!
さあてやったるぞ
思い立ったが吉日、善は急げ、今日の一針明日の十針です。やりたくなったらすぐにやりましょう。こんなんだから行き当たりばったりとか言ってはならない。
個人的にはC#を使うのが一番好きではあるんですが、ビルドに手間がかかるのと手軽に動かしづらいのとで今回はシェルスクリプトを使っていきます。
SLも好きですが、今回はオリジナリティを出すために車でも作りましょう。
とりあえずUbuntu入りのマシンへログインして、適当なエディタを開きます。
そして以下のコードをコピペ。
#!/bin/bash
CAR_L1=" _________________"
CAR_L2=" ____/____|___|________\\ O"
CAR_L3="|_ _ M O T C H I Y _ _| o"
CAR_L4=" (o)------(o)------(o)== o"
COLS=$(tput cols)
for ((i=COLS; i>0; i--)); do
clear
echo -e "\n\n\n"
printf "%${i}s%s\n" "" "$CAR_L1"
printf "%${i}s%s\n" "" "$CAR_L2"
printf "%${i}s%s\n" "" "$CAR_L3"
printf "%${i}s%s\n" "" "$CAR_L4"
sleep 0.05
done
clear
ファイル名をcar.shとでもして保存した後、chmod +x car.shで権限を付与、./car.shで実行!
おぉ、車が右から左へ流れていきました。やったね。
コードの解説
まあ正直細かく解説するような点も無いんですが、ざっくりまとめておきます。
まずCAR_L1~CAR_L4で車のアスキーアートを定義してます。ここのアスキーアートをちょちょいっと書き換えれば、自由自在なアニメーションが作れます。
それからCOLSという変数。これは画面幅の取得ですね。
画面の幅に上手く合わせて実行しないと、変な改行が起きて崩れてしまう羽目になります。
そして取得した画面幅に合わせてループ。
画面をクリア、改行、AAの表示、待機を繰り返します。
printfのテキストがすごい記号まみれになっていますが、やっていること自体は単純です。
%${i}s%s\n の %${i}s は「i文字分の空白を出力する」という意味で、
その後ろの %s にアスキーアートの1行をくっつけています。
つまり「左にi個分の余白を入れてから車を表示する」→ ループで i を減らす → 右から左へ動く、という仕組みです。
最初は「うわ、printf難しそう……」ってなりますが、
空白を増減させて位置をずらしているだけだと思えば一気に気が楽になります。
sleep 0.05はフレーム間の待ち時間ですね。
ここを小さくすると爆速カーになり、大きくすると渋滞します。お好みでどうぞ。
本家slコマンドっぽくするエイリアス
ここまで来たら、タイプミスしたら発動するのがロマンです……たぶん。
とりあえずlsとcarじゃ流石に似てないので、catのタイプミスとでもしておきましょう(偶然にもtとrは両隣ですしね)。
alias car=~/car.sh
これを .bashrc や .zshrc に書いておけば、
うっかり sl と打った瞬間に車が走ります。
未来の僕「なんで今車が走ってんだ……(困惑)」
過去の僕「やーいうちみすしてやんのー」
おわりに
こんな感じで、シェルスクリプトでも
ちょっとした遊び心のあるネタは簡単に作れます。
というわけで今回は「車が走る」 という、何の生産性も無いけど心は満たされるプログラムを作ってみました。
実を言ってしまうとこれはものすごい雑な実装なので描画に盛大なバグがあるのですが、そこらへんは……気が向いたら……。
なにかミスがあったらぜひ教えてください。僕も新参者なのでね……。
ではまた!