2010年12月21日火曜日

オブジェクトのプロパティを取得したい

ちょっと間が空いた気がする。

さて、今回はObjectに突っ込んだプロパティを取得したい

つまり

 var obj:Object = new Object;
obj.ABC = "123";
obh.DEF = "GGG";
obh.GHI = 10;


といった所の、「ABC」「DEF」「GHI」が取りたい、と。
昔やった気がするなーと思いながら調べると行きついたのがここ

といってもグーグル先生の一件目でしたが。

http://www.coltware.com/2009/06/08/as3_for_each/

つまり明示的に付けたプロパティは配列型になって格納されているってことですね!
ここではForでやってるけどobj[0]とかでも取れるんじゃない?Length取れないから面倒だけど。

まあ、何でこんなのをやろうかと思い至ったかというと外注にソースをあらされるのが嫌なので共通で使えるようなmxmlを作って、先手を打って押さえておこうかと。

それに手塩にかけたソースは何だかんだで可愛いので。
自分メインで作った子はちゃんと面倒見たいとも思いますしね…。
まあ一部、自分で作ったのに見捨てた子もいますけど、持ってかれた子もちょこちょこいたりいなかったり。

2010年12月14日火曜日

JAVAとAIRの連携について

現在開発中のアプリケーションには大容量のファイルを圧縮する、という処理をAIRで行わなければならない。

調べてみるとAirでZIPを作成するライブラリがあるのだが、正直遅い。
おまけに200を超えたあたりでエラーで落ちる…。

これでは物にならないので考えたのが、じゃあJAVAに振ってしまえと。
JAVAならクロスプラットフォームを維持できる。

じゃあどうやってAIRからJAVAを動かそうか、という話になって浮かんだ可能性が2つ

・ソケット通信にてAIRとJAVAを連携

・NativeProcessにてJAVAを起動

前者のは既に以前行っており、ある程度動くことは想定された。
ただ、ソケット通信をするためにはAIRがソケット接続を行いに行った際にサーバー側であるJAVAが動いていないと駄目。

更にAIRからJAVAを動かすことができないからソケット通信なんていうものを行おうとしているのに、これでは本末転倒である。
で、発想を逆転させてJAVAからAIRを動かそうぜ、と。

つまりJAVA起動 > AIR起動 > ソケット接続(AIR) > ソケット送信(AIR) > ソケット受信(JAVA) > プロセス起動(JAVA)

になる。

はっきり言って動作的には問題ない。

が、いくつかの問題点がある。

1.JAVAがサーバー状態になるのでプロセスに常時残る。
2.AIRインストール時、別個起動ショートカットをJAVAにしておく必要がある
3.AIRからJAVAが生きているかどうか判断ができない
4.JAVAからAIRに何かしらイベントを送ることができない

まず1がMacで見るとタスクに出てしまうのでカッコ悪い…。
windowsならありなんだが。

2についてはつまり、毎回新規インストール時にこちらが面倒を見なければならない。
かといって、クライアントに作業してもらうには少々微妙な内容。

3は結構致命的。何らかの理由でJAVAが死んだ際にもうお手上げ。

4も連携を取るのが出来ないわけではないにしろカッコ悪い。
例えばとあるテキストファイルをAir側で監視しておいて、そこにjavaが書きこんだら~で出来なくはない…。

では続いて後者へ
まあこっちもこっちで問題があって、まずbatファイルは起動できない。
いやまあ、javaで使用してるライブラリが全部標準ライブラリなら問題ないんだけれど、そうもいかないので。

あー、でもどうなのかな。クラスパス通ってなかったら動かないのかな?

という問題を解決するために思い至ったのがjarのexe化。
結構画期的だと思ったんですけどね…。

当初はJSmoothというツールを使ってexe化してたんですが、これでexe化するとAir側でハンドルするプロセスの終了イベントの発生タイミングがおかしい。
とりあえず最後にメッセージボックスを表示すれば何とか逃げられたのでこれで逃げてたのがこの前までのお話。

でもほら、カッコ悪いじゃない。

最後に明らかにデザイン?がおかしいメッセージが出てくるなんて。
おまけにそのZIPをアップロードしたり、そのあとにデータを書き込んだりすることを考えると、中間のタイミングでメッセージ出るなんて正気の沙汰じゃない。

というわけで昨日夕方から時間が空いたので取りこんだのが今回のお話。

そのあと奮戦してexewrapとか使ってみたりしても駄目。

じゃあまあ、原点に帰ろうぜということで
AirからNativeProcessを利用してJAVAを動かしたい、と考えるのは俺だけじゃないはずだ!!

というわけでggったらこんなのが

http://irpart.blogspot.com/2010/01/adobe-air2-nativeprocess.html

まさに俺がしたかったことじゃないか!!

つまりコマンドプロンプトで「java ~~~~」と書く所の先頭のJAVA.exeに引数を与えてJAVAの正規実行にしてしまおうと。

なんて王道。

邪道ばっかり歩いてきた誰かとは発想が違う。

で、ここからは今度はJAVAのスキル不足が露呈。
クラスパスの設定だとかが分からなくて苦戦苦戦…。
絶対パスの考え方の問題なんですよねぇ…。

メインメソッドが見つかりませんとかもう見飽きました!!
で、まあ何とかできました!

  private var _process:NativeProcess;
  _process = new NativeProcess();
 
  var _info:NativeProcessStartupInfo = new NativeProcessStartupInfo();
  var _file:File;
 
  _file = new File("C:/Program Files/Java/jdk1.6.0_20/bin/java.exe");
 
  var args:Vector.<String> = new Vector.<String>;
  args.push("-cp");
  args.push('"C:/Flex Builder 3/ZIPSample/bin-debug/;C:/Flex Builder 3/ZIPSample/bin-debug/ant.jar;C:/Flex Builder 3/ZIPSample/bin-debug//ZipComp.jar"');
  args.push("ZipComp");//実行するクラス
  args.push("圧縮するファイル");
 
  _info.executable = _file;
  _info.arguments = args;
 
  _process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA,RunProcsSTD_OutHandler);
  _process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA,RunProcsSTD_ErrHandler);
  _process.addEventListener(NativeProcessExitEvent.EXIT,RunProcsExit);
 
  _process.start(_info);


ちなみにjavaはもちろんjar化しておきます。
インスコ後にコンパイルしてもらうわけにはいかないので

C:/Flex Builder 3/ZIPSample/bin-debug/
っていうのはもちろんアプリの実行されているパスですね。

で、これも一個だけ問題が。
Macはjava.exeのパスが固定?っぽいんだけど、windowsはちょくちょく更新がかかるせいで
jdk1.6.0_20 とか jdk1.6.0_16 とか jdk1.6.0_15 とかあるわけなんですよねぇ…

まあ初回起動時にどれ使うって選択させる必要があるのかな。
うちの○○とかがそんな選択画面を見たら分からん分からんって大騒ぎしそうだけど

ちょっと話が逸れるけど、人が一生懸命1から10まで隙がないように努力して書いた説明見ないんだぜ?
ついでになるべく簡潔にまとまるように考えて書いてるんだぜ?

抜けてたら揚げ足取る癖にろくに見ないんだぜ?
見ないなら見ないでいいけど、わからなかろーがなんだろうが何も聞くなっての。


ここまで書いて、今後似たようなことあって、ここ見ろって言っても絶対最後まで読まないんだろうなぁ…。
まあ、ここでの文章は色々抜けがあるからいいっちゃいいけどさ。

そういえば1から10を話さず10だけ話す人がいるんだ。
ことわざで1を聞いて10を知る、というのがあるけどそれはまだ出来なくはないと思うんだ。
だって、1を聞いて2を予想し、3に繋げて・・・内容次第では出来ると思うんだ。
でもさ、10だけ聞いて分かる人っていないと思うんだ。

例えば数学で答えは「10」と言われたとしよう。
それで全貌を把握なんてできないと思うんだ。
足し算なのか引き算なのか、掛け算なのか割り算なのかさえ分からないんだぜ…?
絶対無理。
誰か通訳plz

Airで特定のディレクトリ以下ファイル一覧を取得したい

というわけでタイトル通りです。

昨日修正した、jar を exe化したものをAirから動かした時にjar側で最後にメッセージを出さないと終了のタイミングが上手く合わない

というマイナーな問題をそろそろ解決しようかと動き出したのが昨日。
その件については後でまた書きます。

で、結局とりあえず直ってるかもしれないんじゃ?的な感じになったのでさあ動かそうとプログラムを動かした所で、プログラム側にエラー!
やべぇ検証忘れだよ…というわけであわてて修正。

その修正内容が今回のタイトルです。

要はこの辺のロジック、流用してきただけなので、そっちでやってるオリジナルプロパティにセットするのを忘れてエラーになってるわけですが、
そもそもやってることがファイルの一覧をArrayで持つ、なんてことなので探せばファンクションとかあるんじゃね?

というわけで検索結果がこれ
http://journal.mycom.co.jp/series/air/006/index.html

ファイル変数にあるlistDirectoryAsyncを使えとのこと。
しかし、ないんだが…これFlex2か?

まあそれなら3にもちゃんと代用の奴があるはず…ということでメソッド一覧見て選んだのがこれ

var fl:File = new File("C:/testDirectory");
 var Arr:Array = fl.getDirectoryListing();


これでディレクトリ含むファイルの一覧が取れちゃいます!
なんすば!


とまで書いて思いました。

ああ、そういえば流用元ってフォルダ選択した後にファイルの選択があるからディレクトリ指定でリスト貰っても駄目だったね…。

消されたらそれを覚えておかないとねぇ…面倒な。

でも、これのオリジナルプロパティ型ってArrayCollectionなんだよね。
普通に考えれば上記メソッドを利用して、型変換面倒だからArrayを使用すると思うんだ!
だからきっとこのメソッドを使ってないはず!ちゃんと流用元のソースを確認したわけじゃないけどね…

2010年12月10日金曜日

整形

本日とある所からVS2005 (VB) のプログラムが納品された。

だが、ソースを見るとそれは昔からやってきたVB6の頃のソースの書き方だった。

うちの会社はオブジェクト指向のプログラミングに取りかかるのはお世辞にも早いとはいえなかったと思うし、今でも一部の人は好ましく思っていないと思うし、ついでにいい加減なオブジェクト指向のプログラミングなれど、それでもそっちに移行して行って良かったと思う。

というか、入ってからやったのは確かにVB6の頃のプログラミングのやり方だったけれど、最近ではオブジェクト指向っぽいやり方で作っていく方が長くなった。

確かに、慣れ親しんだやり方というのを大事にしたい気持ちも分かる。
けれど、この業界は目に見えて手法さえ変わっていく。

やりやすいやり方でやっていくのも良いと思うが、効率的なやり方を学ぶことを拒絶するのは良くないと思う。


で、まあ、何が言いたいかって
VB6ちっくなプログラミングで作られたソースを見るのが嫌。
しかもコピペ風味全開とか…。

まあ、確かに動くっちゃ動くんだけど、そのやり方もどうだかなーって書き方もあるし。
一応与えられた使命はデバッグなわけですが、一応バグはないっちゃないんで放置していいですかね?

最低限(自分が大好きな)Region使ってメソッドの簡単な説明も付けてモジュールで分けられてたソースをまとめたよ!

ああ、でもせめてOn error goto は try catchに置き換えないと…

ps MHP3がやりたいです

2010年12月8日水曜日

ソースの整形について

今の社内の基本構成は mxml1つに対し専用AS1つ。
共通変数用のASを1つないし2つ参照。
mxmlのスクリプトは原則importのみ
あまりCanvas等でmxmlを分けるということを行わない。

でコーディングをしていくと、軽い物ならともかくゴリゴリ書いていくものはASがきつい。
きついというのは行っているメソッドを探しにくい。
探しにくいといっても実際にコーディングしてる最中なら記憶にあるからいいけど、一度完成してからの修正が辛いことが予想される。
ではどうしたらいいだろうか。
ぱっと思い浮かぶのが

・ASファイルの分散化
例えば良く使うメソッドとかメンバ変数移すだけでもだいぶ行数減るよね!
しかしうちの会社ではきついのが現状。
どこにあるのか分からん!となるし…まぁ、それを防止するための手段として資料作りがあるんだけどね!
仮に分けても、Buillderの定義ジャンプが上手くいったり上手くいかなかったりと不安定なprofessionalソフトだとねぇ。
時たま致命的だろ!とBuillderに突っ込んだことも数知れず。
所詮フリーソフトベースだなぁ…にも関わらずン万取るんだよなー…パネェっす。

・固定・完成部分をSWC化
そもそもSWC化に抵抗がry
というかそもそもどこをSWC化すればいいんだろうね。
新しいコントロールなら納得できるけど、メソッドとかをやるとなると上でも挙げたBuillderの不安定性が結構きつい。
何で市販製品でこんなにバグが多いんだろうねー。まあうちがまだ3を使ってる所も原因ではあるんだろうけど。
というかうちの会社がしたいことを考えるとFlex(まあここではAirだけど)向いてないんだよね。
Silverlightの方が良いんだろうけど、どうしてもMacでやりたいって。
そのせいで見事にApple嫌いになりました\(^o^)/
何Appleって?食べれそうだね。
だから林檎嫌いユーザーらしく、携帯も音楽プレイヤーもsony使ってるぜい。
早くマイクロソフトが林檎ユーザーを食べてしまうことを切に願う。
まあ、マイクロソフトも良いとはあんまり言えないんだけど、林檎よりはまし。

でまあ、脱線しまして
話を戻して第3の案として、

・オブジェクト指向化

データ登録とか共通化してクラス化してあげればいいじゃないか、と思っても実行にはうつらない。
当初の目的を果たせるかどうかで言うと微妙なんだよね。
ほら、結局UI側のソースが多くなるわけで。
そもそも使いまわせる部分がVSやって頃に比べて随分減った気がする(悪い意味で

むー、どうしたものかね。
せめてVS2005でいう所の#Region機能がつかないかな―。
アレだと結構探しやすいんだけど。
え?今でも閉じれるだろって?
今FlexBuillder3を使ってますが、メソッド閉じたEndキー押下でカーソルがおかしな所に飛んで行くんだぜ?
どこの同人ソフトだよ。
便利なツール作ってやんぜっていう心意気は買うんで、バグの(少)ない物を作ってください。

2010年12月7日火曜日

FlexのTextAreaでエンター時に改行を行わせず、次コントロールに移動

いらん、と一蹴されましたがいずれ役に立ちそうなので記載

やりたいのは要するにTextAreaでEnter時、デフォルトで改行処理が走ってしまうので
走ったタイミングでEnterをハンドルしてキャンセルしてTab処理を送り込んであげるだけ。

じゃあ簡単だろって思ったらKeyDownイベントでpreventDefault()走らせてもキャンセルされねえじゃねえか。

というわけでggって出てきたのが次

参考サイト
http://www.fxug.net/modules/xhnewbb/viewtopic.php?topic_id=3060
KEY_DOWN -> TEXT_INPUT -> KEY_UPというイベントの流れの中でTEXT_INPUTイベントでpreventDefaultメソッドが有効になるのが確認できたため、KEY_DOWNでキーコードを保持しておき、TEXT_INPUTイベント中に保持したキーコードを判定し、preventDefaultメソッドでキーボードの処理を無効化することができました。


つまりKEY_DOWNじゃなくてTEXT_INPUTでやれよ、と。
というわけでTEXT_INPUTイベントをハンドルしてpreventDefault()走らせてtab処理入れ込んで完了!!

さあ出来たぞ!って思ったらいらないって言われたぜ!!
某人から回りまわってどこに回るか分からないのでここで愚痴は終わり

文字列のバイト数を取得する方法

文字列のバイト数を取得する方法。
VB6 なら LenBで一発でやってくれたんですけど気の利かないAdobeがそんなことをしてくれるはずもなく。
参考サイト

private function getStrLenB(val:string):void {

    var byteArray : ByteArray = new ByteArray();

    byteArray.writeMultiByte(val, "Shift_JIS");

    trace(byteArray.length);

}



ソースは一部改変。

というかとある所がつくってきたコントロールこれやってないんですけど。
え?随時チェックですか、そうですか。
とある所がつくってきたコントロール、結局エンター時のTab処理だけ?後色関係かな?
Tab処理も臭いからほとんど意味がない希ガス

ブログ始めました

ブログ始めました。

メイン目的はプログラム関係備忘録。
(Flex java asp vb etc...)

時たま愚痴も入るかも

タイトルはとある好きな曲の一節から