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

2009年6月19日金曜日

[Apache Shindig][お勉強][OpenSocial] メモ25 CookieBasedUserPrefStore3

ちょっと違う気がしたので、Shindig付属のgadgets.jsを眺めてみた。

で、その結果、


<iframe id="remote_iframe_0"
scrolling="auto" class="gadgets-gadget" style="display: block;"
frameborder="no" height="400" width="100%" name="remote_iframe_0">
</iframe>
<div id="gadget-parent" class="gadgets-gadget-parent"></div>
<script type="text/javascript">
//<![CDATA[
var gadget = gadgets.container.createGadget({id: "0",specUrl: "http://www.labpixies.com/campaigns/todo/todo.xml", secureToken: "${secureToken}"});
gadgets.container.addGadget(gadget);
gadget.setServerBase("${contextPath}/gadgets/");
$("#remote_iframe_0").attr("src", gadget.getIframeUrl());
//]]>
</script>
 

なんてな風にしてみた。

やっていることは前回と変わらないけど、
たぶん前回よりもShindigを使っている感があるかも。
$("#remote_iframe_0")ってところはjQueryで。
${secureToken}と${contextPath}はサーバ側で生成。

一応、Cookieに保存されているデータも読み込めたし、書き込める。

次は、DBに保存してみようかと。
.

2009年6月18日木曜日

[Apache Shindig][お勉強][OpenSocial] メモ24 CookieBasedUserPrefStore2

とりあえず、CookieBasedUserPrefStoreを使って、
クッキーに保存してみた。


<script type="text/javascript" src="/gadgets/js/core:rpc?debug=1"></script>
<script type="text/javascript" src="/gadgets/files/container/cookies.js?${ts}"></script>
<script type="text/javascript" src="/gadgets/files/container/util.js?${ts}"></script>
<script type="text/javascript" src="/gadgets/files/container/gadgets.js?${ts}"></script>
<script type="text/javascript" src="/gadgets/files/container/osapi.js?${ts}"></script>
<script type="text/javascript" src="/gadgets/files/container/cookiebaseduserprefstore.js?${ts}"></script>
<iframe id="remote_iframe_0" src="${iframeUrl}"
scrolling="auto" class="gadgets-gadget" style="display: block;"
frameborder="no" height="400" width="100%" name="remote_iframe_0">
</iframe>
<div id="gadget-parent" class="gadgets-gadget-parent"></div> <script type="text/javascript"> //<![CDATA[
var gadget = gadgets.container.createGadget({id: "0",specUrl: ""});
gadgets.container.addGadget(gadget);
//]]>
</script>
 

という風にしてみた。
一応これでCookieに保存できた。だけど、Cookieから読み込めない。
多分、cookiebaseduserprefstoreを使えば、Cookieから読み込めるのではないかと
思ったんだけど。。

よくわからないので、
サーバ側でCookieヘッダを読み込み、

up_
 

を頭につけて、iframeUrlにつけてみた。
これで一応は、クッキーから読み込み、以前の情報を表示できるようにはなったけど、、

なんか違う気がする。
.

[Apache Shindig][お勉強][OpenSocial] メモ23 CookieBasedUserPrefStore

ソースの


./java/server/target/classes/gadgets/files/container/cookiebaseduserprefstore.js
 

を使うことで、クッキーベースのUserPref保存機構はできるみたい。

さて、DBに保存する場合は、
上記jsを参考にgetPrefsとsavePrefsメソッドあたりを実装すればよさそうねー。
(JavaScript苦手・・・)

で、iframeを描画するときにup_<name>=<value>を渡してあげると。

.

[Apache Shindig][お勉強][OpenSocial] メモ22 自サイトと連携するにあったってしなきゃいけないこと

http://cwiki.apache.org/confluence/display/SHINDIG/The+rough+guide+to+deploying+shindig

に書かれてる。

気になるところは、


* Create a userPrefs mechanism
* Create the container pages for the different views
* Install rpc_relay.html on your site to allow communication between gadget and container javascript.
 

らへん。

userPrefs mechanismというのは、なんじゃらほい。

2番目のcontainer pagesというのを作らないと、requestNavigateToが動かないんですかね。。

.

[Apache Shindig][お勉強][OpenSocial] メモ21 setprefsがUnknown RPC service

setprefsがUnknown RPC serviceと怒られていたんだけど、


/gadgets/ifr?url=どっかの.xml
 

でレンダリングするGadgetは、iframeの中におかなくてはならなくて、
且つ、そのiframeの親側で、

<script type="text/javascript" src="/gadgets/js/core:rpc?debug=1"></script>
<script type="text/javascript" src="/gadgets/files/container/cookies.js"></script>
<script type="text/javascript" src="/gadgets/files/container/util.js"></script>
<script type="text/javascript" src="/gadgets/files/container/gadgets.js"></script>
<script type="text/javascript" src="/gadgets/files/container/osapi.js"></script>


とShindig提供のJavaScriptを読み込まないとだめみたい。

ということで、setprefsも無事コールすることができた!

.

[Apache Shindig][お勉強][OpenSocial] メモ20 UserPref

UserPrefって何かというと、

http://gihyo.jp/dev/serial/01/opensocial/0005
によると、


ユーザ設定は,あるガジェットをインストールしたユーザが,そのガジェットの動作をカスタマイズするために使用される機構です。
 

とのこと。

ほほー。
.

2009年6月17日水曜日

[Apache Shindig][お勉強][OpenSocial] メモ19 set_pref

世にあるサンプルをshindigで動かすと、
表示できるし、ちょっとは遊べる。

だけど、某サイトのtodo.xml(サンプルにあったやつ)を表示して、
クリックすると、


Unknown RPC service: set_pref
 


って言われる。
さらにFULL SCREENってところをクリックすると、

Unknown RPC service: requestNavigateTo
 

って言われる。

なんだろ、これ。
多分基本的なところがいけないんだろうけど。

--

java/server/target/shindig-server-1.1-SNAPSHOT/WEB-INF/classes/gadgets/files/container/gadgets.js
 

これが関係あるんですかね。。
--
その前にUserPrefとは何?から。
.

[その他] Opera Unite

サーバとしてブラウザを動作させる?

よく分からないけど、面白そうねー。

.

[Apache Shindig][お勉強][OpenSocial] メモ18 tomcatで動かすと・・・

Tomcatで動かすと


009/06/17 4:05:36 org.apache.shindig.gadgets.render.DefaultServiceFetcher retrieveServices
致命的: HTTP Error 404 fetching service methods from endpoint http://localhost:8080/social/rpc
2009/06/17 4:05:36 org.apache.shindig.gadgets.render.DefaultServiceFetcher retrieveServices
致命的: HTTP Error 404 fetching service methods from endpoint http://localhost:8080/gadgets/api/rpc
 

などといわれてしまう。

とりあえずは、

container.js
 

を修正すれば動くっぽい。

tomcatで動かす場合は、多分、
* ROOTコンテキストで動かす
* container.jsのendpoint部分を書き換え、コンテキストパスを入れる
* Shindigのソースを書き換える
のどれかで良さそう。
3番目は普通に使う分にはやらない方がいいけど、多分%host%を書き換えているところを
修正すればよいんだろうねー。

Shindigの機能全てが動くかどうかは知らないけど。

さて、続く。
.

[Apache Shindig][お勉強][OpenSocial] メモ17 %host%

container.jsの%host%を置換しているソース一覧。


./java/gadgets/src/main/java/org/apache/shindig/gadgets/render/DefaultServiceFetcher.java: endpointServices.putAll(endpoint, retrieveServices(endpoint.replace("%host%", host)));
./java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PipelinedDataPreloader.java: jsonUri.replace("%host%", context.getHost()))
./java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultUrlGenerator.java: return jsPrefix.replace("%host%", context.getHost())
./java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultUrlGenerator.java: return callback.replace("%host%", gadgetHost);
 


.

2009年6月16日火曜日

[Apache Shindig][お勉強][OpenSocial] メモ16 Handlers

Handlersってどこでセットしているかというと、、、

web.xml内で、handlers名をサーブレット毎にセットしてて、
各サーブレットはセットされたhandlers名にマッチするHandlersのjava.util.Setを使うらしい。

付属のweb.xmlを見ると、


$ grep -Hi handlers java/server/target/shindig-server-1.1-SNAPSHOT/WEB-INF/web.full.xml
java/server/target/shindig-server-1.1-SNAPSHOT/WEB-INF/web.full.xml: <param-name>handlers</param-name>
java/server/target/shindig-server-1.1-SNAPSHOT/WEB-INF/web.full.xml: <param-value>org.apache.shindig.social.handlers</param-value>
java/server/target/shindig-server-1.1-SNAPSHOT/WEB-INF/web.full.xml: <param-name>handlers</param-name>
java/server/target/shindig-server-1.1-SNAPSHOT/WEB-INF/web.full.xml: <param-value>org.apache.shindig.social.handlers</param-value>
java/server/target/shindig-server-1.1-SNAPSHOT/WEB-INF/web.full.xml: <param-name>handlers</param-name>
java/server/target/shindig-server-1.1-SNAPSHOT/WEB-INF/web.full.xml: <param-value>org.apache.shindig.gadgets.handlers</param-value>
java/server/target/shindig-server-1.1-SNAPSHOT/WEB-INF/web.full.xml: <param-name>handlers</param-name>
java/server/target/shindig-server-1.1-SNAPSHOT/WEB-INF/web.full.xml: <param-value>org.apache.shindig.gadgets.handlers</param-value>
 

となっているので、使われているhandlers名は
* org.apache.shindig.social.handlers
* org.apache.shindig.gadgets.handlers
の2つっぽい。

で、
何がorg.apache.shindig.social.handlersという名はどのハンドラか
というと
org.apache.shindig.social.core.config.SocialApiGuiceModuleクラスに定義されている。

protected Set<Object> getHandlers() {
return ImmutableSet.<Object>of(ActivityHandler.class, AppDataHandler.class,
PersonHandler.class, MessageHandler.class);
}
 

ソースから判断するに、ハンドラは、
* org.apache.shindig.social.opensocial.service.ActivityHandler
* org.apache.shindig.social.opensocial.service.AppDataHandler
* org.apache.shindig.social.opensocial.service.MessageHandler
* org.apache.shindig.social.opensocial.service.PersonHandler
の4つ。

何がorg.apache.shindig.gadgets.handlersのハンドラか


というと、
org.apache.shindig.gadgets.DefaultGuiceModuleを見れば分かるかも。


bind(new TypeLiteral<Set<Object>>(){}).annotatedWith(
Names.named("org.apache.shindig.gadgets.handlers"))
.toInstance(ImmutableSet.<Object>of(InvalidationHandler.class, HttpRequestHandler.class));
 

とのこと。
つまり、
* org.apache.shindig.gadgets.http.InvalidationHandler
* org.apache.shindig.gadgets.servlet.HttpRequestHandler
の2つっぽい。



org.apache.shindig.social.handlersを使っているサーブレット
org.apache.shindig.social.handlersを使っているサーブレットは、
* socialRestapiServlet
* socialJsonRpcServlet
の2つ。

org.apache.shindig.gadgets.handlersを使っているサーブレット
org.apache.shindig.gadgets.handlersを使っているサーブレットは、
* gadgetsJsonRpcServlet
* gadgetsRestapiServlet
の2つ。

うーん・・。

gadgetsとsocialの2つあるのはなぜ??

.

[XStream] メモ

Apache Shindigを見てて、いろいろと便利そうなものを知った。
勉強不足が露呈。

XStreamというXML-JavaObjectマッパー。

http://xstream.codehaus.org/

知ってれば、今までもかなり楽できたのに。。

.

[Apache Shindig][お勉強][OpenSocial] メモ15 Gadget内のURLを書き換えるタグ設定

ソース読み中。

Shindigでは、GadgetのXMLを読み込んで、HTMLにレンダリングして、クライアントのブラウザへ
返すらしい。

で、そのHTMLにレンダリングする際、Gadget内のURLをOpensocialコンテナ経由になるよう、
書き換えている模様。
AjaxやFlashで通信する際、別サーバだと問題があるためと思われる。

で、HTML中のどのタグのURLを書き換えるかを
shindig.propertiesの


shindig.content-rewrite.include-urls=.*
shindig.content-rewrite.exclude-urls=
shindig.content-rewrite.include-tags=link,script,embed,img,style
shindig.content-rewrite.expires=86400
 

あたりで指定できる。上記はデフォルトの設定。
デフォルトだと、全てのURLで、link、script、embed、img、styleを書き換える模様。
で、この辺を扱っているクラスが

org.apache.shindig.gadgets.rewrite
 

以下にいっぱいある。

で、どう書き換えるかというと、
たとえば、

<img src="http://どっかのサーバ/a.jpg" >
 

なんてタグがあったとして、すると、Shindigは書き換える。

<img src="http://Shidigサーバ/gadgets/proxy?url=http://どっかのサーバ/a.jpg" >
 

な感じ。

.

2009年6月15日月曜日

[Apache Shindig][お勉強][OpenSocial] メモ14 AuthenticationServletFilter

Shindigには


org.apache.shindig.auth.AuthenticationServletFilter
 

という、Filterがある。
で、これは何をしているか、読んでみた。

ソースは、

./java/common/src/main/java/org/apache/shindig/auth/AuthenticationServletFilter.java
 



for (AuthenticationHandler handler : handlers) {
SecurityToken token = handler.getSecurityTokenFromRequest(req);
if (token != null) {
new AuthInfo(req).setAuthType(handler.getName()).setSecurityToken(token);
callChain(chain, req, resp);
return;
} else {
String authHeader = handler.getWWWAuthenticateHeader(realm);
if (authHeader != null) {
resp.addHeader("WWW-Authenticate", authHeader);
}
}
 

ってところを見ると、securityTokenが取れない場合は、
WWW-Authenticate: relm="shindig"
とかが返りそう。
AuthInfoしだいだろうけど。


} catch (AuthenticationHandler.InvalidAuthenticationException iae) {
Throwable cause = iae.getCause();
logger.log(Level.INFO, iae.getMessage(), cause);

if (iae.getAdditionalHeaders() != null) {
for (Map.Entry entry : iae.getAdditionalHeaders().entrySet()) {
resp.addHeader(entry.getKey(), entry.getValue());
}
}
if (iae.getRedirect() != null) {
resp.sendRedirect(iae.getRedirect());
} else {
// For now append the cause message if set, this allows us to send any underlying oauth errors
String message = (cause==null) ? iae.getMessage() : iae.getMessage() + cause.getMessage();

resp.sendError(HttpServletResponse.SC_UNAUTHORIZED, message);
}
}
 

で、AuthenticationHandler.InvalidAuthenticationExceptionなら、
AuthenticationHandlerなりで作られたヘッダを、ぼこぼこresponseにセットして、
Redirectするなり、401を返すと。
InvalidAuthenticationException経由で401を返すか、Redirectするか
できるっぽいと。


.

[Apache Shindig][お勉強][OpenSocial] メモ13 org.apache.shindig.common.servlet.GuiceServletContextListener って何してるのさ

そもそもweb.xmlに書かなきゃいけないとされている、


org.apache.shindig.common.servlet.GuiceServletContextListener
 

ってなんなのさ。ということで、読んでみた。

ソースは、

./java/common/src/main/java/org/apache/shindig/common/servlet/GuiceServletContextListener.java
 

にある。
なんてことはない。
"guice-modules"って書かれてあるcontextのinitパラメータから":"で区切られているモジュール一覧を
取得して、一個一個ロードして、newしているだけ。

でもって、

Injector injector = Guice.createInjector(Stage.PRODUCTION, modules);
 

で、DIコンテナ作って、で、

context.setAttribute(INJECTOR_ATTRIBUTE, injector);
 

で、contextに保存と。
ふーん。

Stage.PRODUCTIONってあるけど、うーん。これは何?
DIコンテナは現在PRODUCTION環境で動いているよってこと?
IDEからコールされるとTOOLとかになりそうだねー。

で、MBeanサーバに登録っと。

--
org.springframework.web.context.ContextLoaderListener
みたいなものか。

.