<?xml version="1.0" encoding="GB2312"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
   <channel>
      <title>云风的 BLOG</title>
      <link>http://blog.codingnow.com/</link>
      <description>思绪来的快去的也快，偶尔会在这里停留</description>
      <language>en</language>
      <copyright>Copyright 2009</copyright>
      <lastBuildDate>Tue, 07 Jul 2009 22:37:20 +0800</lastBuildDate>
      <generator>http://www.sixapart.com/movabletype/?v=3.2b5</generator>
      <docs>http://blogs.law.harvard.edu/tech/rss</docs> 

            <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/codingnow/GHoI" type="application/rss+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><item>
         <title>GNU Make 下创建目录的问题</title>
         <description><![CDATA[<p>很多时候，我们的 Makefile 在工作的时候，往往需要把中间文件放在独立目录中。这个独立目录一开始又没有创建出来。所以，Makefile 就有责任创建它们。</p>

<p>正确的创建目录，对于 Make 来说可是一个头痛的事情。</p>

<p>直观的写法是让目标依赖目录。比如：</p>

<pre>
foo.c : out/foo.o

out/foo.o : out

out :
    mkdir $@
</pre>

<p>这样做的问题在于，out 作为一个特殊文件（目录文件），时间戳是不受控的。</p>

<p>如果你删除或添加新文件到 out 目录下，都会更改 out 的时间戳，这会进一步的影响其依赖的目标。</p>
]]></description>
         <link>http://blog.codingnow.com/2009/07/gnu_make_mkdir.html</link>
         <guid>http://blog.codingnow.com/2009/07/gnu_make_mkdir.html</guid>
         <category>build tool</category>
         <pubDate>Tue, 07 Jul 2009 22:37:20 +0800</pubDate>
      </item>
            <item>
         <title>关于“群”的那些破事</title>
         <description><![CDATA[<p>在 QQ 增加所谓“群” 这个功能之前，我就不用 qq 了。（所以找我要 qq 号的朋友不要再问了）</p>

<p>但是“群”这个讨厌的东西，总是阴魂不散的游荡在我的网络世界里。</p>

<p>今天在 twitter 上看见 <a href="https://twitter.com/Fenng/status/2433112885">Fenng 说</a> “我真受不了我可爱的同事们了，你们就不能不用"群"啊? 这是 IM 工具最烂的一个设计。除了浪费时间，还能干什么?” ，真是心有戚戚啊。</p>

<p>当然，人和人对事物的看法见解是不一样的。物以类聚、人以群分吧。我还真见过真心喜爱“群”的同学，大体上和 <a href="https://twitter.com/xmpp/status/2433359020">xmpp 同学</a>以及<a href="https://twitter.com/Fenng/status/2433384674">Fenng 随后的发言一致</a>。虽然分享“小笑话、新闻链接、有趣的小图片” 我觉得应该属于 google reader 的事情，</p>

<p>popo 作为网易内部交流工具，当初设计群的时候，我是发过言的。情况大致是这样：</p>
]]></description>
         <link>http://blog.codingnow.com/2009/07/popo.html</link>
         <guid>http://blog.codingnow.com/2009/07/popo.html</guid>
         <category>网易</category>
         <pubDate>Thu, 02 Jul 2009 23:31:55 +0800</pubDate>
      </item>
            <item>
         <title>玩了一下 ActionScript</title>
         <description><![CDATA[<p>周末。</p>

<p>玩了一下 ActionScript 。因为感觉做一些简单的需要长连接的互联网应用，flash 是一个不错的选择。在大多数情况下，比要求用户安装一个客户端要人性。（当然，和要求用户为浏览器安装一个莫名其妙的 ActiveX 控件相比，让用户自己决定是否下载独立客户端要友好的多）</p>

<p>因为，虽然 Flash 大多数情况下作为一个浏览器插件（在 Windows 下是一个 ActiveX 控件）的形式存在，但其安全性比之许多绿霸之流的流氓软件还是值得信任的。</p>
]]></description>
         <link>http://blog.codingnow.com/2009/06/actionscript3_socket.html</link>
         <guid>http://blog.codingnow.com/2009/06/actionscript3_socket.html</guid>
         <category>技术</category>
         <pubDate>Sun, 28 Jun 2009 19:34:18 +0800</pubDate>
      </item>
            <item>
         <title>让 Make 递归所有子目录</title>
         <description><![CDATA[<p>最近同事提了一个需求，想方便的调用一个工具校验所有的 xml 文件（包括子目录下的）。我想了一下，最简单的方法是用 Make 来辅助完成这件事情。</p>

<p>问题在于，怎样让 Make 递归的处理所有子目录。因为 GNU Make 默认的 wildcard 只能枚举出当前目录的文件，而不能递归下去。</p>

<p>求助于 Shell 指令当然是一种方法，如果只考虑 unix 环境，我会用 shell 去做。在 Windows 下也有 for 语句可以使用。但我不想处理复杂的平台差异。所以就在 Make 内置的函数里想办法了。</p>
]]></description>
         <link>http://blog.codingnow.com/2009/06/make_recursion_directory.html</link>
         <guid>http://blog.codingnow.com/2009/06/make_recursion_directory.html</guid>
         <category>build tool</category>
         <pubDate>Fri, 26 Jun 2009 17:06:17 +0800</pubDate>
      </item>
            <item>
         <title>近日小结</title>
         <description><![CDATA[<p>项目进入一个比较繁忙的阶段。广州先后过来  5 个很有经验的同事一起做开发，各个方面都有条不紊的推进。让我轻松了许多。至少，我有更多的时间，专心写程序了。</p>

<p>目前，自我调整为一周六天工作，每天提早到上午十点半上班，并坚持在晚上两点前回家。维持了一个月后，感觉生物钟有所调整。周末也可以真正的谈的上休息了。</p>

<p>最近两个月居然去了三次电影院，如果不出意外，这周还要去一次看变形金刚。若放在半年前，我是无论如何没有这个兴致的。</p>

<p>新来的同事居然对抱石有兴趣，经过简单指导，已经有明显进步了。我的手指伤也好的差不多了。希望下个月的比赛可以去观摩一下。</p>

<p>另外，我们又多了几个桌游爱好者。前几天开了一局冰与火之歌，加了第二扩展，感觉很有意思。这两天订了一套 small world ，想必这种入门级的游戏可以更多吸引新人。可恶的是，RFTG 的第二扩展继续跳票。</p>
]]></description>
         <link>http://blog.codingnow.com/2009/06/ueeoa.html</link>
         <guid>http://blog.codingnow.com/2009/06/ueeoa.html</guid>
         <category>杂记</category>
         <pubDate>Mon, 22 Jun 2009 23:30:08 +0800</pubDate>
      </item>
            <item>
         <title>tcc 的一个 bug</title>
         <description><![CDATA[<p><a href="http://bellard.org/tcc/">tcc</a> 是个好东西，我们的粒子系统把它当作可选模块，用于动态生成粒子控制代码。较之 lua 的版本，性能可以提高一个数量级（另外一个 gcc 版本的可选模块，会失去动态性）。为了引入这个库，我还好好研究了一下 LGPL 。</p>

<p>前段时间我还在抱怨 tcc 不能跑在 64 bit 环境下，结果今天因为查 bug ，去关心了一下新版本，发现 0.9.25 已经开始支持 64bit 了。</p>

<p>表扬到此为止，现在开始抱怨。</p>
]]></description>
         <link>http://blog.codingnow.com/2009/06/tcc_bug.html</link>
         <guid>http://blog.codingnow.com/2009/06/tcc_bug.html</guid>
         <category>技术</category>
         <pubDate>Fri, 05 Jun 2009 02:13:11 +0800</pubDate>
      </item>
            <item>
         <title>《链接、装载与库》书评</title>
         <description><![CDATA[<p><a href="http://www.douban.com/subject/3652388/"><img src="http://t.douban.com/mpic/s3724604.jpg" style="float:left;padding:0 20px 20px 0;border:0"/></a></p>

<p>今年二月份拿到这本书的电子稿时，还不是现在这个名字。</p>

<p>《程序员的自我修养》这个名字听起来比原来的那个名字感觉好一些，但又让人感觉有点不知所谓。还是副标题直接：《链接、装载与库》。我更愿意接受这样的一个名字，有如那本多年前读过的英文经典：《Linkers &amp; Loaders》。</p>

<p>那段时间很忙，一直到现在都是。书稿我压了很久，直到有一天，博文的朋友说，约个时间和 Fenng 、俞甲子等杭州的程序员碰头聚一下。我连夜开始读书稿。不然，见面了谈起这本书来，说不出所以然多不好意思。</p>
]]></description>
         <link>http://blog.codingnow.com/2009/06/link_loader.html</link>
         <guid>http://blog.codingnow.com/2009/06/link_loader.html</guid>
         <category>读书</category>
         <pubDate>Mon, 01 Jun 2009 20:14:38 +0800</pubDate>
      </item>
            <item>
         <title>lua 中判断字符串前缀</title>
         <description><![CDATA[<p>一个 lua 的小技巧</p>

<p>在写 lua debugger 的时候，我需要判断一个字符串的前缀是不是 "@" 。</p>

<p>有三个方案：</p>

<ol>
<li>比较直观的是 string.sub(str,1,1) == "@"</li>
<li>感觉效率比较高的是 string.byte(str) == 64</li>
<li>或者是 string.find(str,"@") == 1</li>
</ol>

<p>我推荐第三种。（注：在此特定运用环境下。因为用于判定 source 的文件名，大多数情况都是 @ 开头。如果结果为非，则性能较低）</p>

<p>第一方案 string.sub 会在生成子串的时候做一次字符串 hash ，感觉效率会略微低一些。</p>

<p>第二方案效率应该是最好，但是需要记住 @ 的 ascii 码 64 。如果前缀是多个字符也不适用。</p>
]]></description>
         <link>http://blog.codingnow.com/2009/05/lua_string_prefix.html</link>
         <guid>http://blog.codingnow.com/2009/05/lua_string_prefix.html</guid>
         <category>lua与虚拟机</category>
         <pubDate>Tue, 26 May 2009 22:40:22 +0800</pubDate>
      </item>
            <item>
         <title>lua 调试器制作注意</title>
         <description><![CDATA[<p>前两年写过一个 lua 的调试器，<a href="http://blog.codingnow.com/2006/11/lua_debugger.html">blog 上有截图</a></p>

<p>不过调试器设计的关键不在于界面，在于调试协议。前两年的那个是设计的不完整的。</p>

<p>最近同事强烈要求引擎提供一个强力的调试工具，虽然我个人不太依赖调试去写代码。甚至认为，经过反复调试才正确工作的代码不是好代码。不过周末还是花了点时间重新制作了一个 lua 调试器。</p>

<p>中间发现一些问题，非常让人吐血。列在这里，做个记录。</p>
]]></description>
         <link>http://blog.codingnow.com/2009/05/lua_debugger.html</link>
         <guid>http://blog.codingnow.com/2009/05/lua_debugger.html</guid>
         <category>lua与虚拟机</category>
         <pubDate>Mon, 25 May 2009 21:27:16 +0800</pubDate>
      </item>
            <item>
         <title>X Window 的 Resize 处理</title>
         <description><![CDATA[<p>程序员在陌生领域工作时，都想寻求范例。看起来，我们都很依赖  Meme Machine 。</p>

<p>可惜的是， X Window 领域的直接针对 XLib 编程的范例太少。偶尔碰到点问题都让人很痛苦。只有反复研究文档了。</p>

<p>我的程序在处理 Resize 消息时老是不正确，仔细阅读文档后，发现是以前理解有问题。</p>

<p>起先，我为窗口消息注册了 ResizeRedirectMask ，然后在消息循环中就可以得到一个  ResizeRequest 消息。然后，我处理这个消息，但结果总是不对。</p>

<p>今天研究了一下，发现 ResizeRedirectMask 会导致  no further processing is performed 。也就是说，通知你 resize 请求后，X 系统就不管你了。至于还差什么事情要做（比如改变客户区大小），我也不知道该怎么做才完全正确。（如果在 Windows 里，应该是调用 DefaultWindowProc )</p>

<p>不过解决方法其实也很简单，不用注册 ResizeRedirectMask ，而注册 StructureNotifyMask 。在窗口改变的时候， X 会发一个  ConfigureNotify 。因为这个只是 Notify ，所以 X 会把所有它应该做的事情做的周全。</p>
]]></description>
         <link>http://blog.codingnow.com/2009/05/x_window_resize.html</link>
         <guid>http://blog.codingnow.com/2009/05/x_window_resize.html</guid>
         <category>X Window</category>
         <pubDate>Wed, 20 May 2009 21:30:13 +0800</pubDate>
      </item>
            <item>
         <title>树结构的管理</title>
         <description><![CDATA[<p>要写过多少代码才能得到哪怕一点真谛？</p>

<p>多少年过来，我在潜意识的去追求复杂的东西。比如我自幼好玩游戏，从小到大，一直觉得玩过的游戏过于简单（无论是电子游戏还是桌面游戏），始终追寻更复杂规则的游戏，供我沉浸进去。或许是因为，有了更高的理解和控制复杂度的能力，就可以更为轻松的驾御复杂性。</p>

<p>这很好的解释了 2000 年到 2004 年我对 C++ 的痴迷。还有对设计模式的迷恋。</p>

<p>Eric S. Raymond 说：尽量不要去想一种语言或操作系统最多能做多少事情，而是尽量去想这种语言或操作系统最少能做的事情——不是带着假想行动，而是从零开始。禅称为“初心”（beginner's mind）或者叫“虚心”(empty mind) 。</p>

<p>代码写多了，问题见过了，甚至是同一问题解决多了。模式这种东西自在心底，不必拿出来。时时的从零去想，总能重新明白一些道理。</p>

<p>为什么说语言重要也不重要，算法和数据结构重要也不重要。对要解决的问题的领域的理解很重要（即明白真正要做什么）。理解了，我们才可以用面向对象，用模式去套问题；可理解了，我们又不真的需要这些繁杂的抽象。</p>

<p>闲话放一边，今天想谈谈树结构的管理。</p>
]]></description>
         <link>http://blog.codingnow.com/2009/05/tree.html</link>
         <guid>http://blog.codingnow.com/2009/05/tree.html</guid>
         <category>语言与设计</category>
         <pubDate>Sun, 10 May 2009 21:13:48 +0800</pubDate>
      </item>
            <item>
         <title>在文本模式下显示中文</title>
         <description><![CDATA[<p>办公室里我有两台桌面机，一台装的 Windows ，另一台装的 freeBSD 和 Ubuntu 双系统。上班的时候，两台机器我都开着，跑 freeBSD 的时候比较多。</p>

<p>在 freeBSD 下，我很少进 X 。主要是写服务器程序，或者是用来 ssh 到别的服务器上做管理。纯文本模式很清爽，速度很快，让人心情愉快。</p>

<p>唯一的烦恼是，有时候屏幕上有那么几个汉字显示不出来。有时是代码里的中文注释（所以我本人虽然英文极滥，也坚持用英文写注释），有时是别的机器上的一些文件名。</p>

<p>以前有同学向我推荐 zhcon ，类似以前 dos 下的中文系统。可这个玩意性能极低。用它我还不如直接用 X 呢。</p>

<p>周末，我花了两个小时写了个小程序，算是自己的解决方案。</p>
]]></description>
         <link>http://blog.codingnow.com/2009/05/chinese_char_in_text_mode.html</link>
         <guid>http://blog.codingnow.com/2009/05/chinese_char_in_text_mode.html</guid>
         <category>技术</category>
         <pubDate>Sat, 09 May 2009 17:53:28 +0800</pubDate>
      </item>
            <item>
         <title>回顾 Forth</title>
         <description><![CDATA[<p>第一件事就是没有钩子。不要留一个接口，想着未来的什么时候当问题变化时插入一些代码，因为问题会以你不能预见的方式变化。反正这个成本肯定是浪费了。不要预测，只解决你眼前的问题。by Charles Moore (Forth 之父)</p>

<p>今天也是机缘巧合，莫名其妙的翻出老资料温习 Forth 了。我想是个心结吧。19 年前，我痴迷于 Forth ，只看到了皮毛；13 年前，我进入大学的第一年，在校图书馆借出的第一本书，就是《Forth 语言》，读书笔记写了 20 多页。</p>

<p>只到今天，我才有机会，有能力，去仔细探究 Forth 的深层思想。当然，由于时间有限，几个小时的阅读，也只算是初窥门径。原本是想研究下 <a href="http://www.forthchina.com/articles/shixian/B01/00.htm">Forth 的系统实现</a>，对同事正在设计的 3d 粒子系统，提供一些建议的。</p>

<p>碰巧又读到 Charles Moore 在 99 年的访谈稿 <a href="http://www.forthchina.com/articles/yanjiu/20040726.htm">1x Forth</a> ，颇多感慨。题头那段话，我在一周前刚好苦口婆心的对一同事说过，只差几个字而已。</p>
]]></description>
         <link>http://blog.codingnow.com/2009/05/forth.html</link>
         <guid>http://blog.codingnow.com/2009/05/forth.html</guid>
         <category>lua与虚拟机</category>
         <pubDate>Wed, 06 May 2009 20:20:04 +0800</pubDate>
      </item>
            <item>
         <title>今天遭遇太好笑的房东</title>
         <description><![CDATA[<p>前段工作太忙，有天中午停水，我开了水龙头见没水忘记关，结果水淹了洗手间。地漏不畅，所以漏水到了楼下。</p>

<p>晚上晚饭时就接到楼下邻居愤怒的电话，急忙从公司奔回家看。看人家家里到处是水，心有不忍。也是想把事情早点解决掉，最后当晚提了一万元作为赔偿。</p>

<p>老实说，按实际损失（楼下家里并没有怎么装修），我心里价位也就是 3000 块最多了。只是我自己犯了错误，感觉对不起邻居，说赔多少就爽快的答应了。大家还是合合气气做邻居。这段时间进进出出，还笑着打打招呼。</p>

<p>没想到这房东不乐意了。觉得我工资卡上的钱是天上掉下来的，说拿就拿出来。成天想着让我也给她一点。理由是地板被泡坏了。老天，水是从洗水间直接漏下去的，顺着楼下那家的天花板滴的满屋子。</p>

<p>我们家当天，客厅地板一点毛病都看不出来。这么多天下来，地板也丝毫没有异样。</p>

<p>我这人就这毛病，是我的责任，我绝对不推卸，无中生有的事情让我去承担，那就没那么容易。</p>
]]></description>
         <link>http://blog.codingnow.com/2009/05/niioaooeiaae.html</link>
         <guid>http://blog.codingnow.com/2009/05/niioaooeiaae.html</guid>
         <category>杂记</category>
         <pubDate>Tue, 05 May 2009 22:37:49 +0800</pubDate>
      </item>
            <item>
         <title>树型打印一个 table</title>
         <description><![CDATA[<p>php 中有个 <code>print_r</code> 函数，可以递归打印一张表。很多 php 程序员喜欢用这个去调试程序。</p>

<p>我想，所有写过一定代码量的 lua 程序员都会写一个类似的东西放着备用吧。这两天调试 lua 程序的时候，发现以前做的简陋的 <code>print_r</code> 不够好用。对于复杂的 table 打印出来一大篇很不直观。结果就放下手头的工作，花了整整一个小时，写了下面几十行代码。把 table 输出成树结构。</p>

<p>比如：</p>

<pre>
a = {}

a.a = { 
    hello = { 
        alpha = 1 ,
        beta = 2,
    },
    world =  {
        foo = "ooxx",
        bar = "haha",
        root = a,
    },
}
a.b = { 
    test = a.a 
}
a.c = a.a.hello

print_r(a)
</pre>

<p>可以输出成：</p>

<pre>
+a+hello+alpha [1]
| |     +beta [2]
| +world+root {.}
|       +bar [haha]
|       +foo [ooxx]
+c {.a.hello}
+b+test {.a}
</pre>
]]></description>
         <link>http://blog.codingnow.com/2009/05/print_r.html</link>
         <guid>http://blog.codingnow.com/2009/05/print_r.html</guid>
         <category>lua与虚拟机</category>
         <pubDate>Sun, 03 May 2009 14:38:06 +0800</pubDate>
      </item>
      
   </channel>
</rss>
