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を使う例 としてのほどよいサンプルになっている感じではあります。
• • •

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

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

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

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

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

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