Tag/BulkLoader
BulkLoaderのバグが修正されたよ。
BulkLoaderを触ってみたよ。 で発見した不具合が r176 でクローズされたよ。 ちょうど昨日のテストコードがそのまま残ってたので、 BulkLoader のリビジョンを上げてテストしてみた。
bytesLoaded:1021 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:1021 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:12605 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:12605 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:13074 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:14095 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:14095 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:19887 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:19887 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:22783 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:22783 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:25728 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:26549 bytesTotal:39110 bytesTotalCurent:39110
bytesLoaded:26549 bytesTotal:39110 bytesTotalCurent:39110
bytesLoaded:33789 bytesTotal:39110 bytesTotalCurent:39110
bytesLoaded:33789 bytesTotal:39110 bytesTotalCurent:39110
bytesLoaded:39110 bytesTotal:39110 bytesTotalCurent:39110
bytesLoaded:39110 bytesTotal:39110 bytesTotalCurent:39110
あらら? bytesTotal と全く同じ動きになったよ。 変更箇所を確認してみると、
Index: br/com/stimuli/loading/BulkLoader.as
===================================================================
--- br/com/stimuli/loading/BulkLoader.as (revision 175)
+++ br/com/stimuli/loading/BulkLoader.as (revision 176)
@@ -930,7 +929,7 @@
localWeightPercent = localWeightLoaded / localWeightTotal;
if(localWeightTotal == 0) localWeightPercent = 0;
var e : BulkProgressEvent = new BulkProgressEvent(PROGRESS);
- e.setInfo(localBytesLoaded, localBytesTotal, bytesTotalCurrent, localItemsLoaded, localItemsTotal, localWeightPercent);
+ e.setInfo(localBytesLoaded, localBytesTotal, localBytesTotal, localItemsLoaded, localItemsTotal, localWeightPercent);
return e;
}
どうやら bytesTotalCurrent の値を bytesTotal と一緒にしたらしい。 コメントにもバッチリ書いてあるから間違いじゃないと思うよ。 たしかに昨日の野良パッチだと、 どうしても整合性が取れない部分とか出てきそうだしなぁ。 こっちの変更の方が素直で良いかも知れない。
とりあえず、修正されて良かったよ。 BulkLoader はこれから永く付き合っていく事になりそうだし、 ほんのちょっとでも協力出来たのが嬉し過ぎます!
ほんのりだけれども、オープンソースなカホリを味わう事が出来た1日でしたとさ ![]()
- Posted at:
- 2008/03/07 00:05:32
- 0 Comments
- 0 TrackBacks
- Trackback:
- http://humming.via-kitchen.com/2008/03/07/fixed-bug-on-bulkloader/trackback/
BulkLoaderを触ってみたよ。
追記: ココに書かれているバグは r176 - bulk-loader - Google Code でクローズされています。
巷でウワサ?の BulkLoader がバージョンアップしたみたいなので触ってみたよ。
複数の種類の複数のファイルを同じインターフェイスで扱える。 ってライブラリらしく、使い勝手はかなり良い感じ。
// 名前を付けてインスタンスを生成
var loader = new BulkLoader('default');
// 取得するURLを指定
// typeを指定しないと自動判別になるらしいよ
loader.add('http://twitter.com/statuses/user_timeline/7372692.atom',
{
id: 'twitter-soundkitchen',
type: BulkLoader.TYPE_XML
});
// complete, progress, errorのリスナーを登録
// なかでtraceしてるだけなので省略
loader.addEventListener(BulkLoader.COMPLETE, _onComplete, false, 0, true);
loader.addEventListener(BulkLoader.PROGRESS, _onProgress, false, 0, true);
loader.addEventListener(BulkLoader.ERROR, _onError, false, 0, true);
// ロード開始
loader.load();
使い方が簡単なのはありがたい。 複数個の取得も add するだけで簡単に出来る。
var loader = new BulkLoader('default');
// 取得したいURLをしこたま詰め込む
loader.add('http://twitter.com/statuses/user_timeline/7372692.atom',
{
id: 'twitter-soundkitchen',
type: BulkLoader.TYPE_XML
});
loader.add('http://twitter.com/statuses/user_timeline/3307901.atom',
{
id: 'twitter-yoshuki',
type: BulkLoader.TYPE_XML
});
loader.add('http://twitter.com/statuses/user_timeline/5922142.atom',
{
id: 'twitter-kishir',
type: BulkLoader.TYPE_XML
});
// リスナーを登録してロード
複数個でも本当に簡単。ちょっと感動に酔いしれた。 が、ここでちょっとした事に気づいた。 まずはログファイルの中身を見て頂いてから。
[ProgressEvent bytesLoaded=3640 bytesTotal=0]
[ProgressEvent bytesLoaded=3640 bytesTotal=0]
[ProgressEvent bytesLoaded=7984 bytesTotal=0]
[ProgressEvent bytesLoaded=7984 bytesTotal=0]
[ProgressEvent bytesLoaded=9432 bytesTotal=0]
[ProgressEvent bytesLoaded=9432 bytesTotal=0]
[ProgressEvent bytesLoaded=10880 bytesTotal=0]
[ProgressEvent bytesLoaded=10880 bytesTotal=0]
[ProgressEvent bytesLoaded=12730 bytesTotal=0]
[ProgressEvent bytesLoaded=13474 bytesTotal=0]
[ProgressEvent bytesLoaded=13474 bytesTotal=0]
[ProgressEvent bytesLoaded=14922 bytesTotal=0]
[ProgressEvent bytesLoaded=14922 bytesTotal=0]
[ProgressEvent bytesLoaded=17818 bytesTotal=0]
[ProgressEvent bytesLoaded=17818 bytesTotal=0]
[ProgressEvent bytesLoaded=19266 bytesTotal=0]
[ProgressEvent bytesLoaded=19266 bytesTotal=0]
[ProgressEvent bytesLoaded=22162 bytesTotal=0]
[ProgressEvent bytesLoaded=22162 bytesTotal=0]
[ProgressEvent bytesLoaded=23610 bytesTotal=0]
[ProgressEvent bytesLoaded=23610 bytesTotal=0]
[ProgressEvent bytesLoaded=25584 bytesTotal=0]
[ProgressEvent bytesLoaded=33568 bytesTotal=38844]
[ProgressEvent bytesLoaded=33568 bytesTotal=38844]
[ProgressEvent bytesLoaded=36464 bytesTotal=38844]
[ProgressEvent bytesLoaded=36464 bytesTotal=38844]
[ProgressEvent bytesLoaded=38844 bytesTotal=38844]
[ProgressEvent bytesLoaded=38844 bytesTotal=38844]
どうやら最後のファイルを取得し始めるまで、 bytesTotal の値が取れないらしい。 直列に取りにいってるんだから、しょうがないと言えばしょうがない。 でも、これだとローディングとか表示出来ないよ。 何かやり方があるんだろうと、ソースコードを散策してみた。
色々見てみると、 BulkLoader 自体が、 今現在、どの程度ロードしているか?を取得するメソッドを持ってるみたい。 なので、イベントからひっこ抜かなくても、 BulkLoader から取ってこれる。 しかも、ありがたい事にわざわざプロパティとしてインスタンスを保持していなくても、 BulkLoader 自体でインスタンスを管理してくれていて、 最初につけた名前で逆引き出来るようになってる。
// newした時の名前で取得出来る
var loader = BulkLoader.getLoader('default');
で、進行状況を取得出来るメソッド群の中で、 気になったのが bytesTotalCurrent ってメソッド。 なんか名前的にも、ものすごくそれっぽい。 さっそく確認してみる。ので、 _onProgress の中身を以下のようにしてみた。
private function _onProgress(evt:BulkProgressEvent):void
{
var loader:BulkLoader = BulkLoader.getLoader('default');
// 順番に並べて吐き出す
trace('bytesLoaded:' + loader.bytesLoaded,
'bytesTotal:' + loader.bytesTotal,
'bytesTotalCurrent:' + loader.bytesTotalCurrent);
}
で、出た結果がコレ。
bytesLoaded:6536 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:6536 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:12730 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:13478 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:13478 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:20718 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:20718 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:25062 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:25062 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:25584 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:26332 bytesTotal:38844 bytesTotalCurent:0
bytesLoaded:26332 bytesTotal:38844 bytesTotalCurent:0
bytesLoaded:32124 bytesTotal:38844 bytesTotalCurent:0
bytesLoaded:32124 bytesTotal:38844 bytesTotalCurent:0
bytesLoaded:36468 bytesTotal:38844 bytesTotalCurent:0
bytesLoaded:36468 bytesTotal:38844 bytesTotalCurent:0
bytesLoaded:37916 bytesTotal:38844 bytesTotalCurent:0
bytesLoaded:37916 bytesTotal:38844 bytesTotalCurent:0
bytesLoaded:38844 bytesTotal:38844 bytesTotalCurent:0
bytesLoaded:38844 bytesTotal:38844 bytesTotalCurent:0
あからさまにおかしいだろ!これ。最後まで0って何だよ!
そう言えば、 berian が同じような事言ってたなぁ。 解決したんだろうか?どうなんだろ?
どうなったか結果を聞いてないけども、 どうせならって事でデバッグ開始。 BulkLoader 自身は _bytesTotalCurrent なプロパティで値を保持しているので、 それを計算してる場所を探してみる。 って思ったら、早速バグ部分を発見しちゃった。
実際に計算してるのは getProgressForItems なメソッド内で、 その中の最後のほうで BulkProgressEvent の setInfo をコールしてるんだけども、 そこで計算結果を渡し損ねてる。 本当なら localBytesTotalCurrent を渡すべきなのに、 bytesTotalCurrent を渡しちゃってる。 ので、これを直してもう一度テストしてみる。diffはこんな感じ。
Index: br/com/stimuli/loading/BulkLoader.as
===================================================================
--- br/com/stimuli/loading/BulkLoader.as (revision 175)
+++ br/com/stimuli/loading/BulkLoader.as (working copy)
@@ -930,7 +930,7 @@
localWeightPercent = localWeightLoaded / localWeightTotal;
if(localWeightTotal == 0) localWeightPercent = 0;
var e : BulkProgressEvent = new BulkProgressEvent(PROGRESS);
- e.setInfo(localBytesLoaded, localBytesTotal, bytesTotalCurrent, localItemsLoaded, localItemsTotal, localWeightPercent);
+ e.setInfo(localBytesLoaded, localBytesTotal, localBytesTotalCurrent, localItemsLoaded, localItemsTotal, localWeightPercent);
return e;
}
この状態でテストした結果はこうなったよ。
bytesLoaded:5088 bytesTotal:0 bytesTotalCurent:13260
bytesLoaded:5088 bytesTotal:0 bytesTotalCurent:13260
bytesLoaded:13260 bytesTotal:0 bytesTotalCurent:13260
bytesLoaded:14004 bytesTotal:0 bytesTotalCurent:26114
bytesLoaded:14004 bytesTotal:0 bytesTotalCurent:26114
bytesLoaded:24140 bytesTotal:0 bytesTotalCurent:26114
bytesLoaded:24140 bytesTotal:0 bytesTotalCurent:26114
bytesLoaded:26114 bytesTotal:0 bytesTotalCurent:26114
bytesLoaded:26858 bytesTotal:38844 bytesTotalCurent:38844
bytesLoaded:26858 bytesTotal:38844 bytesTotalCurent:38844
bytesLoaded:29754 bytesTotal:38844 bytesTotalCurent:38844
bytesLoaded:29754 bytesTotal:38844 bytesTotalCurent:38844
bytesLoaded:35546 bytesTotal:38844 bytesTotalCurent:38844
bytesLoaded:35546 bytesTotal:38844 bytesTotalCurent:38844
bytesLoaded:38844 bytesTotal:38844 bytesTotalCurent:38844
bytesLoaded:38844 bytesTotal:38844 bytesTotalCurent:38844
どうやら上手く動くようになった。 これでメンドクサイながらも全体のローディング状況を監視出来るようになったよ。 めでたしめでたし。
最後に bulk-loader - Google Code からリリース版を落としてみたら、
それにも同じバグが残ってたよ。同じリビジョンだからあたりまえだけども ![]()
なので、使ってる方は気を付けてくださいまし。
new isssueにはつたない英語であげておきました ![]()
- Posted at:
- 2008/03/06 02:57:35
- 0 Comments
- 0 TrackBacks
- Trackback:
- http://humming.via-kitchen.com/2008/03/06/tried-using-bulkloader-on-actionscript3/trackback/