<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_QA MichaelPeng</title><subtitle type="text">一个QA的零零碎碎</subtitle><id>http://feed.cnblogs.com/blog/u/33534/rss</id><updated>2011-05-13T09:12:11Z</updated><author><name>Michael Peng</name><uri>http://www.cnblogs.com/MichaelPeng/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/MichaelPeng/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/33534/rss"/><entry><id>http://www.cnblogs.com/MichaelPeng/archive/2011/05/13/spell_checker_markov.html</id><title type="text">用马尔科夫模型做拼写检查</title><summary type="text">用马尔科夫模型来做拼写检查</summary><published>2011-05-13T09:12:00Z</published><updated>2011-05-13T09:12:00Z</updated><author><name>Michael Peng</name><uri>http://www.cnblogs.com/MichaelPeng/</uri></author><link rel="alternate" href="http://www.cnblogs.com/MichaelPeng/archive/2011/05/13/spell_checker_markov.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/MichaelPeng/archive/2011/05/13/spell_checker_markov.html"/><content type="html">&lt;p&gt;原理和原文见 Peter Norvig的&lt;a title="这篇文章" href="http://norvig.com/spell-correct.html"&gt;这篇文章&lt;/a&gt;&lt;/p&gt;&lt;p&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;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;re,&amp;nbsp;collections,&amp;nbsp;sys,&amp;nbsp;random&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;def&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;words(text):&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;re.findall(&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;[a-z]+&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;text.lower())&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;def&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;defaultdict_factoryn(n,&amp;nbsp;default):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;n&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;lambda&lt;/span&gt;&lt;span style="color: #000000"&gt;:&amp;nbsp;default&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;lambda&lt;/span&gt;&lt;span style="color: #000000"&gt;:&amp;nbsp;collections.defaultdict(defaultdict_factoryn(n&lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;default))&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;def&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;multidict_set(d,&amp;nbsp;l,&amp;nbsp;v):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curd&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;d;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ele&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;l:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;len(l):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curd[ele]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;v&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curd&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;curd[ele]&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;def&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;multidict_add(d,&amp;nbsp;l,&amp;nbsp;v):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curd&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;d;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ele&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;l:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;len(l):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curd[ele]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;v&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curd&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;curd[ele]&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;def&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;multidict_get(d,&amp;nbsp;l):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curd&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;d;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ele&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;l:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curd&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;curd[ele]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;curd&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;def&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;train(features,&amp;nbsp;n):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;model&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;collections.defaultdict(defaultdict_factoryn(n,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;prevlen&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;n&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;prev&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;collections.deque()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;f&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;features:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(len(prev)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;prevlen):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;prev.append(f)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;continue&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;multidict_add(model,&amp;nbsp;prev,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;prev.popleft()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;prev.append(f)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;model&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;def&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;most_likely(prev):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;l&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;multidict_get(Model,&amp;nbsp;prev)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;not&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;l:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;""&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;l&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;l.items()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;len(l)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;0:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;""&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;l&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;sorted(l,&amp;nbsp;cmp&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;lambda&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;x,&amp;nbsp;y:y[&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;x[&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;min(len(l)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;10&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;l[random.randint(0,&amp;nbsp;count)][0]&lt;br /&gt;&lt;br /&gt;stage&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;Model&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;train(words(file(&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;big.txt&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;).read()),&amp;nbsp;stage&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;def&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;train_1(features):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;model&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;collections.defaultdict(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;lambda&lt;/span&gt;&lt;span style="color: #000000"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;f&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;features:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;model[f]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;model&lt;br /&gt;&lt;br /&gt;NWORDS&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;train_1(words(file(&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;big.txt&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;).read()))&lt;br /&gt;&lt;br /&gt;alphabet&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;abcdefghijklmnopqrstuvwxyz&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;def&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;edits1(word):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;splits&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;[(word[:i],&amp;nbsp;word[i:])&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;range(len(word)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;deletes&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;[a&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;b[&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;:]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;a,&amp;nbsp;b&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;splits&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;b]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;transposes&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;[a&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;b[&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;b[0]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;b[&lt;/span&gt;&lt;span style="color: #000000"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;:]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;a,&amp;nbsp;b&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;splits&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;len(b)&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;replaces&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;[a&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;c&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;b[&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;:]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;a,&amp;nbsp;b&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;splits&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;c&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;alphabet&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;b]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;inserts&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;[a&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;c&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;a,&amp;nbsp;b&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;splits&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;c&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;alphabet]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;set(deletes&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;transposes&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;replaces&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;inserts)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;def&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;known_edits2(word):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;set(e2&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;e1&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;edits1(word)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;e2&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;edits1(e1)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;e2&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;NWORDS)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;def&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;known(words):&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;set(w&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;w&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;words&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;w&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;NWORDS)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;def&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;correct(prev,&amp;nbsp;word):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;print&amp;nbsp;[(c,&amp;nbsp;NWORDS.get(c))&amp;nbsp;for&amp;nbsp;c&amp;nbsp;in&amp;nbsp;candidates]&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;len(prev)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;stage:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;candidates&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;known([word])&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;or&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;known(edits1(word))&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;or&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;known_edits2(word)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;or&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;set([word])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;max(candidates,&amp;nbsp;key&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;NWORDS.get)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;candidates&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;known([word])&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;|&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;known(edits1(word))&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;|&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;known_edits2(word)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;|&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;set([word])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;max(candidates,&amp;nbsp;key&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;lambda&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;x:multidict_get(Model,&amp;nbsp;prev&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;[x]))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;print&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;correct([&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;i&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;],&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ove&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;print&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;correct([],&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ove&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/MichaelPeng/aggbug/2045701.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/MichaelPeng/archive/2011/05/13/spell_checker_markov.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/MichaelPeng/archive/2011/04/29/Enterprise_software_is_boring.html</id><title type="text">商业软件编程很无聊(转载)</title><summary type="text">商业编程很无聊</summary><published>2011-04-29T03:07:00Z</published><updated>2011-04-29T03:07:00Z</updated><author><name>Michael Peng</name><uri>http://www.cnblogs.com/MichaelPeng/</uri></author><link rel="alternate" href="http://www.cnblogs.com/MichaelPeng/archive/2011/04/29/Enterprise_software_is_boring.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/MichaelPeng/archive/2011/04/29/Enterprise_software_is_boring.html"/><content type="html">&lt;p&gt;原文是ThoughtWorks一哥们在06年写的&lt;a title="But Martin, Enterprise Software IS Boring" href="http://ravimohan.blogspot.com/2006/07/but-martin-enterprise-software-is.html"&gt;But Martin, Enterprise Software IS Boring&lt;/a&gt;，中文世界里Google前几页主要都是g9的那篇 &lt;a title="商业软件编程很无聊 " href="http://blog.csdn.net/g9yuayon/archive/2006/09/18/1236675.aspx"&gt;商业软件编程很无聊 &lt;/a&gt;，没找到原文译本&lt;/p&gt;&lt;p&gt;因原文在墙外，就拷贝到墙内一份&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="word-spacing: 0px; font: medium 'Times New Roman'; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; text-indent: 14px; line-height: 22px; font-family: 'Trebuchet MS', verdana, sans-serif"&gt; &lt;/p&gt;&lt;h3 class="post-title entry-title" style="font-weight: bold; font-size: 20px"&gt;But Martin, Enterprise Software IS Boring&lt;/strong&gt;&lt;/p&gt;&lt;div class="post-header"&gt;&lt;div class="post-header-line-1"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="post-body entry-content" id="post-body-115414569030224797"&gt;Martin Fowler&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;a style="color: rgb(0,0,255); text-decoration: none" href="http://martinfowler.com/bliki/CustomerAffinity.html"&gt;writes about&lt;/a&gt;&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;Customer Affinity, a factor he believes distinguishes a good enterprise developer from a bad one. So far,so good. &lt;p&gt;He says "I've often heard it said that enterprise software is boring, just shuffling data around, that people of talent will do "real" software that requires fancy algorithms, hardware hacks, or plenty of math."&lt;/p&gt;&lt;p&gt;This is almost exactly what I say.(Just remove the quotes around "real" ;-) ).&lt;/p&gt;&lt;p&gt;Martin goes on to disagree with this idea (which is fine) but then he says "I feel that this usually happens due to a lack of customer affinity." And this is where I disagree.&lt;/p&gt;&lt;p&gt;People who work on things like compilers and hardware hacks and "tough" algorithmic problems can have customers, just as the enterprise folks do. I know I have. The compiler I am writing now has a customer. The massively parallel neural network classifier framework I wrote a couple of years ago had a customer. The telecom fraud detection classifier cluster I worked on last year (along with some other talented programmers) is being used by a company which is very business (and customer) oriented. So the idea that a "customer" (and thus customer affinity) is restricted only to those folks who write database backed web apps is simply not true.&lt;/p&gt;&lt;p&gt;Math/algorithms/hardware hacks and the presence or absence of a "customer" (and thus, customer affinity) are orthogonal (you know, two axes at 90 degrees to each other) issues.&lt;/p&gt;&lt;p&gt;With the customer issue out of the way, let us examine the core issue - the notion that talented developers would&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;em&gt;prefer&lt;/em&gt;to do stuff like compilers and algorithms instead of a business app (by which I mean something like automating the loan disbursal processes of a bank).&lt;/p&gt;&lt;p&gt;The best way to get a sense of the truth is to examine the (desired) flow of people in both directions. I know dozens of people who are very very good at writing business software who yearn wistfully for a job doing "plumbing" like compilers and tcp/ip stacks, but I've never yet seen someone who is very very good at writing a compiler or operating system (and can make money doing so) desperately trying to get back to the world of banking software. A programmer might code enterprise apps for money, but at night, at home, he'll still hack on a compiler.&lt;/p&gt;&lt;p&gt;It's kind of a "Berlin Wall" effect. In the days of the cold war, to cut through the propoganda of whether Communism was better than Capitalism , all you had to do was to observe in which direction people were trying to breach the Berlin Wall. Hundreds of people risked their lives to cross from the East to the West but practically no one went the other way. Of course this could just mean that the folks didn't appreciate the virtues of people's power and the harangues of the comissars but I somehow doubt it.&lt;/p&gt;&lt;p&gt;To see whether living in India is better than living In Bangladesh (or whether living in the United States is better than living in India) look at who is trying to cross the barriers and in which direction.&lt;/p&gt;&lt;p&gt;Economic Theory suggests another way of finding an answer. Suppose you were offered say 10,000$ a month for say 2 years, to develop the best business app you can imagine and say, 8000 $ a month, for the same two years to work on the best systems/research project you can imagine. Which one would you choose? Now invert the payment for each type of work. Change the amounts till you can't decide one way or another and your preference for either job is equal. Finding this point of indifference (actually it is an "indifference curve") will teach you about your preference for "enterprise over systems". I believe that while individuals will choose many possible points as their "points of indifference" on that curve, a majority of the most talented debvelopers would prefer a lower pay for a good systems/research project in preference to an enterprise project, no matter how interesting. And to most developers, an enterprise project becomes interesting to the degree it needs "tough programming" skills (massively scalable databases say.. there is a good reason Amazon and Google emphasize algorithms , maths and other "plumbing" skills in their interviews and an equally good reason why a Wipro or a TCS doesn't bother testing for these skills).&lt;/p&gt;&lt;p&gt;The widespread (though not universal) preference of the very best software developers for "plumbing" over "enterprise" holds even inside Thoughtworks (where Martin works and where I once worked). I know&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;em&gt;dozens&lt;/em&gt;&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;of Thoughtworkers who'd prefer to work in "core tech". While I was working for TW, the CEO,Roy Singham, periodically raised the idea of venturing into embedded and other non enterprise software and a large majority of developers (which invariably included most of the best devs) wanted this to happen. Sadly, this never actually came to pass.&lt;/p&gt;&lt;p&gt;A good number of thoughtworkers do business software to put bread on the table, or while working towards being good enough to write "plumbing", but in their heart, they yearn to hack a kernel or program a robot. (Another group of people dream about starting their own web appp companies). For most of these folks tomorrow never quite arrives, but some of the most "businessy" developers in Thoughtworks dream of writing game engines one day or learning deep math vodoo or earning an MS or PhD. And good people have left TW for all these reasons. And if this is the situation at arguably the best enterprise app development company (at least in the "consultants" subspace) one can imagine the situation in "lesser" companies.&lt;/p&gt;&lt;p&gt;The programmer who has the&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;u&gt;ability&lt;/u&gt;&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;to develop business software&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;u&gt;and&lt;/u&gt;&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;"plumbing" software and&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;em&gt;&lt;u&gt;chooses&lt;/u&gt;&lt;/em&gt;&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;to do business app development is so rare as to be almost non existent. Of course, most business app dev types are in no condition to even contemplate writing "hard stuff" but that is a topic for another day.&lt;/p&gt;&lt;p&gt;Paul Graham (admittedly a biased source) says (emphasis mine),&lt;/p&gt;&lt;p&gt;&lt;em&gt;"It's pretty easy to say what kinds of problems are not interesting: those where instead of solving a few big, clear, problems, you have to solve a lot of nasty little ones....Another is when you have to customize something for an individual client's complex and ill-defined needs. To hackers these kinds of projects are the death of a thousand cuts.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;The distinguishing feature of nasty little problems is that you don't learn anything from them. Writing a compiler is interesting because it teaches you what a compiler is. But writing an interface to a buggy piece of software doesn't teach you anything, because the bugs are random. [3] So it's not just fastidiousness that makes good hackers avoid nasty little problems.&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;u&gt;It's more a question of self-preservation. Working on nasty little problems makes you stupid.&lt;/u&gt;&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;Good hackers avoid it for the same reason models avoid cheeseburgers."&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Strangely enough, I heard Martin talk about the same concept (from a more positive view point, of course) when he last spoke in Bangalore. He explained how much of the complexity of business software is essentially arbitrary - how an arcane union regulation about paying overtime for one man going bear hunting on Thanksgiving can wreck the beauty of a software architecture. Martin said that this is what is fascinating about business software. But he and Paul essentially agree about business software being about arbitrariness. It is a strange sense of aesthetics that finds beauty in arbitrariness, but who am I to say it isn't valid?&lt;/p&gt;&lt;p&gt;Modulo these ideas, I agree with a lot of what Martin says in his blog post. The most significant sentence is&lt;/p&gt;&lt;p&gt;&lt;em&gt;"The real intellectual challenge of business software is figuring out where what the real contribution of software can be to a business. You need both good technical and business knowledge to find that."&lt;/em&gt;&lt;/p&gt;&lt;p&gt;This is so true it needs repeating. And I have said this before.To write good banking sofwtare, for e.g. you need a deep knowledge of banking AND (say) the j2ee stack. Unfortunately the "projects and consultants" part of business software development doesn't quite work this way. I will go out on a limb here and say that software consulting companies *in general* (with the rare honorable exception blah blah ) have "business analysts" who are not quite good enough to be managers in the enterprises they consult for and "developers" who are not quite good enough to be "hackers" (in the Paul Graham sense).&lt;/p&gt;&lt;p&gt;Of course factoring in "outsourcing" makes the picture worse. By the time a typical business app project comes to India, most, if not all of the vital decisions have been made and the project moves offshore only to take advantage of low cost programmers, no matter what the company propoganda says about "worldwide talent", so at least in India this kind of "figuring out" is almost non existent and is replaced by an endless grind churning out jsp pages or database tables or whatever. It is hard to figure out the contribution of your software to people and businesses located half a world away, no matter how many "distributed agilists" or "offshore business analysts" you throw into the equation.&lt;/p&gt;&lt;p&gt;This is true for non businessy software also,though to a much lesser degree. The kind of work outsourced to India is still the non essential "grind" type (though often way less boring than their "enterprise" equivalents). The&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;em&gt;core&lt;/em&gt;&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;of Oracle's database software for .e.g. is not designed or implemented in India. Neither is the&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;em&gt;core&lt;/em&gt;&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;of Yahoo's multiple software offerings - the maintenance is, development is not. And contary to what many Indians say, this is NOT about the "greedy white man's" exploiting the cheap brown skins. You need to do hard things and prove yourself before you are taken seriously. Otherwise people WILL see you as cheap drone workers. That's just the way of the world).&lt;/p&gt;&lt;p&gt;And I say this as someone who is deeply interested in business. T'is not that I loved business less but I loved programming more :-).I'd rather read code than abusiness magazine but I prefer a business magazine to say, fashion news. I actually LIKE reading about new business models. I read every issue of The Harvard Business Review (thanks Mack) and have dozens of businessy books on my book shelf along with all the technical books. (I gave away all (300 + books) of my J2EE/dotNet/agile/enterpise dev type book collection , but that is a different story). I am working through books on finance and investing and logistics. I have friends who did their MBA in Corporate Strategy from Dartmouth or are studying in Harvard (or plan to do so). I have friends who work for McKinsey, and Bain and Co, and Booz and Allen, and Lehman Brothers. If I were 10 years younger (and thus had a few extra years to live), I'd probably do an MBA myself. And of course I have spent 10 years (too long, oh, too long) doing "enterprise" software. In my experience (which could turn out to be atypical),the "plumbing" software&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;em&gt;&lt;u&gt;is&lt;/u&gt;&lt;/em&gt;&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;way tougher and waaaaay more intellectually meaningful than enterprise software, even of the hardest kind. I&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;em&gt;might&lt;/em&gt;&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;enjoy an MBA, but I will NEVER work in the outsourced business app development industry again even if I have to starve on the streets of Bangalore. I'll kill myself first. So, yeah I am prejudiced. :-). Take everything I say with appropriate dosages of salt.&lt;/p&gt;&lt;p&gt;And just so I am clear, I do NOT think Martin is deliberately obfuscating issues. I think Martin is the rare individual who&lt;em&gt;actually&lt;/em&gt;&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;chooses enterprise software over systems software and is lucky enough to consistently find himself working with the best minds and in a position to figure out the business impact of the code he writes. This is very different from the position of the average "coding body", especially when he is selected more for being cheap than because he knows anything useful ("worldwide talent", remember :-) ).&lt;/p&gt;&lt;p&gt;Btw, Martin's use of the word "plumbing" is&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;em&gt;not&lt;/em&gt;&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;used in a derogatory sense (though I've seen some pseudo "hackers" take it that way, especially since the word makes a not-so-occasional appearnce in many of his speeches) but more in the sense of "infrastructure". If you are such a "hacker" offended by the use of the term, substitute "infrastructure" for "plumbing" in his article. That takes the blue collar imagery and sting out of that particular word, fwiw.&lt;/p&gt;&lt;p&gt;I think Martin has very many valuable things to say. I just think he is slightly off base in this blog post and so I respectfully disagree with some of his conclusions.&lt;/p&gt;&lt;p&gt;But then again, it could all be me being crazy. Maybe enterprise software is&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;em&gt;really&lt;/em&gt;&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;as fascinating as systems software, and writing a banking or leasing or insurance app&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;em&gt;really&lt;/em&gt;&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;as interesting as writing a compiler or operating system.(and Unicorns exist , and pigs can fly).&lt;/p&gt;&lt;p&gt;Hmmmm. Maybe. Meanwhile I'm halfway under the wall and have to come up on the other side before dawn. Back to digging.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt; &lt;img src="http://www.cnblogs.com/MichaelPeng/aggbug/2032530.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/MichaelPeng/archive/2011/04/29/Enterprise_software_is_boring.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/MichaelPeng/archive/2011/03/16/1986063.html</id><title type="text">VS2010 Debugger bug</title><summary type="text">版本：vs2010，vs2010 sp1现象: debugger不能正确处理局部变量的作用域示例代码:int_tmain(intargc,_TCHAR*argv[]){inti=5;intsum=0;for(inti=0;i&lt;10;++i){sum+=i;}printf("%d\n",i);return0;}在return语句处设置断点，可以看到printf输入为5,而watch中i值为10,10为循环语句中i的值，此处的i应为main函数中的i，值为5</summary><published>2011-03-16T07:03:00Z</published><updated>2011-03-16T07:03:00Z</updated><author><name>Michael Peng</name><uri>http://www.cnblogs.com/MichaelPeng/</uri></author><link rel="alternate" href="http://www.cnblogs.com/MichaelPeng/archive/2011/03/16/1986063.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/MichaelPeng/archive/2011/03/16/1986063.html"/><content type="html">&lt;p&gt;版本：vs2010，vs2010 sp1&lt;/p&gt;&lt;p&gt;现象: debugger不能正确处理局部变量的作用域&lt;br /&gt;&lt;/p&gt;&lt;p&gt;示例代码:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_tmain(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;argc,&amp;nbsp;_TCHAR&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;argv[])&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;sum&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sum&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;i);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;在return语句处设置断点，可以看到printf输入为5,而watch中i值为10,10为循环语句中i的值，此处的i应为main函数中的i，值为5&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/michaelpeng/vsbug.jpg" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/MichaelPeng/aggbug/1986063.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/MichaelPeng/archive/2011/03/16/1986063.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/MichaelPeng/archive/2011/03/10/Begining_Of_Programming.html</id><title type="text">编程之初</title><summary type="text">大一才摸计算机。计算机概论由谢柏青老师主讲。当时很多理科院系的计算机概论课讲了计算机组成和二进制后就讲fortran,谢老师则不然，讲完基本的计算机原理，先给我们讲了office应用，复制、粘贴、格式刷、excel图表和函数，这些现在司空见惯的东西当时让我们大开眼界，原来计算机还可以这么玩，在宿舍里就成了高手了，学习兴趣大增。此外谢老师没有习惯性的讲fortran,而是由学生自己选学fortran还是c,我们虽然什么都不懂，只是觉得c比fortran时髦一些，就学了c.从以后的经验来看，培养学生的兴趣和尊重学生的选择，谢老师的这两点就直接影响了偶这个码农的命运。 大一下上裘宗燕老师的算法和数据</summary><published>2011-03-10T04:00:00Z</published><updated>2011-03-10T04:00:00Z</updated><author><name>Michael Peng</name><uri>http://www.cnblogs.com/MichaelPeng/</uri></author><link rel="alternate" href="http://www.cnblogs.com/MichaelPeng/archive/2011/03/10/Begining_Of_Programming.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/MichaelPeng/archive/2011/03/10/Begining_Of_Programming.html"/><content type="html">&lt;div&gt;&lt;p&gt;&lt;span style="font-family:SimSun"&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;span style="font-family:SimSun"&gt;大一才摸计算机。计算机概论由谢柏青老师主讲。当时很多理科院系的计算机概论课讲了计算机组成和二进制后就讲&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;fortran,&lt;/span&gt;&lt;span style="font-family: SimSun"&gt;谢老师则不然，讲完基本的计算机原理，先给我们讲了&lt;/span&gt;&lt;span style="font-family: Calibri"&gt;office&lt;/span&gt;&lt;span style="font-family:SimSun"&gt;应用，复制、粘贴、格式刷、&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;excel&lt;/span&gt;&lt;span style="font-family: SimSun"&gt;图表和函数，这些现在司空见惯的东西当时让我们大开眼界，原来计算机还可以这么玩，在宿舍里就成了高手了，学习兴趣大增。此外谢老师没有习惯性的讲&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;fortran,&lt;/span&gt;&lt;span style="font-family: SimSun"&gt;而是由学生自己选学&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;fortran&lt;/span&gt;&lt;span style="font-family:SimSun"&gt;还是&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;c,&lt;/span&gt;&lt;span style="font-family:SimSun"&gt;我们虽然什么都不懂，只是觉得&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;c&lt;/span&gt;&lt;span style="font-family:SimSun"&gt;比&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;fortran&lt;/span&gt;&lt;span style="font-family:SimSun"&gt;时髦一些，就学了&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;c.&lt;/span&gt;&lt;span style="font-family:SimSun"&gt;从以后的经验来看，培养学生的兴趣和尊重学生的选择，谢老师的这两点就直接影响了偶这个码农的命运。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:SimSun"&gt;大一下上裘宗燕老师的算法和数据结构课，把所有编程题都做了一遍，大作业拿&lt;/span&gt;&lt;span style="font-family: Calibri"&gt;TruboC&lt;/span&gt;&lt;span style="font-family:SimSun"&gt;写了一个&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;dos&lt;/span&gt;&lt;span style="font-family:SimSun"&gt;下的编辑器，为写作业还熬过通宵，但学到的东西得到了应用，收获很大。指针不再是&lt;/span&gt;&lt;span style="font-family: Calibri"&gt;C&lt;/span&gt;&lt;span style="font-family:SimSun"&gt;语言课上枯燥的东西，而是直接构建程序功能的利器。链接和数组也不仅仅是课本上的&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;ADT,&lt;/span&gt;&lt;span style="font-family: SimSun"&gt;而会直接影响程序各种操作的性能。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:SimSun"&gt;除了上课，实践是很重要的一点，编程不是苦差事，而是件好玩的事，写程序可以不带任何功利色彩，只为好玩，能给人带来一种简单而纯粹的快乐。回想上大学时干过的事，用&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;TurboC&lt;/span&gt;&lt;span style="font-family: SimSun"&gt;绘制分形，看见一个美丽的图案一点点在你眼前展开，这种震撼是其它快乐无法替代的。写过游戏修改工具，在游戏通关的同时顺便熟悉了&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;windows&lt;/span&gt;&lt;span style="font-family: SimSun"&gt;编程。通过动态跟踪和分析汇编代码，找到注册码的那一刻，除了破坏的快感，对汇编和程序执行的运行时也有了深入了解。想玩象棋，解出《桔中秘》时同时知道了位运算的技巧、&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;alpha-beta&lt;/span&gt;&lt;span style="font-family: SimSun"&gt;剪枝和&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;hash&lt;/span&gt;&lt;span style="font-family:SimSun"&gt;表。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;编程之初，不外乎一个玩字，好玩而已，其它都是副产品。&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/MichaelPeng/aggbug/1979636.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/MichaelPeng/archive/2011/03/10/Begining_Of_Programming.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/MichaelPeng/archive/2011/02/05/BeautyOfProgramming_BuyBooks.html</id><title type="text">编程之美 1.4买书问题常数时间空间解法</title><summary type="text">编程之美1.4买书问题的O(1)时间空间解法</summary><published>2011-02-05T09:22:00Z</published><updated>2011-02-05T09:22:00Z</updated><author><name>Michael Peng</name><uri>http://www.cnblogs.com/MichaelPeng/</uri></author><link rel="alternate" href="http://www.cnblogs.com/MichaelPeng/archive/2011/02/05/BeautyOfProgramming_BuyBooks.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/MichaelPeng/archive/2011/02/05/BeautyOfProgramming_BuyBooks.html"/><content type="html">&lt;div&gt;&lt;div&gt;题目:&amp;nbsp;&lt;/div&gt;&lt;p&gt;在 节假日的时候，书店一般都会做促销活动。由于《哈利波特》系列相当畅销，店长决定通过促销活动来回馈读者。在销售的《哈利波特》平装本系列中，一共有五 卷，用编号0, 1, 2, 3, 4来表示。假设每一卷单独销售均需要8欧元。如果读者一次购买不同的两卷，就可以扣除5%的费用，三卷则更多。假设具体折扣的情况如下：&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;本数 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;折扣&lt;/div&gt;&lt;div&gt;2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;5%&lt;/div&gt;&lt;div&gt;3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;10%&lt;/div&gt;&lt;div&gt;4 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 20%&lt;/div&gt;&lt;div&gt;5 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 25%&lt;/div&gt;&lt;div&gt;在一份订单中，根据购买的卷数以及本书，就会出现可以应用不同折扣规则的情况。但是，一本书只会应用一个折扣规则。比如，读者一共买了两本卷一，一本卷二。那么，可以享受到5%的折扣。另外一本卷一则不能享受折扣。如果有多种折扣，希望能够计算出的总额尽可能的低。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;要求根据这样的需求，设计出算法，能够计算出读者所购买一批书的最低价格。&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;分析:&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;span style="font-family:SimSun"&gt;首先假设五册书分别为&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;A,B,C,D,E,&lt;/span&gt;&lt;span style="font-family:SimSun"&gt;不失一般性可以假设&lt;/span&gt;&lt;span style="font-family: Calibri"&gt;Na&amp;gt;=Nb&amp;gt;=Nc&amp;gt;=Nd&amp;gt;=Ne&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体"&gt;设所有书可以划分为&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;k&lt;/span&gt;&lt;span style="font-family:宋体"&gt;组&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;,&lt;/span&gt;&lt;span style="font-family:宋体"&gt;每组中书不重复&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;,&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体"&gt;则在最优解中有如下性质&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;:&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;1 &lt;/span&gt;&lt;span style="font-family:宋体"&gt;所有只包含一本书的组均只包含同一本书&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family:宋体"&gt;若有两组包含一本书的组包含的书不同&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;,&lt;/span&gt;&lt;span style="font-family:宋体"&gt;则这两组合并&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;,&lt;/span&gt;&lt;span style="font-family:宋体"&gt;能得到更优解&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;,&lt;/span&gt;&lt;span style="font-family:宋体"&gt;与最优解矛盾&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;2&lt;/span&gt;&lt;span style="font-family:宋体"&gt;包含一本书的组只包含&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;A&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family:宋体"&gt;若&lt;/span&gt;&lt;span style="font-family:SimSun"&gt;包含书为&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;A',&lt;/span&gt;&lt;span style="font-family:SimSun"&gt;若&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;Na'==Na,&lt;/span&gt;&lt;span style="font-family:SimSun"&gt;则&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;A,A'&lt;/span&gt;&lt;span style="font-family: SimSun"&gt;对调即可&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family:宋体"&gt;若&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;Na'&amp;lt;Na,&lt;/span&gt;&lt;span style="font-family:宋体"&gt;则必存在某组包含&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;A&lt;/span&gt;&lt;span style="font-family:宋体"&gt;不包含&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;A',&lt;/span&gt;&lt;span style="font-family:宋体"&gt;则将只包含&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;A'&lt;/span&gt;&lt;span style="font-family:宋体"&gt;的组并入该组能得到更优解&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;3&lt;/span&gt;&lt;span style="font-family:宋体"&gt;所有只包含两本书的组均包含相同两本书&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体"&gt;组&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;(A', B'), (A',C')&lt;/span&gt;&lt;span style="font-family:宋体"&gt;折扣&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;0.2&lt;/span&gt;&lt;span style="font-family:宋体"&gt;重组为&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;(A',B',C')&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;与&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;(A)&lt;/span&gt;&lt;span style="font-family:宋体"&gt;折扣&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;0.3&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;4&lt;/span&gt;&lt;span style="font-family:宋体"&gt;包含两本书的组必包含&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;A&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体"&gt;若存在包含一本&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;A&lt;/span&gt;&lt;span style="font-family:宋体"&gt;的组&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;,&lt;/span&gt;&lt;span style="font-family:宋体"&gt;而两本书的组不包含&lt;/span&gt;&lt;span style="font-family: Calibri"&gt;A,&lt;/span&gt;&lt;span style="font-family:宋体"&gt;则合并能得更优解&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体"&gt;若不存在包含一本&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;A&lt;/span&gt;&lt;span style="font-family:宋体"&gt;的组&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;,&lt;/span&gt;&lt;span style="font-family:宋体"&gt;而两本书组包含为&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;A',A'',&lt;/span&gt;&lt;span style="font-family:宋体"&gt;则包含三本书&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;,&lt;/span&gt;&lt;span style="font-family:宋体"&gt;四本组必含&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;A&lt;/span&gt;&lt;span style="font-family:宋体"&gt;而缺&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;A'&lt;/span&gt;&lt;span style="font-family:宋体"&gt;者&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;(A', A''), (AXY), &lt;/span&gt;&lt;span style="font-family:宋体"&gt;折扣&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;0.4&lt;/span&gt;&lt;span style="font-family:宋体"&gt;不如&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;(A''),(AXYA')0.8&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;(A',A''),(AXYZ)&lt;/span&gt;&lt;span style="font-family:宋体"&gt;折扣&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;0.9&lt;/span&gt;&lt;span style="font-family:宋体"&gt;不如&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;(A''),(AXYZA')1.25&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;5 &lt;/span&gt;&lt;span style="font-family:宋体"&gt;包含两本书的组必包含&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;B&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;同上证&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font class="Apple-style-span" face="Calibri"&gt;6&lt;/font&gt;&lt;span style="font-family:宋体"&gt;所有只包含三本书的组均包含相同三本书&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;(A,B,C),(A,B,D)&lt;/span&gt;&lt;span style="font-family:宋体"&gt;折扣&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;0.6,(A,B),(A,B,C,D)&lt;/span&gt;&lt;span style="font-family:宋体"&gt;折扣&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;0.9&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font class="Apple-style-span" face="Calibri"&gt;7&lt;/font&gt;&lt;span style="font-family:宋体"&gt;所有包含三本书的组均包含&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;A&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体"&gt;若存在只包含&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;A&lt;/span&gt;&lt;span style="font-family:宋体"&gt;的组&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;,&lt;/span&gt;&lt;span style="font-family:宋体"&gt;合并得更优&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体"&gt;若存在只包含&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;A, B&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的组&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;(A,B)(XYZ)&lt;/span&gt;&lt;span style="font-family:宋体"&gt;折扣&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;0.4,&lt;/span&gt;&lt;span style="font-family:宋体"&gt;不如&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;(B)(AXYZ)&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;折扣&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;0.8&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体"&gt;若不存在一&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;,&lt;/span&gt;&lt;span style="font-family:宋体"&gt;二本组&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;,&lt;/span&gt;&lt;span style="font-family:宋体"&gt;假设三本书组为&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;(X,Y,Z),&lt;/span&gt;&lt;span style="font-family:宋体"&gt;则必有包含&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;A&lt;/span&gt;&lt;span style="font-family:宋体"&gt;的四本组缺&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;X,(X,Y,Z)(A,A',A'',A''')&lt;/span&gt;&lt;span style="font-family:宋体"&gt;折扣&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;1.1,&lt;/span&gt;&lt;span style="font-family:宋体"&gt;不如&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;(Y,Z),(A,A',A'',A''',X)&lt;/span&gt;&lt;span style="font-family:宋体"&gt;折扣&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;1.35&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font class="Apple-style-span" face="Calibri"&gt;8&lt;/font&gt;&lt;span style="font-family:宋体"&gt;所有包含三本的组均包含&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;B,C&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;同上可证&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font class="Apple-style-span" face="Calibri"&gt;9&lt;/font&gt;&lt;span style="font-family:宋体"&gt;所有包含四本书的组均包含&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;A,B,C&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体"&gt;设&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;XYZW&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;为&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;(ABC)(BCDE)&lt;/span&gt;&lt;span style="font-family:SimSun"&gt;折扣&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;1.1,&lt;/span&gt;&lt;span style="font-family: SimSun"&gt;不如&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;(B,C),(A,B,C,D,E)&lt;/span&gt;&lt;span style="font-family:SimSun"&gt;折扣&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;1.35&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;其它情况同理可证&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font class="Apple-style-span" face="Calibri"&gt;10&lt;/font&gt;&lt;span style="font-family:宋体"&gt;包含五本书与包含三本书情况不会同时出现&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;(A,B,C),(A,B,C,D,E)&lt;/span&gt;&lt;span style="font-family:宋体"&gt;折扣&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;1.55,&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;不如&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;(A,B,C,D),(A,B,C,E)&lt;/span&gt;&lt;span style="font-family:宋体"&gt;折扣&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;1.6&lt;/span&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:宋体"&gt;由以上证明可得如下结论&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:宋体"&gt;每组均包含&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;A,&lt;/span&gt;&lt;span style="font-family:宋体"&gt;所有组数与&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;A&lt;/span&gt;&lt;span style="font-family:宋体"&gt;相同&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:宋体"&gt;所有包含两本及以上的组均包含&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;B,&lt;/span&gt;&lt;span style="font-family:宋体"&gt;组数与&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;B&lt;/span&gt;&lt;span style="font-family:宋体"&gt;同&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:宋体"&gt;所有包含三本及以上的组均包含&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;C,&lt;/span&gt;&lt;span style="font-family:宋体"&gt;组数与&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;C&lt;/span&gt;&lt;span style="font-family:宋体"&gt;同&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: 14px; "&gt;&lt;span style="font-family:宋体"&gt;三&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;,&lt;/span&gt;&lt;span style="font-family:宋体"&gt;五不并存&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;        &lt;p&gt;&amp;nbsp;由此可得解法如下:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('1b5508c4-6d81-4d6c-9abf-a060259ba6e8')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_1b5508c4-6d81-4d6c-9abf-a060259ba6e8" alt="" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_1b5508c4-6d81-4d6c-9abf-a060259ba6e8" onclick="cnblogs_code_hide('1b5508c4-6d81-4d6c-9abf-a060259ba6e8',event)" style="display:none"&gt;&lt;div id="cnblogs_code_open_1b5508c4-6d81-4d6c-9abf-a060259ba6e8" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #0000FF;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;double&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;BuyBook::UNIT_PRICE&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;8&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;double&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;BuyBook::DISCOUNTS[&lt;/span&gt;&lt;span style="color: #800080;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;{&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0.95&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0.9&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0.8&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0.75&lt;/span&gt;&lt;span style="color: #000000;"&gt;};&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;BOOK_KINDS&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;double&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;BuyBook::SearchFast(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;books)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Sort(books);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;g[&lt;/span&gt;&lt;span style="color: #800080;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;books[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;books[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;books[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;books[&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g[&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;books[&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;books[&lt;/span&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g[&lt;/span&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;books[&lt;/span&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;books[&lt;/span&gt;&lt;span style="color: #800080;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g[&lt;/span&gt;&lt;span style="color: #800080;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;books[&lt;/span&gt;&lt;span style="color: #800080;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;t&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;min(g[&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;],&amp;nbsp;g[&lt;/span&gt;&lt;span style="color: #800080;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(t&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g[&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;t;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g[&lt;/span&gt;&lt;span style="color: #800080;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;t;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g[&lt;/span&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;t;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;double&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;sum&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;BOOK_KINDS;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sum&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;g[i]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(i&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;UNIT_PRICE&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;DISCOUNTS[i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;sum;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;/div&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="font-family: 宋体; font-size: 13px; "&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/MichaelPeng/aggbug/1949305.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/MichaelPeng/archive/2011/02/05/BeautyOfProgramming_BuyBooks.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/MichaelPeng/archive/2010/12/27/ABugReportOnVC2010_std_tr1_bind.html</id><title type="text">vc2010 std::tr1 bind库捉虫记</title><summary type="text">1 vc2010 std::tr1 bind库一个bug的剖析。2 用gtest编写测试用例 3 QA在团队中可以起的作用</summary><published>2010-12-27T14:54:00Z</published><updated>2010-12-27T14:54:00Z</updated><author><name>Michael Peng</name><uri>http://www.cnblogs.com/MichaelPeng/</uri></author><link rel="alternate" href="http://www.cnblogs.com/MichaelPeng/archive/2010/12/27/ABugReportOnVC2010_std_tr1_bind.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/MichaelPeng/archive/2010/12/27/ABugReportOnVC2010_std_tr1_bind.html"/><content type="html">&lt;p&gt;前两天发现了&lt;a href="http://www.cnblogs.com/MichaelPeng/archive/2010/12/08/1900682.html"&gt;VC2010 tr1库中bind实现的一个bug&lt;/a&gt;,当时只是作了记录,没有详细分析.但作为一个QA,不找出问题所在实在不算称职,于是就有了这篇捉虫记. &lt;/p&gt;&lt;p&gt;闲言少叙,书归正传,tr1库就不多作介绍了,有兴趣的同学可以去&lt;a href="http://en.wikipedia.org/wiki/C%2B%2B_Technical_Report_1"&gt; wikipedia&lt;/a&gt;上看.bind,顾名思义,就是把参数与函数绑定,以利于我们进行函数式编程,是从boost的&lt;a href="http://www.boost.org/doc/libs/1_45_0/libs/bind/bind.html"&gt;bind&lt;/a&gt;库引入的,对bind不是很了解的可以看陈硕同学的这篇 &lt;/p&gt;&lt;p&gt;&lt;a href="http://blog.csdn.net/Solstice/archive/2008/10/13/3066268.aspx"&gt; 以boost::function和boost:bind取代虚函数&lt;/a&gt; &lt;/p&gt;&lt;p&gt;假定笔者是 vc2010的QA,在做bind的功能测试,开始用&lt;a href="http://code.google.com/p/googletest/"&gt;gtest&lt;/a&gt;写test case, (笔者一般用gtest作为C++测试框架,就写到文章中了,但ms肯定不会用啦.笔者不在ms,请勿对号入座) &lt;/p&gt;&lt;p&gt; 先写几个简单的函数供测试之用. &lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Add(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;left,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;right)&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;left&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;right;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Sub(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;left,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;right)&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;left&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;right;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Mul(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;left,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;right)&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;left&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;right;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;再写测试用例.先是几个简单的&lt;/p&gt;&lt;p&gt;1 把值绑定到函数指针&lt;br /&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000;"&gt;TEST(Bind,&amp;nbsp;FundPtr_Values)&amp;nbsp;&lt;br /&gt;{&amp;nbsp;&lt;br /&gt;auto&amp;nbsp;f0&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;std::tr1::bind(Sub,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&amp;nbsp;&lt;br /&gt;ASSERT_EQ(&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;f0());&amp;nbsp;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2 把值绑定到仿函数&lt;br /&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000;"&gt;TEST(Bind,&amp;nbsp;Functor_Values)&amp;nbsp;&lt;br /&gt;{&amp;nbsp;&lt;br /&gt;auto&amp;nbsp;f0&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;std::tr1::bind(std::minus&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(),&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;6&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&amp;nbsp;&lt;br /&gt;ASSERT_EQ(&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;f0());&amp;nbsp;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;3 把占位符绑定到函数指针&lt;br /&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000;"&gt;TEST(Bind,&amp;nbsp;FuncPtr_Placeholder)&lt;br /&gt;{&lt;br /&gt;auto&amp;nbsp;f0&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;std::tr1::bind(Sub,&amp;nbsp;std::tr1::placeholders::_1,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;8&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;ASSERT_EQ(&lt;/span&gt;&lt;span style="color: #800080;"&gt;12&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;f0(&lt;/span&gt;&lt;span style="color: #800080;"&gt;20&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;4 将占位符绑定到仿函数&lt;br /&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000;"&gt;TEST(Bind,&amp;nbsp;Functor_Placeholder)&lt;br /&gt;{&lt;br /&gt;auto&amp;nbsp;f0&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;std::tr1::bind(std::minus&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(),&amp;nbsp;std::tr1::placeholders::_2,&amp;nbsp;std::placeholders::_1);&lt;br /&gt;ASSERT_EQ(&lt;/span&gt;&lt;span style="color: #800080;"&gt;12&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;f0(&lt;/span&gt;&lt;span style="color: #800080;"&gt;8&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;20&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;运行测试&lt;br /&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000;"&gt;testing::InitGoogleTest(&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;argc,&amp;nbsp;argv);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ret&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;RUN_ALL_TESTS();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;一切OK.&lt;/p&gt;&lt;p&gt; 来个复杂的,将bind返回结果再bind到函数,用于进行高阶函数演算.&lt;/p&gt;&lt;br /&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('80b3268d-276f-4073-a448-5ab584152434')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_80b3268d-276f-4073-a448-5ab584152434" style="display: none;" alt="" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_80b3268d-276f-4073-a448-5ab584152434" onclick="cnblogs_code_hide('80b3268d-276f-4073-a448-5ab584152434',event)"&gt;&lt;div id="cnblogs_code_open_80b3268d-276f-4073-a448-5ab584152434"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000;"&gt;TEST(Bind,&amp;nbsp;SquareDiff_FuncPtr)&lt;br /&gt;{&lt;br /&gt;auto&amp;nbsp;f0&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;std::tr1::bind(Mul,&amp;nbsp;&lt;br /&gt;std::tr1::bind(Add,&amp;nbsp;std::tr1::placeholders::_1,&amp;nbsp;std::tr1::placeholders::_2),&lt;br /&gt;std::tr1::bind(Sub,&amp;nbsp;std::tr1::placeholders::_1,&amp;nbsp;std::tr1::placeholders::_2));&lt;br /&gt;ASSERT_EQ(&lt;/span&gt;&lt;span style="color: #800080;"&gt;16&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;f0(&lt;/span&gt;&lt;span style="color: #800080;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;运行,一切OK,&lt;/p&gt;&lt;p&gt; 再来一个仿函数版本&lt;br /&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('e2865f4f-fa6c-45b9-a93d-ae49145f47a0')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_e2865f4f-fa6c-45b9-a93d-ae49145f47a0" style="display: none;" alt="" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_e2865f4f-fa6c-45b9-a93d-ae49145f47a0" onclick="cnblogs_code_hide('e2865f4f-fa6c-45b9-a93d-ae49145f47a0',event)"&gt;&lt;div id="cnblogs_code_open_e2865f4f-fa6c-45b9-a93d-ae49145f47a0"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000;"&gt;TEST(Bind,&amp;nbsp;Squarediff_Functorptr)&lt;br /&gt;{&lt;br /&gt;auto&amp;nbsp;f0&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;std::tr1::bind(std::multiplies&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(),&lt;br /&gt;std::tr1::bind(std::plus&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(),&amp;nbsp;std::tr1::placeholders::_1,&amp;nbsp;std::tr1::placeholders::_2),&lt;br /&gt;std::tr1::bind(std::minus&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(),&amp;nbsp;std::tr1::placeholders::_1,&amp;nbsp;std::tr1::placeholders::_2));&lt;br /&gt;ASSERT_EQ(&lt;/span&gt;&lt;span style="color: #800080;"&gt;16&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;f0(&lt;/span&gt;&lt;span style="color: #800080;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;编译 , wow,这是啥啊 &lt;/p&gt;&lt;table border="1" width="796"&gt;     &lt;tbody&gt;         &lt;tr&gt;             &lt;td width="794"&gt;             &lt;p&gt;Error&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp; error C2664: 'int std::multiplies&amp;lt;_Ty&amp;gt;::operator ()(const _Ty &amp;amp;,const _Ty &amp;amp;) const' : cannot convert parameter 1 from 'std::tr1::_Bind_fty&amp;lt;_Fty,_Ret,_BindN&amp;gt;' to 'const int &amp;amp;'&amp;nbsp;&amp;nbsp;&amp;nbsp; c:\program files\microsoft visual studio 10.0\vc\include\xxcallobj&amp;nbsp;&amp;nbsp;&amp;nbsp; 13&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp; boostDemo &lt;/p&gt;             &lt;/td&gt;         &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt; 发现问题了, 偶两眼开始放光.&lt;/p&gt;&lt;p&gt;现在就开bug么,不,太早了,总得指明问题在哪儿吧.是编译器还是tr1库实现的问题?怎么办?拿另一个库boost试试,正常&lt;/p&gt;&lt;p&gt;通过就是tr1的问题了&lt;br /&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000;"&gt;TEST(Bind,&amp;nbsp;SquareDiff_BoostFunctor)&lt;br /&gt;{&lt;br /&gt;auto&amp;nbsp;f0&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;boost::bind(std::multiplies&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(),&lt;br /&gt;boost::bind(std::plus&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(),&amp;nbsp;_1,&amp;nbsp;_2),&lt;br /&gt;boost::bind(std::minus&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(),_1,&amp;nbsp;_2));&lt;br /&gt;ASSERT_EQ(&lt;/span&gt;&lt;span style="color: #800080;"&gt;16&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;f0(&lt;/span&gt;&lt;span style="color: #800080;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt; 编译运行,一切正常.&lt;/p&gt;&lt;p&gt;现在可以肯定是tr1库的问题么?还不能.也许对仿函数绑定是boost的扩展而tr1准标准并不支持呢?&lt;/p&gt;&lt;p&gt;打开标准,看bind参数的说明&lt;table border="1" width="796"&gt;     &lt;tbody&gt;         &lt;tr&gt;             &lt;td width="794"&gt;             &lt;p&gt;&lt;strong&gt;template&amp;lt;class F, class T1, class T2, ...., class TN&amp;gt; &lt;/strong&gt;             &lt;/p&gt;             &lt;p&gt;&lt;strong&gt;unspecified bind(F f, T1 t1, T2 t2, ..., TN tN); &lt;/strong&gt;             &lt;/p&gt;             &lt;p&gt;1 Requires: F and Ti shall be CopyConstructible. &lt;strong&gt;INVOKE (f, w1, w2, ..., wN)&lt;/strong&gt; ([3.3]) shall be a valid expression             &lt;/p&gt;             &lt;p&gt;for some values w1, w2, ..., wN.             &lt;/p&gt;             &lt;p&gt;2 Returns: A forwarding call wrapper g with a weak result type ([3.3]). The effect of &lt;strong&gt;g(u1, u2, ..., uM)&lt;/strong&gt; shall             &lt;/p&gt;             &lt;p&gt;be &lt;strong&gt;INVOKE (f, v1, v2, ..., vN, result_of&amp;lt;F cv (V1, V2, ..., VN)&amp;gt;::type)&lt;/strong&gt;, where cv represents             &lt;/p&gt;             &lt;p&gt;the cv-qualifiers of g and the values and types of the bound arguments v1, v2, ..., vN are determined as             &lt;/p&gt;             &lt;p&gt;specified below.             &lt;/p&gt;             &lt;p&gt;&lt;strong&gt;template&amp;lt;class R, class F, class T1, class T2, ...., class TN&amp;gt; &lt;/strong&gt;             &lt;/p&gt;             &lt;p&gt;&lt;strong&gt;unspecified bind(F f, T1 t1, T2 t2, ..., TN tN); &lt;/strong&gt;             &lt;/p&gt;             &lt;p&gt;3 Requires: F and Ti shall be CopyConstructible. &lt;strong&gt;INVOKE (f, w1, w2, ..., wN)&lt;/strong&gt; shall be a valid expression for             &lt;/p&gt;             &lt;p&gt;some values w1, w2, ..., wN.             &lt;/p&gt;             &lt;p&gt;4 Returns: A forwarding call wrapper g with a nested type result_type defined as a synonym for R. The effect of             &lt;/p&gt;             &lt;p&gt;&lt;strong&gt;g(u1, u2, ..., uM)&lt;/strong&gt; shall be &lt;strong&gt;INVOKE (f, v1, v2, ..., vN, R)&lt;/strong&gt;, where the values and types of the bound             &lt;/p&gt;             &lt;p&gt;arguments v1, v2, ..., vN are determined as specified below.             &lt;/p&gt;             &lt;p&gt;5 The values of the bound arguments v1, v2, ..., vN and their corresponding types V1, V2, ..., VN depend on             &lt;/p&gt;             &lt;p&gt;the type of the corresponding argument ti of type Ti in the call to bind and the cv-qualifiers cv of the call wrapper g as             &lt;/p&gt;             &lt;p&gt;follows:             &lt;/p&gt;             &lt;p&gt;&amp;#8212; if ti is of type reference_wrapper&amp;lt;T&amp;gt; the argument is &lt;strong&gt;ti.get()&lt;/strong&gt; and its type Vi is T&amp;amp;;             &lt;/p&gt;             &lt;p&gt;&amp;#8212; if the value of &lt;strong&gt;std::tr1::is_bind_expression&amp;lt;Ti&amp;gt;::value&lt;/strong&gt; is true the argument is ti(u1, u2, ...,             &lt;/p&gt;             &lt;p&gt;uM) and its type Vi is&lt;strong&gt; result_of&amp;lt;Ti cv (U1&amp;amp;, U2&amp;amp;, ..., UM&amp;amp;)&amp;gt;::type&lt;/strong&gt;;             &lt;/p&gt;             &lt;p&gt;&amp;#8212; if the value j of &lt;strong&gt;std::tr1::is_placeholder&amp;lt;Ti&amp;gt;::value&lt;/strong&gt; is not zero the argument is uj and its type Vi is             &lt;/p&gt;             &lt;p&gt;Uj&amp;amp;;             &lt;/p&gt;             &lt;p&gt;&amp;#8212; otherwise the value is ti and its type Vi is Ti cv &amp;amp;. &lt;/p&gt;             &lt;/td&gt;         &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt; 这里参数t,v,W来回出现,挺绕的,书读百遍,其义自现&lt;table border="1" width="796"&gt;     &lt;tbody&gt;         &lt;tr&gt;             &lt;td width="794"&gt;             &lt;p&gt;f为要绑定的函数,其参数为 v1,v2,&amp;#8230;,vN,类型为V1,V2,&amp;#8230;,VN             &lt;/p&gt;             &lt;p&gt;bind 函数参数为t1, t2, &amp;#8230;,tN,类型为T1,T2,&amp;#8230;,TN             &lt;/p&gt;             &lt;p&gt;g 为bind的返回值,参数为参数为u1, u2,&amp;#8230;uM,类型为U1, U2,&amp;#8230;,UM.             &lt;/p&gt;             &lt;p&gt;g(u1, u2,&amp;#8230;uM)会被转发给f,转发效果相当于f(v1, v2, &amp;#8230;,vN)             &lt;/p&gt;             &lt;p&gt;vi 如下确定             &lt;/p&gt;             &lt;ol&gt;                 &lt;li&gt; 如果对应bind函数参数ti类型为reference_wrapper&amp;lt;T&amp;gt;, 则vi为ti.get(),类型为T&amp;amp;                 &lt;/li&gt;                 &lt;li&gt; 如果std::tr1::is_bind_expression&amp;lt;Ti&amp;gt;::value为true,即ti是bind的返回值,则vi为ti(u1,u2,&amp;#8230;uM),类型为result_of&amp;lt;Ti cv(U1&amp;amp;,U2&amp;amp;,&amp;#8230;,UM)&amp;gt;::type                 &lt;/li&gt;                 &lt;li&gt; 如果std::tr1::is_placeholder&amp;lt;Ti&amp;gt;::value非0,则参数vi为uj,类型为 Uj&amp;amp;                 &lt;/li&gt;                 &lt;li&gt; 否则vi值为ti,类型为Ti cv&amp;amp;&lt;/li&gt;             &lt;/ol&gt;             &lt;/td&gt;         &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt; 现在就很明了了,一个bind的返回值r1可以作为另一个bind的参数a1,在转发时转发的是r1(u1, u2,&amp;#8230;,uM),即测试的代码是符合标准的.那为什么通不过呢?再加上两个测试,看看bind的返回值类型究竟能否让 is_bind_expression&amp;lt;T&amp;gt;::value为true&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('7d60e849-c044-4b77-b4bd-ca82d943b013')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_7d60e849-c044-4b77-b4bd-ca82d943b013" style="display: none;" alt="" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_7d60e849-c044-4b77-b4bd-ca82d943b013" onclick="cnblogs_code_hide('7d60e849-c044-4b77-b4bd-ca82d943b013',event)"&gt;&lt;div id="cnblogs_code_open_7d60e849-c044-4b77-b4bd-ca82d943b013"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000;"&gt;template&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;IsBindResult(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;v)&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;std::tr1::is_bind_expression&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;::value;&lt;br /&gt;}&lt;br /&gt;TEST(IsBindResult,&amp;nbsp;BindFuncPtr)&lt;br /&gt;{&lt;br /&gt;ASSERT_TRUE(IsBindResult(std::tr1::bind(Add,&amp;nbsp;std::tr1::placeholders::_1,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;)));&lt;br /&gt;}&lt;br /&gt;TEST(IsBindResult,&amp;nbsp;BindFunctor)&lt;br /&gt;{&lt;br /&gt;ASSERT_TRUE(IsBindResult(std::tr1::bind(std::plus&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(),&amp;nbsp;std::tr1::placeholders::_1,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;)));&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt; 编译,运行&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/MichaelPeng/201012/201012272235105880.png"&gt;&lt;img title="clip_image001" style="border: 0px none; display: inline;" alt="clip_image001" src="http://images.cnblogs.com/cnblogs_com/MichaelPeng/201012/201012272235105880.png" align="" border="0" height="183" width="640" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; 结果再次让偶大跃眼镜,居然bind的返回值没能通过is_bind_expression的测试,怎么回事,打开is_bind_expression 的源码来看&lt;br /&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('69eb3ecc-afb5-47df-a45c-d0d6b250d4f3')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_69eb3ecc-afb5-47df-a45c-d0d6b250d4f3" style="display: none;" alt="" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_69eb3ecc-afb5-47df-a45c-d0d6b250d4f3" onclick="cnblogs_code_hide('69eb3ecc-afb5-47df-a45c-d0d6b250d4f3',event)"&gt;&lt;div id="cnblogs_code_open_69eb3ecc-afb5-47df-a45c-d0d6b250d4f3"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000;"&gt;template&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_Tx&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;is_bind_expression&lt;br /&gt;{&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;value&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;};&lt;br /&gt;template&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_Result_type,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_Ret,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_BindN&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;is_bind_expression&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;_Bind&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;_Result_type,&amp;nbsp;_Ret,&amp;nbsp;_BindN&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;{&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;value&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这里对模板作了一个特化,如果bind的模板参数是 _Bind&amp;lt;_Result_type, _Ret, _BindN&amp;gt;类型,则value为true,否则false.&lt;/p&gt;&lt;p&gt; 看上去很美,没问题,那为什么测试会失败?难道bind(Add,&amp;#8230;)返回的是_Bind类型而 bind(plus&amp;lt;int&amp;gt;(),&amp;#8230;)返回的不是?接着看bind实现:&lt;/p&gt;&lt;p&gt; 函数指针版 &lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('ff713f3b-66e4-4c92-ab49-5574e4cee088')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_ff713f3b-66e4-4c92-ab49-5574e4cee088" style="display: none;" alt="" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_ff713f3b-66e4-4c92-ab49-5574e4cee088" onclick="cnblogs_code_hide('ff713f3b-66e4-4c92-ab49-5574e4cee088',event)"&gt;&lt;div id="cnblogs_code_open_ff713f3b-66e4-4c92-ab49-5574e4cee088"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000;"&gt;template&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_Rx&lt;br /&gt;_C_CLASS_FARG0&lt;br /&gt;_C_CLASS_ARG0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;inline&lt;br /&gt;_Bind&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;_Rx,&lt;br /&gt;_Rx,&lt;br /&gt;_BINDN&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;_Callable_fun&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;_Rx(__cdecl&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt;)(_FARG0_FARG1)&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_C_ARG0_ARG1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;bind(_Rx(__cdecl&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_Val)(_FARG0_FARG1)&amp;nbsp;_C_ARG0_A0)&lt;br /&gt;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;bind&amp;nbsp;to&amp;nbsp;pointer&amp;nbsp;to&amp;nbsp;function&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;typedef&amp;nbsp;_Callable_fun&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;_Rx(__cdecl&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt;)(_FARG0_FARG1)&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_Callable;&lt;br /&gt;typedef&amp;nbsp;_BINDN&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;_Callable&amp;nbsp;_C_ARG0_ARG1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_MyBind;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(_Bind&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;_Rx,&amp;nbsp;_Rx,&amp;nbsp;_MyBind&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(_MyBind(_Val&amp;nbsp;_C_A0_A1)));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;返回的的确是_Bind类型,&lt;/p&gt;&lt;p&gt; 仿函数版&lt;/p&gt;&lt;br /&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('80223418-7a01-4306-8b10-8f9a8c1cc30f')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_80223418-7a01-4306-8b10-8f9a8c1cc30f" style="display: none;" alt="" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_80223418-7a01-4306-8b10-8f9a8c1cc30f" onclick="cnblogs_code_hide('80223418-7a01-4306-8b10-8f9a8c1cc30f',event)"&gt;&lt;div id="cnblogs_code_open_80223418-7a01-4306-8b10-8f9a8c1cc30f"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000;"&gt;template&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_Fty&lt;br /&gt;_C_CLASS_ARG0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;inline&lt;br /&gt;_Bind_fty&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;_Fty,&lt;br /&gt;_Notforced,&lt;br /&gt;_BINDN&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;_Callable_obj&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;_Fty&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_C_ARG0_ARG1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;bind(_Fty&amp;nbsp;_Val&amp;nbsp;_C_ARG0_A0)&lt;br /&gt;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;bind&amp;nbsp;to&amp;nbsp;UDT&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;typedef&amp;nbsp;_BINDN&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;_Callable_obj&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;_Fty&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_C_ARG0_ARG1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_MyBind;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(_Bind_fty&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;_Fty,&amp;nbsp;_Notforced,&amp;nbsp;_MyBind&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(_MyBind(_Val&amp;nbsp;_C_A0_A1)));&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;返回的却是_Bind_fty类型, 难道_Bind_fty不是_Bind类型导致is_bind_expression返回false?接着看定义 &lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('16e2260b-be0b-47d5-b5f7-61ea20588077')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_16e2260b-be0b-47d5-b5f7-61ea20588077" style="display: none;" alt="" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_16e2260b-be0b-47d5-b5f7-61ea20588077" onclick="cnblogs_code_hide('16e2260b-be0b-47d5-b5f7-61ea20588077',event)"&gt;&lt;div id="cnblogs_code_open_16e2260b-be0b-47d5-b5f7-61ea20588077"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000;"&gt;template&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_Ret,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_BindN&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_Bind&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;_Notforced,&amp;nbsp;_Ret,&amp;nbsp;_BindN&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_Bind_base&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;_Ret,&amp;nbsp;_BindN&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;{&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;_Bind(_BindN&amp;nbsp;_B0)&lt;br /&gt;:&amp;nbsp;_Bind_base&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;_Ret,&amp;nbsp;_BindN&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(_B0)&lt;br /&gt;{&amp;nbsp;&lt;br /&gt;}&lt;br /&gt;};&lt;br /&gt;template&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_Fty,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_Ret,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_BindN&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_Bind_fty&lt;br /&gt;:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_Wrap_result_type&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(::std::&amp;nbsp;tr1::_Has_result_type((_Fty&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;))&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(::std::&amp;nbsp;tr1::_Yes)),&amp;nbsp;_Fty&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_Bind_base&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;_Ret,&amp;nbsp;_BindN&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;{&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;_Bind_fty(_BindN&amp;nbsp;_B0)&lt;br /&gt;:&amp;nbsp;_Bind_base&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;_Ret,&amp;nbsp;_BindN&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(_B0)&lt;br /&gt;{&amp;nbsp;&lt;br /&gt;}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;果然如此,真相大白.is_bind_expression不认为 bind(functor&amp;#8230;)是bind表达式,故会直接将其作为类型为_Bind_fty的参数转发为 logical_and,导致编译出错.&lt;/p&gt;&lt;p&gt;找到错误原因,可以开bug了&lt;table border="1" width="1096"&gt;     &lt;tbody&gt;         &lt;tr&gt;             &lt;td width="1094"&gt;             &lt;p&gt;Title: std::tr1::bind can't bind a functor as an argument to another functor             &lt;/p&gt;             &lt;p&gt;How found: manual test             &lt;/p&gt;             &lt;p&gt;Build version:VC 1010 01019-532-2002102-70993             &lt;/p&gt;             &lt;p&gt;OS: Windows XP             &lt;/p&gt;             &lt;p&gt;Repro steps:             &lt;/p&gt;             &lt;p&gt;Run following code: &lt;/p&gt;             &lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('9c012c60-d388-4867-a1f0-c62a690b818c')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_9c012c60-d388-4867-a1f0-c62a690b818c" style="display: none;" alt="" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_9c012c60-d388-4867-a1f0-c62a690b818c" onclick="cnblogs_code_hide('9c012c60-d388-4867-a1f0-c62a690b818c',event)"&gt;&lt;div id="cnblogs_code_open_9c012c60-d388-4867-a1f0-c62a690b818c"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000;"&gt;TEST(Bind,&amp;nbsp;Squarediff_Functorptr)&lt;br /&gt;{&lt;br /&gt;auto&amp;nbsp;f0&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;std::tr1::bind(std::multiplies&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(),&lt;br /&gt;std::tr1::bind(std::plus&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(),&amp;nbsp;std::tr1::placeholders::_1,&amp;nbsp;std::tr1::placeholders::_2),&lt;br /&gt;std::tr1::bind(std::minus&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(),&amp;nbsp;std::tr1::placeholders::_1,&amp;nbsp;std::tr1::placeholders::_2));&lt;br /&gt;ASSERT_EQ(&lt;/span&gt;&lt;span style="color: #800080;"&gt;16&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;f0(&lt;/span&gt;&lt;span style="color: #800080;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;             &lt;p&gt;Expected:             &lt;/p&gt;             &lt;p&gt;Code got compiled and test passed. See n1836             &lt;/p&gt;             &lt;p&gt;Result:             &lt;/p&gt;             &lt;p&gt;Build break             &lt;/p&gt;             &lt;p&gt;Note:             &lt;/p&gt;             &lt;p&gt;The result of std::tr1::bind(std::minus&amp;lt;int&amp;gt;(), std::tr1::placeholders::_1, std::tr1::placeholders::_2) is of type _Bind_fty, which will make is_bind_expression&amp;lt;_Bind_fty&amp;gt;::value = false. Suggestion: modify the return type of bind or change is_bind_expression to make is_bind_expression&amp;lt;_Bind_fty&amp;gt;::value to be true. &lt;/p&gt;             &lt;/td&gt;         &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt; 提交bug, Ok.&lt;/p&gt;&lt;p&gt;结束了么?还没有,需要编写一个测试来验证这个问题并加到测试列表里去,可是直接写会导致编译出错,怎么办呢?&lt;/p&gt;&lt;p&gt;有办法,&lt;/p&gt;&lt;p&gt; 将如下代码保存到一个文件去 &lt;br /&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('90113301-7b16-461f-b995-95278a6ac05a')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_90113301-7b16-461f-b995-95278a6ac05a" style="display: none;" alt="" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_90113301-7b16-461f-b995-95278a6ac05a" onclick="cnblogs_code_hide('90113301-7b16-461f-b995-95278a6ac05a',event)"&gt;&lt;div id="cnblogs_code_open_90113301-7b16-461f-b995-95278a6ac05a"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000;"&gt;#include&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;iostream&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;#include&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;conio.h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;br /&gt;#include&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;tchar.h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;main()&amp;nbsp;&lt;br /&gt;{&amp;nbsp;&lt;br /&gt;auto&amp;nbsp;f0&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;std::tr1::bind(std::multiplies&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;gt;(),&amp;nbsp;&lt;br /&gt;std::tr1::bind(std::plus&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;gt;(),&amp;nbsp;std::tr1::placeholders::_1,&amp;nbsp;std::tr1::placeholders::_2),&amp;nbsp;&lt;br /&gt;std::tr1::bind(std::minus&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;gt;(),&amp;nbsp;std::tr1::placeholders::_1,&amp;nbsp;std::tr1::placeholders::_2));&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;f0(&lt;/span&gt;&lt;span style="color: #800080;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&amp;nbsp;&lt;br /&gt;}&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;调用cl编译这个文件,如果能得到一个可执行程序并且执行后返回16则测试通过,否则测试失败.&lt;/p&gt;&lt;p&gt;代码就不在这里列举了.&lt;/p&gt;&lt;p&gt; 写完测试,添加到daily build的test list中去,什么时候问题解决了从测试结果上就能看出来了.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;p&gt;--------------------------正文的分割线 -------------------------------&lt;/p&gt;&lt;p&gt;注&lt;/p&gt;&lt;p&gt;1 文中写的找bug的过程是直线式的逻辑,思路很清晰,实际我在跟代码的时候就像在一个迷宫里打转,只看见出了错误,不知道什么地方错了,只好用各种手段, 想先找出bind在绑定函数指针时究竟干了什么,再来推理为什么绑定仿函数会出错,根本不是象文中写的那 样直接推断到is_bind_expression的问题.&lt;/p&gt;&lt;p&gt;vc2010里tr1库的实现实在不好阅读,满篇全是宏,连函数调用传了几个参数都搞不清楚,我只好先用/E选项把预编译的文件输出出来,在跟踪代码时一边看预处理后的代码一边看汇编,无论哪个都比tr1自己的源代码好读.&lt;/p&gt;&lt;p&gt;不过这一番跟踪下来收获倒也颇丰,&lt;/p&gt;&lt;p&gt;1) 基本清楚了bind的实现,可以另外写篇博客来谈&lt;/p&gt;&lt;p&gt;2) 明白了RVO(返回值优化)的原理.在跟踪bind汇编代码时时发现只要三个参数,却push了四个,调用完成后也是ret 10返回,跟了下去才发现是做的RVO&lt;/p&gt;&lt;p&gt;2 文中用到了ASSERT宏进行测试,也算是对前些天对我这篇&lt;a href="http://www.cnblogs.com/MichaelPeng/archive/2010/12/02%20/1893999.html" target="_blank"&gt;金山卫士代码批评&lt;/a&gt;评论里大家对ASSERT质疑的一个回应吧.c++库里的assert的作用是及时发现错误反馈给程序员, 会打断程序执行,而测试框架里的ASSERT则是断言测试是否符合预期,把结果传递给测试框架,再由测试框架记录后反馈给程序员.我原来以为在那个上下文都是测试情况下assert的语义应当不言自明的是指后者,没想到还是有很多读者误以为是c++库里的assert.这是我没有把话说清楚,假定自己知道的受众也知道,忽略了背景的区别带来的对同一个名词不同的理解,是我经常犯的一个错误,要努力改正.&lt;/p&gt;&lt;p&gt;3 QA除了写测试用例,用工具和脚本进行测试外还可以在项目过程中参与更多.一个好的QA应当有不弱于Dev的编码能力, 有能力复查Dev设计和编码,直接从中发现问题,以及在测试中发现问题时有能力定位bug源头并给出参考解决方案.QA还要有缜密的思维和想象能力,对边界条件、各种逻辑组合和极端情况能去构造和评估其对功能的影响，因为Dev一般习惯于正常情况下的逻辑,边界情况虽然也会考虑,但还是不会有QA想的全面.遗憾的是目前国内开发团队中这样的QA还是比较少见.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;参考资料&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;     &lt;li&gt;&lt;div&gt;&lt;a href="http://www.cnblogs.com/MichaelPeng/admin/A%20bug%20about%20std::tr1::bind"&gt;A bug about std::tr1::bind&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="http://en.wikipedia.org/wiki/C%2B%2B_Technical_Report_1" href="http://en.wikipedia.org/wiki/C%2B%2B_Technical_Report_1" target="_blank"&gt;C++ Technical Report 1 on wikipedia&lt;/a&gt;     &lt;/li&gt;     &lt;li&gt;&lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf" target="_blank"&gt;n1836&lt;/a&gt;     &lt;/li&gt;     &lt;li&gt;&lt;a href="http://www.boost.org/doc/libs/1_45_0/libs/bind/bind.html" target="_blank"&gt;boost bind&lt;/a&gt;     &lt;/li&gt;     &lt;li&gt;&lt;a href="http://blog.csdn.net/Solstice/archive/2008/10/13/3066268.aspx"&gt; 以boost::function和boost:bind取代虚函数&lt;/a&gt;     &lt;/li&gt;     &lt;li&gt;&lt;a href="http://www.cnblogs.com/MichaelPeng/archive/2010/12/02/1893999.html" target="_blank"&gt;gtest&lt;/a&gt;     &lt;/li&gt;     &lt;li&gt;&lt;a href="http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html"  &amp;="" gt;玩转="" google开源c++单元测试框架="" google=""  test系列(gtest)(总)=""&gt;&lt;/a&gt;&lt;div&gt;&lt;a href="http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html"&gt;玩转Google开源C++单元测试框架Google Test系列(gtest)(总)&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;img src="http://www.cnblogs.com/MichaelPeng/aggbug/1918359.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/MichaelPeng/archive/2010/12/27/ABugReportOnVC2010_std_tr1_bind.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/MichaelPeng/archive/2010/12/25/Kigg3WithVisualStudio2010.html</id><title type="text">用vs2010编译kigg 3.0遇到的问题</title><summary type="text">今天玩kigg时碰到了一些问题, 在google帮助下总算搞定了,在这里记录下解决步骤,供日后参考,也给碰到相似问题的朋友一些参考.</summary><published>2010-12-25T14:56:00Z</published><updated>2010-12-25T14:56:00Z</updated><author><name>Michael Peng</name><uri>http://www.cnblogs.com/MichaelPeng/</uri></author><link rel="alternate" href="http://www.cnblogs.com/MichaelPeng/archive/2010/12/25/Kigg3WithVisualStudio2010.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/MichaelPeng/archive/2010/12/25/Kigg3WithVisualStudio2010.html"/><content type="html">&lt;p&gt;今天玩&lt;a href="http://kigg.codeplex.com/" target="_blank"&gt;kigg&lt;/a&gt;时碰到了一些问题,在google帮助下总算搞定了,在这里记录下解决步骤,供日后参考,也给碰到相似问题的朋友一些参考. &lt;/p&gt;&lt;ol&gt;     &lt;li&gt;kigg用的.NET 3.5, 需要升级到.NET 4.0.因为vs会调用.NET 4.0版的ASP.net compiler,会出现冲突, 还有一个办法是在kigg.web.csproj中指定ASP.NET Compiler路径&lt;br /&gt;     &amp;lt;AspNetCompiler VirtualPath="temp" PhysicalPath="$(ProjectDir)\..\Web" ToolPath="C:\Windows\Microsoft.NET\Framework\v2.0.50727" /&amp;gt;     &lt;/li&gt;     &lt;li&gt;有些类是用LinkDemand修饰的,需要去掉,否则运行时会报错.这是为了快速运行起来,没有深究背后的安全性. 比如jQueryScriptManager和reCAPCHA类等     &lt;/li&gt;     &lt;li&gt;在Web.config System.Web节中加入 &amp;lt;P&amp;gt;&amp;amp;lt;httpRuntime requestValidationMode="2.0"/&amp;amp;gt;&amp;lt;/P&amp;gt; 因为.net 4.0中对HTTP Request validate的处理发生了一些变化,为了和以前的模式保持兼容.否则输入的内容中含有&amp;lt;xxx&amp;gt;&amp;lt;/xxx&amp;gt;的内容时校验会抛异常.     &lt;/li&gt;     &lt;li&gt;把Source\SharedFiles里的文件拷贝到app_data目录下.     &lt;/li&gt;     &lt;li&gt;如果你没有配置email,请如下注释掉Email exception listener&lt;br /&gt;     &amp;lt;add switchValue="All" name="FullException"&amp;gt;&lt;br /&gt;     &amp;lt;listeners&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;     &amp;lt;!--&lt;br /&gt;     &amp;lt;add name="EmailExceptionListener"/&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;     &amp;nbsp; --&amp;gt;&lt;br /&gt;     &amp;lt;add name="TextFileExceptionListener"/&amp;gt;&lt;br /&gt;     &amp;lt;/listeners&amp;gt;&lt;br /&gt;     &amp;lt;/add&amp;gt;     &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;p&gt;参考资料&lt;/p&gt;&lt;ol&gt;     &lt;li&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/557798/visual-studio-2010-compile-asp-net-3-5-website-using-net4s-aspnet-compiler-exe" target="_blank"&gt;Visual Studio 2010 compile ASP.NET 3.5 website using .NET4's aspnet_compiler.exe&lt;/a&gt;     &lt;/li&gt;     &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/hzsc022c.aspx" target="_blank"&gt;Link Demands&lt;/a&gt;     &lt;/li&gt;     &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.web.configuration.httpruntimesection.requestvalidationmode%28VS.100%29.aspx" target="_blank"&gt;HttpRuntimeSection.RequestValidationMode Property&lt;/a&gt;     &lt;/li&gt;     &lt;li&gt;&lt;a href="http://brianseekford.com/index.php/2010/04/20/httprequestvalidationexception-after-upgrading-to-net-4-0/" target="_blank"&gt;HttpRequestValidationException after upgrading to .NET 4.0&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;img src="http://www.cnblogs.com/MichaelPeng/aggbug/1916980.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/MichaelPeng/archive/2010/12/25/Kigg3WithVisualStudio2010.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/MichaelPeng/archive/2010/12/22/1913988.html</id><title type="text">在vs中获得当前所有快捷键代码</title><summary type="text">在 vs中获得当前所有快捷键的代码</summary><published>2010-12-22T08:14:00Z</published><updated>2010-12-22T08:14:00Z</updated><author><name>Michael Peng</name><uri>http://www.cnblogs.com/MichaelPeng/</uri></author><link rel="alternate" href="http://www.cnblogs.com/MichaelPeng/archive/2010/12/22/1913988.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/MichaelPeng/archive/2010/12/22/1913988.html"/><content type="html">&lt;div&gt;ms-help://MS.MSDNQTR.v90.en/dv_vssettings/html/bbfc1243-fa27-45df-9c4b-6bca181132d6.htm&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #0000ff;"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;GetAllCommands()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;getCommandsWithSCOnly&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;As&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Boolean&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;cmd&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;As&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Command&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;cmdCollection&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;As&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Commands&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ow&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;As&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;OutputWindow&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;DTE.Windows.Item(Constants.vsWindowKindOutput).Object&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;owp&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;As&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;OutputWindowPane&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;exists&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;As&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Boolean&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;As&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Integer&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exists&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;False&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;For&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Each&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;owp&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;In&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ow.OutputWindowPanes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;If&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;owp.Name&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Macro&amp;nbsp;Output&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Then&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exists&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;True&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Exit&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;For&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;End&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;If&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Next&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;If&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;exists&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Then&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;owp&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ow.OutputWindowPanes.Item(i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;owp&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ow.OutputWindowPanes.Add(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Macro&amp;nbsp;Output&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;End&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;If&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;owp.Clear()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;'&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Output&amp;nbsp;1&amp;nbsp;line&amp;nbsp;per&amp;nbsp;command&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;For&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Each&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;cmd&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;In&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;DTE.Commands&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;binding&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;As&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Object&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;shortcuts&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;As&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;String&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;shortcuts&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;For&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Each&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;binding&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;In&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;cmd.Bindings&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;b&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;As&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;String&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;sArray()&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;As&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;String&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;binding&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;shortcuts&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;shortcuts&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;b&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Next&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;shortcuts&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;shortcuts.Trim()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;If&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Not&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;cmd.Name.Trim().Equals(&lt;/span&gt;&lt;span style="color: #800000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Then&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;owp.OutputString(cmd.Name&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;vbTab&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;shortcuts&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;vbCrLf)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;owp.OutputString(cmd.Guid.ToString()&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;cmd.ID.ToString()&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;vbTab&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;shortcuts&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;vbCrLf)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;End&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;If&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Next&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;End&amp;nbsp;Sub&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/MichaelPeng/aggbug/1913988.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/MichaelPeng/archive/2010/12/22/1913988.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/MichaelPeng/archive/2010/12/16/1908230.html</id><title type="text">最近的一些面试感悟</title><summary type="text">一年来招人的一些感受</summary><published>2010-12-16T06:57:00Z</published><updated>2010-12-16T06:57:00Z</updated><author><name>Michael Peng</name><uri>http://www.cnblogs.com/MichaelPeng/</uri></author><link rel="alternate" href="http://www.cnblogs.com/MichaelPeng/archive/2010/12/16/1908230.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/MichaelPeng/archive/2010/12/16/1908230.html"/><content type="html">&lt;div&gt;  &lt;p&gt;公司一直在招人，可合适的人实在不好招。招了一年多，也就招了五六位。而面试中遇到的各种情况让人唏嘘不已。随便聊聊&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: Calibri;"&gt;1 &lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;我们招聘是先在招聘网站上发布信息，然后约投简历的人过来，先做一套题，题做得还可以的当场面试。遇到一些哥们，说自己有&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;N&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;年以上开发经验，不屑于做这些题目。这种人一般直接让&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;HR&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;请回。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: SimSun;"&gt;如果我招的是管理职位，让你做纯技术问题，或者招&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;C#&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;程序员给做&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Python&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;问题，那是我们不对。可职位明明是&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;C#&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;高级工程师，做一套&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;C#&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;的题目不是很正常的么。你有能力也没必要通过这种方式来表示，通过解决这些问题来展示你的能力不是更好么。当然如果你是&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Anders&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;那个级别的人，什么面试都没有意义了。我就找老板亲自出面去请你了。但如果不是，最好还是把心态放得平衡一些。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: SimSun;"&gt;笔试起的是一个筛选的作用，如果你的简历能够说明你的能力，也可以不用笔试。但是很多人分不清工作经验和能力，十年工作经验并不能保证你的能力就一定达到某个水准。我就碰到许多两三年工作经验的&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Java&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;程序员不清楚&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;volatile&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;的意思，不知道这个关键字和那个著名的&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;DCL bug&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;的关系。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;另外这种情况可能也会让面试官觉得你不好相处与合作，真正有能力的人都是谦逊的，因为他们知道自己不知道，保持一颗谦卑的心才能不断进步。&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: Calibri;"&gt;2 &lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;对语言特性掌握不够。&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;.NET3.5,C#3.0&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;出来好些年了，但很多人还是说不出&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;IQueryable&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;和&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;IEnumerable&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;的区别，还有闭包的实现，&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;yield&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;的实现等。工作中用不到不等于你不必去跟踪技术的发展。你不去了解怎么知道这些技术能不能在项目中用上。另外对技术的了解不是说会照着&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;turorial&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;写几个例子就是&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;OK&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;了&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;,&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;实现不说完全了解，也要知道个大概。一个合格的&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;C#&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;程序员&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;JIT, GC,yield, lambda&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;和闭包的关系&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;,Linq&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;中的表达式树等是一定要清楚的，如果你新技术跟进足够快的话&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;DLR&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;中&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;dynamic&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;的实现，&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;TPL&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;库也需要了解，如果能聊下一版&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;C#&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;可能出现的新特性，会更让人刮目相看的。同样，一个&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;C++&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;程序员如果不了解&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;stl,boost, C++0x&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;也不是很妥。你可以不用，但是需要知道有这些优秀的工具供你使用。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: Calibri;"&gt;3 &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;对阅读优秀代码不够重视。阅读优秀代码是很好的一种学习方式。操千曲而后晓声，观千剑而后识器。如果只是停留于照着一门技术的&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;sample&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;代码或者网上流传的入门教程的地步，显然是不够的。这不是对写入门教程的作者不敬，我很尊重那些原创或者翻译技术入门教程的同学，也从各种入门教程学了很多东西。但一门技术总会有各种教程难以覆盖的细节和无法一一列举的惯用法。&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;C++&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;可以拿来写过程式的代码也能做元编程和函数式编程，&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;ruby&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;中不用&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;||=, each&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;惯用法而用&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;if, for, ASP.NET MVC&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;中不用&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;URLHelper&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;生成&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;url&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;而在&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;view&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;中&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Html.ActionLInk&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;字符串等，不一道哉。这些都是入门教程没办法教给你的，但可以从优秀的开源项目中去学习。&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;SourceForge, Google Code, CodePlex&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;应该在你的收藏夹中。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: Calibri;"&gt;4 &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;对其它基础知识掌握不扎实。操作系统、数据库、数据结构和算法是一定要掌握的。一个简单的数据库问题，&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;User&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;表包含&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;UserName NVARCHAR(50) NOT NULL, UserType INT NOT NULL&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。如何保证在&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;UserType=1&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;时&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;UserName&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;不重复，很多人都告诉我先&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;select,&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;判断&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;username&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;不存在再插入，当我问起如何处理并发时就告诉我用存储过程，把这个逻辑放到事务中去。可见很多人没有清楚理解事务能做什么，不能做什么，并且在工程上考虑不全面，让我很郁闷。当然术业有专攻，如果是做算法或者桌面应用的程序员，数据库不了解是可以接受的。但天天做业务逻辑的程序员不懂&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;SQL, &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;不了解事务、隔离级别，索引实现与性能调优就说不过去了。但无论哪个方向的程序员，数据结构一定需要有基本的了解。不讨论&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;RB Tree, AVL Tree, Suffix Tree&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;这些较复杂的东西，简单的数组，栈，队列，查询排序啥的应该和九九表一样熟悉。否则，除了做简单的堆砌业务逻辑，复杂一点的东西就很难摆平了。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: Calibri;"&gt;5 &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;逻辑推理能力有待提高。笔试中一般会有一两个逻辑问题，这种问题虽然不直接对应日常的开发工作，但能体现出一个人的解决问题能力，在交流中还能体现出沟通能力。这篇文章说得更清楚。&lt;/span&gt;&lt;a href="http://blog.sina.com.cn/s/blog_4caedc7a0100nlx2.html"&gt;&lt;span style="font-family: SimSun;"&gt;http://blog.sina.com.cn/s/blog_4caedc7a0100nlx2.html&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: SimSun;"&gt;。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: Calibri;"&gt;6 &lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;对工具掌握不够。很多好几年工作经验的人不会用&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;unit test&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;，不会查看&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;code coverage&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;和做&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Profile,&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;设断点只会&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;F9&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;，编辑代码只会用&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;IDE. &lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;工欲善其事，必先利其器。用好工具可以成倍的提高你的生产率，《程序员修炼之道》和《卓有成效的程序员》都是好书。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: SimSun;"&gt;聊了这么多面试中遇到的问题，再聊聊技术学习。以下纯属个人见解，不构成指导意见。我不是神人大牛，只是业余写代码的&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;QA, &lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;看法难免错漏，欢迎批评指正。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: Calibri;"&gt;1 &lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;向经典而不是宝典学习。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: SimSun;"&gt;今年初学&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Java,&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;办法就是装上&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;JDK&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;和&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Eclipse,&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;看&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;JDK&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;中&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;concurrent&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;和&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Collection&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;相关的源代码，然后看了看&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Spring&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;中&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;IOC&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;实现，&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;cglib&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;和&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;jdk proxy&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;的区别，再用&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;DBUnit&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;和&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;spring&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;中的&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;test&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;框架给组里搭了一个小的数据库测试工具，明白了&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;JUnit&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;的运行原理和&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;spring test&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;中事务是如何实现的。这些东西书店里的各种宝典是不会教给你的。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: Calibri;"&gt;2 &lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;注重原理而非操作手册。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: SimSun;"&gt;远离插图多，操作多，原理少，剖析少的书。很多东西都是易学难精，因为难精，才更有价值，更需要精。一本&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt; SQLServer&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;书，一步步告诉你怎么在&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;SSMS&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;中创建数据库，创建表，创建&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;index,&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;这就算了，随便找个人&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;3&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;天都能会，&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;3&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;天以后就不需要再看的东西就不要浪费这钱买书了。不如攒下来给女朋友买个&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;ipad&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;啥的更能发挥作用。一定要找像《&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;Iniside Microsoft SQL Server 2005&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;》这种明明白白告诉你一条&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;SQL&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;语句从解释，优化来执行的全过程，一张表是怎么样存储在硬盘上的好书。&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;(&lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;非书托&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;)&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: Calibri;"&gt;3 &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;关注第一手材料&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;多加入一些邮件组或者订阅一些&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;blog,&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;如&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;VC++ team, C# team, msdn magazine, asp.net&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;等（最近主要关注&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;.NET,&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;只列出了相关的内容&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。第一手资料总比第二手新鲜和精确。这两天捣鼓&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;VS2010&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;的&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;C++,&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;去把&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;VC team&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;的&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;blog&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;翻了一遍，受益匪浅。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: Calibri;"&gt;4 &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;重视基本功&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;《深入理解计算机系统》，《算法导论》如果能看明白一半，找工作已经不是问题了，什么框架，什么经验都是浮云了。&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: Calibri;"&gt;5 &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;关注新技术&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;今天的小众技术，明天可能就是主流。比别人先行一步，可能就掌握了先机。但要注意技术的应用前景和生命周期。很多&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;MFC,vxd&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;的拥趸深有体会。还有一点，很多技术都是相通的，用过&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;rails&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;后，再看&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;asp.net mvc,&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;很多时候都会有似曾相似之感。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: Calibri;"&gt;6 &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;重视工具&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;工具是双手的延伸，使用得到能为你节省无数时间。会一个条件断点，就能给你节省许多中断，查看，运行，再中断，查看&lt;/span&gt;&lt;span style="font-family: Calibri;"&gt;...&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;的时间。更不用说其它工具和工具组合能带来的提高。《程序员修炼之道&lt;/span&gt; &lt;span style="font-family: 宋体;"&gt;》和《卓有成效的程序员》里说得很清楚，就不拾人牙慧了。&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;&lt;img src="http://www.cnblogs.com/MichaelPeng/aggbug/1908230.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/MichaelPeng/archive/2010/12/16/1908230.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/MichaelPeng/archive/2010/12/08/1900682.html</id><title type="text">这两天被vs2010的std::tr1::bind郁闷了</title><summary type="text">这两天被vs2010的std::tr1::bind郁闷了</summary><published>2010-12-08T13:36:00Z</published><updated>2010-12-08T13:36:00Z</updated><author><name>Michael Peng</name><uri>http://www.cnblogs.com/MichaelPeng/</uri></author><link rel="alternate" href="http://www.cnblogs.com/MichaelPeng/archive/2010/12/08/1900682.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/MichaelPeng/archive/2010/12/08/1900682.html"/><content type="html">&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;!--&lt;br/&gt;&lt;br/&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/&gt;http://www.CodeHighlighter.com/&lt;br/&gt;&lt;br/&gt;--&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;std::tr1::function&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;f4&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;std::tr1::bind(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;std::logical_and&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;std::tr1::bind(std::logical_not&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(),&amp;nbsp;std::tr1::placeholders::_1),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;想在vs2010里玩一玩function programming,却被郁闷了,又发现了一个别人发现过的bug&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a title="A bug about std::tr1::bind" href="https://connect.microsoft.com/VisualStudio/feedback/details/434414/a-bug-about-std-tr1-bind"&gt;A bug about std::tr1::bind&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;div id="ctl00_MasterBody_upCommunityCommentBox"&gt;                            &lt;div&gt;      &lt;div id="ctl00_MasterBody_cbCommunityComment_pnlAddNew"&gt; &lt;a id="ctl00_MasterBody_cbCommunityComment_postLink" href="https://login.live.com/login.srf?wa=wsignin1.0&amp;amp;rpsnv=11&amp;amp;ct=1291814959&amp;amp;rver=6.0.5286.0&amp;amp;wp=MBI_SSL&amp;amp;wreply=https:%2F%2Fconnect.microsoft.com%2FVisualStudio%2Ffeedback%2Fdetails%2F434414%2Fa-bug-about-std-tr1-bind&amp;amp;lc=2052&amp;amp;id=64416"&gt;&lt;/a&gt;&lt;/div&gt;      &lt;div id="ctl00_MasterBody_cbCommunityComment_Comment" style="margin: 15px; display: none;"&gt;         &lt;textarea name="ctl00$MasterBody$cbCommunityComment$UserCommentTextBox" rows="8" cols="20" id="ctl00_MasterBody_cbCommunityComment_UserCommentTextBox" style="margin: 5px; width: 694px; border: 1px solid #c9c9c9; padding: 3px; font-family: verdana; font-size: 8pt;"&gt;&lt;/textarea&gt;         &lt;div id="ctl00_MasterBody_cbCommunityComment_pnlErrorMessage" style="display: none; color: #ff0000; margin: 3px; padding: 0px 0px 4px 4px; font-size: 0.8em;"&gt;              请输入评论。          &lt;/div&gt;     &lt;div&gt;     &lt;input name="ctl00$MasterBody$cbCommunityComment$SubmitButton" value="提交" onclick="return  ctl00_MasterBody_cbCommunityComment_validate();javascript:ctl00_MasterBody_cbCommunityComment_ToggleInputControlsOff();" id="ctl00_MasterBody_cbCommunityComment_SubmitButton" style="padding-left: 5px; padding-right: 5px;" type="submit"&gt;     &lt;input name="ctl00$MasterBody$cbCommunityComment$CancelButton" id="ctl00_MasterBody_cbCommunityComment_CancelButton" style="padding-left: 5px; padding-right: 5px;" value="取消" onclick="javascript:ctl00_MasterBody_cbCommunityComment_ToggleInputControlsOff();" type="button"&gt;     &lt;/div&gt;     &lt;/div&gt;  &lt;/div&gt;  &lt;script type="text/javascript"&gt; function ctl00_MasterBody_cbCommunityComment_validate() {          var cbox = $get('ctl00_MasterBody_cbCommunityComment_UserCommentTextBox');                          if (cbox.value.match(/^\s*$/)) {                      $get('ctl00_MasterBody_cbCommunityComment_pnlErrorMessage').style.display = 'block';             cbox.value = '';             cbox.focus();             return false;          } else {                          ctl00_MasterBody_cbCommunityComment_ToggleInputControlsOff();     $get("ctl00_MasterBody_cbCommunityComment_pnlAddNew").style.display = 'none';             return true;         }   }  function ctl00_MasterBody_cbCommunityComment_ToggleInputControlsOff() {  $get( "ctl00_MasterBody_cbCommunityComment_Comment" ).style.display = 'none';         $get('ctl00_MasterBody_cbCommunityComment_pnlErrorMessage').style.display = 'none'; $get("ctl00_MasterBody_cbCommunityComment_pnlAddNew").style.display = 'block';          }  function ctl00_MasterBody_cbCommunityComment_ToggleInputControlsOn() {  $get("ctl00_MasterBody_cbCommunityComment_Comment").style.display = 'block'; $get("ctl00_MasterBody_cbCommunityComment_pnlAddNew").style.display = 'none';  userComment = $get("ctl00_MasterBody_cbCommunityComment_UserCommentTextBox"); userComment.value = '';          // a slight delay to give the browser some time to render the          // appropriate elements before setting focus to the comment         // text area element.     setTimeout(function() { userComment.focus(); }, 500);  } &lt;/script&gt;                       &lt;/div&gt;                                                                                                                                             &lt;div&gt;                                         &lt;div comment_microsoft=""&gt;                                             由 &lt;strong&gt;Microsoft&lt;/strong&gt;  在 2009/8/7 18:33 发送                                         &lt;/div&gt;                                         &lt;div&gt;                                             Hi,&lt;br /&gt;&lt;br /&gt;Thanks for  reporting this bug. Unfortunately, we have resolved it as Won't Fix for  VC10. Our implementation is fragile when it comes to nested bind(), and  we'll need to devote significant time to fixing it - time we don't have  for VC10. (I can't promise anything, but I hope to be able to rewrite  bind()'s implementation when we get variadic templates.)&lt;br /&gt;&lt;br /&gt;The good  news is that lambdas in VC10 supersede bind() in 99% of cases. Lambdas  offer much more natural syntax (especially compared to nested bind())  and greater efficiency, since the optimizer can inline lambdas but has  difficulty with bind()'s functors.&lt;br /&gt;&lt;br /&gt;Here's an example that  expresses your bind() functor as a lambda (doing something slightly  different with it, but the functor has the same behavior):&lt;br /&gt;&lt;br /&gt;C:\Temp&amp;gt;type  meow.cpp&lt;br /&gt;#include &amp;lt;algorithm&amp;gt;&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include  &amp;lt;iterator&amp;gt;&lt;br /&gt;#include &amp;lt;ostream&amp;gt;&lt;br /&gt;#include &amp;lt;vector&amp;gt;&lt;br /&gt;using  namespace std;&lt;br /&gt;&lt;br /&gt;int main() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vector&amp;lt;int&amp;gt; v;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v.push_back(2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v.push_back(4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v.push_back(6);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v.push_back(8);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v.push_back(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v.push_back(3);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v.push_back(5);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v.push_back(7);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v.push_back(9);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vector&amp;lt;int&amp;gt;  dest;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;copy_if(v.begin(), v.end(), back_inserter(dest),  [](int n) { return n &amp;gt;= 3 &amp;amp;&amp;amp; n &amp;lt;= 8; });&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for_each(dest.begin(),  dest.end(), [](int n) { cout &amp;lt;&amp;lt; n &amp;lt;&amp;lt; " "; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout  &amp;lt;&amp;lt; endl;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;C:\Temp&amp;gt;cl /EHsc /nologo /W4 meow.cpp&lt;br /&gt;meow.cpp&lt;br /&gt;&lt;br /&gt;C:\Temp&amp;gt;meow&lt;br /&gt;4  6 8 3 5 7&lt;br /&gt;&lt;br /&gt;Until you get VC10, remember that handwritten functors  are always an alternative to using bind().&lt;br /&gt;&lt;br /&gt;If you have any  further questions, feel free to E-mail me at stl@microsoft.com .&lt;br /&gt;&lt;br /&gt;Stephan  T. Lavavej&lt;br /&gt;Visual C++ Libraries Developer                                         &lt;/div&gt;                                     &lt;/div&gt;                                                                                                               &lt;div comment_microsoft=""&gt;                                             由 &lt;strong&gt;Microsoft&lt;/strong&gt;  在 2009/4/22 23:36 发送                                         &lt;/div&gt;                                                                                      Thanks for your feedback.  &lt;br /&gt;&lt;br /&gt;We  are escalating this issue to the appropriate group within the Visual  Studio Product Team for triage and resolution. These specialized experts  will follow-up with your issue.&lt;br /&gt;&lt;br /&gt;Thank you, &lt;br /&gt;Visual Studio  Product Team&lt;/div&gt;&amp;nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;只好换boost或者lambda &lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/MichaelPeng/aggbug/1900682.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/MichaelPeng/archive/2010/12/08/1900682.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
