2012年3月19日月曜日

Mac, Geektool, Weather Forecast, PHP, Google Unofficial API, Japanese

今日もGeektoolのこと.天気予報を日本語で表示しようという話.
↓こんな感じになる.
Gmailガジェットが見切れているのは気にしてはいけない.
Macを少し触って,素晴らしいなと思ったのは,PerlもawkもPHPもインストール済みだということ.コマンドラインでガリガリいじれるってのは楽だ.
さて,今日の肝はPHPでXMLをいじるということ.非常に簡単にXMLをオブジェクト化できる.ただし,文字コードがちゃんとしれいればだけれども.これで2日ハマった.とりあえず,非公式のAPIとはいえ,xmlのヘッダーにcharsetを指定しないでSJISのXMLを返してくるgoogle様はどうかしているとしか思えない.


とりあえず,ここにスクリプトを置いておく.これ以外に用意するものは,天気アイコン.適当なものを見つけてきて,phpスクリプトを参考にして,ファイル名などを設定する.

設置方法は,Geektoolのshellでコマンド部分に
 php PATH/gw.php 【取得したい都市】
としてやると,テキスト部分が表示される.PATHはgw.phpを設置したところ.【取得したい都市】には,都市名をアルファベットで入れてやる.例えば仙台市だったら,sendai,miyagiとなる.多分,sendaiだけでも取得できる.この引数を指定しなければ,東京都の天気(代表地点がどこかは知らない)が表示される.以下,phpスクリプトの解説など.

 #!/usr/bin/php
<?php
    define("ICON_SOURCE_PATH","/hogeoge/");
hogehogeと打ったつもりが,2つ目のhを打ち損じた.めんどうなのでそのままになっている.ここには,天気アイコンフォルダのパスを入れる.例えば/Users/hoge/Document/geektool/Weather/icons/みたいな感じ.
    define("TEMP_PATH","/tmp/");
これはいじる必要ない.天気アイコンをコピーする場所.Geektoolの画像で指定するので覚えておくこと.
//適当な天気アイコンをダウンロードして,適宜書き換えること.
    define("ICON_EXTENTION", ".png");
//この配列変数も,利用する天気アイコンに合わせて適宜書き換える.
    $icon=array(
 (略)
 );
コメントに書いてあるように,利用するアイコンに合わせて設定してやる.今回のこれが,Google APIがXMLの中で指定しているアイコン画像をダウンロードするスクリプトだったら, こんな手間はかからないのだが,如何せん,Google様のアイコンがダサい.自分で好きな画像を見つけてきた方が満足度が高いので,こんな面倒臭いことになっている.あくまで,私が満足するためにやっていることなのだ.
//引数から対象地域を設定.引数がなければ,東京の天気を表示
if($argv[1]){
$city = $argv[1];
}else{
$city ='tokyo';
}
先述の通り.
    $url = 'http://www.google.com/ig/api?weather=' . $city . '&hl=ja';
    $content = mb_convert_encoding(file_get_contents($url),'UTF-8', 'Shift-JIS');
    $xml = simplexml_load_string($content);
    $weather=$xml->weather;
このスクリプトの肝はsimplexml_load_string.simplexml_load_file関数を使おうと思ったのだが,Google様の素晴らしい仕様のお陰さまですこのやろうsuck
取り乱しました.SJISだと,エラーが出て,オブジェクト化できない.なので,対象URLの内容をfile_get_contentsで文字列としてダウンロードして,mb_convert_encodingでUTF-8に変換し,simplexml_load_stringしている.
&hl=jpの部分で,日本語で表示するように指定している.これがなければ,英語表示として取得できる.ただし,先述の$iconでキーに指定しているファイル名が違ってくる.日本語表示の場合はjp_で始まるgif画像だが,英語表示ではjp_が付かないファイル名になるのかと思いきや,全く違うファイル名になる場合がある.もし英語表示で使う場合は,調整が必要となる.もっとも,英語表示でいいんだったら,わざわざこんな面倒くさいスクリプトを使わず,yahoo.comの天気予報を使えばいい.Geektoolでの利用法など,少しググれば解説サイトは簡単に見つかる.
    $info = $weather->forecast_information;
    $current = $weather->current_conditions;

    copy(ICON_SOURCE_PATH . $icon[basename($current->icon->attributes(),'.gif')] . ICON_EXTENTION, TEMP_PATH . "weather_current" . ICON_EXTENTION); // 現在の天気アイコンをコピー
現在の天気を示すアイコンはweather_current.png(拡張子部分は利用する天気アイコンで変わる)となる.
    $str = str_replace('-', '/', $info->forecast_date->attributes()) . "\n";//日付を整形
    $str.= "現在: " . $current->condition->attributes() . "\n";
    $str.= "気温: " . $current->temp_c->attributes();
//このほか,現在の天気情報には湿度,華氏気温もあるが,このスクリプトでは使わない.
    for($i=0; $i<count($weather->forecast_conditions); $i++){
        $forecast=$weather->forecast_conditions[$i];
        copy(ICON_SOURCE_PATH . $icon[basename($forecast->icon->attributes(),'.gif')] . ICON_EXTENTION, TEMP_PATH . "weather_forecast" . $i . ICON_EXTENTION); // 予報の天気アイコンをコピー
今日の今後の天気アイコンはweather_forecast0.png,明日の天気アイコンはweather_forecast1.png,あさっては(略)2.png・・・となる.
//整形しやすくするために,各値を変数に代入
        $low = $forecast->low->attributes();
        $high = $forecast->high->attributes();
        $condition = $forecast->condition->attributes();
//今日の予報と明日以降の予報で処理を分ける
        if($i==0){
            $day = "";
            $str.= "(" . $low . "-" . $high . "℃)\n";
            $str.= "予報: " . $condition;
        }else{
        $str.= "\n------------------\n"; //セパレーター
            $day = $forecast->day_of_week->attributes() . "曜日";
            $str.= $day . "\n" . $condition . "\n" . $low . "-" . $high . "℃";
        }

    }
    $str.= "\n";
    echo $str;
?>
こんな感じ.

2012年3月14日水曜日

Mac, Geektool, Command line calendar, Holydays of Japanese

昨日のエントリーでMacのgeektoolを使う事になって,いろいろいじっている,と書いた.
今日たまたまネットを見ていて,「ラスカマンの超きまぐれなホームページ」でLinux用の日本の祝日対応カレンダーユーティリティを見つけた.
おもむろにダウンロードし,なんとなくmakeしてみたら,そのままビルドでき,実行してみるとそこそこいい感じに表示できたので,それをgeektoolで使ってみよう,という話.
ただし,幸せになるためには,ソースのフォントカラーを指定している部分にちょっと手を加える必要がある.

以下,備忘録的メモ.
リンク先よりtar.gzで圧縮されたファイルをダウンロード,適当な場所に展開する.
フォントカラーを指定している部分は,output_calendar.cにある.
ソース(output_calendar.c)を読めばわかるが,平日を黒色(\x1b[30m)で出力するようになっている.これでは,geektool上でフォントカラーを変更しても,曜日の平日部分は黒いままになってしまう.惜しいなぁ.(そもそも,これでは黒背景のターミナルを使っている場合,文字が読めないんじゃないのかな?黒背景の時は白く表示されるの?この辺検証していないのでわからない.)
ということで,フォントカラーを黒に指定しているところを,フォントカラーリセット(\x1b[0m)に置き換えてやる.
具体的には,output_calendar.c中で\x1b[30mとなっているところを,ことごとく\x1b[0mに置き換える.
※ちなみに,\はエンではなくてバックスラッシュ(optionを押しながら\エン)です.
置き換えが済んだら,ファイルを保存して,makeする.これで曜日平日部分のフォントカラーをgeektool上から自由に設定できる.
geektool使っている人はgeekという前提で話をしているので,geekってなにそれ臭いの?とか,makeってなにそれ美味しいのなんてことは言わないように.大体臭くて不味いです.
jhcalをソースレベルでいろいろいじれば,土日祝日の色や背景色なんかももっといろいろ変更できると思うけど,現状で満足しているのでやらない.
曜日表記を日本語から英語にしたい場合は,
sed -e "2 s/日/Su/" -e "2 s/月/Mo/" …(略)
みたいにしてsedでガリガリ置き換えたらいい.2というのは2行目を意味する.1行目に月表示があるので,置き換え対象となる行を指定してやらないと,"2012年 3Mo"という素晴らしい置き換えが発生する.
これで,あとは昨日のエントリーを参考に,geektoolにコマンドを書いてあげる.
/PATH/jhcal -m | head -8
/PATH/jhcal -nm | head -8
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は例のごとく,jhcalを置いたフォルダまでのパスを記述する.
表示としては,こんな感じになる.フォントは,OSAKAのレギュラー等幅に設定てある.ターミナル上の表示と見比べて欲しい.geektool上では,head -8にしているので,"20(火)春分の日"という行が表示されない.jhcalのコマンドオプションなど詳しい説明は,jhcal -?などとして,ヘルプを参照して欲しい.

そういえば,その昔Ubuntuでconkyをいじった時に,このユーティリティを使った気がする. 素晴らしい具合に忘却の彼方だった.

2012年3月13日火曜日

Rainmeter, LuaCalendar, Holyday of Google Calendar (2)

先ほどアクセスログを見てみたら,Yahoo!知恵袋からの参照があった.参照元の記事内容を見たら,LuaCalendarの曜日表示を英語にしたいという内容だった.これは先日のエントリーについて言及したものだ. なので今日は補足というか,それに対する返信の意味を込めて書く.私はYahooID持っていないので,知恵袋に返信できません.Yahoo!も知恵袋もあんまり好きくない.
本来のLuaCalendarは,曜日表示が英語(SMTWTFS)だが,先日のエントリーのものはスクリプト本体(CScript.lua)をガツガツ改造しているため,日本語表示(日月火水木金土)になっている.これを英語表示したいということらしい.
ちなみに,祝日名を英語表示にはできません.それはGoogleのカレンダー担当に言ってください.Lua上で置き換えできないことないだろうけど,スクリプトを組まないといけないので面倒くさい.(そもそも,日本の祝日を英語で表記したカレンダーを必要とする人ってのはものすごく少ないだろう.)


表示の仕方などは,本来はCScript.luaで指定せず,外部の設定ファイルをいじってやるのがマナー的にベターなんだろうけど,そもそもこのGoogleカレンダー祝日連携版LuaCalendarは私個人が満足できればそれでいい仕様で改造している.ヒトサマにお見せするようなものではない.とはいえ,英語表示ができないわけではない.

言い訳はさておき,本題.
曜日表記を英語頭文字にするためには,LuaCalendarの設定ファイルをいじってやる.
Rainmeterのスキンファイルは,推奨設定でインストールしていれば,マイドキュメントのRainmeterの中のSkinsに入っている.このLuaCalendar(先日のエントリーからダウンロードされたのであれば,LuaCalendar_edとかになっていると思う)に入っているSettings.incをテキストエディタで開いて,
;===== Weekday Label Settings =====
;Custom text for Weekday labels. Uses the following format: Sun|Mon|Tue|Wed|Thu|Fri|Sat
W.Lbl.txt=
に移動.ここで,説明にならってW.Lbl.txtに値を設定してやる.
 ;===== Weekday Label Settings =====
;Custom text for Weekday labels. Uses the following format: Sun|Mon|Tue|Wed|Thu|Fri|Sat
W.Lbl.txt='Sun|Mon|Tue|Wed|Thu|Fri|Sat'
こんな具合.もちろん,この部分を'S|M|T|W|T|F|S'としてやれば,そのように表示される.本当ならここに'日|月|火|水|木|金|土'と入れて日本語表示にしてやるのがマナー的にベターなんだけど,上述した理由で本体スクリプトをガツガツいじってしまっているので,こんな美しくない方法で対応せざるをえない.

ちなみに, 月表記を英語にしたい場合は,
;===== Month Label Settings =====
をいじってやる.この設定について,わざわざここで書くことはしない.設定ファイル中のコメントを読めば,難なくできるはず.
その結果↓


時間を見つけて修正したいなぁと思いつつも,私はこれで満足しているからいいかーと,優先順位が常に低いので,たぶんこのまま修正しない.

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

2012年2月18日土曜日

Rainmeter, LuaCalendar, Holydays of Google Calendar

Rainmeterで日本の祝日がわかるカレンダーのスキンって,あまり見たことない.というか管見の限り,ないんじゃないかと.
Rainlendar使えとかって話もあるけど,あれだって無料版ではローカルのicalしか読み込めないようだし.
なので,作ってみた.ひな形にするのはLuaCalendarのバージョン3.1.
このカレンダー,外部ファイルで与えられた祝日リストを読み込んで表示する.この祝日リストを毎年手書きで書き換える必要がある(日本は毎年,祝日が前後するので).
なので,このリストを書き換えましょう・・・てんじゃ面白くないし,面倒くさい.Googleカレンダーから「日本の祝日」 を読み込んでやろうってこと.

その結果が↓.見た目を自分好みに多少いじってある.祝日にマウスカーソル合わせると,ポップアップで祝日名を表示してくれる.



とりあえず,改造済みのスキンをココにおいておきます.
このスキンのキモはRainmeterとLuaの間でのデータ送受信.つまり,
LuaCalendar.iniのmeasureでGoogla Calendar APIを叩いて祝日リストを取得

取得したデータをLuaからSKIN:GetMeasure(),GetStringValue()で読み取ってやる

Luaで整形して,正規表現にしたがってキャプチャーしたデータをテーブル(Luaでは配列変数をこう呼ぶらしい)に格納
ということをしています.
なんでこんな面倒くさいことをしているかというと,現バージョンのRainmeterでは,Luaの拡張ライブラリをサポートしていないから.
Rainmeterでは将来的にLuaの拡張ライブラリをサポートするかもね,とのこと.
もし拡張ライブラリがサポートされるようになったなら, Lua上から直接Google Calendar APIを叩くことができるのに.

で,以下,注意.
  • 起動直後はGoogleカレンダーからのデータ取得に時間を要するため,祝日がうまく表示されない.
表示されないときは,前後の月に移動したりして,カレンダーを再描画してやると表示される.
これは,RainmeterとLua言語の間でのデータのやりとりで発生するもの.
時間があれば,もう少しなんとかならないかスクリプトを眺めるつもりだけれど,現状使用に耐えうるかな,という感じ.
実際,私の使っているデスクトップはどれも基本つけっぱで,ログアウトすらしない.なので,これで十分.
  •  必要に応じて,Variables.incのStartYearに取得するリストの開始年を入れる.
ここで指定した年の1月1日から取得する.どうも,2年分しか取得してくれないのは,Google Calendar APIの仕様なのか?
とはいえ,今の設定のままで2014年までの祝日を表示できるので, とりあえず満足.

いろいろ適当に改造したんで,動かなかったり,メモリ食ったりするかもしれない.
私の環境では問題なさそうなんで,ひとまずこれで.
余裕があったら,メンテナンス性を向上させるようにVariablesに変数(っていうか,これは定数って言い方の方がいいんじゃないのかな)を追加したりするかも.

2012年2月14日火曜日

Rainmeter, Gcal-4-ex.ini, Gmail-4-ex.ini for Japanese

以下をコピーして,Unicode(UTF-8じゃない)で保存すれば,コレみたいにできるんじゃないかと.
  • 2012/02/18 Gcal-4-ex.iniで,送信者と件名が重なってしまうので,STYLESセクションを微修正. 
  • 2012/02/20 Gmail-4-ex.iniで,Item3以降のStringIndexが間違っていたので修正.

Gcal-4-ex.ini

[Rainmeter]
Author=poiru
AppVersion=1003000
Update=1000
MouseActionCursor=0
MiddleMouseDownAction=!RainmeterDeactivateConfig
BackgroundMode=1

[Metadata]
Name=Google Calendar
Description=Shows upcoming events in Google Calendar.
Instructions=Refer to the manual to display your Gcal events (activate Gnometer\Manual.ini).
Version=1.3.0
License=Creative Commons BY-NC-SA 3.0

[Variables]
skin.Style=Horizontal
GET=.*(?(?=.*<title).*<title.*>(.*)</title>.*<content.*: (.*)\n)
@Include=#ROOTCONFIGPATH#SETTINGS\Variables.inc
skin.Width=#width.Gcal#

; MEASURES ====================================

[mGcal]
Measure=Plugin
Plugin=WebParser.dll
UpdateRate=1800
Url=http://www.google.com/calendar/feeds/#gcal.URL#/basic?max-results=4&futureevents=true&singleevents=true&orderby=starttime&sortorder=a
RegExp="(?siU)<email>#GET##GET##GET##GET#"

[mItem1]
Measure=Plugin
Plugin=WebParser.dll
Url=[mGcal]
DecodeCharacterReference=1
StringIndex=1

[mTime1]
Measure=Plugin
Plugin=WebParser.dll
Url=[mGcal]
StringIndex=2
Substitute="2011/":"","2012/":"","2013/":"","~":"-","01/":"","02/":"","03/":"","04/":"","05/":"","06/":"","07/":"","08/":"","09/":"","10/":"","11/":"","12/":"","&lt;br /&gt;":""

[mItem2]
Measure=Plugin
Plugin=WebParser.dll
Url=[mGcal]
DecodeCharacterReference=1
StringIndex=3

[mTime2]
Measure=Plugin
Plugin=WebParser.dll
Url=[mGcal]
StringIndex=4
Substitute="2011/":"","2012/":"","2013/":"","~":"-","01/":"","02/":"","03/":"","04/":"","05/":"","06/":"","07/":"","08/":"","09/":"","10/":"","11/":"","12/":"","&lt;br /&gt;":""

[mItem3]
Measure=Plugin
Plugin=WebParser.dll
Url=[mGcal]
DecodeCharacterReference=1
StringIndex=5

[mTime3]
Measure=Plugin
Plugin=WebParser.dll
Url=[mGcal]
StringIndex=6
Substitute="2011/":"","2012/":"","2013/":"","~":"-","01/":"","02/":"","03/":"","04/":"","05/":"","06/":"","07/":"","08/":"","09/":"","10/":"","11/":"","12/":"","&lt;br /&gt;":""

[mItem4]
Measure=Plugin
Plugin=WebParser.dll
Url=[mGcal]
DecodeCharacterReference=1
StringIndex=7

[mTime4]
Measure=Plugin
Plugin=WebParser.dll
Url=[mGcal]
StringIndex=8
Substitute="2011/":"","2012/":"","2013/":"","~":"-","01/":"","02/":"","03/":"","04/":"","05/":"","06/":"","07/":"","08/":"","09/":"","10/":"","11/":"","12/":"","&lt;br /&gt;":""

; STYLES ======================================

@Include2=#ROOTCONFIGPATH#SETTINGS\Style#skin.Style#.inc

[sPopup]
Hidden=0

[sTextL]
W=120
;W=(#skin.Width#-90)
;ToolTipText=%1
Hidden=0

[sTextR]
X=125
W=125
Text="%1"
StringAlign=LEFT
;ToolTipText=%1
Hidden=0

[sSeperator]
Hidden=0

; METERS ======================================

[Line]
Meter=IMAGE
MeterStyle=sLine

[Icon]
Meter=IMAGE
MeterStyle=sIcon
ImageName=Gcal.png
ToolTipText="Open Google Calendar"
LeftMouseUpAction=!Execute [http://www.google.com/calendar]
MouseActionCursor=1

[Title]
Meter=STRING
MeterStyle=sTitle
Text="Gcal"

[Subtitle]
Meter=STRING
MeterStyle=sSubtitle
Text="Events"

[Popup]
Meter=IMAGE
MeterStyle=sPopup
H=((#h.Other#*4)+25)

[Item1Left]
Meter=STRING
MeterStyle=sTextL
MeasureName=mTime1
Y=#h.Item#

[Item1Right]
Meter=STRING
MeterStyle=sTextR
MeasureName=mItem1

[Item1Bar]
Meter=IMAGE
MeterStyle=sSeperator

[Item2Left]
Meter=STRING
MeterStyle=sTextL
MeasureName=mTime2
Y=5r

[Item2Right]
Meter=STRING
MeterStyle=sTextR
MeasureName=mItem2

[Item2Bar]
Meter=IMAGE
MeterStyle=sSeperator

[Item3Left]
Meter=STRING
MeterStyle=sTextL
MeasureName=mTime3
Y=5r

[Item3Right]
Meter=STRING
MeterStyle=sTextR
MeasureName=mItem3

[Item3Bar]
Meter=IMAGE
MeterStyle=sSeperator

[Item4Left]
Meter=STRING
MeterStyle=sTextL
MeasureName=mTime4
Y=5r

[Item4Right]
Meter=STRING
MeterStyle=sTextR
MeasureName=mItem4

[Item4Bar]
Meter=IMAGE
MeterStyle=sSeperator

[Gap]
Meter=IMAGE
MeterStyle=sGap
Gmail-4-ex.ini
[Rainmeter]
Author=poiru
AppVersion=1003000
Update=1000
MiddleMouseDownAction=!RainmeterDeactivateConfig
BackgroundMode=1

[Metadata]
Name=Gmail
Description=Shows the latest unread items in your Gmail inbox.
Instructions=Click on the icon to open your Gmail inbox. | To set your your Gmail username and password, activate Gnometer\SkinSettings.ini -> Gmail/Gcal.
Version=1.3.0
License=Creative Commons BY-NC-SA 3.0

[Variables]
skin.Style=Horizontal
MailState=NoNew
Subtitle=No new mail
GET=(?(?=.*<entry>).*<title.*>(.*)</title>.*<link.*href="(.*)".*<modified>(.*)</modified>.*<name>(.*)</name>)
@Include=#ROOTCONFIGPATH#SETTINGS\Variables.inc
skin.Width=#width.Gmail#

; MEASURES ====================================

[mGmail]
Measure=Plugin
Plugin=WebParser.dll
Url=https://#mail.User#:#mail.Pass#@gmail.google.com/gmail/feed/atom
RegExp="(?siU)<fullcount>(.*)</fullcount>#GET##GET##GET##GET#"
UpdateRate=300
StringIndex=1
IfAboveValue=1
IfAboveAction=!Execute [!RainmeterSetVariable Subtitle "%1 new mails"][!RainmeterSetVariable MailState "New"]
IfEqualValue=1
IfEqualAction=!Execute [!RainmeterSetVariable Subtitle "%1 new mail"][!RainmeterSetVariable MailState "New"]
IfBelowValue=1
IfBelowAction=!Execute [!RainmeterSetVariable Subtitle "No new mail"][!RainmeterSetVariable MailState "NoNew"]

[mItem1]
Measure=Plugin
Plugin=WebParser.dll
Url=[mGmail]
DecodeCharacterReference=1
StringIndex=2

[mLink1]
Measure=Plugin
Plugin=WebParser.dll
Url=[mGmail]
StringIndex=3

[mName1]
Measure=Plugin
Plugin=WebParser.dll
Url=[mGmail]
StringIndex=5

[mItem2]
Measure=Plugin
Plugin=WebParser.dll
Url=[mGmail]
DecodeCharacterReference=1
StringIndex=6

[mLink2]
Measure=Plugin
Plugin=WebParser.dll
Url=[mGmail]
StringIndex=7

[mName2]
Measure=Plugin
Plugin=WebParser.dll
Url=[mGmail]
StringIndex=9

[mItem3]
Measure=Plugin
Plugin=WebParser.dll
Url=[mGmail]
DecodeCharacterReference=1
StringIndex=10

[mLink3]
Measure=Plugin
Plugin=WebParser.dll
Url=[mGmail]
StringIndex=11

[mName3]
Measure=Plugin
Plugin=WebParser.dll
Url=[mGmail]
StringIndex=13

[mItem4]
Measure=Plugin
Plugin=WebParser.dll
Url=[mGmail]
DecodeCharacterReference=1
StringIndex=14

[mLink4]
Measure=Plugin
Plugin=WebParser.dll
Url=[mGmail]
StringIndex=15

[mName4]
Measure=Plugin
Plugin=WebParser.dll
Url=[mGmail]
StringIndex=17
; STYLES ======================================

@Include2=#ROOTCONFIGPATH#SETTINGS\Style#skin.Style#.inc

[sPopup]
Hidden=0

[sSeperator]
Hidden=0

[sTextL]
;ToolTipText=%1
W=100
DynamicVariables=1
Hidden=0

[sTextR]
X=105
W=185
;Text="%1"
;ToolTipText=%1
StringAlign=LEFT
DynamicVariables=1
Hidden=0

; METERS ======================================

[Line]
Meter=IMAGE
MeterStyle=sLine

[Icon]
Meter=IMAGE
MeterStyle=sIcon
ImageName=#MailState#.png
ToolTipText="Open Gmail"
LeftMouseUpAction=!Execute [www.google.com/mail]
DynamicVariables=1
MouseActionCursor=1

[Title]
Meter=STRING
MeterStyle=sTitle
Text=Gmail

[Subtitle]
Meter=STRING
MeterStyle=sSubtitle
MeasureName=mGmail
Text=#Subtitle#
DynamicVariables=1

[Popup]
Meter=IMAGE
MeterStyle=sPopup
H=((#h.Other#*4)+25)

;[Item1]
;Meter=STRING
;MeterStyle=sTextL
;MeasureName=mItem1
;Y=#h.Item#
;LeftMouseUpAction=!Execute ["[mLink1]"]

[Item1Left]
Meter=STRING
MeterStyle=sTextL
MeasureName=mName1
ClipString=1
Y=#h.Item#
LeftMouseUpAction=!Execute ["[mLink1]"]

[Item1Right]
Meter=STRING
MeterStyle=sTextR
MeasureName=mItem1
ClipString=1
LeftMouseUpAction=!Execute ["[mLink1]"]

[Seperator1]
Meter=IMAGE
MeterStyle=sSeperator

;[Item2]
;Meter=STRING
;MeterStyle=sTextL
;MeasureName=mItem2
;LeftMouseUpAction=!Execute ["[mLink2]"]

[Item2Left]
Meter=STRING
MeterStyle=sTextL
MeasureName=mName2
ClipString=1
LeftMouseUpAction=!Execute ["[mLink2]"]

[Item2Right]
Meter=STRING
MeterStyle=sTextR
MeasureName=mItem2
ClipString=1
LeftMouseUpAction=!Execute ["[mLink2]"]

[Seperator2]
Meter=IMAGE
MeterStyle=sSeperator

;[Item3]
;Meter=STRING
;MeterStyle=sTextL
;MeasureName=mItem3
;LeftMouseUpAction=!Execute ["[mLink3]"]

[Item3Left]
Meter=STRING
MeterStyle=sTextL
MeasureName=mName3
ClipString=1
LeftMouseUpAction=!Execute ["[mLink3]"]

[Item3Right]
Meter=STRING
MeterStyle=sTextR
MeasureName=mItem3
ClipString=1
LeftMouseUpAction=!Execute ["[mLink3]"]

[Seperator3]
Meter=IMAGE
MeterStyle=sSeperator

;[Item4]
;Meter=STRING
;MeterStyle=sTextL
;MeasureName=mItem4
;LeftMouseUpAction=!Execute ["[mLink4]"]

[Item4Left]
Meter=STRING
MeterStyle=sTextL
MeasureName=mName4
ClipString=1
LeftMouseUpAction=!Execute ["[mLink4]"]

[Item4Right]
Meter=STRING
MeterStyle=sTextR
MeasureName=mItem4
ClipString=1
LeftMouseUpAction=!Execute ["[mLink4]"]

[Seperator4]
Meter=IMAGE
MeterStyle=sSeperator

[Gap]
Meter=IMAGE
MeterStyle=sGap

Rainmeter, Gnometer, Gcal, Gmail

WindowsVista, 7のガジェットが昨年秋に廃止したようで.
ガジェットは結構便利だったので,使っていた.アナログ時計とか,カレンダーとか,Google CalendarやGmailの情報を表示させたり.
将来的に使えなくなると不便というか,Windows8以降で同じ様な情報取得をどうやるのか,やれるのかわからないけど,移行するときにしんどくないように,デスクトップにガジェットを表示してくれるソフトを導入した.
Google Desktopも廃止.Yahooガジェット?あれはGoogle関連のサービスと連携が苦手っぽいので私個人としては使いにくかった.
Vistaが登場したばかりのころは,XPでガジェットを再現するSamrizerとかいうようなのとか,いろいろあったけど,最近の動向は良くしらない.必要なかったからね.
ちょっとググって,適当にみつけたRainmeterというやつを入れてみた.Windows7 64bit版があって,少し幸せだった.ちなみにバージョンは2.2.

インストール時に言語選択が出てくるので,それで日本語を選択すれば,あとは日本語環境になる.
RainmeterのDiscoverからGnometerというスキンをダウンロード.
Rainmeterを推奨された方法(ポータブル版じゃない方) でインストールしていれば,拡張子.rmskinがRainmeterと関連付けされるので,ダウンロードしたファイルをダブルクリックで実行すればよい.

ガジェットの追加方法とか設定方法の説明は面倒くさいので省略.ググってください.
問題は,GcalとGmailガジェットが思いのほか残念な表示になる,ということ.

↑GcalとGmailはこんな感じになる.Gcalは白塗りしてあるのはスケジュール.なぜか右に離れて開始日のみ.それも中途半端な感じに表示される.Gmailは新着メールのタイトルのみが表示されるという,個人的にはちょっと残念仕様.
 このスキンデータが,C:\Users\<ユーザ名>\documents\Rainmeter\Skins\Gnometer以下の,GcalとGmailフォルダにそれぞれ入っているので,眺めてみた.

まず,Gcalの方だけど,これはGoogleカレンダーを日本語で使用していると起こるらしい.
Gcai-4.iniを例にみると,18行目あたりに
GET=.*(?(?=.*<title).*<title.*>(.*)</title><summary.*: (.*)&am)
という記述がある.これは,正規表現的なアレをアレした感じで指定しているんだと思うんだけど,GoogleカレンダーAPIで受信した内容をみると,
<title type='html'>■■■</title><summary type='html'>期間: 2012/02/15 (&amp;#27700;) 13:00~17:00&amp;nbsp;
JST&lt;br&gt;


&lt;br&gt;予定のステータス: 確定</summary><content type='html'>期間: 2012/02/15 (水) 13:00~17:00 
JST&lt;br /&gt;
 みたいになっている.Gcal-4.iniが取得しようとしているのは,titleタグからsummaryタグの途中で"&am"が出てくるところまでっぽい.
<title type='html'>■■■</title><summary type='html'>期間: 2012/02/15 (&amp; 
だから,"2012/0211("みたいな記述になってしまうんだね.じゃあ,これを
GET=.*(?(?=.*<title).*<title.*>(.*)</title><summary.*: (.*)&amp;&nbsp;)
 にしてやればいいんじゃないの?ってやってみた.そうすると,確かに,時間まで表示されるようになった.でも,曜日がうまく表示されない.っていうか,(&amp;#27700;)とかって生のまま表示されてしまう.あーもー.
そこで少しxmlを眺めてみると,summaryの次にcontentタグがある.この中に,Gcal-4.iniがsummaryで取得しようとしていたのと同じデータがあるじゃないか.それも,曜日はちゃんと(水)ってなってる!ということで,
GET=.*(?(?=.*<title).*<title.*>(.*)</title>.*<content.*: (.*)\n)
 と変更した.これで,時間まで取得,表示できるようになりました.
ここで,もう少し.iniを眺めてみる.
[mTime1]とかいうところに,
Substitute="2011 ":"",...
みたいなのがあります.なんかJsonみたいな記述ね.
文字列置き換え候補の配列変数ってことですかね.知らないけど.
これを,xmlで表記されているフォーマットに合わせて,
Substitute="2011/":"",・・・,"~":"-","01/":"",・・・,"12/":"","&lt;br /&gt;":""
と変更してやる.mTime2~4も同様にしてやる.この辺の整形は,個人の好き好きでやればいいと思う.
あとは,87行目あたりのSTYLESセッションや108行目あたりのMETERSセッションをいじって,自分の好きなレイアウトにすればいい.

続いて,Gmail-4.iniをみてみる.
こっちでもやることは受信するXMLの解析や,GETの値の変更,レイアウト変更で,基本はGcal-4.iniでやったのと同じ.
19行目あたりにGETがあるんで,
 GET=(?(?=.*<entry>).*<title.*>(.*)</title>.*<link.*href="(.*)")
 ↓
GET=(?(?=.*<entry>).*<title.*>(.*)</title>.*<link.*href="(.*)".*<modified>(.*)</modified>.*<name>(.*)</name>)
こんな風に変更.受信日時と送信者名も取得するようにしておく.
続いて,[mItem1]をみてみると,
StringIndex=2 
というのがある.これは,取得したデータのうち,何番目の(.*)かということ.
# 正規表現的なアレだなぁ.
29行目あたりをみると,fullcountタブを取得して,そのあとでGETを4回繰り返している.つまり,StringIndexの1番目:受信したメール数を示す.2番目:1通目のメールタイトル.3番目:メールのURL,4番目:受信日時(GMT),5番目:送信者名,6番目:2通目のメールタイトル・・・となる.

これを参考に,[mItem1],[mLink1]の次に[mName1]とか増やして,
[mName1]
Measure=Plugin
Plugin=WebParser.dll
Url=[mGmail]
StringIndex=5
とか適当に書いてやればいい. あとはGcal-4.iniのSTYLESやMETERSのところでやったのと同様にレイアウトしていけばいい.
Gcal,Gmailの横幅は,RainmeterからGnometerのSettings.iniを起動して,> Skin Settings > Change skin widthsでそれぞれ250に設定してある.これで満足した.
ココにそれぞれのiniの記述を載せておくので,あとは適当にやってください.