javascript 代码质量检查工具


http://www.jslint.com/

1.  使用dot引用要比下表引用的效率高; 如: arr["a"] 不如 arr.a的效率高,只是如果下表是数字就不能使用dot来引用了

2. for in 与 if hasOwnProperty

Array.prototype.a = function(){alert(‘a’);};
var arr = ["a","b"];
for (var i in arr) {
    if (arr.hasOwnProperty(i)) {
        alert(arr);
    }

}

对于一个数组,你可能希望使用for in来遍历,但是里面总是有一些其他的东西,使用hasOwnProperty就可以搞定了

页面中的全局污染

今天一个同事打电话说他在退出的时候会出现一个confirm("您确定要退出吗");的提示,他又确信没有写这段代码。

我使用httpwatch抓到所有页面的内容之后,使用httpwatch的find功能,查找到了confirm是出现在一个不太相关的js中,内容包含:

        

  • js全局变量的污染
  •     

  • 元素ID的污染
  •     

  • css存在污染的问题吗?
        

emc的4道面试题自解

1.int main() {
  fork();
  fork()&&fork()||fork();
  fork();
}
问:共创建了多少进程?

这道题我第一个映像就是短路求值,然后又想到了几何级数,以及fork函数,fork后还有fork

我的答案是20-1=19。前边的20是进程总数,后边-1是创建进程数

第一个fork完后共用2个进程(ID=1,ID=2),第二个fork,当返回值为0时,即子进程时,直接调用倒数第二个fork,于是ID=1,ID=2分别调到第二个fork,然后各调到倒数第二个fork,共形成了8个进程

第二个fork不为0时,即进程为母进程或第一个子进程时,则要看第二个fork如果第二个fork也不为0的话,则不用考虑第三个进程,最先存在两个进程调用最后的fork,然后形成了4个进程

第二个fork!=0,第三个为0时,则需要调用后边两个fork,则为2X2X2=8

所以除去最开始的进程,一共创建19个进程
2.#define NELE(a) (sizeof(a) / sizeof(a[0]))
  int main() {
    char str[] = {‘E’, ‘M’, ‘C’};
    for (int d=-1; d<=(NELE(str)-2);d++)
      printf("%c",str[d+1]);
    return 0;
  }
问:输出结果

什么都没输出,根据C99文档,sizeof是无符号的数,当表达式中出现了个无符号的数时,所有有符号转化成无符号,则-1将变成一个巨大的值,那么直接return了
3.int i=1;
  printf("%d,%d\n",sizeof(i++),i);
  问:输出结果

4,1

sizeof()在编译前就处理了,因此sizeof(xxx)就是求的是int的大小,而++被忽略了。。。
4.#define f(a,b) a##b
  #define g(a)   #a
  #define h(a)  g(a)

  int main() {
   printf("%s\n",g(f(1,2)));
   printf("%s\n",h(f(1,2)));
   return 0;
  }
  问:输出结果
12

ascii12代表字符

 a##b字符12

#define g(a)   #a引用字符12

 #define h(a)  g(a) g(a)被字符12代替,然后理解为了数字12

Http 协议中ETag的用法

大网站一般都是用F5或其它的负载均衡设备,用户的每次请求落在那台real server都是不一定的,一次偶然的机会,发现相同的一个资源在两次访问时,http头中的etag是不相同的,主要是该资源一定是没有被修改的,于是想到etag的算法中可能使用到了资源在不同real server上可能不同的因子,于是参考了一下apache的文档(因为我们使用的是apache),文档地址:
http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/core.html#fileetag

默认情况下,etag和资源的inode有关系,而inode在不同的real server上基本是不相同的,于是,这样的etag还不如没有,因为这样该资源是每次都要返回全部信息的,可以修改apache配置文件,添加如下配置:

FileETag MTime Size

这样修改后,如果文件没有发生变化,则只需要返回304就行,不需要返回所有内容了。
如果不做这样的设置,对于使用f5的情况,etag或许还不如没有。

关于apache中etag的算法,可以参考源码: src/main/http_core.c 中的函数set_etag_bits

那么,你的apache是怎么配置的呢?随便访问一个能返回etag的资源,etag类似:
ETag: "1e50006-22d0-4ba718e6"

如果是“-”分隔的3部分,字基本是包含inode、mtime、size了,如果是两部分,那就是其中的两项了,注意,每一项产生的长短不是固定的,不能按照长短来分析。

memcache-2.2.4 中对key的转换

一次在使用PHP的memcache-2.2.4模块访问mc时,不小心把含有tab的字符串做了key,在跟踪时发现我的key中出现tab的地方都成了“_”了,于是怀疑memcache-2.2.4对我的key做了处理了,于是看了memcache-2.2.4的源码,才发现如下函数,该函数里面将assii码小于空格的字符都要转换成“_”的。

int mmc_prepare_key_ex(const char *key, unsigned int key_len, char *result, unsigned int *result_len
 TSRMLS_DC)  /* {{{ */
{
    unsigned int i;
    if (key_len == 0) {
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Key cannot be empty");
        return MMC_REQUEST_FAILURE;
    }

    *result_len = key_len < MMC_KEY_MAX_SIZE ? key_len : MMC_KEY_MAX_SIZE;
    result[*result_len] = ‘\0’;
   
    for (i=0; i<*result_len; i++) {
        result = ((unsigned char)key) > ‘ ‘ ? key : ‘_’;
    }
   
    return MMC_OK;
}

Ubuntu 上的vpn server 与 lvs

   今天突然又想起来了lvs,因为不需要硬件,就想自己也安装一个体验一下,由于windows上都不支持,所以就选择了我的Ubuntu;看了一些文档,发现安装太挺麻烦,都需要给内核打补丁,后来在新德里软件包管理器里找了一下,发现里面有了ldirectord,就是我要找的lvs, 还有pptpd,就是我要找了vpn server了,先不管怎么编译了,安装上试试吧。
   今天太晚了,以后再研究吧。
         

关于crontab中启动进程

      今天发现一个进程在
      futex(0x33a120, FUTEX_WAIT, 2, NULL <unfinished …>

      处“阻塞”,反正不往下运行了,就暂且叫“阻塞”吧,而且ps时发现进程状态为“Ss”,看到“s”,我以为是一个deamon,这是一个PHP程序,我 看了看代码,发现里面没有任何关于deamon的处理,也没有while、for等循环语句,怀疑不是一个deamon,但是“s”是怎么出现的呢?
      后来发现该进程是从crontab启动的,难道crontab启动的进程都会有“s”,测试了一个程序,确实是这样的。
      至于为什么在futex处阻塞,明天再仔细看看源码吧。

    关于futex (‘Fast Userspace muTexes’)的相关资料:
    http://linux.die.net/man/7/futex
    http://javadino.blog.sohu.com/99256728.html