<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>黑暗執行緒</title><link>http://blog.darkthread.net/blogs/darkthreadtw/default.aspx</link><description /><dc:language>zh-CHT</dc:language><generator>CommunityServer 2007.1 (Debug Build: 20917.1142)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/Darkthread" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>【茶包射手日記】關於狂牛症蛋白質600度金剛不壞之謎</title><link>http://feedproxy.google.com/~r/Darkthread/~3/HqxyAfRulCE/600-degree-mistry.aspx</link><pubDate>Sun, 08 Nov 2009 00:04:16 GMT</pubDate><guid isPermaLink="false">d08a49d6-af59-4068-8b43-b7c037f78068:5600</guid><dc:creator>Jeffrey</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blog.darkthread.net/blogs/darkthreadtw/rsscomments.aspx?PostID=5600</wfw:commentRss><comments>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/11/08/600-degree-mistry.aspx#comments</comments><description>&lt;span id="PostName"&gt;&lt;/span&gt;  &lt;p&gt;&lt;font color="#00ff00"&gt;【聲明: 本文乃對狂牛症議題裡幾點邏輯方法的探討，無涉支持或反對牛肉進口，也無意挑起兩派論戰。歡迎大家提出自己的看法，但希望能聚焦在文中所提的幾點科學論證與研究方法上，與內文焦點無關的留言可能會視狀況刪除，請見諒!】&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;老讀者們都知道我是一個嗜邏輯如命到有些偏執的怪胎，在接受任何主張推論前，總會先要求具體事證。我曾不只一次在同事說&amp;quot;自從上回修改過那個設定後，系統就開始出問題&amp;quot;後，先不著手研究二者因果，而是冷酷質問: &amp;quot;有沒有檔案更新時間與系統錯誤Log的對照可以支持你的說法?&amp;quot;。也曾經多次在事故調查時，面對夥伴已在喊冤:&amp;#160; “我這次修改元件，完全沒有動到與出事模組相關的功能&amp;quot;，還繼續冷血主張: &amp;quot;依目前蒐集到的資料來看，暫時還不能排除更新元件與本次意外的關聯&lt;strike&gt;，這陣子先不要出國或旅行，最好確定我隨時可以找到你&lt;/strike&gt;&amp;quot;。由這些只認邏輯、枉顧人情的機車行徑來看，我沒被蓋布袋真是萬幸~~~&lt;/p&gt;  &lt;p&gt;茶包射手做久了，不但對工作遇到的系統問題事事推敲，連看到生活周遭有不合邏輯、缺乏理性判斷的事件，也總不免要碎唸上幾句方休。(例如: &lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/08/14/msn-sun.aspx"&gt;這個例子&lt;/a&gt;、&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2008/09/12/bbq-debate.aspx"&gt;這個例子&lt;/a&gt;和&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2006/06/19/170.aspx"&gt;這個例子&lt;/a&gt;) 而最近我觀察到比較有趣的例子是正反雙方正在激烈辯論的美國牛肉進口與狂牛症相關議題。&lt;/p&gt;  &lt;p&gt;噗友R30給了一個很傳神的結論，狂牛症議題己演化成政治、信仰類的問題，漸漸失去了理性討論的空間。反對者被對方抺黑成不明事理只知人云亦云的鄉巴佬；支持者被對方屈解成硬拗狡辯一心為當局護航的王八蛋。先將對手妖魔化是政治操作的第一步，從此，對方說什麼都可以當成放屁置之不理，然後雙方各自表述，永無交集...&lt;/p&gt;  &lt;p&gt;我熱愛科學，最主要的原因是科學很客觀，很公平，總能找到一個全世界公認的方法證明你是對的(幾乎啦! 我沒有足夠的事證可以主張永遠沒有例外)，不像政治、信仰，每人心中各有一把尺，吵到進棺材也不可能產生結論。因此，看待狂牛症討論，我感興趣的部分也只在其中科學論證部分是否謬誤或存在我認為不合理之處，至於要辯出最終雙方都能接受的共識，我沒抱太高期望。&lt;/p&gt;  &lt;p&gt;我必須要說，雖然有很多朋友都積極主張狂牛症極其可怕所以吃美國牛會發生嚴重後果，甚至有人下了&amp;quot;人類最後天譴&amp;quot;的聳動標題，在看過一些相關論述後，我仍覺得並沒有說服我。(謎之聲: 看你平常的機車表現，不意外)&lt;/p&gt;  &lt;p&gt;我較持保留態度大概在幾點上:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;狂牛症極其可怕應該是大家有共識的部分(我完全贊同)，但關於吃美國牛肉導致狂牛症的風險機率，則正反兩方有很大分歧: 支持方說跟雷打到一樣低(牛絞肉5.77*10^-10, 牛內臟1.50*10^-10, 帶骨牛肉2.72*10^-11, 不帶骨牛肉7.18*10^-12)，反對方則有人主張因亞洲人愛吃牛內臟，故風險比美國人更高。我覺得這點忽略了美國人比亞洲人更愛吃漢堡熱狗，食用牛絞肉的機率高於亞洲，在未否認牛絞肉致病率比內臟更高的情況下(反對方沒有提出此一論述或說明)，要以此點推論台灣人因為愛吃肉臟而提高風險便不合邏輯。(倒不是要否定台灣將承受更高風險的結論，而是質疑&amp;quot;內臟論&amp;quot;邏輯推演的有效性，即便風險真的較高，亦非源於吃內臟) &lt;/li&gt;    &lt;li&gt;在未能證明上一點【台灣人會比美國人因為吃美國牛而承擔更高風險】前，要求台灣要比美國人抱持更高警戒心與更嚴苛管控手段的主張就顯得缺乏支持力。而我的一大疑惑也在於此: 如果牛絞肉引發狂牛症的機率不容小覷，為何美國人還能每天面無懼色地大嚼牛肉漢堡? 觀察下來，似乎要解釋此點就只得搬出陰謀論，例如: 美國人吃的保證不是問題牛、黑心牛一律都出口、為免經濟解體只好欺騙人民... 之類的。對邏輯性要求很機車的我，基本上對陰謀論的接受度偏低，目前還沒看到能說服我的說法。 &lt;/li&gt;    &lt;li&gt;在反對文章裡看到一段讓人震憾的事實:&amp;quot;狂牛症蛋白質甚至用高溫700度或放射線皆無法滅絕，化為灰燼後仍有感染性，若任意丟棄土壤也會感染&amp;quot; 。由於跟我學生物時的認知差實在差距太大，一開始看到時我拒絕相信，問了生化專長的Lucas，他的猜測是&amp;quot;70 度大概是指 巴斯德殺菌法 的72^C 15分鐘, 跟放射線一樣都是常用而且溫柔的殺菌方法, 對這種頑固的蛋白質無效&amp;quot;，因此我一直誤以為700度是70度的筆誤。當我把此一看法貼到朋友的Blog上，朋友很細心地回覆我一個更震憾的&lt;a href="http://taiwanyes.ning.com/forum/topics/kuang-niu-bing-bsede-you-lai"&gt;補充參考&lt;/a&gt;(針對疑點提出相關佐證，我喜歡這樣的討論互動): 一篇德國的論文指出&amp;quot;為了消除變形Prionen蛋白(朊病毒)須將感染的物質以攝氏133 ° C加熱 20分鐘之久, 且以氣壓力為3 Bar(蒸氣高壓鍋)的方法才可能消滅它。即使在加熱至攝氏 600度15分鐘之後，還是可以找到依然完好Prionen蛋白(朊病毒)&amp;quot;。這就是足以說服我的事證了，不過基於與常理差異實在太大，實在很難接受此一論點，但畢竟這個領域遠超出我的知識範圍，總不能找一塊牛排跟一枝番仔火就親自驗證。在沒有其他證據可以推翻它之前，似乎只能選擇接受。 &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;明知有疑，卻不能深入一探究竟對茶包射手來說是一種煎熬! 所幸，Lucas跟我一樣篤信科學，對於可疑事物一向也愛追根究底，經過專業考證與解讀後得到了一個&lt;a href="http://blog.yam.com/lucast/article/25121664"&gt;重要心得&lt;/a&gt; -- 這個推論出到600度金鋼不壞的科學研究，存在一些疑點(感謝Lucas用白話把深澀的豆芽菜生物學論文解釋到連我都看得懂):&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;未能解釋實驗結果裡加熱5分鐘未致病，加熱10分鐘後反而可以致病? &lt;/li&gt;    &lt;li&gt;未如預期產生稀釋後機率下降的結果(莫非另有致病源?) &lt;/li&gt;    &lt;li&gt;缺乏對照組實驗排除實驗系統的背景污染 &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;質疑研究方法與結論對錯是兩件獨立的事。要說服大家600度燒成灰的蛋白質仍帶有致病力本來就是個艱鉅挑戰，至少這個實驗存在的疑點，可以讓我先對它持保留的態度，留待更多的資訊再做決定是否要相信600度金鋼不壞的神話。&lt;/p&gt;  &lt;p&gt;最後推一下Lucas文中提到的有趣觀點: &amp;quot;&lt;a href="http://blog.yam.com/lucast/article/25121664"&gt;先科學、再民主&lt;/a&gt;&amp;quot;，就算全民公投通過把圓周率從3.14改成4.13，我會接受這個公投結果，但心中仍然選擇繼續相信可以用公式驗證為永遠是3.1415926...的圓周率數值。比&lt;a href="http://www.bud.org.tw/museum/s_star12.htm"&gt;伽利略&lt;/a&gt;幸福的是，我們身處一個可以堅持自己科學信仰，不用擔心被送上宗教法庭判刑燒死的民主時代，I love it!&lt;/p&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=5600" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BWW8L1EJZ86YuPWCfnn964bfLlg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BWW8L1EJZ86YuPWCfnn964bfLlg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BWW8L1EJZ86YuPWCfnn964bfLlg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BWW8L1EJZ86YuPWCfnn964bfLlg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Darkthread/~4/HqxyAfRulCE" height="1" width="1"/&gt;</description><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/Trouble-Shooting/default.aspx">Trouble-Shooting</category><feedburner:origLink>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/11/08/600-degree-mistry.aspx</feedburner:origLink></item><item><title>Visual Studio偵錯時無法重新選擇原始檔位置</title><link>http://feedproxy.google.com/~r/Darkthread/~3/ANkAcwpCWzg/set-vs-debug-source.aspx</link><pubDate>Fri, 06 Nov 2009 23:26:26 GMT</pubDate><guid isPermaLink="false">d08a49d6-af59-4068-8b43-b7c037f78068:5599</guid><dc:creator>Jeffrey</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blog.darkthread.net/blogs/darkthreadtw/rsscomments.aspx?PostID=5599</wfw:commentRss><comments>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/11/07/set-vs-debug-source.aspx#comments</comments><description>&lt;span id="PostName"&gt;&lt;/span&gt; &lt;p&gt;在Visual Studio Debug過程中，如果專案裡引用了其他自製元件的DLL檔案，而不是直接參考自製元件的Project，Debug過程若該元件內部出錯，找不到原本設定的原始程式碼，Visual Studio便會彈出如下訊息:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#ff8000"&gt;The source file is different from when the module was built. Would you like the debugger to use it anyway?&lt;/font&gt;&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;此時你可以答Yes，選擇忽略這段原始碼，斷續偵錯其他部分。&lt;/p&gt; &lt;p&gt;不過天不從人願，往往追了大半天，問題來源還是指向自製元件的內部邏輯，因此想改變心意，找來該元件的Source Code想Debug進去，卻發現因為先前選擇略過它的原始檔，之後Debug時就無法將執行中斷點與原始檔結合，VS會一律略過它，沒機會重新選擇原始檔位置。&lt;/p&gt; &lt;p&gt;摸索了一陣子，發現原來忽略原始檔位置的設定被儲存在Solution中。如下圖，由Solution的內容屬性找到Debug Source Files選項，就可以將原本的略過設定清除囉! 祝大家Debug愉快。&lt;/p&gt; &lt;p&gt;&lt;img class="PopBoxImageSmall" src="http://blog.darkthread.net/photos/darkthread/images/5517/500x375.aspx" alt="" /&gt;&lt;/p&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=5599" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Ri6nmawVe6pLcDe6r5H4aprT26A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Ri6nmawVe6pLcDe6r5H4aprT26A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Ri6nmawVe6pLcDe6r5H4aprT26A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Ri6nmawVe6pLcDe6r5H4aprT26A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Darkthread/~4/ANkAcwpCWzg" height="1" width="1"/&gt;</description><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/Tips/default.aspx">Tips</category><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/VS2008/default.aspx">VS2008</category><feedburner:origLink>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/11/07/set-vs-debug-source.aspx</feedburner:origLink></item><item><title>MEMO-Procedure Transaction: SQL Server vs Oracle</title><link>http://feedproxy.google.com/~r/Darkthread/~3/Luk1jf_agm4/oracle-sql-proc-tran.aspx</link><pubDate>Fri, 06 Nov 2009 00:15:07 GMT</pubDate><guid isPermaLink="false">d08a49d6-af59-4068-8b43-b7c037f78068:5596</guid><dc:creator>Jeffrey</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blog.darkthread.net/blogs/darkthreadtw/rsscomments.aspx?PostID=5596</wfw:commentRss><comments>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/11/06/oracle-sql-proc-tran.aspx#comments</comments><description>&lt;span id="PostName"&gt;&lt;/span&gt; &lt;p&gt;同事詢問關於Procedure內是否會自動包成Transaction的問題，我的認知是SQL要額外下SET XACT_ABORT ON，但Oracle則預設會自動包成Transaction。記憶有些模糊，所以索性做個實驗最準。&lt;/p&gt; &lt;p&gt;分別在SQL, Oracle寫了Procedure，先塞入兩筆資料，第三筆故意產生PK重覆錯誤，觀察資料庫是否有前兩筆資料來判別是否有Transaction保護。實驗證明，原先的認知沒錯，二者行為不同。&lt;/p&gt; &lt;p&gt;SQL Server Procedure要將操作包成Transaction的話，記得要下&lt;a href="http://msdn.microsoft.com/zh-tw/library/ms188792.aspx"&gt;SET XACT_ABORT ON&lt;/a&gt;!&lt;/p&gt; &lt;div class="BlogCodeBlock"&gt; &lt;div class="csharpcode"&gt;&lt;pre class="rem"&gt;/*** SQL Server Test ***/&lt;/pre&gt;&lt;pre&gt;--建立有PK的Table&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;create&lt;/span&gt; &lt;span class="kwrd"&gt;table&lt;/span&gt; jefftable (&lt;/pre&gt;&lt;pre&gt;    id &lt;span class="kwrd"&gt;decimal&lt;/span&gt;, &lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;constraint&lt;/span&gt; pk_jefftable &lt;span class="kwrd"&gt;primary&lt;/span&gt; &lt;span class="kwrd"&gt;key&lt;/span&gt; (id)&lt;/pre&gt;&lt;pre&gt;)&lt;/pre&gt;&lt;pre class="rem"&gt;--建立SP, 故意塞入重覆PK&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;create&lt;/span&gt; &lt;span class="kwrd"&gt;procedure&lt;/span&gt; jeffproc&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;as&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;begin&lt;/span&gt;&lt;/pre&gt;&lt;pre class="rem"&gt;   /* SQL SP要自成Transaction, 要加這列&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;set&lt;/span&gt; xact_abort &lt;span class="kwrd"&gt;on&lt;/span&gt;&lt;/pre&gt;&lt;pre class="rem"&gt;   */&lt;/pre&gt;&lt;pre&gt;   &lt;span class="kwrd"&gt;insert&lt;/span&gt; &lt;span class="kwrd"&gt;into&lt;/span&gt; jefftable &lt;span class="kwrd"&gt;values&lt;/span&gt; (1)&lt;/pre&gt;&lt;pre class="alt"&gt;   &lt;span class="kwrd"&gt;insert&lt;/span&gt; &lt;span class="kwrd"&gt;into&lt;/span&gt; jefftable &lt;span class="kwrd"&gt;values&lt;/span&gt; (2)&lt;/pre&gt;&lt;pre&gt;   &lt;span class="kwrd"&gt;insert&lt;/span&gt; &lt;span class="kwrd"&gt;into&lt;/span&gt; jefftable &lt;span class="kwrd"&gt;values&lt;/span&gt; (1)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;pre class="rem"&gt;--執行SP, 會產生錯誤&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;exec&lt;/span&gt; jeffproc&lt;/pre&gt;&lt;pre class="rem"&gt;--查Table會看到兩筆&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; * &lt;span class="kwrd"&gt;from&lt;/span&gt; jefftable&lt;/pre&gt;&lt;pre class="rem"&gt;--清理實驗廢棄物&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;drop&lt;/span&gt; &lt;span class="kwrd"&gt;table&lt;/span&gt; jefftable&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;drop&lt;/span&gt; &lt;span class="kwrd"&gt;procedure&lt;/span&gt; jeffproc&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="rem"&gt;/*** ORACLE Test ***/&lt;/pre&gt;&lt;pre class="rem"&gt;--建立有PK的Table&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;create&lt;/span&gt; &lt;span class="kwrd"&gt;table&lt;/span&gt; jefftable (&lt;/pre&gt;&lt;pre class="alt"&gt;  id &lt;span class="kwrd"&gt;decimal&lt;/span&gt;, &lt;/pre&gt;&lt;pre&gt;  &lt;span class="kwrd"&gt;constraint&lt;/span&gt; pk_jefftable &lt;span class="kwrd"&gt;primary&lt;/span&gt; &lt;span class="kwrd"&gt;key&lt;/span&gt; (id)&lt;/pre&gt;&lt;pre class="alt"&gt;)&lt;/pre&gt;&lt;pre class="rem"&gt;--建立SP, 故意塞入重覆PK&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;create&lt;/span&gt; &lt;span class="kwrd"&gt;procedure&lt;/span&gt; jeffproc&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;is&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;begin&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;  &lt;span class="kwrd"&gt;insert&lt;/span&gt; &lt;span class="kwrd"&gt;into&lt;/span&gt; jefftable &lt;span class="kwrd"&gt;values&lt;/span&gt; (1);&lt;/pre&gt;&lt;pre class="alt"&gt;  &lt;span class="kwrd"&gt;insert&lt;/span&gt; &lt;span class="kwrd"&gt;into&lt;/span&gt; jefftable &lt;span class="kwrd"&gt;values&lt;/span&gt; (2);&lt;/pre&gt;&lt;pre&gt;  &lt;span class="kwrd"&gt;insert&lt;/span&gt; &lt;span class="kwrd"&gt;into&lt;/span&gt; jefftable &lt;span class="kwrd"&gt;values&lt;/span&gt; (1);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;end&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="rem"&gt;--執行SP, 會產生錯誤&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;declare&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;begin&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;jeffproc;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;end&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="rem"&gt;--查Table, 沒有資料&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; * &lt;span class="kwrd"&gt;from&lt;/span&gt; jefftable&lt;/pre&gt;&lt;pre class="rem"&gt;--清理實驗廢棄物&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;drop&lt;/span&gt; &lt;span class="kwrd"&gt;table&lt;/span&gt; jefftable&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;drop&lt;/span&gt; &lt;span class="kwrd"&gt;procedure&lt;/span&gt; jeffproc&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=5596" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Owg4Jj_3Zh7RwMhJMvqe92kOWVA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Owg4Jj_3Zh7RwMhJMvqe92kOWVA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Owg4Jj_3Zh7RwMhJMvqe92kOWVA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Owg4Jj_3Zh7RwMhJMvqe92kOWVA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Darkthread/~4/Luk1jf_agm4" height="1" width="1"/&gt;</description><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/ORACLE/default.aspx">ORACLE</category><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/SQL+2005/default.aspx">SQL 2005</category><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/SQL+2000/default.aspx">SQL 2000</category><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/SQL+2008/default.aspx">SQL 2008</category><feedburner:origLink>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/11/06/oracle-sql-proc-tran.aspx</feedburner:origLink></item><item><title>活到老學到老-CSS Media Types</title><link>http://feedproxy.google.com/~r/Darkthread/~3/vHKaQjS84L0/css-media-types.aspx</link><pubDate>Thu, 05 Nov 2009 13:50:07 GMT</pubDate><guid isPermaLink="false">d08a49d6-af59-4068-8b43-b7c037f78068:5593</guid><dc:creator>Jeffrey</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://blog.darkthread.net/blogs/darkthreadtw/rsscomments.aspx?PostID=5593</wfw:commentRss><comments>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/11/06/css-media-types.aspx#comments</comments><description>&lt;span id="PostName"&gt;&lt;/span&gt;  &lt;p&gt;在部落格上分享技術心得，常帶來意外收獲! &lt;/p&gt;  &lt;p&gt;網友的迴響總讓我見識增長，額外學到的新東西超乎想像，每每發現過去忽略或未曾接觸的寶藏，總令我欣喜若狂。&lt;/p&gt;  &lt;p&gt;說出來也不怕大家笑話，從事Web開發多年，卻未曾&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2008/11/13/some-js-tips.aspx"&gt;在Javascript下過苦工&lt;/a&gt;，對CSS也是開始把玩jQuery後才漸漸熟悉的。終日周旋於工作家庭間，己難再鼔起滿腔熱血，心無旁鶩地狂K三天，將一個技術摸到爛熟。【需要再學，夠用就好】成了不追根究底的藉口，找到堪用工具，儘速解決問題，如期領到薪餉，珍惜家庭時光成為中年程序員卑微卻知足的生活方式，噗友說，這叫MOP(Money Oriented Programming)，一針見血! (謎之聲: 嘴砲一堆，何不痛快承認你是喪失偉大理想抱負的現實程式工就好了?)&lt;/p&gt;  &lt;p&gt;話說，昨天貼了一篇&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/11/04/page-break-css.aspx"&gt;網頁列印強迫分頁&lt;/a&gt;的jQuery心得分享。本站常客，Javascript界的絕地大師，Ammon，忽然現身點醒我—&lt;strike&gt;Use the force, Luke&lt;/strike&gt; Use the media, Dark。&lt;/p&gt;  &lt;p&gt;一語警醒夢中人，其實過去在檢視一些網頁HTML Source時，早看過media=&amp;quot;print,screen”的寫法，只是一向得過且過，從沒深究過它的意涵。經Ammon一提醒，才發現我忽略了好東西。&lt;/p&gt;  &lt;p&gt;簡單來說，透過指定&lt;a href="http://www.w3.org/TR/CSS2/media.html"&gt;CSS Media Type&lt;/a&gt;，我們可以對同一個元素分別為顯示、列印、行動裝置指定不同的呈現樣式! 老實說，這是非常基本的CSS應用；但搞Web這麼久，我卻一直忽略了它，直到今天。&lt;/p&gt;  &lt;p&gt;廢話不多說，請看我整理的範例:&lt;/p&gt;  &lt;div class="BlogCodeBlock"&gt;   &lt;div class="csharpcode"&gt;     &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Print Friendly&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;style&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/css&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;        .cContent  &lt;/pre&gt;

    &lt;pre&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;            margin-top: 10px;&lt;/pre&gt;

    &lt;pre&gt;            margin-left: 10px;&lt;/pre&gt;

    &lt;pre class="alt"&gt;            width: 400px;&lt;/pre&gt;

    &lt;pre&gt;            border: dotted 1px #444444; &lt;/pre&gt;

    &lt;pre class="alt"&gt;        }&lt;/pre&gt;

    &lt;pre&gt;        /* 可以用@media mediaType的方式宣告不同媒體專用樣式 */&lt;/pre&gt;

    &lt;pre class="alt"&gt;        @media screen &lt;/pre&gt;

    &lt;pre&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;            /* 螢幕上是藍底白字 */&lt;/pre&gt;

    &lt;pre&gt;            .cContent  &lt;/pre&gt;

    &lt;pre class="alt"&gt;            {&lt;/pre&gt;

    &lt;pre&gt;                color: White; &lt;/pre&gt;

    &lt;pre class="alt"&gt;                background-color: Blue;&lt;/pre&gt;

    &lt;pre&gt;            }&lt;/pre&gt;

    &lt;pre class="alt"&gt;        }&lt;/pre&gt;

    &lt;pre&gt;        @media print &lt;/pre&gt;

    &lt;pre class="alt"&gt;        {&lt;/pre&gt;

    &lt;pre&gt;            /* 列印時是白紙黑字的 */&lt;/pre&gt;

    &lt;pre class="alt"&gt;            .cContent { color: #222222; }&lt;/pre&gt;

    &lt;pre&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;    &lt;span class="rem"&gt;&amp;lt;!-- link, style可用media=&amp;quot;mediaType&amp;quot;宣告適用時機 --&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;style&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/css&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;media&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;screen&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;        /* 顯示時隱藏 */&lt;/pre&gt;

    &lt;pre class="alt"&gt;        .cPrint { display: none; }&lt;/pre&gt;

    &lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;style&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/css&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;media&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;print&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;        /* 列印時隱藏 */&lt;/pre&gt;

    &lt;pre class="alt"&gt;        .cScreen { display: none; }&lt;/pre&gt;

    &lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;cPrint&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Print Header&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;cScreen&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Display Header&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;blockquote&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;cContent&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;One of the most important features  &lt;/pre&gt;

    &lt;pre class="alt"&gt;...&lt;/pre&gt;

    &lt;pre&gt;certain media types. &lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;blockquote&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/5592/original.aspx" alt="" /&gt;&lt;/p&gt;

&lt;p&gt;應用這個技巧，&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/11/04/page-break-css.aspx"&gt;昨天的程式&lt;/a&gt;我們可以修改成:&lt;/p&gt;

&lt;div class="BlogCodeBlock"&gt;
  &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;style&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/css&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;@media print &lt;/pre&gt;

    &lt;pre class="alt"&gt;{&lt;/pre&gt;

    &lt;pre&gt;    .cPrint  &lt;/pre&gt;

    &lt;pre class="alt"&gt;    {&lt;/pre&gt;

    &lt;pre&gt;        display: block;    &lt;/pre&gt;

    &lt;pre class="alt"&gt;        page-break-before: always; &lt;/pre&gt;

    &lt;pre&gt;    }&lt;/pre&gt;

    &lt;pre class="alt"&gt;    #btnPrint { display: none; }&lt;/pre&gt;

    &lt;pre&gt;}&lt;/pre&gt;

    &lt;pre class="alt"&gt;@media screen&lt;/pre&gt;

    &lt;pre&gt;{&lt;/pre&gt;

    &lt;pre class="alt"&gt;    .cPrint { display: none; }&lt;/pre&gt;

    &lt;pre&gt;}&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;    $(&lt;span class="kwrd"&gt;function&lt;/span&gt;() {&lt;/pre&gt;

    &lt;pre&gt;        &lt;span class="rem"&gt;//DataList的每六列加一個表頭&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;var&lt;/span&gt; $rows = $(&lt;span class="str"&gt;&amp;quot;#DataList1 &amp;gt; tbody &amp;gt; tr&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre&gt;        $rows.each(&lt;span class="kwrd"&gt;function&lt;/span&gt;(i) {&lt;/pre&gt;

    &lt;pre class="alt"&gt;            &lt;span class="rem"&gt;//取6的倍數, 排除最後一筆&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; ((i + 1) % 6 == 0 &amp;amp;&amp;amp; i != $rows.length - 1) {&lt;/pre&gt;

    &lt;pre class="alt"&gt;                &lt;span class="rem"&gt;//加上頁首並設定跳頁&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;                $(&lt;span class="kwrd"&gt;this&lt;/span&gt;).after(&lt;span class="str"&gt;&amp;quot;&amp;lt;tr class=&amp;#39;cPrintOnly&amp;#39;&amp;gt;&amp;lt;td&amp;gt;&amp;quot;&lt;/span&gt; +&lt;/pre&gt;

    &lt;pre class="alt"&gt;                $(&lt;span class="str"&gt;&amp;quot;#dvPageHeader&amp;quot;&lt;/span&gt;).html() + &lt;span class="str"&gt;&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre&gt;            }&lt;/pre&gt;

    &lt;pre class="alt"&gt;        });&lt;/pre&gt;

    &lt;pre&gt;        $(&lt;span class="str"&gt;&amp;quot;#btnPrint&amp;quot;&lt;/span&gt;).click(&lt;span class="kwrd"&gt;function&lt;/span&gt;() {&lt;/pre&gt;

    &lt;pre class="alt"&gt;            &lt;span class="rem"&gt;//列印&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;            window.print();&lt;/pre&gt;

    &lt;pre class="alt"&gt;        });&lt;/pre&gt;

    &lt;pre&gt;    });&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;    &lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;再次感謝Ammon大師開示。&lt;/p&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=5593" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/kqj1me8Ke0UoamaBSrXdZZxQjs8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kqj1me8Ke0UoamaBSrXdZZxQjs8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/kqj1me8Ke0UoamaBSrXdZZxQjs8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kqj1me8Ke0UoamaBSrXdZZxQjs8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Darkthread/~4/vHKaQjS84L0" height="1" width="1"/&gt;</description><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/CSS/default.aspx">CSS</category><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/jQuery/default.aspx">jQuery</category><feedburner:origLink>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/11/06/css-media-types.aspx</feedburner:origLink></item><item><title>MEMO-網頁列印強迫分頁</title><link>http://feedproxy.google.com/~r/Darkthread/~3/U8BO3SzjoZ8/page-break-css.aspx</link><pubDate>Wed, 04 Nov 2009 09:24:00 GMT</pubDate><guid isPermaLink="false">d08a49d6-af59-4068-8b43-b7c037f78068:5586</guid><dc:creator>Jeffrey</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://blog.darkthread.net/blogs/darkthreadtw/rsscomments.aspx?PostID=5586</wfw:commentRss><comments>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/11/04/page-break-css.aspx#comments</comments><description>&lt;span id="PostName"&gt;&lt;/span&gt;
&lt;p&gt;專案裡有個網頁列印的需求，在一份清單中，每個項目以Table方式呈現，而列印時不希望項目Table跨頁。以下是我搞出來的解決方案:&lt;/p&gt;
&lt;div class="BlogCodeBlock"&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;style&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/css&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;.cPrintOnly { &lt;/pre&gt;&lt;pre class="alt"&gt;    page-break-before: always; &lt;/pre&gt;&lt;pre&gt;    display: none;&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;$(&lt;span class="kwrd"&gt;function&lt;/span&gt;() {&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;//DataList的每六列加一個表頭&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;var&lt;/span&gt; $rows = $(&lt;span class="str"&gt;&amp;quot;#DataList1 &amp;gt; tbody &amp;gt; tr&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;    $rows.each(&lt;span class="kwrd"&gt;function&lt;/span&gt;(i) {&lt;/pre&gt;&lt;pre&gt;        &lt;span class="rem"&gt;//取6的倍數, 排除最後一筆&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; ((i + 1) % 6 == 0 &amp;amp;&amp;amp; i != $rows.length - 1) {&lt;/pre&gt;&lt;pre&gt;            &lt;span class="rem"&gt;//加上頁首並設定跳頁&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            $(&lt;span class="kwrd"&gt;this&lt;/span&gt;).after(&lt;span class="str"&gt;&amp;quot;&amp;lt;tr class=&amp;#39;cPrintOnly&amp;#39;&amp;gt;&amp;lt;td&amp;gt;&amp;quot;&lt;/span&gt; +&lt;/pre&gt;&lt;pre&gt;        $(&lt;span class="str"&gt;&amp;quot;#dvPageHeader&amp;quot;&lt;/span&gt;).html() + &lt;span class="str"&gt;&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;        }&lt;/pre&gt;&lt;pre&gt;    });&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;//列印鈕功能&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    $(&lt;span class="str"&gt;&amp;quot;#btnPrint&amp;quot;&lt;/span&gt;).click(&lt;span class="kwrd"&gt;function&lt;/span&gt;() {&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;var&lt;/span&gt; $dv = $(&lt;span class="kwrd"&gt;this&lt;/span&gt;).parent();&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;var&lt;/span&gt; $pgHdr = $(&lt;span class="str"&gt;&amp;quot;.cPrintOnly&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;//將列印鈕隱藏&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        $dv.hide();&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;//顯示換頁頁首&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        $pgHdr.show();&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;//列印&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        window.print();&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;//顯示列印鈕、隱藏換頁表頭&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        $dv.show();&lt;/pre&gt;&lt;pre class="alt"&gt;        $pgHdr.hide();&lt;/pre&gt;&lt;pre&gt;    });&lt;/pre&gt;&lt;pre class="alt"&gt;});&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;font color="#ff8000"&gt;【程式說明】&lt;/font&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;列印時能強迫分頁歸功於CSS屬性: &lt;a href="http://www.w3schools.com/Css/pr_print_pagebb.asp"&gt;page-break-before&lt;/a&gt; 
&lt;li&gt;利用jQuery的each()及index參數，做到每隔六個項目一數，在後方插入一個表頭並設定強迫換頁印列。(奉天承運，User詔曰: 每頁都要有頁首，不然很醜...) 
&lt;li&gt;用window.print()列印。(註: 有跨瀏覽器Issue，但本案瀏覽器限IE) 
&lt;li&gt;&lt;strike&gt;換頁頁首預設隱藏，列印按鈕按下時，顯示換頁頁首，並隱藏列印鈕，印完再恢復。&lt;/strike&gt;&lt;br /&gt;&lt;font color="#ff6600"&gt;【2009-11-05更新】&lt;/font&gt;關於列時印隱藏元素，有&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/11/06/css-media-types.aspx"&gt;更好的做法&lt;/a&gt;。&lt;/li&gt;&lt;/ol&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=5586" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4yyXxy7e68K0rrxJSfFVlCeZbpE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4yyXxy7e68K0rrxJSfFVlCeZbpE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4yyXxy7e68K0rrxJSfFVlCeZbpE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4yyXxy7e68K0rrxJSfFVlCeZbpE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Darkthread/~4/U8BO3SzjoZ8" height="1" width="1"/&gt;</description><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/Javascript/default.aspx">Javascript</category><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/jQuery/default.aspx">jQuery</category><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/CODE/default.aspx">CODE</category><feedburner:origLink>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/11/04/page-break-css.aspx</feedburner:origLink></item><item><title>CODE-將CSV檔案內容轉換成ADO.NET DataTable物件</title><link>http://feedproxy.google.com/~r/Darkthread/~3/Mhv59b7jQqo/csv-to-datatable.aspx</link><pubDate>Fri, 30 Oct 2009 02:06:42 GMT</pubDate><guid isPermaLink="false">d08a49d6-af59-4068-8b43-b7c037f78068:5568</guid><dc:creator>Jeffrey</dc:creator><slash:comments>6</slash:comments><wfw:commentRss>http://blog.darkthread.net/blogs/darkthreadtw/rsscomments.aspx?PostID=5568</wfw:commentRss><comments>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/30/csv-to-datatable.aspx#comments</comments><description>&lt;span id="PostName"&gt;&lt;/span&gt; &lt;p&gt;寫給同事用的工具函數，隨手貼文分享:&lt;/p&gt; &lt;div class="BlogCodeBlock"&gt; &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// 將CSV內容字串轉成DataTable(全部欄位都視為string，有需要請自行轉換), 不支援&amp;quot;&amp;quot;包夾格式&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;csvContent&amp;quot;&amp;gt;整個CSV的內容&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;firstRowAsHeader&amp;quot;&amp;gt;第一列是否為欄位名稱，若無則以C1, C2自動命名&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; DataTable ConvertCSVtoDataTable(&lt;span class="kwrd"&gt;string&lt;/span&gt; csvContent, &lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;bool&lt;/span&gt; firstRowAsHeader)&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;    DataTable t = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataTable();&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;using&lt;/span&gt; (StringReader sr = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringReader(csvContent))&lt;/pre&gt;&lt;pre&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;string&lt;/span&gt; line = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;bool&lt;/span&gt; colCreated = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;while&lt;/span&gt; ((line = sr.ReadLine()) != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt;[] p = line.Split(&lt;span class="str"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (!colCreated)&lt;/pre&gt;&lt;pre class="alt"&gt;            {&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;int&lt;/span&gt; idx = 1;&lt;/pre&gt;&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt; s &lt;span class="kwrd"&gt;in&lt;/span&gt; p)&lt;/pre&gt;&lt;pre&gt;                {&lt;/pre&gt;&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;                    {&lt;/pre&gt;&lt;pre class="alt"&gt;                        t.Columns.Add(&lt;/pre&gt;&lt;pre&gt;                            &lt;span class="rem"&gt;//第一欄是否有欄位名稱? 無則用C1, C2自動編號&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                            firstRowAsHeader ? s : &lt;span class="str"&gt;&amp;quot;C&amp;quot;&lt;/span&gt; + idx.ToString(),&lt;/pre&gt;&lt;pre&gt;                            &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;                            );&lt;/pre&gt;&lt;pre&gt;                    }&lt;/pre&gt;&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception e1)&lt;/pre&gt;&lt;pre&gt;                    {&lt;/pre&gt;&lt;pre class="alt"&gt;                        &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(&lt;/pre&gt;&lt;pre&gt;                            &lt;span class="str"&gt;&amp;quot;新增欄位失敗! 欄位名稱=&amp;quot;&lt;/span&gt; + s + &lt;span class="str"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt; + e1.ToString());&lt;/pre&gt;&lt;pre class="alt"&gt;                    }&lt;/pre&gt;&lt;pre&gt;                    idx++;&lt;/pre&gt;&lt;pre class="alt"&gt;                }&lt;/pre&gt;&lt;pre&gt;                colCreated = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;                &lt;span class="rem"&gt;//首欄若為欄名，則不當資料處理&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (firstRowAsHeader) &lt;span class="kwrd"&gt;continue&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;            }&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            {&lt;/pre&gt;&lt;pre&gt;                t.Rows.Add(p);&lt;/pre&gt;&lt;pre class="alt"&gt;            }&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception e2)&lt;/pre&gt;&lt;pre class="alt"&gt;            {&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(&lt;span class="str"&gt;&amp;quot;資料匯入失敗!\n資料=&amp;quot;&lt;/span&gt; + line + &lt;/pre&gt;&lt;pre class="alt"&gt;                    &lt;span class="str"&gt;&amp;quot;\n錯誤訊息:&amp;quot;&lt;/span&gt; + e2.ToString());&lt;/pre&gt;&lt;pre&gt;            }&lt;/pre&gt;&lt;pre class="alt"&gt;        }&lt;/pre&gt;&lt;pre&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; t;&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; test()&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;string&lt;/span&gt; csv = &lt;span class="str"&gt;&amp;quot;ID,Name,Score\n1,Jeffrey,200\n2,Darkthread,999&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;//Or you can read data from file&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="rem"&gt;//string csv = System.IO.File.ReadAllText(&amp;quot;B:\\mydata.csv&amp;quot;);&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    DataTable t = ConvertCSVtoDataTable(csv, &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;    Debug.WriteLine(&lt;span class="str"&gt;&amp;quot;RowCount=&amp;quot;&lt;/span&gt; + t.Rows.Count);&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (DataRow r &lt;span class="kwrd"&gt;in&lt;/span&gt; t.Rows)&lt;/pre&gt;&lt;pre&gt;        Debug.WriteLine(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;{0}=&amp;gt;{1}&amp;quot;&lt;/span&gt;, r[&lt;span class="str"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;], r[&lt;span class="str"&gt;&amp;quot;Score&amp;quot;&lt;/span&gt;]));&lt;/pre&gt;&lt;pre class="alt"&gt;    csv = &lt;span class="str"&gt;&amp;quot;1,Jeffrey,200\n2,Darkthread,999&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;    t = ConvertCSVtoDataTable(csv, &lt;span class="kwrd"&gt;false&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;    Debug.WriteLine(&lt;span class="str"&gt;&amp;quot;RowCount=&amp;quot;&lt;/span&gt; + t.Rows.Count);&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (DataRow r &lt;span class="kwrd"&gt;in&lt;/span&gt; t.Rows)&lt;/pre&gt;&lt;pre class="alt"&gt;        Debug.WriteLine(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;{0}=&amp;gt;{1}&amp;quot;&lt;/span&gt;, r[&lt;span class="str"&gt;&amp;quot;C2&amp;quot;&lt;/span&gt;], r[&lt;span class="str"&gt;&amp;quot;C3&amp;quot;&lt;/span&gt;]));&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=5568" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/A0jYHBV7nuwJ4zN7D52hJb0KY7o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/A0jYHBV7nuwJ4zN7D52hJb0KY7o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/A0jYHBV7nuwJ4zN7D52hJb0KY7o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/A0jYHBV7nuwJ4zN7D52hJb0KY7o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Darkthread/~4/Mhv59b7jQqo" height="1" width="1"/&gt;</description><feedburner:origLink>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/30/csv-to-datatable.aspx</feedburner:origLink></item><item><title>【茶包射手筆記】Office 2007人生變黑白</title><link>http://feedproxy.google.com/~r/Darkthread/~3/T2xQbgdXJ6M/black-and-white-office-2007.aspx</link><pubDate>Tue, 27 Oct 2009 23:03:17 GMT</pubDate><guid isPermaLink="false">d08a49d6-af59-4068-8b43-b7c037f78068:5560</guid><dc:creator>Jeffrey</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://blog.darkthread.net/blogs/darkthreadtw/rsscomments.aspx?PostID=5560</wfw:commentRss><comments>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/28/black-and-white-office-2007.aspx#comments</comments><description>&lt;span id="PostName"&gt;&lt;/span&gt; &lt;p&gt;同事遇到的狀況，使用PCAnywhere後，再開啟Excel 2007/Word 2007/Outlook 2007等Office家族軟體，操作介面就會變成如下貧血的怪樣子，但重開機就恢復正常。&lt;/p&gt; &lt;p&gt;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/5559/original.aspx" alt="" /&gt; &lt;/p&gt; &lt;p&gt;Google到&lt;a href="http://www.eggheadcafe.com/software/aspnet/31274535/office-2007-user-interfac.aspx"&gt;相關的討論&lt;/a&gt;，雖然情境不完全相同，但裡面提到了VGA Driver的因素，感覺上PCAnywhere在使用遠端搖控時，確實會與顯示層有些關聯，有可能是其更動了某些顯示設定導致。&lt;/p&gt; &lt;p&gt;靈機一動，想到調整解析度或許能重置相關設定，Bingo!! 只要隨便變一下解析度，問題就消失了。(大家這才發現，Office這怪樣子，似乎就是在256色模式下的長相。)&lt;/p&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=5560" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uqwj4P45tKedFvtibn80ZrAvyJo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uqwj4P45tKedFvtibn80ZrAvyJo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uqwj4P45tKedFvtibn80ZrAvyJo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uqwj4P45tKedFvtibn80ZrAvyJo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Darkthread/~4/T2xQbgdXJ6M" height="1" width="1"/&gt;</description><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/Trouble-Shooting/default.aspx">Trouble-Shooting</category><feedburner:origLink>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/28/black-and-white-office-2007.aspx</feedburner:origLink></item><item><title>徹底解決Vista/Windows 7半夜自動開機問題</title><link>http://feedproxy.google.com/~r/Darkthread/~3/W5lBQZDhf_w/disable-wake-timer.aspx</link><pubDate>Sat, 24 Oct 2009 23:23:38 GMT</pubDate><guid isPermaLink="false">d08a49d6-af59-4068-8b43-b7c037f78068:5557</guid><dc:creator>Jeffrey</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://blog.darkthread.net/blogs/darkthreadtw/rsscomments.aspx?PostID=5557</wfw:commentRss><comments>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/25/disable-wake-timer.aspx#comments</comments><description>&lt;span id="PostName"&gt;&lt;/span&gt;  &lt;p&gt;之前談過Vista&lt;strike&gt;閙鬼&lt;/strike&gt;&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/03/14/boot-midnight.aspx"&gt;半夜自動開機&lt;/a&gt;的問題，當時並未找到根本解決之道，只能在Sleep前留意將待安裝的更新先裝好避免。&lt;/p&gt;  &lt;p&gt;前幾天網友pig在另一篇文章&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/05/mb-restart-repeatly.aspx#5548"&gt;留言&lt;/a&gt;提到了電源管理的選項，我這才恍然大悟，原來該行為是可以被關閉的!&lt;/p&gt;  &lt;p&gt;由【控制台/電源選項/變更計劃設定/變更進階電源設定】可以找到【睡眠/允許喚醒計時器】，將其停用，就可避免被Windows因為更新排程而被叫起床囉~~~&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff8000"&gt;【提醒】&lt;/font&gt;停用此選項，將會延後Windows Update重大更新發佈後套用的時點。預設的設計雖然擾人，但比較安全，調整後就要自己多留意、更勤於安裝Windows更新哦! 另外，計時器喚醒還被應用在電視卡預約錄影等其他功能上，停用會使其失效，也要注意。&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/5556/original.aspx" alt="" /&gt;&lt;/p&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=5557" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/79i699dsIPhuiNAXGllHEb1VT0A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/79i699dsIPhuiNAXGllHEb1VT0A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/79i699dsIPhuiNAXGllHEb1VT0A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/79i699dsIPhuiNAXGllHEb1VT0A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Darkthread/~4/W5lBQZDhf_w" height="1" width="1"/&gt;</description><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/Vista/default.aspx">Vista</category><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/Windows+7/default.aspx">Windows 7</category><feedburner:origLink>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/25/disable-wake-timer.aspx</feedburner:origLink></item><item><title>偵錯IIS7 ASP.NET程式時被強行關閉</title><link>http://feedproxy.google.com/~r/Darkthread/~3/MYuiVR-6kbU/debug-terminated-by-iis7.aspx</link><pubDate>Fri, 23 Oct 2009 13:10:18 GMT</pubDate><guid isPermaLink="false">d08a49d6-af59-4068-8b43-b7c037f78068:5554</guid><dc:creator>Jeffrey</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blog.darkthread.net/blogs/darkthreadtw/rsscomments.aspx?PostID=5554</wfw:commentRss><comments>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/24/debug-terminated-by-iis7.aspx#comments</comments><description>&lt;span id="PostName"&gt;&lt;/span&gt; &lt;p&gt;使用VS2008偵錯IIS7上的Web Application，程式中斷後，在你Line-By-Line埋首抓蟲之際，如果沒法在90秒內克敵制勝，IIS就會不耐久候，跳出以下訊息，偵錯過程跟著就中斷了。&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#ff8000"&gt;The web server process that was being debugged has been terminated by Internet Information Services (IIS).&amp;nbsp; This can be avoided by configuring Application Pool ping settings in IIS.&amp;nbsp; See help for further details.&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;所幸IIS7雖然耐性不好，卻提供了明確的解決方案指引。按下Help按鈕，就會被引導到詳細的操作說明:&lt;/p&gt; &lt;p&gt;英文版: &lt;a title="http://msdn.microsoft.com/en-us/library/bb763108.aspx" href="http://msdn.microsoft.com/en-us/library/bb763108.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb763108.aspx&lt;/a&gt;&lt;br /&gt;中文版: &lt;a title="http://msdn.microsoft.com/zh-tw/library/bb763108.aspx" href="http://msdn.microsoft.com/zh-tw/library/bb763108.aspx"&gt;http://msdn.microsoft.com/zh-tw/library/bb763108.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;原來是在Debug期間，IIS會被監控機制(&lt;a href="http://msdn.microsoft.com/zh-tw/magazine/cc163357.aspx"&gt;WAS&lt;/a&gt;)判定為無回應，一到了逾時上限(預設90秒)，Worker Process就會被重啟。官方文件已詳細說明將Ping停用的步驟(不過大家覺得第10-12點跑去設定Terminal Service是在搞笑，根本是多餘的，請忽略之)，這裡只補一下操作示意圖:&lt;/p&gt; &lt;p&gt;&lt;img class="PopBoxImageSmall" src="http://blog.darkthread.net/photos/darkthread/images/5553/500x375.aspx" alt="" /&gt; &lt;/p&gt; &lt;p&gt;【注意】Ping功能可用來監測IIS Application Pool的狀態，偵測到無回應時會自動重啟Worker Process，有助於改善IIS穩定性，在正式運作的環境中，建議開啟。&lt;/p&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=5554" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/MSw0oPVgJSngqoO15WSCsm6W3d4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MSw0oPVgJSngqoO15WSCsm6W3d4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/MSw0oPVgJSngqoO15WSCsm6W3d4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MSw0oPVgJSngqoO15WSCsm6W3d4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Darkthread/~4/MYuiVR-6kbU" height="1" width="1"/&gt;</description><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/Debug/default.aspx">Debug</category><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/IIS/default.aspx">IIS</category><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/VS2008/default.aspx">VS2008</category><feedburner:origLink>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/24/debug-terminated-by-iis7.aspx</feedburner:origLink></item><item><title>瀏覽器對不合法XML元素名稱的處理</title><link>http://feedproxy.google.com/~r/Darkthread/~3/5GO7sGuMg3E/invalid-xml-element-name.aspx</link><pubDate>Fri, 23 Oct 2009 02:55:13 GMT</pubDate><guid isPermaLink="false">d08a49d6-af59-4068-8b43-b7c037f78068:5552</guid><dc:creator>Jeffrey</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blog.darkthread.net/blogs/darkthreadtw/rsscomments.aspx?PostID=5552</wfw:commentRss><comments>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/23/invalid-xml-element-name.aspx#comments</comments><description>&lt;span id="PostName"&gt;&lt;/span&gt; &lt;p&gt;因程式Bug搞出一個包含無效元素名稱的XML，發現IE的反應很有趣，XML物件的firstChild屬性會傳回null。&lt;/p&gt; &lt;p&gt;依&lt;a href="http://www.w3schools.com/XML/xml_elements.asp"&gt;XML規格&lt;/a&gt;，XML元素名稱必須符合以下條件:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;包含字母、數字及其他字元  &lt;li&gt;不可以數字或標點符號起始  &lt;li&gt;開頭不可以是xml, XML或Xml  &lt;li&gt;不能包含空白&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;我寫了個範例挑戰了這個禁忌，順手試了一下不合法XML格式在各瀏覽器下的反應。&lt;/p&gt; &lt;div class="BlogCodeBlock"&gt; &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;var&lt;/span&gt; xmlStr =&lt;span class="str"&gt;&amp;quot;&amp;lt;data&amp;gt;&amp;lt;0&amp;gt;A&amp;lt;/0&amp;gt;&amp;lt;/data&amp;gt;&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;var&lt;/span&gt; xd = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (window.ActiveXObject) {&lt;/pre&gt;&lt;/div&gt;
&lt;div class="csharpcode"&gt;&lt;pre&gt;    xd = &lt;span class="kwrd"&gt;new&lt;/span&gt; ActiveXObject(&lt;span class="str"&gt;&amp;quot;Microsoft.XMLDOM&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;/div&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;    xd.async = &lt;span class="kwrd"&gt;false&lt;/span&gt;; xd.loadXML(xmlStr);&lt;/pre&gt;&lt;/div&gt;
&lt;div class="csharpcode"&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;typeof&lt;/span&gt; DOMParser != &lt;span class="str"&gt;&amp;quot;undefined&amp;quot;&lt;/span&gt;)&lt;/pre&gt;&lt;/div&gt;
&lt;div class="csharpcode"&gt;&lt;pre&gt;    xd = &lt;span class="kwrd"&gt;new&lt;/span&gt; DOMParser().parseFromString(xmlStr, &lt;span class="str"&gt;&amp;quot;text/xml&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;/div&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;var&lt;/span&gt; elem = xd.firstChild;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (elem == &lt;span class="kwrd"&gt;null&lt;/span&gt;) &lt;/pre&gt;&lt;/div&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;    alert(&lt;span class="str"&gt;&amp;quot;firstChild is null&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;/div&gt;
&lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;    alert(elem.xml || (&lt;span class="kwrd"&gt;new&lt;/span&gt; XMLSerializer()).serializeToString(elem));&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;【測試結果】&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font color="#ff8000"&gt;IE: &lt;br /&gt;&lt;/font&gt;傳回null&lt;/p&gt;
&lt;p&gt;&lt;font color="#ff8000"&gt;Firefox:&lt;/font&gt; &lt;br /&gt;得到&amp;lt;?xml-stylesheet href=&amp;quot;chrome://global/locale/intl.css&amp;quot; type=&amp;quot;text/css&amp;quot;?&amp;gt; &lt;/p&gt;
&lt;p&gt;&lt;font color="#ff8000"&gt;Chrome/Safari:&lt;/font&gt; &lt;br /&gt;&amp;lt;data&amp;gt;&amp;lt;parsererror xmlns=&amp;quot;&lt;a href="http://www.w3.org/1999/xhtml&amp;quot;"&gt;http://www.w3.org/1999/xhtml&amp;quot;&lt;/a&gt; style=&amp;quot;display: block; white-space: pre; border: 2px solid #c77; padding: 0 1em 0 1em; margin: 1em; background-color: #fdd; color: black&amp;quot;&amp;gt;&amp;lt;h3&amp;gt;This page contains the following errors:&amp;lt;/h3&amp;gt;&amp;lt;div style=&amp;quot;font-family:monospace;font-size:12px&amp;quot;&amp;gt;error on line 1 at column 8: StartTag: invalid element name&lt;br /&gt;&amp;lt;/div&amp;gt;&amp;lt;h3&amp;gt;Below is a rendering of the page up to the first error.&amp;lt;/h3&amp;gt;&amp;lt;/parsererror&amp;gt;&amp;lt;/data&amp;gt; &lt;/p&gt;
&lt;p&gt;&lt;font color="#ff8000"&gt;Opera:&lt;/font&gt; &lt;br /&gt;&amp;lt;parsererror xmlns=&amp;quot;&lt;a href="http://www.mozilla.org/newlayout/xml/parsererror.xml&amp;quot;"&gt;http://www.mozilla.org/newlayout/xml/parsererror.xml&amp;quot;&lt;/a&gt;&amp;gt;Error&amp;lt;sourcetext&amp;gt;Unknown source&amp;lt;/sourcetext&amp;gt;&amp;lt;/parsererror&amp;gt; &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;本次最人性化回應獎，我決定頒給Chrome/Safari~~&lt;/p&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=5552" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/P_HuvG7P13ugMqDym0ezr0neEsE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/P_HuvG7P13ugMqDym0ezr0neEsE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/P_HuvG7P13ugMqDym0ezr0neEsE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/P_HuvG7P13ugMqDym0ezr0neEsE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Darkthread/~4/5GO7sGuMg3E" height="1" width="1"/&gt;</description><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/Web/default.aspx">Web</category><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/IE/default.aspx">IE</category><feedburner:origLink>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/23/invalid-xml-element-name.aspx</feedburner:origLink></item><item><title>TextBox.ReadOnly、Attributes["readonly"]及Disabled</title><link>http://feedproxy.google.com/~r/Darkthread/~3/eD36c1iZXqE/textbox-readonly-and-disabled.aspx</link><pubDate>Tue, 20 Oct 2009 19:55:53 GMT</pubDate><guid isPermaLink="false">d08a49d6-af59-4068-8b43-b7c037f78068:5535</guid><dc:creator>Jeffrey</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blog.darkthread.net/blogs/darkthreadtw/rsscomments.aspx?PostID=5535</wfw:commentRss><comments>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/21/textbox-readonly-and-disabled.aspx#comments</comments><description>&lt;span id="PostName"&gt;&lt;/span&gt; &lt;p&gt;幫同事解答了關於TextBox.ReadOnly的特性，順便自己也溫習一下。&lt;/p&gt; &lt;p&gt;TextBox.ReadOnly = true;&lt;br /&gt;TextBox.Attributes.Add(&amp;quot;readonly&amp;quot;, &amp;quot;readonly&amp;quot;);&lt;br /&gt;TextBox.Enabled = false;&lt;/p&gt; &lt;p&gt;以上三種寫法都可在網頁呈現唯讀的&amp;lt;INPUT&amp;gt;，但後端的行為有些差異。&lt;/p&gt; &lt;p&gt;我寫了一段示範，建立TextBox1, TextBox2, TextBox3分別用以上三種寫法設為前端唯讀。接著在網頁裡透過按鈕觸發Javascript將三者的值改成&amp;quot;ABC&amp;quot;，按鈕Postback回後端，再檢查三者的Text屬性及Post回傳值。程式如下:&lt;/p&gt; &lt;div class="BlogCodeBlock"&gt; &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&amp;lt;%@ Page Language=&lt;span class="str"&gt;&amp;quot;C#&amp;quot;&lt;/span&gt; %&amp;gt;&lt;/pre&gt;&lt;pre&gt;&amp;lt;script runat=&lt;span class="str"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;void&lt;/span&gt; Page_Load(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e) &lt;/pre&gt;&lt;pre&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (!IsPostBack)&lt;/pre&gt;&lt;pre&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;            TextBox1.ReadOnly = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;            TextBox2.Attributes.Add(&lt;span class="str"&gt;&amp;quot;readonly&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;readonly&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;            TextBox3.Enabled = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;            TextBox1.Text = TextBox2.Text = TextBox3.Text = &lt;span class="str"&gt;&amp;quot;123&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;        }&lt;/pre&gt;&lt;pre&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;void&lt;/span&gt; Button1_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;&lt;pre&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;        Label1.Text = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;@&amp;quot;&lt;/pre&gt;&lt;pre&gt;Control: TextBox1={0}, TextBox2={1}, TextBox3={2}&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;Request: TextBox1={3}, TextBox2={4}, TextBox3={5}&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre&gt;            TextBox1.Text, TextBox2.Text, TextBox3.Text,&lt;/pre&gt;&lt;pre class="alt"&gt;            Request[&lt;span class="str"&gt;&amp;quot;TextBox1&amp;quot;&lt;/span&gt;], Request[&lt;span class="str"&gt;&amp;quot;TextBox2&amp;quot;&lt;/span&gt;], Request[&lt;span class="str"&gt;&amp;quot;TextBox3&amp;quot;&lt;/span&gt;]);&lt;/pre&gt;&lt;pre&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;lt;html xmlns=&lt;span class="str"&gt;&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;pre&gt;&amp;lt;head runat=&lt;span class="str"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;/pre&gt;&lt;pre&gt;    &amp;lt;script src=&lt;span class="str"&gt;&amp;quot;js/jquery-1.3.2.js&amp;quot;&lt;/span&gt; type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &amp;lt;script type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;pre&gt;        $(function() {&lt;/pre&gt;&lt;pre class="alt"&gt;            $(&lt;span class="str"&gt;&amp;quot;#btnSetValue&amp;quot;&lt;/span&gt;).click(function() {&lt;/pre&gt;&lt;pre&gt;                $(&lt;span class="str"&gt;&amp;quot;#TextBox1,#TextBox2,#TextBox3&amp;quot;&lt;/span&gt;).val(&lt;span class="str"&gt;&amp;quot;ABC&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;            });&lt;/pre&gt;&lt;pre&gt;        });&lt;/pre&gt;&lt;pre class="alt"&gt;    &amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;pre&gt;&amp;lt;/head&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;lt;body&amp;gt;&lt;/pre&gt;&lt;pre&gt;    &amp;lt;form id=&lt;span class="str"&gt;&amp;quot;form1&amp;quot;&lt;/span&gt; runat=&lt;span class="str"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &amp;lt;asp:TextBox ID=&lt;span class="str"&gt;&amp;quot;TextBox1&amp;quot;&lt;/span&gt; runat=&lt;span class="str"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&lt;/pre&gt;&lt;pre&gt;    &amp;lt;asp:TextBox ID=&lt;span class="str"&gt;&amp;quot;TextBox2&amp;quot;&lt;/span&gt; runat=&lt;span class="str"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &amp;lt;asp:TextBox ID=&lt;span class="str"&gt;&amp;quot;TextBox3&amp;quot;&lt;/span&gt; runat=&lt;span class="str"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&lt;/pre&gt;&lt;pre&gt;    &amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &amp;lt;input type=&lt;span class="str"&gt;&amp;quot;button&amp;quot;&lt;/span&gt; id=&lt;span class="str"&gt;&amp;quot;btnSetValue&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;=&lt;span class="str"&gt;&amp;quot;Set Value&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;pre&gt;    &amp;lt;asp:Button ID=&lt;span class="str"&gt;&amp;quot;Button1&amp;quot;&lt;/span&gt; runat=&lt;span class="str"&gt;&amp;quot;server&amp;quot;&lt;/span&gt; OnClick=&lt;span class="str"&gt;&amp;quot;Button1_Click&amp;quot;&lt;/span&gt; Text=&lt;span class="str"&gt;&amp;quot;Submit&amp;quot;&lt;/span&gt;/&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;pre&gt;    &amp;lt;asp:Label ID=&lt;span class="str"&gt;&amp;quot;Label1&amp;quot;&lt;/span&gt; runat=&lt;span class="str"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/asp:Label&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &amp;lt;/form&amp;gt;&lt;/pre&gt;&lt;pre&gt;&amp;lt;/body&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;操作完成結果如下:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/5534/original.aspx" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;整理一下三者的差異:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TextBox.ReadOnly, TextBox.Enabled設定後，不管前端的值如何變更，Server端讀取到的還是原本賦與的值。&lt;/li&gt;
&lt;li&gt;TextBox.ReadOnly = true時，前端仍會Post回修改過的新值，但會被TextBox Control忽略&lt;/li&gt;
&lt;li&gt;TextBox.Enabled=false時，前端的內容根本不會被回傳(&amp;lt;input disabled&amp;gt;的關係)&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=5535" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dteQkao2YXjtvDgBYEkmd-qVmVk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dteQkao2YXjtvDgBYEkmd-qVmVk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dteQkao2YXjtvDgBYEkmd-qVmVk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dteQkao2YXjtvDgBYEkmd-qVmVk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Darkthread/~4/eD36c1iZXqE" height="1" width="1"/&gt;</description><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/ASP.NET/default.aspx">ASP.NET</category><feedburner:origLink>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/21/textbox-readonly-and-disabled.aspx</feedburner:origLink></item><item><title>觀察LINQ to SQL DataContext的連線開啟時機</title><link>http://feedproxy.google.com/~r/Darkthread/~3/CtzXu0kppzU/linq-to-sql-connection-issue.aspx</link><pubDate>Sun, 18 Oct 2009 15:57:00 GMT</pubDate><guid isPermaLink="false">d08a49d6-af59-4068-8b43-b7c037f78068:5526</guid><dc:creator>Jeffrey</dc:creator><slash:comments>7</slash:comments><wfw:commentRss>http://blog.darkthread.net/blogs/darkthreadtw/rsscomments.aspx?PostID=5526</wfw:commentRss><comments>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/19/linq-to-sql-connection-issue.aspx#comments</comments><description>&lt;span id="PostName"&gt;&lt;/span&gt;
&lt;p&gt;&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/18/linq-to-oracle-hello-world.asp"&gt;昨天的文章&lt;/a&gt;發表後，有兩位網友提到了DataContext是否要加using的議題。&lt;/p&gt;
&lt;p&gt;我接觸LINQ to SQL是由Scott Gu的&lt;a href="http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx"&gt;這幾篇文章&lt;/a&gt;開始入門的，在他的範例中沒有特別提到using，我也自始就忽略DataContext有實做IDispose這件事。雖然用using包住絕對有益無害(只要小心using中間過程如將DataContext傳到外部，要留意using結束後外部就不可再繼續叫用)，但我倒認為DataContext裡的Connection應該不是一new DataContext就建立一條連線不放，直到Dispose()才結束釋出，而是Query時開啟連線，用完即關閉；Update時再重新開啟連線，用完再度關閉。如此&lt;font color="#ff8000"&gt;【最後一刻開啟、用完立即關閉】&lt;/font&gt;的寫法，較符合珍貴資源應用的Best Practice；換句話說，在DataContext裡應該就己實踐了類似using (SqlConnection)的做法，盡可能讓連線時間最短化。不過，畢竟只是猜想，不如做個實驗觀察一下。&lt;/p&gt;
&lt;div class="BlogCodeBlock"&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; log(&lt;span class="kwrd"&gt;string&lt;/span&gt; msg)&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;    Console.WriteLine(&lt;span class="str"&gt;&amp;quot;{0:HH:mm:ss.fff} {1}&amp;quot;&lt;/span&gt;, DateTime.Now, msg);&lt;/pre&gt;&lt;pre&gt;    System.Threading.Thread.Sleep(2000);&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;    MyLabDataContext db = &lt;span class="kwrd"&gt;new&lt;/span&gt; MyLabDataContext();&lt;/pre&gt;&lt;pre&gt;    log(&lt;span class="str"&gt;&amp;quot;DataContext created&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;    var q = from o &lt;span class="kwrd"&gt;in&lt;/span&gt; db.Players&lt;/pre&gt;&lt;pre&gt;            select o;&lt;/pre&gt;&lt;pre class="alt"&gt;    log(&lt;span class="str"&gt;&amp;quot;LINQ defined&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;    Console.WriteLine(q.Count());&lt;/pre&gt;&lt;pre class="alt"&gt;    log(&lt;span class="str"&gt;&amp;quot;Get the row count&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;    Player p = &lt;span class="kwrd"&gt;new&lt;/span&gt; Player()&lt;/pre&gt;&lt;pre class="alt"&gt;    {&lt;/pre&gt;&lt;pre&gt;        UserName = &lt;span class="str"&gt;&amp;quot;Darkthread&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre class="alt"&gt;        RegDate = &lt;span class="kwrd"&gt;new&lt;/span&gt; DateTime(2009, 1, 1),&lt;/pre&gt;&lt;pre&gt;        HiScore = 65536&lt;/pre&gt;&lt;pre class="alt"&gt;    };&lt;/pre&gt;&lt;pre&gt;    db.Players.InsertOnSubmit(p);&lt;/pre&gt;&lt;pre class="alt"&gt;    log(&lt;span class="str"&gt;&amp;quot;InsertOnSubmit&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;    db.SubmitChanges();&lt;/pre&gt;&lt;pre class="alt"&gt;    log(&lt;span class="str"&gt;&amp;quot;SubmitChanges&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;    db.Dispose();&lt;/pre&gt;&lt;pre class="alt"&gt;    log(&lt;span class="str"&gt;&amp;quot;Disposed&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;    Console.Read();&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;在以上的程式範例中，每個動作間相隔兩秒鐘，並記錄發生時間，以便跟SQL Profiler記錄的時間對照。依我的推論，連線開啟關閉應該會發生在q.Count()與db.SubmitChanes()。&lt;/p&gt;
&lt;div style="BACKGROUND-COLOR:black;WIDTH:400px;COLOR:yellow;"&gt;00:55:50.285 DataContext created &lt;br /&gt;00:55:52.292 LINQ defined &lt;br /&gt;0 &lt;br /&gt;00:55:54.730 Get the row count &lt;br /&gt;00:55:56.736 InsertOnSubmit &lt;br /&gt;00:55:58.850 SubmitChanges &lt;br /&gt;00:56:00.850 Disposed&lt;/div&gt;
&lt;p&gt;接著我們對照一下SQL Profiler看到的結果:&lt;/p&gt;
&lt;table style="BORDER-BOTTOM-COLOR:blue;PADDING-BOTTOM:2px;BACKGROUND-COLOR:white;BORDER-TOP-COLOR:blue;PADDING-LEFT:2px;PADDING-RIGHT:2px;COLOR:blue;BORDER-RIGHT-COLOR:blue;FONT-SIZE:9pt;BORDER-LEFT-COLOR:blue;PADDING-TOP:2px;" cellspacing="1" cellpadding="1"&gt;

&lt;tr style="TEXT-ALIGN:center;BACKGROUND-COLOR:green;COLOR:yellow;"&gt;
&lt;td&gt;EventClass&lt;/td&gt;
&lt;td&gt;StartTime&lt;/td&gt;
&lt;td&gt;EndTime&lt;/td&gt;
&lt;td&gt;TextData&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit Login&lt;/td&gt;
&lt;td&gt;2009-10-19 00:55:54.587&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;-- network protocol: TCP/IP&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit Logout&lt;/td&gt;
&lt;td&gt;2009-10-19 00:55:54.587&lt;/td&gt;
&lt;td&gt;2009-10-19 00:55:54.647&lt;/td&gt;
&lt;td&gt;NULL &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RPC:Completed&lt;/td&gt;
&lt;td&gt;2009-10-19 00:55:54.647&lt;/td&gt;
&lt;td&gt;2009-10-19 00:55:54.647&lt;/td&gt;
&lt;td&gt;exec sp_reset_connection &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit Login&lt;/td&gt;
&lt;td&gt;2009-10-19 00:55:54.647&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;-- network protocol: TCP/IP &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQL:BatchCompleted&lt;/td&gt;
&lt;td&gt;2009-10-19 00:55:54.647&lt;/td&gt;
&lt;td&gt;2009-10-19 00:55:54.647&lt;/td&gt;
&lt;td&gt;SELECT COUNT(*) AS [value] FROM [dbo].[Player] AS [t0] &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit Logout&lt;/td&gt;
&lt;td&gt;2009-10-19 00:55:54.647&lt;/td&gt;
&lt;td&gt;2009-10-19 00:55:58.720&lt;/td&gt;
&lt;td&gt;NULL &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RPC:Completed&lt;/td&gt;
&lt;td&gt;2009-10-19 00:55:58.720&lt;/td&gt;
&lt;td&gt;2009-10-19 00:55:58.720&lt;/td&gt;
&lt;td&gt;exec sp_reset_connection &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit Login&lt;/td&gt;
&lt;td&gt;2009-10-19 00:55:58.720&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;-- network protocol: TCP/IP &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RPC:Completed&lt;/td&gt;
&lt;td&gt;2009-10-19 00:55:58.810&lt;/td&gt;
&lt;td&gt;2009-10-19 00:55:58.810&lt;/td&gt;
&lt;td&gt;exec sp_executesql N&amp;#39;INSERT INTO [dbo].[Player]([UserName], [RegDate], [HiScore]) VALUES (@p0, @p1, @p2)&amp;#39;,N&amp;#39;@p0 nvarchar(10),@p1 datetime,@p2 int&amp;#39;,@p0=N&amp;#39;Darkthread&amp;#39;,@p1=&amp;#39;2009-01-01 00:00:00&amp;#39;,@p2=65536 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit Logout&lt;/td&gt;
&lt;td&gt;2009-10-19 00:55:58.720&lt;/td&gt;
&lt;td&gt;2009-10-19 00:59:25.550&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;&lt;/tr&gt;
&lt;p&gt;&amp;nbsp; 
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/p&gt;&lt;/table&gt;
&lt;p&gt;我這麼解讀，00:55:50建立DataContext時並沒有開啟任何連線，q.Count()發生於00:55:54，此時有了第一次Audit Login。基於Connection Pooling的特性，每次SqlConnection.Open()時，會產生一個Audit Logout、exec sp_reset_connection再加一個Audit Login，而在此發生了兩次，第一次在00:55:54，第二次在00:55:58，剛好就是q.Count()及SubmitChanges()發生的時點。&lt;/p&gt;
&lt;p&gt;最後一個Audit Logout則是出現在程式完全結束，Process終止，Connection Pool的連線真的被關閉時(00:59:25)。&lt;/p&gt;
&lt;p&gt;由以上觀察，應可印證我的推論&amp;quot;LINQ to SQL裡DataContext內部對SqlConnection的處理原則為: 必要時才開啟，用後立即關閉&amp;quot;。進一步延伸，加上using應不會產生顯著影響，但對於實作IDispose的物件使用using絕對是良好的習慣。&lt;/p&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=5526" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OpNcqd6VtR4fpA3mBT7iEV7ITj8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OpNcqd6VtR4fpA3mBT7iEV7ITj8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/OpNcqd6VtR4fpA3mBT7iEV7ITj8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OpNcqd6VtR4fpA3mBT7iEV7ITj8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Darkthread/~4/CtzXu0kppzU" height="1" width="1"/&gt;</description><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/Performance/default.aspx">Performance</category><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/Linq/default.aspx">Linq</category><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/SQL+2008/default.aspx">SQL 2008</category><feedburner:origLink>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/19/linq-to-sql-connection-issue.aspx</feedburner:origLink></item><item><title>小試LINQ to Oracle</title><link>http://feedproxy.google.com/~r/Darkthread/~3/qNAhzVjkVek/linq-to-oracle-hello-world.aspx</link><pubDate>Sat, 17 Oct 2009 15:03:54 GMT</pubDate><guid isPermaLink="false">d08a49d6-af59-4068-8b43-b7c037f78068:5523</guid><dc:creator>Jeffrey</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://blog.darkthread.net/blogs/darkthreadtw/rsscomments.aspx?PostID=5523</wfw:commentRss><comments>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/18/linq-to-oracle-hello-world.aspx#comments</comments><description>&lt;span id="PostName"&gt;&lt;/span&gt;  &lt;p&gt;上回針對Oracle使用LINQ做了&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/11/road-to-oracle-linq.aspx"&gt;一番評估&lt;/a&gt;，打算為Oracle相關專案導入LINQ預做暖身。無意發現除了Entity Framework外，還有另外的選擇---devart的&lt;a href="http://www.devart.com/dotconnect/linq.html"&gt;LINQ to Oracle&lt;/a&gt;!&lt;/p&gt;  &lt;p&gt;基於工作專案常偏向RAD性質，對我來說，LINQ to Oracle的輕巧優於EF的龐大嚴謹功能完整。而LINQ to Oracle雖然也找得到免費解決方案，但畢竟要用在工作上，產品有廠商支援撐場，總是比Open Source多幾分穩當，何苦為了幫公司省錢砸了飯碗。&lt;/p&gt;  &lt;p&gt;devart的產品看來符合我的需要，因此決定著手試用逐步體驗。到devart的網站&lt;a href="http://www.devart.com/dotconnect/oracle/"&gt;下載dotConnect for Oracle&lt;/a&gt;安裝後，Visual Studio 2008在新增項目時就會多出一些選項。我試做了第一個LINQ to ORACLE範例:&lt;/p&gt;  &lt;p&gt;1.在專案裡新增一個Devart LINQ to SQL Model--HRDataContext.lqml。(相當於LINQ to SQL的dbml)&lt;/p&gt;  &lt;p&gt;&lt;img class="PopBoxImageSmall" src="http://blog.darkthread.net/photos/darkthread/images/5454/500x375.aspx" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;2.在Solution Explorer裡點兩下lqml檔案，並不會在Visual Studio裡開出編輯畫面，而是另外啟動Entity Developer for dotConnect。雖然沒有內嵌在VS2008 IDE內，但它仿效LINQ to SQL dbml的視覺化操作，透過拖拉就可對應資料表Schema建立Class。    &lt;br /&gt;如下圖，先 (1) 建立與Oracle DB的連線 (2) 選取資料表，拖拉到設計區，接著就出現跟LINQ to SQL一樣的設計畫面 (3) 記得要改一下Context Namespace，預設會跟lqml同名，而二者名稱相同容易混淆 (4) 不要忘記按一下儲存，設計結果才會回寫到VS2008專案裡。&lt;/p&gt;  &lt;p&gt;&lt;img class="PopBoxImageSmall" src="http://blog.darkthread.net/photos/darkthread/images/5455/500x375.aspx" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;3.回到VS2008，會發現Entity Developer for dotConnect會依設計結果產生多個額外檔案。&lt;/p&gt;  &lt;p&gt;&lt;img class="PopBoxImageSmall" src="http://blog.darkthread.net/photos/darkthread/images/5456/500x375.aspx" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;4.LINQ to Oracle的程式寫起來跟LINQ to SQL完全相同:&lt;/p&gt;  &lt;div class="BlogCodeBlock"&gt;   &lt;div class="csharpcode"&gt;     &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;/pre&gt;

    &lt;pre&gt;    {&lt;/pre&gt;

    &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;

    &lt;pre&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;            HRDataContext db = &lt;span class="kwrd"&gt;new&lt;/span&gt; HRDataContext();&lt;/pre&gt;

    &lt;pre&gt;            Player p = &lt;span class="kwrd"&gt;new&lt;/span&gt; Player()&lt;/pre&gt;

    &lt;pre class="alt"&gt;            {&lt;/pre&gt;

    &lt;pre&gt;                Playerid = &lt;span class="str"&gt;&amp;quot;Darkthread&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre class="alt"&gt;                Name = &lt;span class="str"&gt;&amp;quot;黑暗執行緒&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre&gt;                Email = &lt;span class="str"&gt;&amp;quot;admin@darkthread.net&amp;quot;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;            };&lt;/pre&gt;

    &lt;pre&gt;            db.Players.InsertOnSubmit(p);&lt;/pre&gt;

    &lt;pre class="alt"&gt;            db.SubmitChanges();&lt;/pre&gt;

    &lt;pre&gt;            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Done!&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre class="alt"&gt;        }&lt;/pre&gt;

    &lt;pre&gt;    }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;5.執行後用SQL lPlus查詢，資料真的被寫入DB了。&lt;/p&gt;

&lt;p&gt;&lt;img class="PopBoxImageSmall" src="http://blog.darkthread.net/photos/darkthread/images/5457/500x375.aspx" alt="" /&gt;&lt;/p&gt;

&lt;p&gt;可以把LINQ to SQL的開發經驗直接移植到Oracle上，實在是件快意無比的事! 啾咪 ^.&amp;lt;&lt;/p&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=5523" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/gNXpLAJ2lAc3kHrS7HRKROw041k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gNXpLAJ2lAc3kHrS7HRKROw041k/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/gNXpLAJ2lAc3kHrS7HRKROw041k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gNXpLAJ2lAc3kHrS7HRKROw041k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Darkthread/~4/qNAhzVjkVek" height="1" width="1"/&gt;</description><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/ORACLE/default.aspx">ORACLE</category><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/Linq/default.aspx">Linq</category><feedburner:origLink>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/18/linq-to-oracle-hello-world.aspx</feedburner:origLink></item><item><title>Oracle Distributed Transaction Error</title><link>http://feedproxy.google.com/~r/Darkthread/~3/OF59KxkWu30/oracle-distributed-transaction-error.aspx</link><pubDate>Fri, 16 Oct 2009 15:29:54 GMT</pubDate><guid isPermaLink="false">d08a49d6-af59-4068-8b43-b7c037f78068:5521</guid><dc:creator>Jeffrey</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blog.darkthread.net/blogs/darkthreadtw/rsscomments.aspx?PostID=5521</wfw:commentRss><comments>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/17/oracle-distributed-transaction-error.aspx#comments</comments><description>&lt;span id="PostName"&gt;&lt;/span&gt; &lt;p&gt;寫了以下的程式做SQL與Oracle的分散式交易:&lt;/p&gt; &lt;div class="BlogCodeBlock"&gt; &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; (System.Transactions.TransactionScope tx = &lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;new&lt;/span&gt; System.Transactions.TransactionScope())&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;    &lt;span class="rem"&gt;//... Update data on SQL Server ...&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;using&lt;/span&gt; (OracleConnection cn = &lt;span class="kwrd"&gt;new&lt;/span&gt; OracleConnection(cnStr))&lt;/pre&gt;&lt;pre&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;        cn.Open();&lt;/pre&gt;&lt;pre&gt;        OracleCommand cmdOra = &lt;span class="kwrd"&gt;new&lt;/span&gt; OracleCommand(&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="str"&gt;&amp;quot;INSERT INTO MYLOG VALUES (SYSDATE, &amp;#39;DEBUG&amp;#39;)&amp;quot;&lt;/span&gt;, cn);&lt;/pre&gt;&lt;pre&gt;        cmdOra.ExecuteNonQuery();&lt;/pre&gt;&lt;pre class="alt"&gt;        cmdOra.CommandText = &lt;/pre&gt;&lt;pre&gt;            &lt;span class="str"&gt;&amp;quot;SELECT LOGTIME FROM MYLOG WHERE REMARK=&amp;#39;DEBUG&amp;#39;&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;        OracleDataReader dr = cmdOra.ExecuteReader();&lt;/pre&gt;&lt;pre&gt;        dr.Read();&lt;/pre&gt;&lt;pre class="alt"&gt;        Response.Write(dr[&lt;span class="str"&gt;&amp;quot;LOGTIME&amp;quot;&lt;/span&gt;].ToString());&lt;/pre&gt;&lt;pre&gt;        dr.Close();&lt;/pre&gt;&lt;pre class="alt"&gt;        cn.Close();&lt;/pre&gt;&lt;pre&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;//tx.Complete();&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    Response.Write(&lt;span class="str"&gt;&amp;quot;OK&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;執行環境為Windows 2008 x64 + ASP.NET 2.0 + System.Data.OracleClient + Oracle 11.1.0.6 x64 Client。程式一直傳回&lt;font color="#ff8000"&gt;ORA-00161: transaction branch length 105 is illegal (maximum allowed 64)&lt;/font&gt; 錯誤。&lt;/p&gt;
&lt;p&gt;網路上有不少相關的討論，大都指向Oracle的&lt;a href="http://www.oracle.com/technology/tech/windows/ora_mts/index.html"&gt;官方說法&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font color="#00ff00"&gt;Windows Vista and Windows Server 2008 introduce new MSDTC changes that do not interoperate with older versions of Oracle Services for MTS. Oracle Services for MTS 10.2.0.4 and higher, &lt;font color="#ffff00"&gt;with the exception of 11.1.0.6&lt;/font&gt;, support these new changes on Windows Vista Service Pack 1 and Windows Server 2008 or higher.&lt;/font&gt; &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;敢情我是中了籤王，10.2.0.4以後版本都可以支援，但11.1.0.6例外。到OTN&lt;a href="http://www.oracle.com/technology/software/products/database/oracle11g/111070_win64_2008soft.html"&gt;下載&lt;/a&gt; 11107_w2k8_x64_production_client.zip (523MB)。
&lt;p&gt;下載安裝，藥到病除!&lt;/p&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=5521" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2Yh-T4Ik65VGzt9bEPIg5JyJaJU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2Yh-T4Ik65VGzt9bEPIg5JyJaJU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2Yh-T4Ik65VGzt9bEPIg5JyJaJU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2Yh-T4Ik65VGzt9bEPIg5JyJaJU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Darkthread/~4/OF59KxkWu30" height="1" width="1"/&gt;</description><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/ORACLE/default.aspx">ORACLE</category><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/.NET/default.aspx">.NET</category><feedburner:origLink>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/17/oracle-distributed-transaction-error.aspx</feedburner:origLink></item><item><title>黑暗尋寶完全攻略</title><link>http://feedproxy.google.com/~r/Darkthread/~3/k5wy2LPLwh0/darkhunter-walkthrough.aspx</link><pubDate>Thu, 15 Oct 2009 14:53:14 GMT</pubDate><guid isPermaLink="false">d08a49d6-af59-4068-8b43-b7c037f78068:5502</guid><dc:creator>Jeffrey</dc:creator><slash:comments>13</slash:comments><wfw:commentRss>http://blog.darkthread.net/blogs/darkthreadtw/rsscomments.aspx?PostID=5502</wfw:commentRss><comments>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/16/darkhunter-walkthrough.aspx#comments</comments><description>&lt;span id="PostName"&gt;&lt;/span&gt;  &lt;p&gt;歷經漫長的六日(原本預估只想撐住四小時，結果百米賽跑變成馬拉松... orz)，紀念黑暗執行緒網站百萬人次的&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/01/blog-one-million.aspx"&gt;黑暗尋寶活動&lt;/a&gt;，終於由CCN在2009/10/15 00:36達陣成功，抱走&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/07/vx7000.aspx"&gt;VX-7000&lt;/a&gt;! 恭喜CCN之外，也向各位參賽者說聲辛苦了。&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff8000"&gt;【以下有雷，會提及解題關鍵，還想保留闖關樂趣的人回頭是岸】&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;依粗略統計，這次比較威的關卡是第1.5關(Seednet網頁空間免費加贈的URL Redirect及HTTP 404)、第3關、第6關，跟許多人想破頭卡很大的第7關。其實比賽開始後10小時(16:38)就有人(Orange)抵達第7關，排除1.5關的干擾後，又有很多高手紛紛來到第7關，但卡在一張達文西密碼電影海報的照片的JPG就沒了頭緒。於是分別在10/11 22:22追加公告關於EXIF的提示，10/12 22:00公告變位字提示，10/13 22:00公告CLSID提示，10/14 22:00公告&amp;quot;茶包射手的獵物提示&amp;quot;，終於由CCN率先破解謎語，抵達終點。&lt;/p&gt;  &lt;p&gt;現在來分享一下本次關卡設計的背後祕辛及破解說明:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;font color="#ff8000"&gt;Why GUID? &lt;/font&gt;      &lt;br /&gt;由一個網頁找到下一個網頁的遊戲，URL是關鍵，如果URL的組合可以被預期或猜測，就可能發在不知線索的情況下，直接猜中下一關檔名。很長的亂數名稱是一種做法，但身為MS Developer，我更愛GUID。 &lt;/li&gt;    &lt;li&gt;&lt;font color="#ff8000"&gt;Why Seednet Homepage? &lt;/font&gt;      &lt;br /&gt;我猜有些人可能會動起&amp;quot;暴力破解&amp;quot;的歪腦筋(qwert0533，對!! 就是在說你 XD)，使用程式大量嚐試可能的GUID組合，因此我選擇將網頁放在平日閒置的Seednet個人網頁空間而非我的部落格平台，以防止受到暴力破解攻擊對Blog本身的波及。但Seednet怪異的分流機制，在一開始造成一些人的困擾，在此說聲抱歉。 &lt;/li&gt;    &lt;li&gt;&lt;font color="#ff8000"&gt;為什麼遊戲網頁都要放廣告?       &lt;br /&gt;&lt;/font&gt;廣告就真的只是廣告而已，跟解題沒有任何關聯。不過我想有很多人會花時間去查它，足以產生不錯的欺敵拖延效果。後來證明 1) 的確很多人被廣告迷惑 2) 其實根本沒必要&amp;quot;拖延&amp;quot;...       &lt;br /&gt;當然，說不想藉趁機賺一下廣告收入絕對是騙人滴。對不起，我又貪財了。&lt;/li&gt;    &lt;li&gt;&lt;font color="#ff8000"&gt;第1關怎麼解? &lt;/font&gt;      &lt;br /&gt;這... 這... 這... 按連結，好嗎? 這明明是送分題。&lt;/li&gt;    &lt;li&gt;&lt;font color="#ff8000"&gt;第2 關怎麼解? &lt;/font&gt;      &lt;br /&gt;畫面看不到東西，任何Web Developer的下一步反射動作就是View Source，看HTML原始碼，原則上這也是送分題。&lt;/li&gt;    &lt;li&gt;&lt;font color="#ff8000"&gt;更! 第3關是在搞什麼鬼? &lt;/font&gt;      &lt;br /&gt;用第2關的View Source技巧，可以發現第3關的圖檔URL變成darkthre”e”dbanner.jpg，然後就卡住了。 設計思維是用&amp;quot;檔名不同&amp;quot;突顯&amp;quot;第3關故意用了一張不一樣的圖&amp;quot;，所以圖是關鍵，應&amp;quot;仔細檢查&amp;quot;兩張圖有什麼不同。(瀏覽器的Zoom In功能可以幫上大忙!)      &lt;br /&gt;&lt;img class="PopBoxImageSmall" src="http://blog.darkthread.net/photos/darkthread/images/5489/500x375.aspx" alt="" /&gt; &lt;/li&gt;    &lt;li&gt;&lt;font color="#ff8000"&gt;第4關，Palette調色盤? 跟解題有什麼關係?        &lt;br /&gt;&lt;/font&gt;白色黑色&amp;quot;Palette”的GIF圖檔，說明了&amp;quot;跟調色盤有關&amp;quot;，而GIF圖檔是內建256色調色盤的，所以就用Hex Viewer類的工具看一下，GUID果然藏在裡面:       &lt;br /&gt;&lt;img class="PopBoxImageSmall" src="http://blog.darkthread.net/photos/darkthread/images/5490/original.aspx" alt="" /&gt;&amp;#160; &lt;br /&gt;感覺上有些朋友較少接觸GIF圖檔的格式細節，看GIF檔案找到答案進了第5關，居然還是不知道&amp;quot;Palette”與解題有何關聯? (城市還有鹽，對! 我就是在說你~~) &lt;/li&gt;    &lt;li&gt;&lt;font color="#ff8000"&gt;第5關，其實是最簡單的! &lt;/font&gt;      &lt;br /&gt;&lt;font color="#ffff00"&gt;A1 A2 A3 A4 A5 A6 A7 A8 - B1 B2 B3 B4 - C1 C2 C3 C4 - D1 D2 D3 D4 - E1 E2 E3 E4 E5 E6 E7 E8 E9 E10 E11 E12        &lt;br /&gt;Hint Formulas:         &lt;br /&gt;1.A7 - E10 - E8 = -8         &lt;br /&gt;2.B4 * A5 * D1 = 726         &lt;br /&gt;... 略 ...         &lt;br /&gt;511.A8 * B4 + B2 = 12         &lt;br /&gt;512.E9 / E4 - E1 = –2&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&lt;/font&gt;題目一清二楚，完全不拐彎，也沒陷阱。我寫了程式用亂數出題，偷懶沒去細數如何包含最少的聯立方程式就有解，所以放上512個公式以求保險，順便也展現我的氣度與佛心。(謎之聲: 去~~~)。       &lt;br /&gt;這題可以寫程式解，不過因為隨機產生的公式有些很白目(例如:&amp;#160; 507.C1 - A5 / A5 = 3)，我想直接用人工分析應該比較快，花點耐性不用太久就可以解開!       &lt;br /&gt;這關完全沒被抱怨，看來是大家最愛的一題；相對地，也意味難度跟趣味性不足呀! XD &lt;/li&gt;    &lt;li&gt;&lt;font color="#ff8000"&gt;第6關，向本站的忠實讀者致意!        &lt;br /&gt;&lt;/font&gt;提示只有一行編碼: &lt;font color="#ffff00"&gt;orOiuKK3otGi0aKzorWizwCjwqOyo7SjswAU/yL/I/8Z/wDvvJnvvKXvvKbvvKMAIf8X/xH/Gf8W/xb/E/8i/xP/Jf8Q/yX/&lt;/font&gt; 程式寫多的人都看得出來是Base64編碼，用Convert.FromBase64String()解開，可以得到:       &lt;br /&gt;&lt;font color="#ffff00"&gt;A2 B3 A2 B8 A2 B7 A2 D1 A2 D1 A2 B3 A2 B5 A2 CF 00 A3 C2 A3 B2 A3 B4 A3 B3 00 14 FF 22 FF 23 FF 19 FF 00 EF BC 99 EF BC A5 EF BC A6 EF BC A3 00 21 FF 17 FF 11 FF 19 FF 16 FF 16 FF 13 FF 22 FF 13 FF 25 FF 10 FF 25 FF &lt;/font&gt;      &lt;br /&gt;抓一下00的位置當成分割點，可以分成16, 8, 8, 12, 24個Byte，看起來跟GUID的8-4-4-4-12結構有點關聯。把byte[]轉成string試試，不管用哪一種Encoding，會發現string中有一部分會變成全型的0-9A-F字元。忠實讀者一定不會忘記&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/_2D4E8765E87DBC78_/default.aspx"&gt;中文編碼&lt;/a&gt;是本站的特色主題之一，而打開&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2007/09/16/1083.aspx"&gt;中文編碼解析工具&lt;/a&gt;，照著BIG5, GB2312, UCS-2, UTF-8(一個中文字會變3個byte，4*3=12解開了第四節長度不合群之謎), UTF-16編碼GetString(byte[])，分開取得五節全型16進位數，換成半型就是前往第七關的鑰匙! &lt;/li&gt;    &lt;li&gt;&lt;font color="#ff8000"&gt;第7關終極殺陣 &lt;/font&gt;      &lt;br /&gt;眾多高手被卡在此動彈不得，逼得只能陸續增加提示，降低難度後，才有人闖關成功。       &lt;br /&gt;最初只有一張達文西密碼的電影照片JPEG檔，就是全部的提示。圖片是網路上找到的，被我加了工，藏了資訊在&lt;a href="http://zh.wikipedia.org/wiki/EXIF"&gt;EXIF&lt;/a&gt;裡，不過似乎很多人沒有料到EXIF裡會藏東西。(當然，也有高手在第二天連海報照原始圖都找到，還用工具做過比對，驗證圖片內容完全一致，鎖定了線索就在Metadata中，了不起!)       &lt;br /&gt;有鑑於讓眾家高手卡著無解也不是辦法，於是我先釋出第一波提示，讓大家聚焦在EXIF的Camera欄位:      &lt;br /&gt;&lt;font color="#ffff00"&gt;* It&amp;#39;s not a GIF        &lt;br /&gt;* Metadata         &lt;br /&gt;* Canon 10D, Canon 5D2, Nikon D70&lt;/font&gt;       &lt;br /&gt;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/5501/original.aspx" alt="" /&gt;&amp;#160; &lt;br /&gt;不過即便鎖定了EXIF，似乎有些朋友還沒體會到”tri linen St. RCP(三亞麻布聖RCP?)&amp;quot;是一段&lt;a href="http://www.shs.edu.tw/works/essay/2006/10/2006103123490500.pdf"&gt;變位字&lt;/a&gt;，照片之所以選擇達文西密碼，就是希望電影一開始的變位字謎團可以形成暗示... 照片暗示效果不彰，索性祭出第二波提示:       &lt;br /&gt;&lt;font color="#ffff00"&gt;* 啊，嚴峻的魔鬼！ 啊，跛足的聖人！&lt;/font&gt;       &lt;br /&gt;明確指明是變位字後，大家知道到重組，但大多還是沒什麼頭緒(其實可以用字典暴力攻擊把變位字可能的組合試出來，但成本看來不低)，再釋出第三波提示:       &lt;br /&gt;&lt;font color="#ffff00"&gt;* CLSID&lt;/font&gt;       &lt;br /&gt;其實，&amp;quot;tri linen St. RCP”是RSClient.Print的變位結果，這顆Reporting Service附屬的由網頁直接印報表元件在黑暗小站亮相過好多次(&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2008/10/16/ssrs-client-print-control-error.aspx"&gt;1&lt;/a&gt;&amp;#160;&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2008/10/24/ssrs-print-issue-final.aspx"&gt;2&lt;/a&gt; &lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2008/10/30/rsclientprint-issue-again.aspx"&gt;3&lt;/a&gt;)，提示是CLSID，期望勾起大家的回憶，很快聯想到是它。(後來我發現這個提示很糟，因為Google &lt;a href="http://www.google.com.tw/search?hl=zh-TW&amp;amp;source=hp&amp;amp;q=CLSID+darkthread"&gt;CLSID + darkthread&lt;/a&gt;就可以直接連到相關網頁，幸好沒人藉此破關)       &lt;br /&gt;無奈大家跟我還是沒能心有靈犀，於是得再丟出第四波提示，直接說Reporting Service太明了，苦思許多，想了個&amp;quot;茶包射手的獵物&amp;quot;，暗示它在本站演過茶包。公告後不久，CCN終於闖關成功，我終於不必再為第五波提示傷透腦筋了。 &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;謝謝所有參賽的朋友，希望大家在解題過程中有享受到樂趣。歡迎大家在留言版留下感想或意見，覺得哪一關最有趣，哪一關卡最久，哪一關最欠揍，什麼感想都可以。&lt;/p&gt;  &lt;p&gt;我超愛這類動腦解題的比賽，下回各位如有舉辦，記得要通知我! &lt;/p&gt;  &lt;p&gt;最後，再次恭喜CCN!!&lt;/p&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=5502" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/lhRZ6F2HCXYws6gD-6GM3iIGY04/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lhRZ6F2HCXYws6gD-6GM3iIGY04/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/lhRZ6F2HCXYws6gD-6GM3iIGY04/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lhRZ6F2HCXYws6gD-6GM3iIGY04/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Darkthread/~4/k5wy2LPLwh0" height="1" width="1"/&gt;</description><feedburner:origLink>http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/10/16/darkhunter-walkthrough.aspx</feedburner:origLink></item></channel></rss>
