2012年3月13日火曜日

Mac, Geektool, Calendar, Agenda, iCal, Gmail, CPU usage, Memory, Network

これまでずっと,公私ともにWindowsをメインで使い,Linuxでサーバを組んだり管理したりしてきた.Macなんか使う理由がなかった.ここ最近,いろいろ故あって,Macを入手したので,すこし使ってみようかな,と思った.
とはいえ,ショートカットキーも良く知らないので,ひとつひとつの操作にカーソルを大きく動かさないといけないとか,なんて腐ったUIだと思ったわけだ.その認識は今もあんまり変わっていない.
MacのUIがどんだけ腐っているか,というドザー的主張だけでご飯が3杯いけそうなので,それはとりあえずほっとくことにする.今日の本旨ではない.

先日のネタで,Windowsのデスクトップガジェットが廃止ということで,その代替ソフトを見つけてきて,いろいろいじったよ,という事を書いた.→参照
Macには,ダッシュボードという,デスクトップガジェットに似た機能がある.あるんだけど,これは常時デスクトップに表示されるわけではない.Magic Trackpadで指三本横に払うジェスチャーしてデスクトップを切りかえれば確認できるんだけど,Windowsの操作に慣れていると,ちょっと使い勝手が悪い.大日本帝国時代のように,身体をシステムに合わせればいいというのもアリではあるが,道具に振り回されるのはそれはそれで違う気がする.

話が逸れたが,Windowsで使っているようなデスクトップガジェットと同じような情報を表示してくれるソフトがMacにもないだろうかと探してみた.そしたら,geektoolというものを見つけた.結構有名なソフトらしく,今ではApp Storeにも登録されている.日本語もちゃんと扱えるようだ.

ということで,このgeektoolをインストールした. インストールの仕方や基本的なガジェットの設置方法等はわざわざ説明する必要もないので,割愛する.ネットの世界は広大なので,この程度のことはいくらでも見つけられるだろう.
ちょっと触ったところ,ああこれはLinuxのconkyみたいなもんだなと思った. コマンドの実行結果をデスクトップに表示してくれるわけだ.ただし,conkyが図形描画(グラフとか)も簡単にできる一方で,geektoolはその辺があまり得意ではないぽい.無理をすれば,1秒毎とかに画像を出力して,それを表示させるという方法もあるんだろうけど,システムやハードへの負荷を考えると,微妙なところだ.

さて,前置きが長くなったが,1日2日いじってみて↓のような配置で落ち着いた.
 アナログ時計は,SimpleFloatingClockというフリーソフトを使っている.いろいろカスタマイズできて便利なような.Lion上ではセッティングや新しい時計の作成など,一部の機能の起動がうまいことできたりできなかったりと怪しいところもあるが,時計を表示する分には問題ない.

Calendar部分はここを参考に,シェルスクリプトを書いた.Calendarの下にAgendaを表示するようにした.これは,Google Calendarと同期しているiCalの内容を表示している.iCalの内容を表示するためには,icalBuddyというユーティリティを使う. Calendar,Agendaはそれぞれ別のガジェットとして配置することもできるが,更新頻度とか,リソースとか考えて(それが果たして効果的かどうかはわからないが),1つのガジェットになっている.つまり,
これで1つ.
Commandは
sh /PATH/calendar.sh
echo "------------------------"
echo "Agenda"
echo ""
/usr/local/bin/icalBuddy -sd -nc eventsToday+10 | sed -e "s/today:/今日:/" -e "s/day after tomorrow:/明後日:/" -e "s/tomorrow:/明日:/"
こんな感じ. PATH部分はCalendarのシェルスクリプトまでのパス.例えばCalendarスクリプトを書類フォルダに作ったgeektoolフォルダの中に入れてあれば,
/Users/hoge/documents/geektool/calendar.sh
みたいな.もちろん,このシェルスクリプトには実行権限を付加(chmod +w)していある.
icalBuddyは表示が英語なので,お好みで
sed -e "s/today:/今日:/" -e "s/day after tomorrow:/明後日:/" -e "s/tomorrow:/明日:/"
とかして,日本語に置き換える.
次に,ネットワーク速度.

スクリーンショットを撮った時にたまたま通信していなかったようで,0kb/secとなっている.これもシェルスクリプトを呼び出している.ここを参考にしてほしい.

その下のCPU,RAMの表示.
これはtopコマンドをawkで一生懸命整形している.#部分が使用率によって動く.
top -R -F -u -l 2 | awk '/CPU usage|PhysMem/ && NR > 12 { if( $1 == "CPU" ){ printf "CPU ["; for( i = 0;  i < $5/2;  i++ ) { printf "#" } for ( j = 100/2-i; j >0; j--){ printf " " } print "]" $5 }else{ printf "RAM ["; for( i = 0;  i <$4/$8*50;  i++ ){ printf "#" } for ( j = 100/2-i; j >0; j-- ){ printf " " } printf "]"; printf("%3.2f", $4/$8*100); print "%"; printf "    free:" $10 " usage:" $4 "/" $8 " wired:" $2}};'
結構むりむり1行で書いている.改行すると,
top -R -F -u -l 2 |
awk '/CPU usage|PhysMem/ && NR > 12 {
  if( $1 == "CPU" ){
    printf "CPU [";
    for( i = 0;  i < $5/2;  i++ ) {
      printf "#"
    }
    for ( j = 100/2-i; j >0; j--) {
      printf " "
    }
    print "]" $5
  }else{
    printf "RAM [";
    for( i = 0;  i <$4/$8*50;  i++ ) {
      printf "#"
    } for ( j = 100/2-i; j >0; j-- ) {
      printf " "
    }
    printf "]";
    printf("%3.2f", $4/$8*100);
    print "%";
    printf "    free:" $10 " usage:" $4 "/" $8 " wired:" $2
  }
};'
こんな構造になっている.興味ある人は適宜解読してほしい.
改行したものをコピペしたところで,まともには動かないと思う.コピペするときは改行していない方をどうぞ.

CPU,RAM使用率の下にあるのが,CPU使用率,メモリ使用量のトップ5リスト.
これはそれぞれpsコマンドで簡単に書いて,ガジェットを横にならべている.
ps -c -U user -o command,%cpu -r |head -n 6

ps -c -U user -o command,%mem,rss -m |head -n 6
上がCPU,下がメモリだ.user部分は実行ユーザ名を入れる.例えばユーザ名hogeであれば,
ps -c -U hoge -o command,%cpu -r |head -n 6
となる.psのオプション -r はCPU使用率の大きい順にソート,-mはメモリ使用量の大きい順にソートを意味する.パイプ(|)の後ろは,頭から何行表示するか(headコマンド),ということ.この場合は6行.タイトル行+トップ5となっている.

最後にGmailの表示.これは,ここの,4) Check your unread Gmail from the command lineから何も考えずに持ってきた.その部分を抜粋して,適当翻訳つけてみた.

4) Check your unread Gmail from the command line(コマンドラインから未読Gmailを表示する)

curl -u username:password –silent “https://mail.google.com/mail/feed/atom” | tr -d ‘\n’ | awk -F ” ‘{for (i=2; i<=NF; i++) {print $i}}’ | sed -n “s/\(.*\)<\/title.*name>\(.*\)<\/name>.*/\2 – \1/p”

Checks the Gmail ATOM feed for your account, parses it and outputs a list of unread messages.(GmailのATOMフィードをチェックして未読メッセージをリストにするよ.)

For some reason sed gets stuck on OS X, so here’s a Perl version for the Mac:(でもOS Xだと動かないから,MacのためにPerl版も書いておくね. )

curl -u username:password --silent "https://mail.google.com/mail/feed/atom" | tr -d '\n' | awk -F '<entry>' '{for (i=2; i<=NF; i++) {print $i}}' | perl -pe 's/^<title>(.*)<\/title>.*<name>(.*)<\/name>.*$/$2 - $1/'If you want to see the name of the last person, who added a message to the conversation, change the greediness of the operators like this:(もし最終行の送信者名を表示させたかったら,以下のようにしてね.)
curl -u username:password --silent "https://mail.google.com/mail/feed/atom" | tr -d '\n' | awk -F '<entry>' '{for (i=2; i<=NF; i++) {print $i}}' | perl -pe 's/^<title>(.*)<\/title>.*?<name>(.*?)<\/name>.*$/$2 - $1/'
ということだ.なので,
echo "Gmail"
curl -u username:password --silent "https://mail.google.com/mail/feed/atom" | tr -d '\n' | awk -F '<entry>' '{for (i=2; i<=NF; i++) {print $i}}' | perl -pe 's/^<title>(.*)<\/title>.*?<name>(.*?)<\/name>.*$/$2 - $1/'
と,頭にechoしてガジェットタイトルとして"Gmail"を表示している. usernamepasswordはそれぞれgmailにログインするときに入力するusernameとpasswordを入れる.例えばユーザ名nemo(@gmail),パスワードhogehogeであれば,nemo:hogehogeとなる.

NetworkとCalendarのshell scriptを置いておく.
Network → inout.sh
Calendar → calendar.sh

0 件のコメント:

コメントを投稿