aij[beta]

日々の芥

Googleカレンダーをjavascriptで操作しながら、Google Data APIのお勉強。
今日は日付の処理。

Common Elements: "Kinds" - Google Data APIs - Google Codeを読むと、gd:whenという要素の属性として、startTimeがあって、xs:dateTimeというタイプとある。日付のフォーマットは、RFC3399にしたがった形式らしい。

サンプルに使用しているスクリプトにstartTimeから月日と、時間を取り出す関数が定義済みだった。

function formatGCalTime(gCalTime) {
// text for regex matches
var remtxt = gCalTime;

function consume(retxt) {
var match = remtxt.match(new RegExp('^' + retxt));
if (match) {
remtxt = remtxt.substring(match[0].length);
return match[0];
}
return '';
}

// minutes of correction between gCalTime and GMT
var totalCorrMins = 0;

var year = consume('\\d{4}');
consume('-?');
var month = consume('\\d{2}');
consume('-?');
var dateMonth = consume('\\d{2}');
var timeOrNot = consume('T');

// if a DATE-TIME was matched in the regex
if (timeOrNot == 'T') {
var hours = consume('\\d{2}');
consume(':?');
var mins = consume('\\d{2}');
consume('(:\\d{2})?(\\.\\d{3})?');
var zuluOrNot = consume('Z');

// if time from server is not already in GMT, calculate offset
if (zuluOrNot != 'Z') {
var corrPlusMinus = consume('[\\+\\-]');
if (corrPlusMinus != '') {
var corrHours = consume('\\d{2}');
consume(':?');
var corrMins = consume('\\d{2}');
totalCorrMins = (corrPlusMinus=='-' ? 1 : -1) *
(Number(corrHours) * 60 +
(corrMins=='' ? 0 : Number(corrMins)));
}
}

// get time since epoch and apply correction, if necessary
// relies upon Date object to convert the GMT time to the local
// timezone
var originalDateEpoch = Date.UTC(year, month - 1, dateMonth, hours, mins);
var gmtDateEpoch = originalDateEpoch + totalCorrMins * 1000 * 60;
var ld = new Date(gmtDateEpoch);

// date is originally in YYYY-MM-DD format
// time is originally in a 24-hour format
// this converts it to MM/DD hh:mm (AM|PM)
dateString = (ld.getMonth() + 1) + '/' + ld.getDate();
timeString = (ld.getHours()) + ':' + ((ld.getMinutes()<10)?('0' + ld.getMinutes()):(ld.getMinutes()));

} else {
// if only a DATE was matched
dateString = parseInt(month) + '/' + parseInt(dateMonth);
}
return dateString;
return timeString

}

この関数に、getTime()で秒換算した値を返すようにする。
中略

dateString = (ld.getMonth() + 1) + '/' + ld.getDate();
timeString = (ld.getHours()) + ':' + ((ld.getMinutes()<10)?('0' + ld.getMinutes()):(ld.getMinutes()));
entryDate = ld.getTime();
} else {
// if only a DATE was matched
dateString = parseInt(month) + '/' + parseInt(dateMonth);
}
return dateString;
return timeString
return entryDateSec
}


今回は今日と比較して、イベントの開始時間が過ぎているかどうかを判断する。

var today = new Date();
var dayPast = (entryDateSec - today.getTime() );

あとは
if (dayPast < 0) を条件式にして、開始時間を過ぎていたら文字をグレーにして、終了の文字を追加してみた。

2008 花火大会カレンダー
今日はそれほど時間がかからずにできた。

ようやく、正式版がリリースされた。
Mactopia Japan : Microsoft Remote Desktop Connection Client for Mac 2

新機能は、ユニバーサルバイナリ化、コンソールセッションへの接続、RDP6のサポートなどなど。OSXでWIndowsを使用するためのBootCamp、VM、とならんで第3の選択肢として十分使用できる。

ちょっと面白い機能は、OSXのホームフォルダや任意のフォルダを接続先のWindowsマシンにマウントできる。
home.png
SMBで共有しているわけではないので、権限を変更する必要がない。スピードは遅いけれどちょっとだけこのファイルが必要だというときは便利。

これで、OSXでほとんどすべてのシステム管理ができる。

品川で行われた「Adobe Acrobat 9 新製品セミナー」に行ってきた。

スライドの2枚目に"PDFといえばAcrobat"とあって、Adobeの焦りも感じる。
最近のAdobeの製品投入サイクルは18ヶ月になっていて、新ヴァージョンの投入タイミングがCreative Suiteと足並みが揃わない。企業としての収益を考えると、揃えられないというのが本音だろう。だからというわけではないが、Acrobatの新製品セミナーは常にビジネスユーザー向けだ。

製品ラインナップは、Windows版がExtend、Pro、Standardの3種類。Mac版はProのみ。MacユーザーでStandardを選ぶ人は少ないと思うので、これは妥当なところか。
Extendのみの機能はCAD系3Dモデルのサポートと、PowerPointベースのeラーニングコンテンツの作成、ビデオ系をflvに変換してPDFに挿入する機能。3Dモデルが必要な人は仕方がないが、flvとeラーニングコンテンツは、私には必要ない気がした。PDFであれだけ標準化にこだわっているAdobeがなぜflvなのかよくわからない。

セミナーではデモを交えながら、PDFポートフォリオ、フォーム作成の簡素化、共有レビュー、リアルタイムな画面表示共有、文書比較の高機能化が紹介された。ただしこれらは厳密にいうと、新機能ではなくて、いままであった機能のブラッシュアップだ。それぞれの機能のダイアログがわかりやすくなっているけれど、やけに横幅が広くなって、XGAでは辛い。

コラボレーション関連は、いままでメールベースだったものが、ファイルサーバー、SharePoint、Acrobat.comと共有インフラの選択肢が増えた。Acrobat.comに関しては"パブリック・ベータ"という表現をしていた。いままで、APIを使用して開発が必要だった部分を製品に落とし込んだようだ。パッケージを購入しているユーザーにとっては敷居が低くなって試してみようかと思わせる。SharePointをサポートしているところがちょっと面白い。WebDAVの実装系では一番シェアがあるということだろうか。インターネット経由のAcrobat.comでの共有を使ってみたい。

そういえば、PDFのヴァージョンは1.8にはならないのかな。


とりあえず、最初の目標だったテーブル表示とプルダウンによる地域選択ができた。

2008 花火大会カレンダー HTMLのシンプルな表はこちら

2008 花火大会カレンダー
 Googleアカウントをお持ちで、カレンダーを使っている場合はこちら

 iCalフォーマット、iCalに取り込む場合はこちら

 HTMLのカレンダー表示はこちら

 RSSリーダー等に取り込む場合はこちら



なんだか、Google Data APIに行く前に、IEのDOM実装との戦いのようになってきたけれど、今日はTable要素にtbodyが必須だよという話。
IEでのJavascriptのDOM操作に関する備忘録

Google Data APIs Samples - Google Data APIs - Google Codeにあるサンプルで、IEで表示できないなあとおもったら、たいていDOMの話だ。

というわけで、やっとIEでも表示できるサンプルが完成。
2008 花火大会カレンダー -東京-

これでようやくスクリプトをいじれる。




げげっ。前のエントリーでjavascriptでDOMをいじっていたら、IEで表示されていないことに気がつきませんでした。普段はsafariかFireFoxでしか、このblogを見ないので、てっきり表示されていると思い込んでいた。

いろいろと調べると、バグというか仕様らしい。
IE の getAttribute / setAttribute: Days on the Moonに詳しい。
うーんIEとそうじゃない人で分けなければいけないのかな。

もう一つ。GData APIにqueryを投げるときにIEの場合はURLエンコードしなければいけないようだ。これは仕様だね。
たとえばこれは

http://www.google.com/calendar/feeds/foo@group.calendar.google.com/public/full?alt=json-in-script&q=東京都&callback=insertAgenda&orderby=starttime&max-results=300&singleevents=true&sortorder=ascending

このようにする。

http://www.google.com/calendar/feeds/foo@group.calendar.google.com/public/full?alt=json-in-script&q=%E6%9D%B1%E4%BA%AC%E9%83%BD&callback=insertAgenda&orderby=starttime&max-results=300&singleevents=true&sortorder=ascending


FireFoxやSafariでは勝手にエンコードしてくれるのだけど、IEは変なところに律義だ。


Google Data APIの続き。

といっても、今日はDOMを思いだしてリンクを付け加えたり、Googleマップへクエリーを足したり。どちらかというとjavascriptのお勉強。

2008 花火大会カレンダー -東京-


追記
とりあえずテーブル表示に対応。
2008 花火大会カレンダー -東京-


追記
Iframe表示を削除した。リンク先は、IEでは表示されない。