-
TechEd 2008 筆記 - Day 3
-
上完整天課,晚上再整理筆記,比上班還操!
不過,上班後還有機會當學生是幸福的,所以坐前兩排是一定要的,全程不闔眼更是必要的堅持... (謎之聲: 你還真敢說? 有閉眼就天打雷霹哦!) 呃... 當然啦,這是相當崇高的理想,而我畢竟也還是血肉之軀,所以... XD
【Unit Test】
講師李智樺很像蔣公,我Google不到他的Blog,有人知請再通報
- 迷思: Java Developer很少不做Unit Test的,.NET Developer很少在做Unit Test的
- 不做Unit Test的理由: 老板沒要求何必雞婆、趕專案都來不及了測個屁、需求一直改哪來的美國時間測、我們的測試員哩?
- 有了Unit Test,接手前人/外包商的Code才有品質保障,Refactoring時也才能確保程式沒被改壞,好處很多
- Martin Fowler: 不相信文件,只相信Code;Code成千上萬行,要如何相信? 用Test驗證!
- DEMO: Visual Studio可透過按右鍵自動產生Unit Test相關專案及檔案。不一定要一次生完全部的Test,太複雜的可等程式不斷修改擴充,聞到Bad Smell(覺得再拖下去會出事)時再用VS的功能產生。
- Test Driven Development: 先寫Test Case再寫Code,強迫你再想一次需求(Second Thought)是額外的收獲。
- Unit Test時記得要檢視Coverage,確認有測到各種情境的分支。
- 重要的前車之鑑: 程式想不出來時,不要抓頭...
- 老師講的劍潭的笑話聽不懂...
【SQL 2008】
- 新資料型別: Date、Time(可到100ns)、DateTimeOffset(可含時區)、DateTime2(範圍大,可到100ns)。Time、DateTime2宣告可決定秒的精準位數,決定資料佔用的空間。
- INSERT INTO ... VALUES
( v11, v12, v13, v14, ... , v1n)
( v21, v22, v23, v24, ... , v2n)
可一次INSERT多ROW
- User Defined Type可以破8KB
- Table Type,宣告Table Variable時,可以不用每次重新宣告欄位,直接指定變數的型別是Table Type即可。另外,Table Variable可以被當成Stored Procedure或UDF的參數傳遞。
- Grouping Set: 可簡化原本要GROUP BY不同欄位再UNION ALL的做法
- Merge: 可以設定沒有就新增、有就更新,讓合併資料表的工作更容易。說明
- 支援 += -= *= /=表示法
- SQLCLR: UDT, User Defined Aggregate也可大於8KB
- SQL 2008多了70種新的Collation,企圖與OS的選項一致
- HierarchyID, 空間資料, Filtered Index(只對符合某種條件的Rows做Index)
【SQL 2008 Security】
講師陳俊宇 Blog: http://sharedderrick.blogspot.com/
- EKM: Extensible Key Management,可以引用廠商提供的Provider做加密,藉由硬體運算減少Server負荷,並可享有金鑰資料分離的額外優勢。
- TDE: Transparent Data Encryption,設定憑證為全資料庫加密,即便mdf或備份檔被盜走,也無法Attach或Restore。設定TDE後,程式完全不用改。
- TDE以Page為單位加密,並有Checksum,唯FileStream DataType不加密。
- TDE可與資料壓縮併用(因先壓才加密),但與備份壓縮併用時無太大效果(密文之可壓縮性很差)
- TDE會導致tempdb也加密,效能略差。
- Enterprise/Developer Edition支援EKM/TDE
- 新的稽核機制,可針對全Server或Database做稽核
- 稽核機制應用範例: 監控帳號建立、刪除、改密碼,特定帳號對特定Table的SELECT
【WebAP的安全漏洞】
講師是大名鼎鼎的Birdman(邱銘彰),想看他的新文章可到阿瑪外傳。
雖然不意外主軸還是SQL Injection與XSS兩位老掉牙的頭號戰犯,但其中有不少精闢的分析歸納,十分精彩。
- 妙喻: 漏洞是系統功能的一部分,只是它沒有寫在規格書上,有些"功能"很強可以"做很多事"。
- WASC統計,平均每個Web有13個漏洞,其中9個很嚴重。
- 資安威脅排行維持XSS、SQL Inection領先,而去年竄出的Malicious File Extension,指的是掛馬這類行為。
- XSS一直是漏洞排行榜的冠軍。
- Samy利用社交網站MySpace的漏洞以XSS方式,被加成百萬人的好友。參考
- XSSed 網站仍有一大票仍存在XSS漏洞台灣網站的名單,很多是公家機關,而且上榜很久了。
- 常識: SQL Injection、XSS是什麼?
- 名言: 逃避不一定躲得過,面對不一定最難受
- SQL Injnection、XSS、Stack Overflow、藍盒子打免費電話的本質都很像,就是Data Channel被轉換成Command Channel
- 處理User輸入內含有毒物質的黑名單策略:
A. Block - 有毒就整批拒絕
B. Sanitize - 將有毒部分剔除(最後儲存結果與User輸入有出入)
C. Transform - a) Escape只換掉有毒部分 b) Encode 全部編碼
- XSS的Sanitrize不好做。例如: %3Cscript%3E, <scri<script>pt>,防不勝防
- AntiXss.HtmlEncode比HttpUtility.HtmlEncode來得安全,過濾得更徹底。
- Error Safty的程式設計:
A. No-Fail Guarantee: 做不到
B. Strong Guarantee: Block and Rollback
C. Basic Guarantee: Sanitize, Transform
【ASP.NET 3.5 SP1】
講師董大偉網站: http://studyhost.blogspot.com/
又是很充實,講得又快又多的一堂精彩課程,只能簡要提示如下,有興趣的自行深入研究。
- ASP.NET AJAX Script Combining: 減少一頁要載入十來個js的需求,一次全部取回以提高效率。參考
- Url Routing
- ASP.NET Dynamic Data,依據Schema自行產生清單、編輯Web UI,可透過Meta Attribute客製,例如: TextBox -> DateTimePicker,指定輸入範圍的Range Validation等。
- ADO.NET Data Service,將ADO.NET Data Entity以WCF方式提供出去,簡化遠端存取資料庫的Coding。
- ASP.NET MVC,對於UI、Data Logic的分割很徹底,抽換UI是一塊蛋糕(例如: ASPX->Silverlight),但這個架構較複雜,是否會值回票價,端賴應用的情境而定。
-
TechEd 2008 筆記 - Day 2
-
【以駭客角度看企業安全】
課程主軸不太明顯,但有幾個Demo挺驚悚的,速記幾個重點:
- 留意原本認為不可能發生問題之處,當真正發生時,傷害特別大(料想不到,故無防備)。例如: HD整顆被偷走? 新買的HD中有木馬?
- 端點(如: 個人使用的PC)其實是很脆弱的,裝了防毒不代表安全,而端點內資料的機密度並不亞於伺服器上的資料(Source Code、Connection String、Username/Password),許多攻擊會選擇從端點下手,再拼湊出進行下一步攻擊的所需資訊。
- Demo: U3 USB行動碟部分儲存空間摸擬成CD-ROM,導致其中躲藏的木馬就算被防毒掃到也刪不掉(CD-ROM唯讀),進行滲透可盜走IPConfig、SAM、Cookie、Browsing History(去過哪些網站,有Cookie說不定可以自動登入,或由到訪網站蒐集受害者的情資)、Hotfixes(沒上的就可以拿來攻擊)、Service List(有哪些Port可以連結?)、最近開啟的文件,木馬可將這些資料通通Copy回行動碟上。這一切只要一個插入USB動作就可完成!
- Demo: 設計製作精美的假程式安裝片寄到公司->總機/收發交給RD人員->RD人員拿到新軟體,迫不及待看看->中鏢!!
- Demo: 印刷精美的影音光碟,插入電腦後自動播放,木馬程式表面上播放影片,同時間正在偷資料、打包、寄出...
【IE8的企業應用考量】
- IE8多了Domain Hightlight,URL中的Domain Name會深色顯示、信任網站的網頁Tab會呈現綠色
- IE7 ActiveX Opt-In(詢問User要不要用ActiveX Control) 、ActiveX Kill Bits(經原開發廠商同意,禁用某個ActiveX Control)
- IE8 Per-User ActiveX(只對某個人開放使用) 、Per-Site ActiveX(有危險性的Control可標示只能在某站台使用)
- IE8 新增Cross Domain Request(發HttpRequest到Cross-Domain但被信任的網站)、Cross Domain Messaging(Cross Domain網頁間交換資訊)
- IE8的每個頁籤被隔在不同的Process中,單一網頁爛掉不會搞掛其他Tab內的網頁。IE Crash時,下回啟動可選擇重開原本開啟的各頁籤。
- 網頁可用Tag<meta http-equiv="X-UA-Compatible">指定用IE7模式,或在IIS設定對全網站所有網頁加料。
- IE8有1300項Group Policy可設定使用者如何使用IE(比IE7多200項)
- In Private模式: 瀏覽過程不留下任何Cookie、History。
- IEAK(Administration Kit): 可設計IE自動部署程序,IE8的IEAK又更Friendly了。
- IE8 Activity從Beta 2起更名為IE8 Accelerator(加速器) [第一次遇到Beta改版時連技術的名字都改了,玩Beta果然很刺激]
【.NET除錯技巧】
投影片及相關資料可至講師林泰宏的Blog取得: http://blogs.msdn.com/terrylin/
- VS2008可設定取回.NET Framework Source Code Debug。設定方法看這裡。
- 開發環境可用VS Line-By-Line Debug,正式環境則要靠Log或Windows Debugger(WinDbg)。
- WinDbg本來是用來Debug Unmanaged Code,加掛SOS.dll,也可以解析.NET程式。
- 基本常識: First Chance Exception,2nd Chance Exception(參考)。Visual Studio可設定在發生特定First Time Exception時觸發中斷。
- Demo: IE瀏覽一個簡單ASP.NET網頁,點選連結就IE Crash -> 用WinDbg Attach IE->故意引起Crash->WinDbg中斷於First Chance Exception->看Stack->可疑的jccatch.dll->FlashGet引起
- Demo: 用WinDbg Attach .NET WinForm程式->利用SOS的!dso , !do看到Connection String。Memory Dump可能內含機密資料,要小心運用。
- Demo: 用WinDbg !syncblk找出Waiting/Block Thread,~threadIds切換Thread,!clrstack看Call Stack
- Demo: 用WinDbg找出Value Type導致PropertyGird Control CPU Hang
【Vista靈異現象與破解】
本來以為會著重Vista UAC等特性可能造成問題的經驗分享,實際上這是一場茶包射手招生大會,紮實地介紹了茶包一哥Process Monitor/Process Explorer/AutoRuns的犀利之處。相信本站讀者應該都已見識過這些工具的強大威力,課程中聽到幾個精彩實例:
- 用ProcMon找出戰慄時空2的Registry讀取證據,追出疑似引用了某個DLL導致音效動畫Delay,更新DLL後排除。
- 某些機器開MMC很慢->ProcExp找出在讀取crl.microsoft.com(憑證黑名單),而機器未連Internet->改Registry不讀黑名單解決。
- 關機時出現無法關閉程式->CSRSS無法與某程式溝通(掛點了)->用Spy++找視窗Title->找到Process,疑似無用處->AutoRuns找出啟動設定,清除
- 一台機器裝兩個防毒軟體->CPU 100% Hang->ProcMon看檔案,發現二個防毒軟體搶著將有毒檔放進自己的隔離區,放入時被另一個防毒偵測出有毒,也想放入自己的隔離區,永無止境->移除其中一個防毒或將隔離排除不檢查
- 選取Folder壓Zip時,出現找不到檔案或無讀取權限->ProcMon找到Sharing Violation->重開機可解(黑註: 或用Unlocker解決)
- MyData目錄刪除後不久又自動出現->ProcMon Filter MyData Path->IEPro設了Image Cache Path。
另外,程式Crash時,Windows Error Reporting Service會將Memory Dump送至MS分析,XP時可以由UI上找到Dump檔位置,Vista則只有在傳送時才會產生,傳送完即刪除,可用WinDbg Attach後下.dump。
講師曹祖聖的Blog: http://teacher.syset.com/
【Silverlight 2.0】
Silverlight 2.0可以用C#, VB.NET寫Code,現成的控件完整許多,支援WCF、Socket、Data Binding,用VS2008配合Expression Blend 2.5設計起來已相當順手。本場次以現場操作示範為主,一言難盡,只分享一個心得,可以認真考慮將一些應用移至Silverlight上了!
講師董大偉的Blog: http://studyhost.blogspot.com/
-
TechEd 2008 筆記 - Day 1
-
今年的TechEd課程排到晚上七點半,十分精實,堅持全程不闔眼的難度也急劇上升... orz
廢話不多說,整理一下今天的筆記跟大家分享,當然實際上課內容超多,只能挑重點記,餘下的請大家看講師的投影片及用關鍵字([ ]內包含的字眼)自行Google。
【Keynote Speech】
主要在推銷Win2008/SQL2008,聽到幾個對我較有吸引力的特色:
- SQL 2008: 可設Policy,檢查或禁止某些Schema設計。
- SQL 2008: 可區隔出不同[Resource Pool],設定不同的可用CPU比率,讓重要的查詢不要被其他吃重查詢給拖垮了。
- SQL 2008: 新增Streaming(多媒體串流)及Geogrpahy(地理)資料的支援。
- SQL 2008: 資料儲存及備份可做壓縮節省時間
- SQL 2008 Reporting Service可匯出Word格式。
- Report Designer 2.0新增很多Templates(如: 溫度計顯示)、Excel有新的BI Addin,不用匯資料到DB就可以做Data Mining。
以下是今天四堂課我覺得新鮮的重點: (曹祖聖老師的投影片大約一週後可以到http://teacher.syset.com/下載)
【Vista技巧】
- slmgr.vbs -ato 網路啟動, -rearm 多要60天啟動前試用(限一次)
- 可備份成.vhd,掛到VM下。[vhdmount]
- 幾個好用的快速鍵: Win+U Easy of Access Center輕鬆存取中心、Win+Break 系統畫面
- msg username messageContent可以取代以前的net send,彈出訊息,走的是Terminal Service的管道
- 取消使用者按右鍵"以管理者身份執行"的選項,Regedit: [HideRunAsVerb]
- shell:SendTo,開啟傳送到的設定路徑,可以自訂接受一個參數的執行檔捷徑。shell:Blah有一缸子的路徑簡碼
- Vista RTM的開機畫面可以自訂,但SP1後已禁止。[winload.exe.mui, Vista Boot Logo Generator, msconfig no GUI boot]
- Vista中有些檔案的Owner是TrustedInstaller,連Admin都不准改。
- 登入畫面也可自訂。[Logon Studio Vista]
- 呼叫控制台項目: rundll32.exe, control.exe,例如:
control timedate.cpl
control /name Microsoft.System
control ncpa.cpl 網路設定 <-- 這個好用,原本要點好幾下才出得來
【2008-10-07更新】MS有篇KB有更完整的提示,謝謝網友srv補充!
- 控制台項目也可DIY。[InfoTip, System.ApplicationName, System.mControlPanel.Category]
- Vista安裝時會將整個安裝片解壓到HD上,故會吃到6G,好處是將來都不會再用到光碟片。要減肥可考慮移去Windows\SoftwareDistribution\Download(下載更新,約1.8G),System32\DriveStore\FileRepository(各種驅動程式,約1G)、Windows\Installer(安裝檔備份,但移了可能AP Icon不見或反安裝有問題)、Windows\SxS(才500M,移掉後遺症多,不值)
- [vlite]可製作Vista安裝光碟,移去不要的安裝項目、設定安裝的選項、加上Service Pack/Hotfix,甚至可以縮到可放入CDROM的大小(500M)。[nlite for XP]
- Vista SP1 效能有改進。[Principled Technologies benchmark, Cache IO Model, SMB1.0]
- Ready Drive/ReadyBoost改良,Sleep/還原變快
- Windows Defender/Software Explorer可以檢視程式連線狀況 <--可以協助發現木馬/後門
- Windows Performance Toolkit,可以找出效能不好/開機太慢的元凶。[xperf, xperfview, xbootmgr]
- KB929868(某些網站不支援RFC1323,Vista瀏覽特慢)、網路芳鄰看到不XP[Link Layer Topology Discovery, LLTD]
【.NET 3.5 Security】
- 必備常識: Code Access Security (CAS)、Evidence Based、Attribute法/Coding法
- .NET 3.5 Support新的WS-Security標準、採用美國官方Suite-B/CNG建議的加密演算法
- ClickOnce會認部署網站的簽章,防止被假冒[Manifest Signature Information]
- .NET 3.5: FullTrust App不再每次檢查StrongName以加快效能,LocalIntranet視為FullTrust
- OS層級保護: Vista/Windows 2008 User Access Control(UAC)、Address Space Layout Randomization(ASLR)防止被惡意程式掌握篡改、BitLocker全HD加密(防止被裝到不同機器上,但對同機器上的程式無效)、Pointer Obfuscation、CPU的Data Execuation Provention(NX) 、常識: 緩衝區溢位攻擊、C++ Compile with /GS在Stack加上Random Cookie防護緩衝區溢位攻擊...
- 重要資料放在記憶體中時特別處理: ProtectedMemory(XP+ API)、ProtectedStorage(Win2000+ API)、SecureString、IsolatedStorageFile
- RNGCryptoServiceProvider-->比傳統Random更安全,無法被預測
- Security Token Service(STS)的觀念,利用第三方的證明認證身份/授權。例如: 用身份證明買到機票、登機時認機票。
- 網頁設計時可用Card Space取代帳號/密碼登入 [<object type="application/x-informationcard">, TokenProcessor, 說明]
- 將SID轉成使用者名稱 [FileSecurity, NTAccount Class]
- WCF傳輸加密 [SecurityMode.Message, MessageCredentialType.Certificate]
- .NET 4.0 "Oslo"
【.NET N-Tier】(對我來說,大部分都已知,所以筆記不多)
- C# Tips: Lambda Expression, LINQ Expression, Anonymous Type
- 介紹及示範 LINQ to SQL
- OR Mapping介紹
【Server Core】
- 無GUI、服務精簡的Windows 2008版本,穩定、效能好、安全(被攻擊面小)
- 適用DNS、File Server、DHCP、IIS(不含ASP.NET)、AD、Printer Server、Hyper-V等內建服務,不能用來跑SQL、Exchange,不支援PowerShell、.NET Framework(那就沒搞頭了,但據說可以安裝,但官方不支援)
- 開機後的UI是螢幕中間一個DOS Command視窗,有少量GUI: Noptpad、國別時間設定、RegEdit、Task Manager
- 大部分要透過指令設定,但有善心人士開發的工具[CoreConfigurator]
- 中文版Server Core有很多指令參數要翻成中文譯名,建議安裝英文版較佳
- 設好防火牆,就可以用Remote Desktop、MMC、WinRS、WinRM進行遠端管理
- 好用的指令: netsh advfirewall
- 用Vista管理Windows 2008的工具: Remote Server Administration Tool, RSAT
- RemoteApp: 透過Terminal Service設定,可以在遠端執行某個特定程式,再將UI傳回來
- 似乎沒防毒軟體可用
-
得獎的是...
-
眾所矚目(其實並沒有)的黑暗盃程式魔人賽,已於9/20凌晨截止收件,並於9/20早上進行比賽,比賽結果出爐,本屆比賽的冠軍得主為ChickenHouse老板安德魯先生,可以抱走VSTS2008+MSDN大獎。
本次比賽採用最近三期威力彩的頭彩號碼當亂數種子
static int[] randomSeeds = new int[] {
2631, 3710, 2202, 1614, 2622, 2119, 3627, 1229, 2028, 10, 11, 12, 13, .... , 20
};
由比賽結果來看,ChickenHousePlayer拿下各回合的次數第一,Someonepoor則是飛毛腿幾乎包辦了全部的速度第一。在比賽評分設計中,次數多寡所佔的比重頗高,因此ChickenHousePlayer以相當明顯的差距擊退其他參賽者。
| 回合 | Player_ dmwc | 積分 | Chicken House Player | 積分 | Someone poor | 積分 | Dark Player | 積分 |
| 10/4(Count) | 16 | | 5 | 10 | 16 | | 5 | 5 |
| 10/4(Ticks) | 1,468 | 3 | 1,790 | | 609 | 5 | 2,263 | |
| 10/4(Done) | | 1 | | 1 | | 1 | | 1 |
| 32/12(Count) | 108 | | 65 | 10 | 84 | | 75 | 5 |
| 32/12(Ticks) | 3,581 | | 400 | 3 | 349 | 5 | 490 | |
| 32/12(Done) | | 1 | | 1 | | 1 | | 1 |
| 64/24(Count) | 314 | | 162 | 16 | 245 | | 234 | 8 |
| 64/24(Ticks) | 11,343 | | 1,132 | 4 | 1,008 | 8 | 1,581 | |
| 64/24(Done) | | 2 | | 2 | | 2 | | 2 |
| 256/64(Count) | 1,917 | | 786 | 16 | 1,385 | | 1,282 | 8 |
| 256/64(Ticks) | 106,230 | | 6,760 | 4 | 5,868 | 8 | 12,980 | |
| 256/64(Done) | | 2 | | 2 | | 2 | | 2 |
| 1024/256(Count) | 20,615 | | 8,209 | 24 | 17,997 | | 17,326 | 12 |
| 1024/256(Ticks) | 3,950,028 | | 76,724 | 12 | 77,120 | 6 | 355,134 | |
| 1024/256(Done) | | 3 | | 3 | | 3 | | 3 |
| 4096/1024(Count) | 298,331 | | 112,457 | 32 | 267,369 | | 264,660 | 16 |
| 4096/1024(Ticks) | 251,590,818 | | 1,891,983 | 8 | 1,145,051 | 16 | 16,430,140 | |
| 4096/1024(Done) | | 3 | | 3 | | 3 | | 3 |
| Total Score | | 15 | | 151 | | 60 | | 66 |
恭喜ChickenHousePlayer嬴得大獎,抽不出空參賽的魔人們,歡迎來挑戰以上的記錄。
所有程式碼及完整比賽記錄可以按這裡下載。
-
32767!
-

騎車回家,里程表上跳出一個神奇的數字,勾起一段年少回憶...
99 = 0x63
255 = 0xff
999 = 0x03e7
9999 = 0x270f
32767 = 0x7fff
65535 = 0xffff
看到這串數字,不知有沒有人跟我有一樣的悸動?
如果有,那代表很有可能:
- 你曾經有段時間沈迷於PC Game,在宅男這個名詞還沒誕生的時代就樹立了"宅男"的典範
- 你有點年紀了,當年的Game還不流行用密技鍵提技能/加金錢/變無敵,得自己偷改破解
- 被你破解的遊戲應該也有點年紀了,用的是int, short這些短欄位。當時民風純樸、物價還沒飆漲,幾千元就可以買到最頂級的兵器跟防具,難怪錢包最多只能放32,767元也夠用
- 你沒有完全依賴FPE、Gamebuster懶人工具,有時還會直接編修Binary資料,所以練就出可以用眼睛做16進位/十進位轉換的奇技,對99/999/9999這些數字的16進位更是倒背如流
- 憑藉修改Game累積的推理分析能力,你現在是程式魔人(或駭客狂人)! 或是說,因為體內流著駭客的血液,看到Game就想偷改,是你此生的宿命。
這種年少輕狂很多人都有,但連在機車里程表上看到都想要拍照留念,更扯的是還PO在部落格上...
這位大叔,你病得不輕啊~~~
PS: 提醒要參加黑暗盃程式魔人賽的朋友,記得在9/20 00:00前寄出將程式碼。
-
SQL 2005 TIPS - Convert NText To Xml Data Type
-
使用SSMS SELECT XmlStringCol FROM myTable,發現由於SSRS的結果字元數限制(65535個字元),在結果視窗複製欄位內容再到Notepad貼上,XML的後半截不見了。
雖然這個限制可以修改(如下圖),但一時想要展現高超的T-SQL指令技巧,我決定把它轉成XML,如此可以閃過長度限制,還可以直接在SSMS中檢視XML內容,一舉兩得。
噹!! (痛)
我踢到鐵板了!
XmlString是一個NText欄位,裡面放存放的內容來自*.xml的讀取內容,試著將XmlStringCol轉成XML會發生錯誤:
SELECT TOP 1 CONVERT(XML, XmlString) FROM myTable
Msg 9402, Level 16, State 1, Line 1
XML parsing: line 1, character 38, unable to switch the encoding
經過一番測試,總算明白問題出在哪了。從*.xml中讀出的內容,第一列放的是XML宣告<?xml version="1.0" encoding="UTF-8"?>,而記得嗎? SQL中一向是用UCS-2儲存資料的,這形成一個矛盾: 明明Encoding是UCS-2,但XML內容卻又宣稱自己是UTF-8,導致了轉換失敗。
我想到的解決方法是去掉encoding屬性,讓SQL自行看著辦,但由於欄位是NText,必須要轉成NVarChar(MAX)才可動用Replace狸貓換太子,於是指令要改成:
SELECT TOP 1 CONVERT(XML, REPLACE(CONVERT(NVARCHAR(MAX), XmlString), 'encoding="UTF-8"', '')) FROM myTable
搞定收工!
-
【茶包射手專欄】無法開啟的ASP.NET 1.1專案
-
要開一個古早的ASP.NET 1.1專案,VS.NET 2003卻一直彈出以下的錯誤:
Unable to open Web project 'FE'. The file path 'C:\WWW\JurassicPark\FE' does not correspond to the URL 'http: //localhost:9999/FE'. The two need to map to the same server location. HTTP Error 403: Forbidden.
Goggle了一下,有篇KB提到,這會發生在啟用SSL後,但我壓根沒設SSL,顯然不是KB所說的情境。看起來,這問題出在VS.NET 2003無法確證C:\WWW\JurassicPark\FE就是http: //localhost:9999/FE,用IIS Manager檢視設定,虛擬目錄的設定明明是正確的。有點膠著,那就呼叫茶包一哥Process Monitor出來辦案吧!
VS.NET 2003檢測實體目錄跟IIS目錄是否一致的手法在Process Monitor的透視下一覽無遺。原來,VS.NET 2003會在該目錄下寫入一個暫存檔名的HTML檔,再透過網站URL去存取,證實二者的映對關係。發現了這一點,就可以再從IIS Log中得到佐證:
2008-09-16 07:28:44 W3SVC609852739 127.0.0.1 GET /FE/vs162105643329956047_tmp.htm - 9999 - 127.0.0.1 Microsoft-Visual-Studio.NET/7.10.6030 403 6 0
HTTP 403.6? 這下子真相大白了!! HTTP 403.6 = Forbidden: IP address rejected。用IIS Manager一看,果然FE Virtual Directory當初為了測試設定只有特定IP可以存取,卻忘了設給127.0.0.1,因此用localhost連上時會傳回HTTP 403.6,導致了VS.NET 2003驗證網站位址失敗。
這個故事告訴我們:
- Process Monitor好威呀!
- 做測試亂改設定後,記得要立即還原,不要偷懶。
- 本案其實用IE先開一下http ://localhost:9999/FE就可以發現問題所在,用Process Monitor是大砲打小鳥。但,Process Monitor還是好威!!
-
【茶包射手專欄】無疾而終的ChromeSetup
-
Google Chrome已經出來好久了,許多Blogger都有PO文介紹,介紹軟體不是我的專長,就不現醜了。今天我要演講報告的題目是--坎坷的Chrome安裝之路,坎坷的Chrome安裝之路。(握拳狀)
全天下的人安裝Chrome應該都是下一步下一步就搞定,我在家機Vista上也是如此,唯獨在公司的工作主機上就是怎麼都搞不出來。ChromeSetup.exe執行後什麼也沒發生,沒有UI,沒有錯誤訊息,用Task Manager檢視,連渣渣都沒有。
這種時候,就該茶包一哥--Process Monitor上場囉!
設定Filter為Process Name is ChromeSetup.exe,執行一次ChromeSetup.exe,檢視Log,答案立刻揭曉。
原來是我為了加快系統效能,劃了1G的Ramdisk(這個小撇步保哥有專文介紹過),掛成Drive A:,並將環境變數的TEMP及TMP設成A:\。結果ChromeSetup不知什麼理由,會試著用Create方式存取TEMP所在的目錄,作用在根目錄上,就會產生ACCESS DENIED的錯誤。看來ChromeSetup並沒有抓到這個Exception,或是抓到了卻沒給任何訊息,程式就悄悄結束了。
換言之,如果有哪個怪咔也將TEMP/TMP設成磁碟的根目錄,就會遇到像我一樣的情況。但我這組設計應該獨步全球,打著燈籠也找不著第二個吧!
知道了原因,餘下就好辦。建了個A:\TEMP,將TEMP/TMP指向它,重跑一次ChromeSetup.exe,就一切如常了。

-
HttpModules/HttpHandlers in IIS7
-
剛才發現,把網站專案移到Vista/IIS7執行時,原本web.config設定的httpHandlers失效:
<httpHandlers>
....
<add verb="GET" path="DownloadFile.axd" type="Afa.Ajax.WebControl.DownloadHandler" />
</httpHandlers>
連線/DownloadFile.axd時,會傳回HTTP 404找不到檔案的錯誤。
透過IIS7的Internet Information Services (IIS) Manager / Handler Mappings設定UI,重新指定這個HttpHandler,功能就恢復了。但修好的原因是web.config被IIS Manager改過,再一比對,發現IIS Manager在web.config中加入了這一段:
<system.webServer>
<handlers>
....
<add name="DownloadFile" path="DownloadFile.axd" verb="*" type="Afa.Ajax.WebControl.DownloadHandler" resourceType="Unspecified" preCondition="integratedMode" />
</handlers>
</system.webServer>
如果要兼顧IIS6及IIS7,可在web.config中同時保留httpHandlers(for IIS6)及handlers(for IIS7)裡的相同定義,但記得要加上<validation validateIntegratedModeConfiguration="false" />,不然IIS7會因為定義重覆出現而發生錯誤。參考資料
-
從減碳不烤肉講起
-
十幾年前,烤肉醬公司用幾支成功的廣告"創造"出"中秋節就是要烤肉"的【習俗】,而且儼然已經成為台灣的特有文化,成為連三歲小孩都知的全民共識。今年很特別,基於環保節能減碳的理念,政府大力倡導減碳不烤肉,聽到這個,不免有一肚子牢騷。
這又是一個動機純正、方向準確,但邏輯有瑕疵的論點。如同上回的免洗筷科展研究,邏輯狂又要來找碴了!
首先,一公斤木炭產生3.7公斤二氧化碳的計算公式把木炭與純碳搞混了,阿宅教主朱學恆的Blog上有精闢的計算與分析,結論是,燒炭的排碳量沒這麼多。
其次,把烤肉妖魔化顯然忽略了"做什麼事都會產生二氣化碳"的事實(連呼吸都會,請大家跟我一起憋氣30秒為保護地球進一份微薄的心力)。在家炒菜得開燈開瓦斯開抽油煙機,到餐廳吃飯也省不了煎煮炒炸,還要配上燈火通明(露天烤肉反而會少開燈)跟冷到要穿毛衣的過度冷氣(戶外乘涼反而省了可觀的空調成本),騎車開車坐車搭車也都會排碳。依據環境品質文教基金會的溫室氣體計算器來推估,開車去10公里外的餐廳吃飯,來回就產生4.8公斤的CO2,已經超過步行到公園燒1公斤"純碳"烤肉的3.7公斤CO2。
不能忽視的事實是,不烤肉所從事的其他活動,也都會產生二氧化碳。而環保團體咬定木炭是惡魔,還套上了個不夠嚴謹的數據分析,違背科學的精神。要完整省下計算所得的烤肉排碳,前題是大家乖乖待在家裡,不開火、不開燈、不開冷氣、不進食(吃文旦可以嗎? 不行! 除非文旦是從你家院子裡摘的而不是貨車由麻豆運來的),節能減碳方向絕對正確,但不能用這種粗糙的邏輯矇混過去。
烤肉會產生煙霧,造成空氣污染、燒烤過程可能產生有害物質、肉吃多了無益身材、烤肉多半過油過鹹有礙健康... 這些都是烤肉的黑暗面。但烤肉提供親子團聚的名目,讓生活多些繽紛回憶,也讓農產品、烤肉器材業者保有一線生機,這些則是它的光明面,不應被抺滅。捨去這些不提,只用一句烤肉會產生二氧化碳就大力呼籲萬萬不可,未免也太過草率。
任何事物皆有好的一面與壞的一面,節能減碳是正確的環保觀念與生活態度,但僵化成某些事可以、某些事不可以的二分法邏輯,刻意忽視事物的光明面,顯然就犯了思慮不周的謬誤。不然,我也可以大聲疾呼,那些花上數十萬(賺這些錢要排放多少CO2呀?)購買飄洋過海(不管搭飛機坐船,又是一缸子CO2)名牌皮包、洋裝、高跟鞋的仕女名媛,請妳們現在就去動物園向北極熊躹躬(記得坐捷運,別開車再造業)。流行時尚帶動服飾、美容等相關經濟產業,創造無數就業機會,養活了許多人,功不可沒。因此,時尚奢侈品的功過不應被隨意曲解。
一年只有一次的中秋烤肉亦然!!
-
40萬人次達成
-
無肉可嚐 無月可賞 無假可放 的無聊中秋,還是有好事一件。
小站的到訪人次突破40萬囉~~~
昨天預期今天會破40萬,沒打算特別留意,但早上8:28一連線,發現自己踩到了399,999,真是一整個巧,就開了statcounter等待第40萬人次的幸運兒。
假日早上人潮稀疏,幾十分鐘才有一個點擊,終於在8:49:22,來自福建福州的對岸同胞,循著Google的圖片搜尋,連到"有趣的視覺遊戲"一文。(該篇文章點擊數之高,所有的技術文章望塵莫及,證明題材通俗才是讓Blog熱門的王道呀!)
【成長歷程】
-
WSS清單搬家記
-
我曾用WSS3的清單功能加上一點點客製,寫了一個讓系統管理人員每天申報日常檢查作業結果的網頁,填完的結果則輸出成Reporting Service報表,開發起來很省工,且每天做起來完全不沾手,也避免平日懶得寫,到了檢查前一天才一口氣填一疊的問題。(這勾起我裝檢前一天切換六枝原子筆寫完半年一二級保養表的回憶)
最近有其他部門提出需求,希望我將這個清單移殖到另一個WSS網站上。
要做這件事,最簡單的方法是:
- 在我的WSS上將清單另存成範本(甚至連內容也可以一起包進去)
- 由我的WSS清單範本庫下載stp檔案
- 將stp上傳到新WSS的清單範本庫
- 在新的WSS上利用該清單範本建立新清單
- 搞定收工
這種搬家動作,以前做過數次,都很順利。直到這次。因為新的WSS安裝的是英文版,上傳後,清單範本清單中卻看不到剛上傳的stp,我懷疑是因語系不同(stp來源是正體中文版)WSS才不給用。
Google了一下,證實了這點,同篇文章中也有教怎麼將.stp先改名成.cab,取出manifest.xml修改語系(1028->1033)後再用Visual Studio建一個cab專案(居然有這種專案,又長見識了),重建出.cab再改名回.stp,這回再上傳,就可拿來建新的清單了。
不過,原本客製過的NewForm.aspx在執行時遇到另一個問題,由於其中有一些<% ... %>的寫法用來抓使用者身份及當天日期,在新的WSS上被判定禁止執行:
An error occurred during the processing of /Lists/List/NewForm.aspx. Code blocks are not allowed in this file.
解決方法是在web.config中加入
<PageParserPaths>
<PageParserPath VirtualPath="/Lists/List/*" CompilationMode="Always" AllowServerSideScript="true" IncludeSubFolders="true"/>
</PageParserPaths>
參考文件: http://weblogs.asp.net/soever/archive/2006/07/27/SharePoint-2007_3A00_-using-ASP.NET-server-side-code-in-your-pages.aspx
-
發現Google AdWords釣魚信一枚
-
公司垃圾郵件過瀘器每天都會為我濾出一大堆各式各樣的疑似垃圾信件: 賣假勞力士的、賣威而剛的、要助我脫離貧困的、關心我性伴侶滿意度的... 族繁不及備載,但以英文居多,不知是從哪裡冒出來的。
我習慣在刪除這些疑似垃圾信前再看一眼,以免有正常信件夾雜其中一併遇害。像今年TechEd的大會通知我就是從垃圾信桶中撈出來的,而我的好幾位同事則是看都沒看就讓帶有啟動密碼的通知信化為輕煙...
今天瞄了一眼垃圾信桶,一封信吸引了我的注意力。Your Ad* Google Account is stopped? Google AdSense帳號被停權? 收不到錢了? 不對呀,我的AdSense通知不會寄到公司信箱,當下的直覺是,這應該是封釣魚信。
實在對於釣魚信的手法太好奇了,忍不住把信取出來研究一下。
發信人偽稱是adwords-noreplay @ google.com,adwords?? 不是adsense哦?
看到標題我就笑出來了,原來它說的是AdWords,Google開放企業主刊關鍵字廣告的服務,換句話說,就是掛AdSense的Blogger們的衣食父母(不過應該沒人可以單靠AdSense過日子)。我明明只有AdSense,卻還是被吸引進來了。
再來,我發現這封信的收件人是jeffpu @ mycompanyname.com.tw(圖片中被我遮掉了),我應該是被放在BCC中的收件人。也說是說,它應是用亂數組合姓名的方式去碰運氣,對象是公司行號的員工,而這些潛在的受害人,就很有可能是AdWords的客戶。
假設某個好傻好天真的收信人剛好用公司信箱註冊了AdWords,就有可能中計。由信中的說明,因為原先給的信用卡資料無法扣款,除非受害人請重新上網更新帳務資料(想當然爾,應該是要重Key信用卡資料),不然廣告就不給刊登了。情急之下,說不定就會有人趕快拿出信用卡,登入網站填資料去了。
信件中的釣魚URL用的是很單純的文字連結不符偽裝,看起來是連到http: //adwords.goolge.com/select,但實際上的連結卻是httq://www. adwords.google.com.apolkf. cn/select/logon,沒什麼創意,但應該還是會騙過很多好傻好天真沒有警覺的人。
很想連上釣魚網站看看後續的設計是否巧妙,畫面是否精美逼真,順便打個分數,發表一下"加油,好嗎?"之類的評語。無奈因不知名的原因,該URL已經失效了,本次的釣魚信件研究,到此為止。
-
SQL Server Embedded Edition(SSEE) Tips
-
WSS 3.0的基本安裝模式中,會在該主機上安裝一種特別的資料庫版本(SQL Server Embedded Edition, SSEE),用來作為WSS的資料庫。
微軟本身關於這個神秘SQL版本的說明不多,但Google下來倒有些收獲:
- 你如果把它想像成SQL Express,試著用SQL Server Management Studio Express去連上它,會有點小挫折。
輸入YourServerName\Microsoft#SSEE作為伺服器名稱,你會得到連線失敗的訊息:
Cannot connect to YourServerName\MICROSOFT##SSEE.
------------------------------
ADDITIONAL INFORMATION:
An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified) (Microsoft SQL Server, Error: -1)
別怕,網路上有密技,請改用\\.\pipe\mssql$microsoft##ssee\sql\query 作為伺服器名稱,就可以開開心心地使用SSMS Express管理SSEE了。 - 將WSS3移除後,會發現SSEE仍不動如山,而控制台的新增/移除程式清單中也見不到任何與SSEE有關的項目,要移除它,又要用到密技了:
開啟regedit,找尋HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall下的各個GUID,找到名為"Microsoft SQL 2005 Embedded Edition"的項目,把其中UninstallString的字串值Copy出來(它長得會類似: MsiExec.exe /X{BDD79957-5801-4A2D-B09E-852E7FA64D01} ),在這個字串後方加點工,變成MsiExec.exe /X{BDD79957-5801-4A2D-B09E-852E7FA64D01} /CALLERID=OCSETUP.EXE,執行就可以將SSEE移除,移完記得要重新開機。 - SSEE不是SQL Server Express,所以SQL Server 2005 Express with Advanced Services裡的Reporting Service也不能裝在SSEE上,會出現DB版本不吻合的訊息。我試過了,大家可以不用白費力氣。(不信邪的人可以挑戰一下克服的方法,再跟大家分享)
報告完畢!