<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>JavaEye博客</title>
    <description>Java博客,Ruby on Rails博客,AJAX博客,Agile博客 -- JavaEye做最棒的软件开发交流社区</description>
    <link>http://www.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>Lucene查询出现异常</title>
        <author>sundayrong</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sundayrong.javaeye.com">sundayrong</a>&nbsp;
                    链接：<a href="http://sundayrong.javaeye.com/blog/252653" style="color:red;">http://sundayrong.javaeye.com/blog/252653</a>&nbsp;
          发表时间: 2008年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="font-size: xx-large">[size=x-large][size=large][size=large]</span><span style="font-size: medium">Exception in thread "main" org.apache.lucene.queryParser.ParseException: Cannot parse '睿格总经理祝永进谈到，“大学生购买笔记本电脑的主流价格段是5000~6000元，3999没人买。甚至有44%的女大学生，购买了15寸的笔记本电脑，这让人感觉不可思议。”': Minimum similarity for a FuzzyQuery has to be between 0.0f and 1.0f !<br />	at org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:149)<br />	(ReadIndex.java:303)</span>[/size][/size][/size]<br /><br /><br /><br />对Lucene查询时出现的错误，还没找到解决的办法
          <br/>
          <span style="color:red;">
            <a href="http://sundayrong.javaeye.com/blog/252653#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 14 Oct 2008 13:44:37 +0800</pubDate>
        <link>http://sundayrong.javaeye.com/blog/252653</link>
        <guid>http://sundayrong.javaeye.com/blog/252653</guid>
      </item>
          <item>
        <title>Spring Module下配置缓存的两种方法</title>
        <author>zhuzhsh</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhuzhsh.javaeye.com">zhuzhsh</a>&nbsp;
                    链接：<a href="http://zhuzhsh.javaeye.com/blog/252639" style="color:red;">http://zhuzhsh.javaeye.com/blog/252639</a>&nbsp;
          发表时间: 2008年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>以EhCache为例说明缓存的配置方法：</p>
<p>第一种方法，配置Spring配置文件，使用AOP处理缓存</p>
<p>1)添加Provider，初始化CacheManager</p>
<pre name="code" class="xml">&lt;!--
Thecreatedcachemanagerisaninstanceofnet.sf.ehcache.CacheManager
--&gt;
&lt;beanid="cacheManager"
class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"&gt;
&lt;/bean&gt;
&lt;beanid="cacheProviderFacade"
class="org.springmodules.cache.provider.ehcache.EhCacheFacade"&gt;
&lt;propertyname="cacheManager"ref="cacheManager"/&gt;
&lt;/bean&gt;</pre>
<p>&nbsp;2)在ehcache.xml增加一个缓存</p>
<p>增加一个name为testCache的缓存。</p>
<pre name="code" class="xml">&lt;cache name="testCache"
           maxElementsInMemory="20000"
           maxElementsOnDisk="1000"
           eternal="true"
           overflowToDisk="true"
           memoryStoreEvictionPolicy="LFU"
    /&gt;</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>3)配置缓存</p>
<pre name="code" class="xml"> &lt;bean id="testService"
  class="org.springmodules.cache.interceptor.proxy.CacheProxyFactoryBean"&gt;
  &lt;property name="cacheProviderFacade" ref="cacheProviderFacade" /&gt;
  &lt;property name="cachingModels"&gt;
   &lt;props&gt;
    &lt;prop key="find*"&gt;cacheName=<strong>testCache(a)</strong>&lt;/prop&gt;
    &lt;prop key="is*"&gt;cacheName=testCache&lt;/prop&gt;
   &lt;/props&gt;
  &lt;/property&gt;
  &lt;property name="flushingModels"&gt;
   &lt;props&gt;
    &lt;prop key="insert*"&gt;cacheNames=testCache&lt;/prop&gt;
    &lt;prop key="delete*"&gt;cacheNames=testCache&lt;/prop&gt;
    &lt;prop key="update*"&gt;cacheNames=testCache&lt;/prop&gt;
   &lt;/props&gt;
  &lt;/property&gt;
  &lt;property name="target" ref="<strong>testServiceTarget(b)</strong>" /&gt;
 &lt;/bean&gt;

</pre>
<p>&nbsp;</p>
<p>其中(a)为第2步定义的cache的名字,(b)为需要缓存的bean的id。</p>
<p>&nbsp;</p>
<p>这样，第一种方式就配置好了。</p>
<p>&nbsp;</p>
<p>第二种方法，使用Annotations的配置方式。</p>
<p>1)同第一种方法1)。</p>
<p>2)同第二种方法2)。</p>
<p>3)在需要处理缓存的方法前面配置Annotion</p>
<p>@Cacheable(modelId="testCache")//写在方法前面就会缓存方法的返回结果</p>
<p>@CacheFlush(modelId="testFlushing")//写在方法前面，就会在执行该函数时清除缓存里面的数据。</p>
<p>这样第二种方法也完成了。</p>
<p>第一种方法在flush的时候可以同时flush多个缓存。第二种方法只能flush一个缓存，而且第一种方法只需要修改Spring配置文件即可。</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://zhuzhsh.javaeye.com/blog/252639#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 14 Oct 2008 13:11:33 +0800</pubDate>
        <link>http://zhuzhsh.javaeye.com/blog/252639</link>
        <guid>http://zhuzhsh.javaeye.com/blog/252639</guid>
      </item>
          <item>
        <title>并发的矩阵计算</title>
        <author>fyting</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fyting.javaeye.com">fyting</a>&nbsp;
                    链接：<a href="http://fyting.javaeye.com/blog/252618" style="color:red;">http://fyting.javaeye.com/blog/252618</a>&nbsp;
          发表时间: 2008年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          昨天无意中看到<a href="http://job.javaeye.com/companies/260/jobs/92" target="_blank">这个招聘题</a>，挺有意思的。最近正被项目的并发问题搞得焦头烂额，在封装的语义和项目需求上似乎都出现了问题，迟迟实现不了。CPU的核心是越来越多了，以后并发是一种趋势，越来越多的程序需要考虑使用并发来加速……<br />首先定义一个类，就叫做MatrixSolver吧<br /><pre name="code" class="java">
package fyting.javaeye.com;
public class MatrixSolver
{
	private final int[][] matrix;
	private final int maxThreads;
	private final Map&lt;Integer, Integer> results = Collections.synchronizedMap(new TreeMap&lt;Integer, Integer>());
	public void start(){
		//...
	}
}</pre><br />写一个main方法来测试：<br /><pre name="code" class="java">public static void main(String[] args)
{
	final int row = 5000, column = 2000;
	final int[][] data = new int[row][column];
	for(int i = 0 ; i &lt; row; i++) {
		for(int j = 0; j &lt; column; j++) {
			data[i][j] = j;
		}
	}
	final int maxThreads = 3;
	MatrixSolver solver = new MatrixSolver(maxThreads, data);
	solver.start();
}</pre><br />然后是实现的代码，利用JDK5的线程池，可以很轻松实现：<br />（事实上，JDK里CyclicBarrier的javadoc就是一个解矩阵的例子）<br /><pre name="code" class="java">public void start()
{
	ExecutorService executor = Executors.newFixedThreadPool(maxThreads);
	final long st = System.nanoTime();
	if(this.matrix.length == 0) {
		System.err.println("no matrix data!");
		return;
	}
	final int columnCount = this.matrix[0].length;
	final CountDownLatch latch = new CountDownLatch(columnCount);
	for(int i = 0 ; i &lt; columnCount; i++) {
		final int column = i;
		executor.execute(newTask(column,latch));
	}
	try {
		latch.await();
		executor.shutdown();
		long et = System.nanoTime();
		long time = (et - st) / (1000*1000);
		System.out.println("success, time: " + time + "ms");
		executor.awaitTermination(1, TimeUnit.SECONDS);
	}
	catch(InterruptedException e) {
		e.printStackTrace();
	}
	System.out.println("maxtrix: " + (matrix.length + "*" + matrix[0].length));
	System.out.println("column0==>" + ArrayUtils.toString(matrix[0]));
	System.out.println("results==>" + results);
}

protected Runnable newTask(int column, CountDownLatch latch)
{
	return new ColumnSolver(column,latch);
}

private class ColumnSolver extends Thread
{
	private final int columnIndex;
	private final CountDownLatch latch;

	ColumnSolver(int columnIndex, CountDownLatch latch)
	{
		this.columnIndex = columnIndex;
		this.latch = latch;
	}

	@Override
	public void run()
	{
		int count = 0;
		for(int j = 0, rowCount = matrix.length; j &lt; rowCount; j++) {
			count += matrix[j][columnIndex];
		}
		results.put(columnIndex, count);
		latch.countDown();
	}
}</pre><br />当然，如果是JDK1.4，可以用单独的<a href="http://gee.cs.oswego.edu/dl/" target="_blank">Doug Lea大师</a><a href="http://g.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html" target="_blank">写的java concurrent包</a>，否则需要自己实现线程池了，很麻烦。如下面这样的代码，很容易出错，实在是没有必要在项目中采用。<br /><br /><pre name="code" class="java">class ThreadPool
{
	private final LinkedList&lt;Runnable> tasks = new LinkedList&lt;Runnable>();
	private final Thread[] workers;

	public ThreadPool(int maxThreads)
	{
		if(maxThreads &lt;= 0) throw new IllegalArgumentException("maxThreads must > 0");
		this.workers = new Thread[maxThreads];
		for(int i = 0; i &lt; maxThreads; i++) {
			workers[i] = new WorkThread();
			workers[i].start();
		}
	}

	private class WorkThread extends Thread
	{
		public void run() {
            Runnable r;
            while(true) {
                synchronized(tasks) {
                    while (tasks.isEmpty()) {
                        try
                        {
                        	tasks.wait();
                        }
                        catch (InterruptedException ex)
                        {
//                        	ex.printStackTrace();
                        	return;
                        }
                    }
                    r = (Runnable) tasks.removeFirst();
                }
                try {
                    r.run();
                }
                catch (RuntimeException e) {
                	e.printStackTrace();
                }
                synchronized(ThreadPool.this) {
                	ThreadPool.this.notifyAll();
//                	System.out.println(tasks.size() + " remaining");
                }
            }
        }
	}

	synchronized void waitAndShutdown() throws InterruptedException
	{
		while(this.tasks.size() != 0) {
			wait();
		}
		for(Thread t: workers) {
			synchronized(t) {
				t.interrupt();
			}
		}
	}

	public void submit(Runnable runnable)
	{
		 synchronized(this.tasks) {
			 this.tasks.addLast(runnable);
			 this.tasks.notify();
	    }
	}
}</pre><br />附件中有3个不同的类，分别是利用JDK1.5和JDK1.4，以及单线程的实现。
          <br/>
          <span style="color:red;">
            <a href="http://fyting.javaeye.com/blog/252618#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 14 Oct 2008 12:49:25 +0800</pubDate>
        <link>http://fyting.javaeye.com/blog/252618</link>
        <guid>http://fyting.javaeye.com/blog/252618</guid>
      </item>
          <item>
        <title>赞一下公司的管理理念!</title>
        <author>ufomail</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ufomail.javaeye.com">ufomail</a>&nbsp;
                    链接：<a href="http://ufomail.javaeye.com/blog/252605" style="color:red;">http://ufomail.javaeye.com/blog/252605</a>&nbsp;
          发表时间: 2008年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>在现在这间公司工作已经有1个半月啦.感觉很好.公司虽小,但感觉很有活力.很有干劲!!</p>
<p>&nbsp;</p>
<p>其实我们公司人不多,连业务员,一共也就是10来个人左右.</p>
<p>&nbsp;</p>
<p>但是我享受这种工作氛围和欣赏老板的管理观念!为此,决定为这间公司做出自己的努力!</p>
<p>&nbsp;</p>
<p>好好干,让宜配成为国内最大的汽配网站!</p>
<p>&nbsp;</p>
<p>下面文字转自老板的QQ空间,给大家看看!</p>
<p>&nbsp;</p>
<pre name="code" class="java">宜配的理念
   1.我们宜配，是一个学习型组织，我们并不是要求你一来，就一定具备多高的水平，但是随企业的发展，你必须与时俱进。我们股东中都是搞技术出身的，但并不妨碍我们在未来成为管理型的人才，只要是企业发展需要，我们可以去学习任何东西。而这个学习是主动的，不是我压迫你去学什么。如果你指望长期滥竽充数，对不起，这里恐怕容不了你，不要说宜配，恐怕这个社会都要淘汰你 
   2.我过去的老板说过一句话，我的印象非常深刻，他说：“你的办公桌大小，不是我给你的，是你自己做出来的”你的尊严和威信，源自你的工作能力。我们并不论资排辈，我们给你足够的发展空间，我们支持你的任何一项好的计划和创新，只要你真的敬业，勤奋，你未尝不能做到股东的位置上。 
   3.你有一个很好的创意，这很好，但是我不希望你只是口头告诉我，我希望你拿出个计划来，包括人员配备，计划执行的周期，资金等等，你得考虑我们宜配目前的能力，你要让我们看到可行性，而不是一句话的空谈 
   4.其实即使马云自己也知道，当他没有出名时，那些话是不为人知的，但正是他当初不为人知的正确的理念和观点，带到阿里巴巴走到了今天 。 
  5.如果你畏惧在你前面的人，你就永远无法超越他们 
  6.人的一生是公平的，春天不耕耘，秋天就没有收获。你不想付出得比别人更多，你就不指望比别人得到的更多。你看见成功的人面前的花环，你羡慕，但是，他背后的艰辛的付出，你是否做到了？ 
  7.目前对于每个人来说，不是选择的机会太少，而是太多，因此太容易迷惘，想在每一个领域都进行一下尝试，结果等你尝试完了，时间也就过去了。要学会做一个笨的人，做一件事，做10年 
  8.当一个企业由小到大，由游击队走向正规军，各项规章制度要一步步去健全，做为企业的老人们，越加要严格遵守，做好一个表率。一支好的军队，招之能来，来之能战，没有良好的制度和纪律去保证其执行力，是不堪想象的。公司不能因任何一个人去特殊。如果有特殊的人去破坏纪律，纪律就形同空设。不可想象一个没有纪律和制度的公司，一个纪律和制度形同空设的公司，能够成为一家优秀或者卓越的公司。
  9.对于一个企业而言，制度规范的形成十分重要。规矩只要定下了，就得遵守，不管是不是合理。如果不合理，可以更改规矩，但这不能够成为你破坏规矩的理由。规矩，就是企业内部的游戏规则。你可以对规矩的合理性提出质疑，却不能不遵守，就象法律一样，也是在，也是需要不断去完善的，你不能够因为法律不完善而去不遵守法律，去破坏法律。
 
</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://ufomail.javaeye.com/blog/252605#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 14 Oct 2008 12:02:25 +0800</pubDate>
        <link>http://ufomail.javaeye.com/blog/252605</link>
        <guid>http://ufomail.javaeye.com/blog/252605</guid>
      </item>
          <item>
        <title>jQGrid 的汉化文件</title>
        <author>rikugun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rikugun.javaeye.com">rikugun</a>&nbsp;
                    链接：<a href="http://rikugun.javaeye.com/blog/252604" style="color:red;">http://rikugun.javaeye.com/blog/252604</a>&nbsp;
          发表时间: 2008年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          如有雷同纯属巧合<br />在jquery.jqgrid.js 中 将第十行的<br /><pre name="code" class="js">
{ include: true, incfile:'grid.locale-en.js',minfile: 'min/grid.locale-en-min.js'}, // jqGrid translation
</pre><br />改为对应的汉化文件<br /><br /><pre name="code" class="js">
;(function($){
/**
 * jqGrid Chinese Translation
 * Lun Jun v5.rikugun@gmail.com
 * http://rikugun.javaeye.com/blog/ 
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
**/
$.jgrid = {};

$.jgrid.defaults = {
	recordtext: "行",
	loadtext: "读取中...",
	pgtext : "/"
};
$.jgrid.search = {
    caption: "搜索...",
    Find: "查找",
    Reset: "重置",
    odata : ['等于', '不等于', '小于', '小于等于','大于','大于等于', '开始于','结束于','包含' ]
};
$.jgrid.edit = {
    addCaption: "添加记录",
    editCaption: "编辑记录",
    bSubmit: "提交",
    bCancel: "取消",
	bClose: "关闭",
    processData: "处理中...",
    msg: {
        required:"此字段必需",
        number:"请输入有效数字",
        minValue:"输入值必须大于等于",
        maxValue:"输入值必须小于等于",
        email: "这不是有效的e-mail"
    }
};
$.jgrid.del = {
    caption: "删除",
    msg: "删除所选记录?",
    bSubmit: "删除",
    bCancel: "取消",
    processData: "处理中..."
};
$.jgrid.nav = {
	edittext: " ",
    edittitle: "编辑所选行",
	addtext:" ",
    addtitle: "添加行",
    deltext: " ",
    deltitle: "删除所选行",
    searchtext: " ",
    searchtitle: "查找",
    refreshtext: "",
    refreshtitle: "刷新表格",
    alertcap: "警告",
    alerttext: "请选择行"
};
// setcolumns module
$.jgrid.col ={
    caption: "显示/隐藏行",
    bSubmit: "提交",
    bCancel: "取消"	
};
$.jgrid.errors = {
	errcap : "错误",
	nourl : "没有设置url",
	norecords: "没有要处理的记录"
};
})(jQuery);

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://rikugun.javaeye.com/blog/252604#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 14 Oct 2008 11:54:44 +0800</pubDate>
        <link>http://rikugun.javaeye.com/blog/252604</link>
        <guid>http://rikugun.javaeye.com/blog/252604</guid>
      </item>
          <item>
        <title>实例 数组 广义表</title>
        <author>Angelialily</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://angelialily.javaeye.com">Angelialily</a>&nbsp;
                    链接：<a href="http://angelialily.javaeye.com/blog/252602" style="color:red;">http://angelialily.javaeye.com/blog/252602</a>&nbsp;
          发表时间: 2008年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1、<br />void RSh(int A[n],int k)//把数组A的元素循环右移k位,只用一个辅助存储空间<br />{<br />&nbsp; for(i=1;i&lt;=k;i++)<br />&nbsp;&nbsp;&nbsp; if(n%i==0&amp;&amp;k%i==0) p=i;//求n和k的最大公约数p<br />&nbsp; for(i=0;i&lt;p;i++) <br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; j=i;l=(i+k)%n;temp=A[i];<br />&nbsp;&nbsp;&nbsp; while(l!=i)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A[j]=temp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp=A[l];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A[l]=A[j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j=l;l=(j+k)%n;<br />&nbsp;&nbsp;&nbsp; }// 循环右移一步<br />&nbsp;&nbsp;&nbsp; A[i]=temp;<br />&nbsp; }//for<br />}//RSh<br />分析:要把A的元素循环右移k位,则A[0]移至A[k],A[k]移至A[2k]......直到最终回到A[0].然而这并没有全部解决问题,因为有可能有的元素在此过程中始终没有被访问过,而是被跳了过去.分析可知,当n和k的最大公约数为p时,只要分别以A[0],A[1],...A[p-1]为起点执行上述算法,就可以保证每一个元素都被且仅被右移一次,从而满足题目要求.也就是说,A的所有元素分别处在p个"循环链"上面.举例如下:<br />n=15,k=6,则p=3.<br />第一条链:A[0]->A[6],A[6]->A[12],A[12]->A[3],A[3]->A[9],A[9]->A[0].<br />第二条链:A[1]->A[7],A[7]->A[13],A[13]->A[4],A[4]->A[10],A[10]->A[1].<br />第三条链:A[2]->A[8],A[8]->A[14],A[14]->A[5],A[5]->A[11],A[11]->A[2].<br />恰好使所有元素都右移一次.<br />2、------------------------------------<br />void Get_Saddle(int A[m][n])//求矩阵A中的马鞍点<br />{<br />&nbsp; for(i=0;i&lt;m;i++)<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; for(min=A[i][0],j=0;j&lt;n;j++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(A[i][j]&lt;min) min=A[i][j]; //求一行中的最小值<br />&nbsp;&nbsp;&nbsp; for(j=0;j&lt;n;j++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(A[i][j]==min) //判断这个(些)最小值是否鞍点<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(flag=1,k=0;k&lt;m;k++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(min&lt;A[k][j]) flag=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(flag)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Found a saddle element!\nA[%d][%d]=%d",i,j,A[i][j]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp; }//for<br />}//Get_Saddle <br />-----------------------------<br />3、<br />void TSMatrix_Add(TSMatrix A,TSMatrix B,TSMatrix &amp;C)//三元组表示的稀疏矩阵加法<br />{<br />&nbsp; C.mu=A.mu;C.nu=A.nu;C.tu=0;<br />&nbsp; pa=1;pb=1;pc=1;<br />&nbsp; for(x=1;x&lt;=A.mu;x++) //对矩阵的每一行进行加法<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; while(A.data[pa].i&lt;x) pa++;<br />&nbsp;&nbsp;&nbsp; while(B.data[pb].i&lt;x) pb++;<br />&nbsp;&nbsp;&nbsp; while(A.data[pa].i==x&amp;&amp;B.data[pb].i==x)//行列值都相等的元素<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(A.data[pa].j==B.data[pb].j)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ce=A.data[pa].e+B.data[pb].e;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ce) //和不为0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.data[pc].i=x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.data[pc].j=A.data[pa].j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.data[pc].e=ce;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pa++;pb++;pc++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//if<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(A.data[pa].j>B.data[pb].j) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.data[pc].i=x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.data[pc].j=B.data[pb].j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.data[pc].e=B.data[pb].e;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pb++;pc++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.data[pc].i=x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.data[pc].j=A.data[pa].j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.data[pc].e=A.data[pa].e<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pa++;pc++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }//while<br />&nbsp;&nbsp;&nbsp; while(A.data[pa]==x) //插入A中剩余的元素(第x行)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.data[pc].i=x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.data[pc].j=A.data[pa].j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.data[pc].e=A.data[pa].e<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pa++;pc++;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; while(B.data[pb]==x) //插入B中剩余的元素(第x行)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.data[pc].i=x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.data[pc].j=B.data[pb].j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.data[pc].e=B.data[pb].e;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pb++;pc++;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp; }//for<br />&nbsp; C.tu=pc;<br />}//TSMatrix_Add <br />---------------------------------<br />4、<br />void TSMatrix_Addto(TSMatrix &amp;A,TSMatrix B)//将三元组矩阵B加到A上<br />{<br />&nbsp; for(i=1;i&lt;=A.tu;i++)<br />&nbsp;&nbsp;&nbsp; A.data[MAXSIZE-A.tu+i]=A.data[i];/把A的所有元素都移到尾部以腾出位置<br />&nbsp; pa=MAXSIZE-A.tu+1;pb=1;pc=1;<br />&nbsp; for(x=1;x&lt;=A.mu;x++) //对矩阵的每一行进行加法<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; while(A.data[pa].i&lt;x) pa++;<br />&nbsp;&nbsp;&nbsp; while(B.data[pb].i&lt;x) pb++;<br />&nbsp;&nbsp;&nbsp; while(A.data[pa].i==x&amp;&amp;B.data[pb].i==x)//行列值都相等的元素<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(A.data[pa].j==B.data[pb].j)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ne=A.data[pa].e+B.data[pb].e;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ne) //和不为0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A.data[pc].i=x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A.data[pc].j=A.data[pa].j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A.data[pc].e=ne;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pa++;pb++;pc++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//if<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(A.data[pa].j>B.data[pb].j) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A.data[pc].i=x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A.data[pc].j=B.data[pb].j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A.data[pc].e=B.data[pb].e;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pb++;pc++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A.data[pc].i=x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A.data[pc].j=A.data[pa].j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A.data[pc].e=A.data[pa].e<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pa++;pc++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }//while<br />&nbsp;&nbsp;&nbsp; while(A.data[pa]==x) //插入A中剩余的元素(第x行)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A.data[pc].i=x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A.data[pc].j=A.data[pa].j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A.data[pc].e=A.data[pa].e<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pa++;pc++;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; while(B.data[pb]==x) //插入B中剩余的元素(第x行)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A.data[pc].i=x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A.data[pc].j=B.data[pb].j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A.data[pc].e=B.data[pb].e;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pb++;pc++;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp; }//for<br />&nbsp; A.tu=pc;<br />&nbsp; for(i=A.tu;i&lt;MAXSIZE;i++) A.data[i]={0,0,0}; //清除原来的A中记录<br />}//TSMatrix_Addto <br />---------------------------------<br />5、<br />typedef struct{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int e;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } DSElem; <br />typedef struct{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DSElem data[MAXSIZE];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int cpot[MAXROW];//这个向量存储每一行在二元组中的起始位置<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int mu,nu,tu;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } DSMatrix; //二元组矩阵类型 <br />Status DSMatrix_Locate(DSMatrix A,int i,int j,int &amp;e)//求二元组矩阵的元素A[i][j]的值e<br />{<br />&nbsp; for(s=cpot[i];s&lt;cpot[i+1]&amp;&amp;A.data[s].j!=j;s++);//注意查找范围<br />&nbsp; if(A.data[s].i==i&amp;&amp;A.data[s].j==j) //找到了元素A[i][j]<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; e=A.data[s];<br />&nbsp;&nbsp;&nbsp; return OK;<br />&nbsp; }<br />&nbsp; return ERROR;<br />}//DSMatrix_Locate <br /><br />---------------------------------<br />6、<br />typedef struct{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int seq; //该元素在以行为主序排列时的序号<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int e;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } SElem; <br />typedef struct{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SElem data[MAXSIZE];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int mu,nu,tu;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } SMatrix; //单下标二元组矩阵类型 <br />Status SMatrix_Locate(SMatrix A,int i,int j,int &amp;e)//求单下标二元组矩阵的元素A[i][j]的值e<br />{<br />&nbsp; s=i*A.nu+j+1;p=1;<br />&nbsp; while(A.data[p].seq&lt;s) p++; //利用各元素seq值逐渐递增的特点<br />&nbsp; if(A.data[p].seq==s) //找到了元素A[i][j]<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; e=A.data[p].e;<br />&nbsp;&nbsp;&nbsp; return OK;<br />&nbsp; }<br />&nbsp; return ERROR;<br />}//SMatrix_Locate <br />-----------------------------------<br />7、<br />typedef struct{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int mu,nu;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int elem[MAXSIZE];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool map[mu][nu];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } BMMatrix; //用位图表示的矩阵类型 <br />void BMMatrix_Add(BMMatrix A,BMMatrix B,BMMatrix &amp;C)//位图矩阵的加法<br />{<br />&nbsp; C.mu=A.mu;C.nu=A.nu;<br />&nbsp; pa=1;pb=1;pc=1;<br />&nbsp; for(i=0;i&lt;A.mu;i++) //每一行的相加<br />&nbsp;&nbsp;&nbsp; for(j=0;j&lt;A.nu;j++) //每一个元素的相加<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(A.map[i][j]&amp;&amp;B.map[i][j]&amp;&amp;(A.elem[pa]+B.elem[pb]))//结果不为0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.elem[pc]=A.elem[pa]+B.elem[pb];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.map[i][j]=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pa++;pb++;pc++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(A.map[i][j]&amp;&amp;!B.map[i][j])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.elem[pc]=A.elem[pa];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.map[i][j]=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pa++;pc++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(!A.map[i][j]&amp;&amp;B.map[i][j])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.elem[pc]=B.elem[pb];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.map[i][j]=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pb++;pc++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />}//BMMatrix_Add <br />----------------------------------<br />8、<br />void OLMatrix_Add(OLMatrix &amp;A,OLMatrix B)//把十字链表表示的矩阵B加到A上<br />{<br />&nbsp; for(j=1;j&lt;=A.nu;j++) cp[j]=A.chead[j]; //向量cp存储每一列当前最后一个元素的指针<br />&nbsp; for(i=1;i&lt;=A.mu;i++)<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; pa=A.rhead[i];pb=B.rhead[i];pre=NULL;<br />&nbsp;&nbsp;&nbsp; while(pb)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pa==NULL||pa->j>pb->j) //新插入一个结点<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p=(OLNode*)malloc(sizeof(OLNode));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!pre) A.rhead[i]=p;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else pre->right=p;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p->right=pa;pre=p;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p->i=i;p->j=pb->j;p->e=pb->e; //插入行链表中<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!A.chead[p->j])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A.chead[p->j]=p;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p->down=NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(cp[p->j]->down) cp[p->j]=cp[p->j]->down;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p->down=cp[p->j]->down;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cp[p->j]->down=p;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cp[p->j]=p; //插入列链表中<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//if<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(pa->j&lt;pb->j)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pre=pa;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pa=pa->right;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } //pa右移一步<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(pa->e+pb->e)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pa->e+=pb->e;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pre=pa;pa=pa->right;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pb=pb->right;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } //直接相加<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!pre) A.rhead[i]=pa->right;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else pre->right=pa->right;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p=pa;pa=pa->right; //从行链表中删除<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(A.chead[p->j]==p)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A.chead[p->j]=cp[p->j]=p->down;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else cp[p->j]->down=p->down; //从列链表中删除<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free (p);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//else<br />&nbsp;&nbsp;&nbsp; }//while<br />&nbsp; }//for<br />}//OLMatrix_Add<br />--------------------------------------<br />9、void MPList_PianDao(MPList &amp;L)//对广义表存储结构的多元多项式求第一变元的偏导<br />{<br />&nbsp; for(p=L->hp->tp;p&amp;&amp;p->exp;pre=p,p=p->tp)<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; if(p->tag) Mul(p->hp,p->exp);<br />&nbsp;&nbsp;&nbsp; else p->coef*=p->exp; //把指数乘在本结点或其下属结点上<br />&nbsp;&nbsp;&nbsp; p->exp--;<br />&nbsp; }<br />&nbsp; pre->tp=NULL;<br />&nbsp; if(p) free (p); //删除可能存在的常数项<br />}//MPList_PianDao <br />void Mul(MPList &amp;L,int x)//递归算法,对多元多项式L乘以x<br />{<br />&nbsp; for(p=L;p;p=p->tp)<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; if(!p->tag) p->coef*=x;<br />&nbsp;&nbsp;&nbsp; else Mul(p->hp,x);<br />&nbsp; }<br />}//Mul<br />-----------------------------<br />10、<br />void MPList_Add(MPList A,MPList B,MPList &amp;C)//广义表存储结构的多项式相加的递归算法<br />{<br />&nbsp; C=(MPLNode*)malloc(sizeof(MPLNode));<br />&nbsp; if(!A->tag&amp;&amp;!B->tag) //原子项,可直接相加<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; C->coef=A->coef+B->coef;<br />&nbsp;&nbsp;&nbsp; if(!C->coef)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(C);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C=NULL;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp; }//if<br />&nbsp; else if(A->tag&amp;&amp;B->tag) //两个多项式相加<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; p=A;q=B;pre=NULL;<br />&nbsp;&nbsp;&nbsp; while(p&amp;&amp;q)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(p->exp==q->exp)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C=(MPLNode*)malloc(sizeof(MPLNode));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C->exp=p->exp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MPList_Add(A->hp,B->hp,C->hp);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pre->tp=C;pre=C;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p=p->tp;q=q->tp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(p->exp>q->exp)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C=(MPLNode*)malloc(sizeof(MPLNode));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C->exp=p->exp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C->hp=A->hp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pre->tp=C;pre=C;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p=p->tp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C=(MPLNode*)malloc(sizeof(MPLNode));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C->exp=q->exp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C->hp=B->hp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pre->tp=C;pre=C;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q=q->tp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }//while<br />&nbsp;&nbsp;&nbsp; while(p)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C=(MPLNode*)malloc(sizeof(MPLNode));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C->exp=p->exp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C->hp=p->hp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pre->tp=C;pre=C;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p=p->tp;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; while(q)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C=(MPLNode*)malloc(sizeof(MPLNode));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C->exp=q->exp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C->hp=q->hp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pre->tp=C;pre=C;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q=q->tp;<br />&nbsp;&nbsp;&nbsp; } //将其同次项分别相加得到新的多项式,原理见第二章多项式相加一题<br />&nbsp; }//else if<br />&nbsp; else if(A->tag&amp;&amp;!B->tag) //多项式和常数项相加<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; x=B->coef;<br />&nbsp;&nbsp;&nbsp; for(p=A;p->tp->tp;p=p->tp);<br />&nbsp;&nbsp;&nbsp; if(p->tp->exp==0) p->tp->coef+=x; //当多项式中含有常数项时,加上常数项<br />&nbsp;&nbsp;&nbsp; if(!p->tp->coef)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(p->tp);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p->tp=NULL;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q=(MPLNode*)malloc(sizeof(MPLNode));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q->coef=x;q->exp=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q->tag=0;q->tp=NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p->tp=q;<br />&nbsp;&nbsp;&nbsp; } //否则新建常数项,下同<br />&nbsp; }//else if<br />&nbsp; else<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; x=A->coef;<br />&nbsp;&nbsp;&nbsp; for(p=B;p->tp->tp;p=p->tp);<br />&nbsp;&nbsp;&nbsp; if(p->tp->exp==0) p->tp->coef+=x;<br />&nbsp;&nbsp;&nbsp; if(!p->tp->coef)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(p->tp);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p->tp=NULL;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q=(MPLNode*)malloc(sizeof(MPLNode));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q->coef=x;q->exp=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q->tag=0;q->tp=NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p->tp=q;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp; }//else<br />}//MPList_Add <br />--------------------------------<br />11、<br />int GList_Equal(GList A,GList B)//判断广义表A和B是否相等,是则返回1,否则返回0<br />{ //广义表相等可分三种情况:<br />&nbsp; if(!A&amp;&amp;!B) return 1; //空表是相等的<br />&nbsp; if(!A->tag&amp;&amp;!B->tag&amp;&amp;A->atom==B->atom) return 1;//原子的值相等<br />&nbsp; if(A->tag&amp;&amp;B->tag)<br />&nbsp;&nbsp;&nbsp; if(GList_Equal(A->ptr.hp,B->ptr.hp)&amp;&amp;GList_Equal(A->ptr.tp,B->ptr.tp))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1; //表头表尾都相等<br />&nbsp; return 0;<br />}//GList_Equal <br />-------------------------------------<br />12、void GList_PrintList(GList A)//按标准形式输出广义表<br />{<br />&nbsp; if(!A) printf("()"); //空表<br />&nbsp; else if(!A->tag) printf("%d",A->atom);//原子<br />&nbsp; else<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; printf("(");<br />&nbsp;&nbsp;&nbsp; GList_PrintList(A->ptr.hp);<br />&nbsp;&nbsp;&nbsp; if(A->ptr.tp)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(",");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GList_PrintList(A->ptr.tp);<br />&nbsp;&nbsp;&nbsp; } //只有当表尾非空时才需要打印逗号<br />&nbsp;&nbsp;&nbsp; printf(")");<br />&nbsp; }//else<br />}//GList_PrintList
          <br/>
          <span style="color:red;">
            <a href="http://angelialily.javaeye.com/blog/252602#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 14 Oct 2008 11:42:51 +0800</pubDate>
        <link>http://angelialily.javaeye.com/blog/252602</link>
        <guid>http://angelialily.javaeye.com/blog/252602</guid>
      </item>
          <item>
        <title>python中匹配中文以及网站名等(基于正则表达式)</title>
        <author>乌拉蕾</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://i-421-163-com.javaeye.com">乌拉蕾</a>&nbsp;
                    链接：<a href="http://i-421-163-com.javaeye.com/blog/252567" style="color:red;">http://i-421-163-com.javaeye.com/blog/252567</a>&nbsp;
          发表时间: 2008年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          昨天在写爬虫的时候需要在html文件中对中文进行匹配，在网上找了找都不是我要的，后面就自己写了个，呵呵，还行。o(∩_∩)o...<br /><br /><pre name="code" class="python">
import re
s=""//document.getElementById("zoom").innerHTML = document.getElementById("zoom").innerHTML.replace(/topview/gi,"TopView(&lt;a href='http://topview.eastmoney.com/regfm.html' target='_blank' class='blue'>我们是中国人&lt;/a>)");""" 
s=s.__repr__()
w=re.findall(r'\\\w+',s,re.DOTALL|re.IGNORECASE)
w
</pre><br />可以得到结果是：<br />['\\xce', '\\xd2', '\\xc3', '\\xc7', '\\xca', '\\xc7', '\\xd6', '\\xd0', '\\xb9', '\\xfa', '\\xc8', '\\xcb']<br />这样我们就得到了中文的一个集合，在python中一个中文用两个16进制的字符表示，所以上面集合的元素有12个。<br /><br />另外还有一种方法就是：<br /><pre name="code" class="python">
import re
s=""//document.getElementById("zoom").innerHTML = document.getElementById("zoom").innerHTML.replace(/topview/gi,"TopView(&lt;a href='http://topview.eastmoney.com/regfm.html' target='_blank' class='blue'>我们是中国人&lt;/a>)");""" 
rc=re.compile(r'\\\w+',re.DOTALL|re.IGNORECASE)
li=list(s)
lis=[x for x in li if rc.search(x.__repr__())]
cn=reduce(lambda x,y:x+y,lis)
print cn
#结果：我们是中国人
</pre><br /><br />另外我又想了想觉得可以写写其他比较有用的<br />比如<br />1、匹配网站名<br /><pre name="code" class="python">
s='http://it.chinabyte.com/269/8344769.shtml'
w=re.search(r'\.(\w+)\.',s)
w.group(1)
</pre><br />输出：chinabyte<br /><br />2、匹配ip地址<br /><pre name="code" class="python">
s='202.115.5.250'
w=re.search('(\d+).(\d+).(\d+).(\d+)',s)
</pre><br />w.group(1)--w.group(4)就是匹配到的4个分段<br />这个有更简单的就是<br /><pre name="code" class="python">
s.split('.')
</pre><br />得到的输出是['202', '115', '5', '250']<br />如果要取出这个4个数，注意进行转化int('202')就可以转为整数了
          <br/>
          <span style="color:red;">
            <a href="http://i-421-163-com.javaeye.com/blog/252567#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 14 Oct 2008 10:38:22 +0800</pubDate>
        <link>http://i-421-163-com.javaeye.com/blog/252567</link>
        <guid>http://i-421-163-com.javaeye.com/blog/252567</guid>
      </item>
          <item>
        <title>关于Erlang和SMP的一些说明</title>
        <author>ShiningRay</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shiningray.javaeye.com">ShiningRay</a>&nbsp;
                    链接：<a href="http://shiningray.javaeye.com/blog/252560" style="color:red;">http://shiningray.javaeye.com/blog/252560</a>&nbsp;
          发表时间: 2008年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="entry-content">
<p><a href="http://shiningray.cn/some-facts-about-erlang-and-smp.html">http://shiningray.cn/some-facts-about-erlang-and-smp.html</a></p>
<p>原文：<a href="http://groups.google.com/group/erlang-questions/browse_thread/thread/7827f5e32681ca8e">http://groups.google.com/group/erlang-questions/browse_thread/thread/7827f5e32681ca8e</a>
</p>
<p>by.Kenneth Erlang/OTP team, Ericsson<br />
译：<a href="http://shiningray.cn/">ShiningRay <br />
</a>
</p>
<p>&nbsp;</p>
<p>以下是一些Erlang SMP实现的细节和与性能与伸缩性相关一些简单介绍。</p>
<p>几周之内还有有一个关于多核如何运作以及未来如何发展的更详细的介绍。我打算将一些内容放在我的报告中，将于9月27日的ICFP2008，Erlang Workshop在Victoria BC展示给大家。</p>
<p>没有SMP支持的Erlang VM只有1个运行在主处理线程中的调度器。该调度器从运行队列（run-queue）中取出可以运行的Erlang进程以及IO任务，而且因为只有一个线程访问他们所以无须锁定任何数据。</p>
<p>而带有SMP支持的Erlang VM可以有一个或多个调度器，每个运行在一个线程中。调度器从同一个公共运行队列中取出可运行的Erlang进程和IO任务。在SMP VM中所有的共享数据结构都会由锁进行保护，运行队列就是这样一个由锁保护的数据结构。</p>
<p>从OTP R12B开始，如果操作系统报告有多于1个的CPU（或者核心）VM的SMP版本会自动启动，并且根据CPU或者核心的数量启动同样数量的调度器。</p>
<p>你可以从&ldquo;erl&rdquo;命令打印出来的第一行看到它选择了哪些参数。例如：</p>
<pre><code>
Erlang (BEAM) emulator version 5.6.4 [source] [smp:4] [asynch-threads:0] …..

其中“[smp:4]”表示SMP VM运行了4个调度器。</code>
</pre>
<p>默认值可以用&ldquo;-smp [enable|disable|auto]&rdquo;来替换，auto是默认的。如果smp被启用了（-smp enable），要设置调度器的数量可以使用&ldquo;+S Number&rdquo;其中Number是调度器的数量（1到1024）</p>
<p>注意1：运行多于CPU或核心总数的调度器不会有任何提升。</p>
<p>注意2：在某些操作系统中一个进程可使用的CPU或者核心的数量可以被限制。例如，在Linux中，命令&ldquo;taskset&rdquo;就可以实现这个功能。
Erlang
VM目前还只能探测CPU或者核心的总数，不会考虑&ldquo;taskset&rdquo;所设置的掩码。正因如此，例如可能会出现（已经出现过了）即使Erlang
VM运行了4个调度器，也只使用了2个核心。OS会进行限制因为它要考虑&ldquo;taskset&rdquo;所设置的掩码。</p>
<p>每个Erlang VM的调度器都运行于一个OS线程上，是OS来决定线程是否执行在不同的核心上。一般来说OS会很好地处理这个问题并且会保证线程在执行期间运行于同一个核心上。</p>
<p>Erlang进程会被不同的调度器运行，因为他们是从一个公共运行队列中被取出，由首先可用的调度器运行。</p>
<h3>性能和伸缩性</h3>
<p>只有一个调度器的SMP VM要比非SMP的VM稍微慢那么一点点。SMP
VM内部需要用到各种锁，不过只要不存在锁的争用，那么由锁引起的开销不会非常大（就是锁争用上面需要花时间）。这也解释了为何在某些情况下，运行多个只
有一个调度器的SMP VM要比包含多个调度器的单一SMP
VM更加高效。当然运行多个VM要求应用可以按照多个并行任务的方式运行并且之间没有或者几乎不通讯。</p>
<p>一个程序是否能在多核上的SMP VM中良好地进行提升很大程度上取决于程序的性质，某些程序可以保持线性提升至8核甚至16核，同时其他某些程序基本不能提升，连2核都不行。实际应用中很多程序都能在主流市场的核心数上得到提升，见下文。</p>
<p>若并行的持续&ldquo;通话&rdquo;由每个核心一个或多个Erlang进程来表示，实际的支持大量通话的电信产品已经先现出在双核和四核处理器上不俗的伸缩性。注
意，这些产品是在SMP
VM和多核处理器出现很久以前按照普通的Erlang风格来写的，他们也能无须任何修改甚至不需重新编译代码就能从Erlang SMP VM中获益。</p>
<h3>SMP性能得到持续改进</h3>
<p>SMP实现正被不断改进以便能得到更好的性能和伸缩性。在每个服务发布版R12B-1,2,3,4,5&hellip;,R13B等等中，你都能发现新的优化。</p>
<h3>一些已知的瓶颈</h3>
<p>单一的常见运行队列随着CPU或核心的数量的增加会成为一个显著的瓶颈。</p>
<p>这从4核开始往上就会显现出来，不过4核仍然可以为多数应用程序提供不错的性能。我们正在从事一个每个调度器一个运行队列的解决方法作为目前最重要的改进。</p>
<p>Ets表格会引入锁。在R12B-4之前在每次对一个ets-table的访问中会用到两个锁，但是在R12B-4中meta-table的锁被优
化过，可以显著减少争用（前面已经提到争用是有很大代价的）。如果很多Erlang进程访问同一个表格，就会有很多锁争用造成性能降低尤其当这些进程主要
工作是访问ets-table。锁存在于表级而非记录级。注意！这也会影响到Mnesia因为Mnesia用到了很多ets-table。</p>
<h3>我们关于SMP的策略</h3>
<p>当我们开始实现SMP VM的最初，我们就确定了策略：&ldquo;首先让它可以运行，然后测量，然后优化&rdquo;。自从2006年五月我们发布了第一个稳定的SMP VM（R11B）以来，我们一直遵循着这个策略。</p>
<p>还有更多已知的东西可以改进，我们会按照性能的收益大小先后各个击破。</p>
<p>我们将主要的精力放在多核（大于4）上更好的连续伸缩性上。</p>
<h3>卓越典范</h3>
<p>即使SMP系统有还有一些已知的瓶颈不过已经有不错的整体性能和伸缩性，同时我相信在让程序员利用多核机器事半功倍方面，我们是一个卓越的典范。</p>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://shiningray.javaeye.com/blog/252560#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 14 Oct 2008 10:31:58 +0800</pubDate>
        <link>http://shiningray.javaeye.com/blog/252560</link>
        <guid>http://shiningray.javaeye.com/blog/252560</guid>
      </item>
          <item>
        <title>14号新闻—微软正式发布Silverlight2 宣布支持Eclipse</title>
        <author>jacktom</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jacktom.javaeye.com">jacktom</a>&nbsp;
                    链接：<a href="http://jacktom.javaeye.com/blog/252558" style="color:red;">http://jacktom.javaeye.com/blog/252558</a>&nbsp;
          发表时间: 2008年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div style="text-align: center">14号新闻—微软正式发布Silverlight2 宣布支持Eclipse</div><br /><br />Silverlight 是微软开发的一个跨浏览器、跨平台和跨设备的插件技术，可交付基于下一代.NET媒体体验和丰富交互效果的WEB应用程序。<br /><br />在Flex4正式发布之前，Silverlight 这次领先了一步。而且Silverlight宣布支持Eclipse，项目名为eclipse4SL。<br /><br />要下载Eclipse Tools for Microsoft Silverlight，地址如下：<br />http://www.eclipse4sl.org/download/<br /><br />下载安装有详细说明。
          <br/>
          <span style="color:red;">
            <a href="http://jacktom.javaeye.com/blog/252558#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 14 Oct 2008 10:28:49 +0800</pubDate>
        <link>http://jacktom.javaeye.com/blog/252558</link>
        <guid>http://jacktom.javaeye.com/blog/252558</guid>
      </item>
          <item>
        <title>用Ajax实现一个当前比较流行的字段验证</title>
        <author>lovpg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lovpg.javaeye.com">lovpg</a>&nbsp;
                    链接：<a href="http://lovpg.javaeye.com/blog/252551" style="color:red;">http://lovpg.javaeye.com/blog/252551</a>&nbsp;
          发表时间: 2008年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          闲来没事做,做了一个字段即时验证的东东,觉得还蛮好玩的!<br />主要是利用input的onfocus和onblur事件,在失去焦点时即通过异步验证,相关信息返回给页面!<br /><br /><pre name="code" class="html">	   &lt;li>用户名：
	     &lt;input type="text" name="user.username" id="username"  />
	   &lt;/li>
	   &lt;li id="user_message">&lt;/li>
	   &lt;li>密码：&lt;input type="password" name="user.password" id="password"/>&lt;/li>
	   &lt;li id="pass_message">&lt;/li>
	   &lt;li>密码验证：&lt;input type="password" name="repassword" id="repassword"/>&lt;/li>
	   &lt;li id="repassword_message">&lt;/li>
	   &lt;li>邮箱：&lt;input type="text" name="email" id="email"/>&lt;/li>
	   &lt;li id="email_message">&lt;/li>
</pre><pre name="code" class="java">   var username;
   var password;
   var repassword;
   var ajax = new Ego.Ajax("get","/checkUser.action","innerMessage");
   var email;

   window.onload = function(){
      
       username = document.getElementById("username");
       password = document.getElementById("password");
       repassword = document.getElementById("repassword");
       email = document.getElementById("email");
       
       if(window.addEventListener){ // Mozilla, Netscape, Firefox
    
			username.addEventListener("focus",validate,false);
			password.addEventListener("focus",validate,false);
			username.addEventListener("blur",unloadValidate,false);
			password.addEventListener("blur",unloadValidate,false);
			repassword.addEventListener("focus",validate,false);
			repassword.addEventListener("blur",unloadValidate,false);
			email.addEventListener("focus",validate,false);
			email.addEventListener("blur",unloadValidate,false);
			
          }else{
          
            username.attachEvent("onfocus",validate);
            password.attachEvent("onfocus",validate);
            username.attachEvent("onblur",unloadValidate);
            password.attachEvent("onblur",unloadValidate);
            repassword.attachEvent("onfocus",validate);
            repassword.attachEvent("onblur",unloadValidate);
            email.attachEvent("onfocus",validate);
            email.attachEvent("onblur",unloadValidate);
            
        }
   }

   //焦点事件
   function validate(evt){
   

      var eles = document.forms[0].elements;
      
      for(var i=0;i&lt;eles.length;i++){
      
          
         eles[i].className = "input_off";
     
      
      }

      evt["target"] ? evt["target"]["className"] = "input_on" : e_out = evt["srcElement"]["className"] = "input_on";

   }
   //失去焦点事件
   function unloadValidate(evt){
   
   
      evt["target"]? check(evt["target"]["id"]):check(evt["srcElement"]["id"]);
      

      
   }

function check(id){

	    if(id == "username"){
	    
	          ajax.Check_Data_Request(G(id).value);
	         
	    }else if(id == "password"){
	    
	          G("pass_message").innerHTML = checkPassowrd(id)?render("请进入下一步！",1):render("密码输入有误！",0);
	    
	    }else if(id == "repassword"){
         
	          
	          G("repassword_message").innerHTML = G(id).value != G("password").value?  render("两次密码不一致，请重新输入！",0):render("请进入下一步！",1);
	          

	          
	    
	    }else if(id == "email"){
	    
             G("email_message").innerHTML =  checkEmail(id) ?  render("请进入下一步！",1) : render("请输入正确的邮箱地址！",0);
	    
	    }


}

function checkEmail(id){

	 var pattern = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;
	 
	 if(pattern.test(G(id).value)){
	    
	    G("tip").value = "1";
	    return true;
	 
	 }
	 G("tip").value = "0";
	 return false;
}

function checkPassowrd(id){

      var password = G(id).value;
      if(password.length &lt; 6 || password.length > 20){
      
        G("tip").value = "0";
        return false;
        
      
      }
      G("tip").value = "1";
      return true;


}
function innerMessage(obj){


    G("user_message").innerHTML =  obj == "1" ? render("恭喜，该用户可以使用！",1):render("用户名已存在或用户输入有误！",0);
    
    if(obj == "0"){
    
      G("tip").value = "0";
    
    }
    G("tip").value = "1";


}
function render(message,tip){

     if(tip==0){
     
      return  "&lt;img src=\"../img/standard_msg_error.gif\" border=\"0\" />  &lt;span style=\"color:red\">"+message+"&lt;span>";
     
     }else if(tip == 1){
     
      return "&lt;img src=\"../img/fzcg_dh.gif\" border=\"0\" /> &lt;span style=\"color:blue\">"+message+"&lt;span>";
     
     }


}

function submit_on(){

  
   if(G("tip").value == "0"){
   
     alert("信息登记有误，请检查！");
     return false;
   
   }</pre>
          <br/>
          <span style="color:red;">
            <a href="http://lovpg.javaeye.com/blog/252551#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' 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/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 14 Oct 2008 10:24:47 +0800</pubDate>
        <link>http://lovpg.javaeye.com/blog/252551</link>
        <guid>http://lovpg.javaeye.com/blog/252551</guid>
      </item>
          <item>
        <title>更好的讨论交流平台？</title>
        <author>juvenshun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://juvenshun.javaeye.com">juvenshun</a>&nbsp;
                    链接：<a href="http://juvenshun.javaeye.com/blog/252549" style="color:red;">http://juvenshun.javaeye.com/blog/252549</a>&nbsp;
          发表时间: 2008年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Maven中文MSN群开通至今，三个月不到，已有66人加入了，每天都有人讨论Maven相关问题，这是大家很高兴看到的。尤其是群中一直有新接触Maven的人加入，让我们相信Maven技术正逐渐流行。</p>
<p>&nbsp;</p>
<p>但MSN群的确不是一个很好的交流平台，经常跳来跳去不说，发代码也经常被莫名其妙格式化成表情，还有很多人可能用不了MSN。于是群中有人提议用QQ群，也有人提议用Google Group。</p>
<p>&nbsp;</p>
<p>QQ估计比MSN好点，至少不会老是主动跳出来，但它和MSN群共同的问题是：历史记录查询麻烦，大量代码复制粘贴格式难以维护，很多公司封IM端口。还有就是在Linux上使用很不方便。</p>
<p>&nbsp;</p>
<p>Google Group，我个人比较倾向的平台，可以创建分主题的讨论，维护一些常见问题的页面，上传共享文件等等。更重要的是任何OS都能通过浏览器访问，以及与开源社区通用的邮件列表一致。有一点不如IM群的是即时性比较差，不过RSS可以帮助解决这个问题。这里我先建了一个，没有内容，大家去看看：<a href="http://groups.google.com/group/maven-zh" target="_self">http://groups.google.com/group/maven-zh</a>
。</p>
<p>&nbsp;</p>
<p>大家讨论一下吧，要照顾大多数人的意见，在这里留言也行，在MSN群留言也行，直接加入google group也行。</p>
<p>&nbsp;</p>
<p>我在这里谢谢大家的支持了。<img src="/images/smiles/icon_biggrin.gif" alt="" />
</p>
          <br/>
          <span style="color:red;">
            <a href="http://juvenshun.javaeye.com/blog/252549#comments" style="color:red;">已有 <strong>7</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 14 Oct 2008 10:16:36 +0800</pubDate>
        <link>http://juvenshun.javaeye.com/blog/252549</link>
        <guid>http://juvenshun.javaeye.com/blog/252549</guid>
      </item>
          <item>
        <title>诚恳谈工资，非诚莫入！</title>
        <author>gao_20022002</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gao-20022002.javaeye.com">gao_20022002</a>&nbsp;
                    链接：<a href="http://gao-20022002.javaeye.com/blog/252535" style="color:red;">http://gao-20022002.javaeye.com/blog/252535</a>&nbsp;
          发表时间: 2008年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>对于这个话题，或许大部分公司，或许是所有公司，都是一个避讳的问题。因此工资问题显得很是神秘，但是时间长了，和同事的接触中，我们是可以感触的到的。</p>
<p>&nbsp;</p>
<p>公司避讳谈工资的原因：无非就是因为可能影响工作的积极性，试想：如果你觉得你自己和别人干同样的事，那相差很大的钱，你会心满意足？你会安心工作？所以和不是一家单位的同学朋友谈工资问题，也就没有太多的障碍。</p>
<p>&nbsp;</p>
<p>为什么要谈工资问题？</p>
<p>了解自己的位置，了解自己的能力，了解行业的趋势，定位自己。</p>
<p>扯了这么多，现在谈谈自己收集的信息，除了敏感信息保留外，其他的都是千真万确。</p>
<p>&nbsp;</p>
<p>先说说自己：</p>
<p>杭州工作，毕业两年零两个月，现在4500，税前，税后4000-，三险一金齐全。</p>
<p>两个月前的好几个同事离职，现在工资都在5000-5500之间，税前，税后4500-4800之间。</p>
<p>还有知道的一个情况，研究生毕业，名牌学校名牌专业，税前5500，税后没有问。</p>
<p>说说：在同一家公司工资升级是很困难，除非你有很特别大的表现，就是有了也不一定。工作一两年的，跳槽频繁，涨工资也快，这是实情。研究生毕业的工资和工作两年的工资应该相差不大，但是这东西不好说，我是说文聘和经验的交换问题，以后谁的路子好，还得靠自己的努力。</p>
<p>&nbsp;</p>
<p>了解的北京的情况：</p>
<p>现在的工资5500-6000之间，税前，税后5000+。况且此位老兄表现突出，晋升为一个部门小主管。</p>
<p>说说：关键是消费问题。每个月他们的住房是1000-，生活费600-，加上其他的通讯坐车费用，一个月攒上2500+，已经很不错。还不说其他的消费。</p>
<p>&nbsp;</p>
<p>了解的深圳的情况：</p>
<p>和北京差不多。</p>
<p>&nbsp;</p>
<p>了解的武汉加上海的情况：</p>
<p>武汉一个同学，不是计算机的，搞建筑，土木工程，工资2300+，税前。</p>
<p>上海一个同学，不是计算机的，银行行业，一个小主管，调到武汉，工资5000+，税前。</p>
<p>说说：由于我的同学在上海的不多，所以具体的不大太了解，但是上海的和北京深圳差不多，比杭州要高些，但是花费当然也要高些。武汉的生活水平不是很
了解，据武汉的同事说，当时上学的感觉是比杭州低很多，不知道现在。武汉的工资相对要低些，这是事实。但是加上消费，也还过得去。</p>
<p>&nbsp;</p>
<p>现在的结论是什么？</p>
<p>计算机行业的工资要相对高些，搞开发的，要是搞界面或者美工之类的，一个月也就是2000+，我说的是整体情况，不包括那些特牛的人。工作两年一个月能攒上2500-3000，不管在什么地方，应该已经不错了。</p>
<p>&nbsp;</p>
<p>我们的收入高不高？</p>
<p>相对于其他行业，是高些。不包括那些国有企业的以及政府机关的，他们的工资是低，但是福利你是没法比的。外企的公司不是很了解，应该也是比较高，但是也是相对的，你的能力在那里能突出多少？表现突出了高是正常的。</p>
<p>&nbsp;</p>
<p>公司为什么会给我们这么高的工资？</p>
<p>因为我们能给公司创造高i的效益。</p>
<p>公司不是傻瓜，她不会无缘无故给你涨工资，也不会毫无理由的给你定工资。该拿多少自己衡量衡量实力，看自己到底值多少？工作两年，他给你上万的工资，你拿得起吗？当然我不说李一男之大师级人物，毕竟那是少数。</p>
<p>&nbsp;</p>
<p>我们缺失的是什么？</p>
<p>时间的积累，经验的积累。</p>
<p>公司不可能将一个大的项目安排给一个刚毕业一两年的自认为很牛的员工，这一点应该认同。给了你你能驾驭得了吗？认真想想。</p>
<p>&nbsp;</p>
<p>现在我们应该怎样看待工资的问题？</p>
<p>踏踏实实干事，老老实实做人。努力积累自己的原始资本------经验。</p>
<p>软件行业，前面的四五年之间工资能养活自己能攒点钱应该很好了，到五年之后，分歧就会出现，那时候的差距就会显现，管理级别与员工级别应该待遇很不一样。</p>
<p>现在我的观点，认认真真做好自己本职工作，踏踏实实学习些东西，老老实实走自己的路。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>希望各位发表看法。</p>
          <br/>
          <span style="color:red;">
            <a href="http://gao-20022002.javaeye.com/blog/252535#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 14 Oct 2008 10:04:18 +0800</pubDate>
        <link>http://gao-20022002.javaeye.com/blog/252535</link>
        <guid>http://gao-20022002.javaeye.com/blog/252535</guid>
      </item>
          <item>
        <title>使用JavaScript控制文本输入框在按下回车时进行数据提交！</title>
        <author>amcucn</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://amcucn.javaeye.com">amcucn</a>&nbsp;
                    链接：<a href="http://amcucn.javaeye.com/blog/252510" style="color:red;">http://amcucn.javaeye.com/blog/252510</a>&nbsp;
          发表时间: 2008年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>假设有一个文本输入框，也可以是一个表单：</p>
<p>如：</p>
<pre name="code" class="html">&lt;input id=&quot;searchProductText&quot; name=&quot;textfield&quot;	type=&quot;text&quot; class=&quot;font-hui14&quot; value=&quot;请在此输入商品名&quot; size=&quot;28&quot;				
                   onkeypress=&quot;if(event.keyCode==13){Javascript:formSubmit()}&quot;/&gt;</pre>
<p>&nbsp;如果我们想在用户输入内容后按回车就可以进行数据的提交，我们只需要在这个输入框中加上一个onkeypress事件，判断一下这个事件返回的keyCode是否等于13（13：是回车的一个编码）如果等于就让它执行后面的javascript方法，至于后面的方法如何提交，就看大家如何去写了！</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://amcucn.javaeye.com/blog/252510#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' 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/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 14 Oct 2008 09:16:22 +0800</pubDate>
        <link>http://amcucn.javaeye.com/blog/252510</link>
        <guid>http://amcucn.javaeye.com/blog/252510</guid>
      </item>
          <item>
        <title>让Eclipse支持JQuery代码自动完成</title>
        <author>kongshanxuelin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cxlh.javaeye.com">kongshanxuelin</a>&nbsp;
                    链接：<a href="http://cxlh.javaeye.com/blog/252504" style="color:red;">http://cxlh.javaeye.com/blog/252504</a>&nbsp;
          发表时间: 2008年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>我们在编写js的时候，如果采用了jquery框架，当然很希望Eclipse能帮我们完成代码自动完成的功能了，但Eclipse默认只是支持js的代码自动完成，利用这个插件，可以让Eclipse支持jquery的代码自动完成功能(前提：Eclipse已完成WTP的安装)，支持最新的jquery 1.2.6版本，以下是安装步骤：</p>
<ol>
<li>下载附件中的jar文件</li>
<li>打开Eclipse的plugin目录，备份org.eclipse.wst.javascript.ui_xxxxxxx.jar</li>
<li>运行刚下载的jar文件，或用命令java -jar jqueryWTP.version.jar</li>
<li>在打开的swing窗口中的第一个文本框选择org.eclipse.wst.javascript.ui_xxxxxxx.jar，在输出目录中选择您要输出的目录，如c:\</li>
<li>点击&ldquo;generator&rdquo;按钮，在c:\下找到org.eclipse.wst.javascript.ui_xxxxxxx.jar覆盖掉原eclipse的文件</li>
<li>重启eclipse即可</li>
</ol>
<p>效果如下图：</p>
<p><img src="http://www.langtags.com/jquerywtp/jquerywtp.jpg" height="486" alt="" width="689" />
</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://cxlh.javaeye.com/blog/252504#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 14 Oct 2008 08:26:07 +0800</pubDate>
        <link>http://cxlh.javaeye.com/blog/252504</link>
        <guid>http://cxlh.javaeye.com/blog/252504</guid>
      </item>
          <item>
        <title>paging的性能优化</title>
        <author>AnnBaby</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://annbaby.javaeye.com">AnnBaby</a>&nbsp;
                    链接：<a href="http://annbaby.javaeye.com/blog/252496" style="color:red;">http://annbaby.javaeye.com/blog/252496</a>&nbsp;
          发表时间: 2008年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p style="margin: 2px;">public class Paging extends AbstractList&lt;String&gt; { <br /><br />private List&lt;String&gt; list; <br />private int size = 0; <br /><br />public Paging(WebApp application) { <br /><br />//判断WebApp中是否已经存在了要调用的数据 <br />if(application.getAttribute("list")==null){ <br />list=getList(); <br />application.setAttribute("list", list);//加入WebApp中 <br />}else{ <br />//判断数据是否过期 <br />if(application.getAttribute("data_flag").equals("true")){ <br />list=(List)application.getAttribute("list"); <br />}else if(application.getAttribute("data_flag").equals("false")){ <br />//过期数据就重新调用一次，并把对象保存在WebApp中 <br />list=getList(); <br />application.setAttribute("list", list); <br />} <br />} <br />size=list.size(); <br />} <br />//生成1000条测试数据 <br />public List&lt;String&gt; getList() { <br />if (list == null) <br />list = new ArrayList&lt;String&gt;(); <br />for (int i = 0; i &lt; 1000; i++) { <br />list.add("" + i); <br />System.out.println(i); <br />} <br />return list; <br />} <br /><br />@Override <br />public String get(int arg0) { <br />// TODO Auto-generated method stub <br />return list.get(arg0); <br />} <br /><br />@Override <br />public int size() { <br />// TODO Auto-generated method stub <br />return size; <br />} <br /><br />如果用paging分页的话，我想大家也对大数据量读取敢感到空或，要是自己去写分页又很麻烦，所以我就想到了这个解决办法，这样可以减少数据的读取次数 <br /><br />也能加快访问速度，应为保存在WebApp中的对象是在内存当中，所以在第二次读取的时候就可以从内存中取，而不是在去读取数据库数据了。这样就可以大大 <br /><br />的优化paging的性能了。 <br /><br />为了保证不读取过期数据，所以在读取WebApp中的存放的Object时，加了一个判断。 <br /><br />只要大家在update,insert,delete操作中把data_flag改为false，让数据重新读取一次就可以了。 <br /><br />毕竟update,insert,delete操作比起select要少的多。要是数据量很大的话，为了不消耗太多的内存，也可以把对象序列化到磁盘上。 <br /><br />要是很注重性能的话，最好还是动态的去添加页面数据。 <br /><br />我很喜欢zk希望可以和大家一起分享。</p>
          <br/>
          <span style="color:red;">
            <a href="http://annbaby.javaeye.com/blog/252496#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' 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/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 14 Oct 2008 06:29:18 +0800</pubDate>
        <link>http://annbaby.javaeye.com/blog/252496</link>
        <guid>http://annbaby.javaeye.com/blog/252496</guid>
      </item>
          <item>
        <title>看起来很美...解读EJB3.1规范</title>
        <author>7upCat</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://7upcat.javaeye.com">7upCat</a>&nbsp;
                    链接：<a href="http://7upcat.javaeye.com/blog/252432" style="color:red;">http://7upcat.javaeye.com/blog/252432</a>&nbsp;
          发表时间: 2008年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong> 前言</strong><br />2004年Rod Johnson以&lt;j2ee development without EJB>为宣言， 吹响了声讨EJB的号角， 后来，J2EE世界的沉重腐朽的柏林墙被推翻，一个春天到来了，J2EE步入了轻量级时代，时至今日，5年过去了，投机贩子Rod Johnson和他鼓弄出来的spring具然成了所谓的事实上的开发标准，以及于，人家现在想变更一下子策略维护策略，跟商业挂点钩，就闹的轩然大波，（请参见kyo100900翻译的平衡的质疑：Spring维护策略的再次调整（完））。<br />然而，被spring以及webservice 等逼入绝境的EJB，挣扎着出了个3.0，还算打了个漂亮的绝对反击战，至少重拾了不少人对它的信心。<br />做为“以人为本”,讨好程序员的体现EJB3.0主要的变化有：<br />1．纳入Gavin King ，clone 了hibernate，出台JPA1.0规范，替代可笑的Entity bean。<br />2．不再强制EJB实现除业务接口外的其它接口，也不强制抛出异常。EJB变成了一个POJO。<br />3．简洁的annotation替代了冗长的xml配置文件，但是通过XML文件将可以对annotation进行覆盖，以保证可以灵活的进行配置。<br />4．Dependency injection.<br />但是，EJB这么多年实在是跟程序员积怨太深，大家总得千方百计的挑它的不是，哪能一下子就妥协大夸它的好呢，要知道程序员可都是很有骨气的。<br />于是，我们说EJB还是不够好，原因如下：<br />1.EJB，必须要在EJB容器中运行，而通常一个好的商用的带EJB容器的应用服务器的价格是不菲的。<br />2.EJB，运行依赖EJB容器，使得单元测试困难，不合现在agile develop,TDD的要求。<br />3.EJB容器的实现，是跟具体的厂商有关的，使得EJB在不同app&nbsp; server上的移植可能出现问题。<br />4.EJB使得使用某些设计模式变得困难，如singleton.<br />等等。。<br />总体起来的结论就是，大家的希望是让EJB变得更加“和霭可亲”，最好变成一个普通JAVA类一样，运行在普通的jvm上，进行开发测试，但又能享受传统容器所提供的强大的企业级服务。通俗点说就是，EJB应该是又能当“婊子”，让每个程序员都能很容易的上手，又能立“牌坊”让它有那么两下子在普通javabean中显得与众不同，另外，不花钱最好。<br />那没有办法了，既然广大群众有这个需求，做为老鸨的JCP就得努力去做啊，毕竟真的EJB死了对谁也没有好处，那么多卖“避孕用品”的(EJB容器厂商)还靠这个过日子呢。还有那么多家其它的妓院（泛指其它平台）还虎视眈眈呢。<br />于是，EJB3.1 规范起草中，而且不时（通常是以月为单位），在the server side 上放出点风，调调大家的胃口，还能美其名约：“收集群众意见！”，我就是被这个棍子上的胡萝卜，牵着鼻子看完了那一系列的文章，那么现在，我们也来总结一下，EJB3.1到底可能会带给我们什么。<br /><br /><br />注：在3.1规范没有出台之前，这些新特性不保证不会被修改。<br /><br /><br /><br /><strong>你夸我简单，那么我就在简单点。</strong><br /><br />EJB2.1被人诟病的一个原因是太麻烦了。要写一个session bean 要写多少东西呢？<br /><br />一个远程/本地的接口。<br />一个Home接口。<br />一个Session bean<br />通常是两个descriptor file&nbsp; ejb-jar.xml&nbsp;&nbsp;&nbsp; xxx-ejb-jar.xml.<br />而且，每个业务方法都要强制你抛出异常，其实是这样子的，有很多程序员一见要try catch&nbsp; 实际上内心是讨厌的，因为他具体也不清楚到底catch了应该怎么处理。SO。<br />到了3.0这个情况有变。简单了，只要写一个业务接口，一个实现类就OK了，还不强制你抛任何异常。也不用写配置文件。还面向接口编程，多cool.<br />代码如下。<br /><br />声明一个远程接口<br /><pre name="code" class="java">@Remote
public interface SimpleSessionBeanRemote {

	public void yourBusinessMethod();
	
}
</pre><br />实现类<br /><pre name="code" class="java">@Stateless
public class SimpleSessionBean  implements SimpleSessionBeanRemote{

	public void yourBusinessMethod() {
		 // do bussiness.
	}
}
</pre><br /><br />其实这个复杂度应该是在大家的接受范围内了，但是JCP还不满足，说，你们不是说EJB麻烦吗。我操，老子这回将简单进行到底，你们不是想要POJO吗，行，这回接口也省了。你们爱怎么玩怎么玩吧。<br /><pre name="code" class="java">@Stateless  public  class RegisterServiceBean {
	@PersistenceContext
		private EntityManager entityManager;
		public void  (User register) {
		entityManager.persist(register);
		}
	}</pre><br />个人认为这个比较多余，但凡是做项目，在不规范，接口其实也还是要写的，JCP这么做其实是表明，你看，EJB现在也可以就是个JAVA类，你写个Hello World 一样的java 类，它也可以是EJB，恩！java也在向.NET学习，模糊java bean&nbsp; 和EJB的界线，EJB是什么，EJB就是声明了企业级服务的普通java bean。<br /><br /><strong>声明式的同步控制及singleton pattern</strong><br /><br />一个好消息，EJB3.1将会有单例模式的EJB，这应该是一种新的EJB类型。<br />你可能要问，这个有什么用，我们为什么要单例。当你的应用中有一些数据将被整个应用共享时，你不希望，这些资源被重复的获得，你希望将它们统一缓存在一个对象中，那么这个对象就应该是单例的，你可能要说，那很简单啊，单例，我写过，我还知道有两种模式，一种叫“懒汉式”，一种叫”饿汉式”，当然，如果你的应用是一个stand alone应用，这个是可以的，但当你的应用处于一个集群环境中这个就会有问题，也许你考虑，使用一些cache的中间件，如JBoss Cache, OSCache, JCS and SwarmCache,但这些总会给你的应用带来这样那样的额外的复杂度。<br />EJB3.1中将使用 @Singleton 标的bean来解决这个问题。(当然这个取决于具体厂商的实现)<br />示例代码如下:<br /><br /><pre name="code" class="java">
@Singleton
public class TransferFeeLevelBean {

	@PersistenceContext
	private EntityManager entityManager;
	private FeeLevel feeLevel;

	@PostConstruct
	private void init() {
		rate = entityManager.find(FeeLevel.class, new Integer(1));
	}

	public FeeLevel getFeeLevel() {
		return feeLevel;
	}

	public void setFeeLevel(FeeLevel feeLevel) {
		this.feeLevel = feeLevel;
	}

}
 </pre><br />因为是单例的，所以一定要考虑并发的问题，默认情况下@Singleton标的bean中的所有方法都是线程安全，并支持事务的。<br />你也可以使用jdk1.5 中的concurrent一样的风格对这个bean进行声明式的线程控制。<br /><br /><br /><pre name="code" class="java">@Singleton
@ConcurrencyAttribute(READ_LOCK) 
//读锁
public class TransferFeeLevelBean {

       //..

//读写锁
@ConcurrencyAttribute(READ_WRITE_LOCK) 
</pre><br /><br />你甚至可以手工去控制同步。（类似事务的BMT）<br /><pre name="code" class="java">
@Singleton
@ConcurrencyManagement(BEAN)
public class TransferFeeLevelBean {

	@PersistenceContext
	private EntityManager entityManager;
	private FeeLevel feeLevel;

	@PostConstruct
	private void init() {
		rate = entityManager.find(FeeLevel.class, new Integer(1));
	}

	Public synchronized FeeLevel getFeeLevel() {
		return feeLevel;
	}

	public void setFeeLevel(FeeLevel feeLevel) {
		this.feeLevel = feeLevel;
	}

}


</pre><br /><br /><br /><br /><br /><strong>可以异步执行的session bean</strong><br /><br />企业级应用中，异步处理在某些场合上是必须的，比如你是一个企业网银的用户，你将进行一次几万笔的批量转帐，如果这个过程采用同步处理，你可能要等上十分钟的时间，这是用户无法忍受的，现实中，我们采用异步的方式进行处理，这个异步无论是用后台的job来跑也好，用JMS也罢，现在呢，其实我们也只是多了一种选择，而已。<br />3.1中，session bean将具备异步处理的能力，只要你在需要进行异步处理的方法上添加一个<br />@Asynchronous的标注。<br /><br /><br />如下<br /><pre name="code" class="java">
@Stateless
public class BatchTransferProcessBean {

	//..
	@Asynchronous
	public void processTransfer(List transDetail)
	{   try{
		 process(transDetail);
	       //send message for success;    
	}catch(Exception)
	    {
	    	
		 //send message for fail;  
	    }
	}
	//..
}
</pre><br /><br /><br />当系统调用这个processTransfer方法时会马上返回，继续执行当前的调用。如果你还需要有返回值的话也是可以的，它采用的是jdk 1.5中的那个<br />Futher模式，当你调用方法的时候它将继续执行，当你想去取结果的时候，如果异步调用没有完成它会卡在那。（这个只是在JDK1.5中是这样子的，在ejb3.1中会不会也采用这个样子的偶好像也确定的来，应该也是由具然的容器商来决定的吧应该），如下。<br /><br /><br /><pre name="code" class="java">@Stateless
public class BatchTransferProcessBean {

	//..
	@Asynchronous
	Public Future&lt;Boolean> processTransfer(List transDetail)



</pre><br /><br /><br /><strong>统一的JNDI命名</strong><br />这个不用我说了吧，这个有在不同的服务器上布署EJB应用的人应该都有体会吧。<br />Weblogic上使用JNDI查找是<br />EJB名称#远程接口的全限定名<br />JBOSS好像是<br />Bean的名字/Remote(Local)<br />其它应用服务器没有用过，反正应该是每个每个都不一样，很是恶心。<br />因为这个，实际上EJB在不同服务器上是不可以无条件移殖的。现在JCP终于要对这个进行规范了，7UpCat是真的很高兴。。虽然这个不是什么太大的问题，不过每次学习写DEMO的时候偶的脑子总是不够用，又不舍得把时间浪费在记这些无聊的没有意义的东西上面。<br />这下子好了。<br /><br /><strong>在J2SE上潜入EJB容器</strong><br /><br /><br /><img src="http://www.theserverside.com/tt/articles/content/NewFeaturesinEJB31-Part5/clip_image001.jpg" /><br /> <br /><br />当然首先要说明这个容器肯定不会很牛B，但我们也不要求它多牛B，只要能很方便的进行unit test那么我们已很高兴了，同志们，你是否想过，EJB可以跟普通的JAVA bean 一样在你的IDE中进行书写编译完成直接就可以运行进行测试呢？不用打包，不用布署，没有那该死的应用服务器，(我跟我老大统计过，基本上，在偶们的机子上跑一次weblogic要3.5分钟，约等于去烟室吸一支烟的时间).<br />你是否想过你的EJB以后也可以用Junit等工具类似如下代码进行测试呢？<br /><br /><pre name="code" class="java">
@RunWith(EmbeddableEJB3Runner.class)
public class PlaceBidTest {
    @EJB
    private PlaceBid placeBid;

    @Test
    public void testAddBid() {
        placeBid.addBid(new Bid("rrahman", 10059, 200.50));
    }
}
</pre><br /><br /><br />关于JSF<br /><br />这个东西，我还没有玩过，所以不方便乱说话，有兴趣大家自己找来看看区别是啥。<br /><br /><br /><br /><br />Quartz 很伟大，那么EJB中的定时器，就应该和它一样伟大<br /><br />标题在几年前，其实可以改成Hibernate 很伟大，那么Entity Bean就应该跟它一样伟大，于是现在的JPA变得跟hibernate一样伟大了。<br />Ejb3.0的Timer我基本没有用过，因为它确实不够强大，也不够灵活，在我看来支持Cron的Quartz简直是太方便了，在EJB3.1这一点也将有所改变。Timer将变得使用起来更简单，并且，时间设置更强大，它也将支持cron。<br /><br /><pre name="code" class="java">

@Stateless
public class SimpleJob implements    {

    @Schedule(second="0", minute="0", hour="0",
                  dayOfMonth="1", month="*", year="*")
    public void sendEmail() {
        ... Code to generate the monthly news letter goes here...
    }
}</pre><br /><br />@Schedule 标注很简捷以cron的方式进行声明执行的时间，简懂.估计以后会用得很多。<br /><br /><br /><br /><br /><strong>总结</strong><br />当然，其它的新特性肯定还有很多，这里就不一一例举了，毕竟也都12点多了。<br />我们看了这些新特性发现，实际上以后EJB会向一个更加开放，更加简洁的方向发展，JCP努力的方向是这样，尽量保证EJB和普通是JAVA BEAN是一样的，然后通过声明来区分它们，这和.NET 中的思想是类似的。<br />一个普通的JAVA BEAN只要我进行了适当的声明，那么我也就是一个EJB了。<br />另一方面，现在JCP想尽量提供一个在本机可以使EJB运行起来的容器，最好是嵌入在JVM中，那么将大大提高EJB的开发效率。<br />一切看起来都很美，但最终出台以及容器厂商的实现以及广泛应用又要几年呢？<br />其实我认识spring 和EJB实际上本不是对应的，你用了EJB，项目中一样可以用SPRING ，毕竟SPRING 做为一个粘合剂还是很强大的。<br /><br />另外，晚安，我亲爱的同行们，我们明天还要挻起胸膛去战斗呢.
          <br/>
          <span style="color:red;">
            <a href="http://7upcat.javaeye.com/blog/252432#comments" style="color:red;">已有 <strong>9</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 14 Oct 2008 00:20:09 +0800</pubDate>
        <link>http://7upcat.javaeye.com/blog/252432</link>
        <guid>http://7upcat.javaeye.com/blog/252432</guid>
      </item>
          <item>
        <title>谈谈java和actionscript中的单例模式</title>
        <author>nijiaben</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nijiaben.javaeye.com">nijiaben</a>&nbsp;
                    链接：<a href="http://nijiaben.javaeye.com/blog/252417" style="color:red;">http://nijiaben.javaeye.com/blog/252417</a>&nbsp;
          发表时间: 2008年10月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          大家都知道java和actionscript都是面向对象的，而且相信大家也都知道一些面向对象的设计模式，下面主要针对单例模式在这两种语言中的实现做个简单的比较。<br />&nbsp;&nbsp;&nbsp; 首先我们知道java中的构造函数的访问权限是可以有3种的，public,protected,public，但是我们要实现单例模式，通常我们不把它设为public类型的，通常设置为protected或private类型,也许有人会觉得就只应该设置为private类型。不要急，我这里设置为protected类型主要是为了能让子类能继承，使子类能够依靠父类实例化。在java中主要有三种设计方法，第一种是饿汉式单例类，代码实现类似如下：<pre name="code" class="java">
package Singleton.eager;

public class EagerSingleton {
	private static final EagerSingleton m_instance=new EagerSingleton();
	
	private EagerSingleton(){
		
	}
	public static EagerSingleton getInstance(){
		return m_instance;
	}

}
</pre><br />在此类中，主要是在这个类被加载时静态变量会被初始化，此时唯一的对象就创建出来了哈。<br />第二种是懒汉式单例类，代码实现如下，也是我们最常用方法：<br /><pre name="code" class="java">
package Singleton.lazy;

public class LazySingleton {
	private static LazySingleton m_instance=null;
	
	private LazySingleton(){
		
	}
	
	synchronized public static LazySingleton getInstance(){
		if(m_instance==null){
			m_instance=new LazySingleton();
		}
		return m_instance;
	}

}
</pre><br />在这种方式中只有当我们在第一次调用了getInstance()方法时才创建唯一实例，同时我们用了关键字synchronized,主要是为了适应多线程环境。<br />最后的话是所谓的登记式单例模式，示例代码如下：<br /><pre name="code" class="java">
package Singleton.reg;

import java.util.HashMap;

public class RegSingleton {
	private static HashMap m_registry=new HashMap();
	static{
		RegSingleton x=new RegSingleton();
		m_registry.put(x.getClass().getName(), x);
	}
	
	protected RegSingleton(){
		
	}
	
	public static RegSingleton getInstance(String name){
		if(name==null){
			name="Singleton.reg.RegSingleton";
		}
		if(m_registry.get(name)==null){
			try{
				m_registry.put(name, Class.forName(name).newInstance());
			}catch(Exception e){
				System.out.println("Error happended");
			}
		}
		return (RegSingleton)(m_registry.get(name));
	}
	
	public String about(){
		return "Hello,I am RegSingleton";
	}

}
</pre><br />这一方法克服了前面两种不可继承的缺点，接着我们看看它的子类的一个例子：<br /><pre name="code" class="java">package Singleton.reg;

public class RegSingleChild extends RegSingleton {
	
	public RegSingleChild(){
		
	}
	public static RegSingleChild getInstance(){
		return (RegSingleChild)RegSingleton.getInstance("Singleton.reg.RegSingleChild");
	}
	
	public String about(){
		return "Hello,I am RegSingleChild";
	}

}
</pre><br />由于我们这的子类必须允许父类以构造函数调用产生实例，因此我们这里的子类的构造函数必须是public类型的。<br />&nbsp;&nbsp;&nbsp; 接下来我们再来谈谈actionscript中的单例模式的实现，我们都知道在actionscript3.0中，构造函数都必须是public类型的，不能为private类型的，也不能有多个构造函数，因此我们不能像java那样建立单例模型，但是我们考虑到参数类型，如果我们的构造函数带有参数，而且指定类型的话，并且这种类型只有在同一个文件中才能访问的话，那么我们就可以做到只建立单例模型了，很幸运的是，在actionscript3.0中,我们的单个文件允许在包外创建类和方法，因此我们可以利用此来实现as中的单例模型，代码如下：<br /><pre name="code" class="java">package org.rjb.model
{
	import com.adobe.cairngorm.model.ModelLocator;
	
	import mx.collections.ArrayCollection;
	
	[Bindable]
	public class UserModelLocator implements ModelLocator
	{
		private static var modelLocator:UserModelLocator;
		public var userModel:AddUserModel=new AddUserModel();
		public var userCollection:ArrayCollection=new ArrayCollection();
		public static function getInstance():UserModelLocator{
			if(modelLocator==null){
				modelLocator=new UserModelLocator(new SingletonEnforcer());
			}
			return modelLocator;
		}
		public function UserModelLocator(enforcer:SingletonEnforcer) {
			if (enforcer == null) {
					throw new Error( "You Can Only Have One UserModelLocator" );
			}
		}
	}
}
// Utility Class to Deny Access to Constructor
class SingletonEnforcer {}</pre><br />好了，代码展示以及简单的说明就到此了，希望这些能帮您更好的理解设计模式中的单例模式，在今后的文章中也会对比其他设计模式在这两种语言中的异同及实现的
          <br/>
          <span style="color:red;">
            <a href="http://nijiaben.javaeye.com/blog/252417#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 13 Oct 2008 23:08:02 +0800</pubDate>
        <link>http://nijiaben.javaeye.com/blog/252417</link>
        <guid>http://nijiaben.javaeye.com/blog/252417</guid>
      </item>
          <item>
        <title>使用JavaScript提交数据,不使用表单也可以!</title>
        <author>amcucn</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://amcucn.javaeye.com">amcucn</a>&nbsp;
                    链接：<a href="http://amcucn.javaeye.com/blog/252411" style="color:red;">http://amcucn.javaeye.com/blog/252411</a>&nbsp;
          发表时间: 2008年10月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>工作中碰到一个问题,有一个输入框,需要用户输入内容,然后点击按钮进行提交!</p>
<p>&nbsp;</p>
<p>我们通常的做法就是写一个FORM表单.但是这时会出现一点问题,那就是样式会有所变化,好像多出了那么一点空白空间.这样就会影响到美观,当然可以通过修改样式来更改!不过做为程序员,通常还是喜欢使用程序去实现.相当于换个思路!</p>
<p>&nbsp;</p>
<p>这里我给大家提供一种方法:</p>
<p>&nbsp;</p>
<p>使用JavaScript进行数据提交,其实就是一个页面跳转!</p>
<p>&nbsp;</p>
<p>代码如下:</p>
<pre name="code" class="js">function submit() {
 var textValue = document.getElementById("id").value; //这里的id是文本输入框的id
//使用下面的方法进行页面跳转,页面跳转的时候可以带参数,所以就可以提交数据

window.location.href="result.jsp?text="+textValue;

//这里的地址可以是任意的地址,包括提交路径等!</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://amcucn.javaeye.com/blog/252411#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 13 Oct 2008 22:49:18 +0800</pubDate>
        <link>http://amcucn.javaeye.com/blog/252411</link>
        <guid>http://amcucn.javaeye.com/blog/252411</guid>
      </item>
          <item>
        <title>Flex+BlazeDS整合J2ee示例</title>
        <author>malipei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://malipei.javaeye.com">malipei</a>&nbsp;
                    链接：<a href="http://malipei.javaeye.com/blog/252405" style="color:red;">http://malipei.javaeye.com/blog/252405</a>&nbsp;
          发表时间: 2008年10月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近一个礼拜一直在研究flex，从Flex Builder 3 Plug-in的安装，到ActionScript3语言的学习，再到flex整合j2ee的开发，这一路走了不少<br /><br />弯路，其实配置开发环境，看别人演示是学习得最快的，如果光看文字描述是比较累的事情，描述了半天不然一张截图说明问题，这里总结一<br /><br />下flex+BlazeDS整合j2ee开发环境的配置过程：<br /><br />&nbsp; 1.从http://opensource.adobe.com/wiki/display/blazeds/BlazeDS/ 下载BlazeDS<br />&nbsp;&nbsp; <br />&nbsp; 2.新建一个web project 名为：flexDemo<br /><br />&nbsp; 3.解压BlazeDS.war到%TOMCAT_HOME%/webapps目录下文件名为blazeds内包涵了WEB-INF和META－INF文件夹<br /><br />&nbsp; 4.在flexDemo/src目录下新建类HelloWorld<br /><br /><pre name="code" class="java">package cn.riahome.java;

/**
 * &lt;p>功能:&lt;/p>
 * &lt;p>生成日期: 2008-10-13&lt;/p>
 * &lt;p>说明：&lt;/p>
 * @author lipei_ma
 * @version V1.0
 * @修改日志:
 */
public class HelloWorld {

	public HelloWorld() {
	}

	public String getHelloWorld(String name) {
		return "Hello World!"+name;
	}
}</pre><br />&nbsp; 5.部署 应用flexDemo到Tomcat服务器中，并启动服务。<br /><br /><img src="/upload/attachment/42405/e7d8d1cb-a9ed-3c26-8d9b-71f145382c71.jpg" /><br /><br /><br /><img src="/upload/attachment/42407/47ce1269-4a46-3802-9477-8f91588a7c5a.jpg" /><br /><br /><br /><br />6.为flexDemo添加blazeds支持： 将%TOMCAT_HOME%/webapps/BlazeDS/WEB-INF/lib目录下面所有jar文件拷贝到 flexDemo 的webRoot/WEB-<br /><br />INF/lib 目录下. 将%TOMCAT_HOME%/webapps/blazeds/WEB-INF/flex 目录拷贝到Demo的webContent/WEB-INF 下. 拷贝%TOMCAT_HOME%/webapps <br /><br />/BlazeDS/WEB-INF/ 下的web.xml覆盖flexDemo的 web.xml ,至此,我们的Demo已经具备了blazeds 的功能.<br /><br /><br /><br />&nbsp; 7.为项目增加Flex支持，右键项目名称，点击Flex Project Nature/Add Flex Project Nature<br /> <br /><br /><img src="/upload/attachment/42409/b070aaa7-0f0e-3260-bdc5-d6f1cd37d6fd.jpg" /><br /><br /><img src="/upload/attachment/42411/6d6cddb1-4aee-3ffb-99e2-e265514096cd.jpg" /><br /><br /><img src="/upload/attachment/42413/f70b1bfe-80c6-377b-8a1e-6423b5b3ac83.jpg" /><br /><br /><br />&nbsp; 8.编辑flexDemo.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" layout="absolute">
     &lt;mx:RemoteObject id="say" destination="helloWorld">           
     &lt;/mx:RemoteObject>
     &lt;mx:Button x="335" y="80" label=" Click" click="remotingSayHello(event);"/>     
     &lt;mx:TextInput x="159" y="80" id="tiName"/>     
     &lt;mx:Label x="109" y="82" text="name:"/>     
     &lt;mx:Label text="{say.getHelloWorld.lastResult}" x="44" y="162" width="448" height="71" id="lblView" color="#FCEE09" 

fontSize="20" fontWeight="bold" textDecoration="underline" fontStyle="normal"/>     
     &lt;mx:Script>
	     &lt;![CDATA[
		     public function remotingSayHello(event:Event):void{        
			     var iname:String=tiName.text;          
			     say.getHelloWorld(iname);          
		     }
	     ]]&gt;
     &lt;/mx:Script> 
&lt;/mx:Application></pre><br /><br />&nbsp; 编辑WEB-INF/flex/remoting-config.xml文件&nbsp; <br /><pre name="code" class="java">    &lt;destination id="helloWorld">
		&lt;properties>
			&lt;source>cn.riahome.java.HelloWorld&lt;/source>
		&lt;/properties>
     &lt;/destination></pre><br /><br /><br />9.右键项目名称，点击properties/Flex Builder Path修改output folder URL,点击properties/Flex Build Path修改Flex SDK Version<br /><br /><br /><img src="/upload/attachment/42415/4e446729-1d7a-351c-8e4c-bffcfd2b8dc3.jpg" /><br /><br /><img src="/upload/attachment/42417/1e89291b-d619-3b6a-9da6-f7a2c3f92d80.jpg" /><br /><br /><br />10.运行flexDemo.mxml即可<br /><br /><br /><img src="/upload/attachment/42419/e268dd5b-70a0-339b-ba50-2c2036b435e6.jpg" /><br /><br /><br /><br /><img src="/upload/attachment/42423/8492cb66-392d-328c-8517-acf2438e2d41.jpg" /><br /><br />附：在此感谢badqiu的远程协助，并请各位多关注http://www.rapid-framework.org.cn/
          <br/>
          <span style="color:red;">
            <a href="http://malipei.javaeye.com/blog/252405#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 13 Oct 2008 22:40:10 +0800</pubDate>
        <link>http://malipei.javaeye.com/blog/252405</link>
        <guid>http://malipei.javaeye.com/blog/252405</guid>
      </item>
          <item>
        <title>xquery如何删除xml文档中的namespace</title>
        <author>flyisland</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flyisland.javaeye.com">flyisland</a>&nbsp;
                    链接：<a href="http://flyisland.javaeye.com/blog/252396" style="color:red;">http://flyisland.javaeye.com/blog/252396</a>&nbsp;
          发表时间: 2008年10月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          项目中常常碰到为一些所谓遗留系统提供web service接口的需求，而这些遗留系统的接口只是采用字符串作为输入、输出参数，并且字符串的内容就是xml格式也常常碰见。<br /><br /><br />其实上述情况倒是比较容易处理，但是一个常见问题是从web service进入的xml文档是带有namespace定义的，而遗留系统处理的xml基本上是没有namesapce定义。所以就有将xml文档的namespace删除的需求。在网上查到一些样例，经过自己测试和改写，算是有了一个xquery的小程序。如下：<br /><br /><br /><pre name="code" class="java">(:: pragma  parameter="$anyXML" type="xs:anyType" ::)

declare namespace xf = "http://test";

declare function xf:stripNamespace($anyXML as node()*)
    as node()* {
        for $node in $anyXML
        return if ($node instance of element())
         	then (element
               {expanded-QName ("", local-name($node))}
               {$node/@*,
                xf:stripNamespace($node/node())})
         else if ($node instance of document-node())
         then xf:stripNamespace($node/node())
         else $node
};

declare variable $anyXML as element(*) external;
declare variable $namespace as xs:string external;

xf:stripNamespace($anyXML)</pre>
          <br/>
          <span style="color:red;">
            <a href="http://flyisland.javaeye.com/blog/252396#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 13 Oct 2008 22:19:28 +0800</pubDate>
        <link>http://flyisland.javaeye.com/blog/252396</link>
        <guid>http://flyisland.javaeye.com/blog/252396</guid>
      </item>
          <item>
        <title>数据库转换</title>
        <author>chen_zhongjian</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chen-zhongjian.javaeye.com">chen_zhongjian</a>&nbsp;
                    链接：<a href="http://chen-zhongjian.javaeye.com/blog/252378" style="color:red;">http://chen-zhongjian.javaeye.com/blog/252378</a>&nbsp;
          发表时间: 2008年10月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          第一:将你的sql 生成脚本文件<br />第二：使用powerdesigner 新建一个powerdesigner 工程<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 接下来使用反向：File---->Reverse Engineer 工具选择Database<br />&nbsp;&nbsp;&nbsp;&nbsp; 接下来选择你到导入数据库脚本的类型例如：sql、mysql等，然后在选择<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 脚本所在的文件，点击确认。<br />第三：将反向成设计视图的视图选择生成数据库类型例如：mysql，再生成数据库脚本.&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意：这个地方我们不要生成了，可以先检查一下语法，如果没有错误，在生成<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 脚本的地方选择预览脚本，并将其拷贝到一个普通文件下。<br />第四：在mysql 控制台执行你刚刚拷贝出来的文件，会生成myslq表结构<br />第五：如果想要得到数据，请选择你要导入的数据表，更具odbc的数据源提示，导入你需要的表就行了。
          <br/>
          <span style="color:red;">
            <a href="http://chen-zhongjian.javaeye.com/blog/252378#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 13 Oct 2008 21:25:58 +0800</pubDate>
        <link>http://chen-zhongjian.javaeye.com/blog/252378</link>
        <guid>http://chen-zhongjian.javaeye.com/blog/252378</guid>
      </item>
          <item>
        <title>钱到底哪里去了</title>
        <author>fly_ever</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fly-ever.javaeye.com">fly_ever</a>&nbsp;
                    链接：<a href="http://fly-ever.javaeye.com/blog/252374" style="color:red;">http://fly-ever.javaeye.com/blog/252374</a>&nbsp;
          发表时间: 2008年10月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          tianxinet同学大发感叹，钱到底哪里去了<br /><a href="http://www.javaeye.com/topic/251718" target="_blank">http://www.javaeye.com/topic/251718</a><br />想了半天，想的一些东西，不知道对不对，大家来评评。<br /><br />&nbsp;&nbsp;&nbsp; 假设有一个村落， 他们都从一个人（假设这个人家A）以价格10元买入了某种东西，所以他们就持有该种东西（例如股票）， 但是这个村子以外有人（假设这个人是B）看到了， 也想买入这种东西。正好有一个村民缺钱， 于是他就从该村民以更高的价格买入了该东西， 假设这个价格为15（在股票市场上可以说是某一天的成交价为15）， 于是其他村民就都用15*手中持有的数量表示他们的财富。 第二天又有人从该村其他村民手中以价格为20买了改东西， 于是大家的财富就变成了：20*手中持有的数量。每天都这样不断的买卖。但是突然有一天价格到了100，大家都觉得目前的价格太高， 不值这么多。于是比较厉害的人就马上出手这种东西。 大家看到之后， 忽然醒悟。于是乎这种东西就不值钱了， 只能卖5元， 于是大家的财富就变为了5*手中持有的数量。<br />&nbsp;&nbsp;&nbsp; 在股市之中就是说，A就是该股票的发行人，他要扩大业务，或者制造拥有新技术想投入应用。于是就利用自己的技术要借债，即发行股票。这样A就开始他的事业了。而这个村落里面的人就是原始股的股东。而后来B就觉得A的事业能赚钱， 于是就从原始股的股民手中拿到股票。。。。。。<br />&nbsp;&nbsp; 所以，价格在涨的时候， 买股票的人的财富就增加了， 而价格在跌下来的时候， 买股票的人就损失了。就像2006-2007年上半年的人就挣了，后来跟进的人就损失了。但其中很多人是买进卖出买进卖出不断的操作。他们的财富就看他们的操作而定。 <br />而股民都是看着别人的成交价来估算自己的总市值。加起来就是整个市场的总市值，这就说明了股票的市值都是虚拟的，是纸上富贵，只要你没有把手中的股票变成现钱，你就不能称自己手中有多少钱（股票的价值）。于是就有新闻了，股市增加了多少财富或者蒸发了多少财富。<br /><br />&nbsp;&nbsp;&nbsp; 再假设，这个市场上有很多这种产品（有不同的股票）。在这些股民中有一个人c比较厉害，能够比价好的预测这支股票什么时候涨，什么时候会跌。那么在早期他就通过买入卖出挣到挺多的钱。但是他也会想挣更多的钱，由于时间精力等原因，不能操作很多种股票，于是他就会雇佣很多的帮手，慢慢的帮手也会越来越多（变成了一个公司）。到了一定时候，这个人挣了够多的钱，他也能发行股票。。。。。<br />&nbsp;&nbsp;&nbsp; 由于这些不断上涨的价格越来越远离实际价值。泡沫越来越大。终于有一天，大部分股票的价格跌下来了。于是这个人C就会面临很多问题，自己持有的很多股票一文不值了，然后它自己的股票也就一文不值了。而他这个时候却还雇佣了很多的帮手，还有办公室的开支等等。但是这些费用他也无力承担了。所以只好破产。C的钱哪里去了呢？<br />C的确是挣了很多的钱，但是这些收入已经被用于维持公司运营的开支。从整个过程来看，C没有创造任何实际价值，但是他维持了整个公司的运营，和员工高薪，高福利的开支。实际上他挣了很多钱，但是其中很多已经被花费掉了，所以最后也是破产。<br /><br />从这里，大家可以自己算算，那些投入股市的钱哪里去了？<br />1》	A的事业；价格在上涨的时候，高价卖出低价买进的人挣了一点<br />2》	还有就是虚拟经济，都是纸上泡沫，没有变成现钱。手上持有的股票的价格上升下跌，没有人事实上挣到这部分钱。这部分钱实际上是泡沫炒出来的，根本就是虚拟的。
          <br/>
          <span style="color:red;">
            <a href="http://fly-ever.javaeye.com/blog/252374#comments" style="color:red;">已有 <strong>4</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </spa