Compiler APIを使ってみる

まだやる気がある。勢いで書く。


作成中のウィジェットマネージャは、ユーザが書いたMXMLをSWFにビルドしなくちゃいけないので、その為にFlex SDKに含まれるCompiler APIを使う。
ちなみにCompiler APIJavaDocここからダウンロード可能。
# 他に方法、あるのかな?あったら教えてください


使い方はAdobeさんが公開しているPDFを読めば、普通にやることは書いてある。あれが全てです。
なので、本当はわざわざ書くこともないんだけど、ただ他に書くネタがあまりにもないので、
今回のアプリで実際にどういう手順でメソッドを実行したか、を書いてみることにした。
# あくまで、今回のアプリの処理手順ですので、Adobeの推奨手順かどうかわかりません。晒す事で間違いを見つけてもらって指摘をもらう、という目的もw

public boolean compileMXML(
        String flexSdkPath,         // Flex SDKディレクトリの絶対パス文字列
                                    // (Flex SDKのflex-sdk-description.xmlがあるディレクトリ)
        String mxmlPath,            // MXMLファイルの絶対パス文字列
        String swfPath,             // SWFファイルの絶対パス文字列
        File[] flexLibs,            // ビルド時に使用するSWCファイルを示すFileクラスの配列
        String licenseKey           // Flex Builder 3 Proのライセンスキー文字列
) {
    File mxmlFile;              // MXMLファイルを示すFileクラス
    File swfFile;               // 生成するSWFファイルを示すFileクラス
    File airConfigXML;          // Adobe AIR用のビルド設定ファイルを示すFileクラス

    Application application;    // MXMLからSWFにビルドするApplicationクラス
    Configuration configuration;// ビルド設定を格納するConfigurationクラス

    mxmlFile = new File(mxmlPath);
    swfFile = new File(swfPath );

    // Applicationクラスのコンストラクタには、MXMLファイルが必要っぽい
    // Applicationクラスの再利用はできない?
    application = new Application(mxmlFile);

    // 以下は、ビルド処理の進捗を見たい場合荷追加する処理
    // 下の例で引数に指定しているflex2.tools.oem.internal.OEMProgressMeterは、
    // 進捗度合い(%表記)を標準出力に出すだけのクラス
    // 自分でflex2.tools.oem.ProgressMeterインターフェースの実装クラスを作れば、
    // 別の出力方法に変更可
    application.setProgressMeter(new flex2.tools.oem.internal.OEMProgressMeter());

    // デフォルトのビルド設定を取得する
    // 以降、ビルド設定はConfigurationクラスのメソッドを使って設定する
    Configuration configuration = application.getDefaultConfiguration();

    // 第一引数の"flexlib"は固定(たぶん)
    // 第二引数でFlexのライブラリがある場所を指定する
    // libsディレクトリがある場所?flex-config.xmlがある場所?
    // どっちで判断してるかわかりませんorz
    configuration.setToken("flexlib", flexSdkPath + "\\frameworks");

    // 以下は、AIRアプリ(WindowedApplicationとか)をビルドする場合に追加する処理
    airConfigXML = new File(flexSdkPath + "\\frameworks\\air-config.xml");
    configuration.addConfiguration(airConfigXML);

    // 以下は、ビルド時に外部のSWCファイルを使う場合に追加する処理
    // まずはFile型配列の長さをチェック
    if (flexlibFiles.length > 0) { 
        // 長さが1以上ならそのまま追加
        configuration.addLibraryPath(flexlibFiles);
    }
    // Chartコンポーネントの透かし解除など、
    // Flex Builder Professionalの機能を使いたければ、
    // 第二引数でライセンス文字列を指定する
    // ちなみに第一引数の"flexbuilder3"は固定(たぶん)
    configuration.setLicense("flexbuilder3", licenseKey);

    // イロイロ設定したConfigurationクラスを
    // Applicationに設定しなおす
    application.setConfiguration(configuration);

    // 出力するSWFを指定する(いつやってもいいのかな?)
    application.setOutput(swfFile);

    // ビルド開始
    return (application.build(true) > 0)
          ? true /* ビルド成功 */
          : false; /* ビルド失敗 */
}

これを書いた当時、Compiler APIJavaDocが見つけられなかったので(なんと調査力の無い…)、PDFに書いてあるメソッドしか使ってないけど、
もしかしたら、もっと効率のいいやり方があるのかもしれない。さらに言うとAIRアプリビルド時の設定周りは怪しいかもしれん。


あとこっちのサイトには、メモリ上のMXMLをビルドしてSWCを出力する具体例が載っているんで、参考にどうぞ。


(追記)
ソースコード中のコメントのせいで、スクロールバーが出て見づらくなってたので、
コメントを多少変更した

ウィジェットマネージャの概要

やる気があるうちに書いておこうっとw

前回の日記から突然プログラミング関係になっちゃいましたが、その続き。
第2回は「何ができるといいのか」というのを、操作手順をベースに見直してみる。

  • ユーザはMXMLファイルを書く
  • MXMLファイルを指定して本アプリを起動する
  • MXMLファイルからSWFファイルを生成する
  • 生成したSWFファイルを表示する

表に見えるのはこの程度か。
そのうち、1つ目はテキストエディタでやる作業、2つ目の大部分はOSの機能かな。

てなわけで、3つ目,4つ目をもう少し砕いてみる。

  • MXMLからのSWF生成にはFlex SDKを使用
  • SDKの場所/バージョンは固定しないで、ユーザが指定可
  • 外部SWC内のクラスも使用可
  • SWFをデスクトップに複数表示可
  • 表示するSWFの外観を変更可

すっごく簡潔に書くとこんな事ができればいいのかと。


Flex SDKはjarファイルで配布されているので、
SWFファイル生成プロセスはJavaで作ってみる(もちろん、ただのコマンドとして使う手もありますが)。
生成したSWFのデスクトップ表示は、Adobe AIRを使うのが一番簡単でしょう。
なので、今回はJavaAdobe AIRの複合アプリとして作ることにします。

もちろん他にもいい構成があるかもしれませんが、やりたい事/できる事などのバランスを考えて、
今回は上の構成(JavaAIR)でやってみる、てことで。

次からは、サンプルコードを載せながら、実装内容を書いていこうかと思う。
# いつになるかなぁ…

またひさしぶりに書く

うを、二ヶ月以上空いたw
やっぱり会わないのかなぁ、日記とかブログとかって。
全然書けないよ。


最近、ちょっとしたプログラミングをやってます。
ちゃんと出来たら公開しようと思うけど、
それまで、ちょこちょこと作った内容とか、
参考にしたサイト(ほとんどマルパクリだったりしますがw)をご紹介、ということで。


というわけで、第一回。

作っているものの概要を。
簡単に言うと、Adobe AIR製のウィジェットマネージャ(Yahoo!ウィジェットみたいなの)とでも言いましょうか。

MXMLを書くだけで、手軽にサクッとデスクトップで実行できたらいいかも?

と思って作っている次第。

ただ自分以外に需要があるかは正直微妙。
MXML書ける人なら、自分でFlex SDKを使ってコンパイルできんじゃね?て気もしますが。
まぁ、自己満足で作って、さらしてみて、
他に興味がある人がいればラッキー、くらいなノリ。


ただ、公開できる質のものはいつできるだろうなぁw

ひさしぶりに書く

何日ぶりだろう。
少なくとも2月では初日記、ということで。


昨晩からビデオ三昧。
HEROESシーズン2の地上波放送を数話見逃していた、というのは、以前の日記に書いたけど、
昨晩、相方が急に、見逃していた数話を見たいと言い出して、一緒に近くのTSUTAYAへ。



昨晩1話目を見て、今朝からHEROES&今週録り貯めたビデオを。
目がおかしくなりそう。。。

だらだらな一日

日曜日は大抵、家から出ずにダラダラな一日を過ごす。

今朝は、朝起きて相方が起きる前に洗濯機を回し、
ベランダで洗濯物を干している最中に相方が起きる。

前エントリーのとおり、日曜の朝は「ワンピース」。
あとはネットを見たり、昨日録った「銭ゲバ」を見たり。


昼杉にちょっと外に出て、クォーターパウンドバーガーを相方と二人分購入。重かった…。


そして夕方から2時間昼寝。


…、実りのない一日でしたorz。

よく見るテレビ番組

3日も空いた。ダメ人間だ

さて、今日は相方が午前中仕事なので、
録り貯めたドラマを見ながら、日記書きに勤しむ(?)。

もともと毎週みるテレビ番組はある方。
ドラマはクールによって波があって、今クールは結構あるほうだと思う。

一度まとめてみようっと。

…、見すぎだよ、コレ。自分でもやや引いたw


あとコレをまとめる為に番組表を調べていたら、
HEROES シーズン2が既に放送中だということが判明!

そういえば、シーズン1の最終回にそういう案内があったような…。
もう五話もやっちゃってるしorz

ようやく全部完成

最後の中モノ(自動車整備工場?)もようやく完成。
やらなかった日も含めて、1週間てとこか、
中モノは一つ2,3時間かかったかな。


パーツが多くなると、序盤は所望のパーツが見つけられず、結構つらい。




※24日追記、というか追加公開
書いてはいたんだ、でも公開を忘れてた

どうしても日記をやらない自分が勝る。

そんなわがままも言ってられないので、
とりあえず今日の分を書いてみよう。


今朝は相方とホテルのモーニングを食べに行く予定だった。
見事に会い方が寝坊。というか、起こしたが『やっぱ無理』と断られた。
昼休みに連絡入れたら、申し訳なそうに『起きれなかったね…』


まぁ、こちらも先日の酒宴のせいで、食欲が皆無だったので、ちょうどよかったかも。