Camtasia Studio 6

下周要负责录一个内部产品的Tutorial,于是先行用Camtasia Studio来录了一个测试教程,还是蛮好用的。

缺点有:

Smart Focus显得移动过于频繁;

生成Flash预加载缓冲内容过多,将近5%;(不知有没有配置选项)

机器embeded的话筒录下来,感觉完全是另外一个人的声音;

突然发现,”嗯啊哈”的,如此之多,呵呵。

附测试结果:【教程整个很白痴,纯粹测试性质】

http://www.axqd.net/hotkey/ for Hotkey Power on http://www.axqd.net/

PS: 工作后真是没法坚持定期写Blog了,一切随缘吧,想起了又无事,就多写几篇。

一道面试题

最近帮某公司出了一道面试题,由于面试官技术参差不齐。所以,题目要求:上手容易(不然冷场了,面试官不易处理),还有就是不怎么暴露面试官的无知。

题目内容比较open,没有标准答案,只是要求用伪码实现简化版的windows计算器标准模式,相信大家上手应该都不成问题。

然而实际效果,这道题目区分度还是蛮大的。正是因为按键少,上手就写程序,很容易就成为意大利面条式的代码。甚至有人电话面试的时候,没到5分钟,就直接压了电话。

按键设定为只有以下18个:
0 1 2 3 4 5 6 7 8 9 . + – * / = C +/-

由于对一切乱七八遭的输入,都要能够接受,不做异常处理,我们有下面一些约定:
1. 忽略前置0: 000000 => 0;
2. 忽略多个.:1…..23 => 1.23;
3. 多个操作符(包括=)取最后一个(这与windows的版本有细微出入):*/2 => /2;

最后,是一些考量:
1. 有限状态机在这里是比较自然的思路;
2. 初始计算前加入0+的计算,可以与后面的情况合并处理;
3. Clear和+/-可以不进入状态机处理,而提前解决掉;
4. 一般都能把数字”0~9″和”.”、”+-*/”和”=”统一处理;但问题在于,用了大量的if来别扭的处理”=”,其实”=”之所以别扭,就是因为他和”+-*/”最大的不同,在于它是unary operator,而其他的是binary operator。如果考虑到这里,那么对于后续问题。例如,如何加入对于sin/cos/开根号等的支持,也能作出较好的回答;
5. 还有一个小陷阱,除0的考虑;

总之,简单的一道题目,但在面试的特殊环境下,能够较好的区分出应聘者的设计水平。

为了更好的在面试的时候说明题目,我用flex实现了一个界面(因为只起演示作用,所以有个已知的bug就是超长的输入数字,或者回显的超长数字结果,会使程序的显示产生未定义行为)[Updated: 加了个限长为10,现在可以忽略这句话了]。

附件里有代码和状态转换图,有兴趣的可以下来看看。有更好的考量,还望多多指教。

http://www.axqd.net/calculator/

古灵精怪

以前一直很惊叹解析DOC的quirks模式,居然能在如此多错误的情况下容错,保持健壮。但最近看看Macromedia公司的AS2官方类库,才更为惊叹AS脚本解析器的容错能力;
代码里面一堆堆错误,硬是能够正常跑起来,结果放到Eclipse下,一大堆报错,类库编译都通不过,用FDT+Aswing随便个小东西就得改一大堆的错误才能运行,随便举几个例子:
以下摘抄都是官方公布类库:
Directory:
Documents and SettingsAdministratorLocal SettingsApplication DataMacromediaFlash 8zh_cnConfigurationClasses
例一、类型不匹配
不过ASv1本身就是弱类型的,所以不算太错,但Number-Date真不知运行的时候为啥不会错,因为确实没找到转换函数
mxservicesWSDL.as

if (src != undefined)
{
var start = new Date();
this.wsdl.log.logInfo("Received WSDL document from the remote service", Log.VERBOSE);
this.parseXML(src);
this.loaded = true;
//加入此行,真不知 Math.round(new Date().getMilliseconds())错在哪里T T
var end = new Date();
//106 var parseTime = Math.round(new Date()) - start;
var parseTime = Math.round((end.getMilliseconds()) - start.getMilliseconds());
this.wsdl.log.logInfo("Parsed WSDL XML [" + parseTime + " millis]", Log.VERBOSE);
}

例二、变量名重复定义
例三、缺少结尾分号
mxservicesWebServiceProxy.as

// Shut off the __resolve
this.service.__resolve = function(operationName) {
var callback = new PendingCall();
callback.genSingleConcurrencyFault = function()
{
clearInterval(this.timerID); // only once
//192对应例二 var fault = new SOAPFault("Client.NoSuchMethod",
var innerFault = new SOAPFault("Client.NoSuchMethod", "Couldn't find method '" + operationName + "' in service!");
this.__handleFault(innerFault);
this.onFault(innerFault);
//197对应例三
};
callback["timerID"] = setInterval(function() { callback.genSingleConcurrencyFault(); }, 50); // 5 ms
return callback;
};

例四、相等与赋值乱用
mxservicesWSDL.as

// per WSDL 1.1 spec, if message is not named default to op Name plus suffix by mode:
if (message.name == undefined)
{
if (mode == SOAPConstants.MODE_IN)
{
message.name = operationName + "Request";
}
else
{
//598message.name == operationName + "Response";
message.name = operationName + "Response";
}
}

例五、不知为何
mxservicesNameSpace.as

//18
static var _doc = new XML();
//65不知为何必须使用this来访问static成员,反正少了编不过
var node = this._doc.createTextNode(value);