Hot For Coding
  • Cannot locate header file MagickWand.h

    今天编译安装PHP拓展imagick的时候,总是提示:

    checking for MagickWand.h header file... configure: error: Cannot locate header file MagickWand.h

    跳不过去,缺少头文件

    configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
    checking for gawk... gawk
    checking whether to enable the imagick extension... yes, shared
    checking whether to enable the imagick GraphicsMagick backend... no
    checking ImageMagick MagickWand API configuration program... found in /usr/local/bin/MagickWand-config
    checking if ImageMagick version is at least 6.2.4... found version 6.8.6 Q16 
    checking for MagickWand.h header file... configure: error: Cannot locate header file MagickWand.h
    

    ...

    READ ALL

  • jQuery Ajax 的同步与异步

    默认jQuery所有的Ajax请求默认都是异步处理,即在回调函数里处理返回结果:

    $.get('b.txt', function(data){
      console.log(data);
    });
    

    执行结果:

    full

    为了更清楚的知道异步处理特性,改写一下

    console.log("开始请求!");
     
    $.get('b.txt',function(data){
      console.log("请求结果!");
    });
     
    console.log("请求之后!");
    

    ...

    READ ALL

  • JsDoc生成你的JavaScript文档

    这是一个Java写的文档生成工具,注释风格要求跟Java的一样即可生成出注释文档,非常好用。直接到官网下载,网上一大堆教程都是JsDoc2版的,现在官网已经说了不再支持JsDoc2版,推荐使用JsDoc3版本。

    Github: https://github.com/jsdoc3/jsdoc

    下载后不用安装直接就能用,当然还是要先安装配置好JDK环境,不会的自行找资料。以Win平台做例子,下载过来后解压然后启动命令模式进入程序目录下执行jsdoc即可启动程序,可以直接jsdoc --help查看帮助文档,jsdoc3更直接方便的生成注释文档

    ...

    READ ALL

  • Linux使用grep命令检索多个文件

    Linux中grep是一个常用的搜索命令,今天介绍一下如何使用这个命令在多个文件里检索,用法很简单

    grep <searching string> <pattern searching file>

    如果我要检索当前所有md文件中的Hello关键字,可以这么用

    $ grep Hello *.md
    a.md:Hello World!
    b.md:Hello, Jac
    b.md:Hello, Jim
    

    如果我们想知道是哪一行,可以加-nr属性

    grep -nr Hello *.md
    a.md:1:Hello World!
    b.md:1:Hello, Jac
    b.md:2:Hello, Jim
    

    ...

    READ ALL

  • jQuery替换标签函数replaceWith()的使用

    jQuery中,有一个强大的替换函数replaceWith(),使用非常简单,如:

    // 把所有p标签替换为“##”
    $('p').replaceWith('##');
    

    利用这个replaceWith,我们可以把所有p标签替换为b标签,内容不变:

    $('p').each(function(){
      $(this).replaceWith('<b>'+$(this).html()+'</b>');
    });
    

    如果你开发的是一个多语言的网站,甚至可以利用这个特性,比如,在你需要翻译的文字上加上i标签,然后遍历翻译替换。

    ...

    READ ALL

  • JavaScript深度比较两个对象是否相等

    在JavaScript中比较两个对象的成员是否相等有点麻烦,如果只是第一层比较,很容易,但子对象里的属性可能又是一个对象,所以只能递归。

    代码:

    // 去重
    Array.prototype.unique = function () {
      this.sort();
      var re = [this[0]];
      for (var i = 1; i < this.length; i++) {
        if (this[i] !== re[re.length-1]) {
          re.push(this[i]);
        }
      }
      return re;
    }
    
    var objectDeepEqual = function(o1, o2) {
      if(typeof o1 != typeof o2){
        return false;
      }
    
      if(typeof o1.length != typeof o2.length ){
        return false;
      }
    
      var bool = true;
    
      var keyArr1 = [];
      var keyArr2 = [];
        
      for (var i in o1) {
        keyArr1.push(i);
      }
    
      for (var i in o2) {
        keyArr2.push(i);
      }
    
      if (keyArr1.length != keyArr2.length) {
        return false;
      }
    
      for(var i = 0, k = keyArr2.length; i < k; i++){
        keyArr1.push(keyArr2[i]);
      }
    
      var keyArr = keyArr1.unique();
    
      for(var i=0,k=keyArr.length;i<k;i++){
        if ((keyArr[i] in o1) && (keyArr[i] in o2)) {
          if (typeof o1[keyArr[i]] == 'object' && typeof o2[keyArr[i]] == 'object' ) {
            bool = objectDeepEqual(o1[keyArr[i]], o2[keyArr[i]]);
          } else if (o1[keyArr[i]] !== o2[keyArr[i]]){
            return false;
          }
        }else{
          return false;
        }
      }
    
      return bool;
    };
    
    

    ...

    READ ALL

  • 看看这些程序是如何盗取站点数据的

    翻了一下Nginx的log,发现这些傻逼天天使用程序不停的想要盗取我站点资料

    14.114.23.72 - [23/Jul/2013:16:40:01] "HEAD /wwwroot.rar HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
    14.114.23.72 - [23/Jul/2013:16:40:01] "HEAD /wwwroot.zip HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
    14.114.23.72 - [23/Jul/2013:16:40:01] "HEAD /www.rar HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
    14.114.23.72 - [23/Jul/2013:16:40:02] "HEAD /www.zip HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
    14.114.23.72 - [23/Jul/2013:16:40:02] "HEAD /bbs.rar HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
    14.114.23.72 - [23/Jul/2013:16:40:02] "HEAD /bbs.zip HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
    14.114.23.72 - [23/Jul/2013:16:40:02] "HEAD /web.rar HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
    14.114.23.72 - [23/Jul/2013:16:40:02] "HEAD /web.zip HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
    14.114.23.72 - [23/Jul/2013:16:40:02] "HEAD /www.qttc.net.rar HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
    14.114.23.72 - [23/Jul/2013:16:40:02] "HEAD /www.qttc.net.zip HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
    14.114.23.72 - [23/Jul/2013:16:40:02] "HEAD /www_qttc_net.rar HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
    14.114.23.72 - [23/Jul/2013:16:40:02] "HEAD /www_qttc_net.zip HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
    14.114.23.72 - [23/Jul/2013:16:40:02] "HEAD /wwwqttcnet.rar HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
    14.114.23.72 - [23/Jul/2013:16:40:02] "HEAD /wwwqttcnet.zip HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
    14.114.23.72 - [23/Jul/2013:16:40:02] "HEAD /qttc.net.rar HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
    14.114.23.72 - [23/Jul/2013:16:40:03] "HEAD /qttc.net.zip HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
    14.114.23.72 - [23/Jul/2013:16:40:03] "HEAD /qttc.rar HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
    14.114.23.72 - [23/Jul/2013:16:40:03] "HEAD /qttc.zip HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
    

    ...

    READ ALL

  • 阻止IE8下右键菜单的弹出

    今天写一个自定义右键菜单功能,要实现这个功能需要捕获右键事件,这个很容易,几乎没有任何兼容。标签上添加 oncontextmenu 事件就好。下来就是阻止事件传播以及阻止系统右键弹出菜单的功能。于是我这么干

    var e = evt || window.event;
     
    if (e.preventDefault) {
      e.preventDefault();
    }
         
    if (e.stopPropagation) {
      e.stopPropagation();
    } else {
      e.cancelBubble = true;
    }
    

    ...

    READ ALL

  • Nginx配置proxy_cache后缓存目录里没有生成缓存文件

    之前一直都使用memcached做缓存,最近想尝试一下Nginx的proxy_cache缓存方式,proxy_cache可以根据指定key的组合方案生成MD5哈希把页面结果存储在磁盘上,跟大多综合站点的生成静态页的缓存方式一样。proxy_cache方式跟memcached内存级别的缓存还是不能比拟,但Nginx目前还不能做memcached的write动作,所以简单配置proxy_cache也能抵挡不少鸭梨。

    没有配置好proxy_cache

    但在网络上搜索几篇文章以后,发现大家写的很模糊,很多文章都是抄袭复制品。所以按照网络上的教程,我一开始是这么配置的,在http段增加:

    ...

    READ ALL

  • 狡猾的几道PHP试题,试试看看你会不会也掉入陷阱

    这几道题是在网上看到的,感觉挺有意思,拿来给大家分享其中的陷阱,看看你会不会掉入其中。

    第一题

    $arr = array(0 => 1, "aa" => 2, 3, 4);
    
    foreach($arr as $key=>$val){
      print($key == "aa" ? 5 : $val);
    }
    

    输出结果是多少?如果的答案是1534就掉入陷阱了。

    先看看这个数组最终形成的结构:

    Array
    (
      [0] => 1
      [aa] => 2
      [1] => 3
      [2] => 4
    )
    

    然后遍历每一个元素的key看等不等于aa,等于就用5替代。当我告诉你答案是5534的时候,你会不会有点惊讶!难道0等于"aa"吗?是的,0就等于"aa",这道题重点就考你这个。在PHP中两个值进行逻辑判断时,如果两个值的类型不一致PHP会自动把右边的值转换到左边的类型,然后再进行判断。因此"aa"转换整形等于0,自然也就等于左边的0了。你可以使用全等于避免这种该情况,也就是如果你写成

    ...

    READ ALL