デスクトップ上に情報を表示させる方法は沢山ありますが、
GeekToolはMacで最も自由に表示をカスタマイズ出来るアプリの1つだと思います。
中でも、”Shell”と言うGeeklet(情報を表示するウィンドウ)を作る事が出来て、
適当なコマンドの出力結果をデスクトップに表示することが出来ます。
自分の環境ではこれを使ってGoogleカレンダーの予定やCPU/Memory情報の一部などを
表示させています。
gcalcli
gcalcli はpythonで作られた
Googleカレンダーを操作することが出来るアプリケーションです。
インストールは上記ページから直接ダウンロードするかgit clone
で。
以前のパージョンでは必要なかったのですが、(v3から?)Google API Clientを使う
様になったので、これをインストールしておく必要があります。
gcalcliのインストールも含めて以下の様な感じで
1
2
3
4
5
$ cd /tmp
$ git clone git://github.com/insanum/gcalcli.git
$ mkdir -p ~/usr/bin # or as you like (in $PATH)
$ cp gcalcli/gcalcli ~/usr/bin
$ sudo easy_install --upgrade google-api-python-client
以前のバージョンをインストールしていた場合、ユーザー名や
パスワードを書いた~/.gcalclirc
と言うファイルがあるかもしれませんが、
新しいバージョンではユーザー名等は必要ないので特に凝った設定をしてない限りは
削除するかどこかへ移動させて置いた方が良いです(でないと新しいスクリプトでは
理解出来ない項目が出てきてクラッシュします)。
インストールしたら
gcalcli list
などとするとデフォルトブラウザが開いて
の様に許可をするかどうか聞かれるのでアクセスを許可
をクリック。
すると、$HOME
に.gcalcli_oauth
と言うファイルが出来ているはずで、
これが今後認証のために使われます。
以降、同じようにgcalcli list
等とすればすぐにカレンダーのリストが
表れる様になります。
gcalcli agenda
とすると予定の一覧が見れ、さらに--calendar [カレンダー名]
オプションを与える事で予定を見るカレンダーを絞れます
1 。
表示させているGeeklet: カレンダー
まず1つ目はカレンダーです。見て分かる様にコマンドcal
の様な出力にしています。
この出力はgcalCal
というスクリプトで作っています。
やっていることは
date
コマンドを使って今月の日付一覧と(1日や31日と同じ週にある)前後の月の
埋め合わせ日付のリストを作る。
Googleカレンダーから予定のリストを取ってきて予定のある日をチェック。
Holidays
という名前を含むカレンダーの予定は別に取得。
当日は色反転、予定のある日は'
を、休みの日にはアンダーバーを付ける様にして
出力。
白黒だけでやろうとしているので'
などを使っていますが、
色を使って良いのであれば休日は赤にして予定のある日にアンダーバーにする、
と言った方がすっきりすると思います。
表示させているGeeklet: 予定リスト
カレンダーの下には予定リストを表示しています。
場所を選ばなければ単にgcallist agenda
の結果でも良いのですが、
オリジナルのままだと幅を取ってしまうので、
まずgcalcli
自体を少しいじって
agenda
の表示方法を変えています。(使っているgcalcli
はv3.1
)
gcalcli.diff
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
52
53
diff --git a/gcalcli b/gcalcli
index f5cc390..c39bc84 100755
--- a/gcalcli
+++ b/gcalcli
@@ -1074,7 +1074,7 @@ class gcalcli:
new_descr += wrapper.fill(line) + "\n"
return new_descr.rstrip()
- indent = 10 * ' '
+ indent = ''
detailsIndent = 19 * ' '
if self.military:
@@ -1092,11 +1092,11 @@ class gcalcli:
PrintMsg(self.dateColor, prefix)
if event['s'].hour == 0 and event['s'].minute == 0 and \
event['e'].hour == 0 and event['e'].minute == 0:
- fmt = ' ' + timeFormat + ' %s\n'
+ fmt = ' %s\n'
PrintMsg(self._CalendarColor(event['gcalcli_cal']), fmt %
- ('', self._ValidTitle(event).strip()))
+ (self._ValidTitle(event).strip()))
else:
- fmt = ' ' + timeFormat + ' %s\n'
+ fmt = ' ' + timeFormat + ' %s\n'
# if 'summary' not in event:
# dprint(event)
PrintMsg(self._CalendarColor(event['gcalcli_cal']), fmt %
@@ -1318,7 +1318,7 @@ class gcalcli:
return
# 10 chars for day and length must match 'indent' in _PrintEvent
- dayFormat = '\n%F' if yearDate else '\n%a %b %d'
+ dayFormat = '%d(%a)/%b/%Y:\n'
day = ''
for event in eventList:
@@ -1500,6 +1500,17 @@ class gcalcli:
eventList = self._SearchForCalEvents(start, end, None)
+ # Remove duplications
+ events=[]
+ newEventList=[]
+ for e in eventList:
+ if e['summary'] not in events:
+ newEventList.append(e)
+ events.append(e['summary'])
+ eventList = newEventList
+
if self.tsv:
self._tsv(start, eventList)
else:
diff --git a/gcalcli b/gcalcli
index f5cc390..c39bc84 100755
--- a/gcalcli
+++ b/gcalcli
@@ -1074,7 +1074,7 @@ class gcalcli:
new_descr += wrapper.fill(line) + "\n"
return new_descr.rstrip()
- indent = 10 * ' '
+ indent = ''
detailsIndent = 19 * ' '
if self.military:
@@ -1092,11 +1092,11 @@ class gcalcli:
PrintMsg(self.dateColor, prefix)
if event['s'].hour == 0 and event['s'].minute == 0 and \
event['e'].hour == 0 and event['e'].minute == 0:
- fmt = ' ' + timeFormat + ' %s\n'
+ fmt = ' %s\n'
PrintMsg(self._CalendarColor(event['gcalcli_cal']), fmt %
- ('', self._ValidTitle(event).strip()))
+ (self._ValidTitle(event).strip()))
else:
- fmt = ' ' + timeFormat + ' %s\n'
+ fmt = ' ' + timeFormat + ' %s\n'
# if 'summary' not in event:
# dprint(event)
PrintMsg(self._CalendarColor(event['gcalcli_cal']), fmt %
@@ -1318,7 +1318,7 @@ class gcalcli:
return
# 10 chars for day and length must match 'indent' in _PrintEvent
- dayFormat = '\n%F' if yearDate else '\n%a %b %d'
+ dayFormat = '%d(%a)/%b/%Y:\n'
day = ''
for event in eventList:
@@ -1500,6 +1500,17 @@ class gcalcli:
eventList = self._SearchForCalEvents(start, end, None)
+ # Remove duplications
+ events=[]
+ newEventList=[]
+ for e in eventList:
+ if e['summary'] not in events:
+ newEventList.append(e)
+ events.append(e['summary'])
+ eventList = newEventList
+
if self.tsv:
self._tsv(start, eventList)
else:
上の変更で、さらに同じ名前の予定が複数ある時は最初だけを表示する様にしています。
(毎週ある予定等の重複表示を避けるため)
この変更を行ったgcalcli
をgcalList
というスクリプトを使って最終的に表示させています。
このスクリプトでは
gmail
、Facebook
、Time
と付いたカレンダーのみに情報を取得して
表示させています。
表示させているGeeklet: タスクリスト
現在実際には使っていないのですが、iCalでのイベントを
コマンドラインから呼べるicalBuddy
と言うツールがあり、
これを使ってタスクリストを表示させていました。
icalBuddy
をインストール後
`/usr/local/bin/icalBuddy uncompletedTasks | sed -e "s/*/-/"`
というコマンドを与えたGeekletです。
(現在はタスクリストはGoogle Taskに書き込んでいて、
iCalとは同期させていないので何も表示されません。)
表示させているGeeklet: CPU/Memory情報
最後にCPUやMemoryを使っているアプリの情報です。
これはps
の出力をちょっといじった出力にしています。
スクリプトはmyps
です。
設定
上の例はカレンダー表示の例ですが、
このようにCommand
欄にスクリプトを記入します。
その下にある数字で何秒ごとに更新するか(Refresh every)、と
Timeoutの時間を設定します(上の例では5分毎)。
Position, Sizeは直接ウィンドウをいじっても変更出来ます。
フォントサイズはCPU/Memory情報が11ptで他は12ptにしています。
全部合わせて下の様な感じで、画面の右端に表示してあります。