<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
   <channel>
      <title>云风的 BLOG</title>
      <link>http://blog.codingnow.com/</link>
      <description>思绪来得快去得也快，偶尔会在这里停留</description>
      <language>en</language>
      <copyright>Copyright 2010</copyright>
      <lastBuildDate>Sat, 13 Mar 2010 16:23:43 +0800</lastBuildDate>
      <generator>http://www.sixapart.com/movabletype/?v=3.2b5</generator>
      <docs>http://blogs.law.harvard.edu/tech/rss</docs> 

            <item>
         <title>我所偏爱的 C 语言面向对象编程范式</title>
         <description><![CDATA[<p>面向对象编程不是银弹。大部分场合，我对面向对象的使用非常谨慎，能不用则不用。相关的讨论就不展开了。</p>

<p>但是，某些场合下，采用面向对象的确是比较好的方案。比如 UI 框架，又比如 3d 渲染引擎中的场景管理。C 语言对面向对象编程并没有原生支持，但没有原生支持并不等于不适合用 C 写面向对象程序。反而，我们对具体实现方式有更多的选择。</p>

<p>大部分用 C 写面向对象程序的程序员受 C++ 影响颇深。企图用宏模拟出一个常见 C++ 编译器已经实现的对象模型。于我愚见，这并不是一个好的方向。C++ 的对象模型，本质上是为了追求实现层的性能，并直接体现出来。就有如在 C++ 中被滥用的 inline ，的确有效，却破坏了分离原则。C++ 的继承是过紧的耦合。</p>

<p>我所理解的面向对象，是让不同的数据元有共同的操作方式，适合成组的处理。根据操作方式的不同，我们会对数据元做不同的分组。一个数据可能出现在这个组里，也可以出现在那个组里。这取决于你从不同的方面提取的共性。这些可供统一操作的共性称之为接口（Interface），接口在 C 语言中，表现为一组函数指针的集合。放在 C++ 中，即为虚表。</p>

<p>我所偏爱的面向对象实现方式（使用 C 语言）是这样的：</p>
]]></description>
         <link>http://blog.codingnow.com/2010/03/object_oriented_programming_in_c.html</link>
         <guid>http://blog.codingnow.com/2010/03/object_oriented_programming_in_c.html</guid>
         <category>语言与设计</category>
         <pubDate>Sat, 13 Mar 2010 16:23:43 +0800</pubDate>
      </item>
            <item>
         <title>感谢各位投递简历和参加面试的同学</title>
         <description><![CDATA[<p>昨天，我们工作室这次的编辑器一职的程序招聘工作结束了。</p>

<p>比我预期的时间和人选上都超过了预期。谢谢大家的支持。</p>

<p>原来我的计划是找到两个合适的人来做这些事情，但实际上，这次来面试的数十位同学中达到我们心目中要求的人远远超过了这个数字。我想我也是非常细致的做了这一系列面试工作的，每个来我们办公室面试的同学，都做了一个半小时到两个半小时的沟通交流。</p>

<p>直到最后，依旧纠结于在五六个合适人选中该如何选择。虽然我们最终多安排了一个职位，但还是很遗憾不能与各位想来我们这里的朋友在未来一起共事。</p>
]]></description>
         <link>http://blog.codingnow.com/2010/03/iioauiioaeoaein.html</link>
         <guid>http://blog.codingnow.com/2010/03/iioauiioaeoaein.html</guid>
         <category>杂记</category>
         <pubDate>Fri, 12 Mar 2010 14:47:38 +0800</pubDate>
      </item>
            <item>
         <title>为什么一定要有密码?</title>
         <description><![CDATA[<p>以前写过一篇 <a href="http://blog.codingnow.com/2006/10/password.html">可不可以只有密码没有用户名？</a> 。里面提过一个让用户使用 email 做用户名，不设置密码的方案。今天想细化一下。</p>

<p>不设置密码有时候比设置密码，给用户的安全方面的感觉更好。因为，有些服务用户并不在乎帐户数据的私密性，也不在乎被人冒充。（比如在我的 blog 的留言，并不需要注册）要求输入一个密码，对用户反而是件很纠结的事情。用自己常用密码吧，若被服务商恶意记录的话，自己别的位置的帐户变得不太安全。随便选个新密码吧，很可能忘记。输入个简单的统一密码吧，基本行同虚设，跟没有密码区别不大。反而提供了虚假的安全感。这种安全感比没有更差。</p>

<p>而服务提供商在乎的只是用帐户名去标识一个用户，制作用户注册的流程，即费时，又费力，还提高了新用户进入的门槛。</p>

<p>我个人认为这样会好一些。</p>
]]></description>
         <link>http://blog.codingnow.com/2010/02/no_password.html</link>
         <guid>http://blog.codingnow.com/2010/02/no_password.html</guid>
         <category>杂记</category>
         <pubDate>Sun, 28 Feb 2010 00:04:53 +0800</pubDate>
      </item>
            <item>
         <title>在 C++ 中引入 gc 后的对象初始化</title>
         <description><![CDATA[<p>这几天白天都在安排面试，其实还是有点累的。晚上就随便写点程序，好久没摸 C++ ，有点生疏。也算是娱乐一下吧。</p>

<p>主要工作其实是在 C 库的基础上做一个 C++ 的中间层。跟在 C 库的基础上做 lua 中间层差不太多。前几天加入了 gc 后，发现了一些有趣的用法。</p>

<p>比如对于构造对象。 C 的 api 中，如果创建一个对象失败，就会返回空指针。但是对于 C++ 就不一样了，new 是不应返回空指针的。书本上的推荐做法是在构造函数里抛异常。但是我又不太想进一步的引入异常机智，怎么办呢？</p>
]]></description>
         <link>http://blog.codingnow.com/2010/02/cpp_ctor.html</link>
         <guid>http://blog.codingnow.com/2010/02/cpp_ctor.html</guid>
         <category>语言与设计</category>
         <pubDate>Wed, 24 Feb 2010 21:04:24 +0800</pubDate>
      </item>
            <item>
         <title>C++ 中的接口继承与实现继承</title>
         <description><![CDATA[<p>为这篇 blog 打腹稿的时候，觉得自己很贱，居然玩弄 C++ 起来了。还用了 template 这种很现代、很有品味的东西。写完后一定要检讨。</p>

<p>起因是昨天写的那篇<a href="http://blog.codingnow.com/2010/02/cpp_gc.html">关于 gc 的框架</a>。里面用了虚继承和虚的析构函数。这会导致 ABI 不统一，就是这个原因，COM 就不用这些。</p>

<p>说起 COM ，我脑子里就浮现出各种条条框框。对用 COM 搭建起来的 Windows 这种巨无霸，那可真是高山仰止。套 dingdang 的 popo 签名：虽不能至，心向往之。</p>

<p>好吧，我琢磨了一下如何解决下面的问题，又不把虚继承啦，虚析构函数啦之类的暴露在接口中。</p>

<p>简单说，我有几个接口是一层层继承下来的，唤作 iA iB 。iA 是基类，iB 继承至 iA 。</p>

<p>然后，我写了一个 cA 类，实现了 iA 接口；接下来我希望再写一个 cB 类，实现 iB 接口。但是，iB 接口的基类 iA 部分，希望复用已经写好的 cA 类。我想这并不是一个过分的需求。正如当年手写 COM 组件时，我对手写那些 AddRef Release QueryInterface 深恶痛绝。</p>

<p>用虚继承可以简单的满足这个需求：</p>
]]></description>
         <link>http://blog.codingnow.com/2010/02/cpp_inherit.html</link>
         <guid>http://blog.codingnow.com/2010/02/cpp_inherit.html</guid>
         <category>语言与设计</category>
         <pubDate>Tue, 23 Feb 2010 20:55:38 +0800</pubDate>
      </item>
            <item>
         <title>在 C++ 中实现一个轻量的标记清除 gc 系统</title>
         <description><![CDATA[<p>最近想把 engine 做一个简单 C++ 封装，结合 QT 使用。engine 本身是用纯 C 实现的，大部分应用基于 lua 开发。对对象生命期管理也依赖 lua 的 gc 系统。关于这部分的设计，可以参考我以前写的一篇 <a href="http://blog.codingnow.com/2009/03/lua_c_wrapper.html">为 lua 封装 C 对象的生存期管理问题</a> 。</p>

<p>当我们把中间层搬到 C++ 中时，遇到的问题之一就是，C++ 没有原生的 gc 支持。我也曾经<a href="http://blog.codingnow.com/2008/06/gc_for_c.html">写过一个 gc 库</a>。但在特定应用下还不够简洁。这几天过年休息，仔细考虑了一下相关的需求，尝试实现了一个更简单的 gc 框架。不到 200 行代码吧，我直接列在这篇 blog 里。</p>

<p>这些尚是一些玩具代码，我花了一天时间来写。有许多考虑不周的地方，以及不完整的功能。但可以阐明一些基本思路。</p>
]]></description>
         <link>http://blog.codingnow.com/2010/02/cpp_gc.html</link>
         <guid>http://blog.codingnow.com/2010/02/cpp_gc.html</guid>
         <category>语言与设计</category>
         <pubDate>Mon, 22 Feb 2010 19:34:30 +0800</pubDate>
      </item>
            <item>
         <title>搬家</title>
         <description><![CDATA[<p>这个 blog 最初架设在我工作中管理的一台服务器上。感谢公司允许我这么干。（据说很多公司是不允许的）</p>

<p>前段时间，我管理的另一台服务器硬盘出了些硬件故障。据了解，这批机器已经超长服役，早该退休了。反正迟早要挪数据的，我就随便自己租了个 <a href="http://www.linode.com/?r=538bab39bc1265a2ce54115d1f86e2bc81e4d133">VPS</a> ，把 blog 搬了过去。</p>

<p>跟其它独立 blog 比，我已经很幸运了。因为机器在公司自己的机房里。机房管理人员都是同事，关系也不错。甚至曾经有段时间，他们中有几人还直接挂在我的部门名下，名义上是我的下属。</p>

<p>早几年刚刚要备案时，是同事转告我一定要去办理那些手续，因为有人查到我的主页挂的 ip 来至于公司的机房。我也很快办理了手续。后来几年，除了接过一个电话，核对我的备案信息，一直相安无事。</p>
]]></description>
         <link>http://blog.codingnow.com/2010/02/move.html</link>
         <guid>http://blog.codingnow.com/2010/02/move.html</guid>
         <category>杂记</category>
         <pubDate>Sat, 20 Feb 2010 01:59:34 +0800</pubDate>
      </item>
            <item>
         <title>虚杯以待</title>
         <description><![CDATA[<p>这次韩寒和刘谦各写了一篇 blog 而之后又隐掉的事情，我是在 greader <a href="http://www.caobian.info/?p=7494">从和菜头那看来的</a>。</p>

<p>我喜欢韩寒的直爽，如果有机会认识，我会想去交这样一个朋友。</p>

<p>这次看了刘谦写得这篇 blog ，我发现他也是一个很不错的人呐。</p>

<p>有人问起，“先把杯子里的水倒掉才行” 这个禅宗典故是从哪里来的。我也懒得自己敲了，<a href="http://wenda.tianya.cn/wenda/thread?tid=65489688bc0c7942">转一段</a>：</p>

<p>南隐是日本明治时代著名的禅师，他的一杯茶的故事常常为人所津津乐道并予以启发。有一天，一位大学教授特地来向南隐问禅，南隐以茶水招待，他将茶水注入这个访客的杯中，杯满之后他还继续注入，这位教授眼睁睁地看着茶水不停地溢出杯外，直到再也不能沉默下去了，终于说道：“已经满出来了，不要倒了。” 
"你的心就像这只杯子一样，时面装满了你自己的看法和主张，你不先把自己的杯子倒空，叫我如何对你说禅？"南隐意味深长地说。</p>
]]></description>
         <link>http://blog.codingnow.com/2010/02/eoo.html</link>
         <guid>http://blog.codingnow.com/2010/02/eoo.html</guid>
         <category>随笔</category>
         <pubDate>Wed, 17 Feb 2010 01:13:49 +0800</pubDate>
      </item>
            <item>
         <title>缘分天注定</title>
         <description><![CDATA[<p>昨晚睡不着，随便找了本老片子看。
<a href="http://www.douban.com/subject/1305541/">Serendipity</a></p>

<p>情节很假，但是假得让人喜欢。</p>

<p>结尾的时候那段讣告，我震惊了。看来做字幕的大哥对这部片子相当有爱啊。</p>

<pre>
　　庄纳顿.卓加…… 
　　有线体育台优秀监制 
　　既失红颜，复破婚盟 
　　肝肠寸断，遂于昨宵撒手尘寰 
　　享年三十有五 
　　庄君文质彬彬，公而忘私 
　　平素言行，绝无痴态 
　　孰料，阳寿将尽之际…… 
　　流露鲜为人知的浪漫 
　　刹那惊艳，化作萦回梦魂 
　　遍觅芳踪，历尽一波三折 
　　本性情怀，浮现无遗 
　　呜呼，踏破铁鞋…… 
　　方觉一番心事悉付东流 
　　语云：匹夫可以夺其爱…… 
　　不可夺其志 
　　庄君依然坚信…… 
　　人生际遇绝非偶然 
　　冥冥中，上苍早已…… 
　　安排周详，丝毫不爽 
　　其友文坛巨擘…… 
　　时报主笔甸恩谓…… 
　　庄君晚年脱胎换骨 
　　有所顿悟 
　　一言以蔽之…… 
　　欲臻天人合一…… 
　　须坚信一字 
　　此字古已有之 
　　于今亦然，唯“缘”而已
</pre>

<p>被感动了。</p>
]]></description>
         <link>http://blog.codingnow.com/2010/02/serendipity.html</link>
         <guid>http://blog.codingnow.com/2010/02/serendipity.html</guid>
         <category>随笔</category>
         <pubDate>Mon, 15 Feb 2010 22:20:40 +0800</pubDate>
      </item>
            <item>
         <title>关于那个手穿玻璃</title>
         <description><![CDATA[<p>今天很俗的看了春晚。抱着本连着 wifi 上着推看的。</p>

<p>刘谦的魔术不错，最后擦玻璃的时候预感要表演手穿玻璃了。但是看到了还是觉得很神奇。</p>

<p>仔细想了一下，玻璃上应该有洞的。肯定这一点，就对一开始为啥弄个圆桌子坐一圈恍然大悟了。</p>

<p>玻璃应该是双层的，可以梭动。这样才能一开始把洞藏起来。这样一大圈，就方便藏那个洞了。只要玻璃干净，转得时候就很难发现了。借助表演者的胳膊掩饰，就可以把洞从旁边梭过来。</p>
]]></description>
         <link>http://blog.codingnow.com/2010/02/magic.html</link>
         <guid>http://blog.codingnow.com/2010/02/magic.html</guid>
         <category>杂记</category>
         <pubDate>Sun, 14 Feb 2010 01:45:58 +0800</pubDate>
      </item>
            <item>
         <title>关于招聘</title>
         <description><![CDATA[<p>承蒙大家厚爱，到现在，我已经通过 email 收到了 21 份简历。不过两天时间就能收到这么多，而且看得出大家都是很热情，大多数不仅仅附了简历，还专门写了好多文字。还真是受宠若惊啊。</p>

<p>很不好意思，我只回复了两份，别的都还没有动键盘回复。一是周末在打游戏（平时实在没空），二是需要和同事讨论一下才有结论。我们工作室 11 号放假，10 号晚上办公室就没人了。也就这两天会比较所有的简历吧。</p>

<p>嗯，已收到的简历我都看完了（真是花了不少时间呢），明天会发给工作室其他写程序的同事看。我想若安排面试，就是年后的事情了。我们大约在 21 号正式上班。</p>

<p>请原谅我这个周末的懈怠。接下来我会尽力回复 email 的。</p>
]]></description>
         <link>http://blog.codingnow.com/2010/02/oeouo.html</link>
         <guid>http://blog.codingnow.com/2010/02/oeouo.html</guid>
         <category>杂记</category>
         <pubDate>Mon, 08 Feb 2010 01:31:00 +0800</pubDate>
      </item>
            <item>
         <title>FF13 剧情完成</title>
         <description><![CDATA[<p>终于盼到周末，把 FF13 熬夜完成了。</p>

<p>游戏时间大约在 50 小时左右，没看任何攻略，没有炼级，没有改武器，基本一路冲到底的。就是几个 boss 稍微难一点，retry 了几次，大体上对于熟练 RPG 玩家没什么难度。</p>

<p>然后接着就是回头做 64 个冥碑任务（现在完成了 20 多个，其中只做了一个 A 级的比较难），开传送点等等。我估计把盘走完，还需要至少五十小时吧。</p>

<p>这次剧情依旧不错，我比较喜欢，但不是最好。（FF 10 和 FF 7 我更喜欢一点）我的日文水平是入门级里的入门，理所当然的，好多地方没看明白。只能连蒙带猜了。生日那天，居然传出官方消息说是五月要出中文版，这算是今年的生日礼物吧 :D 一定会买来再玩一次的。</p>

<p>角色里三个 mm 都不错，任挑一个我都喜欢。不过感觉这次有点恶趣味。虽然没明白做百合向的，我想有几个镜头也是故意做的满邪恶了 :D</p>
]]></description>
         <link>http://blog.codingnow.com/2010/02/ff13.html</link>
         <guid>http://blog.codingnow.com/2010/02/ff13.html</guid>
         <category>游戏</category>
         <pubDate>Mon, 08 Feb 2010 00:38:59 +0800</pubDate>
      </item>
            <item>
         <title>招聘程序员</title>
         <description><![CDATA[<p>今天发个不太正式的招聘信息：</p>

<p>我们这里工作室，需要招聘两名程序员。在未来至少一年的工作是：专职制作维护 3d engine 中的模型编辑器和场景编辑器。（每个一人维护）</p>

<p>要求：</p>

<ol>
<li><p>熟悉 C 语言，或 C++ 。至少有一门动态语言的经验，lua 最好，python 或其它也可以。</p></li>
<li><p>能够全心制作编辑器（至少一年），最好有相关经验（非必须）。</p></li>
<li><p>有 3d 方面编程经验优先，但不是必须。需要有学习 3d 编程的兴趣和动力。</p></li>
<li><p>有任意一款 GUI 框架编程经验者优先。（例如 QT ）</p></li>
</ol>

<p>待遇方面，不会太高，但也不算低。所以特别牛的同学就免了，可能满足不了你的要求。就算愿意，我也心里不舒服。</p>

<p>完全抱着从头学习的想法的同学也需要考虑一下。我们还是需要有一点点经验的，不可能花半年时间慢慢培养到可以开始动手干活。（经验指：可以独立编写 GUI 程序）</p>

<p>有兴趣的同学可以给我发 email 附上简单的简历。</p>
]]></description>
         <link>http://blog.codingnow.com/2010/02/recruit.html</link>
         <guid>http://blog.codingnow.com/2010/02/recruit.html</guid>
         <category>杂记</category>
         <pubDate>Fri, 05 Feb 2010 16:29:00 +0800</pubDate>
      </item>
            <item>
         <title>古怪的 C++ 问题</title>
         <description><![CDATA[<p>我好多年没写 C++ 程序了，读 C++ 代码也是偶尔为之。</p>

<p>今天晚上就碰到这么一个诡异的问题，我觉得是我太久没摸 C++ 了，对那些奇怪的语法细则已经不那么熟悉了。有知道的同学给我解惑一下吧。</p>

<p>事情的起因是，我想安装一个 perl 模块唤作 Syntax::Highlight::Universal 。</p>

<p>本来用 CPAN 安装很方便的，直接 install 即可。</p>

<p>可是在我的机器上，make 死活通不过。我就仔细研究了一下编译出错信息。又读了一下源代码，自己感觉没错。纠结了半天，仔细模仿出错的地方写了一小段程序测试。</p>
]]></description>
         <link>http://blog.codingnow.com/2010/01/cpp_template.html</link>
         <guid>http://blog.codingnow.com/2010/01/cpp_template.html</guid>
         <category>语言与设计</category>
         <pubDate>Thu, 28 Jan 2010 23:59:58 +0800</pubDate>
      </item>
            <item>
         <title>最终幻想XIII</title>
         <description><![CDATA[<p>周六部门组织去滑雪，我第一次，还不错。回来办公室发现同事桌子上有本杂志，封面是最终幻想XIII 。顺手拿回家躺床上看。</p>

<p>翻了几页杂志，回想到当年最终幻想X 出的时候的惊艳。当时看到公司里有同事在玩，也是周末。第二天去去买了台 PS2 和游戏。之后，我就成了这个系列的死忠（之前我也玩过七和八，但是都没有十给我的震撼）。后来我补上了五和六，并且把七和八重玩了；再之后就是 XI 和 XII ，以及 X 和 VII 的外传。</p>

<p>很久没玩游戏了，想想真是忙呢。又或者是长大了？但是，我得承认，我心里那点感觉又回来了。星期天一起床，吃完饭就直接去了附近的游戏店。价钱很黑，但是我急着想要。不到五分钟就拿下了 FF13 连 PS3 的套装。</p>
]]></description>
         <link>http://blog.codingnow.com/2010/01/ff13.html</link>
         <guid>http://blog.codingnow.com/2010/01/ff13.html</guid>
         <category>游戏</category>
         <pubDate>Wed, 27 Jan 2010 20:26:39 +0800</pubDate>
      </item>
      
   </channel>
</rss>
