skip to main |skip to sidebar

2008-01-30

ActionScript Snippets 加入了 RXNA

我的专门收集代码的博客 ActionScript Snippets 加入 MXNA 了。

大家可以常去看看。

2008-01-26

POP3 协议很危险!

大家注意,POP3 协议(非 POP3s)十分危险!

如果使用未加密的 POP3 协议来收邮件,你的用户名与密码就用可能被盗

以下是我使用 Wireshark 接下的包:

可以看到,用户名与密码写得一清二楚。即使一个刚入门的骇客也知道该怎么解读。

解决办法:

  • 可以使用安全的 POP3s 协议。POP3s 协议相当于加了密的 POP3,这样用户名与密码就难以解读了。但并不是所有的邮件提供商都支持 POP3s 协议。
  • 经常换密码,这样即使被盗,也是暂时的,把损失降到最小。
  • 避免用邮件发送重要的信息。

2008-01-20

[AS3]小心使用连续赋值

连续赋值即为 a = b = 1 的形式的赋值。这样写有时候会很方便,但有一个陷阱!

比如以下代码:

var a:Array, b:String;
a = b = null;

会报类型错误。因为在内部是编译成以下形式的。

var a:Array;
var b:String;
b = null;
a = b;

理所当然会报错了。以后可要注意。

2008-01-14

[AS3]for 循环数组的效率测试

循环 ("abcdefghijklmnopqrstuvwxyz").split("") 这个数组 100000 次的结果:(单位:ms)

No.for 循环for..in 循环for each 循环
1
17  
8213  
2165  
2
19  
8126  
2188  
3
18  
8338  
2128  
4
18  
7100  
2409  
5
17  
8054  
2945  
平均
17.8
7900.2
2367.0
偏差(越小越稳定)
0.748
443.326
305.225

测试程序:

源码:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
 scriptTimeLimit="10"
 width="520" height="490">
 <mx:Script>
 <![CDATA[
 
 private static const FOR:String = "for 循环";
 private static const FOR_IN:String = "for..in 循环";
 private static const FOR_EACH:String = "for each 循环"
 private static var LOOP_SRC:Array = ("abcdefghijklmnopqrstuvwxyz").split("");
 
 private function test(testCase:String):void {
  var loopCount:int = int(count_ns.value);
  var start:int, now:int;
  var i:int;
  output("@" + testCase);
  try {
   switch (testCase) {
    case FOR:
     start = getTimer();
     for (i = 0; i < loopCount; i++) {
      //var length:int = LOOP_SRC.length;
      for(var j:int; j<LOOP_SRC.length; j++) {
       LOOP_SRC[j].toUpperCase();
      }
     }
     now = getTimer();
     break;
    case FOR_IN:
     start = getTimer();
     for (i = 0; i < loopCount; i++) {
      for(var j2:String in LOOP_SRC) {
       LOOP_SRC[j2].toUpperCase();
      }
     }
     now = getTimer();
     break;
    case FOR_EACH:
     start = getTimer();
     for (i = 0; i < loopCount; i++) {
      for each(var v:String in LOOP_SRC) {
       v.toUpperCase();
      }
     }
     now = getTimer();
     break;
   }
  }
  catch (e:Error) {
   now = getTimer();
   output("  " + i + "次时弹出错误: " + e);
  }
  var time:int = now - start;
  output("  经过时间(ms): " + nf.format(time));
  output("  1秒中的循环次数: " + nf.format(i * 1000 / time));
  output("----------------------------------------");
 }

 private function output(msg:String):void {
  output_ta.text += msg + "\n";
 }
 ]]>
 </mx:Script>
 
 <mx:NumberFormatter id="nf" precision="0" />
 <mx:Panel title="循环数组的压力测试"
  paddingTop="8" paddingRight="8" paddingBottom="8" paddingLeft="8">
  <mx:HBox>
   <mx:Label text="循环回数:" />
   <mx:NumericStepper id="count_ns" value="100000" maximum="10000000" />
  </mx:HBox>
  <mx:HBox>
   <mx:Button label="{FOR}" click="test(FOR)" />
   <mx:Button label="{FOR_IN}" click="test(FOR_IN)" />
   <mx:Button label="{FOR_EACH}" click="test(FOR_EACH)" />
  </mx:HBox>
  <mx:TextArea id="output_ta" width="400" height="300" />
  <mx:Label color="red" text="*Application.scriptTimeLimit设为了10秒。" />
 </mx:Panel>
</mx:Application>

2008-01-13

[AS3]trace() 与 logging 的压力测试

trace() 其实很慢!以后再发布时,一定要注意去掉 trace()mx.logging.Target

源代码:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
scriptTimeLimit="5"
width="520" height="490">
<mx:Script>
<![CDATA[
import mx.logging.ILogger;
import mx.logging.Log;
import mx.logging.targets.TraceTarget;

private static const logger:ILogger = Log.getLogger("TraceTest");

private static const NONE:String = "无 trace()";
private static const TRACE:String = "有 trace()";
private static const LOGGER:String = "logger.debug()"

private var tt:TraceTarget;

private function test(testCase:String):void {
var loopCount:int = int(count_ns.value);
var start:int, now:int;
var i:int;
output("@" + testCase);
try {
switch (testCase) {
case NONE:
start = getTimer();
for (i = 0; i < loopCount; i++) {
"abcdefghijklmnopqrstuvwxyz";
}
now = getTimer();
break;
case TRACE:
start = getTimer();
for (i = 0; i < loopCount; i++) {
trace("abcdefghijklmnopqrstuvwxyz");
}
now = getTimer();
break;
case LOGGER:
start = getTimer();
for (i = 0; i < loopCount; i++) {
logger.debug("abcdefghijklmnopqrstuvwxyz");
}
now = getTimer();
break;
}
}
catch (e:Error) {
now = getTimer();
output(" " + i + "次时弹出错误: " + e);
}
var time:int = now - start;
output(" 经过时间(ms): " + nf.format(time));
output(" 1秒中的循环次数: " + nf.format(i * 1000 / time));
output("----------------------------------------");
}

private function updateTraceTarget():void {
if (!tt) {
tt = new TraceTarget();
tt.includeDate = false;
tt.includeTime = false;
tt.includeLevel = true;
tt.includeCategory = true;
}

if (traceTarget_ch.selected) {
Log.addTarget(tt);
} else {
Log.removeTarget(tt);
}
}

private function output(msg:String):void {
output_ta.text += msg + "\n";
}
]]>
</mx:Script>

<mx:NumberFormatter id="nf" precision="0" />
<mx:Panel title="trace()与logger.debug()的压力测试"
paddingTop="8" paddingRight="8" paddingBottom="8" paddingLeft="8">
<mx:HBox>
<mx:Label text="循环回数:" />
<mx:NumericStepper id="count_ns" value="1000000" maximum="10000000" />
</mx:HBox>
<mx:HBox>
<mx:Button label="{NONE}" click="test(NONE)" />
<mx:Button label="{TRACE}" click="test(TRACE)" />
<mx:Button label="{LOGGER}" click="test(LOGGER)" />
<mx:CheckBox id="traceTarget_ch" label="添加TraceTarget" change="updateTraceTarget()"/>
</mx:HBox>
<mx:TextArea id="output_ta" width="400" height="300" />
<mx:Label color="red" text="*Application.scriptTimeLimit设为了5秒。" />
</mx:Panel>
</mx:Application>

2008-01-07

[AS3]pixelDissolve 有 Bug?

最近发现使用 BitmapData.pixelDissolve 溶解像素时,无论 randomSeednumOfPixels 参数是多少,sourceRect 指定的矩形的左上角一定会被溶解!

比如设定为溶解 10 个像素时,左上角 + 剩下的像素中取 10 个会变化。设为溶解 0 个时,只有左上角会变化。

例子: 可以看到左上角很不自然。

例子的代码:

package {
import flash.display.*;
import flash.events.Event;
import flash.geom.*;

[SWF(width="32",height="32")]
public class Test2 extends Sprite{
public function Test2():void {
var bitmap:BitmapData = new BitmapData(32, 32, false,0);
var seed:int = 0;
addChild(new Bitmap(bitmap));
addEventListener(Event.ENTER_FRAME,
function (event:Event):void {
seed = bitmap.pixelDissolve(bitmap, bitmap.rect, new Point(0,0),
seed, 5, Math.random()*0x1000000);
}
);
}
}
}

我用的 Flash Player 的版本是 9.0.115.0。

2008-01-06

[AS3]加载大于 2880px 的图片的方法

Flash Player 在加载大于 2880px 的图片时,大于 2880px 的区域将会被剪掉!2880px 这个限度虽然一般不小,但对某些开发来说,却是一堵又高又大的墙。

但在 AS3.0 里,却是可以办到的!使用 URLStream 加载后,用 Loader.loadBytes 来显示

通过二进制的加载,会忽视外部域名的图片的安全沙箱。也就是说可以随便 draw 了。但注意加载本身是需要 crossdomain.xm了的。

2008-01-04

ActionScript Snippets 开通了

ActionScript Snippets 是一个收集 Advanced Flex Project 在开发时有用的代码、类的博客。

代码均遵循 Apache License 2.0。希望对大家有所帮助。

地址:ActionScript Snippets

2008-01-03

解决 Firefox 播放 Flash 时无法移动 Tab 的问题

使用 Firefox 播放重的 Flash 时有时会出现无法移动、关闭 Tab,像是没有响应了一样。这时只需要新开一个标签,就恢复响应了。