<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><id>tag:blogger.com,1999:blog-9307457</id><updated>2009-09-27T21:45:03.835+08:00</updated><title type="text">Yukuan's Blog</title><subtitle type="html">readings, thinkings, feelings, ideas, etc. by Yukuan</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://yukuan.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default?start-index=26&amp;max-results=25" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>136</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><geo:lat>25.023264272</geo:lat><geo:long>121.480796928</geo:long><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /><logo>http://creativecommons.org/images/public/somerights20.gif</logo><link rel="self" href="http://feeds.feedburner.com/YukuanBlog" type="application/atom+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><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry><id>tag:blogger.com,1999:blog-9307457.post-4644663785633257874</id><published>2009-02-01T23:34:00.013+08:00</published><updated>2009-02-09T21:03:55.308+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="font" /><category scheme="http://www.blogger.com/atom/ns#" term="imaging" /><category scheme="http://www.blogger.com/atom/ns#" term="YAML" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><title type="text">The Menu Show</title><link rel="replies" type="application/atom+xml" href="http://yukuan.blogspot.com/feeds/4644663785633257874/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9307457&amp;postID=4644663785633257874" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/4644663785633257874" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/4644663785633257874" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/2009/02/menu-show.html" title="The Menu Show" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="02706741974215371075" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">

接連多日的年假已接近尾聲，吃吃喝喝之餘，很自然地就想到一個跟吃喝有關的練習。雖然年假前在公司搞的相框產品確實用到各式 UI 選單（menu），但我在這裡要聊的是名副其實的菜單（menu）。




為了製作精美的菜單，我用 Google 搜來幾張食物的圖片準備用作底圖，除了一張用作食物主選單底圖外，其餘三張分別用作飲料類、水果類和蔬菜類等用途。

考慮到要製作的菜單不只一張，且每張菜單的內容會一直修改，所以我不打算用繪圖軟體繪製菜單，這個重任當然要照慣例，委託給爬說語。要執行這支程式，必須先以 YAML 語法，利用文字編輯器寫下菜單的內容及呈現方式，存成 menu.yaml 。程式執行時會自動讀進這個描述檔，然後描繪出期望的菜單來。例如說，有張菜單長成這樣：



這是一張飲料類的菜單，它有 Coffee, Juice, Soda Water, Tea 等選項，要產生這張菜單， &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=QMPBZOrQafM:Zc6v8sxZu20:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=QMPBZOrQafM:Zc6v8sxZu20:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=QMPBZOrQafM:Zc6v8sxZu20:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=QMPBZOrQafM:Zc6v8sxZu20:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content></entry><entry><id>tag:blogger.com,1999:blog-9307457.post-5722195176587884219</id><published>2008-07-13T17:35:00.004+08:00</published><updated>2009-07-04T21:27:39.125+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="notation" /><category scheme="http://www.blogger.com/atom/ns#" term="embedded" /><category scheme="http://www.blogger.com/atom/ns#" term="storage" /><category scheme="http://www.blogger.com/atom/ns#" term="Flash" /><title type="text">Commands of the NAND</title><link rel="replies" type="application/atom+xml" href="http://yukuan.blogspot.com/feeds/5722195176587884219/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9307457&amp;postID=5722195176587884219" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/5722195176587884219" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/5722195176587884219" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/2008/07/commands-of-nand.html" title="Commands of the NAND" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="02706741974215371075" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">

到電子商場逛一圈就會發現一堆產品都有 NAND flash 的身影（例如大拇哥，記憶卡，MP3 player，數位相框，甚至 PC 等）。前陣子和 simayi 閒聊時，他就提到：既然大家都愛用 NAND flash ，要是有人為它搞個 IP 或函式庫之類的，勢必可大幅節省開發時間。



相信處理過 NAND flash 的 firmware 人員，在啃讀 datasheet 的過程，難免得謹慎地交叉比對，好好推敲那也佔了不少篇幅的時序圖，以免自己還是不夠小心，誤解文意……

不知道大家看了那一疊 waveform 後，有什麼感想？我的看法是，那疊圖雖補足了許多重要細節，卻沒能好好強調重點，抽象度不夠。這根本是在折磨 firmware 人員，使我們構思演算法時綁手綁腳。

因此，在 K 完文件後，我為這疊 command waveforms 作的第一件事就是－－提昇抽象度，強調重點&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=_kVEVfGkem0:7O2ei0FiJE0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=_kVEVfGkem0:7O2ei0FiJE0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=_kVEVfGkem0:7O2ei0FiJE0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=_kVEVfGkem0:7O2ei0FiJE0:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content></entry><entry><id>tag:blogger.com,1999:blog-9307457.post-845738574851864744</id><published>2008-06-30T01:04:00.005+08:00</published><updated>2009-07-04T21:27:18.846+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="embedded" /><category scheme="http://www.blogger.com/atom/ns#" term="storage" /><category scheme="http://www.blogger.com/atom/ns#" term="Flash" /><title type="text">NAND Flash 簡介</title><link rel="replies" type="application/atom+xml" href="http://yukuan.blogspot.com/feeds/845738574851864744/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9307457&amp;postID=845738574851864744" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/845738574851864744" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/845738574851864744" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/2008/06/nand-flash.html" title="NAND Flash 簡介" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="02706741974215371075" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">

撬開一張 SD 卡，裡面最顯眼的，當然就是那大大一顆的 NAND flash ，我們餵給 SD 卡的資料都儲存在裡面；在 NAND flash 旁邊，還可看到一顆小一號的，那就是 controller IC ， 要確保資料的儲存是安全可靠的，有九成的責任都要算在 controller 身上。



在硬體介面方面， NAND Flash 雖有 bus 結構，卻沒去區分 address bus 及 data bus 。在 NAND Flash 上進行任何操作（如 read, write, erase 等），都要透過 command ，且無論 address, data, 或 command，都以同一組 I/O bus 傳輸。

此外， NAND flash 在資料 program 或保存過程，還會隨機出錯，所以廠商才會建議搭配 ECC (Error Correcting Coding)&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=k_Xdolabkyo:Ul-SVAJCiZg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=k_Xdolabkyo:Ul-SVAJCiZg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=k_Xdolabkyo:Ul-SVAJCiZg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=k_Xdolabkyo:Ul-SVAJCiZg:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content></entry><entry><id>tag:blogger.com,1999:blog-9307457.post-3643895506916889954</id><published>2008-06-16T02:24:00.005+08:00</published><updated>2009-05-20T11:23:35.665+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="NVRAM" /><category scheme="http://www.blogger.com/atom/ns#" term="embedded" /><category scheme="http://www.blogger.com/atom/ns#" term="Flash" /><category scheme="http://www.blogger.com/atom/ns#" term="EEPROM" /><title type="text">The Floating Gate</title><link rel="replies" type="application/atom+xml" href="http://yukuan.blogspot.com/feeds/3643895506916889954/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9307457&amp;postID=3643895506916889954" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/3643895506916889954" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/3643895506916889954" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/2008/06/floating-gate.html" title="The Floating Gate" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="02706741974215371075" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><content type="html">

浮動閘（floating gate）一詞會讓我銘記於心，是因為閱讀了《矽眼》，該書提到以浮動閘紀錄類神經元突觸加權值，這是「類比」儲存的一個應用。

然而，對多數內嵌系統設計人員來說，浮動閘是用在「數位」儲存的，諸如 EPROM, EEPROM, NOR flash, NAND flash 等。



無論是 EPROM, EEPROM 或 NOR flash ，早先都是設計來在上面直接跑程式的（不用 copy 到 RAM 上跑，術語叫做 execute in place, XIP），所以有獨立的 data bus 及 address bus 。

為了省空間，後來很多 MCU 都把 EPROM, EEPROM 或 NOR flash 包進同一棵 chip 了，這造成外部的 EEPROM 或 Flash 開始走 serial 路線。 serial EEPROM 或 serial &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=GaGj5w2vR6c:bfPDMMTZ5sE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=GaGj5w2vR6c:bfPDMMTZ5sE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=GaGj5w2vR6c:bfPDMMTZ5sE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=GaGj5w2vR6c:bfPDMMTZ5sE:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content></entry><entry><id>tag:blogger.com,1999:blog-9307457.post-2270319920298148169</id><published>2008-06-07T20:57:00.009+08:00</published><updated>2009-07-04T19:29:15.564+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="embedded" /><category scheme="http://www.blogger.com/atom/ns#" term="graphics" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><category scheme="http://www.blogger.com/atom/ns#" term="math" /><title type="text">The Analog Clock</title><link rel="replies" type="application/atom+xml" href="http://yukuan.blogspot.com/feeds/2270319920298148169/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9307457&amp;postID=2270319920298148169" title="20 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/2270319920298148169" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/2270319920298148169" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/2008/06/analog-clock.html" title="The Analog Clock" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="02706741974215371075" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">20</thr:total><content type="html">


……秒針急急忙忙的去撥動每一根短棒，使它們產生意義。然後分針慢吞吞的做同樣的事，使那些短棒產生另一種意義。三種針的位置和關係不斷變更，在錶面上切割出許多角來，夾住那不可捉摸的時間。……（摘自作文七巧：P86）




算一算日子，在現任公司混吃也有九個月了。很幸運的，一進來就參與一顆 ASIC 的開發，從一開始的寫 tools 測試 FPGA 功能，後來的寫 f/w 測試 ASIC ，到最後的參與產品開發。照規劃，一開始只打算拿來秀秀圖，偶爾也秀秀時間日期。後來為了把這顆小 MCU 的能耐完全壓榨出來，前些日子我還幫它加了類比鐘（Analog Clock）。自此，相框就不再僅僅只是相框了：



想起專科的畢業專題，我實作過一組函式庫，用來執行 3D 投影及相關的座標轉換。一晃眼已經十多年了，最近為了完成的這個類比鐘，竟然連描點畫線的程式都得自己手寫……
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=xpboexNLlyE:ddwMQRUelBU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=xpboexNLlyE:ddwMQRUelBU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=xpboexNLlyE:ddwMQRUelBU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=xpboexNLlyE:ddwMQRUelBU:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content></entry><entry><id>tag:blogger.com,1999:blog-9307457.post-4207247199327780287</id><published>2008-05-19T00:13:00.003+08:00</published><updated>2009-08-09T16:28:13.716+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="embedded" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><category scheme="http://www.blogger.com/atom/ns#" term="math" /><title type="text">The Fraction from a Decimal</title><link rel="replies" type="application/atom+xml" href="http://yukuan.blogspot.com/feeds/4207247199327780287/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9307457&amp;postID=4207247199327780287" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/4207247199327780287" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/4207247199327780287" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/2008/05/fraction-from-decimal.html" title="The Fraction from a Decimal" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="02706741974215371075" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><content type="html">定點數運算常用於 embedded systems 中，因為大部分低階的 MCU （例如： 8051, PIC, AVR 等）開發環境雖提供浮點運算，卻是軟體模擬的，除了慢，還明顯佔用原本就少得可憐的記憶體空間。 C/C++ 語言雖無定點數運算專用語法，程式員卻可通過手動調整，有效以整數運算完成相同效果。



定點數運作的原理，簡言之，就是將原來的實數（real number）或者小數（decimal），改寫成分數（fraction）：如果 x 是個含小數的實數，我們可以找來兩個整數（p, q），將它們相除，來近似原來的 x （p/q ~= x）。

實務上人們可能還會要求上述的 q 要是 2 的冪次，因為電腦處理的都是 0, 1 的二進位運算， q 表示成 2 的冪次可以達到較高的精度；另一個原因我想是許多 f/w 程式員都患了 shift 偏執症 :p

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=niTZXypM-gY:QhNW987cLb4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=niTZXypM-gY:QhNW987cLb4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=niTZXypM-gY:QhNW987cLb4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=niTZXypM-gY:QhNW987cLb4:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content></entry><entry><id>tag:blogger.com,1999:blog-9307457.post-6838892787610903341</id><published>2008-05-12T00:41:00.006+08:00</published><updated>2009-02-02T00:49:37.969+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="parser" /><category scheme="http://www.blogger.com/atom/ns#" term="compiler" /><title type="text">Parser Generators</title><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/6838892787610903341" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/6838892787610903341" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/2008/05/parser-generators.html" title="Parser Generators" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="02706741974215371075" /></author><content type="html">

在軟體開發過程，我們很可能得寫大量的程式碼來完成一些繁瑣、平凡的工作，避開這個窠臼的辦法就是「自動化」。誠如 Kernighan 和 Pike 在 The Practice of Programming 一書所闡述的，優秀的軟體設計運用幾個基本原則：簡單（simplicity）、清晰（clarity）、一般性（generality）、自動化（automation）。




舉個例子， IC designers 常會跟 f/w 人員一起關起門來，私下協調出各種用途的 registers （memory mapped I/O），這些開放給 f/w 人員使用的 register 介面，會有一份以 Verilog 形式存在，另一份則以 C code 的形式存在，在 IC 開發過程，這些 registers 會經歷多次的變更（例如改名字、改位址、添加 registers、刪減 &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=v8KD9EgVExE:WORsPu0S3YQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=v8KD9EgVExE:WORsPu0S3YQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=v8KD9EgVExE:WORsPu0S3YQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=v8KD9EgVExE:WORsPu0S3YQ:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content></entry><entry><id>tag:blogger.com,1999:blog-9307457.post-1274112881148850878</id><published>2008-04-13T14:45:00.003+08:00</published><updated>2008-07-13T17:53:19.547+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="notation" /><category scheme="http://www.blogger.com/atom/ns#" term="compiler" /><title type="text">Phases of a Compiler</title><link rel="replies" type="application/atom+xml" href="http://yukuan.blogspot.com/feeds/1274112881148850878/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9307457&amp;postID=1274112881148850878" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/1274112881148850878" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/1274112881148850878" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/2008/04/phases-of-compiler.html" title="Phases of a Compiler" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="02706741974215371075" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><content type="html">先前曾經探討，像我們這種靠寫程式混吃的，最好備有兩把刷子，當發現其中一把刷子無法刷掉問題時，趕緊換上另一把刷刷看。通常一次只要用上一把，就可以把問題刷掉，偏偏有些問題比較棘手，要同時用上兩把刷子，左右開弓，才刷得乾淨！



這些要左右開弓的問題中，有個最典型的例子，那就是實作一個程式語言的編譯器（Compiler），它運作時恰好要經歷「分析」及「合成」兩個階段，這實在太妙了，所以我將它整理整理，簡述如下：


Analysis Phases
  
  Linear Analysis
    
    alias: scanning, lexical analysis
    output: token stream
    language: Regular Expression
    
  Hierarchical Analysis
    
    alias: parsing,&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=tGV0Hb3wxUo:_hlNwUyUkas:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=tGV0Hb3wxUo:_hlNwUyUkas:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=tGV0Hb3wxUo:_hlNwUyUkas:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=tGV0Hb3wxUo:_hlNwUyUkas:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content></entry><entry><id>tag:blogger.com,1999:blog-9307457.post-8398263842293210670</id><published>2008-04-13T13:43:00.010+08:00</published><updated>2009-07-04T19:33:00.931+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="concept" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><title type="text">Two Ways to Solve a Problem</title><link rel="replies" type="application/atom+xml" href="http://yukuan.blogspot.com/feeds/8398263842293210670/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9307457&amp;postID=8398263842293210670" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/8398263842293210670" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/8398263842293210670" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/2008/04/two-ways-to-solve-problem.html" title="Two Ways to Solve a Problem" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="02706741974215371075" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><content type="html">這些年下來，我反覆觀察到一個現象：程式員各有一套慣用的方法來克服自己遭遇到的問題，這些解題習慣可區分成兩種，工程師多只專精其一，只有少數能任意在兩者間自在地切換。

在很多情況下，無論程式員採用哪種作法，都可輕易把問題解掉；但是另有一些問題，卻不是這樣隨性而為就解得掉的－－這就值得我們好好玩味了……



以 1..n 的正整數相加這個例子來說，我知道程式員應該利用現成的副程式，以爬說語來寫，應該要長成這樣：


n = 100
y = sum(range(1, n+1))


假裝我們沒有現成的，像 sum 這樣的副程式可用。那麼，一種可能的寫法如下：


y = 0
for i in range(1, n+1):
    y += i


這是標準的合成（Synthesis）法。以這個例子來說，如果不考慮時間複雜度要 O(n) ，&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=EUcmD2xJYuE:EjgVqKtEOSc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=EUcmD2xJYuE:EjgVqKtEOSc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=EUcmD2xJYuE:EjgVqKtEOSc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=EUcmD2xJYuE:EjgVqKtEOSc:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content></entry><entry><id>tag:blogger.com,1999:blog-9307457.post-6714779410377296064</id><published>2008-04-12T16:00:00.003+08:00</published><updated>2008-06-07T22:03:15.425+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SCM" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title type="text">Make a Secure Code Server</title><link rel="replies" type="application/atom+xml" href="http://yukuan.blogspot.com/feeds/6714779410377296064/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9307457&amp;postID=6714779410377296064" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/6714779410377296064" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/6714779410377296064" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/2008/04/make-secure-code-server.html" title="Make a Secure Code Server" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="02706741974215371075" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">來這混吃也七個月有餘了，初到公司時正逢新 IC 開發，我受命寫了工具程式以驗證功能，完成了 Boot Loader 以執行外部程式，也開發了應用產品的 firmware 以提供下游客戶 total solution ～～ 

接單量產、功能穩定後，準備接手的同事人竟然在新竹－－先前架的 code server 一直都只在台北這邊的內網使用，安全無虞，現在既然要跨到外網了，當然得提防封包被監聽……



原先架設的版本控制系統 SVN 及搭配的問題追蹤系統 Trac ，兩者都是透過 HTTP 協定和用戶端連線，現在為了隱密地傳輸資料，最直接的方案就是改走 HTTPS （HTTP over SSL）協定。

要讓我們的網頁伺服器 Apache 支援 HTTPS ，最省事的作法就是安裝 Apache 時就採用整合了 SSL 的安裝包。很不巧的是我之前用的安裝包是 no_ssl 的版本，&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=Yoi7Z7SjpGk:hCcFyxTy1IM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=Yoi7Z7SjpGk:hCcFyxTy1IM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=Yoi7Z7SjpGk:hCcFyxTy1IM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=Yoi7Z7SjpGk:hCcFyxTy1IM:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content></entry><entry><id>tag:blogger.com,1999:blog-9307457.post-2298885652326782350</id><published>2008-04-06T17:14:00.007+08:00</published><updated>2009-02-09T21:04:40.435+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="embedded" /><category scheme="http://www.blogger.com/atom/ns#" term="UI" /><title type="text">Fingering of Keys</title><link rel="replies" type="application/atom+xml" href="http://yukuan.blogspot.com/feeds/2298885652326782350/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9307457&amp;postID=2298885652326782350" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/2298885652326782350" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/2298885652326782350" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/2008/04/fingering-of-keys.html" title="Fingering of Keys" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="02706741974215371075" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">按鍵是很普遍的人機介面，也常用於內嵌系統（Embedded Systems）。既然大家那麼愛用按鍵，很自然地， Embedded Systems 軔體開發人員就常常得處理按鍵的偵測、編碼等議題。此外，為了按鍵操作流暢，我們還必須為按鍵設計適當的指法（fingering）及明確、統一的功能定義（function definition）。



不久前筆者設計了一款相框產品，它雖然只有三個按鍵，但除了要能執行基本操作，如上一張、下一張、設定自動換張的間隔時間等；也要能夠流暢地切換功能，如手動換張、自動換張、顯示日期時鐘、功能設定等；此外，最好還能透過這些操作，讓使用者充分感受到它優越的秀圖速度。

老實說，把這些操作通通塞進三個按鍵內並不是多困難的事，比較需要我們傷腦筋的是怎麼讓使用者覺得操作是簡單流暢、符合預期的。

這裡不是要跟你扯怎麼設計美美的畫面，雖然美美的畫面很重要，&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=FeEmOIhgxaA:p-eSfFVXZH8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=FeEmOIhgxaA:p-eSfFVXZH8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=FeEmOIhgxaA:p-eSfFVXZH8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=FeEmOIhgxaA:p-eSfFVXZH8:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content></entry><entry><id>tag:blogger.com,1999:blog-9307457.post-6177798135738957591</id><published>2007-09-25T19:45:00.000+08:00</published><updated>2007-10-03T00:34:52.667+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="concept" /><category scheme="http://www.blogger.com/atom/ns#" term="design" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title type="text">The Art of Design</title><link rel="replies" type="application/atom+xml" href="http://yukuan.blogspot.com/feeds/6177798135738957591/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9307457&amp;postID=6177798135738957591" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/6177798135738957591" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/6177798135738957591" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/2007/09/art-of-design.html" title="The Art of Design" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="02706741974215371075" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">為甚麼好的設計會來自於差的設計呢？ Scott 在 Why Good Design Comes from Bad Design 提到攻讀 CMU Computer Science 博士時選了門介面設計課，第一堂課上他發現一位年輕人素描著隨身聽的各種變異版本，而且圖紙上已經堆積了三、四十種不同考量的版本了。 Scott 於是湊過去問這個小伙子「幹嘛費勁畫那麼多草稿？」，小伙子發楞了好一會才笑著回說：





I don't know what a good idea looks like until I've seen the bad ones.


經過時日洗煉， Scott 後來也體會到當初認為多餘的作法，其背後的精神，他提到：


Each new idea I sketched out was more informed than the last. Each bad idea &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=Xudm3pCkx1A:CNp2d8aLkew:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=Xudm3pCkx1A:CNp2d8aLkew:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=Xudm3pCkx1A:CNp2d8aLkew:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=Xudm3pCkx1A:CNp2d8aLkew:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content></entry><entry><id>tag:blogger.com,1999:blog-9307457.post-5839883265960243537</id><published>2007-09-17T00:47:00.000+08:00</published><updated>2007-09-21T23:27:46.553+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SCM" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title type="text">SVN &amp; Trac Installation 備忘</title><link rel="replies" type="application/atom+xml" href="http://yukuan.blogspot.com/feeds/5839883265960243537/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9307457&amp;postID=5839883265960243537" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/5839883265960243537" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/5839883265960243537" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/2007/09/svn-trac-installation.html" title="SVN &amp; Trac Installation 備忘" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="02706741974215371075" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total><content type="html">上週一（9/10）公司要我把 Subversion 環境架起來。除了很高興公司也打算採行版本控制環境來幫助程式開發外，我還打算一併把 Issue Tracking 系統掛上去。

說起 Issue Tracking System，要跟 Subversion 搭配良好，且一樣是 freeware 的，當然非 Trac 莫屬。細查之下，乖乖， Trac 竟然要裝那麼多相關套件，且各個套件還要挑正確版本，才可運作良好。

為了避免大家（或將來的自己）白走冤枉路，這裡把要安裝的東西及安裝步驟條列於後：




Download

反正就把下列連結清單中的檔案都抓下來，待會再一口氣安裝。


TortoiseSVN-1.4.5.10425-win32-svn-1.4.5.msi
  
  see http://tortoisesvn.net/downloads for other version
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=z2sdoZkgAEA:yXIk6G84dME:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=z2sdoZkgAEA:yXIk6G84dME:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=z2sdoZkgAEA:yXIk6G84dME:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=z2sdoZkgAEA:yXIk6G84dME:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content></entry><entry><id>tag:blogger.com,1999:blog-9307457.post-5433318005871061162</id><published>2007-09-09T19:46:00.001+08:00</published><updated>2008-02-17T15:33:28.354+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI" /><category scheme="http://www.blogger.com/atom/ns#" term="robot" /><category scheme="http://www.blogger.com/atom/ns#" term="review" /><category scheme="http://www.blogger.com/atom/ns#" term="book" /><title type="text">Machine to Transcendent Mind</title><link rel="replies" type="application/atom+xml" href="http://yukuan.blogspot.com/feeds/5433318005871061162/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9307457&amp;postID=5433318005871061162" title="32 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/5433318005871061162" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/5433318005871061162" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/2007/09/machine-to-transcendent-mind.html" title="Machine to Transcendent Mind" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="02706741974215371075" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">32</thr:total><content type="html">

前些日子把讀過的機器人書整理上來後，網友 HuaHua 留言推薦了《機器人：由機器邁向超越人類心智之路》。後來我特地跑一趟政大書城，翻閱後才想起幾個月前也在這翻過。如今再次翻閱，還是沒抱回去好好端詳，最大原因是此書主要內容，我在其他諸如書、網路、或論文等，幾乎都涉獵過。

昨天到國家圖書館，無意間發現該書竟躺在那，頻頻向我招手……嗯，這次當然不能再錯過 ^__^




與其說這是本講機器（人）的書，不如說它是探討人造智能（AI）或電腦及機器智慧（Machine Intelligence）發展潛能的書。


Autonomous Mobile Robots

這本書最合我胃口的是第二章〈小心！前有機器車〉，探討作者對機器自走車的實務經驗。裡面提到作者 Hans Moravec 在 Mobile Robot Laboratory 接受 Denning Mobile Robotics &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=D73xTCljlPk:fx-p4YFp_xs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=D73xTCljlPk:fx-p4YFp_xs:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=D73xTCljlPk:fx-p4YFp_xs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=D73xTCljlPk:fx-p4YFp_xs:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content></entry><entry><id>tag:blogger.com,1999:blog-9307457.post-4116084813621478836</id><published>2007-07-31T22:26:00.000+08:00</published><updated>2007-07-31T22:31:50.290+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="robot" /><category scheme="http://www.blogger.com/atom/ns#" term="book" /><title type="text">Robot Book 閱讀清單</title><link rel="replies" type="application/atom+xml" href="http://yukuan.blogspot.com/feeds/4116084813621478836/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9307457&amp;postID=4116084813621478836" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/4116084813621478836" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/4116084813621478836" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/2007/07/robot-book.html" title="Robot Book 閱讀清單" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="02706741974215371075" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><content type="html">也許拜大廠效應（例如 Google、微軟及鴻海等相繼投入）所賜，也或者只因為熱門 Robot 商品接續問市所致，總覺得這陣子 Robot 愛好者有增多的趨勢。
碰巧這陣子我也 K 了好些 Robot 相關的書，內容包括理論及實作，涵蓋了電子、電機、機械、機構等，趁空檔把這些書整理整理，上來和大家分享 ^__^ 






要買 Robot 書，原文部份，天瓏那有專櫃，大家可以去翻閱翻閱；此外，若水堂那有許多相關簡中書，許多甚至是日文或英文書的中譯本，強烈建議去那瞧瞧，絕對不會讓您失望的。
以下就把我認為值得一讀的幾本列出來供大家參考：




  機器人編程技術-基於行為的機器人實戰指南
  （美）[******]

    
    iRobot 創始人之一 Joe Jones 寫的書，內容不但讓人耳目一新，且提供必要的細節
    原文：Robot
      &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=aiUVu1NIU-M:2lAn0ymxKiY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=aiUVu1NIU-M:2lAn0ymxKiY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=aiUVu1NIU-M:2lAn0ymxKiY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=aiUVu1NIU-M:2lAn0ymxKiY:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content></entry><entry><id>tag:blogger.com,1999:blog-9307457.post-609587386558325622</id><published>2007-07-15T02:26:00.005+08:00</published><updated>2009-08-09T18:58:21.234+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CSV" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><title type="text">Python 與 CSV</title><link rel="replies" type="application/atom+xml" href="http://yukuan.blogspot.com/feeds/609587386558325622/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9307457&amp;postID=609587386558325622" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/609587386558325622" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/609587386558325622" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/2007/07/python-csv.html" title="Python 與 CSV" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="02706741974215371075" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">許多資料，像通訊錄或試算表之類的，很適合列表呈現。而 comma-separated values, CSV是微軟牌視窗軟體存放表格資料常用的檔案格式。這種純文字的檔案格式是以逗號（comma）來為每筆（record）資料的欄位（field）作分隔。



舉個實際的例子，不久前我因論文需要，由 Davis 那取得了 1999 年美國千大企業的董事會成員資料。內容包括這些董事（directors）的公司、職稱、年齡等等。

由於我只關心每間公司的董事有哪些，所以就輕快地以 Python 語寫了一個 function ，要電腦讀入這個 CSV 檔後，順便吐出各公司的董事們：


def LoadBoards_v0(fn='direct99.csv'):
    """Loads directors of companies from a CSV file and
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=RpmlqIhDJAA:0fe8ikt3-78:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=RpmlqIhDJAA:0fe8ikt3-78:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=RpmlqIhDJAA:0fe8ikt3-78:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=RpmlqIhDJAA:0fe8ikt3-78:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content></entry><entry><id>tag:blogger.com,1999:blog-9307457.post-7588975658058285189</id><published>2007-07-01T19:59:00.000+08:00</published><updated>2007-07-04T15:36:21.177+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="graphics" /><category scheme="http://www.blogger.com/atom/ns#" term="simulation" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="Logo" /><title type="text">Logo 也 3D</title><link rel="replies" type="application/atom+xml" href="http://yukuan.blogspot.com/feeds/7588975658058285189/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9307457&amp;postID=7588975658058285189" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/7588975658058285189" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/7588975658058285189" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/2007/07/logo-3d.html" title="Logo 也 3D" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="02706741974215371075" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><content type="html">


前陣子 survey 描述機器動作的程式語言時，看到幾個賣像不錯的 Robot 產品，竟不約而同地，都說
Logo
語。


經過一連串的 google 、到處點閱後發現：原來 Logo 早已跳出原先的認知，不再只是給小朋友玩的烏龜繪圖了！



一直以來，我對 Logo 語言並不陌生，因為手邊好些科普書都有提到，例如：


  
    《電腦如何思考》p53
    ，Hillis 以 Logo 為例子，說明程式語言的威力；
  
  
    《沙地上的圖案》p136
    ，〈作為藝術家的烏龜，The turtle as artist〉這節說明了 Papert 的 Logo 及其
    Turtle
    Geometry ；
  
  
    《MIT
    媒體實驗室》p181 ，提到了控制 LEGO 積木的 Logo 語言；
  
  
    《遊習世紀》&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=jIv9mRbi9XM:ZqOmDl47m1k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=jIv9mRbi9XM:ZqOmDl47m1k:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=jIv9mRbi9XM:ZqOmDl47m1k:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=jIv9mRbi9XM:ZqOmDl47m1k:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content></entry><entry><id>tag:blogger.com,1999:blog-9307457.post-5787839217310517920</id><published>2007-06-23T14:53:00.000+08:00</published><updated>2007-06-23T15:21:53.128+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="soliloquy" /><title type="text">終於通過口試了，呼～</title><link rel="replies" type="application/atom+xml" href="http://yukuan.blogspot.com/feeds/5787839217310517920/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9307457&amp;postID=5787839217310517920" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/5787839217310517920" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/5787839217310517920" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/2007/06/blog-post.html" title="終於通過口試了，呼～" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="02706741974215371075" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><content type="html">突然想起「……什麼什麼道遠的，……」這句話，這條路還真是漫長，果然「畢業遠乎！」。
週四跟口試委員一一握手後，終於可以感受到畢業不遠乎了，呼～


原本這只是個人生涯的小插曲，根本不值一提，不過還是到這昭告一下，讓關心這件事，又不常見面的人為我高興高興 :-)
接下來就收收尾，然後快快樂樂回到街上去（嗯，我果然比較適合沿街混吃，不適合呆在象牙塔內）



Tags: [soliloquy]
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=uGs-KGHDEXM:khY9A19vSOs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=uGs-KGHDEXM:khY9A19vSOs:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=uGs-KGHDEXM:khY9A19vSOs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=uGs-KGHDEXM:khY9A19vSOs:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content></entry><entry><id>tag:blogger.com,1999:blog-9307457.post-6529241354012666551</id><published>2007-05-26T14:31:00.000+08:00</published><updated>2007-06-09T16:47:01.021+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Tags" /><category scheme="http://www.blogger.com/atom/ns#" term="research" /><category scheme="http://www.blogger.com/atom/ns#" term="annotation" /><title type="text">你 diigo 了嗎？</title><link rel="replies" type="application/atom+xml" href="http://yukuan.blogspot.com/feeds/6529241354012666551/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9307457&amp;postID=6529241354012666551" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/6529241354012666551" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/6529241354012666551" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/2007/05/diigo.html" title="你 diigo 了嗎？" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="02706741974215371075" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">9</thr:total><content type="html">最近從 William 在推推王整理的精華區軟體好物那知道了一個很好用的工具 diggo ，使用之下，實在太讓人感動了，忍不住上來推廣。

Diggo 提供的社會性書籤（social bookmarking）服務，是以線上在網頁畫重點、下評註為主軸。


套用 CNET 的話說：「如果在一個 3000 字的文章當中，用戶僅僅只需要一句話，那麼用戶就知道在網站上做記號是一件多麼實用的事情」


  它可以在網頁上用直接畫重點（Highlight），下評註（Add Sticky Note）；
  也可以同時看到別人整理的重點及評註；
  甚至還可以根據劃線的某字句跟大家討論；
  讓人感動的是，它同時也會把你評註過的網頁自動 cached 一份起來（以後看到好文，不用辛苦抓網頁備份了）；
  它還可以把選定的相關 bookmarks 一次抽出各篇有畫重點的字句（Extract &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=yFL8M8KIZqI:Eg-BClQi0NA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=yFL8M8KIZqI:Eg-BClQi0NA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=yFL8M8KIZqI:Eg-BClQi0NA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=yFL8M8KIZqI:Eg-BClQi0NA:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content></entry><entry><id>tag:blogger.com,1999:blog-9307457.post-779470516298169934</id><published>2007-03-07T21:50:00.000+08:00</published><updated>2007-03-10T01:40:02.012+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="BlogTech" /><category scheme="http://www.blogger.com/atom/ns#" term="Blogger" /><title type="text">New Blogger 備忘</title><link rel="replies" type="application/atom+xml" href="http://yukuan.blogspot.com/feeds/779470516298169934/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9307457&amp;postID=779470516298169934" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/779470516298169934" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/779470516298169934" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/2007/03/new-blogger.html" title="New Blogger 備忘" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="02706741974215371075" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><content type="html">年初 Google 在 Blogger Beta 的 Beta 上打叉後，就一直有股感覺，覺得要被強迫升級似的。可是新舊版的版面樣板語法不同，一些土法煉鋼的小玩意都面臨改寫的命運，所以一直沒騰出時間來做這個升級的動作。

這幾天終於決定好好研究一下，費了三天才把這個 Blog 從舊 Blogger 那，移植到新的 Blogger Beta 。

這版的 Blogger 最重要的改進如下：

提供一套更彈性的語法及 AJAX 介面，方便我們設計版面。
template 設計更模組化，可以局部修改。
終於支援 Labels 了。
現在 Comments 也有 Feed 了。
文章編輯列表除了可以換頁外（之前的版本不行），還可以用 label 索引。


不過還是有幾個令人不甚滿意的地方：

語法變得複雜了。
之前 Previous Posts 會根據各個 blog item &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=TFSVqWbRlR8:3yIBdjjYfUU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=TFSVqWbRlR8:3yIBdjjYfUU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=TFSVqWbRlR8:3yIBdjjYfUU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=TFSVqWbRlR8:3yIBdjjYfUU:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content></entry><entry><id>tag:blogger.com,1999:blog-9307457.post-116626497454535558</id><published>2006-12-16T22:52:00.000+08:00</published><updated>2007-05-20T22:25:15.679+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C" /><category scheme="http://www.blogger.com/atom/ns#" term="PWM" /><category scheme="http://www.blogger.com/atom/ns#" term="robot" /><category scheme="http://www.blogger.com/atom/ns#" term="embedded" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title type="text">Motor-controlling PWMs</title><link rel="replies" type="application/atom+xml" href="http://yukuan.blogspot.com/feeds/116626497454535558/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9307457&amp;postID=116626497454535558" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/116626497454535558" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/116626497454535558" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/2006/12/motor-controlling-pwms.html" title="Motor-controlling PWMs" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="02706741974215371075" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><content type="html">一個脈寬調變（Pulse-width Modulation, PWM）訊號可控制一顆 DC motor 轉速，或決定一具 servomotor 的方向、位置或轉速。在複雜的機器人身上，常用上好幾顆馬達，因而能以一顆微控制器（microcontroller, uC）產生多組 PWM 訊號是非常實用的。


前陣子在 RobotFun.net 論壇看到一群機器人愛好者討論自製串列伺服控制器（serial servo controller, SSC）的討論。後來又在 CSZone 的 Robotics 版跟 happosai 及 MasterChang 討論了「以 uC 產生多組 PWM 訊號」的方法。這次就對這個議題作個整理：


Busy Waiting

我們先來看個最直接的作法：

&lt;!--Code List 1--&amp;gt;
 1: // List 1. PWM loop &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=Fd6EK5MB2Hs:UiAwcnaqOxs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=Fd6EK5MB2Hs:UiAwcnaqOxs:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=Fd6EK5MB2Hs:UiAwcnaqOxs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=Fd6EK5MB2Hs:UiAwcnaqOxs:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content></entry><entry><id>tag:blogger.com,1999:blog-9307457.post-116617906002270562</id><published>2006-12-15T18:28:00.001+08:00</published><updated>2009-07-04T21:26:24.996+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="FFT" /><category scheme="http://www.blogger.com/atom/ns#" term="DSP" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="plot" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><title type="text">Analyze the Sunspots</title><link rel="replies" type="application/atom+xml" href="http://yukuan.blogspot.com/feeds/116617906002270562/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9307457&amp;postID=116617906002270562" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/116617906002270562" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/116617906002270562" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/2006/12/analyze-sunspots.html" title="Analyze the Sunspots" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="02706741974215371075" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">
上次以 Python 搭配 matplotlib 改寫張智星老師傅立葉轉換教學例子。後來逛到 Anders Andreasen 的專文，裡面有個分析太陽黑子活動週期的例子，相同的例子竟然也出現在 Mathworks 展示 Matlab FFT 用法的網頁上。既然大家那麼愛用太陽黑子，我也來攪和攪和，再次以 Python 搭配 matplotlib 改寫：






&lt;!--DOCUMENT_FRAGMENT--&amp;gt;
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&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=8tOQbmLfO0k:0Vy2hgwQcX8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=8tOQbmLfO0k:0Vy2hgwQcX8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=8tOQbmLfO0k:0Vy2hgwQcX8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=8tOQbmLfO0k:0Vy2hgwQcX8:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content></entry><entry><id>tag:blogger.com,1999:blog-9307457.post-116617306656820775</id><published>2006-12-15T16:53:00.000+08:00</published><updated>2007-05-16T01:19:09.529+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="robot" /><category scheme="http://www.blogger.com/atom/ns#" term="embedded" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title type="text">Software Anti-interference</title><link rel="replies" type="application/atom+xml" href="http://yukuan.blogspot.com/feeds/116617306656820775/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9307457&amp;postID=116617306656820775" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/116617306656820775" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/116617306656820775" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/2006/12/software-anti-interference.html" title="Software Anti-interference" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="02706741974215371075" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><content type="html">大多數工程製品，零件會變髒、磨損，精密度不如目錄所示。數位電腦是當中的異數，它沒有前述問題，至少它的位元或位元組功能，完全符合廣告宣稱的－－當數位混入類比，一切似乎又要跌回原形……


以機器人來說，它有感測器（sensor）得知類比世界的訊息，訊息處理後，又要餵控制訊號給類比世界的致動器（actuator）。撇開外界原本就混雜各式干擾不說，所使用的致動器，往往就是馬達，其本身是高負載，開關高負載會嚴重干擾控制電路（如果共用電源的話），馬達運轉時，尤其是電刷部份，也會持續產生雜訊。這些雜訊除了會影響感測電路及控制訊號外，有時 uC 本身也會因為這些干擾而錯亂。

為了維持機器正常運作，除了硬體設計時把雜訊納入考量外，軟體也不可坐以待斃。以下整理一些簡單、低階的軟體抗雜訊手段：


對輸入訊號濾波
資料冗餘與查驗（data redundance and verification）
  
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=aITCkhkvpkc:WXXxJtDN_I8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=aITCkhkvpkc:WXXxJtDN_I8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=aITCkhkvpkc:WXXxJtDN_I8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=aITCkhkvpkc:WXXxJtDN_I8:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content></entry><entry><id>tag:blogger.com,1999:blog-9307457.post-116616092091396274</id><published>2006-12-09T01:29:00.001+08:00</published><updated>2009-07-04T21:25:53.295+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="FFT" /><category scheme="http://www.blogger.com/atom/ns#" term="DSP" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="plot" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><title type="text">FFT in Python</title><link rel="replies" type="application/atom+xml" href="http://yukuan.blogspot.com/feeds/116616092091396274/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9307457&amp;postID=116616092091396274" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/116616092091396274" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/116616092091396274" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/2006/12/fft-in-python.html" title="FFT in Python" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="02706741974215371075" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><content type="html">想知道一段訊號的頻譜，實務上我們會運用數位訊號處理，對這段訊號抽樣，得到一段時間序列；並計算時間序列的離散傅立葉轉換（Discrete Fourier transform, DFT）。然後據以估算出離散時間傅立葉轉換（Discrete-time Fourier transform, DTFT），最後再視需要，將頻域橫軸由離散時間的數位頻率（Ωk = ωkTs = 2π fk/Fs）換算回連續時間的訊號頻率（fk）。


張智星老師的 on-line book《音訊處理與辨識》〈離散傅立葉轉換〉這個章節，有許多運用快速傅立葉轉換（Fast Fourier transform, FFT）的教學， FFT 其實就是 DFT 的快速算法。張老師是以 Matlab 作為程式範例；經實際嘗試，我發現可以很容易轉成 Python code ，以下就看看執行結果截圖：



其程式如下：




&lt;!-&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=mJw1cBJ6lZE:TneSuVizTcY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=mJw1cBJ6lZE:TneSuVizTcY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=mJw1cBJ6lZE:TneSuVizTcY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=mJw1cBJ6lZE:TneSuVizTcY:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content></entry><entry><id>tag:blogger.com,1999:blog-9307457.post-116339428043002840</id><published>2006-11-13T12:37:00.002+08:00</published><updated>2009-07-04T21:26:56.022+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="pythonic" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><title type="text">Be Pythonic -- 字正腔圓說 Python</title><link rel="replies" type="application/atom+xml" href="http://yukuan.blogspot.com/feeds/116339428043002840/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9307457&amp;postID=116339428043002840" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/116339428043002840" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9307457/posts/default/116339428043002840" /><link rel="alternate" type="text/html" href="http://yukuan.blogspot.com/2006/11/be-pythonic-python.html" title="Be Pythonic -- 字正腔圓說 Python" /><author><name>York</name><uri>http://www.blogger.com/profile/16278534857437994661</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="02706741974215371075" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><content type="html">

學任一種語言，要說得道地，關鍵是融入語言的風格特色中，體會語言社群的風土，知道他們的慣用法。

既然 Python 寫的 code 有 executable pseudo code 的美稱，想寫出 Pythonic 的 code ，當然要站在一定的高度，讓寫出來的 code 夠 pseudo...


Pythonic 一詞被用來形容合於 Python 慣用法的 code 。Pythonic 的 code 除了讓人們更好理解外，機器執行時，也往往更具效率－－語言設計者會絞盡腦汁最佳化語言慣用法的執行效率。這在 Python 這類高階、動態的語言，尤其明顯 :)

幾個 Pythonic 的準則：


  讓程式結構盡量扁平（flat）
  降低 Loops 的複雜度
    
      少用 counter ，偶爾用一下 iterator
      改採 Functional &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=2z1O7Q17nxE:fd8Fs9_Eu94:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=2z1O7Q17nxE:fd8Fs9_Eu94:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=2z1O7Q17nxE:fd8Fs9_Eu94:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/YukuanBlog?a=2z1O7Q17nxE:fd8Fs9_Eu94:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/YukuanBlog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content></entry></feed>
