モテるプログラマになろう第一弾〜CLI好きのためのAIRで作るコマンドラインツール〜

モテたいですか?はい!!!モテたいです! アラガでございます。

サーバーサイドエンジニアのみなさん、こんにちは!

モテてますか?イケてるプログラマしてますか?

ちなみに僕のイメージするナウくてカッコいいプログラマは、以下の条件を満たすプログラマです

(ActionScript||JavaScript)&&(Ruby||Perl)&&(vim||emacs)&&zsh

残念ながら、php + eclipse + bash な僕は相当イケてません。

話がそれましたが、プログラマがもっとも輝けそうなシーン、もっとも輝けそうな雰囲気なときに、モテそうな事を、モテそうな言語でスマートにやってしまおうという企画第一弾です。

1. シチュエーション

新人の 可愛い女の子 がPCの前で呆然としています。いったいどうしたのでしょう?

「Flash(SWF)を100個画像にしてサムネイルを作らないといけないんです(涙)」

どうやら、 可愛い女の子 が膨大な単純作業を前にただただ愕然としています。

ここで、PCの前で困惑している 可愛い女の子 の横に行って、プログラムで一瞬にして単純作業を終わらせてしまうと、

「プログラマってカッコいいのね!あたし、この人のコト、、、好き。。」

となる可能性が非常に高い絶好のシチュエーションです。

2. どうやる?

さて、 可愛い女の子 が困っているのがFlashなんで、ココはイケてるプログラマの条件でもあるActionScriptを使って解決してみましょう。

さて、ここで注意です。

僕も含めデザインセンスの無い人は決して、オシャレなインターフェースを作ろうとしてはいけません。

せっかくのチャンスもダサイセンスに気づかれては幻滅されてしまいます。

ココは、僕らがもっとも輝ける、ターミナルの黒い画面だけで解決してみようではありませんか!

というわけで、前置きが長くなりましたが、みんな大好きCLIアプリケーションをActionScript(AIR)で作ってみましょう。

3. ActionScriptでCLIアプリケーションを作ってみる

本題です。

準備

前提条件としてFlexSDKをインストールしてAIRのコンパイル環境を準備しておいてください。

ActionScriptでコマンドラインツールを作る方法は、下記のブログを参考にしたので一読をおススメします。

ActionScript でコマンドラインツールを作る方法 - yoshizu's log

実装

結構長くなりそうなのでコードはgithubにあげました。

下記のようなファイル構成になっています

|-- build                                    // コンパイル実行スクリプト
|-- bin                                  
| |-- airtoolkit                            // 実行スクリプト
| `-- tools
|    |-- Rasterize-app.xml               // air設定ファイル
|    `-- Rasterize.swf                   // コンパイル済みのswf
`-- src 
    |-- Rasterize.as                         // 今回作ったもの
    |-- airtoolkit
    | |-- CLIApplication.as              // CLI汎用基底クラス
    | `-- FileHandlingApplication.as        // ファイル操作アプリケーションベースクラス
    `-- ken39arg                             // 今回使った自分用使い回しクラス郡
        |-- commands
        | |-- Command.as
        | |-- CommandBase.as
        | |-- FileGetCommand.as
        | |-- FilePutContents.as
        | |-- ICommand.as
        | `-- LoaderCommand.as
        `-- util
            `-- SnapShot.as
CLIApplication.as

コマンドラインツールを作る時の基底クラスです

AIRでは起動時のInvokeEvent.INVOKEInvokeEvent.argumentsにコマンドライン引数が入っています。

また、画面が無いとはいえAIRなのでNativeApplication.nativeApplication.exit();を実行しないと終了できません。

CLIApplicationで面倒な事を吸収しているのでCLIツールを作る時は下記のようにすれば簡単にアプリケーションを作る事ができます。

package 
{
 import airtoolkit.CLIApplication;

 public class Sample extends CLIApplication
 {
    override protected function execute():void
    {
     trace('第1引数は'+args[0]); 
     trace('第2引数は'+args[1]); 
     exit();
    }
 }
}

結構簡単に作れてしまいますね。

Rasterize.as

今回は、ファイル操作とオブジェクトのスナップショットを撮る為に以前作ったクラスを使い回しました。

詳細は割愛しますが、せっかくなので調子に乗って、下記のようなオプションを付けてみました。

  1. もともとのSWFファイル
  2. 出力ファイル名
  3. スナップショットを撮る間隔(default=1sec)
  4. 繰り返し回数(default=1)

繰り返しを指定するとアニメーションGIFをImageMagickで分割したときみたいになります。

コンパイル

コンパイルはamxmlcを使ってswfを作ります。(amxmlcのオプションはmxmlcと同じ)

amxmlc -output bin/tools/Rasterize.swf src/Rasterize.as -compiler.source-path src/

実行

実行はadlを使います(adlに関しては下記のAdobeのページが非常にわかりやすいです)

Adobe AIR 1.5 * AIR Debug Launcher(ADL)の使用

コマンドですが、ActionScriptも汎用的に作れるようにしたので、せっかくなので汎用的に作っておきましょう

bin/airtoolkit

#! /bin/sh
ADL=adl
if [ ${1:-0} = 0 ]
then
        echo "usage: % airtoolkit command args..."
        exit
fi
path=${0%/*}
application=$1
shift
${ADL} ${path}/tools/${application}-app.xml -- $*
exit

これを作っておけば、toolsの下においたapp.xmlに対して下記のように実行できます。

% bin/airtoolkit Rasterize

option がすくないです
Usege:
 -help: show usage
 arguments 1: target file name
 arguments 2: output file name
 arguments 3: delay rasterize interval (default: 1 sec)
 arguments 4: repeat rasterize count (default: 1 time)
ERROR: [ErrorEvent type="error" bubbles=false cancelable=false eventPhase=2 text="--" errorID=0]

Optionを付けなかったのでusageが表示されました。

それでは、最後に目的のFlashを画像にしてみましょう!

% airtoolkit Rasterize sample.swf test 0.5 10

このようにすると、test-0.png〜test-9.pngまでのpng画像が完成します。

という訳で100枚のFlashのサムネイルを作ってほしい女の子を見つけたら、コマンドラインで一括で処理してしまいましょう。

例えば下記のようなワンライナーで、、、

%php -r 'foreach (glob("/path/to/flash/*.swf") as $file){system("sh /path/to/airtoolkit Rasterize ".$file." ".$file);sleep(3);}'

これで約5分後に100枚のサムネイルが完成します。

後はこの5分間を有効に使えば、もう 可愛い女の子 はメロメロになる事でしょう! 楽しい週末が送れる事間違いないっすね!

ちなみに

じつはこれ、本当はサーバーで使うつもりで作ったんですよね。。。

ここまで、汎用的に作っておいて、サーバーで動かす事がどうしてもできなかったので、ボツになったというツールでしたw

せっかくなので、女の子にモテる為にストックしておきたいと思います。

いざというときの準備は大切です!

サイコーです!!

カヤックではモテる為に努力を惜しまないエンジニアを募集しています。

adlを使ったアプリケーションをサーバーで動かす事ができるエンジニアならなお良しです!!!