2009年12月4日金曜日

空うさぎ v0.9.5リリースしました

空うさぎ v0.9.5 をリリースしました。

今回の主な修正点は
・KeyBindを自由に設定できるようにした。
・国際化対応した。(日本語、英語のみ)
です。

WindowsOSの場合でも、キーのショートカットが使えるようになっています!
キーボード派の方は最新版でお試し下さいね。



空うさぎは、AIR GEARで作成しています。そこで...唐突ですが...

AIR GEARで国際化対応するには? 講座 開設



まずは、localeディレクトリを作成して以下のような構成でpropertiesファイルを作成します。


propertiesのファイル名は、もちろん自由なファイル名でok.

次に、プロジェクトのプロパティ > AIR GEAR > Build Property の設定を開きます。


sourcePathに、プロジェクトディレクトリからみたlocalディレクトリのパス/{locale} を。
localeの設定に、en_US,ja_JP を。
allow-source-path-overlapに、 true を
設定します。

これで、設定はOK。

使い方ですが、まずは MXMLの場合。
文字列を指定していたところに、 @Resource(key='Notify', bundle='sorausagi')
とかけば、リソースの文字列になります。あ、bundle名はpropertiesのファイル名。

ASの場合は、最初に起動するMXMLの中に、以下を入れておきます。
<mx:Metadata>
[ResourceBundle("sorausagi")]
</mx:Metadata>

そのMXMLにincludeしたASファイルでは以下で取得ができるようになります。
var key:String='Notify';
var ls:String = resourceManager.getString("sorausagi", key);

これで、OSが日本語優先状態だったら日本語で表示され、英語優先状態だったら英語で表示されるようになります。
• • •

2009年11月26日木曜日

AdobeAIRの透明なウィンドウはLinuxでは邪魔者になる罠

AdobeAIRでGrowl風の通知ウィンドウとして、複数作成して表示したい!という事がしたい。

で、はじめはmx:Windowでいくつも画面を作って表示していたのですが、画面を閉じる際に結構CPUを食う状態になってしまった。
で、その対策として、一つの透明画面を作って、ぺたぺたとウィンドウっぽい表示のパネルを貼るように替えました。
透明な画面が前にあったとしても、後ろに見える画面をクリックすると、その後ろの画面が操作できるので。
そうすると、当然ですがCPUの消費も押さえられてよかったーよかったーと思っていたのですが....

Mac,Windowsの動きは上記なのですが、Linuxでは違う事に気づく。
Linuxの場合、透明の画面が前にあると、後ろに見える画面の操作が出来なくなってしまう。

フルスクリーンのものをつくっちゃうと、全く操作不能の状態になった! って感じになってしまいます。

この差についての記述はみつけられていないのですが、
Adobe AIR 1.5 * Managings WindowのalwaysInFront についての説明の所で以下の記述が。
On the Linux operating system, different window managers enforce different rules regarding the window display order:

・On some window managers, utility windows are always displayed in front of normal windows.
・On some window managers, a full screen window with alwaysInFront set to true is always displayed in front of other windows that also have alwaysInFront set to true.


なかなか手強い...
複数Windowを作成する方式にまた戻して、CPUを食わない方法を探るのがよいのか...と悩み中。
• • •

2009年11月19日木曜日

TwitterとFriendfeedでクライアントアプリケーション名を出すまで

api経由でTwitterやFriendfeedのクライアントを作った時、せっかくなので送信元を自分のアプリケーション名にしたいですよね。
こんな感じに
Twitterの時

FriendFeedの時

[SoraUsagi]経由でポストされた状態になってます! なんにもしてないと [API]って表示されます。
ここに名前を出す方法を以下にまとめ。


アプリケーションを登録

まずは、各サービスにアプリケーションを登録します。
Twitterはこちら
FriendFeedはこちら

空うさぎは、AdobeAIRのデスクトップクライアントなので、application typeをclient、access typeをread&writeにします。
登録すると、Consumer keyと、Consumer secret が貰えます。
これがアプリケーションのキーセットになります。見えないように注意しましょう(公開SVNにコミットしないように!)


OAuthで認証する

Twitter,FriendFeedともにOAuthとBasic認証の両方が使えます。
ですが、Basic認証だと自分のアプリケーション名を表示することができません。
さらに、FriendFeedの場合は、API v2 を使う必要があります。v1ではできません。

ActionScriptの場合、oauth-as3というライブラリがあります。
Twitterの場合は一点をのぞいてほぼそのまま使えると思います。一点とは、下記記述ののSTEP1の注意点のこと。


TwitterのOAuth

□STEP1

http://twitter.com/oauth/request_token にConsumer key/secret を使ってアクセスし、oauth_tokenをもらいます。

送信が必要な情報は以下。

oauth_callback=oob
oauth_consumer_key={アプリケーションのConsumer key}
oauth_nonce=Math.round( Math.random() * 10000 ).toString();
oauth_signature_method=HMAC-SHA1
oauth_timestamp=Math.round( new Date().getTime() / 1000 ).toString();
oauth_version=1.0

var signedURI:String = {上記の認証パラメータの値エンコードしたもの};
var sigBase:String = "GET" + {URLをエンコードしたもの} + signedURI;
var hmac:HMAC = Crypto.getHMAC("sha1");
var accessTokenSecret = "";
var key:ByteArray = Hex.toArray(Hex.fromString(encodeURIComponent({アプリケーションのConsumer secret}) + "&" + encodeURIComponent(accessTokenSecret)));
var data:ByteArray = Hex.toArray(Hex.fromString(sigBase));
var sha:String = Base64.encodeByteArray(hmac.compute(key, data));
var signedURI:String += "&oauth_signature=" + encodeURIComponent(sha);

これでできた singedURLをURLにしてGETで取得。
結果で返ってきた、oauth_token を STEP2で使います。

!!注意点!!
encodeURIComponentって書いてますが、これはActionScriptのメソッド。
ですがこれだと通らない文字がでてくるので、UTF8に変換してエンコードが必要です。
Extended UTF-8 in OAuth ActionScript libraryのサイトを参考にしました。


□STEP2

http://twitter.com/oauth/access_token?oauth_token={oauth_tokenをエンコードしたもの}
のURLでブラウザを開きます。
ActionScriptの場合は、navigateToURLでひらけばOK。

ブラウザが開くと、PINコードとして7桁の数字が表示されます。

□STEP3

http://twitter.com/oauth/authorize にPINコードを使ってアクセスし、accessTokenをもらいます。
STEP1での認証用パラメータに以下を追加した形になります。

oauth_token={STEP2の結果}
oauth_verifier={PINコード}

上手く認証が通れば、以下の結果が返ってきます。
oauth_token
oauth_token_secret
screen_name

これで認証処理はおしまい。
認証が必要なAPIには、ここで取得した、oauth_token, oauth_token_secret を使ってアクセスしていきます。
その際はSTEP1での認証用パラメータに以下を追加します。
oauth_token={STEP3の結果}

oauth_token_secret は、KEYを作り出すときのaccessTokenSecretへ設定。
送信したい情報は認証用パラメータに追加した形でsignします。
その際は、KEY名でソートかけた方がいいみたいです。


FriendFeedのOAuth

FriendFeedの場合はPINでのワークフローが無いです。
そのため、STEP3から始めればOKですが、認証用のパラメータはTwitterの時に比べて、以下を変更します。
oauth_callback=oob を削除。
ff_username={FriendFeedのユーザ名} を追加。
ff_password={FriendFeedのパスワード} を追加。

URL は https://friendfeed.com/account/oauth/ia_access_token に。
(WEBアプリの場合はURLとか変わると思う)

上手く認証が通れば
oauth_token
oauth_token_secret
username
が返ってきます。


色々手続きが面倒ですが、ユーザのoauth_token/oauth_token_secretが万が一漏れても、アプリケーションのConsumer key, secretが分からないとなんにもできない状態になるので、アプリケーションの作り手としてはちょっと安心。
• • •

空うさぎ v0.9.4.3リリースしました

先日リリースしたばかりの空うさぎですが、先ほど新しいバージョンをリリースしました。
お使いの方は、アプリを再起動してアップデートお願いします!お願いします!

修正箇所はOAuth認証時に、送信エラーが発生してしまうという件。
ActionScriptで、encodeURIComponentを通しただけではダメだったというのが原因でした。
こちらのサイトを参考にさせて頂きました。

OAuth認証も落ち着いたところで、TwitterとFriendFeedのOAuth認証についてエントリを次回書いてみます。
• • •

2009年11月17日火曜日

空うさぎ v0.9.4.1リリースしました

空うさぎ v0.9.4.1をリリースしました。

今回のリリースの目玉は、OAuth対応です。
OAuth/Basic認証 の両方が選べるようになっていますが、OAuthがオススメ。
なんてたって、OAuthでエントリを書くと、TwitterのWEBページなどから見れる送信元が、「from api」ではなくて 「 from SoraUsagi 」
ってでるようになるんですよー。こんなちょっとした事が凄く嬉しいっす。

でもたまに認証エラーでエントリのポストが失敗する事が。発生する原因がよく分からなくて解決できていません。すいません。。
失敗しても、少したってから(1分くらい?) 送信しなおすといけたりします。
API制限でもないような感じ。
というのも、エントリの取得ではエラーは出ないし、長時間使った後...とかってパターンがあるわけでもない。
日によって頻度も違うので、サーバーのせいな気もします。
なんかご存知の方教えて下さい><

あとの修正点は
- 設定のimport/exportを追加(メニュー)
- エントリのpost画面に何日前のものかを表示
- RSSのエントリでTwitterのものであれば返信可能に
なんかがあります。

FriendFeedはAPIv2を使うように切り替えました。
v2でないとOAuthが対応していないので。(多分..勘違いでなければ...)
v2の場合、エントリのメッセージがTEXTでなくて、HTML形式で返ってくる。
そのため...ハッシュタグとか、人の名前などがリンクつくようになってます。

なかなかv1.0になれない空うさぎでして、未だにどしどし修正しちゃってもいるので、不安定なところがあるかもしれません。
なんかあったら #sora_usagi のハッシュタグでつぶやいてくれたら、見つけ出すのでよろしくお願いします!

さて、空うさぎですが、密かに(?) MA5に応募してました。
作品#116 空うさぎ
今回は、300を超える応募があったそうで、受賞っちゅーのはまぁ望みなさそうですが、このページをみて使ってくれる人が増えると嬉しいなぁー。

P.S.
「からうさぎ」じゃーないですよー。「そらうさぎ」ですよー。
• • •

2009年11月13日金曜日

グーグル的思考

最近、電車の中でグーグル的思考-ジェフ・ジャービスという本を読んでます。家にぽろっと落ちていたので(笑

内容は、
「マスマーケットなんてもうない。今あるのは巨大なニッチだ」
「ユーザに主導権をもたせろ」
....という内容で、Googleだけでなくいろんな企業の実例がでてきます。

この本は、"そこまでGoogleを誉めて、おかしいんじゃないの?" というスタンスで読んじゃいけない。
「Google」という言葉を出せば、本の売り上げが上がることを知っていて、著者が言いたいことをGoogleを絡ませてわざと書いているんだ ってスタンスで読むのがいいと思う。
内容は結構面白い。電車でも寝ずに読めるような気さくな内容です。

Googleはいろんなサービスを無料で提供して、一見どこでお金を回収しているんだろう?と思うけど、広告で巨大な収入をあげているのは有名なお話。
よくよく見てみると、サービスの内容はどれも先につながっていて、最終的には「情報を多く持っているから、収入も得やすい」という形態になっているんですよね。
んでもって、その「情報」はユーザに主導権を持たせるから継続的に、大量に入手できる。。と。

最近、ヌーラボでもCacooというWeb上で図の作成ができるサービスが立ち上がったんですが、"マネタイズはどうなんの?" というつぶやきもちらほら聞こえる。
たしかに、収入がないと会社としてはやっていけないし。

そんな中、このブログにたどりついた検索キーワードをみてみると、最近、「ヌーラボ」という言葉でたどり着いた人が増えているのに気付きました。
会社に興味を持ってもらえる=その会社が作っている有料製品にも興味を持ってもらえる...なんてこともあるんでしょうねー。

つーことで最近感じたのは、

無料のままずっとがんばってもらいたいツールがあった場合...

・会社で何かのツールを購入の検討をする場合、お勧めするのはそのサービスを運営している会社にしてみる
・そのサービスのブクマをはって、検索上位に引っかかってあげるようにする


とかすることによって、自分が使いたいツールはずっと無料のまま頑張ってくれる可能性もあるのかもなぁ~と。...はい、自分でお金は払いたくないって話(笑)

ちなみに、Cacooは FAQをみると、
2010年半ばにプレミアムプランの提供を予定しています。
ってあるのですが、今の無料のところがどうなるのか(制限かかったりする?)はよく知らないです。
状況次第なんだろうなぁーー。
• • •

2009年11月9日月曜日

Cacooで書いた画像をブログに貼り付け

Cacooが正式リリースされました!
読み方は 「かくー」。

このブログでも貼りたいなぁ~って思ってGoogleGadgetとかみようとしていたんですが、ブログに貼り付けるぐらいであれば、iFrameで私は十分でしたw

こんな感じ!


貼り方

1.caccoで画像を保存時に、公開設定にします。
2.図の一覧画面で、「リンク」のボタンを押して「図ビューアの埋め込みコード」が表示されるのでコピー。

3.表示したいところでコピーしたコードを貼り付け!

ちょっと図解したいなぁーって時には手軽に使えていいですねー。
• • •

TwitterのAPI制限

Rate limit exceeded. Clients may not make more than 150 requests per hour.

またもや引っかかってしまった。
• • •

2009年11月2日月曜日

空うさぎ リリースと新しいサイトオープン


空うさぎ v0.9.3.3.3をリリースしました。
バージョン番号がやたら長い(笑)

RSSの読込、リスト表示のフィルタが出来るようになっています。
会社で使うときには、仕事で使っているBTSのRSSフィードを入れたりすると便利なので使ってみて下さい。

それと同時に、新しいサイトに移行しました!
http://sora-usagi.appspot.com/
使用方法はまた情報量が少ないので、これから随時更新していきます〜

次は通知ウィンドウをイジろうかと思っています。
  • 通知ウィンドウをクリップして、ドラッグで移動できるようにする。
  • 通知ウィンドウから返信などのアクションが出来るようにする。

とかできたら便利そうだなぁーと。

あと、データの永続化。うむー、やっぱりした方がいいのかなぁ...と悩み中。

...と、なかなか v1.0にできない空うさぎですが、これからもお願いします!
• • •

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が落ち着いたらそっちをせねば...
• • •

2009年9月24日木曜日

AFriendFeed(仮)ベータ版を使ってくれる人募集!!

FriendFeedのクライアントを作成中なのですが、ベータ版をリリースしようと思っています。
んで、使って、意見をいただける方募集中です。
使ってみる!という方は、Twitter @aqubi に 「やってみる」とご連絡いただけるとありがたいです。

ちなみに、作っているものの特徴としては、
Growlっぽい通知機能を強化&1行表示の一覧で見やすい ってものを目指してます。
FriendFeedと、Twitterの情報をapiで取得し、Twitterで重複しているエントリーは一つにマージします。

まだ検索機能とかはついていないのですが、そこはおいおい。。

一覧はこんな感じ。


←→/Spaceキーで広げることができます。広げるとこんな感じ。


通知の条件/色などの設定は複数設定できて、上からマッチしたものが反映します。


各設定項目はこんな感じ。


通知はしたいけど、全部のエントリなんか結局みないし、邪魔!
エントリの量が多いから自分でわかりやすく色を設定していきたい。
って人にはいいんではないかと思います。

よろしくお願いしますー
• • •

2009年9月20日日曜日

MacBookProが我が手元に



MacBookProが我が手元に届きました。
隣にあるのは今まですごくお世話になっていたMacAIRです。
とりあえず熱暴走をしないだけでも凄く使いやすくなった(笑)

起動もx86で起動するようにもしてみた。自分いじるのは怖いのでソフトを使ってみたよ。SixtyFourSwitcher 1.0

こんな感じの画面で私でも安心して切り替えられますw

AIR GEARも無事動いた....と思いきや、設定画面で保存するとエラーが表示されるなぁ。

java.lang.NoSuchFieldError: CleanDialog_taskName
at net.sf.amateras.air.builder.AirBuilderManager.doClean(AirBuilderManager.java:255)
at net.sf.amateras.air.propertyPages.BuildPropertyPage.performOk(BuildPropertyPage.java:192)
at org.eclipse.jface.preference.PreferenceDialog$13.run(PreferenceDialog.java:964)

保存はできてるっぽいから実作業的には影響あまりなさそうだけど、またみておこう。

FireFoxをインストールしようとおもったら、以下のメッセージが。

入れたら多分動くんだろうけど、そんなに急ぎで欲しいわけでないので、もう少しまってこのメッセージがでなくなってから入れようかな。
• • •

2009年9月12日土曜日

あるといいな サービス

今日は色んなSaasのサービスをみてた。
んで、突然、勉強会サポートサービス あるといいんじゃないかな? と思い付く。

勉強会の会場探し、プロジェクタ/ホワイトボード/USTの用意、会費の徴収、ケータリング/2次会のセッティング...面倒ですね。
それらをサポートしてくれるようなサービスがあったらいいんじゃ?

企業主体のセミナーの場合は、既にそぅいぅサポートって結構あると思うのですが、個人が集まって行なう...利益目的でない..ものって大変だと思う。
でも、勉強会ブームの風潮っていいと思うんですよね。個人単位で、自社の繋がりだけでなく、外とも繋がりが増えつつ情報を共有できることは、業界全体を良くしていこうという気持ちもわいてくる。

だが、利益目的じゃないので、お金もそんなに出せない...と思うので、サポートしてくれる企業を募って、場所提供をしてもらう。そのかわり、その企業の宣伝を15分喋ってもらう時間をつくるとか。
そぅいぅサポートをしてくれる企業は、社会貢献してるって事でいいイメージつく。しかも良い人材も集まるかも!ってメリット付き。
そんな場での宣伝であれば、みんな真剣に話を聞くはず(笑)

他に、こんな勉強会やってみたいって思うんだけど一緒にやってみる人募集 の場があったり、勉強会の紹介ページ、資料Upの場があったりしたらいい感じ。

こぅいぅインフラを整えてあげるのは企業がやるべきって思うんですけど、どーかなぁ?
• • •

2009年9月8日火曜日

Bloggerを上手く使う

このブログはBloggerを使って作成しています。
デフォルトの機能だけを使ってやっていたのですが、結構いろんな方法で便利になりそうな事を知った。


Bloggerへの簡単Post

MacのDashboard用Blogger投稿Widgetなんてのがあります。とりあえずメモ代わりに使うのも有りですな。



シンタックス・ハイライト

SyntaxHighlighterを使いたいが、JavaScriptを何処かに置かないといけないしなぁ...レンタルサーバ解約しちゃったし...と二の足踏んでいたんですが、Widgetで実現できるらしい。
Blogger Syntax Highlighterのページで、[Add to Blogger]ボタンを押すとWidgetが追加されます。
それだけで、文章の中にSyntaxHightlighterの記述をすれば反映されます。


<pre name="code" class="html">
</pre>


...な感じ。もっと早く気づいてればよかったっす。

他に25 Great Blogger Widgetsなんてサイトも発見。
ちゃんと探したら便利なものがまだあるのかしら。

話は変わるんですが、WebページにSubscribeのボタンって最近多くなってきましたよね?
上記の25 Great Blogger Widgetsにある ↓

は綺麗なアイコンでよいなぁー。
こぅいぅのをみんなが使えるようにして欲しいです。。

ツールのアイコンを、ボタンとしてカスタマイズするのって勝手にやっちゃったらダメだんだろうなぁ。。。とも思ったりするので自分じゃナカナカ作るのは難しいですし。

どっかの企業が、色んなツールの開発元と連携してサイズ、雰囲気が統一感のあるイメージやボタンを作ってくれたらめっちゃ嬉しいのにな。
• • •

2009年9月6日日曜日

イマドキの女性マンガ

女性マンガって昔と比べて内容が変わったと思う。

カッコ良くて頭も良い男性が現れて、すったもんだした挙げ句、ハッピーエンド。って本筋はかわらないですけども....主人公の女性の設定が違う。
昔は、「どこにでもいる普通の女性」ってのが多かったように思うが、最近のものは「何かに一生懸命な女性」が多い。
一生懸命なのは、仕事だったり、勉強だったり、スポーツだったりと方向は違うけども。
その方向に向かっては凄く優秀であるって設定が多くて、「どこにでもいる普通の女性」とは違う。
そういう女性だからこそ、かっこ良くて頭がいい男性にも好かれるのだってパターンが多い。

主人公の女性の設定って、基本的には自分とカブるようになってると思っていたんですよね。
自分がまるで主人公になったような錯覚をさせて、ファンにさせる。。と。

どうして、昔と比べて主人公の女性の設定が変わって来たんだろう?

読み手の理想が変わって来たんでしょうね。
カッコいい人が現れるってのも理想だけど、それだけでなく、自分自身が何かに真剣に取り組んでいる。ってのも大きな理想になって来た。って事か。
イマドキの女性中学生/高校生らはこぅいぅマンガを読んで、自分も何かに頑張らなきゃ!って思ったりしてるんかな。
• • •

2009年8月30日日曜日

名前付きのfunctionをネストするとコンパイラがクラッシュ!

AdobeAIRで以下のようなコードを書いた時、良くわからんコンパイルエラーがでます。


原因としては、名前付きのfunctionをネストしたのがダメっぽいです。
ActionScript Compiler (ASC)のバグシステムにも上がってました。→Compiler crash with nested named functions

どんな現象がでるのか...ですが、
エラーは、以下2つのものがコンパイルの度に交互にでたりして、これまた混乱させます。

/Users/ogawahideko/workspace/ws_aslimtimer/test/Test.mxml(2): エラー: クラスをネストすることはできません。

<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" title="Test" layout="absolute">


エラー: Index: 18, Size: 18

java.lang.IndexOutOfBoundsException: Index: 18, Size: 18
at java.util.ArrayList.RangeCheck(ArrayList.java:546)
at java.util.ArrayList.get(ArrayList.java:321)
at macromedia.asc.semantics.ReferenceValue.getSlot(ReferenceValue.java:253)
at macromedia.asc.embedding.LintEvaluator.evaluate(LintEvaluator.java:659)
at macromedia.asc.parser.GetExpressionNode.evaluate(GetExpressionNode.java:55)
at macromedia.asc.embedding.LintEvaluator.evaluate(LintEvaluator.java:1025)
at macromedia.asc.parser.MemberExpressionNode.evaluate(MemberExpressionNode.java:57)
at macromedia.asc.embedding.LintEvaluator.evaluate(LintEvaluator.java:1268)
at macromedia.asc.parser.ArgumentListNode.evaluate(ArgumentListNode.java:45)
at macromedia.asc.embedding.LintEvaluator.evaluateGenericCallExpression(LintEvaluator.java:269)
at macromedia.asc.embedding.LintEvaluator.evaluate(LintEvaluator.java:454)
at macromedia.asc.parser.CallExpressionNode.evaluate(CallExpressionNode.java:46)
at macromedia.asc.embedding.LintEvaluator.evaluate(LintEvaluator.java:1025)
at macromedia.asc.parser.MemberExpressionNode.evaluate(MemberExpressionNode.java:57)
at macromedia.asc.embedding.LintEvaluator.evaluate(LintEvaluator.java:1324)
at macromedia.asc.parser.ListNode.evaluate(ListNode.java:44)
at macromedia.asc.embedding.LintEvaluator.evaluate(LintEvaluator.java:1398)
at macromedia.asc.parser.ExpressionStatementNode.evaluate(ExpressionStatementNode.java:50)
at macromedia.asc.embedding.LintEvaluator.evaluate(LintEvaluator.java:1346)
at macromedia.asc.parser.StatementListNode.evaluate(StatementListNode.java:60)
at macromedia.asc.embedding.LintEvaluator.evaluate(LintEvaluator.java:1867)
at macromedia.asc.parser.FunctionCommonNode.evaluate(FunctionCommonNode.java:104)
at macromedia.asc.embedding.LintEvaluator.evaluate(LintEvaluator.java:1848)
at macromedia.asc.parser.FunctionCommonNode.evaluate(FunctionCommonNode.java:104)
at macromedia.asc.embedding.LintEvaluator.evaluate(LintEvaluator.java:1848)
at macromedia.asc.parser.FunctionCommonNode.evaluate(FunctionCommonNode.java:104)
at macromedia.asc.embedding.LintEvaluator.evaluate(LintEvaluator.java:2321)
at macromedia.asc.parser.ClassDefinitionNode.evaluate(ClassDefinitionNode.java:106)
at macromedia.asc.embedding.LintEvaluator.evaluate(LintEvaluator.java:2042)
at macromedia.asc.parser.ProgramNode.evaluate(ProgramNode.java:80)
at flex2.compiler.as3.Compiler.analyze4(Compiler.java:611)
at flex2.compiler.mxml.ImplementationCompiler.analyze4(ImplementationCompiler.java:279)
at flex2.compiler.mxml.Compiler.analyze4(Compiler.java:153)
at flex2.compiler.API.analyze(API.java:2542)
at flex2.compiler.API.analyze(API.java:2432)
at flex2.compiler.API.batch2(API.java:411)
at flex2.compiler.API.batch(API.java:1117)
at flex2.compiler.API.compile(API.java:1290)
at flex2.tools.SimpleShell.compile_mxmlc(SimpleShell.java:600)
at flex2.tools.SimpleShell.compile(SimpleShell.java:349)
at flex2.tools.SimpleShell.process(SimpleShell.java:179)
at flex2.tools.SimpleShell.main(SimpleShell.java:75)

マイルストーンはFlex 4になっているので、なおるんだとは思いますが...
• • •

2009年8月29日土曜日

Hudsonで分散実行に挑戦

最近、DebianをVMWareのゲストOSとして新しく作り、Hudson環境を作成してます。
Hudsonの環境...といっても、java -jar hudson.war で起動したらOKなので特に手順は要らないのですけどもねー。
私的には、それ以前のOSをセットアップするのが大変ですww

Hudsonにのっけたいプロジェクトの中に、Windows用のツール/ライブラリを使ってビルドしているものがあって、LinuxのHudsonでそのまま実行できないけどどうしようか....と考え、始めに試してみたのは wine
wineは、Linux上でWindowsのexeを実行できるもの。例えば、notepad.exeというWindows用のexeファイルを実行したい場合には、

$ wine notepad.exe

と打てば実行してくれるというなんだが夢のようなものw
当然全てのexeが実行できるというわけでもないのですが。

少し試してみたんですけど、やっぱり、こういう方法は無しかな。。と。
「buildがちゃんと出来る」という安心感を求めて構築しているのに、本当大丈夫かな?って思うような環境でbuildしていくのはなんだか本末転倒な気もして。

そこで、Hudsonで分散実行に今日は挑戦してました。
Linuxをホストとして、WindowsOSのものをスレーブ端末にする。
Windowsでビルドしたいプロジェクトでは、LinuxのHudsonからWindowsにビルドを依頼して処理していく形にしました。

Hudsonによるチーム間の連携に川口さんの記事があります。

結果から書くと、スレーブ端末を追加するのは超簡単です。
Hudson上で、スレーブ端末の名前、アクセスするディレクトリなどを指定して登録。スレーブ端末から、HudsonヘージにあるJNLPのボタンをクリックするだけ。

上記の記事では、slave.jarをコピーして...などなどの文面がありますが、それらは今のHudsonでは要らない。

そんな簡単なのに、色々ハマってた私(笑)
まず最初にハマったのは、
エラーログにホスト名が解決できなかった云々のエラー。
これは、そのまんま、Linuxでホスト名をしっかり入れていなかったのが原因。

次にハマったのは、JNLPのリンクをクリックするとJNLP起動エラーが出てしまう。
エラーが出たマシンの最新Javaバージョンは、Java5。
別のマシンでJava6が入っているものはエラーがでない。
以前にJnlpの書き方により、Java5では起動できるが、Java6では起動失敗するような経験があったので、ま、Java6にあげればいいんだろうなってことで、バージョンアップ。
案の定、Java6にしたらエラー無く動作。

次にハマったのは、Windowsで処理したログが文字化けしてしまう事。
現象としては、windowsのhudsonからsshスレーブを使うときの文字コード取り扱いについてにて書かれているものと一緒。
これはまだ解決できてない。。

ログが文字化けしているから、どんなエラーでとまっているのかが分からなかったので、スレーブ端末ではなく、ホスト端末で実行してエラーの内容を見てみると...antが設定されていないんじゃ?的なメッセージが。
ジョブの設定を見てみると、確かにAntのバージョンの指定とかなんにもしてない...しかも設定する所ない!?
あれー、設定する所あったよな?? なんでないんだろう??
ま、これのオチは、Hudsonの管理にてAntを1つも設定していなかったから。
そうすると、マルチ構成ジョブの設定では表示もされないんですねー。
(フリースタイルでは表示されるような気がしたのは気のせい?)

Hudsonの管理にてAntをApacheから自動インストールするように設定し、ジョブの設定にも設定。んで、いざ実行してみると...次は ConnectionTimeOutError.
エラーのスタックトレースのクラス/メソッド名を見てみると、Antのインストールをしようとしている時っぽい。
不思議に思って http://ant.apache.org にアクセスしてみると...サイトが動いてないっす(涙)
どうやら、丁度Apacheがハックされたタイミングだったらしい。→Apache.org hack
こんなタイミングでくるか? MavenCentralなら分かるけど、Apacheが!

しょーがないので、適当な所にAntのzipをおいて、指定URLからインストールするようにHudsonで設定。

これで無事に動くようになりました。

ジョブにて使うAntやMavenなどはスレーブ端末にも自動でインストールしてくれます。
空いている端末があれば、がんがんスレーブ端末で指定しちゃう?って思わせる感じの手軽さ。素晴らしいです。Hudson。
スレーブにするのは面倒そうーなんて思っている人は、ぜひチャレンジしてみてください。

セットアップしてたマシンは、エラー時にメールが送信できるようにも設定したし、SCPもできるようになったので、それなりに使える子になってきた気がします。

あ、でもちょっと残念なのが、マルチ構成ジョブだとhud美さんが出て来てくれない様子。。

あとは、家にあるNabaztagをもっていて、ビルドエラーがでたら五月蝿く喋らせる ようにしたらOKかなー!
• • •

2009年8月23日日曜日

ASlimTimerに時間経過をGrowl風表示する機能を追加

ASlimTimerに、時間経過の情報をGrowl風に表示する機能を追加しました。

例えば、20分経った タイミングで "気づき"が欲しい場合。
設定画面で、 「20 分毎に確認」と設定すると、20分経ったタイミング毎にGrowl風のウィンドウが出てきます。

注意の場合は、赤。警告の場合は、黄色。確認の場合は、黒色のウィンドウになります。
黒色の場合は、5秒表示後に自動的に消えます。
赤色、黄色の場合は、ウィンドウをクリックしないと消えないようになっています。
0分に指定すると、無効になります。

何か作業をしていると、あっという間に時間が経ってしまい、予定時間をオーバーしちゃいがち...って方はぜひ使ってみてくださいねー。
• • •

2009年8月15日土曜日

AdobeAIRでGrowl - 自作編

ども。先日as3growlで挫折したaqubiです。
その後、AdobeDeveloperConnection:トーストスタイルのウィンドウの作成という記事を発見。
Growlっぽい画面のことを、トーストスタイルのウィンドウっていうんすか。
そんなキーワードで探していなかったよー。

早速中身を見てみた所、NativeWindowをnewしてゴリゴリ書いている感じ。
WordUp は ActionScript プロジェクトなので、NativeWindow クラスを直接使用しています。Flex プロジェクトの場合は、通常、mx:Window クラスを使用してウィンドウを作成します。その他のほとんどの点では、ここで示す手法を ActionScript プロジェクトと Flex プロジェクトの両方に同様に適用できます。
とあったので、mx:Windowでクリクリやってみました。


こんな感じ。おー我ながらいいんじゃないっすかー。

メインの画面が、systemChromeの画面であっても大丈夫なので、ASlimTimerにも組み込めそうデス。

Growlの表示は、mx:Windowを使っています。
mx:Windowはデフォルトでは、systemChrome="standard" つまり、画面タイトルバーが表示されてしまうので、systemChrome="none" にする。
その他、showGripper,showStatusBar,showTitleBarも、もろもろfalseに。

表示位置は nativeWindow.x, nativeWindow.y で位置を指定します。
スクリーンのサイズを取得するには、Screen.mainScreen.bounds で。

緊急(背景が赤)、重要(背景がオレンジ)のプライオリティの場合は、メッセージをクリックして閉じる。
それ以下のプライオリティ(背景が黒)は、5秒たったら自動的に消える ように作ってます。

表示、閉じるタイミングではGrowlチックにふんわり感を出す為に、Timerでalpha(透明度)をいじってます。

コードは、GitHubにコミットしときました。
http://github.com/aqubi/AdobeAIR-GrowlNotification/

サンプルアプリのAIRパッケージを downloadsに置いてみたので、とりあえず動きを見たい!って人はどーぞ。
• • •

2009年8月14日金曜日

AdobeAIRでGrowl-as3growl(挫折)

以前Rawr! FlexGrowl Component Availableというのを試してみたのですが、今回、mikechambersが作っている、as3growlというのを発見し、試してみました。

Rawr! FlexGrowlの方は、"AIRアプリとしてGrowlチックな表示が出来るライブラリ"でしたが、as3growlの方は、AS3からGrowl本体へSocket通信して、表示はGrowlに任せる仕組みのようです。

GoogleCodeに上がっているサンプルでは、Growlのポートが指定されていないので、GrowlServiceクラスの作成時に、以下のようにポートを渡してあげると、IOExceptionは発生しなくなります。

new GrowlService(a, "localhost", 23052);

23052というポートは、Growlの設定画面 > ネットワーク に書いてありました。
また、「受信される通知を聞く」というチェックボックスをオンにする必要もあります。

動かしてみると、以下の感じのパケットが送信されているみたい。

GNTP/1.0 REGISTER NONE
Application-Name: MESH
Application-Icon: file:///Users/****/GrowlTest/icon.png
Notifications-Count: 1

Notification-Name: Foo Name
Notification-Display-Name: Notification Display Name
Notification-Enabled: True

GNTP/1.0 END

でもー、Growlの表示が出てこないんですよねー。
as3growlのドキュメントを見直してみると、
Requirements

* Flash Player 9 or higher
* Development build of Growl with support for the service

Growl Development Build Required

AIR / Flash support in Growl is currently only available in a Growl development build, and is not available in a Growl release. In order to use the library, you must download a development build and compile the build on Mac using Xcode 3.1.


...とな。あー、なんだか残念。
自分だけの環境ならいいけど、みんなに使ってもらうアプリではツライよな。

Growl for Windowsでは結構動いたりするんかもしれないけど?!

java,scalaからGrowlに通知を送る方法 /ゆろよろ日記をみて、Javaでさくっと動かせました。
as3growlで動かなくて悲しくなっていた所だったので、心が落ち着いた(笑)
この方法だと、ネイティブライブラリ(ibgrowl.jnilib)を作成してアクセスする形になるんですね。

脱線しちゃったけど...AS3からGrowlへの通信やりたかったなぁー
AIRアプリでGrowl風Notificationは....作るしかないのかなぁ...
• • •

2009年8月10日月曜日

AdobeAIRでパスワード管理アプリ作ってみた

AdobeAIRでsqliteを暗号化
まぁーとりあえず自分用のパスワード管理アプリでも作ってみようかしら...

とつぶやいてみたものを作ってみた!

アプリケーション:CIPHER-1.0.1.air
ソース:http://my-svn.assembla.com/svn/aircipher

ログイン画面


SQLiteのファイルパスと、DB用のパスワードを入れる所。
DB用のパスワードは、EncryptedLocalStoreを使って保存しています。

DBのファイルは、パス指定が出来るので任意の場所に置く事ができるようになってます。

ただ、今は最初にDBを作成するタイミングでは、任意のファイルを指定すると、DBファイルがない!って言われるので、app-storage:/cipher.db のデフォルトのままでパスワードを入れてログイン。そうするとDBファイルができているので、それをコピーしてもらう必要があります。。(さすが自分用ww)



これが登録画面。簡単な感じ。
Import/Exportの機能もまだない。

あ、DBのパスワードの変更はつけてみた。
接続が成功しているSQLConnectionのreencryptってメソッドで変更できるようです。

今後どーしていくかはまだ分かんないのですが、
まぁ機能はないせいで現時点では AdobeAIRで暗号化DBを使う例 としてのほどよいサンプルになっている感じではあります。
• • •

家に という漫画が大人買いされておいてあったので、読んでみた。
第一巻の 漫画の値段は面白かった。

原稿代、印刷代、配達代...などを考えていくと、雑誌は黒字にはあまりならない。
バカ売れしているものでなければ、ほぼ赤。
んじゃー、どこで儲けているのか?

みたいな内容。
その業界では当たり前の話を聞けるのって凄く楽しい。
特にお金の話になると、業界の知識がなくても、"ほぅほぅ、なるほどー" って思える。

そのほかにも、コンビニの値段や、お葬式の値段、カフェの値段 とかの題材があるけど、銭の話よりも、ストーリー的な話の方が濃いような感じがして...もう少し オオー!と思える銭の話がみたかったなぁ。

まぁ、こういう手の話は書いてはいけない所も多くて大変なんだろうな。

最後は、ちょっとブラックな幕切れ。もう、この本の続きは書かない!って宣言してるみたい。
• • •

2009年7月31日金曜日

JDTのAST

EclipsePluginで、Javaソースを作成する機会があり、org.eclipse.jdt.core.dom.AST というのを使ってみました。
AST...始めは何も意識していなかったのですが、抽象構文木(abstract syntax tree)のことですねー。

ASTを使ってJavaコードを生成する事自体は、そこそこ簡単です。

ASTParser parser = ASTParser.newParser(AST.JLS3);
parser.setSource(EMPTY.toCharArray());
CompilationUnit compilationUnit = (CompilationUnit) parser.createAST(null);
compilationUnit.recordModifications();

を行い、compilationUnitにクラス名やら、メソッドを追加。

ソースとして保存するときには、
IDocument document = new Document(EMPTY);
TextEdit text = compilationUnit.rewrite(document, null);
text.apply(document);
String contents = document.get();

PackageFragmentRoot root = ・・・;
IProgressMonitor monitor = ・・・;
ICompilationUnit compilationUnit = root.createCompilationUnit("test.java", contents, true, monitor);
compilationUnit.save(monitor, true);

とすればOK。

問題は、compilationUnitにどんな感じで、変数やメソッドを書いていくのか... なんですが、始めは訳分りませんでしたww
以下に例を。
//  this.{leftHand} = {rightHand}; を作成

public static void addSettingStatement(AST ast, String leftHand, String rightHand, Block methodBlock) {
Assignment assignment = ast.newAssignment();
FieldAccess leftHandExpression = ast.newFieldAccess();
ThisExpression thisExpression = ast.newThisExpression();
leftHandExpression.setExpression(thisExpression);
leftHandExpression.setName(ast.newSimpleName(leftHand));
assignment.setLeftHandSide(leftHandExpression);
assignment.setOperator(Operator.ASSIGN);
assignment.setRightHandSide(ast.newSimpleName(rightHand));
ExpressionStatement expressionStatement = ast.newExpressionStatement(assignment);
methodBlock.statements().add(expressionStatement);
}

Expressionってなんやねん! ASTからnewSimpleNameでなんか作る意味もわからん。 やたらオブジェクトいっぱい作らされるし....。

ですが、これまた偶然で構文解析についてのお勉強をする機会が別にあって、ふんわり分るようになってきました。
そんな偶然が重なるのってなんだかラッキーです。ここら辺が面白いといっている人の気持ちも少し分るようになった気もする。

ASTですが、Javaコードを作成するために使用することよりも、既存のJavaの構成を知るためにASTを見ていくことはこれからも結構ありそう。
どこを探ったら、どの情報があるのか?が分りにくくなったときには、AST Viewプラグインを使うと良さそうです。
(後で知ったため使ってないけど。)
• • •

2009年7月28日火曜日

AdobeAIRでsqlliteを暗号化

AdobeAIR1.5から、組み込みのsqldbにて暗号化した情報を格納できるようになったらしいので試してみた。
暗号化の部分を管理してくれるのは EncryptedLocalStoreというクラス。
AIR は、Windows® では DPAPI、Mac® OS® では KeyChain、Linux® では KeyRing または KWallet を使用して、暗号化されたローカル ストアを各アプリケーションおよびユーザーに関連付けます。暗号化されたローカルストアでは、128 ビットの AES-CBC 暗号化を使用します。

とのこと。OSの管理機能を使っているんですね。
確かに、アプリの中にKEYを持っていたら、アプリを解析されたらおしまいですしね。

パスワードの保存は、以下の感じ。

/*Passwordの保存 */
private function passwordSave(passwordString:String):void {
var bytes:ByteArray = new ByteArray();
bytes.writeUTFBytes(passwordString);
EncryptedLocalStore.setItem('password', bytes);
}

/* Passwordのload */
private function passwordLoad():ByteArray {
var storedValue:ByteArray = EncryptedLocalStore.getItem('password');
return storedValue;
}


sqldbで使う時には、connection openのタイミングで、password(ByteArray)を渡してあげればOK!

sqlConn.open(file, SQLMode.CREATE, false, 1024, password);

んが! パスワードは 16byte でないといけないらしい。
んー、ユーザにパスワードを任意に入れてもらうようなアプリを作りたい時は、"16byteの文字を入れてくれ!"と言わなければいけないのか?? よくわからんなぁー。

まぁーとりあえず自分用のパスワード管理アプリでも作ってみようかしら...
パスワード管理系の情報が、保存方法に結構迷うんですよねー。

ネット上のサービスはなんかためらっちゃぅけど、とはいえローカルマシンだけに置いておくのもそれはそれで不安だしー。マルチOSで使いたいしー。ソフトに依存してたら、なんかバグった時に復旧できないとツライ...けど、TEXTでバックアップ取っておくのはなんか違うしー。
• • •

2009年7月23日木曜日

ReviewBoard1.0をインストールしてみた

ReviewBoardの1.0をインストールしてみました。
まだ使い方はよくわかっていませんがww

インストールの方法は、本家サイトのAdministration Guideに書いてあります。


インストールメモ
環境は以下でやりました。
OS : VMWare上のDebian
DB : MySQL
WebServer : lighttpd

また、別の環境でUbuntuにも同じ手順でインストールしてみたが上手く動いている様子。

VMWareにDebianをインストール。
インストール後、scsiが認識できない的なメッセージが出て起動しない問題が発生。
.vmxファイルに、以下を追加することで起動できるようになった。
scsi0.virtualDev = "lsilogic"

apt-getを更新
$ sudo apt-get update
$ sudo apt-get upgrade

Python,setuptoolのインストール
$ sudo apt-get install python-setuptools
$ sudo easy_install -U setuptools
$ sudo apt-get install python-dev

後にnose, Sphinxをインストールする時に、python-devってのがいるみたいです。
python-devを入れていないと以下のエラーがでちゃいます。

jinja2/_speedups.c:58: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
jinja2/_speedups.c:120: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token



memcachedのインストール
$ sudo apt-get install memcached
$ sudo apt-get install libmemcache-dev
$ sudo easy_install http://gijsbert.org/downloads/cmemcache/cmemcache-0.95.tar.bz2

パッチのインストール
$ sudo apt-get install patch

ReviewBoardのインストール
$ sudo easy_install ReviewBoard

MySQLのインストール
ReviewBoard用のDB,ユーザ/パスワードを作成しておきます。
必要なTable類は、ReviewBoardのSite作成時に作ってくれるので気にしなくてOK.

$ sudo apt-get install MySQL-server
$ sudo easy_install mysql-python
$ sudo apt-get install python-mysqldb

Database,ユーザの作成
$ mysql -u root -p
mysql> create database reviewboard character set utf8;
mysql> grant create, select, insert, update, delete, alter, lock tables on reviewboard.* to 'reviewboard'@'localhost' identified by 'reviewboard';
mysql> flush privileges;



Subversionのインストール
$ sudo apt-get install subversion python-svn

nose,Sphinxのインストール
$ sudo easy_install nose Sphinx

lighttpdのインストール。
ReviewBoardではFastCGIっつーのを使っているんですが、lighttpdだと、Apache + mod_python or fastcgiよりも早いとか。

$ sudo apt-get install lighttpd

Configの設定はまた後で。

ReviewBoadのサイトを作成
$ sudo rb-site install /var/www/reviews.example.com

/var/www/reviews.example.comの所には、作成したいパスを設定します。
上記のコマンドを実行すると、DBの種類や、DBユーザ/パスワード、WebServerの種類などが聞かれますので、ちゃんと用意して望みましょう〜

権限の変更
作成したサイトのフォルダの権限を変更します。
$ sudo chown -R www-data /var/www/reviews.example.com/htdocs/media/uploaded
$ sudo chown -R www-data /var/www/reviews.example.com/logs

[www-data]っていうのは、lighttpdを実行するユーザ名です。
この設定は、/etc/lighttpd/lighttpd.conf にあります。

lighttpdのConfig設定

作成したサイトに conf/lighttpd.conf があります。このファイル中身はReviewBoardが実行できるような設定が書かれていて、既存のlighttpd.confに追加する形で使用できるようになっています。なので、/etc/lighttpd/lighttpd.confの最後にコピペするか、includeするとかで追加すればOK。

今回の場合は、includeしてくれ!と言わんばかりの構成を作ってくれているので、includeしてみました。
includeするファイルは、 /etc/lighttpd からの相対パスで判断されるので、
$ sudo cp /var/www/reviews.example.com/conf/lighttpd.conf /etc/lighttpd/reviews.example.com.conf

reviews.example.com.confってファイル名でコピー。

$ sudo vi /etc/lighttpd/lighttpd.conf
でconfigを開いて一番最後の行に
include "reviews.example.com.conf"
を追加。

これで、見直すのはコピーしたConfig(reviews.example.com.conf)のみでOKになります。
コピーしたコンフィグに書かれている、
$HTTP["host"] =~ ".........." {
は、ホスト名指定のバーチャルホストの設定とのこと。

今回は、とりあえず試しに入れてみた&他の端末からも見たい ような状況だったので、IP+ポートの指定で変更しました。
$HTTP["host"] =~ ".........." {

$SERVER["socket"] == "192.168.1.1:81" {

lighttpdの再起動
$ sudo /etc/init.d/lighttpd restart

これで無事にみれた。

ここまでやるのに、結構もたついてしまいました。。
こうやって書くと、何に時間くってたんだろう?って思ってしまうけどね〜

こんな事をしていたら、「Rietveldが自由に使える所あったやろ?」という話になり、探してみたらRietveld Code Review Tool
という所を発見。
自由にSubversionとかのリポジトリを登録して、レビューが出来るような所なのか?!
オープンソースのものだったら、ここで直ぐに使えそうですねー。

RietveldはGAEにものるそうで、セットアップも簡単らしい。 Google謹製 ソースコードレビューシステム rietveld(オープンソース版 Mondrian)を動かしてみましょう

やっぱ、セットアップ簡単じゃないとねー!

んでもってこれからは、
セットアップ無し。既にインスタンスされているサーバーを直ぐに使える。
って環境をどんどん作って欲しいもんです。

あと...コードレビューに限らず色んなサービスについて...
有料なら有料でいいけど、個人として試してみやすい料金体系にしてほしいですねー。
個人だからこそセットアップに手間をかけたくない!
• • •

2009年7月14日火曜日

会社でレビューについて話し合い

先日、ソフトウェア・インスペクション・ワークショップ 2009に参加したのですが、資料がUpされていました。

ソフトウェアインスペクション/コードレビューを成功させる方法(前編)
ソフトウェアインスペクション/コードレビューを成功させる方法(後編)
当日行なった技法や観点など

また、このワークショップとは別ですが、研究のためにコードレビュー オンライン ハンズオンの協力者を募集しているようです。

当日は、何かを学んで来た...という感覚はあまり得られなかったのですが、考えてみるいいきっかけになりました。
んで、このセミナーの後に、会社のメンバーと共にレビューについて考えてみよう! という機会を設けて、今日は第二回をやってきました。

レビューの目的って、知識や技術の差(属人性)を埋めるため というのも1つの大きな目的だと思うのですが、その目的からも分かるように、プロジェクト規模や、携わる人間の数/お互いのレベルの認識度 によって変わります。
ヌーラボ@東京は、社員数も片手ぐらいだし、現在新卒採用の人はいない という状態なので、このメンバーでやるとしたら、どんなものがいいのだろう? という話を今日はしてきました。

みんなの意見も聞きつつの感想としては、小規模なメンバーだからこそ抱える不安/心配があるよなーと。

小規模案件 = 携わる人が少ない(1人の時もある)
だと...
ある特定の人のみしか仕様を知らないって事も当然増える。
案件の立ち上がりの時期はペアプロを...という話をした人もそこそこいたんですが、それって結構、同じ知識(要件や今の状態)を共有してる前提で、気軽に相談し合える人が欲しいって事なんだろーなって思いました。

「気軽に相談出来る人」というのが語弊があるかもしれないけど...
同じプロジェクトにいる人ならば、損益はお互い共通しているのでまぁいいんですが、違うプロジェクトにいる人の場合、
"すいませんが、相談のって下さい.."
"いいよ (...でもその分、自分の仕事は残業かな..)"
なんて感じがすると、気を使いますよね。

ワークショップでは、相談乗ってあげる、レビューをしてあげる 事についても、評価を設けるべきだ という話がでてきてはいましたが...作業を日毎に割り当ててスケジュールたてている時点で、なんかもぅ違う。
レビュー選任者を作って、"その人の仕事の30%はレビュー時間に割くように決める" とかも大規模なプロジェクトではありかな。
んが、5人程度のメンバーならば、もっと違う取り組みができるはず。。

まぁ、そんな事を考えていたら、以前、旦那と一緒に仕事してた時はやりやすかったなぁー。と思い出した。

なぜかって...
お互いの得意/不得意を把握してたし、気軽にタスクを交換できる(してもいい相手だと知っている)、こんな事で困ってさぁーって雑談できる時間も多かった。

その結果...

「ここの部分は引き受けるから、変わりにここの部分やってよー」
とか、
「コレには興味あるよなー。んじゃ、このタスク私の方で持つから、調査してみてよ。んで結果教えて!」
とかやってた。

2人で分担できるようになると、「あそこのプロジェクト大変やから、1日徹夜で手伝ったるか!」なんて事も1人の時よりしやすくなった気もする。

周りからも、たとえ一緒にやっていない仕様であっても...2人のどちらかに聞けば分かるんじゃない? と多分思われていたと思う。

なんか、少人数でやっていく会社にとってみても、いい方向性突いてたんじゃないかって気もするな。
• • •

2009年7月12日日曜日

ASlimTimer 1.1.7リリース

ASlimTimer 1.1.7をリリースしました!

今回の変更は不具合修正の他に以下の機能を追加しています。
  • レポート機能
  • 経過時間を今日の合計時間を表示する機能を追加


ASlimTimerは、SlimTimerのサービスを使ったクライアントなのですが、SlimTimerではタスクの一旦停止という機能がありません。

例えば、お昼に行くとか、ちょっと呼ばれたとかのタイミングって、一旦停止したい!って思うのですが、データとして保存するのは結構難しい。

タスクのTimeEntryのデータとして、開始時間と終了時間を保持している形だと、
今のタスクを一旦停止して、違うタスクを開始する...という場合、同じ時間で複数のタスクが実行された事になってしまう。
そのためにSlimTimerでは経過秒としてduration-in-secondsのデータ領域があるように見えますが、WEBベージ上で開始時間、終了時間を更新するとこの領域が自動計算されてしまう。

そこで、目線を変えて、「経過時間を今日の合計時間を表示する機能」というのを追加してみました。
この機能は、タスクの経過時間の表示を、今日に行なった同じタスクの合計時間を表示するというもの。
切替は設定画面で行ないます。

これをすると、今やっているタスクは、今日何時間やっているのか?がわかるようになっています。
まぁ、これも一長一短ありますが、私はこの表示の方が見やすい気がしますー

ASlimTimerですが、使っている人がいるというお話もチラホラ聞こえて凄く嬉しいです!
これからも作業が進めやすくなるものを目指して改造していくので、また機能要望などあればご連絡下さい!!
• • •

2009年7月5日日曜日

モニター体験

VoiceFarmでアンケートしてみました。
モニターとして何か答えるというのは、始めての経験だったんですが面白いですね。

モニターとして行ってみると結構色んな所が目についたりします。
こぅいぅ情報を企業がアンケートとして知る事は確かに凄い有意義な気がした。
私たちの業界でもそうだけど、客からの目線って「目から鱗」の事が結構ある。

今って接客業の方と触れ合う機会って凄く多いから普通の一般市民でも、接客についての目が肥えてたりするんかも。
味がどんなに良くても、接客が悪かったら 「もぅいかない」ってなることも今まで度々あったしなぁー。

味についても、○○だったら美味しいけど、××はイマイチとかあるじゃないですか?
始めに○○を購入したらいいえど、××の方を買ってしまったらもぅその店にはいかなくなる。
あの店はマズい!って判子をぽーんと押しちゃう。

売り上げをあげる為に、新商品を作る! という発想は安易にできるけど、それって博打ですよね。
接客のマニュアルでは、多分、新商品をオススメする というのがあるんだろうけど、それがあんまり美味しく無かった場合、新規顧客のリピートを減らしてしまうかもしれない。
まぁ、こんな事はプロの人からみたら当然の話なんだろうけど、素人目線から見ても、「力入れる方向間違っているよな、この店 」って感じる事も少なくはなかったりもする。

個人としては、新商品が無くても、気に入った美味しいものがあればその店にいくけどな。。
まぁ、気に入ったモノの味が落ちたら、行かなくなるけど。

あー、IT業界でも一緒か。
この製品が売れなくなってきたから、新しい製品をチョィチョィっとつくって売るか とかある話ですもんね。
んで既存製品のサポートに力が注げなくなって、新規顧客を得る為に既存顧客を手放すことになっちゃったとか。うむー。

ちなみに、このVoiceFarmでモニターとして登録しておくと、アンケート依頼メールが随時届くような仕組みになっています。
答えると謝礼もあったりするようなので、主婦されている方は登録しておくとよいかと!
• • •

2009 JavaOne報告会に行って来た

2009 JavaOne報告会に行ってきました。
iPhoneの充電を忘れていたため、Googleのマップも確認できないまま...会場に行けるかどうか不安になりつつ向かう。
あー、もぅiPhone無しじゃー何処にもいけないなぁ と改めて感じる。

会場には20分前に無事到着。眼鏡を忘れてしまったので、空いていた一番前に着席。
隣の席の方が、カメラと取り出した時点で、その方が岡崎さんだと言う事に気づく。
でも私の事は覚えてないだろうなぁ。川口さん交流会で少し喋っただけだし。。と思い、声はかけれなかった。私ってチキンww

最初は 丸山先生の Welcome & General Session Hi-light
JavaOne会場でのいろんな写真をみつつGeneralSessionの内容を伝えてくれました。
OracleCEOのLarry Ellisonは、開催前は 来ないんじゃないか? くるとしても最終日? とかいろんな噂が飛び交っていたそうです。
で初日に登壇したわけなんですが、冗談として、Larryの趣味のヨットに帆(?)にJavaのロゴがついていたり、次回のJavaOneはLarryの日本庭園(凄い趣味だ)でやるだろうとかとかを交えつつ進んだ様子。
Sessionの最後にスコットが壇上から降りた時に、スタンディングオーベーション。
JavaOneの最後にもSunの社員が壇上に上がったという話もあって....なんだか感慨深い感じが伝わってきました。

JavaOneは最後なんじゃないのか? という噂がありますが、まぁ...いまだにどうなるのか分かりませんが、1つの区切りだった というのは間違いないのでしょう。

私自身も、Javaでご飯を食べさせてもらっていて、大分助けられています。こぅやってオープンソースにこだわって進めてくれたSunには本当に感謝しなくちゃ と改めて思わされました。

Update From Sun Microsystems 下道さん

キーワードは、"クラウド" "Crossbow" Crossbowというのは、ネットワークの仮想化技術。
これからは、「どこにサーバあるのか知らんけど、1台に見えるサーバで、すんごい大きいアプリも、小さいアプリもどんどん作っちゃう” って時代になるんですかねー。凄いなぁー。
Sunのホスティングサービス Kenaiもぜひ見てください!との話だったのでみてみました。
オープンソースのプロジェクトを作れるんですね。5つまで作れるのかな?
プロジェクトは1768ぐらい登録されている様子。

ホスティングサービスも色々あって、何処にコミットしていくか悩むぐらいになりましたね。
今まで使っていた Assemblaが最近重くなってきたので、違う所に移行するか丁度悩んでいた所でした。
GitHubと思ったのですが、Eclipseで操作しやすいSVN,CVSがいいなぁと思っていて。でもなんかSunのサービスって重い!って先入観があって、二の足踏む。サイトの表示は軽かったけどね。

ここでBreak. 前でうろうろしていた櫻庭さんに発見してもらって声かけてもらえました。
「 197Xにいかなかったの?」
「旦那が行ってますー」 的なww
異性だから覚えづらいだろうに...覚えていてもらって嬉しかったですっ

Java Desktop / Mobile Session 櫻庭さん

JavaFX TV。ゲームやストリーミングもあるとか。実際どこまで出来るんか楽しみですよね。
多分TVのハード自体にJavaFXが実行できるなんらかの仕組みが必要なんでしょうが、私にはまったく検討が付かない。
でも、もしペペっとプログラム書いたらTVで実行できるような環境ができたら、「あー、プログラム書ける仕事でよかった」と感動できそうだ。
しかしながら、まだリリース未定らしい。残念。

JavaFX 1.2ではmobileでも使えるGUIコンポーネントや、mixin, ローカルストレージなども。
また、デザイナー用ツールとしてAuthringToolも。これは、Flashのタイムラインの開発のような感じのものらしい。
...これも無料で提供してくれるのかな? だったら、私のような貧乏人でもタイムラインをいじってのFlashっぽいものの作成ができちゃぅの?おー、遊んでみたい。
今年の冬には出したいという話があったらしいので...来年には出るのかも??

話はそれるけど、以前のJavaOneで話が出てたのに、全然出てこないものとか消えてしまったものとか結構あるんですね。
こぅいぅ所、個人的には結構びっくりなんですよね。先、どうなるか良くわからないようなものも、そんなに大きなイベントで言っちゃうんだーって所が。
この前Adobeのイベントに行った時は、これはまだ言えない...とかって話が多かったのが気になったんだけど反対だな。
どっちがいいか?っていったらSunのような方針の企業の方が好きだな。

次はJavaSE7の話。
OSGiの対抗っぽく作られていたJAM(JSR277)が消えてしまった話は、裏話っぽくて楽しかった。
検索してみたら、InfoQ:JSR277とOSGiは1つになるか?なんて1年前の記事もあったりしたみたい。
今は Project Jigsawというのでやっているらしいです。

Project Coinというので細かな仕様の修正の検討をしているらしいです。
small change = 小銭 = Coinらしいww
例えば、
Map map = new HashMap();
って書かないといけないのはウザイから
Map map = new HashMap<>();
にするとかってのが有るらしい。これは是非採用してほしーな。
InfoQ:Project Coinによる2つ目の候補リストの発表って記事もありました。

Java in Enterprise Session 木村 さん

J2EEはいろんなアノテーションが増えて、使いやすくなってきましたね。
仕様も膨大なものでしたが、サイズを適正化...って事で、削除するものを検討していっているようです。
他にEJB3.1での@Singletonとか、並行実行性の指定とか、非同期の指定、FileUploadのサポート、Servlet/Filterの動的追加、BeanのValidationとか。
Validationでは @NotNull とか @Length(max=80) とか書けるようです。
この前、こぅいぅValidationのアノテーションを自作しちゃぅか?なんて思った事がふっと思い出されます。。。こぅいぅ仕様を作ってくれると、指定方法自体についても参考になりますね。(真似しやすくなりますね)

Lightning Talk Session

岡崎さんの AIR JavaOne(日本でJavaOneの情報を得る方法)、マイコミの杉山さん、Gihyoの馮さん の 記者の目から見たJavaOne
、櫻庭さんの JavaOneで飢え死しない方法、太田さんのEeePC+OpenSolarisのセッションの内容のご紹介 でした。


最後になりましたが、有意義なイベントの開催有難うございました!

こぅいぅイベントとか、本当に有り難いです。
私も何かお手伝いして貢献したいなぁ〜 どこかで募集してませんかね?
• • •

2009年7月2日木曜日

ソフトウェアインスペクション・ワークショップ 2009に行って来た

ソフトウェアインスペクション・ワークショップ 2009に行ってきました。

定員は60名だったと思うのですが、100名ぐらいが結局参加している様子で、席もいっぱいいっぱいだった事を考えると欠席者も少なかったんじゃないかと思います。
それだけ興味/注目をもって来た方が多かったって事でしょうか。

このワークショップですが、メインはハンズオンとして、実際に個々人でコードレビューを行いその結果を研究材料にするという感じ。
ソフトウェアインスペクションとは? どうやったら効率いいのか? というのを聞きに行くようなものじゃありませんでした。
「コレがベスト。一番効率いいっす!」なんてものはまぁないですしね。

ハンズオンの内容ですが、「仕様書」 と 「コード」 を対象に、或る人は Adhoc, 或る人は SGIT, 或る人は Guided Checklists が手渡され、その観点を元に一定時間内に欠陥を見つけ出す というものでした。
システムはWEBベースの書籍通信販売、レンタルシステムのプログラム。
コードは、JSPとServletがなんと紙ベースで配られた。結構な厚みのを。。。うへぇ
Adhocって?SGITって? とかよーわからんままレビュー開始。紙ベースのコードなので、呼び出し先コードを探すのが、もぅイライラ(笑) しかも使える机のスペースが狭いから、ばーーっと広げることも出来んし、結局時間切れ。
IDEがないとツライ事を実感ww

AdhocとかSGITとかの説明は結局無かったんですが、周りの人のをぱっと見せてもらった感じでは、
Adhocは チェックの観点を簡単に記述したもの。「シングルサインオン」とか、「パスワード再発行」とか観点のキーワードのみって感じ。
SGITは、Adhocよりも細かくチェック観点が書かれていて、Tree形式になっていました。
○○は出来ているか?  yes ----> ××はできているか?
           no ---->
のような感じで。
ChecklistsもSGITみたいに細かいチェック観点が書かれているようでしたが、表形式でした。
多分、どれが一番効率的だったか?を測りたかったのだと思いますが、私のチームではどの方式の人も欠陥はあまり発見できず ???な感じで終了。なにが ??? で詰まってしまったか?を聞いてみたら、言葉の定義が人によって違う所とか、そもそもの前提がわかんなくなったとか、わたしゃJSP/Servletなんて随分前にしか見てないから思い出すだけで時間くったとか、そんな感じでした。。あはは。。

そんな感じのイベントでしたが、頂いた資料や開催中のお話で自分なりに理解したこと、気になったキーワードをピックアップします。

まずは、講師の方の発言の気になった もしくは勝手に読み取ったキーワード。
・レビュー/テストは泥臭い所だけど、カッコいいよね。
・見つけた欠陥は全て記録し、2度と再発しないための根本原因を考える事。
・大きい範囲でやるより、小さい範囲を何回かに分けてやった方が効率がよかった
・何も見ない段階で「欠陥の仮説」をたてるのは有効。
・定型的なミスはコードで検出。検出できないものを目視で という分担を。
・何事にも楽しく行なうのが重要。個人攻撃はもっての他。
・レビューをしても評価がないと、自分の時間を削られるだけ = やりたがらない、適当に終わらせてしまう
・AssistPointの評価、同僚の評価を!
・形式的にやると決められているから、しょうがないけどやらないといけないです という状態になってしまう
・事実をベースに話す (一般的に...、普通は...、前のと比べると...という言葉は使わない)
・レビューは効率的に人を育てることができる
・レビュー専門の職種だと、1年に200程の案件のレビューをできたりする。長年の経験が或る人でも200の案件をこなしている人もあまりいないのでは!?
・なぜ、レビュー/テスト をするのか? → 安心したいから。
・品質については、日本は一目置かれている。 (日本人が品質を話しようとすると黙って聞いてくれるらしい)


「インスペクション」という言葉に、しっかりとした定義はない。
レビューと同等の意味で使われていることの方が多い。(実装者ではレビューという人の方が多い)
ただ、レビューといってもいろんなレビューがあるから、それを分類するのにお互いの合意のもと単語を使い分けても良さそうな感じ。
いろんなレビューですが、例えば、納期前に行なう品質チェックもあれば、技術的部分のレビューもあるし、隣の人にちょっと見て〜!ってお願いするレビューもある。。。

まずはIEEE1028の抜粋記事の抜粋ww

Inspection
目的:欠陥の発見、修正の検証、ソフトウェア品質の検証
意思決定:事前に定義された対処方法を選択。発見された欠陥は修正。
参加人数:3〜6名
主導者:訓練を受けた進行役
データ収集:必須
成果物:指摘欠陥リスト、実施報告書

Technical review
目的:仕様、計画との一致の評価。変更の一貫性の判断。
意思決定:参加メンバーの提案に基づいて管理職や技術リーダーが判断
参加人数:3名以上
主導者:技術リーダー
データ収集:プロジェクト要件ではないが、参加者で共有されることが多い
成果物:実施報告書(担当、完了予定日が記録された対応予定を含む)

Walk-through
目的:欠陥の発見、代替案の検討、製品の改善、習得のための議論
意思決定:作成者の判断を参加メンバーが合意
参加人数:2〜7名
主導者:進行役、作成者
データ収集:推奨される
成果物:指摘欠陥リスト、対応予定、決定事項


私が感じたイメージですが、
Inspectionは計画的に行なうレビューで、実装前の仕様決定のような早いタイミングで行なうもの。(もちコードも対象だけど)
これじゃー仕様満たせないよね?とか、経験上ここらへんヤバいからもっと詳細に仕様書いた方がいいんじゃね?的な感じかな。
この場合は、解決方法を考えるのは無しで、ここは欠陥!とかここは再検討!とかの決定だけをバシバシやっていくのが良さそう。
今回やったハンズオンはInspectionだったんですよね???

Technical reviewは、コードに対して、こうやった方がコードスッキリするんじゃね?とか、こういう処理は、よく○○って名前をつける事が多いからその名前にした方が皆に伝わりやすいよ?とかそういう系のやつですかね。
Walk-throughは、「ここ、こぅしてみたんだけど、あんまり自信ないから、見てほしーどぅおもう?」ってやつですかね。

まぁ、全部やれればいいんでしょーが、只でさえ時間を削る所にされてしまうレビューですから、内容やタイミングによって選択しつつ...ですね。
やる時に、Inspectionしまーす! とか Walk-throughtしまーす! とか名前出したら、目的もわかって良さそうですな。



今の感想としては...実際やってみないと分かんないし、やってみながら、メンバーとこぅした方がよりいいとか楽しいとか話し合えたらいいよなぁーなんて思ってます。今日の参加者の皆さんは、みんな(形式的な)レビューをやっているという人がほとんどだったんですが、私自身経験がそんなにないんですよねー。つーことで、ぜひ、やってみたい。

まずは、勉強会とか研究会的に、サンプル用意、実際レビューしてこぅやとやりやすいねー!とか、次はこぅしてみたらどうだろう? このツール使ってみる? とかやってみたいなぁ。
技術とかは一人でも学べるからいいんですが...こぅいぅ事こそ、興味ある人同士集まって、試して、話して...ってしたいなぁ!
会場のアンケートでも半数以上が 「あまり上手くいっていない」 って事だった事も考えたら、とりあえず方法を先決めて形式的に入れる つーのはあんまり良くないんだろうし。

会社のみんなは、業務時間外でもやってみたい位の興味あるかなぁ??
• • •

2009年6月30日火曜日

org.eclipse.ui.commandsはナカナカいけるのね

Eclipseの3.3からActionではなく、Commandを使うのを推奨しているらしい。
Commandをつかわなきゃなぁーって思いつつ、ついActionを使ってしまってあまり試せていなかったので、今日ちょっと使ってみました。
なかなか便利ですねー。こいつ。

Commandの場合は目的によって綺麗にモノが分かれている感じです。
plugin.xml には、
  • commandの定義
  • Commandをどこに表示するのか?の定義
  • どんな処理を行なうのか?のHandler定義
...など に分かれています。分かれているからこそ、すっきりとした定義も出来、今まで出来なかったけど出来るようになった事!があるんですね。

例えば....
* commandを複数作成するがHandlerのクラスを1つで使い回すパターン。
 この場合、commandにcommandParameterを設定してHandlerから取得する ことで実現。

*メニューアイテムをOn/Off切替(チェックボックス)にするパターン
 command定義の子要素にstateを記述してHandlerから状態を取得して処理する。
 ここのtoggleの所

*複数のメニューアイテムをラジオの選択形式にし、1つのHandlerで処理してしまうパターン
 ここのradioの所

なんて事とか楽に....というよりスッキリ?....出来ちゃうんですね。
しかも、処理を書くHandlerのクラスではラベル文字も書き換えできるようになっているもナイス。

ここらへんで参考になるのは Eclipse Tips のCommandsラベルが付いている記事
一通り読んだだけで、全て試してないけど、ISourceProviderとか...なんか夢が広がるww

Commands以外でもEclpse Tipsのサイトは凄いいい記事多いですねー。
今度ゆっくり読んでみる事にする!

あと、もう1つほほーっと思ったのが、Contributionに書くlocationURI.

<extension point="org.eclipse.ui.menus">
<menuContribution locationURI="****">
<command commandId="****" />
</menuContribution>
</extension>

ここのlocationURIで色々表示場所を切り替えれるみたいなんですが、
昔よりも分かりやすい表示になった気がする。
メニューのIDさえ分かれば、ここの後ろに...とか入れれるって事なんですよね。

locationURIの指定で見かけたものをpickupしてみました。

popup:#CompilationUnitEditorContext?after=additions
 JavaEditorのコンテキストメニューのaddtionsの下に追加

popup:org.eclipse.ui.popup.any
 すぺてのPopupmenuに追加? この場合詳細はVisibleWhenとかで指定する感じってことかな。

popup:org.eclipse.jdt.ui.PackageExplorer
 PackageExplorerのメニューに追加

menu:org.eclipse.ui.main.menu?after=navigate
 メニューに追加する時。上記の場合メインメニューのNavigateの後ろに追加

toolbar:org.eclipse.ui.main.toolbar
 ツールバーに追加する時。
• • •

2009年6月28日日曜日

AIR GEAR v1.0.3リリースしました

AIR GEARのv1.0.3をリリースしました!
修正内容は、
ActionScript3のフォーマット機能とアウトライン表示機能を追加
ActionScriptエディタでクラス名のコード補完機能を追加
コンポーネントのColorPickerとSpacerを追加
各種不具合の修正
になっています。

インストールは、Ecllipse/dropinsに入れて、念のため -clean付きでEclipseを起動してください。
アウトラインとコード補完については、デフォルトでオフになっているので、Workspaceのプロパティページで有効にする必要があります。

ですが、まだクラスの変数とfunctionしか解析できていないので、コード補完は或る程度...のレベルです。
これからまた解析できる部分が増えるように頑張ります。

ぜひぜひ使ってくださいねー!
• • •

2009年6月27日土曜日

複数のEclipse 環境でプラグインを共有する

昨日ハマっていた、「複数のEclipse 環境でプラグインを共有する」について解決しました!
原因はorg.EclipseのEが大文字だったのがいけなかった様子。

ということで、eclipse.iniに以下の記述を追加すれば認識できました。

-Dorg.eclipse.equinox.p2.reconciler.dropins.directory=D:\eclipse\dropins

この記述をして、うまく認識されると、
eclipse/configuration/org.eclipse.equinox.simpleconfigurator/bundles.info に追加したplugin情報が追加されるようです。

Eclipseのバージョンとか、Java開発用、PHP開発用...の種類によりdropinsを分けておけば、Eclipseをダウンロードしてelipse.iniに上記記述をいれるだけですぐ使えちゃいます。
めちゃ便利。

あと気になるのは、Eclipseプラグインの更新が有った場合に何処に反映されるか?なんですが、これはまだ良くわかってません。
dropinsを綺麗にしても、pluginsに更新されたらなけるよな。。
eclipse 3.5M6: linked extension locations now require a .eclipseextenison fileという記事も見つけたんですが、よく理解できず(涙)
ご存知の方いらしたら教えてください><
• • •

2009年6月26日金曜日

EclipseGalileoインストール...途中

EclipseGalileoが正式リリースされましたねー。

早速、自宅のMacに正式になったCocoa版をインストール。
とりあえず最初はいつも通りSVN環境を整える。

Polarionのページを見ると、

Galileo Release
  • Subversive Update Site is a part of Galileo Update Site.
    Look at Help > Install New Software... > select Galileo - http://download.eclipse.org/release/galileo > Collaboration Tools

  • http://community.polarion.com/projects/subversive/download/eclipse/2.0/galileo-site/ - [required] Subversive SVN Connectors

  • http://community.polarion.com/projects/subversive/download/integrations/galileo-site/ - [optional] Subversive Integrations


ということなので、Galileoサイトと、polarionのサイトからインストール。無事に成功。

その他プラグインを入れていたのですが、いっつも面倒なのが更新サイトがないモノ。
そういや、dropinsに入れればよかったんだっけ?と思ってググっていたら、Equinox p2 によって Eclipse プラグインの頭痛を解消するというサイトで、dropinsを複数のEclipseで共有できる事を知りました。

dropinsのフォルダをどこか適当に作って、eclipse.iniに以下の1行を入れると行けるらしい!

-Dorg.Eclipse.equinox.p2.reconciler.dropins.directory=C:\mydropins
-Dorg.eclipse.equinox.p2.reconciler.dropins.directory=C:\mydropins
(追記:Eが大文字になっているのが間違いだったようです。小文字であれば認識しました)

うわぁ、もっと早くからコレ使っとけばよかったなぁーって思いつつ試してみたんですが...んー、反映されません。。。
Macだからかもしんないなぁー。
明日会社のWindowsマシンで試してみよう。。
• • •

2009年6月24日水曜日

FxUG Flex4勉強会に行って来た

Flex 4 , FlashBuilder? 4 , Catalyst , **** , **** ついに現れた! ベータ祭りに行ってきました。

会社帰りによって来たので、1時間遅れての参加。
Flash Catalystについては、残念ながら聞けず。

始めは、Flash Builder 4の新機能。
FlexBuilderからFlashBuilderという名前に変わったんですね。
私自身、FlexBuilderを持っていないので、あまり比較ができないんですが、話によると
条件付きブレークポイント、リファクタリング(JDTのように高機能じゃないけど、ファイルの移動時にパッケージ名を変更とか)、ASDocがコードアシストの所とViewで表示、FlexUnitとの統合なんかが出来るようになったらしい。
講演者も話されていたけど、JDTのような感じを目指して機能を色々追加していってる感じ。

FlashBuilder4のFlexやAIRアプリの作成中にFlashの作成ができたりもできるなど、ツール同士の連携も或る様子。
FlやらDWやらボコボコ起動してた。凄いなぁー。いいマシンで開発したいっすねww

あ、1つのWorkspaceでFlexBuilder3とFlashBuilder4の共存はできないらしい。

次はColdFusionについて。
始めに、会場に来ているデベロッパーとデザイナーの比率などアンケートとっていたのですが、デザイナーが少なかった。
私ももっとデザイナーの人多いと思っていたのになぁ。
製品的にはもっとデザイナーの人に興味持って欲しいんだろうと思うので、なんかAdobeさんが可哀想な位ww
どういう事なんだろうねー。絶対数がデザイナーの方がすくないとか?Flexって付いてるから?

ColdFusionについてはスプレッドシートや、PowerPointの統合だったり、テキスト検索エンジンがLucene Solrになったよ。あと、ExtJS3.0にもなった。
ColdFusionって、私は使った事がないのですが、海外ではPHPよりもColdFusionの方を使っている人が多いとか?!

次は、Flex 4のここが新しい!。
まずは spark.component。....こんなん出来たんだ。うへぇー、AIR GEAR修正せんとあかんねー。
spark.componentというのは、今までMXMLで記述していた <mx:Button>のようなGUIコンポーネントの新しいセットのようです。
ネームスペースも変わって <s:Button> って感じに。
Buttonといっても、mx系のものと s系のものができるんですね。

s系(spark)のものは、mxで面倒だった所の拡張が結構されていて、便利そうです。
例えば、画面の状態で、新規モード、修正モード、閲覧モード とか有った場合、新規モードの時のみ反映するスタイルとか、イベントハンドラとかをMXML上で書けちゃう。

<s:Button
color.{新規モードの時}="#CCCCCC"
click.{修正モードの時}=*****>
</s:Button>
みたいな感じ。こりゃ便利ですな。

あとは、どのタイミングでインスタンスするのか?(creationPolicy)とかも。

CSS部分も、え?今までできなかったの? って気もしますが、IDSelectorの記述とか、「table tr td」のような階層の時って感じの記述ができるようになったらしい。

mx系とs系は混在してかけるらしい。そーかー。そーか。。。。

質問で、今後はs系がメインになっていって、mx系は消えて行く運命なの?ってあったのですが、多分mx系もそのまま生きるだろう...との事。
今後も何か拡張したくなったら、こぅいぅセットが増えて行くって方針なんですかね。
それはそれでいいと思うけど....あとは使う人とかプロジェクト次第ですねぇ

最後に、Catalystと連携してスキン編集。
前段のCatalystの話が聞けてなかったのが残念だったんですが、Flash Catalyst:PhotoshopデザインがそのままFlexアプリのViewへと変わる!を見ると、CatalystってPhotoshop、Illustrator、Fireworksで作った画像ファイルをFlexコンポーネントに変換してくれるもの...って感じみたい。
この変換のメカニズムを簡単に説明すると、MXMLのサブセットであり、Creative Suite 4から新たにサポートされたXMLベースの画像フォーマットである「FXG」を「Gumbo」(次世代Flexのコードネーム)の新しいMXMLに変換していることになります。「Gumbo」では、コンポーネントの見た目とロジックが分離可能になるため、このような変換が行えるのです。更に、「Gumbo」のコンポーネントに変換された後でも、見た目の部分(FXG)の編集が可能となっています。尚、現在のMAX Preview版ではIllustrator CS4での編集がサポートされています。

Flash Catalystは、MXMLやActionScriptの知識がなくても静的なアートワークからFlexアプリケーションのView部分を作成できる画期的なツールです。

とな。

やっぱ、デザイン重要ですもんね。んでもって、見た目とロジックの分離。

しかし、デベロッパーでは会社でAdobe製品は購入してくれないから個人購入になるけど、辛いよなぁ。
値段高いもんなぁ。
あ、Catalystって今はベータ版だと思うけど、有料製品になるんだろうか??

そもそもAIR GEARだって、FlexBuilderに個人でお金を払えないからつくってんのにさ(涙)
どんどん個人で勉強のために(遊びのために)触るのが難しくなっていく感じがしてやだなー。
• • •

2009年6月22日月曜日

AdobeAIRでGrowlを試してみた

Rawr! FlexGrowl Component AvailableのライブラリでGrowlができるらしい!という事で試してみました。

Growlってご存知でしょうか?
MacOSで動く、通知をしてくれるアプリケーションです。
メール着信とかを、フローティングウィンドウで出して、一定時間過ぎると自動的に消えるようにもできます。
私は、GMail,iChat,NatuLion(Twitterクライアント),SkypeなどなどGrowlで表示しています。
MacユーザになるまではGrowlって名前さえしらなかったんですが....WindowsOSでも、メッセンジャーとかで「オンラインになりました」的なメッセージが小さなWindowで表示され、自動で消えたりするのが有ると思うんですが、ソレです。

通知って、良く有るのがダイアログだと思うんですが、ダイアログってOKボタンを押して閉じなきゃいけない。
しかも複数の通知が来た場合にダイアログ並んだらウザイこの上なし。
それに比べGrowlは自動的に消えて行ってくれるのがいい。さーっと見渡して、お、これは!という通知だけなかを見たらいい。
しかもGrowlのウィンドウを透過にすれば、邪魔な感覚も薄れるし。

AdobeAIRは、Growlで通知するクライアントとしてよいと思うんですが、標準では機能ないんですよね。
個人的にはAIR自体にGrowlが簡単に作れる仕組があってもいいんちゃぅの?(そーしたらAIR使う人、増えるんちゃぅの?)
って思うぐらい、AIRのアプリとして最適な通知の仕組みだと思う。

情報量が多くなっている今日では、さーっと情報を確認できるGrowlは手放せない。
脱線するけど、メールも見るの大変ですが読み飛ばしてもよさそうなものも多いのですよね。なので、Growlで表示してクリックした情報のみ未読というのも欲しーなんて思ったりもする。そういう、情報の選択的な使い方もいいと思いません??

そんな所に、このライブラリですよ。
発見してから暫く経ってしまいましたが、使ってみました。

なかなか綺麗な通知ウィンドウがでるのはいいんですが....AIRの画面描画エリアの中でしか表示できないっぽい。
そりゃそうか。

このGrowlのライブラリを使うには、AIRの画面描画をScreen全体にする+ 透明にする ようなアプリにしないと綺麗にいかない様子。
つまり、SystemChromeをnoneにして、画面を透明にし、その上に必要な所だけ描画していく形。
この方法だと、以前はMacで表示エリアをドラッグして移動しようとするとピョン!と変な所に移動してしまう時があるバグがあって、敬遠してたんですよねー。
でも、新しいSDKでは直ってるかもしれないから、もう一回試してみるかなー。

ASlimTimerのアプリで、Growl使って「20分経ちました」的な通知を出してみたかったんですが、断念。
FlexのWindowを使ったアプリにしてたのですが、これを全画面を描画エリアにする形に移行するのはちょっと大変だったので。。

だが、このGrowl。AIRで何か作るんであれば、切って切れないような機能と個人的に思うので、ぜひ何かのアプリで試さなければ!
• • •

2009年6月15日月曜日

AIR GEAR 次回リリースしよーかと!

AIR GEARにFormatterとコード補完を実装中です。
中途半端な状態ですが、こんな感じで一旦リリースしようかなぁ...と考えてます。

Formatterは単純にインデントを揃えるだけの実装をしました。


コード補完は、@shin1ogawaに作成してもらった、ActionScriptの変数と関数について抽出できるライブラリを使って、アウトラインの表示とコード補完の所を作ってみた。
上記の他に、MXMLと関連しているActionScriptの場合は、MXMLで定義しているコンポーネントをコード補完に追加。
プロジェクト内のActionScriptのクラス名と、FlexSDKのActionScriptのクラス名をコード補完の対象に追加。
クラス名を補完したら、import文も自動的に追加するようにもなってます。

でも、そのクラスのメソッド名などはコード補完出来ない...という、中途半端な感じなので、まずはデフォルトの設定では、設定無しでリリースしようかと思ってます。
設定画面はこんな感じ。

言い訳付きww

アウトラインの表示はこんな感じ。

私的にはクイックアウトラインの方がよく使うんだけど、クイックアウトラインはまだ未実装です。クイックアウトラインは結構ゴリゴリ書かないといけないと聞いたので、また次回に回そうかなぁーと。

どうすっかね?
中途半端なコード補完ですが、これだけでも(私的には)有り難い状態なので、リリースしよう〜って思って。。

現在はNabaztagのコマンド設定AIRアプリを作りつつ、テストしてますー。
もう少し動かしてみて、大丈夫そうだったらリリース準備の予定ー。
• • •

2009年6月14日日曜日

toString, toOSString, toPortableString

EclipseのIPathの、toString, toOSString, toPortableStringのメソッドの差が良く理解できていなかったので、偶然発見した Removing restrictions on valid characters in pathsのサイトの翻訳にチャレンジしてみました。
訳してみて気づいたんですが、toPortableStringが導入される前の提案の資料っぽかった。
でも理解できたので良かった。
翻訳後のものはパスの有効な文字の制限を取り除く(訳)に置いておいたので、どーぞ。(訳違ってたらすいません!)

翻訳はGoogle translator toolkitを使ってみました。便利でしたよー

翻訳の画面はこんな感じ。原文との対比ができるのは便利。
文章の文節も自動的に判断して、文節毎に翻訳作業ができる。
デフォルトは、Googleが翻訳した日本語が表示されるけど、Googleの翻訳はちょっとオバカさんなので参考程度ということで!
文節をクリックしたら、対象の原文の背景色を変えて分かりやすくなってる。
ただ、.(ピリオド)は文章の最後と見なす所もあるようで、org.eclipse.core.runtime.IPathは
org.eclipse.core.runtimeで切られちゃったりもする。
そんな所は気にせず、前後で日本語の文章がつながるようにいれていくのがポイントww

cssも原文に合わせてくれてる。単語に含まれているcss(インライン)は、{0}とか{1}で括って合わせるみたい。この単語のcssは何の数字なのか?はデフォルトで翻訳してくれた文字をみれば分かるはず。

こうやって翻訳してみたのって、原文も一緒に公開したいので、translator toolkitのこの画面自体を公開したいんですけど、なんか出来ないみたいなのが超絶残念です。ほんと残念。。
• • •

2009年6月13日土曜日

EclipsePluginのBuilder追加での疑問

plugin.xmlのNatureの定義(org.eclipse.core.resources.natures)でbuilderを記述できると思うのですが、これを記述したとしてもbuilderが追加される訳でないのがふっと疑問になった。


こんな定義をかいてても、Natureのconfigure()で BuilderのIDを使ってICommandを作成し、IProjectDescription#setBuildSpecで設定する必要がある。

plugin.xmlで、そのNatureで使うBuilderのIDを設定しているんだから勝手に入ってくれてもいいのになぁーなんて。思って。

せめて、plugin.xmlで記述しているBuilderIDが取得できないもんか?
....コードにもIDを書かないといけないのが2重管理で面倒だし....
と思ってちょっと調べてみた。

Natureの拡張ポイントで設定されたBuilderIDは、IProjectNatureDescriptorの実装にはいってみるみたいです。
しかしながら、このインターフェースでは取得できるメソッドがなく、
org.eclipse.core.internal.resources.ProjectNatureDescriptor
という実装にキャストする必要があるみたい。internalだ。。なんか残念。

ちなみに、IProjectNatureDescriptorにはNatureの拡張ポイントで指定するrequires-natureを取得できるメソッドが用意されていて、Workspace#validateNatureSetから呼ばれています。

IProjectNatureDescriptorを取得するのは簡単で、こんな感じでとれます。


これで、Builderの設定があるIProjectNatureついて汎用的なコードが書けそうな気がする。
Natureの制約(requires-natureとかの記述)のチェックをして、Builderとして定義されているもの上記のコードを使って取得して登録してあげればOKOK?!
...internalだけど。

※追記
Natureの制約(requires-natureとかの記述)のチェックはNature#Configureではなくて、プロジェクト作成Wizardの時が正しいかも。
• • •

2009年6月6日土曜日

GraphicalEditorのファイルを削除、名前変更された時

AIR GEARではGEFのGraphicalEditorを使っています。
GraphicalEditorに限らずですが、FileEditorを自作している時は、Editorで表示しているファイルが削除された時、名前を変更された時のイベントを拾って整合性を合わせてあげる必要があります。

ファイルを削除された時。→ EditorをCloseする必要がある。
ファイルの名前が変わった時。→ Editorの名前をファイル名にしているのであれば、変更する必要がある。

これらのイベントの取得は、IResourceChangeListenerを使ってリソースの変更のタイミングを取得するのですが、このリスナーを追加する場所は Workspaceです。
ResourcesPlugin.getWorkspace().addResourceChangeListener(new MyResourceChangeLisnter());

ということで、自分のEditor以外でのリソース変更のタイミングも飛んでくるようになります。
ここで! AIR GEARで不具合が発生していました(涙)

GraphicalEditorではAdobeAIRのMXMLファイルの内容を表示しているのですが、MXMLファイルを編集するのは、その他のEditor(TextEditorとかXMLEditorとか)もアリ。
その他のEditorで変更された場合、表示中のGraphicalEditorの表示も最新にする必要があるので、このResourceChangeLisnterで受け取ったタイミングで、どのファイルが変更されたか?を確認せずに「ファイルの内容を読込みしてGUIを生成し直す」という処理を入れちゃってた。

元のソース


どのファイルのリソースが修正されたか? は IResourceChangeEventのgetDelta()に含まれているようです。

ということで、修正後のソース。


ですが、このままではファイル名が変更された時には、Editorが終了してしまう様子。
ファイル名の変更=ファイルの移動としてちゃんとチェックをしてあげないとダメみたい。

で、再度変更ソース。


これで何となく動いているようだ。
ファイルをフォルダ移動した時、Eclipse本体のWindowタイトルに表示されるファイルパスが移動先のものにならない...というのを除いて。
んー まぁそこは...今度みます。。
• • •

2009年6月5日金曜日

あるといいな

レシート情報をデジタル情報として受け取れる仕組み。

レシート貰う変わりに、ICカードとか渡してレシート情報を読み取ってくれる。
その情報はどっかに保存されていて、好きな時に取り出せる。
好きな時に、いつ何処で何を買ったか?履歴がデジタル情報でみれるようになっていて家計簿つけている人なんて大助かり〜!
レシート発行しなくてもいいから紙代も節約できてエコ〜!

さらに! その情報が、購入した商品の保証書代わりとしても使えるとか。

あるといいな。
• • •

ネコ型じゃないよ。ウサギ型だよ。



Nabaztagというウサギ型ロボットを、買ってしまいました!

この子が出来る事は、喋る事。音をならす事。LEDを光らせること。耳を動かすこと。ズタンプというICタグを感知すること。
いくつかアプリが用意されていて、天気予報を喋ったり、RSSFeedを読んだり、メールを読んだり、Potcastを流したり、Twitterに投稿したり...なんて事をしてくれます。
これらのアプリをキックするタイミングは、指定した時間。時々。ICタグをかざした時。メッセージ/APIの指示を受け取った時。

大注目はAPIが用意されていて、動きを自分で作れちゃうこと!
Nabaztag4G - Groovy library for Nabaztag APIなんてのもあるようです。

今日は届いたばかりなのでプログラムは置いといて、基本的な機能をみてました。
このページを参考にさせてもらい設定。
MACアドレスは本体の底面に貼ってありました。我が家の無線LANはMACアドレスで制限かけているので、まず始めにルータに設定。
NabaztagはWIFIで接続するんですが、始めの設定はどーするんだろ?と思っていたら、最初の設定の時だけNabaztagの方が無線LANの接続先を公開し、PCからNabaztagを選んで接続する感じだった。ほー。
結局、すんなりネットに接続完了。http://my.violet.net/にてアカウントの登録も終了。

さて...まず何ができるのかしら(笑)

アカウントのページから、アプリケーションを登録できるんだけど、始めは手動のタイミングで喋ったりさせてみたいー!つーことで、APIでちょっと遊んで見る。

日本語を喋らせるには http://api.nabaztag.com/vl/FR/api.jsp?sn={シリアル番号}&token={トークン}&voice=JP-Tamura&tts={喋らせたい文字をUTF8でエンコードしたもの} でいける。
ブラウザのURLに入れて暫くすると、ウサギが喋りだします。ういヤツ!

日本語は JP-Tamura というのしかない。Tamura? 田村? 何となく男? という気がしたけど女の人でしたー。
このページにある 「このあいだ、近所の吉野家行ったんです。吉野家。そしたら...」っていう吉野家コピペを喋らせたらウケたww
日本語の喋りはあんまし上手くないです(笑)
あ、でもこの田村さん、英語を喋らせたら 日本人が英語を喋っている感じで喋ってくれるのが素晴らしいとは思うww


ズタンプというICタグも一緒に購入したんですが、「鼻にかざすと反応する」ってあるから、鼻にかざしても全然反応しない。。
ふ、ふ、不良品かー! と思いきや、鼻より下の方にかざすとサクっと反応。
んー、鼻じゃないぞ。腹ぐらいちゃぅか??

ということで、今日のNabaztagの感想。

ウサギはやっぱかわいいなぁー。
だが、アカウントを管理する http://my.violet.net/ のページはむちゃくちゃ遅い。
API経由でいろいろ遊ぶのであれば、特にズタンプは要らなかったな。。
• • •