GeekTool@自己満足のためのデスクトップデコレーション


# GeekToolとは

GeekToolはデスクトップを好きに着飾ることができるアプリです。
かなり有名なものだと思います。
イメージとしてはWindowsVistaのガジェットが近いと思います。

## インストール

[公式サイト](http://projects.tynsoe.org/en/geektool/)からDownloadしてインストールしてください。

## 設定

アプリケーションを起動すると↓の様なウィンドウが立ち上がります。
![スクリーンショット 2015-07-07 15.22.19.png](https://qiita-image-store.s3.amazonaws.com/0/74539/f23afc65-37ce-a9ab-a9e0-cded626a8edd.png "スクリーンショット 2015-07-07 15.22.19.png")

左側に表示されているアイコンをデスクトップ上にドラッグ＆ドロップすることで、表示領域を確保することができます。
各項目の内容は以下の様な感じです。

- Geeklets
	- File
		- テキストを表示する
	- Image
		- 画像を表示する
	- Shell
		- シェルスクリプトの実行結果を表示する
- Manage group
	- 表示項目をグループ分けして、個別に有効/無効の設定ができる
- チェックボックス
	- Enable
		- 有効 / 無効
	- Automaticaly launch at login
		- ログイン時に自動起動するか(何故か毎回チェックが外れてる…)
	- Show in menu bar
		- メニューバーに起動アイコンを設置するかどうか 

また、各ウィンドウを設置すると詳細設定が出てきます。今回は割愛(逃)！
※ シェルスクリプトの場合、定期実行させないとリアルタイム性がありませんのでご注意を。

# 本題

せっかくシェルスクリプトが動くなら何かかっこいいことしようぜ！
ということで、コマンドとかシェルスクリプトとかをちょこっとかじりながら書いてきたものです。
もっとうまくやれると思いますが、残念な部分は大目に見てください。

## 1. PROCESS MONITOR

###イメージ

![スクリーンショット 2015-07-08 22.23.20.png](https://qiita-image-store.s3.amazonaws.com/0/74539/1a8e8fbb-d11a-c0ac-96ff-10bbc63bb021.png "スクリーンショット 2015-07-08 22.23.20.png")

### スクリプト

psの出力結果を表示するだけ！ですがひと工夫！

```
#!/bin/sh
ps -acrxo "command pid %cpu %mem time" | grep -vw "grep\|top\|ps" | head -11
```

#### ps

プロセスを出力するコマンド

##### 利用しているオプション

- a: 自分以外のユーザーのプロセスも表示
- c: コマンド名のみを表示
- r: 実行中のプロセスのみ表示
- x: 制御端末のないプロセスの情報も表示
- o: 出力フォーマットの指定

### grep

行の抽出を行うコマンド

##### 利用しているオプション

- v: マッチしないものを表示
- w: 単語で検索

### head

指定した行数分、上から表示するコマンド

##### 利用しているオプション

- -11: カラム名+抽出された上位10プロセス(計11行)を表示

## 2. NETWORK MONITOR

### イメージ

![スクリーンショット 2015-07-08 22.59.16.png](https://qiita-image-store.s3.amazonaws.com/0/74539/7881bfbd-1fba-07fe-e87f-5c1cc9fc0593.png "スクリーンショット 2015-07-08 22.59.16.png")

### スクリプト

```
#!/bin/sh
ext_info=`curl --silent api.ipify.org --max-time 5`

en0_info=`ifconfig en0 |grep inet |grep netmask |grep -v 127.0.0.1 |awk '{print $2}'`
en2_info=`ifconfig en2 |grep inet |grep netmask |grep -v 127.0.0.1 |awk '{print $2}'`

wait

if [ -n "$ext_info" ];
then
    echo "External        : $ext_info"
else
    echo "External        : OFFLINE"
fi

unset ext_info

if [ -n "$en0_info" ];
then
    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//'`

    echo "Wi-Fi           : $en0_info"
    echo "- SSID          :$wifi_network"
    echo "- Channel       :$wifi_channel"
    echo "- Transmit Rate :$wifi_txRate"
    echo "- Max Rate      :$wifi_maxRate"

    unset wifi_network
    unset wifi_txRate
    unset wifi_maxRate
    unset wifi_channel
else
    echo "Wi-Fi           : INACTIVE"
fi

unset en0_info

if [ -n "$en2_info" ];
then
    echo "Ethernet        : $en2_info"
else
    echo "Ethernet        : INACTIVE"
fi

unset en2_info

```

## 3. USAGE MONITOR

### イメージ
![スクリーンショット 2015-07-08 23.10.59.png](https://qiita-image-store.s3.amazonaws.com/0/74539/c6c66fa8-1128-3269-6826-63e6dfc1ed40.png "スクリーンショット 2015-07-08 23.10.59.png")

### スクリプト

```
#!/bin/sh
myData=`top -l 1`
typeset -i cnt=0

echo "CPU             \c"
myCPU=`echo "$myData" |awk -F '[ % ]' '/CPU usage/ {print $3+$6}' |bc`
myCPU=`echo "tmp=$myCPU; tmp /= 1; tmp" |bc`

while [ $cnt -lt $myCPU ]
do
    echo "\033[1;32m|\033[0m\c"
    cnt=`expr $cnt + 5`
done

while [ $cnt -lt 99 ]
do
    echo "|\c"
    cnt=`expr $cnt + 5`
done

printf %6d $myCPU && echo "%\c"
echo "\r"

unset myCPU
cnt=0

echo "Memory          \c"
# カーネル, OS系使用量
myWiredMem=`echo "$myData" |grep "PhysMem" |sed -e "s/(//g" |awk '{print $4}' |sed s/M// |sed s/\(//`
myUsedMem=`echo "$myData" |awk '/PhysMem/ {print $2}' |egrep "[0-9]M" |sed s/M//`
myFreeMem=`echo "$myData" |awk '/PhysMem/ {print $6}' |egrep "[0-9]M" |sed s/M//`
myTotalMem=`sysctl hw.memsize |awk '{print $2}'`
myTotalMem=`echo "tmp=$myTotalMem; tmp /= 1048576; tmp" |bc`

# Macが10Gと省略し始めるので頑張ってみた
if [ ! -n "$myUsedMem" -a -n "$myFreeMem" ]; then
    myUsedMem=`echo |awk '{print t - f - a}' t=$myTotalMem f=$myFreeMem a=$myWiredMem`
fi
if [ ! -n "$myFreeMem" -a -n "$myUsedMem" ]; then
    myFreeMem=`echo |awk '{print t - u - a}' t=$myTotalMem u=$myUsedMem a=$myWiredMem`
fi

myUsedPer=`echo "tmp=($myUsedMem * 100 / $myTotalMem); tmp" |bc`
myWiredUsedPer=`echo "tmp=($myWiredMem * 100 / $myTotalMem); tmp" |bc`
myTotalUsedPer=`echo |awk '{print a + u}' a=$myWiredUsedPer u=$myUsedPer`

while [ $cnt -lt $myTotalUsedPer ]
do
    if [ $cnt -lt $myUsedPer ];
    then
        echo "\033[1;32m|\033[0m\c"
    else
        echo "\033[0;36m|\033[0m\c"
    fi
    cnt=`expr $cnt + 5`
done

while [ $cnt -lt 99 ]
do
    echo "|\c"
    cnt=`expr $cnt + 5`
done

printf %6d $myTotalUsedPer && echo "%\c"
echo "\r"

unset myData
unset myWiredMem
unset myUsedMem
unset myFreeMem
unset myTotalMem
unset myUsedPer
unset myWiredUsedPer
unset myTotalUsedPer
cnt=0

echo "Disk            \c"
myDisk=`df |awk '/dev\/disk1/ && NF>1 {print $5}' |sed 's/\%//'`

while [ $cnt -lt $myDisk ]
do
    echo "\033[1;32m|\033[0m\c"
    cnt=`expr $cnt + 5`
done

while [ $cnt -lt 99 ]
do
    echo "|\c"
    cnt=`expr $cnt + 5`
done

printf %6d $myDisk && echo "%\c"
echo "\r"

unset myDisk
unset cnt
```

# まとめ

今回のNetwork MonitorとCPU Monitorは、Mac OSのバージョンアップがあるたびにコマンドの出力結果とかが変わるので、維持管理が面倒です。
それでも、自分で作るのはやっぱり楽しいですね。
ちゃんと表示されなくなってメンテ(改築？)を行うので、ツギハギ感が半端ないですが…

ちなみに、ただかっこいいものを表示させたいだけなら、検索すればGeekToolの設定ファイル(スクリプトとかのエクスポートファイル)が出てくるのでそれをインポートするといいと思います。
拾ってきたものを自分好みに改良するのもいいと思います。

表示設定でフォント、カラー、サイズ等が設定できるので、見た目だけでもこだわって自分だけのデスクトップを作ってください！

![2015-07-08-23.36.56.jpg](https://qiita-image-store.s3.amazonaws.com/0/74539/192a124b-3be3-d613-1efd-5874a607cdf6.jpeg "2015-07-08-23.36.56.jpg")