<?xml version="1.0" encoding="UTF-8"?>
  <feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html"><![CDATA[曹钟岩的博客 - Caozhongyan's Blog]]></title>
  <subtitle type="html"><![CDATA[Stay Hungry, Stay Foolish]]></subtitle>
  <id>http://blog.caozhongyan.com/</id>
  <link rel="alternate" type="text/html" href="http://blog.caozhongyan.com/" /> 
  <link rel="self" type="application/atom+xml" href="http://blog.caozhongyan.com/atom.asp" /> 
  <generator uri="http://www.pjhome.net/" version="2.8">PJBlog3</generator> 
  <updated>2010-07-03T14:11:23+08:00</updated>

  <entry>
	  <title type="html"><![CDATA[在C#中实现元编程和DSL]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://blog.caozhongyan.com/</uri>
		 <email>null@null.com</email>
	  </author>
	  <category term="" scheme="http://blog.caozhongyan.com/default.asp?cateID=4" label="技术活" /> 
	  <updated>2010-07-03T14:11:23+08:00</updated>
	  <published>2010-07-03T14:11:23+08:00</published>
		  <summary type="html"><![CDATA[在C#中实现元编程和DSL]]></summary>
	  <link rel="alternate" type="text/html" href="http://blog.caozhongyan.com/article.asp?id=31" /> 
	  <id>http://blog.caozhongyan.com/default.asp?id=31</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Web Camps归来，顺便演示ASP.NET MVC 2.0一个最基本的实例]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://blog.caozhongyan.com/</uri>
		 <email>null@null.com</email>
	  </author>
	  <category term="" scheme="http://blog.caozhongyan.com/default.asp?cateID=4" label="技术活" /> 
	  <updated>2010-05-27T17:23:06+08:00</updated>
	  <published>2010-05-27T17:23:06+08:00</published>
		  <summary type="html"><![CDATA[24号-25号参加了Microsoft的Web Camp的大会。<br/><br/>见到了Scott Hanselman大牛。Scott Hanselman专门手把手教给我很多技术，我们还讨论了微软MVC技术的未来，收获非常大。<br/><br/>ASP.NET MVC强调Web开发回归本源，虽然WebForms和MVC是共存的技术，但是前者将P-M-E引用Web其实造成初学者的学习路线似近实远。<br/><br/>强烈推荐大家拜读下《Programming ASP.NET MVC 1.0》，国内的某本书（不点名），简直就是误人不浅。<br/><br/>强烈推荐这本书的2、3两章，作者非常中肯地、客观地分析了ASP.NET Web Forms和ASP.NET MVC，以及MVC和MonoRails、RoR、SSH，以及回顾展望，这些内容含金量很高！<br/><br/>下面作了一个小例子，演示了用MVC2创建一个简单的通讯录，实现CRUD4种操作。Scott大牛做这个只花了2、3分钟，我的神！<br/><br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://blog.caozhongyan.com/images/flash.gif" alt="" style="margin:0px 2px -3px 0px" border="0"/>Flash动画</div><div class="UBBContent"><a id="temp95214_href" href="http://blog.caozhongyan.com/javascript:MediaShow('swf','temp95214','http://www.tudou.com/v/N-2HwF5eLqg','400','300')"><img name="temp95214_img" src="http://blog.caozhongyan.com/images/mm_snd.gif" style="margin:0px 3px -2px 0px" border="0" alt=""/><span id="temp95214_text">在线播放</span></a><div id="temp95214"></div></div></div><br/><br/>视频质量不好，附上源代码：<br/><br/><a href="http://blog.caozhongyan.com/files/MVCVideo1_Code.rar" target="_blank" rel="external">http://blog.caozhongyan.com/files/MVCVideo1_Code.rar</a>]]></summary>
	  <link rel="alternate" type="text/html" href="http://blog.caozhongyan.com/article.asp?id=30" /> 
	  <id>http://blog.caozhongyan.com/default.asp?id=30</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[InstallShield 2010 Limited Edition 试用]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://blog.caozhongyan.com/</uri>
		 <email>null@null.com</email>
	  </author>
	  <category term="" scheme="http://blog.caozhongyan.com/default.asp?cateID=4" label="技术活" /> 
	  <updated>2010-05-01T02:53:21+08:00</updated>
	  <published>2010-05-01T02:53:21+08:00</published>
		  <summary type="html"><![CDATA[Visual Studio 2010 送给开发者一个小点心，就是InstallShield Limited Edition。<br/>现在的开发者除了可以用VS.NET传统的打包工具打包软件以外，还可以使用InstallShield了。<br/><br/>InstallShield Limited Edition因为是4月24日才发布的，所以没有被装入VS2010的安装盘，在VS2010的新建项目对话框中以一个链接图标的形式存在。点击以后会链接到 Flexera 公司的官方网站。填写一个注册表格以后，Flexera 就寄来一封电子邮件，里面有下载地址和序列号。<br/>（而且貌似云计算、SL4支持、Windows Phone都要另外Down，所以我戏称VS2010只是一个软件包管理器）<br/><br/>一路安装后，InstallShield LE 就可以用了。<br/><br/>InstallShield Limited Edition既然是限制版本，限制在哪里呢？不用担心，LE在使用次数和时间上没有限制，提供的key可以正确激活产品。但是LE的功能就比较弱了。<br/><br/>- 不支持Hyper-V部署<br/>- 不能支持多个安装选项，和可选部件安装<br/>- 不支持SQL脚本部署<br/>- 不支持设置目标电脑的XML配置文件<br/>- 不支持布告板界面<br/>- 不支持脚本化开发 InstallScript<br/>- 不支持自定义安装文件（其实也不需要，因为连InstallScript都没有了）<br/>- 不支持制作补丁<br/><br/>总之，LE是一个比Express还要弱的版本。<br/><br/>用过Visual Studio 6.0的人可能记得，那时候微软也附赠了一个InstallShield For VC++ 6.0。相比较而言，那个版本好歹支持脚本，也可以创建多个部件（虽然数量有限制）。免费的东西自然不能让你用爽，不然收费的还有人买么？除了制作的安装程序比较漂亮以外，真的没有什么特别推荐的理由了。<br/><br/><img src="http://blog.caozhongyan.com/attachments/month_1005/b20105124710.PNG" border="0" alt=""/><br/>主界面，和InstallShield 2010 Professional 没什么不同。<br/><br/><img src="http://blog.caozhongyan.com/attachments/month_1005/b20105124711.PNG" border="0" alt=""/><br/>支持的安装类型。右边画锁的都是LE不支持，只有收费版支持的功能，时时动员你掏钱。<br/><br/><img src="http://blog.caozhongyan.com/attachments/month_1005/12010512516.PNG" border="0" alt=""/><br/>安装程序效果。]]></summary>
	  <link rel="alternate" type="text/html" href="http://blog.caozhongyan.com/article.asp?id=29" /> 
	  <id>http://blog.caozhongyan.com/default.asp?id=29</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Visual Studio 2010 下载和制作离线帮助文档]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://blog.caozhongyan.com/</uri>
		 <email>null@null.com</email>
	  </author>
	  <category term="" scheme="http://blog.caozhongyan.com/default.asp?cateID=4" label="技术活" /> 
	  <updated>2010-05-01T01:03:14+08:00</updated>
	  <published>2010-05-01T01:03:14+08:00</published>
		  <summary type="html"><![CDATA[Visual Studio 2010 功能很强大，但是本地的MSDN却被基于Web Server的Microsoft Help 1.0取代了。<br/><br/>而且安装光盘也没有集成在线帮助文档。要想查阅帮助和SDK文档，必须联网浏览。很不方便。<br/><br/>经过一番琢磨，搞明白了如何将帮助文档下载到本地，并且备份的办法。这样以后重装系统就不必再次下载，直接可以拷贝了。<br/><br/>安装程序的最后一步，完成的页面，会出现一个配置帮助的按钮。如果错过了也没关系，打开Visual Studio 2010以后在帮助菜单找到“Manage Help Settings”，打开帮助配置对话框。<br/><img src="http://blog.caozhongyan.com/attachments/month_1005/720105104514.PNG" border="0" alt=""/><br/><br/>如果是第一次安装，首先选择Install Content from Online。这样会出现一个列表，将需要的部分选上，然后下载即可。目前网络速度非常慢，完全下载需要一个小时左右，只能慢慢等待。<br/><br/>下载完成后，在C:\Documents and Settings\All Users\Application Data\Microsoft （Windows Server 2003/XP默认，别的系统不同），有一个3.28GB的HelpLibrary。将这个目录备份，或者烧录到DVD盘片后，以后就不用下载了。<br/><br/>假设你已经这么做了，那么如何恢复呢？<br/><br/>选择Install Content from Disk<br/><img src="http://blog.caozhongyan.com/attachments/month_1005/u2010510527.PNG" border="0" alt=""/><br/>注意 Meida 位于 HelpLibrary下的 VS_100_en-us\HelpContentSetup.msha。<br/><br/>之后再返回之前的界面，选择Choose online o&#114; local help，选择本地，即可。<br/><br/>配置完成后，会启动一个Help Library 代理，其实就是一个mini web server。在浏览器里面就能看到帮助了。界面和MSDN online网站上的一样。<br/><img src="http://blog.caozhongyan.com/attachments/month_1005/p20105105624.PNG" border="0" alt=""/><br/><br/>为什么微软要将帮助从客户端搬上web呢？<br/><br/>我想主要有这么几个原因：<br/>（1）微软不需要同时维护两种格式的帮助文件了；<br/>（2）方便文档的更新，只需要同步一下就可以了；<br/>（3）允许团队共享一个帮助实例，并且按需安装部署，减少磁盘的耗散；<br/>（4）减少发行媒介——显然VS2010+帮助已经不能在一张DVD-5光盘上容纳了；同时减少了网上iso格式媒体的下载文件尺寸；<br/>（5）顺应潮流，很多社区都是这么干的；<br/>（6）说明绝大部分使用微软的初级用户，对帮助文档不感冒——我例外。<br/><br/>不过现在版本的帮助的确非常不好用了。左侧的导航树被一个层次表代替，很不方便。索引也没有了，而全文搜索不够直接。<br/><br/>最后，所有的帮助示例还需要另外下载。<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://blog.caozhongyan.com/article.asp?id=28" /> 
	  <id>http://blog.caozhongyan.com/default.asp?id=28</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[警惕盗版Windows安装盘上携带的病毒。]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://blog.caozhongyan.com/</uri>
		 <email>null@null.com</email>
	  </author>
	  <category term="" scheme="http://blog.caozhongyan.com/default.asp?cateID=4" label="技术活" /> 
	  <updated>2010-04-27T03:44:51+08:00</updated>
	  <published>2010-04-27T03:44:51+08:00</published>
		  <summary type="html"><![CDATA[现在市面上销售的系统光盘品种越来越繁多，价格也非常便宜。一张Windows 7的DVD安装盘，只有4元。这种集成了大量工具软件、驱动，并且非常容易激活的Windows 7还有Windows XP到底如何呢？<br/><br/>前一段时间网络上有了些文章，指出这些光盘带有病毒和恶意软件，但是没有太注意，一来我根本不用这些系统，二来觉得是出于对反盗版宣传的需要，有些夸大。<br/><br/>但是最近发现，互联网上出现了不少盗版Windows系统盘的下载站，这些站的特点是：里面的系统光盘使用迅雷、快车一类的软件很容易下载，速度很快。而且在很多网站上出现了他们的广告。难道真的有么好的事情么？难道还有花钱推销他们免费软件的道理么？<br/><br/>想到这里，我随机选取了几种Windows XP SP3和Windows 7的盗版光盘，并且检查了一下，结果非常令人吃惊：100%的盗版光盘含有病毒、木马和流氓软件。一些光盘自身携带的软件，居然捆绑有灰鸽子一类的木马，一旦被安装，电脑就成为黑客的肉鸡。这些情况，甚至比网上看到的文章介绍的70%的数字还要惊人。<br/><br/>应该说，在番茄事件之前，虽然很多人对于改装版的系统颇有微词（个人也很BS山寨货），但是这些“品牌”相对比较讲究声誉，不敢做得太过分。通过大网站下载，也拥有比较广泛的用户群。然而之后盗版软件的制作销售进入地下，很多盗版其实是借尸还魂之作，打着原来几个盗版品牌旗号，却实际上根本和原来的作者毫无关系。这样一来，盗版的发展非常无序，没有了声誉度的约束，这些人就猖狂借盗版传播病毒非法牟利。技术的壁垒和法律的空白下的IT业，其实是无政府状态的，人性的丑陋充分暴露了出来。<br/><br/>难怪最近越来越多的菜鸟提问，为什么自己的电脑重装系统还是不能清除木马。<br/><br/>本身盗版就是灰色产业，这些人的道德水准可想而知。想想那些花了钱去买含有病毒的盗版系统的人，相当可悲。病毒居然要花钱购买，也算天朝的一大奇观了吧。<br/><br/>提醒下各位手上持有盗版系统盘的朋友，建议丢掉它们，使用正版系统吧，再不济使用原版系统也可以。舍不得扔掉盗版盘的，也要注意对安装盘进行杀毒。（最好使用virustotal）<br/><br/>想到自己从来不使用杀毒软件，并且可能也使用过一些盗版软件，感到一阵阵后怕。<br/><br/>我知道有个人要跟贴：使用MacOS的路过，不关他的事，我先帮他说了吧，哈哈。]]></summary>
	  <link rel="alternate" type="text/html" href="http://blog.caozhongyan.com/article.asp?id=27" /> 
	  <id>http://blog.caozhongyan.com/default.asp?id=27</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[发现Windows XP一个重大的漏洞，应该是BUG]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://blog.caozhongyan.com/</uri>
		 <email>null@null.com</email>
	  </author>
	  <category term="" scheme="http://blog.caozhongyan.com/default.asp?cateID=4" label="技术活" /> 
	  <updated>2010-01-31T17:51:02+08:00</updated>
	  <published>2010-01-31T17:51:02+08:00</published>
		  <summary type="html"><![CDATA[用了这么多年Windows XP，才发现这个BUG的。<br/><br/>使用的系统为 Windows XP Service Pack 3 (5.10.2600.xpsp_sp3_gdr.090804-1435)<br/><br/>设置 Sel&#101;ct logon and logoff options 为禁用 Use the Welcome screen。<br/>在 User Accounts Dialog 里面，创建或者修改用户帐户密码。<br/><br/>之后锁定计算机，此时输入原来的密码依然可以登录系统。特别地，当原来没有密码的时候，则不需要密码也能登录。<br/><br/>我并不认为这是一个合理的特性，应该属于BUG。<br/><br/>解决办法：修改密码后锁定计算机，用新密码登录一次，则原来的密码就会失效。或者注销一下计算机。<br/><br/>引用老包的话：Windows 就是一个娱乐系统。]]></summary>
	  <link rel="alternate" type="text/html" href="http://blog.caozhongyan.com/article.asp?id=26" /> 
	  <id>http://blog.caozhongyan.com/default.asp?id=26</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[BCGControlBar简明使用教程]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://blog.caozhongyan.com/</uri>
		 <email>null@null.com</email>
	  </author>
	  <category term="" scheme="http://blog.caozhongyan.com/default.asp?cateID=4" label="技术活" /> 
	  <updated>2010-01-26T01:05:41+08:00</updated>
	  <published>2010-01-26T01:05:41+08:00</published>
		  <summary type="html"><![CDATA[BCGControlBar是一个强大的第三方MFC扩展库，提供了一组类和组件，使得开发者很容易在自己的程序中实现类似Office、Visual Studio、Money、Internet Explorer的界面，其商业版本还提供完整的源代码。<br/><br/>BCGControlBarBro在此基础上提供了一个语法高亮和代码折叠功能的编辑器（类似Visual Studio），以及支持界面换肤功能。<br/><br/>2008年，Microsoft买断了BCGControl Bar，并且集成到Visual Studio 2008 SP1中，使得VC++ 2008用户可以直接实现Office2003/2007界面效果。<br/><br/><img src="http://blog.caozhongyan.com/images/user/bcgcb/bcgex.PNG" border="0" alt=""/><br/><br/>可以从 <a href="http://www.bcgsoft.com/bcgcontrolbarpro.htm" target="_blank" rel="external">http://www.bcgsoft.com/bcgcontrolbarpro.htm</a> 获得试用版。<br/><br/>现存的中文资料比较少，下面简单介绍下这套代码库的使用方法：<br/>本文可能被更新，详见 <a href="http://blog.caozhongyan.com" target="_blank" rel="external">http://blog.caozhongyan.com</a> 。<br/><br/>（一）使用AppWizard创建一个BCGControlBar应用程序：<br/><br/>打开Visual C++ IDE，选择新建工程，并且打开BCGCBPro AppWizard向导。<br/>前6个步骤和标准的MFC AppWizard没有什么区别。<br/>之后的几步可以配置BCGControlBar程序的外观，如果使用过Visual Studio、Office，应该对这些选项不太陌生。<br/>可以尝试下各种组合，很容易理解的。<br/><br/>需要指出的是，如果在新建工程的对话框中没有BCGCBPro AppWizard向导，可以重新集成，方法是：<br/>运行BCGControlBar目录下的BCGCBProIntegrate.exe（如果运行安装程序安装的BCGControlBar，应该能在开始菜单找到这个工具，叫BCGControlBarPro Integration Wizard），然后选中Setup BCGControlBar Application Wizard，点Next即可。<br/><br/>（二）在现有的MFC应用程序源代码中增加BCGControlBar支持：<br/><br/>在Visual C++ IDE里面添加BCGCBPro到INCLUDE path目录里。<br/>首先确认在应用程序的InitInstance()函数里面调用了AfxOleInit()。<br/>在stdafx.h头文件里面添加如下代码：<br/>#include &#34;BCGCBProInc.h&#34; <br/><br/>在你的application class里面添加对CBCGPWorkspace的继承：<br/>class CMyApp : public CWinApp,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public CBCGPWorkspace<br/><br/>首先，需要声明自定义设置保存在注册表的位置以及需要哪些可选的自定义功能，比如键盘鼠标上下文菜单等等，在 CMyApp::InitInstance设置注册表键并且初始化customization managers：<br/>SetRegistryBase (_T(&#34;Settings&#34;));<br/><br/>// Initialize customization managers:<br/>InitMouseManager();<br/>InitContextMenuManager();<br/>InitKeyboardManager(); <br/><br/>如果要使用鼠标和上下文菜单自定义支持，还需要“附加”一个视图到鼠标customization manager并且初始化上下文菜单。覆盖 CBCGPWorkspace::PreLoadState方法： <br/>class CMyApp ....<br/>{<br/>...<br/>virtual void PreLoadState();<br/>...<br/>};<br/><br/>void CMyApp::PreLoadState()<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;// Associate mouse event with specific view(s):<br/>&nbsp;&nbsp;&nbsp;&nbsp;GetMouseManager()-&gt;AddView (iIdTestView, _T(&#34;Test view&#34;), IDR_VIEW);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;// Initialize context menus:<br/>&nbsp;&nbsp;&nbsp;&nbsp;GetContextMenuManager()-&gt;AddMenu (_T(&#34;Test menu&#34;), idMenu); <br/>} <br/><br/>在mainframe.h和mainframe.cpp里面替换CMDIFrameWnd为CBCGPMDIFrameWnd。(SDI程序替换CFrameWnd为CBCGPFrameWnd) <br/>替换CMDIChildWnd为CBCGPMDIChildWnd <br/>替换CToolbar为CBCGPToolBar并且在CMainFrame类里面添加一个内嵌菜单对象： <br/>CBCGPMenuBar&nbsp;&nbsp;&nbsp;&nbsp;m_wndMenuBar;&nbsp;&nbsp;&nbsp;&nbsp;// New menu bar<br/>CBCGToolBar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_wndToolBar;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Application toolbar <br/><br/>在CMainFrame::OnCr&#101;ate()方法中添加如下行以支持菜单条功能：<br/>// Cr&#101;ate menu bar (replaces the standard menu):<br/>if (!m_wndMenuBar.Cr&#101;ate (this))<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TRACE0(&#34;Failed to cr&#101;ate menubar\n&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// fail to cr&#101;ate<br/>} <br/>m_wndMenuBar.SetBarStyle (m_wndMenuBar.GetBarStyle() |<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);<br/> <br/><br/>为了支持菜单条停靠，需要添加如下代码： <br/>m_wndMenuBar.EnableDocking (CBRS_ALIGN_ANY);<br/>DockControlBar (&amp;m_wndMenuBar); <br/><br/>重要：可以在应用程序里面使用任意数量的CBCGPToolBar工具栏。所有工具栏图标会自动合并到一个BMP图像中。然而只能使用一个CBCGPMenuBar对象。 <br/><br/>- 为了支持工具栏/菜单栏自定义，需要对代码作如下改动：<br/><br/>添加工具栏/菜单栏自定义命令 (比如, 视图(V) | 自定义(C)...) <br/>实现OnViewCustomize方法，代码看上去类似： <br/>void CMainFrame::OnViewCustomize() <br/>{<br/> // Cr&#101;ate a customize toolbars dialog:<br/> CBCGPToolbarCustomize* pDlgCust = new CBCGToolbarCustomize (this, <br/>TRUE /* Automatic menus scanning */); <br/> // Add predefined toolbars:<br/> pDlgCust-&gt;AddToolBar (&#34;Main&#34;, IDR_MAINFRAME);<br/> ....<br/><br/> // Add user-defined commands:<br/> pDlgCust-&gt;AddButton (&#34;User&#34;, CBCGPToolbarButton (ID_USER_TOOL1, 1, &#34;User Tool 1&#34;, TRUE));<br/> pDlgCust-&gt;AddButton (&#34;User&#34;, CBCGToolbarButton (ID_USER_TOOL2, 2, &#34;User Tool 2&#34;, TRUE));<br/> pDlgCust-&gt;AddButton (&#34;User&#34;, CBCGToolbarButton (ID_USER_TOOL3, 3, &#34;User Tool 3&#34;, TRUE));<br/> ....<br/><br/> pDlgCust-&gt;SetUserCategory (&#34;User&#34;);<br/><br/> // Enable Cr&#101;ate/Del&#101;te of the user-defined toolbars:<br/> pDlgCust-&gt;EnableUserDefinedToolbars ();<br/><br/> pDlgCust-&gt;Cr&#101;ate ();<br/>}<br/> <br/>- 启用Microsoft Office 2000风格的菜单（也就是折叠不常用的功能）：<br/><br/>定义一个常用功能集合（通常在CMainFrame::OnCr&#101;ate()）： <br/>CList&lt;UINT, UINT&gt; lstBasicCoomads;<br/>&nbsp;&nbsp;<br/>lstBasicCoomads.AddTail (ID_FILE_NEW);<br/>lstBasicCoomads.AddTail (ID_FILE_OPEN);<br/>lstBasicCoomads.AddTail (ID_FILE_SAVE);<br/><br/>......<br/>lstBasicCoomads.AddTail (ID_APP_ABOUT);<br/><br/>CBCGPToolBar::SetBasicCommands (lstBasicCoomads);<br/><br/>这些命令将在折叠菜单初始状态中显示。<br/><br/>- 启用/禁用菜单阴影：<br/>CBCGPMenuBar::EnableMenuShadows (BOOL bEnable = TRUE)&nbsp;&nbsp;<br/><br/>注意：不要在当上下文菜单弹出时视图内容会动态改变的情况下启用菜单阴影（比如，视图显示动画，HTML页面），这种情况下菜单阴影不会更新动态内容的改变。<br/><br/>- 在运行时改变菜单字体：<br/>CBCGPMenuBar::SetMenuFont (LPLOGFONT lpLogFont, BOOL bHorz = TRUE);&nbsp;&nbsp;<br/><br/>- 启用工具栏最右边的自定义小箭头只需要：<br/>m_wndToolBar.EnableCustomizeButton (TRUE, id_of_customize_command,<br/>_T(&#34;Customize...&#34;));&nbsp;&nbsp;<br/><br/>- 在图标下显示按钮文字：<br/>m_wndToolBar.EnableTextLabels (BOOL bEnable = TRUE);&nbsp;&nbsp;<br/><br/>- 启用用户自定义工具：<br/>添加一个菜单项：ID_TOOLS_ENTRY，它将会自动被替换为实际的工具列表。<br/>添加如下字符串资源：<br/>&nbsp;&nbsp;<br/>ID_TOOL1&nbsp;&nbsp;&nbsp;&nbsp;&#34;Activates user-defined tool\nUser Tool&#34; <br/>ID_TOOL2&nbsp;&nbsp;&nbsp;&nbsp;&#34;Activates user-defined tool\nUser Tool&#34;<br/>.... <br/>ID_TOOLx&nbsp;&nbsp;&nbsp;&nbsp;&#34;Activates user-defined tool\nUser Tool&#34;<br/> <br/>在程序的InitInstance()函数中添加：<br/>&nbsp;&nbsp;EnableUserTools (ID_TOOLS_ENTRY, ID_TOOL1,&nbsp;&nbsp;&nbsp;&nbsp;ID_TOOLx);&nbsp;&nbsp;<br/><br/>一个新的“工具”选项卡将会被添加到自定义对话框中。<br/><br/>- 启用动态&#34;tear-off&#34; (&#34;detachable&#34;)菜单（一个可以拖动出来成为工具条的下拉菜单）：<br/>在字符串资源表中预留一些项。这些ID将被用来作为Control Bar的ID。<br/>&nbsp;&nbsp;<br/>ID_TEAR_OFF1&nbsp;&nbsp;&nbsp;&nbsp;&#34;&lt;dummy&gt;&#34; <br/>ID_TEAR_OFF2&nbsp;&nbsp;&nbsp;&nbsp;&#34;&lt;dummy&gt;&#34; <br/>....... <br/>ID_TEAR_OFFx&nbsp;&nbsp;&nbsp;&nbsp;&#34;&lt;dummy&gt;&#34;<br/> <br/>为每一个&#34;tear-off&#34;弹出菜单，修改&#34;Break&#34;属性为&#34;Bar&#34; (MF_MENUBARBREAK) <br/>在应用程序的InitInstance()函数里：<br/>&nbsp;&nbsp;EnableTearOffMenus (_T(&#34;RegBase&#34;, ID_TEAR_OFF1, ID_TEAR_OFFx);&nbsp;&nbsp;<br/><br/>- 启用静态&#34;tear-off&#34; (&#34;detachable&#34;)菜单：<br/>在字符串资源表中预留一个项。这个ID应该和动态tear-off的ID不同（参见上文）<br/><br/>ID_TEAR_OFF_BAR&nbsp;&nbsp;&nbsp;&nbsp;&#34;&lt;dummy&gt;&#34;<br/><br/>在主框架的OnShowPopupMenu，启用为指定的菜单启用&#34;tear-off&#34;：<br/>&nbsp;&nbsp;pMenuButton-&gt;SetTearOff (ID_TEAR_OFF_BAR); <br/><br/><img src="http://blog.caozhongyan.com/images/user/bcgcb/tear-off.PNG" border="0" alt=""/><br/> <br/>- 确认所有的BCGPControlBar申请都正常释放：<br/>在应用程序的ExitInstance()添加如下代码：<br/>::BCGCBProCleanUp (); <br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://blog.caozhongyan.com/article.asp?id=25" /> 
	  <id>http://blog.caozhongyan.com/default.asp?id=25</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[利用人性中的善良赚钱]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://blog.caozhongyan.com/</uri>
		 <email>null@null.com</email>
	  </author>
	  <category term="" scheme="http://blog.caozhongyan.com/default.asp?cateID=7" label="道" /> 
	  <updated>2010-01-25T02:36:18+08:00</updated>
	  <published>2010-01-25T02:36:18+08:00</published>
		  <summary type="html"><![CDATA[记得最近一次和程斯同学的相聚时，我曾经开玩笑地说，其实我也很容易上当受骗，只是让我上当受骗的方式和另外一些人不同罢了。她追问我的弱点是什么，我没有正面回答她。<br/><br/>今天抽出点时间，把思路整理下，写出一点不成文的东西。<br/><br/>最近Google退出的消息沸沸扬扬，一些人认为Google是作秀，是炒作。Google长期倡导的“不作恶”的价值观，也不过是赚钱的一种手段而已。言下之意是，同样是赚钱，“作恶”和“不作恶”也没有什么本质的不同。<br/><br/>在我看来，人性中既有善良的一面，也有邪恶的一面。人性有很多弱点，这些弱点是和善恶是有关的。它既可以是贪婪、自私、偷窥欲、无知、恐惧、虚荣，也可以是互助、分享、博爱、求知、正义感、同情心。<br/><br/>事实上，我们能看到很多这样的例子：<br/><br/>有的产品宣称自身有多么高的价值，却非常低廉，或者购买它能够获得一笔意想不到的丰厚回报。<br/>有的宣称，可以从公益或者公共的服务中赚取额外的价值。<br/>有的企业打出高科技和尖端技术的旗号，推销低价值的商品。<br/>有的网站，通过发布淫秽低俗或者处于边缘地带的内容赚取流量。<br/>甚至有搜索引擎企业，利用自己的强势地位，恐吓胁迫它的客户为搜索收录和排名付费。<br/><br/>这样的例子数不胜数。消费者熟视无睹，无可奈何，甚至认为既然人家能赚到钱，必然有可取之处。但是我不这么认为，我自发抵制这些企业、产品和服务。在相近的品质下，优先考虑有道德感的企业和产品，甚至在后者价格偏高的情况下依然如此。简单地说，我愿意被人利用我的善良，或者说我愿意为道德和良知付费。我对于煽动的电视广告有很强的免疫力，可是对于Google的不作恶的价值观，真的无法抗拒。也许这就是我的弱点吧。<br/><br/>为什么要这样做，我想并非出于意气用事。作为一家企业，本质都是实现商业价值。追求利润是无可厚非的事情。所以消费者以消费选择实现了给这些企业投票的过程。一个完全赚不到钱的企业是无法生存的，没有什么道理去指责作恶的企业，因为作恶的显性成本更低，利润更大。如果大家都去选择那些作恶的企业，久而久之作恶的企业越来越多，为善的企业不是倒闭就是放弃不作恶的信条。整个社会的道德就会沦丧。<br/><br/>是的，大多数人目前还没有意识到这一点，或者他们有他们的观点，这不要紧。作为个人，我怎么做或许改变不了什么。但是我想引用并略加修改一句我所赞赏的名言：不要让最坏成为更坏的理由——反正没有最坏，只有更坏，那么管他坏不坏呢？当这个浮躁的社会里面无良的商人大谈阔论如何利用人性中的卑鄙大发横财的时候，我要用我微弱的声音告诉另外一些企业：用人性中的善良也可以赚到钱，而且我要反复宣传这一观点，让这个群体越来越大。<br/><br/>也许在一个制度上不完善，法律仍有空白，体制不太健全，行政效率不高的国度里，这是我们自我救赎的唯一出路。<br/><br/>也许在聪明的人士和看破世界的一族看来我同样上当受骗了，但是这种付出是值得的。并且我相信，靠道德和良知赚钱的企业更加懂得珍惜这份信誉，更加不敢明目张胆地做恶，这种自律，已经足够了。<br/><br/>以诚实守信为荣，以见利忘义为耻的道德说教恐怕过于空洞，那么提倡用人性中的善良赚钱有什么罪过。<br/><br/>ps: 有人说，你说利用人性中的善良赚钱，那么一个人伪装自己很贫困去寻求资助算不算呢？明显不算，仔细阅读我的文章你会知道我说的“利用”是指，帮助他人达成他的目标，这个过程本身应该不存在欺瞒。]]></summary>
	  <link rel="alternate" type="text/html" href="http://blog.caozhongyan.com/article.asp?id=24" /> 
	  <id>http://blog.caozhongyan.com/default.asp?id=24</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Bind9配置DNS服务器10分钟入门教程]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://blog.caozhongyan.com/</uri>
		 <email>null@null.com</email>
	  </author>
	  <category term="" scheme="http://blog.caozhongyan.com/default.asp?cateID=4" label="技术活" /> 
	  <updated>2009-11-28T19:59:37+08:00</updated>
	  <published>2009-11-28T19:59:37+08:00</published>
		  <summary type="html"><![CDATA[Bind9是一个强大的Linux下开放源代码的DNS服务器软件，完整的介绍写一本书都不够。看了下网上的文章，都非常繁琐。如果你想在几分钟之内搭建一个简单的DNS服务器，那么这篇文章很适合你。这篇文章来自我几个小时的摸索。<br/><br/>为什么要搭建一个简单的DNS服务器：<br/>（1）当外网DNS崩溃，比如暴风门发生的那种情况，可以使用我们自己的DNS应急<br/>（2）为内网网站提供内线的IP地址解析，或者实现双线解析<br/>（3）当你的ISP限制了二级域名和高级管理特性，你需要自己搭建DNS服务器来满足自己的需要<br/>（4）避免DNS劫持<br/>（5）和别的解决方案集成<br/>...<br/><br/>为什么使用Bind9：<br/>（1）Bind9是一个用途非常广泛的DNS服务器，配置文件成了事实上的标准<br/>（2）Bind9开放源代码，并且在Linux、UNIX和Windows下都能运行<br/>（3）Bind9的最低系统配置相当低，如果配置一个小DNS服务器的话，只需要486等级的计算机，我们可以使用一个很小很便宜的电脑来作为服务器<br/>...<br/><br/>言归正传，下面是配置一个简单的DNS服务器的完整过程，照着做就行了。<br/>平台：Windows Server 2003。<br/>（1）到<a href="http://ftp.isc.org/isc/bind9/" target="_blank" rel="external">http://ftp.isc.org/isc/bind9/</a>下载Bind9，其中.zip适合Windows平台，建议下载稳定版本。<br/>（2）安装：解压缩，运行BINDInstall.exe，默认会安装到C:\WINDOWS\system32\dns，它会注册一个服务，注意，暂时不要启动，我们需要简单配置下。安装的时候会创建一个Windows账户来运行服务，需要输入一个密码。<br/>（3）打开控制台，输入：<br/>CD C:\WINDOWS\system32\dns\bin<br/>rndc-confgen.exe -a<br/>这一步会生成一个安全key。<br/>（4）找到C:\WINDOWS\system32\dns\etc文件夹<br/>编辑 named.conf<br/>include &#34;c:\windows\system32\dns\etc\rndc.key&#34;;<br/>zone &#34;.&#34; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;type hint;<br/>&nbsp;&nbsp;&nbsp;&nbsp;file &#34;c:\windows\system32\dns\etc\named.root&#34;;<br/>};<br/><br/>zone &#34;caozhongyan.com&#34; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;type master;<br/>&nbsp;&nbsp;&nbsp;&nbsp;file &#34;c:\windows\system32\dns\etc\named.caozhongyan.com.db&#34;;<br/>};<br/><br/>zone &#34;0.168.192.in-addr.arpa&#34; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;type master;<br/>&nbsp;&nbsp;&nbsp;&nbsp;file &#34;c:\windows\system32\dns\etc\named.192.168.0&#34;;<br/>};<br/>添加3个zone，分别是根区域，用来解析互联网网站的，2个zone，假设我们需要解析caozhongyan.com和对应的反向解析。<br/>很显然，我们还需要3个文件：<br/>- c:\windows\system32\dns\etc\named.root<br/>这个文件可以从<a href="http://www.internic.net/zones/named.root" target="_blank" rel="external">http://www.internic.net/zones/named.root</a>下载。<br/><br/>- c:\windows\system32\dns\etc\named.caozhongyan.com.db<br/>这个是我们域名的解析，新建一个这样的文件，输入<br/>$TTL 600<br/>@ IN SOA ns1.caozhongyan.com. admin.ns1 ( 2009112801 28800 14400 720000 86400 )<br/><br/>@&#160;&#160;&#160;&#160;IN&#160;&#160;&#160;&#160;NS&#160;&#160;&#160;&#160;ns1.caozhongyan.com.<br/>ns1&#160;&#160;&#160;&#160;IN&#160;&#160;&#160;&#160;A&#160;&#160;&#160;&#160;192.168.0.100<br/>@&#160;&#160;&#160;&#160;IN&#160;&#160;&#160;&#160;MX 10&#160;&#160;&#160;&#160;ns1<br/><br/>@&#160;&#160;&#160;&#160;IN&#160;&#160;&#160;&#160;A&#160;&#160;&#160;&#160;192.168.0.100<br/>WWW&#160;&#160;&#160;&#160;IN&#160;&#160;&#160;&#160;CNAME&#160;&#160;&#160;&#160;@<br/>blog&#160;&#160;&#160;&#160;IN&#160;&#160;&#160;&#160;CNAME&#160;&#160;&#160;&#160;@<br/>sns&#160;&#160;&#160;&#160;IN&#160;&#160;&#160;&#160;CNAME&#160;&#160;&#160;&#160;@<br/>ucc&#160;&#160;&#160;&#160;IN&#160;&#160;&#160;&#160;CNAME&#160;&#160;&#160;&#160;@<br/>bbs&#160;&#160;&#160;&#160;IN&#160;&#160;&#160;&#160;CNAME&#160;&#160;&#160;&#160;@<br/><br/>其中192.168.0.100是我们服务器的地址，这里Web服务器和DNS服务器假设是一台主机。其中CNAME是交换，可以指向另一个名称，A记录可以设定指向的IP，MX是邮件交换记录。@符号代表本域名。<br/>这个配置的含义是，让 caozhongyan.com www.caozhongyan.com blog.caozhongyan.com ... 都指向 192.168.0.100。<br/><br/>- c:\windows\system32\dns\etc\named.192.168.0<br/>新建一个文件，输入<br/>$TTL 600<br/>@ IN SOA ns1.caozhongyan.com. admin.ns1 ( 2009112801 28800 14400 720000 86400 )<br/><br/>@&#160;&#160;&#160;&#160;IN&#160;&#160;&#160;&#160;NS&#160;&#160;&#160;&#160;localhost.<br/>1&#160;&#160;&#160;&#160;IN&#160;&#160;&#160;&#160;PTR&#160;&#160;&#160;&#160;localhost.<br/>这样就完成了反向解析。<br/>如果是NTFS分区，还需要检查这个目录是否给安装时候设定的账户读写的权限。<br/><br/>这样etc目录里面应该我们应该创建/修改了4个文件。所有的配置已经OK。<br/><br/>（5）在Windows服务管理器里面启动ISC BIND服务。<br/><br/>找一台客户机电脑，ping www.caozhongyan.com<br/>Pinging www.caozhongyan.com [58.212.103.23] with 32 bytes of data:<br/><br/>Reply from 58.212.103.23: bytes=32 time&lt;1ms TTL=255<br/>Reply from 58.212.103.23: bytes=32 time&lt;1ms TTL=255<br/>Reply from 58.212.103.23: bytes=32 time&lt;1ms TTL=255<br/>Reply from 58.212.103.23: bytes=32 time&lt;1ms TTL=255<br/><br/>Ping statistics for 58.212.103.23:<br/>&nbsp;&nbsp;&nbsp;&nbsp;Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),<br/>Approximate round trip times in milli-seconds:<br/>&nbsp;&nbsp;&nbsp;&nbsp;Minimum = 0ms, Maximum = 0ms, Average = 0ms<br/>怎么不对？<br/>对了，应该设置下客户端的DNS服务器：在网络连接里面找到本地连接属性，双击TCP/IP，输入DNS服务器地址：192.168.0.100。<br/>确定。<br/>再ping一次：<br/>Pinging www.caozhongyan.com [192.168.0.100] with 32 bytes of data:<br/><br/>Reply from 58.212.103.23: bytes=32 time&lt;1ms TTL=255<br/>Reply from 58.212.103.23: bytes=32 time&lt;1ms TTL=255<br/>Reply from 58.212.103.23: bytes=32 time&lt;1ms TTL=255<br/>Reply from 58.212.103.23: bytes=32 time&lt;1ms TTL=255<br/><br/>Ping statistics for 192.168.0.100:<br/>&nbsp;&nbsp;&nbsp;&nbsp;Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),<br/>Approximate round trip times in milli-seconds:<br/>&nbsp;&nbsp;&nbsp;&nbsp;Minimum = 0ms, Maximum = 0ms, Average = 0ms<br/>搞定！<br/><br/>注意，由于本机缓存，有可能需要重新启动电脑才能看到DNS生效。<br/>服务器段配置修改以后，记得重启服务。<br/><br/>有关更详细的介绍，请参阅网上高级的教程，话说Bind9还是很强大的。]]></summary>
	  <link rel="alternate" type="text/html" href="http://blog.caozhongyan.com/article.asp?id=23" /> 
	  <id>http://blog.caozhongyan.com/default.asp?id=23</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[并行的时代真的要来了]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://blog.caozhongyan.com/</uri>
		 <email>null@null.com</email>
	  </author>
	  <category term="" scheme="http://blog.caozhongyan.com/default.asp?cateID=4" label="技术活" /> 
	  <updated>2009-11-05T03:42:21+08:00</updated>
	  <published>2009-11-05T03:42:21+08:00</published>
		  <summary type="html"><![CDATA[金旭亮老师在他的BLOG里面给出了C#4.0和.NET4.0对于并行化的特性的支持。<br/><br/>大致看了一下，觉得.NET在这方面提供了相当棒的解决方案。原文就不转了，说说初步的体会：<br/><br/>.NET的封装大致包括TPL，比如引入Parallel.For Parallel.Invoke这样的语法，内置了Task调度程序，改进的线程池、PLinq。。。而Plinq自身则基于TPL，任务调度则基于Thread Pool。并行语法则大量使用了匿名、闭包这样的语法。<br/><br/>其实我最关心的是，.NET4.0对于并行做了什么贡献，大致可以发现，.NET4.0完全隐藏掉线程、线程创建、管理、通讯、同步这些底层的机制。但是对于业务逻辑里面的同步和竞争问题，以及算法本身，.NET是无能为力的——.NET并行库也不能保证并行的代码一定比串行的快，以及能快多少。在金老师的文章中给出了一个例子，将task拆分过细反而会造成性能恶化。<br/><br/>总之，.NET并行语法显得很优雅，如同C++让程序员管理内存和指针造成程序繁复和易错一样，让程序员管理底层线程的细节，并且考虑每一个变量的同步问题也是复杂和艰难的。<br/><br/>像C#这样的高级语言引入了并行，无疑将大大加快并行的普及速度。<br/><br/>在开发工具不支持并行的情况下，应用软件对并行支持不佳也就可想而知了。过去的几年，处理器的发展却无法给最终用户带来实质的性能提升，无疑是一件很尴尬的事情。<br/><br/>无论.NET4.0是抛砖引玉，还是又剽窃了什么，这都无所谓，我们期待一场新的变革的到来。我向看官们推荐C#4.0的并行库——花一点时间了解下或许很有用处。]]></summary>
	  <link rel="alternate" type="text/html" href="http://blog.caozhongyan.com/article.asp?id=22" /> 
	  <id>http://blog.caozhongyan.com/default.asp?id=22</id>
  </entry>	
		
</feed>
