読者です 読者をやめる 読者になる 読者になる

8t's BBR

よくつまったあれこれをメモ

GeekToolでMacのデスクトップをかっこよく

豆知識 shell & command


Macのデスクトップをカッコ良くしたい。
以前からずっと考えてはいたが実行してなかったので、今回挑戦。

使用したのはGeekTool。

先に完成形を見せるとこんな感じです。
f:id:ykng0:20170131093103p:plain
まぁかっこよくなったかと言われれば人によりけりでしょうが、個人的にはそれっぽくなったので満足です。
あまりUnixコマンドに詳しくなくても、ネットの力を借りてなんとかここまでできました。


順に見ていこうと思いますが、参考にさせていただいた記事を先に紹介させていただこうと思います。
http://www.lifehacker.jp/2012/07/120727geektool.html
http://iici.cocolog-nifty.com/blog/2011/09/geektool-1b5c.html
http://gunbird.blog.fc2.com/blog-entry-1808.html
http://leopardgecko.hatenablog.com/entry/2016/10/25/161147


基本的なGeekToolの使い方

これは、こちらの記事を参考にしてください。
http://www.lifehacker.jp/2012/07/120727geektool.html

シェル系のgeekletならCommandRefresh everyFontsさえ指定するだけでも十分だと思います。
ちなみに、見た目が汚くてもフォント変えると整形されたりするので、色々試してお気に入りのフォントを探してみてください。
私は、ほぼ全てをCourierのボールドにしました。

以下が設定したコマンド一覧です。

 

基本情報

上から順に、OS、PCのモデル、CPU、メモリ情報です。

echo `sw_vers -productName` \(v`sw_vers -productVersion`\);
sysctl -n hw.model;
sysctl -n machdep.cpu.brand_string;
sysctl -n hw.memsize | awk '{print $0/1073741824" GB RAM"}';

 

システム情報

上から順に、CPUアイドル、メモリの空き、HDDの空いてる容量(あと、何パーセント使用されているか)、Uptimeです。
Uptimeは下のシェルスクリプトです。普通のuptimeコマンドもありますが、こっちの方がわかりやすい。丸パクリです。

top -l 2 | awk '/CPU usage/ && NR > 5 {print "CPU Idle: " $7}';
top -l 1 | awk '/PhysMem/ {print "RAM Free: " $6}';  
df -hl | grep 'disk1' | awk '{print "HDD Free: " $4" ( " $5 " used ) "}';

#!/bin/bash
then=$(sysctl kern.boottime | awk '{print $5}' | sed "s/,//")
now=$(date +%s)
diff=$(($now-$then))
days=$(($diff/86400));
diff=$(($diff-($days*86400)))
hours=$(($diff/3600))
diff=$(($diff-($hours*3600)))
minutes=$(($diff/60))
function format {
if [ $1 == 1 ]; then
echo $1 ' ' $2
else
echo $1 ' ' $2's'
fi
}
echo 'Uptime: '`format $days "d"` `format $hours "h"` `format $minutes "m"`

 

バッテリー情報

これはさっぱり解読不能でしたが、素晴らしい出来栄えだったので、即採用。

ioreg -l | grep -i capacity | tr '\n' ' | ' | awk '{print ("System Battery: ",$10/$5 * 100,"%")}';pmset -g batt |awk '{print $4 $5 $6}'|grep ';'|sed 's/;/ /g'; osascript -e 'set a to do shell script "ioreg -w0 -l | grep Capacity"' -e "set h to word 5 of a" -e "set z to word 33 of a" -e "set b to word 38 of a" -e "set c to 1000 * b / z" -e "set d to round c" -e "set f to d / 10" -e "set q to 1000 * h / b" -e "set w to round q" -e "set j to w / 10" -e '"Battery Health: " & j &"%"' | iconv -f utf-8 -t ucs-2-internal; ioreg -w0 -l | grep "Cycle Count" | awk 'BEGIN { FS = "=" } ; {print $8}' | awk 'BEGIN { FS = "}" } ; {print $1, "Cycles"}';

 

プロセス一覧(CPU利用率順)

稼働しているプロセスを、CPUをくっている順に表示します。
最後の数字を変えれば、表示数を変えることができます。

ps -arcwwwxo "command %cpu" | grep -v grep | head -13

 

プロセス一覧(メモリ利用率順)

稼働しているプロセスを、メモリをくっている順に表示します。
これも、最後の数字で表示数を変えることができます。

ps -amcwwwxo "command %mem" | grep -v grep | head -13

 

プロセス情報と平均ロード

上側がプロセス情報で、下が平均ロードプロセス数です。
プロセス情報は見た通りです。
平均ロードプロセス数については、左から順に1分、5分、15分単位です。
この数は1を切っている方がいいそうですが、基本1超えてる・・・
geekletの更新頻度が高いのが多すぎるせいかもしれません・・・

echo "Processes";
top -l 1 | awk '/Processes/ {print "total: " $2}';
top -l 1 | awk '/Processes/ {print "running: " $4}';
top -l 1 | awk '/Processes/ {print "sleeping: " $6}';
top -l 1 | awk '/Processes/ {print "threads: " $8}';

echo;
echo "Load Avg";
top -l 2 | awk '/Load Avg/ && NR > 5 {print $3 " " $4 " " $5}';

 

ネットワーク状況

接続しているネットワークの情報を教えてくれます。
繋がってないならOFFLINEとか書いてくれるし、かなりスマート。
時々、Script time outとなるのが非常に残念。なんとかできないものか・・・。
あと、MacBook Airの場合は有線LANが無いのでe0がWi-Fiだが、有線LAN付属モデルの場合はe0が有線、e1がWiFiとなるのでスクリプトを修正する必要があるそうなので、ご注意を。

#!/usr/bin/perl

$en0_info = `ifconfig en0 | grep "inet" | grep -v 127.0.0.1`;
$en1_info = `ifconfig en1 | grep "inet" | grep -v 127.0.0.1`;
$ext_info = `curl --silent http://checkip.dyndns.org | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'`;
$wifi_network = `/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -I | awk -F: '/ SSID: / {print $2}' | sed -e 's/.*SSID: //'`;
$wifi_txRate = `/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -I | awk -F: '/ lastTxRate: / {print $2}' | sed -e 's/.*lastTxRate: //'`;
$wifi_maxRate = `/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -I | awk -F: '/ maxRate: / {print $2}' | sed -e 's/.*maxRate: //'`;
$wifi_channel = `/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -I | awk -F: '/ channel: / {print $2}' | sed -e 's/.*channel: //' -e 's/,1//'`;
if($ext_info) {
 $output .= "External: $ext_info";
} else {
 $output .= "External: OFFLINE \n";
}
if($en0_info) {
 $en0_info =~ /inet (.*) netmask/s;
 $en0_info = $1;
 $output .= "Wi-Fi: $en0_info \n";
 $output .= "  SSID: $wifi_network";
 $output .= "  Channel: $wifi_channel";
 $output .= "  Transmit Rate: $wifi_txRate";
 $output .= "  Max Rate: $wifi_maxRate";
} else {
 $output .= "Wi-Fi: INACTIVE \n";
}
if($en1_info) {
 $en1_info =~ /inet (.*) netmask/s;
 $output .= "Ethernet: $1 \n";
} else {
 $output .= "Ethernet: INACTIVE \n";
}
print "$output";

 

天気

これが一番大変だった。
基本的にYahoo天気などを利用するものだが、昔の記事のやつだと、APIの仕様が今と違うようで、そのままコードを使えない。
かといって、どこを変えればいいかもわからない・・・
そのため、新しめの記事のものを採用させていただきました。
説明は全て丁寧に書かれてあるので記事の紹介だけにします。
http://leopardgecko.hatenablog.com/entry/2016/10/25/161147

 

日付と時刻

この部分は一番アレンジしがいのある部分になるかと思います。
基本的に一つのgeekletにつき一つしかフォントや大きさを指定できないので、別々に作って組み合わせていくのがオシャレにできるポイントかなと思います。

また、この類のgeekletはたくさん作られているので、以下などから探すのもオススメです。
http://www.macosxtips.co.uk/geeklets/alltime/page/1

私が採用したシンプルなやつはこちらになります。上が日付で、下が時間です。
曜日を英語表記にしたい方は、下の方にあるset locale environmentにチェックを入れてください。

date "+%m.%d (%a)"
date "+%H:%M"

 

カレンダー

フォントによっては結構ぐちゃぐちゃの形になってしまうので、綺麗に整形されるものを選択する必要があるかと思います。
ちなみに私が使用したのは上にも書きましたが、Courierのボールドです。
私の設定では、今日の日付は色付けしてくれます。途中の31の数字をいじれば他の色にできたりします。

cal_head=`cal | head -1`; cal_tail=`cal | tail -7`; today=`date "+%e"`; echo "$cal_head"; echo "${cal_tail/${today}/\033[1;31m${today}\033[0m}";

 

最後に

自分なりの画面が完成した時の達成感は半端なく、感動的でしたが、なんだかんだシンプルな画面もそれはそれでかっこいいので、気分によって変えたりできればと思います(笑)