Skip navigation.

极湖

无不用其“极”

July 2009

( Monthly archive )

通过 Subversion 的 hook 自动更新代码

,

用 subversion (以下简称 svn) 做版本管理,可以免去 ftp 上传代码的过程,具体方法是通过 svn 的 commit hook 自动更新代码。

以下是设置的步骤:

切换到 root 用户。
# su -

导出项目。
# cd /home
# svn checkout --username USER_NAME --password USER_PASS http://localhost/svn/PROJECT_NAME/trunk/ PROJECT_NAME
# chown -R USER_NAME PROJECT_NAME


编写 shell 脚本。
# vi /home/USER_NAME/bin/svn_auto_update.sh
输入
#!/bin/sh
date >> /tmp/svn_auto_update
cd /home/PROJECT_NAME
echo "$1 --- $2" >> /tmp/svn_auto_update  2>&1
svn status | awk '/^?/ {print $2}'  | xargs rm -Rvf >> /tmp/svn_auto_update 2>&1
svn update --username USER_NAME --password USER_PASS >> /tmp/svn_auto_update 2>&1

更改脚本的所有者。
# chown -R USER_NAME PROJECT_NAME /home/USER_NAME/bin/svn_auto_update.sh

设置 svn 的 hook。
# cd /home/svnrepo/PROJECT_NAME/hooks
# cp post-commit.tmpl post-commit
# chmod a+x post-commit
# vi post-commit

追加
date >> /tmp/svn_log
/usr/bin/sudo -H -u USER_NAME /home/USER_NAME/bin/svn_auto_update.sh $REPOS $REV >> /tmp/svn_log &


把 apache 用户加入 sudoer。
# usermod -G apache USER_NAME
# visudo

追加
apache  ALL=(USER_NAME) NOPASSWD: /home/USER_NAME/bin/svn_auto_update.sh


说明:

1.以上命令和代码中的 USER_NAME 是用户名,USER_PASS 使用户密码,PROJECT_NAME 是项目名,不同环境会有不同的名字。

2.以上设置,前提是 apache 和 subversion 在同一台机器上,svn 项目已经建立,apache 的 svn 设置也已经做好。

用 CSS 实现 footer 的位置固定

,

在网上找到很多解决方案,觉得这个网站介绍的方法最省事: http://ryanfait.com/sticky-footer/

实现方法简单说明如下:

首先,HTML要有以下内容
<body>
    <div class="wrapper">
        <!--
        网页内容
        -->
        <div class="push">
        </div>
    </div>

    <div class="footer">
    </div>
</body>
其次,CSS要这样写
html, body {
    height: 100%;
}

.wrapper {
    min-height: 100%;
    height: auto !important;
    height: 100%; /* 为了兼容IE */
    margin: 0 auto -100px; /* 下部空余为 class="footer" 同样高度的负值 */
}

.footer,
.push {
    height: 100px;
}

注意点:
如果没有「div class="wrapper"」,Opera下「class="footer"」和「div class="wrapper"」将会重叠显示。

中文与编码

,

自从电脑普及之后,越来越多的人应该会认识到——文字不过是一种编码方式。

我想了一下中文在编码方面利弊,总结如下:

在文学艺术方面,中文是很优秀的编码方式。中文很适合于时间地点人物事件的叙述,用不多的字数即可记录大量的信息。

在自然科学方面,中文的编码能力实在是薄弱。在古代应用广泛的天干地支编码方式,对稍微大一点的二维表,就难以胜任,对三维以上的数据或是数理化公式,基本上是无能为力了。(近代中国在科技方面的落后,或许根源于此)

引入阿拉伯数字和拉丁语系的字母(如:英文字母)之后,中文有了很好的补充,各种信息均可顺利地记载和传播。(中华文明的复兴乃至超越,或许由此可以预见)

用 JavaScript 实现的 md5 算法

, ,

这儿找到的代码,稍做修改(只是修改语法,尽量使其简洁)之后如下:
function md5(sText) {
  var MD5_T = [
    0x00000000, 0xd76aa478, 0xe8c7b756, 0x242070db,
    0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613,
    0xfd469501, 0x698098d8, 0x8b44f7af, 0xffff5bb1,
    0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e,
    0x49b40821, 0xf61e2562, 0xc040b340, 0x265e5a51,
    0xe9b6c7aa, 0xd62f105d, 0x02441453, 0xd8a1e681,
    0xe7d3fbc8, 0x21e1cde6, 0xc33707d6, 0xf4d50d87,
    0x455a14ed, 0xa9e3e905, 0xfcefa3f8, 0x676f02d9,
    0x8d2a4c8a, 0xfffa3942, 0x8771f681, 0x6d9d6122,
    0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60,
    0xbebfbc70, 0x289b7ec6, 0xeaa127fa, 0xd4ef3085,
    0x04881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8,
    0xc4ac5665, 0xf4292244, 0x432aff97, 0xab9423a7,
    0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d,
    0x85845dd1, 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314,
    0x4e0811a1, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb,
    0xeb86d391
  ];

  var MD5_round1 = [
    [ 0, 7, 1], [ 1,12, 2],
    [ 2,17, 3], [ 3,22, 4],
    [ 4, 7, 5], [ 5,12, 6],
    [ 6,17, 7], [ 7,22, 8],
    [ 8, 7, 9], [ 9,12,10],
    [10,17,11], [11,22,12],
    [12, 7,13], [13,12,14],
    [14,17,15], [15,22,16]
  ];

  var MD5_round2 = [
    [ 1, 5,17], [ 6, 9,18],
    [11,14,19], [ 0,20,20],
    [ 5, 5,21], [10, 9,22],
    [15,14,23], [ 4,20,24],
    [ 9, 5,25], [14, 9,26],
    [ 3,14,27], [ 8,20,28],
    [13, 5,29], [ 2, 9,30],
    [ 7,14,31], [12,20,32]
  ];

  var MD5_round3 = [
    [ 5, 4,33], [ 8,11,34],
    [11,16,35], [14,23,36],
    [ 1, 4,37], [ 4,11,38],
    [ 7,16,39], [10,23,40],
    [13, 4,41], [ 0,11,42],
    [ 3,16,43], [ 6,23,44],
    [ 9, 4,45], [12,11,46],
    [15,16,47], [ 2,23,48]
  ];

  var MD5_round4 = [
    [ 0, 6,49], [ 7,10,50],
    [14,15,51], [ 5,21,52],
    [12, 6,53], [ 3,10,54],
    [10,15,55], [ 1,21,56],
    [ 8, 6,57], [15,10,58],
    [ 6,15,59], [13,21,60],
    [ 4, 6,61], [11,10,62],
    [ 2,15,63], [ 9,21,64]
  ];

  function MD5_F(x, y, z) { return (x & y) | (~x & z); }
  function MD5_G(x, y, z) { return (x & z) | (y & ~z); }
  function MD5_H(x, y, z) { return x ^ y ^ z; }
  function MD5_I(x, y, z) { return y ^ (x | ~z); }

  var MD5_round = [
    [MD5_F, MD5_round1],
    [MD5_G, MD5_round2],
    [MD5_H, MD5_round3],
    [MD5_I, MD5_round4]
  ];

  function MD5_pack(n32) {
    return String.fromCharCode(n32 & 0xff)
      + String.fromCharCode((n32 >>> 8) & 0xff)
      + String.fromCharCode((n32 >>> 16) & 0xff)
      + String.fromCharCode((n32 >>> 24) & 0xff);
  }

  function MD5_unpack(s4) {
    return  s4.charCodeAt(0)
      | (s4.charCodeAt(1) <<  8)
      | (s4.charCodeAt(2) << 16)
      | (s4.charCodeAt(3) << 24);
  }

  function MD5_number(n) {
    while (n < 0)
      n += 4294967296;
    while (n > 4294967295)
      n -= 4294967296;
    return n;
  }

  function MD5_apply_round(x, s, f, abcd, r) {
    var a, b, c, d;
    var kk, ss, ii;
    var t, u;

    a = abcd[0];
    b = abcd[1];
    c = abcd[2];
    d = abcd[3];
    kk = r[0];
    ss = r[1];
    ii = r[2];

    u = f(s[b], s[c], s[d]);
    t = s[a] + u + x[kk] + MD5_T[ii];
    t = MD5_number(t);
    t = ((t<<ss) | (t>>>(32-ss)));
    t += s[b];
    s[a] = MD5_number(t);
  }

  function MD5_hash(data) {
    var abcd, x, state, s;
    var len, index, padLen, f, r;
    var i, j, k;
    var tmp;

    state = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476];
    len = data.length;
    index = len & 0x3f;
    padLen = (index < 56) ? (56 - index) : (120 - index);
    if(padLen > 0) {
      data += '\x80';
      for(i = 0; i < padLen - 1; i++)
        data += '\x00';
    }
    data += MD5_pack(len * 8);
    data += MD5_pack(0);
    len += padLen + 8;
    abcd = [0, 1, 2, 3];
    x = [16];
    s = [4];

    for(k = 0; k < len; k += 64) {
      for(i = 0, j = k; i < 16; i++, j += 4) {
        x[i] = data.charCodeAt(j)
          | (data.charCodeAt(j + 1) <<  8)
          | (data.charCodeAt(j + 2) << 16)
          | (data.charCodeAt(j + 3) << 24);
      }
      for(i = 0; i < 4; i++)
        s[i] = state[i];
      for(i = 0; i < 4; i++) {
        f = MD5_round[i][0];
        r = MD5_round[i][1];
        for(j = 0; j < 16; j++) {
          MD5_apply_round(x, s, f, abcd, r[j]);
          tmp = abcd[0];
          abcd[0] = abcd[3];
          abcd[3] = abcd[2];
          abcd[2] = abcd[1];
          abcd[1] = tmp;
        }
      }

      for(i = 0; i < 4; i++) {
        state[i] += s[i];
        state[i] = MD5_number(state[i]);
      }
    }

    return MD5_pack(state[0])
      + MD5_pack(state[1])
      + MD5_pack(state[2])
      + MD5_pack(state[3]);
  }

  var i, out, c;
  var bit128;

  bit128 = MD5_hash(sText);
  out = '';
  for(i = 0; i < 16; i++) {
    c = bit128.charCodeAt(i);
    out += '0123456789abcdef'.charAt((c>>4) & 0xf);
    out += '0123456789abcdef'.charAt(c & 0xf);
  }
  return out;
}

CentOS 下安装配置 Subversion

CentOS 下安装配置 Subversion (简明实用)

用 yum 安装 apache 模块。
# yum install mod_dav_svn

创建库。
# cd /home
# mkdir svnrepo
# cd svnrepo
# svnadmin create project1
# svn mkdir file:///home/svnrepo/project1/trunk file:///home/svnrepo/project1/tags file:///home/svnrepo/project1/branches -m "initial repository layout"

更改目录的所有者为 apache 用户。
# chown -R apache.apache project1

创建用户认证文件(采用Digest)。
# htdigest -c .htdigest 'Subversion Area' admin
Adding password for admin in realm Subversion Area.
New password: (输入密码)
Re-type new password: (输入密码)

追加用户。
# htdigest .htdigest 'Subversion Area' user1
# htdigest .htdigest 'Subversion Area' user2

设置 Apache。
# cd /etc/httpd/conf.d/
# cp -p subversion.conf subversion.conf.orig
# vi subversion.conf

输入以下内容:
LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so
Alias /svn "/home/svnrepo"
<Location /svn>
    DAV svn
    SVNParentPath /home/svnrepo
    AuthType Digest
    AuthName "Subversion Area"
    AuthUserFile /home/svnrepo/.htdigest
    Require valid-user
</Location>

重启 Apache。
# /etc/init.d/httpd configtest
# /etc/init.d/httpd restart

ExtJS 3.0 正式释出

今天去 extjs.com 转了转,发现 ExtJS 3.0 已经正式释出。新版本发布的动静似乎很小,若不是首页上的这行字: Make an impact: Ext Js 3.0 is here ,我还看不出发布的样子。刚开始还不能确认是否正式发布,转到到下载页面,看到 Ext Js 3.0.0 后面有这行字:Released on July 6th, 2009. 才确信。

从今以后,就用这个版本了。
July 2009
S M T W T F S
June 2009August 2009
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31