はじめに
Windows Liveサービスと統合したアプリ開発を可能にするLive Connect を利用して、今回はHotmailカレンダーにアクセスしてみましょう。サンプルとして簡単なツールを作成します。また、プレリリース版のLive Connectには、よりHotmailカレンダーと連携できる内容が含まれていますので、こちらも併せて紹介します。
Live Connectについては、第42回 から紹介しています[1] 。必要に応じて参照をお願いします。
Live HotmailカレンダーとLive Connect
Hotmailカレンダー(図1 )は、Windows LiveサービスのWebアプリです。特徴のひとつは、カレンダーの共有機能です。個人や友だち、公開されているカレンダーを共有・購読でき、まとめて表示できます。カレンダーには異なるアクセス権限を設定でき、家族間で読み書きできるカレンダーなども作成可能です。
図1 Hotmailカレンダー
カレンダーは、Webサイト以外に、Windows LiveメールやOutlook、スマートフォンなどからもアクセスでき、予定やタスクを同期できます。追加した予定やタスクを、メールやLive Messengerで通知も行えます。
Live Connectを利用すると、ユーザーに代わりHotmailカレンダーへアクセスし、Windows Liveサービスと連携したアプリが作れます。たとえば、イベント情報などをユーザーのカレンダーに追加できます。
現在のLive Connectでは、ユーザーの予定を追加することしか許可されていませんが、今後のアップデートではカレンダーのアクセスなども予定されています。これにより、SNSでユーザーのカレンダーと統合したり、情報の取り込みといったことも可能になります。
予定の追加
それでは、さっそくHotmailカレンダーとの連携をみていきましょう。これまでの連載と同じくJavaScript API とREST API を利用します。
REST APIを利用して予定(イベント)をカレンダーに追加します。JSON形式でEvent オブジェクトを表し、HTTP POSTメソッドで https://apis.live.net/v5.0/me/events にアクセスします。JSON形式の値は次のような値です。
{
"name" : "SQLWorld★大阪#7" ,
"description" : "初心者から中級者対象にSQLServerについて勉強" ,
"start_time" : "2011-10-15T13:00:00+0900" ,
"end_time" : "2011-10-15T17:00:00+0900" ,
"location" : "大阪市立市民交流センターよどがわ" ,
"is_all_day_event" : false ,
"availability" : "busy" ,
"visibility" : "public"
}
予定を追加するためにユーザーに要求する許可(Scope )の値は、wl.events_create です。
Eventオブジェクトの内容は次の通りです。
プロパティ
型
説明
name
string
予定の件名(255文字まで)
作成時必須
description
string
説明(32768文字まで)
作成時必須
start_time
string
開始日時(ISO 8601形式)
例: 2011-10-15T13:00:00+0900
作成時必須
end_time
string
終了日時(ISO 8601形式)
location
string
場所(1000文字まで)
is_all_day_event
true/false
終日の予定かどうか
true または false
availability
string
予定の公開方法
以下の4種類
free :空き時間
busy :予定あり
tentative :仮の予定
out_of_office :外出中
visibility
string
公開範囲
public :公開(規定値)
private :非公開
updated_time
string
予定の作成日時(ISO 8601形式)
読み取り専用で追加が成功したときにこの値が返ってきます。
作成時に指定する必要がある値は、name、description、start_timeです。それ以外の項目はオプションです。
サーバーからのレスポンスは、予定の追加に成功した場合JSON形式でEventオブジェクトが返ってきます。このとき予定が作成された日時(updated_time)が含まれています。
{
"name" : "SQLWorld★大阪#7" ,
"description" : "初心者から中級者対象にSQLServerについて勉強" ,
"start_time" : "2011-10-15T13:00:00+0900" ,
"end_time" : "2011-10-15T17:00:00+0900" ,
"location" : "大阪市立市民交流センターよどがわ" ,
"is_all_day_event" : false ,
"availability" : "busy" ,
"visibility" : "public" ,
"updated_time" : "2011-10-10T16:00:00+0000"
}
JavaScript APIで予定の追加
ここまでの内容をJavaScript APIを利用してコードで描いてみましょう。JavaScript APIについては第43回 で詳しく説明しています。まず、フォームをHTMLで記述します。
日付と時刻の入力、ISO 8601形式の日付の変換に下記のライブラリーを使用しています。それぞれダウンロードして、参照して使用してください。
HTMLファイルの内容は次の通りです。
<!DOCTYPE html>
<html lang = "ja" >
<head>
<meta charset = "utf-8" />
<title> 予定の追加 </title>
<link type = "text/css" href = "./css/ui-lightness/jquery-ui-1.8.16.custom.css" rel = "stylesheet" />
<link type = "text/css" href = "./css/jquery.ui.timepicker.css" rel = "stylesheet" />
<link type = "text/css" href = "./css/main.css" rel = "stylesheet" />
<script src = "https://js.live.net/v5.0/ja/wl.js" ></script>
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js" ></script>
<script src = "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js" ></script>
<script src = "./jquery.ui.timepicker.js" ></script>
<script src = "./iso8601.js" ></script>
<script src = "./main.js" ></script>
</head>
<body>
<div> 予定の追加 </div>
<table>
<tr>
<td class = "cap txt" > 件名: </td>
<td><input type = "text" id = "name" class = "box txt" /></td>
</tr>
<tr>
<td class = "cap txt" > 場所: </td>
<td><input type = "text" id = "loc" class = "box txt" /></td>
</tr>
<tr>
<td></td>
<td><input type = "checkbox" id = "all_day" /><label for = "all_day" class = "txt" > 終日 </label></td>
</tr>
<tr>
<td class = "cap txt" > 開始: </td>
<td>
<input type = "text" id = "from_date" class = "date txt" />
<input type = "text" id = "from_time" class = "time txt" />
</td>
</tr>
<tr>
<td class = "cap txt" > 終了: </td>
<td>
<input type = "text" id = "to_date" class = "date txt" />
<input type = "text" id = "to_time" class = "time txt" />
</td>
</tr>
<tr>
<td class = "cap txt" > 説明: </td>
<td>
<div>
<textarea id = "desc" rows = "4" class = "box txt" ></textarea>
</div>
</td>
</tr>
<tr>
<td class = "cap txt" > 公開方法: </td>
<td>
<select id = "availability" class = "box txt" >
<option value = "busy" > 予定あり </option>
<option value = "tentative" > 仮の予定 </option>
<option value = "free" > 空き時間 </option>
<option value = "out_of_office" > 外出中 </option>
</select>
</td>
</tr>
<tr>
<td colspan = "2" ><input type = "checkbox" id = "visibility" /><label for = "visibility" class = "txt" > 非公開 </label></td>
</tr>
<tr>
<td colspan = "2" >
<div id = "signInButton" ></div>
<div>
<input type = "button" id = "addButton" value = "追加" />
</div>
</td>
</tr>
</table>
<div id = "msg" ></div>
</body>
</html>
main.jsにUIの操作部分と、JavaScript APIを利用したコードを記述します。
main.js
$ ( function () {
$ ( '.date' ). datepicker ({
dateFormat : "yy/mm/dd"
});
$ ( '.time' ). timepicker ();
$ ( "#all_day" ). click ( function () {
if ( this . checked ) {
$ ( ".time" ). attr ( "disabled" , "disabled" );
} else {
$ ( ".time" ). removeAttr ( "disabled" );
}
});
WL . Event . subscribe ( "auth.login" , function () {
$ ( "#addButton" ). show ();
});
WL . Event . subscribe ( "auth.logout" , function () {
$ ( "#addButton" ). hide ();
});
WL . init ({
client_id : "ClientID"
});
WL . ui ({
name : "signin" ,
element : "signInButton" ,
scope : [ "wl.signin" , "wl.events_create" ],
brand : "hotmail" ,
theme : "white"
});
$ ( "#addButton" ). click ( function () {
var from_date = $ ( "#from_date" );
var from_time = $ ( "#from_time" );
var to_date = $ ( "#to_date" )
var to_time = $ ( "#to_time" );
var start_time = from_date . datepicker ( "getDate" );
var end_time = to_date . datepicker ( "getDate" );
if (! start_time ) {
start_time = new Date ();
}
if ( start_time && from_time . val ()) {
start_time . setHours ( from_time . timepicker ( "getHour" ), from_time . timepicker ( "getMinute" ), 0 );
}
if (! end_time && to_time . val ()) {
end_time = new Date ();
}
if ( end_time && to_time . val ()) {
end_time . setHours ( to_time . timepicker ( "getHour" ), to_time . timepicker ( "getMinute" ), 0 );
}
var body = {
name : $ ( "#name" ). val (),
description : $ ( "#desc" ). val (),
is_all_day_event : true ,
start_time : isodate . format ( start_time ),
location : $ ( "#loc" ). val (),
is_all_day_event : ( $ ( "#all_day" ). attr ( 'checked' )) ? true : false ,
availability : $ ( "#availability" ). val (),
visibility : ( $ ( "#visibility" ). attr ( 'checked' )) ? "private" : "public"
};
if ( end_time ) {
body . end_time = isodate . format ( end_time );
}
$ ( "#msg" ). html ( "処理中です..." );
WL . api ({
path : "me/events" ,
method : "POST" ,
body : body
}, function ( r ) {
if ( r . error ) {
$ ( "#msg" ). html ( "エラー: " + r . error . message );
} else {
$ ( "#msg" ). html ( "予定を追加しました" );
}
});
});
});
以上で完了です。特に難しいことはしていません。JavaScript APIを利用すると簡単にWindows Liveサービスにアクセスできることがわかります。ここまでを実行してみましょう(図2 ) 。
図2 実行画面
サインイン時に表示される認可画面は図3 のようになります。
図3 認可画面
追加ボタンをクリックすると、問題がなければ予定が追加されているはずです。Hotmailカレンダーで確認してみましょう。
Internet Explorer アクセラレータの作成
さて、ここまでで作成したものは、ユーザーが予定を入力してカレンダーに追加しているだけですので、ユーザー視点からみるとHotmailカレンダーを利用するのと変わりありません。そこで、Live Connectの内容とは少し離れますが、Internet Explorerのアクセラレータから使えるように改良してみます。
ユーザーがIT勉強会などのイベントページを表示しているとき、日時などのテキスト部分を選択し、アクセラレータから予定を追加するというような使い方を想定しています。ユーザーが能動的に予定を追加するのには変わりありませんが、ユーザーに代わって、Webサイトのタイトルや選択されたテキストから予定の項目を記入します。
ASP.NET Webページ
先ほどのHTMLファイルを編集して、HTMLファイルからASP.NET Webページに変更します。ASP.NET Webページのコードの記述は、Visual Studioや無償のWebMatrix で行えます。今回は、ASP.NET Webページを利用していますが、URLのクエリーからパラメーターを受け取り日付などの情報を抽出できればよいだけですので、JavaScriptやPHPなど言語や方法はASP.NET Webページだけに限りません。
ここではASP.NET Webページの詳細についてはふれませんので、必要に応じて、Razor 構文と ASP.NET Web ページ などのドキュメントを参照してください。
HTMLファイルから.vbhtmlファイルに変更します。次のようなコードを記述します。次のようなコードをファイルの先頭(<DOCTYPE html>の前)に記述します。
@ Code
Dim title = If ( Request ( "title" ), "" )
Dim text = If ( Request ( "text" ), "" )
Dim w1 = "(\(([月火水木金土日](曜日|曜)?|(sun|mon|tue|wed|thu|fri|sat)\.?)\))?[\p{Po}\p{Z}]*"
Dim d1 = "((?<year{0}>20([0-9]{2}))\s*[年/])?\s*(?<month{0}>[0-1]?[0-9])\s*[月/]\s*(?<day{0}>[0-9]{1,2})\s*日?[\p{Po}\p{Z}]*" & w1
Dim t1 = "(AM|PM|午前|午後)?\s*(?<hour{0}>[0-2]?[0-9])\s*:\s*(?<min{0}>[0-5]?[0-9])"
Dim dash = "\s*(\-|to|~|\s)\s*"
Dim patterns = New List ( Of String )
patterns . Add (( d1 & t1 ). Replace ( "{0}" , "0" ) & dash & ( d1 & t1 ). Replace ( "{0}" , "1" ))
patterns . Add (( d1 & t1 ). Replace ( "{0}" , "0" ) & dash & t1 . Replace ( "{0}" , "1" ))
patterns . Add (( d1 & t1 ). Replace ( "{0}" , "0" ))
patterns . Add ( d1 . Replace ( "{0}" , "0" ))
Dim fromDate = ""
Dim fromTime = ""
Dim toDate = ""
Dim toTime = ""
Dim input = text . Replace ( "(" , "(" ). Replace ( ")" , ")" )
For Each p In patterns
Dim m = Regex . Match ( input , p , RegexOptions . IgnoreCase Or RegexOptions . Singleline )
Dim md As String
If m . Success Then
md = m . Groups ( "month0" ). Value . PadLeft ( 2 , "0"c ) & "/" & m . Groups ( "day0" ). Value . PadLeft ( 2 , "0"c )
If m . Groups ( "year0" ). Success Then
fromDate = m . Groups ( "year0" ). Value & "/" & md
Else
fromDate = Now . ToString ( "yyyy" ) & "/" & md
End If
If m . Groups ( "hour0" ). Success Then
fromTime = m . Groups ( "hour0" ). Value . PadLeft ( 2 , "0"c ) & ":" & m . Groups ( "min0" ). Value . PadLeft ( 2 , "0"c )
End If
If m . Groups ( "month1" ). Success Then
md = m . Groups ( "month1" ). Value . PadLeft ( 2 , "0"c ) & "/" & m . Groups ( "day1" ). Value . PadLeft ( 2 , "0"c )
If m . Groups ( "year1" ). Success Then
toDate = m . Groups ( "year1" ). Value & "/" & md
Else
toDate = Now . ToString ( "yyyy" ) & "/" & md
End If
ElseIf m . Groups ( "hour1" ). Success Then
toDate = fromDate
End If
If m . Groups ( "hour1" ). Success Then
toTime = m . Groups ( "hour1" ). Value . PadLeft ( 2 , "0"c ) & ":" & m . Groups ( "min1" ). Value . PadLeft ( 2 , "0"c )
End If
Exit For
End If
Next
End Code
コードのほとんどの内容が、URLのクエリーで受け取ったテキストから日付の部分を探し、DatepickerとTimepickerで使用する形式を生成しているだけです。厳密にチェックしていませんので不正な値になる可能性もありますが、とりあえずはこれでよしとします。
続いてHTMLコード部分を編集します。作成した値をvalue属性に指定します。下記のコードを参考に、該当部分を編集してください。
<tr>
<td class = "cap txt" > 件名: </td>
<td><input type = "text" id = "name" class = "box txt" value = "@title" /></td>
</tr>
<tr>
<td class = "cap txt" > 開始: </td>
<td>
<input type = "text" id = "from_date" class = "date txt" value = "@fromDate" />
<input type = "text" id = "from_time" class = "time txt" value = "@fromTime" />
</td>
</tr>
<tr>
<td class = "cap txt" > 終了: </td>
<td>
<input type = "text" id = "to_date" class = "date txt" value = "@toDate" />
<input type = "text" id = "to_time" class = "time txt" value = "@toTime" />
</td>
</tr>
Internet Explorerアクセラレータ
作成したASP.NET Webページへアクセラレータからアクセスできるようにします。アクセラレータの開発についても、詳細は紹介できませんが簡単ですのですぐに理解できるかと思います。技術的な内容は、IEデベロッパーセンター も参照するとよいでしょう。
OpenService アクセラレータフォーマットと呼ばれるXML形式で、アクセラレータの情報を記述します。次のようなXMLファイルを用意します。
<? xml version = "1.0" encoding = "UTF-8" ?>
<openServiceDescription xmlns = "http://www.microsoft.com/schemas/openservicedescription/1.0" >
<homepageUrl> http://example.jp </homepageUrl>
<display>
<name> Hotmail カレンダーへ予定を追加 </name>
<icon> http://example.jp/favicon.ico </icon>
</display>
<activity category = "Add" >
<activityAction context = "selection" >
<execute action = "http://example.jp/event.vbhtml" >
<parameter name = "title" value = "{documentTitle}" type = "text" />
<parameter name = "text" value = "{selection}" type = "text" />
</execute>
</activityAction>
</activity>
</openServiceDescription>
内容は、「 追加」カテゴリのアクセラレータで、クリックしたときにWebサイトのタイトルと選択しているテキストの内容を送信するよう記述しています。<execute>要素のaction属性値は、ASP.NET WebページへのURLを指定します。
さらに別途、Webページを用意して、次のコードを使ってアクセラレータのインストールを行います。
<!DOCTYPE html>
<html lang = "ja" >
<head>
<meta charset = "utf-8" />
<title> アクセラレータの追加 </title>
<script>
function addService () {
window . external . AddService ( "./event.xml" );
}
</script>
</head>
<body>
<input type = "button" value = "アクセラレータの追加" onclick = " addService (); " />
</body>
</html>
ASP.NET WebページとOpenServiceアクセラレータフォーマットのファイルは、同じドメインのURLに配置するようにします。上記コードよりインストールを行うと確認ダイアログ(図4 )が表示されます。
図4 アクセラレータの追加
インストール後、適当なWebページのテキストを選択しアクセラレータを使ってみましょう。簡単に予定の追加ができるようになりました(図5 ) 。
図5 アクセラレータで予定の追加
実用するにはまだまだ機能的に不足しているところもありますが、開発の参考にして頂けると幸いです。
プレリリース版のLive Connectの利用
ここからは、2011年11月にリリースが予定されている、プレリリース版のLive Connectについて少し紹介します。現在は、Technical PreviewとしてMicrosoft Connect からLive SDKをダウンロードできます。以下の内容はまだ正式リリース前の内容であり、変更される可能性がありますので注意してください。
Hotmailカレンダーに関連した内容では、現在の予定の追加のみの操作から、ほぼすべての操作が可能になります。
カレンダーの作成・参照・更新・削除
公開されているカレンダーの購読
予定の作成・参照・更新・削除
友だちの予定の参照
プレリリースの内容を試すには、現在のAPIで参照しているURLを、次のURLに置き換えます。
REST API:https://beta.apis.live.net/v5.0
JavaScript APIライブラリー:https://beta-js.live.net/v5.0/wl.js
ただし執筆時点では、JavaScript APIですべてのプレリリースの内容を利用できませんでした。動作確認にはREST APIを直接利用することも必要です。また、REST APIについても正しく動作しない可能性がありますので注意してください。
カレンダーの操作
それでは、新しい内容についてみていきましょう。現在のバージョンではユーザーのカレンダーに予定が追加されるのみですが、カレンダーのアクセスが可能になっています。それにともなって新しくCalendar オブジェクトを扱います。Calendarオブジェクトの内容は次の通りです。情報の読み書きができるようになるため、R/Wで読み取り(R)と書き込み(W)可能かも示しています。
プロパティ
型
R/W
説明
id
string
R
カレンダーのID
name
string
RW
名前
description
string/null
RW
説明
created_time
string
R
作成日時
updated_time
string
R
更新日時
from
object
R
カレンダーの所有者を示すオブジェクト
name(fromオブジェクト)
string
R
所有者名
id(fromオブジェクト)
string
R
所有者のID
is_default
true/false
R
デフォルトのカレンダーかどうか
true または false
subscription_location
string
RW
カレンダーのURL
公開されているカレンダーを購読している場合に使用
permissions
string
R
アクセス権限(共有時の設定)
以下のいずれか
free_busy :空き時間情報の表示
limited_details :詳細の表示
read :空き時間情報・タイトル・場所の表示
read_write :表示・編集・削除
co_owner :共同所有者
owner :所有者
カレンダーのアクセスに必要なScopeも追加されています。参照だけであればwl.calendars 、更新などの操作を行う場合はwl.calendars_update のScopeを指定します。認可画面の表示は図6 のようになります。プレリリース版は日本語に対応していません。
図6 カレンダー操作の認可画面
この後のカレンダー操作などを試す場合も、アクセストークンが必要です。下記の認可画面のURLへアクセスするなどして、プレリリース版のScopeに対して、アプリへの認可処理を行ってください。
https://oauth.live.com/authorize?client_id=CLIENT_ID &scope=wl.calendars+wl.calendars_update &response_type=token&redirect_uri=REDIRECT_URL &local=ja
ここからは、簡単にREST APIでのカレンダー操作について紹介します。今回は省略しますが、JavaScript APIからアクセスも可能です(プレリリース版では動作しない可能性あり) 。さらに、.NET Framework向けのライブラリーが提供され、C#などの言語からも簡単にアクセスできる予定です。
カレンダーの参照
サインインしているユーザーのカレンダー一覧を参照するには、REST APIでme/calendarsにHTTP GETメソッドでアクセスします。
https://beta.apis.live.net/v5.0/me/calendars?
access_token=ACCESS_TOKEN
Webブラウザーを使用して直接参照した結果を図7 に示します。
図7 カレンダー一覧の取得
ユーザーのIDを直接、USER_ID /calendarsのように指定してアクセスもできます。me/calendars?limit=2&offset=3 のようにパラメーターを指定し、取得件数と取得位置の指定も可能です。
また、カレンダーのIDを使用して、ひとつのカレンダーの情報の参照も可能です。
https://beta.apis.live.net/v5.0/calendar.xxxx ?
access_token=ACCESS_TOKEN
カレンダーの削除
カレンダーの削除は、HTTP DELETEメソッドでカレンダーにアクセスします。
カレンダーの作成
カレンダーの作成は、HTTP POSTメソッドで、me/calendars、またはユーザーのIDを指定したUSER_ID /calendarsに、新しいカレンダーの情報(Calendarオブジェクト)をアップロードします。
カレンダーの更新
カレンダーの情報を更新するには、HTTP PUTメソッドでカレンダーにアクセスします。
カレンダーの購読
公開されているカレンダーを購読するには、HTTP POSTメソッドで、me/calendars、またはUSER_ID /calendarsに以下のようなsubscription_locationを指定したCalendarオブジェクトをアップロードします。
{
name : "Anime/game character birthdays" ,
subscription_location : "webcal://ical.mac.com/fredduck/Anime47Game32Birthdays.ics"
}
予定の操作
プレリリース版では、Eventオブジェクトの項目が追加されています。現在の内容に加え、次の項目が増えています。
プロパティ
型
R/W
説明
id
string
R
予定のID
created_time
string
R
作成日時
calendar_id
string
RW
予定が含まれているカレンダーのID
from
object
R
予定の作成者を示すオブジェクト
id(fromオブジェクト)
string
R
作成者のID
is_recurrent
true/false
R
繰り返しありの予定かどうか
true またはfalse
recurrence
string
R
繰り返しパターンの説明
reminder_time
number
RW
アラートする時間(予定の何分前かを指定)
予定の作成だけでは予定のIDは必要ありませんでしたが、参照や更新が可能になるため、ID情報が増えています。その他、繰り返しの予定の参照や、アラート設定などの情報が追加されています。
予定のアクセスに必要なScopeは、wl.events_create とwl.calendars です。友だちのカレンダーや予定の参照は、wl.contacts_calendars を指定します。
予定の参照
サインインしているユーザーの予定一覧を参照するには、REST APIでme/eventsにHTTP GETメソッドでアクセスします。
https://beta.apis.live.net/v5.0/me/events?
access_token=ACCESS_TOKEN
Webブラウザーを指定して直接参照した結果を図8 に示します。
図8 予定一覧の取得
以下の指定で、取得する予定を選択できます。
予定IDを指定して、特定の予定の取得
ユーザーIDを指定して、特定のユーザーの予定一覧を取得(USER_ID /events)
カレンダーIDを指定して、特定のカレンダーの予定一覧を取得(CALENDAR_ID /events)
さらに、events?start_time=2011-08-01T00:00:00Z&end_time=2011-08-03T00:00:00Z のようにパラメーターを指定し、特定の範囲の予定の取得も可能です。
予定の削除
予定の削除は、HTTP DELETEメソッドで予定にアクセスします。
予定の作成
予定の作成(追加)は、既に説明した通りです。ただし、指定できる項目が増えています。特定のカレンダーに予定を作成するには、カレンダーのpermissionsの値がowner、co-owner、read-writeのいずれかの場合にのみ可能です。繰り返しありの予定はLive Connectから作成できません。
予定の更新
予定の内容を更新するには、HTTP PUTメソッドで予定にアクセスします。内容の更新も、カレンダーのpermissionsの値がowner、co-owner、read-writeのいずれかの場合にのみ可能です。
おわりに
以上のように、プレリリース版の内容をみると、Hotmailカレンダーの多くの機能をアプリから利用可能になる予定です。現在は予定の追加のみですが、今後はカレンダー操作も可能になりますので、各種Webサービスを利用してイベント情報を収取し、ユーザーの興味のあるカレンダーをプログラムから作成するといったこともできそうですね。今のうちにおもしろい使い方を考えておくと良いかもしれません。
また、Live Connectのプレリリースの内容は今回で紹介しただけではありません。その他の情報については、今後の連載で紹介していきたいと思います。