<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_XSpace</title><subtitle type="text">Nothing Is Impossible!</subtitle><id>http://feed.cnblogs.com/blog/u/21077/rss</id><updated>2011-12-03T05:42:13Z</updated><author><name>xerwin</name><uri>http://www.cnblogs.com/erwin/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/erwin/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/21077/rss"/><entry><id>http://www.cnblogs.com/erwin/archive/2011/12/02/2272739.html</id><title type="text">推荐移动应用：群落（Groupcells）——全球第一款基于图片组的近场社交电子商务平台</title><summary type="text">“群落” 是全球第一款基于图片组的近场社交电子商务平台。每一个“群落”就是一个基于兴趣或者地点的图片组。能够方便的在精确人群中进行分享，也可以在精确人群中进行社交化电子商务。</summary><published>2011-12-02T14:08:00Z</published><updated>2011-12-02T14:08:00Z</updated><author><name>xerwin</name><uri>http://www.cnblogs.com/erwin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/erwin/archive/2011/12/02/2272739.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/erwin/archive/2011/12/02/2272739.html"/><content type="html">&lt;p&gt;&lt;span style="font-family: 黑体; font-size: 18pt;"&gt;Groupcells 群落&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;ldquo;群落&amp;rdquo; 是全球第一款基于图片组的近场社交电子商务平台。每一个&amp;ldquo;群落&amp;rdquo;就是一个基于兴趣或者地点的图片组。能够方便的在精确人群中进行分享，也可以在精确人群中进行社交化电子商务。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 所有&amp;ldquo;群落&amp;rdquo;都是自动建立，没有&amp;ldquo;群主&amp;rdquo;。很自由的加入和退出。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/17518/2011120222034159.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/17518/2011120222040269.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Groupcells想要聚合信息的价值，以地点、兴趣作为一种良好的媒介，未来这些信息可能会产生巨大的价值。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果你想出售你所拍之物，只需要简单勾选，就能够体会到&amp;ldquo;群落&amp;rdquo;社交化电子商务带给你的惊喜体验。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 所谓社交商务，就是建立在社交基础上的电子商务，因此Groupcells具有很强的社交特征，我们一起来欣赏一段简短的视频：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;object width="480" height="400" align="middle" data="http://player.youku.com/player.php/sid/XMzIyNzYxMzky/v.swf" type="application/x-shockwave-flash"&gt;&lt;param name="src" value="http://player.youku.com/player.php/sid/XMzIyNzYxMzky/v.swf" /&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="quality" value="high" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;/object&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Groupcells官方网站：&lt;a href="http://www.groupcells.com"&gt;http://www.groupcells.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iPhone版下载：&lt;a href="http://itunes.apple.com/us/app/groupcells-2.4/id477039849?ls=1&amp;amp;mt=8"&gt;http://itunes.apple.com/us/app/groupcells-2.4/id477039849?ls=1&amp;amp;mt=8&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Android版下载：&lt;a href="http://apk.gfan.com/Product/App188886.html"&gt;http://apk.gfan.com/Product/App188886.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;更多截图与预览：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/17518/2011120300333367.jpg" alt="" /&gt;&amp;nbsp; &lt;img src="http://pic002.cnblogs.com/images/2011/17518/2011120300131839.jpg" alt="" /&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/17518/2011120300135241.jpg" alt="" /&gt;&amp;nbsp; &lt;img src="http://pic002.cnblogs.com/images/2011/17518/2011120300140837.jpg" alt="" /&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/17518/2011120300141858.jpg" alt="" /&gt;&amp;nbsp; &lt;img src="http://pic002.cnblogs.com/images/2011/17518/2011120300143536.jpg" alt="" /&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/17518/2011120300145443.jpg" alt="" /&gt;&amp;nbsp; &lt;img src="http://pic002.cnblogs.com/images/2011/17518/2011120300150895.jpg" alt="" /&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Groupcells官方网站：&lt;a href="http://www.groupcells.com"&gt;http://www.groupcells.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iPhone版下载：&lt;a href="http://itunes.apple.com/us/app/groupcells-2.4/id477039849?ls=1&amp;amp;mt=8"&gt;http://itunes.apple.com/us/app/groupcells-2.4/id477039849?ls=1&amp;amp;mt=8&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Android版下载：&lt;a href="http://apk.gfan.com/Product/App188886.html"&gt;http://apk.gfan.com/Product/App188886.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/erwin/aggbug/2272739.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/erwin/archive/2011/12/02/2272739.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/erwin/archive/2011/03/04/1970715.html</id><title type="text">[学习]SVM入门（一）</title><summary type="text">本文通过例子介绍了支持向量机(Support Vector Machine)及线性分类器的基础知识和原理。</summary><published>2011-03-04T03:22:00Z</published><updated>2011-03-04T03:22:00Z</updated><author><name>xerwin</name><uri>http://www.cnblogs.com/erwin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/erwin/archive/2011/03/04/1970715.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/erwin/archive/2011/03/04/1970715.html"/><content type="html">&lt;p&gt;----------------------------------------------------------&lt;/p&gt;&lt;p&gt;资料是从免费网站上获取的，上载在这里，只为交流学习目的，文章原作者保留所有权力，&lt;br /&gt;如本博客的内容侵犯了你的权益，请与以下地址联系，本人获知后，马上删除。同时本人深表歉意，并致以崇高的谢意！&lt;br /&gt;erwin_609#msn.com&lt;/p&gt;&lt;p&gt;----------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;strong&gt;一、SVM的八股简介&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的，它在解决小样本、非线性及高维模式识别中表现出许多特有的优势，并能够推广应用到函数拟合等其他机器学习问题中[10]。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 支持向量机方法是建立在统计学习理论的VC 维理论和结构风险最小原理基础上的，根据有限的样本信息在模型的复杂性（即对特定训练样本的学习精度，Accuracy）和学习能力（即无错误地识别任意样本的能力）之间寻求最佳折衷，以期获得最好的推广能力[14]（或称泛化能力）。&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 以上是经常被有关SVM 的学术文献引用的介绍，有点八股，我来逐一分解并解释一下。&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Vapnik是统计机器学习的大牛，这想必都不用说，他出版的《Statistical Learning Theory》是一本完整阐述统计机器学习思想的名著。在该书中详细的论证了统计机器学习之所以区别于传统机器学习的本质，就在于统计机器学习能够精确的给出学习效果，能够解答需要的样本数等等一系列问题。与统计机器学习的精密思维相比，传统的机器学习基本上属于摸着石头过河，用传统的机器学习方法构造分类系统完全成了一种技巧，一个人做的结果可能很好，另一个人差不多的方法做出来却很差，缺乏指导和原则。&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 所谓VC维是对函数类的一种度量，可以简单的理解为问题的复杂程度，VC维越高，一个问题就越复杂。正是因为SVM关注的是VC维，后面我们可以看到，SVM解决问题的时候，和样本的维数是无关的（甚至样本是上万维的都可以，这使得SVM很适合用来解决文本分类的问题，当然，有这样的能力也因为引入了核函数）。&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 结构风险最小听上去文绉绉，其实说的也无非是下面这回事。&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 机器学习本质上就是一种对问题真实模型的逼近（我们选择一个我们认为比较好的近似模型，这个近似模型就叫做一个假设），但毫无疑问，真实模型一定是不知道的（如果知道了，我们干吗还要机器学习？直接用真实模型解决问题不就可以了？对吧，哈哈）既然真实模型不知道，那么我们选择的假设与问题真实解之间究竟有多大差距，我们就没法得知。比如说我们认为宇宙诞生于150亿年前的一场大爆炸，这个假设能够描述很多我们观察到的现象，但它与真实的宇宙模型之间还相差多少？谁也说不清，因为我们压根就不知道真实的宇宙模型到底是什么。&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这个与问题真实解之间的误差，就叫做风险（更严格的说，误差的累积叫做风险）。我们选择了一个假设之后（更直观点说，我们得到了一个分类器以后），真实误差无从得知，但我们可以用某些可以掌握的量来逼近它。最直观的想法就是使用分类器在样本数据上的分类的结果与真实结果（因为样本是已经标注过的数据，是准确的数据）之间的差值来表示。这个差值叫做经验风险R&lt;sub&gt;emp&lt;/sub&gt;(w)。以前的机器学习方法都把经验风险最小化作为努力的目标，但后来发现很多分类函数能够在样本集上轻易达到100%的正确率，在真实分类时却一塌糊涂（即所谓的推广能力差，或泛化能力差）。此时的情况便是选择了一个足够复杂的分类函数（它的VC维很高），能够精确的记住每一个样本，但对样本之外的数据一律分类错误。回头看看经验风险最小化原则我们就会发现，此原则适用的大前提是经验风险要确实能够逼近真实风险才行（行话叫一致），但实际上能逼近么？答案是不能，因为样本数相对于现实世界要分类的文本数来说简直九牛一毛，经验风险最小化原则只在这占很小比例的样本上做到没有误差，当然不能保证在更大比例的真实文本上也没有误差。&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 统计学习因此而引入了泛化误差界的概念，就是指真实风险应该由两部分内容刻画，一是经验风险，代表了分类器在给定样本上的误差；二是置信风险，代表了我们在多大程度上可以信任分类器在未知文本上分类的结果。很显然，第二部分是没有办法精确计算的，因此只能给出一个估计的区间，也使得整个误差只能计算上界，而无法计算准确的值（所以叫做泛化误差界，而不叫泛化误差）。&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 置信风险与两个量有关，一是样本数量，显然给定的样本数量越大，我们的学习结果越有可能正确，此时置信风险越小；二是分类函数的VC维，显然VC维越大，推广能力越差，置信风险会变大。&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 泛化误差界的公式为：&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; R(w)&amp;le;R&lt;sub&gt;emp&lt;/sub&gt;(w)+Ф(n/h)&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 公式中R(w)就是真实风险，R&lt;sub&gt;emp&lt;/sub&gt;(w)就是经验风险，Ф(n/h)就是置信风险。统计学习的目标从经验风险最小化变为了寻求经验风险与置信风险的和最小，即结构风险最小。&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SVM正是这样一种努力最小化结构风险的算法。&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SVM其他的特点就比较容易理解了。&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 小样本，并不是说样本的绝对数量少（实际上，对任何算法来说，更多的样本几乎总是能带来更好的效果），而是说与问题的复杂度比起来，SVM算法要求的样本数是相对比较少的。&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 非线性，是指SVM擅长应付样本数据线性不可分的情况，主要通过松弛变量（也有人叫惩罚变量）和核函数技术来实现，这一部分是SVM的精髓，以后会详细讨论。多说一句，关于文本分类这个问题究竟是不是线性可分的，尚没有定论，因此不能简单的认为它是线性可分的而作简化处理，在水落石出之前，只好先当它是线性不可分的（反正线性可分也不过是线性不可分的一种特例而已，我们向来不怕方法过于通用）。&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 高维模式识别是指样本维数很高，例如文本的向量表示，如果没有经过另一系列文章（《文本分类入门》）中提到过的降维处理，出现几万维的情况很正常，其他算法基本就没有能力应付了，SVM却可以，主要是因为SVM 产生的分类器很简洁，用到的样本信息很少（仅仅用到那些称之为&amp;ldquo;支持向量&amp;rdquo;的样本，此为后话），使得即使样本维数很高，也不会给存储和计算带来大麻烦（相对照而言，kNN算法在分类时就要用到所有样本，样本数巨大，每个样本维数再一高，这日子就没法过了&amp;hellip;&amp;hellip;）。&lt;p&gt;下一节开始正式讨论SVM。别嫌我说得太详细哦。&lt;p&gt;&amp;nbsp;&lt;p&gt;&lt;strong&gt;二、线性分类器Part 1&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 线性分类器(一定意义上,也可以叫做感知机) 是最简单也很有效的分类器形式.在一个线性分类器中,可以看到SVM形成的思路,并接触很多SVM的核心概念.&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 用一个二维空间里仅有两类样本的分类问题来举个小例子。如图所示&lt;p&gt;&lt;sup&gt;&lt;/sup&gt;&lt;p&gt;&lt;sup&gt;&lt;/sup&gt;&lt;p&gt;&lt;sup&gt;&lt;/sup&gt;&lt;p&gt;&lt;sup&gt;&lt;/sup&gt;&lt;p&gt;&lt;sup&gt;&lt;/sup&gt;&lt;p&gt;&lt;sup&gt;&lt;/sup&gt;&lt;p&gt;&lt;sup&gt;&lt;/sup&gt;&lt;p&gt;&lt;sup&gt;&lt;/sup&gt;&lt;p&gt;&lt;sup&gt;&lt;/sup&gt;&lt;p&gt;&lt;sup&gt;&lt;/sup&gt;&lt;p align="center"&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/erwin/201103/201103041121291773.png"&gt;&lt;img height="176" width="240" src="http://images.cnblogs.com/cnblogs_com/erwin/201103/201103041121294315.png" alt="untitled" border="0" title="untitled" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;sup&gt;&lt;/sup&gt;&lt;p&gt;&lt;sup&gt;&lt;/sup&gt;&lt;p&gt;&lt;sup&gt;&lt;/sup&gt;&lt;p&gt;&lt;sup&gt;&amp;shy;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/sup&gt;C&lt;sub&gt;1&lt;/sub&gt;和C&lt;sub&gt;2&lt;/sub&gt;是要区分的两个类别，在二维平面中它们的样本如上图所示。中间的直线就是一个分类函数，它可以将两类样本完全分开。一般的，如果一个线性函数能够将样本完全正确的分开，就称这些数据是线性可分的，否则称为非线性可分的。&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 什么叫线性函数呢？在一维空间里就是一个点，在二维空间里就是一条直线，三维空间里就是一个平面，可以如此想象下去，如果不关注空间的维数，这种线性函数还有一个统一的名称&amp;mdash;&amp;mdash;超平面（Hyper Plane）！&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 实际上，一个线性函数是一个实值函数（即函数的值是连续的实数），而我们的分类问题（例如这里的二元分类问题&amp;mdash;&amp;mdash;回答一个样本属于还是不属于一个类别的问题）需要离散的输出值，例如用1表示某个样本属于类别C&lt;sub&gt;1&lt;/sub&gt;，而用0表示不属于（不属于C&lt;sub&gt;1&lt;/sub&gt;也就意味着属于C&lt;sub&gt;2&lt;/sub&gt;），这时候只需要简单的在实值函数的基础上附加一个阈值即可，通过分类函数执行时得到的值大于还是小于这个阈值来确定类别归属。 例如我们有一个线性函数&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;g(x)=wx+b&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我们可以取阈值为0，这样当有一个样本x&lt;sub&gt;i&lt;/sub&gt;需要判别的时候，我们就看g(x&lt;sub&gt;i&lt;/sub&gt;)的值。若g(x&lt;sub&gt;i&lt;/sub&gt;)&amp;gt;0，就判别为类别C&lt;sub&gt;1&lt;/sub&gt;，若g(x&lt;sub&gt;i&lt;/sub&gt;)&amp;lt;0，则判别为类别C&lt;sub&gt;2&lt;/sub&gt;（等于的时候我们就拒绝判断，呵呵）。此时也等价于给函数g(x)附加一个符号函数sgn()，即f(x)=sgn [g(x)]是我们真正的判别函数。&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 关于g(x)=wx+b这个表达式要注意三点：一，式中的x不是二维坐标系中的横轴，而是样本的向量表示，例如一个样本点的坐标是(3,8)，则x&lt;sup&gt;T&lt;/sup&gt;=(3,8) ，而不是x=3（一般说向量都是说列向量，因此以行向量形式来表示时，就加上转置）。二，这个形式并不局限于二维的情况，在n维空间中仍然可以使用这个表达式，只是式中的w成为了n维向量（在二维的这个例子中，w是二维向量，为了表示起来方便简洁，以下均不区别列向量和它的转置，聪明的读者一看便知）；三，g(x)不是中间那条直线的表达式，中间那条直线的表达式是g(x)=0，即wx+b=0，我们也把这个函数叫做分类面。&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 实际上很容易看出来，中间那条分界线并不是唯一的，我们把它稍微旋转一下，只要不把两类数据分错，仍然可以达到上面说的效果，稍微平移一下，也可以。此时就牵涉到一个问题，对同一个问题存在多个分类函数的时候，哪一个函数更好呢？显然必须要先找一个指标来量化&amp;ldquo;好&amp;rdquo;的程度，通常使用的都是叫做&amp;ldquo;分类间隔&amp;rdquo;的指标。下一节我们就仔细说说分类间隔，也补一补相关的数学知识。&lt;p&gt;&amp;nbsp;&lt;p&gt;&lt;strong&gt;三、线性分类器Part 2&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 上回说到对于文本分类这样的不适定问题（有一个以上解的问题称为不适定问题），需要有一个指标来衡量解决方案（即我们通过训练建立的分类模型）的好坏，而分类间隔是一个比较好的指标。&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在进行文本分类的时候，我们可以让计算机这样来看待我们提供给它的训练样本，每一个样本由一个向量（就是那些文本特征所组成的向量）和一个标记（标示出这个样本属于哪个类别）组成。如下：&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;D&lt;sub&gt;i&lt;/sub&gt;=(x&lt;sub&gt;i&lt;/sub&gt;,y&lt;sub&gt;i&lt;/sub&gt;)&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;x&lt;sub&gt;i&lt;/sub&gt;就是文本向量（维数很高），y&lt;sub&gt;i&lt;/sub&gt;就是分类标记。&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在二元的线性分类中，这个表示分类的标记只有两个值，1和-1（用来表示属于还是不属于这个类）。有了这种表示法，我们就可以定义一个样本点到某个超平面的间隔：&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&amp;delta;&lt;sub&gt;i&lt;/sub&gt;=y&lt;sub&gt;i&lt;/sub&gt;(wx&lt;sub&gt;i&lt;/sub&gt;+b)&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这个公式乍一看没什么神秘的，也说不出什么道理，只是个定义而已，但我们做做变换，就能看出一些有意思的东西。&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 首先注意到如果某个样本属于该类别的话，那么wx&lt;sub&gt;i&lt;/sub&gt;+b&amp;gt;0（记得么？这是因为我们所选的g(x)=wx+b就通过大于0还是小于0来判断分类），而y&lt;sub&gt;i&lt;/sub&gt;也大于0；若不属于该类别的话，那么wx&lt;sub&gt;i&lt;/sub&gt;+b&amp;lt;0，而y&lt;sub&gt;i&lt;/sub&gt;也小于0，这意味着y&lt;sub&gt;i&lt;/sub&gt;(wx&lt;sub&gt;i&lt;/sub&gt;+b)总是大于0的，而且它的值就等于|wx&lt;sub&gt;i&lt;/sub&gt;+b|！（也就是|g(x&lt;sub&gt;i&lt;/sub&gt;)|）&lt;p&gt;现在把w和b进行一下归一化，即用w/||w||和b/||w||分别代替原来的w和b，那么间隔就可以写成&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/erwin/201103/201103041121307695.png"&gt;&lt;img height="48" width="115" src="http://images.cnblogs.com/cnblogs_com/erwin/201103/201103041121307205.png" alt="untitled2" border="0" title="untitled2" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;这个公式是不是看上去有点眼熟？没错，这不就是解析几何中点x&lt;sub&gt;i&lt;/sub&gt;到直线g(x)=0的距离公式嘛！（推广一下，是到超平面g(x)=0的距离， g(x)=0就是上节中提到的分类超平面）&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;小Tips：||w||是什么符号？||w||叫做向量w的范数，范数是对向量长度的一种度量。我们常说的向量长度其实指的是它的2-范数，范数最一般的表示形式为p-范数，可以写成如下表达式&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 向量w=(w&lt;sub&gt;1&lt;/sub&gt;, w&lt;sub&gt;2&lt;/sub&gt;, w&lt;sub&gt;3&lt;/sub&gt;,&amp;hellip;&amp;hellip; w&lt;sub&gt;n&lt;/sub&gt;)&lt;p&gt;它的p-范数为&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/erwin/201103/201103041121305809.png"&gt;&lt;img height="35" width="191" src="http://images.cnblogs.com/cnblogs_com/erwin/201103/201103041121315842.png" alt="untitled3" border="0" title="untitled3" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 看看把p换成2的时候，不就是传统的向量长度么？当我们不指明p的时候，就像||w||这样使用时，就意味着我们不关心p的值，用几范数都可以；或者上文已经提到了p的值，为了叙述方便不再重复指明。&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 当用归一化的w和b代替原值之后的间隔有一个专门的名称，叫做几何间隔，几何间隔所表示的正是点到超平面的欧氏距离，我们下面就简称几何间隔为&amp;ldquo;距离&amp;rdquo;。以上是单个点到某个超平面的距离（就是间隔，后面不再区别这两个词）定义，同样可以定义一个点的集合（就是一组样本）到某个超平面的距离为此集合中离超平面最近的点的距离。下面这张图更加直观的展示出了几何间隔的现实含义：&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/erwin/201103/201103041121311971.png"&gt;&lt;img height="302" width="474" src="http://images.cnblogs.com/cnblogs_com/erwin/201103/201103041121312320.png" alt="image_thumb4" border="0" title="image_thumb4" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" /&gt;&lt;/a&gt;&lt;p&gt;H是分类面，而H&lt;sub&gt;1&lt;/sub&gt;和H&lt;sub&gt;2&lt;/sub&gt;是平行于H，且过离H最近的两类样本的直线，H&lt;sub&gt;1&lt;/sub&gt;与H，H&lt;sub&gt;2&lt;/sub&gt;与H之间的距离就是几何间隔。&lt;p&gt;之所以如此关心几何间隔这个东西，是因为几何间隔与样本的误分次数间存在关系：&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/erwin/201103/201103041121317337.png"&gt;&lt;img height="53" width="131" src="http://images.cnblogs.com/cnblogs_com/erwin/201103/20110304112132401.png" alt="untitled5" border="0" title="untitled5" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 其中的&amp;delta;是样本集合到分类面的间隔，R=max ||xi||&amp;nbsp; i=1,...,n，即R是所有样本中（xi是以向量表示的第i个样本）向量长度最长的值（也就是说代表样本的分布有多么广）。先不必追究误分次数的具体定义和推导过程，只要记得这个误分次数一定程度上代表分类器的误差。而从上式可以看出，误分次数的上界由几何间隔决定！（当然，是样本已知的时候）&lt;p&gt;至此我们就明白为何要选择几何间隔来作为评价一个解优劣的指标了，原来几何间隔越大的解，它的误差上界越小。因此最大化几何间隔成了我们训练阶段的目标，而且，与二把刀作者所写的不同，最大化分类间隔并不是SVM的专利，而是早在线性分类时期就已有的思想。&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/erwin/aggbug/1970715.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/erwin/archive/2011/03/04/1970715.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/erwin/archive/2010/12/15/1907142.html</id><title type="text">MongoDB and C#</title><summary type="text">Introduction Most likely you have used a relational database and been fairly happy with it. I know I have. Be it SQL Server or MySQL, I know how to use my tools efficiently to push, pull, and transfor...</summary><published>2010-12-15T10:02:00Z</published><updated>2010-12-15T10:02:00Z</updated><author><name>xerwin</name><uri>http://www.cnblogs.com/erwin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/erwin/archive/2010/12/15/1907142.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/erwin/archive/2010/12/15/1907142.html"/><content type="html">&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Most likely you have used a relational database and been fairly happy with it. I know I have. Be it SQL Server or MySQL, I know how to use my tools efficiently to push, pull, and transform the data I need. When we sit down to analyze a project, we'll debate over the language, the servers, etc..., but we never talk about what type of database fits the problem. We always just assume we'll use a relational database. But there are a lot of problems that can exist as a result of this choice. I not only need to know my preferred language (C#, Ruby), but I also need to know SQL. In addition, there is a known &lt;a href="http://en.wikipedia.org/wiki/Object-relational_impedance_mismatch"&gt;impedance mismatch&lt;/a&gt; between a relational structure and the domain models I so carefully craft. While I do use an OR/M (nHibernate, LINQ to SQL, etc...), it simply allows me to ignore (most of the time) this problem.  &lt;p&gt;So what am I getting at? Well, there are other types of databases that exist. Object-databases like db4o and other non-relational databases like Casandra or Amazon's SimpleDB provide some relief, but none really handles the problems I need fixed. I need something that is cross-language, but also that supports an object model. I need something that is highly scalable, but still fast.  &lt;p&gt;As it turns out, there is another type of database. A &lt;a href="http://en.wikipedia.org/wiki/Document-oriented_database"&gt;document-database&lt;/a&gt;. As I looked around, there were a number of them that fit the mold. CouchDB, RavenDB, and MongoDB are the most notable ones. I settled on MongoDB because it continued to provide me dynamic query capabilities that the other two do not.  &lt;p&gt;In this article, I'd like to help you get started with MongoDB, from install to your first project. In addition, I'll show a little bit about the LINQ provider and let you play with it on your own.  &lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;strong&gt;Getting MongoDB&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The &lt;a href="http://www.mongodb.org/"&gt;MongoDB site&lt;/a&gt; has a downloads link sitting right at the top. You'll want to download and install the one that is pertinent to your system. I am using version 1.4.2 while writing this article.  &lt;p&gt;After you have downloaded it, you can simply unzip it anywhere on your box. I unzipped mine to &lt;em&gt;c:\Program Files\MongoDB&lt;/em&gt;. In addition, you'll need to go and manually create a directory at &lt;em&gt;c:\data\db&lt;/em&gt;. This is the default location where MongoDB stores its files. Finally, if you go back to the MongoDB directory, you can run the server by executing &lt;em&gt;mongod.exe&lt;/em&gt; (for Windows users).  &lt;p&gt;At this point, you are running the MongoDB server on localhost, port 27017. These are the defaults, and will work just fine for our test project.  &lt;p&gt;There is a shell you can run to play around with the database if you'd like. I will not get into that here, but there is a tutorial on &lt;a href="http://www.mongodb.org/#"&gt;MongoDB's site&lt;/a&gt; if you click "Try It Out". Note that the syntax here is not C#, but rather JavaScript.  &lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;strong&gt;MongoDB Introduction&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;We are going to create a simple little test project that simulates a blogging system. This is a fairly well-understood paradigm, so I won't go into the details about the object model. Shown below is the entity model we'll be using.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;div class="csharpcode"&gt;&lt;font size="2"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Post &lt;/font&gt;&lt;font size="2"&gt;{&lt;/font&gt;&lt;font size="2"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Oid Id { get; &lt;span class="kwrd"&gt;private&lt;/span&gt; set; }&lt;/font&gt;&lt;font size="2"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Title { get; set; }&lt;/font&gt;&lt;font size="2"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Body { get; set; }&lt;/font&gt;&lt;font size="2"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; CharCount { get; set; }&lt;/font&gt;&lt;font size="2"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; IList&amp;lt;Comment&amp;gt; Comments { get; set; }&lt;/font&gt;&lt;font size="2"&gt;}&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font size="2"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Comment&lt;/font&gt;&lt;font size="2"&gt;{&lt;/font&gt;&lt;font size="2"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; DateTime TimePosted { get; set; }&lt;/font&gt;&lt;font size="2"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Email { get; set; }&lt;/font&gt;&lt;font size="2"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Body { get; set; }&lt;/font&gt;&lt;font size="2"&gt;}&lt;/font&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp; &lt;p&gt;Experienced OR/M users will notice that there are no identifiers on &lt;code&gt;Comment&lt;/code&gt;. That is because these entities do not have their own table. They are part of the Post document and stored as an array. In other words, when we fetch a Post, we pull back all of its related comments without doing anything special. This is where the impedance mismatch mentioned in the introduction goes away. There is now no difference between my entity model here and the one stored in MongoDB.&lt;p&gt;MongoDB stores its data in BSON (binary JSON). Each server has a number of databases, and each database has a number of collections. You can think of collections like you think of tables in a relational store. In our example above, we only need a single collection to model our data. We'll go ahead and call that collection "Post" for now, after our class name.&lt;p&gt;If we were to query the Post collection from the shell (after inserting some data), we'd see JSON come back representing our data. For our example, blog will be our database name. Shown below is an example of this data.&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;div class="csharpcode"&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//blog is our database name.&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//shell commands&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;use blog&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font size="2"&gt;db.Post.find()&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//results&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;{   _id: ObjectId(&lt;span class="str"&gt;"4be05365340d000000002554"&lt;/span&gt;), &lt;/font&gt;&lt;font size="2"&gt;    Title: &lt;span class="str"&gt;"My First Post"&lt;/span&gt;, &lt;/font&gt;&lt;font size="2"&gt;    Body: &lt;span class="str"&gt;"This isn't a very long post."&lt;/span&gt;, &lt;/font&gt;&lt;font size="2"&gt;    CharCount: 28,&lt;/font&gt;&lt;font size="2"&gt;    Comments: [&lt;/font&gt;&lt;font size="2"&gt;        {   TimePosted: &lt;span class="str"&gt;"Fri Jan 01 2010 00:00:00 GMT-0600 (Central Standard Time)"&lt;/span&gt;,&lt;/font&gt;&lt;font size="2"&gt;            Email: &lt;span class="str"&gt;"bob_mcbob@gmail.com"&lt;/span&gt;,&lt;/font&gt;&lt;font size="2"&gt;            Body: &lt;span class="str"&gt;"This article is too short!"&lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;        },&lt;/font&gt;&lt;font size="2"&gt;        {   TimePosted: &lt;span class="str"&gt;"Fri Jan 02 2010 00:00:00 GMT-0600 (Central Standard Time)"&lt;/span&gt;,&lt;/font&gt;&lt;font size="2"&gt;            Email: &lt;span class="str"&gt;"Jane.McJane@gmail.com"&lt;/span&gt;,&lt;/font&gt;&lt;font size="2"&gt;            Body: &lt;span class="str"&gt;"I agree with Bob."&lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;        }        &lt;/font&gt;&lt;font size="2"&gt;    ]&lt;/font&gt;&lt;font size="2"&gt;}&lt;/font&gt;&lt;/div&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;A couple of things to note about the above results. First, &lt;code&gt;_id&lt;/code&gt; is our identifier. While I think you probably figured that out, you may not know some of the ins and outs. &lt;code&gt;_id&lt;/code&gt; will be automatically generated if you don't provide one. Since I did not when I created this record, a type of object called an &lt;code&gt;ObjectId&lt;/code&gt; was used. This type is documented on MongoDB's site, and is fully supported by all the client-side implementations, including MongoDB-CSharp. MongoDB-CSharp also lets you specify either your own identifier, or you can use other types of auto-generated identifiers like a GUID. Second, notice how comments are stored as an array and embedded right within the Post document. As I mentioned before, we have no need of performing a join to get all the information we need about a post, it is already a part of the document.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;The C# Project&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;OK, enough chit-chat. Let's build our project. The included sample project contains &lt;em&gt;MongoDB.dll&lt;/em&gt; to reference. If you'd like to download it yourself, the project location is at &lt;a href="http://github.com/samus/mongodb-csharp/downloads"&gt;http://github.com/samus/mongodb-csharp/downloads&lt;/a&gt;. I've included the .90 beta 1 DLL in the &lt;em&gt;libs&lt;/em&gt; folder. There are quite a few other C# drivers out there, but so far, I believe the functionality delivered by this driver is farther along and more mature. In full disclosure, I am biased because I helped write some of the project. Any prior version will not have the LINQ support or configuration support that exists in this one. In addition, you can consult the wiki at the location above for examples and other documentation.&lt;p&gt;So, at this point, I've created a new VS2008 solution called MongoDB Blog, with a project I call MongoDBBlog.Tester. Tester is a console application. In addition, I added a reference to &lt;em&gt;MongoDB.dll&lt;/em&gt; that we downloaded earlier from github.&lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;strong&gt;Finally, Some Code!!!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;First things first. We need to save some posts.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="csharpcode"&gt;&lt;font size="2"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; MongoDB;&lt;/font&gt;&lt;font size="2"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; MongoDB.Linq;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//etc...&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//Create a default mongo object. This handles our connections to the database.&lt;/font&gt;&lt;/span&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//By default, this will connect to localhost, &lt;/font&gt;&lt;/span&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//port 27017 which we already have running from earlier.&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;var mongo = &lt;span class="kwrd"&gt;new&lt;/span&gt; Mongo();&lt;/font&gt;&lt;font size="2"&gt;mongo.Connect();&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//Get the blog database. If it doesn't exist, that's ok because MongoDB will create it &lt;/font&gt;&lt;/span&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//for us when we first use it. Awesome!!!&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;var db = mongo.GetDatabase(&lt;span class="str"&gt;"blog"&lt;/span&gt;);&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//Get the Post collection. By default, we'll use&lt;/font&gt;&lt;/span&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//the name of the class as the collection name. Again,&lt;/font&gt;&lt;/span&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//if it doesn't exist, MongoDB will create it when we first use it.&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;var collection = db.GetCollection&amp;lt;Post&amp;gt;();    &lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//this deletes everything out of the collection so we can run this over and over again.&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;collection.Delete (p =&amp;gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//Create a Post to enter into the database.&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;var post = &lt;span class="kwrd"&gt;new&lt;/span&gt; Post()&lt;/font&gt;&lt;font size="2"&gt;{&lt;/font&gt;&lt;font size="2"&gt;    Title = &lt;span class="str"&gt;"My First Post"&lt;/span&gt;,&lt;/font&gt;&lt;font size="2"&gt;    Body = &lt;span class="str"&gt;"This isn't a very long post."&lt;/span&gt;,&lt;/font&gt;&lt;font size="2"&gt;    CharCount = 27,&lt;/font&gt;&lt;font size="2"&gt;    Comments = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Comment&amp;gt;&lt;/font&gt;&lt;font size="2"&gt;    {&lt;/font&gt;&lt;font size="2"&gt;        { &lt;span class="kwrd"&gt;new&lt;/span&gt; Comment() { TimePosted = &lt;span class="kwrd"&gt;new&lt;/span&gt; DateTime(2010,1,1), &lt;/font&gt;&lt;font size="2"&gt;                          Email = &lt;span class="str"&gt;"bob_mcbob@gmail.com"&lt;/span&gt;, &lt;/font&gt;&lt;font size="2"&gt;                          Body = &lt;span class="str"&gt;"This article is too short!"&lt;/span&gt; } },&lt;/font&gt;&lt;font size="2"&gt;        { &lt;span class="kwrd"&gt;new&lt;/span&gt; Comment() { TimePosted = &lt;span class="kwrd"&gt;new&lt;/span&gt; DateTime(2010,1,2), &lt;/font&gt;&lt;font size="2"&gt;                          Email = &lt;span class="str"&gt;"Jane.McJane@gmail.com"&lt;/span&gt;, &lt;/font&gt;&lt;font size="2"&gt;                          Body = &lt;span class="str"&gt;"I agree with Bob."&lt;/span&gt; } }&lt;/font&gt;&lt;font size="2"&gt;    }&lt;/font&gt;&lt;font size="2"&gt;};&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//Save the post. This will perform an upsert. As in, if the post&lt;/font&gt;&lt;/span&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//already exists, update it, otherwise insert it.&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;collection.Save(post);&lt;/font&gt;&lt;/div&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Great. Now we have a post in our database, but those of you astute readers will notice I can't count. I shouldn't have hardcoded that value, but then I wouldn't have a reason to show you how to update. The actual character count above is 28, not 27. That's OK, it is easy to update.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="csharpcode"&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//Get the first post that is not matching correctly...&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;var post = collection.Linq().First(x =&amp;gt; x.CharCount != x.Body.Length);&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font size="2"&gt;post.CharCount = post.Body.Length;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//this will perform an update this time because we have already inserted it.&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;collection.Save(post);&lt;/font&gt;&lt;/div&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;OK, good. All is right with the world again. At this point, we can go ahead and query our posts. In the attached code, I have entered three posts at this point so our queries have a little substance to them.&lt;p&gt;LINQ is fully supported up to the limits of MongoDB. Projections, &lt;code&gt;Where&lt;/code&gt; clauses, and ordering are all a part of our LINQ support. Joins, however, are not. This is due to a lot of reasons that go back to consistency, but we don't support Joins because MongoDB does not support Joins. Below, we'll see some simple queries.&lt;p&gt;&amp;nbsp; &lt;div class="csharpcode"&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//count all the Posts&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;var totalNumberOfPosts = collection.Count();&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//count only the Posts that have 2 comments&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;var numberOfPostsWith2Comments = &lt;/font&gt;&lt;font size="2"&gt;    collection.Count(p =&amp;gt; p.Comments.Count == 2);&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//find the titles of the posts that Jane commented on...&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;var postsThatJaneCommentedOn = &lt;/font&gt;&lt;font size="2"&gt;    from p &lt;span class="kwrd"&gt;in&lt;/span&gt; collection.Linq()&lt;/font&gt;&lt;font size="2"&gt;    &lt;span class="kwrd"&gt;where&lt;/span&gt; p.Comments.Any(c =&amp;gt; c.Email.StartsWith(&lt;span class="str"&gt;"Jane"&lt;/span&gt;))&lt;/font&gt;&lt;font size="2"&gt;    select p.Title;&lt;/font&gt;&lt;font size="2"&gt;                                &lt;/font&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//find the titles and comments of the posts &lt;/font&gt;&lt;/span&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//that have comments after January First.&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;var postsWithCommentsAfterJanuary1st = from p &lt;span class="kwrd"&gt;in&lt;/span&gt; collection.Linq()&lt;/font&gt;&lt;font size="2"&gt;                                       &lt;span class="kwrd"&gt;where&lt;/span&gt; p.Comments.Any(c =&amp;gt; c.TimePosted &amp;gt; &lt;/font&gt;&lt;font size="2"&gt;                                                            &lt;span class="kwrd"&gt;new&lt;/span&gt; DateTime(2010, 1, 1))&lt;/font&gt;&lt;font size="2"&gt;                                       select &lt;span class="kwrd"&gt;new&lt;/span&gt; { Title = p.Title, &lt;/font&gt;&lt;font size="2"&gt;                                                    Comments = p.Comments };&lt;/font&gt;&lt;font size="2"&gt;                          &lt;/font&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//find posts with less than 40 characters&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;var postsWithLessThan40Chars = from p &lt;span class="kwrd"&gt;in&lt;/span&gt; collection.Linq()&lt;/font&gt;&lt;font size="2"&gt;                               &lt;span class="kwrd"&gt;where&lt;/span&gt; p.CharCount &amp;lt; 40&lt;/font&gt;&lt;font size="2"&gt;                               select p;&lt;/font&gt;&lt;/div&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;As you can see, the query capabilities of MongoDB are satisfactory. We can get what we want when we want it. We can even do some aggregation using the Map-Reduce capabilities of MongoDB.&lt;p&gt;MongoDB uses Map-Reduce to perform scalable aggregation and rollups of data. This generally involves writing some JavaScript to get it working. Below is an example of using JavaScript to sum up our word count, first using JavaScript, and then using our LINQ provider's automatic transformation.&lt;p&gt;&amp;nbsp; &lt;div class="csharpcode"&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//Manual map-reduce&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;var sum = Convert.ToInt32(collection.MapReduce()&lt;/font&gt;&lt;font size="2"&gt;    .Map(&lt;span class="kwrd"&gt;new&lt;/span&gt; Code(&lt;/font&gt;&lt;span class="str"&gt;&lt;font size="2"&gt;@"&lt;/font&gt;&lt;font size="2"&gt;        function() {&lt;/font&gt;&lt;font size="2"&gt;            emit(1, this.CharCount);&lt;/font&gt;&lt;font size="2"&gt;        }"&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;))&lt;/font&gt;&lt;font size="2"&gt;    .Reduce(&lt;span class="kwrd"&gt;new&lt;/span&gt; Code(&lt;/font&gt;&lt;span class="str"&gt;&lt;font size="2"&gt;@"&lt;/font&gt;&lt;font size="2"&gt;        function(key, values) {&lt;/font&gt;&lt;font size="2"&gt;            var sum = 0;&lt;/font&gt;&lt;font size="2"&gt;            values.forEach(function(prev) {&lt;/font&gt;&lt;font size="2"&gt;                sum += prev;&lt;/font&gt;&lt;font size="2"&gt;            });&lt;/font&gt;&lt;font size="2"&gt;            return sum;&lt;/font&gt;&lt;font size="2"&gt;        }"&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;))&lt;/font&gt;&lt;font size="2"&gt;    .Documents.Single()[&lt;span class="str"&gt;"value"&lt;/span&gt;]);&lt;/font&gt;&lt;font size="2"&gt;    &lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//Using Linq to automatically build the above query. Awesome!!!&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;var linqSum = collection.Linq().Sum(p =&amp;gt; p.CharCount);&lt;/font&gt;&lt;font size="2"&gt;    &lt;/font&gt;&lt;span class="rem"&gt;&lt;font size="2"&gt;//Now imagine about doing this by hand...&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;var stats = from p &lt;span class="kwrd"&gt;in&lt;/span&gt; collection.Linq()&lt;/font&gt;&lt;font size="2"&gt;            &lt;span class="kwrd"&gt;where&lt;/span&gt; p.Comments.Any(c =&amp;gt; c.Email.StartsWith(&lt;span class="str"&gt;"bob"&lt;/span&gt;))&lt;/font&gt;&lt;font size="2"&gt;            group p by p.CharCount &amp;lt; 40 into g&lt;/font&gt;&lt;font size="2"&gt;            select &lt;span class="kwrd"&gt;new&lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;            {&lt;/font&gt;&lt;font size="2"&gt;                LessThan40 = g.Key,&lt;/font&gt;&lt;font size="2"&gt;                Sum = g.Sum(x =&amp;gt; x.CharCount),&lt;/font&gt;&lt;font size="2"&gt;                Count = g.Count(),&lt;/font&gt;&lt;font size="2"&gt;                Average = g.Average(x =&amp;gt; x.CharCount),&lt;/font&gt;&lt;font size="2"&gt;                Min = g.Min(x =&amp;gt; x.CharCount),&lt;/font&gt;&lt;font size="2"&gt;                Max = g.Max(x =&amp;gt; x.CharCount)&lt;/font&gt;&lt;font size="2"&gt;            };&lt;/font&gt;&lt;/div&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;I hope you've seen how easy it is to get started. There is a whole lot more we can talk about, from the proper way to use a document database to the CAP theorem and how it applies. I encourage you to do some digging on your own to find out about some of these ideas. Also, play around with the sample project. Add some fields and try stuff out. It is still a work in progress and so some LINQ functionality may not work as expected. Let us know and we'll do our best to get it resolved.&lt;p&gt;We have a Google group for users to come and ask questions, at &lt;a href="http://groups.google.com/group/mongodb-csharp"&gt;http://groups.google.com/group/mongodb-csharp&lt;/a&gt;. Come and participate and, if you so desire, pull down the source and start helping us out. We truly want this to be a great library for the .NET community that functions off feedback and contributions.&lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;MongoDB: &lt;a href="http://www.mongodb.org/"&gt;http://www.mongodb.org&lt;/a&gt;&lt;li&gt;MongoDB-CSharp: &lt;a href="http://github.com/samus/mongodb-csharp/downloads"&gt;http://github.com/samus/mongodb-csharp/downloads&lt;/a&gt;&lt;li&gt;MongoDB-CSharp Group: &lt;a href="http://groups.google.com/group/mongodb-csharp"&gt;http://groups.google.com/group/mongodb-csharp&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Author&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href="http://www.codeproject.com/Members/Craig-G-Wilson"&gt;Craig G. Wilson&lt;/a&gt;&amp;nbsp; (United States)&lt;/b&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/erwin/aggbug/1907142.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/erwin/archive/2010/12/15/1907142.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/erwin/archive/2010/12/15/1906717.html</id><title type="text">HP大中华区总裁孙振耀退休感言</title><summary type="text">如果这篇文章没有分享给你，那是我的错。如果这篇文章分享给你了，你却没有读，继续走弯路的你不要怪我。如果你看了这篇文章，只读了一半你就说没时间了，说明你已经是个“茫”人了。如果你看完了，你觉得这篇文章只...</summary><published>2010-12-15T06:32:00Z</published><updated>2010-12-15T06:32:00Z</updated><author><name>xerwin</name><uri>http://www.cnblogs.com/erwin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/erwin/archive/2010/12/15/1906717.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/erwin/archive/2010/12/15/1906717.html"/><content type="html">&lt;p&gt;如果这篇文章没有分享给你，那是我的错。&lt;br&gt;如果这篇文章分享给你了，你却没有读，继续走弯路的你不要怪我。&lt;br&gt;如果你看了这篇文章，只读了一半你就说没时间了，说明你已经是个“茫”人了。&lt;br&gt;如果你看完了，你觉得这篇文章只是讲讲大道理，说明你的人生阅历还不够，需要你把这篇文章珍藏，走出去碰几年壁，头破血流后再回来，再读，你就会感叹自己的年少无知。&lt;br&gt;如果你看完了，觉得很有道理，然后束之高阁，继续走进拥挤的地铁，依然用着自己昨日的观念来思考自己的未来，你的人生也将继续重复着昨日的状况。&lt;br&gt;如果你看完了，觉得那是一个过来人，对你的人生忠告，并你也愿意用他告诉你的思想去指导自己今后的生活，对你来讲成功不是很难，难的是你是否可以用这篇文章里的思想一直鞭策自己。&lt;br&gt;如果你看完了，觉得那是一个长辈用他的一生的时间来写的一篇对你忠告的文章，说明你已经有了和他相似的人生阅历，只要你继续努力，成就伟业并不难，难的是你是否可以把自己的人生经验和他人分享呢？&lt;br&gt;体验决定深度，知识决定广度。你的人生是什么呢？  &lt;p&gt;&lt;strong&gt;一、关于工作与生活 &lt;/strong&gt; &lt;p&gt;我有个有趣的观察，外企公司多的是25-35岁的白领，40岁以上的员工很少，二三十岁的外企员工是意气风发的，但外企公司40岁附近的经理人是很尴尬的。我见过的40岁附近的外企经理人大多在一直跳槽，最后大多跳到民企，比方说，唐骏。外企员工的成功很大程度上是公司的成功，并非个人的成功，西门子的确比国美大，但并不代表西门子中国经理比国美的老板强，甚至可以说差得很远。而进外企的人往往并不能很早理解这一点，把自己的成功90％归功于自己的能力，实际上，外企公司随便换个中国区总经理并不会给业绩带来什么了不起的影响。好了问题来了，当这些经理人40多岁了，他们的薪资要求变得很高，而他们的才能其实又不是那么出众，作为外企公司的老板，你会怎么选择？有的是只要不高薪水的，要出位的精明强干精力充沛的年轻人，有的是，为什么还要用你？  &lt;p&gt;从上面这个例子，其实可以看到我们的工作轨迹，二三十岁的时候，生活的压力还比较小，身体还比较好，上面的父母身体还好，下面又没有孩子，不用还房贷，也没有孩子要上大学，当个外企小白领还是很光鲜的，挣得不多也够花了。但是人终归要结婚生子，终归会老，到了40岁，父母老了，要看病要吃药，要有人看护，自己要还房贷，要过基本体面的生活，要养小孩……那个时候需要挣多少钱才够花才重要。所以，看待工作，眼光要放远一点，一时的谁高谁低并不能说明什么。  &lt;p&gt;从这个角度上来说，我不太赞成过于关注第一份工作的薪水，更没有必要攀比第一份工作的薪水，这在刚刚出校园的学生中间是很常见的。正常人大概要工作 35年，这好比是一场马拉松比赛，和真正的马拉松比赛不同的是，这次比赛没有职业选手，每个人都只有一次机会。要知到，有很多人甚至坚持不到终点，大多数人最后是走到终点的，只有少数人是跑过终点的，因此在刚开始的时候，去抢领先的位置并没有太大的意义。刚进社会的时候如果进500强公司，大概能拿到3k -6k/月的工资，有些特别技术的人才可能可以到8k/月，可问题是，5年以后拿多少？估计5k-10k了不起了。起点虽然高，但增幅有限，而且，后面的年轻人追赶的压力越来越大。  &lt;p&gt;我前两天问我的一个销售，你会的这些东西一个新人2年就都学会了，但新人所要求的薪水却只是你的一半，到时候，你怎么办？&lt;br&gt;职业生涯就像一场体育比赛，有初赛、复赛、决赛。初赛的时候大家都刚刚进社会，大多数都是实力一般的人，这时候努力一点认真一点很快就能让人脱颖而出，于是有的人二十多岁做了经理，有的人迟些也终于赢得了初赛，三十多岁成了经理。然后是复赛，能参加复赛的都是赢得初赛的，每个人都有些能耐，在聪明才智上都不成问题，这个时候再想要胜出就不那么容易了，单靠一点点努力和认真还不够，要有很强的坚忍精神，要懂得靠团队的力量，要懂得收服人心，要有长远的眼光……  &lt;p&gt;看上去赢得复赛并不容易，但，还不是那么难。因为这个世界的规律就是给人一点成功的同时让人骄傲自满，刚刚赢得初赛的人往往不知道自己赢得的仅仅是初赛，有了一点小小的成绩大多数人都会骄傲自满起来，认为自己已经懂得了全部，不需要再努力再学习了，他们会认为之所以不能再进一步已经不是自己的原因了。虽然他们仍然不好对付，但是他们没有耐性，没有容人的度量，更没有清晰长远的目光。就像一只愤怒的斗牛，虽然猛烈，最终是会败的，而赢得复赛的人则象斗牛士一样，不急不躁，跟随着自己的节拍，慢慢耗尽对手的耐心和体力。赢得了复赛以后，大约已经是一位很了不起的职业经理人了，当上了中小公司的总经理，大公司的副总经理，主管着每年几千万乃至几亿的生意。  &lt;p&gt;最终的决赛来了，说实话我自己都还没有赢得决赛，因此对于决赛的决胜因素也只能凭自己的猜测而已，这个时候的输赢或许就像武侠小说里写得那样，大家都是高手，只能等待对方犯错了，要想轻易击败对手是不可能的，除了使上浑身解数，还需要一点运气和时间。世界的规律依然发挥着作用，赢得复赛的人已经不只是骄傲自满了，他们往往刚愎自用，听不进去别人的话，有些人的脾气变得暴躁，心情变得浮躁，身体变得糟糕，他们最大的敌人就是他们自己，在决赛中要做的只是不被自己击败，等着别人被自己击败。这和体育比赛是一样的，最后高手之间的比赛，就看谁失误少谁就赢得了决赛。  &lt;p&gt;&lt;strong&gt;二、 根源&lt;/strong&gt;  &lt;p&gt;你工作快乐么？你的工作好么？  &lt;p&gt;有没有觉得干了一段时间以后工作很不开心？有没有觉得自己入错了行？有没有觉得自己没有得到应有的待遇？有没有觉得工作像一团乱麻每天上班都是一种痛苦？有没有很想换个工作？有没有觉得其实现在的公司并没有当初想象得那么好？有没有觉得这份工作是当初因为生存压力而找的，实在不适合自己？你从工作中得到你想要得到的了么？你每天开心么？  &lt;p&gt;天涯上愤怒的人很多，你有没有想过，你为什么不快乐？你为什么愤怒？  &lt;p&gt;其实，你不快乐的根源，是因为你不知道要什么！你不知道要什么，所以你不知道去追求什么，你不知道追求什么，所以你什么也得不到。  &lt;p&gt;我总觉得，职业生涯首先要关注的是自己，自己想要什么？大多数人大概没想过这个问题，唯一的想法只是——我想要一份工作，我想要一份不错的薪水，我知道所有人对于薪水的渴望，可是，你想每隔几年重来一次找工作的过程么？你想每年都在这种对于工作和薪水的焦急不安中度过么？不想的话，就好好想清楚。饮鸩止渴，不能因为口渴就拼命喝毒药。越是焦急，越是觉得自己需要一份工作，越饥不择食，越想不清楚，越容易失败，你的经历越来越差，下一份工作的人看着你的简历就皱眉头。于是你越喝越渴，越渴越喝，陷入恶性循环。最终只能哀叹世事不公或者生不逢时，只能到天涯上来发泄一把，在失败者的共鸣当中寻求一点心理平衡罢了。大多数人都有生存压力，我也是，有生存压力就会有很多焦虑，积极的人会从焦虑中得到动力，而消极的人则会因为焦虑而迷失方向。所有人都必须在压力下做出选择，这就是世道，你喜欢也罢不喜欢也罢。  &lt;p&gt;一般我们处理的事情分为重要的事情和紧急的事情，如果不做重要的事情就会常常去做紧急的事情。比如锻炼身体保持健康是重要的事情，而看病则是紧急的事情。如果不锻炼身体保持健康，就会常常为了病痛烦恼。又比如防火是重要的事情，而救火是紧急的事情，如果不注意防火，就要常常救火。找工作也是如此，想好自己究竟要什么是重要的事情，找工作是紧急的事情，如果不想好，就会常常要找工作。往往紧急的事情给人的压力比较大，迫使人们去赶紧做，相对来说重要的事情反而没有那么大的压力，大多数人做事情都是以压力为导向的，压力之下，总觉得非要先做紧急的 事情，结果就是永远到处救火，永远没有停歇的时候。（很多人的工作也像是救火队一样忙碌痛苦，也是因为工作中没有做好重要的事情。）那些说自己活在水深火热为了生存顾不上那么多的朋友，今天找工作困难是当初你们没有做重要的事情，是结果不是原因。如果今天你们还是因为急于要找一份工作而不去思考，那么或许将来要继续承受痛苦找工作的结果。  &lt;p&gt;我始终觉得我要说的话题，沉重了点，需要很多思考，远比唐笑打武警的话题来的枯燥乏味，但是，天下没有轻松的成功，成功，要付代价。请先忘记一切的生存压力，想想这辈子你最想要的是什么？所以，最要紧的事情，先想好自己想要什么。  &lt;p&gt;&lt;strong&gt;三、什么是好工作&lt;/strong&gt;  &lt;p&gt;当初微软有个唐骏，很多大学里的年轻人觉得这才是他们向往的职业生涯，我在清华bbs里发的帖子被这些学子们所不屑，那个时候学生们只想出国或者去外企，不过如今看来，我还是对的，唐骏去了盛大，陈天桥创立的盛大，一家民营公司。一个高学历的海归在500强的公司里拿高薪水，这大约是很多年轻人的梦想，问题是，每年毕业的大学生都在做这个梦，好的职位却只有500个。  &lt;p&gt;人都是要面子的，也是喜欢攀比的，即使在工作上也喜欢攀比，不管那是不是自己想要的。大家认为外企公司很好，可是好在哪里呢？好吧，他们在比较好的写字楼，这是你想要的么？他们出差住比较好的酒店，这是你想要的么？别人会羡慕一份外企公司的工作，这是你想要的么？那一切都是给别人看的，你干吗要活得那么辛苦给别人看？另一方面，他们薪水福利一般，并没有特别了不起，他们的晋升机会比较少，很难做到很高阶的主管，他们虽然厌恶常常加班，却不敢不加班，因为“你不干有得是人干”，大部分情况下会找个台湾人香港人新加坡人来管你，而这些人又往往有些莫名其妙的优越感。你想清楚了么？500强一定好么？找工作究竟是考虑你想要什么，还是考虑别人想看什么？  &lt;p&gt;我的大学同学们大多数都到美国了，甚至毕业这么多年了，还有人最近到国外去了。出国真的有那么好么？我的大学同学们，大多数还是在博士、博士后、访问学者地挣扎着，至今只有一个正经在一个美国大学里拿到个正式的教职。国内的教授很难当么？我有几个表亲也去了国外了，他们的父母独自在国内，没有人照顾，有好几次人在家里昏倒都没人知道，出国，真的这么光彩么？就像有人说的“很多事情就像看A片，看的人觉得很爽，做的人未必。”  &lt;p&gt;人总想找到那个最好的，可是，什么是最好的？你觉得是最好的那个，是因为你的确了解，还是因为别人说他是最好的？即使他对于别人是最好的，对于你也一定是最好的么？  &lt;p&gt;对于自己想要什么，自己要最清楚，别人的意见并不是那么重要。很多人总是常常被别人的意见所影响，亲戚的意见，朋友的意见，同事的意见……问题是，你究竟是要过谁的一生？人的一生不是父母一生的续集，也不是儿女一生的前传，更不是朋友一生的外篇，只有你自己对自己的一生负责，别人无法也负不起这个责任。自己做的决定，至少到最后，自己没什么可后悔。对于大多数正常智力的人来说，所做的决定没有大的对错，无论怎么样的选择，都是可以尝试的。比如你没有考自己上的那个学校，没有入现在这个行业，这辈子就过不下去了？就会很失败？不见得。  &lt;p&gt;我想，好工作，应该是适合你的工作，具体点说，应该是能给你带来你想要的东西的工作，你或许应该以此来衡量你的工作究竟好不好，而不是拿公司的大小，规模，外企还是国企，是不是有名，是不是上市公司来衡量。小公司，未必不是好公司，赚钱多的工作，也未必是好工作。你还是要先弄清楚你想要什么，如果你不清楚你想要什么，你就永远也不会找到好工作，因为你永远只看到你得不到的东西，你得到的，都是你不想要的。  &lt;p&gt;可能，最好的，已经在你的身边，只是，你还没有学会珍惜。人们总是盯着得不到的东西，而忽视了那些已经得到的东西。  &lt;p&gt;&lt;strong&gt;四、普通人&lt;/strong&gt;  &lt;p&gt;我发现中国人的励志和国外的励志存在非常大的不同，中国的励志比较鼓励人立下大志愿，卧薪尝胆，有朝一日成富成贵。而国外的励志比较鼓励人勇敢面对现实生活，面对普通人的困境，虽然结果也是成富成贵，但起点不一样，相对来说，我觉得后者在操作上更现实，而前者则需要用999个失败者来堆砌一个成功者的故事。  &lt;p&gt;我们都是普通人，普通人的意思就是，概率这件事是很准的。因此，我们不会买彩票中500万，我们不会成为比尔盖茨或者李嘉诚，我们不会坐飞机掉下来，我们当中很少的人会创业成功，我们之中有30％的人会离婚，我们之中大部分人会活过65岁……  &lt;p&gt;所以请你在想自己要什么的时候，要得“现实”一点，你说我想要做李嘉诚，抱歉，我帮不上你。成为比尔盖茨或者李嘉诚这种人，是靠命的，看我写的这篇文章绝对不会让你成为他们，即使你成为了他们，也绝对不是我这篇文章的功劳。“王侯将相宁有种乎”但真正当皇帝的只有一个人，王侯将相，人也不多。目标定得高些对于喜欢挑战的人来说有好处，但对于大多数普通人来说，反而比较容易灰心沮丧，很容易就放弃了。  &lt;p&gt;回过头来说，李嘉诚比你有钱大致50万倍，他比你更快乐么？或许。有没有比你快乐50万倍，一定没有。他比你最多也就快乐一两倍，甚至有可能还不如你快乐。寻找自己想要的东西不是和别人比赛，比谁要得更多更高，比谁的目标更远大。虽然成为李嘉诚这个目标很宏大，但你并不见得会从这个目标以及追求目标的过程当中获得快乐，而且基本上你也做不到。你必须听听你内心的声音，寻找真正能够使你获得快乐的东西，那才是你想要的东西。  &lt;p&gt;你想要的东西，或者我们把它称之为目标，目标其实并没有高低之分，你不需要因为自己的目标没有别人远大而不好意思，达到自己的目标其实就是成功，成功有大有小，快乐却是一样的。我们追逐成功，其实追逐的是成功带来的快乐，而非成功本身。职业生涯的道路上，我们常常会被攀比的心态蒙住眼睛，忘记了追求的究竟是什么，忘记了是什么能使我们更快乐。  &lt;p&gt;社会上一夜暴富的新闻很多，这些消息，总会在我们的心里面掀起很多涟漪，涟漪多了就变成惊涛骇浪，心里的惊涛骇浪除了打翻承载你目标的小船，并不会使得你也一夜暴富。“只见贼吃肉，不见贼挨揍。”我们这些普通人既没有当贼的勇气，又缺乏当贼的狠辣绝决，虽然羡慕吃肉，却更害怕挨揍，偶尔看到几个没挨揍的贼就按奈不住，或者心思活动，或者大感不公，真要叫去做贼，却也不敢。  &lt;p&gt;我还是过普通人的日子，要普通人的快乐，至少，晚上睡得着觉。  &lt;p&gt;&lt;strong&gt;五、跳槽与积累&lt;/strong&gt;  &lt;p&gt;首先要说明，工作是一件需要理智的事情，所以不要在工作上耍个性，天涯上或许会有人觉得你很有个性而叫好，煤气公司电话公司不会因为觉得你很有个性而免了你的帐单。当你很帅地炒掉了你的老板，当你很酷地挖苦了一番招聘的HR，账单还是要照付，只是你赚钱的时间更少了，除了你自己，没人受损失。  &lt;p&gt;我并不反对跳槽，但跳槽决不是解决问题的办法，而且频繁跳槽的后果是让人觉得没有忠诚度可言，而且不能安心工作。现在很多人从网上找工作，很多找工作的网站常常给人出些馊主意，要知道他们是盈利性企业，当然要从自身盈利的角度来考虑，大家越是频繁跳槽频繁找工作他们越是生意兴隆，所以鼓动人们跳槽是他们的工作。所以他们会常常告诉你，你拿的薪水少了，你享受的福利待遇差了，又是“薪情快报”又是“赞叹自由奔放的灵魂”。至于是否会因此让你不能安心，你跳了槽是否解决问题，是否更加开心，那个，他们管不着。  &lt;p&gt;要跳槽肯定是有问题，一般来说问题发生了，躲是躲不开的，很多人跳槽是因为这样或者那样的不开心，如果这种不开心，在现在这个公司不能解决，那么在下一个公司多半也解决不掉。你必须相信，90%的情况下，你所在的公司并没有那么烂，你认为不错的公司也没有那么好。就像围城里说的，“城里的人拼命想冲出来，而城外的人拼命想冲进去。”每个公司都有每个公司的问题，没有问题的公司是不存在的。换个环境你都不知道会碰到什么问题，与其如此，不如就在当下把问题解决掉。很多问题当你真的想要去解决的时候，或许并没有那么难。有的时候你觉得问题无法解决，事实上，那只是“你觉得”。  &lt;p&gt;人生的曲线应该是曲折向上的，偶尔会遇到低谷但大趋势总归是曲折向上的，而不是象脉冲波一样每每回到起点，我见过不少面试者，30多岁了，四五份工作经历，每次多则3年，少则1年，30多岁的时候回到起点从一个初级职位开始干起，拿基本初级的薪水，和20 多岁的年轻人一起竞争，不觉得有点辛苦么？这种日子好过么？  &lt;p&gt;资本靠的就是积累，这种积累包括人际关系，经验，人脉，口碑……如果常常更换行业，代表几年的积累付之东流，一切从头开始，如果换了两次行业，35岁的时候大概只有5年以下的积累，而一个没有换过行业的人至少有了10年的积累，谁会占优势？工作到2-3年的时候，很多人觉得工作不顺利，好像到了一个瓶颈，心情烦闷，就想辞职，乃至换一个行业，觉得这样所有一切烦恼都可以抛开，会好很多。其实这样做只是让你从头开始，到了时候还是会发生和原来行业一样的困难，熬过去就向上跨了一大步，要知道每个人都会经历这个过程，每个人的职业生涯中都会碰到几个瓶颈，你熬过去了而别人没有熬过去你就领先了。跑长跑的人会知道，开始的时候很轻松，但是很快会有第一次的难受，但过了这一段又能跑很长一段，接下来会碰到第二次的难受，坚持过了以后又能跑一段，如此往复，难受一次比一次厉害，直到坚持不下去了。大多数人第一次就坚持不了了，一些人能坚持到第二次，第三次虽然大家都坚持不住了，可是跑到这里的人也没几个了，这点资本足够你安稳活这一辈子了。  &lt;p&gt;一份工作到两三年的时候，大部分人都会变成熟手，这个时候往往会陷入不断的重复，有很多人会觉得厌倦，有些人会觉得自己已经搞懂了一切，从而懒得去寻求进步了。很多时候的跳槽是因为觉得失去兴趣了，觉得自己已经完成比赛了。其实这个时候比赛才刚刚开始，工作两三年的人，无论是客户关系，人脉，手下，和领导的关系，在业内的名气……还都是远远不够的，但稍有成绩的人总是会自我感觉良好的，每个人都觉得自己跟客户关系铁得要命，觉得自己在业界的口碑好得很。其实可以肯定地说，一定不是，这个时候，还是要拿出前两年的干劲来，稳扎稳打，积累才刚刚开始。  &lt;p&gt;你足够了解你的客户吗？你知道他最大的烦恼是什么吗？你足够了解你的老板么？你知道他最大的烦恼是什么吗？你足够了解你的手下么？你知道他最大的烦恼是什么吗？如果你不知道，你凭什么觉得自己已经积累够了？如果你都不了解，你怎么能让他们帮你的忙，做你想让他们做的事情？如果他们不做你想让他们做的事情，你又何来的成功？  &lt;p&gt;&lt;strong&gt;六、等待&lt;/strong&gt;  &lt;p&gt;这是个浮躁的人们最不喜欢的话题，本来不想说这个话题，因为会引起太多的争论，而我又无意和人争论这些，但是考虑到对于职业生涯的长久规划，这是一个躲避不了的话题，还是决定写一写，不爱看的请离开吧。  &lt;p&gt;并不是每次穿红灯都会被汽车撞，并不是每个罪犯都会被抓到，并不是每个错误都会被惩罚，并不是每个贪官都会被枪毙，并不是你的每一份努力都会得到回报，并不是你的每一次坚持都会有人看到，并不是你每一点付出都能得到公正的回报，并不是你的每一个善意都能被理解……这个，就是世道。好吧，世道不够好，可是，你有推翻世道的勇气么？如果没有，你有更好的解决办法么？有很多时候，人需要一点耐心，一点信心。每个人总会轮到几次不公平的事情，而通常，安心等待是最好的办法。  &lt;p&gt;有很多时候我们需要等待，需要耐得住寂寞，等待属于你的那一刻。周润发等待过，刘德华等待过，周星驰等待过，王菲等待过，张艺谋也等待过……看到了他们如今的功成名就的人，你可曾看到当初他们的等待和耐心？你可曾看到金马奖影帝在街边摆地摊？你可曾看到德云社一群人在剧场里给一位观众说相声？你可曾看到周星驰的角色甚至连一句台词都没有？每一个成功者都有一段低沉苦闷的日子，我几乎能想象得出来他们借酒浇愁的样子，我也能想象得出他们为了生存而挣扎的窘迫。在他们一生最中灿烂美好的日子里，他们渴望成功，但却两手空空，一如现在的你。没有人保证他们将来一定会成功，而他们的选择是耐住寂寞。如果当时的他们总念叨着“成功只是属于特权阶级的”，你觉得他们今天会怎样？  &lt;p&gt;曾经我也不明白有些人为什么并不比我有能力却要坐在我的头上，年纪比我大就一定要当我的领导么？为什么有些烂人不需要努力就能赚钱？为什么刚刚改革开放的时候的人能那么容易赚钱，而轮到我们的时候，什么事情都要正规化了？有一天我突然想，我还在上学的时候他们就在社会里挣扎奋斗了，他们在社会上奋斗积累了十几二十年，我们新人来了，他们有的我都想要，我这不是在要公平，我这是在要抢劫。因为我要得太急，因为我忍不住寂寞。二十多岁的男人，没有钱，没有事业，却有蓬勃的欲望。  &lt;p&gt;人总是会遇到挫折的，人总是会有低潮的，人总是会有不被人理解的时候的，人总是有要低声下气的时候，这些时候恰恰是人生最关键的时候，因为大家都会碰到挫折，而大多数人过不了这个门槛，你能过，你就成功了。在这样的时刻，我们需要耐心等待，满怀信心地去等待，相信，生活不会放弃你，机会总会来的。至少，你还年轻，你没有坐牢，没有生治不了的病，没有欠还不起的债。比你不幸的人远远多过比你幸运的人，你还怕什么？路要一步步走，虽然到达终点的那一步很激动人心，但大部分的脚步是平凡甚至枯燥的，但没有这些脚步，或者耐不住这些平凡枯燥，你终归是无法迎来最后的那些激动人心。  &lt;p&gt;逆境，是上帝帮你淘汰竞争者的地方。要知道，你不好受，别人也不好受，你坚持不下去了，别人也一样，千万不要告诉别人你坚持不住了，那只能让别人获得坚持的信心，让竞争者看着你微笑的面孔，失去信心，退出比赛。胜利属于那些有耐心的人。  &lt;p&gt;在最绝望的时候，我会去看电影《The Pursuit of Happyness》《Jerry Maguire》，让自己重新鼓起勇气，因为，无论什么时候，我们总还是有希望。当所有的人离开的时候，我不失去希望，我不放弃。每天下班坐在车里，我喜欢哼着《隐形的翅膀》看着窗外，我知道，我在静静等待，等待属于我的那一刻。  &lt;p&gt;&lt;strong&gt;七、入对行跟对人&lt;/strong&gt;  &lt;p&gt;在中国，大概很少有人是一份职业做到底的，虽然如此，第一份工作还是有些需要注意的地方，有两件事情格外重要，第一件是入行，第二件事情是跟人。第一份工作对人最大的影响就是入行，现代的职业分工已经很细，我们基本上只能在一个行业里成为专家，不可能在多个行业里成为专家。很多案例也证明即使一个人在一个行业非常成功，到另外一个行业，往往完全不是那么回事情，“你想改变世界，还是想卖一辈子汽水？”是乔布斯邀请百事可乐总裁约翰•斯考利加盟苹果时所说的话，结果这位在百事非常成功的约翰，到了苹果表现平平。其实没有哪个行业特别好，也没有哪个行业特别差，或许有报道说哪个行业的平均薪资比较高，但是他们没说的是，那个行业的平均压力也比较大。看上去很美的行业一旦进入才发现很多地方其实并不那么完美，只是外人看不见。  &lt;p&gt;说实话，我自己都没有发大财，所以我的建议只是让人快乐工作的建议，不是如何发大财的建议，我们只讨论一般普通打工者的情况。我认为选择什么行业并没有太大关系，看问题不能只看眼前。比如，从前年开始，国家开始整顿医疗行业，很多医药公司开不下去，很多医药行业的销售开始转行。其实医药行业的不景气是针对所有公司的，并非针对一家公司，大家的日子都不好过，这个时候跑掉是非常不划算的，大多数正规的医药公司即使不做新生意撑个两三年总是能撑的，大多数医药销售靠工资撑个两三年也是可以撑的，国家不可能永远捏着医药行业不放的，两三年以后光景总归还会好起来的，那个时候别人都跑了而你没跑，那时的日子应该会好过很多。有的时候觉得自己这个行业不行了，问题是，再不行的行业，做得人少了也变成了好行业，当大家都觉得不好的时候，往往却是最好的时候。大家都觉得金融行业好，金融行业门槛高不说，有多少人削尖脑袋要钻进去，竞争激励，进去以后还要时时提防，一个疏忽，就被后来的人给挤掉了，压力巨大，又如何谈得上快乐？也就未必是 “好”工作了。  &lt;p&gt;太阳能这个东西至今还不能进入实际应用的阶段，但是中国已经有7家和太阳能有关的公司在纽交所上市了，国美苏宁永乐其实是贸易型企业，也能上市，鲁泰纺织连续10年利润增长超过50%，卖茶的一茶一座，卖衣服的海澜之家都能上市……其实选什么行业真的不重要，关键是怎么做。事情都是人做出来的，关键是人。  &lt;p&gt;有一点是需要记住的，这个世界上，有史以来直到我们能够预见得到的未来，成功的人总是少数，有钱的人总是少数，大多数人是一般的，普通的，不太成功的。因此，大多数人的做法和看法，往往都不是距离成功最近的做法和看法。因此大多数人说好的东西不见得好，大多数人说不好的东西不见得不好。大多数人都去炒股的时候说明跌只是时间问题，大家越是热情高涨的时候，跌的日子越近。大多数人买房子的时候，房价不会涨，而房价涨的差不多的时候，大多数人才开始买房子。不会有这样一件事情让大家都变成功，发了财，历史上不曾有过，将来也不会发生。有些东西即使一时运气好得到了，还是会在别的时候别的地方失去的。  &lt;p&gt;年轻人在职业生涯的刚开始，尤其要注意的是，要做对的事情，不要让自己今后几十年的人生总是提心吊胆，更不值得为了一份工作赔上自己的青春年华。我的公司是个不行贿的公司，以前很多人不理解，甚至自己的员工也不理解，不过如今，我们是同行中最大的企业，客户乐意和我们打交道，尤其是在国家打击腐败的时候，每个人都知道我们做生意不给钱的名声，都敢于和我们做生意。而勇于给钱的公司，不是倒了，就是跑了，要不就是每天睡不好觉，人还是要看长远一点。很多时候，看起来最近的路，其实是最远的路，看起来最远的路，其实是最近的路。  &lt;p&gt;跟对人是说，入行后要跟个好领导好老师，刚进社会的人做事情往往没有经验，需要有人言传身教。对于一个人的发展来说，一个好领导是非常重要的。所谓“好”的标准，不是他让你少干活多拿钱，而是以下三个。  &lt;p&gt;首先，好领导要有宽广的心胸，如果一个领导每天都会发脾气，那几乎可以肯定他不是个心胸宽广的人，能发脾气的时候却不发脾气的领导，多半是非常厉害的领导。中国人当领导最大的毛病是容忍不了能力比自己强的人，所以常常可以看到的一个现象是，领导很有能力，手下一群庸才或者手下一群闲人。如果看到这样的环境，还是不要去的好。  &lt;p&gt;其次，领导要愿意从下属的角度来思考问题，这一点其实是从面试的时候就能发现的，如果这位领导总是从自己的角度来考虑问题，几乎不听你说什么，这就危险了。从下属的角度来考虑问题并不代表同意下属的说法，但他必须了解下属的立场，下属为什么要这么想，然后他才有办法说服你，只关心自己怎么想的领导往往难以获得下属的信服。  &lt;p&gt;第三，领导敢于承担责任，如果出了问题就把责任往下推，有了功劳就往自己身上揽，这样的领导不跟也罢。选择领导，要选择关键时刻能抗得住的领导，能够为下属的错误买单的领导，因为这是他作为领导的责任。  &lt;p&gt;有可能，你碰不到好领导，因为，中国的领导往往是屁股决定脑袋的领导，因为他坐领导的位置，所以他的话就比较有道理，这是传统观念官本位的误区，可能有大量的这种无知无能的领导，只是，这对于你其实是好事，如果将来有一天你要超过他，你希望他比较聪明还是比较笨？相对来说这样的领导其实不难搞定，只是你要把自己的身段放下来而已。多认识一些人，多和比自己强的人打交道，同样能找到好的老师，不要和一群同样郁闷的人一起控诉社会，控诉老板，这帮不上你，只会让你更消极。和那些比你强的人打交道，看他们是怎么想的，怎么做的，学习他们，然后跟更强的人打交道。  &lt;p&gt;&lt;strong&gt;八、选择&lt;/strong&gt;  &lt;p&gt;我们每天做的最多的事情，其实是选择，因此在谈职业生涯的时候不得不提到这个话题。  &lt;p&gt;我始终认为，在很大的范围内，我们究竟会成为一个什么样的人，决定权在我们自己，每天我们都在做各种各样的选择，我可以不去写这篇文章，去别人的帖子拍拍砖头，也可以写下这些文字，帮助别人的同时也整理自己的思路，我可以多注意下格式让别人易于阅读，也可以写成一堆，我可以就这样发上来，也可以在发以前再看几遍，你可以选择不刮胡子就去面试，也可以选择出门前照照镜子……每天，每一刻我们都在做这样那样的决定，我们可以漫不经心，也可以多花些心思，成千上万的小选择累计起来，就决定了最终我们是个什么样的人。  &lt;p&gt;从某种意义上来说我们的未来不是别人给的，是我们自己选择的，很多人会说我命苦啊，没得选择阿，如果你认为“去微软还是去IBM”“上清华还是上北大”“当销售副总还是当厂长”这种才叫选择的话，的确你没有什么选择，大多数人都没有什么选择。但每天你都可以选择是否为客户服务更周到一些，是否对同事更耐心一些，是否把工作做得更细致一些，是否把情况了解得更清楚一些，是否把不清楚的问题再弄清楚一些……你也可以选择在是否在痛苦中继续坚持，是否抛弃掉自己的那些负面的想法，是否原谅一个人的错误，是否相信我在这里写下的这些话，是否不要再犯同样的错误……生活每天都在给你选择的机会，每天都在给你改变自己人生的机会，你可以选择赖在地上撒泼打滚，也可以选择咬牙站起来。你永远都有选择。有些选择不是立杆见影的，需要累积，比如农民可以选择自己常常去浇地，也可以选择让老天去浇地，诚然你今天浇水下去苗不见得今天马上就长出来，但常常浇水，大部分苗终究会长出来的，如果你不浇，收成一定很糟糕。  &lt;p&gt;每天生活都在给你机会，他不会给你一叠现金也不会拱手送你个好工作，但实际上，他还是在给你机会。我的家庭是一个普通的家庭，没有任何了不起的社会关系，我的父亲在大学毕业以后就被分配到了边疆，那个小县城只有一条马路，他们那一代人其实比我们更有理由抱怨，他们什么也没得到，年轻的时候文化大革命，书都没得读，支援边疆插队落户，等到老了，却要给年轻人机会了。他有足够的理由象成千上万那样的青年一样坐在那里抱怨生不逢时，怨气冲天。然而在分配到边疆的十年之后，国家恢复招研究生，他考回了原来的学校。研究生毕业，他被分配到了安徽一家小单位里，又是3年以后，国家第一届招收博士生，他又考回了原来的学校，成为中国第一代博士，那时的他比现在的我年纪还大。生活并没有放弃他，他也没有放弃生活。10年的等待，他做了他自己的选择，他没有放弃，他没有破罐子破摔，所以时机到来的时候，他改变了自己的人生。你最终会成为什么样的人，就决定在你的每个小小的选择之间。  &lt;p&gt;你选择相信什么？你选择和谁交朋友？你选择做什么？你选择怎么做？……我们面临太多的选择，而这些选择当中，意识形态层面的选择又远比客观条件的选择来得重要得多，比如选择做什么产品其实并不那么重要，而选择怎么做才重要。选择用什么人并不重要，而选择怎么带这些人才重要。大多数时候选择客观条件并不要紧，大多数关于客观条件的选择并没有对错之分，要紧的是选择怎么做。一个大学生毕业了，他要去微软也好，他要卖猪肉也好，他要创业也好，他要做游戏代练也好，只要不犯法，不害人，都没有什么关系，要紧的是，选择了以后，怎么把事情做好。  &lt;p&gt;除了这些，你还可以选择时间和环境，比如，你可以选择把这辈子最大的困难放在最有体力最有精力的时候，也可以走一步看一步，等到了40岁再说，只是到了40 多岁，那正是一辈子最脆弱的时候，上有老下有小，如果在那个时候碰上了职业危机，实在是一件很苦恼的事情。与其如此不如在20多岁30多岁的时候吃点苦，好让自己脆弱的时候活得从容一些。你可以选择在温室里成长，也可以选择到野外磨砺，你可以选择在办公室吹冷气的工作，也可以选择40度的酷热下，去见你的客户，只是，这一切最终会累积起来，引导你到你应得的未来。  &lt;p&gt;我不敢说所有的事情你都有得选择，但是绝大部分事情你有选择，只是往往你不把这当作一种选择。认真对待每一次选择，才会有比较好的未来。  &lt;p&gt;&lt;strong&gt;九、选择职业&lt;/strong&gt;  &lt;p&gt;职业的选择，总的来说，无非就是销售、市场、客服、物流、行政、人事、财务、技术、管理几个大类，有个有趣的现象就是，500强的CEO当中最多的是销售出身，第二多的人是财务出身，这两者加起来大概超过95%。现代IT行业也有技术出身成为老板的，但实际上，后来他们还是从事了很多销售和市场的工作，并且表现出色，公司才获得了成功，完全靠技术能力成为公司老板的，几乎没有。这是有原因的，因为销售就是一门跟人打交道的学问，而管理其实也是跟人打交道的学问，这两者之中有很多相通的东西，他们的共同目标就是“让别人去做某件特定的事情。”而财务则是从数字的层面了解生意的本质，从宏观上看待生意的本质，对于一个生意是否挣钱，是否可以正常运作有着最深刻的认识。  &lt;p&gt;公司小的时候是销售主导公司，而公司大的时候是财务主导公司，销售的局限性在于只看人情不看数字，财务的局限性在于只看数字不看人情。公司初期，运营成本低，有订单就活得下去，跟客户也没有什么谈判的条件，别人肯给生意做已经谢天谢地了，这个时候订单压倒一切，客户的要求压倒一切，所以当然要顾人情。公司大了以后，一切都要规范化，免得因为不规范引起一些不必要的风险，同时运营成本也变高，必须提高利润率，把有限的资金放到最有产出的地方。对于上市公司来说，股东才不管你客户是不是最近出国，最近是不是那个省又在搞严打，到了时候就要把业绩拿出来，拿不出来就抛股票，这个时候就是数字压倒一切。  &lt;p&gt;前两天听到有人说一句话觉得很有道理，开始的时候我们想“能做什么？”，等到公司做大了有规模了，我们想“不能做什么。”很多人在工作中觉得为什么领导这么保守，这也不行那也不行，错过很多机会。很多时候是因为，你还年轻，你想的是“能做什么”，而作为公司领导要考虑的方面很多，他比较关心“不能做什么”。  &lt;p&gt;我并非鼓吹大家都去做销售或者财务，究竟选择什么样的职业，和你究竟要选择什么样的人生有关系，有些人就喜欢下班按时回家，看看书听听音乐，那也挺好，但就不适合找个销售的工作了，否则会是折磨自己。有些人就喜欢出风头，喜欢成为一群人的中心，如果选择做财务工作，大概也干不久，因为一般老板不喜欢财务太积极，也不喜欢财务话太多。先想好自己要过怎样的人生，再决定要找什么样的职业。有很多的不快乐，其实是源自不满足，而不满足，很多时候是源自于心不定，而心不定则是因为不清楚究竟自己要什么，不清楚要什么的结果就是什么都想要，结果什么都没得到。  &lt;p&gt;我想，我们还是因为生活而工作，不是因为工作而生活，生活是最要紧的，工作只是生活中的一部分。我总是觉得生活的各方方面都是相互影响的，如果生活本身一团乱麻，工作也不会顺利。所以要有娱乐、要有社交、要锻炼身体，要有和睦的家庭……最要紧的，要开心，我的两个销售找我聊天，一肚子苦水，我问他们，2年以前，你什么都没有，工资不高，没有客户关系，没有业绩，处于被开的边缘，现在的你比那时条件好了很多，为什么现在却更加不开心了？如果你做得越好越不开心，那你为什么还要工作？首先的首先，人还是要让自己高兴起来，让自己心态好起来，这种发自内心的改变会让你更有耐心，更有信心，更有气质，更能包容……否则，看看镜子里的你，你满意么？  &lt;p&gt;有人会说，你说得容易，我每天加班，不加班老板就会把我炒掉，每天累得要死，哪有时间娱乐、社交、锻炼？那是人们把目标设定太高的缘故，如果你还在动不动就会被老板炒掉的边缘，那么你当然不能设立太高的目标，难道你还想每天去打高尔夫？你没时间去健身房锻炼身体，但是上下班的时候多走几步可以吧，有楼梯的时候走走楼梯不走电梯可以吧？办公的间隙扭扭脖子拉拉肩膀做做俯卧撑可以吧？谁规定锻炼就一定要拿出每天2个小时去健身房？你没时间社交，每月参加郊游一次可以吧，周末去参加个什么音乐班，绘画班之类的可以吧，去尝试认识一些同行，和他们找机会交流交流可以吧？开始的时候总是有些难的，但迈出这一步就会向良性循环的方向发展。而每天工作得很苦闷，剩下的时间用来咀嚼苦闷，只会陷入恶性循环，让生活更加糟糕。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/erwin/aggbug/1906717.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/erwin/archive/2010/12/15/1906717.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/erwin/archive/2010/05/31/1748407.html</id><title type="text">[缓存]软件测试之验收测试</title><summary type="text"> Acceptance testing（验收测试），系统开发生命周期方法论的一个阶段，这时相关的用户和／或独立测试人员根据测试计划和结果对系统进行测试和接收。它让系统用户决定是否接收系统。它是一项确定产品是否能够满足合同或用户所规定需求的测试。这是管理性和防御性控制。</summary><published>2010-05-31T09:36:00Z</published><updated>2010-05-31T09:36:00Z</updated><author><name>xerwin</name><uri>http://www.cnblogs.com/erwin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/erwin/archive/2010/05/31/1748407.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/erwin/archive/2010/05/31/1748407.html"/><content type="text"> Acceptance testing（验收测试），系统开发生命周期方法论的一个阶段，这时相关的用户和／或独立测试人员根据测试计划和结果对系统进行测试和接收。它让系统用户决定是否接收系统。它是一项确定产品是否能够满足合同或用户所规定需求的测试。这是管理性和防御性控制。</content></entry><entry><id>http://www.cnblogs.com/erwin/archive/2010/04/07/1706032.html</id><title type="text">C++数据类型与C#对应关系</title><summary type="text">C++数据类型与C#对应关系</summary><published>2010-04-07T02:23:00Z</published><updated>2010-04-07T02:23:00Z</updated><author><name>xerwin</name><uri>http://www.cnblogs.com/erwin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/erwin/archive/2010/04/07/1706032.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/erwin/archive/2010/04/07/1706032.html"/><content type="text">C++数据类型与C#对应关系</content></entry><entry><id>http://www.cnblogs.com/erwin/archive/2010/04/07/1706025.html</id><title type="text">Mastering structs in C#</title><summary type="text">As structs are aggregates of any other data type you care to invent, learning how to work with them is important, and provides an excellent grounding in tackling wider problems. </summary><published>2010-04-07T02:19:00Z</published><updated>2010-04-07T02:19:00Z</updated><author><name>xerwin</name><uri>http://www.cnblogs.com/erwin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/erwin/archive/2010/04/07/1706025.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/erwin/archive/2010/04/07/1706025.html"/><content type="text">As structs are aggregates of any other data type you care to invent, learning how to work with them is important, and provides an excellent grounding in tackling wider problems. </content></entry><entry><id>http://www.cnblogs.com/erwin/archive/2009/09/24/1573243.html</id><title type="text">Windows 2008 Server 常用配置</title><summary type="text">Windows server 2008初期设置大部分内容并非原创，都是从网络上收集回来的以下是安装完2008后 个人推荐的一些设置，设置的衷旨是增强易用性，面向普通家用户，注重外观的朋友【1】备份激活文件\Windows\System32\licensing\pkeyconfig\pkeyconfig.xrm-ms\Windows\ServiceProfiles\NetworkService\Ap...</summary><published>2009-09-24T05:30:00Z</published><updated>2009-09-24T05:30:00Z</updated><author><name>xerwin</name><uri>http://www.cnblogs.com/erwin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/erwin/archive/2009/09/24/1573243.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/erwin/archive/2009/09/24/1573243.html"/><content type="text">Windows server 2008初期设置大部分内容并非原创，都是从网络上收集回来的以下是安装完2008后 个人推荐的一些设置，设置的衷旨是增强易用性，面向普通家用户，注重外观的朋友【1】备份激活文件\Windows\System32\licensing\pkeyconfig\pkeyconfig.xrm-ms\Windows\ServiceProfiles\NetworkService\Ap...</content></entry><entry><id>http://www.cnblogs.com/erwin/archive/2009/07/24/1529811.html</id><title type="text">[缓存]迅雷(XUNLEI)的工作原理揭密</title><summary type="text">当你用迅雷下载东西时，无论你是从迅雷资源页点下载，还是从其它普通页面点下载，你会发现它并不只用你的原始链接下载，它还搜索了一些其它服务器的相同资源，比起网络蚂蚁/网际快车之类的下载工具（这些都是纯客户端工具，而迅雷则有着服务器支持），大大增加成功下载的可能性和下载的速度，对比起P2P之类的下载软件，又更干净利落一些，那它是如何做到的呢？</summary><published>2009-07-23T18:18:00Z</published><updated>2009-07-23T18:18:00Z</updated><author><name>xerwin</name><uri>http://www.cnblogs.com/erwin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/erwin/archive/2009/07/24/1529811.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/erwin/archive/2009/07/24/1529811.html"/><content type="text">当你用迅雷下载东西时，无论你是从迅雷资源页点下载，还是从其它普通页面点下载，你会发现它并不只用你的原始链接下载，它还搜索了一些其它服务器的相同资源，比起网络蚂蚁/网际快车之类的下载工具（这些都是纯客户端工具，而迅雷则有着服务器支持），大大增加成功下载的可能性和下载的速度，对比起P2P之类的下载软件，又更干净利落一些，那它是如何做到的呢？</content></entry><entry><id>http://www.cnblogs.com/erwin/archive/2009/07/24/1529809.html</id><title type="text">[缓存]迅雷下载的原理——P2SP加速技术</title><summary type="text">迅雷下载的原理——P2SP加速技术</summary><published>2009-07-23T18:11:00Z</published><updated>2009-07-23T18:11:00Z</updated><author><name>xerwin</name><uri>http://www.cnblogs.com/erwin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/erwin/archive/2009/07/24/1529809.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/erwin/archive/2009/07/24/1529809.html"/><content type="text">迅雷下载的原理——P2SP加速技术</content></entry></feed>
