Archive@2008/02

AS3Threadを試してみたよ。

AS3でのコーディングスタイルが全然定まらないで、 かなりヤキモキしている訳なのですが、 BeInteractive! さんの スレッドによる非同期処理はこんな感じ にインスパイアされて 早速 AS3Thread を試してみたよ!

使い方は至って簡単。 Snippets - Spark projectサンプル を見れば分かると思うのですが、 Thread なクラスを継承して、 以下のメソッドを必要に応じてオーバーライドしていく。

  • initialize ... 初期化時に一度だけ呼ばれる。
  • execute ... ロジックを実行する。
  • catchError ... エラーがあった場合に呼ばれる。
  • finalize ... 後片付け。terminateした後に一度だけ呼ばれる。
  • toString ... 誰か分かるように。オーバーライドしないと親の名前になる。

なので、基本形はこんな感じになる。

package
{
    import org.libspark.thread.Thread;

    public class ExampleThread extends Thread
    {
        protected override function initialize():void
        {
            //  初期化コードを書く。
        }

        protected override function execute():void
        {
            //  実際のロジックを書く。
        }

        protected override function finalize():void
        {
            //  後片付けコードを書く。
        }

        public override function toString():void
        {
            //  スレッドの名前を返す。
            return '[ExampleThread]';
        }
    }
}

で、実際にガリガリ書いてみたのですが、 かなり非同期部分を隠蔽出来るよ! デフォルトで LoaderThread なクラスや URLLoaderThread なクラスが用意されてるので、 すぐに試して感動出来たりします! こういうの、ホントにありがたい。

で、何も気にせずコードを書いていたんですが、 ちょっとしたところで壁にブチ当たった。

最初の一連の作業が終わった後、 クリックでSpriteを消してやろうと思って、 それをスレッドにして作ってたんですが、 イベントを受け取ったタイミングで begin しても動かない。 ってか、エラー吐いちゃうよ?なハプニングに遭遇。

一人コードリーディング祭りの結果、 スレッドの処理内じゃないと begin 出来ないっぽい。 begin の中身を見てみるとこうなってて、

//  Thread.as@98行目あたり
public function begin():void
{
    if (isRunning) {
        return;
    }
    //  ココでエラー吐く。
    (_parent = _currentThread).addChild(this);

    _runHandler = execute;
    _executeHandler = beginHandler;
}

null的なやつがどうの。ってエラー吐く。 この _currentThread ってプロパティがnull以外の時しか begin 出来ない事になる訳ですが、 そうなるタイミングってのが、探した限りだと internalExecute の中の処理が走る時だけ。

//  Thread.as@208行目あたり
internal function internalExecute():void
{
    //  ちょっと省略
    try {
        _currentThread = this;  //  ココで自分を入れる。
        _executeHandler.apply(this);
    }
    catch (e2:Error) {
        handleError(e2);
    }
    finally {
        _currentThread = null;  //  処理が終わればnullになる。
    }
}

疑似スレッドがゆえに、「スレッドの外」が存在してるのかぁ。 とか、勝手に理解(合ってるかは不明)。 yossy さんとかはどうやって実装してるんだろ? ものっすごい気になる。 強引にでもスレッドの中に処理を持って行くのかな? うーん、それって果たしてどうなんだろう。

でも、ここで終わらないのが スルー力 の無さ! 「スレッドの外」って事は、「メインスレッド上の出来事である。」として、ソースを書き換えてみる。 メインスレッドのインスタンスは MasterThread なクラスが保持しているので、 まずはそれを Thread から参照出来るようにする。

Index: MasterThread.as
===================================================================
--- MasterThread.as     (revision 259)
+++ MasterThread.as     (working copy)
@@ -11,9 +11,14 @@
                        _debugView = debugView;
                }

-               private var _main:Thread;
+               private static var _main:Thread;
                private var _debugView:Sprite;

+               internal static function get main():Thread
+               {
+                   return _main;
+               }
+
                public function executeActiveThreads():void
                {
                        internalExecute();

これで同一パッケージ内からメインスレッドのインスタンスが参照出来るようになった。

次に、エラー吐いてたところで、 _currentThread がnullだった場合、 メインスレッドを渡してやるようにする。

Index: Thread.as
===================================================================
--- Thread.as   (revision 259)
+++ Thread.as   (working copy)
@@ -101,7 +101,7 @@
                                return;
                        }

-                       (_parent = _currentThread).addChild(this);
+                       (_parent = (_currentThread||MasterThread.main)).addChild(this);

                        _runHandler = execute;
                        _executeHandler = beginHandler;

これで _currentThread がnullの場合はメインスレッドを使ってスレッドが起動される。

こうする事で、スレッドの処理の外で begin された場合はメインスレッドにぶら下がる形で実行されるよ。 って言っても、実はこれも完璧ではなくて、リスクもちゃんと認識しております。 ちょうど良いタイミングで begin しちゃって、 _currentThread がnullじゃなかったら、問答無用で全然関係ないスレッドにぶら下がります。 が、それを認識した上で、それでもこうあるべきじゃ?って思ってます(実装ではなく挙動として)。 実装はコミッターの方々が、もっと洗練された形でやってのけてくれる事に期待大!

この話題、どこかで yossy さんにあったら是非とも聞いてみたい!

ps. もうちょっと詳しい使い方はリクエストがあれば書いたり書かなかったり。

Posted at: 
2008/02/27 03:13:57
0 Comments
0 TrackBacks
Tags: 
ActionScript
Flash
Thread
Trackback: 
http://humming.via-kitchen.com/2008/02/27/tried-using-thread-on-as3/trackback/

AS3で実行速度の取得メモ

Flash で何か作ってる時に、 今の実行速度がどれくらい出てるのかが気になってたんですが、 気になってるんならやれよ。って事でやってみたメモ。

getTimer がFlash Playerが初期化されてからの経過時間を返してくれるらしいので、 コレを使ってやってみたよ。

//  Application.as
import flash.display.Sprite;
import flash.events.Event;
import flash.utils.getTimer;

public class Application extends Sprite
{
    /**
     *  一個前の時間を保持(MS用)
     */
    private var prevTime:int;

    /**
     *  一個前の時間を保持(FPS用)
     */
    private var prevSecondTime:int;

    /**
     *  FPS用のフレームカウンター
     */
    private var frames:int;

    /**
     *  一個前のFPSを保持
     */
    private var fps:String;

    public function Application()
    {
        //  とりあえずの初期値
        fps = 'unknown';
        //  計測用のリスナーをセット
        addEventListener(Event.ENTER_FRAME, enterFrameListener, false, 0, true);
    }

    private function enterFrameListener(evt:Event):void
    {
        //  フレーム数をインクリメント
        frames++;
        //  現在の経過時間を取得
        var time:int = getTimer();
        //  前回のFPS取得から1秒以上経ってたら再取得
        if (time - prevSecondTime >= 1000)
        {
            fps = frames.toString() + 'FPS';
            frames = 0;
            prevSecondTime = time;
        }
        //  書き出し
        trace(fps + ' / ' + (time - prevTime).toString() + 'MS');
        //  後処理
        prevTime = time;
    }
}

この処理が加わるので、 厳密に実際の処理速度が取れる訳じゃないけども、 目安となる処理速度が見れるのはありがたいっすなぁ。 って、長々書いたけども、 こんなのって常識なんだろうなぁ。って思ったよ。あはは :-P

実際やる時は TextField か何かに書き出してやるようにしないと、 ログがエラい事になってウザイかも知れませんです。 理論値も表示したい時は Stage.frameRate 使うと簡単に出せるね :-)

Posted at: 
2008/02/24 21:53:18
0 Comments
0 TrackBacks
Tags: 
ActionScript
Flash
Trackback: 
http://humming.via-kitchen.com/2008/02/24/get-speed-on-as3/trackback/

なんかエラーが出た。

ブログを更新する時に、 Inappropriate ioctl for device なエラーが出るようになってたよ。

ググってみたら、IO関連のエラーっぽいけど良くわからなかった :-(

いつの間にか twitter に飛ばなくなってたから、 もしかしたらそれかなぁ?

追記

どうやらキャッシュの問題だったみたい。 .pyc なファイルを消してから試したら治ったよ。 良かった良かった :-)

Posted at: 
2008/02/24 07:33:12
0 Comments
0 TrackBacks
Tags: 
memo
Trackback: 
http://humming.via-kitchen.com/2008/02/24/found-unknown-error/trackback/

AS3でDisplayObjectをBitmapDataに変換してみたよ。

ActionScript3 でのコネタ。 SpriteMovieClipBitmapData に変換出来るみたいなので試してみたよ。

とりあえず、確認も含めて普通に表示させてみる。

//  Application.as
public function Application()
{
    //  Stageの設定。
    stage.align = StageAlign.TOP_LEFT;
    stage.scaleMode = StageScaleMode.NO_SCALE;
    stage.quality = StageQuality.BEST;

    //  表示用のSpriteを作成。
    var s:Sprite = new Sprite();
    s.graphics.beginFill(0x000000, 1.0);
    s.graphics.drawRect(0, 0, 50, 50);
    s.graphics.endFill();

    //  今は普通に表示する。
    addChild(s);
}

ココから、コレを BitmapData に変換して行く。

//  Application.as
public function Application()
{
    //  Stageの設定。(上と同じ)

    //  表示用のSpriteを作成。(上と同じ)

    //  BitmapDataに変換して表示させる。
    var b:BitmapData = new BitmapData(s.width, s.height);
    b.draw(s);
    addChild(new Bitmap(b));
}

さっきまで addChild してた Sprite を、 addChild しなくてもちゃんと表示されたハズ! 何も変わらないから分かりにくいけども。

で、ちょこっと工夫してやると、 scale を弄ってるヤツもちゃんと表示出来たよ。

//  Application.as
public function Application()
{
    //  Stageの設定。(上と同じ)

    //  表示用のSpriteを作成。(上と同じ)

    //  Spriteのスケールを変更。
    s.scaleX = 10;  //width 50 -> 500
    s.scaleY = 10;  //height 50 -> 500

    //  scale調整用のMatrixを作成。
    var m:Matrix = new Matrix();
    m.scale(s.scaleX, s.scaleY);

    //  BitmapDataに変換して表示させる。
    var b:BitmapData = new BitmapData(s.width, s.height);
    b.draw(s, m);   //ココでMatrixを渡す。
    addChild(new Bitmap(b));
}

ちゃんとスケーリングされて表示されれば成功。 ColorTransform 弄ってる場合でも、 draw の引数に渡してあげればちゃんと処理してくれるっぽい。

子要素に TextField とか入ってる状態で変換してみても、 ちゃんと表示されたよ! 使いどころは全然分からないけども、 とても勉強になりましたとさ :-)

Posted at: 
2008/02/24 06:39:42
0 Comments
0 TrackBacks
Tags: 
ActionScript
Flash
Trackback: 
http://humming.via-kitchen.com/2008/02/24/convert-2-bitmapdata-on-as3/trackback/

UbuntuをGustyにアップグレードしたよ。

またまたリリースされた随分と間があいてからのアップグレード。

前回どうやったか全く覚えてなかったので、 とりあえずググってみたら、 Ubuntu Japanese TeamUbuntuのサーバからネットワーク経由でアップグレードする方法 にばっちり書いてありました。

$ sudo do-release-upgrade

で、いけるらしい。 我が家の Ubuntu には既に入っていたので、 そのまま叩いてみた。

ssh 接続がどうとか、 PAM リビルドする際のどうとか、 /etc/bash.bashrc を置き換えるか?とか、 若干質問されたものの、 すんなりアップグレード終了。

前回のアップグレード の時は、 もうちょっとメンドクサイ事した様な気がするんだけども、 気のせいだったかな?

前回のアップグレード のエントリー見て、 実際やった事を何一つ書いてないのに笑えた! 相当焦ってたんだろうなぁ。自分 :-P

Posted at: 
2008/02/23 00:30:59
0 Comments
0 TrackBacks
Tags: 
CUI
Ubuntu
Trackback: 
http://humming.via-kitchen.com/2008/02/23/upgrade-ubuntu-gusty/trackback/

Djangoのpre_saveとpost_saveがちょっと便利に

Django のちょっとしたコネタ。

モデルの save メソッドには、 raw って引数があるのですが、 r7054 から pre_savepost_save にもコレが入ってくるようになっております。

なので、 pre_savepost_save でコレを見てやる事で、 処理を分岐させる事が出来るようになりました。

rawTrue の場合、 余計な作業は省いてね。って事なので、 このブログではフックの最初で見てあげるようにしております。

def post_save_entry(instance, created, raw):
    """
    エントリーのセーブ後のフック
    """
    if raw or not created:
        # raw=Trueか新規登録じゃ無い場合はココでおしまい。
        return
    # 実際やりたい処理がつづく。

loaddata してデータを取り込む時なんかも rawTrue で入ってくるので、 こんな感じにしておくと余計な処理を省けるので便利。

Posted at: 
2008/02/17 00:39:07
2 Comments
1 TrackBack
Tags: 
Django
Python
Trackback: 
http://humming.via-kitchen.com/2008/02/17/more-useful-save-hook-on-django/trackback/

Entacl Develop Open!!

新しい環境になった勢いとかもあって、 何かやっちゃおう YO!! って事で、 Entacl Develop 始めちゃいました!

普段こなしている業務の中で、 これ良いんじゃない?って思えるものから、 こんなの面白そう!まで。 それと、こんなの作りたい!とかも。 出せるものはどんどん出しまくりますよ! まだ始まったばっかりだけども :-P

仕事を掻き分けながら全力でお送りします! ので、全力で盛り上げてくださいまし!ゆる〜い感じで。

勝手に決めたお題を、 勝手に配信したりもします。 ので、面白がって参加して頂けると、 ENTACL GRAPHIXXX 一同、両手をあげて喜びます :-D

早速 1つめのお題 がアップされてるよ。 ActionScript に興味はあるけど...。な方はコレをきっかけに、 普段からガッツリ ActionScript 漬けな方はティータイム気分で参加して頂けたら良いなぁ。 と妄想してたりします :-3

Posted at: 
2008/02/14 03:10:35
0 Comments
0 TrackBacks
Tags: 
memo
Trackback: 
http://humming.via-kitchen.com/2008/02/14/entacl-develop-open/trackback/

入社初日であります!

ついに今日から ENTACL GRAPHIXXX さんで働く事になりました! まだまだ解らない事だらけですが、 モチベーションだけはかなり高め :-)

t-matsuda 氏と色々繰り出して行けるように頑張りますです。 何は無くとも形にして吐き出していく!これ鉄則。

初日早々、 yossymega-ne にイジられまくりましたが、 それに勇気をもらったのは紛れもない事実です! ありがとーありがとー :-3

ps. yossy のパーマリンクは無いのかな?

Posted at: 
2008/02/13 02:31:01
4 Comments
0 TrackBacks
Tags: 
memo
Trackback: 
http://humming.via-kitchen.com/2008/02/13/firstday-of-new-company/trackback/

Djangoでパーマネントリダイレクト

前のブログからの変更でURLが結構変わったので、 どうしようかな?って思ってたんですが、 Django の汎用ビューにある redirect_to を使ってみる事に。

中を見てみると、必須な引数は url のみで、 残りの引数で置換してリダイレクトする。って仕組み。 また urlNone にすると、 ステータスコード410なレスポンスを返してくれる。

今回は /weblog/ はリダイレクトしてあげて、 /bookmark/ に来たのは410を返すようにしたかったので、 こんな感じにしてみたよ。

# urls.py
urpatterns = patterns('django.views.generic.simple',
    #   weblogに来たリクエストをリダイレクト。
    (r'^weblog/(?P<path>.*)$', 'redirect_to', {'url': '/%(path)s'}),
    #   bookmarkに来たリクエストは410を返す。
    (r'^bookmark/(?P<path>.*)$', 'redirect_to', {'url: None'}),
)

410の場合、ブラウザで見ると何も表示されないのが残念だけども、 気になるようならコピペして弄ってあげれば良いと思う。

こういうちょっとしたのが既に実装されてるってのは、 地味に嬉しかったりする。

Posted at: 
2008/02/10 01:35:20
0 Comments
1 TrackBack
Tags: 
Django
Python
Trackback: 
http://humming.via-kitchen.com/2008/02/10/permanent-redirect-on-django/trackback/

ブログ乗り換えました!

新しく作り直したブログに乗り換えました! て言っても、まだまだ安定してないと思われます。 ココからじゃんじゃんバグを直して行くよ!

Django のソースを眺めながら作った(読めてるかどうかは別)ので、 また少し Django と仲良くなれたような気がする。

URLが変わってしまったトコロはリダイレクトさせてる(つもり)なのですが、 リンク切れを発見された方は、教えて頂けるとありがたいです。 無くなっちゃったURLに関しては...。 まぁ、それはご愛嬌と言う事で。

ソースは ここらへん に転がっております。 ので、ツッコミとかも頂けると両手をあげて喜びます!

Djangor7054 以前で動かしてしまって、 ちょっとしたハプニングに見舞われたのは秘密です :-)

Posted at: 
2008/02/09 03:30:08
6 Comments
1 TrackBack
Tags: 
Django
memo
Python
Trackback: 
http://humming.via-kitchen.com/2008/02/09/change-blog/trackback/

Categories

Archives