2010-09-29

Tokyo GTUG Boot Camp 2010 OpenSocial Hands-on (G409) 資料

おはようございます。Nobuhiro Nakajima です。

Tokyo GTUG Boot Camp 2010 OpenSocial Hands-on (G409) の資料を公開します。

OSDE と OpenSocial jQuery で作る簡単ソーシャルアプリ (1/3)

http://slidesha.re/arIcA6 (スライド)

@yoichiro さんによる OSDE プラグインのインストールから OSDE ウィザードを使った OpenSocial アプリの作成と実行の紹介スライドです。

OSDE と OpenSocial jQuery で作る簡単ソーシャルアプリ (2/3)

http://bit.ly/bootcamp2010_os (スライド)

http://nakajiman.s3.amazonaws.com/bootcamp2010/favorite-books.zip (ソースコード)

@webos_goodies さんによる favorite-books アプリという実例による OpenSocial Java Script API の使い方の紹介スライドとソースコードです。

OSDE と OpenSocial jQuery で作る簡単ソーシャルアプリ (3/3)

http://slidesha.re/bER2EM (スライド)

http://nakajiman.s3.amazonaws.com/bootcamp2010/favorite-books-opensocial-jquery.zip (ソースコード)

@nakajiman による OpenSocial jQuery の紹介スライドと、上記 Favorite-books アプリを OpenSocial jQuery で書きかえたソースコードです。

2010-09-14

#MA6 Mashup Caravan - Social Platform Talks の場で必死に作品応募のお願いすることになりました

こんばんは。Nobuhiro Nakajima です。

Mashup Awards 6 の恒例イベントである Mashup Caravan でお話する機会をいただきました。

2010/9/22(水) #MA6 Mashup Caravan - Social Platform Talks
http://atnd.org/events/7860/

わたしの発表タイトルは 「Google Apps を Social にする OpenSocial Pages (;゜○゜) お願いですから応募してください」 です。

当社は Mashup Awards 6 の協力会社 (API 提供企業) として OpenSocial Pages というオープンソース製品 (テクニカルプレビュー版) を提供しています。が、しかし、超ニッチでマイナーなだけに OpenSocial Pages を使った応募作品が 0件となることを恐れています。あー考えるだけでコワイコワイ。悪夢をみそうです。

ですので、この発表の中で OpenSocial Pages を使って、どんな作品を応募して欲しいかそのお願いをさせてください。また、副賞の候補もお伝えできればと考えています。

また、同じような悩みを抱えている協力会社を(勝手に)代表して、Mashup Awards 5 の結果から協力会社と賞の関係を再確認しつつ、なんらかの賞を受賞するための裏道を探ってみたいと考えています。

続けて Mashup Camp というハッカソン形式のイベントにも参加します。わたしの専門分野である OpenSocial アプリケーションを開発してみたいという方は、ぜひご参加ください。わたしもチューターもしくは開発者として参加します。いっしょに何かを開発してもいいですね。

2010/9/25(土) #MA6 Mashup Camp - Social Platform Day
http://atnd.org/events/7862/

(わたしはともかく)スピーカーたちは、それぞれの分野の第一線で活躍する方々ばかりです。ぜひ Mashup Caravan と Mashup Camp に遊びにきてくださいね。

Mashup Awards 6 は、開発者がチャレンジするイベントともいえますが、裏側では協力会社もチャレンジしています。協力会社としては、作品応募があり、その応募に対して賞をあげたいと願っています。

 (;゜○゜) お願いですから応募してください。切実なお願いです。

2010-08-16

OpenSocial Pages の最新ソースコード 0.9.3 を公開しました

こんにちは。Nobuhiro Nakajima です。

OpenSocial Pages の最新ソースコードを公開しました。Downloads から opensocial-pages-0.9.3.zip をダウンロードしてください。

Google Apps Marketplace で公開している OpenSocial Pages for Google Apps と同じソースコードになっています。ですので、次のとおり手を加えて、自分自身の環境で期待どおり動作するように、改造する必要があります。

web.xml

Google Data APIs に 2-Legged OAuth でアクセスするための Consumer Key と Secret を指定してください。Consumer Key と Secret は Google Apps Perimer の Advanced tools か Google Apps Marketplace で手に入ります。

<context-param>
    <param-name>consumerKey</param-name>
    <param-value>(Your Consumer Key)</param-value>
</context-param>
<context-param>
    <param-name>consumerSecret</param-name>
    <param-value>(Your Consumer Secret)</param-value>
</context-param>

PermissionFilter.java

OpenID Federated Login (Google Apps) を UserService を使って実装してあります。Google Apps Perimer で Google Apps と連携するときは、AppEngine の認証を Google Acount に切り替えて、Google Apps ドメインと関連付け、UserService を使っている個所を調整すればよいでしょう。

Google Apps や Google Apps Marketplace 関連の実装の参考になれば幸いです。

2010-08-11

OpenSocial Pages は osapi.http に対応しました。gadgets.io.makeRequest 以上の大きなメリットがあります。

こんにちは。Nobuhiro Nakajima です。

OpenSocial Pages for Google Apps で osapi.http API を使えるようにしました。

osapi.http は gadgets.io.makeRequest メソッドに相当するものです。さらに osapi.http は、バッチリクエストにも対応するため、gadgets.io.makeRequest メソッド以上のメリットがあります。
  • 1回の API 呼び出しで、複数の外部サーバにまとめてリクエストできます
  • 1回の API 呼び出しで、SNS のデータと外部サーバのデータをまとめてリクエストできます
次の例は Viewer のプロフィール情報と YouTube からマイ動画のリストを、まとめて取得するものです。
function init() {
  var batch = new osapi.newBatch()
    .add('viewer', osapi.people.getViewer())
    .add('videos', osapi.http.get({
      href: 'http://gdata.youtube.com/feeds/api/users/nakajiman1/uploads?alt=json',
      format: 'json'
    }));
  batch.execute(function(r) {
    gadgets.log(r.viewer.displayName); // Nobuhiro Nakajima
    gadgets.log(r.videos.status); // 200
    gadgets.log(r.videos.content); //  Object { version="1.0",  more... }
  });
}
gadgets.setLogLevel(gadgets.log.INFO);
gadgets.util.registerOnLoadHandler(init);
従来は Viewer のプロフィール情報は opensocial.newFetchPersonRequest メソッドと gadgets.io.makeRequest メソッドを別々に呼び出して、非同期のコールバックのタイミングを制御して、レスポンスをまとめる必要がありました。

が、osapi.http を使えばそんな必要はなく、Gadgets(=Apps) のソースコードをシンプルにより分かりやすく記述することができます。

OpenSocial Pages がサポートする osapi.http のオプションやフィールドは、OpenSocial Pages ドキュメントの Core Gadgte SpecCore Data Spec に記載しておきました。

2010-08-02

OpenSocial Pages のガジェットは HTML5 で動作することを Pacman で確認してみた


こんばんは。Nobuhiro Nakajima です。

OpenSocial Pages のガジェット(=アプリ)は HTML5 で動作します。そのことを確認するために HTML5 Pacman を OpenSocial Pages で動かしてみました。もちろん、次の動画のとおり、Audio も含めてバッチリ動きます。


HTML5 Pacman を OpenSocial Pages のガジェットに移植するにあたり、次のことをしました。

  • index.html と packman.js をガジェットXMLにまとめる
  • Audio ファイル (ogg and mp3) を Amazon S3 に置く
  • modernizr-1.5.min.js を OpenSocial Pages の libs を参照する
  • Audio On/Off の設定を、次のとおり、User Preference 経由にする
var prefs = new gadgets.Prefs();

// return localStorage["soundDisabled"] === "true";
return prefs.getBool("soundDisabled");

// localStorage["soundDisabled"] = !soundDisabled();
prefs.set("soundDisabled", !soundDisabled());

OpenSocial Pages は、ガジェットをフレームウィンドウ(iframe)で表示せず、ウェブページにインラインで直接表示する仕組みを採用しています。そして、そのウェブページのドキュメントタイプは HTML5 としています。

そのため OpenSocial Pages では Flash に加えて、HTML5 Pacman のように HTML5 ベースのリッチなアプリを動かすことができます。また、フレームウィンドウ(iframe)の制約を受けないため、アプリは、キーボードのイベントを活用することができます。

アプリの開発者を絶対的に信頼する(もしくは信頼できると検証できる)なら OpenSocial Pages をゲームやエンタメのプラットフォームとして使うことも十分考えられますね。

OpenSocial Pages ならここまで(まだまだ)できる Status Update Gadget をアップデートしました


こんにちは。Nobuhiro Nakajima です。

OpenSocial Pages 向けの Status Update Gadget をアップデートしました。

Gadget のソースコードは、Downloads から入手できます。status-update.xml をダウンロードして、OpenSocial Pages の Control Panel から追加すれば、今すぐ動作を体験できます。

OpenSocial Pages を使うと、PC に加えて、iOS や Android のモバイルブラウザで動作する Twitter のような タイムラインベースのソーシャルアプリを自らの手で、手軽に作成できます。

Status Update Gadget は OpenSocial Pages でここまでできる(まだまだできる)... そのことを証明するための実例です。

Login
OpenSocial Pages は Google Apps の認証を求めます。OpenSocial Pages は Google Apps と連携することで、OpenSocial Gadget (=ソーシャルアプリ) が Google Apps ドメインのユーザとグループをソーシャルグラフとして扱うことができる仕組みとなっています。
Home
Status Update Gadget の Home View です。Viewer と Viewer がフォローしたユーザのアクティビティをタイムラインで表示します。新着の Status があればライムラインにリアルタイム(ポーリング)で表示します。テキストを入力して Share ボタンをクリックすると、アクティビティを送信します。
アクティビティ中のユーザを表す @ と URL を表す http(s):// は、プログラムが解釈して、リンクを自動的に生成します。View のアクティビティは Delete リンクで削除でき、それ以外のアクティビティは Reply リンクで返信できます。

OpenSocial Pages は Viewer の Friends を Following と位置付けます。そのため、フォローしたユーザのアクティビティは、次のように Activities API を使って取得します。
osapi.activities.get({ userId: '@viewer', groupId: '@friends'})
Mentions
Status Update Gadget の Mentions View です。Google Apps ドメインの全ユーザからの返信(または言及)のあったアクティビティをタイムラインで表示します。
OpenSocial Pages は、返信(または言及)を表す取得範囲を定義しています。そのため、Viewer に返信(または言及)したアクティビティは、次のように Activities API を使って取得します。
osapi.activities.get({ userId: '@viewer', groupId: '@mentions' })
Profile
Status Update Gadget の Profile View です。指定したユーザのアクティビティをタイムラインで表示します。Follow ボタン(または Unfollow ボタン)をクリックすると、そのユーザをフォロー(または解除)できます。

OpenSocial Pages は Viewer の Friends を Following と位置付けます。そのため、ユーザをフォロー(または解除)するときは、次のように Peopel API を使います。
osapi.people.create({ userId: '@viewer', groupId: '@friends', person: { id: user.id } })
osapi.people.delete({ userId: '@viewer', groupId: '@friends', person: { id: user.id } })
Following
Status Update Gadget の Following View です。指定したユーザがフォローしているユーザを表示します。このとき、各ユーザの最新のアクティビティも合わせて表示します。
OpenSocial Pages は Viewer の Friends を Following と位置付けます。そのため、指定したユーザをフォローしているユーザは、次のように Peopel API を使って取得します。
osapi.people.get({ userId: user.id, groupId: '@friends' })
Groups
Status Update Gadget は、各 View のヘッダで、Group の選択ボックスを表示し、Groups View に移動するようにしています。
OpenSocial Pages は Google Apps のドメインを Owner、そのグループを Owner の Group に位置付けます。そのため、Google Apps ドメインのグループは、次のように Groups API を使って取得します。
osapi.groups.get({ userId: '@owner' })
Domain
Status Update Gadget の Groups View です。Google Apps ドメインの全ユーザのアクティビティをタイムラインで表示します。
OpenSocial Pages は Google Apps のドメインを Owner、そのユーザを Owner の Friends に位置付けます。そのため、Google Apps ドメインの全ユーザのアクティビティは、次のように Activities API を使って取得します。
osapi.activities.get({ userId: '@owner', groupId: '@friends'})
Domain Members
Status Update Gadget の Members View です。Google Apps ドメインの全ユーザを表示します。このとき、このとき、各ユーザの最新のアクティビティを表示します。また、各ユーザをフォローしているかどうかも合わせて表示します。

OpenSocial Pages は Google Apps のドメインを Owner、そのユーザを Owner の Friends に位置付けます。そのため、Google Apps ドメインの全ユーザは、次のように People API を使って取得します。 
osapi.people.get({ userId: '@owner', groupId: '@friends' })
Group
Status Update Gadget の Groups View です。選択したグループに参加するユーザのアクティビティをタイムラインで表示します。
OpenSocial Pages は Google Apps のドメインを Owner、そのグループを Owner の Group に位置付けます。そのため、指定したグループのアクティビティを取得するときは、Activities API に対して、次の取得範囲を指定します。
osapi.activities.get({ userId: '@owner', groupId: group.id })
Group Members
Status Update Gadget の Members View です。選択したグループに参加するユーザを表示します。このとき、各ユーザの最新のアクティビティを表示します。また、各ユーザをフォローしているかどうかも合わせて表示します。
OpenSocial Pages は Google Apps のドメインを Owner、そのユーザを Owner の Friends に位置付けます。そのため、そのため、指定したグループのユーザを取得するときは、People API に対して、次の取得範囲を指定します。
osapi.people.get({ userId: '@owner', groupId: group.id })
 OpenSocial Pages は Google Apps (スタンダードも可) をお持ちであれば、何も準備することなしにすぐ使い始めることができます。この機会にぜひお試しください。また OpenSocial Pages の応用にご関心がございましたら Nobuhiro Nakajima までお問い合わせください。熱烈サポートいたします。

2010-07-12

Status Update と Check-in アプリの連携で見る OpenSocial Pages の意義

おはようございます。Nobuhiro Nakajima です。
前のエントリでは、今どんな仕事をしているか? What are you working on? を Twitter のようなライムラインで共有する OpenSocial Pages 向けの Status Update アプリ (サンプル) を紹介しました。
今回は、さらに一歩進めて、今どこで仕事をしているか? を Foursquare のような位置情報で共有する OpenSocial 向けの Check-in アプリ (サンプル) を紹介します。
Check-in アプリを実行すると、今どこにいるかその位置を検出して地図を表示します。そして、コメントを入力して Check-in ボタンをクリックすると、コメントと位置情報を保存します。保存したコメントと位置情報は、Google Apps のユーザ間で共有され、今どこでどんな仕事をしているか、地図上のマーカーと吹き出しで確認できます。
地図の表示は Google Maps API、位置情報の検出は HTML5 の Geolocation API を使っていますので、多くのスマートフォンで動作しますし、PC でも動作するでしょう。
また Check-in すると、次のように、Status Update アプリのタイムラインに、コメントと位置情報を表示しますので、Check-in の内容に対して、タイムライン上でコミュニケーションすることもできます。
さらに、そのコメントには、Check-in アプリへのリンクも含みます。リンクをクリックすると、Check-in アプリを起動して、そのユーザがコメントした位置の地図を表示しますので、そのユーザに何かをお願いしたり、近くにいるユーザを探すこともできます。
OpenSocial Pages は Google Apps の Gmail と連携した Messages API も備えていますので、メールによる通知を Check-in アプリに追加して、メールの中から Status Update アプリや Check-in アプリを起動するといった使い方もできるでしょう。
このように OpenSocial Pages は、小さなアプリがお互いに連携して、それぞれの機能を補う構成をとれるのが大きな特徴です。多機能なアプリをあらかじめ作るではなく、そのときに必要となったことを、そのときに小さく作る、もう存在する機能は連携して使う、そして小さく改善し続ける... といった今までとは異なる新しいサイクルを生み出す手助けを目標としています。
Check-in アプリのガジェット XML は、次のサイトから入手できます。check-in.xml をダウンロードしてください。
OpenSocial Pages Downloads
http://sites.google.com/a/lrlab.to/opensocial-pages/downloads
OpenSocial Pages は Google Apps MarketPlace から Google Apps に直接インストールできます。OpenSocial Pages を Google Apps にインストールするときは、次のボタンをクリックしてください。

2010-07-07

Status Update アプリとスマートフォンから見る OpenSocial Pages の意義、欠点と課題

こんにちは。Nobuhiro Nakajima です。

OpenSocial Pages 向けの Status Update アプリ (サンプル) をアップデートしました。このアプリは 今どんな仕事をしているか? Twitter のようなタイムラインで共有しようというものです。

先日ご紹介した Tweet アプリ (サンプル) は jQTouch を使用した iPhone 専用のアプリでしたが、Status Update アプリは、PC も含めて iPhone、iPad、Android などのスマートフォンでも動作するようにしました。

Status Update アプリ (サンプル) のガジェットXML は、次のサイトから入手できます。status-update.r146.xml をダウンロードしてください。

OpenSocial Pages Downloads
http://sites.google.com/a/lrlab.to/opensocial-pages/downloads

また OpenSocial Pages for Google Apps をインストールすると、既定のガジェット (=ページ) として追加するようにしました。OpenSocial Pages を Google Apps にインストールするときは、次のボタンをクリックしてください。

Status Update アプリが、各種スマートフォンでどう動くのかスクリーンキャプチャをとりました。


OpenSocial Pages は、他のコンシューマ向け SNS とは異なり、アプリを iframe を使わず、ウェブページとして表示して動かします。つまり、従来のウェブページを OpenSocial アプリとして作成できるということです。

そのため、スクリーンキャプチャのように PC も含めて、iPhone、iPad、Android などのモバイルブラウザでも OpenSocial アプリを快適に動作させることができます。

ただし、モバイルブラウザという性質上、残念ながら今のところ Flash は使えません。が、OpenSocial Pages は、HTML5 でウェブページをレンダリングするようにしていますので、HTML5 のテクノロジを使ったリッチアプリを動作させることはできます。

また、Android は Flash のサポートを表明していますので、近い将来 OpenSocial Pages + Android で Flash ベースの OpenSocial アプリを動作させることもできるようになります。

Status Update アプリは、今どんな仕事をしているか、Twitter でいうところの "つぶやき" を Google Apps ドメインのユーザ間で共有できる アプリです。その "つぶやき" が、他のドメインや公のユーザに公開されることはありません。

OpenSocial Pages は Google Apps のユーザとグループをインポートして、必要に応じて同期できます。つまり、OpenSocial Pages を Google Apps にインストールすると、Google Apps の既存ユーザとグループをソーシャルグラフとして、Google Apps に閉じた OpenSocial アプリを動作させることができるということです。

Status Update アプリは、とても小さく単純なもの(OpenSocial と JavaScript の知識があれば誰でも作れる)ですが、これら OpenSocial Pages の特徴によって、役立つものとなります。

例えば、スマートフォンの特徴と HTML5 の特徴を活かして、"つぶやき" に位置情報を付与するようにして、今どこでどんな仕事をしているか、お互いに共有できるアプリに改善することもできるでしょう。

OpenSocial Pages を使うには OpenSocial と JavaScript の知識が必要で、ウェブ開発者がいないと使えないという欠点があり、大きな問題であると課題として認識しています。

現状は、ウェブ開発者がいて、自らアプリを開発して、仕事の役に立ててもらうというスコープですが、将来は Google Friend Connect Social Gadgets や Facebook Widget、Twitter @anywhere くらいの感覚で利用できるようになればと考えています。

ODataとGDataはAtomPubに合流して、ウェブで誰でも標準手続きでデータを適切に操作できるようになるの?

こんにちは。Nobuhiro Nakajima です。今回のネタは素人視点の雑感です。

しばらくの間、Open Data Protocol (OData) とは、どういったものか概要を調べてみたのですが、それをどうまとめて紹介すればよいか悩んでいて、書き出しに困っているところです。

OData は、もともと Microsoft の ADO.NET Data Services という実装があって、Microsoft がその仕様部分を OData として提案し、オープンでスタンダードな仕様として採用を促しているものです。そして、現在 Microsoft は ADO.NET Data Services を改めて WCF Data Services として OData の実装を提供しているという図式のようです。

OData は、机上の仕様ありきなものでななく、技術情報も実装(製品も含む)も進んでいるため、ネット上でさまざまな情報を入手できます。次のサイトが、入口として使えそうです。

Open Data Protocol (OData)
http://www.odata.org/

WCF Data Services (formerly ADO.NET Data Services)
http://msdn.microsoft.com/en-us/data/bb931106.aspx

ですので、このエントリでは、OData そのものを紹介するのではなく、OData を調べていて、私なりに気がついたことや、関心をもったことを紹介することにします。*1

OData は、WEB のデータを共有したり、操作するための AtomPub (RFC 5023) ベースのプロトコルです。そのため、Google Data Protocol (GData) と比較されることが多いようですが、(少し乱暴かもしれませんが) OData と GData は AtomPub 拡張方法に違いはあっても、目的や位置付けは同じものという印象を受けました。

Open Data Protocol Q&A にある次の質問と回答が、気になる多くのものごとを表していそうです。
Q:  How should I think about OData vs. GData A: There is no OData vs. GData.  Both are based on ATOM and JSON. Both protocol support our goal of an open data protocol for the Web. We intend on working with others in the community, including Google, to move the features of OData into future version of AtomPub or other appropriate standards. We encourage Google (GData) to join us in these conversations.
OData も GData も同じ仕様をベースとしていて、目指しているところも同じでしょう。OData の仕様は、将来の AtomPub などの標準仕様に持ち込むつもりなので、Google (GData) も話し合いに参加したほうがいいよ。(超意訳) といったところでしょうか。

OData のライセンスは Microsoft Open Specification Promise (OSP) に基づき、GData のラインセンスは Patent License に基づきます。両者とも条文を読む限りでは、オープンライセンスに見えるのですが、その根本的な違いがどこにあるのか、理解できませんでした。どなたか教えてほしいです。

OData は Microsoft 以外のサードパーティでの採用が進んでいます。OData に基づいて、サービスやデータを提供する者を、OData Producer と呼ぶようで、その OData Producer のリストは、次のサイトで入手できます。

OData producers
http://www.odata.org/producers

OData Producer は、SharePoint や SQL Server、Azure など Microsoft 製品群でサポートが進んでいるようです。これは Google が Google サービスを GData で提供しているのと同じ位置付けに見えます。

OData は、Microsoft 以外にも、IBM WebSphere といったメジャー製品でも採用され、また、Microsoft .NET Framework やオープンソースの Java REST フレームワークである Restlet OData Extention を使って、自らの製品やサービスとして OData Producer を実装できるようです。Facebook も Facebook Insights という OData を使った Preview を Live しています。

さらに Microsoft は、OData Producer がデータを提供できる場として、MarketPlace を立ち上げています。

Microsoft Codename “Dallas”
http://pinpoint.microsoft.com/en-US/Dallas

このサイトは OData Producer のディレクトリを提供していて、OData Consumer (OData の利用者をこう呼ぶ) が OData Producer のサービスを購読するというスタイルをとります。Type Free という項目表記もあるため、将来は、自ら保有するデータで有料で提供して、収益を得るというビジネスモデルも組み込まれているようです。

さらに Microsoft は、政府機関のデータを提供する Open Government Data Initiative (OGDI) というサービスを立ち上げていて、データフォーマットとして OData を採用しています。

Open Government Data Initiative (OSDI)
http://ogdisdk.cloudapp.net/

OData は OData Consumer 向けの製品やクライアントライブラリも提供しています。

OData Consumer
http://www.odata.org/consumers

OData Cousumer は、Data Viewer ものや Excel でサポートされているようで、これから Microsoft のクライアント製品群でのサポートが進んできそうです。また、クライアントライブラリを使って、自らの製品やサービスとして OData Consumer を実装できるようです。これも Google サービスと GData Client Library と同じ位置付けに見えます。

OData は、まず Microsoft とサードパーティの製品で OData をサポートして、すそ野を広げて、データを保有する人を巻き込んで OData Producer を増やすというのが現状でしょうか。これをクリアすると、OData Consumer は、ひとつの方法で、あらゆるデータを利用できるようになり、さらに... というエコシステムの構築が OData の狙いということになりそうです。

OData の仕様には、認証や認可の既定はなく、それぞれのケースで最適な方法があるという立場をとっているようです。

GData 自体も、認証や認可の既定はありませんが、GData は、Google サービスありきのため、各サービスは Google アカウントで認証し、AuthSub や OAuth といった認可の手続きが共通の取り決めとなっています。このことが、GData が Web での利用を現実的にしていて、GData (を実装したサービス) のアドバンテージになっていると強く感じます。

OData はどういった方向性に進んでいくんでしょうか。単なるデータプロトコル仕様だけでは、Web の世界では、全体的な見通しが立たない気がしています。GData と OData の仕様が合流して、新しい AtomPub になったとして、その後、ウェブで誰でも標準手続きで、あらゆるデータを適切に操作できるようになるのでしょうか。

そのあたりのビジョンをガチンコしていけば、なんかエキサイティングなウェブが開けていけそうな気がした OData の紹介でした。


*1 私は WCF Data Services や OData の専門家ではありませんので、もし見識違いや誤りがありましたら、ご指摘いただけますと幸いです。

2010-07-03

OpenSocial Pages のタイムラインは AppEngine for Java の Data Store でどのように実現しているか

こんにちは。Nobuhiro Nakajima です。

OpenSocial Pages for Google Apps は OpenSocial Activities API という Twitter でいうところのタイムライン API を備えています。また Activities は Twitter でいうところの Friends (Following)、Lists、Mentions という人と人の関係(ソーシャルグラフ)で絞り込めるようになっています。


OpenSocial Pages は Google AppEngine for Java でホストしています。そして Activity の格納と検索は Data Store (JDO) で実現していて、エンティティの主な構造は、次のようにしています。

エンティティの構造

Twitter でいうところの User を表すエンティティです。この User が、誰に Follow されているか、どのグループに属するかを保持させています。
public class User {
  private String id;
  private Set<String> followerIds; // 誰に Follow されているか
  private Set<String> groupIds; // どのグループに属するか
}
Twitter でいうところの Lists を表すエンティティです。
public class Group {
  private String id;
}
Twitter でいうところの Status を表すエンティティです。この Activity が誰のもので、誰が関係するのか保持させています。followerIds と groupIds は Person のコピーを保持させています。mentionIds は Twitter でいうところの、テキスト中の @username で引用された User たちを保持させています。
public class Activity {
  private Long id;
  private String userId; // Person#id
  private String title; // テキスト
  private Set<String> followerIds; // Person#followerIds のコピー
  private Set<String> groupIds; // Person#groupIds のコピー
  private Set<String> mentionIds; // テキスト中の @username たち
}
Follow と Unfollow

User A が User B を Follow するとき、User B の followerIds に User A の userId を追加します。また Unfollow するときは、User B の followerIds から User A を除外します。

Group の参加と退会

User が Group に参加するときは、User の groupIds に自身の userId を追加します。また、退会するときは、User の groupIds から 自身の userId を除外します。

Activity の送信

送信する User の followerIds と groupIds を Activity の followerIds と groupIds にコピーして格納します。さらに、テキスト中の @username に該当する User の userId を mentionIds に格納します。

検索クエリ

User の Activity を検索するときは、Activity エンティティに対して、次のフィルタを使っています。
Query#setFilter("userId == :userId");
User が Follow している Friends の Activity を検索するときは、次のフィルタを使っています。このときの userId は、自分自身の ID を指定します。
Query#setFilter("followerIds == :userId");
Group に所属している User たちの Activity を検索するときは、次のフィルタを使っています。
Query#setFilter("groupIds == :groupId");
User が関係する Activity を検索するときは、次のフィルタを使っています。
Query#setFilter("mentionIds == :mentionId");

Activity の再構築

User A が User B を Follow したとき、User B の 全 Activity (*1) の followerIds に User A の userId を追加します。また Unfollow したときは、followerIds から除外します。

User が Group に参加するときは、User A の 全 Activity (*1) の groupIds に Group の groupId を追加します。また、退会したときは、groupIds から除外します。

前者と後者とも Task Queue を使って Activity を更新しています。

利点と欠点、そして課題

まず、基本方針は、シンプルなデータ構造とすること、そして、参照のコストを均一化するの(と削除)を最優先にしました。

この方法は、どんなに User が増えて、どんなに Follow したり、Group に参加したりしても、検索クエリのコストは一定なのが利点です。ただし、Follow/UnFollow、Groupの参加/不参加が発生したとき、過去にさかのぼって Activity を再構築する必要があるのが、大きな欠点です。

Activity がいくら蓄積されようとも、Activity 自体のコピーは保持していないため、Activity の削除は用意というのも利点です。ただ、User 自体を削除したとき、その User の 全 Activity を削除する必要がありますが、現状は削除せず、残したままとしています。

*1 Activity はどんどん蓄積されるものなので、時間が経過するにしたがって、全 Activity を更新するのは、現実的に難しくなってきます。そこで OpenSocial Pages では、新しいものの内 n 件分、もしくは n 日分の Activity のみ再構築の対象にするように妥協しています。古い Activity は重要度が低いよねという考え方です。

できれば、古い Activity もすべて再構築したいというのが課題です。古い Activity は即時で再構築することは絶対条件ではないため、バッチ的なものや、無駄な再構築が起こらないようにスケジューリングするとかいった方法でもよさそうです。

何かよいアイディアはないものでしょうか? エンティティグループとか、エンティティのエンティティとかうまく使えば、別の方法があるのかもしれないです。

2010-07-02

Google Apps Marketplace で OpenSocial Pages をぽちっと Google Apps にダイレクトインストールできるようにしました

こんにちは。Nobuhiro Nakajima です。

OpenSocial Pages を Google Apps MarketPlace からぽちっと Google Apps にダイレクトインストールできるようにしてみました。

このエントリでは Google Apps MarketPlace から Google Apps に OpenSocial Pages に登録する流れを紹介します。Google Apps MarketPlace の掲載手順や Google Apps との連携方法など、具体的な話題は、別途エントリで紹介します。

OpenSocial Pages がどんなものか知りたい方は、次の紹介エントリをご覧ください。

* OpenSocial Pages という新しい取り組みの紹介です
* OpenSocial Pages はソーシャルデータ駆動による Social Gadget の消費スタイルを提案するものです

Google Apps MarketPlace は Google が運営するサイトで、サードパーティのベンダが、全世界の Google ユーザに、ビジネス向けの製品やサービスを紹介する場となっています。

Google Apps Marketplace
https://www.google.com/enterprise/marketplace/
The Google Apps Marketplace offers products and services designed for Google users, including installable apps that integrate directly with Google Apps. Installable apps are easy to use because they include single sign-on, Google's universal navigation, and some even include features that integrate with your domain's data.


OpenSocial Pages は、次のとおり Google Apps > Productivity カテゴリに掲載されています。



Google Apps MarketPlace では、ベンダのプロフィールを掲載できます。Nakajiman Software のプロフィールは、次のとおりです。ベンダの基本情報と製品リストを掲載できます。

Vendor Profile: Nakajiman Software Inc.



製品ごとのプロフィールも掲載できます。OpenSocial Pages のプロフィールは、次のとおりです。

OpenSocial Pages for Google Apps



Google Apps MarketPlace は製品の紹介にとどまらず、Single Sign-On (SSO) に対応した製品であれば、Google Apps MarketPlace からその製品を Google Apps に直接インストールできる仕組みを備えています。

OpenSocial Pages も直接インストールできるようにしています。OpenSocial Pages のインストールはとても簡単です。OpenSocial Pages のプロフィールから Add it now ボタンをクリックします。そして、インストール先の Google Apps ドメインを入力して Go ボタンをクリックします。



すると、Google Apps Dashboard に遷移し、OpenSocial Pages の利用規約への同意を求められます。このとき Terms of Service が OpenSocial Pages の利用規約にリンクされています。



利用規約に同意すると、インストールする製品から Google Apps にアクセスする内容を表示し、認可するか求められます。OpenSocial Pages は Google Apps の Uesr と Group をインポートするため、User と Group へのアクセス (Read Only) を求めています。



アクセスを認可して Enable app now ボタンをクリックすると、Google Apps で OpenSocial Pages が使えるようになります。



インストールすると、Google Apps に OpenSocial Pages のリンクが追加されます。



インストールすると、Gmail などのナビゲーションに OpenSocial Pages のリンクが追加されます。



OpenSocial Pages は Google Apps Dashboard から、いつでもアンインストールできます。また、状況に応じて、無効にしたり、アクセスの認可を取り下げることもできます。



OpenSocial Pages にアクセスすると、Google Apps アカウントによるログインを求められます。



OpenSocial Pages にログインすると、既定のページ(=ガジェット)がされます。このページは OpenSocial の People API を使って、ログインユーザの名前を表示するようにしてあります。この名前は Google Apps アカウントからインポートしたものです。



OpenSocial Pages のコントロールパネルにアクセスして、初期のセットアップをします。



あとは OpenSocial Apps や Social Gadgets を開発するノリでページを編集していきます。

Google Apps MarketPlace での露出は、ユーザレビューと評価による基準しかないようです。もしも関心がありましたら OpenSocial Pages をお試しいただき、マイナス面でも構いませんので、レビューや評価を頂けますと幸いです。

2010-06-16

mixiアプリ開発 & 運用コンプリートブック の見本誌が届きました

おはようございます。なかじまんです。

6月19日 発売(予定)の mixiアプリ開発 & 運用コンプリートブック - ユーザをつかむソーシャルアプリのつくり方!育て方! の見本誌が届きました。



目次は、次のとおりです。@yoichiro さんの監修で、SAP 各社さんが、実際に世の中に送り出した mixiアプリの開発や運用の事例を解説したり、紹介する構成となっています。

* 序章
* Chapter 01 mixi アプリの基礎
* Chapter 02 『ようこそマイキッチン』の開発・運用事例
* Chapter 03 『セルフィちゃんねる』の開発・運用事例
* Chapter 04 ドリコムのアプリ開発・運用事例
* Chapter 05 『記憶スケッチ』の開発・運用事例
* Chapter 06 外部サーバ
* Chapter 07 OpenSocial jQuery による開発

当社も共著者として「Chapter 07 OpenSocial jQuery による開発」を担当しました。ミニアプリを題材として OpenSocial jQuery の使い方を説明しています。また、完動のソースコードとキャプチャを豊富に掲載して、OpenSocial jQuery を使って mixiアプリでできることを紹介しています。ので、mixiアプリの設計をしたり、コーディングをするときに、手元にあると役立つだろうと期待しています。

SAP 各社さんの Chapter は、次のような、とても興味深い内容になっています(怒られるかもしれませんが、印象を伝えたかったので、写真で紹介します)。

mixiアプリのバックエンドが、どのような構成になっていて、どう運用しているかといった話題もあります。



mixiアプリのトラフィックが、どうなっていて(どういう傾向があって)、それにどう対応したかといった話題もあります。



mixiアプリのプロジェクトが、どう進んで、どんなことをした(している)、どんなツールや文書を使ったといった話題もあります。



以上のとおり、SAP 各社さんしか知るはずのない、外からは見ることのできない話題が盛り込まれています。

広報的な意味はあるかもしれませんが、各社さんとも、自社のノウハウを公開する直接的な理由はないと思えますが、おそらく mixiアプリを含むソーシャルアプリの市場を盛り上げていこうという意思の表れなんじゃないかと思います。素晴らしいなぁ。

Amazo などのオンライン書店では予約も開始しています。ぜひお手元に。よろしくお願いいたします。

2010-06-09

OpenSocial Pages はソーシャルデータ駆動による Social Gadget の消費スタイルを提案するものです

こんにちは。なかじまんです。OpenSocial Pages ネタです。

OpenSocial Pages は、その構成例として、iPhone (iPod touch も) 向けに OpenSocial な機能を持つページ(=ガジェット)を提供できるようにしています。

さっそく OpenSocial Pages を使って iPhone 向けに、さささっと 2時間くらいで、タイムライン上でコミュニケーションするためのサンプルページを作ってみました。ページのソースコード (=ガジェット XML ファイル) は、次のサイトからダウンロードできます。

OpenSocial Pages Downloads
http://sites.google.com/a/lrlab.to/opensocial-pages/downloads

サンプルページといっても、完動品で、実用性を感じられるほどの機能を盛り込んであります。iPod touch で動いている様子を動画にしました。動画を見るとイメージが膨らむと思います。(オーディオは Google CM っぽくしてみましたw 知らない曲なので、あくまでもイメージです)



OpenSocial Pages のページは iPhone のホーム画面に追加できるようにしてあります。ので、Safari からブックマークしておけば、すぐにページを開くことができます。あと、ホーム画面のアイコンは、ガジェットXML の /ModulePrefs/Link/@rel="icon" で任意のアイコンを指定できます。



ホーム画面のアイコンからページを開くと、ローディング画面を挟むようにしてあります。現状は war/images/apple-touch-startup-image.png 固定ですので、必要に応じて差し替えてください。



認証ドメインの全メンバーのアクティビティをリスト表示しています。緑のハイライトは、タップしたときの効果です。定期的に Activites API をポーリングして、新しいアクティビティを追加しています。OpenSocial Pages の Activites API は UpdatedSince (この日時以降に更新されたもの) パラメータを備えていますので、たんなるポーリングよりもコストは抑えめにできます。



右上の Share ボタンをタップすると、スライドアップして投稿フォームを表示します。メッセージを入力して Send ボタンをクリックすると、そのテキストをアクティビティとして送信します。



タイムラインのメッセージを選択すると、スライドしてメッセージの全文を表示します。



Reply ボタンをタップすると、返信フォームを表示します。



Retweet ボタンをタップすると、RT フォームを表示します。



サンプルページの機能は、以上のとおりです。ぜひ、ページのソースコードと見比べてください。OpenSocial Pages は、ソーシャルグラフとアクティビティストリームの API を持ちます。そのため、この非常に少ないコードだけでも、これだけのソーシャルな機能を持つページが作成できてしまいます。

このように OpenSocial Pages の大きな特徴は、必要な機能を持つページを、その場でインスタントに作成できるということです。つまり、従来のように、多機能かつ汎用的なガジェットを使っていく方向性に加えて、そのときに必要な機能だけを持つガジェット(=ページ)を量産して消費して使い捨てにするという方向性も考慮に入れることができます。また OpenSocial Pages は、ソーシャルグラフとそこから発生したデータは、ページの存在とは無関係 *1 にデータとして保持します。ので、ページよりも、データに重きをおきます。

例えば、紹介したサンプルページは、Twitter のように多機能にしていくことはできますが、特定の人とだけ、タイムラインでコミュニケーションしたいなど、ある目的を持つメンバー向けのページを提供したとして、その後、そのページは使わなくなったとしても、アクティビティはそのまま残り、また別のページから別の使われ方をすることになるでしょう。

*1 ページを削除したときもデータは残りますが、AppData などページの存在が必須であるデータを、どう参照させるかは課題です。

2010-06-02

OpenSocial Pages という新しい取り組みの紹介です

こんにちは。なかじまんです。新しい取り組みのお知らせです。

OpenSocial Pages 0.9.0 を公開します。

OpenSocial Pages は Google App Engine for Java 上で動作する OpenSocial コンテナです。OpenSocial Pages は App Engine 上のアプリケーションに OpenSocial を組み込んだり、OpenSocial の上にアプリケーションを構築する、その元ネタとして提供するものです。

OpenSocial Pages は App Engine 向けに実装した完動品です。ソースコードを提供していますので、手元の環境でソースコードをビルドして App Engine にデプロイするだけで、その動作を確認できます。OpenSocial Page のソースコードは、次のサイトからダウンロードできます。

OpenSocial Pages - Nakajiman Software
http://sites.google.com/a/lrlab.to/opensocial-pages/

OpenSocial Pages は、mixi や gooホームのように、アプリの開発者がいて、SNS のユーザがいて、その間をコンテナが取り持ち、ひとつのサービスを提供するという形態を目指すものではなく、Enterprise OpenSocial Whitepaper などの新しい方向性に触発されて、今ある(これから作る)システムやサービスに OpenSocial をどう取り込んでいくかを意識して取り組もうというものです。

OpenSocial Pages は Google アカウント認証を前提としています。アプリケーションを Google Apps と結び付けることで Google Apps ドメインのアカウントに限定することもできます。つまり、信頼できる限られた範囲のユーザでの利用を想定しています。



OpenSocial Pages は、ウェブページを 1つのガジェットとして扱います。ガジェットは iframe を使って表示するのではなく、ウェブページの HTML ドキュメントにインライン表示します。つまり、ウェブページ全体が Canvas ビューになるといえます。

この特性により、例えば iPhone や iPad といった広い分野で OpenSocial アプリの仕組みを活用できます。実例も兼ねて、OpenSocial Pages のソースコードでは jQTouch を組み込み iPhone 仕様でページを表示するようにしてあります。このページ自体が 1つのガジェットになり、そのガジェットから OpenSocial API が使えます。



OpenSocial Pages は、コントロールパネルという管理機能をあらかじめ持っています。コントロールパネルは、管理者(admin) のみアクセスでき、次のリソースを管理したり、編集できたりします。

* ユーザ
* グループ
* ページ (= ガジェット)
* プロキシ



OpenSocial Pages は、人の関係性を、次のとおり、ユーザとグループで表現します。また、この関係性は、OpenSocial API にも適用しています。

* ユーザは Google アカウントに対応する
* ユーザは、他のユーザを Follow できる (友達関係)
* 管理者は、ドメインのグループを作成できる
* ユーザは、ドメインのグループに参加できる

OpenSocial Pages は、ウェブページをガジェットに見立てていますが、ガジェットの元ネタは、従来どおり、ガジェット XML です。OpenSocial Pages は、オンラインのガジェットエディタを持っていて、編集したガジェット XML は App Engine のデータストアに保持します。



また、ガジェットエディタから iPhone/iPod や iPad を選択して、特定の画面サイズでポップアップして、ウェブページを開けるようにしています。Safari を使えば、実機とほぼ同じように表示できます。

OpenSocial Pages は gadgets.io.makeRequest によるリクエスト中継をホワイトリストで制限します。許可していない URL へのリクエストは中継しません。また、次の中継方法をサポートしています。

* あらかじめ定めた User/Password による基本認証
* あらかじめ定めた User/Password による WSSE 認証
* HMAC-SHA1 による 2-Legged OAuth
* あらかじめ定めた User/Password による Zoho CRM API の呼び出し



OpenSocial Pages は OpenSocial v1.0 仕様に準じて実装を進めていて、次の OpenSocial JavaScript API をサポートしています。v0.9 や v0.8 は捨てています。

* 中継先を管理できる gadgets.io.makeRequest
* 言語選択による Message Bundle
* URLパラメータによる User Preference の適用
* User Perference は Web Storage (localStorage) に格納
* iPhone 向け User Perference エディタ
* ビューの遷移 (Canvas から Canvas のみ)

* People, Groups, Activites, AppData, Messages を JSON-RPC で実装
* People は、取得(friens, group)、更新、削除、Follow、グループ参加を実装
* Groups は、取得、作成、更新、削除
* Activites は、取得(friends, group, mentions)、作成、更新、削除を実装
* Messages は、送信(person, group)を実装

パーミッションモデルは、一般性を保持しつつ、制限を緩いものとしています。

* Viewer は、他人や他アプリも含めて、あらゆるデータを取得できます
* Viewer は、自身のデータを作成、更新、削除できます
* Viewer は、すべての他人や他グループに対して、メッセージを送信できます
* 管理者(Admin)は、他人や他アプリも含めて、あらゆるデータを取得、作成、更新、削除できます

駆け足になってしまいましたが、ざっと概略をお伝えしました。

OpenSocial Pages をきっかけとして、今後、いろいろな分野で OpenSocial が適用できないか... という話題が増えることを期待しています。もし、OpenSocial の適用を検討することがありましたら、特にお役に立てると考えますので、お声掛けいただきたく存じます。