<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[菜虫]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[]]></description>
<link>http://hi.baidu.com/ghina</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[DirectX]]></title>
        <link><![CDATA[http://hi.baidu.com/ghina/blog/item/2c390124d49e59398644f900.html]]></link>
        <description><![CDATA[
		
		d3dUtility.obj : error LNK2001: unresolved external symbol __imp__timeGetTime@0 <br>
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main <br>
Debug/d3dInit.exe : fatal error LNK1120: 2 unresolved externals <br>
Error executing link.exe.<br>
<br>
<p>选择VC的菜单项“Project/Settings...”，然后选中“Link”标签，在“Object/library modules”栏输入“d3d9.lib d3dx9.lib”（本节中的例程只用到了d3d9.lib，另外一个库文件是为后面程序准备的）。</p>
设置目录是没有用的，你还要将库添上。这样编译才知道你要连接那个库，设置目录只是方便我们填写<br>
加上winmm.lib 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/ghina/blog/category/Directx">Directx</a>&nbsp;<a href="http://hi.baidu.com/ghina/blog/item/2c390124d49e59398644f900.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-14  15:31</pubDate>
        <category><![CDATA[Directx]]></category>
        <author><![CDATA[ghina]]></author>
		<guid>http://hi.baidu.com/ghina/blog/item/2c390124d49e59398644f900.html</guid>
</item>

<item>
        <title><![CDATA[算法]]></title>
        <link><![CDATA[http://hi.baidu.com/ghina/blog/item/34aa75023dd6f1054bfb51ba.html]]></link>
        <description><![CDATA[
		
		http://www.tjnu.edu.cn/ini/arithetics/method.htm 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/ghina/blog/category/%CB%E3%B7%A8">算法</a>&nbsp;<a href="http://hi.baidu.com/ghina/blog/item/34aa75023dd6f1054bfb51ba.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-14  11:47</pubDate>
        <category><![CDATA[算法]]></category>
        <author><![CDATA[ghina]]></author>
		<guid>http://hi.baidu.com/ghina/blog/item/34aa75023dd6f1054bfb51ba.html</guid>
</item>

<item>
        <title><![CDATA[整数划分问题]]></title>
        <link><![CDATA[http://hi.baidu.com/ghina/blog/item/5acffd7b9b372efe0ad187c1.html]]></link>
        <description><![CDATA[
		
		<div class="cnt" >
<p>整数划分问题是将一个正整数n拆成一组数连加并等于n的形式，且这组数中的最大加数不大于n。<br>
如6的整数划分为<br>
最大数&#160;&#160;<br>
6&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;  6<br>
5&#160;&#160;&#160;&#160;&#160;&#160;&#160;   5 + 1<br>
4&#160;&#160;  &#160;&#160;&#160;&#160;&#160;  4 + 2, 4 + 1 + 1<br>
3&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;  3 + 3, 3 + 2 + 1, 3 + 1 + 1 + 1<br>
2&#160;&#160;&#160;&#160;&#160;&#160;&#160;   2 + 2 + 2, 2 + 2 + 1 + 1, 2 + 1 + 1 + 1 + 1<br>
1&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;  1 + 1 + 1 + 1 + 1 + 1<br>
<br>
共11种。下面介绍一种通过递归方法得到一个正整数的划分数。<br>
<br>
递归函数的声明为 int split(int n, int m);其中n为要划分的正整数，m是划分中的最大加数(当m &gt; n时，最大加数为n)，<br>
1 当n = 1或m = 1时，split的值为1，可根据上例看出，只有一个划分1 或 1 + 1 + 1 + 1 + 1 + 1<br>
可用程序表示为if(n == 1 || m == 1) return 1;<br>
<br>
2 下面看一看m 和 n的关系。它们有三种关系<br>
(1) m &gt; n<br>
在整数划分中实际上最大加数不能大于n，因此在这种情况可以等价为split(n, n);<br>
可用程序表示为if(m &gt; n) return split(n, n);&#160;&#160;&#160;  <br>
(2) m = n<br>
这种情况可用递归表示为split(n, m - 1) + 1，从以上例子中可以看出，就是最大加<br>
数为6和小于6的划分之和<br>
用程序表示为if(m == n) return (split(n, m - 1) + 1);<br>
(3) m &lt; n<br>
这是最一般的情况，在划分的大多数时都是这种情况。<br>
从上例可以看出，设m = 4，那split(6, 4)的值是最大加数小于4划分数和整数2的划分数的和。<br>
因此，split(n, m)可表示为split(n, m - 1) + split(n - m, m)<br>
<br>
根据以上描述，可得源程序如下：<br>
</p>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><span style="color: rgb(0, 0, 0);">#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">stdio.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br>
<br>
</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> split(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> n, </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> m)<br>
{<br>
</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(n </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">1</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">||</span><span style="color: rgb(0, 0, 0);"> m </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">1</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">0</span><span style="color: rgb(0, 0, 0);">;<br>
</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(n </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">1</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">||</span><span style="color: rgb(0, 0, 0);"> m </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">1</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">1</span><span style="color: rgb(0, 0, 0);">;<br>
</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(n </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> m) </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> split(n, n);<br>
</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(n </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> m) </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> (split(n, m </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">1</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">1</span><span style="color: rgb(0, 0, 0);">);<br>
</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(n </span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> m) </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> (split(n, m </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">1</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> split((n </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> m), m));<br>
}<br>
<br>
</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> main()<br>
{<br>
printf(</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">12的划分数: %d</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">, split(</span><span style="color: rgb(128, 0, 128);">12</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(128, 0, 128);">12</span><span style="color: rgb(0, 0, 0);">));<br>
</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">0</span><span style="color: rgb(0, 0, 0);">;<br>
}</span></div>
<p><br>
<font size="4" style="font-weight: bold; color: rgb(255, 0, 0);">将正整数划分成连续的正整数之和</font><br>
如15可以划分成4种连续整数相加的形式：<br>
15<br>
7 8<br>
4 5 6<br>
1 2 3 4 5<br>
<br>
首先考虑一般的形式，设n为被划分的正整数，x为划分后最小的整数，如果n有一种划分，那么<br>
结果就是x,如果有两种划分，就是x和x x + 1， 如果有m种划分，就是 x 、x x + 1 、 x x + 1 x + 2 、... 、x x + 1 x + 2 ... x + m - 1<br>
将每一个结果相加得到一个公式(i * x + i * (i - 1) / 2) = n，i为当前划分后相加的正整数个数。<br>
满足条件的划分就是使x为正整数的所有情况。<br>
如上例，当i = 1时，即划分成一个正整数时，x = 15， 当i = 2时， x = 7。<br>
当x = 3时，x = 4， 当x = 4时，4/9，不是正整数，因此，15不可能划分成4个正整数相加。<br>
当x = 5时，x = 1。<br>
<br>
这里还有一个问题，这个i的最大值是多少？不过有一点可以肯定，它一定比n小。我们可以做一个假设，<br>
假设n可以拆成最小值为1的划分，如上例中的1 2 3 4 5。这是n的最大数目的划分。如果不满足这个假设，<br>
那么 i 一定比这个划分中的正整数个数小。因此可以得到这样一个公式i * (i + 1) / 2 &lt;= n，即当i满足<br>
这个公式时n才可能被划分。<br>
<br>
综合上述，源程序如下</p>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> split1(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> n)<br>
{<br>
</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> i, j, m </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">0</span><span style="color: rgb(0, 0, 0);">, x, t1, t2;<br>
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 在这里i + 1之所以变为i - 1，是因为i * (i - 1) / 2这个式子在下面多次用到，<br>
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 为了避免重复计算，因此将这个值计算完后保存在t1中。并且将&lt;= 号变为了&lt;号。</span><span style="color: rgb(0, 128, 0);"><br>
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">(i </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">1</span><span style="color: rgb(0, 0, 0);">; (t1 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> (i </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">1</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">2</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> n; i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">) <br>
{<br>
t2 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (n </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> t1);<br>
x </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&#160;&#160;  t2 </span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);"> i;<br>
</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(x </span><span style="color: rgb(0, 0, 0);">&lt;=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">0</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(0, 0, 255);">break</span><span style="color: rgb(0, 0, 0);">;<br>
</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">((n </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> t1) </span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">0</span><span style="color: rgb(0, 0, 0);">)<br>
{<br>
printf(</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">%d </span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">, x);<br>
</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">(j </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">1</span><span style="color: rgb(0, 0, 0);">; j </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> i; j</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">)<br>
printf(</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">%d </span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">, x </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> j);<br>
printf(</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">\n</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">);<br>
m</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">;<br>
}<br>
}<br>
</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> m;<br>
}</span></div>
</div> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/ghina/blog/category/%CB%E3%B7%A8">算法</a>&nbsp;<a href="http://hi.baidu.com/ghina/blog/item/5acffd7b9b372efe0ad187c1.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-14  10:23</pubDate>
        <category><![CDATA[算法]]></category>
        <author><![CDATA[ghina]]></author>
		<guid>http://hi.baidu.com/ghina/blog/item/5acffd7b9b372efe0ad187c1.html</guid>
</item>

<item>
        <title><![CDATA[21点规则]]></title>
        <link><![CDATA[http://hi.baidu.com/ghina/blog/item/0e0efe23c0190744925807d6.html]]></link>
        <description><![CDATA[
		
		<div class="tit"> </div>
<div class="date">2009-05-09 01:32</div>
<table style="table-layout: fixed; width: 100%">
    <tbody>
        <tr>
            <td>
            <div class="cnt" >
            <p>下面是从mtime的一篇影评那里看到的，是21点最好的科普教材了。</p>
            <p>-----------------------------------------------------</p>
            <p>1，游戏由玩家和庄家（即赌场的发牌员）对玩，看谁的牌面点数更靠近21点。但如果超过了21点，则称为&ldquo;爆掉&rdquo;，算输。其中花牌（J，Q，K）都算10点，A可以算1点，也可以算11点，看哪种情况更有利。玩家之间不做比较。 <br>
            2，游戏开始时，所有玩家和庄家各拿两张牌，一般来说，是玩家两张牌牌面朝上，庄家一张牌面朝上，一张牌面朝下。 <br>
            3，两张牌的点数，肯定介于2到21点之间。21点只可能是一张10（包括J，Q，K，下同）和一张A，这叫&ldquo;天成（BlackJack，以下简称BJ）&rdquo;，除非庄家也拿到了BJ，不然赢一倍半的赌注。 <br>
            4，玩家在游戏中有如下选择： <br>
            （1）要牌，直到他（或她，下同）认为自己的牌面离21点足够近了。比如手头的牌是4和5，加起来才9点，那么无论再加张什么牌，都不会爆掉，当然应该要牌。<br>
            （2）停牌，即不再要牌，比如手头是张10和9，已经很接近21点了，就不用再要牌了。<br>
            （3）加倍，即加一倍赌注，再要且仅要一张牌。比如手头是张4和7，这时要牌是肯定安全的，而且很可能拿到10或者其他点数较大的牌，一张就够了，值得加倍。这只能在刚拿到两张牌时使用，要过牌后就不能加倍。<br>
            （4）分牌，即拿到两张点数相同的牌时，可以加一份赌注，把牌分为两份，比如手头是两张8，加起来是16，非常糟糕的点数，这时就应该把牌分为两个8，再要两张牌来，很可能拿到10形成18点，就把坏牌变成好牌了。<br>
            （5）保险，即在庄家亮着的牌是A时，由于他拿到BJ的几率很大，玩家可以下赌注一半的保险。如果庄家没有拿到BJ，保险金就输掉了，如果庄家拿到了BJ，付给玩家两倍保险金。很多玩家在自己拿到BJ的情况下，会下赌注一半的保险，以保证自己能赢回一倍赌注，因为如果庄家没有BJ，那他能赢赌注的一倍半，去掉输掉的半倍保险，还赢一倍赌注；如果庄家有BJ，那他们牌面打平，但保险能赚回一倍赌注。<br>
            （6）投降，这时只输一半赌注。如果自己的牌是10和6，庄家亮着的牌是A，那还是趁早投降好。 <br>
            5，庄家在手头的牌是A时，会问大家是否要保险，然后检查自己的牌是否BJ。如果手头的牌是10，也会检查是否BJ，但这时玩家就不能买保险了。 <br>
            6，如果玩家要牌爆掉，算输，庄家当场收掉他的赌注。 <br>
            7，当所有的玩家都做出选择后，庄家的玩法是固定的：亮出底牌，如果点数不到17点，则必须要牌，直到超过了16点或爆掉为止。 <br>
            8，如果双方都还没有爆掉，则更接近21点的那个胜，如果双方点数相同，则算打平。 <br>
            在这些基本规则之上，各地的赌场还会有些变动，比如有的赌场在软17点（A算11点时的点数称为&ldquo;软&rdquo;，比如A和6，就是软17点）时停下，有的则必须继续要；有的赌场连续分牌最多只能有四次，有的可以无限分下去；有的A分牌只能一次；有的赌场分牌后不许加倍；有的赌场不许投降；等等等等。 <br>
            还有些变种的二十一点游戏，比如&ldquo;双亮（Double Exposure）二十一点&rdquo;，就是庄家的两张底牌都亮着，但如果双方点数相同，算庄家赢。又如带大小鬼（Joker）的二十一点，庄家拿到鬼牌得扔掉，玩家拿到鬼牌却可以指定它的点数，比如凑成11点，或者当A用等等。</p>
            <p>基本规则说完了，从电影情节引申开去，谈谈21点的策略。<br>
            大家可能对电影刚开始，男主角被招进赌博小组，背数字的剧情印象比较深刻，这是什么意思呢？<br>
            说白了，就是他的同伙，通过数字，告诉主角当前赌桌的情况如何。回顾一下电影，有没有发现主角进场前他的同伙已经在各赌桌前埋伏好了，看到主角后，做不同的手势，而当某人把双手放到背后时，意思就是告诉主角此赌桌现在情况比较好，过来赌啦。<br>
            好，主角坐上此赌桌，他的同伴又会通过各种暗语告诉主角此赌桌当前的点数，比如片中42：50秒时，同伴说太甜了，暗示主角此赌桌当前的点数是16。那么这是什么点数呢？知道这个点数有什么用呢？说简单点，就是此点数越大对玩家越有利对庄越不利。我来解释下：<br>
            UCLA 的数学教授爱德华·索普（Edward Thorp）在六十年代初发明了二十一点算牌法。他注意到，如果二十一点里10出现的概率增高，对庄家是不利的，因为庄家在十六点及更低时必须要牌，10 越多，就越容易爆掉，而对玩家来说，则更容易拿到BJ，赢一倍半的钱。所以他用一种&ldquo;算10法（10-Count）&rdquo;，计算剩下的牌中10的比例。正常情况下，这个比例应该是4/13，庄家占优势。但当前面出掉很多小牌，10的比例达到1/3时，优势就转移到玩家这边来了。 <br>
            索普的运气不错，那时计算机也发明出来了，他找到IBM公司里的朋友，写了个程序来验证自己的算牌方法。那时的计算机跟今天比起来，还是速度低下、体积庞大的蠢物，足足运转了七天七夜，终于证明了这个方法是可行的。索普又自己到赌场里亲自实践，结果果然大赢特赢。 <br>
            1962 年他出版了《打败庄家（Beat the Dealer）》一书，向公众介绍了自己的算牌法。这不再是我们惯见的萝卜赌经，而是有数学基础的方法，因为它在不同的赢牌概率P（i）时下不同的赌注B (i），虽然总的胜利概率之和ΣP（i）仍然小于1/2，但只要在P（i)大时下大的B(i)，P(i)小时下小的B（i），就能使总回报ΣR（i）P （i）大于ΣB（i）。 <br>
            &ldquo;算10法&rdquo;比较难操作，需要极高的心智和注意力。好在群众的智慧是无穷的，算牌手们沿着索普指定的方向走下去，已经把算牌方法演进得越来越简单实用（索普本人在60年代后期就淡出了赌博界，带着他在赌场赢来的大笔资金，进入股票市场，运用他的数学知识，现在已成为超级巨富）。<br>
            那么《决胜21点》中主角用的是&ldquo;算10法&rdquo;吗？不是，是由&ldquo;算10法&rdquo;演变来的更易计算和掌握的&ldquo;高低法（High-Low）&rdquo;。在影片中，他们把每一张出现的2，3，4，5，6都算＋1点，7，8，9算0点，10，J，Q，K，A算－1点，将各点相加，结果越大，就表示前面出现过的小牌越多，对玩家越有利。反过来，如果结果是个负数，就表示前面出过的大牌比小牌多，对庄家有利。我们回到影片中 25：26秒，博士一张张的摊牌，发到76张时问他的学生现在是几点，几个学生都算不出来，教授火了，说到：&ldquo;23张牌是大点数牌，减去1；17张牌是中立牌，没有点数；低点数牌加上1，你们怎么会算不对呢？&rdquo;<br>
            那么我们来替教授算一下把，<br>
            23张大点数牌，（10，J，Q，K，A），-23<br>
            17张中立牌，（7，8，9），0<br>
            剩下36张就是小牌了，（2，3，4，5，6），+36<br>
            合计就是13点咯，和后来男主角说的一样吧？呵呵。<br>
            现在大家看懂了吧，主角的同伙埋伏在各个不同的赌桌，计算着庄家发的每一张牌，统计正负点数，点数小的赌桌就忽略，点数大的赌桌就做手势让主角过来赌，然后通过暗号告诉主角赌桌当前的点数。回到片中42：50秒，同伙告诉主角当前点数为16，然后庄家接着发牌，大家可以跟主角一起来算一下咯&mdash;&mdash;牌8，中立牌，仍16点；牌10，大牌-1，15点；两张牌8，都是中立牌，15点；牌9，中立牌，15点；牌5，小牌+1，16点；牌J，大牌-1，15点；牌 10，大牌-1，14点；牌K和9，一大牌一中立牌共-1，13点；牌J，大牌-1，12点；牌9，中立牌，12点；最后主角拿到一张A，组成BJ，赢了庄家。<br>
            是不是有点失望，原来片中的算牌手并不能算出接下来自己得到什么牌，而是在计算接下来出大牌的几率是多少，其实已经很不错了，算出接下来出大牌的几率越高，战胜庄家的希望就越大！<br>
            斯坦福·王（Stanford Wong）在《二十一点的秘密(Blackjack Secrets）》里说，平均点数每高一点，可增加约0.5％的优势。按照他的说法，在0点时，庄家占0.5％的优势。到了1点，双方差不多扯平。平均点数升到2时，玩家就已经占0.5％的优势，可以提高赌注了。那么片中主角碰到了+16点的&ldquo;甜蜜&rdquo;赌桌，理所当然应该下大注，赚它个盆满钵满^_^</p>
            <p>差不多该对片中小组的策略做个总结了。小组成员分成算牌手和观察员，观察员负责潜伏与各赌桌计算当前赌桌的点数，当碰到点数高也就是前面小牌出的多的赌桌时，就做手势让算牌手过来赌并通过暗号告诉他赌桌点数。接下来算牌手运用非凡的大脑继续计算点数，判断点数和自己手上的牌来估算该压的筹码，最后把庄家打的落花流水。</p>
            <p>闲外话，想要赢庄家，算牌手除了天时地利（牌桌点数大）外，还需要人和，那就是21点的基本策略，我也一并写出来吧，把基本策略背个滚瓜烂熟，然后再把自己的大脑锻炼的运算如飞，你就可以去赌场试试身手咯^_^</p>
            <p>硬点数基本策略(顶部为庄家牌，左边为自己的牌，下同）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  2&nbsp;&nbsp;&nbsp;  3&nbsp;&nbsp;&nbsp;  4&nbsp;&nbsp;&nbsp;  5&nbsp;&nbsp;&nbsp;  6&nbsp;&nbsp;&nbsp;  7&nbsp;&nbsp;&nbsp;  8&nbsp;&nbsp;&nbsp;  9&nbsp;&nbsp;&nbsp;  10&nbsp;&nbsp;&nbsp;  A<br>
            &lt;=8 H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H<br>
            9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H<br>
            10&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H<br>
            11&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  H<br>
            12&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H<br>
            13&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H<br>
            14&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H<br>
            15&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  R&nbsp;&nbsp;&nbsp;  H<br>
            16&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  R&nbsp;&nbsp;&nbsp;  R&nbsp;&nbsp;&nbsp;  R<br>
            &gt;=17 S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S<br>
            <br>
            其中H表示&ldquo;要牌（Hit）&rdquo;，S表示&ldquo;停牌（Stand）&rdquo;，D表示&ldquo;加倍（Double down）&rdquo;，R表示&ldquo;投降（suRrender）&rdquo;。<br>
            以上的点数都是所谓&ldquo;硬点数&rdquo;，即不包括A或A算1点，以后如果不特别指明，各点都指&ldquo;硬点数&rdquo;。手中有A，而且A算11也不会爆掉，就是所谓&ldquo;软点数&rdquo;。</p>
            <p>软点数基本策略&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  2&nbsp;&nbsp;&nbsp;  3&nbsp;&nbsp;&nbsp;  4&nbsp;&nbsp;&nbsp;  5&nbsp;&nbsp;&nbsp;  6&nbsp;&nbsp;&nbsp;  7&nbsp;&nbsp;&nbsp;  8&nbsp;&nbsp;&nbsp;  9&nbsp;&nbsp;&nbsp;  10&nbsp;&nbsp;&nbsp;  A<br>
            13&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H<br>
            14&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H<br>
            15&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H<br>
            16&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H<br>
            17&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H<br>
            18&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  DS DS DS DS&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H<br>
            &gt;=19S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S</p>
            <p>&ldquo;D&rdquo;和&ldquo;DS&rdquo;都表示加倍，在不可以加倍的情况下，&ldquo;D&rdquo;表示要牌，&ldquo;DS&rdquo;表示停牌。</p>
            <p>分牌策略&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  2&nbsp;&nbsp;&nbsp;  3&nbsp;&nbsp;&nbsp;  4&nbsp;&nbsp;&nbsp;  5&nbsp;&nbsp;&nbsp;  6&nbsp;&nbsp;&nbsp;  7&nbsp;&nbsp;&nbsp;  8&nbsp;&nbsp;&nbsp;  9&nbsp;&nbsp;&nbsp;  10&nbsp;&nbsp;&nbsp;  A<br>
            &quot;A,A&quot;&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P<br>
            &quot;2,2&quot;&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H<br>
            &quot;3,3&quot;&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H<br>
            &quot;4,4&quot;&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H<br>
            &quot;5,5&quot;&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  D&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H<br>
            &quot;6,6&quot;&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H<br>
            &quot;7,7&quot;&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H&nbsp;&nbsp;&nbsp;  H<br>
            &quot;8,8&quot;&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P<br>
            &quot;9,9&quot;&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  P&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S<br>
            &quot;10,10&quot; S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S&nbsp;&nbsp;&nbsp;  S</p>
            <p>其中P表示&ldquo;分牌（Split）&rdquo;</p>
            <p>口诀：<br>
            1)11点或更小时，总可以要牌，如果9点时庄家亮牌是3到6，10或11点时庄家亮牌比自己差，还可以加倍。<br>
            2)17点或更多时，总该停住。<br>
            3)12点到16点间，如果庄家亮牌是6或更小，就该停住，不然就该要牌。唯一的例外是12点对庄家亮牌2和3点时也该要牌。另外在自己拿到16点而庄家是9、10、A，或自己拿到15点，而庄家是10点时，应该投降。</p>
            <p>对于嫌麻烦的人，记住以上三点，就已经够了，因为这张表涵盖了大多数情况，拿到A和两张同样点数的牌的可能性不是那么大。但是如果想少输点钱，还是必须把后两张表也背下来。好在它们也很有规律，比如软13到18点对庄家6点或更小的亮牌时，可以考虑加倍，其判断梯形为：不太有把握的软13、14点只对庄家的5、6点加倍，软15、16扩展到庄家的4点，软17、18则扩展到3点。</p>
            </div>
            </td>
        </tr>
    </tbody>
</table> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/ghina/blog/category/%CB%E3%B7%A8">算法</a>&nbsp;<a href="http://hi.baidu.com/ghina/blog/item/0e0efe23c0190744925807d6.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-12  18:09</pubDate>
        <category><![CDATA[算法]]></category>
        <author><![CDATA[ghina]]></author>
		<guid>http://hi.baidu.com/ghina/blog/item/0e0efe23c0190744925807d6.html</guid>
</item>

<item>
        <title><![CDATA[5只蚂蚁走木棍问题]]></title>
        <link><![CDATA[http://hi.baidu.com/ghina/blog/item/8e4d883e59e9823771cf6c21.html]]></link>
        <description><![CDATA[
		
		有一根27厘米的细木杆，在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。木杆很细，不能同时通过一只蚂蚁。开始时，蚂蚁的头朝左还是朝右是任意的，它们只会朝前走或调头，但不会后退。当任意两只蚂蚁碰头时，两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序，求所有蚂蚁都离开木杆的最小时间和最大时间。<br>
<br>
<br>
public class Ant {<br>
<br>
private static int LONG = 27;<br>
<br>
private int[] a = { 3, 7, 11, 17, 23 };<br>
<br>
private int min = 0, max = 0;<br>
<br>
public void gogogo() {<br>
for (int i = 0; i &lt; a.length; i++) {<br>
min = Math.max(min, Math.min(a[i], LONG - a[i]));<br>
max = Math.max(max, Math.max(a[i], LONG - a[i]));<br>
}<br>
}<br>
<br>
public int getMax() {<br>
return max;<br>
}<br>
<br>
public int getMin() {<br>
return min;<br>
}<br>
<br>
public static void main(String[] args) {<br>
<br>
Ant client = new Ant();<br>
client.gogogo();<br>
System.out.println(client.getMax());<br>
System.out.println(client.getMin());<br>
}<br>
}<br>
<br>
“当任意两只蚂蚁碰头时，两只蚂蚁会同时调头朝反方向走。“ <br>
其实你可以当作它们擦肩而过。 <br>
所以，最长时间应该是 最左短端的蚂蚁一直往右走 和  最右短端的蚂蚁一直往左走 两个时间的最大值。（不考虑别的蚂蚁，一直走就对了） <br>
最小时间应该是 左边的3个蚂蚁往左走，右边的2个蚂蚁往右走 花的时间。  <br> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/ghina/blog/category/%CB%E3%B7%A8">算法</a>&nbsp;<a href="http://hi.baidu.com/ghina/blog/item/8e4d883e59e9823771cf6c21.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-10  16:46</pubDate>
        <category><![CDATA[算法]]></category>
        <author><![CDATA[ghina]]></author>
		<guid>http://hi.baidu.com/ghina/blog/item/8e4d883e59e9823771cf6c21.html</guid>
</item>

<item>
        <title><![CDATA[汉诺塔]]></title>
        <link><![CDATA[http://hi.baidu.com/ghina/blog/item/4e7e5c18f6729f0d35fa41da.html]]></link>
        <description><![CDATA[
		
		<span class="STYLE3"><strong><font color="#0000ff">1、递归算法设计的基本思想是</font></strong></span>：对于一个复杂的问题，把原问题分解为若干个相对简单类同的子问题，继续下去直到子问题简单到能够直接求解，也就是说到了递推的出口，这样原问题就有递推得解。<br>
关键要抓住的是：<br>
<br>
（1）递归出口<br>
<br>
（2）地推逐步向出口逼近<br>
<strong><font color="#0000ff">2、具体实例 <br>
<br>
</font></strong>1。汉诺塔<br>
这是递归的超经典的例子，几乎每本程序设计书上谈到递归都会介绍。具体情景不再赘述。以我上述的方法观之：（1）递归的出口在于disk数为一的时候<br>
<br>
（2）向出口逼近：如果不是一，是n ，则我们先挪动上面n-1块disk，等上面挪完，即递归返回的时候，我们挪动最底下的disk。<br>
<br>
仅仅如此，一个貌似十分复杂的问题就解决了，因为挪动那n-1块disk的时候，会继续向上减少，直到disk的数量为一为止。下面给出ｊａｖａ程序编码（已测试过，运行正常）：<br>
<br>
<a target="_blank" href="http://whatis.ctocio.com.cn/searchwhatis/480/6025480.shtml">import</a> javax.swing.JOptionPane;<br>
<br>
public <a target="_blank" href="http://whatis.ctocio.com.cn/searchwhatis/213/5947213.shtml">class</a> Hanoi {<br>
private static final String DISK_B = &quot;diskB&quot;;<br>
private static final String DISK_C = &quot;diskC&quot;;<br>
private static final String DISK_A = &quot;diskA&quot;;<br>
static String from=DISK_A;<br>
static String to=DISK_C;<br>
static String mid=DISK_B;<br>
<br>
public static void main(String[] args) {<br>
String input=JOptionPane.showInputDialog(&quot;please input the number of the disks you want me move.&quot;);<br>
<a target="_blank" href="http://whatis.ctocio.com.cn/searchwhatis/69/6025569.shtml">int</a> num=Integer.parseInt(input);<br>
move(num,from,mid,to);<br>
}<br>
<br>
private static void move(int num, String from2, String mid2, String to2) {<br>
if(num==1){<br>
System.out.println(&quot;move disk 1 from &quot;+from2+&quot; to &quot;+to2);<br>
}<br>
else {<br>
move(num-1,from2,to2,mid2);<br>
System.out.println(&quot;move disk &quot;+num+&quot; from &quot;+from2+&quot; to &quot;+to2);<br>
move(num-1,mid2,from2,to2);<br>
}<br>
<br>
}<br>
}<br>
<br>
<br>
2。这是一个排列的例子，它所做的工作是将输入的一个字符串中的所有元素进行排序并输出，例如：你给出的参数是&quot;abc&quot; 则程序会输出：<br>
abc<br>
acb<br>
bac<br>
bca<br>
cab<br>
cba<br>
<br>
（１）算法的出口在于：ｌｏｗ＝ｈｉｇｈ也就是现在给出的排列元素只有一个时。<br>
（２）算法的逼近过程：先确定排列的第一位元素，也就是循环中ｉ所代表的元素，<br>
然后ｌｏｗ＋１开始减少排列元素，如此下去，直到ｌｏｗ＝ｈｉｇｈ<br>
public static void permute(String str) {<br>
char[] strArray = str.toCharArray();<br>
permute(strArray, 0, strArray.length - 1);<br>
}<br>
<br>
public static void permute(char[] list, int low, int high) {<br>
int i;<br>
if (low == high) {<br>
String cout = &quot;&quot;;<br>
for (i = 0; i &lt;= high; i++)<br>
cout += list<em>;<br>
System.out.println(cout);<br>
} else {<br>
for (i = low; i &lt;= high; i++) {<br>
char temp = list[low];<br>
list[low] = list<em>;<br>
list<em> = temp;<br>
permute(list, low + 1, high);<br>
temp = list[low];<br>
list[low] = list<em>;<br>
list<em> = temp;<br>
}<br>
}<br>
}<br>
<br>
３．这是一个组合的例子，与上述的例子相似，只是它所做的工作是，输出所给字符串中制定数目的元素的组合种类<br>
（１）程序出口在于ｎ＝１，此时只要输出目标数组的所有元素即可<br>
（２）逼近过程，当ｎ＞１　的时候，我们先取第一个元素放入目标数组中，然后ｎ－１，如此下去，最后出来。<br>
import javax.swing.JOptionPane;<br>
<br>
public class Combination {<br>
<br>
/**<br>
* @param args<br>
*/<br>
public static void main(String[] args) {<br>
<br>
String input = JOptionPane.showInputDialog(&quot;please input your String: &quot;);<br>
String numString = JOptionPane.showInputDialog(&quot;please input the number of your Combination: &quot;);<br>
int num = Integer.parseInt(numString);<br>
Combine(input, num);<br>
}<br>
<br>
private static void Combine(String input, int num) {<br>
char[] a = input.toCharArray();<br>
String b = &quot;&quot;;<br>
Combine(a, num, b, 0, a.length);<br>
}<br>
<br>
private static void Combine(char[] a, int num, String b, int low, int high) {<br>
if (num == 0) {<br>
System.out.println(b);<br>
} else {<br>
for (int i = low; i &lt; a.length; i++) {<br>
b += a<em>;<br>
Combine(a, num - 1, b, i+1, a.length);<br>
b=b.substring(0, b.length()-1);<br>
}<br>
}<br>
<br>
}<br>
}</em></em></em></em></em></em> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/ghina/blog/category/%CB%E3%B7%A8">算法</a>&nbsp;<a href="http://hi.baidu.com/ghina/blog/item/4e7e5c18f6729f0d35fa41da.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-10  13:27</pubDate>
        <category><![CDATA[算法]]></category>
        <author><![CDATA[ghina]]></author>
		<guid>http://hi.baidu.com/ghina/blog/item/4e7e5c18f6729f0d35fa41da.html</guid>
</item>

<item>
        <title><![CDATA[八皇后的递归与非递归解]]></title>
        <link><![CDATA[http://hi.baidu.com/ghina/blog/item/594d7d823cc0009af703a643.html]]></link>
        <description><![CDATA[
		
		<p><strong>1、递归。递归真是个好东西，解法一目了然。</strong></p>
<p><strong>#include&lt;stdio.h&gt;<br>
#define N 8</strong></p>
<p><strong>int l[14];<br>
int r[14];<br>
int q[N];<br>
int col[N];<br>
static int cnt = 0;</strong></p>
<p><strong>void try(int i)<br>
{<br>
int j;</strong></p>
<p><strong> for(j=0; j&lt;N; j++)<br>
{<br>
if(l[i+j] == 0 &amp;&amp; r[i-j+7] ==0 &amp;&amp; col[j] == 0)<br>
{<br>
l[i+j]=1;<br>
r[i-j+7] =1;<br>
col[j] = 1;<br>
q[i] = j;</strong></p>
<p><strong>&#160;&#160;&#160; if(i+1 == N)<br>
{<br>
++cnt;<br>
//&#160;&#160;&#160; return;<br>
}<br>
else<br>
{<br>
try(i+1);<br>
}</strong></p>
<p><strong>&#160;&#160;&#160;&#160; l[i+j] = 0;<br>
r[i-j+7] = 0;<br>
col[j] = 0;<br>
q[i] = -1;<br>
}<br>
}<br>
}</strong></p>
<p><strong>int main()<br>
{<br>
int i;<br>
for(i=0; i&lt;14; i++)<br>
{<br>
l[i] = 0;<br>
r[i] = 0;</strong></p>
<p><strong> }<br>
for(i = 0; i&lt;N; i++)<br>
{<br>
col[i] = 0;<br>
q[i] = -1;<br>
}<br>
try(0);<br>
printf(&quot;cnt = %d\n&quot;, cnt);<br>
return 0;<br>
}</strong></p>
<p> </p>
<p><strong>2、非递归解</strong></p>
<p><strong>#include &lt;iostream.h&gt;<br>
#define QUEEN 8  //皇后数量<br>
int queen[QUEEN] ;  //下标代表所在列号,值代表所在行号，<br>
//如queen[1]=2表示第1列第2行有个皇后<br>
bool col_YN[QUEEN] ;&#160;&#160;&#160;&#160;&#160;  //棋局的每一行是否有棋,有则为1,无为0 ;<br>
bool passive_YN[2*QUEEN-1] ;  //斜率为1的斜线方向上是否有棋,共有2*QUEEN-1个斜线<br>
bool negative_YN[2*QUEEN-1] ; //斜率为负1的斜线方向上是否有棋<br>
//用全局变量,因全局数组元素值自动为0<br>
int main()<br>
{ <br>
int col = 0 ;//游标,当前移动的棋子(以列计)<br>
bool flag = false ;&#160;&#160;  //当前棋子位置是否合法<br>
queen[0] = -1 ;&#160;&#160;&#160;&#160;&#160;  //第0列棋子准备,因一开始移动的就是第0列棋子<br>
int count = 0 ;&#160;&#160;&#160;&#160;&#160;  //一共有多少种解法的计数器 ;</strong></p>
<strong> while(col&gt;=0 ) //跳出条件是回溯到无法回溯时 <br>
{<br>
queen[col]++ ;&#160;&#160;&#160;&#160;&#160;  //col列上的皇后走到下一行试试<br>
if(queen[col] &gt;= QUEEN) //当前列全部走完<br>
{  <br>
queen[col] = -1 ; //当前列棋子置于准备状态<br>
col-- ;&#160;&#160;&#160;&#160;&#160;&#160;&#160;  //回溯到上一列的棋子<br>
if(col&gt;=0)&#160;&#160;&#160;&#160;&#160;  //回溯时要清理如下行，斜线的标志位&#160;&#160;  <br>
{<br>
col_YN[queen[col]] = false ; <br>
passive_YN[queen[col] + col] = false ;<br>
negative_YN[QUEEN-1 + col - queen[col]] = false ;<br>
} <br>
}<br>
else<br>
{ <br>
//先判断棋子所在行没有棋子<br>
if(col_YN[queen[col]] == false) <br>
{<br>
flag = true ; <br>
//以下检查当前棋子是否与之前的棋子斜线相交<br>
if( passive_YN[queen[col] + col] == true || negative_YN[QUEEN-1 + col - &#160;&#160;&#160;&#160; queen[col]] == true)  <br>
flag = false ;<br>
else&#160;&#160;&#160;&#160;  <br>
flag = true ;<br>
if(flag)  // flag为真表示位置合法<br>
{  <br>
if(col == QUEEN-1)  //列到达最后，即最后一个皇后也找到位置，输出解<br>
{<br>
count++ ;  //解法的数目加一 ;<br>
cout&lt;&lt;&quot;***第&quot;&lt;&lt;count&lt;&lt;&quot;种解法***&quot;&lt;&lt;endl  ;<br>
for(int i=0;i&lt;QUEEN;i++)<br>
cout&lt;&lt;&quot;第&quot;&lt;&lt;i&lt;&lt;&quot;列皇后在第&quot;&lt;&lt;queen[ i ]&lt;&lt;&quot;行&quot;&lt;&lt;endl;<br>
}<br>
col_YN[queen[col]] = true ;// 当前行设为有棋子<br>
passive_YN[queen[col] + col] = true ;//当前行正斜率方向有棋子<br>
negative_YN[QUEEN-1 + col - queen[col]] = true ; //当前行负斜率方向&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 上也有棋子<br>
col++ ;<br>
if(col &gt;= QUEEN) <br>
{  // 找到解后再次回溯找另外的解，这同上面无解回溯是一样的<br>
col-- ;<br>
col_YN[queen[col]] = false ; <br>
passive_YN[queen[col] + col] = false ;<br>
negative_YN[QUEEN-1 + col - queen[col]] = false ;//原理同回溯<br>
}&#160;&#160;&#160;&#160;&#160;  <br>
flag = false ;&#160;&#160;&#160;&#160;  <br>
}<br>
}<br>
}<br>
}<br>
cout&lt;&lt;QUEEN&lt;&lt;&quot;皇后问题一共有&quot;&lt;&lt;count&lt;&lt;&quot;种解法&quot;&lt;&lt;endl  ;<br>
return 0 ;<br>
}</strong> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/ghina/blog/category/%CB%E3%B7%A8">算法</a>&nbsp;<a href="http://hi.baidu.com/ghina/blog/item/594d7d823cc0009af703a643.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-10  09:22</pubDate>
        <category><![CDATA[算法]]></category>
        <author><![CDATA[ghina]]></author>
		<guid>http://hi.baidu.com/ghina/blog/item/594d7d823cc0009af703a643.html</guid>
</item>

<item>
        <title><![CDATA[双递归]]></title>
        <link><![CDATA[http://hi.baidu.com/ghina/blog/item/d975f008b3f8553ae8248842.html]]></link>
        <description><![CDATA[
		
		双递归<br>
<br>
双递归过程在过程体内两次引用其自身；而树形递归过程的计算则在过程体中分裂为 N 路分支，各自引用自身以完成运算，最后汇总得出过程本身的计算结果。可以想见，当 N 等于 2 时，那树形递归过程也是个双递归过程，但双递归过程也可能是个树形递归过程吗？这个就不一定，还是得看具体的计算进展方式了。比如 Ackermann 函数。
<div style="background-color: rgb(204, 204, 204);">ackermann(X, Y) -&gt;<br>
if -&gt;<br>
Y == 0 -&gt;<br>
0;<br>
X == 0 -&gt;<br>
2 * Y;<br>
Y == 1 -&gt;<br>
2;<br>
true -&gt;<br>
f(X - 1, f(X, Y - 1))<br>
end.</div>
<br>
从 ackermann 函数的过程定义来看，很明显的这是个双递归过程，接着来分析具体的计算进展方式以观察它是否也是个树形递归。对于 ackermann(1, 5) 这次过程调用，计算进展方式如下：<br>
ackermann(0, ackermann(1, 4)<br>
ackermann(0, ackermann(0, ackermann(1, 3))<br>
ackermann(0, ackermann(0, ackermann(0, ackermann(1, 2))))<br>
ackermann(0, ackermann(0, ackermann(0, ackermann(0, ackermann(1, 1)))))<br>
ackermann(0, ackermann(0, ackermann(0, ackermann(0, 2))))<br>
ackermann(0, ackermann(0, ackermann(0, 4)))<br>
ackermann(0, ackermann(0, 8))<br>
ackermann(0, 16)<br>
32<br>
<br>
整个计算进展方式呈现出了线性递归的先扩张后收缩的特征，并没有分裂为多路分支，那 ackermann 函数就不是树形双递归过程。（事实上，Ackermann 函数在 X 值等于 1 和大于 1 的不同情况下，会展现出不同的函数计算特性，在 X 大于 1 时，运算结果也会突飞猛进，最后遁入破碎虚空）<br>
<br>
树形递归<br>
<br>
典型的树形递归当属 Fibonacci 数列无疑，最简单的 Fibonacci 函数如下：
<div style="background-color: rgb(204, 204, 204);">fibonacci(0) -&gt;<br>
0;<br>
fibonacci(1) -&gt;<br>
1;<br>
fibonacci(N) -&gt;<br>
fibonacci(N - 1) + fibonacci(N - 2).</div>
<br>
过程定义自然分裂为两路分支，对传入的 N 值，一路计算 fibonacci(N - 1) 另一路则计算 fibonacci(N - 2)，最后相加得出 fibonacci(N) 的结果。这个文字描述干瘪无味，观察 fibonacci(4) 的计算进展方式的图形描述就直观了许多。<br>
<a href="http://picasaweb.google.com/lh/photo/_4V1r2V7mzaVqaroPX2iQg"><img src="http://lh5.ggpht.com/anders.x.hu/SMpq-SBh1NI/AAAAAAAAAOg/478DZWTW5Cc/s400/att5fb36.jpg"></a><br>
<br>
从上图还可以发现树形递归的一个重大问题－－效率。在上图中求解 fibonacci(3) 的计算过程几乎占到了全部计算过程一多半的运算量，但它却整整被运行了两次，如此可以看出，当 N 值足够大时，整个求解过程中重复的运算量有多少了！同样的，也可以把这个树形递归改造成迭代计算进展方式的尾递归过程。
<div style="background-color: rgb(204, 204, 204);">fibonacci(N) -&gt;<br>
if<br>
N &lt; 1 -&gt;<br>
exit(argerror);<br>
true -&gt;<br>
fib_iter(1, 0, N)<br>
end.<br>
<br>
fib_iter(Product, LastProduct, Counter) -&gt;<br>
if<br>
Counter == 1 -&gt;<br>
Product;<br>
true -&gt;<br>
fibonacci(Product + LastProduct, Product, Counter - 1)<br>
end.</div>
<br>
同样的，对 fibonacci(4) 的调用，整个计算进展方式变化为：<br>
fibonacci(1, 0, 4)<br>
fibonacci(1, 1, 3)<br>
fibonacci(2, 1, 2)<br>
fibonacci(3, 2, 1)<br>
<br>
改进后的 fibonacci 过程充分展现了尾递归的高效率，在我的机器上尾递归的版本迟滞不到 1 秒即可求出 N = 100000 时的结果值，而树形递归在求 N = 50 时就已经麻木不仁了（想想 N ＝ 50 时过程体内会分裂出多少路分支计算也就释然了）～～<br>
<br>
虽然计算进展方式变得更简单了，空间占用更低，但过程体的代码却变得复杂了许多，不如树形递归简洁明了，适合人类阅读；而树形递归过程甚至只是自然而然 的、直觉的反映了我们大脑中对算法的想象，所以还是有其实际应用意义的。再者依靠编译器优化措施也可以解决树形递归大部分的效率问题，比如为树形递归的运 算结果维护一张对应表，每次计算时都到表中查找是否有相应的计算结果，没有才进行实际的递归运算，运算结果出来后再将这个结果存入对应表，以便将来查询。 比如对于 fibonacci(4) 的调用来说，第一次执行完 fibonacci(2) 之后便将计算结果存入对应表，第二次执行前先查看对应表中是否存在相应的计算结果，发现已存在的话便直接取出来应用就可以了。<br>
<br>
p.s. Ackermann 函数的破碎虚空，想想这个函数的时间和空间的增长阶吧。<br>
ackermann(2, 4)<br>
ackermann(1, ackermann(2, 3))<br>
ackermann(1, ackermann(1, ackermann(2, 2)))<br>
ackermann(1, ackermann(1, ackermann(1, ackermann(2, 1))))<br>
ackermann(1, ackermann(1, ackermann(1, 2)))<br>
ackermann(1, ackermann(1, ackermann(0, ackermann(1, 1))))<br>
ackermann(1, ackermann(1, ackermann(0, 2)))<br>
ackermann(1, ackermann(1, 4))<br>
ackermann(1, ackermann(0, ackermann(1, 3)))<br>
ackermann(1, ackermann(0, ackermann(0, ackermann(1, 2))))<br>
ackermann(1, ackermann(0, ackermann(0, ackermann(0, ackermann(1, 1)))))<br>
ackermann(1, ackermann(0, ackermann(0, ackermann(0, 2))))<br>
ackermann(1, ackermann(0, ackermann(0, 4)))<br>
ackermann(1, ackermann(0, 8))<br>
ackermann(1, 16)<br>
...（根据上面的求解可知 ackermann(1, N) 即 2 ^ N，因此省略接下来的计算进展方式）<br>
65536<br>
<br>
ackermann(3, 3)<br>
ackermann(2, ackermann(3, 2))<br>
ackermann(2, ackermann(2, ackermann(3, 1)))<br>
ackermann(2, ackermann(2, 2))<br>
ackermann(2, ackermann(1, ackermann(2, 1)))<br>
ackermann(2, ackermann(1, 2))<br>
ackermann(2, ackermann(0, ackermann(1, 1)))<br>
ackermann(2, ackermann(0, 2))<br>
ackermann(2, 4)<br>
ackermann(1, ackermann(2, 3))<br>
ackermann(1, ackermann(1, ackermann(2, 2)))<br>
ackermann(1, ackermann(1, ackermann(1, ackermann(2, 1))))<br>
ackermann(1, ackermann(1, ackermann(1, 2)))<br>
ackermann(1, ackermann(1, ackermann(0, ackermann(1, 1))))<br>
ackermann(1, ackermann(1, ackermann(0, 2)))<br>
ackermann(1, ackermann(1, 4))<br>
ackermann(1, ackermann(0, ackermann(1, 3)))<br>
ackermann(1, ackermann(0, ackermann(0, ackermann(1, 2))))<br>
ackermann(1, ackermann(0, ackermann(0, ackermann(0, ackermann(1, 1)))))<br>
ackermann(1, ackermann(0, ackermann(0, ackermann(0, 2))))<br>
ackermann(1, ackermann(0, ackermann(0, 4)))<br>
ackermann(1, ackermann(0, 8))<br>
ackermann(1, 16)<br>
ackermann(0, ackermann(1, 15))<br>
...（同样滴，根据上面的求解可知 ackermann(0, ackermann(1, 15)) 即 ackermann(0, 2 ^ 15)，因此省略接下来的计算进展方式，直接给成运算结果）<br>
65536 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/ghina/blog/category/%CB%E3%B7%A8">算法</a>&nbsp;<a href="http://hi.baidu.com/ghina/blog/item/d975f008b3f8553ae8248842.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-10  09:21</pubDate>
        <category><![CDATA[算法]]></category>
        <author><![CDATA[ghina]]></author>
		<guid>http://hi.baidu.com/ghina/blog/item/d975f008b3f8553ae8248842.html</guid>
</item>

<item>
        <title><![CDATA[UML 序列图]]></title>
        <link><![CDATA[http://hi.baidu.com/ghina/blog/item/c142c17a70d87ae72e73b3b6.html]]></link>
        <description><![CDATA[
		
		<table cellspacing="0" cellpadding="0" border="0" align="center" width="760">
    <tbody>
        <tr>
            <td height="56" align="center" valign="middle" class="title"><strong><font color="#ff0000" size="3">UML 序列图</font></strong></td>
        </tr>
        <tr>
            <td height="40" align="center" class="formtitle">来自:         IBM Rational Edge</td>
        </tr>
    </tbody>
</table>
<table height="65" cellspacing="0" cellpadding="0" border="0" align="center" width="760">
    <tbody>
        <tr>
            <td height="65" class="content">
            <table border="0" align="center" width="85%" class="content">
                <tbody>
                    <tr>
                        <td valign="top" class="content">
                        <table width="100%">
                            <tbody>
                                <tr>
                                    <td width="30%"> </td>
                                </tr>
                            </tbody>
                        </table>
                        <p><img hspace="5" height="261" border="0" width="261" src="http://www.uml.org.cn/oobject/images/ill_3101.gif" alt="Illustration"></p>
                        <p>现在是二月，而且到如今你或许已经读到、或听到人们谈论UML 2.0 —— 包括若干进步的 UML 的新规范，所做的变化。考虑到新规范的重要性，我们也正在修改这个文章系列的基础，把我们的注意力从                OMG 的 UML 1.4 规范，转移到 OMG 的已采纳 UML 2.0草案规范（又名 UML 2）。我不喜欢在一系列文章的中间，把重点从                1.4 变为 2.0 ，但是 UML 2.0 草案规范是前进的重要一步，我感觉需要扩充文字。</p>
                        <p>由于一些理由，OMG              改良了 UML 。主要的理由是，他们希望 UML              模型能够表达模型驱动架构（MDA），这意味着 UML              必须支持更多的模型驱动的符号。同时， UML 1.x              符号集合有时难以适用于较大的应用程序。此外,为了要使图变成更容易阅读，需要改良符号元件。（举例来说，UML              1.x 的模型逻辑流程太复杂，有时不可能完成。对UML              2              中的序列图的符号集合的改变，已经在序列化逻辑建模方面取得巨大的进步)。</p>
                        <p>注意我上面所述的文字：“已采纳UML2.0草案规范。”确实，规范仍然处于草案状态，但是关键是草案规范已经被              OMG 采用，OMG是一个直到新标准相当可靠，才会采用它们的组织。              在 UML 2              完全地被采用之前，规范将会有一些修改，但是这些改变应该是极小的。主要的改变将会是在              UML 的内部 —— 包括通常被实施 UML              工具的软件公司使用的功能。</p>
                        <p>本文的主要目的是继续把我们的重点放在基础UML图上；这个月，我们进一步了解序列图。再次请注意，下面提供的例子正是以新的              UML 2 规范为基础。</p>
                        <p><a name="IDARCMUB"><span class="atitle2">图的目的</span></a><br>
                        序列图主要用于按照交互发生的一系列顺序，显示对象之间的这些交互。很象类图，开发者一般认为序列图只对他们有意义。然而，一个组织的业务人员会发现，序 列图显示不同的业务对象如何交互，对于交流当前业务如何进行很有用。除记录组织的当前事件外，一个业务级的序列图能被当作一个需求文件使用，为实现一个未 来系统传递需求。在项目的需求阶段，分析师能通过提供一个更加正式层次的表达，把用例带入下一层次。那种情况下，用例常常被细化为一个或者更多的序列图。</p>
                        <p>组织的技术人员能发现，序列图在记录一个未来系统的行为应该如何表现中，非常有用。在设计阶段，架构师和开发者能使用图，挖掘出系统对象间的交互，这样充实整个系统设计。</p>
                        <p>序 列图的主要用途之一，是把用例表达的需求，转化为进一步、更加正式层次的精细表达。用例常常被细化为一个或者更多的序列图。序列图除了在设计新系统方面的 用途外，它们还能用来记录一个存在系统（称它为“遗产”）的对象现在如何交互。当把这个系统移交给另一个人或组织时，这个文档很有用。</p>
                        <p><a name="IDA1CMUB"><span class="atitle2">符号</span></a><br>
                        既然这是我基于 UML 2的 UML              图系列文章的第一篇，我们需要首先讨论对 UML 2              图符号的一个补充，即一个叫做框架的符号元件。在              UML 2中，框架元件用于作为许多其他的图元件的一个基础，但是大多数人第一次接触框架元件的情况，是作为图的图形化边界。当为图提供图形化边界时，一个框架元件为图的标签提供一致的位置。在              UML 图中框架元件是可选择的；就如你能在图 1 和 2              中见到的，图的标签被放在左上角，在我将调用框架的“namebox”中，一种卷角长方形，而且实际的              UML 图在较大的封闭长方形内部定义。</p>
                        <img height="222" width="385" src="http://www.uml.org.cn/oobject/images/3101_figure1.jpg" alt="图 1: 空的 UML 2 框架元件">
                        <p><a name="IDAIDMUB"><span class="atitle3">图 1: 空的 UML 2              框架元件</span></a></p>
                        <p>除了提供一个图形化边框之外，用于图中的框架元件也有描述交互的重要的功能,              例如序列图。在序列图上一个序列接收和发送消息（又称交互），能通过连接消息和框架元件边界，建立模型（如图              2 所见到）。这将会在后面“超越基础”的段落中被更详细地介绍。</p>
                        <p><img height="383" width="650" src="http://www.uml.org.cn/oobject/images/3101_figure2.jpg" alt="图 2: 一个接收和发送消息的序列图"></p>
                        <p><a name="IDAVDMUB"><span class="atitle3">图 2:              一个接收和发送消息的序列图</span></a></p>
                        <p>注意在图 2 中，对于序列图，图的标签由文字“sd”开始。当使用一个框架元件封闭一个图时，图的标签需要按照以下的格式:</p>
                        <blockquote>
                        <table cellspacing="0" cellpadding="5" border="1" bgcolor="#cccccc" width="100%">
                            <tbody>
                                <tr>
                                    <td>
                                    <pre><code>图类型 图名称</code></pre>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </blockquote>
                        <p>UML              规范给图类型提供特定的文本值。（举例来说，sd代表序列图，activity代表活动图，use              case代表用例图）。</p>
                        <p><a name="IDADEMUB"><span class="atitle2">基础</span></a><br>
                        序列图的主要目的是定义事件序列，产生一些希望的输出。重点不是消息本身，而是消息产生的顺序；不过，大多数序列图会表示一个系统的对象之间传递的什么消 息，以及它们发生的顺序。图按照水平和垂直的维度传递信息：垂直维度从上而下表示消息/调用发生的时间序列，而且水平维度从左到右表示消息发送到的对象实 例。</p>
                        <p><a name="IDALEMUB"><span class="atitle3">生命线</span></a><br>
                        当画一个序列图的时候，放置生命线符号元件，横跨图的顶部。生命线表示序列中，建模的角色或对象实例。<sup>              1 </sup>生命线画作一个方格，一条虚线从上而下，通过底部边界的中心（图              3）。生命线名字放置在方格里。</p>
                        <p><img height="209" width="141" src="http://www.uml.org.cn/oobject/images/3101_figure3.jpg" alt="图 3: 用于一个实体名为freshman的生命线的Student类的一个例子"></p>
                        <p><a name="IDA4EMUB"><span class="atitle3">图 3:              用于一个实体名为freshman的生命线的Student类的一个例子</span></a></p>
                        <p>UML 的生命线命名标准按照如下格式:</p>
                        <blockquote>
                        <table cellspacing="0" cellpadding="5" border="1" bgcolor="#cccccc" width="100%">
                            <tbody>
                                <tr>
                                    <td>
                                    <pre><code>实体名 : 类名</code></pre>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </blockquote>
                        <p>在 如图3所示的例子中，生命线表示类Student的实体，它的实体名称是freshman。这里注意一点，生命线名称带下划线。当使用下划线时，意味着序 列图中的生命线代表一个类的特定实体，不是特定种类的实体（例如，角色）。在将来的一篇文章中，我们将会了解结构化建模。现在，仅仅评述序列图，可能包含 角色（例如<em>买方</em>和<em>卖方</em>），而不需要叙述谁扮演那些角色（例如<strong>Bill</strong>和<strong>Fred</strong>）。这准许不同语境的图重复使用。简单拖放，序列图的实例名称有下划线，而角色名称没有。</p>
                        <p>图 3 中我们生命线例子是一个命名的对象，但是不是所有的生命线都代表命名的对象。相反的，一个生命线能用来表现一个匿名的或未命名的实体。当在一个序列图上， 为一个未命名的实例建模时，生命线的名字采用和一个命名实例相同的模式；但是生命线名字的位置留下空白，而不是提供一个例图名字。再次参考图 3，如果生命线正在表现Student类的一个匿名例图，生命线会是: “Student”。同时, 因为序列图在项目设计阶段中使用，有一个未指定的对象是完全合法: 举例来说，“freshman”。</p>
                        <p><a name="IDAWFMUB"><span class="atitle3">消息</span></a><br>
                        为了可读性，序列图的第一个消息总是从顶端开始，并且一般位于图的左边。然后继发的消息加入图中，稍微比前面的消息低些。</p>
                        <p>为 了显示一个对象（例如，生命线）传递一个消息给另外一个对象，你画一条线指向接收对象，包括一个实心箭头（如果是一个同步调用操作）或一个棍形箭头（如果 是一个异步讯号）。消息/方法名字放置在带箭头的线上面。正在被传递给接收对象的消息，表示接收对象的类实现的一个操作/方法。在图 4 的例子中，analyst对象调用ReportingSystem 类的一个实例的系统对象。analyst对象在调用系统对象的 getAvailableReports 方法。系统对象然后调用secSystem 对象上的、包括参数userId的getSecurityClearance 方法，secSystem的类的类型是 SecuritySystem。<sup>              2</sup></p>
                        <p><img height="210" width="650" src="http://www.uml.org.cn/oobject/images/3101_figure4.jpg" alt="图 4: 一个在对象之间传递消息的实例"></p>
                        <p><a name="IDAHGMUB"><span class="atitle3">图 4:              一个在对象之间传递消息的实例</span></a></p>
                        <p>除了仅仅显示序列图上的消息调用外，图 4              中的图还包括返回消息。这些返回消息是可选择的；一个返回消息画作一个带开放箭头的虚线，向后指向来源的生命线，在这条虚线上面，你放置操作的返回值。在图              4 中，当 getSecurityClearance 方法被调用时，secSystem              对象返回 userClearance 给系统对象。当 getAvailableReports              方法被调用时，系统对象返回 availableReports。</p>
                        <p>此外，返回消息是序列图的一个可选择部分。返回消息的使用依赖建模的具体/抽象程度。如果需要较好的具体化，返回消息是有用的；否则，主动消息就足够了。我个人喜欢，无论什么时候返回一个值，都包括一个返回消息，因为我发现额外的细节使一个序列图变得更容易阅读。</p>
                        <p>当序列图建模时，有时候，一个对象将会需要传递一个消息给它本身。一个对象何时称它本身？一个纯化论者会争辩一个对象应该永不传递一个消息给它本身。然而，为传递一个消息给它本身的对象建模，在一些情境中可能是有用的。举例来说，图              5 是图 4 的一个改良版本。 图 5 版本显示调用它的              determineAvailableReports              方法的系统对象。通过表示系统传递消息“determineAvailableReports”给它本身，模型把注意力集中到过程的事实上，而不是系统对象。</p>
                        <p>为了要画一个调用本身的对象，如你平时所作的，画一条消息，但是不是连接它到另外的一个对象，而是你把消息连接回对象本身。</p>
                        <p><img height="301" width="650" src="http://www.uml.org.cn/oobject/images/3101_figure5.jpg" alt="图 5: 系统对象调用它的 determineAvailableReports 方法"></p>
                        <p><a name="IDAXGMUB"><span class="atitle3">图 5:              系统对象调用它的 determineAvailableReports 方法</span></a></p>
                        <p>图 5              中的消息实例显示同步消息；然而，在序列图中，你也能为异步消息建模。一个异步消息和一个同步的画法类似，但是消息画的线带一个棍形矛头，如图              6 所示。</p>
                        <p><img height="208" width="364" src="http://www.uml.org.cn/oobject/images/3101_figure6.jpg" alt="图 6: 表示传递到实体2的异步消息的序列图片段"></p>
                        <p><a name="IDAGHMUB"><span class="atitle3">图 6:              表示传递到实体2的异步消息的序列图片段</span></a></p>
                        <p><a name="IDAOHMUB"><span class="atitle3">约束</span></a><br>
                        当为对象的交互建模时，有时候，必须满足一个条件，消息才会传递给对象。约束在              UML 图各处中，用于控制流。在这里，我将会讨论UML              1.x 及UML 2.0两者的约束。在 UML 1.x              中，一个约束只可能被分配到一个单一消息。UML 1.x中，为了在一个序列图上画一个约束，你把约束元件放在约束的消息线上，消息名字之前。图              7 显示序列图的一个片段，消息addStudent              方法上有一个约束。</p>
                        <p><img height="252" width="614" src="http://www.uml.org.cn/oobject/images/3101_figure7.jpg" alt="图 7:UML 1.x 序列图的一个片段,其中addStudent 消息有一个约束"></p>
                        <p><a name="IDA2HMUB"><span class="atitle3">图 7:UML 1.x              序列图的一个片段，其中addStudent 消息有一个约束</span></a></p>
                        <p>在图 7 中，约束是文本“[ pastDueBalance=0]”。通过这个消息上的约束，如果应收帐系统返回一个零点的逾期平衡，addStudent              消息才将会被传递。约束的符号很简单；格式是:</p>
                        <blockquote>
                        <table cellspacing="0" cellpadding="5" border="1" bgcolor="#cccccc" width="100%">
                            <tbody>
                                <tr>
                                    <td>
                                    <pre><code>[Boolean Test]</code></pre>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </blockquote>
                        <p>举例来说，</p>
                        <blockquote>
                        <table cellspacing="0" cellpadding="5" border="1" bgcolor="#cccccc" width="100%">
                            <tbody>
                                <tr>
                                    <td>
                                    <pre><code>[pastDueBalance = 0]</code></pre>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </blockquote>
                        <p><a name="IDARYRUB"><span class="atitle3">组合碎片(变体方案，选择项，和循环)</span></a><br>
                        然而，在大多数的序列图中，UML 1.x“in-line”约束不足以处理一个建模序列的必需逻辑。这个功能缺失是              UML 1.x 的一个问题。UML 2 已经通过去掉“in-line”约束，增加一个叫做组合碎片的符号元件，解决了这一个问题。一个组合碎片用来把一套消息组合在一起，在一个序列图中显示条件分支。UML              2 规范指明了组合碎片的 11              种交互类型。十一种中的三种将会在“基础”段落中介绍，另外两种类型将会在“超越基础”中介绍，而那剩余的六种我将会留在另一篇文章中介绍。（嗨，这是一篇文章而不是一本书。我希望你在一天中看完这部分！）</p>
                        <p><a name="IDAZYRUB"><span class="atitle3">变体</span></a><br>
                        变体用来指明在两个或更多的消息序列之间的、互斥的选择。<sup>              3 </sup>变体支持经典的“if then else”逻辑的建模（举例来说，<strong>如果</strong>              我买三个，<strong>然后</strong>              我得到 我购买的20% 折扣；<strong>否则</strong>              我得到我购买的 10% 折扣）。</p>
                        <p>就如你将会在图 8              中注意到的，一个变体的组合碎片元件使用框架来画。单词“alt”放置在框架的namebox里。然后较大的长方形分为              UML 2 所称的操作元。<sup>              4 </sup>操作元被虚线分开。每个操作元有一个约束进行测试，而这个约束被放置在生命线顶端的操作元的左上部。<sup>              5 </sup>如果操作元的约束等于“true”，然后那个操作元是要执行的操作元。</p>
                        <p><img height="766" width="507" src="http://www.uml.org.cn/oobject/images/3101_figure8.jpg" alt="图 8:包含变体组合碎片的一个序列图片段"></p>
                        <p><a name="IDA2ZRUB"><span class="atitle3">图 8：包含变体组合碎片的一个序列图片段</span></a></p>
                        <p>图 8作为一个变体的组合碎片如何阅读的例子，显示序列从顶部开始，即bank对象获取支票金额和帐户结余。此时，序列图中的变体组合碎片接管。因为约束“[balance              &gt;= amount]”，如果余额超过或等于金额，然后顺序进行bank对象传递              addDebitTransaction 和 storePhotoOfCheck 消息给account对象。然而，如果余额不是超过或等于金额，然后顺序的过程就是bank传递addInsuffientFundFee              和 noteReturnedCheck 消息给account对象，returnCheck              消息给它自身。因为“else”约束，当余额不大于或者等于金额时，第二个序列被调用。在变体的组合碎片中，不需要“else”约束；而如果一个操作元，在它上面没有一个明确的约束，那么将假定“else”约束。</p>
                        变体的组合碎片没被限制在简单的“if then else”验证。可能需要大量的变体路径。              如果需要较多的变体方案，你一定要做的全部工作就是把一个操作元加入有序列约束和消息的长方形中。
                        <p><a name="IDAG0RUB"><span class="atitle3">选择项</span></a><br>
                        选择项组合碎片用来为序列建模，这些序列给予一个特定条件，将会发生的；或者，序列不发生。一个选择项用来为简单的“if              then”表达式建模。（例如，如果架上的圈饼少于五个，那么另外做两打圈饼）。</p>
                        <p>选择项组合碎片符号与变体组合碎片类似，除了它只有一个操作元并且永不能有“else”约束以外（它就是如此，没有理由）。要画选择项组合，你画一个框架。文字“opt”是被放置在框架的              namebox              里的文本，在框架的内容区，选择项的约束被放置在生命线顶端上的左上角。              然后选择项的消息序列被放在框架的内容区的其余位置内。这些元件如图              9 所示。</p>
                        <p><img height="527" width="626" src="http://www.uml.org.cn/oobject/images/3101_figure9.jpg" alt="图 9:包括选择项组合碎片的一个序列图片段"></p>
                        <p><a name="IDAV0RUB"><span class="atitle3">图 9：包括选择项组合碎片的一个序列图片段</span></a></p>
                        <p>阅读选择项组合碎片很容易。图 9 是图 7              的序列图片段的再加工，但是这次它使用一个选择项组合碎片，因为如果Student的逾期平衡等于0，需要传递更多的消息。按照图              9 的序列图，如果Student的逾期平衡等于零，然后传递addStudent，getCostOfClass和chargeForClass消息。如果Student的逾期平衡不等于零，那么在选择项组合碎片中，序列不传递任何一个消息。</p>
                        <p>例子图 9的序列图片段包括一个选择项约束；然而，约束不是一个必需的元件。在高层次、抽象的序列图中，你可能不想叙述选择项的条件。你可能只是想要指出片段是可选择的。</p>
                        <p><a name="IDA50RUB"><span class="atitle3">循环</span></a><br>
                        有时候你将会需要为一个重复的序列建模。在 UML 2              中，为一个重复的序列建模已经改良，附加了循环组合碎片。</p>
                        <p>循环组合碎片表面非常类似选择项组合碎片。你画一个框架，在框架的              namebox 中放置文本“loop”。在框架的内容区中，一个生命线的顶部，循环约束<sup>              6 </sup>被放置在左上角。然后循环的消息序列被放在框架内容区的其余部分中。在一个循环中，除了标准的布尔测试外，一个约束能测试二个特定的条件式。特定的约束条件式是写作“minint              = [the number]”（例如，“minint = 1”）的最小循环次数，和写作“maxint              = [the number]”（例如，“maxint = 5”）的最大循环次数。通过最小循环检验，循环必须运行至少指定次数，而循环执行次数不能达到约束指定的最大循环次数。</p>
                        <p><img height="452" width="650" src="http://www.uml.org.cn/oobject/images/3101_figure10_small.jpg" alt="图 10:循环组合碎片的一个序列图例子"></p>
                        <p><a name="IDAR1RUB"><span class="atitle3">图 10：循环组合碎片的一个序列图例子              （单击放大）</span></a></p>
                        <p>在图 10 中显示的循环运行，直到 reportsEnu 对象的              hasAnotherReport 消息返回false。如果循环序列应该运行，这个序列图的循环使用一个布尔测试确认。为了阅读这个图，你和平常一样，从顶部开始。当你到达循环组合碎片，做一个测试，看看值              hasAnotherReport 是否等于true。如果 hasAnotherReport              值等于true，于是序列进入循环片断。然后你能和正常情况一样，在序列图中跟踪循环的消息。</p>
                        <p><a name="IDAA2RUB"><span class="atitle2">超越基础</span></a></p>
                        我已经介绍了序列图的基础，应该使你可以为将会在系统中通常发生的大部份交互建模。下面段落将会介绍用于序列图的比较高阶的符号元件。
                        <p><a name="IDAI2RUB"><span class="atitle3">引用另外一个序列图</span></a><br>
                        当做序列图的时候，开发者爱在他们的序列图中，重用存在的序列图。<sup>              7 </sup>在 UML 2 中开始，引进“交互进行”元件。追加交互进行的可以说是              UML 2              交互建模中的最重要的创新。交互进行增加了功能，把原始的序列图组织成为复杂的序列图。由于这些，你能组合（重用）较简单的序列，生成比较复杂的序列。这意味你能把完整的、可能比较复杂的序列，抽象为一个单一的概念单位。</p>
                        <p>一个交互进行元件使用一个框架绘制。文字“ref”放置在框架的              namebox              中，引用的序列图名字放置在框架的内容区里，连同序列图的任何参数一起。引用序列图的名字符号如下模式:</p>
                        <blockquote>
                        <table cellspacing="0" cellpadding="5" border="1" bgcolor="#cccccc" width="100%">
                            <tbody>
                                <tr>
                                    <td>
                                    <pre><code>序列图名[(参数)] [: 返回值]</code></pre>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </blockquote>
                        <p>两个例子:</p>
                        <blockquote>               1. <code>Retrieve Borrower Credit Report(ssn) :                borrowerCreditReport</code>             </blockquote>
                        <p>或者</p>
                        <blockquote>               2. <code>Process Credit Card(name, number, expirationDate, amount                : 100)</code>             </blockquote>
                        <p>在例子 1 中，语法调用叫做Retrieve Borrower Credit              Report的序列图，传递给它参数 ssn。序列Retreive              Borrower Credit Report返回变量 borrowerCreditReport 。</p>
                        <p>在实例 2 中，语法调用叫做Process Credit Card的序列图，传递给它参数name，number，expiration              date，和 amount。然而，在例子 2 中，amount参数将会是值100。因为例子2没有返回值标签，序列不返回值（假设，建模的序列不需要返回值）。</p>
                        <p><img height="458" width="650" src="http://www.uml.org.cn/oobject/images/3101_figure11.jpg" alt="图 11: 一个引用两个不同序列图的序列图"></p>
                        <p><a name="IDAM3RUB"><span class="atitle3">图 11:              一个引用两个不同序列图的序列图</span></a></p>
                        <p>图 11 显示一个序列图，它引用了序列图“Balance              Lookup”和“Debit Account”。序列从左上角开始，客户传递一个消息给teller对象。teller对象传递一个消息给              theirBank 对象。那时，调用Balance Lookup序列图，而              accountNumber作为一个参数传递。Balance Lookup序列图返回balance变量。然后检验选择项组合碎片的约束条件，确认余额大于金额变量。在余额比金额更大的情况下，调用Debit              Account序列图，给它传递参数accountNumber 和amount。在那个序列完成后，withdrawCash              消息为客户返回cash。</p>
                        <p>重要的是，注意在图 11 中，theirBank              的生命线被交互进行Balance Lookup隐藏了。因为交互进行隐藏生命线，意味着theirBank              生命线在“Balance Lookup”序列图中被引用。除了隐藏交互进行的生命线之外，UML              2 也指明，生命线在它自己的“Balance Lookup”序列中，一定有相同的              theirBank 。</p>
                        <p>有时候，你为一个序列图建模，其中交互进行会重叠<em>没有</em>              在交互进行中引用的生命线。在那种情况下，生命线和正常的生命线一样显示，不会被重叠的交互进行隐藏。</p>
                        <p>在图 11 中，序列引用“Balance Lookup”序列图。“Balance              Lookup”序列图在图 12              中显示。因为例子序列有参数和一个返回值，它的标签              —— 位于图的 namebox 中 —— 按照一个特定模式:</p>
                        <blockquote>
                        <table cellspacing="0" cellpadding="5" border="1" bgcolor="#cccccc" width="100%">
                            <tbody>
                                <tr>
                                    <td>
                                    <pre><code>图类型 图名 [参数类型:参数名]</code></pre>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </blockquote>             <blockquote>
                        <table cellspacing="0" cellpadding="5" border="1" bgcolor="#cccccc" width="100%">
                            <tbody>
                                <tr>
                                    <td>
                                    <pre><code>[: 返回值类型]</code></pre>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </blockquote>
                        <p>两个例子:</p>
                        <blockquote>               1. <code>SD Balance Lookup(Integer : accountNumber) : Real</code>             </blockquote>
                        <p>或</p>
                        <blockquote>               2. <code>SD Available Reports(Financial Analyst : analyst) :                Reports</code>             </blockquote>
                        <p>图 12 举例说明例子 1，在里面，Balance Lookup序列把参数              accountNumber              作为序列中的变量使用，序列图显示返回的Real对象。在类似这种情况下，返回的对象采用序列图实体名。</p>
                        <p><img height="325" width="650" src="http://www.uml.org.cn/oobject/images/3101_figure12.jpg" alt="图 12: 一个使用 accountNumber 参数并返回一个Real对象的序列图"></p>
                        <p><a name="IDAU4RUB"><span class="atitle3">图 12: 一个使用              accountNumber 参数并返回一个Real对象的序列图</span></a></p>
                        <p>图 13 举例说明例子 2，在里面，一个序列图获取一个参数，返回一个对象。然而，在图              13 中参数在序列的交互中使用。</p>
                        <p><img height="543" width="650" src="http://www.uml.org.cn/oobject/images/3101_figure13.jpg" alt="图 13: 一个在它的交互中使用参数,返回一个Reports对象的序列图"></p>
                        <p><a name="IDAB5RUB"><span class="atitle3">图 13:              一个在它的交互中使用参数、返回一个Reports对象的序列图</span></a></p>
                        <p><a name="IDAJ5RUB"><span class="atitle3">门</span></a><br>
                        前面的段落展示如何通过参数和返回值传递信息，引用另一个序列图。然而，有另一个方法在序列图之间传递消息。门可能是一个容易的方法，为在序列图和它的上 下文之间的传递消息建模。一个门只是一个消息，图形表示为一端连接序列图的框架边缘，另一端连接到生命线。使用门的图 11 和 12 ，在图 14 和 15 中可以被看到重构。图 15 的例图有一个叫做getBalance的入口门，获取参数 accountNumber。因为是箭头的线连接到图的框架，而箭头连接到生命线，所以 getBalance 消息是一个入口门。序列图也有一个出囗门，返回balance变量。出口门同理可知，因为它是一个返回消息，连接从一个生命线到图的框架，箭头连接框架。</p>
                        <p><img height="296" width="650" src="http://www.uml.org.cn/oobject/images/3101_figure14.jpg" alt="图 14: 图 11 的重构,这次使用门"></p>
                        <p><a name="IDAV5RUB"><span class="atitle3">图 14: 图 11              的重构，这次使用门</span></a></p>
                        <p><img height="391" width="650" src="http://www.uml.org.cn/oobject/images/3101_figure15.jpg" alt="图 15: 图 12 的重构,这次使用门"></p>
                        <p><a name="IDAEASUB"><span class="atitle3">图 15: 图 12              的重构，这次使用门</span></a></p>
                        <p><a name="IDAMASUB"><span class="atitle3">组合碎片（跳转和并行）</span></a><br>
                        在本文前面“基础”的段落中呈现的，我介绍了“变体”，“选择项”，和“循环”的组合碎片。这些三个组合碎片是大多数人将会使用最多的。然而，有二个其他的组合碎片，大量共享的人将会发现有用——跳转和并行。</p>
                        <p><a name="IDAUASUB"><span class="atitle3">跳转</span></a><br>
                        跳转组合碎片几乎在每个方面都和选择项组合碎片一致，除了两个例外。首先，跳转的框架namebox的文本“break”代替了“option”。其次,              当一个跳转组合碎片的消息运行时，封闭的交互作用的其他消息将不会执行，因为序列打破了封闭的交互。这样，跳转组合碎片非常象              C++ 或 Java 的编程语言中的break关键字。</p>
                        <p><img height="750" width="650" src="http://www.uml.org.cn/oobject/images/3101_figure16.jpg" alt="图 16: 来自图 8 的序列图片段的重构,片段使用跳转代替变体"></p>
                        <p><a name="IDAABSUB"><span class="atitle3">图 16: 来自图 8              的序列图片段的重构，片段使用跳转代替变体</span></a></p>
                        <p>跳转最常用来做模型异常处理。图 16 是图 8              的重构，但是这次图16使用跳转组合碎片，因为它把balance              &lt; amount的情况作为一个异常对待，而不是一个变体流。要阅读图              16，你从序列的左上角开始，向下读。当序列到达返回值“balance”的时候，它检查看看是否余额比金额更少。如果余额不少于金额，被传递的下一个消息是              addDebitTransaction              消息，而且序列正常继续。然而，在余额比金额更少的情况下，然后序列进入跳转组合碎片，它的消息被传递。一旦跳转组合的消息的已经被传递，序列不发送任何其它消息就退出（举例来说，addDebitTransaction）。</p>
                        <p>注意有关跳转的一件重要的事是，它们只引起一个封闭交互的序列退出，不必完成图中描述的序列。在这种情况下，跳转组合是变体或者循环的一部分，然后只是变体或循环被退出。</p>
                        <p><a name="IDAKBSUB"><span class="atitle3">并行</span></a><br>
                        今天的现代计算机系统在复杂性和有时执行并发任务方面不断进步。当完成一个复杂任务需要的处理时间比希望的长的时候，一些系统采用并行处理进程的各部分。当创造一个序列图，显示并行处理活动的时候，需要使用并行组合碎片元件。</p>
                        <p>并行组合碎片使用一个框架来画，你把文本“par”放在框架的              namebox              中。然后你把框架的内容段用虚线分为水平操作元。框架的每个操作元表示一个在并行运行的线程。</p>
                        <p><img height="446" width="613" src="http://www.uml.org.cn/oobject/images/3101_figure17.jpg" alt="图 17: oven 是并行做两个任务的对象实例"></p>
                        <p><a name="IDAXBSUB"><span class="atitle3">图 17: oven              是并行做两个任务的对象实例</span></a></p>
                        <p>图 17              可能没有举例说明做并行活动的对象的最好的计算机系统实例，不过提供了一个容易理解的并行活动序列的例子。序列如这样进行：hungryPerson              传递 cookFood 消息给oven 对象。当oven              对象接收那个消息时，它同时发送两个消息（nukeFood              和 rotateFood）给它本身。这些消息都处理后，hungryPerson              对象从oven 对象返回 yummyFood 。</p>
                        <p><a name="IDAACSUB"><span class="atitle2">总结</span></a><br>
                        序列图是一个用来记录系统需求，和整理系统设计的好图。序列图是如此好用的理由是，因为它按照交互发生的时间顺序，显示了系统中对象间的交互逻辑。</p>
                        <p><a name="IDAICSUB"><span class="atitle2">参考</span></a></p>
                        <ul>
                            <li>UML 2.0 Superstructure Final Adopted Specification (第8章部分) http://www.omg.org/cgi-bin/doc?ptc/2003-08-02</li>
                            <li>UML 2 Sequence Diagram Overview http://www.agilemodeling.com/artifacts/sequenceDiagram.htm</li>
                            <li>UML 2 Tutorial http://www.omg.org/news/meetings/workshops/UML%202003%20Manual/Tutorial7-Hogg.pdf</li>
                        </ul>
                        <a name="notes"></a>
                        <p><a name="IDAEDSUB"><span class="atitle2">脚注</span></a><br>
                        1              在完全建模系统中，对象（类的实例）也将会在系统的类图中建模。</p>
                        <p>2              当阅读这个序列图时，假定分析师登录进入系统之内。</p>
                        <p>3              请注意，附着在不同的变体操作元上的、两个或更多的约束条件式的确可能同时是真，但是实际最多只有一个操作元将会在运行时发生（那种情况下变体的“wins”没有按照              UML 标准定义)。</p>
                        <p>4 虽然操作元看起来非常象公路上的小路，但是我特别不叫它们小路。泳道是在活动图上使用的 UML 符号。请参考<em>The                Rational Edge</em> 早期关于 活动图的文章。</p>
                        <p>5              通常，附上约束的生命线是拥有包含在约束表达式中的变量的生命线。</p>
                        <p>6              关于选择项组合碎片，循环组合碎片不需要在它上放置一个约束条件。</p>
                        <p>7              可能重用任何类型的序列图（举例来说，程序或业务）。我只是发现开发者更喜欢按功能分解他们的图。</p>
                        <p><a name="resources"><span class="atitle2">参考资料</span></a></p>
                        <ul>
                            <li>您可以参阅本文在 developerWorks 全球站点上的 <a target="_blank" href="http://www.ibm.com/developerworks/rational/library/3101.html">英文原文</a>。</li>
                        </ul>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/ghina/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/ghina/blog/item/c142c17a70d87ae72e73b3b6.html#comment">查看评论</a>]]></description>
        <pubDate>2009-09-29  16:57</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[ghina]]></author>
		<guid>http://hi.baidu.com/ghina/blog/item/c142c17a70d87ae72e73b3b6.html</guid>
</item>

<item>
        <title><![CDATA[java游戏引擎]]></title>
        <link><![CDATA[http://hi.baidu.com/ghina/blog/item/f5ed27a23f6c3ba7cbefd099.html]]></link>
        <description><![CDATA[
		
		<a href="http://www.open-open.com/58.htm">http://www.open-open.com/58.htm</a> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/ghina/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/ghina/blog/item/f5ed27a23f6c3ba7cbefd099.html#comment">查看评论</a>]]></description>
        <pubDate>2009-09-14  20:58</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[ghina]]></author>
		<guid>http://hi.baidu.com/ghina/blog/item/f5ed27a23f6c3ba7cbefd099.html</guid>
</item>

<item>
        <title><![CDATA[电脑能上网但上不了QQ是怎么回事呢]]></title>
        <link><![CDATA[http://hi.baidu.com/ghina/blog/item/0b529906fee9037102088186.html]]></link>
        <description><![CDATA[
		
		能上网，而且可以返回信息，那就不是文件的问题，不用重安程序。<br>
问题可能出现在网络上。或者是时间和设置上。<br>
先说时间的设置，如果你的时间变成了2099年以后的话，那么你是上不上QQ的。<br>
网络上，你说可以上网，那么网络 设置是没有问题的，关键就在你的机器上。可能是限制了上QQ：先说说如何禁止QQ吧。一、使用防火墙禁止端口法 <br>
<br>
我们知道 QQ使用的默认端口是 UDP 4000，使用防火墙将该端口关闭，那么别人就不能使用QQ了，当自己需要上网时只需开放该端口就可以了。 <br>
<br>
下面以我使用的&ldquo;金山网镖6&rdquo;进行说明，点击菜单&ldquo;工具&rdquo;→&ldquo;综合设置&rdquo;→&ldquo;IP过滤&rdquo;→&ldquo;添加&rdquo;，弹出新窗口。(如图1) <br>
<br>
在&ldquo;端口&rdquo;栏输入&ldquo;4000&rdquo;，在&ldquo;协议&rdquo;栏选择&ldquo;UDP&rdquo;，在&ldquo;操作&rdquo;栏选择&ldquo;禁止&rdquo;，这样就将UDP 4000端口关闭了。再操作一次，只是在&ldquo;协议&rdquo;栏选择&ldquo;TCP&rdquo;，将TCP 4000端口关闭。可以看到已经禁止了 UDP 4000和TCP 4000端口。(如图2) <br>
<br>
此时你再登录QQ时试试，是不是一直不能成功呀!时间长了会出现连接超时的情况，即使重新安装了QQ，也不能登录成功。 <br>
<br>
如果你想使用QQ时，可修改上述规则，将&ldquo;操作&rdquo;栏的&ldquo;禁止&rdquo;改为&ldquo;允许&rdquo;就可以了。 <br>
<br>
到这里还不到万事大吉的时候。不信你可以再开一个QQ登录窗口(即同时有两个QQ登录窗口)试试，不一会竟然登录成功了。难道我们介绍的方法不管用吗？非也!这是因为在一个电脑进行多次QQ登录时，后来的QQ使用的端口号会是4001、4002、4003，即每运行一个QQ，使用的UPD 端口会加1。由于我们同时运行了两个QQ，第二个QQ使用的端口号是 UDP 4001，而不是UDP 4000，当然能够登录成功了。为了保险起见，我们需要封4000到4009，九个端口就可以了。你的同事总不能在一个QQ不能登录时，会同时运行10个登录窗口吧。 <br>
<br>
二、将QQ安装目录下的文件属性改为只写 <br>
<br>
QQ在运行过程中需要正确加载&ldquo;LoginUinList.dat&rdquo;文件，该文件存储着用户的帐户信息，并且要将登录过程中的一些信息写入到安装目录下相关文件中，默认情况下QQ的安装目录是可以读写的，如果将QQ安装目录属性改为&ldquo;只读&rdquo;，那么QQ在登录过程中就因为无法写入登录信息而拒绝登录。 <br>
<br>
操作方法：找到QQ安装目录(默认为C:Program FilesTencentQQ)，在其上点击鼠标右键，在弹出的菜单中选择&ldquo;属性&rdquo;，然后在弹出的窗口；(如图3) <br>
<br>
&lt;图3&gt; <br>
<br>
将其属性设置为&ldquo;只读&rdquo;，再点击&ldquo;确定&rdquo;，此时会弹出一个&ldquo;确认属性更改的&rdquo;对话框，选中&ldquo;将更改应用于该文件夹、子文件夹和文件&rdquo;按钮，连续两次点击&ldquo;确定&rdquo;按钮，关闭属性对话框。现在重新启动QQ，QQ号码就不能再登录了。 <br>
<br>
当你需要用QQ时，去掉该安装目录和该目录下所有文件的只读属性就可以了。 <br>
<br>
三、编辑Hosts文件 <br>
<br>
如果您经常上网你就会发现，每当您每在IE中输入一个网址并回车后，在IE的状态栏就会出现一行字：&ldquo;正在查找网站&rdquo;,有时很快,有些却特别慢，一般第一次访问网站都比以前访问过的慢，这就是域名解析的问题。 <br>
<br>
众所周知，计算机只能识别二进制的字符，因此为了标识每个网站就引入了IP地址的概念，IP地址就是网络上标识您站点的数字地址，就如同210.51.7.122一类的数字，很难记忆，为了简单好记，就采用了域名的方法来代替IP地址标识站点地址。所以当我们浏览所需的网站时，我们访问网站时要先连接到域名解析服务器(各地服务商提供)解析出IP地址来后才访问网站。因此，往往要耗费不少的时间，如果我们省去连接这个域名解析服务器的环节而直接访问网站速度当然会快不少。Hosts文件可以加快IP地址与主机名的映解析速度，从而提高上网速度。 <br>
<br>
实现域名本地解析的方法是将网站域名和其对应的IP地址存放到一个文件中，该文件名为Hosts，其内容存放格式为：IP地址 域名 #注释，该文件在Windows 98系统中存放在C:Windows目录下，在Windows 2000或XP中存放的路径为C:windowssystem32driversetc(假设操作系统均安装在 C:盘)。 <br>
<br>
我们上网时会首选搜索Hosts这个文件是否有相关的解析，如果没有才会通过网络服务的服务器进行解析。如果我们将QQ的全部服务器与错误的IP地址对应，并存入在Hosts文件，那么QQ就不能正常登录了。 <br>
<br>
用记事本打开Hosts文件，然后在文件中按照&ldquo;IP地址 域名 #注释&rdquo;的格式，将QQ服务器域名与错误的IP地址对应起来，从而实现禁用QQ的目的。(如图4) <br>
<br>
&lt;图4&gt; <br>
<br>
具体设置如下： <br>
<br>
127.0.0.1 sz.tencent.com # 禁用QQ 1号服务器 <br>
<br>
127.0.0.1 sz1.tencent.com # 禁用QQ 1号服务器 <br>
<br>
127.0.0.1 sz2.tencent.com # 禁用QQ 2号服务器 <br>
<br>
127.0.0.1 sz3.tencent.com # 禁用QQ 3号服务器 <br>
<br>
127.0.0.1 sz4.tencent.com # 禁用QQ 4号服务器 <br>
<br>
127.0.0.1 sz5.tencent.com # 禁用QQ 5号服务器 <br>
<br>
127.0.0.1 sz6.tencent.com # 禁用QQ 6号服务器 <br>
<br>
127.0.0.1 sz7.tencent.com # 禁用QQ 7号服务器 <br>
<br>
127.0.0.1 sz8.tencent.com # 禁用QQ 8号服务器 <br>
<br>
需要注意的是在输入映射记录时，一条记录占一行，并且IP地址和域名要有空格。 <br>
<br>
如果需要使用QQ时，只需将QQ服务器域名对应的IP地址修改正确就可以了。或者干脆将Hosts文件改为其它名字，不用QQ时再改为来就可以了。 <br>
<br>
四、删除文件禁止QQ <br>
<br>
首选，将自己的QQ号码登录一次，必须做这一步，否则经过下面的操作后，连你自己也不能使用QQ了。然后打开QQ安装目录，在安装目录中找到&ldquo;WizardCtrl.dll&rdquo;动态链接库文件(如图5)，将该文件删除或者移动到其他的目录中。 <br>
<br>
&lt;图5&gt; <br>
<br>
需要注意的是：在安装目录中有两个同名文件，必须选择安装在主目录中的动态链接库文件，如果选择了删除&ldquo;TMDlls&rdquo;子文件夹中的&ldquo;WizardCtrl.dll&rdquo;文件则无效。 <br>
<br>
此后，如果有人在QQ登录对话框中输入未出现在列表中的QQ号码时，点击&ldquo;登录&rdquo;按键后，QQ程序就会自动关闭，禁止QQ程序的运行，而我们却还是可以使用QQ的! <br>
<br>
以上四种方法都有效，实现起来也很方便，第一种方法的使用前提是你的电脑中必须安装了一种网络防火墙软件，否则不能对4000端口进行封闭；第二种方法通过修改QQ安装目录下的文件属性来实现，由于包含了子文件夹及全部的QQ文件，修改一次会需要较长时间，在修改时容易被别看到，保密性不强；第三种方法非常具有实用性，编辑好Hosts文件后就无需再动，想上QQ时只需将Hosts改为其它的文件名即可，切换速度很快；第四种方法最绝，由于只有你自己的QQ可以登录，具有很大的隐蔽性，推荐使用。 <br>
<br>
从修复QQ上网来说，安全性最好的是修改Hosts文件和禁用端口的方法。由于这两种方法的禁用与QQ的安装文件没有任何关系，是不会被轻易发觉做了手脚的!<br>
仔细检查一下你的机器。看是不是从这端口禁用了QQ。如果是的话，请你自己改了。<br>
QQ还可以从注册表禁用，由于本人知识有限，如果上面说的对你没有帮助的话，还请多包涵。 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/ghina/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/ghina/blog/item/0b529906fee9037102088186.html#comment">查看评论</a>]]></description>
        <pubDate>2009-09-14  13:23</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[ghina]]></author>
		<guid>http://hi.baidu.com/ghina/blog/item/0b529906fee9037102088186.html</guid>
</item>

<item>
        <title><![CDATA[windows XP 驱动开发环境搭建]]></title>
        <link><![CDATA[http://hi.baidu.com/ghina/blog/item/9370df34261d0d325bb5f58e.html]]></link>
        <description><![CDATA[
		
		<h1 class="xspace-title">windows XP 驱动开发环境搭建</h1>
<p class="xspace-smalltxt"> </p>
<div class="xspace-itemmessage" >
<p><strong>1.需要安装的软件</strong>：</p>
<p>在Windows XP的基础上，安装顺序： 先装上VC++6.0，再装DDK2600（也就是DDK的XP版），最后装 Driver Studio 3.2。</p>
<p>下载地址：</p>
<p>XP系统的DDK：&nbsp;&nbsp;&nbsp;  <a href="ftp://202.113.29.4/ISO/M$/WinDDK/winxp_ddk.rar">ftp://202.113.29.4/ISO/M$/WinDDK/winxp_ddk.rar</a> </p>
<p>Driver Studio：&nbsp;&nbsp;&nbsp;  <a href="http://download2.77169.com/soft/Source/debug/200801/20071229SoftICExlDS3.2.1.zip">http://download2.77169.com/soft/Source/debug/200801/20071229SoftICExlDS3.2.1.zip</a>&nbsp;&nbsp;</p>
<p>序列号和注册文件：  <a href="http://www.4x4y.com/10257_CrackDown_Compuware.DriverStudio.v3.2.iNTERNAL.html">http://www.4x4y.com/10257_CrackDown_Compuware.DriverStudio.v3.2.iNTERNAL.html</a> </p>
<p>补丁ntstrsafe.lib<span style="color: red; background-color: #ffeeee"><span style="color: #990099; background-color: #ffccff"><span style="color: navy; background-color: #e0f0ff">+</span></span></span>csq.lib： <a href="http://www.moodisk.com/codes/erp/ntstrsafe.lib+csq.lib.rar">http://www.moodisk.com/codes/erp/ntstrsafe.lib+csq.lib.rar</a></p>
<p><strong>2.安装和配置<br>
</strong>　　软件的安装顺序:<span style="color: #ee6600; background-color: yellow">Windows</span> <span style="color: blue; background-color: #ccffff">XP</span> --&gt; VC6.0 --&gt; <span style="color: brown; background-color: #ffeedd">WinXP_DDK</span> -&gt; DriverStudio3.2，如果顺序装错了，那么把DriverStudio3.2删除再重装就OK了。从网上找到库文件ntstrsafe.lib<span style="color: red; background-color: #ffeeee"><span style="color: #990099; background-color: #ffccff"><span style="color: navy; background-color: #e0f0ff">+</span></span></span>csq.lib.rar，把解压出来的两个库文件拷贝到<span style="color: brown; background-color: #ffeedd">WinXP_DDK</span>的安装目录下的库目录中（我的是C:\WINDDK\2600\lib\wxp\i386）。启动vc6，然后进行简单的配置：菜单<span style="color: #ee6600; background-color: yellow">DriverStudio</span>菜单下的DDK Build Settings，在弹出的对话框中选择已经安装的DDK目录（比如我的是C:\WINDDK\2600），在<span style="color: #ee6600; background-color: yellow">Windows</span> DDK compiler Options中选择&quot;Enable only for Driver Studio&quot;。</p>
<p>VC6.0--&gt;Tools--&gt;Options，点击&quot;Directories&quot;选项卡：<br>
1）·&ldquo;Show directories for:&quot;下选择Include files，然后检查有没有包含ddk的头文件目录（我的是C:\WINDDK\2600\inc\wxp），如果没有则加上；<br>
2）·&ldquo;Show directories for:&quot;下选择Library files，然后检查有没有包含ddk的库文件目录（我的是C:\WINDDK\2600\lib\wxp\i386），如果没有则加上；<br>
　　</p>
<p>注意：安装ＤＤＫ时一定要把例子安装（建议你安装全部的模块），否则编译vdwlibs.dsw时会报如下的错：<br>
vdw_wdm.lib - 1 error(s), 0 warning(s)<br>
然后打开引起错误的文件，发现：<br>
#error The file is from the DDK at src\wdm\hid\inc. Install DDK HID samples to install hidport.h.  Or update INCLUDE path for hidport.h in the DDK! <br>
这表明安装<span style="color: brown; background-color: #ffeedd">WinXP_DDK</span>的时候没有安装实例。</p>
<p><strong>3.编译适合本机使用的库文件</strong><br>
　　(1).启动VC6.0。开始--&gt;所有程序--&gt;Compuware DriveStudio--&gt;Develop--&gt;DDK Building Settings，确保&ldquo;DDK Root Directory&rdquo;下方的内容是ddk的安装目录（比如我的是C:\WINDDK\2600），然后点击下方的&quot;Luanch Program&quot;正式启动vc6的开发环境。<br>
　　(2).进入菜单File--&gt;Open Workspace(打开位于DriverStudio3.2安装目录的\DriverWorks\Source\vdwlibs.dsw)--&gt;进入菜单Build--&gt;batch Build，点击&ldquo;Select x86&quot;按钮只选中全部的32位库（我的电脑是32位的。注意：对于32位的电脑一定不要选中64位的库，否则后面编译会出错）--&gt;点击按钮&quot;Rebuild AlL&rdquo;开始编译。<br>
　　注:如果出现无法打开文件这类的错误,一般都是DDK Build Settings指向不对，或安装顺序有误，或者你在３２位机器上选中了６４位库。</p>
<p><strong>4.编译一个<span style="color: #ee6600; background-color: yellow">DriverStudio</span>自带的实例<br>
　　</strong>（１）·启动ｖｃ６，点击菜单File--&gt;Open Workspace，打开项目文件C:\Program Files\Compuware\<span style="color: #ee6600; background-color: yellow">DriverStudio</span>\DriverWorks\Examples\wdm\hellowdm\HelloWdm.dsw，然后编译，如果没有报错，那说明安装和配置成功。但请你别高兴的太早，开发环境安装配置成功只是万里长城的第一步，剩下的你就是要理解驱动模块的架构和具体的代码编写了。</p>
<p><strong>5.使用Driver wizard生成驱动程序框架</strong><br>
　　(1).在VC6.0的界面下,点击菜单<span style="color: #ee6600; background-color: yellow">DriverStudio</span>--&gt;Driver wizard，此后系统会一步一步引导你完成设置，最后自动生产的驱动程序框架。<br>
　　(2).设置好后将生成驱动文件,然后用VC6.0进行编译：进行Build菜单,Rebuild AlL将生成.sys文件,说明驱动模块编译成功！<br>
　　注:如果出现无法打开ntstrsafe.lib的错误，说明系统缺少这个库文件，参照上面的方法补上这个库文件，或者进入菜单Project--&gt;Settings，鼠标点击左边方框里的最上面一行，然后右边&quot;Project Option&quot;下的ntstrsafe.lib并删除它。</p>
</div> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/ghina/blog/category/Windows">Windows</a>&nbsp;<a href="http://hi.baidu.com/ghina/blog/item/9370df34261d0d325bb5f58e.html#comment">查看评论</a>]]></description>
        <pubDate>2009-06-18  14:51</pubDate>
        <category><![CDATA[Windows]]></category>
        <author><![CDATA[ghina]]></author>
		<guid>http://hi.baidu.com/ghina/blog/item/9370df34261d0d325bb5f58e.html</guid>
</item>

<item>
        <title><![CDATA[素养]]></title>
        <link><![CDATA[http://hi.baidu.com/ghina/blog/item/0b5299061cbee173020881eb.html]]></link>
        <description><![CDATA[
		
		<font color="#ff0000">一、 素养 <br>
<br>
　　</font><font color="#ff0000">蓝斯登原则：<font color="#9400d3">在你往上爬的时候，一定要保持梯子的整洁，否则你下来时可能会滑倒。 <br>
<br>
　　提出者：美国管理学家蓝斯登。 <br>
<br>
　　点评：进退有度，才不至进退维谷；宠辱皆忘，方可以宠辱不惊。 　<br>
<br>
　　<font color="#ff0000">卢维斯定理 ：<font color="#9400d3">谦虚不是把自己想得很糟，而是完全不想自己。 <br>
<br>
　　提出者：美国心理学家卢维斯 <br>
<br>
　　点评：如果把自己想得太好，就很容易将别人想得很糟。 <br>
<br>
　　<font color="#ff0000">托利得定理： <font color="#9400d3">测验一个人的智力是否属于上乘，只看脑子里能否同时容纳两种相反的思想，而无碍于其处世行事。 <br>
<br>
　　提出者：法国社会心理学家托利得 <br>
<br>
　　点评：思可相反，得须相成。 <br>
<br>
　<br>
<br>
　　<font color="#ff0000">二、统御 　<br>
<br>
　　<font color="#ff0000">刺猬理论 ：<font color="#9400d3">刺猬在天冷时彼此靠拢取暖，但保持一定距离，以免互相刺伤。 <br>
<br>
　　点评：保持亲密的重要方法，乃是保持适当的距离。　<br>
<br>
　　<font color="#ff0000">鲦鱼效应 ：<font color="#9400d3">鲦鱼因个体弱小而常常群居，并以强健者为自然首领。将一只稍强的鲦鱼脑后控制行为的部分割除后，此鱼便失去自制力，行动也发生紊乱，但其他鲦鱼却仍像从前一样盲目追随。　<br>
<br>
　　提出者：德国动物学家霍斯特 <br>
<br>
　　点评：1、下属的悲剧总是领导一手造成的。 2、下属觉得最没劲的事，是他们跟着一位最差劲的领导　<br>
<br>
　　<font color="#ff0000">雷鲍夫法则 ：<font color="#9400d3">在你着手建立合作和信任时要牢记我们语言中： <br>
<br>
　　1、最重要的八个字是：我承认我犯过错误 <br>
<br>
　　2、最重要的七个字是：你干了一件好事 <br>
<br>
　　3、最重要的六个字是：你的看法如何 <br>
<br>
　　4、最重要的五个字是：咱们一起干 <br>
<br>
　　5、最重要的四个字是：不妨试试 <br>
<br>
　　6、最重要的三个字是：谢谢您 <br>
<br>
　　7、最重要的两个字是：咱们 <br>
<br>
　　8、最重要的一个字是：您 <br>
<br>
　　提出者：美国管理学家雷鲍夫 <br>
<br>
　　点评：1、最重要的四个字是：不妨试试； 2、最重要的一个字是：您　<br>
<br>
　　<font color="#ff0000">洛伯定理 ：<font color="#9400d3">对于一个经理人来说，最要紧的不是你在场时的情况，而是你不在场时发生了什么。 <br>
<br>
　　提出者：美国管理学家洛伯 <br>
<br>
　　点评：如果只想让下属听你的，那么当你不在身边时他们就不知道应该听谁的了。 <br>
<br>
　<br>
<br>
　　<font color="#ff0000">三、沟通 　<br>
<br>
　　<font color="#ff0000">斯坦纳定理 ：<font color="#9400d3">在哪里说得愈少，在哪里听到的就愈多。 <br>
<br>
　　提出者：美国心理学家斯坦纳 <br>
<br>
　　点评：只有很好听取别人的，才能更好说出自己的。 　　<br>
<br>
　　<font color="#ff0000">费斯诺定理：<font color="#9400d3">人两只耳朵却只有一张嘴巴，这意味着人应该多听少讲。 <br>
<br>
　　提出者：英国联合航空公司总裁兼总经理费斯诺 <br>
<br>
　　点评：说得过多了，说的就会成为做的障碍。 　　<br>
<br>
　　<font color="#ff0000">牢骚效应 ：<font color="#9400d3">凡是公司中有对工作发牢骚的人，那家公司或老板一定比没有这种人或有这种人而把牢骚埋在肚子里公司要成功得多。 <br>
<br>
　　提出者：美国密歇根大学社会研究院 <br>
<br>
　　点评：1、牢骚是改变不合理现状的催化剂。 2、牢骚虽不总是正确的，但认真对待牢骚却总是正确的。<br>
<br>
　　<font color="#ff0000">避雷针效应 ：<font color="#9400d3">在高大建筑物顶端安装一个金属棒，用金属线与埋在地下的一块金属板连接起来，利用金属棒的尖端放电，使云层所带的电和地上的电逐渐中和，从而保护建筑物等避免雷击。 <br>
<br>
　　点评：善疏则通，能导必安<br>
<br>
　　<br>
<br>
<font color="#ff0000">四、协调 　　<br>
<br>
　　氨基酸组合效应 ：<font color="#9400d3">组成人体蛋白的八种氨基酸，只要有一种含量不足，其他七种就无法合成蛋白质。 <br>
<br>
　　点评：当缺一不可时，一就是一切。 　　<br>
<br>
　　<font color="#ff0000">米格-25效应 ：<font color="#9400d3">前苏联研制的米格-25喷气式战斗机的许多零部件与美国的相比都落后，但因设计者考虑了整体性能，故能在升降、速度、应急反应等方面成为当时世界一流。 　　<br>
<br>
　　点评：所谓最佳整体，乃是个体的最佳组合。 　　<br>
<br>
　　<font color="#ff0000">磨合效应 ：<font color="#9400d3">新组装的机器，通过一定时期的使用，把磨擦面上的加工痕迹磨光而变得更加密合。 <br>
<br>
　　点评：要想达到完整的契合，须双方都做出必要的割舍。<br>
<br>
　　<br>
<br>
　　<font color="#ff0000">五、指导 　　<br>
<br>
　　波特定理 ：<font color="#9400d3">当遭受许多批评时，下级往往只记住开头的一些，其余就不听了，因为他们忙于思索论据来反驳开头的批评。 <br>
<br>
　　提出者：英国行为学家波特 <br>
<br>
　　点评：总盯着下属的失误，是一个领导者的最大失误。 　　<br>
<br>
　　<font color="#ff0000">蓝斯登定律 ：<font color="#9400d3">跟一位朋友一起工作，远较在父亲之下工作有趣得多。 <br>
<br>
　　提出者：美国管理学家蓝斯登 <br>
<br>
　　点评：可敬不可亲，终难敬；有权没有威，常失权。 　　<br>
<br>
　　<font color="#ff0000">吉尔伯特法则 ：<font color="#9400d3">工作危机最确凿的信号，是没有人跟你说该怎样作。 <br>
<br>
　　提出者：英国人力培训专家吉尔伯特 <br>
<br>
　　点评：真正危险的事，是没人跟你谈危险。 　　<br>
<br>
　　<font color="#ff0000">权威暗示效应 ：<font color="#9400d3">一化学家称，他将测验一瓶臭气的传播速度，他打开瓶盖15秒后，前排学生即举手，称自己闻到臭气，而后排的人则陆续举手，纷纷称自己也已闻到，其实瓶中什么也没有。 <br>
<br>
　　点评：迷信则轻信，盲目必盲从。 <br>
<br>
　 <br>
<br>
　　<font color="#ff0000">六、组织 　　<br>
<br>
　　奥尼尔定理 ：<font color="#9400d3">所有的政治都是地方的。 <br>
<br>
　　提出者：美国前众议院院长奥尼尔 <br>
<br>
　　点评：只有能切身体会到的，群众才认为那是真实的。 　　<br>
<br>
　　<font color="#ff0000">定位效应： <font color="#9400d3">社会心理学家曾作过一个试验：在召集会议时先让人们自由选择位子，之后到室外休息片刻再进入室内入座，如此五至六次，发现大多数人都选择他们第一次坐过的位子。 <br>
<br>
　　点评：凡是自己认定的，人们大都不想轻易改变它。 　　<br>
<br>
　　<font color="#ff0000">艾奇布恩定理 ：<font color="#9400d3">如果你遇见员工而不认得，或忘了他的名字，那你的公司就太大了点。 <br>
<br>
　　提出者：英国史蒂芬约瑟剧院导演亚伦艾奇布恩 <br>
<br>
　　点评：摊子一旦铺得过大，你就很难把它照顾周全。 <br>
<br>
　　　<br>
<br>
　　<font color="#ff0000">七、培养 　　<br>
<br>
　　吉格勒定理 ：<font color="#9400d3">除了生命本身，没有任何才能不需要后天的锻炼。 <br>
<br>
　　提出者：美国培训专家吉格吉格勒 <br>
<br>
　　点评：水无积无辽阔，人不养不成才。 　　<br>
<br>
　　<font color="#ff0000">犬獒效应 ：<font color="#9400d3">当年幼的藏犬长出牙齿并能撕咬时，主人就把它们放到一个没有食物和水的封闭环境里让这些幼犬自相撕咬，最后剩下一只活着的犬，<br>
<br>
这只犬称为獒。据说十只犬才能产生一只獒。 　　<br>
<br>
　　点评：困境是造就强者的学校。 <br>
<br>
　　<br>
<br>
　　<font color="#ff0000">八、选拔 　<br>
<br>
　　近因效应 ：<font color="#9400d3">最近或最后的印象对人的认知有强烈的影响。 <br>
<br>
　　提出者：美国社会心理学家洛钦斯。 <br>
<br>
　　点评：结果往往会被视为过程的总结。 　　<br>
<br>
　　<font color="#ff0000">洒井法则 ：<font color="#9400d3">在招工时用尽浑身解数，使出各种方法，不如使自身成为一个好公司，这样人才自然而然会汇集而来。 <br>
<br>
　　提出者：日本企业管理顾问酒井正敬。 <br>
<br>
　　点评：不能吸引人才，已有的人才也留不住。 　　<br>
<br>
　　<font color="#ff0000">美即好效应 ：<font color="#9400d3">对一个外表英俊漂亮的人，人们很容易误认为他或她的其他方面也很不错。 <br>
<br>
　　提出者：美国心理学家丹尼尔麦克尼尔。 <br>
<br>
　　点评：印象一旦以情绪为基础，这一印象常会偏离事实。 <br>
<br>
　　<br>
<br>
　　<font color="#ff0000">九、任用 　　<br>
<br>
　　奥格尔维法则 ：<font color="#9400d3">如果我们每个人都雇用比我们自己都更强的人，我们就能成为巨人公司。 <br>
<br>
　　提出者：美国奥格尔维马瑟公司总裁奥格尔维。 <br>
<br>
　　点评：如果你所用的人都比你差，那么他们就只能作出比你更差的事情。 　 <font color="#ff0000">皮尔卡丹定理 ：<font color="#9400d3">用人上一加一不等于二，搞不好等于零。 <br>
<br>
　　提出者：法国著名企业家皮尔卡丹。 <br>
<br>
　　点评：组合失当，常失整体优势，安排得宜，才成最佳配置。 <br>
<br>
　　　<br>
<br>
　　<font color="#ff0000">十、激励 　　<br>
<br>
　　马蝇效应 ：<font color="#9400d3">再懒惰的马，只要身上有马蝇叮咬，它也会精神抖擞，飞快奔跑。 <br>
<br>
　　点评：有正确的刺激，才会有正确的反应。 　　<br>
<br>
　　<font color="#ff0000">倒u形假说 ：<font color="#9400d3">当一个人处于轻度兴奋时，能把工作作得最好。当一个人一点儿兴奋都没有时，也就没有作好工作的动力了；相应地，当一个人处于极<br>
<br>
度兴奋时，随之而来的压力可能会使他完不成本该完成的工作。世界网坛名将贝克尔之所以被称为常胜将军，其秘诀之一即是在比赛中自始至<br>
<br>
终防止过度兴奋，而保持半兴奋状态。所以有人亦将倒u形假说称为贝克尔境界。 　　<br>
<br>
　　提出者：英国心理学家罗伯特?耶基斯和多德林。 <br>
<br>
　　点评：1、激情过热，激情就会把理智烧光。 2、热情中的冷静让人清醒，冷静中的热情使人执着。</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/ghina/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/ghina/blog/item/0b5299061cbee173020881eb.html#comment">查看评论</a>]]></description>
        <pubDate>2009-06-05  10:28</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[ghina]]></author>
		<guid>http://hi.baidu.com/ghina/blog/item/0b5299061cbee173020881eb.html</guid>
</item>

<item>
        <title><![CDATA[杀毒软件实时杀毒的奥秘]]></title>
        <link><![CDATA[http://hi.baidu.com/ghina/blog/item/d51f21883c07349ca4c272f8.html]]></link>
        <description><![CDATA[
		
		<div class="tit"> </div>
<div class="date">2007年09月29日 星期六 01:01</div>
<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt" >
            <div align="left"><font size="3">市面上所有号称&quot;虚拟机&quot;,&quot;防火墙&quot;的实时监控杀毒软件无一不是使用的IFSHOOK技术.但是同时也有一些朋友不断写MAIL给我打听如何实现读写的监控.下面给出用VTOOLSD写的代码.也就是所有实时杀毒软件的奥秘.同时,很多拦截文件操作的软件,例如对目录加密,文件加密等,也采用了雷同的技术. <br>
            由于代码十分简单,不分析了. <br>
            //============================================================================= <br>
            // <br>
            //By Lu Lin 2000.5.10 <br>
            // Apply with VtoolsD 3.01 <br>
            // DDK version is available if requested. <br>
            //Abstract: <br>
            // Install a IFS hook, monitoring any read and write access <br>
            // <br>
            //============================================================================= <br>
            // IFSHOOK.c - main module for IFSHOOK </font>
            <p> </p>
            <p><font size="3">#define　 DEVICE_MAIN <br>
            #include　&quot;ifshook.h&quot; <br>
            #undef　　DEVICE_MAIN　</font></p>
            <p><font size="3">//typedef EventHdl(pevent pev,pioreq pir); </font></p>
            <p><font size="3">typedef struct _Monitored_Files{ <br>
            struct _Monitored_Files *pNext_Monitored_Files;//pointer to next struct <br>
            struct _Monitored_Files *pPre_Monitored_Files;//pointer to previous struct <br>
            int sfn;//system file number <br>
            int open_count; <br>
            char path[260]; //ansi path name <br>
            }_Monitored_Files,*pMonitored_Files; </font></p>
            <p><font size="3">// <br>
            //Declare virtual device <br>
            // <br>
            Declare_Virtual_Device(IFSHOOK) </font></p>
            <p><font size="3">_Monitored_Files Monitored_Files; <br>
            ppIFSFileHookFunc PrevHook; </font></p>
            <p><font size="3">DefineControlHandler(SYS_VM_INIT, OnSysVMInit); <br>
            DefineControlHandler(SYS_DYNAMIC_DEVICE_INIT, OnSysDynamicDeviceInit); <br>
            DefineControlHandler(SYS_DYNAMIC_DEVICE_EXIT, OnSysDynamicDeviceExit); <br>
            DefineControlHandler(SYS_VM_TERMINATE, OnSysVMTerminate); </font></p>
            <p><font size="3">PCHAR ConvertPath( int drive, path_t ppath, PCHAR fullpathname ) <br>
            { <br>
            　　int　i = 0; <br>
            　　_QWORD　result; </font></p>
            <p><font size="3">　　// <br>
            　　// Stick on the drive letter if we know it. <br>
            　　// <br>
            　　if( drive != 0xFF ) { </font></p>
            <p><font size="3">　　　　fullpathname[0] = drive+&quot;A&quot;-1; <br>
            　　　　fullpathname[1] = &quot;:&quot;; <br>
            　　　　i = 2; <br>
            　　} <br>
            　　UniToBCSPath( &amp;fullpathname[i], ppath-&gt;pp_elements, 260 , BCS_WANSI, &amp;result ); <br>
            　　return( fullpathname ); <br>
            } </font></p>
            <p><font size="3">pMonitored_Files IsFileOpened(int i){ <br>
            pMonitored_Files p=&amp;Monitored_Files; </font></p>
            <p><font size="3">while (p){ <br>
            　if (i==p-&gt;sfn){ <br>
            　 return p; <br>
            　} <br>
            　p=p-&gt;pNext_Monitored_Files; <br>
            } <br>
            return 0; <br>
            } </font></p>
            <p><font size="3">BOOL ControlDispatcher( <br>
            DWORD dwControlMessage, <br>
            DWORD EBX, <br>
            DWORD EDX, <br>
            DWORD ESI, <br>
            DWORD EDI, <br>
            DWORD ECX) <br>
            { <br>
            START_CONTROL_DISPATCH </font></p>
            <p><font size="3">　ON_SYS_VM_INIT(OnSysVMInit); <br>
            　ON_SYS_DYNAMIC_DEVICE_INIT(OnSysDynamicDeviceInit); <br>
            　ON_SYS_DYNAMIC_DEVICE_EXIT(OnSysDynamicDeviceExit); </font></p>
            <p><font size="3">END_CONTROL_DISPATCH </font></p>
            <p><font size="3">return TRUE; <br>
            } </font></p>
            <p><font size="3">int _cdecl MyIfsHook(pIFSFunc pfn, int fn, int Drive, int ResType, <br>
            　int CodePage, pioreq pir) <br>
            { <br>
            int retvar,i; <br>
            char fullpathname[260]; <br>
            _Monitored_Files *FileEntry; <br>
            switch(fn){ <br>
            　case IFSFN_OPEN:{ <br>
            　 retvar=(*PrevHook)(pfn, fn, Drive, ResType, CodePage, pir); <br>
            　 ConvertPath( Drive, pir-&gt;ir_ppath, fullpathname ); <br>
            　 FileEntry=IsFileOpened(pir-&gt;ir_sfn); <br>
            　 if (FileEntry){ <br>
            　　FileEntry-&gt;open_count++; <br>
            　 }else{ <br>
            　　FileEntry=&amp;Monitored_Files; <br>
            　　while(1){ <br>
            　　 if (FileEntry-&gt;pNext_Monitored_Files){ <br>
            　　　FileEntry=FileEntry-&gt;pNext_Monitored_Files; <br>
            　　 } <br>
            　　 else{ <br>
            　　　break; <br>
            　　 } <br>
            　　} <br>
            　　FileEntry-&gt;pNext_Mon_itored_Files=\ <br>
            　　 HeapAllocate( sizeof(_Monitored_Files),HEAPZEROINIT); <br>
            　　FileEntry-&gt;pNext_Monitored_Files-&gt;pPre_Mon_itored_Files=FileEntry; <br>
            　　FileEntry=FileEntry-&gt;pNext_Monitored_Files; <br>
            　　FileEntry-&gt;sfn=pir-&gt;ir_sfn; <br>
            　　FileEntry-&gt;open_count=1; <br>
            　　memcpy(FileEntry-&gt;path,fullpathname,260); <br>
            　 } <br>
            　 return retvar; <br>
            　} </font></p>
            <p><font size="3">　case IFSFN_READ:{ <br>
            　 //Do something here, <br>
            　 //eg. Decrypt the file. <br>
            　 char *str; <br>
            　 int j; <br>
            　 str=pir-&gt;ir_data; <br>
            　 j=pir-&gt;ir_length; <br>
            　 retvar=(*PrevHook)(pfn, fn, Drive, ResType, CodePage, pir); <br>
            　 FileEntry=IsFileOpened(pir-&gt;ir_sfn); <br>
            　 if (!stricmp(&quot;c:\\test.txt&quot;,FileEntry-&gt;path)){ <br>
            　　for (i=0;i&lt;j;i++){ <br>
            　　 str[i]--; <br>
            　　} <br>
            　 } <br>
            　 return retvar; <br>
            　} </font></p>
            <p><font size="3">　case IFSFN_WRITE:{ <br>
            　 //Do something here <br>
            　 //eg. Encrypt the file <br>
            　 FileEntry=IsFileOpened(pir-&gt;ir_sfn); <br>
            　 if (FileEntry){ <br>
            　　if (!stricmp(&quot;c:\\test.txt&quot;,FileEntry-&gt;path)){ <br>
            　　 for (i=0;i&lt;pir-&gt;ir_length;i++){ <br>
            　　　(((char*)pir-&gt;ir_data)[i])++; <br>
            　　 } <br>
            　　} <br>
            　 } <br>
            　 return (*PrevHook)(pfn, fn, Drive, ResType, CodePage, pir); <br>
            　} </font></p>
            <p><font size="3">　case IFSFN_CLOSE:{ <br>
            　 FileEntry=IsFileOpened(pir-&gt;ir_sfn); <br>
            　 if (FileEntry){　<br>
            　　FileEntry-&gt;open_count--; <br>
            　　if (!FileEntry-&gt;open_count){ <br>
            　　 FileEntry-&gt;pPre_Monitored_Files-&gt;pNext_Mon_itored_Files=\ <br>
            　　 FileEntry-&gt;pNext_Monitored_Files; <br>
            　　 FileEntry-&gt;pNext_Monitored_Files-&gt;pPre_Mon_itored_Files=\ <br>
            　　　FileEntry-&gt;pPre_Monitored_Files; <br>
            　　 HeapFree(FileEntry,0); <br>
            　　 } <br>
            　 } <br>
            　 return (*PrevHook)(pfn, fn, Drive, ResType, CodePage, pir); <br>
            　} </font></p>
            <p><font size="3">}　</font></p>
            <p><font size="3">return (*PrevHook)(pfn, fn, Drive, ResType, CodePage, pir); <br>
            } </font></p>
            <p><font size="3">BOOL OnSysVMInit(VMHANDLE hVM){ <br>
            return OnSysDynamicDeviceInit(); <br>
            } </font></p>
            <p><font size="3">BOOL OnSysDynamicDeviceInit() <br>
            { <br>
            PrevHook = IFSMgr_InstallFileSystemApiHook(MyIfsHook); <br>
            Monitored_Files.pNext_Mon_itored_Files=0; <br>
            Monitored_Files.pPre_Mon_itored_Files=0; <br>
            Monitored_Files.sfn=-1; <br>
            Monitored_Files.open_count=0; <br>
            Monitored_Files.path[0]=0; </font></p>
            <p><font size="3">return TRUE; <br>
            } </font></p>
            <p><font size="3">BOOL OnSysDynamicDeviceExit() <br>
            { <br>
            IFSMgr_RemoveFileSystemApiHook(MyIfsHook); <br>
            return TRUE; <br>
            } </font></p>
            <p><font size="3">void OnSysVMTerminate(VMHANDLE hVM){ <br>
            return OnSysDynamicDeviceExit(); <br>
            } </font></p>
            </div>
            </div>
            </td>
        </tr>
    </tbody>
</table> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/ghina/blog/category/Windows">Windows</a>&nbsp;<a href="http://hi.baidu.com/ghina/blog/item/d51f21883c07349ca4c272f8.html#comment">查看评论</a>]]></description>
        <pubDate>2009-05-14  08:32</pubDate>
        <category><![CDATA[Windows]]></category>
        <author><![CDATA[ghina]]></author>
		<guid>http://hi.baidu.com/ghina/blog/item/d51f21883c07349ca4c272f8.html</guid>
</item>

<item>
        <title><![CDATA[DOS]]></title>
        <link><![CDATA[http://hi.baidu.com/ghina/blog/item/8cb58109e28634a72fddd470.html]]></link>
        <description><![CDATA[
		
		accwiz.exe -&gt; 辅助工具向导 <br>
acsetups.exe -&gt; acs setup dcom server executable <br>
actmovie.exe -&gt; 直接显示安装工具 <br>
append.exe -&gt; 允许程序打开制定目录中的数据 <br>
arp.exe -&gt; 显示和更改计算机的ip与硬件物理地址的对应列表 <br>
at.exe -&gt; 计划运行任务 <br>
atmadm.exe -&gt; 调用管理器统计 <br>
attrib.exe -&gt; 显示和更改文件和文件夹属性 <br>
autochk.exe -&gt; 检测修复文件系统 <br>
autoconv.exe -&gt; 在启动过程中自动转化系统 <br>
autofmt.exe -&gt; 在启动过程中格式化进程 <br>
autolfn.exe -&gt; 使用长文件名格式 <br>
bootok.exe -&gt; boot acceptance application for registry <br>
bootvrfy.exe -&gt; 通报启动成功 <br>
cacls.exe -&gt; 显示和编辑acl <br>
calc.exe -&gt; 计算器 <br>
cdplayer.exe -&gt; cd播放器 <br>
change.exe -&gt; 与终端服务器相关的查询 <br>
charmap.exe -&gt; 字符映射表 <br>
chglogon.exe -&gt; 启动或停用会话记录 <br>
chgport.exe -&gt; 改变端口（终端服务） <br>
chgusr.exe -&gt; 改变用户（终端服务） <br>
chkdsk.exe -&gt; 磁盘检测程序 <br>
chkntfs.exe -&gt; 磁盘检测程序 <br>
cidaemon.exe -&gt; 组成ci文档服务 <br>
cipher.exe -&gt; 在ntfs上显示或改变加密的文件或目录 <br>
cisvc.exe -&gt; 索引内容 <br>
ckcnv.exe -&gt; 变换cookie <br>
cleanmgr.exe -&gt; 磁盘清理 <br>
cliconfg.exe -&gt; sql客户网络工具 <br>
clipbrd.exe -&gt; 剪贴簿查看器 <br>
clipsrv.exe -&gt; 运行clipboard服务 <br>
clspack.exe -&gt; 建立系统文件列表清单 <br>
cluster.exe -&gt; 显示域的集群 <br>
_cmd_.exe -&gt; 没什么好说的！ <br>
cmdl32.exe -&gt; 自动下载连接管理 <br>
cmmgr32.exe -&gt; 连接管理器 <br>
cmmon32.exe -&gt; 连接管理器监视 <br>
cmstp.exe -&gt; 连接管理器配置文件安装程序 <br>
comclust.exe -&gt; 集群 <br>
comp.exe -&gt; 比较两个文件和文件集的内容＊ <br>
compact.exe -&gt; 显示或改变ntfs分区上文件的压缩状态 <br>
conime.exe -&gt; ime控制台 <br>
control.exe -&gt; 控制面板 <br>
convert.exe -&gt; 转换文件系统到ntfs <br>
convlog.exe -&gt; 转换iis日志文件格式到ncsa格式 <br>
cprofile.exe -&gt; 转换显示模式 <br>
cscript.exe -&gt; 较本宿主版本 <br>
csrss.exe -&gt; 客户服务器runtime进程 <br>
csvde.exe -&gt; 日至格式转换程序 <br>
dbgtrace.exe -&gt; 和terminal server相关 <br>
dcomcnfg.exe -&gt; dcom配置属性 <br>
dcphelp.exe -&gt; ? <br>
dcpromo.exe -&gt; ad安装向导 <br>
ddeshare.exe -&gt; dde共享 <br>
ddmprxy.exe -&gt; <br>
debug.exe -&gt; 就是debug啦！ <br>
dfrgfat.exe -&gt; fat分区磁盘碎片整理程序 <br>
dfrgntfs.exe -&gt; ntfs分区磁盘碎片整理程序 <br>
dfs_cmd_.exe -&gt; 配置一个dfs树 <br>
dfsinit.exe -&gt; 分布式文件系统初始化 <br>
dfssvc.exe -&gt; 分布式文件系统服务器 <br>
diantz.exe -&gt; 制作cab文件 <br>
diskperf.exe -&gt; 磁盘性能计数器 <br>
dllhost.exe -&gt; 所有com+应用软件的主进程 <br>
dllhst3g.exe -&gt; <br>
dmadmin.exe -&gt; 磁盘管理服务 <br>
dmremote.exe -&gt; 磁盘管理服务的一部分 <br>
dns.exe -&gt; dns applications dns <br>
doskey.exe -&gt; 命令行创建宏 <br>
dosx.exe -&gt; dos扩展 <br>
dplaysvr.exe -&gt; 直接运行帮助 <br>
drwatson.exe -&gt; 华生医生错误检测 <br>
drwtsn32.exe -&gt; 华生医生显示和配置管理 <br>
dtcsetup.exe -&gt; installs mdtc <br>
dvdplay.exe -&gt; dvd播放 <br>
dxdiag.exe -&gt; direct-x诊断工具 <br>
edlin.exe -&gt; 命令行的文本编辑器 <br>
esentutl.exe -&gt; ms数据库工具 <br>
eudcedit.exe -&gt; type造字程序 <br>
eventvwr.exe -&gt; 事件查看器 <br>
evnt_cmd_.exe -&gt; event to trap translator; configuration tool <br>
evntwin.exe -&gt; event to trap translator setup <br>
exe2bin.exe -&gt; 转换exe文件到二进制 <br>
expand.exe -&gt; 解压缩 <br>
extrac32.exe -&gt; 解cab工具 <br>
fastopen.exe -&gt; 快速访问在内存中的硬盘文件 <br>
faxcover.exe -&gt; 传真封面编辑 <br>
faxqueue.exe -&gt; 显示传真队列 <br>
faxsend.exe -&gt; 发送传真向导 <br>
faxsvc.exe -&gt; 启动传真服务 <br>
fc.exe -&gt; 比较两个文件的不同 <br>
find.exe -&gt; 查找文件中的文本行 <br>
findstr.exe -&gt; 查找文件中的行 <br>
finger.exe -&gt; 一个用户并显示出统计结果 <br>
fixmapi.exe -&gt; 修复mapi文件 <br>
flattemp.exe -&gt; 允许或者禁用临时文件目录 <br>
fontview.exe -&gt; 显示字体文件中的字体 <br>
forcedos.exe -&gt; forces a file to start in dos mode. 强制文件在dos模式下运行 <br>
freecell.exe -&gt; popular windows game 空当接龙 <br>
ftp.exe -&gt; file transfer protocol used to transfer files over a network conne <br>
ction 就是ftp了 <br>
gdi.exe -&gt; graphic device interface 图形界面驱动 <br>
grovel.exe -&gt; <br>
grpconv.exe -&gt; program manager group convertor 转换程序管理员组 <br>
help.exe -&gt; displays help for windows 2000 commands 显示帮助 <br>
hostname.exe -&gt; display hostname for machine. 显示机器的hostname <br>
ie4uinit.exe -&gt; ie5 user install tool ie5用户安装工具 <br>
ieshwiz.exe -&gt; customize folder wizard 自定义文件夹向导 <br>
iexpress.exe -&gt; create and setup packages for install 穿件安装包 <br>
iisreset.exe -&gt; restart iis admin service 重启iis服务 <br>
internat.exe -&gt; keyboard language indicator applet 键盘语言指示器 <br>
ipconfig.exe -&gt; windows 2000 ip configuration. 察看ip配置 <br>
ipsecmon.exe -&gt; ip security monitor ip安全监视器 <br>
ipxroute.exe -&gt; ipx routing and source routing control program ipx路由和源路由控制程序 <br>
irftp.exe -&gt; setup ftp for wireless communication 无线连接 <br>
ismserv.exe -&gt; intersite messaging service 安装或者删除service control manager中的服务 <br>
jdbgmgr.exe -&gt; microsoft debugger for java 4 java4的调试器 <br>
jetconv.exe -&gt; convert a jet engine database 转换jet engine数据库 <br>
jetpack.exe -&gt; compact jet database. 压缩jet数据库 <br>
jview.exe -&gt; command-line loader for java java的命令行装载者 <br>
krnl386.exe -&gt; core component for windows 2000 2000的核心组件 <br>
label.exe -&gt; change label for drives 改变驱动器的卷标 <br>
lcwiz.exe -&gt; license compliance wizard for local or remote systems. 许可证符合向导 <br>
ldifde.exe -&gt; ldif cmd line manager ldif目录交换命令行管理 <br>
licmgr.exe -&gt; terminal server license manager 终端服务许可协议管理 <br>
lights.exe -&gt; display connection status lights 显示连接状况 <br>
llsmgr.exe -&gt; windows 2000 license manager 2000许可协议管理 <br>
llssrv.exe -&gt; start the license server 启动许可协议服务器 <br>
lnkstub.exe -&gt; <br>
locator.exe -&gt; rpc locator 远程定位 <br>
lodctr.exe -&gt; load perfmon counters 调用性能计数 <br>
logoff.exe -&gt; log current user off. 注销用户 <br>
lpq.exe -&gt; displays status of a remote lpd queue 显示远端的lpd打印队列的状态，显示被送到基于unix的服务器的打印任务 <br>
lpr.exe -&gt; send a print job to a network printer. 重定向打印任务到网络中的打印机。通常用于unix客户打印机将打印任务发送给连接了打印设备的nt的打印机服务器。 <br>
lsass.exe -&gt; lsa executable and server dll 运行lsa和server的dll <br>
lserver.exe -&gt; specifies the new dns domain for the default server 指定默认se <br>
rver新的dns域 <br>
os2.exe -&gt; an os/2 warp server (os2 /o) os/2 <br>
os2srv.exe -&gt; an os/2 warp server os/2 <br>
os2ss.exe -&gt; an os/2 warp server os/2 <br>
osk.exe -&gt; on screen keyboard 屏幕键盘 <br>
packager.exe -&gt; windows 2000 packager manager 对象包装程序 <br>
pathping.exe -&gt; combination of ping and tracert 包含ping和tracert的程序 <br>
pax.exe -&gt; is a posix program and path names used as arguments must be specified in posix format. use &quot;文件://c/users/default&quot; instead of &quot;c:\users\default.&quot;  <br>
启动便携式存档互换 (pax) 实用程序 <br>
pentnt.exe -&gt; used to check the pentium for the floating point division error <br>
. 检查pentium的浮点错误 <br>
perfmon.exe -&gt; starts windows performance monitor 性能监视器 <br>
ping.exe -&gt; packet internet groper 验证与远程计算机的连接 <br>
posix.exe -&gt; used for backward compatibility with unix 用于兼容unix <br>
print.exe -&gt; cmd line used to print files 打印文本文件或显示打印队列的内容。 <br>
progman.exe -&gt; program manager 程序管理器 <br>
proquota.exe -&gt; profile quota program <br>
psxss.exe -&gt; posix subsystem application posix子系统应用程序 <br>
qappsrv.exe -&gt; displays the available application terminal servers on the net <br>
work <br>
在网络上显示终端服务器可用的程序 <br>
qprocess.exe -&gt; display information about processes local or remote 在本地或远程显示进程的信息（需终端服务） <br>
query.exe -&gt; query termserver user process and sessions 查询进程和对话 <br>
quser.exe -&gt; display information about a user logged on 显示用户登陆的信息（需终端服务） <br>
qwinsta.exe -&gt; display information about terminal sessions. 显示终端服务的信息 <br>
rasadmin.exe -&gt; start the remote access admin service 启动远程访问服务 <br>
rasautou.exe -&gt; creates a ras connection 建立一个ras连接 <br>
rasdial.exe -&gt; dial a connection 拨号连接 <br>
ras.exe -&gt; starts a ras connection 运行ras连接 <br>
rcp.exe -&gt; copies a file from and to a rcp service. 在 windows 2000 计算机和运行远程外壳端口监控程序 rshd 的系统之间复制文件 <br>
rdpclip.exe -&gt; rdpclip allows you to copy and paste files between a terminal  <br>
session and client console session. 再终端和本地复制和粘贴文件 <br>
recover.exe -&gt; recovers readable information from a bad or defective disk 从坏的或有缺陷的磁盘中恢复可读取的信息。 <br>
redir.exe -&gt; starts the redirector service 运行重定向服务 <br>
regedt32.exe -&gt; 32-bit register service 32位注册服务 <br>
regini.exe -&gt; modify registry permissions from within a script 用脚本修改注册许可 <br>
register.exe -&gt; register a program so it can have special execution character <br>
istics. 注册包含特殊运行字符的程序 <br>
regsvc.exe -&gt; <br>
regsvr32.exe -&gt; registers and unregisters dlls. as to how and where it regi <br>
sters them i dont know. 注册和反注册dll <br>
regtrace.exe -&gt; options to tune debug options for applications failing to dum <br>
p trace statements trace 设置 <br>
regwiz.exe -&gt; registration wizard 注册向导 <br>
remrras.exe -&gt; <br>
replace.exe -&gt; replace files 用源目录中的同名文件替换目标目录中的文件。 <br>
reset.exe -&gt; reset an active section 重置活动部分 <br>
rexec.exe -&gt; runs commands on remote hosts running the rexec service. 在运行 rexec 服务的远程计算机上运行命令。rexec 命令在执行指定命令前，验证远程计算机上的用户名，只有安装了 tcp/ip 协议后才可以使用该命令。 <br>
risetup.exe -&gt; starts the remote installation service wizard. 运行远程安装向导服务 <br>
route.exe -&gt; display or edit the current routing tables. 控制网络路由表 <br>
routemon.exe -&gt; no longer supported 不再支持了！ <br>
router.exe -&gt; router software that runs either on a dedicated dos or on an os <br>
/2 system. route软件在 dos或者是os/2系统 <br>
rsh.exe -&gt; runs commands on remote hosts running the rsh service 在运行 rsh 服务的远程计算机上运行命令 <br>
rsm.exe -&gt; mounts and configures remote system media 配置远程系统媒体 <br>
rsnotify.exe -&gt; remote storage notification recall 远程存储通知回显 <br>
rsvp.exe -&gt; resource reservation protocol 源预约协议 <br>
runas.exe -&gt; run a program as another user 允许用户用其他权限运行指定的工具和程序 <br>
rundll32.exe -&gt; launches a 32-bit dll program 启动32位dll程序 <br>
runonce.exe -&gt; causes a program to run during startup 运行程序再开始菜单中 <br>
rwinsta.exe -&gt; reset the session subsystem hardware and software to known ini <br>
tial values 重置会话子系统硬件和软件到最初的值 <br>
savedump.exe -&gt; does not write to e:\winnt\user.dmp 不写入user.dmp中 <br>
scardsvr.exe -&gt; smart card resource management server 子能卡资源管理服务器 <br>
schupgr.exe -&gt; it will read the schema update files (.ldf files) and upgrade  <br>
the schema. (part of adsi) 读取计划更新文件和更新计划 <br>
secedit.exe -&gt; starts security editor help 自动安全性配置管理 <br>
services.exe -&gt; controls all the services 控制所有服务 <br>
sethc.exe -&gt; set high contrast - changes colours and display mode logoff to s <br>
et it back to normal 设置高对比 <br>
setreg.exe -&gt; shows the software publishing state key values 显示软件发布的国家语言 <br>
setup.exe -&gt; gui box prompts you to goto control panel to configure system co <br>
mponents 安装程序（转到控制面板） <br>
setver.exe -&gt; set version for files 设置 ms-dos 子系统向程序报告的 ms-dos 版本号 <br>
sfc.exe -&gt; system file checker test and check system files for integrity 系统 <br>
文件检查 <br>
sfmprint.exe -&gt; print services for macintosh 打印macintosh服务 <br>
sfmpsexe.exe -&gt; <br>
sfmsvc.exe -&gt; <br>
shadow.exe -&gt; monitor another terminal services session. 监控另外一台中端服务器会话 <br>
share.exe -&gt; windows 2000 和 ms-dos 子系统不使用该命令。接受该命令只是为了与 ms-dos 文件兼容 <br>
shmgrate.exe -&gt; <br>
shrpubw.exe -&gt; create and share folders 建立和共享文件夹 <br>
sigverif.exe -&gt; file signature verification 文件签名验证 <br>
skeys.exe -&gt; serial keys utility 序列号制作工具 <br>
smlogsvc.exe -&gt; performance logs and alerts 性能日志和警报 <br>
smss.exe -&gt; <br>
sndrec32.exe -&gt; starts the windows sound recorder 录音机 <br>
sndvol32.exe -&gt; display the current volume information 显示声音控制信息 <br>
snmp.exe -&gt; simple network management protocol used for network mangement 简单网络管理协议 <br>
snmptrap.exe -&gt; utility used with snmp snmp工具 <br>
sol.exe -&gt; windows solitaire game 纸牌 <br>
sort.exe -&gt; compares files and folders 读取输入、排序数据并将结果写到屏幕、文件和其他设备上 <br>
SPOOLSV.EXE -&gt; Part of the spooler service for printing 打印池服务的一部分 <br>
sprestrt.exe -&gt; <br>
srvmgr.exe -&gt; Starts the Windows Server Manager 服务器管理器 <br>
stimon.exe -&gt; WDM StillImage- -&gt; Monitor <br>
stisvc.exe -&gt; WDM StillImage- -&gt; Service <br>
subst.exe -&gt; Associates a path with a drive letter 将路径与驱动器盘符关联 <br>
svchost.exe -&gt; Svchost.exe is a generic host process name for services that a <br>
re run from dynamic-link libraries (DLLs). DLL得主进程 <br>
syncapp.exe -&gt; Creates Windows Briefcase. 创建Windows文件包 <br>
sysedit.exe -&gt; Opens Editor for 4 system files 系统配置编辑器 <br>
syskey.exe -&gt; Encrypt and secure system database NT账号数据库按群工具 <br>
sysocmgr.exe -&gt; Windows 2000 Setup 2000安装程序 <br>
systray.exe -&gt; Starts the systray in the lower right corner. 在低权限运行syst <br>
ray <br>
macfile.exe -&gt; Used for managing MACFILES 管理MACFILES <br>
magnify.exe -&gt; Used to magnify the current screen 放大镜 <br>
makecab.exe -&gt; MS Cabinet Maker 制作CAB文件 <br>
mdm.exe -&gt; Machine Debug Manager 机器调试管理 <br>
mem.exe -&gt; Display current Memory stats 显示内存状态 <br>
migpwd.exe -&gt; Migrate passwords. 迁移密码 <br>
mmc.exe -&gt; Microsoft Management Console 控制台 <br>
mnmsrvc.exe -&gt; Netmeeting Remote Desktop Sharing NetMeeting远程桌面共享 <br>
mobsync.exe -&gt; Manage Synchronization. 同步目录管理器 <br>
mountvol.exe -&gt; Creates, deletes, or lists a volume mount point. 创建、删除或列出卷的装入点。 <br>
mplay32.exe -&gt; MS Media Player 媒体播放器 <br>
mpnotify.exe -&gt; Multiple Provider Notification application 多提供者通知应用程序 <br>
mq1sync.exe -&gt; <br>
mqbkup.exe -&gt; MS Message Queue Backup and Restore Utility 信息队列备份和恢复工具 <br>
mqexchng.exe -&gt; MSMQ Exchange Connector Setup 信息队列交换连接设置 <br>
mqmig.exe -&gt; MSMQ Migration Utility 信息队列迁移工具 <br>
mqsvc.exe -&gt; ? <br>
mrinfo.exe -&gt; Multicast routing using SNMP 使用SNMP多点传送路由 <br>
mscdexnt.exe -&gt; Installs MSCD (MS CD Extensions) 安装MSCD <br>
msdtc.exe -&gt; Dynamic Transaction Controller Console 动态事务处理控制台 <br>
msg.exe -&gt; Send a message to a user local or remote. 发送消息到本地或远程客户 <br>
mshta.exe -&gt; HTML Application HOST HTML应用程序主机 <br>
msiexec.exe -&gt; Starts Windows Installer Program 开始Windows安装程序 <br>
mspaint.exe -&gt; Microsoft Paint 画板 <br>
msswchx.exe -&gt; <br>
mstask.exe -&gt; Task Schedule Program 任务计划表程序 <br>
mstinit.exe -&gt; Task scheduler setup 任务计划表安装 <br>
narrator.exe -&gt; Program will allow you to have a narrator for reading. Micros <br>
oft讲述人 <br>
nbtstat.exe -&gt; Displays protocol stats and current TCP/IP connections using N <br>
BT 使用 NBT（TCP/IP 上的 NetBIOS）显示协议统计和当前 TCP/IP 连接。 <br>
nddeapir.exe -&gt; NDDE API Server side NDDE API服务器端 <br>
net.exe -&gt; Net Utility 详细用法看/？ <br>
net1.exe -&gt; Net Utility updated version from MS Net的升级版 <br>
netdde.exe -&gt; Network DDE will install itself into the background 安装自己到后台 <br>
netsh.exe -&gt; Creates a shell for network information 用于配置和监控 Windows 2000 命令行脚本接口。 <br>
netstat.exe -&gt; Displays current connections. 显示协议统计和当前的 TCP/IP 网络连接。 <br>
nlsfunc.exe -&gt; Loads country-specific information 加载特定国家（地区）的信息。Windows 2000 和 MS-DOS 子系统不使用该命令。接受该命令只是为了与 MS-DOS 文件兼容。 <br>
notepad.exe -&gt; Opens Windows 2000 Notepad 记事本 <br>
nslookup.exe -&gt; Displays information for DNS 该诊断工具显示来自域名系统 (DNS)名称服务器的信息。 <br>
ntbackup.exe -&gt; Opens the NT Backup Utility 备份和故障修复工具 <br>
ntbooks.exe -&gt; Starts Windows Help Utility 帮助 <br>
ntdsutil.exe -&gt; Performs DB maintenance of the ADSI 完成ADSI的DB的维护 <br>
ntfrs.exe -&gt; NT File Replication Service NT文件复制服务 <br>
ntfrsupg.exe -&gt; <br>
ntkrnlpa.exe -&gt; Kernel patch 核心补丁 <br>
ntoskrnl.exe -&gt; Core NT Kernel KT的核心 <br>
ntsd.exe -&gt; <br>
ntvdm.exe -&gt; Simulates a 16-bit Windows environment 模拟16位Windows环境 <br>
nw16.exe -&gt; Netware Redirector NetWare转向器 <br>
nwscript.exe -&gt; runs netware scripts 运行Netware脚本 <br>
odbcad32.exe -&gt; ODBC 32-bit Administrator 32位ODBC管理 <br>
odbcconf.exe -&gt; Configure ODBC drivers and data sources from command line 命令行配置ODBC驱动和数据源 <br>
taskman.exe -&gt; Task Manager 任务管理器 <br>
taskmgr.exe -&gt; Starts the Windows 2000 Task Manager 任务管理器 <br>
tcmsetup.exe -&gt; telephony client wizard 电话服务客户安装 <br>
tcpsvcs.exe -&gt; TCP Services TCP服务 <br>
.exe -&gt; Telnet Utility used to connect to Telnet Server <br>
termsrv.exe -&gt; Terminal Server 终端服务 <br>
tftp.exe -&gt; Trivial FTP 将文件传输到正在运行 TFTP 服务的远程计算机或从正在运行 <br>
TFTP 服务的远程计算机传输文件 <br>
tftpd.exe -&gt; Trivial FTP Daemon <br>
themes.exe -&gt; Change Windows Themes 桌面主题 <br>
tlntadmn.exe -&gt; Telnet Server Administrator Telnet服务管理 <br>
tlntsess.exe -&gt; Display the current Telnet Sessions 显示目前的Telnet会话 <br>
tlntsvr.exe -&gt; Start the Telnet Server 开始Telnet服务 <br>
tracert.exe -&gt; Trace a route to display paths 该诊断实用程序将包含不同生存时间(TTL) 值的 Internet 控制消息协议 (ICMP) 回显数据包发送到目标，以决定到达目标采用的路由 <br>
tsadmin.exe -&gt; Terminal Server Administrator 终端服务管理器 <br>
tscon.exe -&gt; Attaches a user session to a terminal session. 粘贴用户会话到终端对话 <br>
tsdiscon.exe -&gt; Disconnect a user from a terminal session 断开终端服务的用户 <br>
tskill.exe -&gt; Kill a Terminal server process 杀掉终端服务 <br>
tsprof.exe -&gt; Used with Terminal Server to query results. 用终端服务得出查询结果 <br>
tsshutdn.exe -&gt; Shutdown the system 关闭系统 <br>
unlodctr.exe -&gt; Part of performance monitoring 性能监视器的一部分 <br>
upg351db.exe -&gt; Upgrade a jet database 升级Jet数据库 <br>
ups.exe -&gt; UPS service UPS服务 <br>
user.exe -&gt; Core Windows Service Windows核心服务 <br>
userinit.exe -&gt; Part of the winlogon process Winlogon进程的一部分 <br>
usrmgr.exe -&gt; Start the windows user manager for domains 域用户管理器 <br>
utilman.exe -&gt; This tool enables an administrator to designate which computers automatically open accessibility tools when Windows 2000 starts. 指定2000启动时自动打开那台机器 <br>
verifier.exe -&gt; Driver Verifier Manager Driver Verifier Manager <br>
vwipxspx.exe -&gt; Loads IPX/SPX VDM 调用IPX/SPX VDM <br>
w32tm.exe -&gt; Windows Time Server 时间服务器 <br>
wextract.exe -&gt; Used to extract windows files 解压缩Windows文件 <br>
winchat.exe -&gt; Opens Windows Chat 打开Windows聊天 <br>
winhlp32.exe -&gt; Starts the Windows Help System 运行帮助系统 <br>
winlogon.exe -&gt; Used as part of the logon process. Logon进程的一部分 <br>
winmine.exe -&gt; windows Game 挖地雷 <br>
winmsd.exe -&gt; Windows Diagnostic utility 系统信息 <br>
wins.exe -&gt; Wins Service Wins服务 <br>
winspool.exe -&gt; Print Routing 打印路由 <br>
winver.exe -&gt; Displays the current version of Windows 显示Windows版本 <br>
wizmgr.exe -&gt; Starts Windows Administration Wizards Windows管理向导 <br>
wjview.exe -&gt; Command line loader for Java 命令行调用Java <br>
wowdeb.exe -&gt; . For starters, the 32-bit APIs require that the WOWDEB.EXE tas <br>
k runs in the target debugees VM 启动时，32位API需要 <br>
wowexec.exe -&gt; For running Windows over Windows Applications 在Windows应用程序上运行Windows <br>
wpnpinst.exe -&gt; ? <br>
write.exe -&gt; Starts MS Write Program 写字板 <br>
wscript.exe -&gt; Windows Scripting Utility 脚本工具 <br>
wupdmgr.exe -&gt; Starts the Windows update Wizard (Internet) 运行Windows升级向导 <br>
xcopy.exe -&gt; 复制文件和目录，包括子目录 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/ghina/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/ghina/blog/item/8cb58109e28634a72fddd470.html#comment">查看评论</a>]]></description>
        <pubDate>2009-05-03  01:17</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[ghina]]></author>
		<guid>http://hi.baidu.com/ghina/blog/item/8cb58109e28634a72fddd470.html</guid>
</item>


</channel>
</rss>