2009年10月26日月曜日

Flex/AdobeAIRのComboBoxの表示をアイコン付きにする




こんな感じの、アイコン付きのコンボボックスをAdobeAIRで作りたかったんですが、デフォルトのコンポーネントではできないみたい。
ItemRendererを使えばリスト内は好きなようにレイアウトできるけど、コンボボックスの選択表示はテキストだけになっちゃうし。

ということで、これも作成してみました。
view.IconComboBox.as

package view {
import flash.display.DisplayObject;

import mx.controls.ComboBox;
import mx.controls.List;
import mx.core.ClassFactory;

public class IconComboBox extends ComboBox {
private var internalDropdownFactory:ClassFactory = new ClassFactory(List);
private var displayIconObject:Object;

public function IconComboBox():void{
super();
internalDropdownFactory.properties = { iconField : "icon"};
dropdownFactory = internalDropdownFactory;
}

private var _iconField:String="icon";
[Bindable]
public function set iconField(value:String):void {
_iconField = value;
internalDropdownFactory.properties = {iconField : value};
}

public function get iconField():String{
return _iconField;
}

override public function set selectedIndex(value:int):void {
super.selectedIndex = value;
if (value!=-1){
showIcon();
}
}

private function showIcon():void {
var displayIcon:Class = itemToIcon(dataProvider[selectedIndex]);
if (getChildByName("displayIconObject")) {
removeChild(getChildByName("displayIconObject"));
}

if (!displayIcon) {
textInput.x = 0;
return;
}

displayIconObject = new displayIcon;
displayIconObject.name = "displayIconObject";
addChild(DisplayObject(displayIconObject));

DisplayObject(displayIconObject).x = getStyle("cornerRadius");
DisplayObject(displayIconObject).y = (height-DisplayObject(displayIconObject).height) / 2;
textInput.x = DisplayObject(displayIconObject).width + getStyle("cornerRadius");
}

override public function set measuredWidth(value:Number):void {
if (displayIconObject != null) {
super.measuredWidth = value + (DisplayObject(displayIconObject).width + getStyle("cornerRadius"));
} else {
super.measuredWidth = value;
}
}

public function itemToIcon(data:Object):Class {
return data[iconField];
}
}
}


このクラスをMXMLで指定するのはこんな感じ。
<mx:Window xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:view="view.*">
<view:IconComboBox dataProvider="{myDataProvider}" iconField="image" labelField="name" />
</mx:Window>

iconFieldにはイメージのプロパティ名、labelFieldにはテキストのプロパティ名を指定します。

これぐらいのもの、デフォルトであってもよいんでないかしら?
...いや、実は既にあったらどうしよう..
• • •

2009年10月24日土曜日

ActionScriptでAtom/RSSを扱う

作成している空うさぎで、RSSの読み込みを対応するため、Atom/RSSのフィード解析を作っていました。

はじめは、as3syndicationlibというのを使ってみました。
Atom,RSS1.0,RSS2.0を判断し、扱いやすいオブジェクトに変換してくれるものです。
ですが、Gmailのフィードが解析ができない、Redmineの更新日付がとれない...などの現象がみえたので、自分で作ってみました。
はじめは、自分で作るなんて面倒だしな〜と二の足を踏んでいたのですが、いざ作ってみると簡単に作れるもんですね。

まずは、Atom, RSS1.0, RSS2.0の判断ですが、XMLに記述されている名前空間で判断します。

<feed xmlns="http://www.w3.org/2005/Atom">

上記の名前空間は、ActionScriptのXMLでは、namespace()という所に格納されているのでそれを使います。

public function parseFeed(xml:XML):void {

if (xml.namespace().uri.toLowerCase() == "http://www.w3.org/2005/atom"
|| xml.namespace().uri.toLowerCase() == "http://purl.org/atom/ns#") {
trace("atom");
return;
}

var namespaces:Array = xml.namespaceDeclarations();
for (var i:uint = 0; i < namespaces.length; ++i) {
if (namespaces[i].uri.toLowerCase() == "http://purl.org/rss/1.0/") {
trace("This is RSS 1.0");
return;
}
}
}

if (xml.name() == "rss" && Number(xml.@version) <= 2) {
trace("This is RSS 2.0 or 0.9.*");
return;
}
}

こんな感じ。

次にフィードの種類毎で値を取得していきます。
例えばTwitter検索では、以下のようなAtomのフィードが取得できます。

<feed aaa:lang="en-US" xmlns:google="http://base.google.com/ns/1.0" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns="http://www.w3.org/2005/Atom" xmlns:twitter="http://api.twitter.com/" xmlns:aaa="http://www.w3.org/XML/1998/namespace">
..(省略)..
<entry>
<id>tag:search.twitter.com,2005:4967308299</id>
<published>2009-10-18T14:56:45Z</published>
<link type="text/html" href="http://twitter.com/aqubi/statuses/4967308299" rel="alternate"/>
<title>今はRSSフィードの読み込みを実装中 #sorausagi</title>
<content type="html">今はRSSフィードの読み込みを実装中 <a href="http://search.twitter.com/search?q=%23sorausagi"><b>#sorausagi</b></a></content>
<updated>2009-10-18T14:56:45Z</updated>
<link type="image/png" href="http://a3.twimg.com/profile_images/60942919/usa200_normal.png" rel="image"/>
<twitter:source><a href="http://apiwiki.twitter.com/" rel="nofollow">API</a></twitter:source>
<twitter:lang>ja</twitter:lang>
<author>
<name>aqubi (ogawa hideko)</name>
<uri>http://twitter.com/aqubi</uri>
</author>
</entry>
...(省略)...
</feed>


feed/entry にエントリがあるので、xml.entry と取ってきたいところですが、namespaceが指定されているのでその指定が必要になってきます。

public static const ATOM:Namespace = new Namespace("http://www.w3.org/2005/Atom");

public function parseAtomFeed(xml:XML):void {
var list:XMLList = xml.ATOM::entry;
for each(var item:XML in list){
trace("id=" + item.ATOM::id);
trace("title=" + item.ATOM::title);
}
}

ちょっと面倒ですけどねー。

エントリに含まれる日付ですが、
Atomの場合だと、2009-10-09T12:42:06Z というフォーマット。
Rssの場合だと、Wed, 14 Oct 2009 18:32:33 GMT というフォーマットが入ってきます。
この解析は as3corelib の中の com.adobe.utils.DateUtils を使って解析できるようです。
Atomの場合は、DateUtils.parseW3CDTF , RSSの場合は、DateUtils.parseRFC822 を使います。

これらの方法を使って、それなりに解析できるようになったんですが、やっぱイメージが欲しくなる。
Twitter検索の場合は、<link type="image/png" で、ユーザのイメージURLが取得できるんですが、こうやって指定してくれているフィードは少ない気がする。
ぜひフィードプロバイダはこぅいぅイメージのURL情報を提供していく方向にしてもらいたいw
• • •

2009年10月8日木曜日

JJUG CrossCommunityConference 2009 fallに行ってきた

JJUG CrossCommunityConference 2009 fallに行ってきました。

台風直撃中ということで、どうなるかと思いましたが、無事開催されてました。
恒例の女性チェックですが...いやぁ〜少なかった。5人以下だったんちゃぅかなぁ....女性頑張れっ!

遅れて到着したのですが、イベント自体が30分遅れで開始だったらしく、最初の基調講演の途中から参加してきました。


日本のクラウドと開発者の未来
丸山 不二夫 (日本Javaユーザグループ 会長/早稲田大学)

・Googleはクラウドの完成者であり、学ぶ点はやはり多い。
・携帯の利用者が増え、クラウド不足になるだろう。
・モバツイッタは、昔は1台のサーバでやっていたが、20万PV/月で限界だった。
・開発者は、技術だけでなく、ビジネス、政治、経済の観点をもっと持つべき


OPEN AIR FROM SEKAI (セカイカメラのオープン化戦略)
井口尊仁(頓智・(とんちどっと)株式会社)

2週間前にリリースしたセカイカメラ。
操作性には難点あるものの、現実として目の前に現れたARに興奮してる人も多いはず。
今リリースしているのはiXというもので、携帯でも使えるような軽いものとしてnX, ビジネスに寄ったものとして eX, コンシューマ向けに寄ったものとしてgXというのを考えているらしい。

・AirTag
文字だけでなく、動画、URLのリンク、ビアノ(音が流れる?)なども予定。
・AirProf
プーザのプロフィールが含まれていてv2で公開予定。v2は11月に公開予定らしい。
名刺のような情報をお互い交換したり...ってのみたい。

AirFilterという機能の部分がapi公開されるらしい。
タグがどんどん増えていったらどのようにFilterするのか?がミソになると思うが、その部分を自作できるってことかなぁ?
例として出されていたのが、ハッシュタグのフィルタや、Twitterのfollowerのみ表示とか。
例えば、空にはあまりタグがないので、空にかざしたりしたら天気予報がみれるとか。

あと面白そうなのが、SekaiSwitch。いろんな世界に切替できる!
例えば、すごろく世界とか、ガンダム世界とか。
人にかざすと、あー、あの人ジオン軍だから敵だ。とか?
実装はまだでこぅいぅものを作りたいって案の段階らしいですが、おもしろそうです。

そうそう、「ライフログ」という単語が話の中で出てきました。
ライフログ、コミュニケーション というのは注目の単語です。

セカイカメラのようなサービスはいっぱいあるようなんですが、日本でいち早く乗り出しして運用を始めたのは凄いです。
こんなんあればいいのにな。ってアイデアは誰でも出せるけど、それを実行に移すのは勇気いるだろうな、経営者は。
でもそんな、「世界を変える」意気込みで何かを取り組む仕事をするのって凄く憧れますな。


デベロッパのためのHTML5入門
白石俊平(株式会社あゆた)

凄いぞ、変わるぞ....と巷で評判のHTML5.
HTMLのマークアップ方法がガラっと変わるぞ! → sectionタグ、articleタグ。
<h1>の記述の観点も変わってくる。

この文書構造をかけるマークアップは待ってました!って観点。しかも、これから凄く重要になると思う。
ここらへんとちゃんと指定したHTMLが増えてくると、検索の精度もあげれるだろうし、ブラウザとは違う媒体で使用したいときにも使えるコンテンツにもなり得るかもしれない。
CanvasとかFormの機能とか、ぱっとみておお!っと思う機能もあるけど、secitonタグとかをw3cで整備するのは地味であるけども凄く重要と思う。

まぁ、といいつつ Operaが実装しているFormの機能はすばらしいですね。
入力チェックも簡単に実装出来るし、エラーの表示もブラウザの機能でやってくれたら統一感もあって使用者にとっても嬉しい。
あと、これからの時代には必須になるだろうオフライン機能、WebWorkerなどなど。。。

今回のJJUGが、結構クラウド一色だったせいもあるんだけど、クラウドが一般的になった将来を見据えてクライアント部分の強化を進めている感がありますね。


Google wave で始まるリアルタイムコミュニケーション
a2c@atusi

waveはまだアカウントがなく、触った事がなかったんですが、なんか感動しました。
waveの機能が凄い!っていうよりも、これからのアプリケーションの方向性というか、これから作るならこれぐらいの機能はいるよ!とか、こういう機能をAPIで外だししたらどう?とかいうのをGoogleがみせてくれてるんだなぁーって思った所に。

waveは3つの構成でできている
・クライアント
・api .... RobotApi, GadgetApi
・プロトコル ...XMPP

まずはクライアント。
よく使う操作は、ショートカットでさくさく入力できるように。
PlayBack機能で、ドキュメントの変更経緯/手順を確認できる。
コメントに対してコメントがつけられる。さらに、コメント内の文字に対してもコメントがつけられる。

次にapi。
RobotsApiのContentsAssist系のものとして、Spelly(スペル補完)、Linkey(リンクにするもの)、kasyntaxy(シンタックスハイライト),Rosy(自動翻訳)。
multi-wave-applicationの機能として、polly...複数に分かれたものを統合してくれるもの。例えば、いろんな人にアンケートをとり、それを集約するとか。bloggy...複数のwaveをまとめてBloggerにポストしてくれる。

個人的にインパクトがあったのが、サーバとクライアントとでやりとりする情報の粒度。
「操作の情報」の粒度らしいです。"abcと入力された後に、defと入力された" のような情報をクライアントで取得し、クライアントが "abcdef" とレンダリングする。
だから、入力がリアルタイムでみれたり、Playbackの機能が実現できるんですねー!
waveのクライアントはその機能を目で見えるために、リアルタイムに反映されるのが見えるようにしているだけで、特にリアルタイム反映はする必要はないのでしょう。クライアントアプリの好きにしたらいい所だけだし。
でも、サーバに保存する情報はそれくらい細かな情報を記録していくってのは確かに今後は多くなってくるのかも。

サーバに保存する情報量はクラウドのおかげで、意識しなくてもよくなった。それにより、どのように加工も出来る最小の単位で情報を保存していく事になる。そして、その情報をどう見せるのか? はクライアント次第。


クラウドアプリケーションの作り方 : edge2.ccの挑戦
浅海智晴(edge2.cc、匠Lab)

改めて言葉として聞けた事で、納得できたし整理できたいいセッションでした。
edge2.ccでは以下の3つの観点を考えながら実装を試しているとのこと。
・Webアプリ
 HTML5により、クライアントは元々のクライアント...クラサバ時代の重量系クライアント...に戻るのではないか。
 (スケールを考えると)サーバは制限が多くなってきたが、クライアントは色々簡単にできるようになってきた。
・スケーラビリティ
 サーバでどれだけ処理がかかるかは分からないため、非同期で処理をする必要がある。
 メッセージキューに処理を渡して、クライアントではすぐに処理に復帰する。
 非同期は必須になるば、やみくもに非同期処理を実装してるとくちゃくちゃになる。実装者に非同期処理の全てを記述してもらうのは現実解ではないだろう
 edge2.ccではGAE/Jで試しているようで、非同期処理は タスクキューとクーロンで実装している。
 Momを使うのが現実解だと思うが、GAEでは使えない。Apache Camelも使ってみたい。
・分散アプリ
 今までのアプリと比べ、"故障"と"遅延"が問題になってくる場合に注意が必要。
 今までは絶対故障は発生しないようなコードも、故障になる場合がある (GAEを使っているとよく分かる話)
 遅延も一緒で、例えばメモリ内で保持している情報を取得する時だって、もしかしたら30秒程かかってしまうかもしれない。

SimpleModelerというので↑の現実解を探っているらしい。SimpleModelerは、モデルをScalaのDSLで書いてコード/仕様書を自動生成するものらしい。
非同期でログを出力させたり、管理情報をメモリCacheにいれて一定時間たったらcronでflushさせるという仕組みを自動生成するため実装者は意識しなくてもok.
正直、SimpleModelerというもの自体にはそれほど興味は起きなかったのですが、クラウドを使ったアプリはいろんな試行錯誤しないと上手く出来ないのは確か。


ローカルマッシュアップで広がるIMEの新たな可能性 adamrocker(日本Androidの会)

Androidでのアプリケーションの特徴と作成方法、Simejiの紹介でした。
Androidは全くタッチしていなかったので、へーっと思い聞いてました。

Androidとは直接関係がないのですが、データのコンテンツ種類の話がでて思わず考えちゃいました。
今までは、テキスト がメインだったんですけども、それ以外にも、画像(カメラ), ブックマーク、位置情報(GPS)、動画(Youtube)などいろんなものありますよね。
いろんなサービス、コンテンツを組み合わせてローカルでマッシュアップする!
セカイカメラでは 位置情報 が増えただけであんなに楽しいコンテンツが生まれたんですよねー。
頭やらかくしていろんな発想できるようにならないとな。


Mobile 2020 AR/MR/VRの挑戦
佐々木 陽(株式会社GClue)

最後のセッション。本来であればもう疲れて眠いーってなっているはずのセッションなんですが、なんかもぅむちゃくちゃ興奮してしまいました。多分、目はキラキラ、鼻息荒くなってた筈(笑)

タイトルになっている単語は....
・AR 拡張現実 ... セカイカメラとか。
・VR 仮想現実 ... Googleのストリートビューとか。
・MR 複合現実 ... NokiaのNokiaMixedRalityの動画っぽいやつ

セッションでは、2020年までに想像できる未来を語ってくれました。
Microsoft2019とか、NokiaMixedRealityの動画をみると夢物語のような感も生まれてくるのですが、お金の話になると途端に近い現実になる話で、もぅ意識しておかないといけないんだっ!と焦りまで出てくるのが不思議。

中国やインドの人々がどんどん携帯を持つようになって、市場規模が大きくなる。まぁ、これは今みんなが分かってる現実。
でも、ARPVがあがらないと、市場規模は頭打ちの時代がきて大きくならなくなるタイミングがある。
ARPVというのが、携帯に払う月額料金の事らしいのですが、これが$60超えている国はとても少ない。(日本は、ここは先進国)
でも、これがスマートフォンの登場によって中国やインドでもあがってくる。
単純に計算して、6,000円 × 12ヶ月 × 50億人 で 3,600兆円の市場規模!

ChinaMobileでは、AndroidでフルカスタマイズしたOPhoneというのを作ったらしいのですが、これがよく出来てる!
今まではNokiaのようなメーカ頼りだったので思ったようないいものができなかったけど、Androidの登場によって好きなように作れるようになった(サムソンに作らせたらしい)。
しかも、今後、1,000元スマートフォンが出るらしい。昔、Docomoがやった戦略で、キャリアが端末奨励金を出すってやつ。これで確かに爆発的に普及するでしょー。
あのvodafoneも vodafone 360というのを作ったらしいのですが、これもカッコいい!

しかも、スマートフォンだから、携帯というより、パソコンが小さくなって、オマケとして携帯が入っているぐらいの位置づけの方が近い。
そんな事を考えると、パソコンOnlyのサービス提供...というのは考え直さなきゃって思ってきてしまう。
OpenAPMLでARのタグが標準化されたら....
うわーうわー めっちゃ興奮してきますよねーっ!

セッション中には「パラダイムシフト」と何回も言っていましたが、確かに昔夢にみた世界が現実になり始めているタイミングなのかもしれません。Googleがそのための準備をしてくれている。すばらしいっ!
そのおかげで、小さな企業であっても、少人数のグループであっても、個人であっても、「世界を変える何か」を出来るのかもしれないっ!

さぁ、さぁ、引きこもりな人もスマートフォンもって外に出かけなきゃっ!!

最後に、セッション中で流してくれた Microsoft 2019, NokiaMixedRalityを貼っておきます。



• • •

2009年10月5日月曜日

AFriendFeed(仮) 日々更新中

先週から引き続き AFriendFeed(仮)を日々更新中です。ずーっとイジってますw

AFriendFeed(仮)とは、FriendFeed/TwitterのAIRクライアントです。
使って頂いた方からも、いろいろご意見頂いています。本当に有り難うございます!
全てはまだ実装しきれていませんが。。。すいません。

先ほど、0.9.2.5をリリースしました。
既にインストールされている方は、アプリを再起動すると、Updateのダイアログが出てきます。
いくつか、デフォルトの通知フィルタを追加しているので、設定 > 通知 にある [add default filters]ボタンを押して、デフォルトのフィルタを追加お願いします。
特にフィルタをいじっていない人は、全部削除してから、ボタンを押せばok!


...... 使ってみたい!という方は、こちらのページからどうぞ!
AFriendFeedダウンロードサイト
(先日に比べ、機能も整ってきたのでブログでURL公開ww)


状態としては、まだアルファ版のような扱いなのですが、
(ほんとはアルファ版って書く予定だったんですが、先日のブログでベータ版で書いちゃったw)
要望をだしてもらったら取り込む可能性大の状態なので、興味ある方は使ってみて、ご意見よろしくお願いします。


さて、Twitterの機能もそれなりに使えるようになってきたのでご紹介。
DirectMessage, Mentionsの情報も別途取得するようにしました。
DM/RTのポスト、Favorite付けもできるよーになりました。

FriendFeedは使ってないんだよー って方は、設定画面>FriendFeedで表示有無のチェックを外し、 設定画面 > Twitterで表示有無のチェックをつければ、Twitterだけのクライアントになる(はず)

もともと、FriendFeedのクライアントで作ってきたのですが、FriendFeed/Twitterに限らずいろんなデータソースを読み込んで、興味がありそうな単語/人でフィルタをかけて通知する...ってアプリになっていったらいいんじゃ? という雰囲気のツールになりつつある気がします。
たとえば.....RSSも登録しておいてコメントをつけたいものは FriendFeedへURLリンクのポスト+ コメント 登録までしちゃうとか ?
モノがあり、使って初めて気づく所も多いので、今後もいろいろ感じながら作っていきたいと思ってます。


さて、このAFriendFeed(仮)は、AIR GEARで作成したAIRアプリ第2段です。
AIR GEARもやるでしょっ! < 自作自演系

おかげでいくつか、AIR GEARでの修正/追加したい所も見えてきたので、AFriendFeedが落ち着いたらそっちをせねば...
• • •