中秋快乐

海上生明月,天涯共此时。

05年离家之后,每年都是过年回一次家,今年是个例外,在遥远的老家,祝所有认识我的人,和我认识的人,中秋快乐,发财多多(虽然俗了点)。手机遇到点问题,没逐个给各位问好,多多包含。
PS:但愿我回去的时候各位不要跟我说国庆阅兵式多么的壮观,我不喜欢浪费纳税人的钱彰显自己的阔绰和宏伟,我爱我的祖国,但我不喜欢过度的政治宣传。

Firefox CPU 占用50%解决

前几天突然发现Firefox启动时候CPU占用有50%,更要命的是居然启动不起来,总是崩溃,崩溃,由于开发任务忙,换成别的浏览器继续搞,这两天又去旅游了一趟,早上一到公司,就开始整,DBA Notes的Fenng大侠,在他的博客中说是quick time这个播放器引起的,我跑到安装目录下面,没找到quick time这个插件,最后google到这篇文章,说是由google desktop不兼容引起的,google的桌面软件一向兼容性不是很好,卸载之,果然firefox正常了,唉,惊叹一下google的工程师是不是都用Mac的,郁闷

记忆(memoization)在JavaScript中的应用

函数可以用对象去记住先前操作的结果,从而能避免无谓的运算。这种优化被称之为记忆,英文叫做memoization。关于memoization可以参见维基百科的解释。JavaScript的对象和数组要实现这样的优化是非常方便的,比如说,我们要递归计算著名的fibonacci数列,一个fibonacci数字是之前两个fibonacci数字之和,最前面两个数字是0和1.

var fibonacci = function (n) {
    return n <2 ? :fibonacci(n-1) + fibonacci(n - 2);
};
for(var i = 0; i <= 10; i++) {
    document.writeln('//' + i + ":" + fibonacci(i));
}

这样的算法是可以工作的,但本身做了很多无谓的运算。fibonacci函数被调用了453次。我们调用了11次,而自身调用了442次去计算可能已经计算过的值。如果我们让该函数具备记忆功能就可以显著减少运算量。
我们在一个名为memo的数组中保存我们的存储结果,存储结果可以隐藏在闭包中。当我们的函数被调用时,这个函数首先看是否已经知道存储结果,如果已经知道,就立即返回这个存储结果。

var fibonacci = function () {
    var memo = [0,1];
    var fib = function (n) {
        var result = memo[n];
        if(typeof result !== 'number') {
            result = fib(n - 1) + fib(n - 2);
            memo[n] = result;
        };
        return result;
    };
     return fib;
}();

这个函数返回同样的结果,但只被调用了29次,我们调用了它11次。他自身调用了18次去取得之前的存储结果。运算效率大约提升了93%,可见记忆这种优化的能力是非常强大的。PHP语言中也可以使用闭包创造类似的记忆优化算法。

解决file_get_contents的超时问题

file_get_contents一步就做完了打开,读取,关闭的三个动作,过程相当自动化,并且可以读取远程内容,非常方便,在网络状况差的情况下,可能会导致程序执行陷入停滞或者过慢,因为不停的重试和等待PHP进程本身的超时才会退出。晚上再次阅读了PHP手册,发现可以用一个比较变态的东西来解决,就是创建一个可以控制的资源句柄,通过控制资源句柄超时来控制file_get_contents这个方法的超时时间,使用起来很方便,也很简单。

$opts = array(
           'http'=array(
	         'method'="GET",
	         'timeout'=1, //设置超时,单位是秒,可以试0.1之类的float类型数字
		)
	);
$context = stream_context_create($opts);
$contents = file_get_contents($url,false,$context);

得到内容之后该怎么处理就怎么处理了,关于tream_context_create这个方法的更多HTTP协议参数,请参见:HTTP context options,其他协议,请参见Context options and parameters

Update 09-09-17: 我测试的时候使用的g.cn的首页,非常快,把timeout设置为1,没有超时的感觉,我以为是分钟为单位,感谢的Lightning$指正,单位是秒。

迅雷去广告方法

迅雷应该算是当前中国装机量最大的下载软件,很多人没听过快车,很少人没听过迅雷,不过迅雷在一开始就过度的关注商业利润,使得现在广告满天飞,严重影响用户体验,致使很多人使用修改版(去广告版)迅雷,修改版迅雷之所以受欢迎,不仅仅因为广告,还因为CPU消耗更多,更关注用户的隐私,更方便。这个很类似当年的珊瑚虫QQ,我觉得迅雷有必要去学学QQ了,QQ自从2009版本发布以后,允许用户自定义界面模块,并且边界可隐藏,广告体验大大的优化了,我看过大部分人都不隐藏界面上的东西,有些是因为他们不知道,有些是因为习惯了这样的界面,但无论如何,更好的UI体验,更自由的定制,都堵住了像我这样挑剔的用户的嘴巴,或者用说就是不给钱却要求很多的高端用户,迅雷做的还远远不够,弹出的广告太恶心。

其实修改版迅雷除了精简了一些模块和调整了一些默认设置之外,还做了一件最重要的事情就是修改hosts文件,关于这个文件的作用可以参考百度百科中的解释,这文件的位置位于:C:\WINDOWS\system32\drivers\etc,当然假如你的系统不是在C盘,那就看着办吧,在上面的路径中找到hosts文件,然后右键打开方式里面选择记事本,在文件的最后添上如下字段:

0.0.0.0   pubstat.sandai.net
0.0.0.0   mcfg.sandai.net
0.0.0.0   biz5.sandai.net
0.0.0.0   float.sandai.net
0.0.0.0   cl.kankan.xunlei.com
0.0.0.0   mtips.xunlei.com
0.0.0.0   211.94.190.80
0.0.0.0   adsresult.joywell.com.cn
0.0.0.0   advstat.xunlei.com
0.0.0.0   wy.xunlei.com
0.0.0.0   kkpgv.xunlei.com
0.0.0.0   statis.kankan.xunlei.com
0.0.0.0   server1.adpolestar.net
0.0.0.0   mpv.sandai.net

目前可以达到去除所有广告的目的,不知道以后会不会改地址,暂且用之。另外,修改版迅雷可能会被插入一些用户行为统计的代码或程序,比如尼尔森,艾瑞所思之流就经常和流氓软件的作者合作干这种勾当,这也是我不使用修改版的一个重要原因之一。