hit counter for blogger

黑暗執行緒

 黑暗執行緒搬新家囉!! http://www.darkthread.net

6/30/2006

Word HTML精簡化工具


多年來,我的KB、備忘錄等等多半是用Outlook編輯及歸檔,一來是背後串接了Mail/公用資料夾可以快速地與人溝通及分享,二來Outlook結合了Word作為文字編輯器,文字格式彈性、排版功能不在話下,又不用花時間學習。前陣子小熊子介紹我裝了Google Desktop,更是讓原本龜爬的查詢功能一飛沖天! 以前為了怕PST太大易出問題,我都會每半年分出一個PST檔。偏偏Outlook每次查詢時只能限一個PST檔,如果年代不確定時,就得半年半年的找(不過應該還是比總統府找發票快一點點,呵!),甚為煩人。現在只要在Outlook的Google Desktop快速列輸入關鍵字,不消2秒,搜索的範圍就跨越了我從菜鳥工程師到技術老油條的近十年歲月! 這下子,更可確定Outlook將會是我唯一的知識文件管理平台!!
不過有些時候,Mail的內容要轉成網頁貼在討論區或Blog,Word的RichText雖然可以直接轉成HTML,但是如果你懂HTML,檢視一下他的HTML原始碼,包你吐血!!
例如: 簡簡單單一句VS.NET Debug,Word竟囉嗦到中英文各用SPAN包夾,並且每個SPAN都要加上幾乎100%相同的STYLE設定,再額外插入一堆mso-開頭Word專用的STYLE參數,於是就變成了這副德性:
<span style='font-size:9.0pt;mso-bidi-font-size:10.0pt;font-family:新細明體;mso-ascii-font-family:Arial;mso-hansi-font-family:Arial;mso-bidi-font-family:Arial'></span></font><font size=1 face=Arial><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:10.0pt;font-family:Arial'>VS.NET Debug</span></font><font size=1 face=新細明體><span style='font-size:9.0pt;mso-bidi-font-size:10.0pt;font-family:新細明體;mso-ascii-font-family:Arial;mso-hansi-font-family:Arial;mso-bidi-font-family:Arial'>
本來十幾個Bytes可以搞定的事,它硬是用快500 Bytes,長舌得很… 對頻寬很在意的我,不太能忍受這個結果,但要我將Outlook已經打好的東西還要再用FrontPage或UltraEdit重新編一次,太不甘心。於是我寫了個一個Word HTML淨化器,可以將Word囉嗦的作文去蕪存菁,在不破壞原有格式的前題下,減少HTML的資料量。
如下圖,原本20K的大小立刻縮小到1/5不到,只剩3.7K,而且格式仍保持不變!

程式可以按這裡下載。有興趣的人拿去用,記得要先裝.NET 2.0。試用的人順便幫我Debug,有問題再回報給我囉!

6/29/2006

VS 2005又偷藏選單了


用VS.NET Debug時,當例外(Exception)發生,如果拋出例外的Code已被try … catch的例外處理包覆,預設是不會觸發Debugger中斷的。而一旦進入catch的範圍,錯誤發生在哪一行就變得不可考了。我們就可以由選單Debug/Exceptions設定”When the exception is thrown”選項,由Continue改為Break into the debugger,這樣有任何錯誤發生,不管有沒有try..catch,都會觸發Debugger,停在出問題的那行程式碼上!
不過,繼上次歷經了Navigate Forward/Backward失蹤記,發現VS 2005預設又把Exceptions選單給藏起來了。如果要用,可以按快速鍵Ctrl-Alt-E或用下圖的方法把它找回來。
MenuMissExceptions

6/27/2006

Java牆角挖挖挖

J2EE與.NET的戰爭,最後鹿死誰手? 沒人知道。不過這幾年來,幾位Java界大將級的人才紛紛倒戈,倒讓我暗自竊喜。

以Java香雞排起家的蔡學鏞先生(http://www.microsoft.com/taiwan/msdn/columns/DoNet/default.htm)在微軟MSDN寫文章好一陣子了,當年此舉讓不少Java基本教義派義憤填膺,激動異常,在CNet的留言版上燒起了熊熊Java霹靂火(http://taiwan.cnet.com/enterprise/column/0,2000062898,20085671,00.htm?PROCESS=show&ID=20059803 )[不禁讓人想起這陣子台灣政治的藍綠生態,原本只是理念各異,最後老搞到像有不共戴天之仇一般,無言…]

當自由人一陣子的前昇陽總監洪志鵬先生,也在今年決定被加入當初打得火花四射的競爭對手(http://www.michaelsoft-taiwan.com/diary.php?day=2006-01-26 ) (在我的看法中,洪Sir之於Java陣營應該像阿輝伯之於台聯吧!)

今天收到一封Seminar 的e-mail DM,意外發現Java界的名講師王森先生也悄悄地換陣營了。(http://www.microsoft.co.ke/taiwan/press/pmm/default.aspx)

說穿了,MS挾著驚人的財力與資源,在這場戰爭中,確實讓瘦小的Sun吃足了苦頭;但對人才而言,見到優沃的待遇、充足的資源、樂觀的願景,死也不動心的人,稱得上是意志力過人的革命志士;只是對講究因地制宜、依環境採用最佳解決方案的Architect而言,把科學邏輯搞成了宗教狂熱,恐怕不是好事吧?

看著我寄生的這半邊西瓜是愈來愈大塊了,好事一椿! 哈!

6/23/2006

Blogger小改版? 原來是被當作垃圾Blog了!!



昨天在Blogger文章時,發現了一件事。現在起,貼文章時也要輸入圖畫文詞驗證了! [以前只有在貼意見(Comment)時要] 不知是否又發生了機器人大舉入侵的情事,所以讓Blogger做了此項修正。但我覺得比較不能理解的是,一般來說,貼Comment可以防止有人有機器貼稿文字在別人的Blog上貼意見打廣告,但是狂貼自己的Blog應該沒啥傷害才對


不過,我好奇地點了一下字詞驗證旁的小”?”,才發現原來我的Blog被判讀為垃圾Blog,所以被加上了字詞驗證這一關:


* 對於可疑的垃圾 blog,相同的分類器可用來要求在張貼表單上額外的字詞驗證欄位 這會讓垃圾 blog 發送者無法輕鬆地設定自動化系統並進行發佈動作,因為只有人員操作才能完成這個步驟。


* Navbar 中的標幟令人反感的內容按鈕讓您可以告訴我們您遇到有問題的 blog,因此我們可以進行審查,並採取適當的動作。


Blogger提供了一個申訴的管道,讓你提出要求去除垃圾Blog的要求,Blogger會在由人工檢核過後,以Mail回覆結果。我檢討了一下,自己的Blog中多是些閒扯胡謅,再雜上些技術知識分享,依Blogger文章判定垃圾Blog的標準,最有可能的就是談布希在Goggle上被人惡搞那件事了! 如果是,要不就是Blogger的垃圾Blog阻擋漫游器的判別Rule不夠好(把我當成Goggle Bomb的一員?),再不然就是Blogger與Goggle一樣,對於具”政治敏感性”的議題,反應過激了點。總之,等Blogger的回應再說了。

[Updated at 2006/06/27 08:00:00] Blogger Support在24小時內回應了,效率很不錯! 信中向我致歉並解除了我貼文需要文字驗證的程序。由內文來看,應是制式的回答,至於當初被鎖的原因為何? 我想將會是個謎了... BloggerResp

初遇吸血鬼


幾週前,在一個雨後的週末清早,走完樟湖步道後意猶未盡,於是又去爬了一次鵝角格山。途中有一段溼軟的陰暗小徑,但已爬山成習的我,穿著短褲T-Shirt,輕快而行。下山後,當日適逢政大校慶,還小小看了一下啦啦隊比賽的排練才回家。
結果回到家沖澡時,低頭才發現右腳小腿上有個黑黑的小東西,不像是枯葉或泥土,雖然過去沒有類似的經驗,但我馬上警覺到莫非中了水蛭(螞蝗)!! 小小的東西巴在腿上,不痛不癢,但想到就噁心,也不太敢用手去抓下來。最後是用洗澡巾猛撥了好幾下,才把吸得死緊的小吸血鬼給弄下來,不過一甩就不知跑到哪裡去了,找了一陣子也沒找著。宣告放棄後繼續洗澡,但想一想,有個不知去向的小惡魔心裡還是毛毛的,仔細再找一次好了。
最後在淋浴拉門的門框上找到牠吸盤貼緊框面,尾巴卻不斷向上蠕動探索,甚是惡心。也不敢用手去碰,就把熱水開到最燙,猛沖了有兩分鐘,終於完成了涮水蛭小菜。
洗好澡把牠移到陽台拍了個照留念,這才仔細看清楚了長像,嘴巴是個圓形的吸盤,中有小孔,身上則有類似蝸牛的班紋,整隻吸血吸得肥嘟嘟的! 此時低頭一看,媽呀! 腿上被牠咬出來不到綠豆大的傷口,正源源不斷的流出血來,一連換了好幾張衛生紙也沒有要停的意思。由於急著坐捷運去接小朋友,所以想說塗上藥膏止個血就出門了。沒想到走到公車站,發現行走間,血又流了一片,拿出衛生紙來擦時,被站在旁的一個國小生看到,眼睛張得老大!! 最後上了捷運,找到座位,索性用衛生紙壓著,按了五分鐘,總算傷口凝結,前後折騰了快半小時。
Vampire
大自然真是奇妙,不起眼的動物有能力製造出如此神效的抗凝血劑,又巧妙的結合環境、身體構造,走出了獨有的生存之道! 只是我已領教過這個"大自然的奇蹟",希望以後別再碰到了。

6/19/2006

免洗筷的可怕--找碴篇


收到一封同事轉寄的Mail:(我查證了一下,來自國語日報)
免洗筷的可怕 小朋友科展證明
【記者張彩鳳報導】
儘管環保團體提倡自備餐具多年,但是市面上的小吃店、攤販還是充斥著免洗筷。
臺中市葳格小學蔡承訓等五名小朋友,閱讀報紙新聞後,主動研究及測試,證實了「免洗筷的可怕」。小朋友呼籲大眾,為了健康著想,還是少用免洗筷子。五名小朋友的研究,獲得今年臺中市中小學科展化學類第一名。
參與研究的小朋友看了新聞報導,啟發他們的研究靈感,很想找出答案。
蔡承訓說:「真是可怕!免洗筷浸泡漂白水、二氧化硫,使得筷子含有高度的酸性物質,不但種植綠豆無法成長,就連燃燒後也會產生酸性物質,造成空氣汙染。」
蔡承訓和王維德、紀冠宇、江佑庭、黃泓叡小朋友利用午休時間,以「筷裡乾坤」為題展開研究。
他們收集市面上各種免洗筷用水浸泡後,種植綠豆。結果發現,筷子才泡水一個星期就「臭得不得了」。
王維德說:「用這些發臭的酸水種綠豆,結果不但發芽速度遲緩, 且豆子長到五六公分就停止生長,最後死掉,可見免洗筷中含有的酸性物質是有害的。」
江佑庭說,最可怕的是:「收集筷子燃燒後的煙霧,再用試紙測試,結果呈現高度酸性,如果排放到空氣中,一定會影響人們健康。」
紀冠宇說,研究過程中曾經不小心被嗆到,感覺很難受。這次得獎真的好高興,希望這次研究能夠引起社會大眾重視,讓「自備餐具成為全民運動」。


這是一篇很環保的研究,但讀著讀著,我無可救藥的強迫邏輯官能症又犯了!
小朋友的研究動機及做出的結論或許是對的,但研究的推論過程看來大有問題!
1) 筷子泡水一週臭得不得了: 發臭的原因未必與毒性物質有關,更何況又摻入了長時間的生化反應當變數! 雞蛋放一週不但會臭,而且還可能長綠毛耶~~ 但不能推論蛋有毒吧!
2) 拿筷子水養綠豆: 適合綠豆不等於適合人! 拿醋來泡綠豆,完全不會發芽,無法證明醋比筷子來得毒? 再不然推出人應該多吃泥土永保健康的話,也很嚇人。
3) 筷子燃燒後的煙溶於水呈酸性: 焦點應該放在正常使用筷子是否會造成傷害,證明燃燒的煙霧有害(文中提到: …如果排放到空氣中,一定會影響人們健康…)跟研究筷子磨尖扎大腿會流血一樣,有點離題了。如果焦點拉回酸雨理論,試著去證明筷子存在二氧化硫,方向就是正確的,只是這個實驗中,沒有對照組(例如: 燃燒未加工的相同竹材),我們無法得知酸是來自二氧化碳(有機物燃燒會產生大量CO2)或是因為那殘留的少量二氧化硫? (一般雨水因為CO2,PH值就會達5-6.5)
小朋友的天真可愛並沒有錯,這也不是什麼黑心科學研究,要說真有什麼不對勁,我覺得責任也在在指導老師跟評審委員身上吧。科展不應該像YoYo點點名,以讓小朋友高興為目的,而應該讓小朋友學到正確的科學實驗與邏輯推理的精神。不能因為因為結果正確,就認定驗證的過程也是對的,才不會讓科展失去了最核心的精神。
(呵! 好像言重了,小朋友不要難過,叔叔有練過的。)

6/15/2006

倔強的DataGridView Header Column


比較起來,Visual Studio 2005對Window Form程式的開發有十足改良,Friendly程度更高了!!
例如: 現在Button, Label在拖拉時,會自動跑出定位校準線,小小的功能,卻足以讓向來笨手笨腳的我感動落淚…
VS2005WinFormFriendly
這幾天在用DataGridView(就是.NET 1.x DataGrid的進化版)時,調Header Style調到快要快狂:
DataGridViewTextBoxColumn c = new DataGridViewTextBoxColumn();
c.HeaderCell.Value = “FieldName”;
c.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
dgv.Columns.Add(c);

以上的寫法很單純,不該出錯,但執行結果Header欄仍是靠左:
VS2005GridViewHeaderAlign
搞了半天,最後終於發現,置左是為了要留位置來放動態Sorting時的向上/向下箭頭用!!
因此,將DataGridViewColumn的SortMode調成NotSortable,文字才乖乖置中。除此之外,還發現另一件事,當你允許排序時,欄寬要留大一點,也就是欄寬必須容得下你的文字+箭頭。(之前完全無法理解為何字寬不到50px,欄寬設65px居然文字會折行,這下才豁然開朗)

美國版"罄竹難書"

一直以來,Google查詢結果都是依符合度排序列出結果,其精準公正性是公認的。因為其自有一套運算邏輯,從不對外公開,也不會像其他搜尋引擎會因為廠商贊助而在其中動手腳。不過,老友SC Lu昨天Pass給我一則有趣的消息,讓我發現這個神話已經被打破了。
這陣子,布希總統在美國飽受民意支持度嚴重下滑的打擊,一群好事之徒,找到了Google排序的計算原則,讓Google在查詢關鍵字"Miserable Failure"時,符合度第一的結果就是連向布希的個人網站: (Miserable Failure要我翻譯的話,我會翻成"一敗塗地"、"慘不忍睹",或是"罄竹難書"也可,哈)

這件事上了BBC NEWS,也名留Wiki百科全書
Google在隨後,以這是一種政治偏見為由,以人工的方式修正了這項結果。
有Geek或Hacker血統的人應不會至此罷休,會想知道如何影響Google的Search排名,答案叫---Google Bomb。點到為止,潘朵拉的盒子打開囉~~
題外話: 我們的趙駙馬也在Wiki中留名囉!

6/14/2006

ADO.NET如何處理大小寫有別的欄位


今天程式寫得正順手時,忽然被狠狠電了一下。
建了一個DataTable物件,定義了一個string型別的DataColumn,並設為Primary Key,結果塞資料時,忽然跳出PK重覆的Error。
檢查之下才發現原來資料來源是區分大小寫的,所以有兩個Id值只差了大小寫,就被判為相同而撞上了。
查了Google,發現不太有人有這類困擾(區分大小寫的識別資料,並不利人的口頭溝通。依我個人的看法,最後會使出這招,多半是原始欄位位數不夠用了,又不想改Schema的偷懶絕技!),討論不多,還有人直接回答”死了這條心吧!”
心灰意冷之餘,查了一下MSDN,哈! 天無絕人之路,原來DataSet及DataTable有個少為人知的CaseSensitive屬性,設成true就可以解決囉!

6/13/2006

ASP.NET Debugging Tips


這幾天幫忙解決了幾個VS.NET Debug上的小問題,特別拿出來分享一下:

1) 要Debug Localhost上的ASP.NET程式時,彈出一個跟Debugger Users群組有關的錯誤訊息,如下:
DebugWeb1
此時建議先檢查兩個地方: 1) IIS Web是否已停用匿名存取? 2) 測試時用的使用者是否為Debugger Users的成員?
這兩點都挺明顯的,並不難發現,比較煩的是第三種隱性的狀況,也就是其實與”Debugger Users”沒有關係,也並非真的權限不足,而是IE的自動登入沒有設妥。對第三種狀況來說,這個錯誤訊息”誤導”效果十足。
要檢查是否為自動登入問題,方法很簡單。先確認你的Debug StartPage URL,例如: http://localhost/myweb/test.aspx。接著在IE中輸入這個URL,此時若IE跳出來問Username/Password,就代表自動登入沒生效,也就是所謂第三種狀況。如果你確定已取消匿名存取,而且也開了整合式驗證,則可以看看是不是IE的進階設定被改了。如下圖:
DebugWeb2
2) 延伸以上的問題,若只能用自動登入啟動ASP.NET的Debug Mode,又要怎麼用其他身份登入做測試呢?
啟動Deugger後,它會咬住ASP.NET Web執行的Process(w3wp.exe on Windows 2003, aspnet_wp.exe on Windows 2000),此時該Process下的所有Web動作都受到監控,並不只限於VS.NET開出來的那個IE。了解了這個原理,大家應該想到解決方法了吧?
另開一個IE,用另一個身份連到同一Web就OK了! 甚至,我常常會留著這個IE開著,每次重新啟動Debugger後,再Refresh一次就可了囉!

6/09/2006

SQL 2005 SP1登場,DB Mirroring封印解除!


自去年底SQL 2005上巿後,我在新系統規劃上就多半以SQL 2005為主了,主要理由是如果要採購,沒理由買舊版,加上T-SQL強化、SQLCLR等特性讓人很動心。還有很重要的是,SQL 2005推出的Database Mirroring用光華牌PC就可以組出容錯的DB Server,比起富貴人家才架得起的SCluster Solution,實在是一大福音。只是今年初我才發現原來這玩意還有Bug,微軟在官方文件中挑明了拿來用在Production環境的人,後果自負;更設定了啟動時要加特別的Debug Flag作為封印,讓用Mirroring的人沒藉口說是不小心拿來用的。頓時澆了我一頭冷水,沒有官方保證的架構,用在公司系統中,萬一有狀況,不被大老闆推出午門問斬才有鬼。
針對此時問過台灣微軟,大概知道的消息是會在年中出Service Pack時會正式納入。今天接到SQL達人Ryan的MSN,說SQL 2005的SP1出來了,而且日期還是4/18推出的(納悶為什麼台灣微軟沒主動通知,該不會他們也沒發現? 哈)。由SP1的文件,證實了Database Mirroring已確定可用於Production了,而且那個MS用作自保的啟動Flag也作廢了。
Database mirroring has been enabled in SQL Server 2005 SP1. Database mirroring is also supported for production deployments. The trace flag for testing database mirroring (t-1400) has been deprecated. Therefore, this flag has no effect in SP1.
另外,SQL 2005 SP1還加了不少新功能,這些等用過了,發現有好玩的才提吧!

6/01/2006

貓空行腳3-待老坑山


經過幾週的操練,樟山寺儼然成為我週末攻山頭的基地營,由家門口出發,路經行健道(喘)、樟山寺步道(汗),大約30分鐘內就可以抵達。以樟山寺為起點,可以串接好幾條規劃良好的親山步道及小山頭,這裡先介紹我摸到的第一個三角點-待老坑山。
之所以選擇待老坑山做為我第一個挑戰的山頭是因為它的高度不高,距離也近。我的週末登山行程有個原則,為了要兼顧好爸爸的角色,我都會在兩隻小搗蛋起床前回到家(大約8:30到9:00),坐在沙發上強作鎮定,假裝剛起床的樣子(這當然是開玩笑的,又不是去偷情)。所以安排的行程都會要必須待合在9:00前返家的要求,而待老坑山是距樟山寺最近的一座山頭(其實樟湖山才是最近的,只是… 後面再交待)。
我走的路線是由樟山寺後方走到馬路後正對的Y字路口,在Y的尖點上有石階步道可以向上行[1],沿著步道會通過餐廳的後方,接著石階變成水泥方框內舖碎石步道[2],然後又變成水泥小徑,還會切過一條小車可行的道路[3],直行一陣子就開始變成泥土小徑,右方是菜園、左方則是被剃光頭的荼樹園[4]。此時右方會有石階可以向上[5]接到花崗岩步道,這條步道向左可通往三玄宮步道、銀河洞還有鵝角板山,向右就是往待老坑山的方向,一路上有明確路標,不必太擔心。比較起來,北市的登山路線雖然略嫌人工化,但路標清楚實在是對登山菜鳥無比的恩澤(幾週後爬了北縣管轄的二格山,就讓我初嚐山中迷航心慌慌的滋味)。
DLKM1
[1]Y字路口向上走階梯
DLKM2
[2]水泥框+碎石子的路面
DLKM3
[3]步道與水泥小徑相切
DLKM4
[4]秃頭茶樹與菜園
DLKM5
[5]右轉向上石階
DLKM6
[6]可由杏花林下山

向待老坑方向走沒久,就到了登山起點,脫離步道改走土路,沿著不太陡的坡度向上走,沒多久就可抵達山頂,在此我摸到人生中第一個三角點。只可惜山頂在樹林中,毫無展望可言。沿原路回到登山口,可以改走杏花林的方向[6]回到指南路,接著右轉前行就能回到樟山寺。杏花林在初春時滿山花海、遊人如織,是很有名的景點之一,用Google查一下可以找到很多資料。
回到樟山寺,在樟山寺的石碑旁有個登山入口,樹上結滿登山隊的布條[7],還有個小小的鐵牌子寫著樟湖山,沿著向上的泥土小徑不用五分鐘就可以抵達一片依坡而闢的菜園,視野還算不錯[8]。在最高的地方是一畦圍起來的菜園[9],大家來到這裡,要記得探望一下在坐牢的樟湖山三角點。這個三角點雖然常年被圈在私人菜園中,並長年有水壺相伴[10],應該也不會寂寞吧!
DLKM7
[7]樟湖山登山口
DLKM8
[8]樟湖山的視野不錯
DLKM9
[9]身陷菜園的三角點
DLKM10
[10]有茶壺相伴的三角點

DLKMMap