<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-ngaut-随笔分类-others</title><link>http://www.cppblog.com/ngaut/category/1628.html</link><description>asm/c/c++/......</description><language>zh-cn</language><lastBuildDate>Sat, 20 Sep 2008 07:19:09 GMT</lastBuildDate><pubDate>Sat, 20 Sep 2008 07:19:09 GMT</pubDate><ttl>60</ttl><item><title>发一个招聘贴</title><link>http://www.cppblog.com/ngaut/archive/2008/09/19/62309.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Fri, 19 Sep 2008 14:06:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2008/09/19/62309.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/62309.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2008/09/19/62309.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/62309.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/62309.html</trackback:ping><description><![CDATA[要求:<br>1. 熟悉汇编语言，c/c++，熟悉80x86体系架构，实模式，保护模式<br>2. 良好的数据结构与算法基础<br>3. 熟悉MFC或者STL<br>4. 工作地点在武汉<br>5. 学历不限，英语不限，人品良好，有团队精神<br>6. 特别优秀者，只需具备：人品良好，有团队精神<br><br>有以下经验优先：<br>1. os引导程序开发， os开发<br>2. bios开发经验<br>3. 熟悉Linux裁剪，Linux内核<br>4. 有编译器开发经验<br><br>tel:13554674976&nbsp; 刘先生<br><br> <img src ="http://www.cppblog.com/ngaut/aggbug/62309.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2008-09-19 22:06 <a href="http://www.cppblog.com/ngaut/archive/2008/09/19/62309.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Bug管理的经验和实践[转载]</title><link>http://www.cppblog.com/ngaut/archive/2008/09/09/61354.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Tue, 09 Sep 2008 00:07:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2008/09/09/61354.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/61354.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2008/09/09/61354.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/61354.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/61354.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: [转载]孟岩：刘振飞，你好。我知道你以前是方正出版印刷系统的核心开发人员，后来来到微软的Office开发组。我认识你的时候你还在微软工作，状态似乎不错。为什么后来又离开微软了呢？&nbsp;刘振飞：93年到96年，我在北大计算机研究所读研。96年毕业后，我留在所里继续从事方正核心产品世纪RIP --- PSPNT的研发、维护、升级（还有外围软件开发比如新女娲补字NewNW、PDF流程系...&nbsp;&nbsp;<a href='http://www.cppblog.com/ngaut/archive/2008/09/09/61354.html'>阅读全文</a><img src ="http://www.cppblog.com/ngaut/aggbug/61354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2008-09-09 08:07 <a href="http://www.cppblog.com/ngaut/archive/2008/09/09/61354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Driver Development Part 1: Introduction to Drivers [codeproject]</title><link>http://www.cppblog.com/ngaut/archive/2008/04/14/47077.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Mon, 14 Apr 2008 13:38:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2008/04/14/47077.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/47077.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2008/04/14/47077.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/47077.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/47077.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Download source files - 10.4 Kb IntroductionThis tutorial will attempt to describe how to write a simple devicedriver for Windows NT. There are various resources and tutorials on theinternet...&nbsp;&nbsp;<a href='http://www.cppblog.com/ngaut/archive/2008/04/14/47077.html'>阅读全文</a><img src ="http://www.cppblog.com/ngaut/aggbug/47077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2008-04-14 21:38 <a href="http://www.cppblog.com/ngaut/archive/2008/04/14/47077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]打造最快的Hash表(和Blizzard的对话)</title><link>http://www.cppblog.com/ngaut/archive/2008/02/27/43329.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Wed, 27 Feb 2008 03:39:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2008/02/27/43329.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/43329.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2008/02/27/43329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/43329.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/43329.html</trackback:ping><description><![CDATA[<p>開元最近学习了一下Blizzard的MPQ文件格式，颇有一些心得，其中一条就是对HastTable的理解，很想写出来给大家共享，感谢Justin Olbrantz的文章《Inside MoPaQ》，大多认识来源于此。 <br><br><br>先提一个简单的问题，如果有一个庞大的字符串数组，然后给你一个单独的字符串，让你从这个数组中查找是否有这个字符串并找到它，你会怎么做？<br><br>有一个方法最简单，老老实实从头查到尾，一个一个比较，直到找到为止，我想只要学过程序设计的人都能把这样一个程序作出来，但要是有程序员把这样的程序交给用户，我只能用无语来评价，或许它真的能工作，但...也只能如此了。<br><br>最合适的算法自然是使用HashTable（哈希表），先介绍介绍其中的基本知识，所谓Hash，一般是一个整数，通过某种算法，可以把一个字符串"压缩" 成一个整数，这个数称为Hash，当然，无论如何，一个32位整数是无法对应回一个字符串的，但在程序中，两个字符串计算出的Hash值相等的可能非常小，下面看看在MPQ中的Hash算法<br><br>unsigned long HashString(char *lpszFileName, unsigned long dwHashType)<br>{ <br>unsigned char *key = (unsigned char *)lpszFileName;<br>unsigned long seed1 = 0x7FED7FED, seed2 = 0xEEEEEEEE;<br>int ch;<br><br>while(*key != 0)<br>{ <br>&nbsp;&nbsp;ch = toupper(*key++);<br><br>seed1 = cryptTable[(dwHashType &lt;&lt; 8) + ch] ^ (seed1 + seed2);<br>seed2 = ch + seed1 + seed2 + (seed2 &lt;&lt; 5) + 3; <br>}<br>return seed1; <br>} <br><br>Blizzard的这个算法是非常高效的，被称为"One-Way Hash"，举个例子，字符串"unitneutralacritter.grp"通过这个算法得到的结果是0xA26067F3。<br>是不是把第一个算法改进一下，改成逐个比较字符串的Hash值就可以了呢，答案是，远远不够，要想得到最快的算法，就不能进行逐个的比较，通常是构造一个哈希表(Hash Table)来解决问题，哈希表是一个大数组，这个数组的容量根据程序的要求来定义，例如1024，每一个Hash值通过取模运算 (mod)对应到数组中的一个位置，这样，只要比较这个字符串的哈希值对应的位置又没有被占用，就可以得到最后的结果了，想想这是什么速度？是的，是最快的O(1)，现在仔细看看这个算法吧<br>int GetHashTablePos(char *lpszString, SOMESTRUCTURE *lpTable, int nTableSize)<br>{ <br>int nHash = HashString(lpszString), nHashPos = nHash % nTableSize;<br><br>if (lpTable[nHashPos].bExists &amp;&amp; !strcmp(lpTable[nHashPos].pString, lpszString)) <br>&nbsp;&nbsp;return nHashPos; <br>else <br>&nbsp;&nbsp;return -1; //Error value <br>} <br><br>看到此，我想大家都在想一个很严重的问题："如果两个字符串在哈希表中对应的位置相同怎么办？",毕竟一个数组容量是有限的，这种可能性很大。解决该问题的方法很多，我首先想到的就是用"链表",感谢大学里学的数据结构教会了这个百试百灵的法宝，我遇到的很多算法都可以转化成链表来解决，只要在哈希表的每个入口挂一个链表，保存所有对应的字符串就OK了。<br><br>事情到此似乎有了完美的结局，如果是把问题独自交给我解决，此时我可能就要开始定义数据结构然后写代码了。然而Blizzard的程序员使用的方法则是更精妙的方法。基本原理就是：他们在哈希表中不是用一个哈希值而是用三个哈希值来校验字符串。<br><br>中国有句古话"再一再二不能再三再四"，看来Blizzard也深得此话的精髓，如果说两个不同的字符串经过一个哈希算法得到的入口点一致有可能，但用三个不同的哈希算法算出的入口点都一致，那几乎可以肯定是不可能的事了，这个几率是1:18889465931478580854784，大概是10的 22.3次方分之一，对一个游戏程序来说足够安全了。<br><br>现在再回到数据结构上，Blizzard使用的哈希表没有使用链表，而采用"顺延"的方式来解决问题，看看这个算法：<br>int GetHashTablePos(char *lpszString, MPQHASHTABLE *lpTable, int nTableSize)<br>{ <br>const int HASH_OFFSET = 0, HASH_A = 1, HASH_B = 2;<br>int nHash = HashString(lpszString, HASH_OFFSET);<br>int nHashA = HashString(lpszString, HASH_A);<br>int nHashB = HashString(lpszString, HASH_B);<br>int nHashStart = nHash % nTableSize, nHashPos = nHashStart;<br><br>while (lpTable[nHashPos].bExists)<br>{ <br>&nbsp;&nbsp;if (lpTable[nHashPos].nHashA == nHashA &amp;&amp; lpTable[nHashPos].nHashB == nHashB) <br>&nbsp;&nbsp; return nHashPos; <br>&nbsp;&nbsp;else <br>&nbsp;&nbsp; nHashPos = (nHashPos + 1) % nTableSize;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;if (nHashPos == nHashStart) <br>&nbsp;&nbsp; break; <br>}<br><br>return -1; //Error value <br>} <br><br>1. 计算出字符串的三个哈希值（一个用来确定位置，另外两个用来校验)<br>2. 察看哈希表中的这个位置<br>3. 哈希表中这个位置为空吗？如果为空，则肯定该字符串不存在，返回<br>4. 如果存在，则检查其他两个哈希值是否也匹配，如果匹配，则表示找到了该字符串，返回<br>5. 移到下一个位置，如果已经越界，则表示没有找到，返回<br>6. 看看是不是又回到了原来的位置，如果是，则返回没找到<br>7. 回到3<br><br>怎么样，很简单的算法吧，但确实是天才的idea, 其实最优秀的算法往往是简单有效的算法，<br>Blizzard被称为最卓越的游戏制作公司，不愧于此。</p>
<img src ="http://www.cppblog.com/ngaut/aggbug/43329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2008-02-27 11:39 <a href="http://www.cppblog.com/ngaut/archive/2008/02/27/43329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Delphi多线程下的ADO编程</title><link>http://www.cppblog.com/ngaut/archive/2008/02/26/43253.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Tue, 26 Feb 2008 05:49:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2008/02/26/43253.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/43253.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2008/02/26/43253.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/43253.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/43253.html</trackback:ping><description><![CDATA[<p align=center><strong><span>Delphi</span></strong><strong><span>多线程下的</span></strong><strong><span>ADO</span></strong><strong><span>编程</span></strong><strong></strong></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong><span>前言：</span></strong><strong></strong></p>
<p><span>几个月前接到一个任务：将一后台程序访问数据库的方式从</span><span>BDE</span><span>改为</span><span>ADO</span><span>，原因是由于业务量的增加，通过</span><span>BDE</span><span>不论是向数据库写入数据还是从数据库中读出数据的速度都变得无法忍受，大家都知道</span><span>ADO</span><span>在数据库访问速度方面比</span><span>BDE</span><span>要快的多了（我写了一个测试程序使用</span><span>ADO</span><span>比使用</span><span>BDE</span><span>快了近</span><span>100</span><span>倍</span><span>!</span><span>）。这个任务还不简单嘛，只要将</span><span>BDE</span><span>的控件更换成</span><span>ADO</span><span>的再修改一些代码不就搞定了！我当时确实是这么想的，而且用了不到一个小时就搞定，测试运行一段没问题，大功告成了，我想。谁知道一个恶梦就此开始，我的愚昧无知使我在程序中埋下了一个超级炸弹，它的威力不次于</span><span>9.11</span><span>撞击世贸大厦的两架客机，整个系统被它无情的催跨。程序在运行很长一段时间候捕获到一系列的异常：</span></p>
<p><span>OLE error 800A0E7F</span></p>
<p><span>Access violation at address 00135770. Write of address 005D8B78</span></p>
<p><span>Access violation at address 00178EC6. Read of address FFFFFFFF</span></p>
<p><span>Access violation at address 1F499BDD in module 'msado15.dll'. Read of address 0000000C</span></p>
<p><span>&#8230;&#8230;.</span></p>
<p><span>接下来我们的系统就像世贸大厦一下悲壮的倒下了。</span></p>
<p>&nbsp;</p>
<p><strong><span>为什么？</span></strong><strong></strong></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>为什么？程序在为改动之前使用</span><span>BDE</span><span>运行得好好的，我并没有更改程序的结构啊？我十分的迷惑，当然要想解决问题一切都得从错误代码开始。</span></p>
<p><span><span>&nbsp;&nbsp; </span>OLE error 800A0E7F</span><span>：什么咚咚来的？它什么意思？什么原因引起的？我找了半天也没有在我的系统里找到它的说明，好在现在网络发达，也许有人遇到跟我一样的问题吧，于是我用</span><span>OLE error 800A0E7F</span><span>作为关键字搜了一下，嘿嘿，果真被我找到了：</span></p>
<p><span>&gt;</span><em><span>0x800A0E7F Operation cannot be performed while executing </span></em><span><br><em>&gt; asynchronously.</em></span></p>
<p><span>异步执行时操作不能被执行（完成），还是不太清楚错误的原因，于是我在一个网站发布了帖子求助，一些人告诉我</span><span>ADO</span><span>线程不安全，需要线程同步，事实上我的程序做了同步，而且针对不同的应用使用了多个</span><span>ADOConnection</span><span>，我想我应该自己动手来好好研究一下这个问题了，它很意思。接下来我该好好分析我的程序并做一系列的测试来找到那个炸弹。</span></p>
<p>&nbsp;</p>
<p><strong><span>找出炸弹</span></strong><strong></strong></p>
<p><strong>&nbsp;</strong></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>在我的程序里所有访问数据库都是通过一个</span><span>DataModule</span><span>单元</span><span>TDataModule1</span><span>类提供的接口来完成，共有三个线程使用到了</span><span>TDataModule1</span><span>的对象</span><span>DataModule1</span><span>，</span><span>DataModule1</span><span>是一全局变量，下面是数据库的访问模式的结构模型图。（实际结构要复杂很多）</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><strong><span>数据库：</span></strong></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>ADOConnection1</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>ADOConnection2 </span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>Table1</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>Table2</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>①</span><span>ADOQuery1</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>②</span><span>ADOQuery3</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>①</span><span>ADOProcedure1</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>①</span><span>ADOProcedure2</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>①</span><span>UpdateQuery</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>③</span><span>ADOQuery2</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<br clear=all>
<p align=center><span>图</span><span>1</span></p>
<p><span>说明：</span></p>
<p>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>①</span><span>UpdateQuery</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
&nbsp;</p>
<br clear=all>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ADOQuery</span><span>控件用来修改</span><span>table2</span><span>记录，</span><span>①代表为线程</span><span>1</span><span>所有，</span></p>
<p><span>白色代表使用频率很低（颜色越深说明使用频率越高）</span></p>
<p>&nbsp;</p>
<p>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>③</span><span>ADOQuery2</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
&nbsp;</p>
<br clear=all>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>查询</span><span>table2</span><span>，</span><span>③代表为线程</span><span>3</span><span>所有，使用频率较高</span></p>
<p>&nbsp;</p>
<p>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>②</span><span>ADOQuery3</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
&nbsp;</p>
<br clear=all>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>查询</span><span>table2</span><span>，</span><span>③代表为线程</span><span>2</span><span>所有，使用频率很高</span></p>
<p>&nbsp;</p>
<p>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>①</span><span>ADOProcedure1</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ADO</span><span>存储过程控件向表</span><span>table2</span><span>插入数据，属于线程</span><span>1</span><span>频繁使用</span></p>
<p>&nbsp;</p>
<p>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>①</span><span>ADOProcedure2</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
&nbsp;</p>
<br clear=all>
<p><span>修改</span><span>ADOProcedure1</span><span>插入的记录，属于线程</span><span>1</span><span>频繁使用</span></p>
<p>&nbsp;</p>
<p><span>其中线程</span><span>3</span><span>和线程</span><span>2</span><span>使用</span><span>ADO</span><span>控件时没有加锁，而线程</span><span>1</span><span>的所有访问都加锁了（这样做毫无作用）</span></p>
<p>&nbsp;</p>
<p><span>程序的结构出来了，问题在哪里呢？接下来我写了一个小小的测试程序，该程序的结构与上面相同，它拥有三个线程和一个</span><span>DataMoule</span><span>单元，线程一通过</span><span>ADOQuery1</span><span>查询数据库</span><span>DBTest</span><span>的</span><span>table1</span><span>的记录，线程二通过</span><span>ADOQuery2</span><span>向</span><span>table1</span><span>中插入记录，线程三通过</span><span>ADOQuery3</span><span>修改</span><span>table1</span><span>中最后一条记录的某个字段。</span><span>ADOQuery1</span><span>、</span><span>ADOQuery2</span><span>、</span><span>ADOQuery3</span><span>都通过</span><span>ADOConnection1</span><span>与数据库</span><span>DBTest1</span><span>建立连接，一开始，所有的线程都不做同步，运行，</span><span>OK!</span><span>错误出来了其中两个错误正是我所想要的，这就是我的程序报的错啊。</span></p>
<p>&nbsp;</p>
<p>&#160;</p>
<p align=center><span>图二</span></p>
<p>&nbsp;</p>
<p><span>接下来我将三个</span><span>ADOQuery</span><span>都加上锁，再运行没问题，我又将</span><span>ADOQuery</span><span>分别通过三个不同的</span><span>ADOConnection</span><span>来连接数据库且不加锁也没有问题。看来我是找到那个可恶的炸弹了，怎么拆了它？</span></p>
<p>&nbsp;</p>
<p><strong><span>排除炸弹</span></strong><strong></strong></p>
<p><strong>&nbsp;</strong></p>
<p><span>炸弹找到了，我该怎么拆它？是简单的做线程同步还是每个线程都是用一个</span><span>ADOConnection</span><span>？这下我再也不敢蛮干了，我得好好看看这方面的资料，在</span><span>Delphi</span><span>帮助文档，《</span><span>Using the main VCL thread</span><span>》我找到了下面一段话：</span></p>
<p><span>&#8230;&#8230;</span></p>
<p><span>Data access components are thread-safe as long as each thread has its own database session component. The one exception to this is when you are using Access drivers. Access drivers are built using the Microsoft ADO library, which is not thread-safe.</span></p>
<p><span>&#8230;..</span></p>
<p><span>同样在</span><span>Delphi</span><span>的帮助文档《</span><span>Managing multiple sessions</span><span>》中给我明确的建议：</span></p>
<p><span>&#8230;&#8230;</span></p>
<p><span>If you create a single application that uses multiple threads to perform database operations, you must create one additional session for each thread.</span></p>
<p><span>&#8230;..</span></p>
<p><strong><span>喔找到了：</span></strong><strong><span>ADO</span></strong><strong><span>控件是线程不安全的，所以如果你的程序是使用多线程访问数据库的话你应该确保每个线程都有自己的会话。</span></strong><strong></strong></p>
<p><span>事实上在另外一本书《</span><span>Delphi 4</span><span>编程技术内幕》一书在谈到<em>线程安全数据库访问</em>也有相同的建议，不过台湾李维先生在他的</span><span>《</span><span>Delphi 5.X ADO/MTS/COM+</span><span>高级程序设计篇》却说，<strong>如果你的程序不是连接多个数据库的话，最好同一数据库使用一个连接，不要使用多个连接</strong>。怎么办？谁对谁错？为什么要使用一个连接呢？这主要是从服务器来考虑，因为数据库服务器需要为每个连接分配一定的资源并对其进行维护，连接数越多服务器方所耗的资源就越多，服务器的性能也就越差，所以要尽可能的减少客户端的连接数。好在我的程序是作为服务器程序增加一些连接对数据库服务器的影响不会很大，现在我可以重新设置我的数据库访问结构模型了</span></p>
<p>&nbsp;</p>
<p>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><strong><span>数据库：</span></strong></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>ADOConnection1</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>ADOConnection2 </span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>Table1</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>Table2</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>①</span><span>ADOQuery1</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>②</span><span>ADOQuery3</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>①</span><span>ADOProcedure1</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>①</span><span>ADOProcedure2</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>①</span><span>UpdateQuery</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>③</span><span>ADOQuery2</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>ADOConnection2</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<br clear=all>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p align=center><span>图三</span></p>
<p align=center>&nbsp;</p>
<p><span>我增加了一个</span><span>ADOConnection</span><span>以保证每个线程都有一个自己连接</span><span>(</span><span>会话</span><span>)</span><span>，从而避免出现资源冲突，我的问题是不是解决了呢？是的，这个问题已经解决了，将我的程序与数据库放在同一台机器上运行没有问题，但是当程序与数据库服务器不在同一台机器上运行时会出现一个新的问题。</span></p>
<p>&nbsp;</p>
<p><strong><span>[DBNMPNTW]ConnectionWrite(writeFile())</span></strong><strong><span>错误</span></strong><strong></strong></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>这个错误不是多线程引起的，而是</span><span>Micrsoft</span><span>自己的一个问题，产生该问题的原因可能是因为网络异常而引起的，可以通过</span><span>SQLServer</span><span>客户端的默认的网络协议</span><span>named pipes network propocol </span><span>改为</span><span> TCP/IP </span><span>Sockets</span><span>，</span><span>具体做法请参考</span><span>Micrsoft</span><span>技术支持网站的《</span><strong><span>Microsoft Knowledge Base Article&nbsp;-&nbsp;Q178040</span></strong><span>》</span></p>
<p>&nbsp;</p>
<p><strong><span>总结</span></strong><strong></strong></p>
<p><strong><span><span>&nbsp;&nbsp; </span></span></strong><span>由于</span><span>ADO</span><span>控件的线程不安全性（事实上这种不安全性是来自</span><span>Micrsoft ADO Library</span><span>，所以在其它开发工具中也存在同样的问题）因此在使用多线程</span><span>ADO</span><span>编程时应该注意一下问题：</span></p>
<p>&nbsp;</p>
<p><strong><span>第一：要保证每个线程都拥有自己的会话。</span></strong><strong></strong></p>
<p><strong><span>第二：作为客户端程序应该尽可能的减少与数据库库服务器的连接数。</span></strong><strong></strong></p>
<p><strong><span>第三：在退出线程之前确保释放所有的资源。</span></strong><strong></strong></p>
<p><strong>&nbsp;</strong></p>
<p><span>参考文献：</span></p>
<p><span>1、</span><span>李维</span><span>《</span><span>Delphi 5.X ADO/MTS/COM+</span><span>高级程序设计篇》</span><span> </span><span>机械工业出版社</span><span> 2000</span><span>。</span></p>
<p><span>2、</span><span>Charlie Calvert</span><span>《</span><span>Delphi 4</span><span>编程技术内幕》潇湘工作室</span><span> </span><span>译</span><span> </span><span>机械工业出版社</span><span> 1999</span></p>
<img src ="http://www.cppblog.com/ngaut/aggbug/43253.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2008-02-26 13:49 <a href="http://www.cppblog.com/ngaut/archive/2008/02/26/43253.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>asio:如何正确关闭socket</title><link>http://www.cppblog.com/ngaut/archive/2008/02/22/43102.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Fri, 22 Feb 2008 11:31:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2008/02/22/43102.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/43102.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2008/02/22/43102.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/43102.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/43102.html</trackback:ping><description><![CDATA[&gt; Also now I am confused and it will be helpful to know in asio sockets:<br>&gt; 1. In what situation we need to use both <br>&gt; "basic_stream_socket::shutdown()" &amp; "basic_stream_socket::close()"<br>&gt; functions?<br><br>If you want graceful closure of the socket, and you want it to work <br>consistently on Windows, use shutdown() before close(). There are <br>circumstances where just calling close() can result in the Windows TCP <br>stack sending a RST to the peer, which means possible data loss (i.e. <br>anything but a graceful closure).<br><br>&gt; 2. In what situation we need to use just "basic_stream_socket::close()"<br>&gt; function?<br><br>When you just want to close the connection as soon as possible and don't <br>care about possible loss of data under Windows.<br><br>
<img src ="http://www.cppblog.com/ngaut/aggbug/43102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2008-02-22 19:31 <a href="http://www.cppblog.com/ngaut/archive/2008/02/22/43102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用asio需要注意的两个问题</title><link>http://www.cppblog.com/ngaut/archive/2008/02/14/42745.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Thu, 14 Feb 2008 13:52:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2008/02/14/42745.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/42745.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2008/02/14/42745.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/42745.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/42745.html</trackback:ping><description><![CDATA[Message: 2<br>Date: Wed, 6 Feb 2008 23:43:09 -0000<br>From: "Roger Austin" &lt;Roger@wallingfordsoftware.com&gt;<br>Subject: Re: [asio-users] asio::async_write &amp; WriteHander<br>To: &lt;asio-users@lists.sourceforge.net&gt;<br>Message-ID:<br>&lt;0CEE50132F7DB142AA8632D6FB1BE982E7E462@bob.internal.wallingfordsoftware.co.uk&gt;<br><br>Content-Type: text/plain; charset="us-ascii"<br><br>If there is ever an asio FAQ, the correct use of async_write will be at<br>the top of the list<br><br><br><br>Cliff is correct in what he says but the key clause is "when the first<br>async_write completes". If you start your second async_write before the<br>first has completed, you risk interleaving the data. Thus if you want to<br>write code like:<br><br><br><br>DoAsyncWrite("Message 1");<br><br>DoAsyncWrite("Message 2");<br><br><br><br>Then your implementation of DoAsyncWrite (which will call async_write<br>internally) must check if there is already an async_write pending and,<br>if so, put the message somewhere (i.e. in a queue), ready to be sent<br>when the pending async_write has completed. The asio chat example does<br>this.<br><br><br><br>This is not a limitation of asio as such. The underlying socket<br>functions (send or equivalent) make no guarantee that the entire message<br>can be transferred to the TCP stream in a single asynchronous operation<br>- the write handler will be told how many bytes were actually<br>transferred and the application is responsible for issuing a new call to<br>send the remaining bytes. The asio async_write function does this for<br>you via one or more calls to async_write_some, but in doing so it tends<br>to hide the fact that the second and later calls to async_write_some<br>(needed to complete sending the first message) may happen later in the<br>thread than the first call to async_write_some for the second message.<br><br><br><br><br><br>From: asio-users-bounces@lists.sourceforge.net<br>[mailto:asio-users-bounces@lists.sourceforge.net] On Behalf Of X Wang<br>Sent: Thursday, 7 February 2008 9:37 AM<br>To: asio-users@lists.sourceforge.net<br>Subject: Re: [asio-users] asio::async_write &amp; WriteHander<br><br><br><br><br><br>"Green, Cliff" &lt;cliff.green@boeing.com&gt; wrote: <br><br>&gt; Sender sends out 2 messages back to back (on the same end-to-end<br>socket <br>&gt; connection), message 1 is 10 MB, message 2 is 10 bytes, with no<br>receiver <br>&gt; ACK in between. <br><br>Assuming the two messages are generated in order (e.g. in a single<br>thread), there is not an issue - one async_write of 10 MB, followed by<br>an async_write of 10 bytes (when the first async_write completes). Since<br>the actual "buffer" passed to Asio async_write does not copy the 10 MB /<br>10 b, you will need to manage the lifetime of the two original message<br>buffers. If the "message generation" is completely independent of the<br>thread invoking the async_writes, you need to manage the coordination<br>(this could be a queue, as previously mentioned, or some other form of<br>coordination).<br><br>You will be guaranteed that the data gets to the receiver in the same<br>order - 10 MB followed by 10 b (however, the receiver will need to take<br>responsibility for the message delimiter handling).<br><br>Am I missing something?<br><br>(Asio experts, please correct any of my mistakes on the Asio aspects.)<br><br>Much of this explanation is not dependent on async concepts and designs<br>- it would need to be similar whether your app is blocking, non-blocking<br>(polling), non-blocking (reactive), multi-threaded, etc.<br><br>Cliff<br><br>------------------------------------------------------------------------<br>-<br>This SF.net email is sponsored by: Microsoft<br>Defy all challenges. Microsoft(R) Visual Studio 2008.<br>http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/<br>_______________________________________________<br>asio-users mailing list<br>asio-users@lists.sourceforge.net<br>https://lists.sourceforge.net/lists/listinfo/asio-users<br><br><br>Yeah, you are right. What I said about TCP did not make much sense...<br>need some coffee :)<br>
<img src ="http://www.cppblog.com/ngaut/aggbug/42745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2008-02-14 21:52 <a href="http://www.cppblog.com/ngaut/archive/2008/02/14/42745.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost asio 0.39发布了</title><link>http://www.cppblog.com/ngaut/archive/2007/12/16/38634.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Sun, 16 Dec 2007 14:04:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2007/12/16/38634.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/38634.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2007/12/16/38634.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/38634.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/38634.html</trackback:ping><description><![CDATA[boost asio 0.39发布了，看来即将进入boost 1.35了
<img src ="http://www.cppblog.com/ngaut/aggbug/38634.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2007-12-16 22:04 <a href="http://www.cppblog.com/ngaut/archive/2007/12/16/38634.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]今年的十个佳句出炉啦</title><link>http://www.cppblog.com/ngaut/archive/2007/10/23/34936.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Tue, 23 Oct 2007 11:14:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2007/10/23/34936.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/34936.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2007/10/23/34936.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/34936.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/34936.html</trackback:ping><description><![CDATA[<br>1、钱不是问题，问题是没钱。<br>2、钻石恒久远，一颗就破产。<br>3、水能载舟，亦能煮粥。<br>4、一山不能容二虎，除非一公和一母。<br>5、火可以试金，金可以试女人，女人可以试男人。<br>6、烧香的不一定是和尚，还可能是熊猫。<br>7、喝醉了我谁也不服，我就扶墙。<br>8、我就像一只趴在玻璃上的苍蝇，前途光明，出路没有。<br>9、避孕的效果：不成功，便成人。<br>10、问世间情为何物？一物降一物&nbsp; 
<img src ="http://www.cppblog.com/ngaut/aggbug/34936.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2007-10-23 19:14 <a href="http://www.cppblog.com/ngaut/archive/2007/10/23/34936.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>当asio::async_read与socket的async_read_some的区别</title><link>http://www.cppblog.com/ngaut/archive/2007/06/29/27221.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Fri, 29 Jun 2007 07:37:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2007/06/29/27221.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/27221.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2007/06/29/27221.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/27221.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/27221.html</trackback:ping><description><![CDATA[今天用asio写一个简单的server时，<br>当连接成功时做如下工作<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #008080">1</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asio::async_read(socket_,&nbsp;asio::buffer(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">m_packet,&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(m_packet)),<br></span><span style="COLOR: #008080">2</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boost::bind(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">tcp_connection::HandleReadCardKey,&nbsp;shared_from_this(),<br></span><span style="COLOR: #008080">3</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asio::placeholders::error));</span></div>
但HandleReadCardKey始终没有被回调，除非remote point断开连接<br><br>最后用下面的代码搞定：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #008080">1</span>&nbsp;<span style="COLOR: #000000">socket_.async_read_some(asio::buffer(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">m_packet,&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(m_packet)),<br></span><span style="COLOR: #008080">2</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boost::bind(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">tcp_connection::HandleReadCardKey,&nbsp;shared_from_this(),<br></span><span style="COLOR: #008080">3</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asio::placeholders::error));</span></div>
记下，免得以后忘记了<br><br>总结一下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asio::async_read通常用户读取指定长度的数据，读完或出错才返回。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;而socket的async_read_some读取到数据或出错就返回，不一定读完了整个包。&nbsp;&nbsp;&nbsp;<br><br>
<img src ="http://www.cppblog.com/ngaut/aggbug/27221.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2007-06-29 15:37 <a href="http://www.cppblog.com/ngaut/archive/2007/06/29/27221.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]嵌入式Linux研究－对几种典型的系统的内核配置方案</title><link>http://www.cppblog.com/ngaut/archive/2007/06/20/26713.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Wed, 20 Jun 2007 12:32:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2007/06/20/26713.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/26713.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2007/06/20/26713.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/26713.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/26713.html</trackback:ping><description><![CDATA[<h5>
<p><span><font face="Times New Roman">1.</font></span><span>对于一般</span><span><font face="Times New Roman">PC</font></span><span>的普通内核配置</span><span><br><br></span><span><font face="Times New Roman"></font></span><span>对于一般的用户而言，对于</span><span><font face="Times New Roman">Linux</font></span><span>内核的效率和大小的要求都不高。因此一般不对内核重新配置，因为</span><span><font face="Times New Roman">Linux</font></span><span>安装程序会在安装时对大部分设置按照安装的需求和实际的硬件做缺省设置。这样的内核会比实际需要的繁冗，有很多模块加载后根本就没有用到，但是因为现在的</span><span><font face="Times New Roman">PC</font></span><span>的内存一般都是上百</span><span><font face="Times New Roman">MB</font></span><span>，而一个</span><span><font face="Times New Roman">Linux</font></span><span>内核再大也就是几百</span><span><font face="Times New Roman">K</font></span><span>，因此对于一般用户而言，无需再重新编译内核了。</span><span><br><br></span><span><font face="Times New Roman"></font></span><span>在一台</span><span><font face="Times New Roman">P3-566</font></span><span>的</span><span><font face="Times New Roman">Dell</font></span><span>机器安装</span><font face="Times New Roman"><span>Red-Hat</span><span>7.2,</span></font><span>内核版本为</span><font face="Times New Roman"><st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899"><span>2.4.6</span></st1:chsdate><br><br><span></span></font><span>以下是一些该机的配置：</span><span><br><br></span><span><font face="Times New Roman">Loadablemodulesupport:Y<br><br>Networkingsupport:Y<br><br>PCIsupport:Y<br><br>SystemVIPC</font></span><span>：</span><span><font face="Times New Roman">Y</font></span><span>因为可以做一些基于</span><font face="Times New Roman"><span>System</span><span>V</span></font><span>的程序</span><span><br><br></span><span><font face="Times New Roman">Kernelsupportfora.outbinaries:Y<br><br>KernelsupportforELFbinaries:Y<br><br>Blockdevices</font></span><span>：对此根据该机的硬件做了相应的配置，去除一些本机没有的硬件设备的支持模块。如</span><font face="Times New Roman"><span>:Loopback</span><span>d</span><span>evice</span></font><span><font face="Times New Roman">support<br><br>Networkingoptions:<br><br>Packetsocket:Y<br><br>TCP/IPnetworking:Y<br><br>Networkfirewalls:Y<br><br>TheIPXprotocol:Y<br><br>Networkdevicesupport:<br><br>Networkdevicesupport:Y<br><br>Ethernet(10or100Mb/s):Y<br><br>Characterdevice<br><br>Virtualterminal:Y</font></span><span><br><br></span><span><font face="Times New Roman">Supportforconsoleonvirtualterminal:Y<br><br>Filesystems<br><br>Secondextendedfssupport:Y<br><br>VFATfssupport:m</font></span><span>笔者有时会用到该机上的</span><span><font face="Times New Roman">VFAT</font></span><span>分区</span><span><font face="Times New Roman"><br><br>/procfilesystemsupportY<br><br>ISO9660cdromfilesystemsupport:m<br><br>NetworkFileSystems<br><br>NFSfilesystemsuppor</font></span><span><font face="Times New Roman">t:Y<br><br></font></span><span><font face="Times New Roman">SMBfilesystemsupport:m<br><br>Consoledrivers<br><br>VGAtextconsole:Y<br><br>Videomodeselectionsupport:Y<br><br>VESAVGAgraphicsconsole:Y<br><br>Kernelhacking<br><br>MagicSysRqkey:Y<br><br></font></span><span>还有一些缺省的设置笔者没有改。这样编译出来的版本有</span><span><font face="Times New Roman">700K.</font></span><span>经过笔者调试过没有出现什么问题。</span><span><br><br><font face="Times New Roman">2.PDA</font></span><span>的内核设置</span><span><br><br></span><font face="Times New Roman"><span>PDA(Per</span><span>sonal</span><span>DigitalAssist)</span></font><span>如：手机，快译通，文曲星等等。这类系统要求系统稳定，内核小而且效率高，常常需要一些特殊的硬件支持。对进程调度、文件系统要求单一，有些就是单进程系统。对网络的支持由根据需要确定。</span><span><font face="Times New Roman">RedHat</font></span><span>的内核无法直接用来设计一些特殊要求的</span><span><font face="Times New Roman">PDA,</font></span><span>一般还要加入对硬件的特定模块。</span><span><br><br></span><span><font face="Times New Roman"></font></span><span>可作如下设置：</span><span><br><br></span><span><font face="Times New Roman">Networkingsupport:Y:</font></span><span>一般</span><span><font face="Times New Roman">PDA</font></span><span>都支持上网更新功能</span><span><br><br></span><font face="Times New Roman"><span>KernelsupportforELFbinaries:Y<br><br>Compileas</span><span>ELF</span><span>&#8211;ifyourGCCisELF-GCC:Y</span></font><span>这两个设置使系统的执行文件都为</span><span><font face="Times New Roman">ELF<br><br></font></span><span><font face="Times New Roman">AdvancedPowerManagerBiossupport:Y<br><br>Blockdevices:</font></span><span>应该加入对硬件特殊的支持模块</span><span><br><br></span><span><font face="Times New Roman">Networkingoptions<br><br>Packetsocket<br><br>FileSystem<br><br>Secondextendedfssupport:Y<br><br></font></span><span>另外的一些功能为</span><span><font face="Times New Roman">N,</font></span><span>当然一些功能必须选择用来支持上述的模块。编译后为</span><span><font face="Times New Roman">100KB---400KB<br><br>3.</font></span><span>小型嵌入式系统的内核配置</span><span><br><br></span><span><font face="Times New Roman"></font></span><span>一个小型的嵌入式</span><span><font face="Times New Roman">Linux</font></span><span>系统只需要下面三个基本元素：</span><span><br><br></span><span><font face="Times New Roman"><br></font></span><span>引导工具</span><span><font face="Times New Roman"><br>Linux</font></span><span>微内核，由内存管理、进程管理和事务处理构成</span><span><font face="Times New Roman"><br></font></span><span>初始化进程</span><font face="Times New Roman"><span> <br></span><span></span></font><span>如果要让它能干点什么且继续保持小型化，还得加上：</span><span><br><br></span><span><font face="Times New Roman"><br></font></span><span>硬件驱动程序</span><span><font face="Times New Roman"><br></font></span><span>提供所需功能的一个或更多应用程序。</span><font face="Times New Roman"><span> <br></span><span></span></font><span>再增加功能，或许需要这些：</span><span><font face="Times New Roman"></font></span><span>一个文件系统（也许在</span><span><font face="Times New Roman">ROM</font></span><span>或</span><span><font face="Times New Roman">RAM</font></span><span>）中</span><span><font face="Times New Roman">TCP/IP</font></span><span>网络堆栈对该种系统</span><span><font face="Times New Roman">,</font></span><span>做了不同的设置</span><font face="Times New Roman"><span>:<br><br></span><span></span></font><span>不要</span><span><font face="Times New Roman">floppy</font></span><span>；不要</span><span><font face="Times New Roman">SMP</font></span><span>、</span><span><font face="Times New Roman">MTRR</font></span><span>；不要</span><font face="Times New Roman"><span>Network</span><span>ing</span></font><span>、</span><span><font face="Times New Roman">SCSI</font></span><span>；把所有的</span><span><font face="Times New Roman">blockdevice</font></span><span>移除，只留下</span><span><font face="Times New Roman">IDEdevice</font></span><span>；把所有的</span><span><font face="Times New Roman">characterdevice</font></span><span>移除；把所有的</span><span><font face="Times New Roman">filesystem</font></span><span>移除，只留下</span><span><font face="Times New Roman">minix</font></span><span>；不要</span><span><font face="Times New Roman">sound</font></span><span>支援。这样己经把所有的选项都移除了。这样做之后，得到了一个</span><span><font face="Times New Roman">188K</font></span><span>的核心</span><font face="Times New Roman"><span>.<br><br></span><span></span></font><span>把下列两个档案中的</span><span><font face="Times New Roman">-O3,-O2</font></span><span>用</span><span><font face="Times New Roman">-Os</font></span><span>取代。</span><span><br><br></span><span><font face="Times New Roman">./Makefile<br>./arch/i386/kernel/<br>Makefile<br><br></font></span><span>这样一来，整个核心变小了</span><span><font face="Times New Roman">9K</font></span><span>，成为</span><span><font face="Times New Roman">179K</font></span><span>。</span><span><br><br></span><span><font face="Times New Roman"></font></span><span>不过这个核心恐怕很难发挥</span><span><font face="Times New Roman">Linux</font></span><span>的功能，因此把网络加回去。把</span><font face="Times New Roman"><span>General</span><span>setup</span></font><span>中的</span><span><font face="Times New Roman">networksupport</font></span><span>加回去，重新编译，核心变成</span><span><font face="Times New Roman">189K</font></span><span>。</span><span><font face="Times New Roman">10K</font></span><span>就加上个</span><span><font face="Times New Roman">TCP/IPstack</font></span><span>。</span><span><font face="Times New Roman"></font></span><span>有</span><span><font face="Times New Roman">stack</font></span><span>没有</span><span><font face="Times New Roman">driver</font></span><span>也是枉然，把</span><span><font face="Times New Roman">embeddedboard</font></span><span>常用的</span><span><font face="Times New Roman">RTL8139</font></span><span>的</span><span><font face="Times New Roman">driver</font></span><span>加回去，</span><font face="Times New Roman"><span>195K.<br><br></span><span></span></font><span>如果你需要</span><span><font face="Times New Roman">DOS</font></span><span>档案系统，那大小成为</span><span><font face="Times New Roman">213K</font></span><span>。如果</span><span><font face="Times New Roman">minix</font></span><span>用</span><span><font face="Times New Roman">ext2</font></span><span>换代，则大小成长至</span><span><font face="Times New Roman">222K</font></span><span>。</span><span><br><br></span><span><font face="Times New Roman">Linux</font></span><span>所需的内存大约在</span><span><font face="Times New Roman">600K</font></span><span>～</span><span><font face="Times New Roman">800K</font></span><span>之间。</span><span><font face="Times New Roman">1MB</font></span><span>内存就可能可以开机了，但不太有用，因为连载入</span><span><font face="Times New Roman">C</font></span><span>程序库都有困难。</span><span><font face="Times New Roman">2MB</font></span><span>内存应该就可以做点事了，但要到</span><span><font face="Times New Roman">4MB</font></span><span>以上才可以执行一个比较完整的系统。</span><span><br><br></span><span><font face="Times New Roman"></font></span><span>因为</span><span><font face="Times New Roman">Linux</font></span><span>的</span><font face="Times New Roman"><span>filesystem</span><span></span></font><span>相当大，大约在</span><span><font face="Times New Roman">230K</font></span><span>左右，占了</span><span><font face="Times New Roman">1/3</font></span><span>的体积。内存管理占了</span><span><font face="Times New Roman">80K</font></span><span>，和核心其它部分的总和差不多。</span><font face="Times New Roman"><span>TCP/IP</span><span>stack</span></font><span>占了</span><span><font face="Times New Roman">65K</font></span><span>，驱动程序占了</span><span><font face="Times New Roman">120K</font></span><span>。</span><font face="Times New Roman"><span>SysV</span><span>IPC</span></font><span>占了</span><span><font face="Times New Roman">21K</font></span><span>，必要的话可以拿掉，核心档应该可以再小个</span><span><font face="Times New Roman">10K</font></span><span>左右。</span><span><br><br></span><span><font face="Times New Roman"></font></span><span>如果要裁剪核心大小，应该动那里呢</span><font face="Times New Roman"><span>?</span><span></span></font><span>答案很明显，当然是文件系统。</span><font face="Times New Roman"><span>Linux</span><span></span></font><span>的</span><span><font face="Times New Roman">VFS</font></span><span>简化了档案系统的设计，</span><font face="Times New Roman"><span>buffer</span><span>cache,directorycache</span></font><span>增加了系统的效率。但这些</span><span><font face="Times New Roman">embedded</font></span><span>系统根本就用处不大。如果可以把它们拿掉，核心可以马上缩小</span><span><font face="Times New Roman">20K</font></span><span>左右。如果跳过整个</span><span><font face="Times New Roman">VFS</font></span><span>，直接将文件系统写成一个</span><span><font face="Times New Roman">driver</font></span><span>的型式，应该可以将</span><span><font face="Times New Roman">230K</font></span><span>缩减至</span><span><font face="Times New Roman">50K</font></span><span>左右。整个核心缩到</span><span><font face="Times New Roman">100K</font></span><span>左右。</span><span><br><br><font face="Times New Roman">4.</font></span><span>工控机的内核配置</span><span><br><br></span><span><font face="Times New Roman"></font></span><span>对于工控机内核</span><span><font face="Times New Roman">,</font></span><span>对于内核的大小要求并不严格</span><span><font face="Times New Roman">,</font></span><span>关键的是正确性</span><span><font face="Times New Roman">,</font></span><span>健壮性和实时性</span><span><font face="Times New Roman">(</font></span><span>某些机子要求实时性较高</span><span><font face="Times New Roman">).</font></span><span>对文件系统要求单一</span><span><font face="Times New Roman">,</font></span><span>但保证正确性</span><span><font face="Times New Roman">.</font></span><span>网络按需设置。</span><span><br><br></span><span><font face="Times New Roman"></font></span><span>可作如下配置</span><span><font face="Times New Roman">:<br><br></font></span><span><font face="Times New Roman">Symmetricmulti-processingsupport:Y<br><br>Loadablemodulesupport:N</font></span><span>工控机一般将可能用到的模块都全部装入内存</span><span><font face="Times New Roman">.<br><br></font></span><span><font face="Times New Roman">Networkingsupport:Y<br><br>SystemVIPC:Y<br><br>KernelsupplyforELFbinaries:Y<br><br>Blockdevices:</font></span><span>根据具体硬件配置</span><span><br><br></span><span><font face="Times New Roman">Networkingoptions<br><br>packetsock</font></span><font face="Times New Roman"><span>et:Y<br><br></span><span></span></font><span>根据具体需要</span><span><font face="Times New Roman">,</font></span><span>一般工控机是通过</span><span><font face="Times New Roman">LAN</font></span><span>连接</span><span><font face="Times New Roman">,</font></span><span>与外界隔离故要</span><span><font face="Times New Roman">IPX</font></span><span>协议</span><span><font face="Times New Roman">,</font></span><span>另外</span><span><font face="Times New Roman">Tcp/ip</font></span><span>一般也需要</span><span><font face="Times New Roman">.<br><br></font></span><span><font face="Times New Roman">QoSand/orfairqueueing:Y<br><br>QoS(QualityOfService)andfairqueueling</font></span><span>是一种排定某种封包先送的网络线程表</span><span><font face="Times New Roman">,</font></span><span>可同时针对多个网络封包处理并依优先处理顺序来排序</span><span><font face="Times New Roman">,</font></span><span>称之为</span><font face="Times New Roman"><span>packet</span><span>schedulers.</span></font><span>此功能特别是针对实时系统时格外重要</span><span><font face="Times New Roman">,</font></span><span>当多个封包同时送到网络设备时</span><span><font face="Times New Roman">,Kernel</font></span><span>可以适当的决定出哪一个封包必须优先处理</span><span><font face="Times New Roman">.</font></span><span>因此</span><span><font face="Times New Roman">Kernel</font></span><span>提供数种</span><span><font face="Times New Roman">packet</font></span><span><font face="Times New Roman">schedulingalgorithm.<br><br>Filesystems<br><br>SecondExtendedfssupport:Y<br><br></font></span><span>其余配置和小型嵌入式系统差别不大</span><span><font face="Times New Roman">.</font></span><span>同一台机器上编译出来的内核大小为</span><span><font face="Times New Roman">800</font></span><span>多</span><span><font face="Times New Roman">KB</font></span><span>。</span><span><br><br><font face="Times New Roman">5.</font></span><span>服务器的内核配置</span><span><font face="Times New Roman">:<br><br></font></span><span><font face="Times New Roman"> <br></font></span><span>服务器的内核对网络设置和进程调度都非常关键</span><span><font face="Times New Roman">.</font></span><span>做如下配置</span><span><font face="Times New Roman">:<br><br></font></span><span><font face="Times New Roman">Symmetricmulti-processingsupport:Y<br><br>Loadablemodulesupport:Y</font></span><span><br><br></span><span><font face="Times New Roman">Networkingsupport:Y<br><br>Networkingoption<br><br>Packetsocket:Y</font></span><span>。</span><span><br><br></span><span><font face="Times New Roman">TCP/IPnetworkeing:Y<br><br>Networkfirewalls:</font></span><span>是否采用网络防火墙。如果计算机想当</span><font face="Times New Roman"><span>firewalls</span><span>server</span></font><span>或者是处于</span><font face="Times New Roman"><span>TCP/IP</span><span></span></font><span>通信协议的网络的网路结构下，这一项要选</span><font face="Times New Roman"><span>[Y]<br><br></span><span>Networkaliasing[Y/m/n/?]:</span></font><span>一台网络上的计算机可以拥有多组</span><span><font face="Times New Roman">IP</font></span><span>地址。如果计算机想拥有多个</span><span><font face="Times New Roman">IP</font></span><span>地址，就选择</span><font face="Times New Roman"><span>[Y].<br><br></span><span>IP:forwarding/gatewaying[Y/m/n/?]:</span></font><span>假如用户想当路由器的话，选择</span><span><font face="Times New Roman">[Y],</font></span><span>但先决条件是有</span><span><font face="Times New Roman">&#8220;</font></span><span>两张</span><span><font face="Times New Roman">&#8221;</font></span><span>网卡，一张对外部网络、一张对内部网络，并且使用的</span><span><font face="Times New Roman">ISP</font></span><span>那一端也必须设定</span><span><font face="Times New Roman">routing</font></span><span>，允许用户这台路由器才行。</span><span><br><br></span><span><font face="Times New Roman">IP:multicasting:</font></span><span>可以一次就完成传送一个</span><span><font face="Times New Roman">packet</font></span><span>到好几台计算机的操作。</span><span><br><br></span><span><font face="Times New Roman">IP:syn_cookies:</font></span><span>一种保护措施，将各种</span><span><font face="Times New Roman">TCP/IP</font></span><span>的通信协议加密，防止</span><span><font face="Times New Roman">Attacker</font></span><span>攻击用户的计算机，并且可以纪录企图攻击用户的计算机的</span><span><font face="Times New Roman">IP</font></span><span>地址。</span><span><br><br></span><span><font face="Times New Roman">IP:firewalling:</font></span><span>该台计算机是否是防火墙服务器。</span><span><br><br></span><span><font face="Times New Roman">IP:firewallpacketlogging:</font></span><span>是否由</span><span><font face="Times New Roman">klogd</font></span><span>记录防火墙服务器到底接收了哪些</span><span><font face="Times New Roman">Packet</font></span><span>。</span><span><br><br></span><span><font face="Times New Roman">IP:masquerading:</font></span><span>可以将内部网络的计算机送出去的封包，通过防火墙服务器直接传递给远端的计算机，而远端的计算机看到的就是接收到的防火墙服务器送过来的封包，而不是从内部的计算机送过来的。这样如果内部只有一台计算机可以上网，其余的机器可以通过这台机子的防火墙服务器向外连线。选择这个选项必需先确定先前的</span><font face="Times New Roman"><span>Network</span><span>FirewallsIP:forwarding/gatewayingIP</span></font><span>：</span><font face="Times New Roman"><span>firewalling</span><span></span></font><span>这三个选项选</span><span><font face="Times New Roman">[Y]</font></span><span>。以及下一个选项</span><span><font face="Times New Roman">IP</font></span><span>：</span><font face="Times New Roman"><span>always</span><span>deframent</span></font><span>也要选</span><font face="Times New Roman"><span>[Y].<br><br></span><span>IP:ICMPmasquerading:</span></font><span>一般</span><font face="Times New Roman"><span>masquerading</span><span></span></font><span>只提供处理</span><font face="Times New Roman"><span>TCP,UDP</span><span>packets,</span></font><span>若要让</span><font face="Times New Roman"><span>masqurerading</span><span></span></font><span>也能处理</span><font face="Times New Roman"><span>ICMP</span><span>packets,</span></font><span>这个选项要选</span><font face="Times New Roman"><span>[Y].<br><br></span><span>IP:alwaysdefragment:</span></font><span>可将接收到的</span><font face="Times New Roman"><span>packet</span><span>fragm</span><span>ents</span></font><span>重新组合回原来那个封包。</span><span><br><br></span><span><font face="Times New Roman">IP:accounting:</font></span><span>统计</span><font face="Times New Roman"><span>IP</span><span>packet</span></font><span>的流量，也就是网络的流通情况。</span><span><br><br></span><span><font face="Times New Roman">IP:optimizeasrouternothost:</font></span><span>可以关闭</span><span><font face="Times New Roman">copy&amp;checksum</font></span><span>技术，防止流量大的服务器的</span><font face="Times New Roman"><span>IP</span><span>packets</span></font><span>丢失。</span><span><br><br></span><span><font face="Times New Roman">IP:tunneling:</font></span><span>可在不同网域中使用</span><span><font face="Times New Roman">linux,</font></span><span>且都不用改</span><span><font face="Times New Roman">IP</font></span><span>就可以直接上网了。适合于笔记本型计算机用户。</span><span><br><br></span><span><font face="Times New Roman">IP:ReverseARP:</font></span><span>主要是提供</span><span><font face="Times New Roman">bootp</font></span><span>的功能，让计算机从可以从网卡的</span><font face="Times New Roman"><span>Boot</span><span>Ram</span></font><span>启动。</span><span><br><br></span><span><font face="Times New Roman">IP:DisablePathMTUDiscovery:</font></span><span>是否取消</span><font face="Times New Roman"><span>Path</span><span>MTUDiscovery.MTU</span></font><span>有助于处理拥挤的网络。</span><span><br><br></span><span><font face="Times New Roman">TheIPXprotocol:IPX</font></span><span>为</span><font face="Times New Roman"><span>Netware</span><span></span></font><span>网络使用的通讯协议。</span><span><br><br></span><span><font face="Times New Roman"></font></span><span>其余根据需要设置。编译出的内核为</span><span><font face="Times New Roman">800K</font></span><span>。</span></p>
</h5>
<img src ="http://www.cppblog.com/ngaut/aggbug/26713.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2007-06-20 20:32 <a href="http://www.cppblog.com/ngaut/archive/2007/06/20/26713.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《自己动手写嵌入式操作系统》源代码</title><link>http://www.cppblog.com/ngaut/archive/2007/06/19/26628.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Tue, 19 Jun 2007 07:32:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2007/06/19/26628.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/26628.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2007/06/19/26628.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/26628.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/26628.html</trackback:ping><description><![CDATA[经常有朋友发邮件问我要源代码，一个个的发太麻烦，干脆放上来吧
http://www.cppblog.com/Files/ngaut/HELLOCN_SRCCODE.zip<img src ="http://www.cppblog.com/ngaut/aggbug/26628.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2007-06-19 15:32 <a href="http://www.cppblog.com/ngaut/archive/2007/06/19/26628.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决error C2011: 'fd_set' : 'struct' type redefinition问题</title><link>http://www.cppblog.com/ngaut/archive/2007/04/23/22658.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Mon, 23 Apr 2007 09:15:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2007/04/23/22658.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/22658.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2007/04/23/22658.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/22658.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/22658.html</trackback:ping><description><![CDATA[<p>在所有的#include &lt;windows.h&gt;前使用#define WIN32_LEAN_AND_MEAN，如：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;WIN32_LEAN_AND_MEAN</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">windows.h</span><span style="COLOR: #000000">&gt;</span></div>
<img src ="http://www.cppblog.com/ngaut/aggbug/22658.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2007-04-23 17:15 <a href="http://www.cppblog.com/ngaut/archive/2007/04/23/22658.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>与妻书---林觉民</title><link>http://www.cppblog.com/ngaut/archive/2007/02/24/18944.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Sat, 24 Feb 2007 07:01:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2007/02/24/18944.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/18944.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2007/02/24/18944.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/18944.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/18944.html</trackback:ping><description><![CDATA[                                                                              与妻书  <br />  <br />                                                                                                林觉民  <br />  <br /> 意映卿卿如晤：吾今以此书与汝永别矣！吾作此书时，尚为世中一人；汝看此  <br />书时，吾已成为阴间一鬼。吾作此书，泪珠和笔墨齐下，不能书竟，而欲搁笔。又  <br />恐汝不察吾衷，谓吾忍舍汝而死，谓吾不知汝之不欲吾死也，故遂忍悲为汝言之。  <br />  <br /> 吾至爱汝！即此爱汝一念，使吾勇于就死也！吾自遇汝以来，常愿天下有情人  <br />都成眷属，然遍地腥云，满街狼犬，称心快意，几家能够？司马青衫，吾不能学太  <br />上之忘情也。语云，仁者“老吾老以及人之老，幼吾幼以及人之幼”。吾充吾爱汝  <br />之心，助天下人爱其所爱，所以敢先汝而死，不顾汝也。汝体吾此心，于悲啼之余，  <br />亦以天下人为念，当亦乐牺牲吾身与汝身之福利，为天下人谋永福也。汝其勿悲。  <br /> 汝忆否四五年前某夕，吾尝语曰：“与使吾先死也，无宁汝先吾而死。”汝初  <br />闻言而怒，后经吾婉解，虽不谓吾言为是，而亦无辞相答。吾之意盖谓以汝之弱，  <br />必不能禁失吾之悲，吾先死留苦与汝，吾心不忍，故宁请汝先死，吾担悲也。嗟夫，  <br />谁知吾卒先汝而死乎！  <br />  <br /> 吾真不能忘汝也！回忆后街之屋，入门穿廊，过前后厅，又三四折有小厅，厅  <br />旁一室为吾与汝双栖之所。初婚三四个月，适冬之望日前后，窗外疏梅筛月影，依  <br />稀掩映，吾与汝并肩携手，低低切切，何事不语，何情不诉！及今思之，空余泪痕！  <br />又回忆六七年前，吾之逃家复归也，汝泣告我：“望今后有远行，必以告妾，妾愿  <br />随君行。”吾亦既许汝矣。前十余日回家，即欲乘便以此行之事语汝，及与汝相对，  <br />又不能启口；且以汝之有身也，更恐不胜悲，故惟日日呼酒买醉。嗟夫！当时余心  <br />之悲，盖不能以寸管形容之。  <br />  <br /> 吾诚愿与汝相守以死。第以今日事势观之，天灾可以死，盗贼可以死，瓜分之  <br />日可以死，奸官污吏虐民可以死，吾辈处今日之中国，国中无地无时不可以死！到  <br />那时使吾眼睁睁看汝死，或使汝眼睁睁看我死，吾能之乎！抑汝能之乎！即可不死，  <br />而离散不相见，徒使两地眼成穿而骨化石，试问古来几曾见破镜能重圆，则较死为  <br />苦也。将奈之何？今日吾与汝幸双健；天下人人不当死而死，与不愿离而离者，不  <br />可数计；钟情如我辈者，能忍之乎？此吾所以敢率性就死不顾汝也！吾今死无余憾，  <br />国事成不成，自有同志者在。依新已五岁，转眼成人，汝其善抚之，使之肖我。汝  <br />腹中之物，吾疑其女也，女必像汝，吾心甚慰；或又是男，则亦教其以父志为志，  <br />则我死后，尚有二意洞在也，甚幸甚幸！  <br />  <br /> 吾家后日当甚贫，贫无所苦，清静过日而已。  <br />  <br /> 吾今与汝无言矣！吾居九泉之下，遥闻汝哭声，当哭相和也。吾平日不信有鬼，  <br />今则又望其真有。今人又言心电感应有道，吾亦望其言是实，则吾之死，吾灵尚依  <br />依旁汝也，汝不必以无侣悲！  <br />  <br /> 吾生平未尝以吾所志语汝，是吾不是处。然语之，又恐汝日日为吾担忧。吾牺  <br />牲百死而不辞，而使汝担忧，的的非吾所忍。吾爱汝至，所以为汝谋者惟恐未尽。  <br />汝幸而偶我，又何不幸而生今日之中国！吾幸而得汝，又何不幸而生今日之中国，  <br />卒不忍独善其身！嗟夫！巾短情长，所未尽者尚有万千，汝可摹拟得之。吾今不能  <br />见汝矣！汝不能舍吾，其时时于梦中寻我乎！一恸！  <br />  <br /> 辛亥三月念六夜四鼓，意洞手书。  <br />  <br /> 家中诸母皆通文，有不解处，望请其指教。当尽吾意为幸  <br /><img src ="http://www.cppblog.com/ngaut/aggbug/18944.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2007-02-24 15:01 <a href="http://www.cppblog.com/ngaut/archive/2007/02/24/18944.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决unresolved external symbol "public: int __thiscall CWnd::KillTimer(unsigned int)" (?KillTimer@CWnd@@QAEHI@Z)问题</title><link>http://www.cppblog.com/ngaut/archive/2007/02/23/18933.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Fri, 23 Feb 2007 15:48:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2007/02/23/18933.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/18933.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2007/02/23/18933.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/18933.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/18933.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 解决KillTimer link失败的问题&nbsp;&nbsp;<a href='http://www.cppblog.com/ngaut/archive/2007/02/23/18933.html'>阅读全文</a><img src ="http://www.cppblog.com/ngaut/aggbug/18933.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2007-02-23 23:48 <a href="http://www.cppblog.com/ngaut/archive/2007/02/23/18933.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>老老实实从头做起</title><link>http://www.cppblog.com/ngaut/archive/2006/12/24/16798.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Sun, 24 Dec 2006 10:40:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2006/12/24/16798.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/16798.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2006/12/24/16798.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/16798.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/16798.html</trackback:ping><description><![CDATA[记于圣诞前夕2006.12.24晚<img src ="http://www.cppblog.com/ngaut/aggbug/16798.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2006-12-24 18:40 <a href="http://www.cppblog.com/ngaut/archive/2006/12/24/16798.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>偶尔的思绪和收获</title><link>http://www.cppblog.com/ngaut/archive/2006/12/18/16577.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Mon, 18 Dec 2006 05:22:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2006/12/18/16577.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/16577.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2006/12/18/16577.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/16577.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/16577.html</trackback:ping><description><![CDATA[
		<p>成功法则：<br />付出终有收获，一点小的付出会带来更多的收获.</p>
		<p> </p>
		<p>我们的学生到底为什么不行，缺乏好的老师，还是努力不够。<br />应该缺乏的是信心和思考，而不是被动的接受。<br /><br /><br />陈安之：<br />当你成为行业第一的时候，金钱和荣誉挡都挡不住。<br /><br /><br /><br /><a href="http://112339223.qzone.qq.com/">思想有多远，我们就能走多远，其实是要个前提的：尽力不停的走</a></p>
<img src ="http://www.cppblog.com/ngaut/aggbug/16577.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2006-12-18 13:22 <a href="http://www.cppblog.com/ngaut/archive/2006/12/18/16577.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一点感悟：在一个项目尚未完成时不宜调走项目组成员</title><link>http://www.cppblog.com/ngaut/archive/2006/11/16/15204.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Thu, 16 Nov 2006 02:28:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2006/11/16/15204.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/15204.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2006/11/16/15204.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/15204.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/15204.html</trackback:ping><description><![CDATA[当其它成员接受被调走组员的工作的时候，往往有大量的疑问需要请教已经调走的组员，通常因为问得太多导致被调走的组员有较多意见，而接手的组员也因为疑问太多有较多已经，特别是当负责模块差别较大的时候。<img src ="http://www.cppblog.com/ngaut/aggbug/15204.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2006-11-16 10:28 <a href="http://www.cppblog.com/ngaut/archive/2006/11/16/15204.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>国庆总结</title><link>http://www.cppblog.com/ngaut/archive/2006/10/09/13488.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Mon, 09 Oct 2006 07:50:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2006/10/09/13488.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/13488.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2006/10/09/13488.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/13488.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/13488.html</trackback:ping><description><![CDATA[今天的生活是建立在先辈鲜血的基础上的   － 看电视剧《亮剑》有感<br /><br />人还是活得真实点好 － 看电视剧《沙场点兵》有感<br /><br />国庆期间去原来的高中看望几个老师，竟然一个都没有遇到，有的调到其它学校去了，<br />有的不在家，好生郁闷，无聊之下和几个同学去逛街，竟然意外的遇到了一个想拜访的老师。<br />看来人生有缘，不过由于事隔4年，老师已经不认识我们了^_^，看来缘这个东西可遇不可求。<br />但是如果长时间不保持联系，那么缘分可能就尽了，常看看亲人，朋友吧。我的朋友.<br /><img src ="http://www.cppblog.com/ngaut/aggbug/13488.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2006-10-09 15:50 <a href="http://www.cppblog.com/ngaut/archive/2006/10/09/13488.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]李开复：算法的力量</title><link>http://www.cppblog.com/ngaut/archive/2006/09/10/12226.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Sun, 10 Sep 2006 12:26:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2006/09/10/12226.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/12226.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2006/09/10/12226.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/12226.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/12226.html</trackback:ping><description><![CDATA[算法是计算机科学领域最重要的基石之一，但却受到了国内一些程序员的冷落。许多学生看到一些公司在招聘时要求的编程语言五花八门就产生了一种误解，认为学计算机就是学各种编程语言，或者认为，学习最新的语言、技术、标准就是最好的铺路方法。其实大家都被这些公司误导了。编程语言虽然该学，但是学习计算机算法和理论更重要，因为计算机算法和理论更重要，因为计算机语言和开发平台日新月异，但万变不离其宗的是那些算法和理论，例如数据结构、算法、编译原理、计算机体系结构、关系型数据库原理等等。在“开复学生网”上，有位同学生动地把这些基础课程比拟为“内功”，把新的语言、技术、标准比拟为“外功”。整天赶时髦的人最后只懂得招式，没有功力，是不可能成为高手的。 
<p></p><p><br /><b>算法与我</b></p><p>当我在1980年转入计算机科学系时，还没有多少人的专业方向是计算机科学。有许多其他系的人嘲笑我们说：“知道为什么只有你们系要加一个‘科学’，而没有‘物理科学系’或‘化学科学系’吗？因为人家是真的科学，不需要画蛇添足，而你们自己心虚，生怕不‘科学’，才这样欲盖弥彰。”其实，这点他们彻底弄错了。真正学懂计算机的人（不只是“编程匠”）都对数学有相当的造诣，既能用科学家的严谨思维来求证，也能用工程师的务实手段来解决问题——而这种思维和手段的最佳演绎就是“算法”。</p><p>记得我读博时写的Othello对弈软件获得了世界冠军。当时，得第二名的人认为我是靠侥幸才打赢他，不服气地问我的程序平均每秒能搜索多少步棋，当他发现我的软件在搜索效率上比他快60多倍时，才彻底服输。为什么在同样的机器上，我可以多做60倍的工作呢？这是因为我用了一个最新的算法，能够把一个指数函数转换成四个近似的表，只要用常数时间就可得到近似的答案。在这个例子中，是否用对算法才是能否赢得世界冠军的关键。</p><p>还记得1988年贝尔实验室副总裁亲自来访问我的学校，目的就是为了想了解为什么他们的语音识别系统比我开发的慢几十倍，而且，在扩大至大词汇系统后，速度差异更有几百倍之多。他们虽然买了几台超级计算机，勉强让系统跑了起来，但这么贵的计算资源让他们的产品部门很反感，因为“昂贵”的技术是没有应用前景的。在与他们探讨的过程中，我惊讶地发现一个O(n*m)的动态规划(dynamic programming)居然被他们做成了O(n*n*m)。更惊讶的是，他们还为此发表了不少文章，甚至为自己的算法起了一个很特别的名字，并将算法提名到一个科学会议里，希望能得到大奖。当时，贝尔实验室的研究员当然绝顶聪明，但他们全都是学数学、物理或电机出身，从未学过计算机科学或算法，才犯了这么基本的错误。我想那些人以后再也不会嘲笑学计算机科学的人了吧！</p><p><br /><b>网络时代的算法</b></p><p>有人也许会说：“今天计算机这么快，算法还重要吗？”其实永远不会有太快的计算机，因为我们总会想出新的应用。虽然在摩尔定律的作用下，计算机的计算能力每年都在飞快增长，价格也在不断下降。可我们不要忘记，需要处理的信息量更是呈指数级的增长。现在每人每天都会创造出大量数据（照片，视频，语音，文本等等）。日益先进的纪录和存储手段使我们每个人的信息量都在爆炸式的增长。互联网的信息流量和日志容量也在飞快增长。在科学研究方面，随着研究手段的进步，数据量更是达到了前所未有的程度。无论是三维图形、海量数据处理、机器学习、语音识别，都需要极大的计算量。在网络时代，越来越多的挑战需要靠卓越的算法来解决。</p><p>再举另一个网络时代的例子。在互联网和手机搜索，如果要找附近的咖啡店，那么搜索引擎该怎么处理这个请求呢？最简单的办法就是把整个城市的咖啡馆都找出来，然后计算出它们的所在位置与你之间的距离，再进行排序，然后返回最近的结果。但该如何计算距离呢？图论里有不少算法可以解决这个问题。</p><p>这么做也许是最直观的，但绝对不是最迅速的。如果一个城市只有为数不多的咖啡馆，那么这么做应该没什么问题，反正计算量不大。但如果一个城市里有很多咖啡馆，又有很多用户都需要类似的搜索，那么服务器所承受的压力就大多了。在这种情况下，我们该怎样优化算法呢？</p><p>首先，我们可以把整个城市的咖啡馆做一次“预处理”。比如，把一个城市分成若干个“格子(grid)”，然后根据用户所在的位置把他放到某一个格子里，只对格子里的咖啡馆进行距离排序。</p><p>问题又来了，如果格子大小一样，那么绝大多数结果都可能出现在市中心的一个格子里，而郊区的格子里只有极少的结果。在这种情况下，我们应该把市中心多分出几个格子。更进一步，格子应该是一个“树结构”，最顶层是一个大格——整个城市，然后逐层下降，格子越来越小，这样有利于用户进行精确搜索——如果在最底层的格子里搜索结果不多，用户可以逐级上升，放大搜索范围。</p><p>上述算法对咖啡馆的例子很实用，但是它具有通用性吗？答案是否定的。把咖啡馆抽象一下，它是一个“点”，如果要搜索一个“面”该怎么办呢？比如，用户想去一个水库玩，而一个水库有好几个入口，那么哪一个离用户最近呢？这个时候，上述“树结构”就要改成“r-tree”，因为树中间的每一个节点都是一个范围，一个有边界的范围（参考:<a class="contentlink" href="http://www.cs.umd.edu/~hjs/rtrees/index.html" target="_blank"><font color="#4455aa">http://www.cs.umd.edu/~hjs/rtrees/index.html</font></a>）。</p><p>通过这个小例子，我们看到，应用程序的要求千变万化，很多时候需要把一个复杂的问题分解成若干简单的小问题，然后再选用合适的算法和数据结构。</p><p><br /><b>并行算法：Google的核心优势</b></p><p>上面的例子在Google里就要算是小case了！每天Google的网站要处理十亿个以上的搜索，GMail要储存几千万用户的2G邮箱，Google Earth要让数十万用户同时在整个地球上遨游，并将合适的图片经过互联网提交给每个用户。如果没有好的算法，这些应用都无法成为现实。</p><p>在这些的应用中，哪怕是最基本的问题都会给传统的计算带来很大的挑战。例如，每天都有十亿以上的用户访问Google的网站，使用Google的服务，也产生很多很多的日志(Log)。因为Log每份每秒都在飞速增加，我们必须有聪明的办法来进行处理。我曾经在面试中问过关于如何对Log进行一些分析处理的问题，有很多面试者的回答虽然在逻辑上正确，但是实际应用中是几乎不可行的。按照它们的算法，即便用上几万台机器，我们的处理速度都根不上数据产生的速度。</p><p>那么Google是如何解决这些问题的？</p><p>首先，在网络时代，就算有最好的算法，也要能在并行计算的环境下执行。在Google的数据中心，我们使用的是超大的并行计算机。但传统的并行算法运行时，效率会在增加机器数量后迅速降低，也就是说，十台机器如果有五倍的效果，增加到一千台时也许就只有几十倍的效果。这种事半功倍的代价是没有哪家公司可以负担得起的。而且，在许多并行算法中，只要一个结点犯错误，所有计算都会前功尽弃。</p><p>那么Google是如何开发出既有效率又能容错的并行计算的呢？</p><p>Google最资深的计算机科学家Jeff Dean认识到，Google所需的绝大部分数据处理都可以归结为一个简单的并行算法：Map and Reduce（<a class="contentlink" href="http://labs.google.com/papers/mapreduce.html" target="_blank"><font color="#4455aa">http://labs.google.com/papers/mapreduce.html</font></a>）。这个算法能够在很多种计算中达到相当高的效率，而且是可扩展的（也就是说，一千台机器就算不能达到一千倍的效果，至少也可以达到几百倍的效果）。Map and Reduce的另外一大特色是它可以利用大批廉价的机器组成功能强大的server farm。最后，它的容错性能异常出色，就算一个server farm宕掉一半，整个fram依然能够运行。正是因为这个天才的认识，才有了Map and Reduce算法。借助该算法，Google几乎能无限地增加计算量，与日新月异的互联网应用一同成长。</p><p><br /><b>算法并不局限于计算机和网络</b></p><p>举一个计算机领域外的例子：在高能物理研究方面，很多实验每秒钟都能几个TB的数据量。但因为处理能力和存储能力的不足，科学家不得不把绝大部分未经处理的数据丢弃掉。可大家要知道，新元素的信息很有可能就藏在我们来不及处理的数据里面。同样的，在其他任何领域里，算法可以改变人类的生活。例如人类基因的研究，就可能因为算法而发明新的医疗方式。在国家安全领域，有效的算法可能避免下一个911的发生。在气象方面，算法可以更好地预测未来天灾的发生，以拯救生命。</p><p>所以，如果你把计算机的发展放到应用和数据飞速增长的大环境下，你一定会发现；算法的重要性不是在日益减小，而是在日益加强。</p><img src ="http://www.cppblog.com/ngaut/aggbug/12226.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2006-09-10 20:26 <a href="http://www.cppblog.com/ngaut/archive/2006/09/10/12226.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工作一月小结</title><link>http://www.cppblog.com/ngaut/archive/2006/09/06/12102.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Wed, 06 Sep 2006 12:28:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2006/09/06/12102.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/12102.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2006/09/06/12102.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/12102.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/12102.html</trackback:ping><description><![CDATA[
		<br />随便写几句吧：<br />不知不觉工作一个多月了，总体而言还可以，但是比自己预期的要差一些，一直以来高估自己了，汗<br /><br />请假回了一趟学校，和同学奢侈几顿，某日吃饭居然吃到一条菜青虫，还是某知名的连锁店，晕。<br /><br />在学校的同学看起来状态不错，衷心预祝他们都能考上研究生，完成自己的现阶段的目标。<br /><br />同时感谢学校的几个老师，感谢程世旭老师的爱护，陈更力老师的指导。<br />从程世旭老师那里学会了认真，从陈更力老师那里学会了做学问的态度(虽然偶现在没有做学问)。<br />还有其它的老师，就不列出来了<br />一直以来偶认为自己是比较自信的，但是偶尔发现自己还是有那么一点自卑，偶老大很早就看出来了，强人啊。<br /><br /><br /><br />最近看一段话，说无论做什么，do it for fun, 但是没有对比可能不一定for fun<br /><br /><br />有点象颁奖典礼，偶废话还真多啊。<img src ="http://www.cppblog.com/ngaut/aggbug/12102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2006-09-06 20:28 <a href="http://www.cppblog.com/ngaut/archive/2006/09/06/12102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转贴]奋斗5年 从月薪3500到700万（ngaut：看后感动不已，遂贴于此，记之）</title><link>http://www.cppblog.com/ngaut/archive/2006/08/11/11133.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Fri, 11 Aug 2006 08:56:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2006/08/11/11133.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/11133.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2006/08/11/11133.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/11133.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/11133.html</trackback:ping><description><![CDATA[来上海整整五年了，事业上已有了突飞猛进的飞跃，生活方面有过一段段的辛酸。然而，如今回首看来，这五年来也这是这些苦恼最终成为我前进的机遇，让我拥有 了目前还算可以的生活境遇？700万身价，对有些兄弟来说可能是微不足道，但是我想大多数朋友还可能暂时没有达到这个状态——没有半点炫耀的意思，我知道 朋友们很多都会成功，会比我强得多——所以会对我的经历感兴趣，我决定定下心来，好好写点文字，希望不会让朋友们失望。<br />　　<br />　　　　今天 我的心里有一个想法更加清晰，那就是：爱，只有爱，才是一个男人成功的最好动力、最合适的动力。而绝不是自己的虚荣心，或者所谓的雄心壮志。作为一个男 人，首要的一件事是你要有你的真正所爱。它会像原子弹一样激发你的能力，让你爆发无穷的动力，上帝也会为你感动。这样的状态，就是每个人梦寐以求的状态。<br />　　<br />　　　　朋友们，也许你们不同意我的看法，我们先不忙争论，您先看看我的经历，看看是不是有道理。<br />　　<br />　　　　1 上海<br />　　<br />　　　　1999年中，我辞去了刚刚分配的国家机关的工作，从新疆来到了上海。当时我踌躇满志，认为凭借自己的力量和努力一定能够在这个大都市里站稳脚跟，创下一片属于自己的天空。<br />　　<br />　 　　　我是1976年出生在新疆，新疆的日照和高原气候，让我的身材像白杨一样挺拔，相貌虽不敢说英俊非凡，但也让绝大多数人不讨厌。我从小学习可以说是 优异的，大学考上了国家排名前5的重点大学，当时分配是98年，父亲害怕工作难找，一定要我回去做个清闲稳定的机关公务员。我觉得自己也可以历练以下为人 处事，就回到了新疆自治区政府。工作了几个月后，和本部门的同事混得极熟，喝酒、吹牛、查颜观色的本领提高飞快，但是觉得工作实在是研磨青春，浪费生命， 就决定辞职，去上海打拼一下。呵呵，现在我的同学在新疆的也都混得很好。这是个性不同了。<br />　　<br />　　　　我的专业是经济管理类的，当时不懂 事，自视颇高，到了上海我就傻了：这种人企业根本不要，他们要的是有一定技能的人，能干事的人，像我这种实际工作没做过的人根本没人提供培训的机会。同学 和朋友一个个工作都找到了，就我搞不成低不就的，眼看带来的钱慢慢要见底了，这心里越来越急？难道这里还真没有我的用武之地了吗？<br />　　<br />　 　　　3个月后，我终于找到了一个让自己暂时满意的工作，但远远不是自己的专业了。我这个人兴趣比较广泛，精力也充沛，大学里涉猎很多领域，想法也多，文 字功底还可以。正好有一个广告公司招策划文案，我觉得自己能行，结果一试，公司面试者说我虽然没有做过，但是思路和功底还不错，再说毕业的学校名声不错， 就留下我了——现在我还是很感激那位前辈，后面的工作也证明了他的眼光。月薪3500，还好，生活问题暂时解决了。<br />　　<br />　　　　很快我的生活进入了工作状态，我觉得很快乐。2个月过后，一件让我猝不及防发生了，没想到由此开始，我的生活发生了这么大的变化。<br /><br />2 邂逅<br />　　<br />　　　　上班后我对工作极其热忱，也非常努力，一两个月后我已经做过了3个Case，客户和老板还有上司都比较满意。当时我 一则是刚从机关出来，一心想好好干个工作，二则是想报公司识人用人之恩，做事情时即不惜努力，又谦虚肯学，另外因为经过机关的历练，做人上路又大方，经常 请同事喝酒吃饭，他们也愿意帮我，所以很快上手成为部门的骨干。到现在我还在劝年轻的朋友们，工作是应该用全身心来投入的，这项投入从理财的角度说对任何 人来说都不会亏本。呵呵，不过，那段时间存款为0.<br />　　<br />　　　　有一天我去上班，那天早上下小雨，从住的地方要打车去公司那里，要车的人 多，根本打不到车。刚刚轮到我就要上车的时候，一个女孩子从路边冲过来，头发已经淋得不像话了，拉开后门就要上车。我回头刚想出口请她下车，看看她淋得那 样，再说让一个女孩子出去我还说真不出来，她也好像也实在没办法了，看着我脸红红的。我就对她笑了一下，退了出去。<br />　　<br />　　　　第二天早上，我们又在同一个地方见面了。那天是晴天，大家都在等公交车，她一见我就主动向我报以歉意的笑容，我指着快来的公交车笑着说：“你不会把这辆车也抢走吧？”，她呵呵笑了，说：“今天就让给你了！”。<br />　　<br />　　　　就这样，我们认识了。<br /><br />3 热恋<br />　　<br />　　　　她叫芸，来自湖南。她不仅有湘妹子的美丽温婉，也有湖南女子的泼辣和善解人意。她也是刚到上海，在一家贸易公司工作。<br />　　<br />　　　　我们迅速的认识，相知，然后热恋。也许热恋还在相知之前。我至今也有点不明白，为什么会忽然爱的一塌糊涂。也许是刚到一个陌生的地方，刚刚脱离了生存的威胁，也许是我工作后一直嘻嘻哈哈惯了，忽然有个好女孩出现了，也有了真实的感情我就缴械了。<br />　　<br />　 　　　我们因为住的近，下班后每天都在一起，芸说我第一次拥抱她时，她就离不开我了，她说我的体味让她无比迷恋。热恋时我感觉我的精力无穷，每天陪我的芸 到夜里11点12点，灵感来了还去公司加班，那段时间工作效率也很高。朋友们都说我的眼睛熠熠闪光。我们一天不见就如隔三秋。看着她的眼睛我会忘了饥饿， 有很多次我心里碰碰跳着回到住所时，忽然发现自己已经饿得受不了了，呵呵。<br />　　<br />　　　　有一次我去崇明跟项目，因为晚了船班次停了回不 来，所以给她打电话说不回来了。我们一晚上竟然通了50多个电话，不是她打过来就是我打过去。第二天一早我一下船，居然在码头上发现了我的芸——要知道那 里打车也要1个小时的路，她流着眼泪说一夜没睡，一早就来等我了。我们相拥而泣，幸福异常。<br />　　<br />　　　　很快我们双方都认为对方是自己未来家庭里的另一半。到年底的时候，芸说让我去她家见见她家人。我很紧张，但是很高兴，开始准备见面礼。呵呵，那时我们都爱昏了头，根本没有存钱的想法。好在我的薪水涨到了5500，她也有2500，我们还够花。<br />　　<br />　　　　然而没多久，一个消息把我的心情打入了十八层地狱。<br /><br />4 彩礼<br />　　<br />　　　　到年底了，我的礼物也准备的差不多了，一共花了大概4000多。半年多来，我已经成为公司的干将，老板也比较看好 我。因为我一直是西北人的性格，豪爽但不失明智，工作从不计较加班，补助什么的。年底老板还多发了不少，买好礼物手边已经有1万了，感觉自己有钱了，所以 根本没想到钱的事。<br />　　<br />　　　　这时候她的一个表妹从她的老家来了，说是来看看。我想可能主要是她家里人让她来看看我这个未上门的女婿的。她早就给我说过，她家里她妈是老大，决定一切事宜。我们不敢怠慢，带她表妹在上海好好的玩来一遍。最后我感到她表妹对我还是比较满意，我的心也放下来了。<br />　　<br />　 　　　到了临走的前几天，芸忽然告诉我说，这次上门可能比较正式，语言有些闪烁其词。我有点不明白，心里想可能她妈已经初步考察通过了吧。一天，我们三个 人在的时候，她表妹开玩笑的样子对她说，姐，你这么好的条件，彩礼可不能少要啊！姨说了，前街的老李家的闺女都要了男方8万呢，我们决不能少于15万的。 说着还看看我。<br />　　<br />　　　　天啊，我像被电打一下，呆住了。说实话，我从小在新疆长大，风气很开明的，结婚男方有送钱的一般不过4~5万 了不起了，而且还是说明给孩子的。彩礼这个概念只有读小说时接触过，万万没有想到会有朝一日到自己头上。她家里人现在说出这个话，绝对是当真的，说话的方 式都掌握的这么有技巧。我该怎么办？让她嫁改变做法想法？省省吧！凭什么？家里的底子我清楚，决不能向家里伸手。那该怎么办？我还是笑着看看芸和她表妹， 芸有点紧张，我心里更不忍了。“呵呵！看来我要表现诚意了。”，我笑着不置可否的回答。<br />　　<br />　　　　我该怎么办？回去后我翻来覆去地想这个问题。<br /><br />5 诺言<br />　　<br />　　　　这是痛苦的3天，我几乎没怎么睡觉。芸也看出来了，她小心翼翼地不敢惹我。我心里很憋火：怎么弄得嫁女儿跟卖女儿一 样？有时候想干脆吹了算了，可是一想到我们要分开，心里就像刀割一样，眼泪就不由自主的下来。家里一直是清贫的家庭，弟弟还在上大学，不可能向家里伸手 的；自己的工资？天啊，我现在都觉得钱不够话，手边只有1万块钱，这次去还要准备出血，再说我就是攒钱，也要为我们结婚买房作准备啊，15万给了她家，我 们将来怎么办？……<br />　　<br />　　　　这么多年来，我对自己的了解是，我喜欢出奇招。想了3天，我有了一个办法，心就定了。芸有时看着我，不知所措？她知道我的脾气，家境和经济状况，可是，她也知道她无力改变她妈的想法，而且关键的是，她还有一点想法是彩礼是应该给的。我告诉她，别担心，我有办法了。<br />　　<br />　 　　　很快，到了她家了，见面，递上礼物，聊天……她母亲和蔼而精明，父亲稳重而慈爱。很快两天过去了，我们也该走了，这时该来的也该来了。最后的晚餐， 她的母亲说话了：“小D，你在我们这里已经2天了，我们对你还是比较满意的。你是个不错的孩子。如果没有意外，希望你们能今年（新的一年）把婚定了。你看 什么时候把礼节办了？你们商量一下，也和你家里商量一下，好吗？对了，我们这边的风俗你可能还不清楚，也不知阿芸小月给你讲了没有。”<br />　　<br />　　　　我马上接住了话题，笑着说：“谢谢阿姨，伯父，小月和我说了。”这时我看到阿芸紧张的脸都变了，看着我怕得要命。是啊，最后一段千万别搞砸了。我笑笑让她放心。<br />　　<br />　　　　“阿姨，伯父，你们的心情我我理解，养女儿不容易，再说只有一个女儿，我觉得15万如果比比投入，不算多，甚至还根本不够。这个钱我们家应该给。”<br />　　<br />　　　　“我想阿芸也把我家里的情况告诉二位老人了，我是这么想的，也不一定合适，您二位先听听。<br />　　<br />　　　　“15万应该给。但是我觉得既然我工作了，我自食其力了，而且是我娶阿芸，同时你们也觉得我合适，那么这个15万应该由我来给，而不是我家里来给。 <br />　　<br />　　　　“你们和阿芸看中的人，不应该仅仅需要家里有15万，还要有能力，有能力给阿芸将来的生活带来幸福。我想，我有这个能力。我自己不仅要有15万，而且应该向你们证明，我有能力给阿芸幸福。<br />　　<br />　　　　“我只有一个要求，就是给我不长的时间，两年吧。我们还小（阿芸比我小2岁），晚一点结婚也没关系。两年后，我会拿出15万，而且会证明给你们看，我和阿芸有能力生活的幸福。”<br />　　<br />　　　　其实，当天晚上我的语言远远比我的文字精彩，因为有爱在心里，我打动了她家所有人，阿芸的脸也红扑扑的。我们走的时候，他家里人很开心，当然也许只是表面上是，但是至少他妈默认了我的要求。当然从此后，我感觉有个巨大的大山压在了我的心里，我的生活改变了。<br /><br />6 开端<br />　　<br />　　　　回到上海以后，我的心情没有低落，反而有种大战来临时的平静和激动。我心里暗暗下定决心，为了我的爱人，我的未来幸福生活，我要付出比别人几倍的努力，实现我的诺言。我全身心地渴望这样做，而且相信自己一定能够成功。<br />　　<br />　 　　　芸反而很担心，她和我说要不我们搬到一起，生活上可以节省一些，她和我一起攒钱。我拒绝了她。虽然我们早就有了肌肤之亲，但是我不想让她家里人知 道，这样对她不好。而且我也不愿让她一起攒钱，毕竟我说了，这是我的事。我知道一个女孩，生活、衣服、化妆品等等，每个月的花费怎么说也要2000块左右 的。我说，芸这段时间我可能就不能给你买很多衣服和化妆品了，她郑重地点点头。我不知道，以后我是否会为这个决定而后悔。<br />　　<br />　　　　我 的初步想法是这样的：因为我只工作了7个月，而我的薪水已经涨到了5500.如果依照这个速度，半年后我的薪岁至少应该到8000，一年后最不济也应该到 10000左右。我可以什么都作，而且可以往管理方面发展，这样，我每月存下70％的工资，2年下来加上年终奖，也就差不多了。而且，那时候即便把15万 都“上供”了，我的年收入也能够让我们生活的小康。<br />　　<br />　　　　现在回想我那时候想法，心里只有两个字：幼稚。事态的发展果然证实了那句话：计划在现实面前永远是无用的。<br /><br />7 失败<br />　　<br />　　　　很快，现实给了我重重一击。一个偶然的机会，我和大老板聊起来，他告诉我策划和创意人才可以很快赢得中等偏上的薪 资，但是要达到5位数，只有2年的工作经历基本不可能。因为国内的商业条件还不成熟，客户的能力也有限。所有的公司愿意付出一些成本搞定客户，在策划和创 意上达到80％的满意就可以了。而且，公司愿意把高薪给业务人员和管理人员，一个只有2年工作经历的人基本不具备它所需要的人脉资源、操作能力和管理能 力。<br />　　<br />　　　　我明白了老板的意思。我开始在市场上寻找其他的公司。但是现实很快让我失望，要在一年内获得万元以上的月薪根本是不可能 的。好的公司有，但都说2到3年内有希望，如果做得好的话。老天，我的时间不够了！同时，公司知道了我在外面找工作的事情，老板们很不开心，因为平心而论 公司觉得已经待我不薄了。说实话，这条路成功的可能性很大，但是时间不够啊！<br />　　<br />　　　　怎么办？<br />　　<br />　　　　我决定辞职。 三十二岁开始做外贸…<br /><br />艰辛<br />　　<br />　　　　既然已经证明此路不通，再留下去就是浪费时间。我的时间不多了。而且我认为自己如果辞职，就有的是大块的时间，能够接触 更多更深的社会，机会也相应的多了。阿芸不同意，她说这样太不稳定了。我没法说服她，她也没办法说服我。这件事我还是做了，我知道，只能破釜沉舟了。<br />　　<br />　　　　临走时和老板深谈了一次，请他原谅。也把我的处境部分告诉了他。我们谈得很好。老板很惋惜，让我以后有可能还回来工作，我也很依依不舍，但是我已经没有退路了。<br />　　<br />　 　　　我开始了在上海滩到处漫游的经历，骑着一辆破自行车到处在上海转，到处找有限的熟人，问有没有项目做。我身边有1万2千多块钱，觉得还可以支撑半年 吧。我想，这半年里如果有策划项目做，我就辛苦点，把所有的事情都自己做了，应该可以挣个2到3万，多做几个项目就比打工好了。呵呵，如果朋友们谁有我那 时一样的想法，今天我一定劝你千万别！事后想，我太自信了太着急了，真是应该边工作边找机会，时机成熟再干的，否则下海99％是被淹死。我就这样风里来雨 里去，跑了2个月，一个单子也没有跑到，加上有一次丢了包，损失了1000多块钱和手机。住宿、吃饭、交通花了3500块钱，身边只剩7000多块钱了。 可是一点没有转机的迹象出现。<br /><br />9 机遇<br />　　<br />　　　　就在这时候，一个令人不敢相信的、非常好的机会出现了。我以前的一个客户找到我，说是他的一个朋友在上海嘉定那边的 一个镇里做镇长，他们镇上3个月后要办一个“水乡情思”的活动，主要是吸引港台和外籍人士的资金投资。他们要我构思起草一个大型活动的策划书，价格是4万 元。这个客户说以前在我们公司和我合作过，觉得我有这个能力，而且拿到公司去做策划，价格一般要到8万以上。我们合作空间更大，而且如果策划书做的好的 话，活动组织和制作我们还有机会。我很开心，明白他是想自己也赚一些，立刻给了他2000元的好处费。不知道这个习惯有没有影响我，直到现在我都认为机会 来了一定要投入，而不是大多数人认为的不见兔子不撒鹰。<br />　　<br />　　　　我废寝忘食地工作了20多天，每天夜里干到2点，稿子改了4次。然后 又自己贴了400多块钱制作了3本样本。交给那朋友的时候，他非常赞赏，连声说做的太好了，看来后面的制作也没问题了，一周之内我就等着拿钱吧。我也心里 感叹投入没有白投，连忙把这个好消息告诉了芸，她也非常开心。毕竟这是我的第一笔收入啊！而且金额还算不少。<br /><br />10 被骗<br />　　<br />　　　　我万万没有想到，这次看起来不错的机会竟然实际上是碰上了一个骗子。这个客户拿到了我的方案以后，竟然人间蒸发 了！我苦苦等了一周以后，这家伙死活不再和我联系了。我打电话，手机已经停机，跑到他原来公司去找他，公司的人说他早就不做了，现在在和一个人合作开公 司。我又跑到嘉定的那个镇上去找我们以前一起见过的他的镇长朋友，镇长说这个项目早就签约了，他和我那个客户也不是朋友，只是签约公司说策划书部分包给 他，他又找到了我，说我是他的助手。现在策划书已经通过，钱都已经付了。我马上又找到了那家公司，公司说我那个客户不是他们公司的人，只是他让公司把策划 书部分包给他，钱公司和他刚结清了。知道我的情况后，他们表示同情，但没办法：现在他们也找不到人，钱也结清了。<br />　　<br />　　　　这个打击对那时的我是致命的，让我的处境雪上加霜。我已经花了大量的精力不说，原来剩下的7000多块钱已经被我花去了大半，只剩3000多了。更可怕的是我的时间又用去了一个多月。<br />　　<br />　　　　这是后话：那个客户我这几年就再也没有见过。后来听说他过得很不好，很多人都在找他，他又让合作伙伴坑了一次，基本上就再也没有听说在这个行业里做过什么了。<br /><br />11 灰心<br />　　<br />　　　　万分沮丧的我把情况告诉了芸，告诉她的时候我分明听到了一个美丽的泡沫在她心里破碎的声音。她表面上没有说什么， 但我知道她失望极了。我们相拥无言，我只能从她这里得到一丝温暖和安慰。她说，你别急，没关系，我们从头再来。可是，我的爱人，你知道吗，这个打击甚至让 我回头审视自己，怀疑自己：我这样的一个北方人，是不是适合在上海打拼？<br />　　<br />　　　　尽管万分失落和失望，可我不能让我的女孩对我失望。 第二天我强打精神对阿芸说我要重新开始。我考虑了一夜，因为我已经没钱了，不能再租原来的房子了，我必须去找一个民房住，每个月可以省7 ~ 800元左 右。但是这样就不能和芸象以前那样离的那么近了。我说我不能停下来，时间不多了。芸哭着抱着我说，我一定要多来看她，她会很想我，我有经济困难一定要来找 她。我笑着说，你有经济困难也要来找我啊。<br />　　<br />　　　　朋友们，尽管时间已经过去了那么久，可是今天我回忆到这里的时候仍然泪流不止。那时候我已经处于最低谷，生存也成问题，可是我仍然愿意回忆那时的事情。我怎么可能想到，命运老人会让以后的我和她发生那么大的变化？<br /><br />12 初醒<br />　　<br />　　　　我搬到的一个民居是个私房，就是农民自己盖的房子，房子里面夏天热冬天冷，而且只有10个平房大小。我已经很满足了，这里每个月租金才200元，比以前我已经省了800块钱了。<br />　　<br />　　　　搬过来以后，我有很长一段日子不知自己干什么好。我想这是载过跟头的人的通病吧，相信有过类似经历的朋友会有同感。可是不做事情我心里又焦急万分。这种矛盾的感觉真是让我每天心里都不好受。<br />　　<br />　 　　　转眼一个月就要过去了，这个月里我基本上是馒头就咸菜，肚子里油水实在缺的厉害。我决定去买点熟肉解解馋。我这个民房周围有几个新改成的小区，因为 离市区比较远，基本上是一些市内动迁户迁到这里来的，真的购买这里房子的人也都没什么钱，但是这样的人在上海很多，小区外人气还是不错的。这里不像高价 房，高价房是开盘很久了还没见几个人烟。小区之间有条街，人很多但大都是些老人孩子在转悠。熟肉店生意好象不是很好，我要了一些肉又买了一瓶啤酒，在旁边 小店的简易桌上坐下来吃。<br />　　<br />　　　　多年以后我回想那个时刻，还是认为那是上帝给处于绝境的我的一个机遇。就在那时，忽然有人和熟食店 老板说话，在说老板，你这生意不行啊！是啊，那老板说，我下礼拜农忙，准备回家了，不做了。那人说，那你这店怎么办？那老板说，转了呗，这半年没赚什么 钱，还不如做点别的。忽然我有一种苏醒的感觉，我到处找钱赚，可是好高骛远，忽视了这身边的机会，难道自己一直没看见？我马上站起来，让老板再给我一点牛 肉，然后漫不经心地问他转让店面的情况。<br />　　<br />　　　　不过十分钟，我就清楚了：这个店也就10个平方左右，月租金1200，租金他多付了 两个月。转让费他要求不高，不亏就行，带一点简单的设施，2万块钱吧。我说我想接手，但是价格太高，他降到了1万8.我说1万5我今天就要，他回去和他老 婆商量了以下，同意了。我立刻回房拿了我仅剩的3000块钱作为订金付给他，然后当晚立下转让书，当然他同意我7天内把余款付清。<br /><br />13 努力<br />　　<br />　　　　我找到以前公司的老板，请他借给我钱。我还带去了我做的那份策划书，说我送给公司的。老板也多少听说了我的事情， 他详细地了解了我的境况，二话没说借给了我1万5千块钱。我笑着说：“老板，我把身份证押在你这里吧？”，老板也笑着说：“你要不要我的身份证，1万5我 押在你那里？”其实到现在我都一直敬佩我的老板。他的事业现在也做得很好，家资3000多万了。<br />　　<br />　　　　能让我的店面生意大为改观 呢？首先，我回忆到以前的鸡粥店，觉得上海人爱吃鸡，特别是白斩鸡，还有烤鸭，决定经营品种适当变化；另外，饮食业最重要的是卫生（卫生许可证一年一办， 已经有了），我决定彻底打扫店面一天，店面重新贴开业标志，另外买了一个二手的消毒柜，特意摆到台面上让客户看到消毒设施的过程；然后，我找了一个上海老 师傅来指导制作工艺（退休了返聘，很便宜的），再找了2个勤快的四川妹帮忙，允诺给他们业绩5％的提成，但是不行我就换人；等等大概有20多条措施吧，我 当时可是写满了2页纸的，全部做完已经过了近10天了。最后，我买了一些鞭炮，噼哩啪啦一放，人气立刻被我吸引过来了。呵呵，当天忙到夜里11点，一盘点 营业额居然有500多！<br /><br />14 曙光<br />　　<br />　　　　做过生意的朋友都知道，开业的当天生意好不见得以后生意一直会好。因为刚开始客户是好奇，试一试，一