Archive for the 'Widget' Category

1月 08 2009

Footprint gadget for your FriendConnect

I developed FriendIntroducer as an experiment and was trying to understand how FriendConnect is different from ordinaly OpenSocial implementation. So this time, I’ve tried to develop a gadget which you can find FriendConnect interesting, Footprints. You know the idea if you’ve tried MyBlogLog before.

What is Footprints?

Footprints is a gadget to track visitor of you blog. Look at the gadget on bottom left of this blog. If you’re not joined or signed in, do it to check what it does.

Footprint is a pretty popular idea on japanese social networks. Once upon a time, SNS were all closed and it was difficult to find people you may know. Footprint functionality was a good tool at that time to find who’s interested in you.

Footprints1

As you could imagine, this gadget records visitor and its time. When viewed by others, timestamp will be displayed how long ago, you’ve visited. Also, you can remove your own footprint if you want. The xml is located at:

http://devlab.agektmr.com/OpenSocial/FriendConnect/Footprints.xml

Feel free to take it and use it on your blog.

View Comments add to hatena hatena.comment (6) add to del.icio.us (0) add to livedoor.clip (1) add to Yahoo!Bookmark (0) Total: 7

4月 17 2008

OpenSocialアプリケーションを作る(2)

Published by Eiji under OpenSocial, Widget

OpenSocialアプリケーションを作る(1)では、ガジェットの仕組みと、Orkutでアカウントを取得するところまで書きました。今回は、前回紹介したアプリケーションのコードを解説します。

このアプリケーション(FriendIntroducer)は、自分が見た場合は友達の紹介文を書くことができ、他人が見た場合はその人に向けて書かれた紹介文を読むことができる、というmixiなどにもよくある簡単なアプリケーションです。JavaScriptやjQuery的にはもっと賢い実装方法があると思いますが、今回はOpenSocialのコードにフォーカスしますので、アホなコードは大目に見てください。

ガジェットXML

< ?xml version="1.0" encoding="UTF-8" ?>
<module>
<moduleprefs title="Friend Introducer" title_url="" description="Introduce your friend!" height="100">
  <require feature="opensocial-0.7" />
  <require feature="views" />
  <require feature="dynamic-height" />
 </moduleprefs>
<content type="html" view="canvas">
  < ![CDATA[
  <link href="http://devlab.agektmr.com/OpenSocial/css/FriendIntroducer.css" rel="stylesheet" type="text/css">
  <script type="text/javascript" src="http://devlab.agektmr.com/OpenSocial/js/jquery.js"></script>
  <script type="text/javascript" src="http://devlab.agektmr.com/OpenSocial/js/FriendIntroducer.js">< /script>
  </script><script type="text/javascript">
    gadgets.util.registerOnLoadHandler(FriendIntroducer.init);
  </script>
  <div id="title"></div>
  <div id="friends"></div>
  <div id="message"></div>
  ]]>
 </content>
</module>

ここでは

  • ガジェットの設定
  • 外部のCSSやJavaScriptを読み込み
  • 初期化スクリプトの呼び出し
  • 表示用DIV指定

を行っています。

<content type="html" view="profile">

Contentはhtmlタイプ、profileビューと指定しました。typeにはhtmlとurlが選択可能ですが、htmlとして内容をContentタグで囲まれた部分に記述しています。viewはOpenSocialの仕様上profile、canvasが想定されていますが、コンテナによってhomeやpreviewが存在するようです。ここでは例としてcanvasを使用しています。

また、viewを指定しない場合はdefaultビューとして扱われます。コンテナは表示場面(コンテキスト)によってビューを切り替えますが、Content内でviewを取り出してJavaScriptで処理を分ける方法もあります。

Contentの内容

Contentの内容は、基本的に通常のウェブページと同じように扱うことができ、HTMLで書くことができますが、

  <script type="text/javascript">
    gadgets.util.registerOnLoadHandler(FriendIntroducer.init);
  </script>

このようにgadgets.util.registerOnLoadHandlerを使って初期化処理を入れることができます。

このアプリケーションでは、表示テンプレートとして空のdivタグを3つ用意しています。

JavaScriptのコード

JavaScriptのソースコードはここにありますが、抜粋して紹介します。

    $('#friends').html('Requesting friends...');
    var req = opensocial.newDataRequest();
    req.add(req.newFetchPersonRequest('VIEWER'), 'viewer');
    req.add(req.newFetchPeopleRequest('VIEWER_FRIENDS'), 'friends');
    req.add(req.newFetchPersonAppDataRequest('VIEWER', 'Introduction'), 'intro');
    req.send(FriendIntroducer.onLoadViewerFriends);

最も基本的な処理となる、閲覧者、閲覧者の友達、保存したデータを取り出す処理です。

opensocial.newDataRequest()でデータリクエストオブジェクトを作り、addで3種類のリクエストを追加、最後にsendでコールバック関数を指定した上、データリクエストを送信しています。3種類のリクエストにはそれぞれ後で区別するためviewer, friends, introという名前(キー)を付けています。

   var viewer    = response.get('viewer').getData();
   var friends   = response.get('friends').getData();
   var intro     = response.get('intro').getData();

コールバック関数では、引数(response)を使って、response.get(キー名).getData()でリクエストしていたデータを取り出すことができます。

    var viewer_id = viewer.getId();
    var json = null;
    if (intro[viewer_id]) {
      if (intro[viewer_id].Introduction) {
        var json_str = gadgets.util.unescapeString(intro[viewer_id].Introduction);
        var json = eval(json_str)[0];
      }
    }

introは、このアプリケーションを使ってコンテナのデータ保存領域に予め保存しておいた内容、つまり「以前保存した友達の紹介文」です。

    $('#title').html('<p>Friends of '+viewer.getDisplayName()+':</p>');
    var html = '';
    if (friends.size() == 0) {
      $('#message').html("<p>You don't have any friends yet!</p>");
    }

友達が誰もいない場合を考慮して、メッセージを表示しています。

    friends.each(function(person) {
      var t = FriendIntroducer.template.friend_list_canvas;
      t = t.replace('##thumbnail_url##', person.getField(opensocial.Person.Field.THUMBNAIL_URL));
      t = t.replace('##profile_url##',   person.getField(opensocial.Person.Field.PROFILE_URL));
      t = t.replace('##display_name##',  person.getDisplayName());
      t = t.replace('##input_id##',      'input_'+person.getId());
      if (json) {
        t = t.replace('##intro_text##',  json[person.getId()] ? json[person.getId()] : '');
      } else {
        t = t.replace('##intro_text##', '');
      }
      html += t;
    });
    $('#friends').html('<ul>'+html+'</ul>');

OpenSocialでは配列をなめる、いわゆるiterationも仕様に含まれていて、eachを使うことができます。ここでは、友達のリストをループして、友達の名前やサムネイル画像、保存されていた紹介文をHTMLテンプレートに埋め込んでいきます。

ここまでで、友達の紹介文を書き込むことができるcanvasページの表示することができました。次に、友達の紹介文をユーザーが書き込んだものと想定し、投稿して保存するところまでを解説します。

データの保存

OpenSocialはコンテナにデータ保存領域を持っており、アプリケーションがデータを保存することができます。これはパーシステントデータ(Persistant data)や、アプリケーションデータ(AppData)と呼ばれています。アプリケーションデータはバージョン0.7ではエスケープした文字列のみサポートしています(次のバージョンではJSONそのものの保存も可能になるようです)。

    var list = $('#friends ul li');
    var intro = "{result:[{";
    for (var i=0; i < list.length; i++) {
      var textarea = list[i].lastChild.lastChild;
      var uid = textarea.id.substring(6);
      var intro_text = textarea.value.replace("'", "\'");;
      intro += "'"+uid+"':'"+intro_text+"'";
      intro += (list.length-1)==i ? "" : ",";
    };
    intro += '}]};';
    var req = opensocial.newDataRequest();
    intro = gadgets.util.escapeString(intro);

この処理は、ユーザーが友達の紹介文を書き終わって「投稿ボタン」を押すことでトリガーされるものです。DOMを辿って各友達のユーザーIDと紹介文の内容を取得する、普通のJavaScriptです。取得した内容はJSONの文字列になるよう連結し、エスケープすることで、アプリケーションデータとして保存が可能になります。

    req.add(req.newUpdatePersonAppDataRequest('VIEWER', 'Introduction', intro));
    req.send(function() {
      $('#message').html('<p>Your introduction has been submitted.');
    });

最後に、JSON形式になった文字列をデータリクエストオブジェクトに追加して送信して、完了です。

まとめ

解説というよりはソースコード並べただけみたいな記事になってしまいましたが、OpenSocialアプリケーションのほとんどがJavaScriptでできてしまうということは、分かったかと思います。次回は外部サーバーとの連携を行うmakeRequestに触れたいと思います。

View Comments add to hatena hatena.comment (2) add to del.icio.us (0) add to livedoor.clip (0) add to Yahoo!Bookmark (0) Total: 2

4月 03 2008

FriendFeedのDashboard用ウィジェットを作ってみた

Published by Eiji under Widget

最近話題のFriendFeedに対応したMac OS XのDashboardウィジェット、FriendFeeder(仮称)を作ったので公開します。まだいっぱい不具合あると思うんですが、とりあえず動いてるので勢いで。

FriendFeedとは?

FriendFeedTechCrunch辺りで最近話題のウェブサービス。Twitterの次はコレと言われているものです。内容は一言で言うなら、SNSアグリゲータ。数多あるSNSをまとめあげるSNSといったところでしょうか。

SNSと言っても、FacebookのようなSNSそのものではなく、一般的なブログやTwitterやFlickr、Youtube、del.icio.us、Last.fmなど、SNSに類するサービスの最新情報をまとめる、ということに特化しています。エントリにコメントを付けたり、スター的な機能もあります。

なぜFriendFeedがアツいのか?

ずばり、このサービスが明らかにTwitterの存在を意識し、その延長線上にあるためです。

Twitterは今や多くの人のデスクトップ常駐アプリ/サービスになりました(僕はTwitterBoardというDashboardウィジェットを愛用してます)。面白いのは、Twitterという味気ないインターフェースのサービスが、多くのディベロッパーによって開発されたアプリ群によりバラエティを増しているという現象です。FriendFeedの味気ないインターフェースと充実したAPIはTwitterをヒントに、それ以上のものを目指していると思わずにはいられません。

もう一つ、Twitterを意識していると思える点は、コメント機能です。FriendFeedではTwitter上でのReplyを並べ替えて、会話の流れを分かりやすく表示してくれます。また、FriendFeed上でのコメントを、そのままTwitterにUpdateするオプションがあります。

そういう意味ではSNSアグリゲータというよりはむしろ、Twitter+αと言った方が適切かもしれません。少なくとも個人的には、そういう使い方がメインになりそう。

ただのフィードアグリゲータではない

これまでフィードアグリゲータといえばRSSリーダーだったわけですが、FriendFeedは単なるフィードアグリゲータではありません。それは認証認可を取り扱うからです。

通常RSSは一般公開されているものですので、特にプライバシーを気にする必要はありません。同じものを見る人が多数いることも想定されますから、キャッシュを用いることでかなりの効率化を図ることが出来ました。ところが、FriendFeedが扱う外部サービスにはGmailなど、認証を必要とするものも含まれます。これはつまり、ユーザーひとりにつき一回のフィードアクセスを要する、ということです。

これはTwitterの比ではない大仕事に思えます。ユーザーが増えれば増えるほど、どんどんしんどくなっていく。どんなアーキテクチャなんでしょうか?

FriendFeedの今後

Adobe AIRを使ったデスクトップアプリケーションがリリースされる予定とのこと。また、現在は規定されたサービスしか登録できませんが、サービス事業者が自らFriendFeedにAPIを作れる仕組みを用意するとか。

ユーザーインターフェースにバラエティがあって(API)、友達申請が気軽に出来る(Follow)という点を除いて、Facebookの方向性に近いのは偶然ではないでしょう。ソーシャルグラフの集約は既定路線ですが、どのパスを通って行くのが最も集客できるのか、興味深いところです。

FriendFeederのダウンロードと使い方

ようやく本題です(笑)

ダウンロードはこちら
要Mac OS X 10.4.3以降のはず。

既知の不具合

スクロールバーが出ないです!マウスホイール使ってください。

使い方

まずはFriendFeedでアカウントを取得してください。
ウィジェットの裏面(設定画面)で自分のIDとRemote Keyを入力します(パスワードではありません)。Remote Keyはhttp://friendfeed.com/remotekeyで取得できます。

フィードバック

今後コメント機能と、Twitter投稿機能の追加を検討しています。他にも何かあればこのエントリにコメントするか、Twitterで教えてください。

また、僕のFriendFeedアカウントはhttp://friendfeed.com/agektmrにありますので、Follow歓迎です。

View Comments add to hatena hatena.comment (1) add to del.icio.us (0) add to livedoor.clip (2) add to Yahoo!Bookmark (0) Total: 3

3月 30 2008

OpenSocialアプリケーションを作る(1)

Published by Eiji under OpenSocial, Widget

OrkutとMySpaceで自作アプリを動かしてみたので、そのレポートです。

まだ仕様が固まっていないのでグレーな部分も多いのですが、OpenSocialはGoogleGadgetと相性が良いらしく、OrkutもMySpaceも、hi5もGoogleGadget前提となっています。というわけで、今回はGoogleGadgetの基本的な作り方とOrkutへのアプリケーション追加方法の解説です。

ガジェットとは何か

GoogleGadgetはiGoogleで動くJavaScriptとHTMLで記述された簡単なアプリケーションです。JavaScriptとHTMLはXML上に埋め込み、設定内容もXMLに記述します。

< ?xml version="1.0" encoding="UTF-8" ?>
<module>
 <moduleprefs title="Blah Blah Gadget"
  description="Gadget Example"
  author_email="***@***.com"
 >
 </moduleprefs>
 <content type="html">
.....
 </content>
</module>

XMLはこんな感じ。Contentの中にJavaScriptとHTMLを記述することで、その内容がiGoogle上やMySpace等のOpenSocialアプリケーションとして表示されます。

ガジェットはJavaScriptを許可していることから、XSSなどの脆弱性を回避するため、iframeを使って別ドメインで動作するようになっています(iGoogleの場合、gmodules.com)。Contentの属性であるtypeを”html”から”url”に変更し、hrefでURL指定すると、iframe内に自分の管理するサーバーを表示することも可能です。

GoogleGadget自体の仕様は掘り下げるとキリがないのでこの辺りで。詳細はリファレンスをご覧ください。

OrkutのSandboxアカウントを取得する

OrkutはGoogle直結ということもあり、OpenSocialの仕様が最も早く反映されるようです。そのOrkutのOpenSocial実験環境はSandboxと呼ばれ、通常のOrkutアカウントを拡張したSandboxアカウントを取得することで、利用可能となります。

アカウントを取得するにはコチラから申請を行ってください。申請が受理されるまでには数日を要するようです。

OrkutにOpenSocialアプリを追加する

無事アカウントの取得ができたら、実際にアプリケーションを試すことができるようになります。ちなみに、どこかのサーバーにGoogleGadgetのXMLファイルを置いておく必要がありますので、Geocitiesでも何でもいいはずですので、ファイルをアップできるところを用意しておきましょう。

Orkut1

Sandboxにログインするとこんな感じ。一見通常のログイン画面と変わりませが、一点だけ:

Orkut2

画面左にアプリケーションを追加するリンクがあります。クリックすると・・・

Orkut3

URLでXMLファイルを指定してアプリケーションを追加することが出来ます。(ちなみにアプリケーションディレクトリはいつもほとんどアプリがありません)

ここでは、僕の作ったアプリケーションで試してみましょう。URLに下記を入力します:

http://devlab.agektmr.com/OpenSocial/FriendIntroducer.xml

「アプリケーションを追加」ボタンを押すと、次の画面に遷移します。

Orkut4

ここでも「アプリケーションを追加」ボタンを押すことで、アプリケーションの追加が完了します。

Orkut5

こんな感じの画面が表示されたら成功。Orkut上に友達がいない方は、僕のアカウントに友達申請してくれてもOKです。

ひとまず、第一回はここまで。

View Comments add to hatena hatena.comment (1) add to del.icio.us (0) add to livedoor.clip (1) add to Yahoo!Bookmark (0) Total: 2

3月 17 2008

Shindigのphp版を試す

Published by Eiji under OpenSocial, Widget

先日のGoogleディベロッパー交流会でShindigのphp版が公開されていることを知り、試してみました。

Shindigをチェックアウトする

> svn co http://svn.apache.org/repos/asf/incubator/shindig/trunk .

Shindigのソースがチェックアウトされます。(今回試したリビジョンは637739)

> ln -s ~/Development/Shindig/php/gadgets /Library/WebServer/Documents/gadgets

これでローカルホスト上で見れるはず。ブラウザに下記のURLを入力します。

http://localhost/gadgets/ifr?url=http://www.labpixies.com/campaigns/todo/todo.xml

NotFound

見れません、、、

httpd.confを修正

どうやら、Mac OS X(Leopard)のhttpd.confのデフォルト 設定が邪魔している模様。

/etc/apache2/httpd.conf

を書き換えます。/etc/httpd/httpd.confではないことに注意。(Tigerはこれだった)

<Directory "/Library/WebServer/Documents">

内の

AllowOverride None

AllowOverride All

に変更します。これでいけるはず。。。

ToDoGadget

できた!これで、色々いじれますよ・・・

View Comments add to hatena hatena.comment (2) add to del.icio.us (0) add to livedoor.clip (0) add to Yahoo!Bookmark (0) Total: 2

Next »