2012年6月15日金曜日

Rainmeter, MyStorage skin v3.2, Update, Agenda

RainmeterのMyStrageスキンをアップデートした.
v3.2.開発歴はそれほどないスキンのくせに,バージョンがv3だったりするけど,その辺にあまり深い意味はない(ラボメンNo.003談ということでひとつ).

今回のアップデートでは,細かいバグつぶしのほか,
  • Googleカレンダーの予定を表示するAgendaに,新着Gmail表示機能を付けた.
要するに,Agenda + Gmailでニコイチにした.
設定方法は,前回のエントリを参考にしてほしい.
メールが新着すると,予定表が新着メールリストに切り替わる仕様になっている.

2012年4月22日日曜日

Rainmeter, MyStorage skin v3.1, Update, Multi agenda

なんか最近,このブログのアクセス数が跳ね上がっている.どこかで晒されたのかな.
まあいいや.前回のエントリーでスキンを公開したわけだけど,その中のAgendaをアップデートした.
具体的には,複数のGoogleカレンダーの予定を表示できるようにした.スキンはこちら
こんな感じ.マリみての新刊が発売されるんですね.買わないと.それはともかく,設定方法などの説明をする.
構造としては,Calendarと同じように,Luaスクリプトでゴリゴリ整形,配列に突っ込んでいる.スクリプトのベースは,前のバージョンのAgendaである.無茶しやがって・・・という声が聞こえてきそうなくらい,スパゲッティなスクリプトになっている.F.S.M.まんせー.

さて,まずVariable.incのAgendaセッション
Agenda_Url1=https://www.google.com/calendar/feeds/japanese__ja%40holiday.calendar.google.com/public/basic
Agenda_Url2=
Agenda_Url3=
MaxResults=12
Color1=200,0,0,160
Color2=128,192,255,160
Color3=192,255,128,160
Url1~3が表示するGoogleカレンダーのURL.デフォルトでUrl1には「日本の祝日」カレンダーを入れてある.このURLは,Googleカレンダーから知ることができる.必要ないと思うが,一応書いておこう.
個人情報に抵触するところは黒塗りにしてある.まず,Googleカレンダーにアクセスし,URLを知りたいカレンダーの設定を開く.
設定のうち,「限定公開」のxmlをクリック.ポップアップが出るので,
赤枠で囲まれた部分をコピーする.このURLをVariable.incのAgenda_Url1~3のどこかにペーストすればいい.

Variable.incのMaxResultsは,カレンダー毎に最大何件のイベントを取得するかの設定.取得したものが全て表示されるわけではないので注意が必要である.
これは,Agenda.iniに設定されている[AgendaX] Meterの数との関係で,適当に設定すればいいと思う.
(Agenda.iniには,デフォルトで[Agenda1]から[Agenda18]まである.好みに応じて増減させたらいい.)

Color1~3は,カレンダーの色.
(ここまで書いて気が付いたけど,これはAgenda.Colorとかにしておかないと,今後他の設定とかぶるなぁ.Agenda_Urlも他の変数と命名規則が違う.この辺は次回のアップデートで修正する.)

Agenda_Url,Colorともに,表示したいカレンダーの数に応じて,適宜増減させること.

続いてAgenda\Script.luaを少しいじる必要がある.Script.luaを開くと,1行目から,
Properties={
DayLabels='日|月|火|水|木|金|土';
HeaderFormat='year年month月day日(wd)';
CalNum=3;
CalRow=18;
}
となっている. DayLabels,HeaderFormatは,いずれもヘッダー部分に表示される今日の日付のフォーマットに関係する.DayLabelsをSun|Mon・・・とすれば,ヘッダーの曜日表示が英語になるということ.
次のCalNumとCalRowは環境に合わせて変える必要がある.CalNumは表示したいカレンダーの数(=Agenda_Urlの数),CalRowはAgendaスキンの行数(=Agenda.iniの[AgendaX]の数)となっている.先述のとおり,これは各人の設定や改造によって増減するものなので,各人の環境に合わせて,こちらも変える.
(そのうち,Variables.incから読み取るようにすると思う.)

2012年4月14日土曜日

Rainmeter, Calendar, Schedule ( Agenda) with Google Calendar by Lua Script, Gmail, "MyStorage" Skin Version Up

20120422 以下は古い記事.V3.1にアップデートした.

これまで,Rainmeterでいくつかのガジェットを日本人がちょこっと幸せに使える改造を紹介してきた.今回は,もう少し幸せになるために,Luaスクリプトを組んでみた,という話.私謹製スキンのアップデート
こんなものが入っている↓

Agenda, Analog Clock, Calendar, CPU Usage, Gmail, GPU Usage, Memory Usage, Network Traffic, Thermometer, Top Process(CPU, Memory), Weather Forecast

今回のアップデートで追加したものの解説↓.

1.カレンダーの追加
以前,LuaCalendarを取り上げて,Googleカレンダーから日本の祝日を取得,表示するというのを書いた.でも,データの読み込みタイミングなんかが課題として残った.あと,私はカレンダーを2か月表示しているので,1か月表示だけのLuaCalendarだと少し物足りない.ということで,Luaスクリプトを使って,カレンダーを作ってみた.LuaCalendarを参考にしつつ,全く違うものになっている.このスクリプトでは,ほっといても祝日を再読み込みしてくれるので,LuaCalendarよりちょこっと便利.カレンダーは2か月表示.
Variables.incの
;---Calendar Values---
StartYear=
に,取得する祝日の開始年を入れる.とりあえず,Variables.incでは,2012年1月1日から取得するように設定してある.

2. 予定リスト
GnometerのGcalみたいなもの.Variables.incファイルの
;---Agenda---
GcalURL=
に,表示したいカレンダーの限定公開URLのxmlアドレス
https://www.google.com/calendar/feeds/【ユーザ名】%40gmail.com/【アドレス】/basic
赤字部分を入れる.

3.Gmail
これもGnometerのGmailみたいなもの.Variables.incファイルの
;---Gmail---
User=
Pass=
にGmailのユーザ名(@の前)とパスワードを入れる.メールにカーソルを合わせると,ツールチップでメール文のサマリーを表示する.

4.その他
  • アナログ時計を追加.文字盤を無理やり作ってみたり.
  • 言語ファイルの追加.Lang\ja_JP.incを参考に,他の言語も作成可能.ファイルのコードとか変えなくちゃいけないので,多少面倒だと思うけれども.
  • グラフ位置等を修正

2012年4月8日日曜日

Rainmeter, Google Weather API, Forecast

RainmeterでGoogle Weather API(非公式)を叩いて,天気予報を表示させるガジェットを作った.これは,MacでPHPとGeektoolからGoogle Weather APIを利用していたことを思い出したので,せっかくならRainmeterでもやってみようと思ったわけだ.
どうも,Rainmeterの天気予報スキンの多くは,海外のサイトを利用している.なので,表示が英語になったりして,日本人の私には直観的でない.Google Weather APIは日本語出力をしてくれるので,その辺が楽.
なんだかんだいうが,私がYahooよりGoogleが好きだ,というのが一番の理由だったりもする.どうせ個人が好き勝手に自分のデスクトップを使いやすいようにしているだけなので,どこのサービスを使ってもいいじゃないか.
せっかくなので先日公開したうちのスキンをアップデートして,天気予報を同梱した.
↓こんなことができる.アイコンは,大嫌いなYahoo.com Weatherから拝借した.それをこういった形で公開することには,いろいろ問題もあると思うが,このスキンはあくまで私が個人的に利用することが前提なので,まあ良しとしていただきたい(誰に?).


設定方法を書いておく. Weather.iniの[Variables]で,
[Variables]
@include=#ROOTCONFIGPATH#Variables.inc

City="Shibuya"
City_Sub="Shibuya, Tokyo":"東京都渋谷区"
赤字の部分を適宜変えるだけ.その場所がAPIで取得できるかどうかは,
http://www.google.com/ig/api?weather=Shibuya&hl=ja
この部分を変えて,ブラウザでアクセスしてみればわかる.
これだけで,現在から3日後までの天気を取得できる.現在の天気には,ポップアップで湿度と風向,今日の天気予報が表示される.

2012年4月6日金曜日

Rainmeter, CPU Usage, GPU Usage, Memory, Network, Top Process, Thermometer

今日は久しぶりにRainmeter.プラグインを使って,いろいろな情報を取得できるよって話.
作ったスキンはこんな感じ.↓
展開先(マイドキュメントのRainmeter\Skins\MyStrage)をみるとわかるが,プラグインを含む他人様のスキンを同梱してしまっている.が,このブログ自体が個人の備忘録なので気にしてはいけない.
で,このスキンを動かすための説明をちょっとだけ書いておく.
さすがに,Rainmeter単体でここまでの情報を取得することはできないので,他のユーティリティと連携させることになる.
GPU情報は,MSI Afterburnerの値を取得している.これに,このフォーラム記事中にあるMSIAfterburner.dll(32bit,64bitのいずれか)をダウンロードして,RainmeterのPluginsフォルダに突っ込む.

温度の部分は,SpeedFanの値を取得している.値を取得するプラグインは,Rainmeterに標準で含まれている.インストールすればわかるが,SpeedFanを起動すると,中央右部分に各部の温度が表示される.この表示される部分の順番は,個人の環境によって異なるようなので,確認すること.
上の図で中段左側に0RPMが並んでいるのは,本来ならば各部のファンの回転数が表示される.私のパソコンは自作で,CPUファンやケースファンをつけていないためだ.↓こんなものつけている.Core i5 2400sを使っているが,十分冷える.

話を戻す.どうやって確認するかというと,Configureをクリックして設定画面を開く.Temperaturesタブに表示されている順番にRainmeterが値を拾ってくるようだ.

↑私の環境では,0=GPU,1=System(チップセット),9=Core0となっている.Thermometer.ini中の値を適宜変更してほしい.たとえば,
[Measure.SpeedFan.Temp.GPU]
Measure=Plugin
Plugin=Plugins\SpeedFanPlugin.dll
SpeedFanType=TEMPERATURE
SpeedFanNumber=0
赤字の部分が該当箇所.「~Temp.GPU」のところと同様に,System,Core1・・・と変更すること.
SpeedFanでは1番目のコアはCore0と表示されている.0が1番だと普通の人はあまりなじみないだろうと思い,Rainmeterでは0番コアをCore1と表示,以降,3番コア(SpeedFan上のCore4)をCore4としてあるにしてある.この辺は,表示上の好みの話なので,個人の好きにすればいいと思う.
Intel i7環境では,Coreが8まで表示されると思う.その時は,適宜MeasureとMeterを増やすことになる.2コア環境では逆にコメントアウトするなどして減らすこと.
※追記
GPUとChip(System)の温度表示が整数値なっている.ファイルを更新するのも面倒なので,ここに修正方法を書いておく.小数点を表示するには,それぞれのMeterに,NumofDecimals=1を追記する必要がある. ↓の赤字部分を追加.
[Temperature.Text.GPU]
Meter=STRING
X=5
Y=14r
MeasureName=Measure.SpeedFan.Temp.GPU
StringStyle=NORMAL
StringAlign=LEFT
FontColor=#Font.Color.White#
FontSize=#Font.Height#
FontFace=#Font.Name#
AntiAlias=1

AntiAlias=1(ダブっていたので,削除して)
NumofDecimals=1
Text="GPU   %1 °C"

[Temperature.Text.System]
Meter=STRING
X=97
Y=0r
MeasureName=Measure.SpeedFan.Temp.System
StringStyle=NORMAL
StringAlign=LEFT
FontColor=#Font.Color.White#
FontSize=#Font.Height#
FontFace=#Font.Name#
AntiAlias=1
NumofDecimals=1
Text="Chip   %1 °C"
最後にCPU top5,メモリ top5はそれぞれのプロセス上5位を表示している.これも,Rainmeterの標準装備では作れいないので,ここらへんからプラグインを拾ってきて,上述のMSIのやつと同様に,プラグインをプラグインフォルダにつっこむ.ただ,このプラグイン,64bit環境では,まだバグがあるっぽい.私の環境では問題なく動いているので,まあ良しとする.

2012年3月25日日曜日

Mac, Geektool, Multi Ascii Graph

前回のエントリーで,Geektoolでアスキーグラフを使って無理矢理グラフを描く話をした.今日はその発展型の話.これは,以前のエントリー,Geektoolでtopとawkを使ったCPU,メモリ使用率表示スクリプトとも関係する.今日のスクリプトはこちら.そして,うまいこと設置できれば,こんな感じになる↓
これは,cpulog.shとmemlog.shでそれぞれCPUとメモリ使用率のログを出力し,それぞれのグラフを重ねて配置,その上にpsで各使用率上位5位のリストを表示しているという3層構造になっている.
ログ出力(1秒更新)
sh /PATH/cpuinfo.sh
sh /PATH/memlog.sh
グラフ(2秒更新)
php /PATH/graph.php /tmp/cpu.log nocolor
php /PATH/graph.php /tmp/mem.log
リスト(1秒更新)
ps -c -U hogehoge -o command,%cpu -r |head -n 6

ps -c -U hogehoge -o command,%mem,rss -m |head -n 6
赤文字の所は例のごとく各々の環境に合わせる.面倒くさいので,今日はスクリプトの解説をしない.適宜,該当するスクリプトを読んでほしい.そんなに難しい構造にはなっていない.

以前のエントリーでは,topを叩いてメモリ使用量を取得していた.それでもいいんだけど,桁が丸められているので,ちょっと扱いにくい.そこで今回のスクリプト(memlog.sh)では,vm_statコマンドでメモリの値を取得してやるように変更した.もっとも,vm_statは仮想メモリの値を取得するコマンドなので,物理メモリの値を示しているわけではない点には留意が必要である.それと,せっかくだから色もつけてみる.

#Macはメモリ管理がよくわからん.vm_statのfree値が極端に少ない.すこしググってみたところ,こんな記事を見つけた.どうも,いわゆるfree値に該当するのはPages freeとPages speculativeの合計値らしい.これ以上調べたり,考えるのも面倒なので,とりあえずそういうことにする.

ログファイルにはfree(free+speculative), inactive, active, wiredの使用率(百分率)を出力する.母数となる合計値の算出方法が正しいかどうかわからないが,とりあえずそれっぽく見えるので,そのままにしている.

グラフの仕様を変更した.出力されたログファイルのカラム(スペース区切り)毎に色の異なる折れ線グラフを描くようにした.カラムの最大数はとりあえず8つまで対応する.色の順番は,graph.phpの$color配列変数のキーを好きな順番にすればいい.コマンド実行時に第2引数としてnocolorをつけると,色指定なしのグラフが出力される.フォントの設定などは前回のエントリーを参考にしてほしい. 



2012年3月21日水曜日

Mac, Geektool, CPU Usage, Ascii Graph

今日はGeektoolでCPU使用率を「無理やり」グラフ表現する話.
Geektoolはグラフの表示ができない.CPU使用率をグラフ表現しようとした場合,一般的には2つの方法が考えられる.
1.Geektoolでの表示はあきらめて,ほかのユーティリティを使う.例えばXRGとか.
2.ほかのユーティリティで画像を保存して,Geektoolのimageで表示する.
  1については,ググればいくらでも出てくるので,面白くない.ということで,なんとかGeektoolで表示できないものかと考えた.2については,gnuplotというグラフ描画ユーティリティを使った方法を試した.ただし,この方法については,gnuplotのインストールとコマンドの習得,画像作成時のCPUとHDDへの負荷が若干気になるところだ.とはいえ,面白い結果が得られた(とりあえずうまいこと動いた)ので,後日改めて書き残そうと思う.
今日は,この1,2以外の方法を模索した結果を書く.つまり,
3.テキストでグラフを描く
である.いつものように,ここここにスクリプトを置いておく.基本的には,シェルスクリプトと,私の一番得意な言語PHPでできている.
無茶しやがって・・・というAAが飛んできそうだが,gnuplotよりは平易な設定でできると思う.CPU負荷はどうなのかわからない.それと,2の方法よりも画像を出力しない分,HDDへの書き込みは少ないが,この方法でもHDDへの書き込みが頻繁(geektoolで指定した秒数毎)に発生する.これは,その秒毎にCPU使用率をファイルへ保存するためだ.
もっとも,この点は,CPU使用率のログファイルの書き込み先をRAM Diskに移したtmpフォルダなどに指定してやれば,ほぼクリアだろう.各人の環境によるということだ.


cpulog.sh
#!/usr/bin/sh

if [ "`wc -l /tmp/cpu.log | awk '{print $1}'`" -gt 300 ]; then
cat /tmp/cpu.log | tail -300 > /tmp/cpu.log.swp
mv /tmp/cpu.log.swp /tmp/cpu.log
fi

top -R -F -u -l2 | head -4 | tail -1 | sed -E -e "s/CPU usage: (.*)% user.*/\1/" >> /tmp/cpu.log

#php ascii graph
php /PATH/graph.php /tmp/cpu.log
赤字のところは,例の如く,それぞれの環境に合わせて書き換える必要がある.
このシェルスクリプトでやっていることは,呼び出されるたびにtopコマンドでcpu使用率を取得して,最新の300件を保存,その後にphpスクリプトの呼び出しである.この300を好きな数字に変更すれば,ログはいくらでも取れる.

graph.php
#!/usr/bin/php
<?php
$str = "";

function Tics($i){
    $tics=array(0,20,40,60,80,100);
    if(in_array($i,$tics)){
        $str ="-";
    }else{
        $str =" ";
    }
    return $str;
}
Ticsは,グラフのメモリを指定している.arrayが表示する目盛りになる.
if($argv[1] && @file_exists($argv[1])){
    $f = file($argv[1]);
 引数で指定したファイルを開いて,配列変数$fに格納
    for($i=100;$i>0;$i--){
        $str.=Tics($i);
        for($j=0;$j<count($f);$j++){
            if($f[$j]>$i){
                $str.="#";
            }else{
                $str.=" ";
            }
        }
        $str.=Tics($i);
        $str.="\n";
    }
}else{
    $str ="target was not found\n";
}

echo $str;
?>
これで,グラフが描ける.
続いて,Geektoolの設定だが,shellのコマンドで,
sh /PATH/cpulog.sh
を指定する.PATHは例の如く,環境に従うべし.refreshを適当な秒数に設定するのを忘れないように.ちなみに,私の環境では1秒になっている.
それから,フォント指定をする.もちろん,フォント種は等幅フォントであればなんでもかまわない.重要なのはフォントサイズだ.Geektoolでは,最小9までしかフォントサイズリストに表示されないが,それよりも小さいサイズも指定できる.直接数字を入力すればいい.2以上がよろしいのではないかと.
こうして,できたのが,↓

いうまでもないが,利用する際は自己責任で.

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;
?>
こんな感じ.