Spark
Spark は数値群を引数に与えるか標準入力で与えてあげると その数値群を棒グラフに変換してくれるシェルスクリプトです。
インストールはGitHubのレポジトリ
から直接spark
というスクリプトファイルを取ってきてPATHの通った所に入れるか、
MacであればHomebrewで
$ brew install spark
でspark
コマンドが使えるようになります。
使い方は非常にシンプルで
$ spark 0 20 40 60 80 100
▁▂▃▅▆█
こんな感じで数値を与えるとそれを棒グラフにしてくれます。
インプットに使える数字は少数も使えますが、 実際に使われる際には小数点以下を切り捨てて扱います。 また、負の数値も使うことが出来ます。
グラフを作る際には、最小値と最大値がそれぞれ 一番小さな高さと大きな高さになるように計算され、 高さは最大、最小の点を含めて8つあって等分感覚で振り分けられます。 (正確には最大の値だけが一番大きな線に、後の数値は 最小と最大の数値を7分割してそれぞれの大きさに振り分けられます。)
$ spark 0 20 40 60 80 199 200
▁▁▂▃▃▇█
な感じ。今度は200が最大ですが、すぐ隣りの199は1つ小さい大きさ。 一方、最初の0から20離れていても20は一番小さな大きさ(200/7~28なので)。
仕組みも結構シンプルで コメントやヘルプ等を除いたら実質30行程度で作られています。
コードをちょっと見てみると、
local ticks=(▁ ▂ ▃ ▄ ▅ ▆ ▇ █)
という行があって、単にこの8つの文字を使って、 後は数値を適時各大きさに割り振って出力しているだけです。
この文字達はブロック要素と呼ばれる文字達で Unicodeの0x2581から0x2589に当たる文字達です。
Unicode | 文字 | 名前 |
---|---|---|
0x2581 | ▁ | Lower One Eighth Block |
0x2582 | ▂ | Lower One Quarter Block |
0x2583 | ▃ | Lower Three Eighths Block |
0x2584 | ▄ | Lower Half Block |
0x2585 | ▅ | Lower Five Eighths Block |
0x2586 | ▆ | Lower Three Quarters Block |
0x2587 | ▇ | Lower Seven Eighths Block |
0x2588 | █ | Full Block |
後、途中で分割する際に(max-min)<<8
や(n-min)<<8
みたいな事をして、
整数割り算した時に1以下になって丸め込まれるのを防ぐ様な事をしてますが、
これは単に表示する所を
-local f=$(( (($max-$min)<<8)/(${#ticks[@]}-1) ))
+local f=$((max-min))
(( f < 1 )) && f=1
for n in $numbers
do
- echo -n ${ticks[$(( ((($n-$min)<<8)/$f) ))]}
+ echo -n ${ticks[$(( (n-min)*(${#ticks[@]}-1)/f ))]}
done
な感じでシンプルに行けば良いと思うんですが、何か勘違いしてるのかな。。。? (もしくは昔小数点をなんとか扱おうとしてた時の名残とか?)
使用例
Wicked Cool Usage · holman/spark Wiki に行くと色々載ってますが、 自分でもちょっと作ってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
|
こんな感じのスクリプト。
ps
で見れるCPU情報を使って、特定のプロセスのCPU使用率をグラフ化するものです。
こんな感じで引数にプロセス名を入れてあげるとその使用率をグラフ化してくれます。
複数のプロセスでもOK。
(ただ、同じプロセス名の物が複数あったりすると一番上に来るものを取ってくるだけになります。
ソートしたりしてもいいんですが、BSDとGNUのps
でその辺のオプションが違ったりして面倒なので
取り敢えずバージョン。)
なんだかんだでspark
自身よりも複雑になってしまった感はありますが、
こんな感じのリアルタイムなグラフをターミナル上に書くことも可能になります。
spark
自身は結構単純なスクリプトですが、
今回一番使えるな、と思ったのは
ブロック要素の文字列たちで、
ここで使った以外にも横方向に縮めた線や
一マスを4分割にしてそのうちの一部を表示する文字があって、
これらがあるとAscii artとかも色々出来る事増えるな、と。