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

<channel>
	<title>憂藍夢境‧部落格 &#187; Programming</title>
	<atom:link href="http://blog.linym.net/archives/tag/programming/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.linym.net</link>
	<description>我的學習心得、筆記</description>
	<lastBuildDate>Fri, 09 Dec 2011 12:33:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>使用 C# 呼叫 MATLAB Function</title>
		<link>http://blog.linym.net/archives/564</link>
		<comments>http://blog.linym.net/archives/564#comments</comments>
		<pubDate>Thu, 10 Sep 2009 07:49:21 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
				<category><![CDATA[Other]]></category>
		<category><![CDATA[程式筆記]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[MATLAB]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.linym.net/?p=564</guid>
		<description><![CDATA[最近在寫一些演算法的程式，經常要在一堆程式和檔案切換來切換去的，跑完數據還要開 MATLAB 畫圖，一直重複這些動作實在是很麻煩，所以把它寫成 Windows Form 用滑鼠點一點就 OK 了，其中繪圖部份就要利用 C# 去 call MATLAB 來作，查了許多資料，發現有很多種方法，但比較簡單方便的應該是用 MATLAB Builder NE for .NET 將 MATLAB 程式編譯成 .NET 可執行的元件。 1. 首先準備好你要 compiler 的 M-file，測試的 M-file 如下(由檔案讀取 x, y 數據曲線圖)： function rmse(file) data = load(file); x = data(:,1); y = data(:,2); plot(x,y,&#039;LineWidth&#039;,1); xlabel(&#039;Iteration&#039;); ylabel(&#039;RMS error&#039;); 2. 開啟 MATLAB 並在 command windows 輸入：deploytool [...]]]></description>
			<content:encoded><![CDATA[<p>最近在寫一些演算法的程式，經常要在一堆程式和檔案切換來切換去的，跑完數據還要開 MATLAB 畫圖，一直重複這些動作實在是很麻煩，所以把它寫成 Windows Form 用滑鼠點一點就 OK 了，其中繪圖部份就要利用 C# 去 call MATLAB 來作，查了許多資料，發現有很多種方法，但比較簡單方便的應該是用 <a href="http://www.mathworks.com/products/netbuilder/" target="_blank">MATLAB Builder NE for .NET</a> 將 MATLAB 程式編譯成 .NET 可執行的元件。</p>
<p>1. 首先準備好你要 compiler 的 M-file，測試的 M-file 如下(由檔案讀取 x, y 數據曲線圖)：</p>
<pre title="code" class="cpp">

function rmse(file)

data = load(file);
x = data(:,1);
y = data(:,2);

plot(x,y,&#039;LineWidth&#039;,1);

xlabel(&#039;Iteration&#039;);
ylabel(&#039;RMS error&#039;);
</pre>
<p>2. 開啟 MATLAB 並在 command windows 輸入：<strong>deploytool</strong><br />
    新建一個 project，名稱為 rmse。<br />
    <a href="http://blog.linym.net/wp-content/uploads/2009/09/01.JPG"><img src="http://blog.linym.net/wp-content/uploads/2009/09/01.JPG" alt="New Project" title="New Project" width="646" height="451" class="alignnone size-full wp-image-567" /></a><br />
    選擇 .NET component<br />
    <a href="http://blog.linym.net/wp-content/uploads/2009/09/2.JPG"><img src="http://blog.linym.net/wp-content/uploads/2009/09/2.JPG" alt=".NET component" title=".NET component" width="510" height="510" class="alignnone size-full wp-image-571" /></a><br />
    將 M-file 加入，然後按<strong> Build the project</strong>，編譯完成會產生 rmse.dll<br />
<a href="http://blog.linym.net/wp-content/uploads/2009/09/3.JPG"><img src="http://blog.linym.net/wp-content/uploads/2009/09/3.JPG" alt="Add file" title="Add file" width="646" height="451" class="alignnone size-full wp-image-574" /></a></p>
<p>3. 將 .dll 加入 Visual Studio 參考(Reference)<br />
   在方案總管右鍵選「加入參考」>「瀏覽」，將剛剛編譯完成的 .dll 以及 MATLAB 安裝目錄底下的 toolbox\dotnetbuilder\bin\win32\v2.0\MWArray.dll 加入。</p>
<p>4. 加入 Namespace<br />
using MathWorks.MATLAB.NET.Arrays;<br />
using rmse;</p>
<p>5. 使用方式<br />
    Rmse demo = new Rmse();<br />
    MWArray fileName = @"rmse.txt";<br />
    demo.rmse(fileName);</p>
<p>※ <a href='http://blog.linym.net/wp-content/uploads/2009/09/CSharp_Matlab.rar'>demo 範例原始碼下載</a></p>
<p>※ 如果想在沒安裝 MATLAB 的電腦上執行，需安裝 MATLAB Compiler Runtime (MCR)，檔案在安裝目錄的 toolbox\compiler\deploy\win32\MCRInstaller.exe，大小約 150MB</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/564/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>用 PHP 讀寫 Excel 檔案</title>
		<link>http://blog.linym.net/archives/229</link>
		<comments>http://blog.linym.net/archives/229#comments</comments>
		<pubDate>Thu, 18 Sep 2008 13:47:07 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[程式筆記]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[讀取excel]]></category>

		<guid isPermaLink="false">http://blog.linym.net/?p=229</guid>
		<description><![CDATA[PHP 讀寫 Excel 的方法有很多種，例如先轉成 CSV 格式來讀，然後用特定符號去分隔欄位。但是如果遇到欄位格式不固定的 Excel 就很麻煩了，所以需要可以直接操作 excel 的方法，方便直接指定要取某欄某列的值。 如果是 Windows 系統的話可以使用 COM 元件去讀取，但缺點就是只能在 Windows 上跑，失去了跨平台性，所以也有人另外寫出可以讀寫 Excel 的類別，這次要推薦的是 PHPExcel，PHPExcel 的功能非常強大，原本就支援 Excel 2007，新版中也能讀取 Excel 2003 舊版的 Excel 囉！ 從 PHPExcel 下載回來的檔案中就包含不少範例，但是讀取的部份很簡略，所以底下貼個讀取 Excel 內容的範例： &#60;?php set_include_path(get_include_path() . PATH_SEPARATOR . &#039;./Classes/&#039;); include &#039;PHPExcel/IOFactory.php&#039;; $reader = PHPExcel_IOFactory::createReader(&#039;Excel5&#039;); // 讀取舊版 excel 檔案 $PHPExcel = $reader-&#62;load(&#34;course_table.xls&#34;); // 檔案名稱 $sheet = [...]]]></description>
			<content:encoded><![CDATA[<p>PHP 讀寫 Excel 的方法有很多種，例如先轉成 CSV 格式來讀，然後用特定符號去分隔欄位。但是如果遇到欄位格式不固定的 Excel 就很麻煩了，所以需要可以直接操作 excel 的方法，方便直接指定要取某欄某列的值。</p>
<p>如果是 Windows 系統的話可以使用 <a href="http://tw2.php.net/manual/en/class.com.php">COM</a> 元件去讀取，但缺點就是只能在 Windows 上跑，失去了跨平台性，所以也有人另外寫出可以讀寫 Excel 的類別，這次要推薦的是 <a href="http://www.codeplex.com/PHPExcel">PHPExcel</a>，<a href="http://www.codeplex.com/PHPExcel">PHPExcel</a> 的功能非常強大，原本就支援 Excel 2007，新版中也能讀取 Excel 2003 舊版的 Excel 囉！</p>
<p>從 <a href="http://www.codeplex.com/PHPExcel">PHPExcel</a> 下載回來的檔案中就包含不少範例，但是讀取的部份很簡略，所以底下貼個讀取 Excel 內容的範例：</p>
<pre title="code" class="php">

&lt;?php
set_include_path(get_include_path() . PATH_SEPARATOR . &#039;./Classes/&#039;);
include &#039;PHPExcel/IOFactory.php&#039;;

$reader = PHPExcel_IOFactory::createReader(&#039;Excel5&#039;); // 讀取舊版 excel 檔案
$PHPExcel = $reader-&gt;load(&quot;course_table.xls&quot;); // 檔案名稱
$sheet = $PHPExcel-&gt;getSheet(0); // 讀取第一個工作表(編號從 0 開始)
$highestRow = $sheet-&gt;getHighestRow(); // 取得總列數

// 一次讀取一列
for ($row = 2; $row &lt;= $highestRow; $row++) {

    for ($column = 1; $column &lt;= 9; $column++) {
		$val = $sheet-&gt;getCellByColumnAndRow($column, $row)-&gt;getValue();
        echo $val . &#039; &#039;;
	}
	echo &quot;&lt;br /&gt;&quot;;

}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/229/feed</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</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)的緩存很有用，使得腳本不必為每個請求做重新編譯 [...]]]></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 "Foo is too short"; }<br />與下面的技巧做比較:<br />if (!isset($foo{5})) { echo "Foo is too short"; }<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>
		<slash:comments>1</slash:comments>
		</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>
<pre title="code" class="c">

printf(&quot;%d, %d&quot;, age, age++);
</pre>
<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>
<pre title="code" class="c">

n = 3;
y = n++ + n++;
</pre>
<p>在 C 標準中並沒有定義這行程式會如何執行，是哪一個先加 1 再運算，還是都先不加，造成了含糊不清的結果，應當避免這種寫法。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/186/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</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) { int age = 20; printf(&#34;You are now %d, and will be %d in one year&#34;, age, age++); return 0 ; } 自認觀念還不錯的我直接就回答「20, 20」。但沒想到實際跑的答案竟然是「21, 20」，這真是出乎意料的結果啊！ 馬上另外測試了其他有 printf 函式的語言，如 Java、PHP，結果也都是正確的「20, 20」，所以不知道是 C printf 的 bug 還是什麼原因，希望有人能解答。 請看：C 語言中 printf 的問題(續)]]></description>
			<content:encoded><![CDATA[<p>今天有個學妹問我一個 C 程式的問題：下面程式的結果為何？</p>
<pre title="code" class="php">

#include &lt;stdio.h&gt;
int main(void)
{
    int age = 20;
    printf(&quot;You are now %d, and will be %d in one year&quot;, age, age++);
    return 0 ;
}
</pre>
<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>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>JavaScript 讀取外部文字檔</title>
		<link>http://blog.linym.net/archives/165</link>
		<comments>http://blog.linym.net/archives/165#comments</comments>
		<pubDate>Thu, 02 Aug 2007 17:40:43 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Other]]></category>
		<category><![CDATA[程式筆記]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/165</guid>
		<description><![CDATA[想要利用 JavaScript 來讀取一個檔案內容，搜尋到的方法很多都是用 ActiveX 物件來達成，這樣缺點就只能 IE Only 了。不過後來發現其實用 Ajax 就可以達成了。 搭配 JQuery 使用： $.get(&#039;content.txt&#039;, function(data){ alert(data); }); 這裡透過 Ajax 發出 GET Request 到 content.txt，就會直接將檔案的內容傳回輸出，很簡單吧^^ 但是由於 Ajax 考慮到安全性，所以只能作用在同網域底下。如果要讀的檔案是遠端主機上的呢？這時可以利用其他程式當作中間人，例如透過 PHP 去取得不同網域下的檔案。 JS 內容: $.get(&#039;readfile.php&#039;, function(data){ alert(data); }); PHP 內容: &#60;?php echo file_get_contents(&#34;http://aaa.com.tw/content.txt&#34;); ?&#62;]]></description>
			<content:encoded><![CDATA[<p>想要利用 JavaScript 來讀取一個檔案內容，搜尋到的方法很多都是用 ActiveX 物件來達成，這樣缺點就只能 IE Only 了。不過後來發現其實用 Ajax 就可以達成了。</p>
<p>搭配 <a href="http://jquery.com/" target="_blank">JQuery</a> 使用：</p>
<pre title="code" class="javascript">

$.get(&#039;content.txt&#039;, function(data){
	alert(data);
});
</pre>
<p>這裡透過 Ajax 發出 GET Request 到 content.txt，就會直接將檔案的內容傳回輸出，很簡單吧^^</p>
<p>但是由於 Ajax 考慮到安全性，所以只能作用在同網域底下。如果要讀的檔案是遠端主機上的呢？這時可以利用其他程式當作中間人，例如透過 PHP 去取得不同網域下的檔案。</p>
<p><strong>JS 內容:</strong></p>
<pre title="code" class="javascript">

$.get(&#039;readfile.php&#039;, function(data){
	alert(data);
});
</pre>
<p><strong>PHP 內容:</strong></p>
<pre title="code" class="php">

&lt;?php
echo file_get_contents(&quot;http://aaa.com.tw/content.txt&quot;);
?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/165/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>CodeIgniter - PHP Framework</title>
		<link>http://blog.linym.net/archives/162</link>
		<comments>http://blog.linym.net/archives/162#comments</comments>
		<pubDate>Sat, 28 Jul 2007 12:22:55 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[程式筆記]]></category>
		<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/162</guid>
		<description><![CDATA[最近在 PTT 的 PHP 版看到有人提到了這個 PHP Framework - CodeIgniter，當然也好奇的稍微瞭解一下囉！ 目前 PHP 最受矚目的應該是剛釋出正式版的 Zend Framework 及 CakePHP 了，都是很不錯，但是 Zend 僅支援 PHP5，現在還有不少學校、企業都還沒升級；而 CakePHP 則學習曲線稍長，想馬上用來開發小型應用效果不一定會比較好。 這時可以試試 CodeIgniter，應該也是不錯的選擇。沒有很龐大複雜的類別庫，有基本的 MVC 模式，也有所謂的 Helpers 幫你完成一些常用的功能，官方手冊也寫的很清楚，算是滿容易上手的一個 Framework。]]></description>
			<content:encoded><![CDATA[<p>最近在 PTT 的 PHP 版看到有人提到了這個 PHP Framework - <a href="http://codeigniter.com/" target="_blank">CodeIgniter</a>，當然也好奇的稍微瞭解一下囉！</p>
<p>目前 PHP 最受矚目的應該是剛釋出正式版的 <a href="http://framework.zend.com/" target="_blank">Zend Framework</a> 及 <a href="http://www.cakephp.org/" target="_blank">CakePHP</a> 了，都是很不錯，但是 Zend 僅支援 PHP5，現在還有不少學校、企業都還沒升級；而 CakePHP 則學習曲線稍長，想馬上用來開發小型應用效果不一定會比較好。</p>
<p>這時可以試試 <a href="http://codeigniter.com/" target="_blank">CodeIgniter</a>，應該也是不錯的選擇。沒有很龐大複雜的類別庫，有基本的 MVC 模式，也有所謂的 Helpers 幫你完成一些常用的功能，官方手冊也寫的很清楚，算是滿容易上手的一個 Framework。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/162/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Access Port - serial port 測試工具</title>
		<link>http://blog.linym.net/archives/157</link>
		<comments>http://blog.linym.net/archives/157#comments</comments>
		<pubDate>Thu, 12 Jul 2007 16:23:31 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
				<category><![CDATA[軟體筆記]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[serial]]></category>

		<guid isPermaLink="false">http://blog.linym.net/archives/157</guid>
		<description><![CDATA[最近專題需要撰寫一個 RFID 讀取程式，在開工之前必須要先瞭解 RFID Reader 所接收和回傳的命令形式，由於設備是接在 com port 上，所以就找到 SUDT Access Port 這個好用的工具，它可以向 com port 發送 ASCII/Hex 訊息，然後設備回傳的訊息也會顯示出來，如此一來就可以掌握 command 的正確性及格式了。 Access Port 這個工具是由對岸所開發的，支援多國語言，也有繁體中文哦。 簡要介紹： 1.用於串口調試，支持常用的110-256000波特率，支持自定義波特率。 2.能以字符或十六進制接收或發送任何數據，能發送、接收任意大小的文件。 3.在不改變當前所打開端口的情況下，能動態改變端口參數（如：波特率、校驗位、流控制等）。 4.數據發送區可實時編輯、發送文本數據。 5.能將所接收的原始數據以及顯示數據分別保存。 6.數據發送區允許設置發送週期，自動發送數據。 7.可調試的端口範圍是COM1-COM255，支持擴展端口(USBRS232)。 8.可設置字體、文字顏色、背景顏色。 9.允許將發送區的數據在接收區回顯，模擬終端操作。 10.允許發送區數據以回車鍵作為發送操作信號。 11.支持預定義數據發送模式，支持Hex、Text、浮點數等類型。 12.Monitor模式支持彩色文本顯示,便於更好的區分、觀察數據. 13.允許Monitor模式下攔截到的數據以十六進制或字符方式顯示。 14.允許接收區在接收到的數據後添加回車字符(CRLF)，便於觀察數據。 15.可將Terminal模式下接收到的數據按照十六進制文本方式導出到文件或剪貼板。 16.允許保存程序環境變量。 17.定義熱鍵，方便操作。 18.國際版，支持多國語言。 19.數據發送區內嵌十六進制編輯器，支持unicode。 20.支持串口監控功能，可以監控串口設置以及收發的數據。 21.在線自動更新提示功能，當有可用新版本時提示用戶下載。 22.本程序線程安全，可以同時啟動多個副本調試多個串口。]]></description>
			<content:encoded><![CDATA[<p>最近專題需要撰寫一個 RFID 讀取程式，在開工之前必須要先瞭解 RFID Reader 所接收和回傳的命令形式，由於設備是接在 com port 上，所以就找到 <a href="http://www.sudt.com/cn/ap/index.html" target="_blank">SUDT Access Port</a> 這個好用的工具，它可以向 com port 發送 ASCII/Hex 訊息，然後設備回傳的訊息也會顯示出來，如此一來就可以掌握 command 的正確性及格式了。</p>
<p><a href="http://www.sudt.com/cn/ap/index.html" target="_blank">Access Port</a> 這個工具是由對岸所開發的，支援多國語言，也有繁體中文哦。</p>
<p><strong>簡要介紹：</strong></p>
<blockquote><p> 1.用於串口調試，支持常用的110-256000波特率，支持自定義波特率。<br />
2.能以字符或十六進制接收或發送任何數據，能發送、接收任意大小的文件。<br />
3.在不改變當前所打開端口的情況下，能動態改變端口參數（如：波特率、校驗位、流控制等）。<br />
4.數據發送區可實時編輯、發送文本數據。<br />
5.能將所接收的原始數據以及顯示數據分別保存。<br />
6.數據發送區允許設置發送週期，自動發送數據。<br />
7.可調試的端口範圍是COM1-COM255，支持擴展端口(USB<->RS232)。<br />
8.可設置字體、文字顏色、背景顏色。<br />
9.允許將發送區的數據在接收區回顯，模擬終端操作。<br />
10.允許發送區數據以回車鍵作為發送操作信號。<br />
11.支持預定義數據發送模式，支持Hex、Text、浮點數等類型。<br />
12.Monitor模式支持彩色文本顯示,便於更好的區分、觀察數據.<br />
13.允許Monitor模式下攔截到的數據以十六進制或字符方式顯示。<br />
14.允許接收區在接收到的數據後添加回車字符(CRLF)，便於觀察數據。<br />
15.可將Terminal模式下接收到的數據按照十六進制文本方式導出到文件或剪貼板。<br />
16.允許保存程序環境變量。<br />
17.定義熱鍵，方便操作。<br />
18.國際版，支持多國語言。<br />
19.數據發送區內嵌十六進制編輯器，支持unicode。<br />
20.支持串口監控功能，可以監控串口設置以及收發的數據。<br />
21.在線自動更新提示功能，當有可用新版本時提示用戶下載。<br />
22.本程序線程安全，可以同時啟動多個副本調試多個串口。</p></blockquote>
<p><a href='http://blog.linym.net/wp-content/uploads/2007/07/accessport.jpg' title='accessport.jpg' target="_blank"><img src='http://blog.linym.net/wp-content/uploads/2007/07/accessport.jpg' alt='accessport.jpg' width="450" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/157/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cheat Sheet 速查表大集合</title>
		<link>http://blog.linym.net/archives/143</link>
		<comments>http://blog.linym.net/archives/143#comments</comments>
		<pubDate>Wed, 23 May 2007 09:13:31 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
				<category><![CDATA[好書好站]]></category>
		<category><![CDATA[程式筆記]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[手冊]]></category>
		<category><![CDATA[程式設計]]></category>

		<guid isPermaLink="false">http://lym.fyman.idv.tw/blog/archives/143</guid>
		<description><![CDATA[國外的有心人士喜歡把一些電腦經常用到的，例如程式設計，快捷鍵等，整理成一張 Cheat Sheet，有點類似小抄的東西，方便查閱，而且都做的相當精美，就算對其中的技術不熟當成收藏也不錯 XD 底下這個網站就收集了很多 Cheat Sheet，都有 PNG 及 PDF 格式，趕快去印一張放在桌上吧! Cheat Sheet 大集合 另外附上 WoW 魔獸世界的 Cheat Sheet]]></description>
			<content:encoded><![CDATA[<p>國外的有心人士喜歡把一些電腦經常用到的，例如程式設計，快捷鍵等，整理成一張 Cheat Sheet，有點類似小抄的東西，方便查閱，而且都做的相當精美，就算對其中的技術不熟當成收藏也不錯 XD<br />
底下這個網站就收集了很多 Cheat Sheet，都有 PNG 及 PDF 格式，趕快去印一張放在桌上吧!</p>
<p><a href="http://www.smashingmagazine.com/2006/10/30/cheat-sheet-round-up-ajax-css-latex-ruby/" target="_blank">Cheat Sheet 大集合</a></p>
<p>另外附上 WoW 魔獸世界的 <a href="http://www.ilovejackdaniels.com/cheat-sheets/world-of-warcraft-cheat-sheet/" target="_blank">Cheat Sheet</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/143/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP 取得鍵盤輸入</title>
		<link>http://blog.linym.net/archives/75</link>
		<comments>http://blog.linym.net/archives/75#comments</comments>
		<pubDate>Thu, 09 Mar 2006 04:27:31 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[程式筆記]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://lym.fyman.idv.tw/blog/archives/75</guid>
		<description><![CDATA[最近學校老師教利用 Perl 寫網路程式，是由命令列執行的，於是也想使用較熟悉的 PHP 看是否能完成相同的功能，第一個遇到的問題就是怎麼由鍵盤輸入字元囉！於是翻了許久的 PHP 官方手冊，終於找到方法了。 // 取得鍵盤輸入 function stdin($length = 255) { if (!isset($GLOBALS[&#039;StdinPointer&#039;])) $GLOBALS[&#039;StdinPointer&#039;] = fopen(&#039;php://stdin&#039;, &#039;r&#039;); $intput = fgets($GLOBALS[&#039;StdinPointer&#039;], $length); return trim($intput); } 官方手冊：http://tw2.php.net/manual/en/function.fopen.php#14426]]></description>
			<content:encoded><![CDATA[<p>最近學校老師教利用 Perl 寫網路程式，是由命令列執行的，於是也想使用較熟悉的 PHP 看是否能完成相同的功能，第一個遇到的問題就是怎麼由鍵盤輸入字元囉！於是翻了許久的 PHP 官方手冊，終於找到方法了。</p>
<pre title="code" class="php">

// 取得鍵盤輸入
function stdin($length = 255) {
    if (!isset($GLOBALS[&#039;StdinPointer&#039;]))
        $GLOBALS[&#039;StdinPointer&#039;] = fopen(&#039;php://stdin&#039;, &#039;r&#039;);
    $intput = fgets($GLOBALS[&#039;StdinPointer&#039;], $length);
    return trim($intput);
}
</pre>
<p>官方手冊：<a href="http://tw2.php.net/manual/en/function.fopen.php#14426">http://tw2.php.net/manual/en/function.fopen.php#14426</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/75/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[PHP] 解決 substr 擷取中文字時出現問號</title>
		<link>http://blog.linym.net/archives/74</link>
		<comments>http://blog.linym.net/archives/74#comments</comments>
		<pubDate>Sat, 04 Mar 2006 03:22:00 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[程式筆記]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://lym.fyman.idv.tw/blog/archives/74</guid>
		<description><![CDATA[PHP 有個擷取字串的函式 substr()，但是遇到中文字可就沒辦法正確擷取了，因為一個中文字在 BIG5 編碼是 2 byte，在 UTF-8 要 3 byte，如果擷取的字串剛好不到一個中文，那就會出現「?」之類的符號。所以提供一個解決方法，就是使用 mb_substr()，使用時必須先正確載入 PHP 的 mbstring 模組。 Example： &#60;?php $string = &#039;這是中文字&#039;; $string = mb_substr($string, 0, 4, &#039;BIG-5&#039;); echo $string; ?&#62; 這樣就會正確擷取到「這是中文」了。]]></description>
			<content:encoded><![CDATA[<p>PHP 有個擷取字串的函式 substr()，但是遇到中文字可就沒辦法正確擷取了，因為一個中文字在 BIG5 編碼是 2 byte，在 UTF-8 要 3 byte，如果擷取的字串剛好不到一個中文，那就會出現「?」之類的符號。所以提供一個解決方法，就是使用 mb_substr()，使用時必須先正確載入 PHP 的 mbstring 模組。</p>
<p>Example：</p>
<pre title="code" class="php">

&lt;?php
$string = &#039;這是中文字&#039;;
$string = mb_substr($string, 0, 4, &#039;BIG-5&#039;);
echo $string;
?&gt;
</pre>
<p>這樣就會正確擷取到「這是中文」了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/74/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>關於 setcookie() 及 session_start() 的錯誤</title>
		<link>http://blog.linym.net/archives/47</link>
		<comments>http://blog.linym.net/archives/47#comments</comments>
		<pubDate>Wed, 31 Aug 2005 11:00:00 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[程式筆記]]></category>
		<category><![CDATA[cookie]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[session]]></category>

		<guid isPermaLink="false">http://lym.fyman.idv.tw/blog/archives/47</guid>
		<description><![CDATA[PHP 設計人員都知道，使用 setcookie() 或 session_start() 函式之前不能有任何輸出，否則就會出現錯誤。這是因為這兩個函式呼叫後會將資訊加入 HTML 的標頭(Header)，而標頭都應該在 HTML 本體(body)輸出之前，如果呼叫這兩個函式時前面已經有東西輸出了，PHP 直譯器就會出現錯誤訊息。然而要檢查函式呼叫之前有沒有輸出是件非常麻煩的事情，因為 include 檔案內容裡的輸出都有可能造成錯誤，如果檔案數龐大，那檢查起來可是非常麻煩的，在此提供一個可以一勞永逸的方法： 開啟組態設定檔 php.ini ，將底下這項改為 On output_buffering = On 這樣 Web Server 在處理檔案時會將標頭全部處理完後，再輸出網頁內容，這樣網頁速度需多等千分之一秒，但卻可省去檢查程式碼的數千數萬秒，算是值得使用的功能囉！]]></description>
			<content:encoded><![CDATA[<p>PHP 設計人員都知道，使用 setcookie() 或 session_start() 函式之前不能有任何輸出，否則就會出現錯誤。這是因為這兩個函式呼叫後會將資訊加入 HTML 的標頭(Header)，而標頭都應該在 HTML 本體(body)輸出之前，如果呼叫這兩個函式時前面已經有東西輸出了，PHP 直譯器就會出現錯誤訊息。然而要檢查函式呼叫之前有沒有輸出是件非常麻煩的事情，因為 include 檔案內容裡的輸出都有可能造成錯誤，如果檔案數龐大，那檢查起來可是非常麻煩的，在此提供一個可以一勞永逸的方法：</p>
<p>開啟組態設定檔 php.ini ，將底下這項改為 On<br />
<strong>output_buffering = On</strong></p>
<p>這樣 Web Server 在處理檔案時會將標頭全部處理完後，再輸出網頁內容，這樣網頁速度需多等千分之一秒，但卻可省去檢查程式碼的數千數萬秒，算是值得使用的功能囉！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/47/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[PHP] 取得使用者真實 IP</title>
		<link>http://blog.linym.net/archives/31</link>
		<comments>http://blog.linym.net/archives/31#comments</comments>
		<pubDate>Thu, 12 May 2005 10:14:11 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[程式筆記]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://lym.fyman.idv.tw/blog/archives/31</guid>
		<description><![CDATA[一般在取得使用者 IP 都是利用 $_SERVER['REMOTE_ADDR'] 這個環境變數，但是此變數只會紀錄最後一個主機 IP，所以當使用者瀏覽器有設定 Proxy 時，就無法取得他的真實 IP。 這時可以使用另一個環境變數 $_SERVER['HTTP_X_FORWARDED_FOR'] ，它會紀錄所經過的主機 IP，但是只有在使用者有透過 Proxy 時才會產生，所以可以像以下這樣寫來取得使用者真實 IP。 &#60;?php if (empty($_SERVER[&#039;HTTP_X_FORWARDED_FOR&#039;])) { $myip = $_SERVER[&#039;REMOTE_ADDR&#039;]; } else { $myip = explode(&#039;,&#039;, $_SERVER[&#039;HTTP_X_FORWARDED_FOR&#039;]); $myip = $myip[0]; } echo $myip; ?&#62;]]></description>
			<content:encoded><![CDATA[<p>一般在取得使用者 IP 都是利用 $_SERVER['REMOTE_ADDR'] 這個環境變數，但是此變數只會紀錄最後一個主機 IP，所以當使用者瀏覽器有設定 Proxy 時，就無法取得他的真實 IP。<br />
這時可以使用另一個環境變數 $_SERVER['HTTP_X_FORWARDED_FOR'] ，它會紀錄所經過的主機 IP，但是只有在使用者有透過 Proxy 時才會產生，所以可以像以下這樣寫來取得使用者真實 IP。</p>
<pre title="code" class="php">

&lt;?php
if (empty($_SERVER[&#039;HTTP_X_FORWARDED_FOR&#039;])) {
    $myip = $_SERVER[&#039;REMOTE_ADDR&#039;];
} else {
    $myip = explode(&#039;,&#039;, $_SERVER[&#039;HTTP_X_FORWARDED_FOR&#039;]);
    $myip = $myip[0];
}
echo $myip;
?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/31/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[PHP] 隱藏 IP 的寫法</title>
		<link>http://blog.linym.net/archives/14</link>
		<comments>http://blog.linym.net/archives/14#comments</comments>
		<pubDate>Sat, 18 Dec 2004 16:02:23 +0000</pubDate>
		<dc:creator>lym520</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[程式筆記]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://lym.fyman.idv.tw/blog/archives/14</guid>
		<description><![CDATA[經常我們為了保護客戶端的 IP 資訊，不會將完整 IP 顯示出來，變成像「210.240.xxx.xxx」這樣。在 PHP 上可用 explode() 這個函式來達到目的。explode() 可將字串依指定的字串或字元 separator 切開並存回一陣列。所以 IP 可依「.」切開，再分別顯示出來即可。 &#60;?php function ip_hide($ip, $n=0) { $iphide = explode(&#34;.&#34;, $ip); switch($n) { // 不隱藏IP case &#039;0&#039;: $ip; break; // 隱藏最末位 case &#039;1&#039;: $ip = $iphide[0].&#34;.&#34;.$iphide[1].&#34;.&#34;.$iphide[2].&#34;.X&#34;; break; // 隱藏末兩位 case &#039;2&#039;: $ip = $iphide[0].&#34;.&#34;.$iphide[1].&#34;.X.X&#34;; break; // 全部隱藏 case &#039;3&#039;: $ip = &#34;IP已經隱藏&#34;; break; [...]]]></description>
			<content:encoded><![CDATA[<p>經常我們為了保護客戶端的 IP 資訊，不會將完整 IP 顯示出來，變成像「210.240.xxx.xxx」這樣。在 PHP 上可用 explode() 這個函式來達到目的。explode() 可將字串依指定的字串或字元 separator 切開並存回一陣列。所以 IP 可依「.」切開，再分別顯示出來即可。</p>
<pre title="code" class="php">

&lt;?php
function ip_hide($ip, $n=0)
{
    $iphide = explode(&quot;.&quot;, $ip);
    switch($n) {
    // 不隱藏IP
    case &#039;0&#039;: $ip; break;
    // 隱藏最末位
    case &#039;1&#039;: $ip = $iphide[0].&quot;.&quot;.$iphide[1].&quot;.&quot;.$iphide[2].&quot;.X&quot;; break;
    // 隱藏末兩位
    case &#039;2&#039;: $ip = $iphide[0].&quot;.&quot;.$iphide[1].&quot;.X.X&quot;; break;
    // 全部隱藏
    case &#039;3&#039;: $ip = &quot;IP已經隱藏&quot;; break;
    }
    echo $ip;
}
?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.linym.net/archives/14/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

