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の記述を載せておくので,あとは適当にやってください.