ActionScript でコマンドラインツールを作る方法

| | Save This Page to del.icio.us このエントリーを含むはてなブックマーク

Flex SDK に含まれる AIR 開発用の adl コマンドを使って、ActionScript で簡単なコマンドラインツールが作れることに気が付きました。

コンソールに Hello, world! と引数の中身を適当に出力するツールは、こんな感じで実装出来ます。

コマンドラインツールなので、最後に exit() を呼んでやる必要があります。
引数は InvokeEvent 経由で受け取るようになっています。

// hello.as
package {
	import flash.desktop.NativeApplication;
	import flash.display.Sprite;
	import flash.events.InvokeEvent;

	import mx.utils.ObjectUtil;

	public class hello extends Sprite
	{
		public function hello()
		{
			NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, initialize);
		}
		
		private function initialize(event:InvokeEvent):void
		{
			trace("--------------------------------------------------------------------------------");
			trace("Hello, world!");
			trace("");
			
			// コマンドライン引数を受け取る
			var args:Array = event.arguments;
			
			trace(ObjectUtil.toString(args));
			
			trace("");
			NativeApplication.nativeApplication.exit();	
		}
	}
}

// hello-app.xml
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://ns.adobe.com/air/application/1.5">
	<id>HelloASCommandLineTool</id>
	<filename>hello</filename>
	<name>hello</name>
	<version>v1</version>
	<initialWindow>
		<content>hello.swf</content>
	</initialWindow>
</application>

後は、これを適当に amxmlc でコンパイルし、adl で実行するだけです。

% amxmlc -output hello.swf hello.as
Loading configuration file /Applications/Adobe Flex Builder 3/sdks/3.2.0/frameworks/air-config.xml
hello.swf (14304 bytes)

% adl hello-app.xml -- Hoge Fuga "`pwd`"
--------------------------------------------------------------------------------
Hello, world!

(Array)#0
  [0] "Hoge"
  [1] "Fuga"
  [2] "/Users/yoshizu/Desktop/ASCLTool"

ちなみに、trace ログの出力は、mm.cfg で flashlog.txt に書き込まれるようにしている場合は、flashlog.txt に向きます。mm.cfg 作っていない場合は、そのままコンソールに出力されます。

ただ、このままだと hello-app.xml を置いているディレクトリを使う時にいちいち意識しないといけないので、簡単なラッパーとなるシェルスクリプトを作っておいて、パスが通る場所に置いておくと便利です。

今回は、ホームディレクトリ以下にこんな構成で配置しました。

bin
  |- as
  |- astools
      |- hello
          |- hello.as
          |- hello-app.xml
          |- hello.swf

#!/bin/sh

if [ ${1:-0} = 0 ]
then
	echo "usage: % as hello"
	exit
fi

path=${0%/*}

adl ${path}/astools/${1}/${1}-app.xml -- $2 $3 $4 $5 $6 $7 $8 $9

exit

すると、こんな風にどこからでも叩けるようになりました。

% as hello Hoge Fuga "`pwd`"
--------------------------------------------------------------------------------
Hello, world!

(Array)#0
  [0] "Hoge"
  [1] "Fuga"
  [2] "/Users/yoshizu/Desktop"

違うツールを作った時にも、astools 以下に放り込んでおけば、as コマンドは共通して使えるので便利です。

--
追記 (2009.05.15)

mm.cfg で trace が flashlog.txt にいってしまう人は、一時的に mm.cfg の中身を書き換えてあげるとコンソールに trace が表示されるようになります。

#!/bin/sh

function replace
{
	sed -e $1 $2 > $3
	mv $3 $2
	return 0;
}

mm=${HOME}/mm.cfg
path=${0%/*}

if [ ${1:-0} = 0 ]
then
	echo "usage: % as hello"
	exit
fi

replace "s/^\(.*\)=1$/\1=0/g" $mm ${path}/as-tmp

adl ${path}/astools/${1}/${1}-app.xml -- $2 $3 $4 $5 $6 $7 $8 $9

replace "s/^\(.*\)=0$/\1=1/g" $mm ${path}/as-tmp

exit

Ambient Music Generator 1.2

| | Save This Page to del.icio.us このエントリーを含むはてなブックマーク

Picture 2.png

Ambient Music Generator 1.2 をリリースしました。
http://seagirl.jp/ambient/ambient.air

主な変更点は、新たにビジュアル表現を追加したことと、全体的なアルゴリズムの見直しによるパフォーマンスの向上です。

なお、バージョンアップに伴って、AGF ファイルのフォーマットが新しくなったため、古いバージョンのファイルを開く事が出来なくなっています。

Ambient Music Generator

| | Save This Page to del.icio.us このエントリーを含むはてなブックマーク

capture_001.png

Spark project 勉強会 #05 で Ambient Music Generator という AIR アプリケーションのデモをさせていただきました。

今回の勉強会のお題が「Flash Player 10 の新しい機能を使った何か」だったので、Dynamic Sound Generation を使ったアプリケーションを何か作れないか、というのが動機でした。

新機能を使っている点としては、他にも Vector や AIR 1.5 から SDK に組み込まれた Adobe AIR Update Framework など。


Ambient Music Generator は、アンビエント・ミュージックを動的に生成するためのツールです。次に鳴らす音をダイナミックに変化させていくという点では楽器とも言えますし、自動的に音が生成され続けるという点では、BGM マシンとも言えます。

仕組みとしては、リズムや音程にある程度の制約を与えた中で、ランダムに音を選択していくことで、音楽らしさをなるべく損なわない形で、音を生成するようになっています。

制約に関しては、スケール、キー、音の間隔、音量といったパラメータで与えていて、これらを GUI で操作出来るようにしています。その他にプログラムにハードコーディングしてあるパラメータがいくつかあります。

今後の課題としては、音色を増やしたり、アルゴリズムを増やしたり、絵を見せたりすることが考えられますが、目指している方向として「簡単にそれらしい音楽を生成するツール」というのがあるので、そこはバランスを取りながら考えたいです。


Ambient Music Generator
http://seagirl.jp/ambient/ambient.air
(予め Adobe AIR をインストールする必要があります)

Genius Framework Version 1.5.0

| | Save This Page to del.icio.us このエントリーを含むはてなブックマーク

間に v1.4.0 もリリースしていますが、
v1.3.0 からの差分をまとめて書いてしまいます。

なお、v1.5.0 は 安定板としてタグを切ってあるので、
API の仕様変更などが嫌で手を出せなかった人も、
これを機にぜひ使ってみて下さい。

http://www.libspark.org/browser/as3/GeniusFramework/tags/v1.5

Genius Framework Version 1.3.0

| | Save This Page to del.icio.us このエントリーを含むはてなブックマーク

先日に引き続き、Genius Framework Version 1.3.0 をリリースしました。

ロードマップなどは前回と変わっていません。
Version 1.5.0 へ向けて、着々と開発が進んでおります。

各ドキュメントやサンプルも 1.3.0 に対応したものに更新してあります。
詳しくはプロジェクトページを参照して下さい。

http://www.libspark.org/wiki/seagirl/genius

以下、前回からの差分を記します。

Genius Framework Version 1.2.0

| | Save This Page to del.icio.us このエントリーを含むはてなブックマーク

Genius Framework 1.2.0 をリリースしました。

いつの間にか branches が出来ていたので、
今回 trunk と tags を作って、既存のファイルは全て trunk に移しました。

今後のロードマップとしては、
7月22日に行われる Spark project 勉強会 #01 を目処に
Version 1.5.0 をリリースし、これを安定版として、
tags にスナップショットを置く予定です。

それまでは、trunk の方が変わりやすい状況が続くと思いますので、
ご注意下さい。

Version 1.0.0 からの主な変更点をまとめておきます。

Adobe AIR Update Framework

| | Save This Page to del.icio.us このエントリーを含むはてなブックマーク

Adobe Labs にて Adobe AIR Update Framework がベータリリースされています。
http://labs.adobe.com/wiki/index.php/AdobeAIRUpdate_Framework

AIR アプリケーションをアップデートするための Framework みたいです。

Genius にも同じ目的で作ったクラスがあるのですが、
こういうクラスがもう少し早く出てきてくれていれば、
わざわざ自前で作る必要もなかったのにな、と。。。

元々何でないのだろうというところだったので、
そのうち出るんじゃないかなとは思っていたのですが。

ところでサンプルコードを見ていておっと思ったのですが、
ADF から情報を取得するのに、XML のネームスペースの扱いが
知らないと難しいのですが、XML クラスのnamespaceメソッドを使うと、
こんな風に書けるのねというのを今さら知ったので書いておきます。

private function setApplicationNameAndVersion():void {
    var appXML:XML = NativeApplication.nativeApplication.applicationDescriptor;
    var ns:Namespace = appXML.namespace();
    lblAppVersion.text = appXML.ns::version;
    lblAppName.text = appXML.ns::name;
}

Genius Framework 1.0.0

| | Save This Page to del.icio.us このエントリーを含むはてなブックマーク

Genius Framework Version 1.0.0
http://www.libspark.org/browser/as3/GeniusFramework

兼ねてから自分用に作って使っていたFlex用のフレームワークを
Spark projectのリポジトリにコミットしました。

ひとまず簡単な紹介を書いておきます。
詳しい紹介や使い方はまた追ってポストしていこうと思います。

AIRアプリでOS側からのドラッグ&ドロップを受け付ける方法

| | Save This Page to del.icio.us このエントリーを含むはてなブックマーク

 またしてもAIRネタです。ハイペースで情報を詰め込むと忘れやすいので、覚えているうちにネタ毎にまとめてblogに投げておくと、後々自分にとっても役に立ちそうなので書いてしまいます。

 さてさて、今回はMacのFinderやWindowsのExplorerのから直接ファイルをAIRアプリにドラッグ&ドロップして渡すためのAPIの使い方です。

AIRアプリで特定のファイルフォーマットのファイルを開く方法

| | Save This Page to del.icio.us このエントリーを含むはてなブックマーク

 社内でアルファチャンネル付きのFLVを開くアプリケーションはないかと聞かれ、よく考えたらそういうアプリケーションが見当たらないことに気付きました。

 FLVならばFlashで開けるだろう、ということでAdobe AIRを使って「FLV Player」を社内向けに作ることにしました。

 ローカルアプリなんだから、普通にFLVファイルをダブルクリックして開いた時にこの「FLV Player」で開けないものかな、と思って調べたら出来たのでまとめておきます。

AIRアプリの起動時の位置

| | Save This Page to del.icio.us このエントリーを含むはてなブックマーク

 いきなり脱線しますが、Adobe AIRで作られたアプリケーションは何と呼べば良いのでしょうか。とりあえずAIRアプリと呼ぶことにしましたが、どうもわかりずらいですね。

 というわけで、AIRアプリの起動時の位置について社内で質問を受けたのでまとめておこうと思います。

Adobe AIR 1.0、Flex Builder 3に移行する

| | Save This Page to del.icio.us このエントリーを含むはてなブックマーク

 Adobe AIR 1.0が正式にリリースされました。
 http://www.adobe.com/products/air/

 早速、AIR Beta 3からAIR 1.0に移行してみます。