2011年1月31日月曜日

頑張って報われるのなら

というわけでまた更新。

やりたかった事はAIR >>> サーバー > CF > JAVA > gsprint.exe
の実行。

Javaは割とすんなりでき

CFはちょっとてこずりながらも出来

さあ、実行、と思ったところできっちりハマる。

ハマって、ハマって、CF壊しかけて、ついでにサーバーも壊しかける。

コマンドプロンプトからは上手くいくくせに、CF経由すると上手くいかないとか…。

ほとんど諦めきった所で、ふと思う。

…あれ、コマンドプロンプトで実行されるgsprint.exeとCF経由のgsprint.exe、ユーザーが違うんですけど?

と、ここまでたどり着いて、あれjavaから動かすと全部システムだっけ?と思って別のも確認…違うな。

ってことは、ここが悪いんじゃね?

と当たりをつけて、もうちょっと詳しい人にアドバイスを聞いてみる…。

で、結果CFのサービスのユーザーを変えて見事解決!!

いい所まで当たりをつけた、俺!

もう今日はこれだけで満足満足

AIRから印刷…その前に

というわけで、AIRから印刷したいよーとのご要望がありましたので。
gsviewっというのを使って印刷することに。
で、とりあえずローカル環境でjavaのプロセスを使用して印刷がかかる所までを確認して
後はcoldfusionからjavaを動かせば完璧!! ←ここまでが先週
と、ここからが詰んだ。
正確にはこの後久々にcfm、cfcからjavaを動かすので昔のソースを参考にいじりつつ。
IEで何度もCFMを動かしたりしながら進んで、おお!!javaが動くぞ。という所で今度はプロセスが上手くいかないのか、gsviewが動かない。
どっか引数でこけてるのか?と思ってリターン値でどこまで進んだのか分かるようにして再実行。
…全部とおってんじゃねえか。
で、そこから試行錯誤の始まり…coldfusionのjavaVM変えたらcoldfusionのサービスが動かなくなった\(^o^)/
なんでじゃああああと、あせりました。
というか今日は朝にもPCが逝きかけるっていう結構アレな状況になって焦ったりもしたので今日はそういう日ですか。
帰りは気をつけます。
で、まあ元の値に戻せばいいだろ、と思ってとりあえず変えた値をgrepで検索をかける…
みつかんない、だと。
ふざけんなボケ、そんなVMのパス変えただけでサービスが死ぬとかねえよ。
そんな大事な所なら変えたタイミングで必要なものがあるかチェックしろよ!アドべ!!

と焦りまくって、探した結果
http://kb2.adobe.com/jp/cps/102/102452.html

メモ:手作業での変更、ColdFusion Administrator を用いた変更のどちらを選択する場合でも、変更作業を
開始する前に必ず jvm.config のバックアップコピーを作成するようにしてください。
あほかあああああああああ!!!1!!
書くとこ違うだろ。
まあ、でもjvm.configね…てっきりiniかと思ってたけどconfigか。
Coldfusionをインストールしたフォルダを検索掛けてファイルを開いてみると、指定したパスがC:\\~で書かれてました。そりゃgrepじゃかからんわ。
で、今後はここを気をつけながら進もう…ていうかこれを書いているタイミングではまだサーバーから印刷されません\(^o^)/
にも関わらずjavaは動いてるし、ちゃんとコマンドプロンプトからjava実行する分には動くしと…
で、結局社内でjavaのことなんか相談できる人がいないので結局また孤軍奮闘・孤立無援ですか。
別にいいけどさぁ…一人好きだし。
でもここは会社なんだぜ!ってこういう都合のいい時にだけきれいごと言うから偽善者って言われるんだろうな。
どっちかっていうと自分は偽悪者です。
偽悪者って読んでもらえる分には何も思わないけど、偽善者呼ばわりされるとちょっと勘に障る変わった自分。
とりあえず印刷できたらまた原因の方を書きたいと思います。

2011年1月11日火曜日

あけましておめでとうございます

ちょっと放置してた。
あけましておめでとうございます。

本日仕事でとある圧縮ファイルを某場所から送ってほしいと依頼を受けたので、某場所からファイルを受け取りそのまま送ってみる。
すると、よく見ると拡張子がlzh。
依頼元はwindows server 2003(もしくは2008)でやっているのでlzhは解凍できないとのこと。
いや、そんなものの以前に圧縮ソフトいれとけよ!ってお話なんですけどね。
もしくはネット繋がってるんだしいくらでもやりようはあるのに、依頼元の取った対応法は拡張子変えてもう一度送り直せ、とこちらにご命令。
いやま、送れと言われればやりますけどね。
解凍してそのまま送るだけでいいしょ?
でも、そもそもlzhってwindows標準じゃなかったっけ?と思ってちょっと調べてみる。
で、結論的には全然標準なんかじゃなくて拡張用ソフトウェアの配布をしているらしい。
でも今は配布停止中らしい。
そもそもZIPの対応もMEからだとか。
7とかはどうなんだろ。
と言ってもマイクロソフト標準なんぞより、その辺のフリーソフトの方がよっぽど使いやすいだろうけど。

流石にPCも普及してlzh、zipが解凍出来てないなんて人はほとんどいないだろうし
そもそも利益に繋がらないからかな?
そんなことよりよっぽど対応してほしい所がいくつもあるので、そっちを頑張れマイクロソフト。
アドビはその10倍頑張りやがれ。

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がやりたいです