<?xml version="1.0" encoding="utf-8"?><rss version="2.0">
				<channel>
				<title><![CDATA[波波逸思的部落格 :: 隨意窩 Xuite ::]]></title>
				<link>http://blog.xuite.net/porpoise/blog</link>
				<description><![CDATA[   ]]></description>
				<image>
				<title>HiNet Blog</title>
				<width>120</width>
				<height>27</height>
				<link>http://blog.xuite.net/porpoise/blog</link>
				<url>http://s.blog.xuite.net/_image/logo_blog.gif</url>
				</image>
				<copyright>Xuite製作小組</copyright>
				<pubDate>Tue, 11 Oct 2011 23:06:45 +0800</pubDate>
					<item>
					<guid>http://blog.xuite.net/porpoise/blog/52613618</guid>
					<title><![CDATA[[misc] My Fork; My Spoon]]></title>
					<link>http://blog.xuite.net/porpoise/blog/52613618</link>
					<pubDate>Tue, 11 Oct 2011 23:06:45 +0800</pubDate>
					<description><![CDATA[<p class="chat_line">Steins;Gate第十四話 "現在最想要My Fork,因為我已經有My Spoon".
我一直不瞭解這個意思. 網路上也一直沒看到什麼比較合理的解釋, 剛剛看到Broadcaster Hoshinomaster
問他的英文老師, 有個解釋.可能是my falk my spouse的同音字,falk spouse都好=家庭和諧.
而Steins;Gate第十四話 "現在最想要My Fork,因為我已經有My Spoon"
是不是意指"現在最想跟父親和解,因為我已經找到很好的異性<wbr>朋友". 這是我覺得較合理的解釋.<br></p>]]></description>
					<comments>http://avatar.xuite.net/12029861/s</comments>
					
					</item>
					<item>
					<guid>http://blog.xuite.net/porpoise/blog/39514352</guid>
					<title><![CDATA[[Linux] gcc -rpath 的用處.]]></title>
					<link>http://blog.xuite.net/porpoise/blog/39514352</link>
					<pubDate>Fri, 05 Nov 2010 02:31:12 +0800</pubDate>
					<description><![CDATA[<p>以前, 就知道LD_LIBRARY_PATH可以優先指定library的路徑,</p>
<p>因為最近要編譯sudo給WL700gE使用,</p>
<p>卻發現LD_LIBRARY_PATH是對sudo無法產生效果,</p>
<p>查了一下是因為有suid的檔案,</p>
<p>是不會使用LD_LIBRARY_PATH的路徑去載入library.</p>
<p>可是我又不想要build成static file.</p>
<p>又查了一下,gcc有個-rpath的參數,</p>
<p>可以直接指定elf檔要從哪個路徑載入library.</p>
<p>這就可以解決掉suid的檔案不能用LD_LIBRARY_PATH.</p>
<p>範例如下:</p>
<p>#gcc -Wl,-rpath,/opt/lib -o sudo sudo.c</p>
<p>如果想要檢查有沒有設成功,</p>
<p>可以用</p>
<p>#readelf -d sudo | grep RPATH</p>
<p>0x0000000f (RPATH)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Library rpath: [/opt/lib]</p>
<p>這就沒問題了...:)</p>]]></description>
					<comments>http://avatar.xuite.net/12029861/s</comments>
					
					</item>
					<item>
					<guid>http://blog.xuite.net/porpoise/blog/39514143</guid>
					<title><![CDATA[[WL700gE] 當更新錯Image時,如何還原系統.]]></title>
					<link>http://blog.xuite.net/porpoise/blog/39514143</link>
					<pubDate>Fri, 05 Nov 2010 02:12:01 +0800</pubDate>
					<description><![CDATA[<p>前幾天, 又update了一份自己編譯的Image,</p>
<p>不知怎搞的,就再也連不進去WL700gE了.</p>
<p>用Asus的FirmWare Restoration 也沒有反應.</p>
<p>在好幾次的try and error之後.</p>
<p>發現到, 如果, 你一開始就ping那臺WL700gE的,</p>
<p>然後在一開始開機時, 就一直按著szSetup那按鈕,</p>
<p>你會得到 TTL=100 的回應,</p>
<p>Reply from 192.168.1.1: bytes=32 time&lt;1ms TTL=100</p>
<p>這時候你可以用tftp把 pivot_root.trx (註1) upload進WL700gE裡.</p>
<p>之後再等個20幾秒, 再重新開機.</p>
<p>重開機後,如果你還是有按下szSetup,</p>
<p>看到 TTL=100時放掉,</p>
<p>等到ping沒有回應時,再按下szSetup,</p>
<p>應該會再一次得到回應,但這次TTL=64,</p>
<p>Reply from 192.168.1.1: bytes=32 time&lt;1ms TTL=64</p>
<p>而這次就可以用Asus的FirmWare Restoration去還原回原來的Image了.</p>
<p>&nbsp;</p>
<p>註1:</p>
<p>你可以去Asus的網站下載原始碼 GPL_WL700gE_1078.rar ,</p>
<p>解開後,你可以找到這個檔案,</p>
<p>WL700gE_FW_1.0.7.8_GPL/nasoc/src/apps/pivot_root/mipsel/pivot_root.trx.</p>
<p>就可以用tftp upload上去.</p>
<p>&nbsp;</p>]]></description>
					<comments>http://avatar.xuite.net/12029861/s</comments>
					
					</item>
					<item>
					<guid>http://blog.xuite.net/porpoise/blog/38706133</guid>
					<title><![CDATA[[win7] 還原 localized 的目錄名稱.]]></title>
					<link>http://blog.xuite.net/porpoise/blog/38706133</link>
					<pubDate>Sat, 09 Oct 2010 22:16:30 +0800</pubDate>
					<description><![CDATA[<p>如果你跟我一樣,不喜歡win7把一些目錄名稱 localized.</p>
<p>例如: C:\Users =&gt; C:\使用者 </p>
<p>Google了一下,發現是在 Desktop.ini 裡面,</p>
<p>指定了所要使用的名稱.</p>
<p>所以解決方法很簡單,</p>
<p>就是把 Desktop.ini 裡面的</p>
<p>LocalizedResourceName=@%SystemRoot%\system32\shell32.dll,-21813</p>
<p>這一行給移除掉,</p>
<p>或者只像我在前面加個#字號,</p>
<p>免得以後後悔還可以改回來.</p>
<p>所以,像是"桌面","下載"等等的目錄名稱,</p>
<p>都是一樣的方法可以去除掉.</p>]]></description>
					<comments>http://avatar.xuite.net/12029861/s</comments>
					
					</item>
					<item>
					<guid>http://blog.xuite.net/porpoise/blog/37941991</guid>
					<title><![CDATA[[程式] 取得目前 thread 正在哪顆 CPU 上執行]]></title>
					<link>http://blog.xuite.net/porpoise/blog/37941991</link>
					<pubDate>Wed, 15 Sep 2010 01:23:57 +0800</pubDate>
					<description><![CDATA[<p>因為最近在研究AMD CPU的控制電壓頻率的方法, </p>
<p>想來寫個rmclock-like的程式.</p>
<p>最主要的原因是rmclock沒有再更新了,</p>
<p>手上這顆AMD Phenome X2不支援,</p>
<p>只好自己來寫寫看嚕~</p>
<p>因為需要讓每顆CPU都要設定到,</p>
<p>所以使用SetThreadAffinityMask去設定要用哪顆CPU,</p>
<p>之後再Call Sleep(1), </p>
<p>這是讓目前的thread有機會content-switch.</p>
<p>這樣下次再被執行時,就會根據 AffinityMask 去挑選 CPU.</p>
<p>問題是, 這時候我想到那我怎麼確定目前thread有在某顆CPU上執行.</p>
<p>直覺上, 覺得 CPUID 這個x86指令應該會提供,</p>
<p>找了半天找到了一個ACPI ID.</p>
<p>你可以用CPUID EAX:1 得到在 EBX 的 31:24,</p>
<p>這就是 ACPI ID.</p>
<p>而在網路上找到這段話,</p>
<p>In MP systems, the local A<span href="http://biosren.com/tag.php?name=PIC" class="t_tag">PIC</span> ID is also used as a processor ID by the <span href="http://biosren.com/tag.php?name=BIOS" class="t_tag">BIOS</span> and the operating system. Some processors permit software to modify the <span href="http://biosren.com/tag.php?name=APIC" class="t_tag">APIC</span> ID. However, the ability of software to modify the APIC ID is processor model specific. Because of this, operating system software should avoid writing to the local APIC ID register. The value returned by bits 31-24 of the EBX register (when the <span href="http://biosren.com/tag.php?name=CPUID" class="t_tag">CPUID</span> instruction is executed with a source operand value of 1 in the EAX register) is always the Initial APIC ID (determined by the platform initialization). This is true even if software has c<span href="http://biosren.com/tag.php?name=hang" class="t_tag">hang</span>ed the value in the Local APIC ID register.</p>
<p>在我這台notebook上試了一下.</p>
<p>在CPU 0 是會對應到 ACPI ID: 0,</p>
<p>而在CPU 1 則會對應到 ACPI ID: 1,</p>
<p>基本上是沒問題的,</p>
<p>但我換到另一台i5是四核心,</p>
<p>卻出現了0,2,4,6,</p>
<p>查了一下,似乎是因為 i5 是有 hyper-threading,</p>
<p>但是被disabled掉, 就會出現這種情況.</p>
<p>後來, T同事找到一個API KeGetcurrentProcessorNumber,</p>
<p>但是這個API是要在 kernel 裡使用的.</p>
<p>靈機一動, Google 看看有沒有 GetcurrentProcessorNumber,</p>
<p>沒想到還真的有這個API.</p>
<p><a target="_blank" title="http://msdn.microsoft.com/en-us/library/ms683181%28VS.85%29.aspx" href="http://msdn.microsoft.com/en-us/library/ms683181%28VS.85%29.aspx">DWORD WINAPI GetCurrentProcessorNumber(void);</a></p>
<p>但只有 vista 之後才可以使用.</p>
<p>不過, 這也足夠了.</p>
<p>&nbsp;</p>]]></description>
					<comments>http://avatar.xuite.net/12029861/s</comments>
					
					</item>
					<item>
					<guid>http://blog.xuite.net/porpoise/blog/37525241</guid>
					<title><![CDATA[[程式] 檢查 CPU 是否支援 cpuid]]></title>
					<link>http://blog.xuite.net/porpoise/blog/37525241</link>
					<pubDate>Wed, 01 Sep 2010 18:36:20 +0800</pubDate>
					<description><![CDATA[<p>&nbsp;</p>
<p>參考資料:</p>
<p><a target="_blank" title="http://www.intel.com/assets/pdf/appnote/241618.pdf" href="http://www.intel.com/assets/pdf/appnote/241618.pdf">Intel&reg; Processor Identification and the CPUID Instruction</a></p>
<p><a target="_blank" title="http://home.educities.edu.tw/wanker742126/win32asm/w32asm_ap01.html" href="http://home.educities.edu.tw/wanker742126/win32asm/w32asm_ap01.html">檢查 CPU 能否執行 CPUID？</a></p>
<p>&nbsp;</p>
<p><link href="http://porpoise.dynadns.info/prettify.css" type="text/css" rel="stylesheet" /> <script type="text/javascript" src="http://porpoise.dynadns.info/prettify.js"></script> <span class="codes"> </span></p>
<pre class="prettyprint">#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />__declspec(naked) int IsCPUIDSupported()<br />{<br />    __asm {<br />        pushfd                  ;使延伸旗標推入堆疊<br />        pop     eax             ;把堆疊中的延伸旗標彈出至 EAX<br />        mov     ecx,eax         ;保存舊的延伸旗標<br />        xor     eax,200000h     ;改變強制延伸旗標第 21 位元<br />        push    eax             ;把改變後新的延伸旗標推入堆疊<br />        popfd                   ;存入延伸旗標<br />        pushfd                  ;再取出延伸旗標<br />        pop     eax<br />        xor     eax,ecx         ;如果延伸旗標的第21位元為1，那麼<br />        ret<br />    }<br />}<br /><br />int main(int argc, char *argv[])<br />{<br />	if (IsCPUIDSupported() == 0) {<br />		printf("cpuid is not supported\n");<br />	} else {<br />		printf("cpuid is supported\n");<br />	}<br />	return 0;<br />}<br /><br /></pre>
<p><script type="text/javascript"><!--
 prettyPrint(); 
--></script></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></description>
					<comments>http://avatar.xuite.net/12029861/s</comments>
					
					</item>
					<item>
					<guid>http://blog.xuite.net/porpoise/blog/34427328</guid>
					<title><![CDATA[[misc] 煮綠豆湯]]></title>
					<link>http://blog.xuite.net/porpoise/blog/34427328</link>
					<pubDate>Sat, 29 May 2010 23:58:05 +0800</pubDate>
					<description><![CDATA[<p>之前因為天氣很熱買了包綠豆，遲遲沒有動手。</p>
<p>雖然今天是陰雨綿綿的天氣，</p>
<p>還是上網查了一下，怎麼煮綠豆湯最好。</p>
<p>大致，都是說要先把綠豆泡過水，</p>
<p>這我倒是扎扎實實泡到綠豆膨脹，</p>
<p>甚至有些綠豆都冒出小芽了。</p>
<p>這是泡了四、五個小時的成果，</p>
<p>再來是煮到沸騰後，再煮個幾分鐘，</p>
<p>之後關掉電磁爐，悶個30分鐘。</p>
<p>（這個作法是最省錢的作法，不需開小火慢慢煮。）</p>
<p>再煮沸個幾分鐘，就完成了。</p>
<p>因為，綠豆有先泡過水，</p>
<p>所以感覺煮綠豆沒花多少時間。</p>
<p>因為我不想吃太甜，所以再煮完後再加點糖。</p>
<p>整個過程算是相當的成功～～～</p>
<p>唯一的問題是，似乎煮得太多了點～:P</p>
<p>&nbsp;</p>]]></description>
					<comments>http://avatar.xuite.net/12029861/s</comments>
					
					</item>
					<item>
					<guid>http://blog.xuite.net/porpoise/blog/33854816</guid>
					<title><![CDATA[[x64] 編譯 sqlite 在 x64 平台. ]]></title>
					<link>http://blog.xuite.net/porpoise/blog/33854816</link>
					<pubDate>Wed, 12 May 2010 23:15:21 +0800</pubDate>
					<description><![CDATA[<p>到 http://www.sqlite.org/download.html 下載</p>
<p><a href="http://www.sqlite.org/sqlite-amalgamation-3_6_23_1.zip">sqlite-amalgamation-3_6_23_1.zip<br /></a></p>
<p>因為這個zip是把所有.c檔合併成一個。</p>
<p>所以，只需要在 VC2008 ，</p>
<p>開啟新的 Project （File -&gt; New -&gt; Project ...），</p>
<p>Visual C++ -&gt; Win32 -&gt; Win32 Console Application.</p>
<p>輸入 Name : sqlite64 ，和所要放置的 Location ，</p>
<p>按下『確定』，選『Next』，</p>
<p>Application Type：DLL</p>
<p>Additional Option：Empty Project</p>
<p>選『Finish』完成。</p>
<p>然後把所解開的 sqlite3.c 拉進 Project 的 Source 裡。</p>
<p>Buld -&gt; Configuration Manager -&gt; &lt;New ...&gt; 新增新的 x64 </p>
<p>不要用 Copy From win32.</p>
<p>然後選 Project -&gt; Properties，</p>
<p>Configuration Properties -&gt; Genernal ，</p>
<p>Configuration Type : Dynamic Library (dll)</p>
<p>Character Set : Use Multi-Byte Character Set</p>
<p>Configuration Properties -&gt; C/C++ -&gt; Preprocessor</p>
<p>Preprocessor Definitions : SQLITE3_EXPORTS;THREADSAFE;SQLITE_ENABLE<br />_COLUMN_METADATA</p>
<p>Linker -&gt; Outout File :$(Outdir)sqlite64.dll</p>
<p>Linker -&gt; Input -&gt; Module definition File -&gt; sqlite3.def</p>
<p>剩下就選編譯sqlite64.dll 就好了～</p>
<p>&nbsp;</p>
<p>PS : 已編譯好的 sqlite64.dll <a target="_blank" title="sqlite64.dll" href="http://webhd.xuite.net/_oops/porpoise/a3s">在此下載</a> 。</p>]]></description>
					<comments>http://avatar.xuite.net/12029861/s</comments>
					
					</item>
					<item>
					<guid>http://blog.xuite.net/porpoise/blog/31686435</guid>
					<title><![CDATA[[winxp] 在安全模式下啟動MSI服務來移除軟體]]></title>
					<link>http://blog.xuite.net/porpoise/blog/31686435</link>
					<pubDate>Sun, 07 Mar 2010 04:03:58 +0800</pubDate>
					<description><![CDATA[<p>在卡飯論壇上看到的</p>
<p>http://bbs.kafan.cn/thread-370866-1-1.html</p>
<p>進入安全模式，在cmd下，</p>
<p>c:\&gt; REG ADD 
"HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Minimal\MSIServer" /VE 
/T REG_SZ /F /D "Service"</p>
<p>c:\&gt; net start msiserver</p>
<p>這樣就可以在安全模式下，安裝或移除MSI包裝的軟體了～</p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></description>
					<comments>http://avatar.xuite.net/12029861/s</comments>
					
					</item>
					<item>
					<guid>http://blog.xuite.net/porpoise/blog/29683134</guid>
					<title><![CDATA[[UserChrome] 整理 Firefox 的 Sqlite 資料庫檔案]]></title>
					<link>http://blog.xuite.net/porpoise/blog/29683134</link>
					<pubDate>Mon, 28 Dec 2009 20:54:03 +0800</pubDate>
					<description><![CDATA[<p>之前有在用一套 Firefox extension，叫做 <a target="_blank" title="Vacuum Places Improved" href="https://addons.mozilla.org/zh-TW/firefox/addon/13878">Vacuum Places Improved</a>。</p>
<p>想說，只是用裡面的一小部份，應該自己改一下就可以放進 UserChrome 裡。</p>
<p>重點是下個 VACUUM 的 SQL command。如下所示：</p>
<p><span class="codes">
<pre class="prettyprint">Components.classes["@mozilla.org/browser/nav-history-service;1"]<br />.getService(Components.interfaces.nsPIPlacesDatabase)<br />.DBConnection.executeSimpleSQL("VACUUM");");</pre>
</span></p>
<p>而整個原始碼就像下面這樣，</p>
<p>生個 menuitem，來方便使用。</p>
<p>
<link href="http://porpoise.erufa.com/prettify.css" type="text/css" rel="stylesheet" />
<script type="text/javascript" src="http://porpoise.erufa.com/prettify.js"></script>
<span class="codes">
<pre class="prettyprint">(function() {<br />	var newItem = document.createElement("menuitem");<br />	newItem.setAttribute("label", "vacuum");<br />	newItem.setAttribute("oncommand", "Components.classes[\"@mozilla.org/browser/nav-history-service;1\"].getService(Components.interfaces.nsPIPlacesDatabase).DBConnection.executeSimpleSQL(\"VACUUM\");");<br /><br />	var m = document.getElementById("userChrome-Menu");<br />	if (!m) {<br />		var openLink = document.getElementById("context-openlink");<br />		m = document.createElement("menu");<br />		m.setAttribute("id", "userChrome-Menu");<br />		m.setAttribute("label", "userChrome");<br />		openLink.parentNode.appendChild(m);<br />	}<br /><br />	var mpopup = document.getElementById("userChrome-MenuPopup");<br />		if (!mpopup) {<br />		mpopup = document.createElement("menupopup");<br />		mpopup.setAttribute("id", "userChrome-MenuPopup");<br />		m.appendChild(mpopup);<br />	}<br />	mpopup.appendChild(newItem);<br /><br />})(); <br /><br /></pre>
</span>
<script type="text/javascript"><!--
 prettyPrint(); 
--></script>
</p>]]></description>
					<comments>http://avatar.xuite.net/12029861/s</comments>
					
					</item>
					<item>
					<guid>http://blog.xuite.net/porpoise/blog/29357219</guid>
					<title><![CDATA[[UserChrome] 新增 tab 在目前 tab 的右方。]]></title>
					<link>http://blog.xuite.net/porpoise/blog/29357219</link>
					<pubDate>Wed, 16 Dec 2009 23:46:35 +0800</pubDate>
					<description><![CDATA[<p>原本我是使用Tree Style Tabs這個extension，</p>
<p>但是有時候會發生Tabs會全擠在一起的Bug，</p>
<p>我也找不出什麼原因會導致這個問題。</p>
<p>不過，因為我只是要讓我新增Tab時，</p>
<p>可以放在目前Tab的右方，</p>
<p>而不是append到最後一個。</p>
<p>&nbsp;</p>
<p>所以自己就用UserChrome抄了一小段Code來處理這個。</p>
<p>&nbsp;</p>
<p>
<link href="http://porpoise.erufa.com/prettify.css" type="text/css" rel="stylesheet" />
<script type="text/javascript" src="http://porpoise.erufa.com/prettify.js"></script>
<span class="codes">
<pre class="prettyprint">(function() {<br /><br />function UcNewAddTab(aURI, aReferrerURI, aCharset, aPostData, aOwner, aAllowThirdPartyFixup) <br />{<br />	var newPos = gBrowser.mCurrentTab._tPos + 1;<br />	var newTab = gBrowser.origAddTab(<br />		aURI, aReferrerURI, aCharset, aPostData, aOwner, aAllowThirdPartyFixup<br />	);<br />	if ('undefined'==typeof aURI) return newTab;<br /><br />	gBrowser.moveTabTo( newTab, newPos);<br />	gBrowser.selectedTab = newTab;<br /><br />	return newTab;<br />}<br /><br />function UcAddTabOnLoad() <br />{<br />	window.addEventListener('unload', UcAddTabOnUnLoad, false);<br />	if ('undefined'==typeof gBrowser) return;<br />	gBrowser.origAddTab=gBrowser.addTab;<br />	gBrowser.addTab=UcNewAddTab;<br />}<br /><br />function UcAddTabOnUnLoad() <br />{<br />	gBrowser.addTab=gBrowser.origAddTab;	<br />	window.removeEventListener('unload', UcAddTabOnUnLoad, false);<br />}<br /><br />if ('undefined' != typeof gBrowser) {<br />	gBrowser.origAddTab=gBrowser.addTab;<br />	gBrowser.addTab=UcNewAddTab;<br />}<br /><br />})();<br /></pre>
</span>
<script type="text/javascript"><!--
 prettyPrint(); 
--></script>
</p>]]></description>
					<comments>http://avatar.xuite.net/12029861/s</comments>
					
					</item>
					<item>
					<guid>http://blog.xuite.net/porpoise/blog/25905518</guid>
					<title><![CDATA[[misc] Kerio Personal firewall 2.1.5 couldn't work with IntelR PROSet/Wireless]]></title>
					<link>http://blog.xuite.net/porpoise/blog/25905518</link>
					<pubDate>Sat, 08 Aug 2009 12:35:02 +0800</pubDate>
					<description><![CDATA[<p>之前就知道舊版的Kerio Personal firewall 2.1.5，</p>
<p>在某些情況下，會導致IntelR PROSet/Wireless Event Log這個Service crash。</p>
<p>就會出現svchost crash的視窗。</p>
<p>之前都是手動避過這個問題，</p>
<p>當我還沒key in帳號密碼，</p>
<p>靜靜等待Kerio Personal firewall啟動的視窗，</p>
<p>等到Kerio Personal firewall先啟動之後，</p>
<p>再login，通常就不會有問題。</p>
<p>但是因為這段時間要等蠻久的，大概2-3分鐘，</p>
<p>實在是沒那個耐性。</p>
<p>&nbsp;</p>
<p>才試著去更改fwdrv (Kerio 的 firewall driver) 的DependOnService，</p>
<p>結果是很簡單的在fwdrv的DependOnService加上IntelR PROSet/Wireless Event Log。</p>
<p>測試到目前為止，都沒有問題。 :)</p>
<p><a target="_self" href="http://7.blog.xuite.net/7/e/8/9/12029861/blog_6886/txt/25905518/5.jpg"><img src="http://7.blog.xuite.net/7/e/8/9/12029861/blog_6886/txt/25905518/5.jpg" width="536" border="0" height="372" /></a><br /><br /></p>]]></description>
					<comments>http://7.blog.xuite.net/7/e/8/9/12029861/blog_6886/txt/25905518/cover.jpg</comments>
					
					</item>
					<item>
					<guid>http://blog.xuite.net/porpoise/blog/25509957</guid>
					<title><![CDATA[[c] wildcard support]]></title>
					<link>http://blog.xuite.net/porpoise/blog/25509957</link>
					<pubDate>Sun, 19 Jul 2009 15:29:14 +0800</pubDate>
					<description><![CDATA[<p>最近有需要用到wildcard，</p>
<p>所以就來看一下wildcard的suport。</p>
<p>但是往往是support unix版的wildcard，</p>
<p>或者應該說M$所 support 的wildcard 比較奇怪。</p>
<p>因為當你用 "*.*" 比對時，</p>
<p>它會不管你有沒有"."，</p>
<p>直接當成 "*" 在比對，</p>
<p>例如：</p>
<p>"t*.*" -&gt; 要找 prefix 是 "t"</p>
<p>在unix下，通常會比對到的是prefix 是 t ，</p>
<p>而且中間一定要有一個 "." 。</p>
<p>在windows則只需要prefix是 "t" 就會比對到了。</p>
<p>&nbsp;</p>
<p>在codeproject上，</p>
<p>有 <a target="_blank" title="CodeProject: Wildcard string compare (globbing). Free source code and programming help" href="http://www.codeproject.com/KB/string/wildcmp.aspx">wildcard 比對的原始碼</a>，</p>
<p>我改了一點點，</p>
<p>讓這個 wildcard support 可以符合 M$ 的 wildcard 。</p>
<p>原始碼如下：</p>
<p>
<link href="http://porpoise.erufa.com/prettify.css" type="text/css" rel="stylesheet" />
<script type="text/javascript" src="http://porpoise.erufa.com/prettify.js"></script>
<span class="codes">
<pre class="prettyprint"><br />#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br /><br />int wildcmp(const char *wild, const char *string) {<br />  // Written by Jack Handy - jakkhandy@hotmail.com<br /><br />  const char *cp = NULL, *mp = NULL;<br /><br />  while ((*string) &amp;&amp; (*wild != '*')) {<br />    if ((*wild != *string) &amp;&amp; (*wild != '?')) {<br />      return 0;<br />    }<br />    wild++;<br />    string++;<br />  }<br /><br />  while (*string) {<br />    if (*wild == '*') {<br />      if (!*++wild) {<br />        return 1;<br />      }<br />      mp = wild;<br />      cp = string+1;<br />    } else if ((*wild == *string) || (*wild == '?')) {<br />      wild++;<br />      string++;<br />    } else {<br />      wild = mp;<br />      string = cp++;<br />    }<br />  }<br />  // modified by porpoise<br />  if (mp == wild &amp;&amp; *wild == '.' &amp;&amp; *(wild+1) == '*') {<br />      do {<br />          wild+=2;<br />      } while (*wild == '.' &amp;&amp; *(wild+1) == '*');<br />  }<br /><br />  while (*wild == '*') {<br />    wild++;<br />  }<br />  return !*wild;<br />}<br /><br /><br />int main()<br />{<br />    char *wild = "w*.*.*.*.*";<br />    char *string ="wtest";<br />    int rc;<br />    rc = wildcmp(wild, string);<br />    printf("wildcmp(%s,%s)=%d\n",wild, string,rc);<br />    return 0;<br />}</pre>
</span>
<script type="text/javascript"><!--
 prettyPrint();
// --></script>
</p>]]></description>
					<comments>http://avatar.xuite.net/12029861/s</comments>
					
					</item>
					<item>
					<guid>http://blog.xuite.net/porpoise/blog/25393542</guid>
					<title><![CDATA[[misc] 今天是怎麼回事？]]></title>
					<link>http://blog.xuite.net/porpoise/blog/25393542</link>
					<pubDate>Tue, 14 Jul 2009 02:47:41 +0800</pubDate>
					<description><![CDATA[<p>今天是怎麼回事？</p>
<p>又是豪雨、強風，剛剛又加上地震～</p>
<p><a target="_blank" title="中央氣象局" href="http://www.cwb.gov.tw/"><img src="http://7.blog.xuite.net/7/e/8/9/12029861/blog_6886/txt/25393542/0.jpg" width="522" border="0" height="270" /></a></p>]]></description>
					<comments>http://7.blog.xuite.net/7/e/8/9/12029861/blog_6886/txt/25393542/cover.jpg</comments>
					
					</item>
					<item>
					<guid>http://blog.xuite.net/porpoise/blog/24627588</guid>
					<title><![CDATA[[程式] 如何判斷某個數字是否是2的n次方,]]></title>
					<link>http://blog.xuite.net/porpoise/blog/24627588</link>
					<pubDate>Sat, 06 Jun 2009 22:59:01 +0800</pubDate>
					<description><![CDATA[<p>因為最近需要用到判斷某個數字是否是2的n次方，</p>
<p>這個方法應該是我在某本書上讀到的，</p>
<p>不過我手上應該是沒有哪本書。</p>
<p>方法其實是很簡單的，</p>
<p>某個數字是 X，</p>
<p>先將 X - 1 ，</p>
<p>再把 X ^ ( X - 1) 跟 X 比，</p>
<p>如果， X ^ ( X - 1 ) &gt;= X，</p>
<p>就代表這個數字是2的n次方。</p>
<p>理由是因為，</p>
<p>假設 X = 1000000 （二進位)，</p>
<p>那麼 X - 1 = 0111111 (二進位)，</p>
<p>再來是 X ^ ( X - 1) = 1111111 ，</p>
<p>這個數字會大於等於原來的 X 。</p>
<p>而這是因為這個數字是2的n次方。</p>
<p>&nbsp;</p>
<p>如果這個數字不是2的n次方，</p>
<p>假如 X = 1000100 ( 二進位）</p>
<p>而 X - 1 = 1000011 (二進位)</p>
<p>會讓 X ^ ( X - 1 ) = 111 （二進位）</p>
<p>最後的數字會小於 X 。</p>
<p>原因是在於最左邊的 1 ，</p>
<p>假如是2的n次方，整個數字（二進位）應該只會有一個1，</p>
<p>而不是2的n次方的話，就不只有一個1，</p>
<p>如果不是的話，這個會讓後面要做的 - 1 ，</p>
<p>在減掉 1 之後，最左邊的1還是不會改變。</p>
<p>因為最左邊的1還是存在，又跟原來的數字做 XOR ，</p>
<p>XOR 出來的結果，就會比原來的小。</p>
<p>這也是為什麼可以這樣判斷。</p>
<p>但是『等號』是只會成立在，當 X == 1 時。</p>
<p>&nbsp;</p>
<p>而比較特別的是，當 X == 0 時，也是會成立的。</p>
<p>這可以當成是因為溢位的關係。</p>
<p>如果不想要這個特性的話，可以先檢查是否為0。</p>
<p>&nbsp;</p>
<p>以下程式是用來驗證整個設計是否正確，</p>
<p>只有在條件(是否是2的n次方)成立時，才把 i 列印出來。</p>
<p>
<link href="http://porpoise.erufa.com/prettify.css" type="text/css" rel="stylesheet" />
<script type="text/javascript" src="http://porpoise.erufa.com/prettify.js"></script>
<span class="codes">
<pre class="prettyprint">#include &lt;stdio.h&gt;<br /><br />int main()<br />{<br />        unsigned int i = 0;<br />        for (i = 0;; i++) {<br />                if ((i ^ (i - 1)) &gt;= i) {<br />                        printf("%08x\n", i);<br />                }<br />                if (i == 0xffffffff) {<br />                        break;<br />                }<br />        }<br />        return 0;<br />}<br /><br /></pre>
</span>
<script type="text/javascript"><!--
 prettyPrint();
// --></script>
</p>
<p>&nbsp;</p>]]></description>
					<comments>http://avatar.xuite.net/12029861/s</comments>
					
					</item></channel>
				</rss>
