<?xml version="1.0" encoding="GBK" ?>
<rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dcterms="http://purl.org/dc/terms/">
 <channel>
  	  <title><![CDATA[Atry]]></title>
	  <link>http://www.ac.net.blog.163.com</link>
	  <description><![CDATA[今年10岁 ]]></description>
	  <language>zh-CN</language>
	  <pubDate>Sat, 30 Aug 2008 22:55:11 +0800</pubDate>
	  <lastBuildDate>Sat, 30 Aug 2008 22:55:11 +0800</lastBuildDate>
	  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
	  <generator><![CDATA[NetEase Space]]></generator>
	  <managingEditor><![CDATA[www.ac.net]]></managingEditor>
	  <webMaster><![CDATA[Atry]]></webMaster>
		  <ttl>120</ttl>
	  <image>
	  	<title><![CDATA[Atry]]></title>
	  	<url>http://ava.blog.163.com/photo/lfYP8zYdeGb74Ey-0m5hjw==/177892185281420447.jpg</url>
	  	<link>http://www.ac.net.blog.163.com</link>
	  </image>
  <item>
  	<title><![CDATA[在AIR应用程序中动态执行代码]]></title>	
    <link>http://www.ac.net.blog.163.com/blog/static/136490562008716101752419</link>
    <description><![CDATA[<div>有人说浓眉大眼的ActionScript背叛革命了。背叛革命的证据有很多，其中之一就是去掉了eval。虽然正常情况下很少使用eval，不过有的时候，比如调试时还是想要使用eval的。<br>今天偶然看见AIR里面的HTML引擎，发现可以利用这个东西动态执行JavaScript代码。于是我就包装了一个evalJs函数，第一个参数是要执行的字符串，第二个参数是环境，比如EvalJsTest中就传入了this, 于是JavaScript代码就可以访问flash这边的对象了。最后两个参数是执行完以后的回调函数，分别在正常完成和出错时调用。<br>我还把getDefinitionByName函数放到了EvalJsTest的公有变量中，这样一来，JavaScript就能很方便地访问ActionScript中的各个类库了。<br><br><a href="http://img.blog.163.com/photo/9X4hHVyiPn8ujCB8Vy2E3w==/844424930132689228.jpg" target="_blank"><img src="http://img.blog.163.com/photo/9X4hHVyiPn8ujCB8Vy2E3w==/844424930132689228.jpg"></a><br>使用代码进行画图<br><br><a href="http://img.blog.163.com/photo/-UMPPG5ns2IYem3PzT9SLA==/844424930132689229.jpg" target="_blank"><img src="http://img.blog.163.com/photo/-UMPPG5ns2IYem3PzT9SLA==/844424930132689229.jpg"></a><br>通过getDefinitionByName取得API，然后再调用。以上代码会打开我的日志（www.ac.net.blog.163.com）<br><br><a href="http://img.blog.163.com/photo/hcVcbFBKSjsqdHshcMT4YA==/844424930132689230.jpg" target="_blank"><img src="http://img.blog.163.com/photo/hcVcbFBKSjsqdHshcMT4YA==/844424930132689230.jpg"></a><br>加上void就能避免显示出Result对话框。本行代码将窗口布局改为水平。<br><br><a href="http://img.blog.163.com/photo/x7-hA39sHQQRT2IeNXGr7A==/844424930132689231.jpg" target="_blank"><img src="http://img.blog.163.com/photo/x7-hA39sHQQRT2IeNXGr7A==/844424930132689231.jpg"></a><br>嫌字体太小了？没问题，以上代码能让窗口变大e倍。<br><br>
evalJs的函数的源代码：http://svn.assembla.com/svn/Atry/EvalJs/evalJs.as<br>
EvalJsTest工具的源代码：http://svn.assembla.com/svn/Atry/EvalJs/EvalJsTest.mxml<br>编译好的EvalJsTest工具：http://svn.assembla.com/svn/Atry/EvalJs/EvalJsTest.air</div>]]></description>
	    <author><![CDATA[Atry]]></author>
	    <comments>http://www.ac.net.blog.163.com/blog/static/136490562008716101752419</comments>
    <slash:comments>1</slash:comments>
    <guid isPermaLink="true">http://www.ac.net.blog.163.com/blog/static/136490562008716101752419</guid>
    <pubDate>Sat, 16 Aug 2008 22:17:52 +0800</pubDate>
    <dcterms:modified>2008-08-16T22:17:52+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[Flex 2、Flex 3和Flash 9中的width和height]]></title>	
    <link>http://www.ac.net.blog.163.com/blog/static/13649056200871694915674</link>
    <description><![CDATA[<div>width和height这个两个属性很诡异，不同对象的width/height属性的含义完全不同。非常淫荡。<br><br><br>第一种情况是一般的flash.display.DisplayObject，包括flash.display.Shape、flash.display.MovieClip、flash.display.Sprite等，其width和height代表该对象的外接矩形的实际长宽像素数。等一下，这个定义还不严谨，严谨的说法应该是：如果这个DisplayObject的父容器、爷爷容器，一直到祖宗容器也就是到Stage，全部都没有缩放，那么这个width和height就能代表该对象的外接矩形的实际长宽像素数。之所以要加上这个前提，是因为《Flex 2、Flex 3和Flash 9中的缩放》提到过，父容器的缩放并不会改变子对象的属性，而只会改变子对象在屏幕上的实际渲染尺寸。<br><br>虽然父容器的缩放并不会改变子对象的属性，但是DisplayObject对象自己的缩放属性（scaleX和scaleY）却会影响自己的width和height. 设置DisplayObject的scaleX和scaleY会改变其width和height，而且，设置width和height也会改变scaleX和scaleY. 这就意味着，设置一般的DisplayObject的width和height就会导致该对象缩放。不过，如果这个DisplayObject原本的width和height为0，则无法改变它的width和height，比如一个空无一物的Sprite，不论如何设置，width和height始终是0.<br><br>第二种情况是flash.display.TextField，它重写了基类的set width和set height函数，所以改变TextField的width和height并不会令TextField缩放，而只是改变文本区域的大小。改变width和height时，单个文字不会变大或变小，而可显示的文字数量会变多或变少。<br><br>改变TextField的width和height不会改变TextField的scaleX和scaleY，但是改变TextField的scaleX和scaleY会改变TextField的width和height.<br><br>第三种情况是Flex的mx.core.UIComponent，它的width和height不代表实际尺寸，而代表“占据”的尺寸，即使是一个空无一物的VBox，也可以设置其width和height（这一点与Sprite不同）.<br><br>不过UIComponent有一点和TextField类似，改变UIComponent的width和height不会改变UIComponent的scaleX和scaleY，但是改变UIComponent的scaleX和scaleY会改变width和height. UIComponent中有unscaledWidth和unscaledHeight两个属性。unscaledWidth等于width/scaleX, unscaledHeight等于height/scaleY.<br><br>因为UICompoent涉及Flex的布局，所以其中还有许多尺寸相关的属性和函数，可以用来自动计算布局。这里就不一一介绍了。<br><br>最后说一下MXML中的width属性（attribute），它其实对应了该组件在ActionScript中的percentWidth和width两个属性（property）；而MXML中的height属性（attribute）也对应了ActionScript中的percentHeight和height两个属性（property）。<br><br><br></div>]]></description>
	    <author><![CDATA[Atry]]></author>
	    <comments>http://www.ac.net.blog.163.com/blog/static/13649056200871694915674</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://www.ac.net.blog.163.com/blog/static/13649056200871694915674</guid>
    <pubDate>Sat, 16 Aug 2008 21:49:15 +0800</pubDate>
    <dcterms:modified>2008-08-16T21:49:15+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[Flex 2、Flex 3和Flash 9中的缩放]]></title>	
    <link>http://www.ac.net.blog.163.com/blog/static/13649056200871694822654</link>
    <description><![CDATA[<div>Flash中有两种缩放。<br>第一种缩放是对除了Stage以外的DisplayObject设置scaleX和scaleY。<br>第二种缩放是Stage自动进行的缩放。Stage中虽然有scaleX和scaleY，但若修改这两个值就会抛出异常。这两个值总是1，其实与Stage的缩放无关。Stage自动进行的缩放不会改变包括Stage自己在内的任何对象的width和height，而是根据stage.scaleMode以及播放器右键菜单的放大缩小操作进行的。程序仅能通过scaleMode来控制。<br><br>此外，缩放时的缩放算法还会考虑scale9grid属性。<br><br>对容器缩放时，尽管容器中子对象的实际渲染效果会受到容器的缩放相关属性的控制，但不论是何种方式的缩放子对象的width、height、scaleX、scaleY等属性都不会改变。<br><br>Flash应用程序的默认stage.scaleMode是"showAll"，而Flex应用程序的默认值则是"noScale"。因而播放器窗口尺寸改变时，Flex应用程序并不会跟着缩放，而是根据改变了的尺寸来调整内容布局。</div>]]></description>
	    <author><![CDATA[Atry]]></author>
	    <comments>http://www.ac.net.blog.163.com/blog/static/13649056200871694822654</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://www.ac.net.blog.163.com/blog/static/13649056200871694822654</guid>
    <pubDate>Sat, 16 Aug 2008 21:48:22 +0800</pubDate>
    <dcterms:modified>2008-08-16T21:48:22+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[ActionScript的资源不必手动释放]]></title>	
    <link>http://www.ac.net.blog.163.com/blog/static/1364905620087169451803</link>
    <description><![CDATA[<div>我们知道.NET的很多类都实现了IDisposable接口和dispose方法，而Java的很多类也实现了Closeable接口和close方法。不论是dispose方法还是close方法都要求用户手动调用来释放资源。<br>可是.NET和Java不是都有垃圾收集吗？为何还需要手动释放资源呢？<br><br>这是因为.NET和Java的垃圾收集器并不会立即释放资源，而只在需要的时候才释放资源。某些类是对内核对象的一层包装，它们往往只占用了极少的内存，但却持有系统中某个内核对象，这个内核对象却可能有很大的开销。比如文件句柄。垃圾收集器会在用户内存不足的情况下进行垃圾收集，但却不会顾及操作系统资源是否紧张。比如打开很多文件，可能对于.NET或者Java的虚拟机来说，只分配了很少的内存，根本无所谓，但是对操作系统来说，却可能给这些文件提供了许多的系统缓存。<br><br>因此，.NET和Java就提供了dispose或close，这两个方法只会释放系统资源，而不释放内存。因为释放内存是垃圾收集器的职责，不需要用户操心。<br><br>最好的做法是在编写.NET和Java代码的时候手动调用dispose或close.<br><br>不过，对于ActionScript来说就不是这样的。ActionScript的垃圾收集同时使用了“引用计数”和“标记整理”两个机制。如果一个对象没有被引用，就会立刻被收集。而如果某个对象虽然有引用但却只有循环引用，那么AVM在内存不足的时候会遍历引用关系，把这些只有循环引用的对象也收集掉。<br><br>因此在ActionScript中，如果能保证某个持有昂贵资源的对象不被循环引用，那么完全可以不调用其close方法，不必手动释放。<br><br>甚至用ActionScirpt编写AIR应用时使用数据库都不必手动释放。</div>]]></description>
	    <author><![CDATA[Atry]]></author>
	    <comments>http://www.ac.net.blog.163.com/blog/static/1364905620087169451803</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://www.ac.net.blog.163.com/blog/static/1364905620087169451803</guid>
    <pubDate>Sat, 16 Aug 2008 21:45:01 +0800</pubDate>
    <dcterms:modified>2008-08-16T21:45:01+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[Lua的闭包实现]]></title>	
    <link>http://www.ac.net.blog.163.com/blog/static/1364905620087492346330</link>
    <description><![CDATA[<div>刚才阅读了一下Lua实现闭包的部分源码。发现闭包引用的局部变量是一个垃圾收集的结构UpVal. UpVal原本指向栈上的局部变量，闭包中的代码访问这个闭包变量实际上是访问栈上的局部变量。在外层函数退出以后，局部变量的值被复制到UpVal结构中，此后闭包中的代码访问这个闭包变量时，变量值就会取自UpVal结构本身，因为栈上的变量在函数退出以后已经没了。<br><br>顺便提一下Java的闭包，Java的闭包要求闭包变量必须是final, 由此可见Java实现时并不会像Lua那样将栈上的值复制到动态分配的内存（也就是会被垃圾收集的内存）中，而是直接把那个变量复制到闭包的栈上。<br><br></div>]]></description>
	    <author><![CDATA[Atry]]></author>
	    <comments>http://www.ac.net.blog.163.com/blog/static/1364905620087492346330</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://www.ac.net.blog.163.com/blog/static/1364905620087492346330</guid>
    <pubDate>Mon, 4 Aug 2008 21:23:46 +0800</pubDate>
    <dcterms:modified>2008-08-04T21:23:46+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[复制+粘贴就是好的编码习惯]]></title>	
    <link>http://www.ac.net.blog.163.com/blog/static/136490562008488574363</link>
    <description><![CDATA[<div>将几处相似的代码抽出来定义一个函数/类/模板之类的办法当然可以重用代码。但是重用代码不见得就是好事，只有相似代码确实有相同的流程并且有明确的意义时才应该重用。<br>如果需要根据输入值进行判断来决定处理流程，这就不是“相同的流程”。<br>

如果你说不上你的函数是做什么的，只不过刚好有好几处代码都是这么写的，你就抽了个函数出来，这就不是“明确的意义”。<br>

“相同的流程”和“明确的意义”就是判断代码重用是否必要的判断标准，如果不符合这个标准，就应该复制+粘贴。<br>有
一个理由是说抽出相同代码以后，如果要修改代码就只用改一处而不用到处改。这个理由很愚蠢，你怎么知道今后需要修改时，改的是多处使用的共同部分，而不是
某处使用时的特殊逻辑呢？要知道，随着代码变得复杂，特殊逻辑总是会不断增加，而原本相似的业务逻辑中的共同部分的比例则越来越小。与其在一个函数写一大堆判断、
switch，还不如当初就不要把它写成一个函数。<br><br></div>]]></description>
	    <author><![CDATA[Atry]]></author>
	    <comments>http://www.ac.net.blog.163.com/blog/static/136490562008488574363</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://www.ac.net.blog.163.com/blog/static/136490562008488574363</guid>
    <pubDate>Thu, 8 May 2008 08:57:43 +0800</pubDate>
    <dcterms:modified>2008-05-08T09:04:38+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[图]]></title>	
    <link>http://www.ac.net.blog.163.com/blog/static/136490562008316114932476</link>
    <description><![CDATA[<div><a href="http://img.blog.163.com/photo/FA8PG6OmkixalzrStXTR4Q==/1467047578616329779.jpg" target="_blank"><img src="http://img.blog.163.com/photo/FA8PG6OmkixalzrStXTR4Q==/1467047578616329779.jpg"></a><a href="http://img.blog.163.com/photo/ZLhiFcPW3fvYnAYEYXOhAQ==/1467047578616329780.jpg" target="_blank"><img src="http://img.blog.163.com/photo/ZLhiFcPW3fvYnAYEYXOhAQ==/1467047578616329780.jpg"></a><a href="http://img.blog.163.com/photo/md30DjSQoZ0asHNDTjSUOQ==/1467047578616329781.jpg" target="_blank"><img src="http://img.blog.163.com/photo/md30DjSQoZ0asHNDTjSUOQ==/1467047578616329781.jpg"></a><a href="http://img.blog.163.com/photo/yPSvXzk1epa5G4EnqsAoLA==/1467047578616329782.jpg" target="_blank"><img src="http://img.blog.163.com/photo/yPSvXzk1epa5G4EnqsAoLA==/1467047578616329782.jpg"></a><a href="http://img.blog.163.com/photo/mCslsV0_Zp_nmLmmkrhYcw==/1467047578616329783.jpg" target="_blank"><img src="http://img.blog.163.com/photo/mCslsV0_Zp_nmLmmkrhYcw==/1467047578616329783.jpg"></a><a href="http://img.blog.163.com/photo/P6hMtEes5vLjI4g8NDe09Q==/1467047578616329784.jpg" target="_blank"><img src="http://img.blog.163.com/photo/P6hMtEes5vLjI4g8NDe09Q==/1467047578616329784.jpg"></a><a href="http://img.blog.163.com/photo/J0r0rPZVnWqFYSJ3qGnxJw==/4256183122842199665.jpg" target="_blank"><img src="http://img.blog.163.com/photo/J0r0rPZVnWqFYSJ3qGnxJw==/4256183122842199665.jpg"></a></div>]]></description>
	    <author><![CDATA[Atry]]></author>
	    <comments>http://www.ac.net.blog.163.com/blog/static/136490562008316114932476</comments>
    <slash:comments>1</slash:comments>
    <guid isPermaLink="true">http://www.ac.net.blog.163.com/blog/static/136490562008316114932476</guid>
    <pubDate>Wed, 16 Apr 2008 23:49:32 +0800</pubDate>
    <dcterms:modified>2008-04-27T11:10:49+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[JavaScript 的 Closure 连某些静态语言都不如……]]></title>	
    <link>http://www.ac.net.blog.163.com/blog/static/136490562008015113242631</link>
    <description><![CDATA[<div><fieldset><legend>Javascript</legend><pre>&lt;html&gt;&lt;body&gt;&lt;script&gt;<br>var d = [];<br>for(var i = 0; i &lt; 10; i++) {<br>&nbsp;&nbsp; &nbsp;var j;<br>&nbsp;&nbsp; &nbsp;d.push(function() {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return j;<br>&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;j = i;<br>}<br>for(var i = 0; i &lt; 10; i++) {<br>&nbsp;&nbsp; &nbsp;alert(d[i]());<br>}<br>&lt;/script&gt;&lt;/body&gt;&lt;/html&gt;</pre></fieldset><fieldset><legend>C#</legend><pre>  class Program {<br>    delegate int D();<br>    static void Main(string[] args) {<br>      D[] d = new D[10];<br>      for (int i = 0; i &lt; 10; i++) {<br>        int j = 0;<br>        d[i] = delegate() {<br>          return j;<br>        };<br>        j = i;<br>      }<br>      for (int i = 0; i &lt; 10; i++) {<br>        Console.WriteLine(d[i]());<br>      }<br>    }<br>  }<br></pre></fieldset>

我测过 IE7、Firefox 3 Beta 2 的 JavaScript，还有 Flex 2 里面的 ActionScript ，发现这些 ECMAScript 里面返回的循环内部的Closure 都是同一个（每一个 alert 打印出来结果都是 9）。以前写 JavaScript 代码的时候遇到这个问题也没有细想，另外写一个单独的函数来返回 Closure 就行了。这个毛病在其它几乎所有的脚本语言里面都没有，至少 lua 的 closure 没有这个问题。可是今天用起 C# 2.0，发现连 C# 这种静态语言都会生成一个个不同的 closure（打印出来从 0 到 9）。真是搞不懂，为什么 ECMAScript 要设计成这样。</div>]]></description>
	    <author><![CDATA[Atry]]></author>
	    <comments>http://www.ac.net.blog.163.com/blog/static/136490562008015113242631</comments>
    <slash:comments>2</slash:comments>
    <guid isPermaLink="true">http://www.ac.net.blog.163.com/blog/static/136490562008015113242631</guid>
    <pubDate>Tue, 15 Jan 2008 11:46:00 +0800</pubDate>
    <dcterms:modified>2008-01-15T11:46:00+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[大牛说]]></title>	
    <link>http://www.ac.net.blog.163.com/blog/static/136490562007112105625668</link>
    <description><![CDATA[<div>什么是程序？什么是数据？程序处理数据的时候，程序和它所处理的数<div ><wbr>据的关系是什么？<br>我们知道，数据是程序的输入，而程序的输出则取决于输入<wbr>。所以程序和函数基本上是同义词。但是问题在于，谁是谁的输入<wbr>，谁是谁的输出，判断的标准是什么？比如我们写了一个 perl 脚本，接受一个文本文件作为参数，根据文本文件的内容输出一些东西<wbr>，我们在控制台敲下一下内容：<br>foo.pl bar.txt<br>我们为什么说 foo.pl 是程序，而 bar.txt
 是数据呢？仅仅是因为他们在命令行中的顺序不同吗？<br>那
么，假如我们写了一个 foo.pl 作为配置文件，定义并赋值了许多变量，然后用 eval 来运行 bar.txt
的内容，把定义的那些配置，作为参数传给 bar.txt 中的某个函数。这时候，到底 foo.pl 和 bar.txt 哪个是数据，哪个是程序呢？<br>这个例子会让人感到疑惑，原因在于用 foo.pl 作配置文件而用 bar.txt 来运行违背了我们的一个隐含假设：程序是不变的，而数据是易变的。
<br>正因为数据是易变的，而程序是不变的，所以我们会说<wbr>，数据是程序的"输入"。<br>程序和数据的关系，类似于底层库和上层库的关系，也类似于库和应用<wbr>程序的关系。底层库是不变的，高层库是可变的；库是不变的<wbr>，应用程序是易变的。<br>我们使用一些库来写代码的时候，我们认为这个代码比其所依赖的库更<wbr>高层。这也就意味着高层代码提供输入数据或者说输入选项给其所依赖<wbr>的底层库。<br>所以，我们用 IDE 编程的时候，和修改屏幕分辨率一样，都是在修改一些选项而已<wbr>。编程之所以比修改屏幕分辨率更复杂，只是因为选项组合更多罢了。
<br>一些 C++ 程序员，喜欢虚函数，他们说："用了我这个牛叉的继承体系<wbr>，你不用写 if(isClosed()){foo();} ，只用写 virtual onClosed() { foo(); } 就可以了。"<br>一些 Java 程序员，喜欢配置文件，他们不用 new ，他们用工厂模式，用反射，把那个类名写在 xml 文件里面。然后说："你看，用了我这个牛叉的框架<wbr>，你就不用写程序了，只需要改改 xml 里面的'选项'就行了。"<br>
他们都是蠢人，他们做的都是无用功，因为他们不知道<wbr>，写程序就是在设置选项，把选项从一处移到另一处根本不可能降低复<wbr>杂度。降低复杂度的唯一方式就是减少选项，而减少选项的唯一方式就<wbr>是把把不想改变的选项写死。<br>函数的参数是选项，函数调用的顺序是选项，数据结构也是选项<wbr>。想要减少这些选项，就必须把函数的参数写死，把函数调用的顺序写<wbr>死，把数据结构定死。你必须硬编码。除此以外所做的一切代码<wbr>，都没用。<br>大牛说"机制(mechism)而不是策略(policy)"<wbr>。机制就是硬编码，而策略就是绕圈子。</div></div>]]></description>
	    <author><![CDATA[Atry]]></author>
	    <comments>http://www.ac.net.blog.163.com/blog/static/136490562007112105625668</comments>
    <slash:comments>1</slash:comments>
    <guid isPermaLink="true">http://www.ac.net.blog.163.com/blog/static/136490562007112105625668</guid>
    <pubDate>Fri, 21 Dec 2007 12:56:25 +0800</pubDate>
    <dcterms:modified>2007-12-21T12:56:25+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[我最近的 C++ 编码风格 ]]></title>	
    <link>http://www.ac.net.blog.163.com/blog/static/136490562007894424339</link>
    <description><![CDATA[<div><span style="color: rgb(153, 51, 0);">本文最早是在 Linus 炮轰 C++ 事件以后写下的。当时痛定思痛，对 C++ 一下子有了一个不同的认识。当时写出来这些文字但没有公开<wbr>，这两个月对这种务实编码风格有了一些实践经验，可以把这篇文章修<wbr>改修改公布出来了。</span><br><br>自从我接触 boost 以来，我的编码习惯就模仿 boost ，其实那样并不是最好的。 boost 对 C++ 的语言特性的使用没有限制，支持大量的不同的编译器<div ><wbr>，并且为了这些编译器能在一起工作做了许多别的事情<wbr>。我没必要支持所有的 C++ 语言特性，也没必要支持所有的编译器。所以我应该有一个不同的编码<wbr>规范。
<br><br>1 原则<br>1.1 封装性<br>这对我来说不是问题，我早已养成了这个习惯。但是<wbr>，我必须得把这一条原则写在前面，否则，光看到第二条的读者就会被<wbr>我误导。<br>1.2 大胆的硬编码<br>在模块内部，只要有利于减少代码量，什么手段都可以用！把 C++ 看成比 C 更低级的语言，这样，使用 C++ 的奇技淫巧就不会有心理负担。我认为，增加代码可读性的最有效方法<wbr>就是减少代码量。<br>2 C++ 的特性使用<br>C++ 的特性，大概可以分成4类。低级特性、高级特性、语法糖<wbr>、没用的特性。
<br>2.1 低级特性<br>模板属于低级特性。模板以及 boost 中相关的支持，都属于低级特性，比 C 语言更低级的特性。<br>模板的使用有两种情况：<br>a) 小的实用工具库，这种实用工具库应该是相对独立的<wbr>，与其他数据结构不应该有什么关系。要求模板的代码必须尽量简洁。<br>b) 在 cpp 文件内部用模板来提高效率和减少重复代码。这种方式使用的时候<wbr>，只是一种复用小规模代码的语法糖，不应暴露在头文件中。<br>2.2 高级特性
<br>虚函数就是这样一个高级特性。纯虚类用来做 handler 很好。此外，如果真的需要多态的话，也可以用虚函数。<br>要指出的是，只有真正需要多态才用虚函数，而这种需求其实并不普遍<wbr>。滥用虚函数最常见的一个借口就是灵活性。大多数时候灵活性都不是<wbr>需求，而仅仅是因为虚函数能够多态因而那个程序员幻想出来有这样一<wbr>个需求。<br>2.3 语法糖<br>继承、static_cast、reinterpret<wbr>_cast、运算符重载、函数重载、命名空间、成员函数<wbr>、类静态成员，这些都是语法糖。我对语法糖没什么意见，能用就用<wbr>。当然我们知道语法糖很容易被滥用，但我觉得其实只要接口简洁<wbr>，滥用也滥不到哪里去。这些语法糖的使用应该主要是实现层次的<wbr>，尽量不要出现在头文件中。
<br>2.4 没用的特性<br>2.4.1 引用<br>我受够了！左值／右值、复制引用／复制值 这些问题已经折磨了我很长时间了。我想，如果要用指针就用指针<wbr>，不用遮遮掩掩说那是一个引用。如果 boost 不需要支持引用的话，我估计 boost 里面跟模板相关的代码可以减少三分之一。我今天决定了<wbr>，以后除非调用别人的函数要求传引用，否则我绝对不在自己的代码里<wbr>面用引用。<br>2.4.2 private 、 public 和 class<br>
任何暴露在头文件中的东西，都理所当然是 public 的。而需要隐藏的实现，如果有办法隐藏，自然可以放到 cpp 文件中。用 C
的那些办法来隐藏实现，比用自欺欺人的 private 好多了。我们知道 class 和 struct 在 C++ 中的唯一区别就是 class
默认成员为 private ，由于 private 是自欺欺人的，所以我们在一切地方都用 struct 代替 class<br>2.4.3 dynamic_cast和typeid
<br>使用多态的唯一正确方式就是用虚函数，正确编码的代码一定可以避免 dynamic_cast 。<br>3 关于模块<br>3.1 一个模块就是一个 cpp 文件，最小几十行代码，最大不超过1000行。函数分为两类<wbr>。一类是出现在头文件中的接口，另一类是模块内部用的<wbr>，仅仅用来避免重复代码。<br>3.2 头文件。直接暴露数据结构就是编写良好接口的捷径<wbr>！试图隐藏实现是愚蠢的。此外，接口函数应该以自由函数为主<wbr>，但也可以使用成员函数。对于需要严格分离的接口<wbr>，可以使用纯虚类，纯虚函数来定义。
<br>3.3 组织模块内部编码时，唯一的目标就是代码最短，避免任何包装开销<wbr>。内部不必是良好定义的，不必是正交的，为了减少代码<wbr>，甚至可以大量的使用宏。同时，把模板当成一种低级特性来用<wbr>，只要有利于简短代码量，一切奇技淫巧都可以用。<br>4 模块接口的参数传递<br>4.1 缓冲区和字符串<br>对于接受字符串的函数，接受的参数是首地址指针和长度<wbr>，或者首末地址也可以。当然，字符串和缓冲区的具体存储字段<wbr>，可以用 std::vector&lt;char&gt; 
<br>4.2 时间<br>不使用任何 C++ 类，一律传整数，比如 time_t 或者其他自定义的整数 。强大的 Boost.Date_Time 可以拜拜了。<br>4.3 指针<br>一切想要传引用的地方，都明白无误的传指针。<br>4.4 模板参数<br>因为已经规定了不使用引用，模板参数就可以不必考虑引用<wbr>，每一个参数都可以传值。类似这样：template<wbr>&lt;typename T0, typename T1&gt; void func(T0 t0, T1 t1);</div></div>]]></description>
	    <author><![CDATA[Atry]]></author>
	    <comments>http://www.ac.net.blog.163.com/blog/static/136490562007894424339</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://www.ac.net.blog.163.com/blog/static/136490562007894424339</guid>
    <pubDate>Wed, 12 Dec 2007 15:46:42 +0800</pubDate>
    <dcterms:modified>2007-12-12T15:46:42+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[全身酸痛]]></title>	
    <link>http://www.ac.net.blog.163.com/blog/static/136490562007111151014240</link>
    <description><![CDATA[<div>前天去怀柔玩真人 CS ，搞得全身肌肉酸痛，尤其是大腿和屁股。刚玩完的时候还很兴奋，不觉得有什么，晚上吃了饭就觉得腿有点僵硬，而等到睡了一觉——昨天一整天全身肌肉都不对劲了，尤其是坐在椅子上要站起来的时候啊，酸得简直要晕过去了……今天好点了，大腿还是有点酸，估计明天就没事了。<br></div>]]></description>
	    <author><![CDATA[Atry]]></author>
	    <comments>http://www.ac.net.blog.163.com/blog/static/136490562007111151014240</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://www.ac.net.blog.163.com/blog/static/136490562007111151014240</guid>
    <pubDate>Tue, 11 Dec 2007 17:10:14 +0800</pubDate>
    <dcterms:modified>2007-12-11T17:10:14+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[发现蓝晶的惯用 ID : hookgeo]]></title>	
    <link>http://www.ac.net.blog.163.com/blog/static/136490562007101023927991</link>
    <description><![CDATA[<div>我一直是蓝晶的书迷。在中国写小说写得最好看的两个人，蓝晶和刘慈欣，都是程序员出身。真是给我们程序员长了面子。一个写玄幻，一个写科幻，可见程序员的想象力就是强，哈哈。<br>
发现 hookgeo 这个 ID 以后，很八卦的去 Google 了一下，发现他经常出没在 copyship.com ，是一个船模论坛。难怪蓝晶每一个作品都要玩改造舰船，果然是有知识积累的。<br>
还发现蓝晶在 2001 年的一个帖子说项目设计可以精确到每小时的工作量，引来许多人攻击。</div>]]></description>
	    <author><![CDATA[Atry]]></author>
	    <comments>http://www.ac.net.blog.163.com/blog/static/136490562007101023927991</comments>
    <slash:comments>3</slash:comments>
    <guid isPermaLink="true">http://www.ac.net.blog.163.com/blog/static/136490562007101023927991</guid>
    <pubDate>Sat, 10 Nov 2007 02:39:27 +0800</pubDate>
    <dcterms:modified>2007-11-10T02:39:27+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[治病风险应该医院承担]]></title>	
    <link>http://www.ac.net.blog.163.com/blog/static/1364905620071059133054</link>
    <description><![CDATA[<div>比如说，某人得了癌症，大概需要 5 万元医药费，有 50% 几率能治好。我建议改成 10 万元包干，若治不好分文不取。改成这样的话，估计医院自己就会把成本降得远低于 5 万元，而且治好的几率多半比原先还高。<br>不过这样一来，得了大病价格就更贵了，穷人就更看不起病了。这个解决办法只有医疗保险。不过我建议医疗保险应该让医院经营。也是包干。比如说我现在很健康，我每年给医院交钱。但我要是得了病去看病医院就不收我的钱了。如果把我治死了，就倒给我的受益人赔钱。假如我活得长，我一直给医院交钱，医院肯定是赚的；如果我死得早，医院还没收到多少钱就反而要陪给我的受益人钱，医院就亏了。这样一来医院说不定比我自己更关心我的健康，三天两头让我去体检。<br><br>目前一般的医院就算有单个手术包干费用的，也不敢承诺治不好不要钱。其实很没经济头脑。如果按我说的干，医院、病人都能受益，而医药代表就该失业了。医生的灰色收入是没有了，而且看病时压力可能更大一些，但长远的看，医生这个职业会得到患者更大的信任，医生也不会吃亏的。</div>]]></description>
	    <author><![CDATA[Atry]]></author>
	    <comments>http://www.ac.net.blog.163.com/blog/static/1364905620071059133054</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://www.ac.net.blog.163.com/blog/static/1364905620071059133054</guid>
    <pubDate>Mon, 5 Nov 2007 21:13:30 +0800</pubDate>
    <dcterms:modified>2007-11-05T21:13:30+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[第一次在 100 步以内赢棋]]></title>	
    <link>http://www.ac.net.blog.163.com/blog/static/13649056200710454716644</link>
    <description><![CDATA[<div>我前几天才学会下围棋，所以水平还很臭。今天这一局，只花了几十步棋就杀掉了对方一个边，逼得对方认输了。我太高兴了。<br>这一局，从开局我就走得很舒畅。走到 22 ，我觉得我已经有点优势了。左上角的五个黑棋被我夹着，还不安稳。而经过 18 20 22 这三手棋，我在上方的两边棋遥相呼应，很有味道。总的来说，从 9 到 22 的演变，黑棋拘束而白棋开阔。<br><a href="http://img.blog.163.com/photo/ayvHoGKpBMsujYYyFSr7Aw==/299207900243759189.jpg" target="_blank"><img src="http://img.blog.163.com/photo/ayvHoGKpBMsujYYyFSr7Aw==/299207900243759189.jpg"></a><br>但是，上方的棋只不过是有点味道，还没有真正成空，所以黑棋就试图在这里活一块棋。走到 31 ，黑棋在白棋的腹地已经掏出了一大片空了。<br><a href="http://img.blog.163.com/photo/dPQwV2V6itBtTyGLSbuwHw==/1174876552790572474.jpg" target="_blank"><img src="http://img.blog.163.com/photo/dPQwV2V6itBtTyGLSbuwHw==/1174876552790572474.jpg"></a><br>白棋应该应在哪里呢？是在 A 位档，还是在 B 位大飞呢？<br>正确答案应该是 B 。因为白棋左上角 5 个子是比较强硬的，即使不挡，黑棋接下来在 C 位的飞也是后手。<br><br>可惜当时我走棋的时候走错了，幸亏黑棋也走错了，黑 35 如果走在 M18 就活了。<br><a href="http://img.blog.163.com/photo/U_uwkfIPOxbVr3rZmuDRIw==/2017049683108878018.jpg" target="_blank"><img src="http://img.blog.163.com/photo/U_uwkfIPOxbVr3rZmuDRIw==/2017049683108878018.jpg"></a><br>就是这样，在双方都犯错误的情况下，我杀掉了黑棋，我就赢了。白 50 是走错了，直接走 N17 提掉会更干净一些。<br></div>]]></description>
	    <author><![CDATA[Atry]]></author>
	    <comments>http://www.ac.net.blog.163.com/blog/static/13649056200710454716644</comments>
    <slash:comments>3</slash:comments>
    <guid isPermaLink="true">http://www.ac.net.blog.163.com/blog/static/13649056200710454716644</guid>
    <pubDate>Sun, 4 Nov 2007 17:47:16 +0800</pubDate>
    <dcterms:modified>2007-11-04T17:47:16+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[厚势不围空]]></title>	
    <link>http://www.ac.net.blog.163.com/blog/static/136490562007103101258220</link>
    <description><![CDATA[<div>这是今天一盘棋，我是黑棋。序盘阶段我走的比较吃亏，让白棋在左边把我压抑得很不爽；上面让白棋占了很多地，都是在三路四路的，空很多。终于，我等来了转机：<br><a href="http://img.blog.163.com/photo/g6bsjmnfs4g4mHI-Yfzvlw==/298644950290320462.jpg" target="_blank"><img src="http://img.blog.163.com/photo/g6bsjmnfs4g4mHI-Yfzvlw==/298644950290320462.jpg"></a><br>这步棋，白棋走在天元，想要破掉我的空，但实际上是败招。<br>我应该怎么应呢？走在 B 位围空，抑或是走到 A 位或者 C 位来攻击呢。<br>如果走在 B 位围空，犯了厚势不围空的忌讳，其实是围不到什么空的。走到 C 攻击也没什么意义，因为下面和右边的边路都不厚，白棋若要逃跑，空间很大，在中腹战斗很难杀掉白棋。正确的答案是 A 。在 A 位攻击，可以借攻击的机会形成新的厚势，围到巨空。这盘棋我就走到了 A ，最后赢了。 9 路和 8 路的黑棋，就是趁此驱赶白棋的机会走出来的。<br><a href="http://img.blog.163.com/photo/706HVRuhOxlysj83UADyPw==/1482810177312020713.jpg" target="_blank"><img src="http://img.blog.163.com/photo/706HVRuhOxlysj83UADyPw==/1482810177312020713.jpg"></a><br>这盘棋的最后结果是我赢了 9 目半。其实我关子的战斗还犯了错误，损了几目，不然赢得还要多一点。<br></div>]]></description>
	    <author><![CDATA[Atry]]></author>
	    <comments>http://www.ac.net.blog.163.com/blog/static/136490562007103101258220</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://www.ac.net.blog.163.com/blog/static/136490562007103101258220</guid>
    <pubDate>Sat, 3 Nov 2007 22:12:58 +0800</pubDate>
    <dcterms:modified>2007-11-03T22:12:58+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[论不要下猛棋]]></title>	
    <link>http://www.ac.net.blog.163.com/blog/static/13649056200710324911273</link>
    <description><![CDATA[<div>这里所说的猛棋，就是指不顾自己破绽跟对手纠缠的棋。通常，一着猛棋如果触发了战斗，局面就很混乱，可能赢也可能输。但是，假如对手简单的忍让，猛棋无处使力，自己的破
绽就暴露了，要么还得补棋，要么变成一个隐患。猛棋可能在局部能占个几目便宜；但是那步猛棋自己所留下来的破绽若要修补，往往比占的那点便宜需要付出
更大代价。<br></div>]]></description>
	    <author><![CDATA[Atry]]></author>
	    <comments>http://www.ac.net.blog.163.com/blog/static/13649056200710324911273</comments>
    <slash:comments>3</slash:comments>
    <guid isPermaLink="true">http://www.ac.net.blog.163.com/blog/static/13649056200710324911273</guid>
    <pubDate>Sat, 3 Nov 2007 14:49:11 +0800</pubDate>
    <dcterms:modified>2007-11-03T14:49:11+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[学会下围棋了！]]></title>	
    <link>http://www.ac.net.blog.163.com/blog/static/13649056200710313425411</link>
    <description><![CDATA[<div>虽然很早以前就开始接触围棋，但是一直没学会。我这里所说的“学会”的概念是指知其然而知其所以然。在我学会下围棋以前，我虽然懂得规则，但是走棋只是凭感觉，不知道每步棋的原因。远看上去还像回事，其实一触即溃。直到几天以前我才学会下围棋，其实很简单，每步棋都多算几步，自然就懂了。<br>现在我每天晚上下一盘棋，下完棋以后就复盘，来研究哪些棋走对了，哪些棋走错了，如果是正确的应该怎么走。这样提高就很快。<br>今天我下赢了一盘棋，下赢的原因完全是靠脱先，对手常常在小棋多走了几步，我就脱先了，结果整盘棋没怎么激烈的战斗我就赢了。这正是因为我每步棋都想清楚了，知道哪里大哪里小。<br>这是今天那盘棋的一步棋：<br><a href="http://img.blog.163.com/photo/LvyHUYuOnBmG4aFHl3sClA==/351280770935149383.jpg" target="_blank"><img src="http://img.blog.163.com/photo/LvyHUYuOnBmG4aFHl3sClA==/351280770935149383.jpg"></a><br>我是白棋，F10 是我实际上走的棋，这步棋是错误的，因为这步棋不是当前的急所。实际上应该走在右边中间的几个半透明的棋子的某一个。我复盘的时候，一眼就发现我走错了，但是我水平太差，每办法轻易看出右边中间的具体哪一个位置是最好的，所以我就挨个摆摆看。<br>实战的结果是 2 3 4 5 都不太妙，因为那个无忧角和 N6 的那个头非常强，如果走 2 3 4 5 中的任何一个，黑棋都可以选择在 R10 R11 Q10 这附近攻击，而且黑棋 N7 是一个先手。如果白棋要往左边逃，想要跟中间的几个白棋连上的话，虽然能做得到，但是会付出很大的代价。<br>相反，如果走 6 ，黑棋若应在 R12，就比较没趣了，白棋接下来可以顺手走 R14 把角占了。而如果黑棋走在 R8 拆二，那么白棋走 R13 也拆二，接下来就会比较自然了。毕竟整个棋盘上半部白棋很多，很容易下。<br>白棋走在 1 的话也不错的，和黑棋在右边战斗并不吃亏。<br><br>很早我就听说了“厚势勿近寄”这句话，但是并没深切体会，还是今天自己摆出来走走看才发现果然是很有道理。但是我还是没有搞清楚 1 和 6 哪一个更好，希望高手告诉我。<br></div>]]></description>
	    <author><![CDATA[Atry]]></author>
	    <comments>http://www.ac.net.blog.163.com/blog/static/13649056200710313425411</comments>
    <slash:comments>1</slash:comments>
    <guid isPermaLink="true">http://www.ac.net.blog.163.com/blog/static/13649056200710313425411</guid>
    <pubDate>Sat, 3 Nov 2007 01:34:25 +0800</pubDate>
    <dcterms:modified>2007-11-03T01:38:30+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[Ubuntu 的字体设置]]></title>	
    <link>http://www.ac.net.blog.163.com/blog/static/13649056200792495222448</link>
    <description><![CDATA[<div>Ubuntu 不管是 7.04 还是 7.10 都有共同的字体问题，这些问题都跟中文有关：<br>1. 中文字体丑<br>2. 当系统语言为中文时，英文字体也丑<br>3. 等宽字体不等宽<br><br>对这些问题，网上能找到很多解决方案，基本上都需要手动修改 /ect/fonts/ 里面的配置文件，这是不对的，那些文件是属于某些 deb 包的，如果手工 hack ，包只要升级了就白费了。比如说我这次从 7.04 升级到 7.10 ，我之前按那些办法修改的文件就都被覆盖了。正确的解决办法是添加新的配置文件而不是修改现有的。现在我把我的做法具体说一下：<br><br>1. 中文字体丑<br>Ubuntu 默认装的中文字体是文鼎捐献的那几个，那几个字体不完全符合大陆的书写习惯，所以觉得丑。解决办法是安装文泉驿字体。 Ubuntu 的源里面的文泉驿字体比较旧，不推荐安装。建议去 http://wenq.org 下载最新的 deb 包。最新的版本里面已经包含了一个配置文件，会让中文字体优先使用文泉驿的点阵，只有在文泉驿点阵鞭长莫及的大字体和极小的字体才会用别的。非常简单，只要装那个 deb 包就可以了。<br><br>2. 当系统语言为中文时，英文字体也丑<br>这是因为原来的配置那些 autohint 之类搞的鬼，使得常常不能够匹配到最漂亮的英文字体。所以网上一些文章就说要修改 /etc/fonts/language-selector.conf 。这个问题的确是那个配置文件的错，不过我还是不推荐修改这个文件，原因我前面说过，这个文件属于系统包（确切的说，是属于 language-selector-common 这个包）。我的解决办法是写一个用户配置文件：<br><pre style="border: 1px solid black;">&lt;?xml version="1.0"?&gt;&lt;!DOCTYPE fontconfig SYSTEM "fonts.dtd"&gt;<br>&lt;fontconfig&gt;<br>  &lt;match target="pattern"&gt;<br>    &lt;test qual="any" name="family" compare="eq"&gt;<br>      &lt;string&gt;sans-serif&lt;/string&gt;<br>    &lt;/test&gt;<br>    &lt;edit name="family" mode="prepend"&gt;<br>      &lt;string&gt;DejaVu Sans&lt;/string&gt;<br>    &lt;/edit&gt;<br>  &lt;/match&gt; <br>  &lt;match target="pattern"&gt;<br>    &lt;test qual="any" name="family" compare="eq"&gt;<br>      &lt;string&gt;serif&lt;/string&gt;<br>    &lt;/test&gt;<br>    &lt;edit name="family" mode="prepend"&gt;<br>      &lt;string&gt;DejaVu Serif&lt;/string&gt;<br>    &lt;/edit&gt;<br>  &lt;/match&gt; <br>  &lt;match target="pattern"&gt;<br>    &lt;test qual="any" name="family" compare="eq"&gt;<br>      &lt;string&gt;monospace&lt;/string&gt;<br>    &lt;/test&gt;<br>    &lt;edit name="family" mode="prepend" binding="strong"&gt;<br>      &lt;string&gt;DejaVu Sans Mono&lt;/string&gt;<br>    &lt;/edit&gt;<br>  &lt;/match&gt; <br>&lt;/fontconfig&gt;</pre>把这个文件保存为 ~/.fonts.conf ， ~ 的意思是用户主文件夹，这样的话，就不需要修改全局的字体设置了。<br><br>3. 等宽字体不等宽<br>造成这个问题有两个原因，一方面是因为那个 /etc/fonts/language-selector.conf 有问题，另一方面则是因为本来就缺少好看的中文等宽字体。所以有了我上面的 ~/.fonts.conf 这个文件，问题其实已经解决了一半，英文等宽字体已经很漂亮了。不过另一半问题则在于这个很漂亮的英文等宽字体并不是中文字体的一半大。这另一半问题我倾向于不解决。固然可以设置某些中文等宽字体（比如Ubuntu自带的“文鼎简中楷”），不过那里面对应的英文等宽字体都不好看。想要用等宽字体基本上都是在写程序的时候，反正程序里面也没几个汉字，都是在注释里面，对不对齐问题不大。<br></div>]]></description>
	    <author><![CDATA[Atry]]></author>
	    <comments>http://www.ac.net.blog.163.com/blog/static/13649056200792495222448</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://www.ac.net.blog.163.com/blog/static/13649056200792495222448</guid>
    <pubDate>Wed, 24 Oct 2007 21:52:22 +0800</pubDate>
    <dcterms:modified>2007-10-25T00:37:10+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[ 程序员之耻]]></title>	
    <link>http://www.ac.net.blog.163.com/blog/static/13649056200791313513748</link>
    <description><![CDATA[<div>我的手机的那个数字键 0 逐渐的按不动了。到了今天，甚至想要充话费都输不了充值卡密码。所以我竟然跑到楼下修手机的地方，花了 2 分钟讲价，从 20 块钱讲到 15 块钱。然后眼睁睁的看着他拆开我的手机，把电路板上的铜锈刮了刮，就修好了……<br><br>耻辱啊，我把程序员的脸都丢光了。通过这件事情，让我认识到了我和技术牛人（比如云风）之间的境界差距（http://blog.codingnow.com/2007/10/microsoft_mouse_ie4.html）。</div>]]></description>
	    <author><![CDATA[Atry]]></author>
	    <comments>http://www.ac.net.blog.163.com/blog/static/13649056200791313513748</comments>
    <slash:comments>8</slash:comments>
    <guid isPermaLink="true">http://www.ac.net.blog.163.com/blog/static/13649056200791313513748</guid>
    <pubDate>Sat, 13 Oct 2007 13:35:13 +0800</pubDate>
    <dcterms:modified>2007-10-13T13:35:13+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[如何度过上课的时间]]></title>	
    <link>http://www.ac.net.blog.163.com/blog/static/1364905620079441939307</link>
    <description><![CDATA[<div>上学是我人生中的一场灾难。对我造成的损害我总结为两点：1、侮辱人格；2、浪费时间。侮辱人格主要表现在小学、初中和高一，高二在重庆好了很多。而浪费时间则表现在听课和写作业上。这两样东西浪费时间是因为学校采用的是填鸭式的训练方式，其目的在于让学生几乎不使用大脑就可以通过考试。或者说，只需要使用马戏团的狗熊的程度的大脑就可以通过考试。这不是天方夜谭，他们真的成功的让许多同学达到了狗熊的智商！<br>幸好，我没有变成狗熊，这就给我带来了痛苦。因为如果是一只狗熊，它没大脑，让它日复一日的跳火圈它其实是无所谓的。但是让我跳火圈，我就觉得无聊，我会睡着，而实在睡不着的时候我会胡思乱想。众所周知，我上学的时候上课通常都在睡觉，原因就是这个。上课睡觉有可能会被罚的，这取决于驯兽师的心情。不过这个暂且不谈，我现在谈谈我不睡觉的时候打发时间的方式。<br>一般来说是用书本和笔来打发时间。方式如下：<br>1、吃笔。这个比较适合铅笔，因为铅笔的木头是可以啃下来的，成功的啃下来一些木屑会比较有成就感。<br>2、吃书。那时候的课本用的纸张比较软，很有嚼头。<br>3、画格斗漫画。可惜我的水平太差，只能画出最简单的形状——火柴人。就是类似于后来网上看到的《小小作品》那种。<br>4、研究数论。也就是用笔在教科书上胡乱的画一些不知所谓的数字。这个让我独立的发现了杨辉三角。<br>5、看书。我看书的速度从小就很快，一般来说刚开学的头一两天我就会把所有的教科书看完。然后整个学期无聊的时候都会拿出来反复复习。一般来说，历史书最好看，因为有故事情节。数学书最枯燥，全是些愚蠢的例题。我看书是过目不忘的，对于那些讲道理的书，我只要看过一遍我就明白它讲的道理，而且特别相信有道理的道理。但是我记忆力又很差，时间地点之类的东西我是记不住的，此外，没有道理的道理我也记不住。这就是为什么我考政治历史都考不好的原因。<br>6、下五子棋。我后来上大学以后五子棋拿过校冠军，就是在中学上课的时候练出来的。这算是中国版《象棋的故事》吧。PS: 我第一次看到《象棋的故事》的时候我就真的哭了。<br>7、玩口水。具体方式是往课桌上哈气，课桌比较冷，所以会凝结许多小水珠，如果持续不断的往课桌上哈气，哈上几十分钟，就会产生一大滩水，就可以玩这一大滩水了。<br>8、浮雕艺术。也就是用小刀在课桌刻字啥的……其实属于破坏公物。<br>9、拆卸和组装。比如说把文具盒拧来拧去，把钢笔的各个零件卸下来再装回去之类的事情。本质上是因为我的好奇心太强而无处发泄。为什么那时候我们都希望拥有一个很牛叉的带放大镜削笔刀以及十几个暗格的文具盒呢？其实是因为那样的文具盒构造比较复杂，研究起来比较有趣，而且拆卸的时候不会像铁皮文具盒那样划伤手指。<br>10、把鼻屎粘在课桌下面。<br><br>老实说，我这篇文章根本不指望有多少人会有共鸣。第一，出生在80年以前的人体会不到我在说什么，第二，狗熊没有体会到我在说什么。<br></div>]]></description>
	    <author><![CDATA[Atry]]></author>
	    <comments>http://www.ac.net.blog.163.com/blog/static/1364905620079441939307</comments>
    <slash:comments>2</slash:comments>
    <guid isPermaLink="true">http://www.ac.net.blog.163.com/blog/static/1364905620079441939307</guid>
    <pubDate>Thu, 4 Oct 2007 16:19:39 +0800</pubDate>
    <dcterms:modified>2007-10-04T16:19:39+08:00</dcterms:modified>
  </item>    
 </channel>
</rss>