2009-03-29

「Twitter フォローで本をもらおう」に当選しました。そしてその本が届きました。

こんばんは。なかじまんです。

ぷらっとオンライン での「Twitter フォローで本をもらおう」という懸賞に応募してたのですが、みごとに当選しました。その賞品の本は 『Small Form Factor PCs』 です。

Small Form Factor PCs (Make: Projects)

A Portable, USB-Powered, Bridging Firewall 章の中で、OpenBlockS が取り上げられています。



ありがとうございました。またこんな懸賞企画をお願いします。

2009-03-23

iGoogle サンドボックスで外部スクリプトをキャッシュの対象外とする方法

こんばんは。なかじまんです。

ここ 1週間くらいでしょうか。iframe を強制リロードしても、最新の外部スクリプトが反映されなくなってしまいました。どうやら iGoogle サンドボックスの外部スクリプトのキャッシュがさらに強力に効くようになってしまったようです。

そこで、次のように content-rewite 機能 拡張子が js のファイルをキャッシュの対象外 としてみたところ、期待どおりの結果が得られました。

<Optional feature="content-rewrite">
<Param name="exclude-urls">\.js$</Param>
</Optional>

content-rewrite 機能は、サンドボックスなど開発環境のみで有効なもので、プロダクションなどの一般環境では無効なものなのだと推測できます。どのサイトの解説を見ても content-rewrite 機能は Optional を使って定義していますが、これは Optional と定義することで、環境間の差異を吸収できるという意味じゃないかと捉えています。

どうも外部スクリプトが更新されないなぁというときは、試してみてください。

2009-03-22

2009年1月から3月までに読んだ本たちを紹介します。

こんばんは。なかじまんです。2009年1月から3月までに読んだ本たちを紹介します。

ゴルギアス (岩波文庫) ニワトリを殺すな ロンおじさんの贈りもの―30日間ビジネス・レッスン ペンギンの国のクジャク リーン開発の本質 ソフトウエア開発に活かす7つの原則 OpenSocial入門 ~ソーシャルアプリケーションの実践開発

ここ最近は、あんまり本を読めてないですね。なんとかせねば。

2009-03-20

iGoogle サンドボックスは opensocial.DataRequest.ActivityRequestFields (v0.9) を定義している!?

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

Activity Paging Support (0.9)
Activities APIにおいては、残念ながらOpenSocial 0.8.1においてもページングが考慮されていませんでした。JavaScript APIに関しては、Activityのページングに関する条件を指定するために、ActivityRequestFieldsクラスが新規に定義されます。
iGoogle サンドボックスは、次のとおり opensocial.DataRequest.ActivityRequestFields を定義しているようです。

opensocial.DataRequest.ActivityRequestFields.APP_ID
opensocial.DataRequest.ActivityRequestFields.FIRST
opensocial.DataRequest.ActivityRequestFields.MAX

もしかしたら使えるかも ... と FIRST と MAX を試してみましたが、使えませんでした。JSON RPC リクエストにも現われていないため、newFetchActivitiesRequest の中で無視しているっぽいですね。APP_ID は iGoogle の特別仕様 のようです。

あと iGoogle で requestCreateActivity を試していて気が付いたのですが、opensocial-0.8 だと notImplemented エラーになりますが、opensocial-0.7 だとエラーとならず成功します。ただ、成功したはずなのですが、Updates ガジェットにその内容が表示されません。

なんでだろう。ネットで探してみたけど、それらしき情報源はなかったです。どなたかご存知ないですか?

2009-03-14

opensocial-jquery 0.6.0 をリリースしました。jQuery.ajax で signed リクエストが使えます。ほか Flash や MiniMessage など UI のサポートを追加しました。

こんばんは。なかじまんです。opensocial-jquery 0.6.0 をリリースしました。

Ajax OAuth

jQuery.ajax を使って、リクエストに署名して、外部ホストからデータを取得できます。このとき oauth に signed を指定します。

$.ajax({
url: 'http://example.com/data.json',
dataType: 'json',
oauth: 'signed',
success: function(data, status) {
console.log(data, status);
},
error: function(xhr, status, e) {
console.info(xhr, status, e);
}
});

jQuery.get を使っても同じことができます。このとき url に続けて signed を指定します。

$.get('http://example.com/data.json signed', function(data, status) {}, 'json');

jQuery.getJSON でもリクエストに署名できます。

$.getJSON('http://example.com/data.json signed', function(data, status) {});

jQuery.getScript でもリクエストに署名できます。

$.getScript('http://example.com/data.js signed', function(data, status) {});

jQuery.getFeed でもリクエストに署名できます。

$.getFeed('http://example.com/data.atom signed', function(data, status) {});

jQuery.ajax を使って、リクエストに署名して、外部ホストにデータを送信できます。このとき oauth に signed を指定します。

$.ajax({
type: 'post',
url: 'http://example.com/data.json',
data: { comment: 'Say Hello!' },
dataType: 'json',
oauth: 'signed',
success: function(data, status) {
console.log(data, status);
},
error: function(xhr, status, e) {
console.info(xhr, status, e);
}
});

jQuery.post を使っても同じことができます。このとき url に続けて signed を指定します。

$.post('http://example.com/data.json signed', { comment: 'Say Hello!' },
function(data, status) {}, 'json');

Flash

jQuery.flash を使って、Flash Player の存在を確認できます。

if ($.flash) {
console.log('Detects Flash Player.');
}

jQuery.flash.version を使って、Flash Player のメジャーバージョンを確認できます。

console.log('Major version: ' + $.flash.version);

jQuery.fn.flash を使って、Flash コンテンツを埋め込んで表示できます。

$('#container').flash('http://example.com/data.swf');

パラメータも指定できます。このとき、パラメータ名と値のセットを指定します。

$('#container').flash('http://example.com/data.swf', {
width: 50, height: 100
});

さらに flashVars も指定できます。このときも、パラメータ名と値のセットを指定できます。

$('#container').flash('http://example.com/data.swf', {
width: 50, height: 100,
flashVars: { comment: 'Say Hello!' }
});

MiniMessage

jQuery.fn.minimessage を使って、閉じるボタン付きのメッセージを表示できます。

$('<span/>')
.text('Say Hello!')
.minimessage();



また jQuery.fn.minimessage にコールバック関数を指定して、閉じるイベントをハンドリングできます。

$('<span/>')
.text('Say Hello!')
.minimessage(function() {
console.log('Thanks for the message.');
});

Locale

jQuery.msg を使って、メッセージバンドルを取得できます。

var message = $.msg('notfound');

こんなの欲しかった。どじ厚120mmの両開きパイプ式ファイルです。

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

どじ厚 120mm の両開きパイプ式ファイル (SUGATA ASPF12BL) です。しかも、引き出すときの取っ手付きときた。こんなの欲しかった。



他社のパイプ式ファイルは 100mm までしかラインナップしかないし、100mm でも作りが弱々しく頼りない印象があるのですが、SUGATA ASPF12BL は 120mm 向けの作りになっていて、あらゆるところで剛性さがあり力強いです。

SUGATA ASPF12BL なら 1年分の資料を 1冊ですべて収納できちゃった。いいねこれ。

2009-03-13

opensocial-jquery はあらゆるリクエストとレスポンスのイベントを検出できます

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

opensocial-jquery は gadgets.io.makeRequest や opensocial.DataRequest をすべて jQuery.ajax で扱う ようにデザインしています。

そのため、jQuery.ajax があらかじめ持つ Ajax グローバルイベントのハンドリングもそのまま使えます。つまり、外部サイトであっても、OpenSocial コンテナであっても、あらゆるリクエストとレスポンスのイベントをハンドリングできるというわけです。

↓例えば、開発やテストのとき、リクエストとレスポンスの流れをロギングすることができます。期待どおり動作しているか、そうでないときは、何が原因なのかが把握しやすくなります。外部サイトの Ajax か OpenSocial コンテナの Ajax かを区別しない利点がこのようなところに現われます。

<script type="text/javascript">
$('<div class="logs" />')
.ajaxStart(function() { console.log('ajaxStart'); })
.ajaxSend(function(xhr, s) { console.log('ajaxSend', xhr, s); })
.ajaxSuccess(function(xhr, s) { console.log('ajaxSuccess', xhr, s); })
.ajaxError(function(xhr, s, e) { console.log('ajaxError', xhr, s, e); })
.ajaxComplete(function(xhr, s) { console.log('ajaxComplete', xhr, s); })
.ajaxStop(function() { console.log('ajaxStop'); });
</script>

↓例えば、ajaxStart と ajaxStop のイベントを使って、Ajax 中を表すのインジゲータの表示と非表示を切り替えたりできます。外部サイトの Ajax か OpenSocial コンテナの Ajax かを区別しない利点がこのようなところにも現われます。

<script type="text/javascript">
$('<div class="indicator" />')
.ajaxStart(function() { $(this).show(); })
.ajaxStop(function() { $(this).hide(); });
</script>

Google Friend Connect (GFC) の API ドキュメントが公開されたということで、opensocial-jquery の GFC 対応も進めていきたいと思います。

2009-03-03

いくつかコンテナをピックアップして gadgets.io.makeRequest で SIGNED リクエストを投げてみました。

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

いくつかのコンテナをピックアップして gadgets.io.makeRequest で SIGNED リクエストを投げてみました。リクエスト先にどのようなパラメータが届くのか気になっていたので、この機会にメモしましたのでお伝えします。何かの参考になれば幸いです。

↓iGoogle sandbox です。長いパラメータ値は省略...しています。

POST /html.cgi?
opensocial_owner_id=101827817145299921798&
opensocial_viewer_id=101827817145299921798&
opensocial_app_id=117266110076567083099&
opensocial_app_url=http%3A%2F%2...&
xoauth_signature_publickey=pub.1210278512.2713152949996518384.cer&
oauth_version=1.0&
oauth_timestamp=1236030428&
oauth_consumer_key=www.google.com&
oauth_signature_method=RSA-SHA1&
oauth_nonce=1236030428258235000&
oauth_signature=lu4d4RJG0r...

↓Orkut sandbox です。長いパラメータ値は省略...しています。

POST /html.cgi?
opensocial_owner_id=09639488956131736096&
opensocial_viewer_id=09639488956131736096&
opensocial_app_id=06583614294079626891&
opensocial_app_url=http%3A%2F%2...&
xoauth_signature_publickey=pub.1199819524.-1556113204990931254.cer&
oauth_version=1.0&
oauth_timestamp=1236030605&
oauth_consumer_key=orkut.com&
oauth_signature_method=RSA-SHA1&
oauth_nonce=1236030605895106000&
oauth_signature=qq4SBv1eb%...

↓Hi5 sandbox です。長いパラメータ値は省略...しています。

POST /html.cgi?
opensocial_owner_id=300420948&
opensocial_viewer_id=300420948&
opensocial_app_id=34059&
oauth_consumer_key=hi5.com&
xoauth_signature_publickey=hi5&
oauth_version=1.0&
oauth_timestamp=1236030892&
oauth_signature_method=RSA-SHA1&
oauth_nonce=12139334427343000&
oauth_signature=CCqqxWU4%2F...

↓MySpace Developer Platform です。長いパラメータ値は省略...しています。

POST /html.cgi?
oauth_consumer_key=http%3A%2F%2Fdevelopmentor.lrlab.to%2Fopensocial-jquery%2Ftests%2FjQuery.ajax.signed.xml&
oauth_nonce=633716278571890020&
oauth_signature=oBZ%2Fb4ZD...&
oauth_signature_method=HMAC-SHA1&
oauth_timestamp=1236031057&
oauth_version=1.0&
opensocial_owner_id=1003744688&
opensocial_viewer_id=1003744688

↓opensocial.org (Ning) です。長いパラメータ値は省略...しています。

POST /html.cgi?
opensocial_owner_id=30gsvga5xejte&
opensocial_viewer_id=30gsvga5xejte&
opensocial_app_id=http%3A%2F%2...&
oauth_consumer_key=opensocialcommunity.ning.com&
xoauth_signature_publickey=ning.com&
oauth_signature_method=RSA-SHA1&
oauth_nonce=214ee1ffdb7af030&oauth_timestamp=1236031902&
oauth_signature=a1JTBiblvv...

どのアプリケーションからのリクエストなのか?は、アプリケーションの URL で判断できるのかと想像していたのですが、そうとも限らないのでしょうかね。また、コンシューマキーは opensocial domain と合致しないのでしょうかね。そうなると viewer id や owner id の関連付けとかどうすればいいんだろう。

実際のリクエストパラメータを並べて比較して理解が進んだことも確かですが、なにやら疑問がむくむくと生まれてきてしまっている感じです。まだまだ理解が不足しているので、変なこと言ってるかもしれません。あらためて関連資料などを再読してみようと思います。

ちょっと Tips です。iGoogle sandbox から SIGNED リクエストを投げるには、opensocial-0.8 を Require する必要がありました。危うくハマリかけたので、その顛末を残しておきます。
nakajiman iGoogle sandbox で gadgets.io.AuthorizationType.SIGNED とすると、Bad Request になってしまうのですが、何が不足してるんだろう。理解できていません。Orkut や MySpace だとそれぞれの方式で動くのに。

yoichiro @nakajiman 何かしらコンテナ側にトラブルが起きてることが当たり前のように思えてきますよねー

nakajiman @yoichiro iGoogle sandbox がトラブッテる可能性が高いってことですか? SIGNED とすると、iGoogle コンテナ署名のリクエストになるという理解は正しいのかな。もう少し時間をおいてから試してみよう。

agektmr @nakajiman @yoichiro 僕の所では動いてるので、公開鍵が間違ってるとかじゃないですかね

agektmr @nakajiman opensocial-0.8をRequireしたら動きました。iGoogleではopensocialをRequireしないとstが付かないぽいですね。

nakajiman@agektmr ありがとうございます!リクエストきました。oauth_consumer_key=www.google.com ちょっとしたTipsですね。
agektmr さん、yoichiro さん。ありがとうございました。助かりました。