2009年12月22日火曜日

opensocial-actionscript-client を試してみた

mixiアプリ用に、いい感じにユーザ情報を取得してくれるAPIはないものかと探しまわって、opensocial-actionscript-clientというライブラリが見つかったので、試してみました。とはいえ、まだまだ頻繁に更新が入っていて、実用に耐える代物になるのかはよく分からないので、ほんとに試してみただけ。

ライブラリは、Google Code のページDownloads にありますが、12月18日(金)の時には、一部ファイルの中身が空っぽだったりと、不完全なものだったので、直接 Source から、SVNでダウンロードしました。


ファイルを取得できたら、src/org/ 以下を適切な場所に移動してあげてください。

JsWrapperClient クラスが、Externalinterface でもってJSとのやり取りをするんだと思います。このクラスを初期化して準備が完了するまで、利用することができない様子。

  1. package {  
  2.     import flash.display.Loader;  
  3.     import flash.display.Sprite;  
  4.     import flash.events.Event;  
  5.     import flash.net.URLRequest;  
  6.     import flash.text.TextField;  
  7.       
  8.     import org.opensocial.client.base.Person;  
  9.     import org.opensocial.client.core.Feature;  
  10.     import org.opensocial.client.core.OpenSocialClientEvent;  
  11.     import org.opensocial.client.features.AsyncDataRequest;  
  12.     import org.opensocial.client.features.PeopleRequestOptions;  
  13.     import org.opensocial.client.features.ResponseItemEvent;  
  14.     import org.opensocial.client.jswrapper.JsWrapperClient;  
  15.       
  16.     [SWF(width=210, height=130, backgroundColor=0xaaaaaa, frameRate=30)]  
  17.       
  18.     public class Main extends Sprite  
  19.     {  
  20.           
  21.         private var _client:JsWrapperClient;  
  22.           
  23.         public function Main()  
  24.         {  
  25.             // ラッパークライアントの初期化とスタート  
  26.             // 完了してからリクエスト処理へ  
  27.             _client = new JsWrapperClient('opensocial.flash');  
  28.             _client.addEventListener(OpenSocialClientEvent.CLIENT_READY,   
  29.                 function(e:OpenSocialClientEvent):void {  
  30.                     _client.removeEventListener(OpenSocialClientEvent.CLIENT_READY, arguments.callee);   
  31.                     request();  
  32.                 }  
  33.             );  
  34.             _client.start();  
  35.         }  
  36.           
  37.         private function request():void   
  38.         {  
  39.             // リクエストオプションインスタンスを作成する  
  40.             var options:PeopleRequestOptions = new PeopleRequestOptions()  
  41.                                                     .setUserId('@me')  
  42.                                                     .setGroupId('@self');  
  43.               
  44.             // 非同期データリクエストインスタンスを作成する  
  45.             var req:AsyncDataRequest = new AsyncDataRequest(Feature.PEOPLE_GET, options);  
  46.               
  47.             // 完了時のイベントリスナーを追加する  
  48.             req.addEventListener(ResponseItemEvent.COMPLETE,   
  49.                 function(e:ResponseItemEvent):void {  
  50.                     req.removeEventListener(ResponseItemEvent.COMPLETE, arguments.callee);  
  51.                       
  52.                     // 結果表示用  
  53.                     var loader:Loader = new Loader();  
  54.                     loader.x = loader.y = 5;  
  55.                     addChild(loader);  
  56.                       
  57.                     var tf:TextField = new TextField();  
  58.                     tf.width = tf.height = 90;  
  59.                     tf.x = 100; tf.y = 10;  
  60.                     addChild(tf);  
  61.                       
  62.                     // 取得したデータを取り出す  
  63.                     var person:Person = e.response.getData();  
  64.                       
  65.                     // ニックネームを取得  
  66.                     var displayName:String = person.getDisplayName();  
  67.                     tf.appendText(displayName + "\n");  
  68.                       
  69.                     // サムネイル画像を取得  
  70.                     try {  
  71.                         var urlRec:URLRequest = new URLRequest(person.getThumbnailUrl());  
  72.                         loader.load(urlRec);  
  73.                         loader.contentLoaderInfo.addEventListener(Event.COMPLETE,   
  74.                             function(event:Event):void {  
  75.                                 trace('load complete');  
  76.                             }  
  77.                         );  
  78.                     } catch (e:Error) {  
  79.                         throw Error('load error');  
  80.                     }  
  81.                       
  82.                 }  
  83.             );  
  84.               
  85.             // 呼び出しを行う  
  86.             req.send(_client);  
  87.         }  
  88.           
  89.     }  
  90. }  


本当に単純に表示だけ。

必要な機能があるかどうかは、Docs とにらめっこしないといけないです。そもそもどういう機能が必要なんだろう...。

2009年12月16日水曜日

ルパンはとんでもないものを盗んでいきました

くそーかっこいいな。

BAYONETTAのブログパーツにも似たようなのがありましたけど、この手のパーツは迫力あっていいなぁ。

参考サイト
SPECIAL BLOGPARTS スペシャルブログパーツ
BAYONETTA - ベヨブログ

2009年12月10日木曜日

Google Chrome で 1Password (little) を使う

いよいよ Google Chrome が Mac でも利用できるようになりました。まだ Extension は利用できないですが、すぐにできるようになるんでしょう(きっと)。で、Mac で Google Chrome を利用するとして、外す事ができないだろう Extension に、1Password があります。Google Chrome について、1Password 公式ブログでは、(一時的な)Bad News だとして、「まだまだ Google Chrome にはたくさんの変更が加えられるから、ウチみたいな小さなソフト屋はそこにマンパワーを避けないんだよ」としています(英訳適当)。そこで Good News として、Bookmarklet を作成する方法、little 1Password を紹介していました。


まずは 1Password を起動。左下の New Logins Bookmarklet を選択します。ダイアログが出てくるので、Continue をクリックします。


全てを含むか、選択されたフォルダだけ含むかを選択して、Update Now ボタンをクリックすると、Safari のブックマークに作成されます。


ブックマークから、ブックマークバーに、作成した Bookmarklet を移動します。現在の Google Chrome は、ブックマークバーのブックマークしか、インポートしてくれないそうです。


公式では、Google Chrome を初めて起動したときのインポートの紹介をしていましたが、私は既にGoogle Chrome を起動済みだったので、メニューバーの [Chrome] - [ブックマークの設定とインポート]からインポートを行いました。


以上で、無事 Bookmarklet として、1Password を利用する事ができるようになりました。

Mac で Extension が使えるようになって、そこそこ充実してきたら、乗り換えてもいいかな。windows での使用は中々だったので、楽しみです。

参考サイト
Tip: Get a little 1Password 3 in Google Chrome now (Opera too!)

文字入力中に iPhone のアプリが落ちるようになった

大変肝を冷やしました。

事の発端は出勤時、Evernote でテキストを入力していると、突然 iPhone が落ちて、リンゴマークが出てきました。かなりびっくりしたけど、しばらくすると再起動し、問題なく動き始めました。その後しばらく機嫌良く動いてくれていたけど、帰宅途中に Appigo Todo を利用していると、今度はアプリだけが落ちた!続いて Evernote やメモ帳などを使用してみても落ちる!どうも日本語入力を使用として、変換候補が出るタイミングで落ちるらしい。

仕方がないので、帰宅後 iPhone を復元し、バックアップでもって元に戻した。その後、問題の日本語入力を使用としたところ、変換候補として「□□□□□□□□□□□□□□□□□□□」なんてのが出てきた(スクリーンショットを残しておいたらよかった)。やめればいいのに好奇心に勝てず、その候補をクリックした瞬間、またアプリが落ちた!どうも変換候補に変なものが紛れ込んでいるようだけど、復元したのに残ってるようなのをどうやって消すんだと探してみたら、普通にあった。

設定 -> 一般 -> リセット -> キーボードの変換学習をリセット

でもって、リセットを行ってあげると、問題なく動作する事になりました。あせったー。

複数の swf を利用するときに気を付けたいこと

やっぱり忘れてやってしまうので、メモ。

複数の swf を読み込んで表示する場合、それぞれの swf の中に同じ名前のクラスが存在すると、一番最初に読み込んだクラスが優先されます。

都度全パブリッシュをしていれば問題ないのですが、開発中などは面倒なので、部分的にパブリッシュしてテストすると思いますが、「あれ?適用されてないぞ。なんだなんだ?」といって、余計に時間がかかってしまったりもします。

複数の swf を利用していて、単純な修正が適用されていなかったりした場合、まずは疑ってみるべきでしょう。

2009年12月4日金曜日

Google日本語入力がおもしろい

涙目?のジャストシステムを尻目に、さっそうと現れたGoogle日本語入力が、その豊富な語彙と強力すぎるサジェスト機能でもって、なかなかに笑わせてくれます。

入力: それで
候補: それでも
それでもボクはやってない

映画のタイトル。未だに電車に乗れなくなりそうで、怖くて観られない。

入力: そくした
候補: 即した
即死耐性

ゲームか何かっぽい。デスとかムドとか?

入力: どうして
候補: どうしても
どうして君を好きになってしまったんだろう

「東方神起」の曲だそうな。

入力: よって
候補: よってけポポラ

これは予想できなかったw山形県東根市にある、JAさくらんぼひがしねファーマーズマーケットの「よってけポポラ」という物産店だそうで。こんなことがなかったら知る由もないだろうなw

入力し終えた内容によって、候補が変わってくるようなので、常に同じ候補が出てくるわけではないけど、予想外の候補がなかなか面白いです。