[AIR] Nespresso Stock Checker

Tags:

[AIR] Nespresso Stock Checker

» [AIR] Nespresso Stock Checker

NESPRESSO(ネスプレッソ)のコーヒーカプセルの在庫確認専用アプリケーション。Nespressoが日本でどのぐらい知名度があるかしらないけどヨーロッパ、特にフランスでは利用者が多かったので作ってみた。Nespressoって直販してないから手持ちのコーヒーカプセルがなくなる前にオンラインなどで注文しないといけない。しかし注文時に最低注文数みたいなものがあるからどのカプセルを何個買うか組み合わせにめちゃくちゃ迷う。スターターキットでついてくる専用容器は各種類3コずつしかはいらないし(各種10個入りなのに)。このアプリケーションを使えばどれが減ってるか減る傾向にあるかが見た目でわかる。

アプリケーション自体はAjaxでよくある☆マークでスムーズに評点を付けれるやつをイメージした。内容はローカルのデータベースに保存。本当はChumbyなんかにセットしてエスプレッソマシンの横にでも設置できればよいのだろうけど先立つものがない。そもそもChumbyもっててNespressoでコーヒー飲んでる人が何人いるのか知らないけど。

[Books] AIRの良書とFlexとRailsのクソ本

Tags: , , ,

どちらも同じ出版社の本だけど対照的。

  • Adobe Air in Action
    Adobe Air in Action

    AIRの良書。Flash, Flexに慣れ親しんだ人がAIRについてのみ知りたい場合などに最適。逆にFlashの知識が全くない状態でAIRをやってみようという場合には解読不能かも。Window, File system, Drag-and drop, SQLiteなど、AIR特有の機能に内容を絞っていて、しかもかなり原理的なところから説明しているので好感度が高い(FileStreamの進行状況を視覚化してあったり)。難点を挙げるとすると、これは出版社MANNINGの問題なんだけど、ここの本のレイアウト、文字スタイルが無駄に凝ってたり見出しごとにフォントかえてたりして見づらいんだよね。目がチカチカするっていうか。O’Reillyはそのへんさすがだと思う。

    » レーダーチャート評点

  • Flexible Rails: Flex 3 on Rails 2
    Flexible Rails: Flex 3 on Rails 2

    Flex + Rails。2008年に購入した本の中でぶっちぎり独走状態のクソ本。扱っている内容はFlex, Railsとも実践的で高度なのだが(Flex 3, Rails 2.0, RubyAMF, Cairngormなどを一緒に扱っている本はたぶん世の中にこれしかない)、著者の文章力がお粗末。自分の挙げた質問に脱線しまくったあげく見当違いな答えが書いてあったりして愕然とさせられる。要所要所でかいま見られる「この本への著者の愛」も読んでて非常に気持ち悪い。「TVゲームが超絶うまい小学生に書かかせたゲーム攻略本の文章」っていうとイメージ湧くかな。この本のせいで出版社のMANNINGのイメージがよろしくなくなった。

    » レーダーチャート評点

[AIR] カスタムクラスオブジェクトのローカル保存

Tags:

カスタムクラスオブジェクトをAIRのファイル読み書きで使用する方法(Flex環境)と注意点について。AMFのserialize/deserializeの話なのでNetConnectionなどにも応用可能だと思う。

使い方

  1. 保存したいクラスに[RemoteClass]メタタグを付ける(aliasの設定は必須ではない)。例えばcom.borealkiss.UserNameクラスを使いたい場合は以下のとおり。
    package com.borealkiss{
    
        [RemoteClass]
        public class UserName{
        }
    }
  2. ローカルで保持されるのはクラスのパブリックプロパティ(or getters/setters)のみ。例えば以下の場合だとUserName.firstNameの情報を保持したままクラスオブジェクトがローカルに保存できるようになる。publicプロパティを使う場合は以下のとおり。
    package com.borealkiss{
    
        [RemoteClass]
        public class UserName{
            public var firstName:String;
        }
    }

    getters/settersを使用する場合は以下のとおり。この場合setとget両方が定義されていないとローカル保存できない。

    package com.borealkiss{
    
        [RemoteClass]
        public class UserName{
            private var _firstName:String;
    
            public function set firstName(value:String):void{
                _firstName = value;
            }
            public function get firstName():String{
                return _firstName;
            }
        }
    }
  3. publicまたはsetters/getters定義されているクラスプロパティは全て保存される。保存したくないプロパティには[Transient]メタタグを付ける。例えばUserName.firstNameはローカル保存したいが、UserName.lastNameプロパティは保存したくない場合は以下ように記述する。
    package com.borealkiss{
    
        [RemoteClass]
        public class UserName{
            public var firstName:String;
    
            [Transient]
            public var lastName:String;
        }
    }

    getters/settersを使う場合は、get/setの定義直前に記述する。(privateプロパティ直前の記述は無効)

    package com.borealkiss{
    
        [RemoteClass]
        public class UserName{
            private var _firstName:String;
            private var _lastName:String;
    
            public function set firstName(value:String):void{
                _firstName = value;
            }
            public function get firstName():String{
                return _firstName;
            }
    
            [Transient]
            public function set lastName(value:String):void{
                _lastName = value;
            }
            public function get lastName():String{
                return _lastName;
            }
        }
    }
  4. FileStream.writeObject()でローカルファイルに保存する。以下の例ではApplicationStorageDirectory (MacだとUsers/USERNAME/Library/Preferences/APPLICATION_ID/Local_Store/)の”username.data”ファイルに書き出される(UserName.lastNameは[Transient]タグがあるので保存されない)。
    import flash.filesystem.File;
    import flash.filesystem.FileMode;
    import flash.filesystem.FileStream;
    import com.borealkiss.UserName;
    
    var user:UserName = new UserName();
    user.firstName = "Colin";
    user.lastname = "Moock";
    
    var f:File = File.applicationStorageDirectory.resolvePath("username.dat");
    var fs:FileStream = new FileStream();
    fs.open(f,FileMode.WRITE);
    fs.writeObject(user);
    fs.close();
  5. ローカルファイルからデータを取得する場合はFileStream.readObject()を使う。戻り値は型が指定されていないのでUserNameクラスにキャストする必要がある。
    var f:File = File.applicationStorageDirectory.resolvePath("username.dat");
    var result:UserName;
    
    if (f.exists){
        var fs:FileStream = new FileStream();
        fs.open(f,FileMode.READ);
        while (fs.bytesAvailable){
            result = fs.readObject() as UserName;
        }
        fs.close();
    }
    
    trace(result.firstName);//Colin
    trace(result.lastName);//null

注意点

  1. FileStream.readObject()でクラスオブジェクトを取得するとき、クラスオブジェクトのコンストラクタが(引数の設定ができないにも関わらず)必ず呼ばれる。そのためコンストラクタがデフォルト値を持たない引数を持つ場合はFileStream.readObject()を使うとエラーになる。例えば以下の場合、クラスオブジェクトはローカル保存はできるがローカルから呼び出すことができない。
    //FileStream.readObject()できない場合
    package com.borealkiss{
    
        [RemoteClass]
        public class UserName{
            public var firstName:String;
            public var lastName:String;
    
            /**
             * Constructor
             */
            public function UserName(firstName:String,lastName:String){
                this.firstName = firstName;
                this.lastName = lastName;
            }
        }
    }

    コンストラクタが引数を持たないか、または引数にデフォルト値が設定されている場合は大丈夫。

    //FileStream.readObject()できる場合
    package com.borealkiss{
    
        [RemoteClass]
        public class UserName{
            public var firstName:String;
            public var lastName:String;
    
            /**
             * Constructor
             */
            public function UserName(firstName:String="",lastName:String=""){
                this.firstName = firstName;
                this.lastName = lastName;
            }
        }
    }
  2. FileStream.readObject()ではコンストラクタが呼ばれた後、ローカル保存されている値がプロパティに設定される。

[AIR] MacとWindowsで画像ドラッグ&ドロップの挙動が違う

Tags:

NativeDragEvent.NATIVE_DRAG_DROPイベントで、ドロップされた画像ファイルのビットマップデータを取得したい。MacとWindowsともに動作する方法を模索した。

1. Clipboardデータから直接取得する

Macの場合以下の一行でJPG, GIF, PNG, BMP, ICOファイルのビットマップデータが直接取得できるが、Windowsだと取得できない。

//NativeDragEvent.NATIVE_DRAG_DROPのイベントリスナー
function onDragDrop(e:NativeDragEvent):void{
    var bmd:BitmapData = e.clipboard.getData(ClipboardFormats.BITMAP_FORMAT)
                        as BitmapData;
}

2. Loader.load()を使用する

次にClipboard内のファイルパスをLoaderクラスに渡してLoaderクラスのプロパティ経由でビットマップデータを取得してみる。Macだと以下の方法で取得できるが、Windowsだと取得できない。

//NativeDragEvent.NATIVE_DRAG_DROPのイベントリスナー
function onDragDrop(e:NativeDragEvent):void{
    var path:String = e.clipboard.getData(ClipboardFormats.URL_FORMAT).toString();
    var loader:Loader = new Loader();
    loader.load(new URLRequest(path));
    loader.contentLoaderInfo.addEventListener(Event.INIT,onInit);
}

function onInit(e:Event):void{
    var bmd:BitmapData = e.target.content.bitmapData as BitmapData;
}

3. Loader.loadBytes()を使用する

結局Windows(とMac)でビットマップデータにアクセスするためにはどうすればよいかというと、一つの方法は(僕はこれしか成功していない)、ドロップされる画像ファイルに割り当てられたFileクラスオブジェクトのデータをByteArrayにしてからBitmapDataに変換してやることだ。この方法だとWindows、Macともにドロップされた画像ファイルのビットマップデータを取得できる。

//NativeDragEvent.NATIVE_DRAG_DROPのイベントリスナー
function onDragDrop(e:NativeDragEvent):void{
    var files:Array = e.clipboard.getData(ClipboardFormats.FILE_LIST_FORMAT)
                        as Array;
    var f:File = files[0];
    var fs:FileStream = new FileStream();
    var ba:ByteArray = new ByteArray();
    fs.open(f,FileMode.READ);
    fs.readBytes(ba,0,fs.bytesAvailable);
    fs.close();

    var loader:Loader = new Loader();
    loader.loadBytes(ba);
    loader.contentLoaderInfo.addEventListener(Event.INIT,onInit);
}

function onInit(e:Event):void{
    var bmd:BitmapData = e.target.content.bitmapData as BitmapData;
}

ただしLoaderクラスを使うのでJPG, GIF, PNGファイルしか扱えない。BMPやICOファイルを扱いたい場合は、別途BMPDecoder - Spark projectICODecoder - Spark projectを使うとよい。

[AIR] Dot3D - ドラッグ&ドロップで画像ファイル読み込み可能に

Tags:

外部画像ファイルをアプリケーションにドロップしてやるとキャンバスに描画するように改良。キャンバスの解像度が16×16しかないのでファミコンの大昔のキャラクターやらfaviconあたりをつっこむときれいに描画するはず。お試しあれ。» [AIR] Dot3D

追記 2008/09/30

Windowsで機能していない模様。原因究明中。

追記 2008/10/01

Windowsでも機能するようにした。ただしファイルがJPG, PNG, GIF形式の場合のみ。

追記 2008/10/01

以下ライブラリのおかげでICO, BMP形式も描画可能になった。
BMPDecoder - Spark project
ICODecoder - Spark project

Next Page →