メモ代わり。てきとーに。 いや、ですからてきとーですって。 2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。

2009年7月10日金曜日

2009年7月8日水曜日

[Apache Shindig][お勉強][OpenSocial] メモ46 @appって何さ

JavaScriptのコードを読んでいると、


JsonRpcContainer.prototype.newUpdatePersonAppDataRequest = function(key,
value) {
var rpc = { method : "appdata.update" };
rpc.params = {userId: ["@viewer"], groupId: "@self"};
rpc.params.appId = "@app";
rpc.params.data = {};
rpc.params.data[key] = value;
rpc.params.fields = key;
return new JsonRpcRequestItem(rpc);
};
 

にあるとおり、@appとか@viewerとか@selfとか出てくる。
@viewerと@selfはセレクタと呼ばれていて、集合を表す、というところまでは分かったけど、
@appって何さ。

と思って、Java側のソースを読んでみた。

すると、

./java/common/src/main/java/org/apache/shindig/protocol/BaseRequestItem.java
 

に、

public String getAppId() {
String appId = getParameter(APP_ID);
if (appId == null || appId.equals(APP_SUBSTITUTION_TOKEN)) {
return token.getAppId();
} else {
return appId;
}
}
 

な感じの記述がある。
APP_SUBSTITUTION_TOKENは"@app"という文字列。
tokenはSecurityTokenオブジェクト。
ということで、
値に@appがあるとSecurityTokenで指定されているappIdに置換されると。

なるほどー。
.

2009年7月7日火曜日

[Apache Shindig][お勉強][OpenSocial] メモ45 featureにjqueryを追加してみる

なんとなく、OpenSocial無視な感じだけど、
featureにjqueryを追加してみた。

ディレクトリfeaturesの下にjqueryというディレクトリを追加して、
そのjqueryディレクトリの下にjquery-1.3.2.jsを置く。
で、jqueryディレクトリの下にfeature.xmlを用意。
内容は、


<?xml version="1.0"?>
<feature>
<name>jquery</name>
<gadget>
<script src="jquery-1.3.2.js"></script>
</gadget>
</feature>
 

な感じ。
で、
features/features.txtに

features/jquery/feature.xml

という行を追加と。

これでtomcatを再起動すればOK。
ModulePrefsのRequreに指定しなくても読み込ませたいなら、
適当なところのfeature.xmlに

<dependency>jquery</dependency>
 

を追加しておけば読み込んでくれるようになる。

ところで、featuresディレクトリ以下にはopt.jsと.jsが用意されていて、
.opt.jsが無ければ.jsを読み込みにいくようにソースはなっているような気がするものの、
なぜだか.opt.jsが無ければ読み込んでくれない。。

だもんで、
jquery-1.3.2.jsをコピーして、jquery-1.3.2.opt.jsを作っておいておく。
本当ならCompressしておくんだけどとりあえず。

そんだけ。
.

[Apache Shindig][お勉強][OpenSocial] メモ44 opensocial.requestPermission()のいんちき実装

とりあえず、opensocial.requestPermission()のいんちきな実装をしてみた。


opensocial.Container.prototype.requestPermission = function(permissions, reason,
opt_callback) {
if (opt_callback) {
if (window.confirm("ガジェットがあなたのプロフィール情報の使用許可を求めています。\n【理由】" + reason + "\nここで許可するとあなたの全プロフィール情報が利用可能になります。許可しますか?")) {
opt_callback(new opensocial.ResponseItem(
null, null, false, null));
}
else {
opt_callback(new opensocial.ResponseItem(
null, null, opensocial.ResponseItem.Error.FORBIDDEN, null));
}
}
};
 

な感じ。
opt_callbackの中で、きっとPersonオブジェクトへのアクセスがあったりするに違いない。違った。
confirmで「はい」が押下されたら、サーバ側へ許可されたことを教えないとだめかも。
Personオブジェクトへのアクセスで拒絶されちゃうかもしれないので。
ま、その辺はコンテナ実装依存か。

で、ガジェットは

<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="opensocial.requestPermission()">
<Require feature="opensocial-0.8" />
</ModulePrefs>
<Content type="html"><![CDATA[
<h1>opensocial.requestPermission()</h1>
<div id='env'></div>
<script type="text/javascript">

opensocial.requestPermission([opensocial.Permission.VIEWER],
"理由とか",
function(/*pensocial.ResponseItem*/res) {
if (res.hadError()) {
/* エラーだったよ */
switch(res.getErrorCode()) {
case opensocial.ResponseItem.Error.NOT_IMPLEMENTED:
alert("NOT IMPLEMENTEDだってさ");
break;
case opensocial.ResponseItem.Error.FORBIDDEN:
alert("FORBIDDENだってさ");
break;
default:
alert(res.getErrorMessage() + "だってさ");
break;
}
}
else {
alert("うまくいったっぽいよ");
}
});
</script>
]]>
</Content>
</Module>
 

な感じ。
.

2009年7月6日月曜日

[Apache Shindig][お勉強][OpenSocial] メモ43 features/features.txtの'+'

Shindigについている


features/features.txt
 

で、コンテナの提供するfeature(<Require feature="opensocial-0.8" />とかのfeature)を
定義できるんだけど、
このファイルの10行目に、

+gms_features/i18n/feature.xml
 

と、先頭に'+'が付いている!

これは何だ?と思ってソースみてたら、

./java/gadgets/src/main/java/org/apache/shindig/gadgets/JsFeatureLoader.java
 

の97行目に、

for(String resource : StringUtils.split(ResourceLoader.getContent(location), "[\r\n]+")) {
 

と書いてある。StringUtils.splitの第二引数だけど、
最初、commons-langのStringUtilsでは正規表現でも指定するのかと思ったので
見逃していたが、これって、
デリミタとして"[\r\n]+"の何れかの文字ってことになるので、
'['か']'か'\r'か'\n'か'+'の文字でsplitするって意味。

これ書いた人はきっと正規表現をイメージしていないかなぁ。。なんて思ってしまうんだけど
どうなんだろう。

結局のところ、features.txtの

+gms_features/i18n/feature.xml
 

の先頭の'+'は、ただ単にセパレータで、特に意味は無いっぽい・・。
見やすさ??何かを伝えている??

うーむ。。

.

2009年7月5日日曜日

[Apache Shindig][お勉強][OpenSocial] メモ42 opensocial.requestPermission()

opensocial.requestPermission()


hasPermissionを見たので、requestPermissionを見てみる。

requestPermissionは、


指定した許可へのアクセス権を付与するようにユーザーに要求します。
 

とのこと。shindigデフォルトではfalseが返ってくるようなので、
これを使って権限を付与すればよいらしい。

とりあえずコールしてみる。

<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="opensocial.requestPermission()">
<Require feature="opensocial-0.8" />
</ModulePrefs>
<Content type="html"><![CDATA[
<h1>opensocial.requestPermission()</h1>
<div id='env'></div>
<script type="text/javascript">

opensocial.requestPermission([opensocial.Permission.VIEWER],
"理由とか",
function(/*pensocial.ResponseItem*/res) {
if (res.hadError()) {
/* エラーだったよ */
switch(res.getErrorCode()) {
case opensocial.ResponseItem.Error.NOT_IMPLEMENTED :
alert("NOT IMPLEMENTEDだってさ");
break;
default:
alert(res.getErrorMessage() + "だってさ");
break;
}
}
else {
alert("うまくいったっぽいよ");
}
});
alert(opensocial.hasPermission(opensocial.Permission.VIEWER));

</script>
]]>
</Content>
</Module>
 

ってなコードを書いた。

で実行すると、「"NOT IMPLEMENTEDだってさ"」が表示される。
さて、これをShindigで動かすにはどうするか。

hasPermissionと同様、デフォルトでは、

opensocial.Container.prototype.requestPermission = function(permissions, reason,
opt_callback) {
if (opt_callback) {
window.setTimeout(function () {
opt_callback(new opensocial.ResponseItem(
null, null, opensocial.ResponseItem.Error.NOT_IMPLEMENTED, null));
}, 0);
}
};
 

となっているんで、必ずNOT_IMPLEMENTEDが返る模様。

サンプル実装をちょっとだけ探してみたけど、うーむ、見つからない。。

samplecontainerでは、osapiのrequestPermissionは見つけたけど。
自由に実装していいのかしらん。

--
コンテナ依存ぽい。
誰が個人情報を取得していいのか、とか、面倒そうな部分。

--
そもそも、opensocial.hasPermission(opensocial.Permission.VIEWER)でtrueが返ってきた場合、
何を意味するのかいまいち理解できてない。。

「VIEWERのPersonオブジェクトへのアクセス権が、本Gadgetに付与されている」

ということでよいのかどうか。。

--
理解が間違ってた。。
requestPermissionがコールされると、ユーザ(VIEWER)に対して、
Personオブジェクトへのアクセス権を付与してください、
的な要求をする、
という感じっぽい。

だから、アクセス権限をつけてね、とダイアログとか表示するのかも。
ぜんぜん違う?

--
http://developer.home.goo.ne.jp/document/%E5%8F%8B%E9%81%94%E6%83%85%E5%A0%B1%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B
を見ると、上記の理解で合っているっぽい。
このページは分かりやすい。さすが。

.

[Apache Shindig][お勉強][OpenSocial] メモ41 opensocial.hasPermission()

opensocial.hasPermission()

説明書きによると、


指定した許可へのアクセス権が現在のガジェットに付与されている場合は true を返します。
 

とのこと。
パラメータは、

opensocial.Permission
 



うーむ。opensocial.Permissionを見ると、
VIEWERしかフィールドが無い。


opensocial.hasPermission(opensocial.Permission.VIEWER);
 

として使うっぽい。
これで、閲覧者(VIEWER)はアクセス権限があるかどうか問い合わせることができる。

ということでやってみる。

<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="opensocial.hasPermission()">
<Require feature="opensocial-0.8" />
</ModulePrefs>
<Content type="html"><![CDATA[
<h1>opensocial.hasPermission()</h1>
<div id='env'></div>
<script type="text/javascript">

alert(opensocial.hasPermission(opensocial.Permission.VIEWER));

</script>
]]>
</Content>
</Module>
 

なんてなGadgetを作って実行してみると、、
falseってalertが表示される。
falseが返ってくる場合は、何かしらのリクエストをGadgetから投げると、

opensocial.ResponseItem.Error.UNAUTHORIZED
 

が返ってくるらしい。
意味的には、VIEWERの情報を取得できるかどうか、なんですかね。
falseの場合には、アクセス権限を求めることができるらしい。
opensocial.requestPermission()というものを使うとのこと。

container.jsにもコメントでrequestPermissionと書いてあるが、
関係があるかどうかはまだソース読んでいないのでわからない。

--
デフォルトでは、

opensocial.Container.prototype.hasPermission = function(permission) {
return false;
};
 

となっているので、必ずfalse。
コンテナを実装するにあたって、実装しなければならないメソッドらしい。

.

[Apache Shindig][お勉強][OpenSocial] メモ40 opensocial.getEnvironment()

opensocial.getEnvironment()には、2つのメソッドが用意されている。

1つはgetDomain()で、
もうひとつはsupportsField()。

getDomainは現コンテナのドメインを返すっぽい。
supportsFieldは、今稼働中のコンテナで、あるオブジェクトタイプの、あるフィールドが対応しているかどうかを見るときに使うらしい。

ということで、
Apache Shindigのデフォルトで、オブジェクトタイプPersonの0.8.1における全フィールドを
対応しているかどうかチェック(というかtrue/falseで表示するだけ)のカスプログラムを書いてみた。


<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="getEnvironment() Person">
<Require feature="opensocial-0.8" />
</ModulePrefs>
<Content type="html"><![CDATA[
<h1>Person</h1>
<div id='env'></div>
<script type="text/javascript">

var env = opensocial.getEnvironment();

var str = '';

/*=========================================================================*/
/* 個人に関する一般的な説明です。文字列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.ABOUT_ME + '<br />'
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.ABOUT_ME) + '<br />';

/*=========================================================================*/
/* 個人のお気に入りのアクティビティです。文字列の配列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.ACTIVITIES + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.ACTIVITIES) + '<br />';

/*=========================================================================*/
/* 個人に関連する住所です。Address の配列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.ADDRESSES + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.ADDRESSES) + '<br />';

/*=========================================================================*/
/* 個人の年齢です。数値として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.AGE + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.AGE) + '<br />';

/*=========================================================================*/
/* 個人の身体的特徴です。opensocial.BodyType として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.BODY_TYPE + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.BODY_TYPE) + '<br />';

/*=========================================================================*/
/* 個人のお気に入りの本です。文字列の配列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.BOOKS + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.BOOKS) + '<br />';

/*=========================================================================*/
/* 個人のお気に入りの車です。文字列の配列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.CARS + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.CARS) + '<br />';

/*=========================================================================*/
/* 個人の子供の説明です。文字列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.CHILDREN + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.CHILDREN) + '<br />';

/*=========================================================================*/
/* 個人の現住所です。Address として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.CURRENT_LOCATION + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.CURRENT_LOCATION) + '<br />';

/*=========================================================================*/
/* 個人の生年月日です。Date オブジェクトとして指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.DATE_OF_BIRTH + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.DATE_OF_BIRTH) + '<br />';

/*=========================================================================*/
/* 個人の飲酒状況です。opensocial.Enum として指定します。 */
/* Enum のキーは opensocial.Enum.Drinker を参照します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.DRINKER + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.DRINKER) + '<br />';

/*=========================================================================*/
/* 個人のメール アドレスです。Email の配列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.EMAILS + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.EMAILS) + '<br />';

/*=========================================================================*/
/* 個人の人種です。文字列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.ETHNICITY + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.ETHNICITY) + '<br />';

/*=========================================================================*/
/* 個人の服装に関する考えです。文字列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.FASHION + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.FASHION) + '<br />';

/*=========================================================================*/
/* 個人のお気に入りの食べ物です。文字列の配列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.FOOD + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.FOOD) + '<br />';

/*=========================================================================*/
/* 個人の性別です。opensocial.Enum として指定します。 */
/* Enum のキーは opensocial.Enum.Gender を参照します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.GENDER + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.GENDER) + '<br />';

/*=========================================================================*/
/* 個人が最も幸せなときの説明です。文字列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.HAPPIEST_WHEN + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.HAPPIEST_WHEN) + '<br />';

/*=========================================================================*/
/* 現在のアプリケーションを個人が使用したことがあるかどうかを示すブール値 */
/* です。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.HAS_APP + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.HAS_APP) + '<br />';

/*=========================================================================*/
/* 個人のお気に入りのヒーローです。文字列の配列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.HEROES + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.HEROES) + '<br />';

/*=========================================================================*/
/* 個人のユーモアに関する考えです。文字列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.HUMOR + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.HUMOR) + '<br />';

/*=========================================================================*/
/* この個人に永久に関連付けることが可能な文字列 ID です。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.ID + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.ID) + '<br />';

/*=========================================================================*/
/* 個人の興味、趣味、夢中になっていることなどです。文字列の配列として指定 */
/* します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.INTERESTS + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.INTERESTS) + '<br />';

/*=========================================================================*/
/* 個人のお気に入りの仕事、または仕事上の関心事や技能です。 */
/* 文字列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.JOB_INTERESTS + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.JOB_INTERESTS) + '<br />';

/*=========================================================================*/
/* 個人が従事している仕事です。Organization の配列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.JOBS + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.JOBS) + '<br />';

/*=========================================================================*/
/* 個人が話す言語のリストです。ISO 639-1 コードの文字列の配列として指定 */
/* します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.LANGUAGES_SPOKEN + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.LANGUAGES_SPOKEN) + '<br />';

/*=========================================================================*/
/* 個人の生活環境の説明です。文字列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.LIVING_ARRANGEMENT + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.LIVING_ARRANGEMENT) + '<br />';

/*=========================================================================*/
/* 探している人物や物事、またはどのような目的で人に会いたいかに関する個人 */
/* の説明です。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.LOOKING_FOR + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.LOOKING_FOR) + '<br />';

/*=========================================================================*/
/* 個人のお気に入りの映画です。文字列の配列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.MOVIES + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.MOVIES) + '<br />';

/*=========================================================================*/
/* 個人のお気に入りの音楽です。文字列の配列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.MUSIC + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.MUSIC) + '<br />';

/*=========================================================================*/
/* 個人の名前を含む opensocial.Name オブジェクトです。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.NAME + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.NAME) + '<br />';

/*=========================================================================*/
/* 個人の現在のネットワークの状況です。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.NETWORK_PRESENCE + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.NETWORK_PRESENCE) + '<br />';

/*=========================================================================*/
/* 個人のニックネームを表す文字列です。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.NICKNAME + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.NICKNAME) + '<br />';

/*=========================================================================*/
/* 個人のペットの説明です。文字列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.PETS + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.PETS) + '<br />';

/*=========================================================================*/
/* 個人の電話番号です。Phone の配列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.PHONE_NUMBERS + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.PHONE_NUMBERS) + '<br />';

/*=========================================================================*/
/* 個人の政治的見解です。文字列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.POLITICAL_VIEWS + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.POLITICAL_VIEWS) + '<br />';

/*=========================================================================*/
/* 個人のテーマ ソングです。opensocial.Url として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.PROFILE_SONG + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.PROFILE_SONG) + '<br />';

/*=========================================================================*/
/* 個人のプロフィールの URL です。文字列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.PROFILE_URL + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.PROFILE_URL) + '<br />';

/*=========================================================================*/
/* 個人のプロフィール ビデオです。opensocial.Url として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.PROFILE_VIDEO + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.PROFILE_VIDEO) + '<br />';

/*=========================================================================*/
/* 個人のお気に入りの台詞です。文字列の配列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.QUOTES + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.QUOTES) + '<br />';

/*=========================================================================*/
/* 個人の人間関係の状況です。文字列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.RELATIONSHIP_STATUS + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.RELATIONSHIP_STATUS) + '<br />';

/*=========================================================================*/
/* 個人の宗教または宗教観です。文字列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.RELIGION + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.RELIGION) + '<br />';

/*=========================================================================*/
/* 個人の恋愛に関する意見です。文字列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.ROMANCE + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.ROMANCE) + '<br />';

/*=========================================================================*/
/* 個人が苦手なものです。文字列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.SCARED_OF + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.SCARED_OF) + '<br />';

/*=========================================================================*/
/* 個人の出身校です。Organization の配列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.SCHOOLS + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.SCHOOLS) + '<br />';

/*=========================================================================*/
/* 個人の性指向です。文字列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.SEXUAL_ORIENTATION + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.SEXUAL_ORIENTATION) + '<br />';

/*=========================================================================*/
/* 個人の喫煙状況です。opensocial.Enum として指定します。 */
/* Enum のキーは opensocial.Enum.Smoker を参照します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.SMOKER + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.SMOKER) + '<br />';

/*=========================================================================*/
/* 個人のお気に入りのスポーツです。文字列の配列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.SPORTS + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.SPORTS) + '<br />';

/*=========================================================================*/
/* 個人の状況や特記事項です。文字列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.STATUS + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.STATUS) + '<br />';

/*=========================================================================*/
/* 個人に関する任意のタグです。文字列の配列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.TAGS + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.TAGS) + '<br />';

/*=========================================================================*/
/* 個人の写真のサムネイルの URL です。文字列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.THUMBNAIL_URL + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.THUMBNAIL_URL) + '<br />';

/*=========================================================================*/
/* 個人のタイム ゾーンです。 */
/* ローカル時間とグリニッジ標準時 (GMT) との時差を分単位で指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.TIME_ZONE + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.TIME_ZONE) + '<br />';

/*=========================================================================*/
/* 個人がうんざりすることです。文字列の配列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.TURN_OFFS + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.TURN_OFFS) + '<br />';

/*=========================================================================*/
/* 個人が興奮することです。文字列の配列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.TURN_ONS + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.TURN_ONS) + '<br />';

/*=========================================================================*/
/* 個人のお気に入りのテレビ番組です。文字列の配列として指定します。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.TV_SHOWS + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.TV_SHOWS) + '<br />';

/*=========================================================================*/
/* ウェブページやフィードなど、個人に関連する URL です。 */
/*=========================================================================*/
str = str + '  ' + opensocial.Person.Field.URLS + '<br />';
str = str + '    ' + env.supportsField(opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.URLS) + '<br />';

document.getElementById('env').innerHTML = str;
</script>
]]>
</Content>
</Module>
 


な感じ。

で?

というか、なんかすごい項目が・・。SNS作る人は面倒そうだ・・。

.