September 2009 - 文章

【茶包射手專欄】一個sp_dropserver問題案例

同事手上有一台測試性質的SQL Server,經手褻玩的人頗多,又常進行一些SQL測試。交往複雜之下,這種香爐型的環境一旦發起狠來,往往讓射手們為之膽寒。

今天遇到的狀況是同事要為機器改名(是想重新做人嗎? 呵),SQL機器改名SOP中應執行sp_dropserver/sp_addserver的步驟,結果不幸地:

sp_dropserver 'TESTSQLSVR'

Msg 20582, Level 16, State 1, Procedure sp_MSrepl_check_server, Line 31
Cannot drop server 'TESTSQLSVR' because it is used as a Publisher in replication.

由訊息來看,應與先前測試過複寫功能有關,但用SSMS檢查,該主機已經有沒有任何複寫設定。我推測可能是複寫設定操作步驟不正確,加上SQL Server防呆不佳,以至SQL Server上有一些管理UI看不出來的殘留設定在作怪。

查詢找到一篇類似的說明,幾經研究,最後我用了文中提到的險招,先select * from msdb.dbo.MSdistpublishers確認有一筆以TESTSQLSVR為名的資料,再下指令UPDATE將該筆資料的name更名為TESTSQLSVR_,接著,sp_dropserver就成功囉! 鋸箭完成,收隊回家。

【茶包射手專欄】SSMS的特殊字元陷阱

被一個茶包攪和了一下,也學到點新東西,特別PO文留念。

在整理一些從Excel轉進來的手打資料(強調"手打"表示可能存在輸入誤差,這邊多一點那邊少一點的,用行語來說,就是”資料有點髒”)。舉例來說,整理過程中我要比對出訂單明細OrderDetail裡有沒有打錯訂單編號,做法是查詢OrderDetail中,抓OrderId沒有在訂單主檔(OrderEntry)出現者。

這可難不倒我,蛋糕一塊:
SELECT OrderID FROM OrderDetail WHERE OrderId NOT IN (SELECT OrderID FROM OrderEntry)

結果查出一筆來,假設是'DK09090001'好了,下一步就來看看訂單主檔裡正確的OrderId應是啥,再把它校正過來。SSMS裡有個很方便的功能,可以將查詢結果的欄位內容用滑鼠點選拖到編輯區檢視:

結果讓我有些詫異,VARCHAR欄位為什麼後面會有多餘的空白? 在SQL Server裡,尾端的空白一律會被忽略才對? 而我在DK09090001 前後補上指令,寫成SELECT LEN('DK09090001 ')得到的結果是10,研究了一下,依LEN的定義,尾端空白不計入長度,這麼說來,最後一位是空白沒錯。

雖然很狐疑為什麼尾端空白會被保留下來(SQL有蟲蟲?),我下了一個UPDATE OrderEntry SET OrderId = RTRIM(OrderId),心想就算有Bug,來個全面消毒,有病治病,沒病強身總沒錯吧?

執行完畢,重跑一開始的比對查詢,卻發現OrderId還是對不上。怎麼會有無法RTRIM掉的空白? 反覆做了好幾次(其實這有失理智,SQL語法做一次不成功,做一百次也不會成功的,當然,阿飄月期間或許會有例外),還是無法解除這個怪異的狀況。

冷靜下來,我想到 "會不會結尾其實不是空白,所以無法被RTRIM"?

一個指令讓真相大白:

原來,OrderId最後一個字元是0xoa的換行符號,無法被RTRIM掉是合理的,而VARCHAR不保留尾端空白的鐵律也沒有任何例外。之前被呼嚨了這麼久,關鍵在於SSMS查詢介面UI裡特殊字元被轉成了空白處理,所以拖拉欄位值到編輯區的動作並沒有確實反映欄位真正的內容。

茶包已滅,收隊回家。

MEMO-產生Excel資料INSERT SQL指令檔

[註: MEMO是備忘系列文件]

在我的經驗裡,SQL Server Import Data Wizard在匯入Excel資料時,常有些資料型別、語系轉換的瑣雜問題,搞下來,與其花時間排除這些茶包、茶葉、茶梗,還不如自己寫Code比較快。

以下是我今天寫的一小段VBA Code,可以由第一欄取出欄位名稱,然後找出各欄最大長度作為NVARCHAR(n)的依據,然後再產生INSRT INTO的Script。

貼文一篇以為備忘。

Sub GenInsertScript()
    Dim iColCount As Integer, iRowCount As Integer
    Dim I As Integer, J As Integer, K As Integer
    Dim sColNames(1024) As String, iColMaxLen(1024) As Integer
    With ActiveSheet
        I = 1
        While .Cells(1, I) <> ""
            sColNames(I) = .Cells(1, I)
            iColCount = I
            I = I + 1
        Wend
        I = 2
        'Find max length for every column
        While .Cells(I, 1) <> ""
            For J = 1 To iColCount
                K = Len(.Cells(I, J))
                If (K > iColMaxLen(J)) Then iColMaxLen(J) = K
            Next J
            iRowCount = I
            I = I + 1
        Wend
        Dim sTableName As String
        sTableName = "RawData"
        'Generate script
        Open "C:\Temp\Import.sql" For Output As #1
        Print #1, "CREATE TABLE " & sTableName & " ("
        For I = 1 To iColCount
            If (I > 1) Then Print #1, ",";
            Print #1, sColNames(I) & " NVARCHAR(" & iColMaxLen(I) & ")"
        Next I
        Print #1, ")"
        For I = 2 To iRowCount
            Print #1, "INSERT INTO " & sTableName & " VALUES (";
            For J = 1 To iColCount
                If (J > 1) Then Print #1, ",";
                Print #1, "'" & Replace(.Cells(I, J), "'", "''") & "'";
            Next J
            Print #1, ")"
        Next I
        Close #1
    End With
End Sub
Tech Days 2009 筆記 (三) 下集

【ASP.NET 4.0】

ASP.NET發展史:

  1. 2002/1/16 ASP.NET 1.0
  2. 2003/4/24 ASP.NET 1.1(主要是穩定度改善)
  3. 2005/11/7 ASP.NET 2.0 (大改版 MasterPage, Theme, Skin, Web Part, Membership, Login, Navigation…)
  4. 2007/11/19 ASP.NET 3.5 (AJAX內建、LINQ)
  5. 2008/8/11 ASP.NET 3.5 SP1 (DynamicData,  Entity Framework, AJAX Enhancement: Script Combining/History)

ASP.NET 4.0中的WebForm改變:

  • SEO(Search Engine Optimization),以往要自己加Tag<meta name="keywords/description"...>,現在物件支援Page.MetaKeywords = “…”
  • 支援自訂ViewState, ClientID
    過去只能用EnableViewState=”false”,而AJAX/MVC幾乎不用ViewState,所以有更簡單的宣告方法,PlaceHolder ViewStateMode=”Disabled”,容器內的WebControl就通通停用ViewState。
  • Web.config最少化,預設只剩不到10行東西。
  • ClientIDMode = “Static”可以直接指定,AutoID(過去),Predictable配合ClientIDRowSuffix=”欄位名稱"(註: 好像只能控制最後一段,Scripting時要找ElementId還是不太方便)  [延伸閱讀]
  • Snippet Everywhere: HTML, JS, …

<DEMO>打tb 按Tab 出現<asp:TextBox … req 按Tab 自動插入RequiredFieldValidation,對於愛用手工Coding不拖拉的人來說,方便許多。

ASP.NET AJAX 4.0

ASP.NET MVC

  • 適用大型應用程式
  • 參考RUN!PC、其他場次

ASP.NET Dynamic Data

  • GridView, FormView, DetailsView與DB相依嚴重,欄位一變了UI就要修改
  • 雖有Template機制,但與DB仍相依嚴重
  • 以同一個模版處理不同的資料表,方法類似昨天的SL3 DataAnnotation展示(由欄位自動產生頁面) [註: 老話一句,若UI要高度客製化時就不會像Demo Case這麼輕鬆愉快]

[... 此刻,大會堂搖滾區居然傳出打呼聲 ...】

Url Routing

  • 搞出REST風格的URL
  • Global.asax: Routing.RouteTable.Routes.Add(…)

4.0 WebControl Support Dynamic Data

  • Add Reference to System.Web.DynamicData, System.ComponentModel.DataAnnotation
  • Control.EnableDynamicData(…)
  • Tips: 資料欄位屬性註解放在metadata partial class, 以免重Generate LINQ to SQL Class時被Overwrite

【IE8相關程式設計】

IE8新服務: Search Provider, Web Slice, Accelerator,做一個可依QueryString查詢資料的ASPX:

  • Search Provider: 自訂一個Search Provider定義檔,再註冊即可
  • WebSlice: 改裝一下網頁Tag
  • Accelerator: 多自訂一個Accelerator定義檔即可

Search Provider:

  • 範例: 證券公司查股票代號、DVD租片查詢
  • 設定檔:
    Keywords: OpenSearchDescription, window.external.IsSearchProviderInstalled, window.external.AddSearchProvider
  • 搜尋建議: 傳回XML,直接在搜尋輸入關鍵字輸入欄位下方顯示
    Keywords: SearchSuggestion
  • 預覽查詢: 像Accelerator一樣,可以選取網頁文字按右鍵就直接檢視
    Keywords: ie:PreviewUrl

[坐在音控桌旁,音控大哥趴在桌上呼呼大睡。我想可能這種音控Case實在太過小兒科,依行規,若不能展現"睡著也能控"的雍容,就會有辱專業,說不定還無法加入同業公會~~~]

<DEMO> ListView做KTV歌曲查詢,AJAX Hover Menu

WebSlice:

  • 指定特定class: hslice, id, entry-title, entry-content, ttl, feedurl, endtime
  • 改裝過的網頁在瀏覽時Toolbar會出現綠色符號,元素onhover時也會顯示
  • 可以設定訂閱多久更新一次資訊
  • 身份認證: Cookie, HTTPS+基本驗證, HTTP+摘要驗證, HTTPS+摘要驗證。IE8介面有地方可以輸入WebSlice要用的登入帳號

【VS2008 IDE Tips and Tricks】

    1. 工具/選項/國際設定/語系: 一台機器上同時跑中、英文版Visual Studio
    2. Line Number: 選項/文字編輯器
    3. 選取時的反白顏色: 環境/字型與顏色
    4. ToolTip字太小?: 環境/字型與顏色/Editor Tooltip
    5. Editor視窗分割: 將檔名Tab拖拉到目前的編輯視窗,選擇要垂直或水平分割同時顯示,二視窗就會分割顯示。還原時將Tab拖回其他Tab旁 。
    6. 全螢幕模式: Shift-Alt-Enter
    7. Virtual Space: TextEditor/All Languages: Settings/Enable Virtual Space。向下移時,不管下方列文字長度,可以移至同一欄正下方。
    8. Block Select: 即UltraEditor Column Mode選取模式, 那種選取某一欄右方的部分的概念。(滑鼠選取時按Alt, KBD: Alt-Shft-方向鍵)
    9. Word Select: Ctrl-Shift-方向鍵
    10. Incremental Search: Ctrl-I,逐一輸入字母,F3->下一筆,Shift-F3->上一筆
    11. Clipboard Ring: Ctrl-Shift-V 可以一直循環前幾次Copy的內容
    12. Visual Studio啟始頁: Environment/Startup: Start Page news channel, 啟動頁的RSS URL
    13. 複製檔案路徑: 在Tab上按右鍵選 複製路徑、開啟收納資料夾
    14. 開啟檔案所在位置資料夾: 在Solution Explorer找到Folder,按右鍵"在檔案總管中開啟資料夾" (Open Folder in Windows Explorer)
    15. 建立可抛式專案: Tools/Option/Project/General, Save new project when create 。如此專案會建在暫存區,不會生出一堆檔案來。
    16. 加入垂直Guides: Regedit HKCU\Software\Microsoft\VisualStudio\9.0\TextEditor\Guides: String=RGB(255,0,0) 10,20,30,40,50,60,產生六道垂直直線
    17. 格線及標尺: Tools/Options/Html Designer/Ruler and Grids 設完後,還要View/Show Ruler, Show Grid
    18. Code Snippets到Toolbox: Source View時,顯示工具箱,選取文字內容拖到工具箱
    19. 以Tab Tab加入Code Snippets: 輸入for,按兩次Tab,帶出程式片段後,再按一次Tab會再到可輸入修改的部分。ex: ctor(預設建構式), prop(屬性實作)
    20. Breakpoint: 條件式中斷(設Condition),符合某條件時才中斷。
    21. Registry: HKCU/…./VisualStudio/9.0/UseMRUDocOrdering=1,點選到的文件Tab永遠在第一個位置。
    22. 編輯VS的專案檔案: Unload Project->直接在IDE編輯.csproj->Reload Project
    23. 自動Using: 輸入某個沒有using Namespace的Class Name,Ctrl + "." -> 列出其Namespace,按Enter就自動加上
    24. Registry: HKCU/…./VisualStudio/9.0/Find/Find result format,去除查詢結果中又臭又長的部分,例如: 不要顯示完整路徑
    25. 動態快速縮放: Options/Environment/Keyboard 搜尋Macros-> Macro.Samples.Accessibility.IncreseTextEditorFontSize 設成Ctrl-Alt-Shift-Up,縮小設成Ctrl-Alt-Shift-Down
    26. 插入新行: 向上/向下增加空白列 Ctrl-Enter(插入上方列), Ctrl-Shift-Enter(插入下方列)
    27. 格式化文件: 重新排版XML使其變得好看,先按Ctrl-K再按Ctrl-D
    28. Solution Explore上方的尋找關鍵字方格輸入>File.OpenFile web.config  --> 快速開啟不知放在哪裡的檔案

[註: XML Validator跳過未講,屆時請看投影片]

Tech Days 2009 筆記 (三) 上集

【SQL Execution Plan】

關心執行計畫的時機:

  • CPU異常飆高,持續在100%高檔完全掉不下來
  • 效能不佳,想了解指令執行的作業過程

select * from master.dbo.sysprocesses <-- 找出最忙的SPID
dbcc inputbuffer(SPID) <-- 查出有問題的指令是什麼?
[註: 若SSMS Activity Monitor還可以用,則用GUI查更方便]

<DEMO> 90萬筆對300筆基本資料,ORDER BY 1 -> 13秒,無ORDER BY 1秒,看執行計劃。[註: 展示時用的好像是電信業者的真實資料(有出現"門號"、"申裝書類別"、"銷售點代號"字樣),Query Result Grid一直被小心地遮起來,雖然講師一直強調這是"學員資料",嘿...] 示範用SSMS Include Actual Execution Plan功能,突顯Sort佔了73%成本。

Display Estimated Execution Plan –> 實際執行可能要30分鐘,可以先預測取得執行計劃。

改善Execution Plan:

  • 效率: Index Seek > Index Scan > Table Scan (一般原則,非絕對)
  • 減少Bookmark(RID or KEY) lookups使用(少用IN)
  • SSMS檢視Estimated Execution Plan時就可以提示Missing Index

工具: Database Engine Tuning Advisor,自動找出某個查詢的瓶頸所在,並提供修改建議。

Notes: 對大型資料表建立INDEX會造成資料暫時無法存取,在Production環境中不可以亂來。

Execution Plan的取得: SSMS圖形顯示(按右鍵可以匯出XML)、SET SHOWPLAN_TEXT ON、SET SHOWPLAN_XML ON(在SSMS裡點擊該XML內容會以圖形方式顯示)。SQL 2008有Programmability/Plan Guides可以用來保存Execution Plan。Keywords: sp_create_plan_guide

Tips: SELECT ... FROM ... WHERE ... OPTION(USE PLAN N'<ShowPlanXML …. >’) 強迫使用某個執行計畫。OPTION (LOOP JOIN), OPTION(MERGE JOIN), OPTION(HASH JOIN) 一般來說SQL最佳化的結果真的都已是"最佳",不太需要另外加提示,除非是用來測試,或是真遇上罕見的異常特例。

TABLE HINT: WITH (NOLOCK), WITH (READPAST) <--正在修改中的不要讀,還提到了Snapshot Isolation

意外收獲: 學會在XML Attribute裡怎麼標示\r\n? --> #xd#xa

【SQL Injection防禦】

2007 OWAST Top 10:

    1. XSS
    2. Injection Flaw: SQL Injection, Command Injection
    3. Malicious File Execution: 放檔案到Web上執行
    4. Insecure Directory Object Reference: 例如: 當年的../../../boot.ini
    5. CSRF
    6. Information Leakage and Improper Error Handling: 例如: 錯誤訊息透漏敏感資訊
    7. 連線管理不當
    8. Insecure Cryptographic Storage
    9. Insecure Communication
    10. Failure to Restrict URL Access

資安CIA: Confidentiality/Integarity/Availability,費用、風險、效能間的平衡

資安需求: Identification, Authentication, Authorization, Confidentiality, Integarity, Non-Repudiation

國內最早: 91/4/23刑事警察局公告國內九成以上網頁使用SQL指令型資料庫,測試證明九成以上有SQL Injection漏洞(註: 好奇這統計是怎麼做出來的)。SQL Injection的主要問題在於輸入資料沒有做適當的驗證,而Error訊息的不當顯示會讓Hacker在Try-And-Error過程中得到更多珍貴資訊,增加被成功入侵的機率。另,有一項統計是上線後再補漏洞,成本會增加50倍。

範例: 利用登入畫面 得知資料表名稱、DROP TABLE、xp_cmdshell(Web用sa連SQL的人活該)

Tips:

  • 過瀘掉不該出現的—, '等符號
  • 過瀘輸入資料出現的隱含的SQL指令,如INSERT、SELECT、UPDATE... (註: 呃,這方法好像有點看到黑影就開槍,請小心使用)
  • 錯誤訊息不要透露太多細節給End-User
    (笑話一則: NT4.0時代,Web出現"CPU過熱錯誤"訊息,叫來硬體工程師,結果發現是Web Developer設計在Requset數太多時導至該自訂訊息網頁)
  • 縮小連線帳戶的權限,別再用sa了 (講師說他遇到的網站,絕大多數仍在用sa或dbo,比我想得嚴重多了)
  • 全面檢視軟體程式碼(Review Source Code)
  • 不要用預設路徑,例如: c:\inetpub\wwwroot\,這樣至少不要被低階攻擊工具猜中
  • 繪製流程示意圖,掌握程式用到哪些元件、如何溝通,找出可能發生漏洞的點。
  • 用最小權限執行程式
  • 用On Error Resume Next + If Err.Number <> 0 Then自行處理錯誤<-- (註: 用ASP舉例讓我有點意外,說不定這是因應實務界的需求,哈!)
  • 把不用且功能強大的Stored Procedure移除(註: 新版的DB多半預設都不啟用了)
  • web.config customError = “On”
  • 自己輸入超過256個字元檢測Buffer Overflow(註: 我覺得這點放在ASP/ASPX時有爭議)
  • Strong Password, 定期改密碼
  • Windows Update 少不了
  • 監控系統運作狀況: Network Device、OS、Server

工具:

  • 弱點掃描軟體
  • Microsoft Baseline Security Analyzer
  • 源碼檢查: Fortify Source Code Analysis, Acunetix Web Vulnerability Scanner, CodeScure Enterprise
  • Web Application Firewall: MS UAG, Fortinet FortiWeb, Radware Appwall (註: 沒提到阿碼? SmartWAF還不算咖嗎?)

案例: [註: 這部分又挑起我的駭客熱血,很有興趣多瞭解一些,可惜只有兩三句就跳過去了]

  • 學生入侵學校主機(SQL Injection)盜取資料
  • Hacker集團入侵公司主機盜取學生資料販賣(SQL Injection, Zero Day) (註: 嘿,Hacker用的技巧果然比學生多)
  • 兩名學生入侵數十台學校、企業主機 with XSS, Cookie, SQL Injection,受害單位損失近億

工商服務時間:

  • Forefont Threat Management Gateway
  • Forefront Unified Access Gateway, UAG
    #號稱可以防止員工上班時間種菜、開餐廳
    #UAG as WAF(Web Application Firewall)
    #用戶端健康檢查
    #監控機制
    #使用網頁時會跳出登入程序,可結合SmartCard
    #可用來發佈應用程式
    #DirectAccess整合(原本只適用Windows 7 & Win2008 R2,加掛後就可以讓舊OS也支援)
    #Load Balance

<DEMO>用UAG防護SQL Injection(果然示範網站用的是ASP),在不改程式的前題下可以產生攔阻惡意Request的效果

【延伸閱讀】ASP.NET防駭指南你的網站在裸奔嗎?游擊式的SQL Injection攻擊 

 

Tech Days 2009 筆記 (二) 下集

【題外話】發現我的T43在安裝Windows 7後,電池100%時顯示的可用時間比Vista/Windows 2003時期長,以往最多到2hr15min左右,現在居然出現了超過3hr的預估,當然使用情境不同,比較出來的結果沒什麼公信力,不過我今天還是記下數字做為參考。(測試期間LCD背光切到最暗、關閉Wireless及Bluetooth、只開啟Live Writer打字抄筆記)

【IIS7管理部署大量網站】

* 13:30 80% 2hr 53min
* 14:00 65% 2hr 14min
* 14:40 46% 1hr 36min

台灣流量排行榜: Yahoo, 無名, MSN, Yam.... 世界排名前50大的網站幾乎很少走MS,分析: MS少了一些東西,例如: Front-End Cache, Application Cache(Database掛掉的時候可以因應),而LAMP方面的Solution比較多。

MS Web Farm小組開始在這方面下了些功夫: 例如SEO Toolkit,長遠目標是想讓IIS也可用來構築大型網站。IIS用來架構大型網站的幾個法寶:

  • 共用設定: 設定放在UNC,可一口氣改掉全部機器的設定,支援全部的IS工具及API
  • Web Deployment Tool: 還是RC版,可複製IIS設定、內容、SSL憑證、GAC、COM+
  • Application Request Router(ARR): 彈性地將前端流量引導到伺服器上。NLB是Layer2的技術,不管Web死活,因此實務上還是會買貴森森的HW Load Balance。ARR是IIS7的一個Module,有Layer7 Load Balance的效果。

Web Deployment Tool可以將整個網站內容、設定做成一個ZIP,方便部署。(IIS管理員、VS2010支援)

共用設定: 支援Staging、Rollback。Rolling Update: 先把部分Server下線更新,完成後再上線。

<DEMO>用共用設定建立Web Farm

IIS7管理員可以管理共用設定,先將一台IIS設定匯出到Shared Folder(要指定連線到該Shared Folder的身份,由於WebFarm環境中可能沒有AD,可用兩台開同一帳號設相同密碼的方式解決),設定檔案會有加密保護。

另一台啟用共用設定後,IIS相關設定會加進來,但路徑下是空的,ASPX content要自行以xcopy複製...

(... 原本預定使用的大台伺服器不乖罷工,臨時調用的NB則不斷丟出茶包騷擾,最後研判是第二台Web的IIS安裝有問題,事件檢視器還出現inetsrv\compdyn.dll無法下載的怪訊息,搞得茶包射手手癢到想衝上台 ...)

接著提到了Web Platform Installer,之前為了安裝SQL 2008 Express時知道有這個好工具,還在等檔期在本站PO文介紹,沒想到課堂中提及,此處就一併說明簡單帶過。原則上Web Platform Installer是個方便的網站安裝工具,可以用它來安裝網站常用的模組元件,且不限MS的產品,如: 它還可以用來安裝PHP、DotNetNuke、WordPress、BlogEngine... 等等,十分方便。(但有例外,如MySQL因授權的關係,必須自行手動安裝)

另外,IIS管理員製作安裝用的Package檔案,而Web Development Tool可以協助管控版本,例如: 套用某一版程式時,除了加入新增的檔案,該移除的檔案也會一併刪除。

ARR安裝完,IIS管理員會出現一個Server Farms的Folder,加入Farm成員伺服器,連至該台主機的Request會被導引到後方的機器,有Reverse Proxy的味道。而其支援Response Time監控決定流量導引、Server Affinity(偷偷加入Cookie方式讓某個Client固定都連到同一台機器)

ARR v2的新功能: Cache Proxy,在台灣網站只裝ARR,把美國網站的內容Cache過來。

【Silverlight 3】

* 15:10 50% 1hr 39min
* 16:20 18% 41min
* 16:50 10% 22min

引言出其意料地提到ActiveDocument這個老古董,果然在場沒有幾個人聽過(有聽過應該都上了年紀,現在都在當主管所以沒來),另外也講到Javascript的學習門檻、Cross-Browser Issue,算是突顯了Silverlight的切入角度。

目前Web應用架構上,前端可區分成走AJAX或Silverlight兩塊,而後端則有ASPX、Web Service、WCF、RIA Service等選擇。若以AJAX與SL相比,SL強調可直接沿用CLR的開發背景、操作流暢性高、易於開發及偵錯(有華麗的Visual Studio加持就是不同呀!)

SL3支援IE, Firefox, Safari, Mobile Device版本(還沒看到...) [註: 平台方面已有Mac版,但Linux版只靠社群支援好像有點弱掉]

SL3協同開發打的如意算盤是視覺設計師用Expression Blend 3,程式人員用Visual Studio。不過我的經驗程式開發人員還是蠻需要Blend3的,甚至有些簡單的程式在Blend3裡就可以做完,減少在兩個開發環境交互切換的困擾。另,講師建議,雖然Blend3與VS2008可以共享同一組project檔案,但還是在VS建立專案比較好。

開發提醒: Blend不支援除錯、錯誤訊息較不明確、避免Blend3與VS2008同時修改同一檔案、要設x:Name後才可由程式存取、偵錯前要Build。

<DEMO> 建立第一個SL專案HelloWorld,TextBox/Button/TextBlock

<DEMO> 展示SL3新功能囉!

  • 3D透視: Transform/Projection X, Y, Z軸,還可以搭配時間軸做連續撥放。例: 按鈕後翻轉,先建立腳本、建立畫面格,設定各畫面的屬性值不同,就可以形成動畫。接著在按鈕click事件storyboardX.Begin()
  • 陰影效果: Appearance/Effect/Add
  • 資料驗證: 與上午做法不同,為登入UI建一個自訂物作,在Property set 時用Regex檢查,驗證不過throw new ArgumentExceptoin(“….”)。將TextBox Bind到該屬性。
  • Control有ValidationStatus,可以指定Binding出現錯誤時的顯示外觀。

<DEMO> SL/Javascript整合:

加[ScriptableMember]可以讓SL Method被JS端呼叫,記得要HtmlPage.RegisterScriptableObject,前端call slObject.content.registedName;另外,JS也可以在SL物件上加掛JS端事件,由SL裡的程式觸發。而HtmlPage.Window.Invoke()則可由SL呼叫JS端函數。

* WCF Duplex服務: PollingDuplexHttpBinding、CallbackContract(當WCF做完時反過來Call SL)

* OOB Keywords: IsRunningOutOfBrower, NetworkInterface.GetIsNetowkrAvailable(), ChekcAndDownloadUpdateAsync()

【Windows 7 Security】

* 16:55 36% 1hr 16min
* 17:35 17% 38min
* 17:55 7% 15min

Vista比XP安全,但Overhead影響了操作感受,Windows 7以Vista為基礎,目標在維持相同安全性的前題下,改善效能。

  • Vista基礎: DEP, ASLR(核心記憶體位置動態跑來跑去,各版本不同,避免被Hacker鎖定)、核心修改保護、安全開發生命週期程序、Windows服務安全強化
  • UAC: File與Registry虛擬化解決方案
  • 進階稽核: XML基礎,勾一下就好,不用一個個物件去設

UAC挑戰: Beta版程式會偷偷記錄下操作過程的點選次數、遇到Prompt次數等,將結果送回MS分析統計(Beta版授權同意書裡有提到同意蒐集這些程序,但應該沒人仔細看,對吧?) Windows 7已大幅減少操作被中斷的次數。

Windows 7 UAC –> 可由行動中心進入,預設由滑鼠點選引發的權限請求不過問,只有由程式觸發的才會問,另外原先桌面變黑頓一下防止時間差攻擊的程序也修改了(這個被罵很凶)。控制台中大幅減少要動用到盾牌(需升權限)的機會。

傳統稽核時除了開啟稽核功能外,還要一一設定標的物才會生效。【全域物件存取稽核】--> 可以追蹤某個特定帳號對本機檔案或登錄(Registry)的存取,不限物件對象。懷疑內情不單純時,可以設稽核Everyone。

  • 網路安全: 多重家庭防火牆設定、DNSSec(DNS記錄要簽章)、以原則為基礎分割網路,隔離危險。
  • 網路存取保護(NAP)-限定只有健康的機器可以存取企業資料,不健康機器要修補後才能存取。NPS檢查Client有沒有防毒、Patch有沒有上到最新,如果沒有,就主動派送。
  • Direct Access: Internet一接通,就跟公司連通

<DEMO> Network Access Portection Service一被停掉,就連不上Server的Shared Folder

Direct Access: 觀念由"以建築物定義邊界"改成"網路跟著使用者走"。讓User跟公司永壤保持暢通,但安全性是優先考量: 預設加密、與Smartcard結合、存取控制很細、與現有邊界/健康檢測及存取原則共存。不用撥號登入VPN,比VPN更方便使用,公司群組原則也可以管到在遠端的電腦。
[Direct Access還是可限制某些資源只有在公司內可以存取。]

IPv6極度強調安全,但與IPv4如何相容? 解決方案: Native IPv6, 6to4(對映), Teredo, IP-HTTPS(最後一步,效能不佳待努力)
Keywords: Tunnel over IPv4, Encrypted IPSec + ESP

保護使用者: AppLocker、IE8、資料復原

應用程式管控(AppLocker): 可Block發行者、程式名稱、路徑(一換位置就沒效,無三小路用)、版本檔案Hash(舊做法,要每個版本都鎖定),還可以設例外(重要,不然IT自己怎麼用?)

IE8: Google背後蒐集查詢結果點選資訊以求改善命中率,"IE8為了大家的隱私,可以選擇把它擋下來"(大家笑很大聲)

Keywords: RMS, EFS, BitLocker

【題外話結論】由電池使用數字來看,顯示的預估可用時間都蠻準的,應該可以下一個結論: Windows 7讓我的NB電池續航時間由2hr15min延長到3hr以上,確實比較省電。

Tech Days 2009 筆記 (二) 上集

今天帶了NB,理由是上完一天課,回家還要連夜整理筆記實在需要過人的意志力,而本人小時候並沒有養成到溪邊看小魚逆游的習慣... 只好偷懶直接在現場用NB寫筆記。

【Silverlight 3】

8:50開始對很多人來說好像很有挑戰性,一開場時人數少得可憐,害我懷疑走錯場子到了中國通史或高等微積分教室...

企業系統的可能解決方案: Thick Clients, Smart Clients, Thin Clients,各有優劣。而Thin Client仍存在一些問題,例如: 無法離線作業、互動性不夠強、涉及技術廣泛導致開發不易等。

理想RIA應具備的條件: 部署容易、SOA、容易開發、跨平台、操作互動順暢、可離線使用...

以上引出了本堂的主題: Business Application Template,試圖提供一套以Silverlight為基準的網站樣版,其中內建如 頁籤功能、登入機制...等,讓Developer能更容易入門。

<DEMO> 主要Scenario是建立一個連絡人清單的CRUD範例: AddressBook.mdf –> Linq to SQL Model –> .NET RIA Service(DomainDataSource,記得要勾自動產生SL端的Proxy Class),以下是幾個重點提示:

  • Activity Control: LoadingData事件時設IsActive = true,LoadedData時設false,就可以在載入過程顯示"載入中的捲動進度條"
  • DataPager Control: 跟DataGrid設定同一個DDS(DomainDataSource)就自動產生分頁效果。(有沒有這麼省事呀?)
  • 將Client端的編輯結果更新回去: DataGrid裡就可以直接編輯數值,送出鈕裡只要寫DataGrid.CommitEdit(), DataContext.SubmitChanges()就能完成資料更新。(保安! 保安! Programmer可以爽成這樣嗎?)
  • DataForm Control: 由Linq to SQL物件資料自動長出簡單的編輯UI。
  • DataAnnotations: Display / Required / StrngLength / RegularExpression / Editable 等修飾字,讓自動生成的UI可以幫忙做驗證。
  • DataGrid.RowDetailsTemplate: 示範在DataGrid中直接顯示圖片。(小插曲是因為WebDev Server Port為亂數產生,得修改DB裡的URL。有點好奇,好像蠻多人都不愛將專案直接掛在IIS上開發。)
  • Chart Control: 跟DataGrid Bind到同一個DDS即可,切換時有淡入淡出特效、改數值Bar也會以動畫方式長高,很炫!
  • Element to Element Binding: 點Chart的某條Bar,會觸發DataGrid某一列變成被選取狀態,連帶DataForm也換成顯示該筆資料,完成三者間的連動。

OOB (Out of Browser) – 有API可以檢測連線/離線模式、網路卡連線狀況等。基本運用方式是在Project Property Page啟用OOB,從Browser在SL上按右鍵可以選擇將程式安裝到該台電腦上。OOB修改存檔時,依網路狀況決定要寫到本機( IsolatedStorageFile ) 或是存回Server端。

另外,SL3也開始支援Multi-Touch,Keywords: Touch.FrameReported, e.GetTouchPoints()…
[董老師的開發心得: Multi-Touch LCD普及後,五十肩可能也會變成電腦使用者的職業病之一。我建議美國大聯盟現在就明文禁止投手使用支援Multi-Touch的LCD及程式!]

PS: 終於聽到Silverlight研討會有敲中我心中的甜蜜點,畢竟播播影片、轉轉圖片無法讓我糊口呀~~~

【Windows Azure Platform】

Public Cloud目前仍在快速變化中,大家對Cloud尚未有明確一致的定義。Azure雖然今年10月會開始營運,但應該還會大幅改變。

Windows Azure Platform包含: Windows Azure, .NET Serices, SQL Azure, Live Services(可能被除名,因為比較偏一般使用者)

Windows Azure: Windows Server online(註: 多少有點Web Hosting的味道吧?), 支援.NET, unmanaged, PHP,將來可能會支援Java(咦? 何必?) 。Application被拆成Web Role與Worker Role(指較龐大,批次型作業),每個Instance是一個VM,由Windows Azure Fabaric Controller監控及動態調配,其中核心的技術便是Hyper-V。每個Instance會對到一個VM,綁在一個CPU Core上。

VS2008開發時,Azure專案裡會建出WebRole(就是ASP.NET Application)及WorkerRole,而目前己可直接在Local Machine上模擬,這點算是領先Google。(Developement Fabric可以觀察Instance執行狀況)

目前每個Live帳號可以申請在Azure上放一個專案,WebRole, WorkerRole Instance數不能超過兩個,使用windows.azure.com的介面就可以上傳部署(粉久,要五分鐘以上...)。

機房維運成本的例子: Google的機房的客製規格Server損壞時是用機器人抽換,可是成本仍太高,後來再換成壤了先不管,每個月再固定派人推車去回收,企業自行經營機房的成本自然不能與這種經濟規模相比。

關聯式資料庫的設計初衷並不是針對要Scale Out成極大規模的情境,當企業想要做Facebook這種應用時,肯定無法滿足。

Windows Azure儲存: Blobs-簡易階層二進位資料、Tables: 有Entitiy觀念的階層資料、Queue-多用於WebRole, WorkerRole間溝通。

Tables並不是傳統RDBS的Table, Container包含多個Table,Table包含多個Entity(XML),而有兩個參數: Partition Key哪一個Storage, Row Key哪一筆。

GuestBook範例: 用到三種資料儲存,圖片-Blob, 留言-Tables (Open Source工具: Azure Storage Explorer,可以看到Blob, Table, Queue)

Azure Storage只能以REST存取,沒有ADO.NET、沒有LINQ,不能JOIN,但這就是追求Scale Out要付出的代價,Developer必須學習不同的設計模式。

例子: 資料Sorting,將排序工作拆解成多部分,分給多個WorkerRole Instance多工執行。換句話說,程式要特別設計過,才能善用Azure的優勢。而許多單機可以做的事在Azure中是不允許的,例如: 存取本機檔案,這會破壞Scale Out(就像避用Session一樣道理)。

Azure Service可否移到客戶機房? 有可能,但目前沒有計劃。

適用Azure的情境: 網路新創公司、ISV(SaaS、.NET可直接移植)、企業用戶(無資料隱私Issue時)。不是所有情境都適合,有相當比例仍應維持Software的模式。(黑註: 我想Google則應該會義無反顧大推Cloud,公司專精領域使然)

其他Pubic Cloud Platform: Amazon Web Services(台灣沒有分公司), Google AppEngine(Java/Python,500萬次PageView以下免費,但SLA中沒有Downtime保證), SalesForce.com(Apex定義語言開發,但較限制於CRM應用)

SQL Services改名為SQL Azure Database,就是SQL 2008虛擬化放在MS機房。今年5月才推出,考量某些作業性質不適合雲端特性,所以有一狗票的Procedure/功能無法使用,不能直接使用SSMS管理(將來可能會有SQL Azure專屬的GUI管理程式"Huron?”,SSMS現階段雖不能管理,但能用來做Query),目前只能先用SQL Azure Migration Tool頂著先。(可產生SQL Azure可支援的SQL Script)

.NET Services – 9/18 MS宣告10月CTP要做重大改版(由WS改為REST)... 所以今天講的是舊的
2007 BizTalk Service -> 2008 .NET Services –> 2009 Workflow被移除了,命運多舛~~~
功能: Service Registration(A, B, C都註冊,A送訊息, B/C會收到)、跨公司做資料交換、穿防火牆交換資料

Tech Days 2009 筆記(一)

上午留在公司趕進度,結果錯過了KeyNote。一點半才勿勿趕到,沒午休的結果,周公一直在旁邊亂,吵著要找人下棋。幸好我一路摒息運氣、意守丹田,不然這篇筆記可能要改貼棋譜~~~ orz

【Excel 2007的花式應用】

課程重點在介紹Excel 2007一些頗具特色但可能被忽略的新功能。

講師示範了用ODC檔案設定資料來源,讓Excel直接由資料庫查資料回來做報表,當然少不了要介紹酷炫的條件格式化、自動表格Style等。當資料來源為XML,則可先透過XSD定義指定欄位及配罝,接著就可將XML資料轉為報表。還學到一招,使用外部資料源時,可以用[ColumnName]表示欄位內容用來形成運算式,挺方便的。

另外還有個Excel增益集的展示,透過VS2008開啟增益集專案,可以讓Excel 2007多一個自訂Ribbon,放入Button,實作Click事件就可以客製出活在Excel中的Application。隨手記幾個關鍵字:

  • Globals.ThisAddIn.Application.Workbooks.Open() 開啟xls
  • GetVstoObject() 取得COM+物件對應成的.NET物件
  • DataSet.GetXml()  DataSet轉XML

課程的另外一個重點是OOXml(Office Open XML),這個恰巧在之前的文章有提過,好處及相關資源不再贅述。

【ASP.NET MVC】

算是我第一次聽關於ASP.NET MVC的研討會。

MVC並不是要推翻WebForm,而是提供另一個選擇。MVC能很清楚地區別各段邏輯的所在位置,不太會再發生找不到程式碼放在哪裡的窘境,而此一優勢在專案愈龐大時愈發明顯;只是,少了WebControl,要搞MVC必須對HTML Tag有清楚的認識,然後要能觀念清楚地將程式碼安排在合適的地方。換句話說,ASP.NET MVC並不適合初學者。

課桯裡展示了建立一個MVC專案,設了一個DB,借重Linq to SQL以及VS2008 IDE操作上的精靈,很快就做出一個新增、修改、刪除的網頁介面,比我想像得還簡單。

而VS2008在開發MVC專案的過程則扮演了重要關鍵,方便程度則遠比我想像高出許多,例如: 一個Click就可依Linq to SQL物件的屬性自動產生編輯畫面(等於自動生成對應的HTML元素),Control則是能直接拿到對端填寫資料轉成的Linq資料物件,不需要自己動手。當客製需求不大時,幾乎寫沒幾行Code,就可以實作出新增/修改/刪除的網頁介面。

這堂課收獲頗多,算是對一直有心要接觸的ASP.NET MVC有了基本識,也比較有方向如何開始自己的第一個ASP.NET MVC專案。(如果有機會用到的話...)

【Sharepoint Designer無碼開發】

是的,本堂課強調的重點就在"無碼",利用現有的機制及工具,盡可能一行程式都不要寫,就做出電子表單或實用的資料維護介面。InfoPath提供了免寫程式,光靠設定就可以搞定的電子表單開發環境,結合Form Service,表單可以Web化,實際進行傳簽等操作。

Sharepoint Designer(SPD)方面則介紹了彈性超大的DataForm組件,可以結合SPS清單、SQL、OLEDB、RSS、SOAP、XML... 等來源, 將結果顯示出來。課程中有個列出城市名稱,配合"網頁組件連線",在按下城市名時,由網路公開的RSS取得天氣預報,而且"全程無碼"...

SPS工作流程對我來說算新東西,可指定一段操作(一樣用網頁UI設定,免寫Code)在資料新增、變更、選擇項目、手動等狀況下被觸發。其中示範了一個收件人郵件地址放在SPS清單裡,透過巧妙的工作流程連環觸發,將電子期刊送給清單上的每一個人。不過整個設計挺複雜的,如果目標只是單純要寄信,我可能還是會寫支C# Console或Windows Service解決吧!

以上是我今天的重點筆記,報告完畢!

Outlook 2007搜尋功能失效

不知什麼原因,Outlook 2007的搜尋功能忽然失效,不管是用關鍵字查主旨或本文,或是要找出來自某個寄件者的郵件,放大鏡Icon會轉半天,但最後搜尋結果清單空空如也。

Google了一下,比較常見的說法是在Office 2007之後安裝Office 2003元件所致(但我印象中並沒有安裝Office 2003的東西,但無法排除是否安裝某個軟體時被一併註冊),解決方案是修復或重裝。

查到另一篇討論,有人提及可透過重製索引解決,我試了以下的步驟:

先取消資料檔的索引設定(如下圖),關閉Outlook使其生效,再開啟Outlook重新測試查詢功能,就一切如常了!

之後再次啟用索引,查詢功能也是正常的,看來在索引重建後,問題即可排除。

以上經驗,提供大家參考!

輕量級的js檔打包解決方案

最近在嘗試將一個功能強大的jQuery Plugin【jqGrid】整到專案裡,它的功能與彈性讓人印象深刻(不過要上手得花點時間摸索),大家可以直接看線上展示,應該就能感受其威力。

jqGrid有個貼心的設計--將功能模組化。各模組的程式分散在多個js檔,有用到才需要載入,避免Client端載入肥大js只使用其中一丁點功能,白白浪費載入時間及頻寬。(剛好前些時候James Padolsey也提到這點,甚至覺得殺雞不必用牛刀,小功能或許自己寫會更有效率兼便練功)

jqGrid提供了兩種做法: 線上挑選模組後打包成單一js檔,或透過jquery.jqGrid.js動態載入。在開發階段我選擇了動態載入法,卻發現疑似因載入時間差的關係,Reload多次時,偶爾會出現js來不及載入而出錯,於是決定改回靜態include。結果在HTML檔出現很壯觀的景象:

當然,這是極度誇張的特例,但依過去的經驗裡,網頁用的plugin種類一多,先後include十來個js檔也是很平常的。這表示使用者開啟網頁的同時,還一併丟出十來個Request,每個Request都有傳輸與處理的Overhead,平白增加伺服器負擔。同時,用Copy And Paste的方式在每個網頁裡維護又臭又長的include清單,顯然也有違程式簡潔性並且不易修改。

於是,我想要改善這個問題。發噗提出想法後,不少噗友提供了很好的意見。市場上有些現成的解決方案,例如: YUI可以壓縮合併JS/CSS、Microsoft實驗室則有DOLOTO、另外還有些朋友習慣用MasterPage解決這個問題。

考量了一下,我理想中的合併下載工具應該透過單一ASPX網頁就能解決,在運用上會比引用MasterPage來得靈活一點(提供輔助工具會比改變網頁架構容易些,而且不侷限於ASPX,HTM、JS裡也可以引用),也有較大的組合彈性;至於DOLOTO,看起來很強大,但引用過程較繁瑣,且不確定jQuery裡的函數/Plugin被分割肢解+動態載入會不會出問題;至於YUI,好像比較傾向靜態合併,而且ASP.NET + jQuery外再多扯進來另一個Framework有點像在找其他同事麻煩,尤其是我只是想喝杯牛奶罷了。

評估程式邏輯並不複雜,決定立刻捲起袖子動手做,最壞只是損失一些工時。沒一會兒,JsLoader.aspx誕生了:

<%@ Page Language="C#" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Collections.Generic" %>
<script runat="server">
    private List<string> jsQueue = new List<string>();
    private Dictionary<string, string> jsPool = new Dictionary<string, string>();
    private string JS_SET_PREFIX = "JSS_";
    void Page_Load(object sender, EventArgs e)
    {
        string[] f = (Request["f"] ?? "")
            .Split(new char[] {',',';'}, StringSplitOptions.RemoveEmptyEntries);
        foreach (string jsFile in f)
            queueJs(jsFile);            
        Response.ContentType = "text/javascript";
        foreach (string js in jsQueue)
            Response.Write(jsPool[js]);
        Response.End();
    }
    private void queueJs(string jsFile) 
    {
        string[] p = jsFile.Split(new char[] {',',';'}, 
            StringSplitOptions.RemoveEmptyEntries);
        //if multi-part
        if (p.Length > 1)
        {
            foreach (string f in p)
                queueJs(f);
            return;
        }
        //lower case
        jsFile = jsFile.ToLower();
        //js set name without .js
        if (jsFile.EndsWith(".js"))
        {
            //if already queued
            if (jsPool.ContainsKey(jsFile)) return;
            //else put the js into queue
            jsQueue.Add(jsFile);
            jsPool.Add(jsFile, getJsContent(jsFile));
        }
        else //if set, try to find it from web.config
        {
            string jsFiles =
                System.Configuration.ConfigurationManager.AppSettings[
                    JS_SET_PREFIX + jsFile];
            if (string.IsNullOrEmpty(jsFiles))
            {
                jsQueue.Add(jsFile);
                jsPool.Add(jsFile,
                    string.Format("alert('JsLoader Error: [{0}] set not configured!');",
                    EscapeStringForJS(jsFile)));
            }
            else //process the predefined file list 
                queueJs(jsFiles); 
        }
    }
    //Get js file content
    private string getJsContent(string jsFile)
    {
        try
        {
            string file = Server.MapPath("./" + jsFile);
            if (!File.Exists(file))
                return string.Format("alert('JsLoader Error: [{0}] not found!');",
                    EscapeStringForJS(jsFile));
            else //Add cache/packing module here if you want
                return File.ReadAllText(file);
        }
        catch
        {
            throw new ApplicationException("Failed to process " + jsFile);
        }
    }
    /// <summary>
    /// Replace characters for Javscript string literals
    /// </summary>
    /// <param name="text">raw string</param>
    /// <returns>escaped string</returns>
    public static string EscapeStringForJS(string s)
    {
        return s.Replace(@"\", @"\\")
                .Replace("\b", @"\b")
                .Replace("\f", @"\f")
                .Replace("\n", @"\n")
                .Replace("\0", @"\0")
                .Replace("\r", @"\r")
                .Replace("\t", @"\t")
                .Replace("\v", @"\v")
                .Replace("'", @"\'")
                .Replace(@"""", @"\""");
    }    
</script>

JsLoader.aspx的工作原理很簡單,程式放在js同層目錄下,網頁裡寫成<script type="text/javascxript" src="/js/JsLoader.aspx?f=js1.js,js2.js"></script>就可以動態將js1.js與js2.js兩個檔案合併成一個傳回。而在getJsContent()裡,還可以加入Cache及壓縮js的機制(例如: 加參數就改成載入壓縮過的.min.js版本),讓效率更好一些。不過,我加入最重要的簡化是除了直接列出js檔名外,可在/js/web.config裡定義一些預設的"套件",這樣子就可以用JsLoader.aspx?f=jqgrid取代原本一長串js檔案清單,而多組"套件"也可以再組成一個"套餐"(如JSS_gridpage),如某幾個網頁有共同的js載入需求,可以只宣告一次,用在多個網頁上。檔案清單、套件、套餐三種方式可以視需要自由組合運用。

<?xml version="1.0"?>
<configuration>
  <appSettings>
    <!-- Use JSS_[JS Set Name], JS Set Name should be lower case -->
    <add key="JSS_jqgrid" 
value="jquery-ui-1.7.1.custom.min.js,i18n/grid.locale-tw.js,...略...,jqModal.js,jqDnR.js" />
    <add key="JSS_nummask" value="jquery.afaNumMask.js" />
    <add key="JSS_dyndatetime" value="jquery.dynDateTime.js,../css/calendar/calendar-tw.js"/>
    <add key="JSS_json2" value="json2.js"/>
    <add key="JSS_gridpage" value="jqgrid,json2,nummask,dyndatetime"/>
  </appSettings>
</configuration>

最後還是要講一下JsLoader.aspx的黑暗面,將多個js檔包在一起的做法,固然可減少Request次數,但js檔過於肥大,會讓載入時間變久,而Debug時js檔太大,Debugger處理起來效率不佳。過與不及都不是好事,尺度怎麼拿捏,大家見機行事吧!

PS: 順道推一下小喵介紹的dynDateTime Plugin,我從ASP時代就一直仰賴它的前身解決日期選擇問題,如今有了jQuery Plugin版本,自然要力挺到底了!!

Oracle Instant Client安裝

前幾天分享了Windows 7安裝Oracle Client的經驗,有網友提到了Oracle Instant Client,不過畢竟已是年老體衰之人,當然就沒有勤快到馬上去實地測試一下。

無奈,出來混,總是要還的。(誤)

今早Toad Freeware在啟動時出了狀況,只要一用Oracle 10.2 x86 Client連線就會Crash。氣憤之餘,在命運的作弄下剛好看見Toad的Installed Clients清單中有個"偽。Instant Client - 10.2.0.1.0",由路徑看起來應是Oracle 10.2g x64 Client被誤判:

這讓我心生改用Instant Client試試的念頭。想想,明明不想試,最後還是用上了,真是躲不掉的孽緣呀!

以下是我的安裝步驟:

  1. 先到OTN下載Oracle Instant Client,請依OS x86或x64決定要下載的檔案。
  2. 將檔案解在自選的目錄下。我裝在C:\Oracle\Ora10IC。
  3. 設定系統的PATH環境變數,加入C:\Oracle\Ora10IC。
  4. 【重要】比照PATH,另外設定TNS_ADMIN環境變數,指向TNSNAMES.ORA。
  5. 【重要】比照PATH,設定NLS_LANG環境變數,設定預設的語系。(不然查詢結果中文會變亂碼)

重新開啟Toad,Installed Clients清單會多出一個另一個"黑色"的Instant Client選項(路徑就是Ora10IC,另外會標示Home is valid)。選取這個火熱的新選項,因為已用TNS_ADMIN指向TNSNAMES.ORA,Database清單中便會出現預設設定過的DB名稱,其他就一切使用如常囉! 以上。

Windows 7安裝Oracle Client經驗分享

今天為了Demo需要,在ThinkPad T43 Windows 7 x86英文版上試裝Oracle Client。

這算是我第一次嚐試在Windows 7上安裝Oracle Client,期間遇到不少狀況,特別整理記錄一下,給有需要的人參考。

依之前Windows 2008 x64的經驗,不再奢望9.2Client可以跑,直接從10.2g版試起。

下載了10201_client_win32.zip,安裝過程出現"The procedure entry point GetProcessImageFileNameW could not be located in the dynamic link library PSAPI.DLL"的錯誤訊息:

安裝倒未因此訊息中斷,只是裝完試跑sqlplus.exe,立即彈出以下錯誤:

SP2-1503: 無法起始 Oracle 呼叫介面(Unable to initialize Oracle call interface.)
SP2-0152: ORACLE 可能運作不正常(ORACLE may not be functioning properly)

我發現Run As Administrator就能解決這個問題,而且不只sqlplus,其他3rd Party程式(如Toad)也得乖乖Run As Administrator才能順利透過Oracle 10.2g Client連上Oracle Database。輕易放棄UAC的保護不是我的作風,猜想新版的Oracle Client可能已有所改良,減少對管理者權限的依賴,於是決定挑戰一下11g Client。

下載win32_11gR1_client.zip並執行,但一開始安裝就遇到OS版本問題:

沒記錯的話,Windows 7的版號是6.1,換句話說,setup.exe只支援到Vista(6.0),這問題也許可以靠相相容模式來克服。

如上圖,調成Windows Vista (SP2),setup.exe就可以順利完成安裝,sqlplus也運作正常。

但晴天霹靂的是,Toad for Oracle Freeware Edition跟我抱怨它不支援11g Client。因此結論是,如果想跑Toad,就只能勉強讓蟾蜍當一下OS裡的國王走10.2g Client。再不然,11g Client安裝後內附了Oracle SQL Developer,感覺上也還堪用,但使用前要記得先下載安裝JDK

心得報告完畢!

【2009-09-15更新】感謝網友陸續提供了補充: 

  • 檢查OS版本的步驟是可以省略的
  • 利用Instant Client模式可簡化部署的手續(有空再來研究看看)
TIPS-開啟共享資料夾上的ASP.NET專案

手上還有些ASP.NET專案仍在使用ODP.NET 9207,而我的工作機目前是Windows 2008 x64,很遺憾,這兩個傢伙不來電。為了繼續維護這些專案,我的折衷做法是另外掛了VM跑Windows 2003,把需要ODP.NET 9207的專案利到VM上開發、執行。

這幾天嚐試了新做法,將VM的ASP.NET資料夾分享出來,以工作機的VS2008開啟,cs檔案編修、更新都OK,更新完成直接連VM的IIS測試倒也還算順手。但有個問題:

Could not load file or assembly 'Oracle.DataAccess, Version=9.2.0.700, Culture=neutral, PublicKeyToken=89b483f429c47342' or one of its dependencies. Failed to grant minimum permission requests. (Exception from HRESULT: 0x80131417)       

VS2008的錯誤訊息列出現上述訊息,而發生這個錯誤的結果是: 雖然可以編修cs檔,但無法Build Page或Build Web Site。由於VS2008無法編譯網頁程式,連帶就不認識ASPX中加入的Server Control,相關的Syntax檢查及Intellisense頓時失效,原本華麗的編輯環境因此退了色~~ 這不是VS2008! 這不是VS2008! 這不是VS2008! (地上打滾)

Google了一下,這是.NET Runtime對來自遠端機器的DLL檔案額外加了資安限制導致的問題。原則上調整.NET安全設定就可以輕鬆解決。

在網路上找到兩種設定方法: 加URL規則指定\\ IP_Address加入Strong Name規則

測試的結果,用URL指定\\ IP_Address的做法一直試不成功。於是我改成指定ODP.NET 9207的Strong Name,賦與Full Trust權限,重新啟動VS2008後,一切正常,YA!

TIPS-IE Favicon錯亂

今天發現IE8檢視Google時,Favicon被誤植成聯合報的圖示。

搜尋了一下,在一個過去沒聽過的Microsoft Answers網站(有點像給End-User用的TechNet或MSDN論壇)找到相關討論

其中有位MS Support工程師建議重設IE所有設定(讓我聯想到今天看到的【MIS維修3R原則】: Restart, Reboot, Reinstall),但如此豈不就損失了這段時間陸續對IE做的調整? 嗯湯呀嗯湯~~

幸好我耐著性子讀下去,發現另一位MS Support推敲問題與Cache資料錯亂有關,於是依著建議,清除瀏覽歷史以及暫存檔後,問題排除!

HTML Comment問題

無意發現某段被註解掉的HTML原始碼卻會在Firefox上被顯露出來,幾經測試,發現在註解內容中只要前後有出現--及>,Firefox就會將其視為註解結束。

為了突顯問題,我寫成以下的測試案例。直覺上,大部分的人應會認定<!--與-->裡包含的綠字內容全部屬於註解:

<!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">
<head>
    <title></title>
</head>
<body>
<!--
**程式語法範例**
1. i--;
2. if (a > b) { x = 3; }
我很乖,我有遵守SGML規範!
-->
</body>
</html>

實地以不同瀏覽器測試,IE, Safari, Opera, Chrome如同預期,顯示空白網頁。但Firefox檢視時卻會跑出文字來:

這回,終於不是IE,Firefox當了不合群的黑羊! 但,Firefox錯了嗎? Firefox錯了嗎? Firefox錯了嗎?

我查到一段關於HTML Comment規格的討論。看起來,反而因為Firefox一板一眼地落實HTML規範,才會顯示出文字;其他的瀏覽器順應網頁設計者(或者應說是瀏覽器RD人員)的直覺,提供了較符合一般人預期的解讀結果。進一步,若把DOCTYPE宣告移除,Firefox便會同流合污敬業樂群地跟大家一樣顯示空白網頁,算是證明Firefox只是在精準地貫徹HTML規範。

我個人偏好限定"-->"才算結束的註解語法規則,如此在撰寫註解內容時,較不易踩到地雷,不必額外遵守>必須要改成&gt;的要求。但HTML規格既已定義,在未修改前,惡法亦法,Firefox是無辜的,在設計網頁時,記得把HTML註解裡的>改寫成&gt;,應該就萬無一失了。

更多文章 下一頁 »

搜尋

Go

<September 2009>
SunMonTueWedThuFriSat
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910
 
RSS
【工商服務】
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


BlogLook Score and Rank

Syndication