hit counter for blogger

黑暗執行緒

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

1/28/2007

漫漫搬家路~~~

[喬遷啟事: 黑暗執行緒搬家了,未來我的Blog文章將改發表在http://blog.darkthread.net/blogs/darkthreadtw/default.aspx ,新的CS 2.1平台可以享受更多DIY的樂趣,會陸續提供討論區等功能。FeedBurner RSS的部分稍後會移轉過去,訂閱的人應該不受影響。歡迎舊雨新知,繼續支持愛護!]

上週提到我有想讓Blog走向專業化的計劃,Blogger其實在穩定性、速度方面都很優,又有Google撐腰,加上不花一毛錢,Windows Live Writer支援,實在是很不錯的Blog平台。只可惜Blogger的經營策略過於保守,功能少有更新,許多業界標準的Blog功能,例如: 最新留言清單、日曆顯示,甚至連最基本的文章分類都付之闕如(哇~~~ 我又用成語了,杜部長,我對不起您!),必須去整合del.icio.us之類書籤服務才能辦到。而對我來說最大的問題在於備份不易,圖檔放在Flickr,程式檔案下載則在Google Pages,要彙集統一管理十分不便。更嚴重的一點是,自己平日寫ASP.NET成精,看到自己的Blog平台功能不理想卻無力修改,內心的煎熬實在不足為外人道呀! (Blogger可以Support Javascript其實就很酷了,但有些事在Server-Side處理掉可以省十倍的氣力) 之前有研究修改過Community Server 2.0,它提供SDK可以讓愛寫程式的賤骨頭們發揮的空間,所以就決定進行Blogger->CS 2.1 SP2的搬遷,同時也會租個網路空間,掛上有darkthread的Domain Name重新開張。

以下就是我長達12天夜間搬家的漫長經過:

1.Blogger -> CS 2.1 SP2

我打算先在自己的機器上將CS裝好並匯完內容後再去租空間,一來是在本機操作速度快,也好Trouble-Shooting(後來驗證這個決策是對的,Web Hosting的環境能做的設定及檢查很有限,有時得Call Support人員協助),二來是還沒Ready前,租空間來養蚊子自然不是摳王的行事風格。

網路已有前人寫好Blogger->CS 2.0的Tutorial與輔助工具,不過其中的VBScript在處理UTF-8格式的中文內容會造成亂碼,我只好照著原本的VBScript寫了.NET版,改用System.Text.RegularExpression,程式意外地變精簡許多。(前述VBScript的目的主要是修改BlogML中Comment UserName Attribute出現HTML Tag的問題及日期要轉成yyyy-MM-ddTHH:mm:ss的xsd:DateTime格式,心想Blogger要搬CS的人應該不多,有需要的朋友再出個聲吧)

依Tutorial掛上Import BlogML的Add-On,一下子所有的文章及意見都匯入CS中了,Tutorial中還有提到要用T-SQL Script處理匿名意見留言者顯示的問題,這部分照方煎藥即可。

2.圖檔!

我Blogger文章中的圖檔,早期是放在BlogSpot中(對,那個沒法瀏覽已上傳照片的特難用機制),後來則改放在Flickr。為了備份方便,我想將圖檔收錄在CS的相簿中,這樣子,只要備份SQL,整個Blog的內容就一次備足了。

首先,從SQL SELECT將160篇文章做成一個超大HTML,再用IE的Save As HTML功能,在htmlName_files目錄下就一口氣取得了全部的圖檔。下一件事是用程式將圖檔標上文章的編號,再借用Chiwi Gallery Manager的上傳功能。一次上傳完200張圖檔真是令人感動,選用CS這種知名的平台,千萬要善用工具、技術資源豐富的優勢。

圖檔上傳完,下一步苦功是要將文章中的<a href="..."><img src="..">由Flickr的URL換成CS相簿中的相對圖檔,但160篇文章,圖檔多達200張,由於LINK的格式變化不小,寫自動置換程式的時間看來會比手工改的時間更久,加上反正都要人工再校一次內容格式是否受損,這部分就決定以人工處理。(CS的TinyMCE文字編輯器,可以直接Insert相簿中的照片,但URL會用絕對網址,所以本機的http://localhost/會變成圖檔URL的一部分,事後再用T-SQL Replace Function置換。至於用過CS舊版的人可能會懷疑FreeTextEditor呢? 基於對XHTML的相容性,CS 2.1預設用的是TinyMCE,但Editor可以抽換沒問題。)

3.Tags

過去Blogger沒有分類機制,所以這次在檢閱文章時,我就順便為每篇文章加上Tag,使用者就可以由Tag Cloud中標籤文字大小看出Blog的文章走向,也可以一次挑出同一類別的相關文章。

4.Style

厭倦了過去的白底黑字,為了配合"黑暗"二字,這次大膽地採用了灰黑底色的Style,質感不錯,但不妙的是之前在白底色時期常用的藍色、咖啡色等文字,在灰黑底上變得很不清楚。檢視文字時,還要一併改改部分特殊文字顏色,讓它們在新的深底色上看起來不要太慘。

5.Add-On

自己搞Server,就要特別留意不要被網路駭客、垃圾留言攻陷。Comment Spam一向是Blog平台的大敵,CS標榜利用Comment的特徵來阻擋Spam-Comment,但我還是覺得要求使用者輸入雜訊文字圖片內容後才放行的做法比較好,所以另外裝了TimothyHumphrey.CommunityServer Add-On,如下方意見區所示。(這也才知道寫意見或註冊會員時,網頁要求你解讀歪七扭八的英文數字圖片後輸入的做法,其實有個專有名詞: CAPTCHA-Completely Automated Public Turing test to tell Computers and Humans Apart)

一直覺得Blog首頁列出最近的留言意見是很好的功能,但CS沒有內建,所以我加掛了Keyvan Nayyeri的Blog Recent Feedbacks Control

6.FullText Search Support

之前在2.0時就發現CS所使用的Hash法,在處理中文查詢上會有問題,因此照著過去的改法,我修改成可以用LIKE或CONTAINS進行查詢。

7.前進Web Hosting

參考了Rex的使用經驗,我選擇了口碑不錯,便宜又大碗的ASPnix,一年美金77.7元,提供3G的ASP.NET檔案與SQL 2005共用磁碟空間(後來發現要再花12元註冊一年的DNS名稱,但比起其他選擇還是便宜)。刷卡付完錢,馬上就可以登入使用及FTP上傳ASP.NET專案,DB的部分可以直接用SQL Server Management Studio連線管理,但是備份還原之類的操作,會因為選取檔案位置的權限問題而失敗,Forum上有人提到,可以將備份檔案FTP上去,請Support人員代為Restore。我寫了Mail請Support幫忙,大約幾十分鐘後就收到回覆,Support看我裝的是CS,還經驗十足地自動地替我設好photos/storage, photos/cache等目錄的寫入權限。

只是裝在ASPnix Virtual Directory下的程式運作起來,老是會出現
Request for the permission of type 'System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.]
的訊息,有時Reload一下就又OK,為此又打擾了ASPnix Support好幾次,最後終於Google到這篇說明,原來如DNN、CS等程式,裝在Web Hosting Virtual Directory下,就會因為Medium Trust Level限制而發生這種問題,要改安裝在wwwroot或Sub-Domain下才能解決。ASPnix Support的回應速度挺快的,態度也算親切,Forum上也有很多問題排除討論可以參考,我唯一小小的抱怨是少了一份整理好的FAQ,列出幾乎每個新手都會遇到的問題,應可節省來回Mail及在Forum搜索的時間。

還有一點,我買的Shared Web Hosting方案,IP是跟人共用的,也就是同一個IP 80 Port上也許掛了數百人的Web,IIS則是利用你輸入的Host Header來決定是Virutal Server。換句話說,www.darkthread.net, blog.darkthread.net都指向同一個IP,但輸入http://www.darkthread.net 與輸入http://blog.darkthread.net,會連到同一台IP的IIS,但進入不同的IIS Virtual Server。一開始以為會有自己專屬的IP,所以在Domain Name沒有註冊前用IP連線測試,就得到了HTTP 404 File Not Found的結果,被搞得一頭霧水。

8.大功告成

最後,檢視了一下系統功能大致都OK了,再花12塊美金註冊了darkthread.net這個網域名稱,新Blog就算正式掛牌營運囉! 歡迎光臨,要包入厝紅包或贈送新居禮品的朋友請留言,我會再派快遞去取,哈!

PS: 我還沒有太多時間去調整好CS 2.1的功能及顯示,急著搬是怕在Blogger上寫愈多搬起來愈累,所以大家對介面有建議或想法,可以在討論區提出,

1/17/2007

TIPS-解決SandCastle File Helper Builder的Unresolved assembly reference錯誤

好用的Help檔產生器--NDoc的作者Kevin Downs在2006年7月宣告不再投入NDoc Open Source Project的開發,NDoc中止在1.3版,還來不及加上對2.0版Assembly的支援。讓Kevin決定退出的理由之一是微軟推出了SandCastle(沙雕城堡?)。

SandCastle目前最新的版本是Dec 2006 CTP,不像NDoc是個具有完整介面的GUI工具,主要為兩隻命令列工具程式(MrefBuilder & Build Assembler),要建立CHM檔得透過一連串的Command Line操作,對用慣NDoc的人來說挺不人性化的,所幸開發社群已有人寫出整合SandCastle的GUI介面,例如: SandCastleGUISandCastle Help File Builder(跟NDoc的操作介面相似)。

不過試作了一顆現有.NET 2.0自訂元件的Help檔,卻出師不利。由於元件額外參考了System.Configuration.dll,SandCastle Help File Builder(SHFB)會出現:
Error: Unresolved assembly reference: System.Configuration (System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a) required by YourAsmName 的錯誤。Goggle了一下,原來這是SandCastle CTP的一個大Bug--無法Reference GAC中的DLL檔(見FAQDoes Sandcastle resolve reference to GAC DLLs?);改用SandCastleGUI倒可以順利Build出CHM,只是中文會變亂碼的老問題又冒出來了(之前NDoc我也是改了Source才能正常處理中文),SandCastleGUI沒提供Source Code,沒法動手,所以我又回頭試著解決SHFB的問題。

追了一小段Code之後,我發現其實只要修改Program Files\EWSoftware\Sandcastle Help File Builder\Templates\GenerateRefInfo.bat,加入以下的紅字,連Code都不用改,問題就可以解決囉!

@ECHO OFF
REM Step 1 - Generate the reflection information
"{@SandcastlePath}ProductionTools\MRefBuilder" /config:MRefBuilder.config /out:reflection.org
/dep:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\*.dll {@Dependencies} {@DocInternals} *.dll *.exe

Microsoft MVP!

幾個月前,從Rex處得知6-2屆MS MVP開始接受報名,整理了自己的著作、代表性Blog文章、網路社群互動等資料,抱著姑且一試的心態遞了報名表,回到每天庸庸碌碌的日子,很快地就忘了這檔事兒。1/2日,收到MS MVP網站寄來的通知信,Yes! 自己在微軟領域的多年深耕,樂於分享的熱忱(其實只是好為人師性格的昇華)終於正式被微軟所肯定,有幸與知名的講師、聞人,一起名列MVP榜上。而我這個"微軟基本教義派民兵",從此算是正式貼上MS標籤了。

通知信中還提到了MS MVP享有的福利: 一年份的MSDN、可參加MVP年會、有機會與MS產品團隊交換意見、MVP專屬網站、USD 150的MS商品購物金... 等等,對一個成天搞微軟的人來說,每一項都很有吸引力。上週五,DHL送來了MVP Award Kit,一個包裝精美的紙盒子,裡面有證書、小胸章、MVP卡片(信用卡大小)、一本小手冊跟NDA(保密合約),而最有意思是一個精美皮質方盒,裡面有雷射筆、真皮名片夾跟1G的USB行動碟,很精緻也頗實用。收過MCSE、MCSD的Welcome Kit,這份Award Kit的確能提供了更深刻的"尊榮"感,哈!

MVPAward1

MVPAward2

為了迎接這份意外的獎項,我重新規劃了今年的努力目標,將會更用心地經營Blog,提供更多專業的技術分享,也會試著開放更多互動的管道。看起來Blogger簡陋的功能應該是不敷使用了,過陣子我就會將Blog遷到Community Server 2.1平台上,屆時還望各位舊雨新知,繼續支持與鼓勵囉!

1/15/2007

毅力的極限,再來一顆不一樣的三角點

整件傻事要從上回摸完不一樣的三角點說起,10月初剛考完初業,滿腦子還塞滿了內線交易要坐幾年牢、罰多少錢的無聊法條。聽說高業跟初業範圍幾乎一樣,只是深度再深些,於是我打起了如意算盤,心想好不容易將這堆沒營養的垃圾塞進腦子,只用一次就丟未免太浪費,何不趁熱再挑戰一下高業?

試著去網站預訂考試日期,卻發現到1月底前的場次全都額滿了! 怎麼忽然大家都搶破頭急著考試? 看了一下網站說明,才發現我完全在狀況外,證基會每年都會換題庫,95年題庫只能用到2007/1/31(後來才Google到老鳥的叮嚀,年初就買書、開始規劃考試時間才是王道!),無怪今年準備了考試的人,要把握時間博最後一把。不過網站有提,在12/25前寄出報名表的人,他們會負責在1/31前加排場次消化完,一時賭氣不甘心腦中的記憶白白浪費,還是透過網路訂了簡章跟高業題庫(2200題庫+60簡章+1100報名費,小朋友們又離我而去了),準備再當一次有為的中年人。

拿到書也確定考試日期,才發現失策了!! 第一,考試日期得排到1/15,事隔近三個月! 這類不重要的背誦材料,我一向存在腦中"快取區",時間一久,讀進去的東西正以等比級數揮發掉,原本想要回收再利用的如意算盤砸了。第二,比起初業,高業的題目可真"高"呀~~~ 在複雜度跟刁鑽度上高出許多,常常一題的四個選頁中就涉及四個觀念,也不再像初業題目常有白目選項大玩消去法。總之,最後的狀況是,因為年代久遠,殘存的記憶有限,加上題目變難變多,即使有題庫可看,多達四五千題的份量,光要全部看完一遍就很嚇人! 不得不,我又開始了每天早上四點半起床、睡眠不足的苦讀生涯,連週六、日的登山活動也只好取消。不過最讓人心慌的還是,看到第三本,第一本已經忘得差不多了...

總之,這次又在極度缺乏自信的情況下,硬著頭皮進考場。看到這次高業的考生群似乎年長些,但也不乏年輕的面孔,看來像學生。有了前次的考試經驗,對報到、進場、作答的流程都很熟悉,不熟的只有題目而已。幸好,跟前次的經驗一樣,實際考題比證基會的題庫簡單,刁鑽的不多。(看來題庫叢書貫徹了古代輕功修練的精髓,先在腳上綁上過重的沙包,待能行走自如後,除去沙包,輕功自成!) 雖說如此,財務分析中艱深繁瑣的會計概念及一卡車的比率、公式,還是讓準備不足的我心慌意亂,甚至擔心會因這科未達五十分破功。(及格分數為三科合計210、單科不可低於50)

跟上回一樣,又用顫抖的手插IC卡刷成績,看到成績單手抖得更厲害... 哈里路亞! 我驚險地救回了一千一百大洋,不用煩惱換了考題,不必再猶豫是否重考,最重要的是,明天起可以睡飽一點了~~

SenSales

1/08/2007

TIPS-XHTML下如何強制指定SPAN寬度

先前我寫過一篇KB,談過套用XHTML後,TextArea的Width光設定數字時無法生效,必須再註明px才可以。今天在處理SPAN時,又遇到同樣的問題! 以下的寫在如果不加第一列的<!DOCTYPE...>,可以顯示向左靠的Left及向右靠的Right文字。但若加了XHTML宣告,則Left與Right就會接連著擠在一起。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="
http://www.w3.org/1999/xhtml" ><BODY>
<DIV style="WIDTH:305px;">
<DIV><SPAN style="width: 100px;">Left</SPAN>
<SPAN style="width: 200px; text-align:right">Right</SPAN></DIV>
</DIV>
</BODY></html>

Google了一下,找到一篇文章。原來在XHTML中,SPAN預設已經不能強制指定寬度了,而是完全由內含文字、元素的寬度決定。如果要指定寬度,可以利用style的display屬性,過去我只用過none隱藏元素,原來還有block、inline-block等值可以設定。設block時相當於DIV,會造成Left、Right不能排在同一列,因此inline-block是本案例的最佳選擇。改成以下的style宣告,就可以在XHTML中正常顯示囉!

<DIV><SPAN style="width: 100px; display: inline-block;">Left</SPAN>
<SPAN style="width: 200px; text-align:right; display: inline-block;">Right</SPAN></DIV>

1/03/2007

KB-Oracle轉SQL的日期陷阱

在SQL 2005上建了Linked Server連到ORALCE,轉檔的SQLCLR Procedure卻一直發生疑似日期轉換的錯誤:
Msg 8114, Level 16, State 8, Line 1
Error converting data type DBTYPE_DBTIMESTAMP to datetime.

過去這類的錯誤都是因為SQL中不允許NULL的日期欄位,在Oracle中有設了NULL值所引起的,但反覆清查多次,排除光所有為NULL的日期欄位,錯誤依舊。忽然福至心靈,會不會是日期範圍不同所致?

SQL的DateTime型別: 1753/01/01 - 9999/12/31
ORACLE的Date型別: "西元前"4712/01/01 - 9999/12/31

結果用WHERE ArriveDate < TO_DATE('1900/01/01','YYYY/MM/DD')一查,測試資料庫中有名員工的到職日竟是西元998年9月8日,就是這位來自宋朝的老兄,讓SQL轉換日期出了錯。(嘖嘖嘖,以他的年資,退休金應該破億吧!!)

下回再遇到ORACLE與SQL間日期轉換有問題時,記得查一下日期範圍。

【後記】
後來還發生了怪異的事,將ORACLE有問題的資料刪除後,SELECT該Table(假設為Emp)仍有同樣的問題。用CREATE TABLE EmpClone AS SELECT * FROM Emp的方法複製了另一個相同的Table(EmpClone),卻可以正常SELECT;即使將Emp的資料全部清空、SQL 2005 Restart,SQL 2005還是抱怨無法轉日期。
最後,我將Emp TABLE DROP後重建,再將資料倒回來,居然就OK了。之後另建了一個Table,故意塞入999/01/01,SELECT時會出現日期轉換錯誤,但把資料刪除後就正常,看來先前的情況只好歸入X檔案了。