<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>weiqingfei</title>
    <description>永远不知道自己下一刻会做什么。</description>
    <link>http://weiqingfei.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>Javascript的初始化</title>
        <author>weiqingfei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://weiqingfei.javaeye.com">weiqingfei</a>&nbsp;
          链接：<a href="http://weiqingfei.javaeye.com/blog/161513" style="color:red;">http://weiqingfei.javaeye.com/blog/161513</a>&nbsp;
          发表时间: 2008年02月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Javascript中的方法，在声明的时候都做了些什么？<br /><br />如<br /><pre name="code" class="java">
function func(a){
  this.a = a;
}
</pre><br /><br />f会自动分配一个prototype属性，这个prototype属性是个对象，这个对象只有一个constructor属性，而这个constructor属性指向func<br /><br />也就是说，当声明了一个方法，那么这个方法就有以下关系<br /><pre name="code" class="java">
alert(func === func.prototype.constructor);
</pre><br /><br />那么用new创建一个对象又做了些什么呢？<br /><br /><pre name="code" class="java">
var f = new func("a");
</pre><br /><br />1.创建一个没有任何属性的空对象。<br />2.把这个新对象作为this关键字的值，并调用这个构造方法。<br />3.设置这个新对象的prototype（这个prototype是其构造方法的prototype）
          <br/>
          <span style="color:red;">
            <a href="http://weiqingfei.javaeye.com/blog/161513#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 05 Feb 2008 16:06:05 +0800</pubDate>
        <link>http://weiqingfei.javaeye.com/blog/161513</link>
        <guid>http://weiqingfei.javaeye.com/blog/161513</guid>
      </item>
      <item>
        <title>Javascript中的特例</title>
        <author>weiqingfei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://weiqingfei.javaeye.com">weiqingfei</a>&nbsp;
          链接：<a href="http://weiqingfei.javaeye.com/blog/161505" style="color:red;">http://weiqingfei.javaeye.com/blog/161505</a>&nbsp;
          发表时间: 2008年02月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          先看代码<br /><pre name="code" class="java">
	alert(typeof null);  //object
	alert(typeof Object.prototype); //object
	alert(null instanceof Object); //false
	alert(Object.prototype instanceof Object); //false
</pre><br /><br />从结果可以看出，null和Object.prototype都不是对象。<br /><br /><pre name="code" class="java">
	alert(typeof Function.prototype);
	alert(Function.prototype instanceof Function);
</pre><br /><br />这也是个特例，也就是说Function.prototype并不是个Function
          <br/>
          <span style="color:red;">
            <a href="http://weiqingfei.javaeye.com/blog/161505#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 05 Feb 2008 13:22:36 +0800</pubDate>
        <link>http://weiqingfei.javaeye.com/blog/161505</link>
        <guid>http://weiqingfei.javaeye.com/blog/161505</guid>
      </item>
      <item>
        <title>Javascript中的prototype</title>
        <author>weiqingfei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://weiqingfei.javaeye.com">weiqingfei</a>&nbsp;
          链接：<a href="http://weiqingfei.javaeye.com/blog/161500" style="color:red;">http://weiqingfei.javaeye.com/blog/161500</a>&nbsp;
          发表时间: 2008年02月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          prototype是javascript中的重中之重。<br />先用例子来说话<br /><pre name="code" class="java">
	function f1(a){
		this.a = a;
	}
	function f2(b){
		this.b = b;
	}
	function f3(c){
		this.c = c;
	}
	function f4(d){
		this.d = d;
	}
	f3.prototype = new f4("d");
	f2.prototype = new f3("c");
	f1.prototype = new f2("b");

	var f = new f1("a");
	alert(f.a);
	alert(f.b);
	alert(f.c);
	alert(f.d);
</pre><br />这个例子说明，每个对象都有一个prototype属性，这个属性当然也是对象，所以它也有prototype属性，那么我们自然就能够把它做成一个prototype链。<br />当访问一个对象的“属性”时，程序会先在方法的属性中找，如果能找到则返回，如果找不到则会到对象的prototype链中去找，直到找到或者prototype属性为空为止。
          <br/>
          <span style="color:red;">
            <a href="http://weiqingfei.javaeye.com/blog/161500#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 05 Feb 2008 11:51:29 +0800</pubDate>
        <link>http://weiqingfei.javaeye.com/blog/161500</link>
        <guid>http://weiqingfei.javaeye.com/blog/161500</guid>
      </item>
      <item>
        <title>Javascript的陷阱</title>
        <author>weiqingfei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://weiqingfei.javaeye.com">weiqingfei</a>&nbsp;
          链接：<a href="http://weiqingfei.javaeye.com/blog/161495" style="color:red;">http://weiqingfei.javaeye.com/blog/161495</a>&nbsp;
          发表时间: 2008年02月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          先看个实例：<br /><pre name="code" class="java">
	func1();
	var a = "hello";
	function func1(){
		var b = "world";
		b = a;
		alert(b);
		if(false){
			var a = "hahaha";
		}
	}
</pre><br />这里有两个问题<br />1.为什么func1在声明前也可以运行<br />2.为什么alert(b)会显示未定义“undefined”<br /><br />要解释这两个问题，只要知道两点就可以。<br />1.javascript在运行前会有预编译期，会把声明提前（不管这个生命是否真的会运行）<br />2.局部变量的优先权大于全局变量<br /><br />所以这个代码的顺序应该是这个样子的<br /><pre name="code" class="java">
	var a = "hello";
	function func1(){   //方法声明放到前面
		var b;      //局部变量的所有声明都提前，
                var a；
                b = "world";
		b = a;
		alert(b);
		if(false){
		   a = "hahaha";  //只有赋值的时候，才在真实的位置
		}
	}
        func1();
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://weiqingfei.javaeye.com/blog/161495#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 05 Feb 2008 11:45:10 +0800</pubDate>
        <link>http://weiqingfei.javaeye.com/blog/161495</link>
        <guid>http://weiqingfei.javaeye.com/blog/161495</guid>
      </item>
      <item>
        <title>CentOS下安装配置DNS</title>
        <author>weiqingfei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://weiqingfei.javaeye.com">weiqingfei</a>&nbsp;
          链接：<a href="http://weiqingfei.javaeye.com/blog/160661" style="color:red;">http://weiqingfei.javaeye.com/blog/160661</a>&nbsp;
          发表时间: 2008年01月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.安装<br /><pre name="code" class="java">
#yum install bind bind-utils bind-libs
</pre><br />2.配置/etc/named.conf<br /><pre name="code" class="java">
options {
        directory "/etc";
        pid-file "/var/run/named/named.pid";
        };
zone "."{
        type hint;
        file "/var/named/named.ca";
        };
zone "localhost"{
        type master;
        file "/var/named/localhost.zone";
        };
zone "0.0.127.in-addr.arpa"{
        type master;
        file "/var/named/localhost.rev";
        };
zone "test.com" {
        type master;
        file "/var/named/test.com.zone";
        };
zone "1.168.192.in-addr.arpa" {
        type master;
        file "/var/named/test.com.rev";
        };
</pre><br /><br />3.配置/var/named/localhost.zone<br /><pre name="code" class="java">
$TTL    86400
@       IN SOA  localhost. root.localhost. (
                                42              ; serial (d. adams)
                                3H              ; refresh
                                15M             ; retry
                                1W              ; expiry
                                1D )            ; minimum

                IN NS           localhost.
                IN A            127.0.0.1
</pre><br />4.配置/var/named/localhost.rev<br /><pre name="code" class="java">
$TTL   86400
@   IN   SOA   localhost. root.localhost. (
         1
         28800
         14400
         3600000
         86400
         )

    IN   NS   localhost.
1   IN   PTR   localhost.
</pre><br />5.配置/var/named/test.com.zone<br /><pre name="code" class="java">
$TTL   86400
@   IN   SOA   zimbraserver.test.com. root.localhost. (
         1
         28800
         14400
         3600000
         86400
         )

   IN   NS      zimbraserver.test.com.
zimbraserver.test.com   IN   MX   10   zimbraserver.test.com.  ;指定邮件交换记录
zimbraserver   IN   A   192.168.1.134
</pre><br />6.配置/var/named/test.com.rev<br /><pre name="code" class="java">
$TTL   86400
@   IN   SOA   zimbraserver.test.com. root.localhost. (
            1
            28800
            14400
            3600000
            86400
            )
    IN   NS            zimbraserver.test.com.
134   IN   PTR   zimbraserver.test.com. ;反向解析IP地址
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://weiqingfei.javaeye.com/blog/160661#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 31 Jan 2008 10:22:54 +0800</pubDate>
        <link>http://weiqingfei.javaeye.com/blog/160661</link>
        <guid>http://weiqingfei.javaeye.com/blog/160661</guid>
      </item>
      <item>
        <title>创建全能的表格管理程序</title>
        <author>weiqingfei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://weiqingfei.javaeye.com">weiqingfei</a>&nbsp;
          链接：<a href="http://weiqingfei.javaeye.com/blog/149139" style="color:red;">http://weiqingfei.javaeye.com/blog/149139</a>&nbsp;
          发表时间: 2007年12月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">
		String sql = "SELECT * FROM \""+tableName+"\" LIMIT 0 OFFSET 0";
		List list = new ArrayList();
		Connection conn = null;
		try {
			conn = getConn();
			Statement st = null;
			try{
				st = conn.createStatement();
				ResultSet rs = null;
				try{
					rs = st.executeQuery(sql);
					ResultSetMetaData rsmd = rs.getMetaData();
					int cnt = rsmd.getColumnCount();
					for (int i = 1; i &lt;= cnt; i++) {
						String type = rsmd.getColumnTypeName(i);
						if(type.equals("varchar") || type.equals("int4") || type.equals("bool") || type.equals("timestamp")){
							HashMap hashMap = new HashMap();
							hashMap.put("name", rsmd.getColumnName(i));
							hashMap.put("type", rsmd.getColumnTypeName(i));
							list.add(hashMap);
						}
					}
				}finally{
					if(rs!=null)rs.close();
				}
			}finally{
				if(st!=null)st.close();
			}
		} catch (NamingException ex) {
			// TODO Auto-generated catch block
			ex.printStackTrace();
		} catch (SQLException ex) {
			// TODO Auto-generated catch block
			ex.printStackTrace();
		}finally{
			if(conn!=null)
				try {
					conn.close();
				} catch (SQLException ex) {
					// TODO Auto-generated catch block
					ex.printStackTrace();
				}
		}
		return list;
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://weiqingfei.javaeye.com/blog/149139#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 18 Dec 2007 15:17:49 +0800</pubDate>
        <link>http://weiqingfei.javaeye.com/blog/149139</link>
        <guid>http://weiqingfei.javaeye.com/blog/149139</guid>
      </item>
      <item>
        <title>CentOS下如何打开端口</title>
        <author>weiqingfei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://weiqingfei.javaeye.com">weiqingfei</a>&nbsp;
          链接：<a href="http://weiqingfei.javaeye.com/blog/145370" style="color:red;">http://weiqingfei.javaeye.com/blog/145370</a>&nbsp;
          发表时间: 2007年12月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          CentOS安装好，默认只打开了22端口，如果希望开放其他端口的话，需要打开所需端口。<br />比如打开http的默认端口80<br />编辑iptables<br /><pre name="code" class="java">
vi /etc/sysconfig/iptables
</pre><br />添加<br /><pre name="code" class="java">
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3001 -j ACCEPT
</pre><br />重新启动服务<br /><pre name="code" class="java">/sbin/service iptables restart</pre><br />查看端口是否开放<br /><pre name="code" class="java">/sbin/iptables -L -n</pre>
          <br/>
          <span style="color:red;">
            <a href="http://weiqingfei.javaeye.com/blog/145370#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 02 Dec 2007 02:47:24 +0800</pubDate>
        <link>http://weiqingfei.javaeye.com/blog/145370</link>
        <guid>http://weiqingfei.javaeye.com/blog/145370</guid>
      </item>
      <item>
        <title>SQL语句</title>
        <author>weiqingfei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://weiqingfei.javaeye.com">weiqingfei</a>&nbsp;
          链接：<a href="http://weiqingfei.javaeye.com/blog/143126" style="color:red;">http://weiqingfei.javaeye.com/blog/143126</a>&nbsp;
          发表时间: 2007年11月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          先写一个函数<br /><pre name="code" class="java">
  create function contact(@section varchar(32))
  returns varchar(64)  
  as  
  begin  
    declare @ret varchar(8000)
    set @ret=''  
    select @ret=@ret+','+rtrim(name)  
    from   T_PEOPLE
    where   section=@section  
    return(@ret)  
  end  
  go  
</pre><br />再调用<br /><pre name="code" class="java">
 select section,name=contact(section)   from   T_PEOPLE   group   by   section
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://weiqingfei.javaeye.com/blog/143126#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 23 Nov 2007 18:02:36 +0800</pubDate>
        <link>http://weiqingfei.javaeye.com/blog/143126</link>
        <guid>http://weiqingfei.javaeye.com/blog/143126</guid>
      </item>
      <item>
        <title>通过putty来管理内部网服务器</title>
        <author>weiqingfei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://weiqingfei.javaeye.com">weiqingfei</a>&nbsp;
          链接：<a href="http://weiqingfei.javaeye.com/blog/142033" style="color:red;">http://weiqingfei.javaeye.com/blog/142033</a>&nbsp;
          发表时间: 2007年11月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          现在开发的项目中有3台服务器和一台LB。<br />3台服务器分别安装的是<br />webserv(192.168.1.2)：web服务器<br />db(192.168.1.3)：数据库服务器<br />mail(192.168.1.4):邮件服务器<br /><br />外部的LB的22端口映射到webserv上。<br /><br />那么从外部通过ssh的客户端putty可以登录到webserv上进行操作。<br />但是由于是命令操作，对于习惯于窗口操作的人来说，很不方便。<br />由于数据库服务器在内部网，而且没有和LB进行端口映射，所以数据库的客户端是无法直接连接到数据库服务器上的。<br /><br />使用putty的tunnel功能，可以把数据通过webserv转发给db。<br /><br />具体的操作是这样的。<br />1.运行putty，会出现设置窗口，点击左边的sessions选项（默认）<br />   输入IP地址和端口号（默认为22）<br />2.选择左边的Connection->SSH->Tunnels选项<br />   在Source port里面输入本地要开启的端口号（选择一个本地未使用的任意端口号，比如7777）<br />   在Destination里面填入最终要连接的服务器IP和端口号。我们这里数据库服务器IP为：192.168.1.4，使用的postgresql数据库，端口为5432，所以应该填写<br /><pre name="code" class="java">
192.168.1.4:5432
</pre><br />3.其他默认，单击add按钮。<br />4.然后点击open进行ssh登录，输入用户名和密码<br /><br />这样就完成了一个[本地]->[ssh服务器]->[数据库]的一个ssh通道，运行postgresql的客户端管理程序，链接本地的7777端口就可以了。
          <br/>
          <span style="color:red;">
            <a href="http://weiqingfei.javaeye.com/blog/142033#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 20 Nov 2007 14:21:46 +0800</pubDate>
        <link>http://weiqingfei.javaeye.com/blog/142033</link>
        <guid>http://weiqingfei.javaeye.com/blog/142033</guid>
      </item>
      <item>
        <title>表单验证</title>
        <author>weiqingfei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://weiqingfei.javaeye.com">weiqingfei</a>&nbsp;
          链接：<a href="http://weiqingfei.javaeye.com/blog/141212" style="color:red;">http://weiqingfei.javaeye.com/blog/141212</a>&nbsp;
          发表时间: 2007年11月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          表单验证<br /><br />除非只是一个发布资源的web应用，否则很难不和用户进行交互。<br />在交互的过程中就带来了一个验证用户输入的问题。<br />web应用是通过http协议和用户进行信息传输的，所以服务器端和客户端相互之间都是透明的，只存在符合http协议的数据传输，不用知道对方是什么。<br /><br />严格来讲，由于客户端无论什么数据都有可能传送到服务器端（自己写客户端，什么数据都可以传送），所以在服务器端对数据进行验证是必须的。但是由于大多数用户还是使用IE，Firefox此类的通用浏览器，所以可以先在浏览器上对数据进行一次验证，然后再把数据传送给服务器端，以减少浏览器和服务器端的通信次数。<br /><br />1.浏览器端验证<br />	在浏览器端进行验证，是为了避免提交无效数据，以至于增加和服务器的连接次数。这里验证的只是，数据的规范性，而不是验证数据的合法性。打个比方，用户登录时，输入用户名和密码，客户端只能验证用户是否进行了输入，或者输入是否规范，但是用户名是否存在，密码是否正确，这就是客户端无法验证的了的。<br />	客户端的验证主要是通过通用浏览器普遍都支持的javascript来进行的，在提交之前，根据设定好的规则，对表单数据统一进行验证，一经有不合格数据，立刻提醒用户，并取消提交。<br /><br />2.服务器端验证<br />	由于服务器并不知道客户端的行为，也就是说，对于服务器端来说，客户端是不可信的，所以当服务器接收到客户端发送过来的数据后，还是要进行一次验证，才能够保证数据的规范性。<br />	服务器端的验证就是在处理数据之前，根据预先设定好的规则（这个规则通常是和客户端验证的规则是同样的），先把数据的规范性验证一遍。<br /><br />为了得到良好的用户体验，以及安全性，两种验证是必不可少的。<br />从技术上来讲，两端都可以使用正则表达式来进行验证。<br /><br />客户端主要的验证规则<br />1.邮件：<br /><pre name="code" class="java">
	 /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/
</pre><br />2.字符：<br /><pre name="code" class="java">
	/^[A-Za-z]+$/
</pre><br />3.字符长度<br />	//双字节字符按一个字符计算<br /><pre name="code" class="java">
   “hello，你好”.length;
</pre><br />	//双字节字符按两个字符计算<br /><pre name="code" class="java">
   “hello，你好”.replace(/[^\x00-\xff]/g,"**").length;
</pre><br />4.日期<br /><pre name="code" class="java">
  function checkDate(theDate){
    var reg = /^\d{4}-((0{0,1}[1-9]{1})|(1[0-2]{1}))-((0{0,1}[1-9]{1})|([1-2]{1}[0-9]{1})|(3[0-1]{1}))$/; 
    if(!reg.test(theDate)){
      return false;//格式不对
    }
    var ymd=theDate.split("-");
    var y=parseInt(ymd[0]);
    var m=parseInt(ymd[1]);
    var d=parseInt(ymd[2]);
    var date = new Date(y,m-1,d);        
    if(date.getFullYear()!=y || date.getMonth()!=(m-1) || date.getDate()!=d){
	return false;//日期不存在
    }
    return true;
  }
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://weiqingfei.javaeye.com/blog/141212#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 16 Nov 2007 15:38:25 +0800</pubDate>
        <link>http://weiqingfei.javaeye.com/blog/141212</link>
        <guid>http://weiqingfei.javaeye.com/blog/141212</guid>
      </item>
      <item>
        <title>程序中集成embedded tomcat</title>
        <author>weiqingfei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://weiqingfei.javaeye.com">weiqingfei</a>&nbsp;
          链接：<a href="http://weiqingfei.javaeye.com/blog/140816" style="color:red;">http://weiqingfei.javaeye.com/blog/140816</a>&nbsp;
          发表时间: 2007年11月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          启动程序<br /><br />没看出来比用eclipse启动好在什么地方，也许一样。<br /><br /><pre name="code" class="java">
package start;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Host;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.startup.Embedded;

public class Run {

	private static Embedded tomcat = null;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		initEmbedded();
		initShutdownHook();
		startTomcat();
	}

	private static void startTomcat(){
		try {
			tomcat.start();
		} catch (LifecycleException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	private static void initShutdownHook(){
		Runtime.getRuntime().addShutdownHook(new Thread(){
			public void run(){
				try {
					tomcat.stop();
				} catch (LifecycleException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
	}
	private static void initEmbedded() {
		tomcat = new Embedded();
		tomcat.setCatalinaHome("D:\\apache-tomcat-5.5.25-embed");
		
		Engine engine = tomcat.createEngine();
		engine.setName("MyEngine");

		Host host = tomcat.createHost("localhost", "D:\\apache-tomcat-5.5.25-embed\\webapps");
		Context myContext = tomcat.createContext("/test", "C:\\WQF\\eclipse\\workspace2\\TomEmd");
		
		host.addChild(myContext);
		engine.addChild(host);
		engine.setDefaultHost("localhost");
		tomcat.addEngine(engine);
		Connector connector = tomcat.createConnector("localhost", 8080, false);
		tomcat.addConnector(connector);
	}

}

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://weiqingfei.javaeye.com/blog/140816#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 15 Nov 2007 11:22:48 +0800</pubDate>
        <link>http://weiqingfei.javaeye.com/blog/140816</link>
        <guid>http://weiqingfei.javaeye.com/blog/140816</guid>
      </item>
      <item>
        <title>Whitebox上安装memcached</title>
        <author>weiqingfei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://weiqingfei.javaeye.com">weiqingfei</a>&nbsp;
          链接：<a href="http://weiqingfei.javaeye.com/blog/135669" style="color:red;">http://weiqingfei.javaeye.com/blog/135669</a>&nbsp;
          发表时间: 2007年10月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.准备工作<br />由于memcached需要libevent支持，所以需要先安装libevent。<br />a.下载libevent<br /><pre name="code" class="java">
wget -c http://monkey.org/~provos/libevent-1.3e.tar.gz
</pre><br />b.解压<br /><pre name="code" class="java">
tar xzvf libevent-1.3e.tar.gz
</pre><br />c.编译，安装<br /><pre name="code" class="java">
./configure
make
make install
</pre><br /><br />2.下载最新版的memecached（到写本文为止，最新版为1.2.2）<br /><pre name="code" class="java">
wget -c http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz
</pre><br />3.解压<br /><pre name="code" class="java">
tar xzvf memcached-1.2.2.tar.gz
</pre><br />4.编译安装<br /><pre name="code" class="java">
./configure --prefix=/usr/local/memcached
make
make install
</pre><br />5.添加用户<br /><pre name="code" class="java">
/usr/sbin/adduser -r memcached -d /usr/local/memcached
</pre><br />6.更换登录用户，运行<br /><pre name="code" class="java">
su - memcached
bin/memcached -d
</pre><br /><br /><span style="color: red"><br />注：如果出现缺少库，无法运行时，请把libevent库路径添加到搜索路径中。<br /><pre name="code" class="java">
vi /etc/ld.so.conf
</pre><br />并重新载入配置<br /><pre name="code" class="java">
/sbin/ldconfig
</pre><br /></span>
          <br/>
          <span style="color:red;">
            <a href="http://weiqingfei.javaeye.com/blog/135669#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 26 Oct 2007 11:03:50 +0800</pubDate>
        <link>http://weiqingfei.javaeye.com/blog/135669</link>
        <guid>http://weiqingfei.javaeye.com/blog/135669</guid>
      </item>
      <item>
        <title>由OpenSessionInView想到了。</title>
        <author>weiqingfei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://weiqingfei.javaeye.com">weiqingfei</a>&nbsp;
          链接：<a href="http://weiqingfei.javaeye.com/blog/131058" style="color:red;">http://weiqingfei.javaeye.com/blog/131058</a>&nbsp;
          发表时间: 2007年10月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          无意间翻到一个N年前的老帖子（<a href="http://www.javaeye.com/topic/17501" target="_blank">http://www.javaeye.com/topic/17501</a>），讨论的是OpenSessionInView的效率问题。<br />我本人对Spring和Hibernate都没有什么经验，只是对于引起OpenSessionInView效率低的原因感兴趣。<br /><br />首先OpenSessionInViewFilter就是一个过滤器，那么它的执行时间也就是其后的过滤器以及servlet的执行时间，这中间比较耗时的，就是业务操作，以及大页面的渲染。<br /><br />对于业务操作，这是无法避免的，和是否使用OpenSessionView无关。<br />至于大页面的渲染，如果仅仅是渲染本身，那么也是和是否使用OpenSessionView无关的。<br /><br />最大的问题是渲染生成的页面大小是否超过了Response的页面缓冲区，如果超过了，那么即使页面没有渲染完成也会向客户端传送页面内容，如果再加上客户端和服务器间的传送速度比较慢的话，这个过程需要很长时间，也就最终导致，数据库链接长时间无法释放。<br /><br />Response的页面缓冲默认打小为8K，<br />可以通过一下方法，对其进行操作。<br /><pre name="code" class="java">
//设置缓冲大小
public void ServletResponse.setBufferSize(int size)
  throws IllegalStateException
//取得缓冲大小
public int ServletResponse.getBufferSize()
//检查是否已经开始发送到客户端
public boolean ServletResponse.isCommitted()
//清空缓冲区
public void ServletResponse.reset() throws IllegalStateException
//立刻把数据发送到客户端
public void ServletResponse.flushBuffer() throws IOException
</pre><br /><br />结论就是，在链入速度比较低的用户比较多的系统上尽量少用OpenSessionInViewFilter，如果实在无法避免的话，那么在渲染的页面比较大的servlet里面加大页面缓冲区，使其能够在渲染晚页面后统一发送到客户端。
          <br/>
          <span style="color:red;">
            <a href="http://weiqingfei.javaeye.com/blog/131058#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 11 Oct 2007 14:05:39 +0800</pubDate>
        <link>http://weiqingfei.javaeye.com/blog/131058</link>
        <guid>http://weiqingfei.javaeye.com/blog/131058</guid>
      </item>
      <item>
        <title>Postfix+Cyrus-imapd+Cyrus-sasl+PostgreSQL如何实现邮件地址变更。</title>
        <author>weiqingfei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://weiqingfei.javaeye.com">weiqingfei</a>&nbsp;
          链接：<a href="http://weiqingfei.javaeye.com/blog/117459" style="color:red;">http://weiqingfei.javaeye.com/blog/117459</a>&nbsp;
          发表时间: 2007年08月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          要不怎么说客户都不按照常理出牌。<br />还头一次听说用户可以自己修改自己的邮件地址的，也许有这样的提供商，不过反正我没有用过这样的邮件。<br />但是客户就是上帝，就算客户要母猪上树，我们也得给母猪训练出猴子的本领。<br /><br />环境很简单就是邮件系统经常用的那几大件。<br /><pre name="code" class="java">
1.Postfix，邮件传送代理
2.Cyrus-imapd，Imap邮件服务器
3.Cyrus-sasl，简单认证安全层
4.PostgreSQL，数据库服务器（好像用MySQL的更多一些）
</pre><br /><br />Cyrus-sasl和PostgreSQL就不用讲了，认证途径使用Cyrus-sasl的auxprop认证模式和sql插件。用户的用户名和密码信息存放在PostgreSQL中。<br /><br />主要需要考虑的是Cyrus-imapd和Postfix<br />之所以说这个问题不容易解决是因为cyrus-impad的一个特性，那就是用户的登录用户名必须和存放用户邮件的邮件目录名一样！！！<br />这就决定着，如果要想修改用户登录名，就必须同时修改邮件目录名，但是这又是cyrus-imapd所禁止的！<br />问过一些专门的系统管理员，他们一般不会普遍遇到用户需要修改用户名的情况，如果出现个别情况，他们的做法是写个perl脚本，以修改后所用用户名新建一个信箱，然后把原来信箱的所有目录以及邮件都转移到新的信箱内，然后再删除新信箱。<br />好家伙，这个工程量可真够大的，我们的项目是允许用户自己来修改自己的用户名，我可不敢保证修改用户名的人是个别的。<br /><br />看来这个方法也必须放弃了，那就只能拿postfix开刀了。<br /><br />postfix作为邮件传送代理，只负责传送邮件，但是仔细研究一下它的工作流程，发现在传送邮件的过程中可以对邮件做一些改动，包括邮件信封，以及邮件head和body。<br />既然这样就好办了，既然可以改变邮件信封，也就是说可以改变邮件目的地地址，也就是说虽然我们无法改变用户的最终地址，但是可以变通的把送往别名地址的邮件转到这个地址里，那么当用户修改自己的邮件地址时，其实只是修改的别名。<br /><br />postfix的配置文件是main.cf，实现这个功能的几个关键参数是：<br /><pre name="code" class="java">
virtual_alias_domains
virtual_alias_maps
</pre><br />virtual_alias_domains指定发往哪个域名的邮件需要设置别名，virtual_alias_maps是设置别名和真实地址的对应。<br /><br />举个例子，比如邮件地址的域名为javaeye.com，那么virtual_alias_domains的设置就为<br /><pre name="code" class="java">
virtual_alias_domains = javaeye.com
</pre><br /><br />数据库里面有个User表存放用户的真是地址(RealName)，别名地址(AliasName)和密码(Password)等其它信息。<br />那么就可以信件一个映射文件pgsql-virtual-alias.cf，内容为：<br /><pre name="code" class="java">
query = SELECT "RealName"
  FROM "User"
  WHERE "AliasName"='%u'

result_format = %s@javaeye.com
domain = javaeye.com
</pre><br />query表示查询，这儿的%u表示邮件地址的用户名部分。<br />result_format表示对查询结果格式化，上面的查询结果只是一个真是的用户名，自然要格式化成真实的邮件地址格式了（从这儿可以看出，不但可以改变用户名甚至可以改变域名）。<br />domain表示只有完全匹配这个域名才进行查询（如果不设定domain，不但要查询前面的virtual_alias_domains所指定的主域名，还查询子域名，所以查询的次数很多）<br /><br />工作原理就很简单了，当有人给一个用户的别名发送邮件时，postfix首先查询数据库并把别名修改成真是用户名，那么邮件自然就能送到正确的邮件箱了。<br />用户只要修改表User里的Alias字段，就能达到修改自己用户名的目的了。<br /><br /><em>到这，基本上就完成了，但是突然发现遗漏了一个地方，那就是用户登录认证的SQL也需要该，让用户可以使用别名来登录。<br />Cyrus-imapd的配置文件为imapd.conf<br />找到sasl_sql_select参数项<br />修改前的SQL为：<br /><pre name="code" class="java">
SELECT "Password" FROM "User" WHERE "RealName" = '%u'
</pre><br />修改后为：<br /><pre name="code" class="java">
SELECT "Password" FROM "User" WHERE "AliasName" = '%u'
</pre><br /><br />这样，用户可自己修改邮件用户名的功能就实现了。</em><br /><br />由于用户名和邮箱地址必须是一致的，这个功能暂时实现帮不了。
          <br/>
          <span style="color:red;">
            <a href="http://weiqingfei.javaeye.com/blog/117459#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 28 Aug 2007 10:37:06 +0800</pubDate>
        <link>http://weiqingfei.javaeye.com/blog/117459</link>
        <guid>http://weiqingfei.javaeye.com/blog/117459</guid>
      </item>
      <item>
        <title>（转）Fedora7中服务介绍</title>
        <author>weiqingfei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://weiqingfei.javaeye.com">weiqingfei</a>&nbsp;
          链接：<a href="http://weiqingfei.javaeye.com/blog/111721" style="color:red;">http://weiqingfei.javaeye.com/blog/111721</a>&nbsp;
          发表时间: 2007年08月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>ConsoleKit</strong><br />Fedota 7的新功能Fedora - Fast User Switchin，如果你想要使用这个新功能就开着，反之关掉吧。<br /><br /><strong>NetworkManager</strong>, <strong>NetworkManagerDispatcher</strong><br />自动在多种网络连接中进行转换，如果你的电脑有Wireless WiFi 和 Ethernet，开着它吧，Fedora能自动为你选择最好的可用连接。像我这样<br />只用一个网络连接设置的，还是关掉吧。<br /><br /><strong>anacron</strong>, <strong>atd</strong>, <strong>crond</strong><br />这是一些调试程序的后台服务，一般的桌面用户可以把anacron, atd关了，如果你打算常时间开机，那就把crond打开。 建议始终把crond开着。<br /><br /><strong>auditd</strong><br />用于存放内核生成的系统审查记录，这些记录会被一些程序使用。特别是对于SELinux用户来说，还是开着吧。<br /><br /><strong>autofs</strong><br />自动挂在移动硬盘，没什么说的，开着。<br /><br /><strong>avahi-daemon</strong>, <strong>avahi-dnsconfd</strong><br />主要用于Zero Configuration Networking ，关吧，一般无用。<br /><br /><strong>bluetooth</strong>, <strong>hcid</strong>, <strong>hidd</strong>, <strong>sdpd</strong>, <strong>dund</strong>, <strong>pand</strong><br />蓝牙相关，无蓝牙者，关关关。<br /><br /><strong>btseed</strong>, <strong>bttrack</strong><br />BT相关，无法用BT的，可以关了<br /><br /><strong>capi</strong><br />ISDN硬件支持，大部分用户可以关了<br /><br /><strong>cpuspeed</strong><br />CPU速度调整，如果你用的是Pentium-M, Centrino, AMD PowerNow, Transmetta, Intel SpeedStep, Athlon-64, Athlon-X2, Intel Core 2<br />开着吧；如果不是还是关了吧，开着也无用。<br /><br /><strong>cupsd</strong><br />CUPS打印机支持，没有打印机或者是其他类型打印机的，可以关了<br /><br /><strong>dhcdbd</strong><br />D-BUS系统网络接口，主要为你提供网络连接设置，强烈建议开着，除非你用固定IP上网。<br /><br /><strong>firstboot</strong><br />Fedora安装完之后的那个用户向导，一般可以关了<br /><br /><strong>gpm</strong><br />Text console（CTRL-ALT-F1,F2..）鼠标支持，如果你不经常用Text console，可以关了<br /><br /><strong>haldaemon</strong><br />HAL（Hardware Abstraction Layer）服务，开着吧<br /><br /><strong>hplip</strong>, <strong>hpiod</strong>, <strong>hpssd</strong><br />HPLIP打印机支持，如果你有开着吧。<br /><br /><strong>httpd</strong><br />Apache HTTP网页服务器， 如果你不开发网页，关吧<br /><br /><strong>ip6tables</strong><br />如果你不用 IPv6，关了<br /><br /><strong>iptables</strong><br />防火墙，没什么说的，开着<br /><br /><strong>irda</strong><br />红外线设备支持，无者关<br /><br /><strong>irqbalance</strong><br />多核CPU支持， 无着关<br /><br /><strong>isdn</strong><br />ISDN modem支持， 无者关<br /><br /><strong>jexec</strong><br />如果你安装java 1.6 就会有这个，让你可以双击运行 *.jar 文件。不想要就关<br /><br /><strong>kudzu</strong><br />Fedora硬盘侦测服务，当你更换或添加硬盘的时候可以使用，平时可以关了<br /><br /><strong>lirc</strong><br />红外线遥控器支持， 无者关<br /><br /><strong>mcstrans</strong><br />主要用于SELinux，如果你不用SELinux，可以关了<br /><br /><strong>mdmonitor</strong><br />RAID支持， 无者关<br /><br /><strong>messagebus</strong><br />Linux ICP 服务， 强列建议开着。<br /><br /><strong>netfs</strong><br />如果你需要网络共享文件，那就开着<br /><br /><strong>netplugd</strong><br />对大部分用户基本无用，关<br /><br /><strong>network</strong><br />没什么说的。开着；除非你不上网<br /><br /><strong>nfs</strong>, <strong>nfslock</strong><br />文件共享支持，不需要的可以关了<br /><br /><strong>nscd</strong><br />NIS, NIS+, LDAP, or hesiod服务密码控制， 没有这些服务的可以关了<br /><br /><strong>ntpd</strong><br />网络时间同步，和windows的那个差不多，不需要的可以关了<br /><br /><strong>nvidia-96XX</strong> 或者 <strong>nvidia-97XX</strong><br />livna的nvidia显卡驱动，开<br /><br /><strong>pcscd</strong><br />智能卡支持，无者关<br /><br /><strong>readahead_early</strong>, <strong>readahead_later</strong><br />开机内存载入优化， 开着吧<br /><br /><strong>restorecond</strong><br />SELinux用于监控文件， 不用SELinux的可以关了<br /><br /><strong>rpcbind</strong><br />RPC服务，一般可以关闭<br /><br /><strong>rpcgssd</strong>, <strong>rpcidmapd</strong>, <strong>rpcsvcgssd</strong><br />NFS支持，不用NFS的可以关闭<br /><br /><strong>sendmail</strong><br />邮件传送代理，如果你用Webmail 或者 Thunderbird, Kmail之类的来收发邮件。可以关了<br /><br /><strong>setroubleshoot</strong><br />SELinux Troubleshooting， 不用SELinux的可以关了<br /><br /><strong>smartd</strong><br />SMART Disk Monitoring， 快速开机自检，开着吧<br /><br /><strong>smolt</strong><br />无用，关吧<br /><br /><strong>sshd</strong><br />OpenSSH服务器，通常可以关了，这是服务器端，关闭不影响ssh的使用<br /><br /><strong>syslog</strong><br />系统日志，开着吧<br /><br /><strong>vncserver</strong><br />一般桌面用户可以关了<br /><br /><strong>winbind</strong><br />不用Samba服务器的话， 可以关了<br /><br /><strong>wpa_supplicant</strong><br />无线设备支持，无者关<br /><br /><strong>ypbind</strong><br />不用NIS/YP，可以关了<br /><br /><strong>yum-update</strong><br />自动定期升级检测， 如果你经常手动升级。可以关了
          <br/>
          <span style="color:red;">
            <a href="http://weiqingfei.javaeye.com/blog/111721#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 13 Aug 2007 14:34:23 +0800</pubDate>
        <link>http://weiqingfei.javaeye.com/blog/111721</link>
        <guid>http://weiqingfei.javaeye.com/blog/111721</guid>
      </item>
      <item>
        <title>Cyrus中如何实现邮件分类。</title>
        <author>weiqingfei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://weiqingfei.javaeye.com">weiqingfei</a>&nbsp;
          链接：<a href="http://weiqingfei.javaeye.com/blog/110792" style="color:red;">http://weiqingfei.javaeye.com/blog/110792</a>&nbsp;
          发表时间: 2007年08月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          现在很多的免费邮箱都实现了过滤分类功能，也就是说通过设定，可以让收到的邮件自动归类的指定的目录里。<br />这种技术，可以在客户端实现，也可以在服务器端实现。<br />客户端的实现比较简单，只要客户端软件，在收信时进行分类就可以了，但是有一个不好的地方，就是当你更换了客户端时，邮件的分类就全没有了。<br />服务器端的实现稍微繁琐一些，但是不管在什么地方，使用什么客户端，都能得到分类的邮件，缺点也显而易见，这部分工作由服务器端来做，加重了服务器的负担。<br /><br />客户端的实现，就不用讲了，只是一个规制编程的事情。<br /><br />现在以服务器端的Cyrus为例，讲一下服务器端的设置。<br /><br />Cyrus是Imap服务器，和Pop最大的一个区别就是用户可以在服务器端创建多个目录，并且邮件的状态都是保存在服务器端。<br />Cyrus使用一种叫sieve script的脚本（参照<a href="http://sieve.info/" target="_blank">http://sieve.info/</a>）来对邮件过滤，要使用sieve script必须在启动cyrus的同时启动sieve daemon，当邮件到达cyrus的lmtp daemon时，先取检查sieve daemon的script规则，根据规制然后决定怎么处理邮件。<br />设置如下：<br />在/etc/services里追加<br /><pre name="code" class="java">
sieve           2000/tcp
sieve           2000/udp
</pre><br />在/etc/cyrus.conf里追加<br /><pre name="code" class="java">
sieve        cmd="/usr/cyrus/bin/timsieved" listen="sieve" prefork=0
</pre><br />重新启动cyrus服务器<br /><pre name="code" class="java">
kill `cat /var/run/cyrus-master.pid`
/usr/cyrus/bin/master -d
</pre><br /><br />首先用telnet登录sieve服务，看是否正常启动<br /><pre name="code" class="java">
$ telnet 127.0.0.1 2000
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
"IMPLEMENTATION" "Cyrus timsieved v2.3.8"
"SASL" "NTLM LOGIN PLAIN DIGEST-MD5 CRAM-MD5"
"SIEVE" "comparator-i;ascii-numeric fileinto reject vacation imapflags notify envelope relational regex subaddress copy"
OK

</pre><br /><br />然后使用一个叫sieveshell的工具，可以对sieve服务上的script进行查询，添加，删除，操作，激活等操作。<br /><pre name="code" class="java">
$ sieveshell -a username localhost
connecting to localhost
Please enter your password:
</pre><br />输入密码後，登录，可以输入help命令查看它的所有命令。<br /><pre name="code" class="java">
> help
Usage:
  sieveshell [-u username] [-a authname] [-r realm] &lt;server>

help             - this screen
list             - list scripts on server
put &lt;filename> [&lt;target name>]
                 - upload script to server
get &lt;name> [&lt;filename>]
                 - get script. if no filename display to stdout
delete &lt;name>    - delete script.
activate &lt;name>  - set a script as the active script
deactivate       - deactivate all scripts
quit             - quit
</pre><br /><br />写一个简单的sieve script，然后使用put命令上传导sieve服务器上，<br /><pre name="code" class="java">
require "fileinto";

if header:contains "from" "wei" {
        fileinto "INBOX.TRASH";
} else {
        fileinto "INBOX";
}
</pre><br />这段代码的意思是，如果from头里包含wei这个字符串的话，就放入导INBOX.TRASH目录里，否则就放到INBOX目录里。<br /><br /><span style="color: red"><strong>当目录不存在时，lmtp会自动把邮件转到默认的“INBOX”目录里</strong></span><br /><br />使用sieveshell只能手工这样对sieve script进行操作，如果做了一个邮件的web app，可以让用户自己来定制规则的话，就不能用这种方法了。<br />其实sieveshell是使用的一种叫“managesieve”的协议（参看：<a href="http://tools.ietf.org/html/draft-martin-managesieve-07" target="_blank">http://tools.ietf.org/html/draft-martin-managesieve-07</a>）和sieve服务器进行通讯的，只要通过这个协议，就可以用程序来对sieve服务器上的sieve script来进行管理了。<br /><br />提供这种协议通讯的java包，我只找到一个，gatorsieve：<a href="http://gatorsieve.svn.sourceforge.net/viewvc/gatorsieve/" target="_blank">http://gatorsieve.svn.sourceforge.net/viewvc/gatorsieve/</a><br />由于这种协议非常简单，并且sieve script的语法也不复杂，所以完全可以在程序中，根据用户的设定，组织好sieve script，然后通过managesieve协议上传导sieve服务器上，这样就可以实现用户的个人定制了。
          <br/>
          <span style="color:red;">
            <a href="http://weiqingfei.javaeye.com/blog/110792#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 10 Aug 2007 10:19:13 +0800</pubDate>
        <link>http://weiqingfei.javaeye.com/blog/110792</link>
        <guid>http://weiqingfei.javaeye.com/blog/110792</guid>
      </item>
      <item>
        <title>Whitebox中卸载gcj，并安装Sun的jdk SE</title>
        <author>weiqingfei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://weiqingfei.javaeye.com">weiqingfei</a>&nbsp;
          链接：<a href="http://weiqingfei.javaeye.com/blog/109446" style="color:red;">http://weiqingfei.javaeye.com/blog/109446</a>&nbsp;
          发表时间: 2007年08月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Whitebox默认自带了IBM的gcj，一般做开发都是使用Sun的jdk se的，当然完全可以不卸载，让两种开发环境并存的，但是我根本就没有使用到gcj，为了干净，还是选择删掉gcj。<br />以下都是在root用户下执行<br /><br />首先查询gcj的版本<br /><pre name="code" class="java">
[root@localhost bin]#  rpm -qa|grep gcj
libgcj-3.2.3-54
</pre><br /><br />我这儿只有一个gcj的虚拟机，没有开发环境，否则一并删除。<br /><br /><pre name="code" class="java">
[root@localhost bin]# rpm -e --nodeps libgcj-3.2.3-54
</pre><br /><br />这下在查查<br /><pre name="code" class="java">
[root@localhost bin]# ll /etc/alternatives/
</pre><br /><br />已经没有了java的连接，好了这个世界清静了，可以安装Sun的jdk se了。<br /><br />下载Linux版jdk，我下载的是jdk-1_5_0_11-linux-i586.bin<br />执行解压缩<br /><pre name="code" class="java">
[root@localhost tmp]# sh ./jdk-1_5_0_11-linux-i586.bin
</pre><br />移动到用户本地路径，并创建连接符<br /><pre name="code" class="java">
[root@localhost tmp]# mv jdk1.5.0_11 /usr/local/
[root@localhost tmp]# ln -s /usr/local/jdk1.5.0_11/ /usr/local/java
</pre><br />设定环境变量<br /><pre name="code" class="java">
[root@localhost tmp]# vi /etc/profile.d/java.sh
</pre><br />加入以下内容<br /><pre name="code" class="java">
		#!/bin/sh
		export JAVA_HOME=/usr/local/java
		export PATH=/usr/local/java/bin:$PATH
</pre><br />重新导入设定<br /><pre name="code" class="java">
[root@localhost bin]# source /etc/profile
</pre><br />看看是否大功告成<br /><pre name="code" class="java">
[root@localhost bin]# java -version
java version "1.5.0_11"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_11-b03)
Java HotSpot(TM) Client VM (build 1.5.0_11-b03, mixed mode, sharing)
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://weiqingfei.javaeye.com/blog/109446#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 06 Aug 2007 16:39:25 +0800</pubDate>
        <link>http://weiqingfei.javaeye.com/blog/109446</link>
        <guid>http://weiqingfei.javaeye.com/blog/109446</guid>
      </item>
      <item>
        <title>打破时间的束缚（转）</title>
        <author>weiqingfei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://weiqingfei.javaeye.com">weiqingfei</a>&nbsp;
          链接：<a href="http://weiqingfei.javaeye.com/blog/95041" style="color:red;">http://weiqingfei.javaeye.com/blog/95041</a>&nbsp;
          发表时间: 2007年06月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          无固定的日程安排。 无必须参加的会议。Best Buy公司的职场正在发生根本的变革，让我们一窥究竟
<p>　　2005年的一天下 午，在Best Buy公司负责网上定单业务的查普?阿肯关上了电脑，然后起身说他要下班离开了。此时大约是下午两点钟，阿肯的下属大多都还趴在键盘上，午饭后的困倦和电 脑屏幕的闪烁令他们昏昏欲睡。阿肯接着说：&ldquo;各位明天见。我要去看日场电影了。&rdquo; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通常来说，在下午一两点钟就离开办公室可完全不是阿肯的作风。这位37岁的公司职员可是个工作至上的人，当&ldquo;工作和生活的平衡&rdquo;从他嘴里冒出来时，总会招 来妻子的当面嘲笑。但如今，在Best Buy位于明尼阿波利斯的公司总部，此类反常之举正在这栋超现代建筑里蔓延开来。劳工关系部的史蒂夫?汉斯突然开始在工作日去打猎了，他的一只手上是雷明 顿12号霰弹枪、另一只手上是配有Verizon公司通讯服务的LG手机。而零售培训部的数字化学习（e-learning）专家马克?维尔斯则整日奔 波，跟随摇滚歌手戴夫?马修斯的足迹跑遍全国。单亲妈妈凯莉?麦可德维特是一名网上促销经理，她下午两点半就会离开公司去接11岁的儿子凯文放学。斯科 特?乔曼是一位资深的六西格玛管理专家，他有1/3的时间是在位于诺斯伍兹的小木屋中度过的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;在大多数公司，上班时间去看电影可能会被炒鱿鱼。但在Best Buy却不是这样。这家全球领先的电子零售商正在进行一场激进或者说是冒险的试验，以使其曾以&ldquo;磨洋工的雇员、监工般的上司&rdquo;而著称的企业文化得以改观。 这项计划被称为&ldquo;以成果为宗旨的工作环境&rdquo;（results-only work environment），简称ROWE，它的目标是推翻已盛行了几十年的商业信条&mdash;&mdash;把雇员的出勤等同于生产。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Best Buy的目标是通过产出来评判业绩，而不是工作时间的长短。 因此，在下午两点才赶到公司的员工不算是迟到，在下午两点就下班离开的也不算是早退。Best Buy公司总部内的娱乐设施一应俱全，无固定的日程安排，无必须参加的会议，亦无印象管理（通过对衣着是否得体的印象所实施的管理&mdash;&mdash;译注）之忧。工作不 再是一个处所，而是你所做的事情。在打猎的间歇参加电话会议、在湖边的小木屋里与他人进行沟通合作或者在晚饭后加班工作以和孩子共度午后时光等等，都是被 允许的自由选择。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这种跨越地理界限的办公概念并非Best Buy的首创。在那些科技公司，员工可以像游牧人一样自由行动的传统由来已久。在IBM公司，40%的员工没有正式的办公场所。在AT&amp;T， 1/3的经理人不受办公地点的束缚。据Sun电子计算机公司测算，约半数的公司员工可自由选择工作场所的政策使公司每年得以节省3亿美元的房租费用。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 极具争议的是，没有哪家大公司打破工作时间束缚的决心像Best Buy一样坚定。这种不计考勤、不规定工作地点的公司制度意味着：只要能完成工作，人们就有自由选择工作时间和工作地点的权利。这个项目的共同创始人卓 迪?汤普森说：&ldquo;这种感觉如同使用TiVo一样。&rdquo;到2007年年底，在公司工作的全部4000名员工都将享有ROWE权利。从2007年2月开始，新的 工作方式将会正式成为Best Buy招聘口号的一部分，新员工也会在这里找到崭新的人生方向。公司决意将这场打破钟点限制的战斗进行到底。这是一场惊心动魄的冒险，之前没有一家零售企 业进行过此类尝试。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关于这个冒险，值得一提的是它并非自上而下的行政指令，而是自下而上的自发之举。它从最开始的秘密游击队式的行动开始，不可抑制地四处蔓延，终成翻天覆地 之势。不为人知的是，在这种工作方式已于员工中蔚然成风之时，首席执行官布兰德?安德森竟毫不知情。两年之后他才了解内情，但这种自下而上的、秘而不宣的 创新活动正是安德森所鼓励的。Best Buy的这位领头人绝不会停下创新的脚步，即使有些新做法仅在表面上起作用。他说：&ldquo;ROWE这个主意是由一群充满热情的员工酝酿出来并培育成长的。它不 是行政指令的产物。&rdquo; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 安德森和他的团队对这种工作方式充满了信心，他们甚至成立了CultureRX子公司来专门帮助其他公司开展无钟点限制的工作安排。CultureRX有 望在未来几个月内迎来一位大客户。 公司的首席执行官可能对此深信不疑，但公司内部仍不乏反对之声。许多公司高层人士疑虑重重，认为它不过是变装的&ldquo;弹性工作制&rdquo;概念，换汤不换药。其他一些 人则认为，这种不必出勤的工作方式可能会导致工作时间延长，永久地破坏工作时间和个人时间之间的界线。反对者认为，这不过是人力资源部那些惯用权术之人的 骗人手段而已。随着ROWE概念席卷了一个又一个部门，它的支持者也遭遇到顽固派的坚决抵制，这些冥顽不化的人策划要推翻这种制度，并四处散布恶毒言论， 称怠工者的天堂就在眼前。 新制度的支持者则反驳说，它有助于Best Buy应对挑战。早期ROWE理念在公司的成功实施使一些最难动摇的反对者转而成为了它的忠实拥趸。电子产品的销售毛利率受到持续挤压，沃尔玛和 Target公司也对Best Buy的业务领域虎视眈眈。受情势所迫，Best Buy不得不向服务领域扩展，其中包括计算机维修安装公司Geck Squad和&ldquo;以客户为中心&rdquo;项目，在该项目中，公司销售人员将充当顾客的技术顾问。工作压力、职业倦怠和极高的离职率也深深困扰着Best Buy。公司对ROWE寄予厚望，期望这种员工能够自由决定如何平衡工作与生活的做法能鼓舞士气、提高效率，从而使公司的服务业务驶入正轨。 公司似乎看到了成效。据CultureRX反映，自该项目实施以来，公司的平均辞职率有了显著下降。而与此同时，公司惊喜地发现，在已实施了ROWE的部 门，工作效率平均提高了35%，盖洛普咨询公司负责对各公司的企业文化作出评价，它指出，Best Buy的&ldquo;员工敬业度&rdquo;（employee engagement）有了长足增长。&ldquo;员工敬业度&rdquo;可以衡量员工的工作满意度，它往往是员工留职率的标尺。 ROWE的实行还有助于公司挪出资金用于&ldquo;以客户为中心&rdquo;项目。该项目需要针对当地市场的不同需求对各处的店铺进行调整并对员工进行培训，以收集用户的反 馈意见并生成崭新的商业理念。Best Buy公司估计，让员工在办公室外工作可以减少对办公空间的需求，也许公司可以把空出的工作间出租给其他公司，把节省下来的资金投入到公司的服务事业上。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 菲莉丝?摩恩是明尼苏达州立大学的社会学教授，她研究的是工作和生活课题。在由国家健康研究院（National Institutes of Health）资助的一个项目里，她对Best Buy公司的情况进行了深入研究。她说，在劳资双方对于工作及工作时间的态度上，大多数公司还徘徊在上世纪30年代。摩恩说：&ldquo;我们对于付薪工作的所有想 法都是在一种装配线文化的氛围中发展起来的。出勤就意味着工作。但Best Buy意识到，坐在椅子里不再意味着工作。&rdquo; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 卓迪?汤普森和卡利?雷斯勒这两位人力资源部的人肯定不会招致你的反感。她们对诸如打造&ldquo;超级团队&rdquo;这样宗教般狂热的公司信条不屑一顾，也对那些电子邮件 的崇拜者嗤之以鼻，认为这些人的工作毫无必要、华而不实。她们认为，如果人们能把办公室装在口袋里或笔记本电脑里四处游走，那么只要他们能达到目标，在哪 里、在什么时候工作又有什么关系呢？ 49岁的汤普森和29岁的雷勒斯相识在3年前，婴儿潮时代出生的人和X一代的人竟然一见如故。她们的故事听起来就像一场因人力资源管理而结缘的精神恋爱， 仿佛两颗惺惺相惜的心终于得以珠联璧合。而在当时，Best Buy仍是一家对上班时间要求极为严苛的公司。在温度降至零下的寒冷清晨，8点后到达公司的职员把大衣偷偷藏在车里，以免被发现上班迟到，早退者只能偷偷 从楼梯溜走。而在工作间里的日子同样不好过。有一位经理要求他的MBA下属在外出就餐时登记，写下他们的餐厅地址。还有一位则坚持要求他的下属每15分钟 就跟踪一下工作进程。和许多公司一样，最后一个关灯走人的才算是胜利者。 而在办公场所之外，无处不在的无线宽带网络使汤普森和雷斯勒无法忽视其巨大的力量，它已把整个世界变成了一个巨大的工作空间。经理们深受模拟技术时代的惯 性驱使，经常以他们看到你的次数多少为依据来判断你的成绩高低，而不是根据你做的工作多少。雷斯勒和汤普森意识到，一种危险的、极具破坏性的做法正在形 成，即随时待命的员工现在还必须总坐在办公室里。 员工看似恪尽职守，但这种企业氛围对Best Buy的大规模扩展计划造成了威胁。雷斯勒和汤普森也知道她们的方案似乎过于激进，不能冒然向首席执行官安德森透露。在初始阶段，向上级人士展开游说以获 得他们的正式同意似乎也不太可能。况且她们知道，通常自下而上的贯彻方案往往会无疾而终。所以她们经常私下里见面，悄悄地规划着如何保守ROWE的秘密， 然后一点点地试探着展开行动。她们耐心等待着时机的成熟。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这一刻终于到来了。2003年，资产部和通讯部的两位经理简直如坐针毡。不少成绩裴然的员工开始抱怨工作强度不稳定，当时Best Buy正在几百家商店里展开&ldquo;以客户为中心&rdquo;项目，这些抱怨对业务的持续展开造成了威胁。通过雇员忠诚度数据，她们了解到常见的工作生活失衡现象使员工身 心疲惫：一边是工作的压力（随时待命、跨洲际的工作安排），一边是对自我生活控制力的丧失（总被束缚在办公场所，毫无个人生活可言）。 雷斯勒和汤普森在两位管理人员身上看到了机会。他们愿意参与这项秘密的管理实验吗？两人对此进行了一番策划。她们解释说，实施ROWE后，不会再有必须参 加的会议，不必再按时去公司上班，评价业绩的依据是成果而不是工作时间，经理人员对员工的考核也建立在数据和实证资料之上，而不是私人感情和道听途说的议 论。这两位管理人员对此很感兴趣，他们同意进行尝试。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这项实验很快获得了广泛关注。员工在公司内部的Caribow咖啡馆排队时谈论此事、在电子邮箱里交流、在经过朋友的办公桌时停下交谈，于是公司其他部门 的员工也很快听闻此事。在Best Buy的办公大楼里，奇怪的现象发生了，有的部门实行了ROWE，有的部门则没有。参与了ROWE的员工的手提电脑上贴着特殊的标签，似乎他们属于某个秘 密组织一样。于是，出去打猎的人开始在树桩间参加电话会议，在捕鱼的小船上发送电子邮件。在维尔斯不尾随摇滚歌手戴夫?马修斯的全国巡演时，他可能正围着 明尼阿波利斯的城市湖泊跑步，在夜幕降临之后才开始工作。计时工作人员仍需一周工作40小时，但可以自由选择时间和地点。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 起初，参与者不愿意向更高层管理人员透露一星半点儿有关ROWE的事，害怕工作福利被取消或计划被否定。但到2004年，越来越多的高层管理人员开始听闻 这项实验，与此同时反对之声也日益高涨。批评者担心管理人员会失去对员工的控制力，同事之间因距离拉近而产生的协作关系也可能消失。他们的疑问是，如果你 可以在任何地方工作的话，那你还会一直工作吗？忍无可忍的上司会不会在半夜给你打电话？消极怠工者会不会把ROWE看做逃避工作的好机会？工作一贯认真的 人会不会开始敷衍塞责？此外，不同时代出生的员工之间的矛盾开始显现：一些生于婴儿潮时代的人认为，在他们的职业生涯里必须在工作和生活之间做出选择，其 他人也理应如此。 莎瑞?巴尔兰德是Best Buy负责人力资源和领导力的执行副总裁。她起初满腹疑虑，但最终对此推崇有加。最开始她不明白为什么经理们需要用一种新方法来解决工作和生活的平衡难 题，在说到雷斯勒和汤普森的革新运动时她说：&ldquo;那可不是微笑拥抱这样简单的事情。那些思想陈旧的经理们被完全激怒了。&rdquo;在数字化学习部，维尔斯的许多较年 长的同事（多为40多岁的人，而Best Buy的员工平均年龄是36岁）表达了对这种变化的憎恶之心，他们坚持认为工作关系最好是面对面的，而不是屏幕对屏幕的。维尔斯则喜欢睡懒觉，家里也没有 闹钟。他说：&ldquo;一块工作的同事里有人说：&lsquo;我才不会这么干。&rsquo;而我则说：&lsquo;没关系，但我要走了。&rsquo;&rdquo;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在反对者阵营，雷斯勒和汤普森直到今天还被称为&ldquo;那两个人&rdquo;和&ldquo;破坏专家&rdquo;。 ROWE的影响继续在公司蔓延着。对此心动不已而又未能参与的员工，如果其上司开明进步，他们通常直接和上司谈论ROWE项目，劝说他同意进行尝试。如果 上司古板而苛刻的话，他们就自发成立地下组织，悄悄地赢得外部人士的支持，直到他们的上司毫无选择、只能作出让步。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 直到2006年夏天，首席执行官安德森才得到有关此事的完整报告，才彻底明白在公司内部发生的变化。汤普森说：&ldquo;我们故意等到纸里包不住火的时候才向他报 告。而在那时，她还尚未能很好地遵守ROWE13条训诫&mdash;&mdash;第一条：各级人员停止任何浪费自己的时间、浪费客户的时间或浪费公司资金的行为；第七条：任何 人不允许谈论自己的工作时间长短；第九条：以下行为是许可的，在星期二下午打个盹，星期三早上去买点杂货或星期四下午出去看场电影。 那天阿肯离开公司去看《星战传奇3：西斯的复仇》就是为了遵守这一训诫。这种做法似乎违背常规，令人不安。阿肯有种罪恶感，但雷斯勒和汤普森告诉他要&ldquo;树 立榜样&rdquo;。于是他这样做了，并看到了利用ROWE来解决一些商业难题的可能性。顾客在Best Buy下了定单之后的所有业务流程全部由阿肯的部门负责监控，包括手工检查定单、挑出有欺诈嫌疑的定单等。作为这个部门的当家人，阿肯期望能延长部门的运 行时间，但不必要求员工在早上6点就到公司上班。他还有另外一个心病。他手下有一些办事得力的经理，其中有一个人住在密西西比州的圣克劳德，每天要花两个 半小时分别在上班和下班的路上。这位经理和阿肯有一个君子协议，允许他周五在家里工作，其他人对这种优待颇有微词。阿肯说：&ldquo;这导致了团队关系紧张。&rdquo; 前所未有的员工满意度 卡利?雷斯勒和卓迪?汤普森令阿肯深信ROWE会起作用。现在该由阿肯来说服约翰?汤普森了。他是BestBuy.com网站的总经理、Best Buy的高级副总裁。说服工作当然不容易做。约翰?汤普森曾任职于通用电子公司，他的作风相当老派，衬衫熨烫得笔挺、说话声音宏亮、站姿笔直。像他这种年 纪的人，一天工作8小时是不容质疑的生活内容。他喜欢周末在办公室加班。起初，他非常排斥ROWE。就个人情感来说，他十分害怕失去对员工的控制。约翰? 汤普森说：&ldquo;我并不支持ROWE。&rdquo;阿肯也说：&ldquo;他不想跟此事扯上任何关系。他关心的全部是评价指标方面的问题，他不停地问我：&lsquo;你怎样做出评价？怎样知 道下属的生产效能是否和以前一样？&rsquo;&rdquo; 这正是阿肯的业绩评价方法大有用武之地的时候。无论他的下属在哪里，他都可以知道团队每小时处理的定单数目。他告诉约翰?汤普森，一旦发现处理定单数目略 有下降，他就会把所有人召回办公室。在一个月内，阿肯发现不仅团队的生产效能有所上升，而且员工敬业度、工作满意度和职工保留率都达到了这个部门有史以来 的最高值。 多年来，员工敬业度一直是约翰的心头之痛。阿肯说：&ldquo;当我把这些数字拿给他看时，他的眼睛立刻被点亮了。&rdquo;约翰?汤普森立刻将ROWE推行至整个部门。自 动离职率从16.11%降到0。他说：&ldquo;多年来，我的关注点一直是错误的，我总是去看员工有没有来上班。我真应该看看他们正在做什么。&rdquo; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在，阿肯的员工通常一周只到办公室来一次。3/4的员工大部分时间都是在公司之外度过的。在员工每天从早到晚都不在一起的时候，他会不会失去一些办公室 魔法呢？头脑风暴的价值何在呢？团队精神和同事友情会不会消失呢？对此，他的回答是：&ldquo;你当然会有所损失。但你的所得远远大于你的损失。&rdquo; 阿肯说他绝不会重回老路。不在办公室工作的员工所处理的定单数量要比在办公室工作的人处理的多13%到18%。ROWE参与者完成工作的质量也更高。阿肯 说，他认为这是新的办公室悖论造成的：由于不停地有外界干扰，有时候要在办公室完成工作几乎是不可能的事。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 雷斯勒和汤普森说，已转向自由工作安排的部门都报告了相似的情况。与此同时，这两人又为公司制订了更加宏伟的计划，2006年11月，她们开始在公司推行 名为&ldquo;Cube-Free&rdquo;的新计划。她们认为，办公室生活会令人养成不好的习惯，把人们束缚在纸质的、有线时代的思维模式里，而不会促使员工主动去使用 科技产品以提高工作效率，而这正是科技产品的发明宗旨所在。在员工越来越不在意工作地点的时候，办公室的存在无疑是对空间和时间的浪费。汤普森说：&ldquo;这也 使得Best Buy即使在灾难发生时，仍能继续保持全面运转。&rdquo;那些已把工作空间腾出来的团队可以将其重新设计，以更好地适应合作的需求，而不再是单枪匹马地各自为 战。 2007年，雷斯勒和汤普森计划走出最大胆的一步棋，那就是在零售店测试ROWE的效果，经理人员和普通员工都包括在内。在销售人员本应按时上班的环境里 具体怎样开展工作，她们对此闭口不谈。她们也知道会很难，但对于能够有助于降低零售店高达65%的离职率的任何事情，她们都会欣然地去尝试。在公司的零售 商店里，员工的不满情绪相当普遍，他们甚至在My Space上组成了&ldquo;Best Buy失意者俱乐部&rdquo;之类的小集团。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Best Buy在相当短的时间内就转变了其企业办公文化。那么ROWE会不会又以相同的速度土崩瓦解呢？如果公司业绩突然刹车怎么办？毕竟竞争的热度没有任何降低 的势头。Best Buy经销着许多利润丰厚的产品，沃尔玛和Target对此已虎视眈眈，恨不得跟这家电子零售商在价格上拚个你死我活。 一旦Best Buy业绩下滑，那些一直认为自由工作时间不过是个脆弱的新时代概念的人将有机可乘，原来刻板的工作制度又将卷土重来。公司里有些人抱怨说，生产效率的提 升是因为许多员工延长了工作时间。而有些ROWE的坚决反对者在走廊里遇到雷斯勒和汤普森时，仍会不屑一顾地把头转到一边。 但值得注意的是，许多大公司的增长速度通常都赶不上通货膨胀的步伐。部分原因是，公司越大就越难充分利用每位员工的价值。雷斯勒说，&ldquo;老式的管理方法和旧 有的工作理念已经行不通了，我们要对工作方式进行变革。&rdquo;你不得不承认，她们的做法确实令人欢欣鼓舞。</p>
<p>　　作者： 米歇尔?康林</p>
<p>　　翻译： 卢欣</p>
          <br/>
          <span style="color:red;">
            <a href="http://weiqingfei.javaeye.com/blog/95041#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Jun 2007 13:05:41 +0800</pubDate>
        <link>http://weiqingfei.javaeye.com/blog/95041</link>
        <guid>http://weiqingfei.javaeye.com/blog/95041</guid>
      </item>
  </channel>
</rss>