2007-10-11
虹色センチメンタル
超名曲!!!というわけでもないんだけどサビへのくだり~サビの最初の部分が良すぎる!!!!!!というわけで最近ヘビロテまくりりりり!!!!!!!!!!!!!!!
denyhosts.com
とかそんなサービスってどっかにあるのかしら。だいたいの今の広告配信って特定ホストから行っていることが多い。(ad.example.com とか)。んで割と広告用JSもそういうところから配信してことが多いので、それを hosts で丸ごと
0.0.0.0. ad.example.com ads.example.com
とか指定して切ると、ブラウザ側特に何もしなくても IE/Firefox の描画がだいぶ速くなる。
そんな広告ホスト登録共有サービスみたいな。絞り込みもできて、foo.example.com なサイトが使ってる広告ホストみたいなのもの解るとか。
AdBlock や Proxmitron で広告切るのはどうなんよ、という話も良く聞くけど、そこまでして広告切りたい人は基本広告バナークリックしないからなぁ。
fuzzyfinder.vim 1.0
MRU モードがかなり嬉しい。とりあえず0(リミット無し)にしてみた。しかし fuzzyfinder のコード綺麗(空間配置とか)で解りやすいなぁ。
オプション指定も Dictionary で extend しててカッコイイ。vim7 からならこの方法があったか。
MML
MML つったらMobile Markup Language だよね!という話を。へー、昔 Jphone こんなん使えたんだ。CHTML/MML/HDML いろいろあったのね。
んでその MML にはまゆきちさんも大好き A タグの H 属性があったらしい。
わおー><。
RGBをFFFFFF形式に
(1<<24|255<<16|255<<8|255).toString(16).slice(1)
演算子優先順位活用かぁ、なるほどー。短いなぁ。
PotrAs を10-20倍高速化するには・考察と実装
いやー PotrAs すばらしい!nitoyon さんGJすぎる。これは楽しい。でも文字列のパス抽出にそれなりに時間がかかってしまい、数十・数百文字をレンダリングするのはちょっと厳しい。
各クラスの toString のために flex の StringUtil の使ってて、CS3 だと使えないのがちょっと悲しいかな、と思った。また draw だけでなくパスに沿って何かを行いたいとき、getBezierPoint は外部からも利用したい事がありそうなので public static function getBezierPoint だと嬉しい事がありそう。
で本質の高速化。 Point がたくさんあるので、uint の上位ビット下位ビットでPoint表現(x,y の値がそんな大きくならないため)とかにすると速くなるのかな(速くならなかったら死ねる…)。あとはやはりパスを実際に前もって作っておいて(文字列のハッシュマップとか)、それを swf に組み込んで利用する(ファイルサイズが大きくなるので、たくさん利用するときは font のように別SWFにする必要がありそう)のが実用的。サーバサイドで適当に保存するクラスを書いて、AS でパスをレンダリングして、サーバに投げて作るのは割と楽に出来そう。ByteArray.org 大好きならそのまま swf 作って保存というのもありだなぁ。俺は無理。
というわけで ClosedPathList を文字列に dump/load するのを作ってみた。本当は構造体を作る(もしくは Point を使わずコアクラス のみで ClosedPathList を作成・復元できるようにする)すべきなんだけど、めどいので ByteArray を Base64 (…)に変換する方法で。 PotrAs.traceLetter(str, size); で作ったのを dump しといて、それを load するようにしたら size が 100 で 10-20倍は速くなった。1000 だと80倍ぐらい速い。Base64 のサイズは漢字1文字だとだいたい2Kbyteぐらい。結構でかいな…。
ソースはこんな。
package {
import com.nitoyon.potras.*;
import com.rails2u.debug.Benchmark;
import flash.utils.ByteArray;
import mx.utils.Base64Encoder;
import mx.utils.Base64Decoder;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.display.Sprite;
[SWF(background=0x000000)]
public class Pop extends Sprite {
public function Pop() {
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
Benchmark.start('generate');
//var list:ClosedPathList = PotrAs.traceLetter("本日開店", 1000);
var list:ClosedPathList = PotrAs.traceLetter("開", 1000);
//var list:ClosedPathList = PotrAs.traceLetter("A", 1000);
Benchmark.end('generate');
var str:String = dump(list);
Benchmark.start('restore');
var list2:ClosedPathList = load(str);
Benchmark.end('restore');
graphics.lineStyle(0, 0xFFFFFF);
list2.draw(graphics);
}
public function dump(list:ClosedPathList):String {
var encoder:Base64Encoder = new Base64Encoder();
var ba:ByteArray = new ByteArray();
ba.writeObject(list.$a);
ba.compress();
ba.position = 0;
encoder.encodeBytes(ba);
return encoder.flush();
}
public function load(str:String):ClosedPathList {
var dec:Base64Decoder = new Base64Decoder();
dec.decode(str);
var ba:ByteArray = dec.flush();
ba.uncompress();
var o:Object = ba.readObject();
var cplist:ClosedPathList = new ClosedPathList();
for each(var cpObj:Object in o) {
var cp:ClosedPath = new ClosedPath;
for each(var c:Object in cpObj.$a) {
var curve:Curve = new Curve;
curve.alpha = c.alpha;
curve.alpha0 = c.alpha0;
curve.beta = c.beta;
curve.tag = c.tag;
curve.c[0].x = c.c[0].x;
curve.c[0].y = c.c[0].y;
curve.c[1].x = c.c[1].x;
curve.c[1].y = c.c[1].y;
curve.c[2].x = c.c[2].x;
curve.c[2].y = c.c[2].y;
curve.vertex.x = c.vertex.x;
curve.vertex.y = c.vertex.y;
cp.$a.push(curve);
}
cplist.$a.push(cp);
}
return cplist;
}
}
}