﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-λ-calculus（惊愕到手了欧耶，GetBlogPostIds.aspx）-随笔分类-其他</title><link>http://www.cppblog.com/vczh/category/7341.html</link><description>【QQ：343056143】【Email：vczh@163.com】【新浪微博：http://weibo.com/vczh】</description><language>zh-cn</language><lastBuildDate>Wed, 30 Apr 2014 08:24:42 GMT</lastBuildDate><pubDate>Wed, 30 Apr 2014 08:24:42 GMT</pubDate><ttl>60</ttl><item><title>要学车暂停更新几个星期 </title><link>http://www.cppblog.com/vczh/archive/2014/04/30/206776.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Wed, 30 Apr 2014 07:33:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2014/04/30/206776.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/206776.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2014/04/30/206776.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/206776.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/206776.html</trackback:ping><description><![CDATA[ RT<img src ="http://www.cppblog.com/vczh/aggbug/206776.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2014-04-30 15:33 <a href="http://www.cppblog.com/vczh/archive/2014/04/30/206776.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开始用Word2013来写博客</title><link>http://www.cppblog.com/vczh/archive/2013/11/04/204074.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Sun, 03 Nov 2013 17:30:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2013/11/04/204074.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/204074.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2013/11/04/204074.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/204074.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/204074.html</trackback:ping><description><![CDATA[<p>第一步：如果从未发布过博客文章的话，需要在菜单里面选这里添加博客账号
</p><p><img src="http://www.cppblog.com/images/cppblog_com/vczh/110313_1730_Word20131.png" alt=""/>
	</p><p>
 </p><p>第二步：选择正确的设置
</p><p><img src="http://www.cppblog.com/images/cppblog_com/vczh/110313_1730_Word20132.png" alt=""/>
	</p><p><img src="http://www.cppblog.com/images/cppblog_com/vczh/110313_1730_Word20133.png" alt=""/>
	</p><p>
 </p><p>第三步：写完博客之后，按这里就可以发布了！
</p><p><img src="http://www.cppblog.com/images/cppblog_com/vczh/110313_1730_Word20134.png" alt=""/>
	</p><p>
 </p><p>如果以后需要写新的博客的话，还可以直接点这里：
</p><p><img src="http://www.cppblog.com/images/cppblog_com/vczh/110313_1730_Word20135.png" alt=""/>
	</p><p>
 </p><p>Word 2013就是简单好用啊，虽然Live Writer没有了，但是有了Word 2013，其实也是一样的。</p><img src ="http://www.cppblog.com/vczh/aggbug/204074.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2013-11-04 01:30 <a href="http://www.cppblog.com/vczh/archive/2013/11/04/204074.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>时隔多年我又再一次体验了一把跟大神聊天的感觉</title><link>http://www.cppblog.com/vczh/archive/2013/06/26/201310.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Tue, 25 Jun 2013 17:17:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2013/06/26/201310.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/201310.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2013/06/26/201310.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/201310.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/201310.html</trackback:ping><description><![CDATA[<p>跟大神聊天是很开心的。这不是因为我激动，而是因为大神说出来的每一个字都是有价值的，一针见血，毫无废话。至于为什么说又，当然是这种事情以前发生过。</p> <p>第一次是在高中认识了龚敏敏。那个时候我刚做完那个傻逼的2D ARPG不久，龚敏敏已经是M$RA的实习生了，图形学上的造诣肯定要比我高许多，其中的差距构成了大神跟菜鸟的关系。当然现在我尽管中心已经放在了程序设计语言（programming language，以下简称PL）上，但是还知道一些图形学的内容，跟龚敏敏的差距自然也已经缩小到了不构成大神和菜鸟的关系的程度了。尽管他还是比我多知道很多东西。</p> <p>第二次是在大学的时候认识了g9yuayon。g9菊苣是做形式化和证明的，自然也知道很多PL的事情。那应该是我大二的时候，在CSDN上偶然发现了g9菊苣的博客，觉得文章写的很好，就顺便把博客上面的email“密码”给破了之后发email给他。后来g9菊苣告诉了我很多诸如在哪里可以获得知识的事情，于是我也就做了PL。尽管现在已经很少跟g9菊苣联系了，不过我感觉目前我跟g9的差距应该还属于大神跟菜鸟的关系，因为他很久以前写的博客我都还不能完全搞明白。</p> <p>第三次就是今天的事情了。大家都知道最近我在写一个《如何设计一门语言》的系列文章。这个系列文章肯定是会继续写下去的，因为我的语言都还没做出来。所以可以很明显地看出来，我现在也在做一个语言。这跟王垠的那个one当然是不一样的，因为我从一开始就没打算代替所有东西，而且目标也很明确，就是把它做成跟C++/C#一样，菜鸟可以很容易上手写出清晰易懂的代码，大神也可以在里面挖掘出很多奇技淫巧。于是我不可避免的就遇到了CPS的问题。</p> <p>大家都知道C#有yield和await两个关键字，F#也有computation expression。于是我就在想，如果yield和await不是关键字，而是一个函数，会发生什么事情。展开来讲，就是如果要让程序员自己实现一个为特定目的服务的CPS变换，那我的语法要怎么做。对于没有怎么设计过程序语言的人来说，“设计一个语法”这种事情其实是很容易被误解的。语法并不是说要在这里放一个括号，在那里放一个关键字，在别的地方还能省略一个什么东西（瞧瞧go抄了javascript那个屎一样的分号省略策略）。这些都属于品味的问题。品味是不需要设计的，那是靠感觉的，是一种艺术。只要你拿出来觉得漂亮，那就是好的。真正需要思考的东西是什么，那自然是围绕早上面的类型系统了。</p> <p>我用通俗易懂的方法来解释一下，什么是类型系统，或者说在我们这些做PL的人看来，眼中的程序大概是什么样子的。我们拿一个C#的异步程序来说，其实也就是上一篇文章讲的那个例子了。  <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 5px; background-color: #f5f5f5; padding-left: 5px; padding-right: 5px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 5px" class="cnblogs_code"><pre><span style="color: #0000ff">async</span> <span style="color: #0000ff">void</span> button4_Click(<span style="color: #0000ff">object</span><span style="color: #000000"> sender, EventArgs e)
{
    </span><span style="color: #0000ff">try</span><span style="color: #000000">
    {
        </span><span style="color: #0000ff">string</span> a=<span style="color: #0000ff">await</span><span style="color: #000000"> Http.DownloadAsync(url1);
        </span><span style="color: #0000ff">string</span> b=<span style="color: #0000ff">await</span><span style="color: #000000"> Http.DownloadAsync(url2);
        textBox1.Text</span>=a+<span style="color: #000000">b;
    }
    </span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception ex)
    {
        textBox1.Text</span>=<span style="color: #000000">ex.Message;
    }
}</span></pre></div>

<p>大家都很熟悉吧。如果这个这么简单的程序还看不懂的话，那肯定是没有认真阅读我的《如何》系列。好了，现在开始来讲，做PL的人到底是如何看待这个程序的呢： 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 5px; background-color: #f5f5f5; padding-left: 5px; padding-right: 5px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 5px" class="cnblogs_code"><pre><span style="color: #0000ff">async</span> <span style="color: #0000ff">void</span><span style="color: #000000"> button4_Click(Object, EventArgs)
{
    </span><span style="color: #0000ff">try</span><span style="color: #000000">
    {
        String</span>=<span style="color: #0000ff">await</span> (String -&gt; Task&lt;String&gt;<span style="color: #000000">) (String);
        String</span>=<span style="color: #0000ff">await</span> (String -&gt; Task&lt;String&gt;<span style="color: #000000">) (String);
        (TextBox </span>-&gt; String -&gt; Void#TextBox.Text) (TextBox, String +<span style="color: #000000"> String);
    }
    </span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception)
    {
        (TextBox </span>-&gt; String -&gt; Void#TextBox.Text) (TextBox, (Exception -&gt;<span style="color: #000000"> String#Exception.Message) (Exception));
    }
}</span></pre></div>

<p>嗯，差不多就是这个样子。这个函数究竟是下载一个盗版小说，还是下载一个带节操的日本电影，究竟是同步下载，还是异步下载，是下载到一个文件夹，还是下载到skydrive——关我屁事！我只看这里关于类型的部分。</p>
<p>所以，如果await是一个函数的话，那他应该是什么类型？如果yield也是一个函数，那他应该是什么类型？如果这门语言让程序员来创建属于自己的await和yield甚至是他自己的想要的计算，那我应该如何做一个框架让他往里面套，或者他写出来的这个函数究竟要在什么上下文里面满足什么样的一个类型的关系呢？我最近就一直在想这个问题。</p>
<p>一开始我就把目光投向了F#的computation expression，因为F#的这个东西就具有我想要的一切功能。后来我想把这个功能搬进来的时候，发现怎样都套不上。当然我很快就发现了，这其实是因为F#归根结底还是一个函数是语言，他是不能在一个for循环里面写break、continue或者return的。F#的一个for循环，永远是一个完美的for循环。但是我的语言是可以的，于是这样在类型上就不完美了——不过这是小事，牺牲一点点完美换来易用性是值得的。当然，牺牲很多完美来满足易用性，我觉得是不值得的。</p>
<p>既然for循环里面可以带break/continue/return，那么“我的computation expression”的For函数，就不能是类似于IEnumerable&lt;T&gt;-&gt;(T-&gt;M&lt;U&gt;)-&gt;M&lt;U&gt;这种纯粹的东西了。那我应该怎么做呢？</p>
<p>写到这里，我觉得在微软工作就是好啊。关于编程语言领域的很多改进其实都是从微软这里做出来的。通俗的部分，看看完美的C#，看看ASP.NET MVC的razor模板在Visual Studio里面的智能提示的功能——这可是一个可以混合HTML+CSS+Javascript+C#的代码，写的时候丝般顺滑，行云流水，俨然这四门语言就是一门语言一样。在学术上，微软的各个研究院也贡献了相当多的东西——不过我觉得你们对这些应该是不感兴趣的，尽管你们在linux上面也用了很多微软的成果。</p>
<p>那这能说明什么问题呢？这就意味着，我可以随时access到微软做编程语言的大神们，抓他们来问问题。不过他们是很忙的，经常不在线（我们也有一个类似QQ这样子的东西）。不过今天我随手打开了一下，展开了我积累的几个大神的组，发现F#他爹竟然是绿的，于是我随手就发了一句hi，看看人家在不在。人家回了我，于是我就开始问这个问题了。</p>
<p>什么，你不知道F#他爹是谁？他当然是Don Syme了。写函数式语言不认识Don Syme，就犹如读物理不认识牛顿，读数学不认识柯西，写C++不知道Bjarne Stroustrup，用操作系统不知道Dave Cutler一样，要跪着爬回自己学校里重新读书。</p>
<p>Don Syme是微软的Principle Researcher，翻译过来大概就是“顶级科学家”的意思吧，很少有更牛逼的东西了。</p>
<p>于是故事到这里就结束了，因为Don Syme大神他很快就回复我说，如果for循环支持break/continue/return，那我就不应该从F#的computation expression里面获取灵感。至于我的问题要怎么办，这还是个open question。于是我们愉快的聊天就用下面的一句话结束了：</p>
<p>Don Syme: Research <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="微笑" src="http://www.cppblog.com/images/cppblog_com/vczh/Windows-Live-Writer/713ffee08631_9B5/wlEmoticon-smile_2.png"></p><img src ="http://www.cppblog.com/vczh/aggbug/201310.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2013-06-26 01:17 <a href="http://www.cppblog.com/vczh/archive/2013/06/26/201310.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>根据网友phoenixbing的建议我决定开一个（主要是编译/语言/图形的）讨论群</title><link>http://www.cppblog.com/vczh/archive/2012/11/29/195805.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Thu, 29 Nov 2012 10:53:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2012/11/29/195805.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/195805.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2012/11/29/195805.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/195805.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/195805.html</trackback:ping><description><![CDATA[<p>群号：31724825</p> <p>在最近这几年里，一起讨论编译器的人也不多，一般都是ooseven、@装配脑袋、@空明流转(&lt;--高手，要跪)、@belleveinvis等这几个人。而且也零星有一些我也不记得叫什么名字的在我的评论里面提出过一些很好的建议，让我得到了充分的学习。因此我想，如果有兴趣的人可以加进来一起讨论的话，应该不仅对我，对大家也是有好处的。而且我本人喜欢的领域也比较分散，譬如图形界面、软件渲染、编译原理、游戏开发等等。这几个领域都有互相促进的作用，而且需要的背景知识交集又少，不同领域的人的思想和类型也不一样。如果群里的人北京分布比较广泛的话，也许还会有意想不到的idea出现。</p> <p>所以只要满足以下要求的人都热烈欢迎。<br>1、热爱编程<br>2、不是来求代码的<br>3、不要问各种傻逼问题（譬如说为什么cout&lt;&lt;1+2&lt;&lt;endl;会有错误啊）和求写大作业（我可没时间管这些不见棺材不流泪的学生们）<br>4、可以交换知识就最好了</p> <p>本穷丑矮不是VIP，故群人数有上限（不过我想应该是达不到的），先到先得。</p> <p>引用<a title="http://www.cppblog.com/vczh/archive/2012/11/29/195779.html" href="http://www.cppblog.com/vczh/archive/2012/11/29/195779.html">http://www.cppblog.com/vczh/archive/2012/11/29/195779.html</a>的三楼</p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 5px; background-color: #f5f5f5; padding-left: 5px; padding-right: 5px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 5px" class="cnblogs_code"><span style="color: #000000">老大，你的博客很好，代码很好，但是我们有时候消化不了这么快，有时候想找人交流交流，却找不到，我建议你建立一个群，把群号放在博客首页，这样研究你源码的人会聚集在一起，大家也可以讨论，你也不需要参与讨论，甚至你不在群里都可以，毕竟你时间有限，你还要去微博灌水，二次元啥的。<br><br>这样你也没啥损失。但对祖国的编译器苦手们就大有帮助。</span>（后略）</div><img src ="http://www.cppblog.com/vczh/aggbug/195805.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2012-11-29 18:53 <a href="http://www.cppblog.com/vczh/archive/2012/11/29/195805.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>终于点了ASP.NET MVC3的技能树了</title><link>http://www.cppblog.com/vczh/archive/2012/07/10/182499.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Mon, 09 Jul 2012 18:27:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2012/07/10/182499.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/182499.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2012/07/10/182499.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/182499.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/182499.html</trackback:ping><description><![CDATA[<div>&nbsp;&nbsp;&nbsp; 为了给自己写的C++ GUI库做宣传，在几个月前我决定要给他做一个网站，经历了这几个月不断的重构，现在网站的架构终于定型了。考虑到在这之前我几乎没有开发网站的经验，所以在这里做点小总结来介绍自己一路走来发生的事情。<br /><br />&nbsp;&nbsp;&nbsp; 一开始为了制作这个网站购买了万网的域名和一个很便宜的一年500块钱的空间。这个空间支持低版本的asp.net，不过当时还没学会这方面的东西。后来我就开始学习HTML和CSS，然后做出了几个页面。不同的浏览器有不同的bug，导致HTML和CSS搞起来相当复杂，特别是div和float的结合，更是焦头烂额。后来索性整个网页都用表格布局。虽然表格布局并不是什么流行的做法，但是鉴于GacUI的网站并没有多么复杂的内容，因此最后这么做，避开了很多跨浏览器的问题。当然以后如果网页内容变得太复杂的话总是要改回div的吧。对于常年写图形和编译器方面的我来说，刚开始深入接触HTM和CSS的时候就对他的杂乱无章所震惊。使用programming language领域的经验和标准来看，HTML、CSS和Javascript作为编程的工具实在是烂到不能再烂了。不过事物的存在总是有其合理性的，纵观这三样东西的发展和历史，我们会发现其过程充满了各种巧合，而且当初这些东西在发明的时候就仅仅是为了解决一些简单的问题。如今流行了，就跟COBOL、Java和C语言一样，全世界的程序员都只能接受其不可忽视的弱点而就这么开发下去了。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;在熟悉了简单的HTML和CSS之后，我就开始给GacUI做网站了。这个网站的主要目的就是用来介绍GacUI的特点、展示一些Demo、告诉人们如何下载并使用，最后就是提供一个在线文档。文档就跟MSDN一样，当然搜索功能还不存在。刚开始就遇到了美工问题。技能书都点在了系统软件上，自己的美工自然是连自己都不能满足的。后来找了几个例子，看来看去觉得还是<a style="text-decoration: underline" href="http://www.codeplex.com" target="_blank">http://www.codeplex.com</a>最顺眼。但是它的代码复杂到吐血，我便只好依样画葫芦，自己慢慢复刻。最后复刻的结果还是令我比较满意的。在做完了导航条之后，我就发现了一个问题。如果不使用如今的框架来做网页，而采用手写的方法来生成HTML文件的话，势必是无法DIY的。不过那个时候还没有意识到这个问题的严重性，于是就采用了简单粗暴的复制代码的方法来做好那五个页面。这也为我之后转向Windows Azure埋下了伏笔。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;之后做Demo的展示页面比较顺利。因为目前展示Demo的方法就是先贴效果图，然后贴C++代码，十分的简单粗暴。于是立刻就遇到了一个新的障碍，要如何写一个类似MSDN的HTML文档。其实这件事情跟做网站本身是没什么关系的，但是自从决定了要提供在线文档之后，这个问题也就无法避免了。C++生成文档地方法之前略有研究，毕竟关于这个功能的一个简单的原型就是我跟几个朋友在大一的时候参加学校的软件竞赛的作品。后来还考虑过诸如Doxygen这样的工具。但是由于Doxygen生成的文档很难调整风格，使其整体融入我的网站的样式里，因此最终就放弃了。然后我便想起了Visual Studio的XML注释功能。在略为研究之后，我便给我的整个GacUI的类库的public class编写了XML注释。当我最终要执行生成文档的这一步的时候，我才发现所有的工具都不支持原生C++程序和XML注释的文档生成功能。不过想来其实也有道理。Visual Studio在编译了XML注释之后提供的一个xml文件只包含符号和注释的对应关系。至于符号究竟是什么内容，则完全没有。因此.net的程序是怎么生成文档的呢？自然是利用反射了。C++的苦逼就在这里啊，除了直接写代码，就没有任何方法。但是写了这么多的XML文档要放弃实在是太可惜了，所以我就不断的找呀找，然后发现Visual Studio在安装的时候提供了一个叫做DIA的库，可以让我阅读pdb文件！<br /><br />&nbsp;&nbsp;&nbsp; 这让我欣喜若狂啊。既然Visual C++的调试器可以通过阅读pdb就得到了一切的信息（看那个完美的调试器界面就知道了！），那我自然也可以从pdb里面找到所有东西的。抱着这个想法，我开始研究原生C++的pdb文件的符号的语义结构，后来就把我的经验写成了这两篇博客：<a style="text-decoration: underline" href="http://www.cppblog.com/vczh/archive/2012/03/10/167538.html" target="_blank">http://www.cppblog.com/vczh/archive/2012/03/10/167538.html</a>和<a style="text-decoration: underline" href="http://www.cppblog.com/vczh/archive/2012/03/10/167539.html" target="_blank">http://www.cppblog.com/vczh/archive/2012/03/10/167539.html</a>。虽然PDB并没有包含模板类的直接信息，不过这暂时不成问题，因为GacUI的大部分类也不是模板类。经过了这些研究，我就得到了一个相当于静态反射的功能了。之所以说是静态，是因为我没办法跟.net程序一样通过反射来调用函数。但是这对于生成文档来说已经足够了。后来我做了一件事情，就是写了个程序，读pdb获得所有的符号dump出一份xml，然后再写一个程序把xml里面的符号和Visual Studio产生的那个XML总注释文件的符号联系起来（这个过程有点复杂，因为两边的表示方法不一样&#8230;&#8230;），得到了一份既包含符号的完整内容又包含对应的注释的这么个几十M的XML文件。之后我设计了一个简单的文档格式，写了个程序把那个几十M的XML文件转换成用那个简单的文档格式表达的文档。之所以这样做是考虑到将来说不定除了HTML还要生成其他格式的文档，于是就做了那么个程序可读的中间格式。最后一步当然是读这些文件产生HTML文件了。整个流程如下所示：<br /><br />&nbsp;&nbsp;&nbsp; PDB（VC++编译器提供） -&gt; Symbols.XML （因为DIA是一个COM组件，所以这一步我用C++写，下面所有的步骤都用C#写。C#用起来还是更容易啊&#8230;&#8230;）<br />&nbsp;&nbsp;&nbsp; Symbols.XML + Comment.XML（VC++编译器提供） -&gt;&nbsp;FullSymbols.XML<br />&nbsp;&nbsp;&nbsp; FullSymbols.XML -&gt; *.docitem.txt<br />&nbsp;&nbsp;&nbsp; *.docitem.txt -&gt; *.html<br /><br />&nbsp;&nbsp;&nbsp; 经过了这些步骤，我就得到了整整一个文件夹的一千五百多个HTML文件了。然后我把这些文件跟我的网站合并在一起上传，就得到了第一个版本的GacUI网站了：<a style="text-decoration: underline" href="http://www.gaclib.net" target="_blank">http://www.gaclib.net</a>。当然现在已经看不到第一个版本的网站了。做完这些步骤之后，我就暂停了下来，继续开发GacUI。一边开发一边产生Demo，添加Demo页面，产生新的文档，消灭一些没用的函数的文档。写代码的时候还比较容易，再把代码的更改反映到这个网站的时候，就体现出了手写纯静态网站的弱点：维护起来真TMD麻烦啊！虽然上面的这些步骤已经被我合并到了一个bat文件，每次双击就能自动完成，但是修改Demo页面的时候还是人肉的。这让我十分不爽。<br /><br />&nbsp;&nbsp;&nbsp; 一个偶然的机会，我用了信用卡注册了一个Windows Azure的空间。这个空间其实并不powerful，只给了我相当于六颗CPU的计算能力。不过用来做这个网站已经足够了。想到每次修改网站都要复制HTML代码，修改了结构的话还要动所有的HTML文件，烦了大概一个月之后我就下定决心要把HTML做成动态生成的。在看了Windows Azure的一些介绍之后，我觉得ASP.NET MVC3加上Windows Azure的简单存储功能十分适合用来作这种东西。<br /><br />&nbsp;&nbsp;&nbsp; 刚开始接触MVC3还是让我觉得比较困难，不过最大的困难还是在于理解router的机制那里。GacUI的网站内容简单，所以并不需要ASP.NET的其他高级技术。结果所有的困难都出现在router机制里面。在经过了两天的学习之后，我初步的掌握了它的使用方法。MVC3的router基本上就是一个pattern matching的过程，把你的url映射到一个对controller的调用上面。你不仅可以映射controller的类名和函数名，还可以从url抽取一些参数。在掌握了它的原理之后，操作router的感觉就跟写haskell一样，又直接又清爽。接下来就是razor模板的事情。从programming language的观点上看，razor是一个设计的相当出色地模板语言。第一个特点就是和宿主语言C#融合的十分紧密，第二个特点就是几乎一点语法噪音都没有。用过原始asp和php的人都知道代码里面充满了&lt;%%&gt;是一件十分令人讨厌的事情。每一处代码和HTML的切换都要&lt;%%&gt;，整个文件一眼望去就是一坨屎。razor很好地解决了这个问题。他采用了复杂的判断方法来分辨哪些东西是C#，哪些东西是HTML。小部分C#和HTML的切换至需要一个@符号就搞定了，大部分的切换都是自动的。虽然偶尔razor会有分析错误的情况，但是他仍然提供了@:操作符来让我们workaround这个分析过程。整个模板语言下来毫无语法噪音，写起来十分直接，十分干净。<br /><br />&nbsp;&nbsp;&nbsp; 在网站差不多做完之后，我往生成HTML文档的程序添加了一个功能：生成一个包含HTML文档内容和元数据的XML。然后我写了一个程序把这一大堆XML灌入了Windows Azure的Blob Storage里面。Blob Storage就跟一个硬盘一样，可以用来存放大量的不需要计算（SQL数据库就属于那种需要计算的）数据。然后我给每一个文档页面建立了一个统一的Model，Model里面包含了&#8220;读取和分析这些XML文件&#8221;的功能，controller则做一个简单的转发，最后在model里面把所有被Model标记出来的需要改写的URL都用@Url.Action来处理。在这个过程中我学到了一个razor的小技巧：虽然不是很安全，但是在razor里面使用MvcHtmlString可以绕过html encoding的功能，把存储在变量里面的HTML代码直接嵌进页面。这么用的时候需要有清醒的意识。<br /><br />&nbsp;&nbsp;&nbsp; 如今GacUI终于有了镜像网站：<a style="text-decoration: underline" href="http://asia.gaclib.net/" target="_blank">http://asia.gaclib.net</a>和<a style="text-decoration: underline" href="http://us.gaclib.net/" target="_blank">http://us.gaclib.net</a>了。万网的破烂空间自然不可能直接访问Windows Azure Storage了。所以我采用了一个看起来比较傻逼的方法。首先我修改好网站之后，上传到EastAsia和West US两个服务器，然后我写了一个程序再把每一个生成好的HTML页面下载下来。下载的过程其实就和写爬虫差不多，每获得一个新的HTML文件就去分析里面的链接，然后继续下载。写完了之后我发现这个小程序还有了发现死链的功能，直接找出了网站代码的几个bug。下载完之后FTP到万网的空间里面。这个服务器在杭州。因此网站就有三个服务器了。<br /><br />&nbsp;&nbsp;&nbsp; 整个过程零零碎碎耗费了大约半年的时间，都是利用每天下班后的时间完成的。自己又点了技能树的一个新子树，涨了点经验值，觉得这些经验对于某些人来说可能还有参考的价值，于是就写了这篇博客，大家共勉。</div><img src ="http://www.cppblog.com/vczh/aggbug/182499.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2012-07-10 02:27 <a href="http://www.cppblog.com/vczh/archive/2012/07/10/182499.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++类库使用习惯投票一则</title><link>http://www.cppblog.com/vczh/archive/2011/11/23/160835.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Wed, 23 Nov 2011 14:22:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2011/11/23/160835.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/160835.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2011/11/23/160835.html#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/160835.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/160835.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 因为<a style="text-decoration: underline" href="http://www.cppblog.com/vczh/archive/2011/11/13/160025.html" target="_blank">GacUI</a>文件渐渐增多，为了让大家便于使用库，因此有下列三个选项，如果大家有空就评论，针对喜爱程度排序之：<br /><br />&nbsp;&nbsp;&nbsp; 1、直接引用源代码。一个文件夹下有很多.h和.cpp，给出文档，告诉大家需要什么功能的时候需要引用什么东西，然后自行添加自己的工程文件。<br />&nbsp;&nbsp;&nbsp; 2、存在dll，并且对于一些因为模板的原因无法直接放进dll的功能将失去，需要使用则引用源代码。<br />&nbsp;&nbsp;&nbsp; 3、存在dll，并且使用比模板丑陋的方法来将本来使用模板做接口的功能暴露出来。<br />&nbsp;&nbsp;&nbsp; 4、只有一个.h和一个.cpp文件。我将类库通过功能切分（只有GUI，只有脚本，包含GUI和脚本和他们的互联等等若干选项），给出若干对.h和.cpp。大家选择需要的那一对添加进工程文件。这样的话，直接#include那个.h文件就直接拥有了所有功能。而且Visual C++拥有预编译头（precompiled header），可以自行将该.h和.cpp进行预编译，迅猛提高编译速度（使用stl的时候大家肯定丝毫没有感觉太多头文件带来的问题）。这样还可以分别清晰地提供windows版本和linux版本等文件对。<br /><br />&nbsp;&nbsp;&nbsp; 我自己的倾向是使用4，因为某些原因，一旦把代码写进dll，有一些优美的模板实现的接口将被迫打散（譬如说stl，这些只是例子，我没有使用stl），所以觉得有些不爽。而且只添加两个文件（一个.h和一个.cpp），无论使用makefile还是工程文件，无论直接备份或者源码版本管理（codeplex、source forge、google code、github）都十分方便。 <img src ="http://www.cppblog.com/vczh/aggbug/160835.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2011-11-23 22:22 <a href="http://www.cppblog.com/vczh/archive/2011/11/23/160835.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>睡觉都梦见自己写完了编译器</title><link>http://www.cppblog.com/vczh/archive/2011/09/12/155578.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Sun, 11 Sep 2011 18:13:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2011/09/12/155578.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/155578.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2011/09/12/155578.html#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/155578.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/155578.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; C#真TMD复杂，让我好生搞了几个月都没把一个山寨C#的语法分析器写完，就想干脆去搞别的东西好了。因此山寨了个小WCF还顺带实践了一下不需要传递password和MD5(password)然后用RSA传递AESkey的加密方法，做了一个client可以new server的类来做网络通讯的东西。完了还搞了搞图像识别，不过最后除了一个超烂的边缘检测以外也没做成什么东西。<br /><br />&nbsp;&nbsp;&nbsp; 结果昨天晚上梦见我把C#编译到GPU上面的事情给搞定了（！！！！），然后在梦里面就在想：&#8220;现在距离javascript编译到GPU也不远了，干脆秒掉他好了。&#8221;正要开秒，就醒了。<br /><br />&nbsp;&nbsp;&nbsp; 所以想了想，从今天开始，还是继续做下去罢。 <img src ="http://www.cppblog.com/vczh/aggbug/155578.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2011-09-12 02:13 <a href="http://www.cppblog.com/vczh/archive/2011/09/12/155578.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>今天尝试了一下SVN插件，被轰得渣都不剩</title><link>http://www.cppblog.com/vczh/archive/2011/05/03/145609.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Tue, 03 May 2011 14:56:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2011/05/03/145609.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/145609.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2011/05/03/145609.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/145609.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/145609.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 主要目的是那个觉得不写代码就要死的室友想干点什么事情，觉得TFS太大了，所以做了个SVN。因此我们装了一个SVN的插件&#8220;Ankh SVN2&#8221;到Visual Studio 2010里面。然后尝试添加了个solution。Team Foundation Client有Source Control Explorer，因此这个破svn也得有个东西吧，然后我就在View目录下看到了Repository Explorer。一打开，有目录，欣喜若狂。然后我就在那个solution的目录下右键点delete，想看看效果。<br><br>&nbsp;&nbsp;&nbsp; <span style="COLOR: red">卧槽，没有进Pending Changes！<br><br></span>&nbsp;&nbsp;&nbsp; <span style="COLOR: red; FONT-SIZE: 14pt">卧槽，History不能Revert！！<br><br></span>&nbsp;&nbsp;&nbsp; <span style="COLOR: red; FONT-SIZE: 18pt">卧槽，client端文件夹还在，对他任何操作都失败！！！<br><br></span>&nbsp;&nbsp;&nbsp; <span style="COLOR: red; FONT-SIZE: 24pt">卧槽，渣都不剩了啊！！！！<br></span><br>&nbsp;&nbsp;&nbsp; 幸好那只是一个临时的solution。要是在Repository Explorer里面手一抖在trunk文件夹上面Delete了，后果不堪设想啊。然后我就获得了一个教训。想看client端的文件夹的source control状态，去Working Copy Explorer，那里面的Delete是进Pending Changes的。Reposiory Explorer删除个文件夹，直接就在服务器端删掉了，神马都没有了。这一辈子都不要打开Repository Explorer。然后我想起了以前看过的一篇文章《Unix Haters》里面说到unix的哲学就是，不警告，不报告，不祷告。像Delete这种东西，要是真他妈不进Pending Changes，至少告诉我他不进Pending Changes&#8230;&#8230; <br><br>&nbsp;&nbsp;&nbsp; 瞬间想起来，各位读者们，这篇文章仅跟客户端插件有关，这里不涉及任何svnadmin命令行内容。谢谢合作。
<img src ="http://www.cppblog.com/vczh/aggbug/145609.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2011-05-03 22:56 <a href="http://www.cppblog.com/vczh/archive/2011/05/03/145609.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于饭同学的【简单的字符串模版匹配】</title><link>http://www.cppblog.com/vczh/archive/2011/04/28/145221.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Thu, 28 Apr 2011 07:04:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2011/04/28/145221.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/145221.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2011/04/28/145221.html#Feedback</comments><slash:comments>20</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/145221.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/145221.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 为了避免留言再次被删掉，我还是直接在这里说几句话好了。<br><br>&nbsp;&nbsp;&nbsp; 在这里展示一下饭同学所珍爱的原创代码&#8220;<a style="TEXT-DECORATION: underline" href="http://www.cppblog.com/johndragon/archive/2011/04/27/145123.html" target=_blank>http://www.cppblog.com/johndragon/archive/2011/04/27/145123.html</a>&#8221;。<br><br>&nbsp;&nbsp;&nbsp; 匹配一个通配符的方法很多。譬如说我之前还写过处理正则表达式的&#8220;<a style="TEXT-DECORATION: underline" href="http://www.cppblog.com/vczh/archive/2008/05/22/50763.html" target=_blank>http://www.cppblog.com/vczh/archive/2008/05/22/50763.html</a>&#8221;，或者说饭同学的那个帖子，或者说《beautiful code》里面那个递归的做法。饭同学在cppblog上还算是出镜率比较高的，因此他以前在博客上干过些什么事情我都是看了的。我猜他大概就不知道那个《beautiful code》（结果他自己承认了），因此靠着记忆贴了出来。我们都知道没有编译过的代码出了点bug是正常的。后面还说了一句啥&#8220;寥寥几行瞬间搞定&#8221;，其实也就是调侃一下。《beautiful code》这本书很出名，我不会认为会有什么人会误以为那个递归的算法是我自己原创的，当然也就猜不出饭同学后面竟然会说我是为了证明自己聪明。<br><br>&nbsp;&nbsp;&nbsp; 不过事情的发展比较出乎我意料。因为留言都被删掉了，所以我拿不出证据，大家要质疑也随便你们。<br><br>&nbsp;&nbsp;&nbsp; 饭同学自己说努力研读了&#8220;我的&#8221;代码，然后指出这个问题有bug。好，这都是正常的。那他虽然文章里面写了bug出现在*的处理里面，但是实际上这是后来加上去的，在留言里面他从来没说bug在哪里，取而代之的是什么我为了证明自己聪明得逞啦，对人态度不好啦，对待程序的态度不好啦，各种乱七八糟的东西。我就想说一句&#8220;卧槽&#8221;。<br><br>&nbsp;&nbsp;&nbsp; 在这里对z某同学再次感激。虽然言辞比较激动，但好歹不会随便觉得人家在转发别人的代码是为了证明自己聪明（怎么可能呢）。<br><br>&nbsp;&nbsp;&nbsp; 后面还有，我简单回应了一下这代码是我贴过来的，然后说了几句饭同学不应该反应大，不要随便猜测我是为了如何如何。然后饭同学回复了一句大概说的是我的留言没有意思的事情。没意思你就忽略嘛，你觉得整个事情就向着没意思的方向发展你可以关闭回复嘛。你还回复我岂不是更没意思。我最后一句留言说的是&#8220;还是说代码吧，说我更没意思&#8221;，然后所有留言就寿终正寝了。<br><br>&nbsp;&nbsp;&nbsp; 所以说做程序员还是不能太激动。有人贴代码你看代码就好了，何必要通过否定一个人的行为来否定他所写的代码（更何况这是别人写的）呢？ 还有，要是动不动就觉得别人贴代码是在挑战你的话，那只会浪费时间在处理这些破事情而已。还是写自己的代码吧，这么做划不来。 <br><br>---------------------------------这里refer一下后来多出来的那个文章的部分--------------------------------------<br><br>话说我从来没有&#8220;坚持自己是在做学术研究&#8221;，那其实是饭同学在被删掉的那部分留言中坚持自己做学术研究。而且也没有&#8220;不少人匿名来支持&#8221;，我看到的就是z某同学一个人而已（难道后来人数暴增？）。态度问题的话那随便你怎么看，我又不吝啬传播别人的知识，你爱看不看。<br><br>
<div style="PADDING-BOTTOM: 4px; BACKGROUND-COLOR: rgb(238,238,238); PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-LEFT-COLOR: rgb(204,204,204); WORD-BREAK: break-all; PADDING-TOP: 4px">关于递归的方法：</div>
<div style="PADDING-BOTTOM: 4px; BACKGROUND-COLOR: rgb(238,238,238); PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-LEFT-COLOR: rgb(204,204,204); WORD-BREAK: break-all; PADDING-TOP: 4px"><span style="WHITE-SPACE: pre" class=Apple-tab-span></span>VCZH提供了一个递归的解法，并且&#8220;寥寥数行，瞬间搞定&#8221;。</div>
<div style="PADDING-BOTTOM: 4px; BACKGROUND-COLOR: rgb(238,238,238); PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-LEFT-COLOR: rgb(204,204,204); WORD-BREAK: break-all; PADDING-TOP: 4px"><span style="WHITE-SPACE: pre" class=Apple-tab-span></span>不过，递归会带来堆栈的问题。</div>
<div style="PADDING-BOTTOM: 4px; BACKGROUND-COLOR: rgb(238,238,238); PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-LEFT-COLOR: rgb(204,204,204); WORD-BREAK: break-all; PADDING-TOP: 4px"><span style="WHITE-SPACE: pre" class=Apple-tab-span></span>而且他的方法里存在BUG，我就不贴上来了。</div>
<div style="PADDING-BOTTOM: 4px; BACKGROUND-COLOR: rgb(238,238,238); PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-LEFT-COLOR: rgb(204,204,204); WORD-BREAK: break-all; PADDING-TOP: 4px"><span style="WHITE-SPACE: pre" class=Apple-tab-span></span>据他称那种方法来自一本 beautiful code的书。此书我没看过，所以不清楚。</div>
<div style="PADDING-BOTTOM: 4px; BACKGROUND-COLOR: rgb(238,238,238); PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-LEFT-COLOR: rgb(204,204,204); WORD-BREAK: break-all; PADDING-TOP: 4px"><span style="WHITE-SPACE: pre" class=Apple-tab-span></span>从他的方法本身看，他只能提供是否匹配的一个结果，并且匹配模版和待匹配的字符串必须是0结尾，并且不返回结束匹配时的匹配进度。</div>
<div style="PADDING-BOTTOM: 4px; BACKGROUND-COLOR: rgb(238,238,238); PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-LEFT-COLOR: rgb(204,204,204); WORD-BREAK: break-all; PADDING-TOP: 4px"><span style="WHITE-SPACE: pre" class=Apple-tab-span></span>并且在处理*的时候，有些许小BUG。</div>
<div style="PADDING-BOTTOM: 4px; BACKGROUND-COLOR: rgb(238,238,238); PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-LEFT-COLOR: rgb(204,204,204); WORD-BREAK: break-all; PADDING-TOP: 4px"><br></div>
<div style="PADDING-BOTTOM: 4px; BACKGROUND-COLOR: rgb(238,238,238); PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-LEFT-COLOR: rgb(204,204,204); WORD-BREAK: break-all; PADDING-TOP: 4px"><span style="WHITE-SPACE: pre" class=Apple-tab-span></span>虽然他一直在坚持自己是在做学术研究，也有不少人匿名来支持他，不过我觉得他还是有些态度问题。</div>
<div style="PADDING-BOTTOM: 4px; BACKGROUND-COLOR: rgb(238,238,238); PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-LEFT-COLOR: rgb(204,204,204); WORD-BREAK: break-all; PADDING-TOP: 4px"><span style="WHITE-SPACE: pre" class=Apple-tab-span></span>总是喜欢在别人的贴上表现自己。做的太过了就是显摆了。</div>
<div style="PADDING-BOTTOM: 4px; BACKGROUND-COLOR: rgb(238,238,238); PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-LEFT-COLOR: rgb(204,204,204); WORD-BREAK: break-all; PADDING-TOP: 4px"><span style="WHITE-SPACE: pre" class=Apple-tab-span></span>从他回帖说的那些话，比如&#8220;寥寥数行，瞬间搞定&#8221;这些，以及并不完善的代码看来，他根本就没有看过我的代码，只是凭字面意思就开始贴代码。</div>
<div style="PADDING-BOTTOM: 4px; BACKGROUND-COLOR: rgb(238,238,238); PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-LEFT-COLOR: rgb(204,204,204); WORD-BREAK: break-all; PADDING-TOP: 4px"><span style="WHITE-SPACE: pre" class=Apple-tab-span></span>我实在不清楚他说这些话和贴代码的原因是什么。这些我就不再讨论了，我也删除了他的回复。</div>
<div style="PADDING-BOTTOM: 4px; BACKGROUND-COLOR: rgb(238,238,238); PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-LEFT-COLOR: rgb(204,204,204); WORD-BREAK: break-all; PADDING-TOP: 4px"><span style="WHITE-SPACE: pre" class=Apple-tab-span></span>不过我想说，如果你一直以这种态度来回别人的帖子，那你会成为一个令人讨厌的人。</div>
<img src ="http://www.cppblog.com/vczh/aggbug/145221.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2011-04-28 15:04 <a href="http://www.cppblog.com/vczh/archive/2011/04/28/145221.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>移居北京</title><link>http://www.cppblog.com/vczh/archive/2011/04/11/143974.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Mon, 11 Apr 2011 13:32:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2011/04/11/143974.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/143974.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2011/04/11/143974.html#Feedback</comments><slash:comments>16</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/143974.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/143974.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 在微软亚洲研究院上班已经长达4天了。我找了我本科的同班同学一起住，他也在微软，如果他不加班的话还可以一起吃饭上下班。头一个星期四处见同学，也结识了几个新朋友，然后在家里写写代码。<br><br>&nbsp;&nbsp;&nbsp; <a style="TEXT-DECORATION: underline" href="http://vlpp.codeplex.com/" target=_self>Vczh Library++3.0</a>最近的进展比较缓慢。我要用一种类似模板+生成器的方法来让我可以很方便地给多个编程语言撰写中英双语的文档，然后分开编译成多个文档，当然每个文档只有一门程序语言以及一门自然语言。因此最近正在着手给VL++3.0添加xml、json以及模板文件的支持。这个模板的编译过程跟xml+xslt比较类似，唯一的区别是我的编译过程可以控制多个步骤产生一大堆文件，譬如说文档本身，譬如说各个脚本实例及其makefile等等。<br><br>&nbsp;&nbsp;&nbsp; 室友也很喜欢没事写代码，所以我在维护VL++3.0的同时还会跟他一起做一些有意思的小工程来玩一玩。最近在搞一个跟钢琴谱有关的软件及其一些小研究。恰好我跟他小时候都学过钢琴（唯一的区别是他没有断，我断了&#8230;&#8230;），总之都是闲着没事充实生活用的。<br><br>&nbsp;&nbsp;&nbsp; 工作之后没有在学校的那么多时间，无法维持两天至少能做一个东西来写博客的速度了，降低到了一个月两篇。不容易啊&#8230;&#8230;
<img src ="http://www.cppblog.com/vczh/aggbug/143974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2011-04-11 21:32 <a href="http://www.cppblog.com/vczh/archive/2011/04/11/143974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于C++之“复杂”</title><link>http://www.cppblog.com/vczh/archive/2010/07/07/119562.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Wed, 07 Jul 2010 03:52:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2010/07/07/119562.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/119562.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2010/07/07/119562.html#Feedback</comments><slash:comments>66</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/119562.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/119562.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 似乎C++&#8220;过于复杂&#8221;已经成为了诟病，不过对于我个人来讲我实在很难理解这个观点。之前有个朋友说stream::operator&lt;&lt;很复杂，其实也就是几个overloading。还有些人说传参数的时候很复杂，这无非就是复制构造函数、析构函数和引用吧。虽然我个人觉得模板元编程其实才是C++里面最复杂的地方，但是鉴于模板元编程实际的用处不大，我想应该只有少数几个人会使用它。但是这样很多人还是C++复杂，那我就不知道究竟在指什么了。<br><br>&nbsp;&nbsp;&nbsp; 所以大家对C++有什么想喷的就赶紧留言哈，我也好看看别人是怎么理解的，然后讨论讨论。<br><br>&nbsp;&nbsp;&nbsp; （不过从我自己的角度出发，我认为凡是编译器不能检查的东西（譬如可变参数，指针类型强制转换），都远比能检查的东西（模板元编程）要复杂，因为人很容易犯错，机器不会。） 
<img src ="http://www.cppblog.com/vczh/aggbug/119562.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2010-07-07 11:52 <a href="http://www.cppblog.com/vczh/archive/2010/07/07/119562.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于造车轮</title><link>http://www.cppblog.com/vczh/archive/2010/07/01/119083.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Thu, 01 Jul 2010 09:14:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2010/07/01/119083.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/119083.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2010/07/01/119083.html#Feedback</comments><slash:comments>21</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/119083.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/119083.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 这<span style="COLOR: red"><strong>几</strong></span>年来屡屡被网友教育说不要造车轮，我觉得我有必要专门写几句话来阐述我的观点。<br><br>&nbsp;&nbsp;&nbsp; 1：公司的代码，自然有规定，你造不了车轮。<br>&nbsp;&nbsp;&nbsp; 2：自己外包赚钱的代码，造了也只会浪费时间，这个随便你。<br>&nbsp;&nbsp;&nbsp; 3：自己写的代码。无论你开源也好，不开源也好，自己写那些不能换钱的代码无非就是因为你写的爽嘛，那造车轮还能提高自己功力，为啥总是有人来说这样不行呢？这又不是公司的代码，也不是拿去完成别人外包给我项目的代码，这个时候你还用别人的东西，完全是没有意义的。<span style="COLOR: red"><strong>除非你所谓的学习就是学习如何使用别人的车轮</strong></span>。当然我自己的定义是，学习造车轮，不仅能知道很多你不造车轮不知道的东西，同时造完了，你看别人的车轮，瞬间就知道怎么用了。而且如果你想的话，你还能研究一下怎么比别人造得更好。什么？你相信自己无论如何这一辈子写到死也比别人烂么？那就是另一回事了。 
<img src ="http://www.cppblog.com/vczh/aggbug/119083.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2010-07-01 17:14 <a href="http://www.cppblog.com/vczh/archive/2010/07/01/119083.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>美帝出差第一天</title><link>http://www.cppblog.com/vczh/archive/2010/04/10/112165.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Sat, 10 Apr 2010 05:31:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2010/04/10/112165.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/112165.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2010/04/10/112165.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/112165.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/112165.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 上海什么的完全不能跟西雅图比啊，西雅图能见度无敌高，下雨了车开了一个小时玻璃还是干净的，在上海下雨天开一个小时车那玻璃上全是泥。西雅图绿化非常好，就像是把城市建在了树林里面。而且高速公路设计合理，拐弯的时候有斜坡不会一不小心甩出去。而且有些地方还有Stop标记，无论你路上东西多不多，车一定要先完全停止了才能再启动。<br><br>&nbsp;&nbsp;&nbsp; 比较窘的地方就是第一天竟然遇到冰雹了，说来也搞笑西雅图的云只需要一小块就呼风唤雨，这一块云下完了雨也就没了，加上空气干净纬度较高变成了冰雹，而且猛下冰雹的时候旁边还有太阳，正所谓冰火两重天也。<br><br>&nbsp;&nbsp;&nbsp; 于是今天就跑去Microsoft里面的Company Store参观了一下XBox，里面展览Windows 7的几台电脑俨然被同志们处理成了网吧。星期一就要去上班了，这几天写写代码，倒倒时差，吃吃神奇的东西，睡睡觉，两天就过去了。
<img src ="http://www.cppblog.com/vczh/aggbug/112165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2010-04-10 13:31 <a href="http://www.cppblog.com/vczh/archive/2010/04/10/112165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lambda Calculus</title><link>http://www.cppblog.com/vczh/archive/2009/12/25/104003.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Thu, 24 Dec 2009 16:55:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2009/12/25/104003.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/104003.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2009/12/25/104003.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/104003.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/104003.html</trackback:ping><description><![CDATA[zero = \s.\z.z<br>succ = \a.\s.\z.a s (s z)<br>add = \a.\b.a succ b<br>mul = \a.\b.a (add b) zero<br>pow = \a.\b.a (mul b) (succ zero)<br><br>true = \a.\b.a<br>false = \a.\b.b<br>if = \c.\t.\f.c t f<br>not = \a.a false true<br>and = \a.\b.a b false<br>or = \a.\b.a true b<br>xor = \a.\b.a (not b) b<br><br>pair = \a.\b.\c.c&nbsp;a b<br>fst = \p.p true<br>snd = \p.p false<br>const = true<br><br>iszero = \n.n (const false) true<br>pred = (\pack.\packpred.\n.snd (n packpred (pack n))) (\n.pair zero n) (\n.iszero (fst n) (pair (succ zero) (snd n)) (pair (succ zero) (pred (snd n)))<br>sub = \a.\b.b pred a<br><br>eq = \a.\b.and (iszero (sub a b)) (iszero (sub b a))<br>ne=\a.\b.not (eq a b)<br>lt = \a.\b.and (iszero (sub a b)) (not (iszero (sub b a)))<br>le = \a.\b.or (eq a b) (lt a b)<br>gt = \a.\b.not (le a b)<br>ge = \a.\b.not (lt a b)<br><br>div = (\init.\step.\a.\b.add (fst (a step (init a b))) (fst (b step (init b a)))) (\a.\b.pair zero (pair a b)) (\i.(ge fst(snd i)) (snd (snd i))) (pair (succ (fst i)) (sub (fst (snd i)) (snd (snd i))) (snd (snd i))) i)<br><br>empty = pair zero zero<br>cons = \a.\b.pair (succ zero) (pair a b)<br>isempty&nbsp;= \l.iszero (fst l)<br>head = \l.fst (snd l)<br>tail = \l.snd (snd l)<br><br>Y=\f.(\t.f (t t))(\t.f (t t))<br>foldr = Y (\self.\f.\e.\l.(isempty l) e (f (head l) (self f e (tail l))))<br>length = \l.foldr (true succ) zero l<br>sum = \l.foldr add zero l<br>product - \l.foldr mul (succ zero) l<br>append = \h.\l.foldr cons l h<br>reverse = \l.foldr (\a.\b.append b (const a empty)) empty l<br>map = \f.\l.foldr (\a.\b.cons (f a) b) l<br>zip = Y (\self.\a.\b.(or (isempty a) (isempty b)) empty (cons (pair (head a) (head b)) (self (tail a) (tail b))))<br>flatten = \l.map append l 
<img src ="http://www.cppblog.com/vczh/aggbug/104003.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2009-12-25 00:55 <a href="http://www.cppblog.com/vczh/archive/2009/12/25/104003.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Microsoft实习归来</title><link>http://www.cppblog.com/vczh/archive/2008/12/08/68831.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Mon, 08 Dec 2008 04:15:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2008/12/08/68831.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/68831.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2008/12/08/68831.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/68831.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/68831.html</trackback:ping><description><![CDATA[<p><img height=768 alt="" src="http://www.cppblog.com/images/cppblog_com/vczh/Microsof_STB_Guys.jpg" width=1024 border=0><br><br>从左到右，Test1，PM，Dev lead，我，Dev2，Dev3</p>
<img src ="http://www.cppblog.com/vczh/aggbug/68831.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2008-12-08 12:15 <a href="http://www.cppblog.com/vczh/archive/2008/12/08/68831.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>打造自己的Unit Test工具</title><link>http://www.cppblog.com/vczh/archive/2008/11/14/66874.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Thu, 13 Nov 2008 17:38:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2008/11/14/66874.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/66874.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2008/11/14/66874.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/66874.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/66874.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 现在市面上已经有很多Unit Test的工具了。对于C++来说最为著名的莫过于CppUnit。CppUnit已经具有丰富的功能，例如UI、报告生成等等。那么为什么还要自己做Unit Test工具呢？主要还是为了学习，其次是可以为自己的特殊需求打造特殊的工具。&nbsp;&nbsp;<a href='http://www.cppblog.com/vczh/archive/2008/11/14/66874.html'>阅读全文</a><img src ="http://www.cppblog.com/vczh/aggbug/66874.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2008-11-14 01:38 <a href="http://www.cppblog.com/vczh/archive/2008/11/14/66874.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学生做的正则表达式引擎提供下载！</title><link>http://www.cppblog.com/vczh/archive/2008/11/08/66366.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Sat, 08 Nov 2008 14:44:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2008/11/08/66366.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/66366.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2008/11/08/66366.html#Feedback</comments><slash:comments>21</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/66366.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/66366.html</trackback:ping><description><![CDATA[<p><strong>作者（不是我）信息：</strong><br>华南理工大学软件学院本科07级（现大二）<br>进入大学前玩过几个星期pascal，高考后的暑假重新学编程<br><br><strong>程序信息：</strong>（<a href="http://www.cppblog.com/Files/vczh/LYT_正则表达式.rar" target=_blank>点击这里下载</a>）<br>学习C++<span style="COLOR: red"><strong>一年</strong></span>后的作品。<br>内含所有代码，以及VC++工程文件。<br>一个程序，输入只有匹配没有捕获的正则表达式，输入被匹配的字符串，输出字符串中符合正则表达式要求的部分。<br>支持括号改变优先级，[字符集]和[^字符集]，少量转义（\d等），循环（+*?），没有捕获<br><br><strong>输入输出（红色部分为用户输入的内容）：</strong><br>请输入正则表达式 : <span style="COLOR: #ff0000"><strong>/\*([^\*]|\*+[^\*/])*\*+/<br></strong></span>请输入所要匹配的字符串 : <strong><span style="COLOR: #ff0000">a//a///*\\nab**abc**//*</span><br></strong><strong>a//a//【/*\\nab**abc**/】/*<br></strong></p>
<strong>算法简要：</strong><br>正则表达式-&gt;语法树-&gt;&#949;-NFA-&gt;NFA-&gt;DFA-&gt;连通矩阵。<br>使用递归向下法判断输入的正则表达式的合法性并转换为树结构，其后转成状态机。 
<img src ="http://www.cppblog.com/vczh/aggbug/66366.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2008-11-08 22:44 <a href="http://www.cppblog.com/vczh/archive/2008/11/08/66366.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于VL++辅助C++程序设计的设想</title><link>http://www.cppblog.com/vczh/archive/2008/08/20/59403.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Tue, 19 Aug 2008 17:51:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2008/08/20/59403.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/59403.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2008/08/20/59403.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/59403.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/59403.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 眼下新的GUI Framework的第一版也就只剩下3个控件了。虽然之前说过要开发一个理论上是P2P上的远程对象交互协议、要开发一个窗口设计器、还要开发一个LALR Parser GUI作为GUI Framework的demo。我想这也是一个大的工程，对于我一个人来说。但是今天的一个想法终于把这三个东西串了起来。&nbsp;&nbsp;<a href='http://www.cppblog.com/vczh/archive/2008/08/20/59403.html'>阅读全文</a><img src ="http://www.cppblog.com/vczh/aggbug/59403.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2008-08-20 01:51 <a href="http://www.cppblog.com/vczh/archive/2008/08/20/59403.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Vczh Library++超大类图（提供下载）</title><link>http://www.cppblog.com/vczh/archive/2008/08/16/58998.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Fri, 15 Aug 2008 17:58:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2008/08/16/58998.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/58998.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2008/08/16/58998.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/58998.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/58998.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 突然发现Visual Studio 2008的Class Diagram已经支持到native c++了，遂喜，随便点了一下namespace vl就View Class Diagram了。刚一点就后悔了，等了几分钟才出一张图。然后我尝试Export class diagram to image.<br><br>&nbsp;&nbsp;&nbsp; 刚开始点*.emf，这是一种扩展的元文件，文件里面实际上是一堆GDI命令。好了，这个文件一共有3M多，用画图打开迟迟不出来，以为操作失败，后来打开任务管理器一看，画图刚刚将使用的内存增长到400M，过了10分钟才最终显示。不过没关系，我的电脑3G内存，才用了1.7G死不了的&#8230;&#8230;后来点*.jpg，就剩下2.7M了。<br><br>&nbsp;&nbsp;&nbsp; 因为觉得挺有意思的，那么我就提供下载吧（点击<a style="TEXT-DECORATION: underline" href="http://www.cppblog.com/Files/vczh/VLDiagram.rar" target=_blank>这里</a>）。<br><br>&nbsp;&nbsp;&nbsp; 我的Vczh Library++已经断断续续写了两年多了，因为我是在一个GUI Test Project里面打开的，所以一些其他功能譬如Vczh Free Script、正则表达式、上下文无关文法处理、新的XML Parser等跟GUI无关的部件不在里面。全都包含进去的话估计会更大，我也不想试，搞垮电脑就不好了&#8230;&#8230;不过从这张图可以看出Vczh Library++是一种扁平结构的。图里面有很多类是通过宏生成的，譬如GUI的每一个event object都用了一个宏产生了4个类，用于轻松绑定到多个普通函数、静态函数和类成员函数上。里面还有很多离散对象譬如enum啊、VL_WinListViewItem等等，非常多。最后可以清楚地看到目前GUI的进度，也是一个扁平结构，继承最长的也不外是Button。因为Win32API的WC_BUTTON类功能强大啊，单选复选普通按钮、GroupBox、SplitButton还有一种新的有箭头的居然都是从里面产生出来的，于是继承路径就变成VL_Base -&gt; VL_WinControl -&gt; VL_WinCustomButton -&gt; VL_WinButton了。<br><br>&nbsp;&nbsp;&nbsp; 下载的文件是一个rar包，包含一个jpg文件和一个从Class Diagram文件改过来的XML，包含了图片所有的类的全名（包括namespace），颇为壮观&#8230;&#8230; 
<img src ="http://www.cppblog.com/vczh/aggbug/58998.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2008-08-16 01:58 <a href="http://www.cppblog.com/vczh/archive/2008/08/16/58998.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>笔记本崩溃</title><link>http://www.cppblog.com/vczh/archive/2008/07/29/57469.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Tue, 29 Jul 2008 14:27:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2008/07/29/57469.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/57469.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2008/07/29/57469.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/57469.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/57469.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; vista的sp1竟然让我的笔记本挂了，整个C盘恢复到出厂状态&#8230;&#8230;日。<br><br>&nbsp;&nbsp;&nbsp; 实习的时候我充分体验到了Windows Communication Foundation的好处以及坏处。真想用C++弄个出来，整天死锁。<br><br>&nbsp;&nbsp;&nbsp; 本来打算周末更新的教程由于我们组的集体活动加上电脑的囧态无法完成鸟，过几天再更新。
<img src ="http://www.cppblog.com/vczh/aggbug/57469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2008-07-29 22:27 <a href="http://www.cppblog.com/vczh/archive/2008/07/29/57469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>无责任替朋友发个招聘广告</title><link>http://www.cppblog.com/vczh/archive/2008/06/16/53612.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Mon, 16 Jun 2008 15:35:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2008/06/16/53612.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 网龙公司招聘<br>网龙公司是中国网络游戏开发商和运营商的领导者之一，总部位于中国福建省福州市。<br><br>1、大型WEB2.0网站架构师<br>2、3D游戏引擎程序设计师<br>3、游戏客户端程序员<br>4、游戏服务端程序员<br>5、游戏工具开发程序员<br>6、手机平台开发程序员<br>7、驱动开发程序工程师<br>8、B/S程序员<br>9、WEB2.0游戏社区软件开发工程师<br>10、应用软件开发程序员<br><br>月薪6千起，优秀者月薪不封顶。享受基本养老、医疗、失业、工伤、生育等保险，以及公积金和公司福利。<br>联系方式：<br>QQ：611990694（请备注：您的姓名和应聘岗位）<br>EMAIL：hr@nd.com.cn<br><br>内详，版主勿删。&nbsp;&nbsp;<a href='http://www.cppblog.com/vczh/archive/2008/06/16/53612.html'>阅读全文</a><img src ="http://www.cppblog.com/vczh/aggbug/53612.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2008-06-16 23:35 <a href="http://www.cppblog.com/vczh/archive/2008/06/16/53612.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>图形库的概要设计</title><link>http://www.cppblog.com/vczh/archive/2008/06/11/52846.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Wed, 11 Jun 2008 03:13:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2008/06/11/52846.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/52846.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2008/06/11/52846.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/52846.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/52846.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:     前天在博客上说希望开发一个尽量独立于GDI的图形库。这个图形库将不使用其他图形库例如GDI+、OpenGL以及DirectX等。图形库使用GDI的原因如下：<br>    1：字体的边框比较难获得。直接读TTF文件暂时还不想做，因此想借助GDI的API获取文字的Bezier轮廓。<br>    2：不使用GDI无法把图片刷上窗口。<br>    因此这个图形库使用的GDI的功能也仅限于此。当然，开发出来的结果必然是GDI所不能达到的。GDI+的结构也稍微有一点点不理想。<br><br>    为什么GDI和GDI+的速度都不太理想呢？下面的分析将会给出一个可能的解释。<br><br>    今天早上考了软件配置管理，也就是让我们了解一下为什么需要Subversion这样的软件来帮助我们开发软件。考完试回来的路上就构思了这个图形库的结构。让我们考虑一下图形库所需的功能，也就是需求分析了。我们用惯的图形库都有绘制图形、文字以及图像的功能。图形有画刷和边框，其中边框是具有形状的。<br><br>    首先考虑一下文字。我们知道现在绝大多数的文字都是由Bezier边&nbsp;&nbsp;<a href='http://www.cppblog.com/vczh/archive/2008/06/11/52846.html'>阅读全文</a><img src ="http://www.cppblog.com/vczh/aggbug/52846.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2008-06-11 11:13 <a href="http://www.cppblog.com/vczh/archive/2008/06/11/52846.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>期末考了</title><link>http://www.cppblog.com/vczh/archive/2008/06/10/52704.html</link><dc:creator>陈梓瀚(vczh)</dc:creator><author>陈梓瀚(vczh)</author><pubDate>Mon, 09 Jun 2008 18:16:00 GMT</pubDate><guid>http://www.cppblog.com/vczh/archive/2008/06/10/52704.html</guid><wfw:comment>http://www.cppblog.com/vczh/comments/52704.html</wfw:comment><comments>http://www.cppblog.com/vczh/archive/2008/06/10/52704.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/vczh/comments/commentRss/52704.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vczh/services/trackbacks/52704.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:     人生中的很可能的最后一次期末考就到了，复习之余不免忙里偷闲，想想程序的那些破事。<br><br>    相对于去年来说，今年做的事情比较少。06年做了一个软件渲染器和一个强类型的脚本引擎和一个基于OpenGL的GUI，07年冲做了一个基于OpenGL的GUI，一个正则表达式和动态的上下文无关文法分析器（并在年内重写了一次），还有一个基于闭包的无类型脚本引擎。今年做的是一些修修补补的工作，首先为最新的脚本引擎提供了基于闭包实现的class和namespace、重写了内核并加上了multi-method和operator overloading，为正则表达式引擎重写了一个新的几乎提高了9倍速度的分析器（于是写了一篇招口水的文章）。自从Borland的没落导致我狠一狠心从Delphi过渡到C++之后，一直到现在我都在维护一个我自己个人使用的“非标准模板库”。STL啊Boost啊什么的就不用了，函数的名字比较鸟。<br><br>    大三也快完了，学院要求我们自己张罗实习的事情，班主任推荐我去微软，后来花了点时间准备了一下。不过不幸的是最后发现准备是没有用的，面试官总会在意外&nbsp;&nbsp;<a href='http://www.cppblog.com/vczh/archive/2008/06/10/52704.html'>阅读全文</a><img src ="http://www.cppblog.com/vczh/aggbug/52704.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vczh/" target="_blank">陈梓瀚(vczh)</a> 2008-06-10 02:16 <a href="http://www.cppblog.com/vczh/archive/2008/06/10/52704.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>