ラベル Gadgets API の投稿を表示しています。 すべての投稿を表示
ラベル Gadgets API の投稿を表示しています。 すべての投稿を表示

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 Spec と Core Data Spec に記載しておきました。

2010-08-02

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 までお問い合わせください。熱烈サポートいたします。

2009-12-26

Google Wave Gadgets でできることを OpenSocial や Shindig の視点で調べてみました

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

OpenSocial jQuery は Google Wave Gadgets でも使えるようになりますか... という質問がありました。現状の OpenSocial jQuery のまま gadgets.* API は使えます。また wave.* API はそもそも考慮していません。が答えです。

実例として公開している YouTube ガジェット がありますが、次のとおり Google Wave Gadgets としてそのまま動きます。このように Google Wave で OpenSocial jQuery はすぐに試せます。



Wave Gadgets も iGoogle や Google Friend Connect (GFC) と同じ Apache Shindig 上で構成していると考えられます。ですので、gadgets.* API の振る舞いも同じであり、OpenSocial jQuery がそのまま使えるということになりそうです。

本当にそうなの... という疑問が残るので、Wave Gadgets を Shindig 視点でいろいろ調べてみました。調べたのは Wave Preview です。Sandbox ではありません。

ガジェットのレンダリング

iframe URL を抜粋します。見てのとおり Shindig の Gadgets Rendering Server です。HTTPS (Secure) プロトコルが特徴的です。ホストは googleusercontent.com で iGoogle や GFC の gmodules.com とは異なるので別系統なのでしょう。container パラメータも wave なので、同系統であったとしても、コンテナのプロファイルは別なのでしょう。
https://lq3n3peeciqdlq351d7pd2pqtuvr30al-a-wave-opensocial.googleusercontent.com/gadgets/ifr
?v=b893d00cffa7bf86acedda54be7a116
&container=wave
&view=canvas&
&lang=en&
&url=http://example.com/gadgets.xml
&country=ALL
&libs=core%3Adynamic-height%3Alocked-domain ...
&mid=5
&nocache=1
&parent=https://wave.google.com ...
#rpctoken=...
&st=...
libs パラメータを観察したところ、ガジェットXML の feature を表すようですので、Google Wave 側もガジェット XML の内容を認知しているのでしょう。

view パラメータは、常に canvas のようです。ガジェットXML で profile や home を指定すると、次のエラーとなりますので、canvas ビューのみサポートするのでしょう。既定のビューが canvas ということになるのかな。
Unable to locate an appropriate view in this gadget. Requested: 'canvas' Available: [home]
Unable to locate an appropriate view in this gadget. Requested: 'canvas' Available: [profile]
nocache パラメータは、常に 1 (キャッシュなし) のようです。iframe のソースコードを見ても concat されていませんので、開発中のキャッシュ制御は気にしなくてもよさそうです。

rpctoken パラメータが付与されてますので、クロスホストなデータ通信は gadgets.rpc なのでしょう。iframe のソースコードを見ると gadgets.rpc と gadgets.rpctx が含まれますので、すべてのブラウザで URL flagment (rpc_relay.html) は使われないでしょう。

st パラメータが付与されてますので、Phone home (gadgets.io.makeRequest)の仕組みも同じでしょう。

setprefs feature

Wave Gadgets のドキュメントでサポートすると記載があります。ガジェットXML の UserPref は認知しており、API でも取得できました。ただ API で設定できますが、(確認した限りは)永続化できませんでした。また、UserPref を編集するための UI も提供されていないようです。本当か。

dynamic-height feature

Wave Gadgets のドキュメントでサポートすると記載があります。実際に API は存在し、期待どおり動作しました。

settitle feature

Wave Gadgets のドキュメントでサポートすると記載があります。実際に API は存在し、呼び出してもエラーにはなりませんが、指定したタイトルがどこで表示されるのか確認できませんでした。

tabs feature

Wave Gadgets のドキュメントでサポートすると記載があります。実際に API は存在し、期待どおり動作しました。

minimessage feature

Wave Gagets のドキュメントでサポートすると記載があります。実際に API は存在し、期待どおり動作しました。

locked-domain feature

Wave Gadgets のドキュメントでサポートすると記載があります。実際に locked-domain なしでガジェットを wave に貼り付け、その後 locked-domain ありとして再表示すると、"Invalid domain" というエラーとなるため、機能しているのでしょう。

view feature

Wave Gadgets のドキュメントでサポートすると記載はありません。が、実際に API は存在しました。ただ、サポートするビューは profile と canvas という結果で、前述の結果とズレがあります。また、ビューの移動は API が無反応でした。

opensocial-0.8 feature

Wave Gadgets のドキュメントで OpenSocial API は未サポートと記載があります。が、実際に API は存在しました。実際に Person の取得を試みたところ、次のエラーとなりました。
Malformed security token ...&c=wavecom.google.gadgets.auth.AuthTokenException: Failure for container wave
Wave は Contact ベースの関係のようですので、OpenSocial に対応するなら iGoogle モデルになるのかなという印象です。もうできてたりして。

といったところを調べてみました。結果、現状の OpenSocial jQuery のまま gadgets.* API なら使えることが把握できました。役に立ちそうであれば使ってみてください。

2009-12-21

メッセージの表示に加え、明示的もしくは自動的にメッセージを閉じる強化をした OpenSocial jQuery Mini Message プラグインを公開しました

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

OpenSocial jQuery は jQuery.fn.minimessage メソッドで Mini Message を限定的にサポートしてきましたが、このたび OpenSocial jQuery Mini Message としてプラグイン化して、使える機能を強化しました。従来の機能に加えて、明示的もしくは自動的にメッセージを閉じることができるようになりました。

今後、メッセージの表示は OpenSocial jQuery Mini Message プラグインを使ってください。従来の Mini Message は Deprecated 非推奨となり、OpenSocial jQuery 1.3.2.5 以後のバージョンで使えなくなります。

OpenSocial jQuery Mini Message プラグインの使い方は、次のとおりです。質問や要望がありましたら OpenSocial jQuery Discussion までお願いします。

OpenSocial jQuery 本体に続けて、OpenSocial jQuery Mini Message をロードしてください。
<script src="opensocial-jquery.js" type="text/javascript"></script>
<script src="opensocial-jquery.minimessage.js" type="text/javascript"></script>
OpenSocial jQuery Mini Message は minimessage を必要とします。
<Require feature="minimessage" />
閉じるボタン付きのメッセージを表示する

jQuery.fn.minimessage を使って、閉じるボタン付きのメッセージを表示できます。
$('<span/>').text('Say Hello!').minimessage();


また jQuery.fn.minimessage にコールバック関数を指定して、閉じるイベントをハンドリングできます。コールバック関数の戻り値を false とすると、イベントは無効となり、メッセージは閉じません。
$('<span/>').text('Dismissible Message with Callback')
  .minimessage(function() {
    return confirm('Do you close a message?'); // 閉じるかどうか?
  });
メッセージを閉じる

jQuery.fn.remove を使って、メッセージを閉じることができます。
var message = $('<a/>').text('Remove Message')
  .click(function() {
    message.remove(); return false;
  }).minimessage();
});
自動的にメッセージを閉じる

jQuery.fn.minimessage を使って、自動的に閉じるメッセージを表示できます。秒数か fast, normal, slow のいずれかを指定します。

* fast を指定すると、1秒後にメッセージを閉じます。
* normal を指定すると、3秒後にメッセージを閉じます。
* slow を指定すると、5秒後にメッセージを閉じます。
$('<span/>').text('Timer Message')
  .minimessage(3); // 3秒後に閉じる
$('<span/>').text('Timer Message with Predefined Speeds')
  .minimessage('slow');
また jQuery.fn.minimessage にコールバック関数を指定して、閉じるイベントをハンドリングできます。
$('<span/>').text('Timer Message with Callback')
  .minimessage('fast', function() { // 3秒後に閉じる
    alert('The message was closed.');
  });
実例

* OpenSocial jQuery Mini Message Test Suite

2009-12-09

OpenSocial jQuery に mixi Platform 固有の拡張機能を追加する jQuery プラグインを公開しました。

おはようございます。ちょっと体調のすぐれない Nobuhiro Nakajima です。

OpenSocial jQuery mixi Platform 1.0.0 をリリースしました。
http://code.google.com/p/opensocial-jquery/ -- Downlaod
http://code.google.com/p/opensocial-jquery/wiki/PluginMixi -- Document

OpenSocial jQuery mixi Platform は mixi 固有の拡張機能を OpenSocial jQuery に追加するための jQuery プラグインです。OpenSocial jQuery 本体に続けて、OpenSocial jQuery mixi Platform をロードして使ってください。
<script type="text/javascript" src="opensocial-jquery.js"></script>
<script type="text/javascript" src="opensocial-jquery.mixi.js"></script>
外部サイトに誘導する

jQuery.view を使って、外部サイトに誘導できます。このとき、外部サイトの URL を指定します。また、パラメータを指定すると QUERY_STRING に変換して URL に付与します。
// http://www.google.com/
$.view('http://www.google.com/');

// http://www.google.com/search?q=corgi
$.view('http://www.google.com/search', { q: 'corgi' }); 


ただし mixi の URL を指定したときは、外部サイトとみなさず、即ページ遷移します。
// http://mixi.co.jp/
$.view('http://mixi.co.jp/');

// http://mixi.jp/show_profile.pl?id=0123456789
$.view('http://mixi.jp/show_profile.pl', { id: '0123456789' });
また、従来どおり、ビューの切り替えや現在のビュー名の取得もできます。
$.view('profile');
$.view('home');
$.view('canvas', { q: 'corgi' });
console.info($.view()); // profile, home, canvas
参加コミュニティを取得する

jQuery.getData を使って、ユーザの参加コミュニティを取得できます。このとき url に /communities からはじまるパスと @viewer, @owner, ユーザID のいずれかを指定します。jQuery.ajax や jQuery.get も同様です。
$.getData('/communities/@viewer/@self').next(function(communities) {
  $.each(communities, function(i, community) {
    console.info(community.id); // コミュニティID
    console.info(community.userId); // ユーザID
    console.info(community.url); // コミュニティURL
    console.info(community.name); // コミュニティ名
    console.info(community.thumbnailUrl); // コミュニティ画像
  });
  console.info(communities.totalResults); // 参加コミュニティ数
}).error(function(e) {
  alert(e+'');
});
学校を選択する

jQuery.getData を使って、VIEWER の母校や在学中の学校を選択できます。このとき url に /schools からはじまるパスと @selected を指定します。jQuery.ajax や jQuery.get も同様です。
$.getData('/schools/@selected').next(function(schools) {
  var school = schools[0];
  console.info(school.token); // 学校トークン
  console.info(school.divisionId); // 学校区分ID
  console.info(school.division); // 学校区分名
});


学校リストを取得する

jQuery.getData を使って、VIEWER の母校や在学中の学校リストを取得できます。このとき url に /schools からはじまるパスと @viewer を指定します。jQuery.ajax や jQuery.get も同様です。
$.getData('/schools/@viewer/@self').next(function(schools) {
  $.each(schools, function(i, school) {
    console.info(school.token); // 学校トークン
    console.info(school.divisionId); // 学校区分ID
    console.info(school.division); // 学校区分名
  }
  console.info(schools.totalResults); // 学校数 = schools.length
}).error(function(e) {
  alert(e+'');
});
マイミクを招待する

jQuery.invite を使って、マイミクを招待できます。このとき @friends を指定します。招待したマイミクのユーザIDリストを取得できます。
$.invite('@friends', function(ids) {
  $.each(ids, function(i, id) { console.log(id) }); // ユーザIDリスト
});


また @friends を省略しても同じことができます。
$.invite(function(ids) {
  $.each(ids, function(i, id) { console.log(id) }); // ユーザIDリスト
});
さらに Deferred チェーンを使っても同じことができます。
$.invite('@friends').next(function(ids) {
  $.each(ids, function(i, id) { console.log(id) }); // ユーザIDリスト
}).error(function(e) {
  alert(e+'');
});
同級生を招待する

jQuery.invite を使って、同級生を招待できます。このとき @classmates を指定します。招待した同級生のユーザIDリストを取得できます。
$.invite('@classmates', function(ids) {
  $.each(ids, function(i, id) { console.log(id) }); // ユーザIDリスト
});


さらに Deferred チェーンを使っても同じことができます。
$.invite('@classmates').next(function(ids) {
  $.each(ids, function(i, id) { console.log(id) }); // ユーザIDリスト
}).error(function(e) {
  alert(e+'');
});
コンテナを判別する

jQuery.container.mixi を使って、コンテナが mixi Platform かどうか判別できます。
他コンテナも含めて 1つの JS ファイルにまとめるときに役立ちます。
if ($.container.mixi) { ... } // mixi Platform
.mixi クラスを使って、コンテナが mixi Platform かどうか判別できます。
他コンテナも含めて 1つの CSS ファイルにまとめるときに役立ちます。
<style type="text/css">
.mixi p { color: red; } /* mixi Platform */
</style>
OpenSocial jQuery に対する質問や要望は Google Group で受け付けています。開発中の最新情報も入手できます。ぜひご参加ください。

OpenSocial jQuery Discussion
http://groups.google.com/group/opensocial-jquery

-- 2009-12-10 スクリーンキャプチャの追加

2009-11-28

OpenSocial jQuery autoHeight 1.0.0 is available

OpenSocial jQuery autoHeight is plugin to adjust height of Gadgets automatically all the time.
http://code.google.com/p/opensocial-jquery/wiki/PluginAutoHeight

Edit the src attribute in the script tag to point to your copy of opensocial-jquery.autoHeight.js. Inside the ready event, add the autoHeight method to window object:
<script type="text/javascript" src="opensocial-jquery.js"></script>
<script type="text/javascript" src="opensocial-jquery.autoHeight.js"></script>
<script type="text/javascript">
$(document).ready(function() {
  $(window).autoHeight();
});
</script>
Featured Video



Downloads

You can download it from the featured downloads list.
http://code.google.com/p/opensocial-jquery/downloads/list

gadgets.window.adjustHeight で、確実に !? ガジェットの高さを自動調整する方法

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

Gadgets API の gadgets.window.adjustHeight を使うと、ガジェットの高さを自動調整できますが、実際のところは、画像のロードタイミングや、ブラウザごとに仕組みの異なる gadgets.rpc が影響して、期待どおりの高さに自動調整されないことが多々あります。

で、今までいろいろ試してきましたが、現在は、次のとおり、周期的に高さを自動調整して、期待する高さを保つという方法がもっとも確実であるという結論です。
setInterval(function() { gadgets.window.adjustHeight(); }, 1000);
また OpenSocial jQuery だと、次のようになります。
setInterval(function() { $(window).adjustHeight(); }, 1000);
1秒間隔で、ガジェットの高さの自動調整を試みています。gadgets.window.adjustHeight のソースコードを調べたところ、ガジェットの高さに変化のないときは、コンテナと RPC 通信せずに何もしないようになっていたので、1秒間隔くらいで gadgets.window.adjustHeight を呼び出しても、それほどコストはかかりません。

1秒間隔なので、高さが自動調整されるのがひと呼吸遅いかなという感じがあったり、頻繁に高さが変わるようなガジェットだと、ペコペコ高さが変わって見苦しいこともありますが、高さが自動調整されないという最悪の結果は回避できます。

-- 2009-11-28 追記

上記のガジェットの高さを自動調整し続ける... をプラグインとして公開しました。公式サイトからダウンロードして使ってください。

OpenSocial jQuery autoHeight 1.0.0 (opensocial-jquery.autoHeight.js)
http://code.google.com/p/opensocial-jquery/

使い方は、次のとおり opensocial-jquery.autoHeight.js をロードして、はじめに1度だけ window オブジェクトに対して autoHeight を呼び出すだけです。
<script type="text/javascript" src="opensocial-jquery.min.js"></script>
<script type="text/javascript" src="opensocial-jquery.autoHeight.js"></script>
<script type="text/javascript">
$(document).ready(function() {
  $(window).autoHeight();
});
</script>
ガジェットXMLの実例を用意しました。
http://opensocial-jquery.googlecode.com/svn/trunk/tests/opensocial-jquery.autoHeight.test.xml

ガジェットXMLを gooホームにも登録しましたので、体験してみてください。
http://sandbox.home.goo.ne.jp/gadget/N43bmJWwmt18/detail

ガジェットXMLが動作する様子を動画にしました。文章のフォントサイズを変更すると、その変化に応じて、ガジェットの高さが自動調整されることが見て分かります。

2009-10-12

opensocial-jquery based on jQuery 1.3.2 is available

Hello,

My name is Nobuhiro Nakajima, Japanese programmer.

I'm afraid my expressions may be rude or hard to read, because I'm not so good at English. But please, please be patient! I will try hard to learn English!

opensocial-jquery based on jQuery 1.3.2 is available:
http://code.google.com/p/opensocial-jquery/

opensocial-jquery is jQuery based concise JavaScript Library for rapid OpenSocial Applications development.

opensocial-jquery is designed to change the way that you write OpenSocial Applications When you use it, you can develop OpenSocial Applications by the method of developing the website by jQuery.

Therefore OpenSocial JavaScript API is good, Lightweight JavaScript API is better, and opensocial-jquery is best.

opensocial-jquery 1.3.2.5

* The opensocial-jquery 1.3.2.5 is based on jQuery 1.3.2 (courtesy of @lackac @jonca.rafal)
* The function of this release is the same as opensocial-jquery 1.0.5

opensocial-jquery 1.2.6.5

* The opensocial-jquery 1.2.6.5 is based on jQuery 1.2.6.
* The function of this release is the same as opensocial-jquery 1.0.5.
* This release is supported but is not currently the recommended release for jQuery 1.2.6.

Changelog

* issue #18
* issue #20

Thank you.

お待たせしました。jQuery 1.3.2 ベースの opensocial-jquery をリリースしました。

こんにちは。なかじまんです。

お待たせしました。jQuery 1.3.2 版の opensocial-jquery をリリースしました。

OpenSocial JavaScript API is good, Lightweight JavaScript API is better, and opensocial-jquery is best.
http://code.google.com/p/opensocial-jquery/

opensocial-jquery 1.3.2.5

jQuery 1.3.2 ベースの opensocial-jquery です。機能は jQuery 1.2.6 ベースである opensocial-jquery 1.0.5 とまったく同じです。

opensocial-jquery 1.2.6.5

jQuery 1.2.6 ベースの opensocial-jquery です。機能は jQuery 1.2.6 ベースである opensocial-jquery 1.0.5 とまったく同じです。

このとおり、バージョン番号の体系を見直して振り直しています。上位 3桁はベースとなる jQuery のバージョンを、末尾 1桁は opensocial-jquery のバージョンを表すようにしました。

今後もしばらくは jQuery 1.3.2 ベースと jQuery 1.2.6 ベースの両方とも提供していく予定ですが、状況によっては jQuery 1.2.6 ベースをサボることも考えています。ですので、何かタイミングがありましたら jQuery 1.3.2 ベースへの移行をおすすめします。

opensocial-jquery 1.3.2.5 は @lackac と @jonca.rafal からソースコードの提供を受けてリリースすることができました。ありがとうございました。

2009-09-05

opensocial-jquery 1.0.5 をリリースしました。OAuth リクエストと認証、Album と MediaItem の取得、People と AppData の同時取得に対応しました。

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

opensocial-jquery 1.0.5 をリリースしました。今回のリリースは、OAuth リクエストと認証、アルバムと写真の取得、プロフィールとアプリデータの同時取得という 3つの対応が柱です。

OAuth リクエストと認証

jQuery.ajax を使って、OAuth リクエストを認証して、外部ホストからデータを取得したり送信したりできるようにしました。

gooホームのガジェットから FriendFeed にメッセージを投稿する サンプルのソースコードと解説 を用意していますので、ソースコードの雰囲気を体感してみてください。また、このガジェットが動作する様子をキャプチャして動画にしましたので、再生してみてください。



jQuery.ajax を使って、リクエストを OAuth 認証して、外部ホストにデータを送信できます。
  $.ajax({
type: 'post',
url: 'http://friendfeed-api.com/v2/entry',
data: { body: 'Say Hello!' },
dataType: 'json',
oauth: 'friendfeed',
success: function(data, status) {
console.info(data, status);
},
error: function(xhr, status, e) {
if (status == 'oauth')
$('<a href="#signin"/>')
.text('Sign in with FriendFeed')
.click(function() {
$.oauth('friendfeed', function() {});
return false;
})
.minimessage();
console.error(xhr, status, e);
}
});
このとき、jQuery.ajax の oauth オプションに、ガジェットXML の OAuth/Service@name を指定します。
  <OAuth>
<Service name="friendfeed">
<Request url="https://friendfeed.com/account/oauth/request_token"
param_location="uri-query"/>
<Authorization url="https://friendfeed.com/account/oauth/authorize"/>
<Access url="https://friendfeed.com/account/oauth/access_token"
param_location="uri-query"/>
</Service>
</OAuth>
jQuery.ajax は OAuth リクエストの認証を必要とするとき、エラーイベントをコールバックします。このとき status は oauth を表します。続けて jQuery.oauth を使って OAuth リクエストを認証できます。このとき、指定した OAuth/Service@name の認証ページをポップアップウィンドウで開きます。OAuth 認証してポップアップウィンドウを閉じると、コールバックしますので、その中から処理を再開できます。

詳しくは API リファレンス を見てください。なお OAuth リクエストと認証は gooホームでのみ動作確認しています。今後、他のコンテナでも動作確認をしつつ対応を進めていきます。

アルバムリストの取得

jQuery.ajax を使って VIEWER の アルバムリストを取得できます。
  $.ajax({
url: '/albums/@viewer/@self',
data: {},
dataType: 'data',
success: function(albums) {
$.each(albums, function(i, album) {
console.info(album.id);
console.info(album.title);
console.info(album.description);
console.info(album.thumbnailUrl);
console.info(album.ownerId);
console.info(album.mediaItemCount);
});
},
error: function(xhr, status, e) {
console.error(xhr, status, e);
}
});
詳しくは API リファレンス を見てください。なお、アルバムリストの取得は orkut 仕様に準じていて orkut のみで動作確認をしています。mixi での動作確認はしていませんので、フィードバックを期待してます。

アルバムの写真リストの取得

jQuery.ajax を使って VIEWER の アルバムの写真リストを取得できます。URL でアルバムID を指定します。
  $.ajax({
url: '/mediaitems/@viewer/@self/1251149609611',
data: {},
dataType: 'data',
success: function(mediaitems) {
$.each(mediaitems, function(i, mediaitem) {
console.info(mediaitem.id);
console.info(mediaitem.url);
console.info(mediaitem.title);
console.info(mediaitem.description);
console.info(mediaitem.thumbnailUrl);
console.info(mediaitem.albumId);
});
},
error: function(xhr, status, e) {
console.error(xhr, status, e);
}
});
詳しくは API リファレンス を見てください。なお、写真リストの取得は orkut 仕様に準じていて orkut のみで動作確認をしています。mixi での動作確認はしていませんので、フィードバックを期待してます。

プロフィールとアプリデータの同時取得

プロフィールや友達リストを取得するとき、appData パラメータを指定して、アプリケーションのデータを同時に取得できます。アプリケーションのデータ項目はカンマ区切りで指定します。

今までは、プロフィールや友達リストの取得と、アプリケーションのデータの取得が別々の 2段構えでしたが、これが 1回の jQuery.ajax で取得できるようになりますので、さらにソースコードがシンプルになるのではと期待しています。
  $.ajax({
url: '/people/@viewer/@self',
data: { appData: 'comment,feeling' },
dataType: 'data',
success: function(people) {
var person = people[0];
console.info(person.appData.comment);
console.info(person.appData.feeling);
},
error: function(xhr, status, e) {
console.error(xhr, status, e);
}
});
詳しくは API リファレンス を見てください。

質問や不具合の報告などのフィードバックは大歓迎です。また、修正パッチや拡張コードの提供も歓迎します。

海外の方から opensocial-jquery 1.0.4 や 1.0.5 を jQuery 1.3.2 に書き直したものの提供も受けています。近いうちに公開しますので、もう少しお待ちください。

追記です。jQuery.param のエンコード方法を書き換えました。今までは、空白を + にエンコードしていましたが、これを %20 でエンコードするようにしました。おそらく影響はないと思いますが、お伝えしておきます。

追記です。@datoka さん。フィードバックありがとうございました。
@datoka @nakajiman opensocial jquery v1.0.5 album, mediaitemともmixiで動いております!パラメータ指定は(元々)無視されますが

2009-08-20

opensocial-jquery と Google Gadget Editor を使って iGoogle production でガジェットを開発しよう

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

2009年8月12日 米国の iGoogle は OpenSocial に正式対応しました。残念ながら日本はまだですが、近いうちに対応することが予想できます。なので、今後 iGoogle に向けた OpenSocial ガジェット (アプリ) の開発も広がってくるでしょう。

もちろん opensocial-jquery も iGoogle を熱烈サポートしていきます。なんたって最終的には全世界がターゲットになるのですからね。そこで iGoogle を使った opensocial-jquery のチュートリアルを用意しました。Google アカウントさえあれば WEB ブラウザ 1つだけで体験できる構成にしています。

それではチュートリアルをはじめます。

はじめに iGoogle (米国) http://www.google.com/ig?hl=en にログインしてください。



続けて iGoogle に Developer Gadget を追加してください。



続けて iGoogle に Google Gadget Editor を追加してください。そして Hello, world! ガジェットのソースコードが表示されるのを確認してください。



Google Gadget Editor で File メニューから Save を選択してください。続けて playground.xml と入力して OK ボタンをクリックし、Hello, world! ガジェットを保存してください。



playground.xml の URL を確認します。playground.xml のリンクを開いてください。



このときの playground.xml の URL を手元に控えてください。次のような URL になるはずです。数値の部分は各自によって異なります。

http://hosting.gmodules.com/ig/gadgets/file/(数値)/playground.xml

Developer Gadget で、手元に控えた playground.xml の URL を入力して Add ボタンをクリックし、iGoogle にガジェットを登録してください。



iGoogle に playground.xml として保存したガジェットが表示されます。



iGoogle が playground.xml をキャッシュしないように cached チェックボックスを OFF にします。



Google Gadget Editor で playgorund.xml を赤字のとおり修正してください。そして File メニューから Save を選択して、ガジェットを保存してください。
<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="hello world example" />
<Content type="html"><![CDATA[
<form name="form">
<input type="text" name="q" />
<select name="c" />
<option value="10">10 results</option>
<option value="20">20 results</option>
<option value="30">30 results</option>
</select>
<input type="submit" value="Search">
</form>

]]></Content>
</Module>
ブラウザの更新ボタンをクリックし、ガジェットをリロードしてください。そして、検索ボックスが表示されるのを確認してください。

※ playground.xml に HTML を記述すると、そのままガジェットで表示されます。



Google Gadget Editor で playgorund.xml を赤字のとおり修正してください。そして File メニューから Save を選択して、ガジェットを保存してください。
<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="hello world example" />
<Content type="html"><![CDATA[
<form name="form">
<input type="text" name="q" />
<select name="c" />
<option value="10">10 results</option>
<option value="20">20 results</option>
<option value="30">30 results</option>
</select>
<input type="submit" value="Search">
</form>
<script src="http://scripts.lrlab.to/opensocial-jquery-1.0.4.min.js"></script>
<script>
jQuery(function($) {
$(document.form).submit(function() {
alert(this.q.value + ' ' + this.c.value);
return false;
});
});
</script>

]]></Content>
</Module>
ブラウザの更新ボタンをクリックし、ガジェットをリロードしてください。そしてSearch ボタンをクリックし、入力内容が alert 表示されるのを確認してください。

※ opensocial-jquery は http://scripts.lrlab.to/opensocial-jquery-1.0.4.min.js のアドレスで配信しています。詳しくは opensocial-jquery on the cloud を見てください。
※ playground.xml に JavaScript を記述すると、そのままガジェットで実行されます。



Google Gadget Editor で playgorund.xml を赤字のとおり修正してください。そして File メニューから Save を選択して、ガジェットを保存してください。
<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="hello world example" />
<Content type="html"><![CDATA[
<form name="form">
<input type="text" name="q" />
<select name="c" />
<option value="10">10 results</option>
<option value="20">20 results</option>
<option value="30">30 results</option>
</select>
<input type="submit" value="Search">
</form>
<div id="videos"></div>
<script src="http://scripts.lrlab.to/opensocial-jquery-1.0.4.min.js"></script>
<script>
jQuery(function($) {
$(document.form).submit(function() {
var url = 'http://gdata.youtube.com/feeds/videos';
var data = { alt: 'json',
vq: this.q.value,
'max-results': this.c.value
};
$.getJSON(url, data, function(json) {
$.each(json.feed.entry, function() {
$('<img />')
.attr('src', this.media$group.media$thumbnail[0].url)
.appendTo('#videos');
});
});

return false;
});
});
</script>
]]></Content>
</Module>
ブラウザの更新ボタンをクリックし、ガジェットをリロードしてください。そして Search ボタンをクリックし、入力内容にしたがって YouTube から動画を検索し、サムネイルがリスト表示されるのを確認してください。

※ opensocial-jquery は jQuery の Ajax API をクロスドメイン対応に拡張します。
※ YouTube の動画検索は YouTube Data API を使っています。



Google Gadget Editor で playgorund.xml を赤字のとおり修正してください。そして File メニューから Save を選択して、ガジェットを保存してください。
<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="hello world example">
<Require feature="dynamic-height" />
</ModulePrefs>

<Content type="html"><![CDATA[
<form name="form">
<input type="text" name="q" />
<select name="c" />
<option value="10">10 results</option>
<option value="20">20 results</option>
<option value="30">30 results</option>
</select>
<input type="submit" value="Search">
</form>
<div id="videos"></div>
<script src="http://scripts.lrlab.to/opensocial-jquery-1.0.4.min.js"></script>
<script>
jQuery(function($) {
$(document.form).submit(function() {
var url = 'http://gdata.youtube.com/feeds/videos';
var data = { alt: 'json',
vq: this.q.value,
'max-results': this.c.value
};
$.getJSON(url, data, function(json) {
$.each(json.feed.entry, function() {
$('<img />')
.attr('src', this.media$group.media$thumbnail[0].url)
.appendTo('#videos');
});
});
$(window).adjustHeight();
return false;
});
});
</script>
]]></Content>
</Module>
ブラウザの更新ボタンをクリックし、ガジェットをリロードしてください。そして Search ボタンをクリックし、サムネイルの数に応じて、ガジェットの高さが自動調整されるのを確認してください。

※ playground.xml に <Require feature="dynamic-height"> を記述すると、jQuery.fn.adjustHeight がロードされます。



Google Gadget Editor で playgorund.xml を赤字のとおり修正してください。そして File メニューから Save を選択して、ガジェットを保存してください。
<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="hello world example">
<Require feature="dynamic-height" />
</ModulePrefs>
<Content type="html"><![CDATA[
<style>
#videos img { margin: 2px; width: 80px; hegith: 60px; }
</style>

<form name="form">
<input type="text" name="q" />
<select name="c" />
<option value="10">10 results</option>
<option value="20">20 results</option>
<option value="30">30 results</option>
</select>
<input type="submit" value="Search">
</form>
<div id="videos"></div>
<script src="http://scripts.lrlab.to/opensocial-jquery-1.0.4.min.js"></script>
<script>
jQuery(function($) {
$(document.form).submit(function() {
var url = 'http://gdata.youtube.com/feeds/videos';
var data = { alt: 'json',
vq: this.q.value,
'max-results': this.c.value
};
$.getJSON(url, data, function(json) {
$.each(json.feed.entry, function() {
$('<img />')
.attr('src', this.media$group.media$thumbnail[0].url)
.appendTo('#videos');
});
});
$(window).adjustHeight();
return false;
});
});
</script>
]]></Content>
</Module>
ブラウザの更新ボタンをクリックし、ガジェットをリロードしてください。そして Search タンをクリックし、CSS が適用されるのを確認してください。

※ playground.xml に CSS を記述すると、そのままガジェットで適用されます。



これでチュートリアルはおしまいです。

これ以降は opensocial-jquery のドキュメント を参照してください。その中で質問や要望が出てきましたら、お気軽にコメントください。

2008-12-14

iGoogle サンドボックスは、ガジェットのソースコードによって環境を切り替えることで互換性を保っている!?



iGoogle サンドボックスは、ガジェットのソースコードの内容から、旧仕様のガジェットか、新仕様のガジェットかを判別して、それぞれ異なる環境で動作させるようです。

次のガジェットを iGoogle サンドボックスに追加しても、gadgets.util.* といった Gadgets API が取り込まれません。ガジェットをレンダリングする iframe の中身を確認すると、旧仕様のガジェット(現在の iGoogle)と同じ環境に見えます。

<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="gadgets.util.registerOnLoadHandler">
</ModulePrefs>
<Content type="html"><![CDATA[
<script type="text/javascript">
_IG_RegisterOnloadHandler(function() {});
</script>
]]></Content>
</Module>

しかし、次のガジェットを iGoogle サンドボックスに追加すると、状況が一変し、gadgets.util.* といった Gadgets API が取り込まれます。ガジェットをレンダリングする iframe の中身を確認すると、新仕様のガジェット(Opensocial 系コンテナ)に近い環境になっているように見えます。

<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="gadgets.util.registerOnLoadHandler">
</ModulePrefs>
<Content type="html"><![CDATA[
<script type="text/javascript">
gadgets.util.registerOnLoadHandler(function() {});
</script>
]]></Content>
</Module>

旧仕様と新仕様の切り替わる接点を調べてみましたが、Content 要素の内容が影響していました。次のとおり、Gadgets API を部分的 "gadgets.ut" に含めると、新仕様の環境に切り替わります。

<Content type="html"><![CDATA[
<script type="text/javascript">
//gadgets.ut
</script>

しかし、次のとおり、"gadgets.u" とすると、旧仕様の環境に切り替わります。

<Content type="html"><![CDATA[
<script type="text/javascript">
//gadgets.u
</script>

開発上の都合から、ガジェットのソースコードをすべて外部ファイルに追い出そうと試みたのですが、なぜか iGoogle サンドボックスだけ動作しなかったため、この事象に気がつきました。

iGoogle サンドボックスで Gadgets API を使うときは、Content 要素に Gadgets API を使ってるぞと判別できるような断片を含めておく必要があるみたいです。iGoogle は1つの環境で、新旧の互換性を確保するに至っていないということでしょうかね!?