hit counter for blogger

黑暗執行緒

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

4/28/2006

Flickr Uploadr在Win2003的當機問題


由於Blogger的圖檔上傳機制實在叫人不敢恭維(圖檔上傳後自動在你的HTML中加入一張縮圖的IMG加上至原圖的LINK,但是若你想要瀏覽過去上傳過的圖檔或刪除某個傳錯的圖檔,Sorry! 辦不到~~),無名小站有卡Referer,圖檔不能嵌在外站的網頁中,
於是我就選擇了Yahoo體系的Flickr
(Blog用Google,相簿用Yahoo,別以為Geek就不懂時尚,不考究名牌!)
Flickr的圖檔上傳UI挺方便的,但我每次寫Blog時總會夾帶多張圖檔,抓圖修圖改名完,還要開啟IE一一選檔上傳還是麻煩。Flickr有免費的上傳程式Flickr Uploadr,可以拖拉、甚至在檔案上按右鍵就完成上傳,只可惜在我的Windows 2003上一執行就會Crash。

最近Blog寫得比較勤,實在受不了了。總算認真的去Google上查了一下,果然找到不少同病相憐的同胞,
依著其中的建議,我將相容模式切到Windows NT 4.0 SP5(好個NT4,讓人不禁想起那段青澀歲月),
Flickr Uploadr果真運作正常了, 從此傳圖檔就方便了。

實戰系列2-COM+物件建立時發生Permission Denied

【問題】
從Windows 2000平台搬移一個ASP Web到Windows 2003,其中有些VB COM+元件。
於是在新的Windows 2003平台上手動建立新的COM+ Application,並將DLL加入。測試後,ASP發生建立元件時逾時錯誤。
【分析】
為了釐清問題,我們先隔離COM+ Application/ASP的因素,先將該DLL自COM+ AP移除,以regsvr32方式註冊,並寫一個極簡單的Set
o=CreateObject(“Boo.Foo”) VBScript做測試。結果物件可成功建立,若重新將元件DLL註冊於COM+
Application中,VBScript即得到以下的錯誤訊息:

回頭比對原本Windows 2000的COM+ Application設定,發現一個設定的差異,以下的選項在Windows 2003的COM+ AP中是勾選的。

它的中文翻譯是”強制此應用程式的存取檢查”,用Google查詢”Enforce access checks for this
application
”可以查到一篇MS PRB: Access Check Is Enabled by Default When a COM+
Application Is Created
。(錯誤訊息/UI文字直接放入Google就變出答案來,這是裝英文版的人才有的特權囉!)
由以上的KB,可知由於Windows 2003下的COM+ Application預設會啟用該選項,若保留該選項,又沒設定Role,就可能發生權限問題。

將該選項清除後,再試一次,一切OK,Case Close!

實戰系列1--沒完沒了的登入對話框!


實戰系列是我實際排除問題過程的經驗分享,各位可以跟著我一起看現象、用工具、做推論,一路到問題被解決。尤其值得注意的是,其中採用的工具你是否都見識過它的威力了?
如果是過去所不知道的,只要善用它們,大家都可以變成抓蟲達人哦!
【問題】
兩位同事跟我抱怨,連上WSS會一直跳出輸入Username/Password的對話框
。同事A是每到一個新頁面就要問三次密碼,讓人抓狂!
同事B的遭遇則更離奇,每到一頁會問一次帳號/密碼,但是選擇取消不登入,則畫面依然可以顯示出來,只是某些功能不太正常,這讓人很orz,莫非WSS的權限控管是做假的??
【工具】
這類問題可以考慮用Filddler側聽HTTP傳輸,因為這是明確的權限相關問題,也可以由IIS
Log查。要在同事的機器上裝Fiddler有點麻煩,我決定直接看IISLog。
【觀察】
同事A的Log

GET /_layouts/1028/ows.js - 80 - 401 1 0 0
GET /_layouts/1028/ows.js - 80 Domain\UserA 401 3 5 0
GET /_layouts/1028/ows.js - 80
-401 1 0 0
GET /_layouts/1028/ows.js - 80
Domain\UserA401 3 5 0
GET /_layouts/1028/ows.js - 80
-  401 1 0 0
GET /_layouts/1028/ows.js - 80
Domain\UserA401 3 5 15

同事B的Log
GET /_layouts/1028/ows.js - 80 Domain\UserB401 3 5 0
GET /_layouts/1028/ows.js - 80
-401 1 0 0
GET /_layouts/1028/ows.js - 80
Domain\UserB  401 3 5 15
【解讀】
同事A的Log說明了由於ows.js有設NTFS權限,因為第一次先用匿名存取(紅色的-),傳回401.1,於是IE跳出Username/Password對話框要求登入,第二次傳入Domain\UserA的成功登入身份,但傳回401.3。
同事B的Log更有意思,我們一直以為跳出的Username/Password是存取ASPX時要求的,由先前的Log可知在之前早已用"自動登入"的方式完成認證了,一路
Domain\UserB取回ASPX、GIF等...
一直到讀取ows.js時,雖已用Domain\UserB取存,卻碰了401.3的釘子,於是IE跳出登入對話框,但同事按取消,第三次則再用Domain\UserB自動登入
再試,還是401.3。
以上的Log可以解釋三次與一次Username/Password登入畫面的謎團,而按取消後還可用,並不是WSS的權限爛了(好險!),而只是放棄存取ows.js。而少了ows.js的結果,有些功能就不正常了。
【工具】
目標己經很明顯了,ows.js取存失敗,但真的是它的權限問題嗎? 或是IIS瘋了?? 我開啟神兵利器系列的好折凳---File
Monitor
,Filter設ows.js,請同事A、B再試一次。
【觀察】
由監看記錄中看到以Domain\UserA、Domain\UserB讀取ows.js發生ACCESS
DENIED的狀況。再查了一下,原來該檔案前些日子做了Update(由別處Copy覆寫),結果其NTFS權限未繼承自Folder,而只留下Administrators、SYSTEM等。這就是發生ACCESS
DENIED導致401.3的原因!!
【解決】
讓ows.js繼承Folder的權限設定,測試正常,Case Close!!

4/20/2006

利用FiddlerScript擊敗無名的Referer限制


前些日子看到Rex在Blog上抱怨無名小站會擋Feed Reader中的圖片顯示,我猜想是為了防止圖片盜連,Web鎖定Referer惹的禍,這麼說來如果利用Fiddler攔截送出給無名的Request,"偷偷"加上Referer,那麼應該就有機會打通關。這個想法已經由小熊子實作出來了,手續很簡單。徵得他的同意,在此做個介紹,順便推一推Fiddler這個神奇的好工具(我在RUN!PC有寫過Fiddler的介紹,未來有機會我再將以前寫的文章陸續丟上網路來[謎之聲: 得看你的"懶人病"何時痊瘉吧?])

我以SharpReader為例,開啟無名的RSS時,一般是無法顯示圖檔的。

我們開啟Fiddler,按下Ctrl-R,Fiddler便會叫出記事本並開好Script檔案,加入以下幾行的程式(這是小熊子的範例,想解決無名問題的人只要加第二段if即可),存檔後,會聽到雄壯的交響樂,表示Fiddler已偵測到Script有更新並自動載入了。


接著,在SharpReader上設定Proxy指向127.0.0.1:8888,ShareReader就成功閃過無名的阻擋,達陣成功了!


不過話說回來,應該不太會有人24小時開著Fiddler當FeedReader的Proxy吧? 所以此法算是讓大家過過駭客的癮,至於徹底解決,恐怕還是看看FeedReader上能不能針對不同的Feed加上額外的Referer,會比較能根本解決問題,要不等這個功能成為FeedReader的標準配備,等不及的人可以去找Open Source的FeedReader,現在就可以DIY了!

小插曲,在家中電腦Run SharpReader時出現以下的例外,查了Google,發現是.NET Runtime沒更新到SP1的緣故

4/16/2006

令人感動流淚的免費計數器--StatCounter


在朋友Rex的Blog上看到有個計數器,正好我也在想在Blog上加個計數器,統計一下親朋好友的到訪量。順著Link點進去,發現了這個好得出奇的免費計數器--StatCounter
古早以前做專案時,我最愛用一個免費的Counter CGI程式,主要的理由是它用C開發,在NT平台上是以EXE格式執行,效能好過VB EXE或ASP的Script N倍,加上格式夠彈性、功能也齊全,所以一直是我的101號選擇。
不過,在Blogger這類平台上,只能放單純的HTML(其實Blogger裡可以用CSS、寫Javascript,對我這種不甘受限的Web開發老鳥來說,已是謝天謝地!!),所以Counter程式得放在其他主機上。像StatCoutner這類的計數器服務者就應運而生了。不過,在試用之後,發現它所能提供的服務可不只是顯示到訪人數這麼單純,它還可以主動幫你製作到訪統計分析報表、熱門網頁排名、甚至能保留到訪者的存取歷程Log! 這些東西都是Web Log Analysis的常見應用,就算自己動手也少不了一番功夫,從來沒想到一個免費服務居然可以做到如此的水準。


另外,我還發現一個神奇的功能,他可以偵測到使用者使用搜尋引擎查了哪些關鍵字才連到你的網頁來。例如: 昨天有位使用者在Google查了asp javascript select這三個關鍵字,接著從查詢結果中連到我之前的Atlas-Javascript老鳥的雞肋文章。我立即也用同樣的關鍵字查詢,發現如果限定繁體中文,我的結果會排在第1頁的第4項(第1,2名則是Rex,呵)。
能知道自己的文章如何在Google中現身是件有趣的事,努力亂寫濫貼,就會更溶入成Google的一部分。而依據StatCounter的相關說明,它對一般的商業網站非常有用,因為這個結果可以用來評估投資在哪些Search Engine才算值回票價!
StatCounter並非慈善事業,當然也得設法掙點銀子過活。免費服務有些限制,例如只會記下最近100筆的存取記錄,每個月統計的Pageloads上限為25萬筆,你如果希望加大,則可以每個月付9塊美金擴充成10倍大。事實上,看過這些好用的功能,連我都有些心動了。不過,摳王是不可以輕易敗家的,忍住! 忍住!

4/15/2006

Community Server 2.0的中文檢索功能


CommunityServer 2.0的功能真是酷到不行,結合了許多AJAX的前端技巧,除了原本應用FreeTextBox的RichText編輯功能外,甚至在UI直接Doble-Click就可以開始修改頁面上的文字,讚嘆之餘,也開始覺得這一行愈來愈不好混了,未來客戶的UI規格要求恐怕會以這種水準為基礎向上加,理由很簡單,不要錢的Open Source Project都做得到,你好意思做得比他還差嗎?
最近因為工作需要,正在規劃一個企業入口網站,由於SPS/WSS內建的討論區功能實在陽春到令人想吐,而討論區的功能偏偏又是企業內部數一數二的熱門應用,因此我打算把華麗的CS2.0整合進來。評估了一下,有三大難關:
1.我只需要Forums的功能,Blogs與Photos的功能暫不開放免得自找麻煩,看來CommunityServer並沒有設計開關讓我直接停用,幸好NavigationBar上可以藉由修改SiteUrls.config移去不需要的Link,加上不開放給任何人建立Blog或Photos,應該就OK了。如果還不放心,還可以將Blogs、Photos目錄給刪了,就真的萬無一失了。
2006-04-16 後來發現根本不用這麼麻煩,CS2.0有內建Blog、Form、Photo...等各項功能停用與否的設定UI,所以點一點就可以了。真是個好軟體!
2.由於CS預設是使用Forms認證,為了跟SPS結合,非用Windows認證不可。Telligent Systems雖然有賣
Windows Authentication Add-On,但它要價USD 399! 而且在我的需求中,還需要做到使用者第一次登入CS時,由HR的資料庫取得姓名、Email等資料,立刻自動註冊成合法會員,就算買了Add-On,這一段恐怕還有客製上的Issue。因此索性自已動手修改了User.cs、CommonDataProvider.cs、SqlCommonDataProvider.cs,加入查詢HR資料表的功能,再改了Logon.aspx加入以Request.ServerVariables["LOGON_USER"]帳號自動登入,最後,若發現該帳號非會員則自動註冊的機制,這部分的功能就算齊了。
3.另外,查了Google發現許多人抱怨CS的Search檢索功能不能查中文。試了一下,果然,輸入中文字查詢時,會查到全部的文章,因此結論是預設的CS2.0,是無法查中文的。
Trace Code之後發現,CS用英文字串HashCode的做法實作檢索功能,有效率是有效率,但是此法完全未考慮到當關鍵字是中文的情況。再查了Google,竟意外連至朋友Rex的Blog,其中展示
了如何以T-SQL LIKE來實作可以支援中文的查詢功能。
拜讀過Rex的大作讓我信心大增,不過Rex修的是CS1.1,CS2.0的程式配置與做法都有調整,看來得DIY了。
我修改了SearchTerms.cs的GetSearchTerms,在遇到中文時,不要啟用TokenizeKeywords程序,否則所有中文都會被濾掉,接著還改寫出GetAndOrKeywordsNonEN,以便能處理中文關鍵字串中的AND、OR符號。
另外,SerachBarrelProvider.cs是另一個改寫重點。我將SearchText改寫成SearchTextLike(這個概念來自於Rex的啟發,感謝啦!),其中的差異在於原本查詢cs_SearchBarrel比對WordHash的做法改為直接Query cs_Posts資料表,並用LIKE '%關鍵字%'的手法比對Subject與Body兩個欄位,我讓
GetSearchResults會視關鍵字中有無中文(有無中文的檢測是透過System.Text.Encoding.GetEncoding("big5").GetBytesCount()計算BIG5編碼長度與原始字長度比較,當二者不同時,表示其中有全形字),來決定要用SearchText或是SearchTextLike。如此,可以在更動最少的情況下,讓CS支援中文查詢。
當然,用LIKE查詢有兩個問題,第一是原本查詢結果有權重的觀念,LIKE完全無法提供;第二點是未來若資料量變大,預估沒效率的LIKE '%...%'將會造成效能問題。
長久之計,應該還是要回歸SQL 2000/2005的FullText Search,一方面效能較佳,二來FreeTextTable的功能提供了RANK,可以仿效權重(雖然由實測的結果,始終不覺得RANK能反應所謂的"符合度")。只是這需要DB Schema端的配合,細節也要構思一下,就當成下一階段的目標吧!
想要參考SearchTerms.cs與SerachBarrelProvider.cs原始碼修改的朋友,可以到這裡下載。

4/06/2006

水果日報,唯我獨尊


家中沒訂報紙,所以我習慣在週六日買份水果日報,15元可以換到一大疊,補充八卦,看看鹹溼之餘,吃飯、丟果皮時再也不用發愁無紙可墊,實在是划算至極~~~
看多了水果日報,開始注意到一件事,這年頭台灣的雖然電視新聞媒體已達泛濫的標準,SNG車多到連小狗掉到水溝都要現場連線,新聞記者除了素質一直被人垢病外,發掘新聞的能力實在讓人失望。
常常,早上在報紙上看到什麼消息,接著就可以在中午的新聞看到同一消息,然後甲台報了這則消息,乙台如果沒提就會遜掉,於是報紙的消息變成影片版在各大新聞電視台放過一次,內容與報紙新聞大同小異。
水果日報靠著作風慓悍的狗仔大軍,向來以新聞的勁爆性與話題性聞名,當然是各大新聞台不能放過的好題材,不過經典的偷拍鏡頭多是流血流汗博命所得,加上時機都屬千載難逄,電視新聞台要補足水果漏網的資訊實在難如登天,於是我看到自暴自棄的電視台在不能不報的壓力下,硬著頭皮用攝影機翻拍水果報上的照片,打上"翻攝自水果日報"的小字,讓主播唸著跟報紙內容大同小異的稿子,這就稱得上一則"輸人不輸陣"的新聞。
拿昨天最紅的"城仲模帶著女性友人至汽車旅館拉肚子"的新聞來看,某電視台幾乎就靠著翻拍成立一則新聞,另一家則稍微用心一點點,還去汽車旅館實地考察,把該房間中的八腳椅拍了出來,再追加一則五股那一區MOTEL林立的報導。幸好,下午城大法官被迫公開說明,不然我看水果的照片還會是整則新聞的唯一主角。
即便大家對狗仔唾棄有加,但不得不承認,水果還真是台灣新聞的領導者,阿扁千交代萬交代電火球院長"不要看報紙治國、看新聞執政"還是有幾份道理的,不然新聞台以水果馬首是曕,而水果又是港資,而港資又是中共同路人,這下可就著了老共的道,戎之戎之!
由今天的新聞,城大法官的去職似已成定局! "中資"的媒體把台灣的大法官給震下了台,即便政府老早挑明了絕不看報紙治國,水果日報還是又展示了一次"動搖國本"的威力,不禁要讓人對它另眼相看了!

4/05/2006

女兒的首次故鄉之行


女兒四歲半了,今年清明第一次帶她返鄉掃墓祭祖,也見一見她從未蒙面的幾位長輩。
成行前,問她說今年要不要跟爸爸媽媽去草屯,她很興奮地問: "草屯是什麼地方,有很多草嗎?"
心想,在處處綠茵的草屯,這麼說也不能算錯,於是我就笑答: "對呀! 你真聰明"
她馬上宣佈--要去,而且一定要在草上打滾!!
大清早就把她挖了起來,很難得的她沒有任性地哭喊說沒有睡飽還要再睡,可能是因為對在草上打滾太過期待之故。
經過幾個小時的車程,到了目的地,就看她興奮地不得了,跟前跟後,東看西看,試著教她合十拜拜,則不意外地毫不順從。最好笑的是拜完後,我習慣會拿兩個十元擲個筊,跟先人列祖小聊兩句(好奇吧! 腦子已經半數位化的我也會做這事兒?? 其實理由很簡單,這還是跟Trouble-Shooting的邏輯思維沒有兩樣--你是否能提出足夠的證據證明擲筊問卜沒有任何可靠性?? 如果不能,我就不建議排除這個推論),雖然教了這個小妮子如何問禱擲筊,但果不其然,她又抵死不從。倒是看我默念一陣後丟出銅板,正要檢視有沒有聖杯時,她居然從旁探出頭來,問我: "有中嗎??"... orz
拜完了,就順道去探望幾位長輩,這位任性到底的小女孩果然又從頭到尾扭扭捏捏,說什麼也不開口叫人,倒是有糖果餅乾遞上時,倒是大方地答謝接受,讓為父的只有從頭orz到底...
於是我唸了她幾句: "你這樣很糟糕耶! 爸爸的臉都被你丟光了" 這小妮子居然興奮了起來,開始在旁一邊跳一邊唱: "嘿嘿嘿... 我要丟爸爸的臉,我要丟爸爸的臉..." 這下子,臉真的丟到外太空去了。
看來,這個小女孩實在需要"好好地"再"教育"一番,不過不得不承認,有女兒同行,這趟返鄉祭祖之旅,頓時變得五彩繽紛起來...

卡神? 真是夠了!


這兩天,不時在電視上看強力放送的"卡神"汽車廣告,接著又在好幾個談話性節目中,也見"卡神"端坐在特別來賓席,接受主持人近乎膜拜似的推崇之餘,然後再以理財專家之姿大談賺錢之道。
夠了,真是~~~
事實是什麼? 這個精明且膽識過人的小女生,發現了信用卡刷卡積紅利制度的漏洞,先向親友募集鉅資(六百萬),向發卡銀行申請將信用卡額度提高到六百萬,然後先刷卡購入六百萬可視同現金流通(因為可還本)的東森購物禮券,先獲得額外的加倍紅利回饋,然後再假藉網拍的形式,跟親友以刷卡方式反覆交易這些禮券,藉此衝高刷卡點數(這讓我想到國內SI廠商特有的"過水"[註1]文化),最後累積出的驚人紅利點數,換成機票後再網拍脫手獲利,創造出月入上百萬的奇蹟。
這番煞費苦心的操作,說不上有什麼違法之處(我是很懷疑與親友間刷卡網拍這段是否有詐欺的嫌疑,即使不違法,他也有違誠信),但絕不值得歌頌。
剛好最近有另一則新聞:
18%退休金新制度中規定,代理過主管超過10天,就可以在退休金中享有一定比例的主管津貼。不少公務員就設法安排讓自己暫代個十天主管,從自退休金每月多好幾千。人事行政的主管單位證實: 此舉不違法!!新聞
許多人看到這則新聞的第一個感想應該都是"暗陰陽"! 這些天殺的臭米蟲,還真會讚漏洞,居然想多A我辛苦繳的血汗錢~~~
回過來看,卡神小姐這番五鬼搬運法的基本精神與這些到處鑽營的公務員並無不同---找出制度漏洞,以不違法的方式,獲取自己的最大利益。但為何一個被崇拜如神,一個則被唾罵如賊??
關鍵在於,臭米蟲A到的是我的錢,而卡神A錢的對象,是近來在卡債風暴中被妖魔成吸血鬼的發卡銀行,基於敵人的敵人是朋友的推論,卡神自然成為卡神!!
說穿了卡神就如同當年叛逃的中共飛行員,在台灣可以領黃金,掛著反共義士的頭銜當大爺一樣,都是特定時空下的荒謬產物!
尤有甚者,前些日子新聞正熱時,還有記者主張,銀行應該要重金禮聘卡神進入銀行任職,因為她打敗了銀行裡負責精算、設計制度的碩博士團隊。咳,如果我是銀行老板,我頭殼壞了才會找這樣的人加入我的團隊。貼近金流的金融業從業人員,對品德、正直、誠信的要求格外看重,甚至優先度要在能力之上,否則操守不佳,能力愈強就意味著其可能造成的殺傷力愈大。對於一個善於鑽制度漏洞,謀求自身利益的高手,我實在不知道要放在哪個位子上,我才能夜夜安眠。
我不知道有多少人看到了"卡神"現象背後的價值觀扭曲,但媒體想藉她的話題性吸引觀眾目光、廣告商想利用她的高知名度拉抬商品,書店當然也想藉機海撈一票。這群交相賊的共犯們,就算知道了也不會戮破。但千萬不要忘了,無論如何,利用漏洞走偏門發財不應成為顯學,就算月入百萬也不可取,這不是正常的社會教育與經濟發展的模式。
看到站在萬兩黃金後方,身著飛行裝,頸掛花環,肩披彩帶並高舉雙手的"反共義士"時,他或許著實狠狠地羞辱了你的敵人,而讓你大呼爽快;但不要忘了,這個人拋棄了父母妻小,背叛了他的國家。
同樣的,輕鬆月入百萬的卡神,一舉將向來趾高昂的發卡銀行整到灰頭土臉,實在大快人心;但不要忘了,她的成功十足是擅鑽漏洞的投機典型,可以被羨慕,但不該被推崇,更不該被當成學習仿效的對象。卡神的封號,到此為止吧!!

[註1]就是賣一台機器給客戶時,中間安排幾個廠商,負責進貨再出貨給下一手,明明只賣了一台機器,卻讓數個廠商都有了業績,無形中繁榮了台灣的經濟,也養活了不少苦命業務的一家老小。