<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>尼采的遊戲</title>
	<atom:link href="http://rdescartes.seezone.net/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://rdescartes.seezone.net</link>
	<description>我的Coding 求生筆記</description>
	<lastBuildDate>Sun, 21 Jun 2009 15:52:56 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.41</generator>
	<item>
		<title>最後的一個條件</title>
		<link>http://rdescartes.seezone.net/?p=19</link>
		<comments>http://rdescartes.seezone.net/?p=19#comments</comments>
		<pubDate>Sun, 21 Jun 2009 15:52:14 +0000</pubDate>
		<dc:creator><![CDATA[rdescartes]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://rdescartes.seezone.net/?p=19</guid>
		<description><![CDATA[拿沙特工資， 住英國房子， 用芬蘭手機， 戴瑞士手表， 娶韓國女人， 看日本AV， 做泰國按摩， 開德國轎車， 坐美國飛機， 喝法國紅酒， 吃澳洲海鮮， 抽古巴雪茄， 穿意大利皮鞋， 玩西班女郎， 看奧地利歌劇， 買俄羅斯別墅， 雇菲律賓女佣， 配以色列保鑣， 洗土耳其桑拿， &#8230;&#8230;&#8230;.. 當中國干部!!!]]></description>
				<content:encoded><![CDATA[<p>拿沙特工資，<br />
住英國房子，<br />
用芬蘭手機，<br />
戴瑞士手表，<br />
娶韓國女人，<br />
看日本AV，<br />
做泰國按摩，<br />
開德國轎車，<br />
坐美國飛機，<br />
喝法國紅酒，<br />
吃澳洲海鮮，<br />
抽古巴雪茄，<br />
穿意大利皮鞋，<br />
玩西班女郎，<br />
看奧地利歌劇，<br />
買俄羅斯別墅，<br />
雇菲律賓女佣，<br />
配以色列保鑣，<br />
洗土耳其桑拿，<br />
&#8230;&#8230;&#8230;..</p>
<p>當中國干部!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://rdescartes.seezone.net/?feed=rss2&#038;p=19</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>新的open source project</title>
		<link>http://rdescartes.seezone.net/?p=15</link>
		<comments>http://rdescartes.seezone.net/?p=15#comments</comments>
		<pubDate>Tue, 16 Jun 2009 21:47:30 +0000</pubDate>
		<dc:creator><![CDATA[rdescartes]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://rdescartes.seezone.net/?p=15</guid>
		<description><![CDATA[最近在寫一個新的open source project。 理想中，應該是dual license 的，non-commercial use 是GPL，commercial的，就要收點錢 :) 一如過往，先來幾張圖： 這到底是什麼東西呀 ?? 我也不知道呢 :) 應該是畢卡索在學習flash 時亂畫一通的作品。(大笑) 不過它包括了以下東西： 1. Radial Gradient. 2. Linear Gradient. 3. Shape Drawing]]></description>
				<content:encoded><![CDATA[<p>最近在寫一個新的open source project。<br />
理想中，應該是dual license 的，non-commercial use 是GPL，commercial的，就要收點錢 :)</p>
<p>一如過往，先來幾張圖：</p>
<p><a href='http://rdescartes.seezone.net/wp-content/uploads/2009/06/bu_cap.JPG' title='bu_cap.JPG'><img src='http://rdescartes.seezone.net/wp-content/uploads/2009/06/bu_cap.thumbnail.JPG' alt='bu_cap.JPG' /></a><a href='http://rdescartes.seezone.net/wp-content/uploads/2009/06/bu_cap2.JPG' title='bu_cap2.JPG'><img src='http://rdescartes.seezone.net/wp-content/uploads/2009/06/bu_cap2.thumbnail.JPG' alt='bu_cap2.JPG' /></a><a href='http://rdescartes.seezone.net/wp-content/uploads/2009/06/bu_cap3.JPG' title='bu_cap3.JPG'><img src='http://rdescartes.seezone.net/wp-content/uploads/2009/06/bu_cap3.thumbnail.JPG' alt='bu_cap3.JPG' /></a></p>
<p>這到底是什麼東西呀 ??</p>
<p>我也不知道呢 :)<br />
應該是畢卡索在學習flash 時亂畫一通的作品。(大笑)<br />
不過它包括了以下東西：</p>
<p>1. Radial Gradient.<br />
2. Linear Gradient.<br />
3. Shape Drawing <- this is the hard part!!!
4. Jpeg loading and drawing.
5. Frames control (可惜我還是不懂cap video&#8230;)

暫時是以SDL為rendering engine，不過我只是 memcpy 了一段 raw memory 去SDL_Screen，
所以簡單一點說，是render api independent 的。

可惜還有慢慢長路&#8230;.
待開發得完整一些再談吧 : )



</p>
]]></content:encoded>
			<wfw:commentRss>http://rdescartes.seezone.net/?feed=rss2&#038;p=15</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>google wave</title>
		<link>http://rdescartes.seezone.net/?p=14</link>
		<comments>http://rdescartes.seezone.net/?p=14#comments</comments>
		<pubDate>Fri, 29 May 2009 21:54:52 +0000</pubDate>
		<dc:creator><![CDATA[rdescartes]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://rdescartes.seezone.net/?p=14</guid>
		<description><![CDATA[剛看完了google wave 的 preview 簡單一點講，就是過份!! 集 wiki , im, email, discussion group, bbs, blogging , micro-blogging 於一身的工具! 還要支援 cooperating editing !! 還是天生的open source + open protocol !!! 這不就是傳說中的&#8221;攞你命三千&#8221;??? 記著，有錢，一定要買google 的股票!!!]]></description>
				<content:encoded><![CDATA[<p>剛看完了google wave 的 <a href="http://wave.google.com/">preview</a> 簡單一點講，就是過份!!</p>
<p>集 wiki , im, email, discussion group, bbs, blogging , micro-blogging 於一身的工具!<br />
還要支援 cooperating editing !!<br />
還是天生的open source + open protocol !!!</p>
<p>這不就是傳說中的&#8221;攞你命三千&#8221;???</p>
<p>記著，有錢，一定要買google 的股票!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://rdescartes.seezone.net/?feed=rss2&#038;p=14</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Engine, New Screen Shot.</title>
		<link>http://rdescartes.seezone.net/?p=13</link>
		<comments>http://rdescartes.seezone.net/?p=13#comments</comments>
		<pubDate>Mon, 27 Apr 2009 23:13:00 +0000</pubDate>
		<dc:creator><![CDATA[rdescartes]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://rdescartes.seezone.net/?p=13</guid>
		<description><![CDATA[剛剛看到日子，有一年零四日沒有更新.. :) 最近看到同事和朋友的Blog中，大家也在開發自家的遊戲引擎，心想不如我也參與其中吧。 而且，發覺自己真的開始老了，寫程式的進度很慢很慢，或許是時候自我進修一下。 所以&#8230;. 好，去片：(我還不懂Cap 片..) From 內容只是十分簡單，不過實作了三樣想寫很久的東西： 1. Lua based framework with coroutines Lua 最最強大的地方是，實入了coroutines。由於在實際上寫script 的人，多數是game designer， Event driven based 的script system對他們來說是比較有一點難度。 但若引入了Coroutines，Script 的編寫就會變得直線很多： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>剛剛看到日子，有一年零四日沒有更新.. :)</p>
<p>最近看到同事和朋友的Blog中，大家也在開發自家的遊戲引擎，心想不如我也參與其中吧。<br />
而且，發覺自己真的開始老了，寫程式的進度很慢很慢，或許是時候自我進修一下。</p>
<p>所以&#8230;. 好，去片：(我還不懂Cap 片..)</p>
<table style="width:auto;">
<tr>
<td><a href="http://picasaweb.google.com/lh/photo/CwRMfRunyzdYc_T9YmQuZQ?feat=embedwebsite"><img src="http://lh4.ggpht.com/_006t0JcTgYA/SfY1XckMfdI/AAAAAAAAADY/tlD_dpPbNoU/s400/screenshot.JPG" /></a></td>
</tr>
<tr>
<td style="font-family:arial,sans-serif; font-size:11px; text-align:right">From <a href="http://picasaweb.google.com/lh/sredir?uname=rdescartes&#038;target=ALBUM&#038;id=5329505853886946977&#038;feat=embedwebsite"></a></td>
</tr>
</table>
<p>內容只是十分簡單，不過實作了三樣想寫很久的東西：</p>
<p>1. Lua based framework with coroutines</p>
<p>Lua 最最強大的地方是，實入了coroutines。由於在實際上寫script 的人，多數是game designer，<br />
Event driven based 的script system對他們來說是比較有一點難度。<br />
但若引入了Coroutines，Script 的編寫就會變得直線很多：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
</pre></td><td class="code"><pre class="lua" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">-- Create an window</span>
Window
<span style="color: #66cc66;">&#123;</span>
    title <span style="color: #66cc66;">=</span> <span style="color: #ff6666;">&quot;Lua Framework&quot;</span><span style="color: #66cc66;">,</span>
    x <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">,</span>
    y <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">,</span>
    w <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">800</span><span style="color: #66cc66;">,</span>
    h <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">600</span><span style="color: #66cc66;">,</span>
    fullscreen <span style="color: #66cc66;">=</span> <span style="color: #aa9900;">true</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">-- Create the camera</span>
Camera
<span style="color: #66cc66;">&#123;</span>
    eye <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">-</span><span style="color: #cc66cc;">5.0</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">5.0</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">1.0</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">,</span>
    target <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span><span style="color: #cc66cc;">0.0</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">0.0</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">0.0</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">,</span>    
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">--Create Objects</span>
objects <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span>
r <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">5.0</span>
n <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">10</span>
&nbsp;
<span style="color: #aa9900; font-weight: bold;">for</span> i<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span>n <span style="color: #aa9900; font-weight: bold;">do</span>
    <span style="color: #aa9900; font-weight: bold;">local</span> theta <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2.0</span> <span style="color: #66cc66;">*</span> <span style="color: #0000aa;">math.pi</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">/</span> n <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> i<span style="color: #66cc66;">;</span>
&nbsp;
    <span style="color: #aa9900; font-weight: bold;">if</span> i <span style="color: #66cc66;">&lt;</span> <span style="color: #cc66cc;">4</span> <span style="color: #aa9900; font-weight: bold;">then</span>
        objects<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> Object
        <span style="color: #66cc66;">&#123;</span>
            Movable<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
            Renderable<span style="color: #66cc66;">&#40;</span>geom<span style="color: #66cc66;">.</span>cube<span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2.0</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #aa9900; font-weight: bold;">elseif</span> i <span style="color: #66cc66;">&lt;</span> <span style="color: #cc66cc;">7</span> <span style="color: #aa9900; font-weight: bold;">then</span>
        objects<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> Object
        <span style="color: #66cc66;">&#123;</span>
            Movable<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
            Renderable<span style="color: #66cc66;">&#40;</span>geom<span style="color: #66cc66;">.</span>sphere<span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1.0</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">20</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #aa9900; font-weight: bold;">else</span>
        objects<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> Object
        <span style="color: #66cc66;">&#123;</span>
            Movable<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
            Renderable<span style="color: #66cc66;">&#40;</span><span style="color: #ff6666;">&quot;teapot.obj&quot;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#125;</span>   
    <span style="color: #aa9900; font-weight: bold;">end</span>
&nbsp;
&nbsp;
    objects<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span>movable<span style="color: #66cc66;">.</span>position <span style="color: #66cc66;">=</span> 
    <span style="color: #66cc66;">&#123;</span> 
        <span style="color: #0000aa;">math.sin</span><span style="color: #66cc66;">&#40;</span>theta<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> r<span style="color: #66cc66;">,</span> 
        <span style="color: #cc66cc;">1.0</span><span style="color: #66cc66;">,</span> 
        <span style="color: #0000aa;">math.cos</span><span style="color: #66cc66;">&#40;</span>theta<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> r<span style="color: #66cc66;">,</span>         
    <span style="color: #66cc66;">&#125;</span>       
    objects<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span>movable<span style="color: #66cc66;">.</span>orientation <span style="color: #66cc66;">=</span> 
    <span style="color: #66cc66;">&#123;</span>
        <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span>
        <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span>
        <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span>
        theta <span style="color: #66cc66;">+</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000aa;">math.pi</span> <span style="color: #66cc66;">*</span> <span style="color: #cc66cc;">0.5</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #aa9900; font-weight: bold;">end</span>
&nbsp;
offset <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span>    
&nbsp;
<span style="color: #808080; font-style: italic;">-- start our main game loop</span>
<span style="color: #aa9900; font-weight: bold;">while</span> <span style="color: #aa9900;">true</span> <span style="color: #aa9900; font-weight: bold;">do</span>
    <span style="color: #808080; font-style: italic;">-- tell the system to we are idle, to let system do its work</span>
    idle<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
    <span style="color: #aa9900; font-weight: bold;">for</span> k<span style="color: #66cc66;">,</span> v <span style="color: #aa9900; font-weight: bold;">in</span> <span style="color: #0000aa;">pairs</span><span style="color: #66cc66;">&#40;</span>teapots<span style="color: #66cc66;">&#41;</span> <span style="color: #aa9900; font-weight: bold;">do</span>    
        <span style="color: #aa9900; font-weight: bold;">local</span> theta <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000aa;">math.pi</span> <span style="color: #66cc66;">*</span> <span style="color: #cc66cc;">2.0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">/</span> <span style="color: #66cc66;">#</span>objects<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> k <span style="color: #66cc66;">+</span> offset<span style="color: #66cc66;">;</span>
&nbsp;
        v<span style="color: #66cc66;">.</span>movable<span style="color: #66cc66;">.</span>position <span style="color: #66cc66;">=</span> 
        <span style="color: #66cc66;">&#123;</span> 
            <span style="color: #0000aa;">math.sin</span><span style="color: #66cc66;">&#40;</span>theta<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> r<span style="color: #66cc66;">,</span> 
            <span style="color: #0000aa;">math.sin</span><span style="color: #66cc66;">&#40;</span>theta<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span>  <span style="color: #0000aa;">math.cos</span><span style="color: #66cc66;">&#40;</span>theta<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> r<span style="color: #66cc66;">,</span> 
            <span style="color: #0000aa;">math.cos</span><span style="color: #66cc66;">&#40;</span>theta<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> r<span style="color: #66cc66;">,</span>         
        <span style="color: #66cc66;">&#125;</span>       
&nbsp;
        v<span style="color: #66cc66;">.</span>movable<span style="color: #66cc66;">.</span>orientation <span style="color: #66cc66;">=</span> 
        <span style="color: #66cc66;">&#123;</span>
            <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span>
            <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span>
            <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span>
            theta <span style="color: #66cc66;">+</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000aa;">math.pi</span> <span style="color: #66cc66;">*</span> <span style="color: #cc66cc;">0.5</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #aa9900; font-weight: bold;">end</span>
    offset <span style="color: #66cc66;">=</span> offset <span style="color: #66cc66;">+</span> <span style="color: #cc66cc;">0.001</span>
&nbsp;
    p1 <span style="color: #66cc66;">=</span> objects<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span>movable<span style="color: #66cc66;">.</span>position
    p2 <span style="color: #66cc66;">=</span> objects<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span>movable<span style="color: #66cc66;">.</span>position
&nbsp;
    <span style="color: #808080; font-style: italic;">-- Print some text on screen</span>
    <span style="color: #0000aa;">print</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000aa;">string.format</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff6666;">&quot;%f,%f,%f, %f,%f,%f&quot;</span><span style="color: #66cc66;">,</span> 
        p1<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> p1<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> p1<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> 
        p2<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> p2<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> p2<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span>     
        <span style="color: #66cc66;">#</span>objects<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>    
<span style="color: #aa9900; font-weight: bold;">end</span></pre></td></tr></table></div>

<p>以上是一個簡單的script ，只是會看到幾個Box, Sphere 和 Teapot 在移動。<br />
但特別的地方是那個 idle() ，它是一個coroutine ，會把Lua 的運行suspened了，把運行的權利交會給system，<br />
直至system 呼叫 lua_resume 這個 C Api 。</p>
<p>2. No C++, Only C</p>
<p>原因有很多，最簡單的原因是，compile 的時間快了十倍 :)</p>
<p>3. <a href="http://www.beosil.com/publications.html">Meshless Deformations Based on Shape Matching</a></p>
<p>幾年前看到了它的demo後，便很想把它實作出來，<br />
而由於我想開發的新遊戲，需要有一個deformable 的physic engine，所以便試它一下。<br />
暫時只實在了Linear Deformation，和沒有 object to object collision ，<br />
不過還是很好玩 :)</p>
<p>最後，原本想upload 那個demos上來，但不知道為什麼，upload 不了，<br />
等我問問橙先生後，再放上來 :)</p>
]]></content:encoded>
			<wfw:commentRss>http://rdescartes.seezone.net/?feed=rss2&#038;p=13</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>深奧的Python</title>
		<link>http://rdescartes.seezone.net/?p=12</link>
		<comments>http://rdescartes.seezone.net/?p=12#comments</comments>
		<pubDate>Thu, 24 Apr 2008 20:58:56 +0000</pubDate>
		<dc:creator><![CDATA[rdescartes]]></dc:creator>
				<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://rdescartes.seezone.net/?p=12</guid>
		<description><![CDATA[最近在計畫編寫一個Assets Management Tools，所以在想這樣的工具，最好的編寫工具是什麼。我理想中的結構是由多個不同的工具所組成，其中之一個是Web介面。 所以就試用了一下Django，跟了它的幾個example寫了一下。實在是設計得很好。由其是它的MTV(Model-Template-View)式的設計，實在夠方便。 但是有一點，是我完全不明白它是如何做得到的： 1 2 3 4 5 6 7 8 9 10 from django.db import models &#160; # Create your models here. class Publisher&#40;models.Model&#41;: name = models.CharField&#40;maxlength=30&#41; address = models.CharField&#40;maxlength=50&#41; city = models.CharField&#40;maxlength=60&#41; state_province = models.CharField&#40;maxlength=30&#41; country = models.CharField&#40;maxlength=50&#41; website = models.URLField&#40;&#41; 這個是Models.py 中定義的Model，django會自動找出所有在這裡被定義的class，再把它們變成相對應的SQL statements，之後把它們create 出來。 我不明白的是，它怎麼能自動找出來呢???我最多只是import 了這個py 檔案，但又沒有把每個class instantiate 出來&#8230; 要知道，只好用最後一招，看source [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>最近在計畫編寫一個Assets Management Tools，所以在想這樣的工具，最好的編寫工具是什麼。我理想中的結構是由多個不同的工具所組成，其中之一個是Web介面。</p>
<p>所以就試用了一下<a href="http://www.djangoproject.com/">Django</a>，跟了它的幾個example寫了一下。實在是設計得很好。由其是它的MTV(Model-Template-View)式的設計，實在夠方便。</p>
<p>但是有一點，是我完全不明白它是如何做得到的：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">db</span> <span style="color: #ff7700;font-weight:bold;">import</span> models
&nbsp;
<span style="color: #808080; font-style: italic;"># Create your models here.</span>
<span style="color: #ff7700;font-weight:bold;">class</span> Publisher<span style="color: black;">&#40;</span>models.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:
    name <span style="color: #66cc66;">=</span> models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>maxlength<span style="color: #66cc66;">=</span><span style="color: #ff4500;">30</span><span style="color: black;">&#41;</span>
    address <span style="color: #66cc66;">=</span> models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>maxlength<span style="color: #66cc66;">=</span><span style="color: #ff4500;">50</span><span style="color: black;">&#41;</span>
    city <span style="color: #66cc66;">=</span> models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>maxlength<span style="color: #66cc66;">=</span><span style="color: #ff4500;">60</span><span style="color: black;">&#41;</span>
    state_province <span style="color: #66cc66;">=</span> models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>maxlength<span style="color: #66cc66;">=</span><span style="color: #ff4500;">30</span><span style="color: black;">&#41;</span>
    country <span style="color: #66cc66;">=</span> models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>maxlength<span style="color: #66cc66;">=</span><span style="color: #ff4500;">50</span><span style="color: black;">&#41;</span>
    website <span style="color: #66cc66;">=</span> models.<span style="color: black;">URLField</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>這個是Models.py 中定義的Model，django會自動找出所有在這裡被定義的class，再把它們變成相對應的SQL statements，之後把它們create 出來。</p>
<p>我不明白的是，它怎麼能自動找出來呢???我最多只是import 了這個py 檔案，但又沒有把每個class instantiate 出來&#8230;</p>
<p>要知道，只好用最後一招，看source code!!!經過一番找尋，終於搞明白了，它用了一個C++ coder 不會用到的meta-programming 的技巧：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="python" style="font-family:monospace;">&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> ModelBase<span style="color: black;">&#40;</span><span style="color: #008000;">type</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__new__</span><span style="color: black;">&#40;</span>cls<span style="color: black;">&#41;</span>:
       ....
       .....
       <span style="color: #ff7700;font-weight:bold;">return</span> register_model<span style="color: black;">&#40;</span>cls<span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Model<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    <span style="color: #0000cd;">__metaclass__</span> <span style="color: #66cc66;">=</span> ModelBase</pre></td></tr></table></div>

<p>在這裡，__metaclass__是指Model的meta class。<br />
那原本Model的Meta class 是什麼呢? Model 是一個type，所以就是type 啦。<br />
上面的代碼，就是把Model 的Meta Class override，之後定義了一個__new__的方法，當每次Create這個metaclass是也會被call，就在這個時候，register_model就會把這個class 存起。</p>
<p>那什麼時候，這個metaclass 會被Create 呢??就是在定義它自己，和它的sub class時。留意，是定義時，所以當python import 了models.py 時，它就會create Publisher這個Class (是Class，不是Instance)，由於Publisher 是Model的sub class，所以，ModelBase 這個metaclass 就被Create了。</p>
<p>有點頭昏了，對嗎??我看到這裡，真的覺得，Python 的 Meta-Programming真的很強大，強大得也太深奧了，怎麼可以一時三刻理解呢???不過也証明coding的世界是這樣大，實在有太多有趣的地方可以去玩玩看:)</p>
]]></content:encoded>
			<wfw:commentRss>http://rdescartes.seezone.net/?feed=rss2&#038;p=12</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>我的開源兒子 amop  [amop 見聞錄]</title>
		<link>http://rdescartes.seezone.net/?p=11</link>
		<comments>http://rdescartes.seezone.net/?p=11#comments</comments>
		<pubDate>Mon, 14 Apr 2008 19:07:26 +0000</pubDate>
		<dc:creator><![CDATA[rdescartes]]></dc:creator>
				<category><![CDATA[amop 見聞錄]]></category>
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://rdescartes.seezone.net/?p=11</guid>
		<description><![CDATA[amop 是我所寫的一個C++ Mock Object1 Framework，它是開源2的，也是我第一個開源的程式。 在我開發這個程式之前，我也是使用其他人所寫的Mock Object Framework，但使用起來，發覺有一點麻煩： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class Interface &#123; virtual ~Interface&#40;&#41;&#123;&#125;; virtual void Foo&#40;&#41; = 0; &#125;; &#160; class BaseMock : class Interface, MockObject &#123; virtual void Foo&#40;&#41; &#123; // Check this function [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://code.google.com/p/amop/">amop</a> 是我所寫的一個C++ Mock Object<sup class='footnote'><a href='#fn-11-1' id='fnref-11-1' onclick='return fdfootnote_show(11)'>1</a></sup> Framework，它是開源<sup class='footnote'><a href='#fn-11-2' id='fnref-11-2' onclick='return fdfootnote_show(11)'>2</a></sup>的，也是我第一個開源的程式。</p>
<p>在我開發這個程式之前，我也是使用其他人所寫的Mock Object Framework，但使用起來，發覺有一點麻煩：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">class</span> Interface
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">virtual</span> ~Interface<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">virtual</span> <span style="color: #0000ff;">void</span> Foo<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">class</span> BaseMock <span style="color: #008080;">:</span> <span style="color: #0000ff;">class</span> Interface, MockObject
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">virtual</span> <span style="color: #0000ff;">void</span> Foo<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> 
  <span style="color: #008000;">&#123;</span>
     <span style="color: #666666;">// Check this function is called</span>
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
...
<span style="color: #007788;">BaseMock</span> mockObject<span style="color: #008080;">;</span>
...
<span style="color: #666666;">// Some way to call the Interface::Foo</span>
mockObject.<span style="color: #007788;">Foo</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
mockObject.<span style="color: #007788;">Verify</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>這種方法的麻煩，在於每一個你要測試的介面<sup class='footnote'><a href='#fn-11-3' id='fnref-11-3' onclick='return fdfootnote_show(11)'>3</a></sup>，你也要繼承出一個BaseMock，而且，當你改變了那個介面：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">class</span> Interface
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">virtual</span> ~Interface<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">virtual</span> <span style="color: #0000ff;">void</span> Foo<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">virtual</span> <span style="color: #0000ff;">void</span> Bar<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>你就得為每個BaseMock類別加上新的Bar 實作<sup class='footnote'><a href='#fn-11-4' id='fnref-11-4' onclick='return fdfootnote_show(11)'>4</a></sup>。</p>
<p>所以，我在想，若果能不需要那BaseMock就太好了。但想了很久也想不出方法，所以就不了了之了&#8230;<br />
但這個問題在腦中不斷的出現，最後，想到了一個正常被禁止的方法<sup class='footnote'><a href='#fn-11-5' id='fnref-11-5' onclick='return fdfootnote_show(11)'>5</a></sup>:</p>
<blockquote><p>直接改動C++ 的virtual table</p></blockquote>
<p>為什麼這個方法是被禁止？因為virtual table 的 ABI <sup class='footnote'><a href='#fn-11-6' id='fnref-11-6' onclick='return fdfootnote_show(11)'>6</a></sup>，對每個編譯器也會有不同的實作方式，所以肯定是不能跨編譯器<sup class='footnote'><a href='#fn-11-7' id='fnref-11-7' onclick='return fdfootnote_show(11)'>7</a></sup>的。但實在是想不到其他方法後，我就開始試寫出來。</p>
<p>除了ABI 之外， 最大的問題是有大量template meta-programming，我差不多用了我一生所學，有關C++ template 的技巧也用上了。<sup class='footnote'><a href='#fn-11-8' id='fnref-11-8' onclick='return fdfootnote_show(11)'>8</a></sup>，所以花了很長的時間才完成。完成後，就給了它一個名字：</p>
<blockquote><p>Automatic Mock Object For C plus plus</p></blockquote>
<p>AMOP，我的開源兒子，就在google code 出世了。</p>
<p>還以為一個不能跨編譯器的Library，不會太多人使用<sup class='footnote'><a href='#fn-11-9' id='fnref-11-9' onclick='return fdfootnote_show(11)'>9</a></sup>，但它的下載數字，卻在不斷增加。在討論頁中的討論，也已經很長了:) </p>
<p>最開心的是，人們的反應：</p>
<blockquote><p>&#8220;Hi very nice framework!!! This can be the leading mock framework for c++. &#8221;<br />
&#8220;Very, very good framework! We are using in ourcompany to make our Unit Tests easier and more robust. Congratulations. Very nice work !&#8221;<br />
&#8220;Nice framework!&#8221;<br />
&#8220;Hi, really like what I&#8217;m seeing. Great idea to use the ABI. Obvious and genius at the same time. &#8221;
</p></blockquote>
<p>我編寫程式也很多年了，但從來沒有給別人說過，我寫的程式是 &#8220;very nice framework&#8221;。很多時候，在商業上，其他公司會要求給出一些他們的應用程式的好評，但多數也不是真心話，但Amop 這些評語，是在沒有利益關係下，在互聯網上的不知名的人給出的，他們用不著對我說假話。</p>
<p>我想，這就是為什麼，在沒有利益的情況下，有那麼多人會去寫開源軟件了。所以，希望你看到我這些說話後，也來寫寫開源軟件，不為利益，為<strong>快樂</strong>而寫程式 :)</p>
<div class='footnotes' id='footnotes-11'>
<div class='footnotedivider'></div>
<ol>
<li id='fn-11-1'> 有空會談多些 Mock Object 的運用 <span class='footnotereverse'><a href='#fnref-11-1'>&#8617;</a></span></li>
<li id='fn-11-2'> Open Source <span class='footnotereverse'><a href='#fnref-11-2'>&#8617;</a></span></li>
<li id='fn-11-3'> Interface <span class='footnotereverse'><a href='#fnref-11-3'>&#8617;</a></span></li>
<li id='fn-11-4'> Implementation <span class='footnotereverse'><a href='#fnref-11-4'>&#8617;</a></span></li>
<li id='fn-11-5'> 對，就是所謂的邪道:P <span class='footnotereverse'><a href='#fnref-11-5'>&#8617;</a></span></li>
<li id='fn-11-6'> Application Binary Interface <span class='footnotereverse'><a href='#fnref-11-6'>&#8617;</a></span></li>
<li id='fn-11-7'> Cross Compiler <span class='footnotereverse'><a href='#fnref-11-7'>&#8617;</a></span></li>
<li id='fn-11-8'> 連Preprocessor Meta-programming也用上了&#8230;:P <span class='footnotereverse'><a href='#fnref-11-8'>&#8617;</a></span></li>
<li id='fn-11-9'> 但我也port 了它到gcc.. <span class='footnotereverse'><a href='#fnref-11-9'>&#8617;</a></span></li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://rdescartes.seezone.net/?feed=rss2&#038;p=11</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Macro 小技巧 [C++ 求生筆記]</title>
		<link>http://rdescartes.seezone.net/?p=10</link>
		<comments>http://rdescartes.seezone.net/?p=10#comments</comments>
		<pubDate>Wed, 09 Apr 2008 19:41:00 +0000</pubDate>
		<dc:creator><![CDATA[rdescartes]]></dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[C++ 求生筆記]]></category>

		<guid isPermaLink="false">http://rdescartes.seezone.net/?p=10</guid>
		<description><![CDATA[假如要寫出以下的Macro1： 1 2 3 4 #define SWAP(a, b) \ temp = (a); \ (a) = (b); \ (b) = temp; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 &#160; float temp; float a = 10; float b = 20; &#160; // case 1 SWAP&#40;a,b&#41;; // Correct. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>假如要寫出以下的Macro<sup class='footnote'><a href='#fn-10-1' id='fnref-10-1' onclick='return fdfootnote_show(10)'>1</a></sup>：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#define SWAP(a, b)  \
    temp = (a);  \
    (a) = (b); \
    (b) = temp;</span></pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;">&nbsp;
<span style="color: #0000ff;">float</span> temp<span style="color: #008080;">;</span>
<span style="color: #0000ff;">float</span> a <span style="color: #000080;">=</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span> 
<span style="color: #0000ff;">float</span> b <span style="color: #000080;">=</span> <span style="color: #0000dd;">20</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// case 1</span>
SWAP<span style="color: #008000;">&#40;</span>a,b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>      <span style="color: #666666;">// Correct.</span>
&nbsp;
<span style="color: #666666;">// case 2</span>
<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span> a <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">10</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    SWAP<span style="color: #008000;">&#40;</span>a,b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>      <span style="color: #666666;">// (2) Correct too, </span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">// case 3</span>
<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span> b <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">10</span><span style="color: #008000;">&#41;</span>
  SWAP<span style="color: #008000;">&#40;</span>a,b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>         <span style="color: #666666;">// Fail !!!</span></pre></td></tr></table></div>

<p>因為Case 3中的Macro，會被轉化為：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span> b <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">10</span><span style="color: #008000;">&#41;</span>
    temp <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>a<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#40;</span>a<span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>      
<span style="color: #008000;">&#40;</span>b<span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> temp<span style="color: #008080;">;;</span></pre></td></tr></table></div>

<p>這明顯不是我們想要的結果，所以就出現了這個小技巧：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#define SWAP(a, b)  \
    do { \
    temp = (a);  \
    (a) = (b); \
    (b) = temp; \
    } while(false)</span></pre></td></tr></table></div>

<p>這樣定義SWAP這個Macro，問題就解決了，就算在Case 3的情況下，也會被轉化為：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span> b <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">10</span><span style="color: #008000;">&#41;</span>
    <span style="color: #0000ff;">do</span> 
    <span style="color: #008000;">&#123;</span> 
        temp <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>a<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  
        <span style="color: #008000;">&#40;</span>a<span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> 
        <span style="color: #008000;">&#40;</span>b<span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> temp<span style="color: #008080;">;</span> 
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">false</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>很簡單的小技巧，不過若不懂，就要想很久了：)</p>
<div class='footnotes' id='footnotes-10'>
<div class='footnotedivider'></div>
<ol>
<li id='fn-10-1'> 當然最好是用template，這個只是例子 <span class='footnotereverse'><a href='#fnref-10-1'>&#8617;</a></span></li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://rdescartes.seezone.net/?feed=rss2&#038;p=10</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Keyword Static (Function) [C++ 求生筆記]</title>
		<link>http://rdescartes.seezone.net/?p=7</link>
		<comments>http://rdescartes.seezone.net/?p=7#comments</comments>
		<pubDate>Mon, 07 Apr 2008 19:15:25 +0000</pubDate>
		<dc:creator><![CDATA[rdescartes]]></dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[C++ 求生筆記]]></category>

		<guid isPermaLink="false">http://rdescartes.seezone.net/?p=7</guid>
		<description><![CDATA[有一些 C 的語法，在 C++ 的程序員相對少用。但就是因為這個原因，有時就會忽略了。 假設我們有一個Header檔 Foo.h： 1 2 3 4 5 6 7 8 9 10 &#160; static void f1&#40;&#41; &#123; std::cout &#60;&#60; &#34;f1()&#34; &#60;&#60; std::endl; &#125; &#160; void f2&#40;&#41; &#123; std::cout &#60;&#60; &#34;f2()&#34; &#60;&#60; std::endl; &#125; f1 和 f2 的分別在於 static 這個 keyword 。在這裡的 f1 被宣告和定義(declare)1為 static ，是指它只在這個Compilation Unit中生效。而 f2 沒有被定義為 static ，亦即是它可以被其他 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>有一些 C 的語法，在 C++ 的程序員相對少用。但就是因為這個原因，有時就會忽略了。<br />
假設我們有一個Header檔 Foo.h：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;">&nbsp;
<span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> f1<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;f1()&quot;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> f2<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;f2()&quot;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>f1 和 f2 的分別在於 <strong>static</strong> 這個 keyword 。在這裡的 f1 被宣告和定義(declare)<sup class='footnote'><a href='#fn-7-1' id='fnref-7-1' onclick='return fdfootnote_show(7)'>1</a></sup>為 static ，是指它只在這個Compilation Unit中生效。而 f2 沒有被定義為 static ，亦即是它可以被其他 Compilation Unit 訪問。</p>
<p>但到底什麼是 Compilation Unit呢?? 首先，一個程式編譯過程如下：</p>
<p><a href='http://rdescartes.seezone.net/wp-content/uploads/2008/04/compliation_process.gif' title='compliation process'><img src='http://rdescartes.seezone.net/wp-content/uploads/2008/04/compliation_process.gif' alt='compliation process' /></a></p>
<p>這裡的 a.cpp , b.cpp 和 c.cpp 也 引入<sup class='footnote'><a href='#fn-7-2' id='fnref-7-2' onclick='return fdfootnote_show(7)'>2</a></sup>了Foo.h 這個檔案，經過預處理器<sup class='footnote'><a href='#fn-7-3' id='fnref-7-3' onclick='return fdfootnote_show(7)'>3</a></sup>後，Foo.h的內容會被加入到 a.cpp, b.cpp 和 c.cpp 中，再經過編譯器<sup class='footnote'><a href='#fn-7-4' id='fnref-7-4' onclick='return fdfootnote_show(7)'>4</a></sup>，變成為 a.o , b.o 和 c.o 這些目的碼<sup class='footnote'><a href='#fn-7-5' id='fnref-7-5' onclick='return fdfootnote_show(7)'>5</a></sup>，最後經過連結器<sup class='footnote'><a href='#fn-7-6' id='fnref-7-6' onclick='return fdfootnote_show(7)'>6</a></sup>，變成執行檔<sup class='footnote'><a href='#fn-7-7' id='fnref-7-7' onclick='return fdfootnote_show(7)'>7</a></sup>。</p>
<p>要留意的地方是，每個經過預處理器處理後的.cpp 檔，和它的目的檔是一一對應的，而Compilation Unit，就是這些被處理後的.cpp 檔了。</p>
<p>若以Foo.h 的 f1 為例子，雖然在每個 .cpp 檔也被定義了，但經過編譯後，所有的f1 也會被隱藏在自己的目的檔中，連結器在找尋symbol的過程中，是會忽略的。</p>
<p>但f2 就不同了，所有的f2 在目的檔中，也是不會被隱藏，所以在連結器找尋symbol，會找到多份的f2，那就會有連結器錯誤<sup class='footnote'><a href='#fn-7-8' id='fnref-7-8' onclick='return fdfootnote_show(7)'>8</a></sup> 了。</p>
<p>所以在大部份的情況下，在Header檔中定義函數<sup class='footnote'><a href='#fn-7-9' id='fnref-7-9' onclick='return fdfootnote_show(7)'>9</a></sup>，也是需要static 這個keyword 的。就算加上了inline，情況也是一樣的。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">inline</span> <span style="color: #0000ff;">void</span> f3<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;f3() is called&quot;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<div class='footnotes' id='footnotes-7'>
<div class='footnotedivider'></div>
<ol>
<li id='fn-7-1'> 宣告(declare)和定義(define)的分別，也是一個很好的課題 <span class='footnotereverse'><a href='#fnref-7-1'>&#8617;</a></span></li>
<li id='fn-7-2'> include <span class='footnotereverse'><a href='#fnref-7-2'>&#8617;</a></span></li>
<li id='fn-7-3'> Preprocessor <span class='footnotereverse'><a href='#fnref-7-3'>&#8617;</a></span></li>
<li id='fn-7-4'> compiler <span class='footnotereverse'><a href='#fnref-7-4'>&#8617;</a></span></li>
<li id='fn-7-5'> Object files <span class='footnotereverse'><a href='#fnref-7-5'>&#8617;</a></span></li>
<li id='fn-7-6'> Linker <span class='footnotereverse'><a href='#fnref-7-6'>&#8617;</a></span></li>
<li id='fn-7-7'> Executable <span class='footnotereverse'><a href='#fnref-7-7'>&#8617;</a></span></li>
<li id='fn-7-8'> 或者是警告(warning) <span class='footnotereverse'><a href='#fnref-7-8'>&#8617;</a></span></li>
<li id='fn-7-9'> 這裡的是指Free Function，而不是Member Method <span class='footnotereverse'><a href='#fnref-7-9'>&#8617;</a></span></li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://rdescartes.seezone.net/?feed=rss2&#038;p=7</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Keyword Template [C++ 求生筆記]</title>
		<link>http://rdescartes.seezone.net/?p=6</link>
		<comments>http://rdescartes.seezone.net/?p=6#comments</comments>
		<pubDate>Fri, 04 Apr 2008 17:42:07 +0000</pubDate>
		<dc:creator><![CDATA[rdescartes]]></dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[C++ 求生筆記]]></category>

		<guid isPermaLink="false">http://rdescartes.seezone.net/?p=6</guid>
		<description><![CDATA[作為一個C++程序員，C++ 這語言本身的認識，是很重要的。有時，有一些語法和守則，因為太少接觸和應用，所以會完全忽略了。希望這個C++ 求生筆記系列，可以給大家參考和交流一下。 今天先說一下這個keyword：template，一個簡單的使用如下： 1 2 3 4 5 6 7 8 9 10 11 12 template &#60; typename T &#62; class Foo &#123; public: template &#60;typename R&#62; R Func&#40;&#41; &#123; return R&#40;&#41;; &#125; &#125;; 這一段程序定義了一個Template1 Class和一個Template Function，以下是使用它時的代碼： 1 2 Foo&#60;int&#62; foo; foo.Func&#60;float&#62;&#40;&#41;; 實例化(instantiate)了Foo，再實例化了Func，很簡單，對吧。 另一個使用template的時候，是比較少用到的 template template parameter： 1 2 3 4 5 6 7 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>作為一個C++程序員，C++ 這語言本身的認識，是很重要的。有時，有一些語法和守則，因為太少接觸和應用，所以會完全忽略了。希望這個C++ 求生筆記系列，可以給大家參考和交流一下。</p>
<p>今天先說一下這個keyword：<b>template</b>，一個簡單的使用如下：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span>
    <span style="color: #0000ff;">typename</span> T
    <span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">class</span> Foo
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
        <span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">typename</span> R<span style="color: #000080;">&gt;</span>
        R Func<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">return</span> R<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span> 
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>這一段程序定義了一個Template<sup class='footnote'><a href='#fn-6-1' id='fnref-6-1' onclick='return fdfootnote_show(6)'>1</a></sup> Class和一個Template Function，以下是使用它時的代碼：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;">Foo<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> foo<span style="color: #008080;">;</span>
foo.<span style="color: #007788;">Func</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">float</span><span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>實例化(instantiate)了Foo，再實例化了Func，很簡單，對吧。</p>
<p>另一個使用template的時候，是比較少用到的 <b>template template parameter</b>：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span>
    <span style="color: #0000ff;">typename</span> T      
    , <span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> S<span style="color: #000080;">&gt;</span> <span style="color: #0000ff;">class</span> C 
    <span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">class</span> Bar
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
        C<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span> Func<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">return</span> C<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
Bar<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span>, Foo<span style="color: #000080;">&gt;</span> bar<span style="color: #008080;">;</span>
bar.<span style="color: #007788;">Func</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Should return a Foo&lt;int&gt; Object</span></pre></td></tr></table></div>

<p>Bar 以一個typename 和一個 template Class 作為它的template 參數，在此例子中就是int和我們之前定義的Foo。所以，Bar::Func的返回值，就是Foo&lt;int&gt;。這個應用其實不難看到的，在一些講解C++ Template 的書中也有提及。</p>
<p>最後我想講的是這個：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T, <span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> S<span style="color: #000080;">&gt;</span> <span style="color: #0000ff;">class</span> C <span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">class</span> Blah
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
        T Func<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #666666;">// Calling Foo&lt;int&gt;::Func&lt;int&gt;</span>
            <span style="color: #0000ff;">return</span> C<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>.<span style="color: #0000ff;">template</span> Func<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
Blah<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span>, Foo<span style="color: #000080;">&gt;</span> blah<span style="color: #008080;">;</span>
blah.<span style="color: #007788;">Func</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>和Bar 一樣，C<T> 會被實例化為Foo<int>，而在Blah::Func 中的：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;">C<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>.<span style="color: #0000ff;">template</span> Func<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span></pre></td></tr></table></div>

<p>就是去呼叫(call) Foo&lt;int&gt;::Func&lt;int&gt;，但為什麼要加上template 呢??<sup class='footnote'><a href='#fn-6-2' id='fnref-6-2' onclick='return fdfootnote_show(6)'>2</a></sup>，因為在編譯器角度，Func可以是類型(Type)，可以是變數(Variable)，也可以是其他東西，它需要知道它是什麼才可以正確編譯<sup class='footnote'><a href='#fn-6-3' id='fnref-6-3' onclick='return fdfootnote_show(6)'>3</a></sup>。所以就有了keyword template 的這種用法了<sup class='footnote'><a href='#fn-6-4' id='fnref-6-4' onclick='return fdfootnote_show(6)'>4</a></sup>。</p>
<p>有時我覺得，C++真的很博大精深，經常會想到一句名句：「知道得越多，就會知道得越少！」</p>
<div class='footnotes' id='footnotes-6'>
<div class='footnotedivider'></div>
<ol>
<li id='fn-6-1'> 我本人不太喜歡模板化這個字，所以不用了 <span class='footnotereverse'><a href='#fnref-6-1'>&#8617;</a></span></li>
<li id='fn-6-2'> 事實上，若你不加上template這個keyword，在Visual Studio中是可以的，但這是VS不跟C++ Standard的例子之一:)  <span class='footnotereverse'><a href='#fnref-6-2'>&#8617;</a></span></li>
<li id='fn-6-3'> typename 的使用相同 <span class='footnotereverse'><a href='#fnref-6-3'>&#8617;</a></span></li>
<li id='fn-6-4'> 我也是最近才知道得比較清楚 <span class='footnotereverse'><a href='#fnref-6-4'>&#8617;</a></span></li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://rdescartes.seezone.net/?feed=rss2&#038;p=6</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>新的網誌</title>
		<link>http://rdescartes.seezone.net/?p=5</link>
		<comments>http://rdescartes.seezone.net/?p=5#comments</comments>
		<pubDate>Thu, 03 Apr 2008 07:14:39 +0000</pubDate>
		<dc:creator><![CDATA[rdescartes]]></dc:creator>
				<category><![CDATA[雜項]]></category>
		<category><![CDATA[HongKong Coding Game]]></category>

		<guid isPermaLink="false">http://rdescartes.seezone.net/?p=5</guid>
		<description><![CDATA[最近每天也在追看Milo的網誌，發覺真的學到許多東西。當年和他討論過((好像很多年前的事了&#8230;))，為什麼香港的遊戲業不怎麼發展。有很大部份原因是，大家的交流實在是太少了。 回想自己在這幾年由不同人身上，學到了不少有關遊戲編程相關的知識， 所以我決定開始這個新的網誌，專注地寫下我所知道的，希望能和大家交流一下。]]></description>
				<content:encoded><![CDATA[<p>最近每天也在追看<a href="http://miloyip.seezone.net/" target="_blank">Milo</a>的網誌，發覺真的學到許多東西。當年和他討論過((好像很多年前的事了&#8230;))，為什麼香港的遊戲業不怎麼發展。有很大部份原因是，大家的交流實在是太少了。</p>
<p>回想自己在這幾年由不同人身上，學到了不少有關遊戲編程相關的知識， 所以我決定開始這個新的網誌，專注地寫下我所知道的，希望能和大家交流一下。</p>
]]></content:encoded>
			<wfw:commentRss>http://rdescartes.seezone.net/?feed=rss2&#038;p=5</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
