<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_布鲁斯.李</title><subtitle type="text">/* Hello World */{ 关注Web应用和开发 }&amp;lt;!-- bBank JavaScript 框架开发  --&amp;gt;</subtitle><id>http://feed.cnblogs.com/blog/u/69218/rss</id><updated>2011-05-16T06:58:11Z</updated><author><name>布鲁斯.李</name><uri>http://www.cnblogs.com/bruceli/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bruceli/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/69218/rss"/><entry><id>http://www.cnblogs.com/bruceli/archive/2011/05/16/2047644.html</id><title type="text">不是HR，Leader你会面试应聘者吗（如何起好手中的扑克牌）</title><summary type="text">我先写了一篇博文《不是HR，Leader你到底需要招什么样的程序员（变形金刚？超人？可能吗！）》，得到不少园友的交流和意见，于是想再写一下自己面试应聘者的经验，来归纳总结和检讨一下自己需要注意的地方。结果现在起个名字弄得像”不是HR，Leader”的系列文章，那么我就接着”你到底需要招什么样的程序员”在谈谈怎么面试他们吧。</summary><published>2011-05-16T06:49:00Z</published><updated>2011-05-16T06:49:00Z</updated><author><name>布鲁斯.李</name><uri>http://www.cnblogs.com/bruceli/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bruceli/archive/2011/05/16/2047644.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bruceli/archive/2011/05/16/2047644.html"/><content type="html">&lt;div&gt;不是HR，Leader你会面试应聘者吗&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;------如何起好手中的扑克牌&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;前言：&lt;br /&gt;&lt;/b&gt;我先写了一篇博文&lt;a href="http://www.cnblogs.com/bruceli/archive/2011/05/09/2041009.html"&gt;《不是HR，Leader你到底需要招什么样的程序员（变形金刚？超人？可能吗！）》&lt;/a&gt;，得到不少园友的交流和意见，于是想再写一下自己面试应聘者的经验，来归纳总结和检讨一下自己需要注意的地方。结果现在起个名字弄得像&amp;rdquo;不是HR，Leader&amp;rdquo;的系列文章，那么我就接着&amp;rdquo;&lt;a href="http://www.cnblogs.com/bruceli/archive/2011/05/09/2041009.html"&gt;你到底需要招什么样的程序员&lt;/a&gt;&amp;rdquo;在谈谈怎么面试他们吧。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;正文：&lt;/b&gt;&lt;/div&gt;&lt;div&gt;我们写好招聘需求后，HR帮我们筛选了简历，下面我们就要开始安排对应聘者的面试了，做过招聘的应该知道，现在的简历水分实在是有够可以的，为什么会这样，有应聘者的原因，也有招聘需求的原因，我在这里就不具体分析了，想了解的可以看看我上一篇&amp;rdquo;&lt;a href="http://www.cnblogs.com/bruceli/archive/2011/05/09/2041009.html"&gt;你到底需要招什么样的程序员&lt;/a&gt;&amp;rdquo;。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" style="width: 756px; height: 156px;"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;来一个小插曲：&lt;br /&gt;    这是我的故事。一天我和Boss去总部面试完应聘者，中午出去吃饭，路过一个包子铺，据说那家包子铺的包子很有名，&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;于是我就和Boss过去买了几个，就在包子铺里，我咬了一口包子，突然对早上的面试发了一句感叹，对Boss说：&amp;rdquo;这水分也&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;太多了吧。&amp;rdquo;。走出包子铺，Boss笑着对我说：&amp;ldquo;小李啊，你知不知道刚才你说水分太多时，包子铺老板眼睛都绿了，盯着你&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;，拿刀出来砍你的心都有啊，你这是来拆招牌啊。&amp;rdquo;。还好我在说水分太多后顿了一下又补充到：&amp;ldquo;现在这简历的水分也太多&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;了。&amp;rdquo;。要不然包子铺老板真要出来砍我了。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;br /&gt;那么我们所要做的就是怎么去筛选有水分的应聘者，筛选完有水分的应聘者在按需要选择合适的就可以了，其实也就这简单的两步就可以完成。&lt;br /&gt;这里给出我的一些建议，并非标准，而是根据和同行的交流和实践总结出来的。对于工作1-3年内的，我们采取标准的面试题；3-5年内的，我们最好不要采用标准面试题，而是采用面试，针对核心知识点的询问来了解。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="color: #ff0000;"&gt;1-3年：&lt;/span&gt;&lt;br /&gt;对于这样一个阶段的程序员，往往都是新手，初级程序员，刚刚接触项目不久，也把学校学习的理论知识变换成实际的工作经验。而在工作中，对于初级程序员，一般用于基础代码的填充和编写，基本上要能使用C#（或者别的语言，我以C#为例），并对语法掌握较好，可以阅读简单代码，逻辑尚可，就可以胜任了。&lt;br /&gt;当我们了解了需要什么样的判断要求时，就可以根据这些来编写面试题了，可以看出我们的面试题其实只用分为3大题型来考察（基础语法题，代码阅读题，逻辑思维题）。至于题目怎么来，这个简单，可以从网上选一些题目自己组合或者自己去编写了。那么有人会说，既然是从网上找来的题目，那答案都可以在网上找到了。这显然是个废话，就算是你自己编写的题目，有人面试后，都会作为面试宝典发到互联网上，现在还有啥保密的面试题。如果你还在为这而烦恼，那么这个Leader要好好审视下自己了。&lt;br /&gt;其实分数不是我们考察的重点，在答案满天飞的互联网上，分数只是一个过滤器，让我们可以大面积的筛选掉不合格的人。那么我们的重点就是从及格人员中找出有水分的人，剩下的自然就是合格的人员了，这就需要我们Leader的火眼金睛了，这里我给出一个审核的方案。&lt;br /&gt;笔试题做完了，就是面试了（不及格的直接淘汰出去，不用在面试了），现在我们要对他们的试卷进行问答了，不用问他们做错的题目，而是要问做对的题目，我们要找出他们到底是自己已经掌握了这个知识点还是从网上背的标准答案，现在明确了目的，那么我们就开始对他们做对的题目进行询问，为什么要这样做，为什么那是错误的，要他们说出自己的思路，这样你就可以根据他们的回答来知道这个人是真掌握了还是假的了。&lt;br /&gt;看到这里，发现面试一个合格的人是不是很简单，那么下面要做的就是在合格的人里面选出最符合自己需要的就可以了，其他的合格人员可以放入公司人才库。现在人也招到了，还储备了合适的资源，多好。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="color: #ff0000;"&gt;3-5年：&lt;/span&gt;&lt;br /&gt;对于这个阶段的程序员，我是很反对给他们做笔试题的，但还是有人会要求做，既然你非要做，那么就别看中他的分数。下面我来先讲讲为什么反对给他们做笔试题。&lt;br /&gt;根据我的最佳实践，看过太多合适的，挺不错的程序员都被Leader用不合格的笔试题给淘汰掉了，用笔试题招来的一些人往往又不适用。因为一般工作了3-5年的程序员一般都会在一个特定领域和行业有了一定的经验累积，由于工作的关系，他们只用关注自己工作的那一块就可以了，而且由于长时间不用像毕业的大学生一样要面对这样那样的面试试题，一般在笔试这一块都会很薄弱，就好比现在给你一份高考试题让你来做，你能做多少分？对于全面而又基础的知识点，在工作中会慢慢转化为单一而又深入的研究。我们在对这样的人来进行笔试题的作答显然已经不合适了，往往还会因为笔试题让很多不错的人才流走。&lt;br /&gt;既然我说不要做笔试题，那么我们该怎么做呢？面试，直接进行面试。这个阶段的程序员基本都已经在工作中培养出了解决问题和学习新知识的能力，我们所需要做的技巧基本也集中在挖掘和发现他们解决问题和对新知识掌握的能力，这自然对于Leader的能力也有比较高的要求，因为成与否都在你的面试当中。我的建议是，你面试完后，可以要架构师，高级开发工程师也去进行一道面试，融合多个人的意见，才可以客观评价出应聘者的水平，而且应聘者以后要和架构师，高级开发等同事一起工作，顺便也可以在这里考察沟通和交流能力，以便很好的融合到团队中来。&lt;br /&gt;再让我们具体来看看在面试当中要怎么做，可以出些实际的项目让应聘者去分析怎么去做，说出设计和实现思路，这时你要注意分析应聘者所说的话，找出有问题的地方或抓住应聘者说的某个知识点深入的问下去，其实这一块比较灵活，具体怎么操作看个人了，只要能满足你分析应聘者的能力，随你操作；之后，我们还可以再出一个项目中的难点，来让应聘者回答怎么解决这个难点或者给出更好的实现方法；最后可以随便聊聊，谈谈现在的新技术等。通过上面这些，我们就可以考察出应聘者解决问题和学习新知识的能力了。&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;扑克牌：&lt;br /&gt;&lt;/b&gt;斗地主很火爆，大家应该都会玩，谁不想起手2个鬼牌，4个2，4个A，4个K&amp;hellip;反正最大的都在手上，咋打咋都赢，这可能吗？如果你运气实在是好到爆，我无话可说，那就让我们回归现实吧，打扑克我们不能决定我们起什么样的牌，但招人我们可以选择我们要什么样的牌，虽然不能招到鬼牌，4个2这样的角色，但是我们可以巧妙的安排我们的牌型，搭配出有顺子，有对子，有3个的牌，我们要做的就是打好手上的牌，一样可以取得胜利。&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;最后：&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;其实想在这里再说下，我们不用要变形金刚，超人，一样可以取得胜利。就像打扑克，如果我们起到一手烂牌，只要打的好，也不是没有赢得胜算。更何况招人，我们可以选择搭配想要的牌型，所以我们要做的就是打好我们手上的牌。所以请Leader不要说招不到人，招人难，其实这些都不难，难的是如何打好手中的牌，这才是你要做的，体现你能力的地方。&lt;br /&gt;写到这里我又在思考，是不是要写成系列文章呢？因为原本没有打算写这么多的，只是写着写着，很多想说的就蹦出来了，如果有时间再静下心来思考，我就再接着写下去。&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/bruceli/aggbug/2047644.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bruceli/archive/2011/05/16/2047644.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bruceli/archive/2011/05/09/2041009.html</id><title type="text">不是HR，Leader你到底需要招什么样的程序员（变形金刚？超人？可能吗！）</title><summary type="text">被别人面试过，也面试过别人；揣摩着别人的招聘需求，自己也在写着不着边际的招聘需求，写完一看，我了个去了，我是在招超人吗？突然问自己，我要招什么？是可以实实在在工作的员工，还是电影里面的超人和变形金刚？平时和朋友们坐在一起，看看别人写的招聘需求都会拿出来调侃一番，这哪是在招人啊，这是找超人，要会这，又要会那，有这样的人吗？有，也许可以有，也许是真有，这工资要给多少，给的起吗，给的起能满足这条件的，有多少我要多少。虽然只是饭后调侃，但确实是一个值得我们思考的东西，所以有了下面的文章。</summary><published>2011-05-09T05:12:00Z</published><updated>2011-05-09T05:12:00Z</updated><author><name>布鲁斯.李</name><uri>http://www.cnblogs.com/bruceli/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bruceli/archive/2011/05/09/2041009.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bruceli/archive/2011/05/09/2041009.html"/><content type="html">&lt;p&gt;&lt;b&gt;不是&lt;/b&gt;&lt;b&gt;HR&lt;/b&gt;&lt;b&gt;，&lt;/b&gt;&lt;b&gt;Leader&lt;/b&gt;&lt;b&gt;你到底需要招什么样的程序员&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;------变形金刚？超人？可能吗？&lt;/p&gt;&lt;p&gt;&lt;b&gt;前言：&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;被别人面试过，也面试过别人；揣摩着别人的招聘需求，自己也在写着不着边际的招聘需求，写完一看，我了个去了，我是在招超人吗？突然问自己，我要招什么？是可以实实在在工作的员工，还是电影里面的超人和变形金刚？平时和朋友们坐在一起，看看别人写的招聘需求都会拿出来调侃一番，这哪是在招人啊，这是找超人，要会这，又要会那，有这样的人吗？有，也许可以有，也许是真有，这工资要给多少，给的起吗，给的起能满足这条件的，有多少我要多少。虽然只是饭后调侃，但确实是一个值得我们思考的东西，所以有了下面的文章。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;正文：&lt;/b&gt;&lt;/p&gt;&lt;p&gt;在开始之前我们先来看看我从国内大型招聘网站上摘选的招聘信息，职位都是C#程序员。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;案例1：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #333399;"&gt;工作经验：1-3年&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;1.两年以上的软件开发工作经验； &lt;br /&gt;2.精通C#，具有独立开发能力，具有一定的系统架构能力 &lt;br /&gt;3.熟悉SQL Server、oracle数据库；具有较强的SQL编程能力；&lt;br /&gt;4.熟悉.NET 框架，有较强的逻辑思维能力，熟悉三层架构； &lt;br /&gt;5.有规范化、标准化的代码编写习惯和良好的技术文档习惯； &lt;br /&gt;6.有面向对象的分析、设计和开发经验，熟悉软件开发流程，设计模式，体系结构； 熟悉.net平台，熟练C#编程（其他语言不予考虑），至少两年C#开发经验；&lt;br /&gt;7.有Winform或者控件架构设计开发经验者优先。&lt;br /&gt;8.有Webservice、接口开发经验者优先。&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="color: #ff0000;"&gt;/* 分析&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="color: #ff0000;"&gt;自己先来比对一下，看看可以满足以上几条。反正我看了之后是那个惭愧啊～。&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="color: #ff0000;"&gt;精通C#，具有独立开发能力，具有一定的系统架构能力。来看看这条，就一&amp;ldquo;精通&amp;rdquo;二字，看似简单，但又有几人达到，自认为工作多年，对C#也只敢以熟练使用自称，何谈要一个1-3年的人就精通，精通也就算了，还要具有一定的系统架构能力。什么？我没看错吧，系统架构能力？什么是系统架构？你要搭建什么平台什么系统，架构都搬出来了，有多庞大，你是要找架构师吧我看，对于一个1-3年人，你要求未免也(点点点)，我也只能点点点了。我好像还漏了个具有独立开发能力，这又是什么，你要独立开发多大的东西，不会到时要一个人从架构到设计到文档到开发到调试到发布一人完成，如果真是这样，你就给以初级程序员的职位，不用我来骂你，在屏幕后面看这篇文章的人也因该把你骂的可以了。不过也有让我欣慰的熟悉SQL Server、oracle数据库，这个很实在，但还没等我缓过神来，具有较强的SQL编程能力，这又是什么爹爹，是我理解错误还是挑你语病呢，可以编写SQL语句我理解，写存储过程我知道，写定时任务我也懂，但丫的还要SQL编程能力，你要编什么？到这里我实在是分析不下去了，在分析下去我要骂娘了，虽然我不太爱骂人，但是被写这个招聘需求的人给逼的啊～～～&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="color: #ff0000;"&gt;*/&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;案例2：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #333399;"&gt;工作经验：1-3年&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;岗位职责：&lt;br /&gt;1、完成软件系统代码的实现，编写代码注释和开发文档； &lt;br /&gt;2、辅助进行系统的功能定义,程序设计；&lt;br /&gt;3、根据设计文档或需求说明完成代码编写，调试，测试和维护；&lt;br /&gt;4、分析并解决软件开发过程中的问题；&lt;br /&gt;5、协助测试工程师制定测试计划，定位发现的问题；&lt;br /&gt;6、配合项目经理完成相关任务目标。&lt;/p&gt;&lt;p align="left"&gt;任职资格：&lt;/p&gt;&lt;p align="left"&gt;1、大学本科或以上学历，计算机软件、自动化机电类相关专业毕业；&lt;br /&gt;2、二年以上软件开发经验，有工控软件开发经验者优先；&lt;br /&gt;3、精通.NET（C#）开发程序，熟练掌握GDI+编程、SOA、关系数据库接口等编程技术；&lt;br /&gt;4、具备一定的需求分析和程序设计能力；&lt;br /&gt;5、有责任心，具有较好的沟通能力和团队协作精神，对软件开发有浓厚兴趣。&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="color: #ff0000;"&gt;/* 分析&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="color: #ff0000;"&gt;看完案例1，再来看案例2，心情好了很多，这个招聘需求我是觉得没什么问题，比较合理，要做什么和他们要什么都列的比较清楚，而且符合1-3年人的水平，只是不要没事用精通，都被用烂了，精通是个什么概念？&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="color: #ff0000;"&gt;*/&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;案例3:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #333399;"&gt;工作经验：2年以上&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;1）计算机相关本科毕业及以上学历、从事相关行业2年以上。 &lt;br /&gt;2）精通C#，有2年以上C#开发经验。&lt;br /&gt;3）有良好的编码风格，对面向对象概念有较深认识。&lt;br /&gt;4）有windows平台或Unix（Linux）平台网络应用开发经验者优先。&lt;br /&gt;5）日语3级相当，精通者优先考虑。&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="color: #ff0000;"&gt;/* 分析&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="color: #ff0000;"&gt;多实在的招聘需求啊，简洁明了，大家能不能做，一看就知道，还是老问题，精通，也不说啥了，犯犯小错误是可以接受的。&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="color: #ff0000;"&gt;*/&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;案例4：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #333399;"&gt;工作经验：2年以上&lt;/span&gt;&lt;/p&gt;&lt;p&gt;1、具有一种或多种软件开发工作经验二年以上。 &lt;br /&gt;2、熟悉C# 开发。 &lt;br /&gt;3、懂日语者优先。&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;/* 分析&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;这也简洁的太&amp;hellip;一塌糊涂了，除了实在还是实在，不过个人还是喜欢案例3的简洁又不缺少内容。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;*/&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;好了，看完了上面4个案例，你心中也许有些想法了，下面我要说的只代表我个人观点，也许有些偏激，也许有些不合逻辑，也许有些不靠谱，也许&amp;hellip;,还是引入软件里面常说的，既然不是真理，那么就来个最佳实践，这么多的也许，但我说的也可以是我的最佳实践。&lt;/p&gt;&lt;p&gt;对于不同类型的公司，招聘需求是不一样的，我列举几个典型的公司类型来进行一些说明，我主张在招聘需求里面要明确这几点：明确职位，明确职责和胜任能力，可能还需要列出薪水。其他的东西能去掉就去掉。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;公司A：&lt;/span&gt;大型公司，公司人数&amp;gt;500，开发人员（包括测试美工等相关人员）占40-100人。&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;公司B：&lt;/span&gt;中小型公司,公司人数50-100，开发人员（包括测试美工等相关人员）占15-30。&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;公司C：&lt;/span&gt;要成长创业型公司，公司人数10-15人。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;公司A&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 基本上达到这个规模的小组人员的配置是很细化的，有产品经理，项目经理，美工，测试，架构师，高级开发工程师，初级开发工程师，实习生等。这样我们在明确职位上是很明了的，由于公司发展已经成型，职位基本是固定不变，作为一个小负责人，我们的重点因该从公司发展来考虑，我们招人的目的是什么？人员储备，用来填补有人员流动；人员流动了，需要填补具体职位和负责具体职责；还是小组规模要扩张。针对上面的不同，我们的需求和需要人员的能力是不同的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果是要进行人员储备，对于所做职责我们可以不用具体说明出来，对于能力这一块，可以按照公司现在所用到的技术，根据不同的职位列举出来，例如了解异步通信，或者熟悉缓存等，因为是用作储备，我们可以不太需要具体明确要会什么，只要方向和现有技术相符就行，等人进来了，可以在根据相关需要进行培训和安排。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 人员流动了，但我们现在又需要招一个人来填补他的职位，那么这样的话，我们就需要很明确职责和胜任能力了，要不然招来的人不能马上接手和填补职位，还要对他进行培训的话，那么从人员储备里面安排就可以了。例如现在需要填补职位所做的是和前端开发制定json通信规则和处理js异步请求并提供相应服务和功能。那么我们就要把这作为工作职责写入进去，在需求能力这一块明确写出如：熟练使用C#，json和js异步请求，了解jQuery插件，能用C#熟练编写服务等。不需要对要招的人有太多这样那样的要求，只需要这几点，他就可以马上填补进去并接手工作。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 小组规模扩张就没什么特别需要注意的了，写出公司需要的技术，或者做过相关行业，对目前行业了解和有意图进入的都可以，看自己怎么弄了。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;公司B&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 对于中小型公司其实是可以参照公司A的做法，招人这都是相通，唯一有区别和要注意的就是，公司B的规模没有A那么大，人员配置和具体职位可能没有A那么齐全，会存在一个人身兼多职的情况，这个就是我们要解决的问题了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我们可以参照A公司的职位，对比自己公司现有的职位，并找出哪些职位是没有的，由于我们目前不可能安排这些空缺的职位，但是又需要有人做这一块，这样一个身兼多职的职位就出来了，对于这样的人，我们对他的个人能力要求就要比较高了，列出所需职责和目前所需要会的技能能力，并加上可以提供的薪资，这一点很重要，对于要身兼多职的人，我们要明确职责和能力的同时，写出可以提供的薪资范围（这个薪资要比目标职位目前行业水平高一点），要不然你招进来人，也可能存在不能长期使用，会有很快流动掉的风险。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;公司C&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 对于这样一个公司类型，职位和职责什么的在前期都不是很重要，一般创业初期就是几个高级领导带领新兵来完成，慢慢的扩张规模，高级领导一般都是被安排好了的，经过一段时间的发展，新兵都成长起来，成为老鸟，有人也升为小组负责人了，开始了带领小团队，也开始面临招新人了。其实对于这样的新人，我们更看重的是吃苦能力，因为创业型公司，在初期是很辛苦的，对于能力这一块，我们其实是可以放宽要求，只要逻辑思维能力不差，能动手就行，我们可以招进来慢慢培养，但是要注意观察新人有没有共进退的责任心，这点对于创业公司还是比较重要的。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;总结：&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在word里面写到这里，一看字数统计都3000多字了，没想要写这么长的，想想写这么长，看这篇文章的人也得要有耐心啊。其实这篇文章我也就是把我工作多年的所见和自己的经历整理了一下，零零散散的写了出来，其实想要说的有很多，但是我都删，删，删掉了，希望这篇文章可以对刚升入leader的人和想了解这一块的人有所帮助。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;注意：&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #ff0000;"&gt;要求不高，如果要转载请说明出处和作者就行，写原创的分享文章，只奢求这点。&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/bruceli/aggbug/2041009.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bruceli/archive/2011/05/09/2041009.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bruceli/archive/2011/04/28/2031584.html</id><title type="text">蛋疼的让C#控制台程序（Console）像窗体(Winform)一样（关闭，托盘图标，事件响应，手动退出等）</title><summary type="text">前言：你可以把这篇文章定义为一篇蛋疼的文章，应为这个东西不怎么实用，还费神，没事折腾这做什么。恩，的确，蛋疼。我也同意，就算蛋疼也有它的小众范围，当你不想做webservers，winform等，就想蛋疼的拿控制台来做服务，做程序，行吗？行，但是控制台一点关闭就退出了，有时会点错，控制台没有托盘图标，想最小化到托盘图标等，还有什么蛋疼的想法，来吧，让我们来实现他们。需要了解：console application是控制台程序。控制台不是winform，我们不能设置它的关闭事件等。控制台虽然可以通过添加引用来增加托盘图标，但是托盘图标没有事件。哇，怎么都是不能，那不是不能实现。所以你还需要了解：</summary><published>2011-04-28T04:58:00Z</published><updated>2011-04-28T04:58:00Z</updated><author><name>布鲁斯.李</name><uri>http://www.cnblogs.com/bruceli/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bruceli/archive/2011/04/28/2031584.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bruceli/archive/2011/04/28/2031584.html"/><content type="html">&lt;div&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;前言：&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;你可以把这篇文章定义为一篇蛋疼的文章，应为这个东西不怎么实用，还费神，没事折腾这做什么。恩，的确，蛋疼。我也同意，就算蛋疼也有它的小众范围，当你不想做webservers，winform等，就想蛋疼的拿控制台来做服务，做程序，行吗？行，但是控制台一点关闭就退出了，有时会点错，控制台没有托盘图标，想最小化到托盘图标等，还有什么蛋疼的想法，来吧，让我们来实现他们。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;需要了解：&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;console application是控制台程序。&lt;/div&gt;&lt;div&gt;控制台不是winform，我们不能设置它的关闭事件等。&lt;/div&gt;&lt;div&gt;控制台虽然可以通过添加引用来增加托盘图标，但是托盘图标没有事件。&lt;/div&gt;&lt;div&gt;哇，怎么都是不能，那不是不能实现。&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;所以你还需要了解：&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;我们可以通过引用外部dll的api来捕获到关闭事件等。&lt;/div&gt;&lt;div&gt;我们可以给控制台添加消息事件循环来捕获事件响应让托盘图标可以触发事件。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;那么我们的思路是：&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;禁用关闭按钮，让用户在控制台输入exit进行退出，当控制台被其他事件关闭时可以进行处理。&lt;/div&gt;&lt;div&gt;用Application.DoEvents()来捕获消息事件处理，但是要用死循环来控制，那么我们怎么监听输入呢？&lt;/div&gt;&lt;div&gt;我们在开一个线程用来监听输入。&lt;/div&gt;&lt;div&gt;蛋疼的可以，搞个这还这么麻烦！&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;别慌，还需要你解决的问题：&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;先了解我给出的代码实现了什么。实现了禁用关闭按钮，托盘图标的添加和事件的处理。&lt;/div&gt;&lt;div&gt;你要做的是什么，当然你可以不做，如果你也想蛋疼一下，就来解决下这个问题吧。&lt;/div&gt;&lt;div&gt;退出控制台时，托盘图标没有消失，唉，这是bug，怎么解决？&lt;/div&gt;&lt;div&gt;捕获关闭事件，在要关闭时清除托盘图标。&lt;/div&gt;&lt;div&gt;先告诉你可以实现，我以实验成功，这里没有放出来是让你也蛋疼下。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;好了，代码如下：&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; * 控制台禁用关闭按钮并最小化到系统托盘演示&lt;br /&gt; * &lt;br /&gt; * 通过ConsoleWin32类来进行控制&lt;br /&gt; * 添加引用 System.Runtime.InteropServices; 和 System.Threading; 用于禁用关闭按钮&lt;br /&gt; * 添加引用 System.Drawing; 和 System.Windows.Forms; 用于系统托盘&lt;br /&gt; * &lt;br /&gt; &lt;/span&gt;&lt;span style="color: #008000;"&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;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Linq;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Text;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Runtime.InteropServices;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Threading;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Drawing;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows.Forms;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; Tray_beta_1&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Program&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&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; _IsExit &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: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Main(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] args)&lt;br /&gt;        {&lt;br /&gt;            Console.Title &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: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;TestConsoleLikeWin32&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            ConsoleWin32Helper.ShowNotifyIcon();&lt;br /&gt;            ConsoleWin32Helper.DisableCloseButton(Console.Title);&lt;br /&gt;&lt;br /&gt;            Thread threadMonitorInput &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: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Thread(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ThreadStart(MonitorInput));&lt;br /&gt;            threadMonitorInput.Start();&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;            {&lt;br /&gt;                Application.DoEvents();&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (_IsExit)&lt;br /&gt;                {&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; MonitorInput()&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; input &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Console.ReadLine();&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (input &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: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;exit&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                {&lt;br /&gt;                    _IsExit &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: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                    Thread.CurrentThread.Abort();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; ConsoleWin32Helper&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; ConsoleWin32Helper()&lt;br /&gt;        {&lt;br /&gt;            _NotifyIcon.Icon &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: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Icon(&lt;/span&gt;&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;G:\BruceLi Test\ConsoleAppTest\ConsoleApps\Tray\small.ico&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;            _NotifyIcon.Visible &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: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            _NotifyIcon.Text &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: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;tray&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;            ContextMenu menu &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: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContextMenu();&lt;br /&gt;            MenuItem item &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: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MenuItem();&lt;br /&gt;            item.Text &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: #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;;&lt;br /&gt;            item.Index &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;;&lt;br /&gt;&lt;br /&gt;            menu.MenuItems.Add(item);&lt;br /&gt;            _NotifyIcon.ContextMenu &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; menu;&lt;br /&gt;&lt;br /&gt;            _NotifyIcon.MouseDoubleClick &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: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MouseEventHandler(_NotifyIcon_MouseDoubleClick);&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; _NotifyIcon_MouseDoubleClick(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, MouseEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(&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;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt;&lt;span style="color: #000000;"&gt; 禁用关闭按钮&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        [DllImport(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;User32.dll&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, EntryPoint &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: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FindWindow&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;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;extern&lt;/span&gt;&lt;span style="color: #000000;"&gt; IntPtr FindWindow(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; lpClassName, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; lpWindowName);&lt;br /&gt;&lt;br /&gt;        [DllImport(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;user32.dll&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, EntryPoint &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: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;GetSystemMenu&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;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;extern&lt;/span&gt;&lt;span style="color: #000000;"&gt; IntPtr GetSystemMenu(IntPtr hWnd, IntPtr bRevert);&lt;br /&gt;&lt;br /&gt;        [DllImport(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;user32.dll&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, EntryPoint &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: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;RemoveMenu&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;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;extern&lt;/span&gt;&lt;span style="color: #000000;"&gt; IntPtr RemoveMenu(IntPtr hMenu, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;uint&lt;/span&gt;&lt;span style="color: #000000;"&gt; uPosition, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;uint&lt;/span&gt;&lt;span style="color: #000000;"&gt; uFlags);&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 禁用关闭按钮&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="consoleName"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;控制台名字&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; DisableCloseButton(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; title)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;线程睡眠，确保closebtn中能够正常FindWindow，否则有时会Find失败。。&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            Thread.Sleep(&lt;/span&gt;&lt;span style="color: #800080;"&gt;100&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;br /&gt;            IntPtr windowHandle &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; FindWindow(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;, title);&lt;br /&gt;            IntPtr closeMenu &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetSystemMenu(windowHandle, IntPtr.Zero);&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;uint&lt;/span&gt;&lt;span style="color: #000000;"&gt; SC_CLOSE &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;0xF060&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            RemoveMenu(closeMenu, SC_CLOSE, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0x0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&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; IsExistsConsole(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; title)&lt;br /&gt;        {&lt;br /&gt;            IntPtr windowHandle &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; FindWindow(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;, title);&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (windowHandle.Equals(IntPtr.Zero)) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &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;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt;&lt;span style="color: #000000;"&gt; 托盘图标&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; NotifyIcon _NotifyIcon &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: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; NotifyIcon();&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; ShowNotifyIcon()&lt;br /&gt;        {&lt;br /&gt;            _NotifyIcon.Visible &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: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            _NotifyIcon.ShowBalloonTip(&lt;/span&gt;&lt;span style="color: #800080;"&gt;3000&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&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: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, ToolTipIcon.None);&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; HideNotifyIcon()&lt;br /&gt;        {&lt;br /&gt;            _NotifyIcon.Visible &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: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;END：&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;来建立个项目把代码copy进去也蛋疼下吧！&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;附加题：&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;还有一个小蛋疼的地方，就是后台运行，从任务栏隐藏，只留托盘图标，自己思考下吧，都可以实现。&lt;/div&gt;&lt;img src="http://www.cnblogs.com/bruceli/aggbug/2031584.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bruceli/archive/2011/04/28/2031584.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bruceli/archive/2011/04/27/2029431.html</id><title type="text">一步一步教你搭建win7下的Node.js服务（来玩玩服务器端的javascript吧，这可不是前端js插件）</title><summary type="text">什么是Node.js?还服务器端javascript?对于这个概念我在这篇文章不做解释，可以自己去搜索了解下，服务器端js不是新技术，只是最近的node.js的火爆让他爆发了，我会在以后的文章里解释什么是node.js。这里只是纯粹的搭建，连环境都没有，还玩什么服务器端js，一切都成了浮云，让我们先搭建一个环境，输入一个“hello world”的页面。对的，win7下的搭建，你只需一步一步跟着我做，就ok了，不用去了解过多的细节，那不是我们现在要关心的，我们现在首要目的是把环境搭建好，要不然就没有下一步了。Step 1. 下载node.js在windows下是要安装在Cygwin下的，去Cy</summary><published>2011-04-27T03:11:00Z</published><updated>2011-04-27T03:11:00Z</updated><author><name>布鲁斯.李</name><uri>http://www.cnblogs.com/bruceli/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bruceli/archive/2011/04/27/2029431.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bruceli/archive/2011/04/27/2029431.html"/><content type="html">&lt;p&gt;什么是Node.js?还服务器端javascript?对于这个概念我在这篇文章不做解释，可以自己去搜索了解下，服务器端js不是新技术，只是最近的node.js的火爆让他爆发了，我会在以后的文章里解释什么是node.js。这里只是纯粹的搭建，连环境都没有，还玩什么服务器端js，一切都成了浮云，让我们先搭建一个环境，输入一个&amp;ldquo;hello world&amp;rdquo;的页面。&lt;br /&gt;&lt;br /&gt;对的，win7下的搭建，你只需一步一步跟着我做，就ok了，不用去了解过多的细节，那不是我们现在要关心的，我们现在首要目的是把环境搭建好，要不然就没有下一步了。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;Step 1. 下载&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;node.js在windows下是要安装在Cygwin下的，去Cygwin网站下载Cygwin安装程序。&lt;/p&gt;&lt;p&gt;Cygwin网站：&lt;a href="http://cygwin.com/"&gt;http://cygwin.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;直接下载地址：&lt;a href="http://cygwin.com/setup.exe"&gt;http://cygwin.com/setup.exe&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size: 16px;"&gt;Step 2. 安装&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;安装你下下来的Cygwin程序，基本上只需下一步就可以。&lt;/p&gt;&lt;p&gt;在Choose A Download Source界面选择-》install from internet&lt;/p&gt;&lt;p&gt;在Select Your Internet Connection界面选择-》Direct Connect&lt;/p&gt;&lt;p&gt;在Choose A Download Site界面选择-》这个自己选择了，就是选择下载的镜像，&lt;span style="color: #ff0000;"&gt;推荐使用.jp结尾的日本网站，速度比较快&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;注意&lt;/span&gt;：如果你是首次安装，可能会弹出警告提示，不管管他，点击ok就可以。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;Step 3. 选择安装组件&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff0000;"&gt;注意&lt;/span&gt;：由于组件较多，建议使用搜索的方式来查找。&lt;span style="color: #0000ff;"&gt;点击名字即可选中，选中后后面会有一个小方块，里面有X（叉）表示选中&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Devel 分类&lt;/strong&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;gcc-g++&lt;/span&gt;: C++ compiler &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;gcc-mingw-g++&lt;/span&gt;: Mingw32 support headers and libraries for GCC C++ &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;gcc4-g++&lt;/span&gt;: G++ subpackage &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;git&lt;/span&gt;: Fast Version Control System &amp;ndash; core files&amp;nbsp; &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;make&lt;/span&gt;: The GNU version of the 'make' utility &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;openssl-devel&lt;/span&gt;: The OpenSSL development environment &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;pkg-config&lt;/span&gt;: A utility used to retrieve information about installed libraries &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;zlib-devel&lt;/span&gt;: The zlib compression/decompression library (development) &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Editor 分类&lt;/strong&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;vim&lt;/span&gt;: Vi IMproved - enhanced vi editor &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Python 分类&lt;/strong&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;全部&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff0000;"&gt;注意&lt;/span&gt;：全部安裝，你只要点选 Python 右边的图标切换至 Install 即可。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Web 分类&lt;/strong&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;wget&lt;/span&gt;: Utility to retrieve files from the WWW via HTTP and FTP &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;curl&lt;/span&gt;: Multi-protocol file transfer command-line tool &lt;/p&gt;&lt;p&gt;下一步之后会提示你有许多相依的组件需要安装，基本上直接按下一步即可。&lt;br /&gt;&lt;span style="color: #ff0000;"&gt;注意&lt;/span&gt;：由于组件都是在线下载，可能有点漫长，等待即可。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;Step 4. 运行ash.exe&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;安装完后会在桌面生成图标(如果你选了在桌面生成图标项的话），&lt;span style="color: #ff0000;"&gt;注意不是运行这个图标！&lt;/span&gt;&lt;/p&gt;&lt;p&gt;打开文件夹，进入C:\cygwin\bin\ 目录中，这个是默认的安装目录，如果你修改过安装目录，自己进入到cygwin的安装目录下的bin目录中。&lt;/p&gt;&lt;p&gt;运行ash.exe&lt;/p&gt;&lt;p&gt;在弹出的命令窗口中执行 ./rebaseall -v 命令&lt;/p&gt;&lt;p&gt;等命令执行完成执行 exit 退出 ash&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;Step 5. 下载并安装Node.js&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;运行桌面上的Cygwin程序。&lt;/p&gt;&lt;p&gt;在命令窗口中输入 wget &lt;a href="http://nodejs.org/dist/node-v0.4.7.tar.gz"&gt;http://nodejs.org/dist/node-v0.4.7.tar.gz&lt;/a&gt;&amp;nbsp;回车。&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;注意&lt;/span&gt;：我在写这篇文章是node.js的最新版本是node-v0.4.7，&amp;nbsp;&lt;a href="http://nodejs.org/dist/node-v0.4.7.tar.gz"&gt;http://nodejs.org/dist/node-v0.4.7.tar.gz&lt;/a&gt;&amp;nbsp;是node.js的下载地址，你在看这篇文章时可以自己去node.js的网站获取最新的下载路径替换就可以了&lt;/p&gt;&lt;p&gt;Node.js网站：&lt;a href="http://nodejs.org/"&gt;http://nodejs.org/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;在命令窗口中输入 tar xf node-v0.4.7.tar.gz 回车，node-v0.4.7.tar.gz为你自己下载的版本。&lt;/p&gt;&lt;p&gt;在命令窗口中输入 cd node-v0.4.7 回车。&lt;/p&gt;&lt;p&gt;在命令窗口中输入 ./configure 回车。&lt;/p&gt;&lt;p&gt;在命令窗口中输入 make 回车。&lt;/p&gt;&lt;p&gt;在命令窗口中输入 make install 回车。&lt;/p&gt;&lt;p&gt;ok，到这里你已经安装完成node.js了&lt;/p&gt;&lt;p&gt;在命令窗口中输入 node --version 回车，看看你的node.js版本。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;Step 6. 设置DNS&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;打开文件夹，进入到C:\cygwin\etc\&amp;nbsp; 文件夹下。&lt;/p&gt;&lt;p&gt;手动建立 resolv.conf 文件。&lt;/p&gt;&lt;p&gt;用记事本打开刚建立的resolv.conf文件，添加如下&lt;/p&gt;&lt;p&gt;nameserver 8.8.8.8&lt;br /&gt;nameserver 8.8.4.4&lt;br /&gt;保存并关闭。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;Step End. 测试Node.js是否可以运行&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;到此你就已经搭建完成了，但是不知道是否可以正确运行，那么，下面让我们来写个示例文件来测试下。&lt;/p&gt;&lt;p&gt;在C:\cygwin\ 目录下建立 example.js&lt;/p&gt;&lt;p&gt;输入&lt;br /&gt;var http = require('http');&lt;/p&gt;&lt;p&gt;http.createServer(function (request, response) {&lt;br /&gt;&amp;nbsp; response.writeHead(200, {'Content-Type': 'text/html'});&lt;br /&gt;&amp;nbsp; response.end('&amp;lt;b&amp;gt;Hello World&amp;lt;/b&amp;gt;');&lt;br /&gt;}).listen(8888);&lt;/p&gt;&lt;p&gt;console.log('Server running at &lt;a href="http://127.0.0.1:8124/'"&gt;http://127.0.0.1:8888/'&lt;/a&gt;);&lt;/p&gt;&lt;p&gt;保存（&lt;span style="color: #ff0000;"&gt;注意：保存为UTF-8格式，要不然会报语法错误&lt;/span&gt;）。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;运行cygwin，在命令窗口中输入 node /example.js 回车&lt;/p&gt;&lt;p&gt;是否看见了Server running at &lt;a href="http://127.0.0.1:8124/'"&gt;http://127.0.0.1:8888/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;不要关闭cygwin，打开浏览器，访问&lt;a href="http://127.0.0.1:8124/'"&gt;http://127.0.0.1:8888/&lt;/a&gt;&amp;nbsp;看看是否出现了hello world的页面。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/bruceli/aggbug/2029431.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bruceli/archive/2011/04/27/2029431.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bruceli/archive/2011/04/25/2027233.html</id><title type="text">[源码解读]Silverlight 4 中对不规则对象进行碰撞检测（在游戏中常使用的是否碰撞怪物边界等原理）</title><summary type="text">在以前的Silverlight中，有个HitTest方法可以用来完成碰撞的检测。But，Older versions (pre 3.0) did have a HitTestmethod！在Silverlight4中就不可以使用HitTest方法来完成了。那么我们要该怎么做？下面我会解读一个国外的源代码，让大家了解怎么进行碰撞检测。会使用到一个方法FindElementsInHostCoordinates，这个是用来替代没有HitTest来检测碰撞。还有一个方法作为基础就是Intersect方法，用来确立相交的范围。DEMO:http://www.andybeaulieu.com/silver</summary><published>2011-04-25T06:04:00Z</published><updated>2011-04-25T06:04:00Z</updated><author><name>布鲁斯.李</name><uri>http://www.cnblogs.com/bruceli/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bruceli/archive/2011/04/25/2027233.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bruceli/archive/2011/04/25/2027233.html"/><content type="html">&lt;div&gt;在以前的Silverlight中，有个HitTest方法可以用来完成碰撞的检测。&lt;/div&gt;&lt;div&gt;But，Older versions (pre 3.0) did have a HitTest&amp;nbsp;method！&lt;/div&gt;&lt;div&gt;在Silverlight4中就不可以使用HitTest方法来完成了。那么我们要该怎么做？&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;下面我会解读一个国外的源代码，让大家了解怎么进行碰撞检测。&lt;/div&gt;&lt;div&gt;会使用到一个方法FindElementsInHostCoordinates，这个是用来替代没有HitTest来检测碰撞。&lt;/div&gt;&lt;div&gt;还有一个方法作为基础就是Intersect方法，用来确立相交的范围。&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;DEMO:&lt;a href="http://www.andybeaulieu.com/silverlight/2.0/hittest/clientbin/testpage.html"&gt;http://www.andybeaulieu.com/silverlight/2.0/hittest/clientbin/testpage.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;原博客地址（可下载源码）：&lt;a href="http://www.andybeaulieu.com/Default.aspx?tabid=67&amp;amp;EntryID=95"&gt;http://www.andybeaulieu.com/Default.aspx?tabid=67&amp;amp;EntryID=95&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="background-color: #ffcc00;"&gt;碰撞原理：&lt;/span&gt;&lt;/div&gt;&lt;div&gt;我们把不规则的两个元素用矩形框来框起来，表示最大的范围，当两个矩形框想碰撞时，我们取出相交的范围，用Intersect方法，但是矩形相交不代表实际的对象是相交的，所以我们还需要遍历交集范围内的每一个点像素，看相交的两个物体是否都在这个点像素上，用FindElementsInHostCoordinates，如果都在，则表示碰撞。&lt;/div&gt;&lt;div&gt;&lt;span style="background-color: #ffcc00;"&gt;代码展示（我已加上中文注释，根据原理加上注释可以和方便的理解下面代码）：&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Linq;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Net;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows.Controls;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows.Documents;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows.Input;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows.Media;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows.Media.Animation;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows.Shapes;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; HitTest&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;partial&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Page : UserControl&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; Page()&lt;br /&gt;        {&lt;br /&gt;            InitializeComponent();&lt;br /&gt;&lt;br /&gt;            &lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; UserControl_MouseMove(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, MouseEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            Point pt &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; e.GetPosition(cnvHitTest);&lt;br /&gt;&lt;br /&gt;            ship.SetValue(Canvas.LeftProperty, pt.X);&lt;br /&gt;            ship.SetValue(Canvas.TopProperty, pt.Y);&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; lets get pointers to the actual UI elements we care about:&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 获得飞船的Path坐标&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            Path shipShell &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; ship.FindName(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ShipShell&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;as&lt;/span&gt;&lt;span style="color: #000000;"&gt; Path;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 获得陨石的path坐标&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            Path cnvAsteroid &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; asteroid.FindName(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;asteroidBig&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;as&lt;/span&gt;&lt;span style="color: #000000;"&gt; Path;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 检测碰撞 &lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; ship 飞船的用户控件（矩形大范围）&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; shipShell 飞船的外壳Path坐标&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; asteroid 陨石的用户控件（矩形大范围）&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; cnvAsteroid 陨石的外壳Path坐标&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (CheckCollision(ship, shipShell, asteroid, cnvAsteroid))&lt;br /&gt;                txtStatus.Text &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: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Collision!&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;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                txtStatus.Text &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: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;no collision&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;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&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; CheckCollision(FrameworkElement control1, FrameworkElement controlElem1, FrameworkElement control2, FrameworkElement controlElem2)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; first see if sprite rectangles collide&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 用户控件使用的是Canvas，我们现在要把用户控件的Canvas转换成矩形表示&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; UserControlBounds()用于转换为矩形来表示编辑&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; rect1 为飞船矩形&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; rect2 为陨石矩形&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; control1 为飞船用户控件（矩形）&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; control2 为运行用户控件（矩形）&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            Rect rect1 &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; UserControlBounds(control1);&lt;br /&gt;            Rect rect2 &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; UserControlBounds(control2);&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Intersect(Rect) 查找当前矩形和指定矩形的交集，并将结果存储为当前矩形。&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            rect1.Intersect(rect2);&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (rect1 &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; Rect.Empty)  &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 为空为矩形没有交集，那么飞船和陨石没有碰撞&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; no collision - GET OUT!&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &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;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;   &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 不为空，有交集，返回交集，但不表示飞船就和陨石有碰撞，需要进行更细致的判断&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&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; bCollision &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: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;      &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 是否碰撞&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                Point ptCheck &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: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Point();  &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 点检测&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; now we do a more accurate pixel hit test&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 进行精确的点测试&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 以行为单位，循环扫描矩形内的每个点&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 在这里rect1为交集的矩形&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; x &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Convert.ToInt32(rect1.X); x &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; Convert.ToInt32(rect1.X &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; rect1.Width); x&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                {&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 遍历行中的每个点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; y &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Convert.ToInt32(rect1.Y); y &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; Convert.ToInt32(rect1.Y &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; rect1.Height); y&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                    {&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 行增加&lt;br /&gt;&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;设置检测点的坐标&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                        ptCheck.X &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; x;&lt;br /&gt;                        ptCheck.Y &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; y;&lt;br /&gt;&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 用FindElementsInHostCoordinates方法找出飞船用户控件中在点ptCheck上的element元素&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                        List&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;UIElement&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; hits &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows.Media.VisualTreeHelper.FindElementsInHostCoordinates(ptCheck, control1) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;as&lt;/span&gt;&lt;span style="color: #000000;"&gt; List&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;UIElement&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: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; controlElem1 为实际的飞船&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (hits.Contains(controlElem1)) &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; hits里面装的是飞船用户控件中所有在点ptCheck中的元素，看实际的飞船是否在其中&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                        {&lt;br /&gt;                            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; we have a hit on the first control elem, now see if the second elem has a similar hit&lt;br /&gt;                            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 我们检测的飞船，还需要看点是否也在陨石中&lt;br /&gt;                            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 同上面获取hits的方法，找出陨石控件中在点ptCheck上的element元素&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                            List&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;UIElement&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; hits2 &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows.Media.VisualTreeHelper.FindElementsInHostCoordinates(ptCheck, control2) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;as&lt;/span&gt;&lt;span style="color: #000000;"&gt; List&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;UIElement&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: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; controlElem2 为实际的陨石&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (hits2.Contains(controlElem2))  &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; hits2里面装的是陨石用户控件中所有在点ptCheck中的元素，看实际的陨石是否在其中&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                            {&lt;br /&gt;                                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 够满足条件，是碰撞&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                                bCollision &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: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (bCollision) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&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; bCollision;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; Rect UserControlBounds(FrameworkElement control)&lt;br /&gt;        {&lt;br /&gt;            Point ptTopLeft &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: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Point(Convert.ToDouble(control.GetValue(Canvas.LeftProperty)), Convert.ToDouble(control.GetValue(Canvas.TopProperty)));&lt;br /&gt;            Point ptBottomRight &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: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Point(Convert.ToDouble(control.GetValue(Canvas.LeftProperty)) &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; control.Width, Convert.ToDouble(control.GetValue(Canvas.TopProperty)) &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; control.Height);&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; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Rect(ptTopLeft, ptBottomRight);&lt;br /&gt;        }&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;div&gt;代码很少，但是当你理解了碰撞的原理和使用的核心方法，只要你有想法，都可以做出很复杂的碰撞检测。&lt;/div&gt;&lt;img src="http://www.cnblogs.com/bruceli/aggbug/2027233.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bruceli/archive/2011/04/25/2027233.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bruceli/archive/2011/04/18/2017278.html</id><title type="text">程序员如何在&amp;quot;小公司成长&amp;quot;和&amp;quot;大公司学习&amp;quot;</title><summary type="text">在软件行业工作有几个年头了，换过多个开发语言，跳过槽，也被猎头找过，经历了三五杆枪打天下和创业公司一起成长灭亡，也进入了大公司。在这些年的历练中，看见很多刚进入软件行业不久的新人总在抱怨，说学不到东西。其实不管你在大公司还是小公司，都可以学到很多东西，关键看你怎么去学习，如何学习，找到方法你就可以提高很快。</summary><published>2011-04-18T02:53:00Z</published><updated>2011-04-18T02:53:00Z</updated><author><name>布鲁斯.李</name><uri>http://www.cnblogs.com/bruceli/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bruceli/archive/2011/04/18/2017278.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bruceli/archive/2011/04/18/2017278.html"/><content type="html">&lt;p&gt;&lt;span style="color: #ff0000;"&gt;注：这篇文章会带有普遍性，不见得适合所有人，或者文章所描述的也不见得是对的，只是根据我的经历和所见写成的一篇文章，仅供参考。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;如要转载，请注明原作者和出处，尊重别人的劳动成果。&lt;br /&gt;&lt;a href="http://www.cnblogs.com/bruceli/archive/2011/04/18/2017278.html"&gt;http://www.cnblogs.com/bruceli/archive/2011/04/18/2017278.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="color: #333399; background-color: #ffff99;"&gt;前言：&lt;/span&gt;&lt;br /&gt;在软件行业工作有几个年头了，换过多个开发语言，跳过槽，也被猎头找过，经历了三五杆枪打天下和创业公司一起成长灭亡，也进入了大公司。在这些年的历练中，看见很多刚进入软件行业不久的新人总在抱怨，说学不到东西。其实不管你在大公司还是小公司，都可以学到很多东西，关键看你怎么去学习，如何学习，找到方法你就可以提高很快。&lt;br /&gt;&lt;br /&gt;如果你已经知道如何在你的工作当中学习，那么下面的文章就走马观花的看看吧，这篇文章是给还在迷茫怎么去学习和成长的新人一些指点。所有意见仅供参考，我也是根据我的所见所闻和经历来做些指导，不见得是正确的，如果大家有好的学习方法，欢迎交流。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #333399; background-color: #ffff99;"&gt;正文：&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000080;"&gt;先来说说几个情况：&lt;/span&gt;&lt;br /&gt;大公司A：不想干了，什么都学不到，每天都维护这一个东西，都想去小公司。&lt;br /&gt;小公司B：累死了，什么都做，太乱太杂，没系统不规范，要是能去大公司多好。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;看了这两段简短的话，我相信有一部分人会很有感触。&lt;/p&gt;&lt;p&gt;从上面的话中，我们不难看出，大公司的员工羡慕小公司，可以学到很多东西，好多程序员还是很有钻研精神的，学习可以说是他们的一个乐趣和展示自我价值，我身边的一个同事就是典型的如果得不到成长和学习新的东西，就会不爽。小公司的员工又会抱怨太累太杂，什么都是一个人做，虽然做了好多东西，但很羡慕大公司的正规化。&lt;br /&gt;&lt;br /&gt;其实想解决这些问题不难，先调整好心态，只有一个好的心态，你才可能健康成长。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000080; background-color: #ffff99;"&gt;在小公司成长：&lt;/span&gt;&lt;br /&gt;好多小公司都是3，4个人一个小组，工作量大，加班，杂，什么都要做，就连测试都还要亲历亲为，怎么看怎么觉得这不是人待的地方，被严重剥削的廉价劳动力。&lt;br /&gt;怎么说的小公司一无是处呢，其实也不是的，我们要从当中看到优势，我们才有可能进步，逆向思维下，工作量大，杂是坏事吗，在我认为，对于一个想真正成长，想将来进入大公司，或者有一番作为的人，这正是小公司的优势和有点。小公司的员工有一个普遍性，就是学历技术都很普通，无法很好的进入到大公司，也只能在小公司游走，但心里也有抱负和理想，那么我们就要好好利用小公司的工作量大和杂，在这当中锻炼自己，提高自己的技术和基本功。&lt;br /&gt;杂，在我认为这是一个很好的东西，就是因为人少，所以我们在小公司得什么都做，这样有个优势，就是让你可以接触到很广泛的东西，有可能连架构设计都要自己去处理，BT点的说不定图都要自己去PS，再来看看做的这些事情，如果把它拼接起来是多么大的一张蓝图啊，你要做的就是在工作不断努力去学习，花大量的时间去看书，去了解蓝图中的每一块是怎么去衔接有什么关联，当你把这都弄熟了这后，我想没有哪一家大公司是不会不要你的，应为你已经具备了超强的能力。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000080; background-color: #ffff99;"&gt;在大公司学习：&lt;/span&gt;&lt;br /&gt;大公司都已经形成了很好的规模，人尽其责，基本上每个人只用负责一块内容，这将会导致成长很满，学不到东西，虽然可以把一块做的很精，但有好多东西没有什么深度，如果长期维护将会导致你停止进步。那么如何去学习呢？学习还是得靠自己的努力。在大公司学习有一个好处就是，有现成的架构，有架构师来维护，有优秀的高级开发，可以写出漂亮的优秀的代码，这些人不都是很好的学习对象吗？有人会说，不可能和他们说架构来给我上上课讲讲，高级开发来教我怎么学好这段代码。其实不用去找他们，现成的东西就在你的眼前。什么？你没看见，那我告诉你，就是你的开发工具。啊，你这不是忽悠我吗。那么我问你，你的开发工具上是不是有你们公司项目的源代码？源代码就是最好的学习资料，你可以直接去看你们的源代码，看看你们的架构，了解和学习这个架构是怎么搭建，看看高级开发写的代码，你不用去走万里路就可以把这些先进和优秀的东西都装进你的知识库中。站在巨人的肩膀上去前进。&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080; background-color: #ffff99;"&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;/span&gt;&lt;br /&gt;有这么一句老话，让我们来听听&amp;ldquo;读万卷书，不如行万里路，行万里路不如名师指路。&amp;rdquo;&lt;br /&gt;还有变化版&amp;ldquo;读万卷书，不如行万里路，行万里路不如跟随成功人的脚步。&amp;rdquo;&lt;br /&gt;其实我们在小公司就如行万里路，我们只有多做多学在可以迈出去。在大公司就我们就要跟随成功人的脚步，就是你们公司的架构师和高级开发，去了解他们。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="color: #333399;"&gt;最最重要的一点：学习还是要靠自己努力，只要你努力，就会成功，就算不成功你也会成仁。&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/bruceli/aggbug/2017278.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bruceli/archive/2011/04/18/2017278.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bruceli/archive/2011/04/11/2012470.html</id><title type="text">[优秀源码解读]国外大牛IE版本检测！现在IE都到9了，以前的IE检测代码是不是有的不好用了？</title><summary type="text">有时会去看看国外大牛的一些代码，并学习，引用，并感叹大牛就是大牛，差距不是一点点，也在一点点的感叹中慢慢拉进和大牛的距离。其实学习大牛源代码是一种很好的进步，可以给你一种新的视野。看到这篇大牛的IE版本检测，只能是惊叹加惊叹。短短的代码中所包含的内容实在是太多了。所以在这里决定来解读大牛的源代码，让准备向大牛靠近并还在努力的IT同人们从中学习到更多的知识。</summary><published>2011-04-11T06:13:00Z</published><updated>2011-04-11T06:13:00Z</updated><author><name>布鲁斯.李</name><uri>http://www.cnblogs.com/bruceli/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bruceli/archive/2011/04/11/2012470.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bruceli/archive/2011/04/11/2012470.html"/><content type="html">&lt;div&gt;有时会去看看国外大牛的一些代码，并学习，引用，并感叹大牛就是大牛，差距不是一点点，也在一点点的感叹中慢慢拉进和大牛的距离。&lt;/div&gt;&lt;div&gt;其实学习大牛源代码是一种很好的进步，可以给你一种新的视野。&lt;/div&gt;&lt;div&gt;看到这篇大牛的IE版本检测，只能是惊叹加惊叹。短短的代码中所包含的内容实在是太多了。&lt;/div&gt;&lt;div&gt;所以在这里决定来解读大牛的源代码，让准备向大牛靠近并还在努力的IT同人们从中学习到更多的知识。&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;我们先来看看一个世界最短ie检测代码：&lt;/div&gt;&lt;div&gt;&lt;code class="jscript keyword"&gt;var&lt;/code&gt; &lt;code class="jscript plain"&gt;isIE = !-[1,];&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code class="jscript plain"&gt;是不是很熟悉，但是有bug，就是不能检测ie9，为什么呢？那是因为这是国外大牛在ie9出来之前利用ie对数组转换的特性来完成的。ie9中已经进行了修复，所以在ie9中失效了，但是作为当时的我，还是感叹+感叹，大牛们对细节的研究和如此的深入（当时我也沉迷在如何用最短的代码来实现一个功能和方法，不断的修改+修改，可还是....这就是差距，差距）。&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code class="jscript plain"&gt;这段世界最短ie检测的代码我就不解读和分析了，毕竟对于现在有bug了，不能向后兼容，我的重点是下面的ie完美检测，理论上是向后兼容的，例如出来IE10，ok，用它，没问题，再一次提现差距。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;下面来看看源代码先（&lt;span style="color: #ff0000;"&gt;我会在后面解读大牛思想和代码中的难点讲解&lt;/span&gt;）&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;code class="jscript plain"&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;// ----------------------------------------------------------&lt;br/&gt;// A short snippet for detecting versions of IE in JavaScript&lt;br/&gt;// without resorting to user-agent sniffing&lt;br/&gt;// ----------------------------------------------------------&lt;br/&gt;// If you're not in IE (or IE version is less than 5) then:&lt;br/&gt;//     ie === undefined&lt;br/&gt;// If you're in IE (&amp;gt;=5) then you can determine which version:&lt;br/&gt;//     ie === 7; // IE7&lt;br/&gt;// Thus, to detect IE:&lt;br/&gt;//     if (ie) {}&lt;br/&gt;// And to detect the version:&lt;br/&gt;//     ie === 6 // IE6&lt;br/&gt;//     ie &amp;gt; 7 // IE8, IE9 ...&lt;br/&gt;//     ie &amp;lt; 9 // Anything less than IE9&lt;br/&gt;// ----------------------------------------------------------&lt;br/&gt; &lt;br/&gt;// UPDATE: Now using Live NodeList idea from @jdalton&lt;br/&gt; &lt;br/&gt;var ie = (function(){&lt;br/&gt; &lt;br/&gt;    var undef,&lt;br/&gt;        v = 3,&lt;br/&gt;        div = document.createElement('div'),&lt;br/&gt;        all = div.getElementsByTagName('i');&lt;br/&gt; &lt;br/&gt;    while (&lt;br/&gt;        div.innerHTML = '&amp;lt;!--[if gt IE ' + (++v) + ']&amp;gt;&amp;lt;i&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;![endif]--&amp;gt;',&lt;br/&gt;        all[0]&lt;br/&gt;    );&lt;br/&gt; &lt;br/&gt;    return v &amp;gt; 4 ? v : undef;&lt;br/&gt; &lt;br/&gt;}());&lt;br/&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;一个很精辟的代码，但可以完美检测出ie的各个版，还可以一次按范围检测，在源码的注释中教练你怎么使用。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000080;"&gt;原理：&lt;/span&gt;&lt;/div&gt;&lt;div&gt;动态创建一个div，利用ie条件注释来往里面插入一个i标签，在来检测i标签是否添加来判断是否是ie浏览器。在while中不断循环来比对ie的版本。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000080;"&gt;下面我们来理解这段代码：&lt;/span&gt;&lt;br /&gt;var undef,&lt;br /&gt;v = 3,&lt;br /&gt;div = document.createElement('div'),&lt;br /&gt;all = div.getElementsByTagName('i');&lt;/div&gt;&lt;div&gt;//这段好理解，声明变量和创建一个div，获取div中的i&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;div.innerHTML = '&amp;lt;!--[if gt IE ' + (++v) + ']&amp;gt;&amp;lt;i&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;![endif]--&amp;gt;',&lt;br /&gt;//这个就是核心，利用的ie条件注释来完成，ie的条件注释是向后兼容的，所以可以用这检测以后出的ie10，如果下一个版本叫ie10的话。&lt;/div&gt;&lt;div&gt;关于ie条件注释，大家可以自己在网上查找，很容易找到的。[if IE 7][if gt IE 7]有很多模式的，我这里就不讲解这个条件注释，做过web前端兼容的应该对这还是比较了解的。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #ff9900;"&gt;难点：&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="background-color: #ff9900;"&gt;&lt;span class="kw1"&gt;while&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #ff9900;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; div.&lt;span class="me1"&gt;innerHTML&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="st0"&gt;'&amp;lt;!--[if gt IE '&lt;/span&gt; &lt;span class="sy0"&gt;+&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="sy0"&gt;++&lt;/span&gt;v&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;+&lt;/span&gt; &lt;span class="st0"&gt;']&amp;gt;&amp;lt;i&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;![endif]--&amp;gt;'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #ff9900;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; all&lt;span class="br0"&gt;[&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #ff9900;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #000080; background-color: #ffffff;"&gt;&lt;span class="sy0"&gt;﻿&lt;/span&gt;what?while（表达式1，表达式2） 这是what？和我们学的while（表达式）不一样？&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #ff0000;"&gt;小技巧，while中如果有多个表达式，以最后一个表达式作为跳出的判断，前面的表达式，不管有多少个，都不会作为跳出的判断，而是执行里面的代码。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #ff0000;"&gt;例如：while（表达是1，表达是2，表达式3，表达式4） 只以表达式4的true或者false作为跳出判断。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #ff0000;"&gt;额滴神，还可以这样，长见识了吧，赶快去试试，这就是大牛的代码，只能惊叹+惊叹！&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;到这里就完了，短短几行的代码，是多么的优雅。希望大家能从中学习到想要的知识和开阔你的视野。&lt;/div&gt;&lt;div&gt;The End.&lt;/div&gt;&lt;/code&gt;&lt;img src="http://www.cnblogs.com/bruceli/aggbug/2012470.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bruceli/archive/2011/04/11/2012470.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bruceli/archive/2011/04/07/2007931.html</id><title type="text">IE的&amp;quot;Kiosk&amp;quot;模式（你想要的啥都没有的全屏）</title><summary type="text">什么是"Kiosk"模式？通俗的说就是全屏（不同于F１１全屏），是啥都没有的全屏，无地址栏，无ｗｉｎｄｏｗｓ状态栏等等，就是一裸的ｗｅｂ页面和滚动条。</summary><published>2011-04-07T07:13:00Z</published><updated>2011-04-07T07:13:00Z</updated><author><name>布鲁斯.李</name><uri>http://www.cnblogs.com/bruceli/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bruceli/archive/2011/04/07/2007931.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bruceli/archive/2011/04/07/2007931.html"/><content type="html">&lt;p&gt;什么是"Kiosk"模式？&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;通俗的说就是全屏（不同于F１１全屏），是啥都没有的全屏，无地址栏，无ｗｉｎｄｏｗｓ状态栏等等，就是一裸的ｗｅｂ页面和滚动条。&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Tip：&lt;/p&gt;&lt;p&gt;Kiosk Software广泛用于公共电脑或者嵌入系统，最常用的就是ATM机、自动服务机之类的系统了，其实他们很多都只是一个浏览器，虽然用Alt+Tab组合键就可以随意切换，但是一般的Kiosk系统不会给你这样的键盘滴。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;如何打开"Kiosk"模式？&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000080;"&gt;运行（ｗｉｎ＋Ｒ键）输入　C:\Program Files\Internet Explorer\iexplore.exe -k　回车。就这么简单，赶快动手试试。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;如何打开指定页面请认真看下面的帮助信息！&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;下面是帮助信息，好好阅读下（摘自微软帮助文档）。&lt;/p&gt;&lt;p&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;/p&gt;&lt;p&gt;Internet Explorer 包括一项&amp;ldquo;Kiosk 模式&amp;rdquo;功能，让您可以只访问 Web 页。本文介绍如何使用 Internet Explore &lt;br /&gt;中的&amp;ldquo;Kiosk 模式&amp;rdquo;功能。&lt;/p&gt;&lt;p&gt;当您在 Kiosk 模式下运行 Internet Explorer 时，Internet Explorer 标题栏、菜单、工具栏和状态栏不显示，而且 &lt;br /&gt;Internet Explorer 以全屏模式运行。Windows 任务栏也不显示，但您可以通过按 ALT+TAB 或 CTRL+ALT+DEL &lt;br /&gt;组合键切换到其他正在运行的程序。由于 Internet Explorer 以全屏模式运行，只有在退出 Internet Explorer 后才能访问 &lt;br /&gt;Windows 桌面。&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;iexplore -k &lt;var&gt;page　（例如：C:\Program Files\Internet Explorer\iexplore.exe -k &lt;a href="http://www.cnblogs.com/bruceli"&gt;www.cnblogs.com/bruceli&lt;/a&gt;）&lt;/var&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;var&gt;其中 &lt;var&gt;page&lt;/var&gt; 是您希望在 Internet Explorer 启动时出现的 Web 页的地址。如果在&lt;b&gt;打开&lt;/b&gt;框中未指定 Web &lt;br /&gt;页，Internet Explorer 将打开起始页。注意，指定的 Web 页既可以是 Internet 上的 Web &lt;br /&gt;页，也可以是您的计算机或网络上另一计算机上的 Web 页。&lt;/var&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;要退出以 Kiosk 模式运行的 Internet Explorer，请按 ALT+F4 组合键。注意，您不能够只退出 Kiosk 模式而不退出 &lt;br /&gt;Internet Explorer。&lt;/p&gt;&lt;h3 id="tocHeadRef"&gt;Kiosk 模式的键盘快捷方式&lt;/strong&gt;&lt;/p&gt;&lt;div class="kb_intextwrapper"&gt;&lt;div class="kb_intextbody"&gt;键组合            功能-----------------------------------------------------------&lt;br/&gt;CTRL+A           全选（编辑）&lt;br/&gt;CTRL+B           整理收藏夹&lt;br/&gt;CTRL+C           复制（编辑）&lt;br/&gt;CTRL+F           查找（在当前页中）&lt;br/&gt;CTRL+H           查看&amp;ldquo;历史&amp;rdquo;文件夹&lt;br/&gt;CTRL+L           打开&amp;ldquo;位置&amp;rdquo;对话框&lt;br/&gt;CTRL+N           新建窗口（以非 Kiosk 模式打开）&lt;br/&gt;CTRL+O           打开&amp;ldquo;位置&amp;rdquo;对话框（同 CTRL+L 组合键）&lt;br/&gt;CTRL+P           打印&lt;br/&gt;CTRL+R           刷新&lt;br/&gt;CTRL+S           保存&lt;br/&gt;CTRL+V           粘贴（编辑）&lt;br/&gt;CTRL+W           关闭（同 ALT+F4 组合键）&lt;br/&gt;CTRL+X           剪切（编辑）&lt;br/&gt;ALT+F4            关闭&lt;br/&gt;ALT+左箭头        后退&lt;br/&gt;ALT+右箭头        前进&lt;br/&gt;ESC                停止&lt;br/&gt;F5                 刷新&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/bruceli/aggbug/2007931.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bruceli/archive/2011/04/07/2007931.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bruceli/archive/2010/05/17/1737208.html</id><title type="text">javascript 密码强度规则、打分、验证（给出前端代码，后端代码可根据强度规则翻译）</title><summary type="text">前言：密码强度是一个很普遍的功能，比较简单，主要是怎么制定这个强度规则。现在需要升级密码强度的验证，以前的验证比较简单，现在已经不能满足需求了，现在需要可灵活变化并有多级别可配置选择的一个密码强度验证，所以就设计了下面这个东东。在设计前也参考了下比较成熟的强度规则，大同小异，不外乎都采取了打分的机制来控制密码强度规则，这样可配置性高，灵活。本来想直接拿来用的，但是发现都比较旧，有些不太适宜公司开发的需求，可能这个东西比较简单吧，所以也没什么人去更新和写新的代码，所以还是自己动手设计了规则和写了代码。实现： 原理： 采用打分的机制，打分分为3类（基础分、加分、减分），先求出基础分，在计算加分的部</summary><published>2010-05-17T04:04:00Z</published><updated>2010-05-17T04:04:00Z</updated><author><name>布鲁斯.李</name><uri>http://www.cnblogs.com/bruceli/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bruceli/archive/2010/05/17/1737208.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bruceli/archive/2010/05/17/1737208.html"/><content type="text">前言：密码强度是一个很普遍的功能，比较简单，主要是怎么制定这个强度规则。现在需要升级密码强度的验证，以前的验证比较简单，现在已经不能满足需求了，现在需要可灵活变化并有多级别可配置选择的一个密码强度验证，所以就设计了下面这个东东。在设计前也参考了下比较成熟的强度规则，大同小异，不外乎都采取了打分的机制来控制密码强度规则，这样可配置性高，灵活。本来想直接拿来用的，但是发现都比较旧，有些不太适宜公司开发的需求，可能这个东西比较简单吧，所以也没什么人去更新和写新的代码，所以还是自己动手设计了规则和写了代码。实现： 原理： 采用打分的机制，打分分为3类（基础分、加分、减分），先求出基础分，在计算加分的部</content></entry><entry><id>http://www.cnblogs.com/bruceli/archive/2010/05/13/1734359.html</id><title type="text">[举一反三]解决IE下select标签innerHTML插入option的BUG（兼容IE,FF,Opera,Chrome,Safari)</title><summary type="text">前言：这是一个老bug了，现在提供一个完美解决方案。由于我一直是用createElement来创建动态的option并添加，所以一直没有遇到这个问题，但是每个人写代码风格不同，有的人就喜欢写字符串形式的标签并用innerHTML插入，这不就有问题了，为了方便不同编码风格的人，我封装了一个方法，用于解决ie的这个bug和兼容5大浏览器，这样大家都可以用一个方法来实现不同的风格，便于维护管理。bug描述：在ie下面使用innerHTML来插入option选项的话，ie会去掉前面的&lt;option&gt;，并拆分成多个节点，这样会造成select的出错，不是没有插进去，而是节点在转换时出问题了，</summary><published>2010-05-13T04:03:00Z</published><updated>2010-05-13T04:03:00Z</updated><author><name>布鲁斯.李</name><uri>http://www.cnblogs.com/bruceli/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bruceli/archive/2010/05/13/1734359.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bruceli/archive/2010/05/13/1734359.html"/><content type="text">前言：这是一个老bug了，现在提供一个完美解决方案。由于我一直是用createElement来创建动态的option并添加，所以一直没有遇到这个问题，但是每个人写代码风格不同，有的人就喜欢写字符串形式的标签并用innerHTML插入，这不就有问题了，为了方便不同编码风格的人，我封装了一个方法，用于解决ie的这个bug和兼容5大浏览器，这样大家都可以用一个方法来实现不同的风格，便于维护管理。bug描述：在ie下面使用innerHTML来插入option选项的话，ie会去掉前面的&lt;option&gt;，并拆分成多个节点，这样会造成select的出错，不是没有插进去，而是节点在转换时出问题了，</content></entry></feed>
