<?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"
	>

<channel>
	<title>憂藍夢境‧部落格</title>
	<atom:link href="http://blog.linym.net/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.linym.net</link>
	<description>我的學習心得、筆記</description>
	<pubDate>Mon, 23 Jun 2008 14:59:50 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Firefox 3 擴充套件</title>
		<link>http://blog.linym.net/archives/222</link>
		<comments>http://blog.linym.net/archives/222#comments</comments>
		<pubDate>Wed, 18 Jun 2008 02:03:33 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[軟體筆記]]></category>

		<category><![CDATA[firefox]]></category>

		<category><![CDATA[擴充套件]]></category>

		<guid isPermaLink="false">http://blog.linym.net/?p=222</guid>
		<description><![CDATA[眾所期待的 Firefox 3 總算推出正式版囉！瀏覽網頁速度真的是順暢很多，佔用記憶體也有改善。以下是我目前在 Firefox 3 所安裝的擴充套件列表：

FireGestures
取代 All-in-One Gestures 的滑鼠手勢。
Foxmarks Bookmark Synchronizer
免費提供放 FX 書籤的空間，除了可以同步 FX 書籤外，登入該網站可以線上瀏覽你的書籤。經常在不同電腦工作者必裝。
IE Tab
在 FX 中內嵌 IE 切換功能，非常方便，必裝!
Download Statusbar
下載檔案時直接顯示在下方，不用另外跳出下載管理員。
FireBug
JavaScript 除錯工具，網站開發人員必裝，並且有比 DOM Inspector 更好的 DOM 觀察器。
HTML Validator
驗證網頁是否符合 Web Standards，顯示 error、warning，並有詳細說明。
Web Developer
功能超多的工具，比如關閉 Javascript、解除文字方塊字數限制等等
Google Toolbar
就是 Google 出的工具列，主要是需要他的即時單字翻譯功能，也有 Gmail 新信檢查功能。
QuickDrag
算是 Super DragAndGo 的簡單版本，方便。
Google 記事本
隨時作筆記、擷取網頁內容。




 ]]></description>
			<content:encoded><![CDATA[<p>眾所期待的 <a href="http://www.moztw.org/firefox/">Firefox</a> 3 總算推出正式版囉！瀏覽網頁速度真的是順暢很多，佔用記憶體也有改善。以下是我目前在 Firefox 3 所安裝的擴充套件列表：</p>
<ul>
<li><a href="http://www.xuldev.org/firegestures/">FireGestures</a><br />
取代 All-in-One Gestures 的滑鼠手勢。</li>
<li><a href="http://www.foxmarks.com/download">Foxmarks Bookmark Synchronizer</a><br />
免費提供放 FX 書籤的空間，除了可以同步 FX 書籤外，登入該網站可以線上瀏覽你的書籤。經常在不同電腦工作者必裝。</li>
<li><a href="http://ietab.mozdev.org/">IE Tab</a><br />
在 FX 中內嵌 IE 切換功能，非常方便，必裝!</li>
<li><a href="http://downloadstatusbar.mozdev.org/">Download Statusbar</a><br />
下載檔案時直接顯示在下方，不用另外跳出下載管理員。</li>
<li><a href="http://getfirebug.com/releases/index.html">FireBug</a><br />
JavaScript 除錯工具，網站開發人員必裝，並且有比 DOM Inspector 更好的 DOM 觀察器。</li>
<li><a href="http://users.skynet.be/mgueury/mozilla/download.html">HTML Validator</a><br />
驗證網頁是否符合 Web Standards，顯示 error、warning，並有詳細說明。</li>
<li><a href="http://chrispederick.com/work/web-developer/localization/">Web Developer</a><br />
功能超多的工具，比如關閉 Javascript、解除文字方塊字數限制等等</li>
<li><a href="http://toolbar.google.com/">Google Toolbar</a><br />
就是 Google 出的工具列，主要是需要他的即時單字翻譯功能，也有 Gmail 新信檢查功能。</li>
<li><a href="http://mozilla.ktechcomputing.com/quickdrag/">QuickDrag</a><br />
算是 Super DragAndGo 的簡單版本，方便。</li>
<li><a href="http://www.google.com/notebook/download">Google 記事本</a><br />
隨時作筆記、擷取網頁內容。</li>
</ul>
<p><div style="text-align:center"><script type="text/javascript"><!--
google_ad_client = "pub-3155522443796846";
google_ad_width = 468;
google_ad_height = 60;
google_ad_format = "468x60_as";
google_ad_type = "text_image";
google_ad_channel = "";
google_color_border = "438ECE";
google_color_bg = "ffffff";
google_color_link = "D83B00";
google_color_text = "000000";
google_color_url = "008000";
google_ui_features = "rc:10";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div><br /></p> ]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/222/feed</wfw:commentRss>
		</item>
		<item>
		<title>IE 下載 Office 2007 檔案變成 zip</title>
		<link>http://blog.linym.net/archives/221</link>
		<comments>http://blog.linym.net/archives/221#comments</comments>
		<pubDate>Tue, 17 Jun 2008 16:33:50 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[Windows]]></category>

		<category><![CDATA[系統筆記]]></category>

		<category><![CDATA[Apache]]></category>

		<category><![CDATA[Server]]></category>

		<category><![CDATA[教學]]></category>

		<guid isPermaLink="false">http://blog.linym.net/?p=221</guid>
		<description><![CDATA[如果您的 Web Server 是採用 Apache，那有可能使用 Internet Explorer 下載 Office 2007(docx、ppts、xlsx&#8230;) 檔案的時候，會發現副檔名自動變成 .zip，有以下解決方法(擇一即可)：
一、修改 mime.types 檔案
加入：
application/vnd.openxmlformats    docx pptx xlsx
二、修改 httpd.conf 檔案
加入：
AddType  application/vnd.openxmlformats  .docx .pptx .xlsx
三、使用 .htaccess
加入：
AddType  application/vnd.openxmlformats  .docx .pptx .xlsx
參考文章：Office 2007 MIME types for Apache 
]]></description>
			<content:encoded><![CDATA[<p>如果您的 Web Server 是採用 Apache，那有可能使用 Internet Explorer 下載 Office 2007(docx、ppts、xlsx&#8230;) 檔案的時候，會發現副檔名自動變成 .zip，有以下解決方法(擇一即可)：</p>
<p><strong>一、修改 mime.types 檔案</strong><br />
加入：</p>
<blockquote><p>application/vnd.openxmlformats    docx pptx xlsx</p></blockquote>
<p><strong>二、修改 httpd.conf 檔案</strong><br />
加入：</p>
<blockquote><p>AddType  application/vnd.openxmlformats  .docx .pptx .xlsx</p></blockquote>
<p><strong>三、使用 .htaccess</strong><br />
加入：</p>
<blockquote><p>AddType  application/vnd.openxmlformats  .docx .pptx .xlsx</p></blockquote>
<p>參考文章：<a href="http://www.vladville.com/2007/04/office-2007-mime-types-for-apache.html">Office 2007 MIME types for Apache </a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/221/feed</wfw:commentRss>
		</item>
		<item>
		<title>[CSS]滑鼠移過表格列變色及附加連結效果</title>
		<link>http://blog.linym.net/archives/219</link>
		<comments>http://blog.linym.net/archives/219#comments</comments>
		<pubDate>Sat, 08 Mar 2008 05:06:43 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[網頁設計]]></category>

		<category><![CDATA[css]]></category>

		<category><![CDATA[Web 2.0]]></category>

		<category><![CDATA[標準]]></category>

		<category><![CDATA[網頁]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/219</guid>
		<description><![CDATA[老實說這個標題不知道要怎麼下比較好理解。我想要滑鼠移過表格某一列時會變色，而且不只超連結的文字可以點，而是整列都有連結效果&#8230;.囧&#8230;先直接看 Demo 吧！
要達到這種效果，很多教學都是使用 JavaScript 裡的 onmouseover、onmouseout 及 onclick 事件來達成，不過現在有純 CSS 的解法，並且通用多數瀏覽器，這個技巧其實在很多國外網站看過，不過昨天向艾德請教之後才真正學起來^^
#tb td a {&#160;&#160; &#160;display: block;&#160;&#160; &#160;height: 35px;&#160;&#160; &#160;line-height: 35px;&#160;&#160; &#160;background: #FFF9E0;}#tb td a:hover {&#160;&#160; &#160;background: #E2D9B2;}
關鍵就是使用 display: block 將 a 顯示為區塊元素，然後依照需求設個高度或寬度給它即可，line-height 給予相同高度可以確保文字垂直置中，這樣比使用 JavaScript 方便多囉。
]]></description>
			<content:encoded><![CDATA[<p>老實說這個標題不知道要怎麼下比較好理解。我想要滑鼠移過表格某一列時會變色，而且不只超連結的文字可以點，而是整列都有連結效果&#8230;.囧&#8230;先直接看 <a href='http://blog.linym.net/wp-content/uploads/2008/03/css.html' title='css.html' target="_blank">Demo</a> 吧！<br />
要達到這種效果，很多教學都是使用 JavaScript 裡的 onmouseover、onmouseout 及 onclick 事件來達成，不過現在有純 CSS 的解法，並且通用多數瀏覽器，這個技巧其實在很多國外網站看過，不過昨天向艾德請教之後才真正學起來^^</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">#tb</span><span style="color: Gray;"> </span><span style="color: Blue;">td</span><span style="color: Gray;"> </span><span style="color: Blue;">a</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">display:</span><span style="color: Gray;"> </span><span style="color: Red;">block</span><span style="color: Green;"></span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">height:</span><span style="color: Gray;"> </span><span style="color: Maroon;">35</span><span style="color: Red;">px</span><span style="color: Green;"></span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">line-height:</span><span style="color: Gray;"> </span><span style="color: Maroon;">35</span><span style="color: Red;">px</span><span style="color: Green;"></span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">background:</span><span style="color: Gray;"> </span><span style="color: #00008b;">#FFF9E0</span><span style="color: Green;"></span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Blue;">#tb</span><span style="color: Gray;"> </span><span style="color: Blue;">td</span><span style="color: Gray;"> </span><span style="color: Blue;">a</span><span style="color: Navy;">:hover</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">background:</span><span style="color: Gray;"> </span><span style="color: #00008b;">#E2D9B2</span><span style="color: Green;"></span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span></div></div>
<p>關鍵就是使用 display: block 將 a 顯示為區塊元素，然後依照需求設個高度或寬度給它即可，line-height 給予相同高度可以確保文字垂直置中，這樣比使用 JavaScript 方便多囉。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/219/feed</wfw:commentRss>
		</item>
		<item>
		<title>撰寫 PHP 程式的一些優化建議</title>
		<link>http://blog.linym.net/archives/218</link>
		<comments>http://blog.linym.net/archives/218#comments</comments>
		<pubDate>Mon, 11 Feb 2008 15:56:50 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[程式筆記]]></category>

		<category><![CDATA[optimize]]></category>

		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/218</guid>
		<description><![CDATA[這裡有一篇 Tsung 翻譯的「PHP 程式效能優化的 40 條建議」，覺得很不錯。個人接觸 PHP 這個語言約有四個年頭了，再撰寫時多少會注意一些效能細節，不過有時為了讓程式碼更好看、簡短，往往就忽略掉這些細節，這篇的建議正好可以讓新手學習、老手複習一些 PHP 的最佳化技巧。
引用內容：

如果一個方法可靜態化，就對它做靜態聲明。速率可提升至4倍
echo 比 print 快
使用echo的多重參數（譯註：指用逗號而不是句點）代替字元串連接
在執行for循環之前確定最大循環數，不要每循環一次都計算最大值
註銷那些不用的變量尤其是大數組，以便釋放內存
盡量避免使用__get，__set，__autoload
require_once()代價昂貴
在包含文件時使用完整路徑，解析操作系統路徑所需的時間會更少
如果你想知道腳本開始執行（譯註：即服務器端收到客戶端請求）的時刻，使用$_SERVER['REQUEST_TIME']要好於time()
函數代替正則表達式完成相同功能
str_replace函數比preg_replace函數快，但strtr函數的效率是str_replace函數的四倍
如果一個字元串替換函數，可接受數組或字元作為參數，並且參數長度不太長，那麼可以考慮額外寫一段替換程式，使得每次傳遞參數是一個字元，而不是只寫一行程式接受數組作為查詢和替換的參數
使用選擇分支語句（譯註：即switch case）好於使用多個if，else if語句
用@屏蔽錯誤消息的做法非常慢
打開apache的mod_deflate模塊
資料庫連接當使用完畢時應關掉
$row['id']的效率是$row[id]的7倍
錯誤訊息代價昂貴
盡量不要在for循環中使用函數，比如for ($x=0; $x &#60; count($array); $x)每循環一次都會調用count()函數
在function中遞增局部變量，速度是最快的。幾乎與在函數中調用局部變量的速度相當
遞增一個全局變量要比遞增一個局部變量慢2倍
遞增一個物件屬性（如：$this-&#62;prop++）要比遞增一個局部變量慢3倍
遞增一個未預定義的局部變量要比遞增一個預定義的局部變量慢9至10倍
僅定義一個局部變量而沒在函數中調用它，同樣會減慢速度（其程度相當於遞增一個局部變量）。PHP大概會檢查看是否存在全局變量
方法調用看來與類中定義的方法的數量無關，因為我（在測試方法之前和之後都）添加了10個方法，但性能上沒有變化
派生類中的方法運行起來要快於在基類中定義的同樣的方法
調用帶有一個參數的空函數，其花費的時間相當於執行7至8次的局部變量遞增操作。類似的方法調用所花費的時間接近於15次的局部變量遞增操作
用單引號代替雙引號來包含字元串，這樣做會更快一些。因為PHP會在雙引號包圍的字元串中搜尋變量，單引號則不會。當然，只有當你不需要在字元串中包含變量時才可以這麼做
輸出多個字元串時，用逗號代替句點來分隔字元串，速度更快。註意：只有echo能這麼做，它是一種可以把多個字元串當作參數的“函數”（譯註：PHP手冊中說echo是語言結構，不是真正的函數，故把函數加上了雙引號）
Apache解析一個PHP腳本的時間要比解析一個靜態HTML頁面慢2至10倍。盡量多用靜態HTML頁面，少用腳本
除非腳本可以緩存，否則每次調用時都會重新編譯一次。引入一套PHP緩存機制通常可以提升25%至100%的性能，以免除編譯開銷
盡量做緩存，可使用memcached。memcached是一款高性能的內存物件緩存系統，可用來加速動態Web應用程式，減輕數據庫負載。對運算碼 (OP code)的緩存很有用，使得腳本不必為每個請求做重新編譯
當操作字元串並需要檢驗其長度是否滿足某種要求時，你想當然地會使用strlen()函數。此函數執行起來相當快，因為它不做任何計算，只返回在zval 結構（C的內置數據結構，用於存儲PHP變量）中存儲的已知字元串長度。但是，由於strlen()是函數，多多少少會有些慢，因為函數調用會經過諸多步驟，如字母小寫化（譯註：指函數名小寫化，PHP不區分函數名大小寫），會跟隨被調用的函數一起執行。在某些情況下，你可以使用isset() 技巧加速執行你的程式舉例如下:if (strlen($foo) &#60; 5) { echo &#8220;Foo is too short&#8221;; }與下面的技巧做比較:if (!isset($foo{5})) { echo &#8220;Foo is too short&#8221;; }調用isset()恰巧比strlen()快，因為與後者不同的是，isset()作為一種語言結構，意味著它的執行不需要函數查找和字母小寫化。也就是說，實際上在檢驗字元串長度的頂層程式中你沒有花太多開銷
當執行變數$i的遞增或遞減時，$i++會比++$i慢一些。這種差異是PHP特有的，並不適用於其他語言，所以請不要修改你的C或Java程式並指望它們能立即變快，沒用的。++$i更快是因為它只需要3條指令(opcodes)，$i++則需要4條指令。後置遞增實際上會產生一個臨時變量，這個臨時變量隨後被遞增。而前置遞增直接在原值上遞增。這是最優化處理的一種，正如Zend的PHP優化器所作的那樣。牢記這個優化處理不失為一個好主意，因為並不是所有的指令優化器都會做同樣的優化處理，並且存在大量沒有裝配指令優化器的網際網路服務提供商（ISPs）和服務器
並不是所有都要使用OOP，面向物件往往開銷很大，每個方法和物件調用都會消耗很多Memory
並非要用 class 實現所有的數據結構，數組也很有用
不要把方法細分得過多，仔細想想你真正打算重用的是哪些程式?
當你需要時，你總能把程式分解成方法
盡量採用大量的PHP內置函數
如果在程式中存在大量耗時的函數，你可以考慮用C擴展的方式實現它們
評估檢驗(profile)你的程式。檢驗器會告訴你，程式的哪些部分消耗了多少時間。Xdebug調試器包含了檢驗程式，評估檢驗總體上可以顯示出程式的瓶頸
mod_zip可作為Apache模塊，用來即時壓縮你的數據，並可讓數據傳輸量降低80%
另一篇優化PHP的精彩文章，由John Lim撰寫 

]]></description>
			<content:encoded><![CDATA[<p>這裡有一篇 Tsung 翻譯的「<a href="http://plog.longwin.com.tw/programming/2008/02/05/php_optimizing_40_comment_2008" target="_blank">PHP 程式效能優化的 40 條建議</a>」，覺得很不錯。個人接觸 PHP 這個語言約有四個年頭了，再撰寫時多少會注意一些效能細節，不過有時為了讓程式碼更好看、簡短，往往就忽略掉這些細節，這篇的建議正好可以讓新手學習、老手複習一些 PHP 的最佳化技巧。</p>
<p><strong>引用內容：</strong></p>
<ol>
<li>如果一個方法可靜態化，就對它做靜態聲明。速率可提升至4倍</li>
<li>echo 比 print 快</li>
<li>使用echo的多重參數（譯註：指用逗號而不是句點）代替字元串連接</li>
<li>在執行for循環之前確定最大循環數，不要每循環一次都計算最大值</li>
<li>註銷那些不用的變量尤其是大數組，以便釋放內存</li>
<li>盡量避免使用__get，__set，__autoload</li>
<li>require_once()代價昂貴</li>
<li>在包含文件時使用完整路徑，解析操作系統路徑所需的時間會更少</li>
<li>如果你想知道腳本開始執行（譯註：即服務器端收到客戶端請求）的時刻，使用$_SERVER['REQUEST_TIME']要好於time()</li>
<li>函數代替正則表達式完成相同功能</li>
<li>str_replace函數比preg_replace函數快，但strtr函數的效率是str_replace函數的四倍</li>
<li>如果一個字元串替換函數，可接受數組或字元作為參數，並且參數長度不太長，那麼可以考慮額外寫一段替換程式，使得每次傳遞參數是一個字元，而不是只寫一行程式接受數組作為查詢和替換的參數</li>
<li>使用選擇分支語句（譯註：即switch case）好於使用多個if，else if語句</li>
<li>用@屏蔽錯誤消息的做法非常慢</li>
<li>打開apache的mod_deflate模塊</li>
<li>資料庫連接當使用完畢時應關掉</li>
<li>$row['id']的效率是$row[id]的7倍</li>
<li>錯誤訊息代價昂貴</li>
<li>盡量不要在for循環中使用函數，比如for ($x=0; $x &lt; count($array); $x)每循環一次都會調用count()函數</li>
<li>在function中遞增局部變量，速度是最快的。幾乎與在函數中調用局部變量的速度相當</li>
<li>遞增一個全局變量要比遞增一個局部變量慢2倍</li>
<li>遞增一個物件屬性（如：$this-&gt;prop++）要比遞增一個局部變量慢3倍</li>
<li>遞增一個未預定義的局部變量要比遞增一個預定義的局部變量慢9至10倍</li>
<li>僅定義一個局部變量而沒在函數中調用它，同樣會減慢速度（其程度相當於遞增一個局部變量）。PHP大概會檢查看是否存在全局變量</li>
<li>方法調用看來與類中定義的方法的數量無關，因為我（在測試方法之前和之後都）添加了10個方法，但性能上沒有變化</li>
<li>派生類中的方法運行起來要快於在基類中定義的同樣的方法</li>
<li>調用帶有一個參數的空函數，其花費的時間相當於執行7至8次的局部變量遞增操作。類似的方法調用所花費的時間接近於15次的局部變量遞增操作</li>
<li>用單引號代替雙引號來包含字元串，這樣做會更快一些。因為PHP會在雙引號包圍的字元串中搜尋變量，單引號則不會。當然，只有當你不需要在字元串中包含變量時才可以這麼做</li>
<li>輸出多個字元串時，用逗號代替句點來分隔字元串，速度更快。註意：只有echo能這麼做，它是一種可以把多個字元串當作參數的“函數”（譯註：PHP手冊中說echo是語言結構，不是真正的函數，故把函數加上了雙引號）</li>
<li>Apache解析一個PHP腳本的時間要比解析一個靜態HTML頁面慢2至10倍。盡量多用靜態HTML頁面，少用腳本</li>
<li>除非腳本可以緩存，否則每次調用時都會重新編譯一次。引入一套PHP緩存機制通常可以提升25%至100%的性能，以免除編譯開銷</li>
<li>盡量做緩存，可使用memcached。memcached是一款高性能的內存物件緩存系統，可用來加速動態Web應用程式，減輕數據庫負載。對運算碼 (OP code)的緩存很有用，使得腳本不必為每個請求做重新編譯</li>
<li>當操作字元串並需要檢驗其長度是否滿足某種要求時，你想當然地會使用strlen()函數。此函數執行起來相當快，因為它不做任何計算，只返回在zval 結構（C的內置數據結構，用於存儲PHP變量）中存儲的已知字元串長度。但是，由於strlen()是函數，多多少少會有些慢，因為函數調用會經過諸多步驟，如字母小寫化（譯註：指函數名小寫化，PHP不區分函數名大小寫），會跟隨被調用的函數一起執行。在某些情況下，你可以使用isset() 技巧加速執行你的程式<br />舉例如下:<br />if (strlen($foo) &lt; 5) { echo &#8220;Foo is too short&#8221;; }<br />與下面的技巧做比較:<br />if (!isset($foo{5})) { echo &#8220;Foo is too short&#8221;; }<br />調用isset()恰巧比strlen()快，因為與後者不同的是，isset()作為一種語言結構，意味著它的執行不需要函數查找和字母小寫化。也就是說，實際上在檢驗字元串長度的頂層程式中你沒有花太多開銷</li>
<li>當執行變數$i的遞增或遞減時，$i++會比++$i慢一些。這種差異是PHP特有的，並不適用於其他語言，所以請不要修改你的C或Java程式並指望它們能立即變快，沒用的。++$i更快是因為它只需要3條指令(opcodes)，$i++則需要4條指令。後置遞增實際上會產生一個臨時變量，這個臨時變量隨後被遞增。而前置遞增直接在原值上遞增。這是最優化處理的一種，正如Zend的PHP優化器所作的那樣。牢記這個優化處理不失為一個好主意，因為並不是所有的指令優化器都會做同樣的優化處理，並且存在大量沒有裝配指令優化器的網際網路服務提供商（ISPs）和服務器</li>
<li>並不是所有都要使用OOP，面向物件往往開銷很大，每個方法和物件調用都會消耗很多Memory</li>
<li>並非要用 class 實現所有的數據結構，數組也很有用</li>
<li>不要把方法細分得過多，仔細想想你真正打算重用的是哪些程式?</li>
<li>當你需要時，你總能把程式分解成方法</li>
<li>盡量採用大量的PHP內置函數</li>
<li>如果在程式中存在大量耗時的函數，你可以考慮用C擴展的方式實現它們</li>
<li>評估檢驗(profile)你的程式。檢驗器會告訴你，程式的哪些部分消耗了多少時間。Xdebug調試器包含了檢驗程式，評估檢驗總體上可以顯示出程式的瓶頸</li>
<li>mod_zip可作為Apache模塊，用來即時壓縮你的數據，並可讓數據傳輸量降低80%</li>
<li>另一篇<a href="http://phplens.com/lens/php-book/optimizing-debugging-php.php" target="_blank" title="A HOWTO on Optimizing PHP with tips and methodologies">優化PHP</a>的精彩文章，由John Lim撰寫 </li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/218/feed</wfw:commentRss>
		</item>
		<item>
		<title>有誤的新聞報導:陳冠希事件</title>
		<link>http://blog.linym.net/archives/217</link>
		<comments>http://blog.linym.net/archives/217#comments</comments>
		<pubDate>Thu, 07 Feb 2008 16:39:56 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[資訊新聞]]></category>

		<category><![CDATA[徹底刪除檔案]]></category>

		<category><![CDATA[陳冠希事件]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/217</guid>
		<description><![CDATA[最近最熱門的話題應該就是陳冠希事件了，有報導是說冠希電腦送修前已經將照片刪除了，結果被維修人員用軟體還原出來導致相片外流。接著不出所料地，今天就出現了這則報導：
別當陳冠希第二！「存」過必留痕跡　消失檔案可復原
2008/02/07 18:47
生活中心／綜合報導
一場電腦維修扯出陳冠希的裸照風波，也給大家一個警惕，放在電腦裡的資料，就算刪除了，還是不保險，專家說只要資料曾經儲存在電腦硬碟，就算刪除了，只要硬碟複寫不嚴重，透過還原程式，有99%的機率能把遺失的資料找回來，而這也讓有心人士輕易竊取資料。
陳冠希就是這樣犯了大錯，把煽情照一張張丟到資源回收桶，再一次全部清除，自以為不著痕跡天衣無縫，結果捅出大紕漏，因為我們只要有復原軟體，三秒鐘在這個RECYCLER回收檔案夾，雖然檔名變了，但內容點出來一看，刪除的檔案毫髮無傷。
資訊工程師黃先生表示，「因為資源回收桶在Windows上面，只是屬於暫時性(刪除)，就是它在系統上面不會看到，可是實際上它的資料還是儲存在硬碟空間上面。
除非專業，否則90%的人都不知道還有這招，要刪檔案，刪得清潔溜溜，只有一個方法，點進電腦格式化，重點來了，這個快速格式化千萬不能點，資訊工程師黃先生提醒，「你如果要完整刪除的話，必須要使用完整格式化，它才會將磁區上面的任何資料清乾淨。」
你也有想刪除的秘密嗎？這招必殺「刪除法」可得學起來，否則就別在電腦留秘密，免得哪天電腦送修，不小心就成了第二個陳冠希。 
http://www.ettoday.com/2008/02/07/91-2228846.htm
可見那位「資訊工程師黃先生」自己並沒有作過實際的實驗，否則應該知道不論快速格式化或完整格式化(不要跟我說低階格式化)，檔案都是可以救回來的。要徹底刪除檔案，可以借助一些軟體來達成(keyword: 徹底刪除檔案、檔案碎紙機)，這類軟體通常會多次複寫檔案所在的磁區，甚至使用特別的演算法來複寫，讓檔案可還原的機率降到最低。
※推薦一個討論主題：關於陳冠希照片事件中發現一個電腦問題請教！
]]></description>
			<content:encoded><![CDATA[<p>最近最熱門的話題應該就是陳冠希事件了，有報導是說冠希電腦送修前已經將照片刪除了，結果被維修人員用軟體還原出來導致相片外流。接著不出所料地，今天就出現了這則報導：</p>
<blockquote><p>別當陳冠希第二！「存」過必留痕跡　消失檔案可復原</p>
<p>2008/02/07 18:47<br />
生活中心／綜合報導</p>
<p>一場電腦維修扯出陳冠希的裸照風波，也給大家一個警惕，放在電腦裡的資料，就算刪除了，還是不保險，專家說只要資料曾經儲存在電腦硬碟，就算刪除了，只要硬碟複寫不嚴重，透過還原程式，有99%的機率能把遺失的資料找回來，而這也讓有心人士輕易竊取資料。</p>
<p>陳冠希就是這樣犯了大錯，把煽情照一張張丟到資源回收桶，再一次全部清除，自以為不著痕跡天衣無縫，結果捅出大紕漏，因為我們只要有復原軟體，三秒鐘在這個RECYCLER回收檔案夾，雖然檔名變了，但內容點出來一看，刪除的檔案毫髮無傷。</p>
<p>資訊工程師黃先生表示，「因為資源回收桶在Windows上面，只是屬於暫時性(刪除)，就是它在系統上面不會看到，可是實際上它的資料還是儲存在硬碟空間上面。</p>
<p>除非專業，否則90%的人都不知道還有這招，要刪檔案，刪得清潔溜溜，只有一個方法，點進電腦格式化，重點來了，這個快速格式化千萬不能點，資訊工程師黃先生提醒，「<span style="color:red">你如果要完整刪除的話，必須要使用完整格式化，它才會將磁區上面的任何資料清乾淨。</span>」</p>
<p>你也有想刪除的秘密嗎？這招必殺「刪除法」可得學起來，否則就別在電腦留秘密，免得哪天電腦送修，不小心就成了第二個陳冠希。 </p>
<p>http://www.ettoday.com/2008/02/07/91-2228846.htm</p></blockquote>
<p>可見那位「資訊工程師黃先生」自己並沒有作過實際的實驗，否則應該知道不論快速格式化或完整格式化(不要跟我說低階格式化)，檔案都是可以救回來的。要徹底刪除檔案，可以借助一些軟體來達成(keyword: 徹底刪除檔案、檔案碎紙機)，這類軟體通常會多次複寫檔案所在的磁區，甚至使用特別的演算法來複寫，讓檔案可還原的機率降到最低。</p>
<p>※推薦一個討論主題：<a href="http://www.mobile01.com/topicdetail.php?f=174&#038;t=517032">關於陳冠希照片事件中發現一個電腦問題請教！</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/217/feed</wfw:commentRss>
		</item>
		<item>
		<title>TwSMS 發簡訊 (Linux C 版)</title>
		<link>http://blog.linym.net/archives/216</link>
		<comments>http://blog.linym.net/archives/216#comments</comments>
		<pubDate>Sun, 20 Jan 2008 17:39:20 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[C/C++]]></category>

		<category><![CDATA[程式筆記]]></category>

		<category><![CDATA[C]]></category>

		<category><![CDATA[Linux]]></category>

		<category><![CDATA[TwSMS]]></category>

		<category><![CDATA[傳簡訊]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/216</guid>
		<description><![CDATA[台灣簡訊(TwSMS)是國內一家線上傳簡訊的服務商，提供文字簡訊、語音簡訊等服務，價格也很合理，最重要的是有提供 API 介面，方便用戶在自己的程式中加入發送簡訊功能，官網已經有提供不少範例(PHP/ASP/JSP/Java/Perl/VB/BCB/Delphi)，這邊也有 Ruby 的版本，不過就是沒看到 C 的，所以大略寫了一個 Linux C 版本，打算加入自己的嵌入式專題使用。
TwSMS 提供的 API 很簡單，只要由 HTTP 對 API server 發送 Request 即可，接著 server 就會回傳結果。程式先建立一個 socket 連線，然後發送簡訊，最後再擷取回傳碼檢查是否成功。
#include &#60;stdio.h&#62;#include &#60;stdlib.h&#62;#include &#60;string.h&#62;#include &#60;sys/socket.h&#62;#include &#60;netinet/in.h&#62;#include &#60;arpa/inet.h&#62;#include &#60;netdb.h&#62;&#160;int main(){&#160;&#160; &#160;/* TWSMS 相關設定 */&#160;&#160; &#160;char *username = &#34;username&#34;;&#160; &#160;// 帳號&#160;&#160; &#160;char *password = &#34;password&#34;; // 密碼&#160;&#160; &#160;char *type = &#34;now&#34;;&#160; &#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.twsms.com/" target="_blank">台灣簡訊</a>(TwSMS)是國內一家線上傳簡訊的服務商，提供文字簡訊、語音簡訊等服務，價格也很合理，最重要的是有提供 API 介面，方便用戶在自己的程式中加入發送簡訊功能，官網已經有提供不少範例(PHP/ASP/JSP/Java/Perl/VB/BCB/Delphi)，<a href="http://code.google.com/p/twsms/" target="_blank">這邊</a>也有 Ruby 的版本，不過就是沒看到 C 的，所以大略寫了一個 Linux C 版本，打算加入自己的嵌入式專題使用。</p>
<p>TwSMS 提供的 API 很簡單，只要由 HTTP 對 API server 發送 Request 即可，接著 server 就會回傳結果。程式先建立一個 socket 連線，然後發送簡訊，最後再擷取回傳碼檢查是否成功。</p>
<div class="hl-surround"><div class="hl-main"><span class="hl-prepro">#include </span><span style="color: #8b0000;">&lt;</span><span style="color: Red;">stdio.h</span><span style="color: #8b0000;">&gt;</span><span class="hl-prepro"></span><span style="color: Gray;"><br /></span><span class="hl-prepro">#include </span><span style="color: #8b0000;">&lt;</span><span style="color: Red;">stdlib.h</span><span style="color: #8b0000;">&gt;</span><span class="hl-prepro"></span><span style="color: Gray;"><br /></span><span class="hl-prepro">#include </span><span style="color: #8b0000;">&lt;</span><span style="color: Red;">string.h</span><span style="color: #8b0000;">&gt;</span><span class="hl-prepro"></span><span style="color: Gray;"><br /></span><span class="hl-prepro">#include </span><span style="color: #8b0000;">&lt;</span><span style="color: Red;">sys/socket.h</span><span style="color: #8b0000;">&gt;</span><span class="hl-prepro"></span><span style="color: Gray;"><br /></span><span class="hl-prepro">#include </span><span style="color: #8b0000;">&lt;</span><span style="color: Red;">netinet/in.h</span><span style="color: #8b0000;">&gt;</span><span class="hl-prepro"></span><span style="color: Gray;"><br /></span><span class="hl-prepro">#include </span><span style="color: #8b0000;">&lt;</span><span style="color: Red;">arpa/inet.h</span><span style="color: #8b0000;">&gt;</span><span class="hl-prepro"></span><span style="color: Gray;"><br /></span><span class="hl-prepro">#include </span><span style="color: #8b0000;">&lt;</span><span style="color: Red;">netdb.h</span><span style="color: #8b0000;">&gt;</span><span class="hl-prepro"></span><span style="color: Gray;"><br />&nbsp;<br /></span><span class="hl-types">int</span><span style="color: Gray;"> </span><span style="color: Blue;">main</span><span style="color: Olive;">()</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span class="hl-mlcomment">/* TWSMS 相關設定 */</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span class="hl-types">char</span><span style="color: Gray;"> *</span><span style="color: Blue;">username</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">username</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;&nbsp; &nbsp;</span><span style="color: #ffa500;">// 帳號</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span class="hl-types">char</span><span style="color: Gray;"> *</span><span style="color: Blue;">password</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">password</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// 密碼</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span class="hl-types">char</span><span style="color: Gray;"> *</span><span style="color: Blue;">type</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">now</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #ffa500;">// 發送型態</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span class="hl-types">char</span><span style="color: Gray;"> *</span><span style="color: Blue;">mobile</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">0912xxxxxx</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// 電話</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span class="hl-types">char</span><span style="color: Gray;"> *</span><span style="color: Blue;">message</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">簡訊測試</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// 簡訊內容</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span class="hl-types">char</span><span style="color: Gray;"> *</span><span style="color: Blue;">encoding</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">big5</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;&nbsp; &nbsp; </span><span style="color: #ffa500;">// 簡訊內容編碼</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span class="hl-types">char</span><span style="color: Gray;"> *</span><span style="color: Blue;">popup</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">// 使用 POPUP 顯示</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span class="hl-types">char</span><span style="color: Gray;"> *</span><span style="color: Blue;">mo</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #ffa500;">// 使用雙向簡訊</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span class="hl-types">char</span><span style="color: Gray;"> *</span><span style="color: Blue;">vldtime</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">86400</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;&nbsp; &nbsp; </span><span style="color: #ffa500;">// 簡訊有效期限(秒)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span class="hl-types">char</span><span style="color: Gray;"> *</span><span style="color: Blue;">dlvtime</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #ffa500;">// 預約時間</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span class="hl-types">int</span><span style="color: Gray;"> </span><span style="color: Blue;">sockfd</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span class="hl-types">int</span><span style="color: Gray;"> </span><span style="color: Blue;">len</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span class="hl-types">char</span><span style="color: Gray;"> *</span><span style="color: Blue;">host</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">api.twsms.com</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span class="hl-types">char</span><span style="color: Gray;"> </span><span style="color: Blue;">msg</span><span style="color: Olive;">[</span><span style="color: Maroon;">512</span><span style="color: Olive;">]</span><span style="color: Gray;">, </span><span style="color: Blue;">MSGData</span><span style="color: Olive;">[</span><span style="color: Maroon;">512</span><span style="color: Olive;">]</span><span style="color: Gray;">, </span><span style="color: Blue;">buf</span><span style="color: Olive;">[</span><span style="color: Maroon;">512</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span class="hl-types">char</span><span style="color: Gray;"> *</span><span style="color: Blue;">res</span><span style="color: Gray;">, *</span><span style="color: Blue;">checkRes</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span class="hl-types">struct</span><span style="color: Gray;"> </span><span style="color: Blue;">sockaddr_in</span><span style="color: Gray;"> </span><span style="color: Blue;">address</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span class="hl-types">struct</span><span style="color: Gray;"> </span><span style="color: Blue;">hostent</span><span style="color: Gray;"> *</span><span style="color: Blue;">hostinfo</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">bzero</span><span style="color: Olive;">(</span><span style="color: Gray;">&amp;</span><span style="color: Blue;">address</span><span style="color: Gray;">, </span><span style="color: Green;">sizeof</span><span style="color: Olive;">(</span><span style="color: Blue;">address</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">hostinfo</span><span style="color: Gray;"> = </span><span style="color: Blue;">gethostbyname</span><span style="color: Olive;">(</span><span style="color: Blue;">host</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Blue;">hostinfo</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">fprintf</span><span style="color: Olive;">(</span><span style="color: Blue;">stderr</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">no host: %s</span><span style="color: Navy;">\</span><span style="color: Red;">n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">host</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">exit</span><span style="color: Olive;">(</span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">address</span><span style="color: Gray;">.</span><span style="color: Blue;">sin_family</span><span style="color: Gray;"> = </span><span style="color: Blue;">AF_INET</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">address</span><span style="color: Gray;">.</span><span style="color: Blue;">sin_port</span><span style="color: Gray;"> = </span><span style="color: Blue;">htons</span><span style="color: Olive;">(</span><span style="color: Maroon;">80</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">address</span><span style="color: Gray;">.</span><span style="color: Blue;">sin_addr</span><span style="color: Gray;"> = *</span><span style="color: Olive;">(</span><span class="hl-types">struct</span><span style="color: Gray;"> </span><span style="color: Blue;">in_addr</span><span style="color: Gray;"> *</span><span style="color: Olive;">)</span><span style="color: Gray;">*</span><span style="color: Blue;">hostinfo</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">h_addr_list</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span class="hl-mlcomment">/* Create socket */</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">sockfd</span><span style="color: Gray;"> = </span><span style="color: Blue;">socket</span><span style="color: Olive;">(</span><span style="color: Blue;">AF_INET</span><span style="color: Gray;">, </span><span style="color: Blue;">SOCK_STREAM</span><span style="color: Gray;">, </span><span style="color: Maroon;">0</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span class="hl-mlcomment">/* Connect to server */</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">connect</span><span style="color: Olive;">(</span><span style="color: Blue;">sockfd</span><span style="color: Gray;">, </span><span style="color: Olive;">(</span><span class="hl-types">struct</span><span style="color: Gray;"> </span><span style="color: Blue;">sockaddr</span><span style="color: Gray;"> *</span><span style="color: Olive;">)</span><span style="color: Gray;">&amp;</span><span style="color: Blue;">address</span><span style="color: Gray;">, </span><span style="color: Green;">sizeof</span><span style="color: Olive;">(</span><span style="color: Blue;">address</span><span style="color: Olive;">))</span><span style="color: Gray;"> == -</span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">perror</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">connect faild!</span><span style="color: Navy;">\</span><span style="color: Red;">n</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">exit</span><span style="color: Olive;">(</span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span class="hl-mlcomment">/* Request string */</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">len</span><span style="color: Gray;"> = </span><span style="color: Blue;">snprintf</span><span style="color: Olive;">(</span><span style="color: Blue;">msg</span><span style="color: Gray;">, </span><span style="color: Maroon;">512</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">username=%s&amp;password=%s&amp;type=%s&amp;encoding=%s&amp;popup=%s&amp;mo=%s&amp;mobile=%s</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">&amp;message=%s&amp;vldtime=%s&amp;dlvtime=%s</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">username</span><span style="color: Gray;">, </span><span style="color: Blue;">password</span><span style="color: Gray;">, </span><span style="color: Blue;">type</span><span style="color: Gray;">, </span><span style="color: Blue;">encoding</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">popup</span><span style="color: Gray;">, </span><span style="color: Blue;">mo</span><span style="color: Gray;">, </span><span style="color: Blue;">mobile</span><span style="color: Gray;">, </span><span style="color: Blue;">message</span><span style="color: Gray;">, </span><span style="color: Blue;">vldtime</span><span style="color: Gray;">, </span><span style="color: Blue;">dlvtime</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span class="hl-mlcomment">/* HTTP request content */</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">snprintf</span><span style="color: Olive;">(</span><span style="color: Blue;">MSGData</span><span style="color: Gray;">, </span><span style="color: Maroon;">512</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">POST /send_sms.php HTTP/1.1</span><span style="color: Navy;">\</span><span style="color: Red;">r</span><span style="color: Navy;">\</span><span style="color: Red;">n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Host: %s</span><span style="color: Navy;">\</span><span style="color: Red;">r</span><span style="color: Navy;">\</span><span style="color: Red;">n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Content-Length: %d</span><span style="color: Navy;">\</span><span style="color: Red;">r</span><span style="color: Navy;">\</span><span style="color: Red;">n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Content-Type: application/x-www-form-urlencoded</span><span style="color: Navy;">\</span><span style="color: Red;">r</span><span style="color: Navy;">\</span><span style="color: Red;">n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Connection: Close</span><span style="color: Navy;">\</span><span style="color: Red;">r</span><span style="color: Navy;">\</span><span style="color: Red;">n</span><span style="color: Navy;">\</span><span style="color: Red;">r</span><span style="color: Navy;">\</span><span style="color: Red;">n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">%s</span><span style="color: Navy;">\</span><span style="color: Red;">r</span><span style="color: Navy;">\</span><span style="color: Red;">n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">host</span><span style="color: Gray;">, </span><span style="color: Blue;">len</span><span style="color: Gray;">, </span><span style="color: Blue;">msg</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span class="hl-mlcomment">/* Send message */</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">send</span><span style="color: Olive;">(</span><span style="color: Blue;">sockfd</span><span style="color: Gray;">, </span><span style="color: Blue;">MSGData</span><span style="color: Gray;">, </span><span style="color: Blue;">strlen</span><span style="color: Olive;">(</span><span style="color: Blue;">MSGData</span><span style="color: Olive;">)</span><span style="color: Gray;">, </span><span style="color: Maroon;">0</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span class="hl-mlcomment">/* Response message */</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">recv</span><span style="color: Olive;">(</span><span style="color: Blue;">sockfd</span><span style="color: Gray;">, </span><span style="color: Blue;">buf</span><span style="color: Gray;">, </span><span style="color: Maroon;">512</span><span style="color: Gray;">, </span><span style="color: Maroon;">0</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">for</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">res</span><span style="color: Gray;"> = </span><span style="color: Blue;">strtok</span><span style="color: Olive;">(</span><span style="color: Blue;">buf</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Navy;">\</span><span style="color: Red;">n</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: Blue;">strncmp</span><span style="color: Olive;">(</span><span style="color: Blue;">res</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">resp</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;"> != </span><span style="color: Maroon;">0</span><span style="color: Gray;">; </span><span style="color: Blue;">res</span><span style="color: Gray;"> = </span><span style="color: Blue;">strtok</span><span style="color: Olive;">(</span><span class="hl-prepro">NULL</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Navy;">\</span><span style="color: Red;">n</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">checkRes</span><span style="color: Gray;"> = </span><span style="color: Blue;">strtok</span><span style="color: Olive;">(</span><span style="color: Blue;">res</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">checkRes</span><span style="color: Gray;"> = </span><span style="color: Blue;">strtok</span><span style="color: Olive;">(</span><span class="hl-prepro">NULL</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">atoi</span><span style="color: Olive;">(</span><span style="color: Blue;">checkRes</span><span style="color: Olive;">)</span><span style="color: Gray;"> &lt;= </span><span style="color: Maroon;">0</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">printf</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">傳送失敗</span><span style="color: Navy;">\</span><span style="color: Red;">n</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"> </span><span style="color: Green;">else</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">printf</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">傳送完成</span><span style="color: Navy;">\</span><span style="color: Red;">n</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">close</span><span style="color: Olive;">(</span><span style="color: Blue;">sockfd</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Maroon;">0</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/216/feed</wfw:commentRss>
		</item>
		<item>
		<title>TeraTerm Pro - 取代超級終端機</title>
		<link>http://blog.linym.net/archives/215</link>
		<comments>http://blog.linym.net/archives/215#comments</comments>
		<pubDate>Fri, 11 Jan 2008 12:05:34 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[軟體筆記]]></category>

		<category><![CDATA[TeraTerm]]></category>

		<category><![CDATA[tty]]></category>

		<category><![CDATA[超級終端機]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/215</guid>
		<description><![CDATA[Windows 內建的超級終端機(HyperTerminal)，有使用過的應該都知道問題很多，經常跑出亂碼、甚至程式當掉，可以說是年久失修的工具阿，連 Vista 都將它拿掉了，不過有許多 router、硬體設備仍是要透過 Serial Port 去做 debug、設定等等，所以有沒有可以取代超級終端機的軟體呢？
有的，試用過 TeraTerm Pro 之後就愛上他了，擁有比超級終端機簡潔的畫面，原有的功能都沒少，還增加了 UTF8/SSH/telnet/Macro&#8230;，在 Vista 上跑也沒問題，所以，換掉超級終端機吧！
‧TeraTerm Pro 專案網頁
．下載頁面
]]></description>
			<content:encoded><![CDATA[<p>Windows 內建的超級終端機(HyperTerminal)，有使用過的應該都知道問題很多，經常跑出亂碼、甚至程式當掉，可以說是年久失修的工具阿，連 Vista 都將它拿掉了，不過有許多 router、硬體設備仍是要透過 Serial Port 去做 debug、設定等等，所以有沒有可以取代超級終端機的軟體呢？</p>
<p>有的，試用過 <a href="http://ttssh2.sourceforge.jp/" target="_blank">TeraTerm Pro</a> 之後就愛上他了，擁有比超級終端機簡潔的畫面，原有的功能都沒少，還增加了 UTF8/SSH/telnet/Macro&#8230;，在 Vista 上跑也沒問題，所以，換掉超級終端機吧！</p>
<p>‧<a href="http://ttssh2.sourceforge.jp/" target="_blank">TeraTerm Pro 專案網頁</a><br />
．<a href="http://sourceforge.jp/projects/ttssh2/files/" target="_blank">下載頁面</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/215/feed</wfw:commentRss>
		</item>
		<item>
		<title>Wordpress 2.3.2 無法中文化問題</title>
		<link>http://blog.linym.net/archives/214</link>
		<comments>http://blog.linym.net/archives/214#comments</comments>
		<pubDate>Thu, 10 Jan 2008 13:38:05 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[Other]]></category>

		<category><![CDATA[程式筆記]]></category>

		<category><![CDATA[bug]]></category>

		<category><![CDATA[wordpress]]></category>

		<category><![CDATA[中文化]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/214</guid>
		<description><![CDATA[Wordpress 最近已經更新到 2.3.2 版了，趁著最近專題發表結束的空閒來更新一下，到官方抓了新版以及 Kirin Lin 的中文語系，由於 2.3.2 只是些 bug 及安全性修正，所以就直接採用覆蓋大法更新了。完工之後，咦？怎麼變英文介面了，wp-config.php 設定沒錯阿，於是求助 google 大神，馬上就找到了這篇，原來在 PHP 5.2.x 以及 64bit 系統下會有這個問題，登入 BlueHost 主機的後台看一下，果然沒錯，開始修正囉！
其實只要修正一行即可：
wp-includes/gettext.php  LINE:117
if ($magic == ($MAGIC1 &#38; 0xFFFFFFFF) &#124;&#124; $magic == ($MAGIC3 &#38; 0xFFFFFFFF)) { // to make sure it works for 64-bit platforms
更改成：
if ($magic == $MAGIC1 &#124;&#124; $magic == $MAGIC3) { // &#60;- 64 [...]]]></description>
			<content:encoded><![CDATA[<p>Wordpress 最近已經更新到 2.3.2 版了，趁著最近專題發表結束的空閒來更新一下，到官方抓了新版以及 <a href="http://kirin.lin.googlepages.com/">Kirin Lin</a> 的中文語系，由於 2.3.2 只是些 bug 及安全性修正，所以就直接採用覆蓋大法更新了。完工之後，咦？怎麼變英文介面了，wp-config.php 設定沒錯阿，於是求助 google 大神，馬上就找到了<a href="http://www.wordpress.com.tw/wp/?p=80" target="_blank">這篇</a>，原來在 PHP 5.2.x 以及 64bit 系統下會有這個問題，登入 BlueHost 主機的後台看一下，果然沒錯，開始修正囉！</p>
<p>其實只要修正一行即可：<br />
wp-includes/gettext.php  LINE:117</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$magic</span><span style="color: Gray;"> == </span><span style="color: Olive;">(</span><span style="color: #00008b;">$MAGIC1</span><span style="color: Gray;"> &amp; </span><span style="color: Maroon;">0xFFFFFFFF</span><span style="color: Olive;">)</span><span style="color: Gray;"> || </span><span style="color: #00008b;">$magic</span><span style="color: Gray;"> == </span><span style="color: Olive;">(</span><span style="color: #00008b;">$MAGIC3</span><span style="color: Gray;"> &amp; </span><span style="color: Maroon;">0xFFFFFFFF</span><span style="color: Olive;">))</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: #ffa500;">// to make sure it works for 64-bit platforms</span><span style="color: Gray;"></span></div></div>
<p>更改成：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$magic</span><span style="color: Gray;"> == </span><span style="color: #00008b;">$MAGIC1</span><span style="color: Gray;"> || </span><span style="color: #00008b;">$magic</span><span style="color: Gray;"> == </span><span style="color: #00008b;">$MAGIC3</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: #ffa500;">// &lt;- 64 BIT FIX: CHANGE THIS LINE!</span><span style="color: Gray;"></span></div></div>
<p>ok!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/214/feed</wfw:commentRss>
		</item>
		<item>
		<title>Google Map 地圖定位</title>
		<link>http://blog.linym.net/archives/213</link>
		<comments>http://blog.linym.net/archives/213#comments</comments>
		<pubDate>Thu, 10 Jan 2008 12:40:38 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[Ajax]]></category>

		<category><![CDATA[Other]]></category>

		<category><![CDATA[程式筆記]]></category>

		<category><![CDATA[API]]></category>

		<category><![CDATA[Google]]></category>

		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/213</guid>
		<description><![CDATA[Google Map 提供的 API 實在是強大又好用，結合 GPS 很快就可以做出地圖定位的網站，將之前的 Urmap 範例修改了一下，成為 Google Map 地圖定位系統，為了能夠展示所以將座標先寫好讓它自己動態更新，其中按下停止按鈕會畫出所有紀錄點的連線，可做路徑追蹤。
Google Map API 網路上的資源已經相當豐富了，在此就不多敘述，比較特別的是畫折線(polyline)的部份，如果用原始的 GPolyline 方法來畫，大概幾十個點就需要運算很久，甚至導致瀏覽器 crash，所以 API 後來又加入了編碼折線(encodedPolyline)的功能，先將所有的點用特定演算法轉換成一串文字符號，再丟給 GPolyline.fromEncoded 顯示，幾乎是馬上就顯示出來了，差很多喔，而這個編碼演算法也已經有人寫好囉！請看：Encoding polylines for Google Maps
]]></description>
			<content:encoded><![CDATA[<p>Google Map 提供的 <a href="http://code.google.com/apis/maps/documentation/" target="_blank">API</a> 實在是強大又好用，結合 GPS 很快就可以做出地圖定位的網站，將之前的 Urmap 範例修改了一下，成為 <a href="http://map.linym.net/" target="_blank">Google Map 地圖定位系統</a>，為了能夠展示所以將座標先寫好讓它自己動態更新，其中按下停止按鈕會畫出所有紀錄點的連線，可做路徑追蹤。</p>
<p><a href="http://code.google.com/apis/maps/documentation/" target="_blank">Google Map API</a> 網路上的資源已經相當豐富了，在此就不多敘述，比較特別的是畫折線(polyline)的部份，如果用原始的 GPolyline 方法來畫，大概幾十個點就需要運算很久，甚至導致瀏覽器 crash，所以 API 後來又加入了編碼折線(encodedPolyline)的功能，先將所有的點用特定演算法轉換成一串文字符號，再丟給 GPolyline.fromEncoded 顯示，幾乎是馬上就顯示出來了，差很多喔，而這個編碼演算法也已經有人寫好囉！請看：<a href="http://facstaff.unca.edu/mcmcclur/GoogleMaps/EncodePolyline/" target="_blank">Encoding polylines for Google Maps</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/213/feed</wfw:commentRss>
		</item>
		<item>
		<title>CodeIgniter 設定 MySQL 編碼</title>
		<link>http://blog.linym.net/archives/212</link>
		<comments>http://blog.linym.net/archives/212#comments</comments>
		<pubDate>Sat, 22 Dec 2007 15:21:51 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[程式筆記]]></category>

		<category><![CDATA[CodeIgniter]]></category>

		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[編碼]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/212</guid>
		<description><![CDATA[※ CodeIgniter 1.6 已釋出，不需再做這篇的修正了哦！
先前有提到過 CodeIgniter 這個 PHP Framework，也用它做了幾個 case，當然開發速度不能說快上多少，但確實讓程式碼變得整齊優雅許多。
使用 CI 目前遇到第一個問題是存取 MySQL 資料的問題，在 MySQL 4.1 以後採用了多層式編碼設定，簡單說就是不管是資料庫、資料表、欄位或是 Client 連線階段，都可以分別設定編碼，所以即使 server 都改成了 utf8，PHP 到 MySQL Server 的這個 connection 卻還是預設的(latin1)，許多亂碼就是這樣造成的，應該已經有不少人知道解決方法，就是先送出一個改變編碼的查詢：SET NAMES &#39;charset&#39;。
然而目前 CodeIgniter 並沒有這樣的設計，所以只好自行改 code 囉！
Step1：修改 system/application/config/database.php
增加一項：$db[&#39;default&#39;][&#39;charset&#39;]  = &#34;utf8&#34;;
Step2：修改 system/database/DB_driver.php
在 32 行之後的宣告增加：var $charset        = &#39;&#39;;
接著 96 行的陣列增加：&#39;charset&#39;	=> &#39;&#39;,
Step3：修改 system/database/drivers/mysql/mysql_driver.php
74 行 [...]]]></description>
			<content:encoded><![CDATA[<p><strong>※ CodeIgniter 1.6 已釋出，不需再做這篇的修正了哦！</strong></p>
<p>先前有<a href="http://blog.linym.net/archives/162">提到</a>過 <a href="http://codeigniter.com/" target="_blank">CodeIgniter</a> 這個 PHP Framework，也用它做了幾個 case，當然開發速度不能說快上多少，但確實讓程式碼變得整齊優雅許多。</p>
<p>使用 CI 目前遇到第一個問題是存取 MySQL 資料的問題，在 MySQL 4.1 以後採用了多層式編碼設定，簡單說就是不管是資料庫、資料表、欄位或是 Client 連線階段，都可以分別設定編碼，所以即使 server 都改成了 utf8，PHP 到 MySQL Server 的這個 connection 卻還是預設的(latin1)，許多亂碼就是這樣造成的，應該已經有不少人知道解決方法，就是先送出一個改變編碼的查詢：SET NAMES &#39;charset&#39;。<br />
然而目前 CodeIgniter 並沒有這樣的設計，所以只好自行改 code 囉！</p>
<p><strong>Step1：修改 system/application/config/database.php</strong><br />
增加一項：$db[&#39;default&#39;][&#39;charset&#39;]  = &quot;utf8&quot;;</p>
<p><strong>Step2：修改 system/database/DB_driver.php</strong><br />
在 32 行之後的宣告增加：var $charset        = &#39;&#39;;<br />
接著 96 行的陣列增加：&#39;charset&#39;	=> &#39;&#39;,</p>
<p><strong>Step3：修改 system/database/drivers/mysql/mysql_driver.php</strong><br />
74 行 return 前加入：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Green;">empty</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">charset</span><span style="color: Olive;">))</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;@</span><span style="color: Blue;">mysql_query</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">SET NAMES </span><span style="color: #00008b;">$this</span><span style="color: Red;">-&gt;charset</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"></span></div></div>
<p>這樣就 ok 了，如果使用 mysqli 請如法炮製。另外如果主機環境符合，可使用 PHP 內建函式來設定：<br />
<strong>// PHP >= 5.2.3，MySQL >= 5.0.7 for mysql</strong><br />
@mysql_set_charset($this->charset, $this->conn_id);<br />
<strong>// PHP >= 5.0.5，MySQL >= 5.0.6 for mysqli</strong><br />
@mysqli_set_charset($this->conn_id, $this->charset);</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/212/feed</wfw:commentRss>
		</item>
		<item>
		<title>開源中文語音合成:eSpeak</title>
		<link>http://blog.linym.net/archives/211</link>
		<comments>http://blog.linym.net/archives/211#comments</comments>
		<pubDate>Sat, 01 Dec 2007 00:47:20 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[軟體筆記]]></category>

		<category><![CDATA[eSpeak]]></category>

		<category><![CDATA[TTS]]></category>

		<category><![CDATA[語音合成]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/211</guid>
		<description><![CDATA[語音合成系統通常拿來做 TTS(Text to Speach) 應用，英文 TTS 已經滿多且成熟了，但是中文的目前大多是廠商或實驗室驗自行開發，所以可能沒辦法免費拿來研究。
最近發現的 eSpeak 這個 Open Source 已經在最新的開發版本中加入中文語音支援囉!網頁在這裡，應該不久就會變成正式版本釋出。根據了解，好用的 StarDict 翻譯軟體也是使用 eSpeak 來作為朗讀發音系統哦！
在嘗試移植到嵌入式 ARM Linux 時失敗，因為實在太多 Shared Libraries 了，如果有成功的高手希望能分享一下心得。
]]></description>
			<content:encoded><![CDATA[<p>語音合成系統通常拿來做 TTS(Text to Speach) 應用，英文 TTS 已經滿多且成熟了，但是中文的目前大多是廠商或實驗室驗自行開發，所以可能沒辦法免費拿來研究。</p>
<p>最近發現的 <a href="http://espeak.sourceforge.net/" target="_blank">eSpeak</a> 這個 Open Source 已經在最新的開發版本中加入中文語音支援囉!網頁在<a href="http://espeak.sourceforge.net/test/latest.html" target="_blank">這裡</a>，應該不久就會變成正式版本釋出。根據了解，好用的 <a href="http://stardict.sourceforge.net/" target="_blank">StarDict</a> 翻譯軟體也是使用 eSpeak 來作為朗讀發音系統哦！</p>
<p>在嘗試移植到嵌入式 ARM Linux 時失敗，因為實在太多 Shared Libraries 了，如果有成功的高手希望能分享一下心得。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/211/feed</wfw:commentRss>
		</item>
		<item>
		<title>PC 安裝 Mac OS X Leopard 心得</title>
		<link>http://blog.linym.net/archives/210</link>
		<comments>http://blog.linym.net/archives/210#comments</comments>
		<pubDate>Thu, 22 Nov 2007 03:56:50 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[系統筆記]]></category>

		<category><![CDATA[軟體筆記]]></category>

		<category><![CDATA[Leopard]]></category>

		<category><![CDATA[Mac]]></category>

		<category><![CDATA[Macbook]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/210</guid>
		<description><![CDATA[Mac 這幾年的市佔率有攀升的趨勢，其中硬體轉換到 Intel-based 以及 Boot Camp 應該是很大的推手，在 Mac 電腦上安裝 XP/Vista 都已經不成問題了，甚至有報導指出目前跑 Vista 最快的 NB 為 MacBook Pro，所以我的下一台 NB 應該也會買 Macbook 吧，因為實在想不出不買它的理由啊= =
前陣子最火熱的應該是 Leopard 一上市就被破解可以裝在 PC 上的消息，不過看許多人討論都是以失敗或放棄收場，但是我拿了一台 A8Je NB 及 PC 試裝發現都可以成功進入系統，只是 NB 驅動有問題，沒辦法連上網。
PC 規格如下：
Pentium D 925
Gigabyte GA-945GM-S2
Nvidia GeForce 7300LE
Hitachi T7K250 160G
裝好使用上幾乎沒什麼問題，不過可惜的是 Boot Camp 無法使用。
安裝關鍵：

要有修改過的 Leopard 安裝光碟(DVD5 可燒那版)
下載 patch 檔放在隨身碟(內有 9a581PostPatch.sh 這個檔案的)
照著 Install Leopard on your [...]]]></description>
			<content:encoded><![CDATA[<p>Mac 這幾年的市佔率有攀升的趨勢，其中硬體轉換到 Intel-based 以及 <a href="http://zh.wikipedia.org/w/index.php?title=Boot_Camp&#038;variant=zh-tw" target="_blank">Boot Camp</a> 應該是很大的推手，在 Mac 電腦上安裝 XP/Vista 都已經不成問題了，甚至有<a href="http://www.pcworld.com/article/id,136649-page,3-c,notebooks/article.html" target="_blank">報導</a>指出目前跑 Vista 最快的 NB 為 MacBook Pro，所以我的下一台 NB 應該也會買 Macbook 吧，因為實在想不出不買它的理由啊= =</p>
<p>前陣子最火熱的應該是 <a href="http://www.apple.com.tw/macosx/" target="_blank">Leopard</a> 一上市就被破解可以裝在 PC 上的消息，不過看許多人討論都是以失敗或放棄收場，但是我拿了一台 A8Je NB 及 PC 試裝發現都可以成功進入系統，只是 NB 驅動有問題，沒辦法連上網。</p>
<p><strong>PC 規格如下：</strong><br />
Pentium D 925<br />
Gigabyte GA-945GM-S2<br />
Nvidia GeForce 7300LE<br />
Hitachi T7K250 160G<br />
裝好使用上幾乎沒什麼問題，不過可惜的是 Boot Camp 無法使用。</p>
<p><strong>安裝關鍵：</strong></p>
<ol>
<li>要有修改過的 Leopard 安裝光碟(DVD5 可燒那版)</li>
<li>下載 patch 檔放在隨身碟(內有 9a581PostPatch.sh 這個檔案的)</li>
<li>照著 <a href="http://dailyapps.net/2007/10/hack-attack-install-leopard-on-your-pc-in-3-easy-steps/" target="_blank">Install Leopard on your PC in 3 easy steps</a> 安裝
<li>安裝時先選英文，並且按 Custom 取消打勾的套件</li>
<li>裝好重開，放上隨身碟，再進一次光碟安裝介面，選 Menu 的 Terminal，作 patch。(文中說的按 F8 我都失敗)</li>
<li>利用 tboot 引導作多重開機，可以參考<a href="http://blog.sinplee.cn/archives/173818.html" target="_blank">這篇</a></li>
</ol>
<p>這樣應該就 OK 了，再來就祈禱驅動都有抓到可以跑囉！如果網卡無法驅動可以試試 <a href="http://www.pinxue.net/mac/viarhine.html" target="_blank">Via Rhine</a>，我的 D-Link DFE-530TX 就是靠它跑起來的。</p>
<p>最後&#8230;在 PC 安裝破解的 Leopard 是非法的，玩玩就好，還是買台 Mac 來玩比較穩定&#038;實在啦^^</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/210/feed</wfw:commentRss>
		</item>
		<item>
		<title>編譯 ZD1211 無線網卡驅動</title>
		<link>http://blog.linym.net/archives/209</link>
		<comments>http://blog.linym.net/archives/209#comments</comments>
		<pubDate>Mon, 19 Nov 2007 11:36:22 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[硬體筆記]]></category>

		<category><![CDATA[driver]]></category>

		<category><![CDATA[wireless]]></category>

		<category><![CDATA[zd1211]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/209</guid>
		<description><![CDATA[關於如何編譯 ZD1211/ZD1211B 晶片的 USB 無線網卡 driver，經常在各大討論區及 BBS 看到有人提出相同的問題，因此來寫個教學。
前往 ZD1211 專案網站可以知道目前有三種版本的驅動，其中建議使用 zd1211rw 這個版本，因為它持續在更新且已納入 Linux 2.6.18 以後的 kernel 裡。zd1211rw 支援這三種晶片：

ZyDAS ZD1211
ZyDAS ZD1211B
Atheros AR5007UG

不過既然都已經納入 kernel 了為什麼還要編譯驅動？因為還是有很多產品的 USB ID 不能被 zd1211rw 所辨識(我的 PCI GW-US54GXS 就是)，當然就沒辦法驅動囉！這篇要做的就是從 kernel 裡的 zd1211rw source code 加入對應的 USB ID，主機環境是 ubuntu 7.10，其他版本應該也差不多。
首先要安裝編譯相關套件 &#038; 下載 linux source
$ sudo apt-get install build-essential kernel-package linux-source
切換至 src 目錄並解開 linux source
$ [...]]]></description>
			<content:encoded><![CDATA[<p>關於如何編譯 ZD1211/ZD1211B 晶片的 USB 無線網卡 driver，經常在各大討論區及 BBS 看到有人提出相同的問題，因此來寫個教學。</p>
<p>前往 <a href="http://zd1211.wiki.sourceforge.net/" target="_blank">ZD1211</a> 專案網站可以知道目前有三種版本的驅動，其中建議使用 <a href="http://www.linuxwireless.org/en/users/Drivers/zd1211rw" target="_blank">zd1211rw</a> 這個版本，因為它持續在更新且已納入 Linux 2.6.18 以後的 kernel 裡。zd1211rw 支援這三種晶片：</p>
<ul>
<li>ZyDAS ZD1211</li>
<li>ZyDAS ZD1211B</li>
<li>Atheros AR5007UG</li>
</ul>
<p>不過既然都已經納入 kernel 了為什麼還要編譯驅動？因為還是有很多產品的 USB ID 不能被 zd1211rw 所辨識(我的 PCI GW-US54GXS 就是)，當然就沒辦法驅動囉！這篇要做的就是從 kernel 裡的 zd1211rw source code 加入對應的 USB ID，主機環境是 ubuntu 7.10，其他版本應該也差不多。</p>
<p><strong>首先要安裝編譯相關套件 &#038; 下載 linux source</strong><br />
$ sudo apt-get install build-essential kernel-package linux-source</p>
<p><strong>切換至 src 目錄並解開 linux source</strong><br />
$ cd /usr/src<br />
$ sudo tar -xjvf linux-source-2.6.22.tar.bz2</p>
<p><strong>拷貝 kernel 設定檔(.config) 至 linux source</strong><br />
$ sudo cp linux-headers-2.6.22-14-generic/.config linux-source-2.6.22</p>
<p><strong>編輯 zd_usb.c 加入新 USB ID，可利用 lsusb 指令可以找出網卡的 ID，如：2019:5303</strong><br />
$ cd linux-source-2.6.22<br />
$ sudo vim drivers/net/wireless/zd1211rw/zd_usb.c<br />
在檔案開頭不遠處可以看到一堆 USB ID 號碼，就是要加進這裡面，GW-US54GXS 是 ZD1211B 晶片，所以在 ZD1211B 下方增加一行：<br />
/* ZD1211B */<br />
{ USB_DEVICE(<strong>0&#215;2019, 0&#215;5303</strong>), .driver_info = DEVICE_ZD1211B },<br />
確認後就存檔離開</p>
<p><strong>開始編譯驅動</strong><br />
$ sudo mkdir .tmp_versions<br />
$ sudo make drivers/net/wireless/zd1211rw/zd1211rw.ko</p>
<p><strong>沒錯誤就會產生 zd1211rw.ko，將它覆蓋原本系統中的</strong><br />
$ sudo cp drivers/net/wireless/zd1211rw/zd1211rw.ko /lib/modules/`uname -r`/kernel/drivers/net/wireless/zd1211rw<br />
$ sudo depmod -a</p>
<p>重開機應該就可以正確驅動了:D</p>
<p>參考資料：<br />
<a href="http://www.linuxwireless.org/en/users/Drivers/zd1211rw/AddID" target="_blank">Adding new device IDs to zd1211rw</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/209/feed</wfw:commentRss>
		</item>
		<item>
		<title>Windows Live Messenger 8.5 正式版</title>
		<link>http://blog.linym.net/archives/207</link>
		<comments>http://blog.linym.net/archives/207#comments</comments>
		<pubDate>Wed, 07 Nov 2007 15:28:49 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[軟體筆記]]></category>

		<category><![CDATA[Messenger]]></category>

		<category><![CDATA[msn]]></category>

		<category><![CDATA[WLM]]></category>

		<category><![CDATA[即時通訊]]></category>

		<category><![CDATA[軟體]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/207</guid>
		<description><![CDATA[Windows Live Messenger 8.5(MSN) 今天終於釋出正式版囉！這次版本代號為 8.5.1302.1018，基本上和 beta 差不多，安裝時也是要連到官方下載很久，真是麻煩。
再來就是關於去除廣告的問題，試了一下發現廣告代碼位置已經換了，所以還需要再找看看，如果有人試出來麻煩分享一下方法，謝謝！
軟體名稱：Windows Live Messenger 8.5
版本代號：8.5.1302.1018
官方網站：http://get.live.com/zh-cht-tw/messenger/overview
去廣告+多開 Patch for 8.5.1302.1018

去除主視窗底部廣告
去除主視窗底下搜尋列
去除對話框底下之文字廣告
去除對話框底下之搜尋按鈕

]]></description>
			<content:encoded><![CDATA[<p>Windows Live Messenger 8.5(MSN) 今天終於釋出正式版囉！這次版本代號為 8.5.1302.1018，基本上和 beta 差不多，安裝時也是要連到官方下載很久，真是麻煩。</p>
<p><del datetime="2007-11-08T03:08:01+00:00">再來就是關於去除廣告的問題，試了一下發現廣告代碼位置已經換了，所以還需要再找看看，如果有人試出來麻煩分享一下方法，謝謝！</del></p>
<blockquote><p>軟體名稱：Windows Live Messenger 8.5<br />
版本代號：8.5.1302.1018<br />
官方網站：<a href="http://get.live.com/zh-cht-tw/messenger/overview" target="_blank">http://get.live.com/zh-cht-tw/messenger/overview</a></p></blockquote>
<p><strong><a href='http://blog.linym.net/wp-content/uploads/2007/11/msn_patch.exe' title=''>去廣告+多開 Patch for 8.5.1302.1018</a></strong></p>
<ul>
<li>去除主視窗底部廣告</li>
<li>去除主視窗底下搜尋列</li>
<li>去除對話框底下之文字廣告</li>
<li>去除對話框底下之搜尋按鈕</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/207/feed</wfw:commentRss>
		</item>
		<item>
		<title>拯救容量錯亂的 USB 隨身碟</title>
		<link>http://blog.linym.net/archives/204</link>
		<comments>http://blog.linym.net/archives/204#comments</comments>
		<pubDate>Thu, 01 Nov 2007 03:00:36 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[硬體筆記]]></category>

		<category><![CDATA[軟體筆記]]></category>

		<category><![CDATA[USB]]></category>

		<category><![CDATA[教學]]></category>

		<category><![CDATA[軟體]]></category>

		<category><![CDATA[隨身碟]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/204</guid>
		<description><![CDATA[前幾天要使用一個中華電信送的隨身碟時，卻出現無法存取(開不了)，換電腦也是一樣，最後將它格式化之後就可以開啟了，不過卻發現容量錯誤的情形，原本 128MB 變成了 15MB&#8230;XD，在之前也聽朋友說過有 512MB 變 4G 的案例，當然存進去的檔案很容易損毀。通常遇到這種情況又過保的就只好丟了，不過我突然想到用其他軟體來格式化試試，就找到「HP USB Disk Storage Format Tool」這個工具。

如圖，選好隨身碟代號，按下 Start 就開始格式化了，完成後容量就恢復正常了，應該還可以撐一陣子吧！
不過最後還是要提醒大家，Flash Memory 儲存裝置因為本身電氣充放電特性，有所謂物理讀寫次數的極限，通常約十萬次左右，所以千萬不要把重要資料只存在隨身碟裡面，不然哪天掛點就慘囉！
HP USB Disk Storage Format Tool
官方網頁 &#124; 免安裝綠色版
]]></description>
			<content:encoded><![CDATA[<p>前幾天要使用一個中華電信送的隨身碟時，卻出現無法存取(開不了)，換電腦也是一樣，最後將它格式化之後就可以開啟了，不過卻發現容量錯誤的情形，原本 128MB 變成了 15MB&#8230;XD，在之前也聽朋友說過有 512MB 變 4G 的案例，當然存進去的檔案很容易損毀。通常遇到這種情況又過保的就只好丟了，不過我突然想到用其他軟體來格式化試試，就找到「HP USB Disk Storage Format Tool」這個工具。<br />
<a href='http://blog.linym.net/wp-content/uploads/2007/11/usb.jpg' title='HP_USB' target="_blank"><img src='http://blog.linym.net/wp-content/uploads/2007/11/usb.jpg' alt='' /></a><br />
如圖，選好隨身碟代號，按下 Start 就開始格式化了，完成後容量就恢復正常了，應該還可以撐一陣子吧！</p>
<p>不過最後還是要提醒大家，<strong>Flash Memory 儲存裝置因為本身電氣充放電特性，有所謂物理讀寫次數的極限</strong>，通常約十萬次左右，所以千萬不要把重要資料只存在隨身碟裡面，不然哪天掛點就慘囉！</p>
<p><em>HP USB Disk Storage Format Tool</em><br />
<a href="http://h50178.www5.hp.com/support/470035-692/more_info_local_17019.html" target="_blank">官方網頁</a> | <a href="http://blog.linym.net/wp-content/uploads/2007/11/hpusbfw.rar">免安裝綠色版</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/204/feed</wfw:commentRss>
		</item>
		<item>
		<title>尋人啟事</title>
		<link>http://blog.linym.net/archives/203</link>
		<comments>http://blog.linym.net/archives/203#comments</comments>
		<pubDate>Sun, 28 Oct 2007 17:35:55 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[生活日誌]]></category>

		<category><![CDATA[尋人]]></category>

		<category><![CDATA[雜記]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/203</guid>
		<description><![CDATA[今天朋友傳來這個連結，是要網友協尋一位豐原高中的女生，原本我只是大略看看，正當準備關掉網頁的時候，卻看到個熟悉的名字「鍾元凱」，繼續往下看&#8230;豐原，接著留言回應有人貼出照片&#8230;
靠&#8230;這不就是我國小同班過的同學嘛！在這裡就不方便說他從前是怎樣的人了，以免招來法律問題，我只能說我們對他印象都很深刻，這兩天應該就會看到新聞報導，希望那女生平安無事才好。
相關新聞報導：

少女挨巴掌蹺家　母部落格急尋人　上萬網友轉貼協尋

]]></description>
			<content:encoded><![CDATA[<p>今天朋友傳來這個<a href="http://www.wretch.cc/blog/gogofind456&#038;article_id=6975600" target="_blank">連結</a>，是要網友協尋一位豐原高中的女生，原本我只是大略看看，正當準備關掉網頁的時候，卻看到個熟悉的名字「鍾元凱」，繼續往下看&#8230;豐原，接著留言回應有人貼出照片&#8230;</p>
<p>靠&#8230;這不就是我國小同班過的同學嘛！在這裡就不方便說他從前是怎樣的人了，以免招來法律問題，我只能說我們對他印象都很深刻，這兩天應該就會看到新聞報導，希望那女生平安無事才好。</p>
<p>相關新聞報導：</p>
<ul>
<li><a href="http://www.ettoday.com/2007/10/29/123-2179250.htm" target="_blank">少女挨巴掌蹺家　母部落格急尋人　上萬網友轉貼協尋</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/203/feed</wfw:commentRss>
		</item>
		<item>
		<title>Ubuntu 7.10 安裝心得</title>
		<link>http://blog.linym.net/archives/201</link>
		<comments>http://blog.linym.net/archives/201#comments</comments>
		<pubDate>Sat, 20 Oct 2007 18:19:36 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[系統筆記]]></category>

		<category><![CDATA[OS]]></category>

		<category><![CDATA[ubuntu]]></category>

		<category><![CDATA[系統]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/201</guid>
		<description><![CDATA[最新版的 Ubuntu 7.10 Gutsy Gibbon，終於在 2007 年 10 月 18 日下午正式發佈囉！這次沒聽說塞爆伺服器的情形發生了，大多順利下載完成，我也馬上拿出 NB 來全新安裝，裝完進到桌面的感想是：比以前更順了，安裝和使用大致上也沒什麼問題，不過筆電是 ATI X1450 的顯示晶片，要啟動 Compiz Fusion 特效還是麻煩了些。
一、啟動 Compiz Fusion 桌面特效
在新版中，如果顯卡驅動沒問題並且有支援，預設就會啟動特效，如果要手動更改可到 偏好設定 -> 外觀設定 -> Visual Effects 設定。
二、安裝 Compiz Fusion 管理工具
新版中設定 Compiz Fusion 特效要安裝 compizconfig-settings-manager，不要使用 gnome-compiz-manager (會不穩定)。
三、ATI 顯卡開啟特效
我是用 ATI Mobility Radeon X1450 的晶片，預設沒辦法開啟 Compiz Fusion，但安裝內建的驅動加上 xserver-xgl 套件即可。

但是裝了 xserver-xgl 之後，特效雖然開了，SCIM 輸入法卻也掛點了，完全沒辦法打中文，幸好 Ubuntu 正體中文站 有人找到了解決方法。
選擇功能表 系統 [...]]]></description>
			<content:encoded><![CDATA[<p>最新版的 <a href="http://www.ubuntu.com/" target="_blank">Ubuntu 7.10 Gutsy Gibbon</a>，終於在 2007 年 10 月 18 日下午正式發佈囉！這次沒聽說塞爆伺服器的情形發生了，大多順利下載完成，我也馬上拿出 NB 來全新安裝，裝完進到桌面的感想是：比以前更順了，安裝和使用大致上也沒什麼問題，不過筆電是 ATI X1450 的顯示晶片，要啟動 Compiz Fusion 特效還是麻煩了些。</p>
<p><strong>一、啟動 Compiz Fusion 桌面特效</strong><br />
在新版中，如果顯卡驅動沒問題並且有支援，預設就會啟動特效，如果要手動更改可到 <em>偏好設定 -> 外觀設定 -> Visual Effects</em> 設定。</p>
<p><strong>二、安裝 Compiz Fusion 管理工具</strong><br />
新版中設定 Compiz Fusion 特效要安裝 compizconfig-settings-manager，不要使用 gnome-compiz-manager (會不穩定)。</p>
<p><strong>三、ATI 顯卡開啟特效</strong><br />
我是用 ATI Mobility Radeon X1450 的晶片，預設沒辦法開啟 Compiz Fusion，但安裝內建的驅動加上 xserver-xgl 套件即可。<br />
<a href='http://blog.linym.net/wp-content/uploads/2007/10/01jpg.jpg' title=''><img src='http://blog.linym.net/wp-content/uploads/2007/10/01jpg.jpg' alt='driver' width="500" /></a></p>
<p>但是裝了 xserver-xgl 之後，特效雖然開了，SCIM 輸入法卻也掛點了，完全沒辦法打中文，幸好 <a href="http://www.ubuntu.org.tw/modules/newbb/viewtopic.php?viewmode=flat&#038;type=&#038;topic_id=6465&#038;forum=2" target="_blank">Ubuntu 正體中文站</a> 有人找到了解決方法。<br />
選擇功能表 系統  -> 偏好設定 -> 作業階段 -> 初始啟動程式 -> 新增 -> 名稱（SCIM）→ 指令（scim) ，重新啟動即可。</p>
<p><del datetime="2007-10-27T16:48:16+00:00">ps. 據說官方即將釋出 8.42 驅動，預設就可以支援特效，敬請期待！</del><br />
<a href="http://ati.amd.com/support/drivers/linux/linux-radeon.html" target="_blank">8.42.3</a> 版的 Linux 驅動已釋出，但許多人試用的感想都不太理想，因此如果要開啟 compiz 特效，建議還是使用上面的方法。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/201/feed</wfw:commentRss>
		</item>
		<item>
		<title>Ubuntu 懶人包 - Lazybuntu 正式版發佈</title>
		<link>http://blog.linym.net/archives/199</link>
		<comments>http://blog.linym.net/archives/199#comments</comments>
		<pubDate>Sat, 20 Oct 2007 16:47:55 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[系統筆記]]></category>

		<category><![CDATA[軟體筆記]]></category>

		<category><![CDATA[Lazybuntu]]></category>

		<category><![CDATA[ubuntu]]></category>

		<category><![CDATA[軟體]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/199</guid>
		<description><![CDATA[由 PCMan 所發起的 Ubuntu 懶人包 - Lazybuntu 終於正式發佈囉！剛好趕上 Ubuntu 7.10 的發行 ，正式版號為 0.1，強調 3個步驟，搞定你的 Ubuntu，Ubuntu 安裝完後，再使用 Lazybuntu，就能讓你的 Ubuntu 更好用，省去了麻煩的調校設定工作，值得 Ubuntu 新手或愛用者試試！

]]></description>
			<content:encoded><![CDATA[<p>由 PCMan 所發起的 Ubuntu 懶人包 - <a href="http://lazybuntu.openfoundry.org/" target="_blank">Lazybuntu</a> 終於正式發佈囉！剛好趕上 <a href="http://releases.ubuntu.com/releases/7.10/" target="_blank">Ubuntu 7.10</a> 的發行 ，正式版號為 0.1，強調 <strong>3個步驟，搞定你的 Ubuntu</strong>，Ubuntu 安裝完後，再使用 <a href="http://lazybuntu.openfoundry.org/" target="_blank">Lazybuntu</a>，就能讓你的 Ubuntu 更好用，省去了麻煩的調校設定工作，值得 Ubuntu 新手或愛用者試試！<br />
<a href='http://blog.linym.net/wp-content/uploads/2007/10/lazybuntu_screenshot.png' title=''><img src='http://blog.linym.net/wp-content/uploads/2007/10/lazybuntu_screenshot.png' alt='Lazybuntu' width="500" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/199/feed</wfw:commentRss>
		</item>
		<item>
		<title>台灣保護傘公司</title>
		<link>http://blog.linym.net/archives/197</link>
		<comments>http://blog.linym.net/archives/197#comments</comments>
		<pubDate>Sat, 20 Oct 2007 02:00:10 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[生活日誌]]></category>

		<category><![CDATA[保護傘]]></category>

		<category><![CDATA[惡靈古堡]]></category>

		<category><![CDATA[趣味]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/197</guid>
		<description><![CDATA[昨天逛逢甲校園的時候，發現這個駐校廠商名單：

原來惡靈古堡裡面的保護傘公司在台灣阿XD
]]></description>
			<content:encoded><![CDATA[<p>昨天逛逢甲校園的時候，發現這個駐校廠商名單：<br />
<a href='http://blog.linym.net/wp-content/uploads/2007/10/dsc00189.JPG' title=''><img src='http://blog.linym.net/wp-content/uploads/2007/10/dsc00189.JPG' alt='保護傘公司' width="480" /></a><br />
原來惡靈古堡裡面的保護傘公司在台灣阿XD</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/197/feed</wfw:commentRss>
		</item>
		<item>
		<title>建立網頁縮圖(Webthumb)</title>
		<link>http://blog.linym.net/archives/196</link>
		<comments>http://blog.linym.net/archives/196#comments</comments>
		<pubDate>Fri, 05 Oct 2007 15:45:22 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[Other]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[程式筆記]]></category>

		<category><![CDATA[Webthumb]]></category>

		<category><![CDATA[網頁]]></category>

		<category><![CDATA[縮圖]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/196</guid>
		<description><![CDATA[目前不少網站都有自動產生網頁縮圖的功能，像是 HEMiDEMi、funP 推推王、Alexa 等等，雖然很想知道其中所使用的技術，不過似乎很難找到相關文章，大多是倚賴提供縮圖服務的網站居多。
Bluga.net WebThumb
我覺得很不錯的縮圖服務網站，每個月可免費建立 250 組縮圖，且提供 API 可以應用在程式上，產生縮圖速度算滿快的，大約 2~5 分鐘即可顯示。
artViper Website Tools
這網站有提供一些 Website Tools，其中就有網頁縮圖的功能。
Website Thumbnail Generator
這個是不需要依賴其他網站的，使用了 IECapt 這個小工具，所以主機只能是 Windows，配合 PHP 來自動產生縮圖。
延伸閱讀：
Website Thumbnail Creators (Website Snapshot Generators)
]]></description>
			<content:encoded><![CDATA[<p>目前不少網站都有自動產生網頁縮圖的功能，像是 <a href="http://www.hemidemi.com/" target="_blank">HEMiDEMi</a>、<a href="http://funp.com/" target="_blank">funP 推推王</a>、<a href="http://www.alexa.com/" target="_blank">Alexa</a> 等等，雖然很想知道其中所使用的技術，不過似乎很難找到相關文章，大多是倚賴提供縮圖服務的網站居多。</p>
<p><a href="http://webthumb.bluga.net/" target="_blank">Bluga.net WebThumb</a><br />
我覺得很不錯的縮圖服務網站，每個月可免費建立 250 組縮圖，且提供 API 可以應用在程式上，產生縮圖速度算滿快的，大約 2~5 分鐘即可顯示。</p>
<p><a href="http://www.artviper.com/tools.php" target="_blank">artViper Website Tools</a><br />
這網站有提供一些 Website Tools，其中就有網頁縮圖的功能。</p>
<p><a href="http://www.zubrag.com/scripts/website-thumbnail-generator.php" target="_blank">Website Thumbnail Generator</a><br />
這個是不需要依賴其他網站的，使用了 IECapt 這個小工具，所以主機只能是 Windows，配合 PHP 來自動產生縮圖。</p>
<p>延伸閱讀：<br />
<a href="http://www.zubrag.com/articles/create-website-snapshot-thumbnail.php" target="_blank">Website Thumbnail Creators (Website Snapshot Generators)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/196/feed</wfw:commentRss>
		</item>
		<item>
		<title>網賺部落格串聯送iPod Shuffle</title>
		<link>http://blog.linym.net/archives/195</link>
		<comments>http://blog.linym.net/archives/195#comments</comments>
		<pubDate>Thu, 04 Oct 2007 02:19:57 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[生活日誌]]></category>

		<category><![CDATA[免費]]></category>

		<category><![CDATA[好康]]></category>

		<category><![CDATA[抽獎]]></category>

		<category><![CDATA[部落格串聯]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/195</guid>
		<description><![CDATA[專門提供網路賺錢資訊的Simon除了原本的Adsense繁體中文觀測站外現在又新開了一個AdWitness廣告目擊者網賺部落格，這個新的網賺部落格提供各式格樣網賺資訊和部落格經營、行銷資訊。更好康的是Simon將會有一連串的部落格活動，總獎金價值近$1,000美元(3萬元新台幣)，現在串聯送iPod Shuffle算是第一波活動。本次活動將在2007年10月23日結止，只要你有部落格且完成指定的串連你就有機會獲得一台iPod Shuffle，現在就去看如何參加這次的串聯送iPod Shuffle吧!
詳細活動辦法：網賺部落格串聯送iPod Shuffle
]]></description>
			<content:encoded><![CDATA[<blockquote><p>專門提供<a href="http://adwitness.com/blog/make-money-online/">網路賺錢</a>資訊的Simon除了原本的<a href="http://adsense-tw.com/">Adsense繁體中文觀測站</a>外現在又新開了一個AdWitness廣告目擊者<a href="http://adwitness.com/blog/">網賺部落格</a>，這個新的網賺部落格提供各式格樣網賺資訊和部落格經營、行銷資訊。更好康的是Simon將會有一連串的部落格活動，總獎金價值近$1,000美元(3萬元新台幣)，現在<a href="http://adwitness.com/blog/win-ipod-shuffle/">串聯送iPod Shuffle</a>算是第一波活動。本次活動將在2007年10月23日結止，只要你有部落格且完成指定的串連你就有機會獲得一台iPod Shuffle，現在就去看如何參加這次的<a href="http://adwitness.com/blog/win-ipod-shuffle/">串聯送iPod Shuffle</a>吧!</p></blockquote>
<p>詳細活動辦法：<a href="http://luckylongtail.com/archives/172">網賺部落格串聯送iPod Shuffle</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/195/feed</wfw:commentRss>
		</item>
		<item>
		<title>徹底移除新倉頡輸入法</title>
		<link>http://blog.linym.net/archives/188</link>
		<comments>http://blog.linym.net/archives/188#comments</comments>
		<pubDate>Wed, 03 Oct 2007 12:43:09 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[Windows]]></category>

		<category><![CDATA[系統筆記]]></category>

		<category><![CDATA[新倉頡]]></category>

		<category><![CDATA[輸入法]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/188</guid>
		<description><![CDATA[新倉頡移除不掉這個問題其實以前就有囉！只是最近 Office 2003 釋出 SP3 更新，不少用戶自動更新後新倉頡又跑出來了。(新注音移除不掉也是同樣的解決方法)

↑明明已經沒有新倉頡了

↑切換輸入法的時候卻又跑出來
解決方法:
1. 先將新倉頡(或新注音)新增回去。
2. 將下列文字存成 .reg 登錄檔，點兩下匯入。
;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
&#34;CJIMETIPSYNC&#34;=-
;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
3. 再將新倉頡(或新注音)移除。
4. 重新開機就不會再出現了。
]]></description>
			<content:encoded><![CDATA[<p>新倉頡移除不掉這個問題其實以前就有囉！只是最近 Office 2003 釋出 SP3 更新，不少用戶自動更新後新倉頡又跑出來了。(新注音移除不掉也是同樣的解決方法)<br />
<a href='http://blog.linym.net/wp-content/uploads/2007/10/1.JPG' title=''><img src='http://blog.linym.net/wp-content/uploads/2007/10/1.JPG' alt='' /></a><br />
↑明明已經沒有新倉頡了</p>
<p><a href='http://blog.linym.net/wp-content/uploads/2007/10/2.JPG' title=''><img src='http://blog.linym.net/wp-content/uploads/2007/10/2.JPG' alt='' /></a><br />
↑切換輸入法的時候卻又跑出來</p>
<p><strong>解決方法:</strong><br />
1. 先將新倉頡(或新注音)新增回去。<br />
2. 將下列文字存成 .reg <a href='http://blog.linym.net/wp-content/uploads/2007/10/fix.zip' title=''>登錄檔</a>，點兩下匯入。<br />
;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
Windows Registry Editor Version 5.00</p>
<p>[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]<br />
&quot;CJIMETIPSYNC&quot;=-<br />
;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
3. 再將新倉頡(或新注音)移除。<br />
4. 重新開機就不會再出現了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/188/feed</wfw:commentRss>
		</item>
		<item>
		<title>用 PHP 寫 RS232 串列通訊程式</title>
		<link>http://blog.linym.net/archives/187</link>
		<comments>http://blog.linym.net/archives/187#comments</comments>
		<pubDate>Tue, 02 Oct 2007 11:25:06 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[程式筆記]]></category>

		<category><![CDATA[serial]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/187</guid>
		<description><![CDATA[相信經常在翻 PHP 手冊的人應該都有察覺，PHP 不只是可以用來開發網頁程式而已，很多其他語言能完成的工作 PHP 也都做的到，例如透過 PHP 的 Direct IO Functions 就可以對 Serial port 溝通，而且可以在 Windows 下執行，一般在 Windows 要實做 com port 通訊程式，大多是透過像 VB/VC++/C++ Builder 這類程式所提供的元件來撰寫，不過用 PHP 就可以很快實做出一般的功能囉！
在開始之前要先讓 PHP 支援 dio 才行，5.1.0 版之後已經將 dio 移至 PECL 了，可以到 PHP 官網下載編譯好的 PECL，解壓縮後將裡面的 php_dio.dll 放到 PHP 目錄的 ext 底下，接著修改 php.ini 加入 extension=php_dio.dll 即可。
在 Windows 底下讀取 COM1 的例子：
&#60;?phpexec('mode COM1: baud=19200 [...]]]></description>
			<content:encoded><![CDATA[<p>相信經常在翻 PHP 手冊的人應該都有察覺，PHP 不只是可以用來開發網頁程式而已，很多其他語言能完成的工作 PHP 也都做的到，例如透過 PHP 的 <a href="http://tw2.php.net/manual/en/ref.dio.php" target="_blank">Direct IO Functions</a> 就可以對 Serial port 溝通，而且可以在 Windows 下執行，一般在 Windows 要實做 com port 通訊程式，大多是透過像 VB/VC++/C++ Builder 這類程式所提供的元件來撰寫，不過用 PHP 就可以很快實做出一般的功能囉！</p>
<p>在開始之前要先讓 PHP 支援 dio 才行，5.1.0 版之後已經將 dio 移至 PECL 了，可以到 PHP 官網下載編譯好的 <a href="http://tw2.php.net/downloads.php" target="_blank">PECL</a>，解壓縮後將裡面的 <strong>php_dio.dll</strong> 放到 PHP 目錄的 ext 底下，接著修改 php.ini 加入 <strong>extension=php_dio.dll</strong> 即可。</p>
<p>在 Windows 底下讀取 COM1 的例子：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"><br /></span><span style="color: Blue;">exec</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">mode COM1: baud=19200 data=8 stop=1 parity=n</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$fd</span><span style="color: Gray;"> = </span><span style="color: Blue;">dio_open</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">COM1:</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Blue;">O_RDWR</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Green;">while</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> = </span><span style="color: Blue;">dio_read</span><span style="color: Olive;">(</span><span style="color: #00008b;">$fd</span><span style="color: Gray;">, </span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$data</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">echo</span><span style="color: Gray;"> </span><span style="color: #00008b;">$data</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Blue;">dio_close</span><span style="color: Olive;">(</span><span style="color: #00008b;">$fd</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">?&gt;</span></div></div>
<p>寫法跟在 Linux 用 C 寫 serial 通訊程式差不多，其中 mode 是 Windows 命令列一個設定 serial port 組態的工具(類似 Linux 的 stty)，可以打 mode /? 看詳細說明，設定好傳輸率等，接著用 dio_open 開啟裝置，然後就可以做存取的動作囉！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/187/feed</wfw:commentRss>
		</item>
		<item>
		<title>C 語言中 printf 的問題(續)</title>
		<link>http://blog.linym.net/archives/186</link>
		<comments>http://blog.linym.net/archives/186#comments</comments>
		<pubDate>Sun, 30 Sep 2007 03:03:53 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[C/C++]]></category>

		<category><![CDATA[程式筆記]]></category>

		<category><![CDATA[C]]></category>

		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/186</guid>
		<description><![CDATA[在前一篇當中提到了 printf 結果異常的問題，在睡前翻了一下手邊借來的「C Primer Plus」，沒想到就有提到這個問題，印象中其他書籍似乎都沒有講到，C Primer 系列果然是好書！
簡單來說就是 C 語言中，compiler 可以選擇先計算函數中的哪個參數，以增加編譯程式的效率，所以前一篇的例子：
printf(&#34;%d, %d&#34;, age, age++);
compiler 很可能會先算第二個參數，先改變了 num 數值，這樣就造成結果不如預期了。
在「C Primer Plus 5/e 中文精華版」第五章有寫道，遵循以下原則可以避免這些問題：


請勿在函數當中，對使用不止一次的參數使用遞增或遞減運算子。
請勿在運算式當中，對使用不止一次的變數使用遞增或遞減運算子。


第一點就是上面所說的例子，第二點的例子如下：
n = 3;y = n++ + n++;
在 C 標準中並沒有定義這行程式會如何執行，是哪一個先加 1 再運算，還是都先不加，造成了含糊不清的結果，應當避免這種寫法。
]]></description>
			<content:encoded><![CDATA[<p>在<a href="http://blog.linym.net/archives/185">前一篇</a>當中提到了 printf 結果異常的問題，在睡前翻了一下手邊借來的「C Primer Plus」，沒想到就有提到這個問題，印象中其他書籍似乎都沒有講到，C Primer 系列果然是好書！</p>
<p>簡單來說就是 C 語言中，compiler 可以選擇先計算函數中的哪個參數，以增加編譯程式的效率，所以前一篇的例子：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">printf</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">%d, %d</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">age</span><span style="color: Gray;">, </span><span style="color: Blue;">age</span><span style="color: Gray;">++</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></div></div>
<p>compiler 很可能會先算第二個參數，先改變了 num 數值，這樣就造成結果不如預期了。</p>
<p>在「<a href="http://www.books.com.tw/exep/prod/booksfile.php?item=0010322617" target="_blank">C Primer Plus 5/e 中文精華版</a>」第五章有寫道，遵循以下原則可以避免這些問題：</p>
<blockquote>
<ol>
<li>請勿在函數當中，對使用不止一次的參數使用遞增或遞減運算子。</li>
<li>請勿在運算式當中，對使用不止一次的變數使用遞增或遞減運算子。</li>
</ol>
</blockquote>
<p>第一點就是上面所說的例子，第二點的例子如下：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">n</span><span style="color: Gray;"> = </span><span style="color: Maroon;">3</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">y</span><span style="color: Gray;"> = </span><span style="color: Blue;">n</span><span style="color: Gray;">++ + </span><span style="color: Blue;">n</span><span style="color: Gray;">++;</span></div></div>
<p>在 C 標準中並沒有定義這行程式會如何執行，是哪一個先加 1 再運算，還是都先不加，造成了含糊不清的結果，應當避免這種寫法。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/186/feed</wfw:commentRss>
		</item>
		<item>
		<title>C 語言中 printf 的問題</title>
		<link>http://blog.linym.net/archives/185</link>
		<comments>http://blog.linym.net/archives/185#comments</comments>
		<pubDate>Sat, 29 Sep 2007 16:00:10 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[C/C++]]></category>

		<category><![CDATA[程式筆記]]></category>

		<category><![CDATA[bug]]></category>

		<category><![CDATA[C]]></category>

		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/185</guid>
		<description><![CDATA[今天有個學妹問我一個 C 程式的問題：下面程式的結果為何？
#include &#60;stdio.h&#62;int main(void){&#160;&#160; &#160;int age = 20;&#160;&#160; &#160;printf(&#34;You are now %d, and will be %d in one year&#34;, age, age++);&#160;&#160; &#160;return 0 ;}
自認觀念還不錯的我直接就回答「20, 20」。但沒想到實際跑的答案竟然是「21, 20」，這真是出乎意料的結果啊！
馬上另外測試了其他有 printf 函式的語言，如 Java、PHP，結果也都是正確的「20, 20」，所以不知道是 C printf 的 bug 還是什麼原因，希望有人能解答。
請看：C 語言中 printf 的問題(續)
]]></description>
			<content:encoded><![CDATA[<p>今天有個學妹問我一個 C 程式的問題：下面程式的結果為何？</p>
<div class="hl-surround"><div class="hl-main"><span class="hl-prepro">#include </span><span style="color: #8b0000;">&lt;</span><span style="color: Red;">stdio.h</span><span style="color: #8b0000;">&gt;</span><span class="hl-prepro"></span><span style="color: Gray;"><br /></span><span class="hl-types">int</span><span style="color: Gray;"> </span><span style="color: Blue;">main</span><span style="color: Olive;">(</span><span class="hl-types">void</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span class="hl-types">int</span><span style="color: Gray;"> </span><span style="color: Blue;">age</span><span style="color: Gray;"> = </span><span style="color: Maroon;">20</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">printf</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">You are now %d, and will be %d in one year</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">age</span><span style="color: Gray;">, </span><span style="color: Blue;">age</span><span style="color: Gray;">++</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Maroon;">0</span><span style="color: Gray;"> ;<br /></span><span style="color: Olive;">}</span></div></div>
<p>自認觀念還不錯的我直接就回答「20, 20」。但沒想到實際跑的答案竟然是「21, 20」，這真是出乎意料的結果啊！</p>
<p>馬上另外測試了其他有 printf 函式的語言，如 Java、PHP，結果也都是正確的「20, 20」，所以不知道是 C printf 的 bug 還是什麼原因，希望有人能解答。</p>
<p>請看：<a href="http://blog.linym.net/archives/186">C 語言中 printf 的問題(續)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/185/feed</wfw:commentRss>
		</item>
		<item>
		<title>DiscWizard:免費版的 Acronis True Image</title>
		<link>http://blog.linym.net/archives/183</link>
		<comments>http://blog.linym.net/archives/183#comments</comments>
		<pubDate>Thu, 27 Sep 2007 06:30:51 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[Windows]]></category>

		<category><![CDATA[軟體筆記]]></category>

		<category><![CDATA[備份]]></category>

		<category><![CDATA[軟體]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/183</guid>
		<description><![CDATA[磁碟備份軟體除了有歷史悠久的 Ghost，近幾年也出現了頗受好評的另一套軟體 - Acronis True Image。之前試用過的感想是速度很快，完整備份整個分區只要幾分鐘就搞定了，只可惜它也是要錢的。
不過現在硬碟廠商 Seagate 和 Acronis 公司合作，推出一個 OEM 產品叫做「Seagate DiscWizard」，採用 True Image 的核心，擁有 True Image 的基本功能，備份、還原、救援都可以輕鬆搞定。想當然爾，這只能用在自家硬碟(Seagate、Maxtor)上，其他廠牌則無法使用。
(在網站上可以看到另一套 Maxtor MaxBlast，其實是同樣的東西，只是名稱不同而已)
來看看介面吧，有沒有跟 True Image 很像？

]]></description>
			<content:encoded><![CDATA[<p>磁碟備份軟體除了有歷史悠久的 Ghost，近幾年也出現了頗受好評的另一套軟體 - <a href="http://www.acronis.com" target="_blank">Acronis True Image</a>。之前試用過的感想是速度很快，完整備份整個分區只要幾分鐘就搞定了，只可惜它也是要錢的。</p>
<p>不過現在硬碟廠商 Seagate 和 Acronis 公司合作，推出一個 OEM 產品叫做「<a href="http://www.seagate.com/www/zh-tw/support/downloads/discwizard/discwizard-eula" target="_blank">Seagate DiscWizard</a>」，採用 True Image 的核心，擁有 True Image 的基本功能，備份、還原、救援都可以輕鬆搞定。想當然爾，這只能用在自家硬碟(Seagate、Maxtor)上，其他廠牌則無法使用。</p>
<p>(在網站上可以看到另一套 Maxtor MaxBlast，其實是同樣的東西，只是名稱不同而已)</p>
<p>來看看介面吧，有沒有跟 True Image 很像？<br />
<a href='http://blog.linym.net/wp-content/uploads/2007/09/discwizard.jpg' title='discwizard.jpg'><img src='http://blog.linym.net/wp-content/uploads/2007/09/discwizard.jpg' alt='discwizard.jpg' width="550" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/183/feed</wfw:commentRss>
		</item>
		<item>
		<title>移植 Flite 到 ARM 平台</title>
		<link>http://blog.linym.net/archives/182</link>
		<comments>http://blog.linym.net/archives/182#comments</comments>
		<pubDate>Thu, 20 Sep 2007 17:09:41 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[Embedded]]></category>

		<category><![CDATA[arm]]></category>

		<category><![CDATA[flite]]></category>

		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/182</guid>
		<description><![CDATA[Flite (Festival-Lite) 是一套 TTS(Text To Speech) 系統，透過語音合成技術，不需要錄一堆龐大的語音資料庫就可以朗讀文句。Flite 顧名思義就是有名的 Festival 重寫精簡版，更適合應用在嵌入式系統上，編譯完的執行檔只有 2.5MB 左右，也由於是使用 C 寫的，所以可以很容易和自己的程式結合，試了半天總算可以在 2410 Arm Linux 上面跑起來了。
1. 跨平台編譯
編譯方式和大多數 Open Source 差不多。
# ./configure CC=arm-linux-gcc &#8211;host=arm-linux
# make
# arm-linux-strip bin/flite
完成就會得到 flite 執行檔，下載到板子測試：
# flite -t &#34;Hello, How are you?&#34;
嗯，沒有聲音，只有第一次出現 0.x 秒的雜音，再試試：
# flite &#34;Hello, How are you?&#34; test.wav
會將語音存成 test.wav，抓到 PC 上播放，很正常。所以猜想應該是放音部份的問題。
2. 修改 src/audio/au_oss.c
覺得這一段怪怪的，因為記得 S3C2410 採用的 UDA1341 音效晶片只有 Ch1 和 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.speech.cs.cmu.edu/flite/index.html" target="_blank">Flite</a> (Festival-Lite) 是一套 TTS(Text To Speech) 系統，透過語音合成技術，不需要錄一堆龐大的語音資料庫就可以朗讀文句。Flite 顧名思義就是有名的 <a href="http://www.cstr.ed.ac.uk/projects/festival/" target="_blank">Festival</a> 重寫精簡版，更適合應用在嵌入式系統上，編譯完的執行檔只有 2.5MB 左右，也由於是使用 C 寫的，所以可以很容易和自己的程式結合，試了半天總算可以在 2410 Arm Linux 上面跑起來了。</p>
<p><strong>1. 跨平台編譯</strong><br />
編譯方式和大多數 Open Source 差不多。<br />
# ./configure CC=arm-linux-gcc &#8211;host=arm-linux<br />
# make<br />
# arm-linux-strip bin/flite</p>
<p>完成就會得到 flite 執行檔，下載到板子測試：<br />
# flite -t &quot;Hello, How are you?&quot;<br />
嗯，沒有聲音，只有第一次出現 0.x 秒的雜音，再試試：<br />
# flite &quot;Hello, How are you?&quot; test.wav<br />
會將語音存成 test.wav，抓到 PC 上播放，很正常。所以猜想應該是放音部份的問題。</p>
<p><strong>2. 修改 src/audio/au_oss.c</strong><br />
覺得這一段怪怪的，因為記得 S3C2410 採用的 UDA1341 音效晶片只有 Ch1 和 Ch2<br />
    if (ad->channels == 0)<br />
	ad->channels = 1;<br />
改成<br />
    if (ad->channels == 1)<br />
	ad->channels = 2;<br />
重新編譯後再測試，有了，有聲音出來了，不過速度太快了，根本聽不清楚再唸什麼，所以要再改一下。</p>
<p><strong>3. 修改 lang/cmu_us_kal/cmu_us_kal.c</strong><br />
    /* Intonation */<br />
    feat_set_float(v->features,&quot;int_f0_target_mean&quot;,95.0); //音色<br />
    feat_set_float(v->features,&quot;int_f0_target_stddev&quot;,11.0); //音調<br />
    feat_set_float(v->features,&quot;duration_stretch&quot;,1.1);  //速度<br />
前兩個互相搭配可以調整出不同的聲音，實際測試結果發現在 ARM 平台及 PC 上播放會差滿多的，PC 上照預設值就很好聽，ARM 則是調整到下面這樣才比較能接受。<br />
    /* Intonation */<br />
    feat_set_float(v->features,&quot;int_f0_target_mean&quot;,167.0); //音色<br />
    feat_set_float(v->features,&quot;int_f0_target_stddev&quot;,65.0); //音調<br />
    feat_set_float(v->features,&quot;duration_stretch&quot;,2.5);  //速度</p>
<p>英文 TTS 差不多都已經滿純熟了，中文 TTS 不少業界或實驗室也都有不錯成果，不過都是要付費居多，如果是 Windows 則有微軟的 Speech SDK 可以使用。<br />
另外有找到 <a href="http://www.sounding.com.tw/modules/tinyd3/index.php?id=1" target="_blank">SD178A</a> 這顆 IC，應該是個不錯的東西。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/182/feed</wfw:commentRss>
		</item>
		<item>
		<title>在嵌入式 Linux 架設 Boa Webserver</title>
		<link>http://blog.linym.net/archives/180</link>
		<comments>http://blog.linym.net/archives/180#comments</comments>
		<pubDate>Tue, 18 Sep 2007 10:16:13 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
		
		<category><![CDATA[Embedded]]></category>

		<category><![CDATA[Linux]]></category>

		<category><![CDATA[Server]]></category>

		<category><![CDATA[boa]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/180</guid>
		<description><![CDATA[Boa 是一套小型的網頁伺服器，很適合應用在 Embedded System 上，並且內建就可以直接支援以 C 寫的 CGI 網頁，這篇是移植 Boa 到 ARM9 S3C2410 平台的過程，Linux 版本為 2.6.17.4，使用 arm-linux toolchain 3.4.1 編譯。
1. 產生 Makefile
下載 Source code 並解壓縮進到 src 目錄。
# ./configure &#8211;host=arm-linux
2. 修改 Makefile 使用跨平台編譯
CC = arm-linux-gcc
CPP = arm-linux-gcc -E
# make (如果編譯或執行時有錯誤請看Q&#038;A)
# arm-linux-strip boa
3. 配置 Boa
可以在源碼目錄找到這個設定檔，放到 /etc/boa 裡面，有修改的部份如下：
User 0
Group 0
#DirectoryMaker /usr/lib/boa/boa_indexer
CGIPath /bin:/usr/bin:/var/www/cgi-bin
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
然後需要放一個 mime.types 檔案在 /etc，我是直接複製 ubuntu [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.boa.org/" target="_blank">Boa</a> 是一套小型的網頁伺服器，很適合應用在 Embedded System 上，並且內建就可以直接支援以 C 寫的 CGI 網頁，這篇是移植 Boa 到 ARM9 S3C2410 平台的過程，Linux 版本為 2.6.17.4，使用 arm-linux toolchain 3.4.1 編譯。</p>
<p><strong>1. 產生 Makefile</strong><br />
下載 Source code 並解壓縮進到 src 目錄。<br />
# ./configure &#8211;host=arm-linux</p>
<p><strong>2. 修改 Makefile 使用跨平台編譯</strong><br />
CC = <span style="color:blue">arm-linux-</span>gcc<br />
CPP = <span style="color:blue">arm-linux-</span>gcc -E<br />
# make (如果編譯或執行時有錯誤請看Q&#038;A)<br />
# arm-linux-strip boa</p>
<p><strong>3. 配置 Boa</strong><br />
可以在源碼目錄找到這個設定檔，放到 /etc/boa 裡面，有修改的部份如下：<br />
User 0<br />
Group 0<br />
#DirectoryMaker /usr/lib/boa/boa_indexer<br />
CGIPath /bin:/usr/bin:/var/www/cgi-bin<br />
ScriptAlias /cgi-bin/ /var/www/cgi-bin/</p>
<p>然後需要放一個 <a href='http://blog.linym.net/wp-content/uploads/2007/09/mime.zip' title='mime.zip'>mime.types</a> 檔案在 /etc，我是直接複製 ubuntu 裡的檔案。</p>
<p><strong>4. 加入 boa 執行檔</strong><br />
將編譯好的 boa 執行檔加入檔案系統 /bin，要啟動 server 只要輸入 boa 即可，可到 /var/log/boa 查看 log。</p>
<p><strong>問題 Q&#038;A：</strong><br />
<span id="more-180"></span><br />
<strong>Q：使用 toolchain 3.4.1 編譯出現錯誤</strong><br />
arm-linux-gcc  -g -O2 -pipe -Wall -I.   -c -o util.o util.c<br />
util.c:100:1: pasting &quot;t&quot; and &quot;->&quot; does not give a valid preprocessing token<br />
make: *** [util.o] Error 1<br />
A：修改 src/compat.h<br />
找到<br />
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff<br />
修改成<br />
#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff</p>
<p><strong>Q：執行 boa 出現 &quot;gethostbyname::No such file or directory&quot;</strong><br />
A：需將 boa.conf 裡的 ServerName 開頭註解拿掉</p>
<p><strong>Q：無法啟動 Boa，error log 顯示 &quot;boa.c:266.icky Linux kernel bug!:No such file&quot;</strong><br />
A：修改 src/boa.c，將底下判斷式註解掉：<br />
/*if (setuid(0) != -1) {<br />
    DIE(&quot;icky Linux kernel bug!&quot;);<br />
}*/<br />
重新編譯</p>
<p><strong>Q：