2013年3月13日水曜日

AIRでバッチファイルを実行する方法

AS3,AIRからバッチファイルを実行する方法。

AIRから外部アプリケーションを実行するのは、セキュリティの観点からかなり条件が厳しくなっています。

詳しくは、Adobeのリファレンス

http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/flash/desktop/NativeProcess.html
を参照して頂くのが良いと思いますが、
ネイティブインストーラー(拡張デスクトッププロファイルアプリケーション)を使用してインストールされた AIR アプリケーション」でしか実行できません。

デバッグ(adlを利用)のときは、「-profile extendedDesktop」のオプションを付ける必要があります。
batchfileの所に、実行したいファイルを入れるとAIRからキック出来ます。
ランチャーとか作るのに便利です。

private function exec(batchfile:String):void {

 var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
 var file:File = new File("C:\\Windows\\System32\\cmd.exe");
 nativeProcessStartupInfo.executable = file;

 var processArgs:Vector. = new Vector.();
 processArgs.push("/c");
 processArgs.push(batchfile);
 nativeProcessStartupInfo.arguments = processArgs;

 process = new NativeProcess();
 process.addEventListener(NativeProcessExitEvent.EXIT, onProcExit); 
 //終了を待って処理を入れたい場合
 process.start(nativeProcessStartupInfo); 
}

public function onProcExit(event:NativeProcessExitEvent)
{
 process.removeEventListener(NativeProcessExitEvent.EXIT, onProcExit); 
 //終了時の処理をここに入れる
 trace(event.exitCode);
 //終了コードも取れます。
}

バッチファイル実行しても、コマンドラインウィンドウが出てこないので、
動作確認はログを別途出力するなどの必要があります。

運用者から、あるファイルを監視して1時間変化がなかったらバッチファイルをキックしたいというリクエストがあったので作成しました。その時に調べたものの備忘録です。

機会があれば、そちらのランチャも公開できたらと思います。


Flash Professional CS5.5 で AIR2.7以降のSDKを使う方法

今更ながら、Flash Professional CS5.5 で AIR2.7以降のSDKを使う方法です。
 CS6からは、UIからSDKの追加が出来る様になっていますが、 いろいろ大人の事情もあって、Upgradeができない・・・けど、新しいSDKで開発が必要という場合は、 やらざる得ませんね。 

Adobeのサイトに公式にかいてありますが。
 http://kb2.adobe.com/jp/cps/908/cpsid_90810.html
備忘ついでに正しくできたやり方を記しておきます。 

というか、公式に書いてあるのはちょっとやり方が良く無いと思うので、
より安全方向にしたものを記しておきます。 


  1. 最新の AIR SDK をhttp://www.adobe.com/products/air/sdk/ からダウンロード
  2. 必要な圧縮ファイルを解凍
    •  archive_air_2.7_withdrm_sdk / AdobeAIRSDK.zip(Win)
    •  archive_air_2.7_withdrm_sdk.dmg / AdobeAIRSDK.tbz2(Mac)
  3. AIR2.6 フォルダーを見つける
      C:¥Program Files¥Adobe¥Adobe Flash CS5.5¥(Win) アプリケーション/Adobe Flash CS5.5/ (Mac)
  4. AIR2.6 フォルダーを AIR2.6OLD に名称変更
    失敗したときにダメージがデカイので、いきなり消すのでは無く名称変更程度がお勧めです。
  5. 解凍した SDK フォルダーを上記(4番)のAIR2.6の合ったところに移動して、 フォルダ名称をAIR2.6 と名称変更。
  6. ※要するに、CS5.5へはAIR2.6ってダマして使うけど、SDK自体は新しいのよんって方式です。
  7. Adobe Flash CS5.5/Common/Configuration/ActionScript 3.0/AIR2.6/にある、airglobal.swcを名称変更。
  8. ※ここもいきなり消したり、上書きしない!
  9. "5番でコピー→AIR2.6名称変更"したフォルダの中の、 AIR2.6/frameworks/libs/air/ にある、airglobal.swcを、6のディレクトリ(Adobe Flash CS5.5/Common/Configuration/ActionScript 3.0/AIR2.6/)にコピーする
  10. Adobe Flash CS5.5/Common/Configuration/Players/ の中の AdobeAIR2_6.xmlを開く。
    < player asversion="3" id="AdobeAIR2_6" minasversion="3" version="11">
    となっているので、バージョンを上げる。
    ※AIR2.7だと12ですが、AIR3.0→13です。
    (以降、バージョン番号は、AIR3.1→14, AIR3.2→15、と上がるっぽい。)
  11. Adobe Flash CS5.5/AIR2.6/samples/ の中にある descriptor-sample.xml を開く。 namespaceを、「http://ns.adobe.com/air/application/2.6」 2.6から当該バージョンに変更。 ※と、、、書いてあるけど、これちゃんと5番でコピーしてあると、ちゃんとバージョンは変わってるはず。
これで、新しいSDKが使えるはずです。私はうまく行きましたが、あくまでも自己責任でお願いします。
FLA保存して、他のFlash Proに持って行くと、AIR2.6って認識のままなので、複数の場所で開発してる場合は注意が必要です。

2013年3月11日月曜日

数値を0フィルしてみる

表示するときに0フィルしたいときってありますよね。
ファイル名自動生成したり、大きい数値を、カンマ区切りで出したいときとか。


int(System.privateMemory / 1000000) + "," + ("000" + int((System.privateMemory % 1000000) / 1000).toString()).substr(-3) + "," + ("000" + (System.privateMemory % 1000).toString()).substr(-3)



と、数値に000を付け足して、substrの負の数値で切り取ることで0フィルぽい事ができます^^
上記は、プライベートメモリの使用量をカンマ区切りで出す時につかいました。

もっと一般化すると、

function zerofill(value:int, keta:int):String
{
  ("000000000000000" + value.toString()).substr(keta*(-1))
}
とすれば、ゼロフィルになります。 とかやってたら、もっと簡単な方法があった。。。。

http://www.project-nya.jp/modules/weblog/details.php?blog_id=1785

一応引用させて頂いておきます。


var number:Number = 3000000000000000000;
var digit:uint = 3;
var pattern:RegExp = new RegExp("([0-9]+?)(?=(?:[0-9]{" + digit + "})+$)", "g");

var result:String = String(number).replace(pattern, "$1,");
しかしまあ、普通に使うあれなので、標準で関数にあっても良いのに・・・