<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>破茧之旅进行中......</title>
    <description>给我一根棍子，我也要撬动地球......</description>
    <link>http://daoger.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>css消除图片下方空隙</title>
        <author>daoger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://daoger.javaeye.com">daoger</a>&nbsp;
          链接：<a href="http://daoger.javaeye.com/blog/212480" style="color:red;">http://daoger.javaeye.com/blog/212480</a>&nbsp;
          发表时间: 2008年07月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>今天在做一个网页时，在IE7下发现一个奇怪的问题，先看代码： </p>
<pre name="code" class="html">&lt;div style="float: left;"&gt;
	&lt;img id="pic1" src="images/picture1.jpg" style="border:4px solid #191919;" 
		width="553" height="179" /&gt;
&lt;/div&gt;</pre>
<p>&nbsp;感觉代码没问题，可是预览时总是发现图片下方和div边框之间有一条大概4px的空隙，最后还是得以解决。</p>
<p>最简单的办法是，标签写在一行中：</p>
<pre name="code" class="html">&lt;div style="width: 900px;height: 75px;margin-top: 0px;"&gt;&lt;img src="images/top.jpg" id="top" width="900" height="75"&gt;&lt;/div&gt;</pre>
<p>&nbsp; </p>
<p>其他办法主要还是靠css属性解决! 不过，有些属性调整后在firefox下可能会有问题。一个可以使用display属性解决：</p>
<pre name="code" class="html">&lt;div style="float: left;"&gt;
	&lt;img id="pic1" src="images/picture1.jpg" style="border:4px solid #191919;display:block;" 
		width="553" height="179" /&gt;
&lt;/div&gt;</pre>
<p>&nbsp;</p>
<p>另一个可以用vertical-align属性解决：</p>
<pre name="code" class="html">&lt;div style="float: left;"&gt;
	&lt;img id="pic1" src="images/picture1.jpg" style="border:4px solid #191919;vertical-align:top;" 
		width="553" height="179" /&gt;
&lt;/div&gt;</pre>
<p>&nbsp; 使用margin-bottom属性解决：</p>
<pre name="code" class="html">&lt;div style="width: 900px;height: 75px;margin-top: 0px;"&gt;
	&lt;img src="images/top.jpg" style="margin-bottom: -4px;" id="top" width="900" height="75"&gt;
&lt;/div&gt;</pre>
<p>&nbsp;使用字体大小属性font-size解决：</p>
<pre name="code" class="html">&lt;div style="width: 900px;height: 75px;margin-top: 0px;font-size:0"&gt;
	&lt;img src="images/top.jpg" id="top" width="900" height="75"&gt;
&lt;/div&gt;</pre>
<p>&nbsp; </p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://daoger.javaeye.com/blog/212480#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 07 Jul 2008 20:37:15 +0800</pubDate>
        <link>http://daoger.javaeye.com/blog/212480</link>
        <guid>http://daoger.javaeye.com/blog/212480</guid>
      </item>
      <item>
        <title>javascript使用八卦</title>
        <author>daoger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://daoger.javaeye.com">daoger</a>&nbsp;
          链接：<a href="http://daoger.javaeye.com/blog/211397" style="color:red;">http://daoger.javaeye.com/blog/211397</a>&nbsp;
          发表时间: 2008年07月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          关键时刻，一毛钱也能难死英雄汉！编程中有些细节问题也会让你浪费很多时间。<br /><br /><br />今天看别人的代码的时候，看到了这样一种写法：<br /><br /><pre name="code" class="js">var a = function(){......}();</pre><br />省略号代表部分代码。<br /><br /><br />开始时我没看明白这事什么意思，经一个js大虾网友点拨后才明白，这只是一种js对象编程的代码简化。<br /><br />例如：<br /><br /><pre name="code" class="js">add = function(){
       return 2+3;
}
var _i = add();</pre><br /> 运行后，_i的值是5。你可以把上面的这段代码这样写：<br /><br /><pre name="code" class="js">var _i = function(){return 2+3;}();</pre><br /> 当方法代参数的情况下呢？<br /><br />例如：<br /><br /><pre name="code" class="js">add = function(a,b){
           return a+b;
}
var _i = add(2,3);</pre><br /><br />此时_i的值仍然是5。这个时候需要对add函数进行定义后才能使用；可别把代码简化成这样：<br /><br /><pre name="code" class="js">var _i = function(2,3){return a+b;}();</pre><br /> 呵呵！不过，你可以这样写：<br /><br /><pre name="code" class="js">var _i = function(){return add(2,5);}();</pre><br /> 或者<br /><br /><pre name="code" class="js">var _i = function(){return new Function("return add(2,5);")}()();</pre><br /> 但是你实际编程的时候可别这样写，呵呵！<br /><br />这个时候赋给_i的都是函数运行后的结果。<br /><br /><br />我们也可以赋给它一个对象，这次我们换一个写法：<br /><br /><pre name="code" class="js">var _i = function(){
            return {add:function(a,b){return a+b;}}；
}();
alert(_i.add(2,3));</pre><br /> 这个时候_i就是一个对象，而add是它的一个函数属性，是这个对象的一部分，_i.add(2,3)的返回值仍然是5。<br /><br /><br />这种编程表达方式的好处就是声明和定义同步，节省代码量,例如：<br /><br /><pre name="code" class="js">var _i = function(){
	return {
		add:function(a,b){return a+b;},
		minus:function(){return _i.add(2,3)-1;}
	};
}();
alert(_i.minus()));</pre><br /> 上面程序运行后，弹出返回值4。<br /><br /><br /> 有些八卦，不过希望能对你的js编程有所帮助！
          <br/>
          <span style="color:red;">
            <a href="http://daoger.javaeye.com/blog/211397#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 04 Jul 2008 10:32:30 +0800</pubDate>
        <link>http://daoger.javaeye.com/blog/211397</link>
        <guid>http://daoger.javaeye.com/blog/211397</guid>
      </item>
      <item>
        <title>An Application Example of K-Mean Algorithm </title>
        <author>daoger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://daoger.javaeye.com">daoger</a>&nbsp;
          链接：<a href="http://daoger.javaeye.com/blog/211340" style="color:red;">http://daoger.javaeye.com/blog/211340</a>&nbsp;
          发表时间: 2008年07月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>ClusterMain.java</p>
<pre name="code" class="java">package eu.eodigos.kmean;

import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import eu.eodigos.hibernate.bean.ClusterInput;
import eu.eodigos.hibernate.server.AccessDBServer;
import eu.eodigos.hibernate.server.AccessDBServerImp;

/**
 * @author daoger
 * @version 1.0
 * @k-mean Cluster
 */

public class ClusterMain
{
	public static void main(String[] args)
	{
		ClusterMain clusterMain = new ClusterMain();
		clusterMain.clusterByDatabase();
	}

	/**
	 * Test with manual data
	 */
	public void test()
	{
		Vector&lt;DataPoint&gt; dataPoints = new Vector&lt;DataPoint&gt;();
		dataPoints.add(new DataPoint(0.12, 0.21, 0.26, 0.45, 0.67, 0.23, 0.11, new Integer(1)));
		dataPoints.add(new DataPoint(0.22, 0.23, 0.46, 0.11, 0.63, 0.11, 0.12, new Integer(2)));
		dataPoints.add(new DataPoint(0.32, 0.34, 0.78, 0.17, 0.68, 0.67, 0.13, new Integer(3)));
		dataPoints.add(new DataPoint(0.42, 0.45, 0.26, 0.42, 0.48, 0.39, 0.14, new Integer(4)));
		dataPoints.add(new DataPoint(0.52, 0.29, 0.65, 0.59, 0.16, 0.74, 0.15, new Integer(5)));
		dataPoints.add(new DataPoint(0.62, 0.25, 0.48, 0.61, 0.27, 0.16, 0.67, new Integer(6)));
		dataPoints.add(new DataPoint(0.72, 0.35, 0.39, 0.20, 0.65, 0.26, 0.17, new Integer(7)));
		dataPoints.add(new DataPoint(0.82, 0.20, 0.16, 0.29, 0.32, 0.61, 0.18, new Integer(8)));
		dataPoints.add(new DataPoint(0.92, 0.71, 0.26, 0.37, 0.17, 0.81, 0.19, new Integer(9)));
		dataPoints.add(new DataPoint(0.13, 0.39, 0.17, 0.41, 0.47, 0.37, 0.10, new Integer(10)));
		dataPoints.add(new DataPoint(0.14, 0.23, 0.47, 0.93, 0.68, 0.28, 0.29, new Integer(11)));
		dataPoints.add(new DataPoint(0.15, 0.57, 0.84, 0.19, 0.15, 0.39, 0.39, new Integer(12)));
		dataPoints.add(new DataPoint(0.16, 0.19, 0.45, 0.38, 0.36, 0.82, 0.49, new Integer(13)));
		dataPoints.add(new DataPoint(0.17, 0.89, 0.29, 0.39, 0.82, 0.58, 0.59, new Integer(14)));
		// divide all user to 7 cluster
		// 10000 stand for precision,the bigger of this value the more accuratly
		ClusterAssistant clusterAssistant = new ClusterAssistant(3, 10000, dataPoints);
		clusterAssistant.startAnalysis();

		Vector[] v = clusterAssistant.getClusterOutput();
		for (int i = 0; i &lt; v.length; i++)
		{
			Vector tempV = v[i];
			System.out.println("-----------Cluster" + i + "---------");
			Iterator iter = tempV.iterator();
			while (iter.hasNext())
			{
				DataPoint dpTemp = (DataPoint) iter.next();
				String dps = "userid_" + dpTemp.getUserid() + "[" + dpTemp.getAvg1() + "," + dpTemp.getAvg2()
						+ dpTemp.getAvg3() + "," + dpTemp.getAvg4() + "," + dpTemp.getAvg5() + "," + dpTemp.getAvg6()
						+ "," + dpTemp.getAvg7() + "]";
				System.out.println(dps);
			}
		}
	}

	/**
	 * get data from database and calaulate
	 */
	public void clusterByDatabase()
	{
		AccessDBServer access = new AccessDBServerImp();
		Vector&lt;DataPoint&gt; dataPoints = new Vector&lt;DataPoint&gt;();
		List clusterList = access.getAllClusterInputData();
		for (Iterator iter = clusterList.iterator(); iter.hasNext();)
		{
			ClusterInput clusterInput = (ClusterInput) iter.next();
			if (clusterInput != null)
			{
				dataPoints.add(new DataPoint(clusterInput.getAvgArch(), clusterInput.getAvgMon(), clusterInput
						.getAvgMus(), clusterInput.getAvgBuil(), clusterInput.getAvgChap(), clusterInput.getAvgBeach(),
						clusterInput.getAvgWalk(), clusterInput.getClusterId()));
			}

		}
		// divide all user to 7 cluster
		// 10000 stand for precision,the bigger of this value the more accuratly
		ClusterAssistant clusterAssistant = new ClusterAssistant(7, 10000, dataPoints);
		clusterAssistant.startAnalysis();

		Vector[] v = clusterAssistant.getClusterOutput();
		for (int i = 0; i &lt; v.length; i++)
		{
			Vector tempV = v[i];
			Iterator iter = tempV.iterator();
			while (iter.hasNext())
			{
				DataPoint dpTemp = (DataPoint) iter.next();
				access.updateClusterCateOfUsers(dpTemp.getUserid(), new Integer(i + 1));
			}
		}
	}
}</pre>
<p>&nbsp;ClusterAssistant.java</p>
<pre name="code" class="java">package eu.eodigos.kmean;

import java.util.Vector;

/**
 * @author daoger
 * @version 1.0
 * @k-mean Cluster
 */


public class ClusterAssistant
{
	private Cluster[] clusters;

	private int miter;

	private Vector mDataPoints = new Vector();

	private double mSWCSS;

	public ClusterAssistant(int k, int iter, Vector dataPoints)
	{
		clusters = new Cluster[k];
		for (int i = 0; i &lt; k; i++)
		{
			clusters[i] = new Cluster("Cluster" + i);
		}
		this.miter = iter;
		this.mDataPoints = dataPoints;
	}

	private void calcSWCSS()
	{
		double temp = 0;
		for (int i = 0; i &lt; clusters.length; i++)
		{
			temp = temp + clusters[i].getSumSqr();
		}
		mSWCSS = temp;
	}

	public void startAnalysis()
	{
		setInitialCentroids();
		int n = 0;
		loop1: while (true)
		{
			for (int l = 0; l &lt; clusters.length; l++)
			{
				clusters[l].addDataPoint((DataPoint) mDataPoints.elementAt(n));
				n++;
				if (n &gt;= mDataPoints.size())
					break loop1;
			}
		}
		calcSWCSS();
		for (int i = 0; i &lt; clusters.length; i++)
		{
			clusters[i].getCentroid().calcCentroid();
		}
		calcSWCSS();

		for (int i = 0; i &lt; miter; i++)
		{
			for (int j = 0; j &lt; clusters.length; j++)
			{
				for (int k = 0; k &lt; clusters[j].getNumDataPoints(); k++)
				{
					double tempEuDt = clusters[j].getDataPoint(k).getCurrentEuDt();
					Cluster tempCluster = null;
					boolean matchFoundFlag = false;

					for (int l = 0; l &lt; clusters.length; l++)
					{

						if (tempEuDt &gt; clusters[j].getDataPoint(k).testEuclideanDistance(clusters[l].getCentroid()))
						{
							tempEuDt = clusters[j].getDataPoint(k).testEuclideanDistance(clusters[l].getCentroid());
							tempCluster = clusters[l];
							matchFoundFlag = true;
						}
					}
					if (matchFoundFlag)
					{
						tempCluster.addDataPoint(clusters[j].getDataPoint(k));
						clusters[j].removeDataPoint(clusters[j].getDataPoint(k));
						for (int m = 0; m &lt; clusters.length; m++)
						{
							clusters[m].getCentroid().calcCentroid();
						}
						calcSWCSS();
					}
				}
			}
		}
	}

	public Vector[] getClusterOutput()
	{
		Vector v[] = new Vector[clusters.length];
		for (int i = 0; i &lt; clusters.length; i++)
		{
			v[i] = clusters[i].getDataPoints();
		}
		return v;
	}

	private void setInitialCentroids()
	{
		// kn = (round((max-min)/k)*n)+min where n is from 0 to (k-1).
		double[] c = new double[7];
		for (int n = 1; n &lt;= clusters.length; n++)
		{
			for (int i = 1; i &lt; 8; i++)
			{
				c[i - 1] = (((getMaxXValue(i) - getMinXValue(i)) / (clusters.length + 1)) * n) + getMinXValue(i);
			}
			Centroid ce = new Centroid(c[0], c[1], c[2], c[3], c[4], c[5], c[6]);
			clusters[n - 1].setCentroid(ce);
			ce.setCluster(clusters[n - 1]);
		}
	}

	private double getMaxXValue(int avgnumber)
	{
		double temp = 0.0;
		switch (avgnumber)
		{
		case 1:// Archeological
			temp = ((DataPoint) mDataPoints.elementAt(0)).getAvg1();
			break;
		case 2:// Monuments
			temp = ((DataPoint) mDataPoints.elementAt(0)).getAvg2();
			break;
		case 3:// Museums
			temp = ((DataPoint) mDataPoints.elementAt(0)).getAvg3();
			break;
		case 4:// Buildings
			temp = ((DataPoint) mDataPoints.elementAt(0)).getAvg4();
			break;
		case 5:// Chapels
			temp = ((DataPoint) mDataPoints.elementAt(0)).getAvg5();
			break;
		case 6:// Beaches
			temp = ((DataPoint) mDataPoints.elementAt(0)).getAvg6();
			break;
		case 7:// Walking
			temp = ((DataPoint) mDataPoints.elementAt(0)).getAvg7();
			break;
		}
		for (int i = 0; i &lt; mDataPoints.size(); i++)
		{
			DataPoint dp = (DataPoint) mDataPoints.elementAt(i);
			switch (avgnumber)
			{
			case 1:// Archeological
				temp = (dp.getAvg1() &gt; temp) ? dp.getAvg1() : temp;
				break;
			case 2:// Monuments
				temp = (dp.getAvg2() &gt; temp) ? dp.getAvg2() : temp;
				break;
			case 3:// Museums
				temp = (dp.getAvg3() &gt; temp) ? dp.getAvg3() : temp;
				break;
			case 4:// Buildings
				temp = (dp.getAvg4() &gt; temp) ? dp.getAvg4() : temp;
				break;
			case 5:// Chapels
				temp = (dp.getAvg5() &gt; temp) ? dp.getAvg5() : temp;
				break;
			case 6:// Beaches
				temp = (dp.getAvg6() &gt; temp) ? dp.getAvg6() : temp;
				break;
			case 7:// Walking
				temp = (dp.getAvg7() &gt; temp) ? dp.getAvg7() : temp;
				break;
			}
		}
		return temp;
	}

	private double getMinXValue(int avgnumber)
	{
		double temp = 0.0;
		switch (avgnumber)
		{
		case 1:// Archeological
			temp = ((DataPoint) mDataPoints.elementAt(0)).getAvg1();
			break;
		case 2:// Monuments
			temp = ((DataPoint) mDataPoints.elementAt(0)).getAvg2();
			break;
		case 3:// Museums
			temp = ((DataPoint) mDataPoints.elementAt(0)).getAvg3();
			break;
		case 4:// Buildings
			temp = ((DataPoint) mDataPoints.elementAt(0)).getAvg4();
			break;
		case 5:// Chapels
			temp = ((DataPoint) mDataPoints.elementAt(0)).getAvg5();
			break;
		case 6:// Beaches
			temp = ((DataPoint) mDataPoints.elementAt(0)).getAvg6();
			break;
		case 7:// Walking
			temp = ((DataPoint) mDataPoints.elementAt(0)).getAvg7();
			break;
		}
		for (int i = 0; i &lt; mDataPoints.size(); i++)
		{
			DataPoint dp = (DataPoint) mDataPoints.elementAt(i);
			switch (avgnumber)
			{
			case 1:// Archeological
				temp = (dp.getAvg1() &lt; temp) ? dp.getAvg1() : temp;
				break;
			case 2:// Monuments
				temp = (dp.getAvg2() &lt; temp) ? dp.getAvg2() : temp;
				break;
			case 3:// Museums
				temp = (dp.getAvg3() &lt; temp) ? dp.getAvg3() : temp;
				break;
			case 4:// Buildings
				temp = (dp.getAvg4() &lt; temp) ? dp.getAvg4() : temp;
				break;
			case 5:// Chapels
				temp = (dp.getAvg5() &lt; temp) ? dp.getAvg5() : temp;
				break;
			case 6:// Beaches
				temp = (dp.getAvg6() &lt; temp) ? dp.getAvg6() : temp;
				break;
			case 7:// Walking
				temp = (dp.getAvg7() &lt; temp) ? dp.getAvg7() : temp;
				break;
			}
		}
		return temp;
	}

	public int getKValue()
	{
		return clusters.length;
	}

	public int getIterations()
	{
		return miter;
	}

	public int getTotalDataPoints()
	{
		return mDataPoints.size();
	}

	public double getSWCSS()
	{
		return mSWCSS;
	}

	public Cluster getCluster(int pos)
	{
		return clusters[pos];
	}
}
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Centroid.java</p>
<pre name="code" class="java">package eu.eodigos.kmean;

/**
 * @author daoger
 * @version 1.0
 * @k-mean Cluster
 */

class Centroid
{
	private double avgC1, avgC2, avgC3, avgC4, avgC5, avgC6, avgC7;

	private Cluster mCluster;

	public Centroid(double ac1, double ac2, double ac3, double ac4, double ac5, double ac6, double ac7)
	{
		this.avgC1 = ac1;
		this.avgC2 = ac2;
		this.avgC3 = ac3;
		this.avgC4 = ac4;
		this.avgC5 = ac5;
		this.avgC6 = ac6;
		this.avgC7 = ac7;
	}

	public void calcCentroid()
	{ // only called by CAInstance
		int numDP = mCluster.getNumDataPoints();
		double temp1 = 0, temp2 = 0, temp3 = 0, temp4 = 0, temp5 = 0, temp6 = 0, temp7 = 0;
		int i;
		// caluclating the new Centroid
		for (i = 0; i &lt; numDP; i++)
		{
			temp1 = temp1 + mCluster.getDataPoint(i).getAvg1();
			// total for avg1
			temp2 = temp2 + mCluster.getDataPoint(i).getAvg2();
			// total for avg1
			temp3 = temp3 + mCluster.getDataPoint(i).getAvg3();
			// total for avg1
			temp4 = temp4 + mCluster.getDataPoint(i).getAvg4();
			// total for avg1
			temp5 = temp5 + mCluster.getDataPoint(i).getAvg5();
			// total for avg1
			temp6 = temp6 + mCluster.getDataPoint(i).getAvg6();
			// total for avg1
			temp7 = temp7 + mCluster.getDataPoint(i).getAvg7();
			// total for avg1
		}
		this.avgC1 = temp1 / numDP;
		this.avgC2 = temp2 / numDP;
		this.avgC3 = temp3 / numDP;
		this.avgC4 = temp4 / numDP;
		this.avgC5 = temp5 / numDP;
		this.avgC6 = temp6 / numDP;
		this.avgC7 = temp7 / numDP;
		// calculating the new Euclidean Distance for each Data Point
		temp1 = 0;
		temp2 = 0;
		temp3 = 0;
		temp4 = 0;
		temp5 = 0;
		temp6 = 0;
		temp7 = 0;
		for (i = 0; i &lt; numDP; i++)
		{
			mCluster.getDataPoint(i).calcEuclideanDistance();
		}
		// calculate the new Sum of Squares for the Cluster
		mCluster.calcSumOfSquares();
	}

	public void setCluster(Cluster c)
	{
		this.mCluster = c;
	}

	public double getAvgC1()
	{
		return avgC1;
	}

	public void setAvgC1(double avgC1)
	{
		this.avgC1 = avgC1;
	}

	public double getAvgC2()
	{
		return avgC2;
	}

	public void setAvgC2(double avgC2)
	{
		this.avgC2 = avgC2;
	}

	public double getAvgC3()
	{
		return avgC3;
	}

	public void setAvgC3(double avgC3)
	{
		this.avgC3 = avgC3;
	}

	public double getAvgC4()
	{
		return avgC4;
	}

	public void setAvgC4(double avgC4)
	{
		this.avgC4 = avgC4;
	}

	public double getAvgC5()
	{
		return avgC5;
	}

	public void setAvgC5(double avgC5)
	{
		this.avgC5 = avgC5;
	}

	public double getAvgC6()
	{
		return avgC6;
	}

	public void setAvgC6(double avgC6)
	{
		this.avgC6 = avgC6;
	}

	public double getAvgC7()
	{
		return avgC7;
	}

	public void setAvgC7(double avgC7)
	{
		this.avgC7 = avgC7;
	}

	public Cluster getCluster()
	{
		return mCluster;
	}

}</pre>
<p>&nbsp;</p>
<p>Cluster.java</p>
<pre name="code" class="java">package eu.eodigos.kmean;

import java.util.Vector;

/**
 * @author daoger
 * @version 1.0
 * @k-mean Cluster
 */


class Cluster
{
	private String mName;

	private Centroid mCentroid;

	private double mSumSqr;

	private Vector&lt;DataPoint&gt; mDataPoints;

	public Cluster(String name)
	{
		this.mName = name;
		this.mCentroid = null; // will be set by calling setCentroid()
		mDataPoints = new Vector&lt;DataPoint&gt;();
	}

	public void setCentroid(Centroid c)
	{
		mCentroid = c;
	}

	public Centroid getCentroid()
	{
		return mCentroid;
	}

	public void addDataPoint(DataPoint dp) { // called from CAInstance
        dp.setCluster(this); // initiates a inner call to calcEuclideanDistance() in DP.
        this.mDataPoints.addElement(dp);
        calcSumOfSquares();
    }

	public void removeDataPoint(DataPoint dp)
	{
		this.mDataPoints.removeElement(dp);
		calcSumOfSquares();
	}

	public int getNumDataPoints()
	{
		return this.mDataPoints.size();
	}

	public DataPoint getDataPoint(int pos)
	{
		return (DataPoint) this.mDataPoints.elementAt(pos);
	}

	public void calcSumOfSquares()
	{ // called from Centroid
		int size = this.mDataPoints.size();
		double temp = 0;
		for (int i = 0; i &lt; size; i++)
		{
			temp = temp + ((DataPoint) this.mDataPoints.elementAt(i)).getCurrentEuDt();
		}
		this.mSumSqr = temp;
	}

	public double getSumSqr()
	{
		return this.mSumSqr;
	}

	public String getName()
	{
		return this.mName;
	}

	public Vector getDataPoints()
	{
		return this.mDataPoints;
	}

}</pre>
<p>&nbsp;</p>
<p>DataPoint.java</p>
<pre name="code" class="java">package eu.eodigos.kmean;

/**
 * @author daoger
 * @version 1.0
 * @k-mean Cluster
 */

public class DataPoint
{
	private double avg1, avg2, avg3, avg4, avg5, avg6, avg7;

	private Integer userid;

	private Cluster mCluster;

	private double mEuDt;

	public DataPoint(double avg1, double avg2, double avg3, double avg4, double avg5, double avg6, double avg7,
			Integer userid)
	{
		this.avg1 = avg1;
		this.avg2 = avg2;
		this.avg3 = avg3;
		this.avg4 = avg4;
		this.avg5 = avg5;
		this.avg6 = avg6;
		this.avg7 = avg7;
		this.userid = userid;
		this.mCluster = null;
	}

	public void setCluster(Cluster cluster)
	{
		this.mCluster = cluster;
		calcEuclideanDistance();
	}

	public void calcEuclideanDistance()
	{

		// called when DP is added to a cluster or when a Centroid is
		// recalculated.
		mEuDt = Math.sqrt(Math.pow((avg1 - mCluster.getCentroid().getAvgC1()), 2)
				+ Math.pow((avg2 - mCluster.getCentroid().getAvgC2()), 2)
				+ Math.pow((avg3 - mCluster.getCentroid().getAvgC3()), 2)
				+ Math.pow((avg4 - mCluster.getCentroid().getAvgC4()), 2)
				+ Math.pow((avg5 - mCluster.getCentroid().getAvgC5()), 2)
				+ Math.pow((avg6 - mCluster.getCentroid().getAvgC6()), 2)
				+ Math.pow((avg7 - mCluster.getCentroid().getAvgC7()), 2));
	}

	public double testEuclideanDistance(Centroid c)
	{
		return Math.sqrt(Math.pow((avg1 - c.getAvgC1()), 2) + Math.pow((avg2 - c.getAvgC2()), 2)
				+ Math.pow((avg3 - c.getAvgC3()), 2) + Math.pow((avg4 - c.getAvgC4()), 2)
				+ Math.pow((avg5 - c.getAvgC5()), 2) + Math.pow((avg6 - c.getAvgC6()), 2)
				+ Math.pow((avg7 - c.getAvgC7()), 2));
	}

	public double getAvg1()
	{
		return avg1;
	}

	public void setAvg1(double avg1)
	{
		this.avg1 = avg1;
	}

	public double getAvg2()
	{
		return avg2;
	}

	public void setAvg2(double avg2)
	{
		this.avg2 = avg2;
	}

	public double getAvg3()
	{
		return avg3;
	}

	public void setAvg3(double avg3)
	{
		this.avg3 = avg3;
	}

	public double getAvg4()
	{
		return avg4;
	}

	public void setAvg4(double avg4)
	{
		this.avg4 = avg4;
	}

	public double getAvg5()
	{
		return avg5;
	}

	public void setAvg5(double avg5)
	{
		this.avg5 = avg5;
	}

	public double getAvg6()
	{
		return avg6;
	}

	public void setAvg6(double avg6)
	{
		this.avg6 = avg6;
	}

	public double getAvg7()
	{
		return avg7;
	}

	public void setAvg7(double avg7)
	{
		this.avg7 = avg7;
	}

	public Cluster getCluster()
	{
		return mCluster;
	}

	public double getCurrentEuDt()
	{
		return mEuDt;
	}

	/**
	 * @return the userid
	 */
	public Integer getUserid()
	{
		return userid;
	}

	/**
	 * @param userid
	 *            the userid to set
	 */
	public void setUserid(Integer userid)
	{
		this.userid = userid;
	}

}
</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://daoger.javaeye.com/blog/211340#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><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 04 Jul 2008 09:30:24 +0800</pubDate>
        <link>http://daoger.javaeye.com/blog/211340</link>
        <guid>http://daoger.javaeye.com/blog/211340</guid>
      </item>
      <item>
        <title>A Tutorial on Clustering Algorithms</title>
        <author>daoger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://daoger.javaeye.com">daoger</a>&nbsp;
          链接：<a href="http://daoger.javaeye.com/blog/210394" style="color:red;">http://daoger.javaeye.com/blog/210394</a>&nbsp;
          发表时间: 2008年07月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div>
<p><strong><span style="font-size: small; font-family: Times New Roman, Times, serif;"><em>A Tutorial on Clustering Algorithms</em></span></strong></p>
<hr />
<p><strong><span style="font-size: x-small; font-family: Arial, Helvetica, sans-serif;">Clustering: An Introduction</span></strong></p>
<p align="justify"><span style="font-size: xx-small; font-family: Arial, Helvetica, sans-serif;"><em>What is Clustering?</em></span><br /><span style="font-family: Times New Roman, Times, serif;">Clustering can be considered the most important <em>unsupervised learning</em> problem; so, as every other problem of this kind, it deals with finding a <em>structure</em> in a collection of unlabeled data.<br />A loose definition of clustering could be &ldquo;the process of organizing objects into groups whose members are similar in some way&rdquo;.<br />A <em>cluster</em> is therefore a collection of objects which are &ldquo;similar&rdquo; between them and are &ldquo;dissimilar&rdquo; to the objects belonging to other clusters.<br />We can show this with a simple graphical example:</span></p>
<p><img src="../../../upload/picture/pic/17089/4677c777-a433-3d73-9212-58909419d824.gif" height="300" alt="" width="600" /></p>
<p align="justify"><span style="font-family: Times New Roman, Times, serif;">In this case we easily identify the 4 clusters into which the data can be divided; the similarity criterion is <em>distance</em>: two or more objects belong to the same cluster if they are &ldquo;close&rdquo; according to a given distance (in this case geometrical distance). This is called <em>distance-based clustering</em>.<br />Another kind of clustering is <em>conceptual clustering</em>: two or more objects belong to the same cluster if this one defines a concept <em>common</em> to all that objects. In other words, objects are grouped according to their fit to descriptive concepts, not according to simple similarity measures.</span></p>
<p>&nbsp;</p>
<p align="justify"><span style="font-size: xx-small; font-family: Arial, Helvetica, sans-serif;"><em>The Goals of Clustering</em></span><br /><span style="font-family: Times New Roman, Times, serif;">So, the goal of clustering is to determine the intrinsic grouping in a set of unlabeled data. But how to decide what constitutes a good clustering? It can be shown that there is no absolute &ldquo;best&rdquo; criterion which would be independent of the final aim of the clustering. Consequently, it is the user which must supply this criterion, in such a way that the result of the clustering will suit their needs.<br />For instance, we could be interested in finding representatives for homogeneous groups (<em>data reduction</em>), in finding &ldquo;natural clusters&rdquo; and describe their unknown properties (<em>&ldquo;natural&rdquo; data types</em>), in finding useful and suitable groupings (<em>&ldquo;useful&rdquo; data classes</em>) or in finding unusual data objects (<em>outlier detection</em>).</span></p>
<p align="justify">&nbsp;</p>
<p align="justify"><span style="font-size: xx-small; font-family: Arial, Helvetica, sans-serif;"><em>Possible Applications</em></span><br /><span style="font-family: Times New Roman, Times, serif;">Clustering algorithms can be applied in many fields, for instance:</span></p>
</div>
<ul>
<li>
<div><span style="font-family: Times New Roman, Times, serif;"><em>Marketing</em>: finding groups of customers with similar behavior given a large database of customer data containing their properties and past buying records;</span></div>
</li>
<li>
<div><span style="font-family: Times New Roman, Times, serif;"><em>Biology</em>: classification of plants and animals given their features;</span></div>
</li>
<li>
<div><span style="font-family: Times New Roman, Times, serif;"><em>Libraries</em>: book ordering;</span></div>
</li>
<li>
<div><span style="font-family: Times New Roman, Times, serif;"><em>Insurance</em>: identifying groups of motor insurance policy holders with a high average claim cost; identifying frauds;</span></div>
</li>
<li>
<div><span style="font-family: Times New Roman, Times, serif;"><em>City-planning</em>: identifying groups of houses according to their house type, value and geographical location;</span></div>
</li>
<li>
<div><span style="font-family: Times New Roman, Times, serif;"><em>Earthquake studies</em>: clustering observed earthquake epicenters to identify dangerous zones;</span></div>
</li>
<li>
<div><span style="font-family: Times New Roman, Times, serif;"><em>WWW</em>: document classification; clustering weblog data to discover groups of similar access patterns.</span></div>
</li>
</ul>
<div>
<p align="justify">&nbsp;</p>
<p align="justify"><span style="font-size: xx-small; font-family: Arial, Helvetica, sans-serif;"><em>Requirements</em></span><br /><span style="font-family: Times New Roman, Times, serif;">The main requirements that a clustering algorithm should satisfy are:</span></p>
</div>
<ul>
<li>
<div><span style="font-family: Times New Roman, Times, serif;">scalability;</span></div>
</li>
<li>
<div><span style="font-family: Times New Roman, Times, serif;">dealing with different types of attributes;</span></div>
</li>
<li>
<div><span style="font-family: Times New Roman, Times, serif;">discovering clusters with arbitrary shape;</span></div>
</li>
<li>
<div><span style="font-family: Times New Roman, Times, serif;">minimal requirements for domain knowledge to determine input parameters;</span></div>
</li>
<li>
<div><span style="font-family: Times New Roman, Times, serif;">ability to deal with noise and outliers;</span></div>
</li>
<li>
<div><span style="font-family: Times New Roman, Times, serif;">insensitivity to order of input records;</span></div>
</li>
<li>
<div><span style="font-family: Times New Roman, Times, serif;">high dimensionality;</span></div>
</li>
<li>
<div><span style="font-family: Times New Roman, Times, serif;">interpretability and usability.</span></div>
</li>
</ul>
<div>
<p>&nbsp;</p>
<p align="justify"><span style="font-size: xx-small; font-family: Arial, Helvetica, sans-serif;"><em>Problems</em></span><br /><span style="font-family: Times New Roman, Times, serif;">There are a number of problems with clustering. Among them:</span></p>
</div>
<ul>
<li>
<div><span style="font-family: Times New Roman, Times, serif;">current clustering techniques do not address all the requirements adequately (and concurrently);</span></div>
</li>
<li>
<div><span style="font-family: Times New Roman, Times, serif;">dealing with large number of dimensions and large number of data items can be problematic because of time complexity;</span></div>
</li>
<li>
<div><span style="font-family: Times New Roman, Times, serif;">the effectiveness of the method depends on the definition of &ldquo;distance&rdquo; (for distance-based clustering);</span></div>
</li>
<li>
<div><span style="font-family: Times New Roman, Times, serif;">if an <em>obvious</em> distance measure doesn&rsquo;t exist we must &ldquo;define&rdquo; it, which is not always easy, especially in multi-dimensional spaces;</span></div>
</li>
<li>
<div><span style="font-family: Times New Roman, Times, serif;">the result of the clustering algorithm (that in many cases can be arbitrary itself) can be interpreted in different ways.</span></div>
</li>
</ul>
<div>
<hr />
<p><strong><span style="font-size: x-small; font-family: Arial, Helvetica, sans-serif;">Clustering Algorithms</span></strong></p>
<p align="justify"><span style="font-size: xx-small; font-family: Arial, Helvetica, sans-serif;"><em>Classification</em></span><br /><span style="font-family: Times New Roman, Times, serif;">Clustering algorithms may be classified as listed below:</span></p>
</div>
<ul>
<li>
<div><span style="font-family: Times New Roman, Times, serif;">Exclusive Clustering</span></div>
</li>
<li>
<div><span style="font-family: Times New Roman, Times, serif;">Overlapping Clustering</span></div>
</li>
<li>
<div><span style="font-family: Times New Roman, Times, serif;">Hierarchical Clustering</span></div>
</li>
<li>
<div><span style="font-family: Times New Roman, Times, serif;">Probabilistic Clustering </span></div>
</li>
</ul>
<div>
<p align="justify"><span style="font-family: Times New Roman, Times, serif;">In the first case data are grouped in an exclusive way, so that if a certain datum belongs to a definite cluster then it could not be included in another cluster. A simple example of that is shown in the figure below, where the separation of points is achieved by a straight line on a bi-dimensional plane.<br />On the contrary the second type, the overlapping clustering, uses fuzzy sets to cluster data, so that each point may belong to two or more clusters with different degrees of membership. In this case, data will be associated to an appropriate membership value.</span></p>
<p align="center"><img src="../../../upload/picture/pic/17091/fb8af75c-1c0f-325c-b1b0-d2158fef6aa3.gif" height="237" alt="" width="260" /></p>
<p align="justify"><span style="font-family: Times New Roman, Times, serif;">Instead, a hierarchical clustering algorithm is based on the union between the two nearest clusters. The beginning condition is realized by setting every datum as a cluster. After a few iterations it reaches the final clusters wanted.<br />Finally, the last kind of clustering use a completely probabilistic approach.</span></p>
<p align="justify"><span style="font-family: Times New Roman, Times, serif;">In this tutorial we propose four of the most used clustering algorithms:</span></p>
</div>
<ul>
<li>
<div><span style="font-family: Times New Roman, Times, serif;">K-means</span></div>
</li>
<li>
<div><span style="font-family: Times New Roman, Times, serif;">Fuzzy C-means</span></div>
</li>
<li>
<div><span style="font-family: Times New Roman, Times, serif;">Hierarchical clustering</span></div>
</li>
<li>
<div><span style="font-family: Times New Roman, Times, serif;">Mixture of Gaussians</span></div>
</li>
</ul>
<p><span style="font-family: Times New Roman, Times, serif;">Each of these algorithms belongs to one of the clustering types listed above. So that, <a href="../kmeans.html">K-means</a> is an <em>exclusive clustering</em> algorithm, <a href="../cmeans.html">Fuzzy C-means</a> is an <em>overlapping clustering</em> algorithm, <a href="../hierarchical.html">Hierarchical clustering</a> is obvious and lastly <a href="../mixture.html">Mixture of Gaussian</a> is a <em>probabilistic clustering</em> algorithm. We will discuss about each clustering method in the following paragraphs.</span></p>
<p>&nbsp;</p>
<p><span style="font-size: xx-small; font-family: Arial, Helvetica, sans-serif;"><em>Distance Measure</em></span><br /><span style="font-family: Times New Roman, Times, serif;">An important component of a clustering algorithm is the distance measure between data points. If the components of the data instance vectors are all in the same physical units then it is possible that the simple Euclidean distance metric is sufficient to successfully group similar data instances. However, even in this case the Euclidean distance can sometimes be misleading. Figure shown below illustrates this with an example of the width and height measurements of an object. Despite both measurements being taken in the same physical units, an informed decision has to be made as to the relative scaling. As the figure shows, different scalings can lead to different clusterings.</span></p>
<p align="center"><img src="../../../upload/picture/pic/17093/476b5a43-b838-31b2-a7ee-6aec3f24924d.gif" height="268" alt="" width="549" /></p>
<p align="justify"><span style="font-family: Times New Roman, Times, serif;">Notice however that this is not only a graphic issue: the problem arises from the mathematical formula used to combine the distances between the single components of the data feature vectors into a unique distance measure that can be used for clustering purposes: different formulas leads to different clusterings.<br />Again, domain knowledge must be used to guide the formulation of a suitable distance measure for each particular application.</span></p>
<p align="left"><strong>Minkowski Metric<br /></strong>For higher dimensional data, a popular measure is the Minkowski metric, </p>
<p align="center"><img src="../../../upload/picture/pic/17095/fe9b8bf5-5e8b-35c4-ad80-88fec768d45c.gif" height="57" alt="" width="200" /></p>
<p align="justify">where <em>d</em> is the dimensionality of the data. The <em>Euclidean</em> distance is a special case where <em>p</em>=2, while <em>Manhattan</em> metric has <em>p</em>=1. However, there are no general theoretical guidelines for selecting a measure for any given application. </p>
<p>It is often the case that the components of the data feature vectors are not immediately comparable. It can be that the components are not continuous variables, like length, but nominal categories, such as the days of the week. In these cases again, domain knowledge must be used to formulate an appropriate measure.</p>
<p>&nbsp;</p>
<p align="justify"><span style="font-size: xx-small; font-family: Arial, Helvetica, sans-serif;"><em>Bibliography</em></span></p>
<ul>
<li><span style="font-family: Times New Roman, Times, serif;">Tariq Rashid: &ldquo;Clustering&rdquo;<br /><a href="http://www.cs.bris.ac.uk/home/tr1690/documentation/fuzzy_clustering_initial_report/node11.html">http://www.cs.bris.ac.uk/home/tr1690/documentation/fuzzy_clustering_initial_report/node11.html</a></span> </li>
<li><span style="font-family: Times New Roman, Times, serif;">Osmar R. Za&iuml;ane: &ldquo;Principles of Knowledge Discovery in Databases - Chapter 8: Data Clustering&rdquo;<br /><a href="http://www.cs.ualberta.ca/%7Ezaiane/courses/cmput690/slides/Chapter8/index.html">http://www.cs.ualberta.ca/~zaiane/courses/cmput690/slides/Chapter8/index.html</a></span> </li>
<li><span style="font-family: Times New Roman, Times, serif;">Pier Luca Lanzi: &ldquo;Ingegneria della Conoscenza e Sistemi Esperti &ndash; Lezione 2: Apprendimento non supervisionato&rdquo;<br /><a href="http://www.elet.polimi.it/upload/lanzi/corsi/icse/2002/Lezione%202%20-%20Apprendimento%20non%20supervisionato.pdf">http://www.elet.polimi.it/upload/lanzi/corsi/icse/2002/Lezione%202%20-%20Apprendimento%20non%20supervisionato.pdf</a></span> </li>
</ul>
<hr />
<p>来自于：<a href="http://home.dei.polimi.it/matteucc/Clustering/tutorial_html/index.html">http://home.dei.polimi.it/matteucc/Clustering/tutorial_html/index.html</a></p>
<p><a href="http://home.dei.polimi.it/matteucc/Clustering/tutorial_html/kmeans.html" title="Next Page" target="_blank">Next Page</a></p>
          <br/>
          <span style="color:red;">
            <a href="http://daoger.javaeye.com/blog/210394#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</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>Wed, 02 Jul 2008 09:50:28 +0800</pubDate>
        <link>http://daoger.javaeye.com/blog/210394</link>
        <guid>http://daoger.javaeye.com/blog/210394</guid>
      </item>
      <item>
        <title>flex和后端的数据交互(二)－－&lt;mx:request/&gt;和&lt;mx:form/&gt;</title>
        <author>daoger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://daoger.javaeye.com">daoger</a>&nbsp;
          链接：<a href="http://daoger.javaeye.com/blog/205894" style="color:red;">http://daoger.javaeye.com/blog/205894</a>&nbsp;
          发表时间: 2008年06月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          用actionscript给服务器请求添加参数难免会很麻烦，使用mx:request标签就可以解决这一问题，可以把他<br />嵌套到HTTPService标签中实现参数的提交。如下例所示：<br /><pre name="code" class="xml">
&lt;mx:request>
      &lt;txtPara>{txtPara.text}&lt;/txtPara>
 &lt;/mx:request>
</pre><br />其中txtPara是发送到服务器端参数的名城，标签体是参数值，而标签体的值就是下方文本框的值。<br />以下是完整的mxml文件：<br /><pre name="code" class="xml">
&lt;?xml version="1.0" encoding="utf-8"?>
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" >
	&lt;mx:Script>  
      &lt;![CDATA[  
        import mx.rpc.events.ResultEvent;              
		import mx.controls.Alert;                      
		private function httpHandle(e:ResultEvent):void 
		{
			Alert.show(e.result.Result);
		}
        ]]&gt;  
  	&lt;/mx:Script>  
	&lt;mx:HTTPService id="myHttp" url="http://localhost:8080/myflex/http" showBusyCursor="true" result="httpHandle(event);" useProxy="false">
		&lt;mx:request>
         	&lt;txtPara>{txtPara.text}&lt;/txtPara>
    	&lt;/mx:request>
	&lt;/mx:HTTPService>
	&lt;mx:Panel title="TEST HTTPService" width="368" height="140" x="78" y="30" layout="absolute">
	   	&lt;mx:Label text="PARA" x="110" y="26"/>  
	    &lt;mx:TextInput id="txtPara" x="161" y="24" width="95"/> 
	    &lt;mx:Label text="The para sent to service is:" x="58" y="53"/>
	    &lt;mx:Label x="126" y="53" id="lblResult"/>  
	    &lt;mx:Button label="Submit" click="myHttp.send()" x="277" y="53"/>   
	&lt;/mx:Panel>
&lt;/mx:Application>

</pre><br />在服务器端就可以从request中取到txtPara参数的值，这里没有做过多处理，只是在后端取到这个值又通过xml形式返还到客户端。<br />这是例子运行的截图：<br /><img src="http://daoger.javaeye.com/upload/picture/pic/16361/15ab0bd9-09cf-348a-b70e-633b21828fa4.jpg " /><br /><br />mx:request组件一般是结合mx:form组件一起使用，flex提供了完备的数据校验功能，如对字符串的校验mx:StringValidator、<br />对电话号码验证的mx:PhoneNumberValidator、对日期验证的mx:DateValidator、对电子邮件验证的mx:EmailValidator、对邮编验证<br />的mx:ZipCodeValidator等等。下面这个示例来自Flex的在线文档，主要展示flex的form验证功能，没有数据的提交。<br /><br /><pre name="code" class="xml">
&lt;?xml version="1.0" encoding="utf-8"?>
&lt;!-- Simple example to demonstrate Form layout container. -->
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
    &lt;mx:Panel title="Form Container Example" height="75%" width="75%" 
        paddingTop="10" paddingLeft="10" paddingRight="10" paddingBottom="10">
        &lt;mx:Text width="100%" color="blue"
            text="Moving from one form field to another triggers the validator."/>
        &lt;mx:Form width="100%" height="100%">
            &lt;mx:FormHeading label="Enter values into the form."/>
            &lt;mx:FormItem label="First name">
                &lt;mx:TextInput id="fname" width="200"/>
            &lt;/mx:FormItem>
            &lt;mx:FormItem label="Date of birth (mm/dd/yyyy)">
                &lt;mx:TextInput id="dob" width="200"/>
            &lt;/mx:FormItem>
            &lt;mx:FormItem label="E-mail address">
                &lt;mx:TextInput id="email" width="200"/>
            &lt;/mx:FormItem>
            &lt;mx:FormItem label="Age">
                &lt;mx:TextInput id="age" width="200"/>
            &lt;/mx:FormItem>
            &lt;mx:FormItem label="SSN">
                &lt;mx:TextInput id="ssn" width="200"/>
            &lt;/mx:FormItem>
            &lt;mx:FormItem label="Zip">
                &lt;mx:TextInput id="zip" width="200"/>
            &lt;/mx:FormItem>
            &lt;mx:FormItem label="Phone">
                &lt;mx:TextInput id="phone" width="200"/>
            &lt;/mx:FormItem>
        &lt;/mx:Form>
    &lt;/mx:Panel>

    &lt;mx:StringValidator source="{fname}" property="text" minLength="4" maxLength="12"/>
    &lt;mx:PhoneNumberValidator source="{phone}" property="text"/>
    &lt;mx:DateValidator source="{dob}" property="text"/>
    &lt;mx:EmailValidator source="{email}" property="text"/>
    &lt;mx:NumberValidator source="{age}" property="text" integerError="Enter Integer value"
        minValue="18" maxValue="100" domain="int"/>
    &lt;mx:SocialSecurityValidator source="{ssn}" property="text"/>
    &lt;mx:ZipCodeValidator source="{zip}" property="text"/>
&lt;/mx:Application>
</pre><br />示例运行的截图：<br /><img src="http://daoger.javaeye.com/upload/picture/pic/16363/5a079d1a-69b8-30db-8bf6-a251fe856f6e.jpg" /><br /><br />其他一些入门例子可以参考：甘先生Blog <a href="http://www.blogjava.net/gump/articles/22859.html" target="_blank">http://www.blogjava.net/gump/articles/22859.html</a><br />更多问题请参考Flex的在线文档：<a href="http://www.adobe.com/support/documentation/en/flex/" target="_blank">http://www.adobe.com/support/documentation/en/flex/</a>
          <br/>
          <span style="color:red;">
            <a href="http://daoger.javaeye.com/blog/205894#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><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 19 Jun 2008 17:12:25 +0800</pubDate>
        <link>http://daoger.javaeye.com/blog/205894</link>
        <guid>http://daoger.javaeye.com/blog/205894</guid>
      </item>
      <item>
        <title>flex和后端的数据交互(一)－－XML和HTTPService</title>
        <author>daoger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://daoger.javaeye.com">daoger</a>&nbsp;
          链接：<a href="http://daoger.javaeye.com/blog/204694" style="color:red;">http://daoger.javaeye.com/blog/204694</a>&nbsp;
          发表时间: 2008年06月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近学习flex，参考了不少网上的资料，特别是 中国flex开发者（http://www.flexer.cn/）。flex数据交互是一个关键，做个学习总结，请flex老鸟指正！<br /><br />flex和后端的数据交互有很多方式，flex可以使用ActionScript读写文件（xml、txt）的形式存储显示数据，<br />在Flex 3.0中新增了对本地数据库（.db格式）操作的类，可用于读取本地的数据库数据。新增了对PDF数据<br />操作的类，可用于读取PDF数据。<br /><br /><span style="font-size: medium">xml文件方式</span><br /><br />XML优点是简单小巧、存储方便、检索快速。所以，XML常用于数据存储和数据交换。Flex 3.使用URLLoader类可方便地传输XML数据。<br />使用XML方式传输数据的步骤如下所示。<br />新建名为"tree.xml"文件，用以存储XML数据:<br /><pre name="code" class="xml">
&lt;?xml version="1.0" encoding="utf-8"?>
&lt;menus>
    &lt;node label="Mail">
        &lt;node label="Inbox"/>
        &lt;node label="Personal Folder">
            &lt;node label="Demo"/>
            &lt;node label="Personal"/>
            &lt;node label="Saved Mail"/>
            &lt;node label="bar"/>
        &lt;/node>
        &lt;node label="Calendar"/>
        &lt;node label="Sent"/>
        &lt;node label="Trash"/>
    &lt;/node>
&lt;/menus>
</pre><br />xml文件的读写我们可以用FileStream类来实现：<br />读取xml文件：<br /><pre name="code" class="javascript">
   var testXML:XML;
   var file:File = File.documentsDirectory.resolvePath("tree.xml");
   var fileStream:FileStream = new FileStream();
   fileStream.open(file, FileMode.READ);
   testXML = XML(fileStream.readUTFBytes(fileStream.bytesAvailable));
   fileStream.close();
</pre><br />写回xml文件<br /><pre name="code" class="javascript">
   var testXML:XML=&lt;content>content&lt;/content>......;
   var file:File = File.documentsDirectory.resolvePath("tree.xml");
   var fileStream:FileStream = new FileStream();
   fileStream.open(file, FileMode.WRITE);
   var outputString:String = '&lt;?xml version="1.0" encoding="utf-8"?>\n';
   outputString += testXML.toXMLString();
   fileStream.writeUTFBytes(outputString);
   fileStream.close();
</pre><br />需要说明一下的是文件打开方式：FileMode<br />READ －－设置文件打开方式为只读<br />WRITE－－设置文件打开方式为写数据。文件不存在，则创建；文件存在，则覆盖原有数据。<br />APPEND－－设置文件打开方式为追加。文件不存在，则创建；文件存在，则新数据从文件末尾开始增加。<br />UPDATE－－设置文件打开方式为读写。文件不存在，则创建。设置该模式通常用于随机读写访问文件。可以从文件的任意位置读取，写入数据时，只有写入位置的存在字节被覆盖，其他所有字节不受影响。<br /><br />这里我们使用URLRequest类来加载xml数据，编写应用程序初始化处理函数loadXML。<br />变量，用以指明XML文件路径。<br />public function loadXML():void//应用程序初始化处理函数<br />{<br />    //定义URLRequest实例，指定文件地址。<br />    var request:URLRequest=new URLRequest("tree.xml");<br />    loader.load(request);//加载XML文件<br />    loader.addEventListener(Event.COMPLETE,completeHandle);     //添加加载完成时的监听<br />}<br /><br />loader.addEventListener(Event.COMPLETE,completeHandle)语句表示添加对XML加载完成事件的监听。一旦加载完成执行<br />completeHandle函数。完成剩余MXML代码。剩余代码包括completeHandle函数，&lt;mx:Tree>组件设计等。<br />以下代码是完整的MXML代码。<br /><pre name="code" class="java">
&lt;?xml version="1.0" encoding="utf-8"?>
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" fontFamily="simsun" 
	fontSize="12" layout="absolute" width="242" height="442" creationComplete="loadXML()">
    &lt;mx:Script>
          &lt;![CDATA[
            import mx.collections.ArrayCollection; 
            import mx.rpc.events.ResultEvent;       
            public var loader:URLLoader=new URLLoader();
            public var menus:XML=new XML();         
            public function loadXML():void          
            {
                var request:URLRequest=new URLRequest("tree.xml");
                loader.load(request); 
                loader.addEventListener(Event.COMPLETE,completeHandle);
            }
            public function completeHandle(e:Event):void
            {
                menus=XML(loader.data);            
                var results:XMLList=menus.node;    
                tree.dataProvider=results; 
            }
          ]]&gt;
    &lt;/mx:Script>

    &lt;mx:Tree id="tree" x="10" y="35" width="218" height="397" labelField="@label" />
    &lt;mx:Label x="10" y="10" text="Tree Nodes From XML File"/>
 &lt;/mx:Application>
</pre><br />这是运行结果截图：<br /><img src="http://daoger.javaeye.com/upload/picture/pic/16203/d463c17d-8e54-32c0-99d4-f1bcee7a8a6a.jpg" /><br /><br /><br /><span style="font-size: medium">&lt;mx:HTTPService>组件方式</span><br /><br /><br />&lt;mx:HTTPService>组件可与所有的后端程序交互。例如，ASP、ASP.Net、JSP、PHP等。<br />以下是一个&lt;mx:HTTPService>组件语法示例：<br />&lt;mx:HTTPService id="feedRequest" url="http://localhost:8080/myflex/helloworld?para_1=para_1&para_2=para_2" result="showResult(event)" /><br />id唯一标识该组件，url是数据提交的地址，可以在地址后面添加参数，提交到后端进行处理，处理后<br />再返回Flex可识别的数据类型，如数组型、XML型、Object型等。<br /><br />&lt;mx:HTTPService>组件返回的数据存储于ResultEvent类中。使用&lt;mx:HTTPService>组件的result事件可处理HTTP程序返回的数据。<br />eg. &lt;mx:HTTPService result="处理函数名"><br /><br />返回的数据存储于ResultEvent类的result属性下。各种数据的具体位置与HTTP程序的处理结果有关。<br />数据返回后的处理方法示例：<br /><pre name="code" class="java">
import mx.rpc.events.ResultEvent;                       
import mx.controls.Alert;                              

private function showResult(e:ResultEvent):void
{
    Alert.show(e.result as String);                    
}
</pre><br /><br />来一个简单的例子会让你更加明白的！<br /><br />这是客户端mxml的源代码：<br /><pre name="code" class="xml">
&lt;?xml version="1.0" encoding="utf-8"?>
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" >
	&lt;mx:Script>  
      &lt;![CDATA[  
        import mx.rpc.events.ResultEvent;              
		import mx.controls.Alert;                   
		
		private var arr:Array=new Array();             
		private function addHandle():void           
		{
		    myHttp.url="http://localhost:8080/myflex/sum";                                                     
		    if(arr.length>0)                           
		        myHttp.url+="?";
		    for(var i:int=0;i&lt;arr.length;i++)           
		    {
		        if(i!=arr.length-1)
		            myHttp.url+="num="+arr[i].para.toString()+"&";
		        else
		            myHttp.url+="num="+arr[i].para.toString();
		    }
		    Alert.show(myHttp.url);
		    myHttp.send();                       
		}
		
		private function addData():void         
		{
		    var obj:Object=new Object();           
		    obj.para=txtPara.text;                
		    arr.push(obj);                        
		    dg.dataProvider=arr;                   
		    txtPara.text="";                     
		    dg.validateNow();                      
		}
		
		private function delData():void         
		{
		    arr=new Array();                             
		    dg.dataProvider=arr;                 
		    dg.validateNow();                      
		}
		
		private function httpHandle(e:ResultEvent):void
		{
			lblResult.text=e.result.sumTag;
		}
        ]]&gt;  
  	&lt;/mx:Script>  
	&lt;mx:HTTPService id="myHttp" showBusyCursor="true" result="httpHandle(event);" useProxy="false"/>
	&lt;mx:Panel title="测试HTTPService" width="368" height="334" x="78" y="30" layout="absolute">
	    &lt;mx:Label text="叠加参数：" x="110" y="26"/>
	    &lt;mx:TextInput id="txtPara" x="161" y="24" width="95"/> 
	    &lt;mx:DataGrid id="dg" x="76" y="64" height="166" width="179">
	        &lt;mx:columns>
	            &lt;mx:DataGridColumn dataField="para" headerText="参数列表"/>
	        &lt;/mx:columns>
	    &lt;/mx:DataGrid>
	    &lt;mx:Button label="添加" click="addData();" x="277" y="26"/>  
	    &lt;mx:Button label="删除" click="delData();" x="277" y="64"/>  
	    &lt;mx:Label text="叠加结果是：" x="58" y="253"/>
	    &lt;mx:Label x="126" y="253" id="lblResult"/>  
	    &lt;mx:Button label="计算" click="addHandle();" x="277" y="249"/>   
	&lt;/mx:Panel>
&lt;/mx:Application>

</pre><br />"http://localhost:8080/myflex/sum"是一个servlet的映射地址，actionscript方法addHandle将每一个数字参数添加到url映射地<br />址后面并且向服务器发送请求，addData方法把输入的数字显示到下方列表，delData方法删除整个列表，httpHandle方法处理服务器<br />的返回值。其中e.result.sumTag表示取得xml返回数据中sumTag标签中的内容。<br />以下是servlet中对接收参数的处理：<br /><pre name="code" class="java">
public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException
	{
		String[] para = request.getParameterValues("num");
		int sum = 0;
		if (para != null)
		{
			for (int i = 0; i &lt; para.length; i++)
			{
				if (para[i] != null && !"".equals(para[i]))
				{
					sum = sum + Integer.parseInt(para[i]);
				}
			}
		}
		response.getWriter().print(
				"&lt;?xml version=\"1.0\" encoding=\"utf-8\"?>&lt;sumTag>" + sum
						+ "&lt;/sumTag>");
	}
</pre><br /><br />下面是例子运行的截图：<br /><img src="http://daoger.javaeye.com/upload/picture/pic/16215/9e383c97-9695-3820-a249-f099e94baf1f.jpg" /><br /><br />下一次学习总结一下&lt;mx:WebService>组件和RemoteObject及其他的交互方式！
          <br/>
          <span style="color:red;">
            <a href="http://daoger.javaeye.com/blog/204694#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</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, 17 Jun 2008 15:15:00 +0800</pubDate>
        <link>http://daoger.javaeye.com/blog/204694</link>
        <guid>http://daoger.javaeye.com/blog/204694</guid>
      </item>
      <item>
        <title>linux 定时任务</title>
        <author>daoger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://daoger.javaeye.com">daoger</a>&nbsp;
          链接：<a href="http://daoger.javaeye.com/blog/201693" style="color:red;">http://daoger.javaeye.com/blog/201693</a>&nbsp;
          发表时间: 2008年06月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          cron是linux下的执行定时任务的工具，对于还没有添加定时任务的系统，初次设置时要在/var/spool/cron/下建立一个文件名和用户名相同的文件；内容示例：<pre name="code" class="java">
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.9205 installed on Mon Oct 15 10:44:32 2007)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
1 * * * * /syn_time.sh
</pre><br />前半部分是类似于quartz的时间格式，几个时间格式点依次表示：<br />分钟 (0-59),<br />小时 (0-23),<br />月份中的某一天 (1-31),<br />一年中的某一月 (1-12),<br />一周中的星期几 (0-6 with 0=Sunday).<br /><br />后半段是要执行的定时任务文件，例子中该文件是在根目录下。<br /><br />重启cron服务就可以了：<br />/sbin/service crond start //启动服务<br />/sbin/service crond stop //关闭服务<br />/sbin/service crond restart //重启服务<br />/sbin/service crond reload //重新载入<br /><br />也可以将这个服务在系统启动的时候自动启动：<br /><br />在/etc/rc.d/rc.local这个脚本的末尾加上：<br />/sbin/service crond start<br />eg.<br /><pre name="code" class="java">
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local
/sbin/service crond start
</pre><br /><br /><br />crontab相关命令<br /><br />crontab <br />-u //设定某个用户的cron服务，一般root用户在执行这个命令的时候需要此参数<br />-l //列出某个用户cron服务的详细内容<br />-r //删除没个用户的cron服务<br />-e //编辑某个用户的cron服务<br /><br />查看自己的cron设置：crontab -u root -l<br />删除fred的cron设置：crontab -u fred -r<br /><br />在编辑cron服务时，编辑的内容有一些格式和约定，输入：crontab -u root -e<br /><br />进入vi编辑模式，编辑的内容一定要符合下面的格式：*/1 * * * * ls >> /tmp/ls.txt
          <br/>
          <span style="color:red;">
            <a href="http://daoger.javaeye.com/blog/201693#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</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, 10 Jun 2008 10:40:13 +0800</pubDate>
        <link>http://daoger.javaeye.com/blog/201693</link>
        <guid>http://daoger.javaeye.com/blog/201693</guid>
      </item>
      <item>
        <title>linux基本应用命令汇总</title>
        <author>daoger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://daoger.javaeye.com">daoger</a>&nbsp;
          链接：<a href="http://daoger.javaeye.com/blog/199615" style="color:red;">http://daoger.javaeye.com/blog/199615</a>&nbsp;
          发表时间: 2008年06月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          项目中有些和linux相关的工作分给了我，正好我也想学习一下linux系统；公司的机器慢的要命，以后打算在linux系统下开发了，家里的机子也装了一个linux suse 10。<br /><br />对我现在用到的命令做个汇总，命令中的具体参数，help里都有，随用随查！以后随着应用深入再添加！命令欠妥之处，还请指正！<br /><br /><br />1. 打开目录：cd [Directory Name]<br /><br />2. 显示文件：ls<br />   同时显示操作权限 ls -lh<br /><br />3. 删除文件：rm [-dfirv][--help][--version][Directory Name]<br />rm指令可删除文件或目录，如欲删除目录必须加上参数"-r"，否则预设仅会删除文件。 <br />参　　数：<br />　-d或--directory 　直接把欲删除的目录的硬连接数据删成0，删除该目录。 <br />　-f或--force 　强制删除文件或目录。 <br />　-i或--interactive 　删除既有文件或目录之前先询问用户。 <br />　-r或-R或--recursive 　递归处理，将指定目录下的所有文件及子目录一并处理。 <br />　-v或--verbose 　显示指令执行过程。 <br />　--help 　在线帮助。 <br />　--version 　显示版本信息。<br /><br />4. 删除目录：rmdir [-p][--help][--ignore-fail-on-non-empty][--verbose][--version][Directory Name]<br />当有空目录要删除时，可使用rmdir指令。<br />参　　数：<br />  -p或--parents   删除指定目录后，若该目录的上层目录已变成空目录，则将其一并删除。<br />  --help   在线帮助。<br />  --ignore-fail-on-non-empty   忽略非空目录的错误信息。<br />  --verbose   显示指令执行过程。<br />  --version   显示版本信息。<br /><br />5. 打开文件： <br />vi filename :打开或新建文件，并将光标置于第一行首 <br />vi +n filename ：打开文件，并将光标置于第n行首 <br />vi + filename ：打开文件，并将光标置于最后一行首 <br />vi +/pattern filename：打开文件，并将光标置于第一个与pattern匹配的串处 <br />vi -r filename ：在上次正用vi编辑时发生系统崩溃，恢复filename <br />vi filename....filename ：打开多个文件，依次进行编辑 <br /><br />6. 复制文件：cp||scp (File Name) (Target Directroy Name)<br />cp [-abdfilpPrRsuvx][-S &lt;备份字尾字符串>][-V &lt;备份方式>][--help][--spares=&lt;使用时机>][--version][源文件或目录][目标文件或目录] [目的目录] <br />cp指令用在复制文件或目录，如同时指定两个以上的文件或目录，且最后的目的地是一个已经存在的目录，则它会把前面指定的所有文件或目录复制到该目录中。若同时指定多个文件或目录，而最后的目的地并非是一个已存在的目录，则会出现错误信息。<br /><br />参　　数：<br />　-a或--archive 　此参数的效果和同时指定"-dpR"参数相同。 <br />　-b或--backup 　删除，覆盖目标文件之前的备份，备份文件会在字尾加上一个备份字符串。 <br />　-d或--no-dereference 　当复制符号连接时，把目标文件或目录也建立为符号连接，并指向与源文件或目录连接的原始文件或目录。 <br />　-f或--force 　强行复制文件或目录，不论目标文件或目录是否已存在。 <br />　-i或--interactive 　覆盖既有文件之前先询问用户。 <br />　-l或--link 　对源文件建立硬连接，而非复制文件。 <br />　-p或--preserve 　保留源文件或目录的属性。 <br />　-P或--parents 　保留源文件或目录的路径。 <br />　-r 　递归处理，将指定目录下的文件与子目录一并处理。 <br />　-R或--recursive 　递归处理，将指定目录下的所有文件与子目录一并处理。 <br />　-s或--symbolic-link 　对源文件建立符号连接，而非复制文件。 <br />　-S&lt;备份字尾字符串>或--suffix=&lt;备份字尾字符串> 　用"-b"参数备份目标文件后，备份文件的字尾会被加上一个备份字符串，预设的备份字尾字符串是符号"~"。 <br />　-u或--update 　使用这项参数后只会在源文件的更改时间较目标文件更新时或是　名称相互对应的目标文件并不存在，才复制文件。 <br />　-v或--verbose 　显示指令执行过程。 <br />　-V&lt;备份方式>或--version-control=&lt;备份方式> 　用"-b"参数备份目标文件后，备份文件的字尾会被加上一个备份字符串，这字符串不仅可用"-S"参数变更，当使用"-V"参数指定不同备份方式时，也会产生不同字尾的备份字串。  <br />　-x或--one-file-system 　复制的文件或目录存放的文件系统，必须与cp指令执行时所处的文件系统相同，否则不予复制。 <br />　--help 　在线帮助。 <br />　--sparse=&lt;使用时机> 　设置保存稀疏文件的时机。 <br />　--version 　显示版本信息。<br /><br />7. 解压缩：tar||unzip (Parameter eg. xvfz) (File Name)<br /><br />8. 查看进程：ps -ef|grep (Process Name)<br /><br />9. 杀死进程：kill (Process No.)<br /><br />10. 显示当前目录：pwd <br /><br />11. 修改用户密码：passwd (User Name)<br /><br />12. 查找文件或目录：find (target directory)  -options [-print -exec -ok ...]<br /><br />pathname: find命令所查找的目录路径。例如用.来表示当前目录，用/来表示系统根目录。<br />-print： find命令将匹配的文件输出到标准输出。<br />-exec： find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {  } \;，注意{   }和\；之间的空格。<br />-ok： 和-exec的作用相同，只不过以一种更为安全的模式来执行该参数所给出的shell命令，在执行每一个命令之前，都会给出提示，让用户来确定是否执行。<br /><br />find命令选项<br />-name <br />按照文件名查找文件。<br /><br />-perm <br />按照文件权限来查找文件。<br /><br />-prune <br />使用这一选项可以使find命令不在当前指定的目录中查找，如果同时使用-depth选项，那么-prune将被find命令忽略。<br /><br />-user <br />按照文件属主来查找文件。<br /><br />-group <br />按照文件所属的组来查找文件。<br /><br />-mtime -n +n <br />按照文件的更改时间来查找文件， - n表示文件更改时间距现在n天以内，+ n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime 选项，但它们都和-m time选项。<br /><br />-nogroup <br />查找无有效所属组的文件，即该文件所属的组在/etc/groups中不存在。<br /><br />-nouser <br />查找无有效属主的文件，即该文件的属主在/etc/passwd中不存在。<br />-newer file1 ! file2 <br /><br />查找更改时间比文件file1新但比文件file2旧的文件。<br />-type <br /><br />查找某一类型的文件，诸如：<br /><br />b - 块设备文件。<br />d - 目录。<br />c - 字符设备文件。<br />p - 管道文件。<br />l - 符号链接文件。<br />f - 普通文件。<br /><br />-size n：[c] 查找文件长度为n块的文件，带有c时表示文件长度以字节计。<br />-depth：在查找文件时，首先查找当前目录中的文件，然后再在其子目录中查找。<br />-fstype：查找位于某一类型文件系统中的文件，这些文件系统类型通常可以在配置文件/etc/fstab中找到，该配置文件中包含了本系统中有关文件系统的信息。<br /><br />-mount：在查找文件时不跨越文件系统mount点。<br />-follow：如果find命令遇到符号链接文件，就跟踪至链接所指向的文件。<br />-cpio：对匹配的文件使用cpio命令，将这些文件备份到磁带设备中。<br /><br /><br />13. 服务器重启：init 6<br /><br />14. 切换到oracle用户：su - oracle (- 执行一下数据库配置)<br />15. 导出数据库db文件：exp DbUserName/DbPassword@DbServerName file=(Target Directory Name and File Name) <br />eg. exp fctz2/fctz2@ora file=/usr/fctz2.dmp full=yes<br />(full 参数标明导出与该用户关联的所有对象)<br />16. 导入数据库db文件：imp DbUserName/DbPassword@DbServerName file=(Target Directory Name and File Name) full=yes<br />17. 修改文件操作权限：<br />r: 对应数值4<br />w: 对应数值2<br />x：对应数值1<br />－：对应数值0<br /><br />chmod 权限数值和  文件名称 <br />eg.chmod 777 as.sh
          <br/>
          <span style="color:red;">
            <a href="http://daoger.javaeye.com/blog/199615#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</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, 03 Jun 2008 09:32:58 +0800</pubDate>
        <link>http://daoger.javaeye.com/blog/199615</link>
        <guid>http://daoger.javaeye.com/blog/199615</guid>
      </item>
      <item>
        <title>标题列表的截取和样式定义</title>
        <author>daoger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://daoger.javaeye.com">daoger</a>&nbsp;
          链接：<a href="http://daoger.javaeye.com/blog/195645" style="color:red;">http://daoger.javaeye.com/blog/195645</a>&nbsp;
          发表时间: 2008年05月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          很多网站的主页上都有标题列表，当标题长度过长时，截取一定的长度，超过长度的部分一般用省略号显示。我发现有很多开发人员都是在后台做处理，其实不用那么麻烦，页面中用css控制就可以！<br /><img src="http://daoger.javaeye.com/upload/picture/pic/14873/3bbfe25b-f3c3-3184-8e2a-0db50d6e5282.jpg" /><br />示例代码：<pre name="code" class="java">&lt;div style="width:225px;text-overflow:ellipsis;overflow: hidden;">
asdfl;kasjdf;kasjdflkasdjfsdfasdlkjfa;lsdkfjas;ldkjfls;kdf
asdfl;kasjdf;kasjdflkasdjfsdfasdlkjfa;lsdkfjas;ldkjfls;kdf
asdfl;kasjdf;kasjdflkasdjfsdfasdlkjfa;lsdkfjas;ldkjfls;kd
&lt;/div></pre><br /><br />关键的属性是：text-overflow和overflow：<br /><br />text-overflow : clip | ellipsis <br /> <br />参数： <br />clip : 　不显示省略标记（...），而是简单的裁切 <br />ellipsis : 　当对象内文本溢出时显示省略标记（...） <br />说明： 设置或检索是否使用一个省略标记（...）标示对象内文本的溢出。<br /><br />overflow : visible | auto | hidden | scroll <br /> <br />参数： <br />visible : 　不剪切内容也不添加滚动条。假如显式声明此默认值，对象将被剪切为包含对象的window或frame的大小。并且clip属性设置将失效 <br />auto : 　此为body对象和textarea的默认值。在需要时剪切内容并添加滚动条 <br />hidden : 　不显示超过对象尺寸的内容<br />scroll : 　总是显示滚动条 <br />说明：检索或设置当对象的内容超过其指定高度及宽度时如何管理内容。设置textarea对象为hidden值将隐藏其滚动条。对于table来说，假如table-layout属性设置为fixed，则td对象支持带有默认值为hidden的overflow属性。如果设为hidden，scroll或者auto，那么超出td尺寸的内容将被剪切。如果设为visible，将导致额外的文本溢出到右边或左边（视direction属性设置而定）的单元格。自IE5开始，此属性在MAC平台上可用。 <br /><br />当然这只是一个示例，大多数的列表显示还是经常用ul标签嵌套li标签来实现。<br />标题列表也可以用css实现多种显示格式：<br />例如：<img src="http://daoger.javaeye.com/upload/picture/pic/14877/6c1fcc26-fad2-3a9d-9cc1-466aadf7ceaa.bmp" /><br /><br /><pre name="code" class="java">
&lt;ul id=txt style="line-height:18px;display: list-item; list-style-position: inside;list-style-type:upper-roman; margin-left:0px;"> 
&lt;li>这是一个名字叫小强的列表项目。他难道不是很可爱吗？&lt;/li>
&lt;li>这是一个名字叫小强的列表项目。他难道不是很可爱吗？&lt;/li>
&lt;li>这是一个名字叫小强的列表项目。他难道不是很可爱吗？&lt;/li>
&lt;/ul>
</pre><br /><br />关键属性是：list-style-type<br /><br />list-style-type : disc | circle | square | decimal | lower-roman | upper-roman | lower-alpha | upper-alpha | none | armenian | cjk-ideographic | georgian | lower-greek | hebrew | hiragana | hiragana-iroha | katakana | katakana-iroha | lower-latin | upper-latin <br /> <br />参数： <br />disc : 　CSS1　实心圆<br />circle : 　CSS1　空心圆<br />square : 　CSS1　实心方块<br />decimal : 　CSS1　阿拉伯数字<br />lower-roman : 　CSS1　小写罗马数字<br />upper-roman : 　CSS1　大写罗马数字<br />lower-alpha : 　CSS1　小写英文字母<br />upper-alpha : 　CSS1　大写英文字母<br />none : 　CSS1　不使用项目符号<br />armenian : 　CSS2　传统的亚美尼亚数字<br />cjk-ideographic : 　CSS2　浅白的表意数字<br />georgian : 　CSS2　传统的乔治数字<br />lower-greek : 　CSS2　基本的希腊小写字母<br />hebrew : 　CSS2　传统的希伯莱数字<br />hiragana : 　CSS2　日文平假名字符<br />hiragana-iroha : 　CSS2　日文平假名序号<br />katakana : 　CSS2　日文片假名字符<br />katakana-iroha : 　CSS2　日文片假名序号<br />lower-latin : 　CSS2　小写拉丁字母<br />upper-latin : 　CSS2　大写拉丁字母 <br />说明：设置或检索对象的列表项所使用的预设标记。<br />若list-style-image属性为none或指定图像不可用时，list-style-type属性将发生作用。仅作用于具有display值等于list-item的对象（如li对象）。<br />注意：ol对象和ul对象的type特性为其后的所有列表项目（如li对象）指明列表属性。
          <br/>
          <span style="color:red;">
            <a href="http://daoger.javaeye.com/blog/195645#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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 22 May 2008 14:29:39 +0800</pubDate>
        <link>http://daoger.javaeye.com/blog/195645</link>
        <guid>http://daoger.javaeye.com/blog/195645</guid>
      </item>
      <item>
        <title>quartz 在WEB中应用小结</title>
        <author>daoger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://daoger.javaeye.com">daoger</a>&nbsp;
          链接：<a href="http://daoger.javaeye.com/blog/195486" style="color:red;">http://daoger.javaeye.com/blog/195486</a>&nbsp;
          发表时间: 2008年05月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          前一个项目曾经用到过quartz，没好好总结一下，现在的项目中又用到了，害得我又花了查了两天查资料、做测试！现在OK了，系统目前运行正常，做个小结。<br /><br />1. 基本配置<br /><br />官网上有quartz的所有版本，下一个，把quartz-all-*.jar(根据需要)添加到lib目录中，在classpath目录添加quartz.properties属性文件，接下来你就可以进行开发了。<br />这是quartz.properties的基本配置。<br /><pre name="code" class="java">

#============================================================================
# Configure Main Scheduler Properties  
#============================================================================

org.quartz.scheduler.instanceName = TestScheduler
org.quartz.scheduler.instanceId = AUTO

#============================================================================
# Configure ThreadPool  
#============================================================================

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 3
org.quartz.threadPool.threadPriority = 5

#============================================================================
# Configure JobStore  
#============================================================================

org.quartz.jobStore.misfireThreshold = 60000

org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

</pre><br /><br />2. web基本应用<br /><br />quartz在web项目中有多种应用方式，和项目使用的其他技术也有关系。<br /><br />添加一个servlet，将它配置到web.xml中：<br /><br /><pre name="code" class="java">
&lt;servlet>
		&lt;servlet-name>QuartzStartupServlet&lt;/servlet-name>
		&lt;servlet-class>com.StartupServlet&lt;/servlet-class>
		&lt;load-on-startup>1&lt;/load-on-startup>
&lt;/servlet>
</pre><br /><br />这样你就可以在这个servlet中，在服务器加载的时候同时加载定时任务：<br /><br /><pre name="code" class="java">
public void init(ServletConfig cfg) throws javax.servlet.ServletException
	{
		log.info("server start!");
		initScheduler(cfg);
	}

	protected void initScheduler(ServletConfig cfg)
	{
		try
		{
			SchedulerFactory sf = new StdSchedulerFactory();
			Scheduler scheduler = sf.getScheduler();
			SimpleExample simpleExample = new SimpleExample(scheduler);
			simpleExample.run();
		} catch (Exception e)
		{
			log.error(e);
		}
	}
</pre><br /><br />任务定义和加载在quartz的示例中有，这里不多费口舌了。<br /><br />3. xml形式的任务配置<br /><br />xml形式的应用，需要使用quartz的xml支持插件，只需有实现Job接口的任务就可以；这时需要在web.xml中添加默认的servlet配置：<br /><br /><pre name="code" class="java">
&lt;servlet>
		&lt;display-name>Quartz Initializer Servlet&lt;/display-name>
		&lt;servlet-name>QuartzInitializer&lt;/servlet-name>
		&lt;servlet-class>
			org.quartz.ee.servlet.QuartzInitializerServlet
		&lt;/servlet-class>
		&lt;load-on-startup>1&lt;/load-on-startup>
	&lt;/servlet>
</pre><br /><br />在quartz.properties中添加xml配置需要的参数：<br /><br /><pre name="code" class="java">
#============================================================================
# Configure Plugins 
#============================================================================

org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin

org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
org.quartz.plugin.jobInitializer.fileNames = jobs.xml
org.quartz.plugin.jobInitializer.overWriteExistingJobs = true
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.jobInitializer.scanInterval = 10
org.quartz.plugin.jobInitializer.wrapInUserTransaction = false</pre><br />上面配置中的fileNames是指向的classpath根目录。<br /><br />在xml文件中定义任务名称和触发器，例如：<pre name="code" class="java">
&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;quartz>
	&lt;job>
		&lt;job-detail>
			&lt;name>dailybalance&lt;/name>
			&lt;group>balance&lt;/group>
			&lt;job-class>com.SimpleJob&lt;/job-class>
		&lt;/job-detail>
		&lt;trigger>
			&lt;cron>
				&lt;name>dailybalancetrigger&lt;/name>
				&lt;group>balance&lt;/group>
				&lt;job-name>dailybalance&lt;/job-name>
				&lt;job-group>balance&lt;/job-group>
				&lt;cron-expression>0/50 * * * * ?&lt;/cron-expression>
			&lt;/cron>
		&lt;/trigger>
	&lt;/job>
&lt;/quartz>
</pre><br />这样就OK了！几种配置可以同时应用，不会冲突！<br /><br />4. quartz的动态时间管理<br /><br />有时需要在不停止web服务的情况下修改任务的执行时间格式，网上的资料大多是在使用spring框架支持时如何动态管理时间格式的介绍。在使用spring支持时可以，不使用spring时更加简单。<br /><br />动态时间管理的关键是要共享调度管理器对象Scheduler，我们可以在最初加载任务调度的时候将它添加到servlet上下文中。<br /><pre name="code" class="java">
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = sf.getScheduler();
......
......
cfg.getServletContext().setAttribute(SCHEDULER_KEY, scheduler);
scheduler.start();
</pre><br />这样，我们就可以在需要修改时间格式的地方使用了！下面的ctt变量就是一个ServletContext对象。通过Scheduler 的getTrigger方法取到触发器，用触发器对象的getCronExpression方法可以获得时间格式。之后你可以另外创建一个同名的触发器，也可以修改现有触发器，再让调度管理器重新加载到内存就可以了！<br /><pre name="code" class="java">
/**
	 * reset quartz job time
	 */
	public void reSetLotteryLoseBiddingTime(int lotteryType, Date date)
	{
		scheduler = (Scheduler) this.ctt.getAttribute(TIMING_WORK_SCHEDULER);
		try
		{
			String lotteryName = "";
			switch (lotteryType)
			{
			case 1://
				lotteryName = "ssq";
				break;
			case 2:// 
			{
				lotteryName = "3D";
			}
				break;
			case 3:// 
			{
				lotteryName = "qlc";
			}
				break;
			case 4:// 
			{
				lotteryName = "23x5";
			}
				break;
			default:
				break;
			}

			loseBiddingJob = scheduler.getJobDetail("loseBiddingJob_" + lotteryName, "loseBiddingGroup");
			loseBiddingTrigger = (CronTrigger) scheduler.getTrigger("loseBiddingTrigger_" + lotteryName,
					"loseBiddingGroup");
			String time = loseBiddingTrigger.getCronExpression();
			if (!time.equals(this.timeFormat(date)))
			{
				loseBiddingTrigger = new CronTrigger("loseBiddingTrigger_" + lotteryName, "loseBiddingGroup",
						"loseBiddingJob_" + lotteryName, "loseBiddingGroup", this.timeFormat(date));
				Date ft = scheduler.rescheduleJob("loseBiddingTrigger_" + lotteryName, "loseBiddingGroup",
						loseBiddingTrigger);
				log.info(loseBiddingJob.getFullName() + " has been scheduled to run at: " + ft
						+ " and excute based on expression: " + loseBiddingTrigger.getCronExpression());
			}
		} catch (Exception e)
		{
			log.error(e);
		}
	}
</pre><br /><br /><br />5.相关问题<br /><br />配置完成后，定时任务不加载执行，在日志中报错：<br />java.lang.NoSuchMethodError: org.apache.commons.collections.SetUtils.orderedSet(Ljava/util/Set;)Ljava/util/Set;<br />这个是commons-collections.jar版本过低的原因，更换个新版本的就可以了！<br /><br />还有，为了防止开发人员在本地测试时，执行定时任务造成数据冲突，需要对主机服务器Ip进行判断，只有指定的服务器上才可以执行定时任务！<br /><pre name="code" class="java">
public boolean compareService(String thisIp)
{
	Properties properties = this.getProperties();
	String serviceIp = "";
	try
	{
		if (properties != null)
		{
			serviceIp = properties.getProperty("timing.work.serviceIp");
			if (serviceIp != null && serviceIp.equals(thisIp))
				return true;
		}
	} catch (Exception e)
	{
		log.error(e);
	}
	return false;
}
</pre><br /><br /><br /><br />quartz还可以对数据库操作，还有JobStore等等，以后应用到再说！哈！附带一份《quartz开发指南》！
          <br/>
          <span style="color:red;">
            <a href="http://daoger.javaeye.com/blog/195486#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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</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, 22 May 2008 08:46:08 +0800</pubDate>
        <link>http://daoger.javaeye.com/blog/195486</link>
        <guid>http://daoger.javaeye.com/blog/195486</guid>
      </item>
      <item>
        <title>The Examples for Quartz Time Format</title>
        <author>daoger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://daoger.javaeye.com">daoger</a>&nbsp;
          链接：<a href="http://daoger.javaeye.com/blog/193679" style="color:red;">http://daoger.javaeye.com/blog/193679</a>&nbsp;
          发表时间: 2008年05月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          The Examples for Quartz Time Format<br /><br />Expression             Meaning <br />0 0 12 * * ?        <br />Fire at 12pm (noon) every day <br /><br />0 15 10 ? * *       <br />Fire at 10:15am every day <br /><br />0 15 10 * * ?       <br />Fire at 10:15am every day <br /><br />0 15 10 * * ? *     <br />Fire at 10:15am every day <br /><br />0 15 10 * * ? 2005  <br />Fire at 10:15am every day during the year 2005 <br /><br />0 * 14 * * ?        <br />Fire every minute starting at 2pm and ending at 2:59pm, every day <br /><br />0 0/5 14 * * ?      <br />Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day<br /> <br />0 0/5 14,18 * * ?   <br />Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day <br /><br />0 0-5 14 * * ?      <br />Fire every minute starting at 2pm and ending at 2:05pm, every day <br /><br />0 10,44 14 ? 3 WED  <br />Fire at 2:10pm and at 2:44pm every Wednesday in the month of March. <br /><br />0 15 10 ? * MON-FRI Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday <br /><br />0 15 10 15 * ?      <br />Fire at 10:15am on the 15th day of every month <br /><br />0 15 10 L * ?       <br />Fire at 10:15am on the last day of every month <br /><br />0 15 10 ? * 6L      <br />Fire at 10:15am on the last Friday of every month <br /><br />0 15 10 ? * 6L      <br />Fire at 10:15am on the last Friday of every month <br /><br />0 15 10 ? * 6L 2002-2005 <br />Fire at 10:15am on every last friday of every month during the years 2002, 2003, 2004 and 2005 <br /><br />0 15 10 ? * 6#3     <br />Fire at 10:15am on the third Friday of every month <br /><br />0 0 12 1/5 * ?     <br />Fire at 12pm (noon) every 5 days every month, starting on the first day of the month. <br /><br />0 11 11 11 11 ?     <br />Fire every November 11th at 11:11am.
          <br/>
          <span style="color:red;">
            <a href="http://daoger.javaeye.com/blog/193679#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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 16 May 2008 15:02:02 +0800</pubDate>
        <link>http://daoger.javaeye.com/blog/193679</link>
        <guid>http://daoger.javaeye.com/blog/193679</guid>
      </item>
      <item>
        <title>让人头疼的新手</title>
        <author>daoger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://daoger.javaeye.com">daoger</a>&nbsp;
          链接：<a href="http://daoger.javaeye.com/blog/192520" style="color:red;">http://daoger.javaeye.com/blog/192520</a>&nbsp;
          发表时间: 2008年05月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          刚进公司没多久时，领导让我带两个新人(07年7月份毕业的)。他们两个是试用期3个月都过了之后才参与到我们现在的项目中来的，算起来他们也工作了快一年了，可是今天无意中修改一个他们写过的一个类文件时，看到他们写的一些代码，让我又好气又好笑。可能也是我以前只注意给他们测试功能了，没怎么注意代码方面的问题吧！<br /><br />晒晒他们的部分代码！<br /><br /><pre name="code" class="java">

/**
	 * 查询方案金额总和
	 * 
	 * @param lottype
	 *            Long
	 * @return double
	 */
	public Double getsummation(Long lottype)
	{
		double sum = 0.00;
		List ls = null;
		String sql = "";
		if (sql != null)
		{
			sql = " select sum(amount) from OccurProj a where a.lottype = '" + lottype + "' ";
		}
		ls = find(sql);
		if (ls != null && ls.isEmpty())
		{
			for (int i = 0; i &lt; ls.size(); i++)
			{
				OccurProj occurproj = (OccurProj) ls.get(i);
				sum = sum + occurproj.getAmount();
			}
		}
		return sum;
	}


</pre><br /><br /><pre name="code" class="java">
/**
	 * 根据主键查询明细信息
	 * 
	 * @param occurproj
	 *            OccurProj
	 * @return String
	 */
	public List queryById(Long id)
	{
		String sql = "";
		if (sql != null)
		{
			sql = " from OccurProj a where a.id=" + id;
		}
		return translateCode2Str(find(sql));
	}

</pre><br /><br /><pre name="code" class="java">
/**
	 * 参数查询
	 * 
	 * @param occurproj
	 *            OccurProj
	 * @param lottype
	 *            Long
	 * @return List
	 */
	public List queryByPara(String username, Long lottype)
	{
		String sql = "";
		if (username != null && username.length() > 0)
		{
			sql += " and a.username like ? ";
		}
		if (sql.length() > 1)
		{
			sql = " from OccurProj a where 1=1 and a.lottype = '" + lottype + "' " + sql;
		} else
			sql = " from OccurProj where lottype = '" + lottype + "' ";
		return translateCode2Str(find(sql));
	}
</pre><br /><br />我现在也体会到当初我找工作的时候为什么那么难了，同时也提醒一下即将毕业的朋友，想找到不错的工作，你的工作态度确实得端正！<br /><br />以前没带过新人，大家也介绍一下，带新人的经验吧！<br /><br /><br />我需要说明一下，我发贴的目的是想提醒一下临近毕业的朋友，不是公司不需要应届毕业生，应届毕业生有优点也有缺点。但是你进入公司以后，自己的发展和进步还是要靠自己的努力。工作了半年还能写出这样令人佩服的代码，那就只能是你自己的问题了，当然也有我自己的责任，毕竟是我带他们。 <br /><br />有则改之，无则加勉，别无他意，仅此而已！
          <br/>
          <span style="color:red;">
            <a href="http://daoger.javaeye.com/blog/192520#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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, 13 May 2008 11:25:36 +0800</pubDate>
        <link>http://daoger.javaeye.com/blog/192520</link>
        <guid>http://daoger.javaeye.com/blog/192520</guid>
      </item>
      <item>
        <title>昨天参加了一次面试</title>
        <author>daoger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://daoger.javaeye.com">daoger</a>&nbsp;
          链接：<a href="http://daoger.javaeye.com/blog/190087" style="color:red;">http://daoger.javaeye.com/blog/190087</a>&nbsp;
          发表时间: 2008年05月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          象去年这个时候一样，又开始找工作了！我不是一只跳蚤，可是我又必须做一只跳蚤！现在的公司效益不好，拖欠工资；承诺的几项补助，我进入公司后才知道，几年前就不发了。公司不提供计算机，我用公司的计算机每月还得扣我计算机使用费。其他方面就不说了！<br /><br /><br />昨天，到一家公司面试去了，行业内有名的一家公司，是在济南的分公司。不过，我表现的不好，过于紧张了！<br />三个面试官，两男一女，看样子年龄都不大，比我大不了多少。两个男士应该是负责技术，那位女士应该是负责人力方面的。<br /><br /><br />做了一份笔试题之后面试开始前一个面试官问我，觉得我这份题做的怎么样？ 我说有些地方不怎么确定，如果是在项目中用的话，还需要查资料确认一下。 那份笔试题不难，题量也不大，规定半个小时，我大概20分钟做完了，都是些基础问题，有2个程序编程题目。<br /><br /><br />首先，还是老套的自我简介，之后切入正题。说说之后的问题吧！<br />有的问题记不清楚了。<br /><br />1. 你才毕业3年，最近怎么又想找工作了？<br /><br />我说，公司效益不好，拖欠工资，我也想尝试一下更好的机会。<br /><br />其实，我应该说的明确一点，我的合同快到期了，7月底，现在开始找工作很正常！<br /><br />2. 我看你熟悉spring，说说怎么使用spring配置事务吧！<br /><br />我spring其实不怎么熟，只有一个项目中用过，现在的项目中也没用，确实记不清了。我就含糊的说，spring中事务分了很多种，有只读什么的，在配置文件中匹配要进行事务管理的方法就可以了。<br /><br />我的回答不好，确实是记不清了，我说完了，那个面试官就叹气。呵呵！<br /><br />3. 使用spring怎么配置数据库链接？<br /><br />我说，可以直接把配置信息写到配置文件中，也可以写到属性文件中，在配置文件中加载。之后，他又问我，数据库链接信息都有那些？ 我说，有驱动，数据库用户名，密码等等！<br /><br />我没想到他会问后面的问题，写过数据库链接程序的大概都知道。难道他看我紧张，觉得我不知道？没搞懂，之后他又是一个叹气！<br /><br />4. hibernate中的save方法和saveOrUpdate方法有什么区别？<br /><br />我说，saveOrUpdate方法当数据库中有这条记录的时候做更新，没有这条记录的时候插入新记录！<br /><br />其实，我一般不用这个方法，插入的时候就用save，更新的时候就用update。<br /><br />5. dwr的原理？<br /><br />另一个面试官看我在项目中使用DWR比较多，就说，我看你dwr用的比较多，我们不能只是用一种东西，还得知道其中的原理，你能说一下DWR的原理么？ <br /><br /><br />我当时对他的这个问题感觉很突然，也是，很多东西和技术我只是想着怎么去使用了，原理方面确实没怎么去多想！我就简单的说了一句，基本原理就是前端用js调用后端的java方法。之后就问，还有么？ 我说，原理方面我也不清楚。<br /><br />面试官对我的回答显然不满意，呵呵！其实，现在想想，网页中的文件都是加载到本地客户端运行显示的，DWR应该也是加载js文件时根据路径映射，从而加载后台的java方法的。<br /><br />6. 你觉得你的自学能力怎么样？<br /><br />我说，我觉得我的自学能力很好。他说举个例子吧！ 说到举例子，我有点犯难。我就说我曾经给别人修改过js控件，给他们修改或者添加新功能。面试官对我的回答很不满意，又是一阵叹气，呵呵！<br /><br /><br />我当时是觉得，你修改别人的代码，也需要先读懂原作者的思路，之后再根据需要修改，这也是一个学习过程啊！不过，我现在想想，我想说，我从初中开始就不听数学课，老师在上面讲他的，我在下面看我的，我都是自学的；高中和大学也是一样，当时我的数学虽然不是拔尖，但也是比较好的那一部分。在技术方面也是一样，网上有文档、有例子，想学的时候看看文档着几个例子就可以上手的。当然，熟练应用肯定还得需要一段时间的。<br /><br />7. 你觉得你最大的优势是什么？<br /><br />我说，我对技术比较感兴趣，喜欢自己钻研。<br /><br />8. 你在现在的项目中扮演什么角色？<br /><br />我说，项目组去年来了2个毕业生，暂时由我带着他们，项目经理给我分配模块和任务，我再看情况把一些工作分给他们做，替他们解决技术问题，给他们测试。<br /><br />9. 谈谈你说的测试！<br /><br />我说，一般就是在专门的包中用junit对方法进行单元测试，测试方法的返回结果等等！<br /><br />面试官对我的回答不满意。其实，我们项目中没有规定必须用junit进行单元测试，我现在不不常用。刮风下雨你算不准，可是你自己写的方法你自己肯定最清楚，哪里可能有问题，哪里执行效率低，哪里可能会报错，一般都知道的！不过，逻辑等很复杂方法除外。<br /><br /><br /><br />我这个人反应也有点慢，什么问题都得先思考一下。个人感觉几个面试官没有多少面试经验，甚至可能就是第一次面试别人。我这里没有批评的意思。几个面试官问我的问题，给我的感觉好像他们也刚开始用spring和hibernate一样，还有dwr的那个问题，让我觉得他没用过dwr。当然，真的没用过也没有什么，但是做到心里有底还是比较好的！我认为在面试的时候就没有必要再问一些技术细节了，大部分人也不会把技术细节记得那么清楚，需要的时候查一下，google一下就有了。面试时了解对方的思想是更加重要的。<br /><br /><br />软件工程方面，你可以问一下：你觉得要做好一个项目，最关键的方面是什么？或者问：规划一个项目应该注意那些方面？还有也可以问一下敏捷软件开发等等。技术方面，可以问一下：DWR使用方面的心得和问题，hibernate使用中的优点，struts的大致配置等等。因为我做的都是web方面的项目，可以再问一下网络安全方面有没有什么看法，自己在开发中是怎么做的。数据库方面，可以问一下：有没有数据库优化经验，是如何做的？或者经常用的数据库连接池等。还有工作态度、团队配合等方面，可以问：你碰到技术问题时，你会怎么办？或者说：你现在的工作中需要另一个同事的代码或模块，可是他还有很多没完成，你会怎么办？还可以问一下职业规划方面的问题：你对自己未来3年有什么打算？<br /><br />具体问题也要看招聘职位来定，不同职位的要求层次肯定不同，这些还得靠面试官自己拿捏。<br /><br />临走的时候说一周给消息，第一轮通过了还有总部方面的电话面试。估计自己通过的概率不大！
          <br/>
          <span style="color:red;">
            <a href="http://daoger.javaeye.com/blog/190087#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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 06 May 2008 11:40:00 +0800</pubDate>
        <link>http://daoger.javaeye.com/blog/190087</link>
        <guid>http://daoger.javaeye.com/blog/190087</guid>
      </item>
      <item>
        <title>大家如何看待美元贬值！</title>
        <author>daoger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://daoger.javaeye.com">daoger</a>&nbsp;
          链接：<a href="http://daoger.javaeye.com/blog/180676" style="color:red;">http://daoger.javaeye.com/blog/180676</a>&nbsp;
          发表时间: 2008年04月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近几年美元持续贬值已经不是什么新闻了！从06年底07年初美元兑人民币的汇率进入7时代以来，美元就从来没有坚挺过，当然这其中也有人民币升值的因素。昨天看了看汇率，美元兑人民币的6时代马上或者已经来到了，小弟手里有一点美元，考虑再三决定还是不兑换了，存了3个月，看看行情再说吧！心里盼着美元疲软贬值的年月也该结束了吧！就跟中石油一样，现在也稳定下来了，昨天收盘18块多！<br /><br />不知各位朋友怎么看待！<br /><br /><br /><span style="color: red">美国联邦储备委员会将于当地时间29日至30日召开货币政策会议。分析人士普遍认为，在本次会议上，美联储可能决定将联邦基金利率(即商业银行间隔夜拆借利率)下调25个基点，降至2%，并且有可能美国本轮降息周期将暂时告一段落。</span>
          <br/>
          <span style="color:red;">
            <a href="http://daoger.javaeye.com/blog/180676#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><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>Wed, 09 Apr 2008 08:48:04 +0800</pubDate>
        <link>http://daoger.javaeye.com/blog/180676</link>
        <guid>http://daoger.javaeye.com/blog/180676</guid>
      </item>
      <item>
        <title>ASP网站每天出现垃圾数据的疑问！</title>
        <author>daoger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://daoger.javaeye.com">daoger</a>&nbsp;
          链接：<a href="http://daoger.javaeye.com/blog/179979" style="color:red;">http://daoger.javaeye.com/blog/179979</a>&nbsp;
          发表时间: 2008年04月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在一个asp的网站中，每天都会有大量的垃圾数据存入数据库中的一个表；这些数据都不是合法数据，但是asp页面中有js校验，他们似乎都是逃避了校验之后存入数据库的。 大家知不知道有没有这样的自动执行的程序，不通过前端页面直接往数据库中添加垃圾数据？ 象这种问题该如何解决呢？ 请有这方面经验的朋友指教！
          <br/>
          <span style="color:red;">
            <a href="http://daoger.javaeye.com/blog/179979#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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 07 Apr 2008 09:14:53 +0800</pubDate>
        <link>http://daoger.javaeye.com/blog/179979</link>
        <guid>http://daoger.javaeye.com/blog/179979</guid>
      </item>
      <item>
        <title>web 地图杂谈</title>
        <author>daoger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://daoger.javaeye.com">daoger</a>&nbsp;
          链接：<a href="http://daoger.javaeye.com/blog/179288" style="color:red;">http://daoger.javaeye.com/blog/179288</a>&nbsp;
          发表时间: 2008年04月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          做的一个网站中需要一个电子地图，姑且叫他web－gis吧！基本的实现机制是网页中的图片动态浏览，mapabc(也就是图盟：http://www.mapabc.com/)的网页地图应该也是基于这一机制实现的，google地图搜索就是mapabc提供的，当然我做的这个在功能方面和人家的还是差的远。去年，还差点决定到这家公司面试去那。<br /><br /><br />现在这个网站中的电子地图开始时也不是我自己写的，代码来自于一个俄罗斯人，使用了mootools工具包，我只是在他代码的基础上进行了功能和界面的修改和增补。地图图片是由很多小的图片组成的；也就是把一张大的地图图片，根据清晰度剪切成许多小的图片，再实时加载呈现出来。当地图上有拖拽、双击等操作时，也需要重新加载地图。你保存一下google地图，就可以看到这些剪切出来的小图片了。小图片的文件名称都是按照规则命名的，这样也是js加载图片的需要。在地图上添加标识，是在地图上添加一个div，之后在它上面添加一个标识图片；当然这个div也要响应地图的所有事件。将鼠标放在标识上方后出现提示框，点击提示框中的文字可以进行一些相关操作！这个提示框的实现也有很多例子！ 我不知道地图搜索部分是如何实现的，估计应该是通过要搜索的字符检索匹配的地点和地点坐标。通过页面上的菜单可以在的图上显示这些地方，清晰度可以控制的。现在还有一些细节方面的问题需要修改！最后一张是操作成功后用ExtJs做的信息提示框！<br /><br /><br /><img src="http://daoger.javaeye.com/upload/picture/pic/11146/66f63982-ee62-344f-a482-7bff970ec549.jpg" /><img src="http://daoger.javaeye.com/upload/picture/pic/11148/d687bcd5-9ec6-3254-bf44-1deff30716bd.jpg" /><br /><img src="http://daoger.javaeye.com/upload/picture/pic/11150/ad961622-fee4-35c5-9450-c67f2d642811.jpg" /><br /><br /><br />网上有一个比较成熟的开源的地图浏览器,网址是：http://www.mojavelinux.com/projects/gsiv/,初始版本的名字叫Giant Scalable Image Viewer (GSIV)，现在官方网站上又出现了一个版本Giant-Ass Image Viewer(GSV)。现在这个开源项目只是实现了图片的浏览，并且在IE下还有些问题。有兴趣的朋友可以研究一下！
          <br/>
          <span style="color:red;">
            <a href="http://daoger.javaeye.com/blog/179288#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><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><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 03 Apr 2008 15:37:44 +0800</pubDate>
        <link>http://daoger.javaeye.com/blog/179288</link>
        <guid>http://daoger.javaeye.com/blog/179288</guid>
      </item>
      <item>
        <title>推荐：dhtmlx系列js工具包</title>
        <author>daoger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://daoger.javaeye.com">daoger</a>&nbsp;
          链接：<a href="http://daoger.javaeye.com/blog/179236" style="color:red;">http://daoger.javaeye.com/blog/179236</a>&nbsp;
          发表时间: 2008年04月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          很长时间不关注dhtmlx系列的东西了，今天做一个多选下拉菜单的时候无意间又到它的网站看了一下。网站现在已经改版了，工具包的系列也增加了不少，功能也完善增加了不少，相对于ExtJs庞大的框架级的代码量，dhtmlx现在只能算是工具包；不过，dhtmlx系列小、快、灵的特点无疑也是web开发的不错选择！<br /><br />dhtmlx现在的产品包括：dhtmlxTree(树型控件),dhtmlxTabbar(选项卡),dhtmlxGrid(数据表格),dhtmlxCombo(下拉选项),dhtmlxTreeGrid(树型表格),dhtmlxVault(文件上传控件),dhtmlxMenu(菜单),dhtmlxToolbar(工具条),dhtmlxCalendar(日历控件),dhtmlxFolders(展示台),dhtmlxColorPicker(调色板),dhtmlxWindows(窗口)。<br /><br />小：dhtmlx系列的产品，js文件都不怎么大；相对于ExtJs动辄几百KB的js文件来说，dhtmlx系列中最大的也不过100多KB；当然，Extjs是框架级的控件，功能全面。但是，往往开发中不需要用那些重量级的js框架时，dhtmlx系列就有了自己施展的舞台！<br /><br />快：dhtmlx系列上手比较容易，稍微熟悉js的人在短短的时间内就可以使用了，它的文档和API也比较全面详细，为开发者的使用提供了很好的帮助！还有，因为代码量小，运行速度也会快一些。<br /><br />灵：由于功能的分散，你可以根据需要取而用之；由于它没有基于别的工具包开发，所以适用于所有的开发环境。js的开发包(如jQyery、prototype、mootools等)，虽然能够使得js编程快速，但是他们之间不能通用，不同的项目之间会存在移植融合的困难。而使用dhtmlx系列，你完全不必有这方面的顾虑！<br /><br />数据交互方面基于ajax实现，通过xml实现数据传递。另外，我觉得dhtmlx中有些做的也比ExtJs也好，我对dhtmlxgrid还算熟悉；现在，dhtmlxgrid中的很多功能是ExtJs的grid中没有的。<br /><br />当然，js产品的使用，最终还是要看项目的需要，如果不想使用ExtJs这种大型框架的话，dhtmlx系列确实是一个不错的选择！<br />这是它的官方主页：http://www.dhtmlx.com. 感兴趣的朋友可以看一下！<br /><img src=" http://daoger.javaeye.com/upload/picture/pic/11140/5ce78977-757a-32e7-ae88-430274abb91d.jpg" />
          <br/>
          <span style="color:red;">
            <a href="http://daoger.javaeye.com/blog/179236#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><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, 03 Apr 2008 14:07:26 +0800</pubDate>
        <link>http://daoger.javaeye.com/blog/179236</link>
        <guid>http://daoger.javaeye.com/blog/179236</guid>
      </item>
      <item>
        <title>一个女生的爱情观</title>
        <author>daoger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://daoger.javaeye.com">daoger</a>&nbsp;
          链接：<a href="http://daoger.javaeye.com/blog/177646" style="color:red;">http://daoger.javaeye.com/blog/177646</a>&nbsp;
          发表时间: 2008年03月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章