マジか。SDKの想定環境はCドライブだ・・

Android SDK and AVD Manager(installer_r12-windows.exe)の絶対想定環境はCドライブらしく、avdの定義ファイルは別ドライブに作成できているのに、Android Emulatorが起動しようとするのはCドライブ直下のユーザディレクトリ。想定パスにファイルを移動して再起動してみたが・・

invalid command-line parameter: Files.
Hint: use '@foo' to launch a virtual device named 'foo'.
please use -help for more information

ちょっとこれ調べてみたら、

Problem was solved.
First, I uninstalled the SDK's, then reinstalled them directly to my C:\drive.
The second part involved a bug in the code file: C:\ProgramData\Titanium\mobilesdk\win32\1.7.1\android\builder.py. I found the answer here: Titanium Emulator Launch error.

http://developer.appcelerator.com/question/122513/emulator-error-hint-use-foo-to-launch-a-virtual-device-named-foo

って事で、とりあえず全リインストール・・;-(

ちなみに、アンインストールしても何故かうまくいかないって時は、アンインストールした奴についてたadb.exeが生きたままになってたりとか。killしちゃってください。

追記

Cにインストールしたけど、ダメだった。同じメッセージしかでなくて。

Maybe if you have installed the SDK into "C:\Program Files(x86)\Android\android-sdk" instead of "C:\Program Files\Android\android-sdk", 'C:\PROGRA~1\Android\android-sdk' will no longer work. Instead, use : 'C:\PROGRA~2\Android\android-sdk'. Hope this helps!

http://developer.appcelerator.com/question/122513/emulator-error-hint-use-foo-to-launch-a-virtual-device-named-foo

ってことで、PROGRA~2へインストールしてみた。モジュールDL中。これはパスしたいな。。

オオ。ホーム画面へ辿りつけた。。

変なところでハマって、これ以上は時間オーバー。

ADTからSDK Managerを起動すると、今度は最初に設定した別ディレクトリを参照しちゃってて、エミュレータが起動しない。謎すぎる・・。

追記:

Cドライブっていうより、ユーザディレクトリがあるドライブぽい。僕は容量の関係でシステムドライブじゃなくてZドライブとかにしてた。何故か、SDKManagerがZドライブを見る(レジストリ綺麗にしたり、androidとつくディレクトリを片っ端から消したりしたのに)ので不思議に思ってたけど、そういう事ぽい。

ちなみに、Progra~2はEclipse連動でもずっと必要だった。

FlexSDKでOpenTypeフォントを埋め込む方法

AS3 Projectで下記ソースを作成し、srcフォルダにDeFonteNormale.otfを配置後、ビルド&デバッグ実行。

package
{
       import flash.display.Sprite;
       import flash.text.TextField;
       import flash.text.TextFormat;

       public class Main extends Sprite
       {
               [Embed(source = "DeFonteNormale.otf", fontName = "DeFonte", embedAsCFF="false")]
               private var font:Class;

               public function Main()
               {
                       var tf:TextField = new TextField();
                       tf.embedFonts = true;
                       tf.defaultTextFormat = new TextFormat("DeFonte", 24, 0x0);
                       tf.autoSize = "left";
                       addChild(tf);

                       tf.text = "windows";
               }
       }
}

transcodeエラーがでたら、src/直下にotfファイルを置いているか確認する。src/assetsとか../assets/とかに置いてたら、Embedのsourceをsrcディレクトリを基点にして相対パスで書けばいいのかもしれない。(元ファイルがないから変換できやんで、という意味か)。試したときに使ったフォントは、Defonte( http://www.ingofonts.de/ingofonts/fonts/freefonts.html ) - 英字のみ。日本語や半角数字は表示されない。

develop env: FlashDevelop 3.3.4 RTM for Microsoft.NET 2.0 Runtime / FlexSDK 4.1.0 ( FlashDevelop current version contains ) / Flash Player 10

その他環境

FlexSDK 3.5 MPL
      • -
Error: transcoding parameter 'embedAsCFF' is not supported by 'flex2.compiler.media.FontTranscoder' [Embed(source = "DeFonteNormale.otf", fontName = "DeFonte", embedAsCFF="false")]
FlexSDK 3.5 Adobe
      • -
Error: transcoding parameter 'embedAsCFF' is not supported by 'flex2.compiler.media.FontTranscoder' [Embed(source = "DeFonteNormale.otf", fontName = "DeFonte", embedAsCFF="false")]

font engine

一応、FlexSDK4.0以前のFontEngineであるAFE(Adobe Font Engine)でも、OpenTypeを限定的にサポートしているようだけれど、いまいち文意が読み取れない(http://livedocs.adobe.com/flex/3/html/help.html?content=fonts_06.html)。システムフォントはsrc:localで、URL?フォントはsrc:urlとか書かれてる。

うーん。urlとlocalって、結局ファイルパスを指定してるから表面的な意味は同じじゃね?( http://livedocs.adobe.com/flex/3_jp/html/help.html?content=fonts_04.html )。 厳密なところ(ファイルパスとURIは概念が違う)とかはこの際どうでもいいんだけれど。全体的な視点では個別の利点があるかもしれないけれど、ロード時間の観点で見ると、どっちでも結果は同じかもしれず。んでも、Adobeのヘルプページに書かれてる方法(Embedでリソースを読み込んで、CSSで参照)が良く分からない。これが実現できてないと、urlでの指定って出来ないって事なのかな。よくわからん。

AdobeFlashCS5.5のFontEngineは何が使えるのか調べないとな。多分、Flex4.0で採用されてるCFFFontEngineとか普通に使えちゃうんじゃないかしら。そしたら余計な事考えなくて良い。

イベントリスナー覚書

引数を与える場合のイベントメソッド

fuga.addEventListener(Fuga.complete, hogeFunc(hoge));

private function hogeFunc(value:Hoge):Function
{
    return function(e:Event):void
    {
        e.target.getFooMethod();
        e.target.removeEventListener(Fuga.complete, e.target);
    }
}

複数の非同期メソッドが全て完了したら、というイベント

試す環境が整ってないので、概要だけを書いています。

/* delegateパターンでIEventDispatcherを実装したとする */
public class Queue implements IEventDispatcher
{
    private var remains:int; // queueの数
    public static const complete:String = "queue_complete";
    public static const all_complete:String = "all_complete";

    public function Queue(list:Array)
    {
        this.remains = list.length;
        this.addEventListener(Queue.complete, decreaseRemains);

        for( i=0;i<list.length;i++)
        {
             hogeSomethingLoad(list[i]);
        }
    }

    /**
     * 処理が完了したらイベント発生
     *
     * @eventType Queue.complete
     */
    private function hogeSomethingLoad(value:Object):void
    {
        // doSomethingAsyncProccess...
        
        dispatchEvent(new Event(Queue.complete));
    }
    
    /**
     * complete毎にremainsを減らしていき
     * 0になったところで、全てのタスクが終わったとし
     * all_completeイベントを発生させる。
     *
     * @eventType Queue.all_complete
     */
    private function decreaseRemains(e:Event):void
    {
        --this.remains;
        if(this.remains<0)
        {
            /* Queueをインスタンス化するクラス側でqueueインスタンスに対してaddListenerして受け取る */
            this.dispatchEvent(new Event(Queue.all_complete));
        }
    }
}

連想配列は極力使わない方がいい感じ

// このように表現できるが、無名オブジェクト型はコード補完しにくい
var hoge:Object = {name:"wenly", age:21, gender:"woman"};

// どうせ同じ行数を書くなら、こっちの方が管理しやすいし補完できる
var hoge:Hoge = new Hoge("wenly", 21, "woman");

---
public class Hoge
{
    public var name:String;
    public var age:uint;
    public var gender:String;
    
    public function Hoge(_name:String, _age:uint, _gender:String)
    {
        this.name = _name;
        this.age = _age;
        this.gender = _gender;
    }

    // フィールドをprivateにしてget/setでプロパティ化してもいいけど
   // インスペクタみたいなデバッガでオブジェクトの中身を見ると、
    // プロパティとフィールドが両方でて見辛くなるから僕はやらない
}

// Arrayに詰めた場合でも、次のようにFlashDevelop記法で補完できちゃう

var fuga:/* Hoge */Array = [
     new Hoge(...snip...), 
     new Hoge(...snip...)
  ];

// fuga[0].<このタイミングでnameとかageとか変数候補が出てくる
// ただし、ネストしている場合は・・・コード補完の方法はない?