<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[曹钟岩的博客 - Caozhongyan's Blog]]></title>
<link>http://blog.caozhongyan.com/</link>
<description><![CDATA[Stay Hungry, Stay Foolish]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog3 v2.8]]></copyright>
<webMaster><![CDATA[null@null.com(曹钟岩)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>曹钟岩的博客 - Caozhongyan&#39;s Blog</title>
	<url>http://blog.caozhongyan.com/images/logos.gif</url>
	<link>http://blog.caozhongyan.com/</link>
	<description>曹钟岩的博客 - Caozhongyan&#39;s Blog</description>
</image>

			<item>
			<link>http://blog.caozhongyan.com/article.asp?id=26</link>
			<title><![CDATA[发现Windows XP一个重大的漏洞，应该是BUG]]></title>
			<author>null@null.com(admin)</author>
			<category><![CDATA[技术活]]></category>
			<pubDate>Sun,31 Jan 2010 17:51:02 +0800</pubDate>
			<guid>http://blog.caozhongyan.com/default.asp?id=26</guid>
		<description><![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 就是一个娱乐系统。]]></description>
		</item>
		
			<item>
			<link>http://blog.caozhongyan.com/article.asp?id=25</link>
			<title><![CDATA[BCGControlBar简明使用教程]]></title>
			<author>null@null.com(admin)</author>
			<category><![CDATA[技术活]]></category>
			<pubDate>Tue,26 Jan 2010 01:05:41 +0800</pubDate>
			<guid>http://blog.caozhongyan.com/default.asp?id=25</guid>
		<description><![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/>]]></description>
		</item>
		
			<item>
			<link>http://blog.caozhongyan.com/article.asp?id=24</link>
			<title><![CDATA[利用人性中的善良赚钱]]></title>
			<author>null@null.com(admin)</author>
			<category><![CDATA[道]]></category>
			<pubDate>Mon,25 Jan 2010 02:36:18 +0800</pubDate>
			<guid>http://blog.caozhongyan.com/default.asp?id=24</guid>
		<description><![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: 有人说，你说利用人性中的善良赚钱，那么一个人伪装自己很贫困去寻求资助算不算呢？明显不算，仔细阅读我的文章你会知道我说的“利用”是指，帮助他人达成他的目标，这个过程本身应该不存在欺瞒。]]></description>
		</item>
		
			<item>
			<link>http://blog.caozhongyan.com/article.asp?id=23</link>
			<title><![CDATA[Bind9配置DNS服务器10分钟入门教程]]></title>
			<author>null@null.com(admin)</author>
			<category><![CDATA[技术活]]></category>
			<pubDate>Sat,28 Nov 2009 19:59:37 +0800</pubDate>
			<guid>http://blog.caozhongyan.com/default.asp?id=23</guid>
		<description><![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还是很强大的。]]></description>
		</item>
		
			<item>
			<link>http://blog.caozhongyan.com/article.asp?id=22</link>
			<title><![CDATA[并行的时代真的要来了]]></title>
			<author>null@null.com(admin)</author>
			<category><![CDATA[技术活]]></category>
			<pubDate>Thu,05 Nov 2009 03:42:21 +0800</pubDate>
			<guid>http://blog.caozhongyan.com/default.asp?id=22</guid>
		<description><![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的并行库——花一点时间了解下或许很有用处。]]></description>
		</item>
		
			<item>
			<link>http://blog.caozhongyan.com/article.asp?id=21</link>
			<title><![CDATA[今天拍了几张可爱的小木星]]></title>
			<author>null@null.com(admin)</author>
			<category><![CDATA[Mylife]]></category>
			<pubDate>Fri,04 Sep 2009 22:49:55 +0800</pubDate>
			<guid>http://blog.caozhongyan.com/default.asp?id=21</guid>
		<description><![CDATA[连续下了好久的雨，天气终于放晴了。<br/><br/>于是今天又来看看好久不见的小木星。<br/><br/>我DIY了一个减光罩，本来是看月球的，看小木星没有取下来，于是奇迹出现了。<br/><br/>看得非常清楚。不但条纹清晰可见，南极的云帽也看到了，甚至隐约看到了大红斑。<br/><br/>用电子目镜抓拍了几张，竟然拍摄到了条纹。<br/><br/><img src="http://blog.caozhongyan.com/images/smalljupiter/1.jpg" border="0" alt=""/><br/><img src="http://blog.caozhongyan.com/images/smalljupiter/2.jpg" border="0" alt=""/><br/><br/>准备入手一个900NC，为镜子作最后的升级。<br/><br/><br/>SPC900NC已入，这是今天拍的。<br/><img src="http://blog.caozhongyan.com/images/smalljupiter/20091002191026937.PNG" border="0" alt=""/>]]></description>
		</item>
		
			<item>
			<link>http://blog.caozhongyan.com/article.asp?id=20</link>
			<title><![CDATA[在武汉看日食]]></title>
			<author>null@null.com(admin)</author>
			<category><![CDATA[Mylife]]></category>
			<pubDate>Mon,27 Jul 2009 02:40:37 +0800</pubDate>
			<guid>http://blog.caozhongyan.com/default.asp?id=20</guid>
		<description><![CDATA[<p><span style="font-size: 12px">背景</span><br />
原来计划去嘉兴的<br />
当天上午，我发现南京、上海预报下雨，嘉兴、湖州阴天，重庆武汉多云，成都下雨，于是决定去武汉<br />
我的同学吕白皋在华中科技大学，于是和他联系，让他接应<br />
坐下午2点的动车，3个小时就到了汉口，一共500多公里<br />
在车站看到很多人带着望远镜<br />
其中有一队人马带了好几个望远镜<br />
我和他们随便聊了几句，他们从太原来南京<br />
然后得知天气不好赶来武汉的<br />
领队的一个兄弟姓赵<br />
他和我说，武汉的天气也不理想，尤其是中心线附近，云很多，建议往宜昌方向走<br />
我建议他们在武汉原地观察，晚上再说<br />
我们交换了联系方式，然后分别<br />
然后顺利吕白皋汇合<br />
坐了2小时的车，天黑的时候才到达汉口<br />
吃了饭、洗了澡，然后参观了下校园<br />
我们发现有个大湖，静悄悄的，没有人，很开阔，决定第二天在那里看<br />
这时候通过校内联系上了我的一个大学同学，他长期在武汉出差，于是约好第二天一起来看<br />
先头说到的赵他们一行决定去武大或者武汉江滩观看，但是我们觉得那儿人多效果不佳<br />
还是留在校园<br />
第二天早上云很多，我很怕<br />
不过后天云散去了<br />
我的相机主电池丢家了，副电池也没有电，所以赶快充电，另外制作巴德膜罩子花了很多时间，所以错过初亏<br />
我们来到那个湖边，惊愕地发现昨日的安静的校园全是人<br />
于是我们来到吕白皋实验室所在的楼边一个过道处<br />
这时候遇到吕白皋的一个同学<br />
我们架设好了设备，吕白皋老板、老板的儿子和爱人也来了<br />
这时候又来了几个同学<br />
观测就此开始</p>
<p><br />
<span style="font-size: 12px">观测</span><br />
我们到的时候已经挡住50%了<br />
此时的太阳，像童话里的月亮船那样，漂浮的云朵，增添了几分神秘<br />
大约90%的时候，天有一点暗<br />
用眼睛睁开迅速闭起来，看到太阳的影子已经是月牙了 <br />
金黄金黄的<br />
在95%的时候，就像傍晚了<br />
路灯刷的亮了，很安静，很安静<br />
98%的时候<br />
我开始看望远镜<br />
有一个很窄的小月牙<br />
一开始觉得是变窄，然后一点一点变短<br />
最后开始倒计时 <br />
（这个时候外面发生了什么我没有注意，天不知不觉就黑了） <br />
然后月牙变得很短很粗<br />
（这个时候老板的儿子在喊钻石环钻石环，实际上还没有到）<br />
开始汇聚到一点 <br />
突然消失，月亮黑影边缘出现粉红色的小颗粒 <br />
（我没有经验，所以错过了前贝利珠）<br />
然后突然觉得一黑<br />
大家一片欢呼<br />
全食来了<br />
我赶快拿下滤色镜 <br />
然后太阳周围的日冕发出幽暗变幻的光 <br />
很飘忽，有点像冰淇淋周围冒的冷气 <br />
无法形容，太美了太美了 <br />
然后我离开望远镜让别人看，我开始看世界 <br />
我看到远处的光，像晚霞一样<br />
远处的山非常灰暗<br />
山顶有一点点鱼肚白 <br />
肉眼看到的日冕是一圈，就像一个大的黄色球中间有个小黑点<br />
黄球直径2r，太阳直径r <br />
云太多，没有星<br />
天是深蓝色的<br />
大家一边看一边说话<br />
然后我突然想起来，没有拍照 <br />
手忙脚乱拿N73拍照<br />
此时太阳没有出来，但是上方好亮，我觉得快出来了，但是持续了好久 <br />
然后突然一下，一点思想准备都没有 <br />
太阳就冲出来了 <br />
贝利珠，然后是钻石环出现了<br />
0.几sec. <br />
N73正好抓到钻石环 <br />
在望远镜里面，大约就一瞬间，整个眼前就一片光，什么也看不到了 <br />
这个时候回到世界 <br />
看到太阳光像白天远处有一面镜子<br />
突然把光线对着你那样 <br />
像宝石样一闪 <br />
这个时候吹过一阵阴风 <br />
很凉快 <br />
天是一下就亮了<br />
有人说看到了日耳<br />
但是我没注意到<br />
之后又是偏食 <br />
月牙一点一点变大 <br />
全食结束<br />
偏食过程中又拍摄了一些照片</p>
<p>&nbsp;<br />
<span style="font-size: 12px">归来</span><br />
我看了电视重播，我们的观测基本和电视的一样<br />
电视中的武汉江滩有云，效果不如我们这里，但是江滩的景色很美<br />
主持人的解说完全没有现场的感觉<br />
回忆日食的一瞬间，我和我的同学都非常回味<br />
但是美妙太短暂了<br />
关于生光的一瞬间<br />
我的大学同学是这么描述的&mdash;&mdash;<br />
那一刻感觉就像是天使降临到了人间。<br />
&nbsp;</p>
<p>&nbsp;<object height="363" width="420">
<param value="http://www.tudou.com/v/fo2BwyRcS10" name="movie" />
<param value="true" name="allowFullScreen" />
<param value="always" name="allowscriptaccess" />
<param value="opaque" name="wmode" /><embed height="363" width="420" wmode="opaque" allowfullscreen="true" allowscriptaccess="always" type="application/x-shockwave-flash" src="http://www.tudou.com/v/fo2BwyRcS10"></embed></object></p>]]></description>
		</item>
		
			<item>
			<link>http://blog.caozhongyan.com/article.asp?id=19</link>
			<title><![CDATA[最牛的Win32反编译器，Hex-Rays。完美反编译VB、C++、Delphi]]></title>
			<author>null@null.com(admin)</author>
			<category><![CDATA[技术活]]></category>
			<pubDate>Mon,06 Jul 2009 20:44:59 +0800</pubDate>
			<guid>http://blog.caozhongyan.com/default.asp?id=19</guid>
		<description><![CDATA[为了一探最近一款热点软件的实现原理，我使用了几个反编译器，最后锁定了Hex-Rays。Hex-Rays是一个非常非常完美的Win32/X86/AMD64反编译插件，基于大名鼎鼎的<a target="_blank" href="http://blog.caozhongyan.com/files/ida52.rar" rel="external">IDA Pro</a>。和别的工具相比，产生的代码可读性极高，甚至可以把反编译出来的代码直接编译回去。理论上说，利用Hex-Rays、C编译器、连接器、以及一些辅助技术，完全可以在没有源代码的情况下，修改甚至扩充原有的代码。由于VB虚拟机的特性，以及VB可能采用了Thunk，产生的代码有点古怪，而且窗体的代码不能正常出来。<br/><br/>这是软件界面：<br/><img src="http://blog.caozhongyan.com/images/user/Hex-Rays/Hex-Rays.jpg" border="0" alt=""/><br/><br/>下面看几个例子：<br/>VC++ 6.0 下代码反编译：<br/>原始代码(debug编译)：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://blog.caozhongyan.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>#include &#34;stdio.h&#34;<br/><br/>template &lt;typename t&gt; void _swap(t&amp; a, t&amp; b);<br/><br/>int _factorial(int n)<br/>{<br/>&#160;&#160;&#160;&#160;int r = 1;<br/>&#160;&#160;&#160;&#160;if (n &lt;= 1) return 1;<br/>&#160;&#160;&#160;&#160;for (int i = 2; i &lt;= n; i++)<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;r *= i;<br/>&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;return r;<br/>}<br/><br/>int main(int argc, char** argv)<br/>{<br/>&#160;&#160;&#160;&#160;int a = 4, b = 5;<br/>&#160;&#160;&#160;&#160;printf(&#34;org a = %d, b = %d.\n&#34;, a, b);<br/>&#160;&#160;&#160;&#160;_swap&lt;int&gt;(a, b);<br/>&#160;&#160;&#160;&#160;printf(&#34;now a = %d, b = %d.\n&#34;, a, b);<br/><br/>&#160;&#160;&#160;&#160;printf(&#34;%d! = %d.\n&#34;, a, _factorial(a));<br/><br/>&#160;&#160;&#160;&#160;return 0;<br/>}<br/><br/>template &lt;typename t&gt; void _swap(t&amp; a, t&amp; b)<br/>{<br/>&#160;&#160;&#160;&#160;t c = a;<br/>&#160;&#160;&#160;&#160;a = b;<br/>&#160;&#160;&#160;&#160;b = c;<br/>&#160;&#160;&#160;&#160;_asm<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;add eax, 1<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;sub eax, 1<br/>&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;printf(&#34;finished swap.\n&#34;);<br/><br/>}<br/></div></div><br/>反编译出来的代码：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://blog.caozhongyan.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>//----- (00401030) --------------------------------------------------------<br/>signed int __cdecl factorial(signed int a1)<br/>{<br/>&nbsp;&nbsp;signed int result; // eax@2<br/>&nbsp;&nbsp;signed int v2; // [sp+50h] [bp-4h]@1<br/>&nbsp;&nbsp;signed int v3; // [sp+4Ch] [bp-8h]@3<br/><br/>&nbsp;&nbsp;v2 = 1;<br/>&nbsp;&nbsp;if ( a1 &gt; 1 )<br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;v3 = 2;<br/>&nbsp;&nbsp;&nbsp;&nbsp;while ( v3 &lt;= a1 )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v2 *= v3++;<br/>&nbsp;&nbsp;&nbsp;&nbsp;result = v2;<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;else<br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;result = 1;<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;return result;<br/>}<br/><br/>//----- (004010B0) --------------------------------------------------------<br/>int __cdecl main()<br/>{<br/>&nbsp;&nbsp;char v1; // [sp+Ch] [bp-48h]@1<br/>&nbsp;&nbsp;signed int v2; // [sp+50h] [bp-4h]@1<br/>&nbsp;&nbsp;signed int v3; // [sp+4Ch] [bp-8h]@1<br/><br/>&nbsp;&nbsp;memset(&amp;v1, -858993460, 0x48u);<br/>&nbsp;&nbsp;v2 = 4;<br/>&nbsp;&nbsp;v3 = 5;<br/>&nbsp;&nbsp;printf((int)&#34;org a = %d, b = %d.\n&#34;, 4);<br/>&nbsp;&nbsp;j__swap(&amp;v2, &amp;v3);<br/>&nbsp;&nbsp;printf((int)&#34;now a = %d, b = %d.\n&#34;, v2);<br/>&nbsp;&nbsp;j__factorial(v2);<br/>&nbsp;&nbsp;printf((int)&#34;%d! = %d.\n&#34;, v2);<br/>&nbsp;&nbsp;return _chkesp(1, 0);<br/>}<br/><br/>//----- (00401170) --------------------------------------------------------<br/>int __cdecl swap(int a1, int a2)<br/>{<br/>&nbsp;&nbsp;char ST04_1_0; // ST04_1@0<br/>&nbsp;&nbsp;int v4; // eax@1<br/>&nbsp;&nbsp;char v5; // [sp+Ch] [bp-44h]@1<br/>&nbsp;&nbsp;int v6; // [sp+4Ch] [bp-4h]@1<br/><br/>&nbsp;&nbsp;memset(&amp;v5, -858993460, 0x44u);<br/>&nbsp;&nbsp;v6 = *(_DWORD *)a1;<br/>&nbsp;&nbsp;*(_DWORD *)a1 = *(_DWORD *)a2;<br/>&nbsp;&nbsp;*(_DWORD *)a2 = v6;<br/>&nbsp;&nbsp;v4 = printf((int)&#34;finished swap.\n&#34;, ST04_1_0);<br/>&nbsp;&nbsp;return _chkesp(1, v4);<br/>}<br/></div></div><br/><br/>VB 6.0 下代码反编译：<br/>原始代码(debug编译)：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://blog.caozhongyan.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>Option Explicit<br/><br/>Public Function Factorial(ByVal n As Long) As Long<br/>&nbsp;&nbsp;&nbsp;&nbsp;Dim i As Long<br/>&nbsp;&nbsp;&nbsp;&nbsp;Factorial = 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;If n &lt; 2 Then Exit Function<br/>&nbsp;&nbsp;&nbsp;&nbsp;For i = 2 To n<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Factorial = Factorial * i<br/>&nbsp;&nbsp;&nbsp;&nbsp;Next<br/>End Function<br/><br/>Public Sub Swap(ByRef a As Long, ByRef b As Long)<br/>&nbsp;&nbsp;&nbsp;&nbsp;Dim c As Long<br/>&nbsp;&nbsp;&nbsp;&nbsp;c = a<br/>&nbsp;&nbsp;&nbsp;&nbsp;a = b<br/>&nbsp;&nbsp;&nbsp;&nbsp;b = c<br/>End Sub<br/><br/>Public Sub Main()<br/>&nbsp;&nbsp;&nbsp;&nbsp;Dim a As Long<br/>&nbsp;&nbsp;&nbsp;&nbsp;Dim b As Long<br/>&nbsp;&nbsp;&nbsp;&nbsp;a = 4<br/>&nbsp;&nbsp;&nbsp;&nbsp;b = 5<br/>&nbsp;&nbsp;&nbsp;&nbsp;Swap a, b<br/>&nbsp;&nbsp;&nbsp;&nbsp;MsgBox &#34;a = &#34; &amp; a &amp; &#34;, b = &#34; &amp; b &amp; &#34;.&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;MsgBox &#34;a! = &#34; &amp; Factorial(a)<br/>End Sub<br/></div></div><br/>反编译的代码，其中阶乘没有反编译出来：<br/>阶乘代码：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://blog.caozhongyan.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>.text:00401650 sub_401650&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proc near&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; CODE XREF: sub_4016A0+15Cp<br/>.text:00401650<br/>.text:00401650 arg_0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = dword ptr&nbsp;&nbsp;4<br/>.text:00401650<br/>.text:00401650&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, [esp+arg_0]<br/>.text:00401654&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, 1<br/>.text:00401659&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; edx, 2<br/>.text:0040165C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short locret_401671<br/>.text:0040165E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, 2<br/>.text:00401663<br/>.text:00401663 loc_401663:&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; ; CODE XREF: sub_401650+1Fj<br/>.text:00401663&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imul&nbsp;&nbsp;&nbsp;&nbsp;eax, ecx<br/>.text:00401666&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short loc_401674<br/>.text:00401668&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp; ecx, 1<br/>.text:0040166B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short loc_401674<br/>.text:0040166D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; ecx, edx<br/>.text:0040166F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jle&nbsp;&nbsp;&nbsp;&nbsp; short loc_401663<br/>.text:00401671<br/>.text:00401671 locret_401671:&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;; CODE XREF: sub_401650+Cj<br/>.text:00401671&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; retn&nbsp;&nbsp;&nbsp;&nbsp;4<br/>.text:00401674 ; ---------------------------------------------------------------------------<br/>.text:00401674<br/>.text:00401674 loc_401674:&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; ; CODE XREF: sub_401650+16j<br/>.text:00401674&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; ; sub_401650+1Bj<br/>.text:00401674&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;ds:__vbaErrorOverflow<br/>.text:0040167A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nop<br/>.text:0040167B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nop<br/>.text:0040167C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nop<br/>.text:0040167D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nop<br/>.text:0040167E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nop<br/>.text:0040167F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nop<br/>.text:0040167F sub_401650&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endp<br/></div></div><br/>反编译代码：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://blog.caozhongyan.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>//----- (00401650) --------------------------------------------------------<br/>#error &#34;40167F: invalid basic block (funcsize=19)&#34;<br/><br/>//----- (00401680) --------------------------------------------------------<br/>int __stdcall sub_401680(int a1, int a2)<br/>{<br/>&nbsp;&nbsp;int result; // eax@1<br/>&nbsp;&nbsp;int v3; // edx@1<br/>&nbsp;&nbsp;int v4; // ecx@1<br/><br/>&nbsp;&nbsp;v3 = a2;<br/>&nbsp;&nbsp;result = a1;<br/>&nbsp;&nbsp;v4 = *(_DWORD *)a1;<br/>&nbsp;&nbsp;*(_DWORD *)a1 = *(_DWORD *)a2;<br/>&nbsp;&nbsp;*(_DWORD *)v3 = v4;<br/>&nbsp;&nbsp;return result;<br/>}<br/><br/>//----- (004016A0) --------------------------------------------------------<br/>int __usercall sub_4016A0&lt;eax&gt;(int a1&lt;eax&gt;)<br/>{<br/>&nbsp;&nbsp;int v2; // eax@1<br/>&nbsp;&nbsp;int v3; // eax@1<br/>&nbsp;&nbsp;int v4; // eax@1<br/>&nbsp;&nbsp;int v5; // eax@1<br/>&nbsp;&nbsp;int v6; // eax@1<br/>&nbsp;&nbsp;int v7; // ST2C_4@1<br/>&nbsp;&nbsp;int v8; // eax@1<br/>&nbsp;&nbsp;int v9; // eax@1<br/>&nbsp;&nbsp;int v10; // eax@1<br/>&nbsp;&nbsp;int v11; // eax@1<br/>&nbsp;&nbsp;int v12; // eax@1<br/>&nbsp;&nbsp;int v13; // eax@1<br/>&nbsp;&nbsp;int v14; // eax@1<br/>&nbsp;&nbsp;int (*v15)(); // [sp+60h] [bp-Ch]@1<br/>&nbsp;&nbsp;int v16; // [sp+5Ch] [bp-10h]@1<br/>&nbsp;&nbsp;int v17; // [sp-40h] [bp-ACh]@1<br/>&nbsp;&nbsp;int *v18; // [sp+64h] [bp-8h]@1<br/>&nbsp;&nbsp;int *v19; // [sp+68h] [bp-4h]@1<br/>&nbsp;&nbsp;int v20; // [sp+50h] [bp-1Ch]@1<br/>&nbsp;&nbsp;int v21; // [sp+4Ch] [bp-20h]@1<br/>&nbsp;&nbsp;int v22; // [sp+48h] [bp-24h]@1<br/>&nbsp;&nbsp;int v23; // [sp+44h] [bp-28h]@1<br/>&nbsp;&nbsp;int v24; // [sp+40h] [bp-2Ch]@1<br/>&nbsp;&nbsp;signed int v25; // [sp+30h] [bp-3Ch]@1<br/>&nbsp;&nbsp;signed int v26; // [sp+20h] [bp-4Ch]@1<br/>&nbsp;&nbsp;signed int v27; // [sp+10h] [bp-5Ch]@1<br/>&nbsp;&nbsp;signed int v28; // [sp+0h] [bp-6Ch]@1<br/>&nbsp;&nbsp;signed int v29; // [sp+58h] [bp-14h]@1<br/>&nbsp;&nbsp;signed int v30; // [sp+54h] [bp-18h]@1<br/>&nbsp;&nbsp;signed int v31; // [sp+8h] [bp-64h]@1<br/>&nbsp;&nbsp;signed int v32; // [sp+18h] [bp-54h]@1<br/>&nbsp;&nbsp;signed int v33; // [sp+28h] [bp-44h]@1<br/>&nbsp;&nbsp;int v34; // [sp+38h] [bp-34h]@1<br/><br/>&nbsp;&nbsp;v15 = _vbaExceptHandler;<br/>&nbsp;&nbsp;v16 = a1;<br/>&nbsp;&nbsp;v18 = &amp;v17;<br/>&nbsp;&nbsp;v19 = dword_401088;<br/>&nbsp;&nbsp;v20 = 0;<br/>&nbsp;&nbsp;v21 = 0;<br/>&nbsp;&nbsp;v22 = 0;<br/>&nbsp;&nbsp;v23 = 0;<br/>&nbsp;&nbsp;v24 = 0;<br/>&nbsp;&nbsp;v25 = 0;<br/>&nbsp;&nbsp;v26 = 0;<br/>&nbsp;&nbsp;v27 = 0;<br/>&nbsp;&nbsp;v28 = 0;<br/>&nbsp;&nbsp;v29 = 4;<br/>&nbsp;&nbsp;v30 = 5;<br/>&nbsp;&nbsp;sub_401680((int)&amp;v29, (int)&amp;v30);<br/>&nbsp;&nbsp;v31 = -2147352572;<br/>&nbsp;&nbsp;v28 = 10;<br/>&nbsp;&nbsp;v32 = -2147352572;<br/>&nbsp;&nbsp;v27 = 10;<br/>&nbsp;&nbsp;v33 = -2147352572;<br/>&nbsp;&nbsp;v26 = 10;<br/>&nbsp;&nbsp;v2 = _vbaStrI4(v29);<br/>&nbsp;&nbsp;v3 = _vbaStrMove(&amp;v20, v2);<br/>&nbsp;&nbsp;v4 = _vbaStrCat(v3, L&#34;a = &#34;);<br/>&nbsp;&nbsp;v5 = _vbaStrMove(&amp;v21, v4);<br/>&nbsp;&nbsp;v6 = _vbaStrCat(L&#34;, b = &#34;, v5);<br/>&nbsp;&nbsp;v7 = _vbaStrMove(&amp;v22, v6);<br/>&nbsp;&nbsp;v8 = _vbaStrI4(v30);<br/>&nbsp;&nbsp;v9 = _vbaStrMove(&amp;v23, v8);<br/>&nbsp;&nbsp;v10 = _vbaStrCat(v9, v7);<br/>&nbsp;&nbsp;v11 = _vbaStrMove(&amp;v24, v10);<br/>&nbsp;&nbsp;v34 = _vbaStrCat(dword_40133C, v11);<br/>&nbsp;&nbsp;v25 = 8;<br/>&nbsp;&nbsp;rtcMsgBox(&amp;v25, 0, &amp;v26, &amp;v27, &amp;v28);<br/>&nbsp;&nbsp;_vbaFreeStrList(5, &amp;v20, &amp;v21, &amp;v22, &amp;v23, &amp;v24);<br/>&nbsp;&nbsp;_vbaFreeVarList(4, &amp;v25, &amp;v26, &amp;v27, &amp;v28);<br/>&nbsp;&nbsp;v31 = -2147352572;<br/>&nbsp;&nbsp;v28 = 10;<br/>&nbsp;&nbsp;v32 = -2147352572;<br/>&nbsp;&nbsp;v27 = 10;<br/>&nbsp;&nbsp;v33 = -2147352572;<br/>&nbsp;&nbsp;v26 = 10;<br/>&nbsp;&nbsp;v12 = sub_401650(v29);<br/>&nbsp;&nbsp;v13 = _vbaStrI4(v12);<br/>&nbsp;&nbsp;v14 = _vbaStrMove(&amp;v20, v13);<br/>&nbsp;&nbsp;v34 = _vbaStrCat(v14, L&#34;a! = &#34;);<br/>&nbsp;&nbsp;v25 = 8;<br/>&nbsp;&nbsp;rtcMsgBox(&amp;v25, 0, &amp;v26, &amp;v27, &amp;v28);<br/>&nbsp;&nbsp;_vbaFreeStr(&amp;v20);<br/>&nbsp;&nbsp;return _vbaFreeVarList(4, &amp;v25, &amp;v26, &amp;v27, &amp;v28);<br/>}<br/></div></div><br/><br/>Hex-Rays可以在此处<a target="_blank" href="http://download.csdn.net/source/1467669" rel="external">下载</a>。]]></description>
		</item>
		
			<item>
			<link>http://blog.caozhongyan.com/article.asp?id=18</link>
			<title><![CDATA[设计的四大原则]]></title>
			<author>null@null.com(admin)</author>
			<category><![CDATA[技术活]]></category>
			<pubDate>Fri,19 Jun 2009 20:05:43 +0800</pubDate>
			<guid>http://blog.caozhongyan.com/default.asp?id=18</guid>
		<description><![CDATA[Robin Williams 归纳出设计的四大原则，即对比、重复、对齐和亲密性。<br/>对比 Contrast<br/>对比的基本思想是，要避免页面上的元素太过相似。如果元素（字体，颜色，大小，线宽，形状，空间等）不相同，那就干脆让它们截然不同。要让页面引人注目，对比通常是最重要的一个因素，正是它能使读者首先看这个页面。<br/>重复 Repetition<br/>让设计中的视觉要素在整个作品中重复出现。可以重复颜色，形状，材质，空间关系，线宽，字体，大小和图片，等等。这样一来，既能增加条理性，还可以加强统一性。<br/>对齐 Alignment<br/>任何东西都不能在页面上随意安放。每个元素都应当与页面上的另一个元素有某种视觉联系。这样能建立一种清晰。精巧而且清爽的外观。<br/>亲密性 Proximity<br/>彼此相关的项应当靠近，归组在一起。如果多个项相互之间存在很近的亲密性，他们就会成为一个视觉单元，而不是多个孤立的元素。这有助于组织信息，减少混乱，为读者提供清晰的结构。<br/><br/>（本文内容来自 Robin Williams 的 The Non-Designers Design Book，电子版下载在此：<a target="_blank" href="http://blog.caozhongyan.com/files/The_Non-Designers_Design_Book.pdf" rel="external">http://blog.caozhongyan.com/files/The_Non-Designers_Design_Book.pdf</a>）]]></description>
		</item>
		
			<item>
			<link>http://blog.caozhongyan.com/article.asp?id=17</link>
			<title><![CDATA[下载了 Office 2010 TP，感觉不错]]></title>
			<author>null@null.com(admin)</author>
			<category><![CDATA[技术活]]></category>
			<pubDate>Sun,17 May 2009 11:17:01 +0800</pubDate>
			<guid>http://blog.caozhongyan.com/default.asp?id=17</guid>
		<description><![CDATA[Office 2010 的测试版已经发布，试用了一下，在用户体验方面，有不少改进。<br/>这是 Word 2010 的主界面，比 Office 2007 素雅了一些：<br/>值得称道的是，样式被放置在首页上，并且占据了很大一块范围，用户在 Word 中用得最多的就是格式排版，现在这些操作都可以一键完成。<br/><img src="http://blog.caozhongyan.com/images/user/office2010/3.png" border="0" alt=""/><br/>经过改良的艺术字<br/><img src="http://blog.caozhongyan.com/images/user/office2010/1.png" border="0" alt=""/><br/>现在页面设置、打印预览、打印全部集成在了一起，非常方便<br/><img src="http://blog.caozhongyan.com/images/user/office2010/2.png" border="0" alt=""/><br/>公式编辑器大幅改良<br/><img src="http://blog.caozhongyan.com/images/user/office2010/4.png" border="0" alt=""/><br/>当选择格式的时候，无关的菜单被虚化，使得用户可以更好观察所选效果<br/><img src="http://blog.caozhongyan.com/images/user/office2010/5.png" border="0" alt=""/><br/>这是页眉编辑状态<br/><img src="http://blog.caozhongyan.com/images/user/office2010/6.png" border="0" alt=""/><br/><br/>值得注意的是，安装程序需要一块支持 SSE 的处理器，并且要先安装 MSXML 6.10，否则会提示<br/>Setup is unable to proceed due to the following error(s):<br/>The installation of Microsoft Office 2010 requires that MSXML version 6.10.1129.0 be installed on your computer. Install this component and re-run setup.<br/>Correct the issue(s) listed above and re-run setup.<br/><br/>MSXML Parser 6.10 本地下载<a target="_blank" href="http://blog.caozhongyan.com/files/msxml6_x86.msi" rel="external">在此</a>。]]></description>
		</item>
		
</channel>
</rss>
