FriendFeed

【转载】建博40个实用技巧(精品博客)

转自精品博客



安装WordPress

1.先阅读别人的错误。

2.选择一个可信赖的空间服务商。

3.选择一个好的域名。

4.如果您需要灵感,请点这里。

5.注册并保留注册域名。

6.在根目录下安装WordPress。

7.更新Ping清单。

主题和设计

8.选择一个专业的WordPress主题。

9.去掉主题上不需要的信息。

10.增加一个网页徽标。

11.在单独页面末放置RSS标识。

12.建立一个实用的页脚。

13.组织您的分类。

14.优化“关于”页面。

15.提升网页速度。

检查和验证

16.确保您的博客与各种浏览器相容。

17.检查网页加载时间。

18.测试SEO状况。

19.验证您的网页。

20.保留维护清单。

插件

21.安装Akismet。

22. 安装WordPress Database Backup。

23. 安装Subscribe to Comments,但不要打勾。

24.安装Chunk URLs。

25.安装Related Enteries并考虑将相关文章的值设为3。

26.安装Custom Query String。

27.安装Jerome's Keywords。

28.安装sig2feed。

SEO和分析

29.安装Google Sitemap Generator。

30.安装Enforce www Preference。

31.优化您的元标识。

32.优化URL结构

33.让分类页面显示摘要。

34.使用301重定向。

35.建立Robots.txt文档(具体请看总结)

36.优化标题。

37.取消单独页面标题的链接。

38.提供邮件订阅服务。

39.安装Feedburner Replacement 插件。

40.添加Google Analytics 插件跟踪您的统计数据

精博寄语:

1.原文:每日博客技巧,Deniel,Blog Setup: 40 Practical TipsMax Pool客串文章。

2.以上观点并不一定都合适您,如果您有任何意见,欢迎留言。

【下载】群星 -《奥运情》(eMule)

中文名称:奥运情
资源类型:APE
版本:内嵌CUE
发行时间:2008年05月24日
专辑歌手:群星
地区:大陆
语言:普通话,英语
简介
唱片艺人:樊桐舟 江智民 小月 张琼 潘绍麟
发行公司:广东东昇影视文化传播有限公司
出版公司:广东音像出版社
ISRC:CN-F18-08-352-00/A.J6

专辑介绍:

全球纪念版奥运发烧天碟《奥运情 DSD》

·中国民乐演绎经典的奥运歌曲往届奥运会举力国的经典民歌
·中国民乐与世界音乐的一次伟大融合 向世界展示中国民族音乐的独特魅力
·邹铁夫、陈珞等金牌制作人联手打造奥运发烧
·顶级发烧歌手攀桐舟、江智民、小月、张琼等为奥运献声
·附赠 全球纪念版精美收藏画册


专辑曲目:

01 北京呼唤你 樊桐舟
02 乘着歌声的翅膀 小月
03 友谊地久天长 江智民
04 红河谷 张琼
05 白兰鸽 樊桐舟
06 北国之春 小月
07 桑塔露琪亚 江智民
08 美丽的西班牙女郎 张琼
09 黄昏放牛 樊桐舟
10 莫斯科郊外的晚上 小月
11 星星索 江智民
12 茉莉花 张琼
13 Yesterday once more(昨日重现) 潘绍麟

电驴下载地址

【分享】JavaScript的加密与解密

今天在网上闲逛,无意中发现一堆经典算法在JS中也可以用哦,于是立马找过来了。

  • SHA-1算法,转自http://pajhome.org.uk/crypt/md5/。
    /*
     * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
     * in FIPS PUB 180-1
     * Version 2.1a Copyright Paul Johnston 2000 - 2002.
     * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
     * Distributed under the BSD License
     * See http://pajhome.org.uk/crypt/md5 for details.
     */

    /*
     * Configurable variables. You may need to tweak these to be compatible with
     * the server-side, but the defaults work in most cases.
     */
    var hexcase = 0;  /* hex output format. 0 - lowercase; 1 - uppercase        */
    var b64pad  = ""; /* base-64 pad character. "=" for strict RFC compliance   */
    var chrsz   = 8;  /* bits per input character. 8 - ASCII; 16 - Unicode      */

    /*
     * These are the functions you'll usually want to call
     * They take string arguments and return either hex or base-64 encoded strings
     */
    function hex_sha1(s){return binb2hex(core_sha1(str2binb(s),s.length * chrsz));}
    function b64_sha1(s){return binb2b64(core_sha1(str2binb(s),s.length * chrsz));}
    function str_sha1(s){return binb2str(core_sha1(str2binb(s),s.length * chrsz));}
    function hex_hmac_sha1(key, data){ return binb2hex(core_hmac_sha1(key, data));}
    function b64_hmac_sha1(key, data){ return binb2b64(core_hmac_sha1(key, data));}
    function str_hmac_sha1(key, data){ return binb2str(core_hmac_sha1(key, data));}

    /*
     * Perform a simple self-test to see if the VM is working
     */
    function sha1_vm_test()
    {
      return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d";
    }

    /*
     * Calculate the SHA-1 of an array of big-endian words, and a bit length
     */
    function core_sha1(x, len)
    {
      /* append padding */
      x[len >> 5] |= 0x80 << (24 - len % 32);
      x[((len + 64 >> 9) << 4) + 15] = len;

      var w = Array(80);
      var a =  1732584193;
      var b = -271733879;
      var c = -1732584194;
      var d =  271733878;
      var e = -1009589776;

      for(var i = 0; i < x.length; i += 16)
      {
        var olda = a;
        var oldb = b;
        var oldc = c;
        var oldd = d;
        var olde = e;

        for(var j = 0; j < 80; j++)
        {
          if(j < 16) w[j] = x[i + j];
          else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
          var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)),
                           safe_add(safe_add(e, w[j]), sha1_kt(j)));
          e = d;
          d = c;
          c = rol(b, 30);
          b = a;
          a = t;
        }

        a = safe_add(a, olda);
        b = safe_add(b, oldb);
        c = safe_add(c, oldc);
        d = safe_add(d, oldd);
        e = safe_add(e, olde);
      }
      return Array(a, b, c, d, e);

    }

    /*
     * Perform the appropriate triplet combination function for the current
     * iteration
     */
    function sha1_ft(t, b, c, d)
    {
      if(t < 20) return (b & c) | ((~b) & d);
      if(t < 40) return b ^ c ^ d;
      if(t < 60) return (b & c) | (b & d) | (c & d);
      return b ^ c ^ d;
    }

    /*
     * Determine the appropriate additive constant for the current iteration
     */
    function sha1_kt(t)
    {
      return (t < 20) ?  1518500249 : (t < 40) ?  1859775393 :
             (t < 60) ? -1894007588 : -899497514;
    }

    /*
     * Calculate the HMAC-SHA1 of a key and some data
     */
    function core_hmac_sha1(key, data)
    {
      var bkey = str2binb(key);
      if(bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz);

      var ipad = Array(16), opad = Array(16);
      for(var i = 0; i < 16; i++)
      {
        ipad[i] = bkey[i] ^ 0x36363636;
        opad[i] = bkey[i] ^ 0x5C5C5C5C;
      }

      var hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz);
      return core_sha1(opad.concat(hash), 512 + 160);
    }

    /*
     * Add integers, wrapping at 2^32. This uses 16-bit operations internally
     * to work around bugs in some JS interpreters.
     */
    function safe_add(x, y)
    {
      var lsw = (x & 0xFFFF) + (y & 0xFFFF);
      var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
      return (msw << 16) | (lsw & 0xFFFF);
    }

    /*
     * Bitwise rotate a 32-bit number to the left.
     */
    function rol(num, cnt)
    {
      return (num << cnt) | (num >>> (32 - cnt));
    }

    /*
     * Convert an 8-bit or 16-bit string to an array of big-endian words
     * In 8-bit function, characters >255 have their hi-byte silently ignored.
     */
    function str2binb(str)
    {
      var bin = Array();
      var mask = (1 << chrsz) - 1;
      for(var i = 0; i < str.length * chrsz; i += chrsz)
        bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (32 - chrsz - i%32);
      return bin;
    }

    /*
     * Convert an array of big-endian words to a string
     */
    function binb2str(bin)
    {
      var str = "";
      var mask = (1 << chrsz) - 1;
      for(var i = 0; i < bin.length * 32; i += chrsz)
        str += String.fromCharCode((bin[i>>5] >>> (32 - chrsz - i%32)) & mask);
      return str;
    }

    /*
     * Convert an array of big-endian words to a hex string.
     */
    function binb2hex(binarray)
    {
      var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
      var str = "";
      for(var i = 0; i < binarray.length * 4; i++)
      {
        str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
               hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8  )) & 0xF);
      }
      return str;
    }

    /*
     * Convert an array of big-endian words to a base-64 string
     */
    function binb2b64(binarray)
    {
      var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
      var str = "";
      for(var i = 0; i < binarray.length * 4; i += 3)
      {
        var triplet = (((binarray[i   >> 2] >> 8 * (3 -  i   %4)) & 0xFF) << 16)
                    | (((binarray[i+1 >> 2] >> 8 * (3 - (i+1)%4)) & 0xFF) << 8 )
                    |  ((binarray[i+2 >> 2] >> 8 * (3 - (i+2)%4)) & 0xFF);
        for(var j = 0; j < 4; j++)
        {
          if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
          else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
        }
      }
      return str;
    }
  • MD5算法,转自http://pajhome.org.uk/crypt/md5/。/*
     * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
     * Digest Algorithm, as defined in RFC 1321.
     * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
     * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
     * Distributed under the BSD License
     * See http://pajhome.org.uk/crypt/md5 for more info.
     */

    /*
     * Configurable variables. You may need to tweak these to be compatible with
     * the server-side, but the defaults work in most cases.
     */
    var hexcase = 0;  /* hex output format. 0 - lowercase; 1 - uppercase        */
    var b64pad  = ""; /* base-64 pad character. "=" for strict RFC compliance   */
    var chrsz   = 8;  /* bits per input character. 8 - ASCII; 16 - Unicode      */

    /*
     * These are the functions you'll usually want to call
     * They take string arguments and return either hex or base-64 encoded strings
     */
    function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
    function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}
    function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));}
    function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }
    function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }
    function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); }

    /*
     * Perform a simple self-test to see if the VM is working
     */
    function md5_vm_test()
    {
      return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
    }

    /*
     * Calculate the MD5 of an array of little-endian words, and a bit length
     */
    function core_md5(x, len)
    {
      /* append padding */
      x[len >> 5] |= 0x80 << ((len) % 32);
      x[(((len + 64) >>> 9) << 4) + 14] = len;

      var a =  1732584193;
      var b = -271733879;
      var c = -1732584194;
      var d =  271733878;

      for(var i = 0; i < x.length; i += 16)
      {
        var olda = a;
        var oldb = b;
        var oldc = c;
        var oldd = d;

        a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
        d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
        c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);
        b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
        a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
        d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);
        c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
        b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
        a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
        d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
        c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
        b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
        a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);
        d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
        c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
        b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);

        a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
        d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
        c = md5_gg(c, d, a, b, x[i+11], 14,  643717713);
        b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
        a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
        d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);
        c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
        b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
        a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
        d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
        c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
        b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);
        a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
        d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
        c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);
        b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);

        a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
        d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
        c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562);
        b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
        a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
        d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);
        c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
        b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
        a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);
        d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
        c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
        b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);
        a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
        d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
        c = md5_hh(c, d, a, b, x[i+15], 16,  530742520);
        b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);

        a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
        d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);
        c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
        b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
        a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);
        d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
        c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
        b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
        a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
        d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
        c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
        b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649);
        a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
        d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
        c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);
        b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);

        a = safe_add(a, olda);
        b = safe_add(b, oldb);
        c = safe_add(c, oldc);
        d = safe_add(d, oldd);
      }
      return Array(a, b, c, d);

    }

    /*
     * These functions implement the four basic operations the algorithm uses.
     */
    function md5_cmn(q, a, b, x, s, t)
    {
      return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
    }
    function md5_ff(a, b, c, d, x, s, t)
    {
      return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
    }
    function md5_gg(a, b, c, d, x, s, t)
    {
      return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
    }
    function md5_hh(a, b, c, d, x, s, t)
    {
      return md5_cmn(b ^ c ^ d, a, b, x, s, t);
    }
    function md5_ii(a, b, c, d, x, s, t)
    {
      return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
    }

    /*
     * Calculate the HMAC-MD5, of a key and some data
     */
    function core_hmac_md5(key, data)
    {
      var bkey = str2binl(key);
      if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);

      var ipad = Array(16), opad = Array(16);
      for(var i = 0; i < 16; i++)
      {
        ipad[i] = bkey[i] ^ 0x36363636;
        opad[i] = bkey[i] ^ 0x5C5C5C5C;
      }

      var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
      return core_md5(opad.concat(hash), 512 + 128);
    }

    /*
     * Add integers, wrapping at 2^32. This uses 16-bit operations internally
     * to work around bugs in some JS interpreters.
     */
    function safe_add(x, y)
    {
      var lsw = (x & 0xFFFF) + (y & 0xFFFF);
      var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
      return (msw << 16) | (lsw & 0xFFFF);
    }

    /*
     * Bitwise rotate a 32-bit number to the left.
     */
    function bit_rol(num, cnt)
    {
      return (num << cnt) | (num >>> (32 - cnt));
    }

    /*
     * Convert a string to an array of little-endian words
     * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
     */
    function str2binl(str)
    {
      var bin = Array();
      var mask = (1 << chrsz) - 1;
      for(var i = 0; i < str.length * chrsz; i += chrsz)
        bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
      return bin;
    }

    /*
     * Convert an array of little-endian words to a string
     */
    function binl2str(bin)
    {
      var str = "";
      var mask = (1 << chrsz) - 1;
      for(var i = 0; i < bin.length * 32; i += chrsz)
        str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
      return str;
    }

    /*
     * Convert an array of little-endian words to a hex string.
     */
    function binl2hex(binarray)
    {
      var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
      var str = "";
      for(var i = 0; i < binarray.length * 4; i++)
      {
        str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
               hex_tab.charAt((binarray[i>>2] >> ((i%4)*8  )) & 0xF);
      }
      return str;
    }

    /*
     * Convert an array of little-endian words to a base-64 string
     */
    function binl2b64(binarray)
    {
      var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
      var str = "";
      for(var i = 0; i < binarray.length * 4; i += 3)
      {
        var triplet = (((binarray[i   >> 2] >> 8 * ( i   %4)) & 0xFF) << 16)
                    | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
                    |  ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
        for(var j = 0; j < 4; j++)
        {
          if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
          else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
        }
      }
      return str;
    }
  • MD4算法,转自http://pajhome.org.uk/crypt/md5/。/*
     * A JavaScript implementation of the RSA Data Security, Inc. MD4 Message
     * Digest Algorithm, as defined in RFC 1320.
     * Version 2.1 Copyright (C) Jerrad Pierce, Paul Johnston 1999 - 2002.
     * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
     * Distributed under the BSD License
     * See http://pajhome.org.uk/crypt/md5 for more info.
     */

    /*
     * Configurable variables. You may need to tweak these to be compatible with
     * the server-side, but the defaults work in most cases.
     */
    var hexcase = 0;  /* hex output format. 0 - lowercase; 1 - uppercase        */
    var b64pad  = ""; /* base-64 pad character. "=" for strict RFC compliance   */
    var chrsz   = 8;  /* bits per input character. 8 - ASCII; 16 - Unicode      */

    /*
     * These are the functions you'll usually want to call
     */
    function hex_md4(s){ return binl2hex(core_md4(str2binl(s), s.length * chrsz));}
    function b64_md4(s){ return binl2b64(core_md4(str2binl(s), s.length * chrsz));}
    function str_md4(s){ return binl2str(core_md4(str2binl(s), s.length * chrsz));}
    function hex_hmac_md4(key, data) { return binl2hex(core_hmac_md4(key, data)); }
    function b64_hmac_md4(key, data) { return binl2b64(core_hmac_md4(key, data)); }
    function str_hmac_md4(key, data) { return binl2str(core_hmac_md4(key, data)); }

    /* 
     * Perform a simple self-test to see if the VM is working 
     */
    function md4_vm_test()
    {
      return hex_md4("abc") == "a448017aaf21d8525fc10ae87aa6729d";
    }

    /*
     * Calculate the MD4 of an array of little-endian words, and a bit length
     */
    function core_md4(x, len)
    {
      /* append padding */
      x[len >> 5] |= 0x80 << (len % 32);
      x[(((len + 64) >>> 9) << 4) + 14] = len;
      
      var a =  1732584193;
      var b = -271733879;
      var c = -1732584194;
      var d =  271733878;

      for(var i = 0; i < x.length; i += 16)
      {
        var olda = a;
        var oldb = b;
        var oldc = c;
        var oldd = d;

        a = md4_ff(a, b, c, d, x[i+ 0], 3 );
        d = md4_ff(d, a, b, c, x[i+ 1], 7 );
        c = md4_ff(c, d, a, b, x[i+ 2], 11);
        b = md4_ff(b, c, d, a, x[i+ 3], 19);
        a = md4_ff(a, b, c, d, x[i+ 4], 3 );
        d = md4_ff(d, a, b, c, x[i+ 5], 7 );
        c = md4_ff(c, d, a, b, x[i+ 6], 11);
        b = md4_ff(b, c, d, a, x[i+ 7], 19);
        a = md4_ff(a, b, c, d, x[i+ 8], 3 );
        d = md4_ff(d, a, b, c, x[i+ 9], 7 );
        c = md4_ff(c, d, a, b, x[i+10], 11);
        b = md4_ff(b, c, d, a, x[i+11], 19);
        a = md4_ff(a, b, c, d, x[i+12], 3 );
        d = md4_ff(d, a, b, c, x[i+13], 7 );
        c = md4_ff(c, d, a, b, x[i+14], 11);
        b = md4_ff(b, c, d, a, x[i+15], 19);

        a = md4_gg(a, b, c, d, x[i+ 0], 3 );
        d = md4_gg(d, a, b, c, x[i+ 4], 5 );
        c = md4_gg(c, d, a, b, x[i+ 8], 9 );
        b = md4_gg(b, c, d, a, x[i+12], 13);
        a = md4_gg(a, b, c, d, x[i+ 1], 3 );
        d = md4_gg(d, a, b, c, x[i+ 5], 5 );
        c = md4_gg(c, d, a, b, x[i+ 9], 9 );
        b = md4_gg(b, c, d, a, x[i+13], 13);
        a = md4_gg(a, b, c, d, x[i+ 2], 3 );
        d = md4_gg(d, a, b, c, x[i+ 6], 5 );
        c = md4_gg(c, d, a, b, x[i+10], 9 );
        b = md4_gg(b, c, d, a, x[i+14], 13);
        a = md4_gg(a, b, c, d, x[i+ 3], 3 );
        d = md4_gg(d, a, b, c, x[i+ 7], 5 );
        c = md4_gg(c, d, a, b, x[i+11], 9 );
        b = md4_gg(b, c, d, a, x[i+15], 13);

        a = md4_hh(a, b, c, d, x[i+ 0], 3 );
        d = md4_hh(d, a, b, c, x[i+ 8], 9 );
        c = md4_hh(c, d, a, b, x[i+ 4], 11);
        b = md4_hh(b, c, d, a, x[i+12], 15);
        a = md4_hh(a, b, c, d, x[i+ 2], 3 );
        d = md4_hh(d, a, b, c, x[i+10], 9 );
        c = md4_hh(c, d, a, b, x[i+ 6], 11);
        b = md4_hh(b, c, d, a, x[i+14], 15);
        a = md4_hh(a, b, c, d, x[i+ 1], 3 );
        d = md4_hh(d, a, b, c, x[i+ 9], 9 );
        c = md4_hh(c, d, a, b, x[i+ 5], 11);
        b = md4_hh(b, c, d, a, x[i+13], 15);
        a = md4_hh(a, b, c, d, x[i+ 3], 3 );
        d = md4_hh(d, a, b, c, x[i+11], 9 );
        c = md4_hh(c, d, a, b, x[i+ 7], 11);
        b = md4_hh(b, c, d, a, x[i+15], 15);

        a = safe_add(a, olda);
        b = safe_add(b, oldb);
        c = safe_add(c, oldc);
        d = safe_add(d, oldd);

      }
      return Array(a, b, c, d);

    }

    /*
     * These functions implement the basic operation for each round of the
     * algorithm.
     */
    function md4_cmn(q, a, b, x, s, t)
    {
      return safe_add(rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
    }
    function md4_ff(a, b, c, d, x, s)
    {
      return md4_cmn((b & c) | ((~b) & d), a, 0, x, s, 0);
    }
    function md4_gg(a, b, c, d, x, s)
    {
      return md4_cmn((b & c) | (b & d) | (c & d), a, 0, x, s, 1518500249);
    }
    function md4_hh(a, b, c, d, x, s)
    {
      return md4_cmn(b ^ c ^ d, a, 0, x, s, 1859775393);
    }

    /*
     * Calculate the HMAC-MD4, of a key and some data
     */
    function core_hmac_md4(key, data)
    {
      var bkey = str2binl(key);
      if(bkey.length > 16) bkey = core_md4(bkey, key.length * chrsz);

      var ipad = Array(16), opad = Array(16);
      for(var i = 0; i < 16; i++) 
      {
        ipad[i] = bkey[i] ^ 0x36363636;
        opad[i] = bkey[i] ^ 0x5C5C5C5C;
      }

      var hash = core_md4(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
      return core_md4(opad.concat(hash), 512 + 128);
    }

    /*
     * Add integers, wrapping at 2^32. This uses 16-bit operations internally
     * to work around bugs in some JS interpreters.
     */
    function safe_add(x, y)
    {
      var lsw = (x & 0xFFFF) + (y & 0xFFFF);
      var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
      return (msw << 16) | (lsw & 0xFFFF);
    }

    /*
     * Bitwise rotate a 32-bit number to the left.
     */
    function rol(num, cnt)
    {
      return (num << cnt) | (num >>> (32 - cnt));
    }

    /*
     * Convert a string to an array of little-endian words
     * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
     */
    function str2binl(str)
    {
      var bin = Array();
      var mask = (1 << chrsz) - 1;
      for(var i = 0; i < str.length * chrsz; i += chrsz)
        bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
      return bin;
    }

    /*
     * Convert an array of little-endian words to a string
     */
    function binl2str(bin)
    {
      var str = "";
      var mask = (1 << chrsz) - 1;
      for(var i = 0; i < bin.length * 32; i += chrsz)
        str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
      return str;
    }

    /*
     * Convert an array of little-endian words to a hex string.
     */
    function binl2hex(binarray)
    {
      var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
      var str = "";
      for(var i = 0; i < binarray.length * 4; i++)
      {
        str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
               hex_tab.charAt((binarray[i>>2] >> ((i%4)*8  )) & 0xF);
      }
      return str;
    }

    /*
     * Convert an array of little-endian words to a base-64 string
     */
    function binl2b64(binarray)
    {
      var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
      var str = "";
      for(var i = 0; i < binarray.length * 4; i += 3)
      {
        var triplet = (((binarray[i   >> 2] >> 8 * ( i   %4)) & 0xFF) << 16)
                    | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
                    |  ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
        for(var j = 0; j < 4; j++)
        {
          if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
          else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
        }
      }
      return str;
    }

【转载】实现一个日期下拉菜单(JS)(悠悠博客)

转载自悠悠博客 [ http://www.ajaxstu.com/ ]。

下面是例子……例子看这里

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>如何实现一个日期下拉菜单</title>
<script type="text/javascript">
function DateSelector(selYear, selMonth, selDay)
{
this.selYear = selYear;
this.selMonth = selMonth;
this.selDay = selDay;
this.selYear.Group = this;
this.selMonth.Group = this;
// 给年份、月份下拉菜单添加处理onchange事件的函数
if(window.document.all != null) // IE
{
this.selYear.attachEvent("onchange", DateSelector.Onchange);
this.selMonth.attachEvent("onchange", DateSelector.Onchange);
}
else // Firefox
{
this.selYear.addEventListener("change", DateSelector.Onchange, false);
this.selMonth.addEventListener("change", DateSelector.Onchange, false);
}

if(arguments.length == 4) // 如果传入参数个数为4,最后一个参数必须为Date对象
this.InitSelector(arguments[3].getFullYear(), arguments[3].getMonth() + 1, arguments[3].getDate());
else if(arguments.length == 6) // 如果传入参数个数为6,最后三个参数必须为初始的年月日数值
this.InitSelector(arguments[3], arguments[4], arguments[5]);
else // 默认使用当前日期
{
var dt = new Date();
this.InitSelector(dt.getFullYear(), dt.getMonth() + 1, dt.getDate());
}
}

// 增加一个最大年份的属性
DateSelector.prototype.MinYear = 1900;

// 增加一个最大年份的属性
DateSelector.prototype.MaxYear = (new Date()).getFullYear();

// 初始化年份
DateSelector.prototype.InitYearSelect = function()
{
// 循环添加OPION元素到年份select对象中
for(var i = this.MaxYear; i >= this.MinYear; i--)
{
// 新建一个OPTION对象
var op = window.document.createElement("OPTION");

// 设置OPTION对象的值
op.value = i;

// 设置OPTION对象的内容
op.innerHTML = i;

// 添加到年份select对象
this.selYear.appendChild(op);
}
}

// 初始化月份
DateSelector.prototype.InitMonthSelect = function()
{
// 循环添加OPION元素到月份select对象中
for(var i = 1; i < 13; i++)
{
// 新建一个OPTION对象
var op = window.document.createElement("OPTION");

// 设置OPTION对象的值
op.value = i;

// 设置OPTION对象的内容
op.innerHTML = i;

// 添加到月份select对象
this.selMonth.appendChild(op);
}
}

// 根据年份与月份获取当月的天数
DateSelector.DaysInMonth = function(year, month)
{
var date = new Date(year, month, 0);
return date.getDate();
}

// 初始化天数
DateSelector.prototype.InitDaySelect = function()
{
// 使用parseInt函数获取当前的年份和月份
var year = parseInt(this.selYear.value);
var month = parseInt(this.selMonth.value);

// 获取当月的天数
var daysInMonth = DateSelector.DaysInMonth(year, month);

// 清空原有的选项
this.selDay.options.length = 0;
// 循环添加OPION元素到天数select对象中
for(var i = 1; i <= daysInMonth ; i++)
{
// 新建一个OPTION对象
var op = window.document.createElement("OPTION");

// 设置OPTION对象的值
op.value = i;

// 设置OPTION对象的内容
op.innerHTML = i;

// 添加到天数select对象
this.selDay.appendChild(op);
}
}

// 处理年份和月份onchange事件的方法,它获取事件来源对象(即selYear或selMonth)
// 并调用它的Group对象(即DateSelector实例,请见构造函数)提供的InitDaySelect方法重新初始化天数
// 参数e为event对象
DateSelector.Onchange = function(e)
{
var selector = window.document.all != null ? e.srcElement : e.target;
selector.Group.InitDaySelect();
}

// 根据参数初始化下拉菜单选项
DateSelector.prototype.InitSelector = function(year, month, day)
{
// 由于外部是可以调用这个方法,因此我们在这里也要将selYear和selMonth的选项清空掉
// 另外因为InitDaySelect方法已经有清空天数下拉菜单,因此这里就不用重复工作了
this.selYear.options.length = 0;
this.selMonth.options.length = 0;

// 初始化年、月
this.InitYearSelect();
this.InitMonthSelect();

// 设置年、月初始值
this.selYear.selectedIndex = this.MaxYear - year;
this.selMonth.selectedIndex = month - 1;

// 初始化天数
this.InitDaySelect();

// 设置天数初始值
this.selDay.selectedIndex = day - 1;
}
</script>
</head>
<body>
<select id="selYear"></select>
<select id="selMonth"></select>
<select id="selDay"></select>
<script type="text/javascript">
var selYear = window.document.getElementById("selYear");
var selMonth = window.document.getElementById("selMonth");
var selDay = window.document.getElementById("selDay");

// 新建一个DateSelector类的实例,将三个select对象传进去
new DateSelector(selYear, selMonth ,selDay, 2004, 2, 29);
// 也可以试试下边的代码
// var dt = new Date(2004, 1, 29);
// new DateSelector(selYear, selMonth ,selDay, dt);
</script>
</body>
</html>

【原创】各类奥运会挂件收集

嘎嘎……奥运会一开,各类网站都制作了相应的奥运会挂件,有奖牌榜,有地图的……蓝蓝小雪今天就给大家收集了一些,不知大家满意不?


提醒:以下所有代码都可以放到网页的任何区域。


  • 第一个带来的是Google的奥运会奖牌榜、赛程、比赛场馆地图,这个可是非常详细的哦!我是很喜欢的!


    <iframe src="http://www.gmodules.com/ig/ifr?url=http://2008summergames.googlecode.com/svn/com/games.xml&hl=zh-CN" frameborder="0" scrolling="no" style="width:760px; height:512px; clear:both; float:left; margin-bottom:30px; overflow: hidden; padding: 0 !important;"></iframe>
  • 第二个带来的是Google的奥运奖牌榜、赛程、新闻、视频的挂件,这个也是不错滴~


    <iframe src="http://www.google.cn/ig/ifr?pid=china&url=http://www.google.com/ig/modules/china/olympics.xml&nocache=0&up_selectedTab=&upt_selectedTab=hidden&up_country=&upt_country=hidden&up_sport=&upt_sport=hidden&up_tabheight=*&upt_tabheight=hidden&lang=zh-CN&country=cn&.lang=zh-CN&.country=cn&synd=gasp2&mid=11&ifpctok=4154631101047308536&parent=http://www.google.cn&extern_js=/extern_js/f/CgJlbhICdXMrMAs4ACwrMBA4ACwrMBE4ACwrMBI4ACwrMBM4ACw/x1AnYHb84M0.js" frameborder="0" scrolling="no" style="width:760px; height:512px; clear:both; float:left; margin-bottom:30px; overflow: hidden; padding: 0 !important;"></iframe>
  • 第三个带来的则是Google的奥运奖牌榜、赛程挂件,转自可能吧。这个有多种风格啦:

    • 嵌入赛事跟踪和奖牌跟踪的挂件,可以使用下面的代码:
      <iframe src="http://www.gmodules.com/ig/ifr?url=http://www.google.com/ig/modules/olympics_synd.xml&hl=zh-CN" style=" border:solid 1px #777 " width="340" height="290" frameborder="0" scrolling="no"></iframe>
    • 只嵌入赛事跟踪,可以使用下面的代码:
      <iframe src="http://www.gmodules.com/ig/ifr?url=http://www.google.com/ig/modules/olympics_synd.xml&up_showMedals=false&hl=zh-CN" style=" border:solid 1px #777 " width="340" height="290" frameborder="0" scrolling="no"></iframe>
    • 只嵌入奖牌跟踪,可以使用下面的代码:
      <iframe src="http://www.gmodules.com/ig/ifr?url=http://www.google.com/ig/modules/olympics_synd.xml&h=265&up_showEvents=false&hl=zh-CN" style=" border:solid 1px #777 " width="340" height="290" frameborder="0" scrolling="no"></iframe>
  • 第四个带来的是可能吧的作品,其实是利用了Google日历,这是一个奥运会赛程挂件。


    <iframe src="http://www.google.com/calendar/embed?showNav=0&showDate=0&showTabs=0&showCalendars=0&mode=AGENDA&height=300&wkst=1&bgcolor=%2300cccc&src=mvnlf93vqvvgqvg7qvjjut9v28%40group.calendar.google.com&color=%2329527A&ctz=Asia%2FShanghai" style=" border:solid 1px #777 " width="300" height="300" frameborder="0" scrolling="no"></iframe>
  • 第五个带来的是aw的flash版的140X260版金牌榜,效果很赞。

    <center><embed style="overflow:hidden;width:140px;height:260px" src="http://aw.appspot.com/static/2008.swf" width="140" height="260" type="application/x-shockwave-flash"></embed><br><a href="http://www.awflasher.com/blog/archives/930" title="奥运奖牌榜代码">BJ2008</a> - <a href="http://www.awflasher.com/blog" title="aw's blog">aw</a></center>
  • 如果这里的这么多您觉得还不够?您可以去这里看看!感谢Raullen同学!

【转载】网页加速的14条优化法则

转自http://java-guru.javaeye.com/blog/138659。

译自http://developer.yahoo.com/performance/rules.html。

最近,YouMonitor.Us在做Web应用性能优化,在网上发现了文章High Performance Web Sites: The Importance of Front-End Performance,感觉其14条优化法则很实用,操作性很强。因此翻译出来,供大家参考。

Web应用性能优化黄金法则:先优化前端程序(front-end)的性能,因为这是80%或以上的最终用户响应时间的花费所在。

法则1. 减少HTTP请求次数

80%的最终用户响应时间花在前端程序上,而其大部分时间则花在各种页面元素,如图像、样式表、脚本和Flash等,的下载上。减少页面元素将会减少HTTP请求次数。这是快速显示页面的关键所在。

一种减少页面元素个数的方法是简化页面设计。但是否存在其他方式,能做到既有丰富内容,又能获得快速响应时间呢?以下是这样一些技术:

Image maps组合多个图片到一张图片中。总文件大小变化不大,但减少了HTTP请求次数从而加快了页面显示速度。该方式只适合图片连续的情况;同时坐标的定义是烦人又容易出错的工作。

CSS Sprites是更好的方法。它可以组合页面中的图片到单个文件中,并使用CSS的background-image和background-position属性来现实所需的部分图片。

Inline images使用data: URL scheme来在页面中内嵌图片。这将增大HTML文件的大小。组合inline images到你的(缓存)样式表是既能较少HTTP请求,又能避免加大HTML文件大小的方法。

Combined files通过组合多个脚本文件到单一文件来减少HTTP请求次数。样式表也可采用类似方法处理。这个方法虽然简单,但没有得到大规模的使用。10大美国网站每页平均有7个脚本文件和2个样式表。当页面之间脚本和样式表变化很大时,该方式将遇到很大的挑战,但如果做到的话,将能加快响应时间。

减少HTTP请求次数是性能优化的起点。这最提高首次访问的效率起到很重要的作用。据Tenni Theurer的文章Browser Cache Usage - Exposed!描述,40-60%的日常访问是首次访问,因此为首次访问者加快页面访问速度是用户体验的关键。

法则2. 使用CDN(Content Delivery Network, 内容分发网络)

用户离web server的远近对响应时间也有很大影响。从用户角度看,把内容部署到多个地理位置分散的服务器上将有效提高页面装载速度。但是该从哪里开始呢?

作为实现内容地理分布的第一步,不要试图重构web应用以适应分布架构。改变架构将导致多个周期性任务,如同步session状态,在多个server之间复制数据库交易。这样缩短用户与内容距离的尝试可能被应用架构改版所延迟,或阻止。

我们还记得80-90%的最终用户响应时间花在下载页面中的各种元素上,如图像文件、样式表、脚本和Flash等。与其花在重构系统这个困难的任务上,还不如先分布静态内容。这不仅能大大减少响应时间,而且由于CDN的存在,分布静态内容非常容易实现。

CDN是地理上分布的web server的集合,用于更高效地发布内容。通常基于网络远近来选择给具体用户服务的web server。

一些大型网站拥有自己的CDN,但是使用如Akamai Technologies, Mirror Image Internet, 或 Limelight Networks等CDN服务提供商的服务将是划算的。在Yahoo!把静态内容分布到CDN减少了用户影响时间20%或更多。切换到CDN的代码修改工作是很容易的,但能达到提高网站的速度。

法则3. 增加Expires Header

网页内容正变得越来越丰富,这意味着更多的脚本文件、样式表、图像文件和Flash。首次访问者将不得不面临多次HTTP请求,但通过使用Expires header,您可以在客户端缓存这些元素。这在后续访问中避免了不必要的HTTP请求。Expires header最常用于图像文件,但是它也应该用于脚本文件、样式表和Flash。

浏览器(和代理)使用缓存来减少HTTP请求的次数和大小,使得网页加速装载。Web server通过Expires header告诉客户端一个元素可以缓存的时间长度。

如果服务器是Apache的话,您可以使用ExpiresDefault基于当期日期来设置过期日期,如: 

ExpiresDefault “access plus 10 years” 设置过期时间为从请求时间开始计算的10年。

请记住,如果使用超长的过期时间,则当内容改变时,您必须修改文件名称。在Yahoo!我们经常把改名作为release的一个步骤:版本号内嵌在文件名中,如yahoo_2.0.6.js。

法则4. 压缩页面元素

通过压缩HTTP响应内容可减少页面响应时间。从HTTP/1.1开始,web客户端在HTTP请求中通过Accept-Encoding头来表明支持的压缩类型,如:

Accept-Encoding: gzip, deflate.

如果Web server检查到Accept-Encoding头,它会使用客户端支持的方法来压缩HTTP响应,会设置Content-Encoding头,如:Content-Encoding: gzip。

Gzip是目前最流行及有效的压缩方法。其他的方式如deflate,但它效果较差,也不够流行。通过Gzip,内容一般可减少70%。如果是Apache,在1.3版本下需使用mod_gzip模块,而在2.x版本下,则需使用mod_deflate。

Web server根据文件类型来决定是否压缩。大部分网站对HTML文件进行压缩。但对脚本文件和样式表进行压缩也是值得的。实际上,对包括XML和JSON在内的任务文本信息进行压缩都是值得的。图像文件和PDF文件不应该被压缩,因为它们本来就是压缩格式保存的。对它们进行压缩,不但浪费CPU,而且还可能增加文件的大小。

因此,对尽量多的文件类型进行压缩是一种减少页面大小和提高用户体验的简便方法。

法则5. 把样式表放在头上

我们发现把样式表移到HEAD部分可以提高界面加载速度,因此这使得页面元素可以顺序显示。

在很多浏览器下,如IE,把样式表放在document的底部的问题在于它禁止了网页内容的顺序显示。浏览器阻止显示以免重画页面元素,那用户只能看到空白页了。Firefox不会阻止显示,但这意味着当样式表下载后,有些页面元素可能需要重画,这导致闪烁问题。

HTML规范明确要求样式表被定义在HEAD中,因此,为避免空白屏幕或闪烁问题,最好的办法是遵循HTML规范,把样式表放在HEAD中。

法则6. 把脚本文件放在底部

与样式文件一样,我们需要注意脚本文件的位置。我们需尽量把它们放在页面的底部,这样一方面能顺序显示,另方面可达到最大的并行下载。

浏览器会阻塞显示直到样式表下载完毕,因此我们需要把样式表放在HEAD部分。而对于脚本来说,脚本后面内容的顺序显示将被阻塞,因此把脚本尽量放在底部意味着更多内容能被快速显示。

脚本引起的第二个问题是它阻塞并行下载数量。HTTP/1.1规范建议浏览器每个主机的并行下载数不超过2个。因此如果您把图像文件分布到多台机器的话,您可以达到超过2个的并行下载。但是当脚本文件下载时,浏览器不会启动其他的并行下载,甚至其他主机的下载也不启动。

在某些情况下,不是很容易就能把脚本移到底部的。如,脚本使用document.write方法来插入页面内容。同时可能还存在域的问题。不过在很多情况下,还是有一些方法的。

一个备选方法是使用延迟脚本(deferred script)。DEFER属性表明脚本未包含document.write,指示浏览器刻继续显示。不幸的是,Firefox不支持DEFER属性。在IE中,脚本可能被延迟执行,但不一定得到需要的长时间延迟。不过从另外角度来说,如果脚本能被延迟执行,那它就可以被放在底部了。

法则7. 避免CSS表达式

CSS表达式是功能强大的(同时也是危险的)用于动态设置CSS属性的方式。IE,从版本5开始支持CSS表达式,如backgourd-color: expression((new Date()).getHours()%2?”#B8D4FF”:”#F08A00”),即背景色每个小时切换一次。

CSS表达式的问题是其执行次数超过大部分人的期望。不仅页面显示和resize时计算表达式,而且当页面滚屏,甚至当鼠标在页面上移动时都会重新计算表达式。

一种减少CSS表达式执行次数的方法是一次性表达式,即当第一次执行时就以明确的数值代替表达式。如果必须动态设置的话,可使用事件处理函数代替。如果您必须使用CSS表达式的话,请记住它们可能被执行上千次,从而影响页面性能。

法则8. 把JavaScript和CSS放到外部文件中

上述很多性能优化法则都基于外部文件进行优化。现在,我们必须问一个问题:JavaScript和CSS应该包括在外部文件,还是在页面文件中?

在现实世界中,使用外部文件会加快页面显示速度,因为外部文件会被浏览器缓存。如果内置JavaScript和CSS在页面中虽然会减少HTTP请求次数,但增大了页面的大小。另外一方面,使用外部文件,会被浏览器缓存,则页面大小会减小,同时又不增加HTTP请求次数。

因此,一般来说,外部文件是更可行的方式。唯一的例外是内嵌方式对主页更有效,如Yahoo!和My Yahoo!都使用内嵌方式。一般来说,在一个session中,主页访问此时较少,因此内嵌方式可以取得更快的用户响应时间。

法则9. 减少DNS查询次数

DNS用于映射主机名和IP地址,一般一次解析需要20~120毫秒。为达到更高的性能,DNS解析通常被多级别地缓存,如由ISP或局域网维护的caching server,本地机器操作系统的缓存(如windows上的DNS Client Service),浏览器。IE的缺省DNS缓存时间为30分钟,Firefox的缺省缓冲时间是1分钟。

减少主机名可减少DNS查询的次数,但可能造成并行下载数的减少。避免DNS查询可减少响应时间,而减少并行下载数可能增加响应时间。一个可行的折中是把内容分布到至少2个,最多4个不同的主机名上。

法则10. 最小化JavaScript代码

最小化JavaScript代码指在JS代码中删除不必要的字符,从而降低下载时间。两个流行的工具是JSMin 和YUI Compressor。

混淆是最小化于源码的备选方式。象最小化一样,它通过删除注释和空格来减少源码大小,同时它还可以对代码进行混淆处理。作为混淆的一部分,函数名和变量名被替换成短的字符串,这使得代码更紧凑,同时也更难读,使得难于被反向工程。Dojo Compressor (ShrinkSafe)是最常见的混淆工具。

最小化是安全的、直白的过程,而混淆则更复杂,而且容易产生问题。从对美国10大网站的调查来看,通过最小化,文件可减少21%,而混淆则可减少25%。

除了最小化外部脚本文件外,内嵌的脚本代码也应该被最小化。即使脚本根据法则4被压缩后传输,最小化脚本刻减少文件大小5%或更高。

法则11. 避免重定向

重定向功能是通过301和302这两个HTTP状态码完成的,如:
  HTTP/1.1 301 Moved Permanently
  Location: http://example.com/newuri
  Content-Type: text/html

浏览器自动重定向请求到Location指定的URL上,重定向的主要问题是降低了用户体验。

一种最耗费资源、经常发生而很容易被忽视的重定向是URL的最后缺少/,如访问http://astrology.yahoo.com/astrology将被重定向到http://astrology.yahoo.com/astrology/。在Apache下,可以通过Alias,mod_rewrite或DirectorySlash等方式来解决该问题。

法则12. 删除重复的脚本文件

在一个页面中包含重复的JS脚本文件会影响性能,即它会建立不必要的HTTP请求和额外的JS执行。

不必要的HTTP请求发生在IE下,而Firefox不会产生多余的HTTP请求。额外的JS执行,不管在IE下,还是在Firefox下,都会发生。

一个避免重复的脚本文件的方式是使用模板系统来建立脚本管理模块。除了防止重复的脚本文件外,该模块还可以实现依赖性检查和增加版本号到脚本文件名中,从而实现超长的过期时间。

法则13. 配置ETags

ETags是用于确定浏览器缓存中元素是否与Web server中的元素相匹配的机制,它是比last-modified date更灵活的元素验证机制。ETag是用于唯一表示元素版本的字符串,它需被包括在引号中。Web server首先在response中指定ETag:
  HTTP/1.1 200 OK
  Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT
  ETag: "10c24bc-4ab-457e1c1f"
  Content-Length: 12195

后来,如果浏览器需要验证某元素,它使用If-None-Match头回传ETag给Web server,如果ETag匹配,则服务器返回304代码,从而节省了下载时间: 
  GET /i/yahoo.gif HTTP/1.1
  Host: us.yimg.com
  If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT
  If-None-Match: "10c24bc-4ab-457e1c1f"
  HTTP/1.1 304 Not Modified

ETags的问题在于它们是基于服务器唯一性的某些属性构造的,如Apache1.3和2.x,其格式是inode-size-timestamp,而在IIS5.0和6.0下,其格式是Filetimestamp:ChangeNumber。这样同一个元素在不同的web server上,其ETag是不一样的。这样在多Web server的环境下,浏览器先从server1请求某元素,后来向server2验证该元素,由于ETag不同,所以缓存失效,必须重新下载。

因此,如果您未用到ETags系统提供的灵活的验证机制,最好删除ETag。删除ETag会减少http response及后续请求的HTTP头的大小。微软支持文章描述了如何删除ETags,而在Apache下,只要在配置文件中设置FileETag none即可。

法则14. 缓存Ajax

性能优化法则同样适用于web 2.0应用。提高Ajax的性能最重要的方式是使得其response可缓存,就象“法则3增加Expires Header”讨论的那样。以下其他法则同样适用于Ajax,当然法则3是最有效的方式:

法则4. 压缩页面元素
法则9. 减少DNS查询次数
法则10. 最小化脚本文件
法则11. 避免重定向
法则13. 配置ETags

【转载】JavaScript Memoization(Realazy)

转自Realazy

Memoization 是一种将函数返回值缓存起来的方法,在 Lisp, Ruby, Perl, Python 等语言中使用非常广泛。随着 Ajax 的兴起,客户端对服务器的请求越来越密集(经典如 autocomplete),如果有一个良好的缓存机制,那么客户端 JavaScript 程序的效率的提升是显而易见的。


Memoization 原理非常简单,就是把函数的每次执行结果都放入一个散列表中,在接下来的执行中,在散列表中查找是否已经有相应执行过的值,如果有,直接返回该值,没有才真正执行函数体的求值部分。很明显,找值,尤其是在散列中找值,比执行函数快多了。现代 JavaScript 的开发也已经大量使用这种技术。


我通过 Google 寻找了好几种 JavaScript Memoization 的实现,都不太如人愿,有的实现不能缓存递归函数,有的需要修改函数的 prototype,于是自己实现一个:


/**
 * JavaScript Momoization
 * @param {string} func name of function / method
 * @param {object} [obj] mothed’s object or scope correction object
 *
 * MIT / BSD license
 */

function Memoize(func, obj){
    var obj = obj || window,
        func = obj[func],
        cache = {};
    return function(){
        var key = Array.prototype.join.call(arguments, "");
        var key = Array.prototype.join.call(arguments, "_")
        if (!(key in cache))
            cache[key] = func.apply(obj, arguments);
        return cache[key];
    }
}

并写了一个测试案例,空口无凭,让大家亲自看看 Memoization 的威力。


见:http://realazy.org/lab/memoization.html


另,例子中的 fibonacci 函数有很多更有效率的实现方法,在此我使用最无效率的递归实现,只是为了更直达地演示 memoization.


又,longwosion 留言所提到的 key 唯一性问题,我略作修正,但应该还有更好的办法,欢迎您留言探讨。

【分享】无聊时发现了一个JavaScript脚本压缩器

今天很无聊,在网上闲逛,居然发现一个不错的JavaScript压缩器,对于大型脚本能有很好的压缩率哦。
贴出地址:http://dean.edwards.name/packer/

【转载】常见系统中文字体的英文名(样式之美)

转载来自样式之美

因为神奇的中文有时也是会遇到国外同学都不知道原因导致一些神奇滴问题,所以要用更神奇的英文来解决问题。

Mac OS的一些:

  • 华文细黑:STHeiti Light [STXihei]
  • 华文黑体:STHeiti
  • 华文楷体:STKaiti
  • 华文宋体:STSong
  • 华文仿宋:STFangsong
  • 儷黑 Pro:LiHei Pro Medium
  • 儷宋 Pro:LiSong Pro Light
  • 標楷體:BiauKai
  • 蘋果儷中黑:Apple LiGothic Medium
  • 蘋果儷細宋:Apple LiSung Light

Windows的一些:

  • 新細明體:PMingLiU
  • 細明體:MingLiU
  • 標楷體:DFKai-SB
  • 黑体:SimHei
  • 宋体:SimSun
  • 新宋体:NSimSun
  • 仿宋:FangSong
  • 楷体:KaiTi
  • 仿宋_GB2312:FangSong_GB2312
  • 楷体_GB2312:KaiTi_GB2312
  • 微軟正黑體:Microsoft JhengHei
  • 微软雅黑体:Microsoft YaHei

Office会生出来的一些:

  • 隶书:LiSu
  • 幼圆:YouYuan
  • 华文细黑:STXihei
  • 华文楷体:STKaiti
  • 华文宋体:STSong
  • 华文中宋:STZhongsong
  • 华文仿宋:STFangsong
  • 方正舒体:FZShuTi
  • 方正姚体:FZYaoti
  • 华文彩云:STCaiyun
  • 华文琥珀:STHupo
  • 华文隶书:STLiti
  • 华文行楷:STXingkai
  • 华文新魏:STXinwei

【心情】旧博客回顾

单击下面的链接可以回顾旧的博客。http://snow.is.blue.blog.163.com/

真的很不想抛弃旧的博客。但是163的博客实在是太垃圾了……

经过思想斗争,我终于换了博客……

希望大家能对我的新博客多多支持……谢谢!

【下载】群星——北京2008奥运会歌曲专辑(eMule)

中文名称:北京2008奥运会歌曲专辑
英文名称:The Official Album for Beijing 2008 Olympic Games
资源类型:MP3!
版本:3CD
发行时间:2008年05月02日
专辑歌手:群星
地区:大陆,香港,台湾
语言:普通话,英语
唱片公司:中国唱片/新力博德曼
专辑介绍:

  《北京2008年奥运会歌曲专辑》首张面市的是一套双碟专辑,其中收录的24首优秀歌曲,都堪称是奥运征歌活动开展5年来最为膾炙人口和广受喜爱的作品,百名群星演唱的倒计时一週年主题歌《We are ready》、倒计时100天主题歌《北京欢迎你》分列双碟的首支曲目,刘德华的《Everyone is No.1》,刘欢、那英合唱的《同一个世界 同一个梦想》,孙楠、张惠妹、李玟的《Forever Friends》,周华健的奥运志愿者主题歌《我是明星》,周杰伦的《千山万水》,王力宏的《One World One Dream》,韦唯、戴玉强的《人类是一家》,韩红、羽泉的《为生命喝彩》、容祖儿、谢霆锋的《同在蓝色星球上》等著名作品均被悉数收入其中。而这些曲目的创作者更是汇集了乔治奥·莫若德、孔祥东、林夕、小柯、梁翘柏、金培达、陈少琪、方文山等优秀的创作人。
  据北京奥组委文化活动部赵东鸣部长介绍,历届奥运会都会推出自己的官方音乐或歌曲专辑,借助音乐独特的魅力传播当届奥运会的理念,并为全球公眾提供一种享受和理解奥林匹克的独特渠道。北京奥运会官方歌曲专辑区别於往届的重要之处,在於它并非是一张封闭式创作的歌曲专辑,而是一种开放式徵集的结晶。作为奥运歌曲徵集和创作工作五年来的成果,这份专辑凝聚了海内外眾多音乐创作人士心血和智慧。赵东鸣同时认为,该专辑的发行将使奥运歌曲能够更加便捷地走进群眾生活之中,奥运歌曲的传播和推广也将由此变得更加方便和无处不在。
  这份外观简洁的专辑具有著相当不简单的科技内涵,除了提供正常的CD音响播放功能以外,这份专辑还在中国移动的大力支持下,通过其无线音乐俱乐部提供了全曲下载和彩铃下载服务。此外,看来外观与普通唱片无异的这份专辑,还预置了爱国者妙笔试听和学唱功能,用户只要用爱国者妙笔轻点内页上的某个标誌,便可以方便地对任何一首歌曲进行全曲试听或卡拉OK学唱,可谓是妙趣横生。
  在奥运会倒计时百天盛典之际,《北京2008年奥运会歌曲专辑》隆重问世,这张极具纪念意义的2CD专辑收录了在奥运征歌活动中脱颖而出的24首获奖作品,汇集了多位内地港台知名音乐人及百名歌星。专辑承载了全中国人民对奥运的期盼,以音乐表达全中国人民的自豪与骄傲,烘托出奥运的力量和中国的壮美。在“One World, One Dream”和奥运精神的感召下,让我们共同牵手,一起实践“梦想、友谊、和平”的奥运理念,将一首首不朽的奥运赞歌唱响全世界。
  这张专辑记录了中国优秀音乐人对奥运盛世的热爱和激情,其中包括倒计时一周年主题歌《We are ready》,100名明星演唱的倒计时100天主题歌《北京欢迎你》、北京2008年奥运会火炬接力主题歌《点燃激情 传递梦想》和志愿者之歌《我是明星》,此外还有王力宏作词作曲并演唱的《One World One Dream》,孙楠、张惠妹共同演绎的《Forever Friends》(中文版),周杰伦、方文山强档组合联袂谱写的《千山万水》,容祖儿、谢霆锋倾情献唱《同在蓝色星球上》,刘欢、那英合唱的《同一个世界 同一个梦想》,韩红、羽.泉的《为生命喝彩》,刘德华作词作曲并演唱的《Everyone is No.1》,以及韦唯、戴玉强的《人类是一家》等28首歌优秀的奥运之歌。创作人员更集合了华语歌坛及世界级顶尖级词曲作者小柯(听歌 blog)、莫罗德尔、孔祥东(听歌 blog)、梁翘柏、金培达、鲍比达、乔治奥.莫若德、黄小茂、林夕、陈少琪、方文山、韩葆等组成的超强阵容,将友谊与和平的奥运精神融入到这张专辑里。
  奥运会倒计时100天之际,由100名歌星演唱的倒计时100天的主题歌《北京欢迎你》再度将迎接奥运会的庆典带往一个高潮。这是继北京奥运会倒计时一周年主题曲《We are ready》掀起奥运歌曲传唱高潮后,北京奥组委推出的又一首众多歌星共同演唱的主题歌。这首群星荟萃的歌曲由著名内地音乐人小柯作曲、香港词人林夕作词,成龙、周华健、王力宏、刘欢、孙燕姿、陈奕迅、任贤齐等100名歌手共同演绎。这首歌从3月初提出创意到制作完成共历经一个半月的时间,其中5天就完成词曲小样制作,两个星期就完成了100位歌手的录音,6天完成所有的后期制作,仅纪录片拍摄的素材就达7000多分钟,体现了演艺圈巨大热切的奥运“向心力”。作为北京奥运会倒计时100天的声音符号,百名华语乐坛当红和实力唱将用京味十足的歌谣向世界发出问候和邀请——“北京欢迎你”,用音乐热情拥抱北京奥运客人、为奥运加油,用自信的姿态迎接北京奥运会的到来。
  随着2008年北京奥运会圣火在雅典的点燃。举世瞩目的北京奥运会就此拉开了序幕。火炬传递在五大洲的一百多天的时间里,来自世界各地的20000多名火炬手传递着寄托世人无数梦想的奥运火炬,也传递着世人对和平和友谊的美好追求及奥林匹克理想。歌曲《点燃激情 传递梦想》伴随着北京奥运火炬一路前行,熊熊燃烧的“祥云”火炬与奥林匹克精神共同闪耀,唱响中华民族强大的凝聚。除了王力宏、孙燕姿、汪峰、张靓颖演唱的《点燃激情 传递梦想》四人版本外,由第五十七届世界小姐总决赛的106名国际佳丽参与录制的英文版也是这张专辑靓丽的一道风景线。
  自北京奥运会城市志愿者招募报名工作正式启动以来,社会公众对城市志愿者工作关注和支持的热情空前高涨,北京奥运会城市志愿者报名人数已超过136万人,能成为奥运会志愿者其中的一员,已经成为一件无比自豪和骄傲的事。每一个志愿者都是天上明亮的星星,点缀北京奥运绚丽的天空。由著名填词人林夕作词,台湾实力派唱将周华健作曲并演唱的北京奥运会志愿者歌曲《我是明星》,用温暖动人的词句描绘了我们最可爱的志愿者。这首歌曲是由林夕和周华健在两个星期的时间里共同创作完成。林夕的创作功力在这首歌曲中展现无遗,歌曲中的每一个词句都表现了林夕大爱无疆的创作初衷。同时,整首歌曲旋律舒缓而有力,管弦乐队的大气风格中融合了典型的中国风格,很是独特。
  由意大利音乐家乔吉奥.莫罗德尔为北京奥运创作的歌曲《Forever Friends》也成为这张专辑中的一大亮点,该歌曲有中英两个版本,分别由孙楠和张惠妹、孙楠和李玟所演唱。该曲领衔主创、享誉全球的乔吉奥.莫罗德尔是意大利著名的音乐大师,曾经谱写过多首奥运会主题曲的他有着深深的中国情结,为了创作这首歌曲曾经专门到北京采风。该曲兼备了东方音乐的韵味和西方音乐的特色,通过“永远的朋友”这一主题,表达了一份跨越种族疆界的美好祝愿,其中蕴含的力量和感染力会让每个听到它的人想拉住身边人的手,让大家成为朋友并分享快乐。
  周杰伦与老搭档方文山创作功力的《千山万水》更是备受瞩目,该曲融合摇滚与中国风曲调,还添加了一段“京剧”唱腔,尽显中国曲风本色。香港著名音乐人林夕和梁翘柏联合创作,周笔畅( 听歌 blog)主唱的《梦想在望》,讲述跨越国界的奥运精神和华夏文明的人文价值,一经推出就成为了奥运热门歌曲。香港知名歌手谢霆锋、容祖儿为《同在蓝色星球上》倾情放歌,亲身演绎奥运歌曲,表现出了极高的参与热情,二人还不约而同希望北京奥运成功,更荣幸能为奥运做出贡献。由台湾歌手游鸿明作曲,北京奥组委文化活动部奥运文化活动处处长王平久作词的《英雄》更是献给在奥运赛场上为梦想拼搏、永不放弃奥林匹克精神的英雄们。
  另一首由百名歌星演唱的《We are ready》作为北京2008年奥运会倒计时一周年主题曲,让全世界感受北京浓厚的奥运氛围和热情。来自香港的著名音乐人金培达、陈少琪用充满活力和律动感的旋律和歌词,细致刻画了北京和中国在奥运前夜的豪迈、自信、喜悦、期待,其反复吟唱的“We are ready”不仅令人对这首歌的主旋律过耳不忘,更成为了期盼北京奥运到来的最强音。而由刘德华创作的《Everyone Is NO.1》的感人歌词和动听旋律,生动表现了残疾人运动员的精神世界,既描写了他们所面临的艰难与酸楚,也描写了他们的奋斗与抗争。华人之光王力宏作为更是作为首批传递圣火的火炬手,完成奥运火炬传递的重大使命,他带来一首词曲唱集一身的《One World One Dream》以其气势磅礴的音乐和优美的歌词表达了对奥运会的鼎力支持和无限冀望。
  著名歌唱家刘欢和那英的一曲《同一个世界 同一个梦想》向全世界传达中华儿女对2008年奥运会的深厚情意,“同一个世界 同一个梦想”作为北京2008年奥运会的口号,准确的表达了奥林匹克运动会的精神,而这首歌王歌后珠联璧合的作品,激发起中国人的光荣感、责任感和使命感。汪峰创作的歌曲《我们的梦》自参加评选以来,点击率一直居高不下,这首充满摇滚气息的奥运歌曲也是中国摇滚人以自己的方式表达奥运荣耀感。羽.泉和韩红联手演唱的《为生命喝彩》是一首体现残疾人体育运动的歌曲,既是圈中相熟多年的好友,又同属国内一流的实力派歌手,三位却是头一次同唱一首歌,而为奥运献歌,尤其是为残疾人运动联手,也让三个人格外得投入。
  奥运电影《一个人的奥林匹克》的主题曲《站起来》由北京奥组委文化活动部奥运会文化活动处王平久处长填词,金鸡奖最佳音乐奖得主舒楠谱曲,成龙、王力宏、孙燕姿、韩红共同演唱,四人分别代表大陆、香港、台湾以及海外华人,歌曲表达了永不放弃,顽强拼搏的奥林匹克精神。韦唯、戴玉强带来的《人类是一家》则希望能够把奥林匹克精神的内核——和平、和谐、胸怀、友爱、超越、激情传递给每一个人,希望它能够代表每一个中国人,唤起全人类对2008北京奥运会和对世界大同理念的热情与共鸣。
  北京2008年奥运会作为极具特殊意义的国际体育盛典,将成为历史上浓墨重彩、辉煌无限的伟大一笔。每一个人都在以自己的方式歌颂、赞美、抒发对奥运会的期待和憧憬。音乐无国界,音乐更是无法完全用语言来表述的。作为一次世纪盛会的声音版本的纪念,《北京2008年奥运会歌曲专辑》承载着全球华人守望奥运、祝福奥运、支持奥运的激情,承载着全世界对奥林匹克精神的追求和理想,让人文精神在奥林匹克精神和音乐完美融合中得到飞跃与升华。
专辑曲目:
CD 1

01.北京欢迎你 - 群星
02.Forever Friends (中文) - 孙楠/张惠妹
03.点燃激情 传递梦想 - 王力宏/孙燕姿/汪峰/张靚颖
04.千山万水 - 周杰伦
05.天空 - 谭晶
06.超越 - 徐洋/师鹏
07.梦想在望 - 周笔畅
08.Wishing Star (英文) - 黄大煒
09.同在蓝色星球上 - 谢霆峰/容祖儿
10.英雄 - 游鸿明
11.梦想的光芒 - 汪峰
12.Forever Friends (英文) - 孙楠/李玟

CD 2

01.We are ready - 群星
02.Everyone is No.1 - 刘德华
03.我是明星 - 周华健
04.One World One Dream - 王力宏
05.同一个世界 同一个梦想 - 刘欢/那英
06.我们的梦 - 汪峰
07.荣光 - 郭蓉
08.一起飞 - 谭晶/阎伟文
09.为生命喝彩 - 韩红/羽·泉
10.站起来 - 成龙/王力宏/孙燕姿/韩红
11.北京,北京,我爱北京 - 关喆
12.人类是一家 - 韦唯/戴玉强

CD 3 (Bonus)

01.点燃激情 传递梦想 (中文版) (Bonus) - 王力宏/孙燕姿/汪峰/张靚颖
02.点燃激情 传递梦想 (中文版) (Bonus) - 王力宏/孙燕姿
03.点燃激情 传递梦想 (英文版) (Bonus) - 2008 年世界小姐
04.点燃激情 传递梦想 (伴奏) (Bonus)


电驴下载连接


【转载】博客词汇手册(可能吧)

转自可能吧




  • Adsense:Google的按点击付费广告,最流行的网络广告之一。网站拥有者通过Adsense投放广告。

  • Adwords:Google的按点击付费广告,最流行的网络广告之一。广告主利用Adwords购买广告投放。

  • Affiliate Marketing:联署计划。博主在博客上投放联署计划广告,浏览者通过这个广告点击进入指定的页面,并完成特定的动作后,博主获得利润分成。

  • Akismet:最流行的Wordpress反垃圾插件。

  • Alexa:提供网站流量查看以及全球排名的网站。但其流量统计方式备受质疑。

  • Anchor Text:锚文本。给超链接文本添加的描述文字。

  • Archives:存档。以一定的方式展示博客文章,比如月份、年份、分类、作者等等。

  • Atom:博客摘要输出,使用订阅器订阅atom后只能看到博客文章的摘要内容。

  • A记录:在域名后台添加的将某一主机头指向特定的IP。

  • Backlinks:反向链接。链接到某个网页的链接。

  • Blackhat:黑帽搜索引擎优化(SEO)。对网页使用非法或不必要的方法进行搜索引擎优化。

  • Blog:【名】Weblog的缩写,大陆翻译为博客,台湾翻译为部落格。是一个包含作者的文章,图片,链接等内容个人网站。【动】写网志。

  • Blogger:博客作者。

  • Blogger^2:Google旗下博客服务提供商Blogger.com。

  • Bloglines:著名的在线RSS阅读器。

  • Blogosphere:博客圈。

  • Blogroll:博客友情链接。

  • Blogware:博客软件。用于建立和维护一个博客的软件。

  • BSP:博客服务提供商。

  • Categories:文章分类类别。

  • Comments:评论。每个博客都具有评论功能,除非博主本身将此功能关闭。

  • Comment spam:垃圾评论。评论留言中一些没有实质内容但满布广告链接的留言。

  • Content Syndication:动态联合。博客的博客全部或者部分内容在其他站点显示出来。

  • cPanel:一种流行的虚拟主机管理后台。

  • CPA:Cost-per-Action,按行为付费广告。

  • CPC:Cost-per-Click,按点击付费广告。

  • CPM:Cost-per-Mille,按每千次展示付费广告。

  • CPO:Cost-per-Order按订购付费广告。

  • CSS:叠层样式表,一种设计网页样式的工具。基本上每个博客主题都需要一个CSS来支配。

  • CName记录:在域名后台添加的将某一主机头指向特定的URL(参加URL)。

  • Database:数据库。每个blog都需要一个或多个数据库支持。

  • Del.icio.us:美味书签。一个流行的个人网络书签服务。

  • Digg:最流行的社会化新闻挖掘网站。用户将认为有趣的链接提交到Digg,其他用户投票决定哪些内容是最有趣的,越受欢迎的内容会被顶地越高。

  • DNS:域名解析服务器。

  • Domain:域名。比如kenengba.com。

  • Duplicate content:重复内容。如果一个博客上内容和另一个几乎是重复的,抄袭者很可能会受到搜索引擎的惩罚。

  • Facebook:全球最大的社会网络服务之一。

  • Favicon:网站收藏图标。显示在浏览器地址栏左侧和收藏夹列表里。例如这个www.kenengba.com/favicon.ico .

  • Feed:可译作种子。博客内容输出的一种方式。用户可以通过订阅器订阅Feed以获得更新内容,无需到原博客浏览。Feed有两种形式:RSS与Atom。

  • Feedburner:最大的Feed烧制服务商。

  • Feedsky:中文网络最大的Feed烧制服务商。

  • Feed烧制:将博客原始输出的Feed经过Feed烧制服务商,如Feedburner和Feedsky,进行二次输出。Feed烧制的好处是可以添加广告,方便统计订阅来源和订阅数,还可以规避更改博客地址,损失读者的风险。

  • FTP:文件传输协议。博客程序依靠FTP上传到服务器空间。

  • GFW:The Great Firewall of China,中国网络防火墙。建立在国内的双向的过滤不良信息的机制。

  • Google:全球最大的搜索引擎,坚持公正、公平,不作恶原则,并提供多种无偿服务。

  • Google Analytics:免费、功能强大的网站流量统计以及分析工具。由Google提供。

  • Google Reader:最多人使用的在线RSS阅读器。

  • Html:Hypertext Marked Language,超文本标记语言,是一种用来制作超文本文档的简单标记语言。大多数网页都需要用到Html。

  • Javascript:一种描述语言,可以被嵌入到HTML文件之中。透过JavaScript可以做到回应使用者的需求事件 而不用任何的网路来回传输资料。

  • Linkbait:链接诱饵。通过有趣或间接的描述来引诱阅读者点击付费的链接。

  • Load time:网页加载时间。一般以秒做单位。研究表明如果5秒内网页没有大部分被打开浏览者将会感到不耐烦。

  • Micro-Blog:微博客。以手机短信、网页输入等途径,使用短句记录生活琐碎事件的博客服务。

  • Mini-Blog:同Micro-Blog。

  • Moblog:移动博客。Mobile Blog的缩写,可以通过手机电话等等其他智能产品在任何地方进行更新。

  • Movable Type:一种流行的博客平台。

  • Meta tags:嵌入到网页代码<head>之间的、供搜索引擎参考的针对关键字、页面描述等内容的描述。

  • MX记录:邮件交换记录。需要在域名后台添加MX记录才能收发该域名下的邮件。

  • Myspace:全球最大的社会网络服务之一。总部位于美国。

  • Niche:利基。长尾(Long Tail)理论里阐述的概念。在博客里可理解成小众化的话题。

  • Nofollow:在链接标记<a>里被加入nofollow的链接将无法获得其母页面传递的Page Rank。Google发明了这一标记,对反垃圾链接有所成效。

  • PageRank:Google发明的一个用户衡量网页重要性的指标。PageRank越高,表明该网页获得的Backlinks(参看Backlinks)越多,网页在搜索引擎的权重越高。

  • Page Views:网页被浏览次数。

  • Permalink:永久链接。一篇博客文章的网址。

  • Photoblog:图片博客。以图片为主的博客站点。

  • Podcasting:播客。用来发布自己制作的音频或视频的博客站点。

  • PHP:一种动态网页语言。流行博客系统Wordpress使用PHP语言。

  • Ping:检测网络的连通情况和分析网络速度的命令。

  • Ping Back:博客中常用的用来通知网志系统文章被引用情况的一种手段

  • PJblog:一个流行的博客平台。

  • Plugin:插件。一个博客原始系统是比较简陋的,往往需要安装一定的插件来扩展功能。

  • Post Slug:文章缩略名。

  • Pro Blogger:专业博客写手。

  • RSS:Feed的一种格式。详见Feed解释。使用RSS格式将全文输出Feed(相对于Atom)。

  • SEO:搜索引擎优化。一般是针对Google进行优化。

  • Robots.txt:放在网站根目录下的,告诉搜索引擎哪些页面不要爬取的文件。

  • SAAS:Software as a service,软件即服务。将软件运行到web中,也就是在线软件服务。

  • SEM:搜索引擎营销。

  • Sitemap:网站地图。有两种,一种是给浏览者查看的,一种是用于搜索引擎抓取的(一般为xml格式)。

  • Social Bookmarking:社会书签。例如Del.icio.us,digg.com等。

  • SNS:社会网络服务。比如facebook,myspace,校内,海内等等。

  • StumbleUpon:一个流行的网络书签服务。和Digg(详见Digg解释)类似。

  • Subscribers:订阅者。使用订阅器订阅博客Feed输出的人。

  • Tags:标签。Web2.0的重要元素。和分类不同,一篇文章只能有一个分类,但可以有多个tag。

  • Technorati:博客排名网站。

  • Twitter:一个流行的微博客服务。

  • Text Link Ads:一种以出售网页链接获得酬劳的服务。博主或网站主可能会因出售不相关链接被搜索引擎惩罚。

  • Trackback:可以让博主知道有那些人看到自己的文章后撰写了与之有关的短文的功能。

  • UV:Uniques Visitors,独立访问者。不相同的IP访问一个页面的次数。

  • URL:统一资源定位符。可简单认为是网址。

  • Vlog:Video Blog,视频博客。

  • Web2.0:第二代互联网。号称以人为本,用户产生内容。博客是Web2.0的产物。(关于Web2.0的详解可参看什么是Web2.0?-图解Web2.0)

  • Widget:Widget是一种小工具。一系列的小工具通过一个特定的平台(Widget引擎)为用户展示不同的个性化的信息。(详见Widget化时代,个性化信息定制时代)

  • Wikipedia:维基百科。全球最大的开放百科全书,所有人都可以参与编辑。由于过于开放,在国内无法访问。

  • Wordpress:最流行的博客平台。扩展性很强,插件较多。

  • Z-blog:一个流行的博客平台。

  • 51.la:提供网站流量统计与分析的服务。

  • 阿里妈妈:一个广告主与网站(博客)主的中介平台。网站主在上面出售空间等待广告主购买。

  • 备案:在中国,所有域名和空间必须到信产部备案个人信息。

  • 饭否:一个国内的微博客服务。

  • 翻墙:使用代理服务器上网。下图是Riku制作的一张翻墙图片:

  • 叽歪:一个国内的微博客服务。

  • 海内:一个国内的社会网络服务。

  • (被)和谐:文章内容含有不良信息而遭到网监要求删除。

  • 河蟹:和谐的又一说法。

  • 水产:和谐的又一种说法。由河蟹延伸。

  • 伪静态:将一动态页面的URL更改成静态页面的URL形式。

  • 鲜果:一个国内著名的Feed在线订阅器。

  • 校内:一个国内的社会网络服务。

  • 抓虾:一个国内著名的Feed在线订阅器。

  • 做啥:一个国内的微博客服务。

【转载】只许看图不许联想系列(可能吧)

这是一个很有趣的系列。全部转自可能吧