The group you are posting to is a
Usenet group . Messages posted to this group will make your email address visible to anyone on the Internet.
Your reply message has not been sent.
Your post was successful
From:
lihouxin <r58... @st.takushoku-u.ac.jp>
Date: Mon, 6 Oct 2008 21:28:25 -0700 (PDT)
Local: Tues, Oct 7 2008 12:28 am
Subject: プルグラムの件
僕はpersistent APIを利用して、以下のサンプルを作成しました。
<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="Count up!" author_email="yoich... @eisbahn.jp">
<Require feature="opensocial-0.7" />
</ModulePrefs>
<Content type="html" view="canvas"><![CDATA[
<script type="text/javascript">
var value = ["a","b","c","d","e","f","g"];
function init() {
var req = opensocial.newDataRequest();
req.add(req.newFetchPersonRequest(opensocial.DataRequest.PersonId.VIEWER),
"viewer");
req.add(req.newFetchPersonAppDataRequest(opensocial.DataRequest.PersonId.VI EWER,
"value"), "data");
req.send(function(response) {
var viewer = response.get("viewer").getData();
if (viewer) {
var data = response.get("data").getData()[viewer.getId()];
value = data ? data["value"] : value;
document.getElementById("value").innerHTML = value;
} else {
document.getElementById("block").innerHTML = "Please install this
application.";
}
});
}
function onClick() {
var req = opensocial.newDataRequest();
value[6]=value[5];
value[5]=value[4];
value[4]=value[3];
value[3]=value[2];
value[2]=value[1];
value[1]=value[0];
value[0]="aa";
req.add(req.newUpdatePersonAppDataRequest(opensocial.DataRequest.PersonId.V IEWER,
"value", value));
req.send(function(response) {
document.getElementById("value").innerHTML = value;
});
}
gadgets.util.registerOnLoadHandler(init);
</script>
<div id="block">
Value: <span id="value"></span>
<button onclick="onClick();">chang</button>
</div>
]]></Content>
</Module>
内容として配列7つがあって、ボタンを押して、文字一つずつをなくして、配列の先頭が”aa”入れるというプルグラムを作成するつもりです。でも、再ロ
グインすると、変な表示ができて、因みに、ボタンを押しでも、表示ができなくなる。
その理由はなんでしょうか。Persistent APIが配列が利用できないでしょうか?
もし、配列が利用できるなら、僕のプルグラムがどういう風に修正すればよいでしょうか?
お願いします
You must
Sign in before you can post messages.
You do not have the permission required to post.
From:
よういちろう <yoich... @eisbahn.jp>
Date: Mon, 6 Oct 2008 23:56:56 -0700 (PDT)
Local: Tues, Oct 7 2008 2:56 am
Subject: Re: プルグラムの件
よういちろう です。
OpenSocial v0.7では、Persistence APIにて永続化する情報は、予め文字列に変換しておく
必要があります。つまり、永続化したい情報が配列の場合は、それを一旦文字列に変換した後
に、newUpdatePersonAppDataRequest()関数に指定する必要があります。
詳しくは、以下の記事をご覧ください。
[AppData APIは文字列を扱います(v0.7)]
http://groups.google.co.jp/group/opensocial-japan/browse_thread/threa...
それと、author_email属性に私のメールアドレスを指定するのは止めてください。
ご参考になれば幸いです。ではでは。
On 10月7日, 午後1:28, lihouxin <r58... @st.takushoku-u.ac.jp> wrote:
> 僕はpersistent APIを利用して、以下のサンプルを作成しました。
> <?xml version="1.0" encoding="UTF-8"?>
> <Module>
> <ModulePrefs title="Count up!" author_email="yoich... @eisbahn.jp">
> <Require feature="opensocial-0.7" />
> </ModulePrefs>
> <Content type="html" view="canvas"><![CDATA[
> <script type="text/javascript">
> var value = ["a","b","c","d","e","f","g"];
> function init() {
> var req = opensocial.newDataRequest();
> req.add(req.newFetchPersonRequest(opensocial.DataRequest.PersonId.VIEWER),
> "viewer");
> req.add(req.newFetchPersonAppDataRequest(opensocial.DataRequest.PersonId.VI EWER,
> "value"), "data");
> req.send(function(response) {
> var viewer = response.get("viewer").getData();
> if (viewer) {
> var data = response.get("data").getData()[viewer.getId()];
> value = data ? data["value"] : value;
> document.getElementById("value").innerHTML = value;} else {
> document.getElementById("block").innerHTML = "Please install this
> application.";
> }
> });
> }
> function onClick() {
> var req = opensocial.newDataRequest();
> value[6]=value[5];
> value[5]=value[4];
> value[4]=value[3];
> value[3]=value[2];
> value[2]=value[1];
> value[1]=value[0];
> value[0]="aa";
> req.add(req.newUpdatePersonAppDataRequest(opensocial.DataRequest.PersonId.V IEWER,
> "value", value));
> req.send(function(response) {
> document.getElementById("value").innerHTML = value;
> });
> }
> gadgets.util.registerOnLoadHandler(init);
> </script>
> <div id="block">
> Value: <span id="value"></span>
> <button onclick="onClick();">chang</button>
> </div>
> ]]></Content>
> </Module>
> 内容として配列7つがあって、ボタンを押して、文字一つずつをなくして、配列の先頭が”aa”入れるというプルグラムを作成するつもりです。でも、再ロ
> グインすると、変な表示ができて、因みに、ボタンを押しでも、表示ができなくなる。
> その理由はなんでしょうか。Persistent APIが配列が利用できないでしょうか?
> もし、配列が利用できるなら、僕のプルグラムがどういう風に修正すればよいでしょうか?
> お願いします
You must
Sign in before you can post messages.
You do not have the permission required to post.
From:
lihouxin <r58... @st.takushoku-u.ac.jp>
Date: Tue, 7 Oct 2008 02:03:44 -0700 (PDT)
Local: Tues, Oct 7 2008 5:03 am
Subject: Re: プルグラムの件
よういちろう さん:
返事がありがとうございました。
author_email属性の件について、本当に申し訳ございませんでした。
上掲示している内容を良く読みましたけど、あまり理解できなくて、本当にすみませんが、僕が作成したプログラムの修正がお願いしたいですけれども、よ
ろしいでしょうか。それで、理解できるようになるかなぁ思っています。
You must
Sign in before you can post messages.
You do not have the permission required to post.
From:
よういちろう <yoich... @eisbahn.jp>
Date: Tue, 7 Oct 2008 03:46:19 -0700 (PDT)
Local: Tues, Oct 7 2008 6:46 am
Subject: Re: プルグラムの件
よういちろう です。
永続化する際には、
var value = ["1", "2", "3"];
var str = gadgets.json.stringify(value);
req.add(req.newUpdatePersonAppDataRequest(
opensocial.DataRequest.PersonId.VIEWER,
"value",
str));
というようにstringify()関数を使ってJSON形式の文字列に変換した結果を永続化します。
永続化した文字列を取得する際には、
var data = response.get("data").getData()[viewer.getId()];
var str = data["value"];
str = gadgets.util.unescapeString(str);
var value = gadgets.json.parse(str);
というように、エスケープされた文字列を元に戻し、その結果をparse()関数を使って、
配列として結果を得ます。
上記の内容を反映した結果のコード全体を以下に示します。
---
<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="test">
<Require feature="opensocial-0.7" />
</ModulePrefs>
<Content type="html" view="canvas"><![CDATA[
<script type="text/javascript">
var value = ["a","b","c","d","e","f","g"];
function init() {
var req = opensocial.newDataRequest();
req.add(req.newFetchPersonRequest(opensocial.DataRequest.PersonId.VIEWER),
"viewer");
req.add(req.newFetchPersonAppDataRequest(opensocial.DataRequest.PersonId.VI EWER,
"value"), "data");
req.send(function(response) {
var viewer = response.get("viewer").getData();
if (viewer) {
var data = response.get("data").getData()[viewer.getId()];
if (data) {
var str = data["value"];
str = gadgets.util.unescapeString(str);
value = gadgets.json.parse(str);
}
document.getElementById("value").innerHTML = value;
} else {
document.getElementById("block").innerHTML = "Please install this
application.";
}
});
}
function onClick() {
var req = opensocial.newDataRequest();
value[6]=value[5];
value[5]=value[4];
value[4]=value[3];
value[3]=value[2];
value[2]=value[1];
value[1]=value[0];
value[0]="aa";
var str = gadgets.json.stringify(value);
req.add(req.newUpdatePersonAppDataRequest(opensocial.DataRequest.PersonId.V IEWER,
"value", str));
req.send(function(response) {
document.getElementById("value").innerHTML = value;
});
}
gadgets.util.registerOnLoadHandler(init);
</script>
<div id="block">
Value: <span id="value"></span>
<button onclick="onClick();">chang</button>
</div>
]]></Content>
</Module>
---
これでよろしいでしょうか?
On 10月7日, 午後6:03, lihouxin <r58... @st.takushoku-u.ac.jp> wrote:
You must
Sign in before you can post messages.
You do not have the permission required to post.
From:
lihouxin <r58... @st.takushoku-u.ac.jp>
Date: Tue, 7 Oct 2008 04:56:33 -0700 (PDT)
Local: Tues, Oct 7 2008 7:56 am
Subject: Re: プルグラムの件
よういちろう さん:
返事がありがとうございました。
一つ不思議の事がありましたが、
> というようにstringify()関数を使ってJSON形式の文字列に変換した結果を永続化します。
別にJSON形式の文字列を変換しなくでも、結果をparse()関数を使って、上手く表示ができますか。逆にstringigy()関数を使うと上
手く動作できないですが、なぜでしょうか?
You must
Sign in before you can post messages.
You do not have the permission required to post.
From:
よういちろう <yoich... @eisbahn.jp>
Date: Tue, 7 Oct 2008 05:24:15 -0700 (PDT)
Local: Tues, Oct 7 2008 8:24 am
Subject: Re: プルグラムの件
You must
Sign in before you can post messages.
You do not have the permission required to post.
From:
"Hiroaki Kawai" <hiroaki.ka... @gmail.com>
Date: Wed, 8 Oct 2008 01:49:58 +0900
Local: Tues, Oct 7 2008 12:49 pm
Subject: Re: プルグラムの件
もちろん別に JSON 形式でなければならないということはないと思いますよ。stringifyとparseが使われているのは、これが encode/decode の対だからですね。 # unescape が入らないといけない理由は謎ですけれども。
Serialize できるものであれば、JSON でなくても構わないはずで、XML だろうと YAML だろうとバイト列だろうと、お好みの直列化方法を使えばいいでしょう。 私だったら、やはり JSON を選択すると思います。
動作しないのは別の理由でしょう。lihouxinさん、やはり言っている意味をきちんと理解するところからはじめませんか?
2008/10/07 21:24 よういちろう <yoich... @eisbahn.jp>:
> よういちろう です。
> On 10月7日, 午後8:56, lihouxin <r58... @st.takushoku-u.ac.jp> wrote:
> > 返事がありがとうございました。 > > 一つ不思議の事がありましたが、
> > > というようにstringify()関数を使ってJSON形式の文字列に変換した結果を永続化します。
> > 別にJSON形式の文字列を変換しなくでも、結果をparse()関数を使って、上手く表示ができますか。逆にstringigy()関数を使うと上 > > 手く動作できないですが、なぜでしょうか?
> 先にお送りした私のコードがOrkutにて正常に動作することを確認しています。
> http://sandbox.orkut.com/Main#Application.aspx?uid=102824917189110542...
You must
Sign in before you can post messages.
You do not have the permission required to post.
From:
よういちろう <yoich... @eisbahn.jp>
Date: Tue, 7 Oct 2008 17:51:27 -0700 (PDT)
Local: Tues, Oct 7 2008 8:51 pm
Subject: Re: プルグラムの件
よういちろう です。
kawaiさん、フォローありがとうございます。
On 10月8日, 午前1:49, "Hiroaki Kawai" <hiroaki.ka... @gmail.com> wrote:
> # unescape が入らないといけない理由は謎ですけれども。
「Persistence APIにて取得した永続化情報の利用目的は画面への表示である」という考え
のもとに、取得結果は自動的にHTMLエスケープ処理が施されています。つまり、取得結果
をそのままDOMに反映させても問題がないわけです(v0.8でも同様です)。
しかし、永続化されている情報がJSON形式の文字列だった場合、文字列を囲む「"」などの
文字がHTMLエスケープされたままでは、parse()に失敗してしまいます。よって、HTML
エスケープされた文字列を元に戻す処理、つまりunescapeString()を行う必要があるという
ことです。
上記は以下の投稿でも説明させて頂いておりますので、一読いただけると幸いです。
[AppData APIは文字列を扱います(v0.7)]
http://groups.google.co.jp/group/opensocial-japan/browse_thread/threa...
unescapeString()関数を利用する以外にも、以下のコードのようにEscapeType.NONEを
指定してHTMLエスケープを抑止する方法もあります。これであれば、unescapeString()
関数を使う必要はありません。
var escapeParams = {};
escapeParams[opensocial.DataRequest.DataRequestFields.ESCAPE_TYPE] =
opensocial.EscapeType.NONE;
req.add(req.newFetchPersonAppDataRequest(idSpec, ["value"],
escapeParams), "stored");
ご参考になれば幸いです。ではでは。
You must
Sign in before you can post messages.
You do not have the permission required to post.
From:
"Hiroaki Kawai" <hiroaki.ka... @gmail.com>
Date: Wed, 8 Oct 2008 11:15:50 +0900
Local: Tues, Oct 7 2008 10:15 pm
Subject: Re: プルグラムの件
なるほどです。謎が解けてすっきりしました。よういちろうさんありがとうございます! # 個人的には、新しいコードのほうが読みやすいです :)
PHP Smarty 用語で言うと、要は Smarty の default modifier が入った状態になってるという(ある意味おせっかい機能つき)ことですね。
# v0.8 でそのまま保存が~というのもひょっとして内部で JSON 使ってるのではないかと推測してみたり。 ## ひょっとしてネイティブオブジェクトを保存しようとすると失敗したりするのかな(するだろうな)。
2008/10/08 9:51 よういちろう <yoich... @eisbahn.jp>:
> よういちろう です。
> kawaiさん、フォローありがとうございます。
> On 10月8日, 午前1:49, "Hiroaki Kawai" <hiroaki.ka... @gmail.com> wrote:
> > # unescape が入らないといけない理由は謎ですけれども。
> 「Persistence APIにて取得した永続化情報の利用目的は画面への表示である」という考え > のもとに、取得結果は自動的にHTMLエスケープ処理が施されています。つまり、取得結果 > をそのままDOMに反映させても問題がないわけです(v0.8でも同様です)。
> しかし、永続化されている情報がJSON形式の文字列だった場合、文字列を囲む「"」などの > 文字がHTMLエスケープされたままでは、parse()に失敗してしまいます。よって、HTML > エスケープされた文字列を元に戻す処理、つまりunescapeString()を行う必要があるという > ことです。
> 上記は以下の投稿でも説明させて頂いておりますので、一読いただけると幸いです。
> [AppData APIは文字列を扱います(v0.7)]
> http://groups.google.co.jp/group/opensocial-japan/browse_thread/threa...
> unescapeString()関数を利用する以外にも、以下のコードのようにEscapeType.NONEを > 指定してHTMLエスケープを抑止する方法もあります。これであれば、unescapeString() > 関数を使う必要はありません。
> var escapeParams = {}; > escapeParams[opensocial.DataRequest.DataRequestFields.ESCAPE_TYPE] = > opensocial.EscapeType.NONE; > req.add(req.newFetchPersonAppDataRequest(idSpec, ["value"], > escapeParams), "stored");
> ご参考になれば幸いです。ではでは。
You must
Sign in before you can post messages.
You do not have the permission required to post.
From:
"Hiroaki Kawai" <hiroaki.ka... @gmail.com>
Date: Wed, 8 Oct 2008 11:29:11 +0900
Local: Tues, Oct 7 2008 10:29 pm
Subject: Re: プルグラムの件
You must
Sign in before you can post messages.
You do not have the permission required to post.
From:
よういちろう <yoich... @eisbahn.jp>
Date: Tue, 7 Oct 2008 20:21:35 -0700 (PDT)
Local: Tues, Oct 7 2008 11:21 pm
Subject: Re: プルグラムの件
You must
Sign in before you can post messages.
You do not have the permission required to post.