2011/6/9

.Net Interoperation 入門

就字面上來看, Interoperation 是一個英文複合字; 如果你在電腦上打入這個字, 一些 editor 的 spell checker 會告訴你拼字錯誤, 並建議你更改成 Inter-operation 甚至其它拼法。其實 Interoperation 是工程界普遍使用的字眼, 專指在不同系統中搭起的簡易或臨時的元件, 藉由製訂某些共通的協定, 以便這些系統可以共同作業。由於這個溝通界面可能並非非常嚴謹, 所以當其運作時, 必須特別有人從旁監督、隨時調整和修改。

在.Net 中, Interoperation (簡稱 Interop) 專指從.Net 應用程式中存取 unmanaged 程式元件的行為。我們知道, 當我們撰寫 .Net 應用程式或元件時, 這些元件都是 managed (受 .Net 執行環境所管理的)。但是如果是使用VB6/C/C++ 所撰寫的非 .Net 程式的 COM 元件, 對 .Net 而言, 都算是 unmanaged。如果我們企圖在 .Net 程式中存取那些 unmanaged 程式或資源, 就必須透過 Interoperation 技巧與COM 介接。

此外, 許多 Windows API 並沒有 .Net 的對應函式。換句話說, 如果我們要撰寫 Windows 應用程式, 而且我們必須使用到 Windows API 的話, 我們沒辦法從 .Net Framework 執行環境中找到對應的方法, 而必須透過 Interoperation 去呼叫 Windows API。

2011/4/29

[ASP.NET] 擷取 Master Page 觸發的事件

很多事情都是必須遇到了才會重視。使用 Master Page 是每個 ASP.NET 程式設計師都必須了解、甚至精通的; 我也一直覺得我對這部份的技術非常精通, 直到我在最近設計的網站遇到某個比較少用到的功能, 才發現有很多事情並沒有原先想像的那麼直覺。什麼事情呢? 就是我原本放置在 Master Page 部份的控制項, 如果我必須在 Content Page 處理它的事件, 應該怎麼做?

一開始, 我覺得這不應該是個問題, 但是真正下手之後, 才發現解法並沒有那麼直覺。經過明查暗訪, 終於找到了解決的方法, 如果你剛好也遇到這個問題, 不妨參考一下我的解法。

其實解法講穿了就沒什麼學問了! 因為它根本就和我在「[入門文章] ASP.NET 事件與委派詳論」一文所描述的做法幾乎是一模一樣的, 但是在這個問題中另外有個關鍵點, 請稍為留意。

首先, 建立一個名為 mp.master 的 Master Page 檔案, 並在裡面放置一個按鈕物件 (Button1), 設定它的 Click 事件處理函式 (Button1_Click). 然後再建立一個 Web Form (例如稱為 Default2.aspx), 並指定它的 Master Page 檔案為 mp.master。

在 mp.master.cs 中加入以下程式碼:

2011/4/21

[入門][ASP.NET] 在 VS2010 中建立 New Web Site 與 New Web Application 的差異

差不多每隔一段時間, 就會看到有人又重覆的詢問這個問題, 或者雖然沒有問到這個問題, 卻不停的懷疑為什麼在某些網站可以做的事情, 在另一個網站上面卻不行。其實這些問題通通必須回歸到一個最基本的問題, 那就是請你恢復一下記憶, 你在一開始是用什麼方式建立你的網站的?

2011/3/15

[ASP.NET] 離開表單時向使用者確認

當我們在網頁上設計了表單, 讓使用者填寫資料, 使用者通常有很大的機率會因為各式各樣的原因而意外地跳出頁面。如果表單很簡單, 或者使用者根本還沒有填寫什麼資料, 那麼使用者就算不小心離開頁面, 也不會有什麼損失。但是如果使用者已經填寫了很多資料 (例如姓名、地址、電話等等), 但是在他按下確認按鈕之前, 卻不小心按到上一頁、下一頁、關閉分頁、關閉視窗等按鈕, 那麼不管他使用何種方式回到這一頁, 他曾經填寫的資料可能都無法救回來。

2011/2/8

.Net 集合型別的效率探討

我要在這裡說明的所謂「集合型別」指的並不是泛指 System.Collections 命名空間下的各種型別, 而是特別指自從 .Net 3.5 之後才出現的 Sets (集合) 型別, 特別是 System.Collections.Generic.HashSet 與 System.Collections.Generic.SortedSet 這兩個實作 ISet 介面的類別。ISet 介面是專門針對集合作業而設計的, 它提供了幾個特別的方法:

2010/12/18

[入門] .Net 非同步處理與同步機制全解析 (一)

不管你學的是何種程式語言, 非同步及平行處理總是最令人費解的部份之一。如果你沒有過人的邏輯觀念, 那麼要把非同步程式寫好, 恐怕有一定的困難度。不過最難的部份不在技術上, 而是到底在何種場合下可以採用非同步或平行處理。在日常生活中, 我們採用的邏輯大多是循序進行的, 也就是說, 等到前一件事情完成之後, 才去進行下一件。但是在某些情況下, 非同步處理是比較合乎情理的做法。

2010/11/17

[入門] HTML 表格全解析 2/2

大部份剛入門的網頁設計師, 對於 HTML 表格的認識可能僅止於 <table>、<tr > 和 <td> 而已。稍為進階一點的, 可能知道像 colspan 和 rowspan 等等屬性。但是最近我很驚訝的發現有幾位已經從事網頁設計師蠻長一段時間的人, 其實並不知道(或不記得)有其它表格元素或屬性的存在。

2010/11/16

[入門] HTML 表格全解析 1/2

在網頁設計的領域中, 我覺得 HTML 表格大概是最受人誤用/誤解的網頁技術了。一方面, 我們時常可以看到在某些網頁上有數都數不盡的、層層套疊的 <tr> <td> 元素, 另一方面, 也時常聽到有人極力主張禁用 table 元素。這到底是怎麼一回事呢?

2010/10/19

程式內的防呆之道

在品管圈裡有一個很著名的水泥救生衣的笑話, 大意是說, 一個公司即使通過 ISO 或 CMMI 等認證, 也不能保證它不會做出水泥救生衣這種產品出來。非品管圈的人可能無法在一開始就看懂這個笑話; 但是請你再仔細想想看, 救生衣可以是水泥做的嗎? 如果真有這種東西的話, 也是黑幫拿來謀財害命用的, 不是拿來救人的。ISO 或 CMMI 的主要目的, 在於檢驗設計或生產的流程是否完善而且嚴格的被遵循, 它們卻沒有辦法保證設計或生產的東西是不是合理或賣不賣得出去。

2010/10/14

[Winform] 觀察者樣式之應用

Design Pattern 通常都是由許多人推薦的軟體架構模式, 而且有其固定的規則可循。我們可以把一些素有口碑的設計樣式拿來套用在某種情境之下, 但是我十分反對為套用 Design Pattern 而套用 Design Pattern。應該是反過來, 我們最好事先評估自己的情境適合應用何種 Design Pattern, 再來決定是否套用某種 Design Pattern, 不然就會流於削足適履

2010/9/8

[Regex] 值得注意的 Regular Expression 樣式的潛在風險

Regex 本身已經十分複雜, 但不知道大家有沒有想過, 它的解析引擎和處理機制又是如何實作的呢? 一般來講, Regular Expression 的解析引擎可以分為三種, 一種叫做 DFA (Deterministic Finite Automation, 決定性有限自動機制), 另一種叫做 NFA (Nondeterministic Finite Automation, 非決定性有限自動機制), 還有一種叫做 POSIX NFA。.Net 採用了傳統的 NFA 引擎, 使得它既能兼顧速度與功能, 但缺點就是由於傳統 NFA 只接受它找到的第一個相符比對,它也可能讓其它比對無法被找到 (POSIX NFA 雖然可以找到, 但速度緩慢)

2010/4/23

[入門] .NET 自訂型別

我可以理解為什麼我老婆開了十年的同樣一部車, 都不知道原來在 N 檔和 D 檔之間切換可以不必去按那個安全鈕; 但是我卻無法理解為什麼有一個已經寫了好幾年 .NET 程式的人, 在這輩子中竟然沒有寫過任何一個自訂型別。對這件事, 我唯一想得到的解釋, 就是從來沒有人跟他說過自訂型別的好用之處。

所以, 這件事也讓我決心把自訂型別特別整理成一個主題。雖然我在本文中會用到一些進階技巧, 對真正的初學者而言恐怕有點吃力, 但是這畢竟是 .NET 中很基礎、很一般的常識, 所以我還是把它歸類到「入門文章」裡面

2010/4/5

萬眾矚目的 HTML 5

如果我們回顧一下 HTML 的歷史,HTML 4 是在 1997 年底制訂的,我們現在普遍使用的 HTML 4.01 發表於 1999 年底。此外,XHTML 1.0 發表於 2000 年初,XHTML 1.1 則發表於 2001 年中。距今差不多十幾年的時間當中,我們並沒有看到太多革命性的改變。

不過,現在我們終於可以看到 HTML 5 正在制定中,而且各種瀏覽器都已經開始支援,包括 IE 9/10、Chrome、FireFox、Opera 等等。

HTML 5 的前身稱為 Web Application 1.0,早在 2004 年中就已經開始制定規格。其原先的目的在於消除網路使用者對於所謂 RIA 工具 (例如 Adobe Flash, Microsoft Silverlight 等) 的依賴,不過現在交由 W3C 接手制定規格後,HTML 5 儼然已成為下一世代網頁標準的正式接班人。

2010/3/28

[入門文章][JavaScript][jQuery] jQuery 從頭學起

本來是不打算寫任何關於 jQuery 的入門文章了, 因為這種資訊在網路上俯拾皆是, 甚至都泛濫了。然而在實際使用時, 發現 jQuery 的精簡語法在彼此之間也實在太相像了, 如果不自己做個筆記以供隨時速查, 總是記不住。所以, 還是寫個一篇或是幾篇拿來放著, 想查閱的時候也方便。

2010/3/2

[Regex] 進階群組建構

Regular Expression (規則運算式, 以下簡稱為 Regex) 實在不是一個易懂的課題; 但是, 如果我們要在一大堆文字裡面挑出部份具有特定規則的隻字片語, Regex 恐怕是我們唯一能用得上的工具

2010/1/25

運用 CSS 讓過長文字以省略符號取代

在某種情況下, 我們可能需要把一段過長的文字從中截斷, 並在截斷處以省略符號 (...) 取代, 表示這段文字其實尚未結束, 只是被省略。如果你的文字是從資格庫中取得, 那麼你可以從資料庫取出時就載斷字串並加上簡略字元後傳回; 然而, 如果你不想把原始資料真的截斷 (若依上文, 你取出的資料是已經被截斷的, 除非重新讀取, 否則勢必拿不到完整的版本), 那麼你可以嘗試我現在要提供的方法, 那就是以 CSS 設定, 達到相同的效果。

請先來看看程式:

<style>
   .AutoSkip {
      overflow:hidden;
      text-overflow:ellipsis;
      white-space: nowrap;
   }
</style>
<html>
<body>
   <div class="AutoSkip" style='width:600px;'>
     在某種情況下, 我們可能需要把一段過長的文字從中截斷, 並在截斷處以省略符號 (...) 取代,
     表示這段文字其實尚未結束, 只是被省略。如果你的文字是從資格庫中取得, 那麼你可以參考我寫的
     「[SQL Puzzle] 載斷字串並加上簡略字元後傳回」一文, 當你取出資料時, 就把文字截斷。
   </div>
</body>
</html>

雖然在 <div> 段落中夾著一段很長的文字, 但如果你實際執行上述程式, 你會發現在 600px 處文字確實被截斷, 而且自動加上了省略符號, 變成了如下的樣子:

在某種情況下, 我們可能需要把一段過長的文字從中截斷...

當然, 這個結果和在資料庫中取出時就截斷文字看來有一樣的效果, 但實際上, 採用 CSS 的方法其實並沒有改動到文字; 它只是讓你覺得文字看起來好像被截斷而已。

運用這種方法, 無疑是給了程式設計師更大的彈性, 讓你在組版面時具有更靈活的空間。比方說, 由於資料並沒有被真的截斷, 所以, 假設你打算把資料繫結到 GridView 容器中, 限於版面, 你必須把過長的文字截斷, 但是你另一方面卻又可以把完整的文字繫結到 tooltip 裡面。如果採用第一種做法 (在讀取資料時即予截斷), 就無法做到這一點。

在上述程式中, 我所示範的技巧全部都在 AutoSkip 這個樣式裡了, 所以老實說也沒有什麼太大的學問; 照著寫就對了!

不過經過測試, IE8 與 Chrome 4.0 都可以正常顯示, 在 FireFox 上卻不會出現簡略字元, 而是硬生生把字串剪斷了, 如果那個地方是中文字, 有可能只顯示一半, 不甚美觀。

[SQL] 使用 Stored Procedure 動態組成 SQL 查詢指令

以下示範一個可以動態組成查詢子句的 SQL 指令, 以 MS SQL 的 Stored Procedure 寫成。其中, 如果任一個參數(或全部)傳入 NULL 值, 即代表不限制那個欄位的條件。

別讓網頁圖片降低網站效能 - 談談網頁圖片處理新趨勢

如果你的網頁只是設計來自己玩玩, 或者它很明確的只有少數使用者會上來, 那麼你大可以不必用到我在這裡要介紹的方法。但是, 如果你的網站是供作大量使用者(例如超過上千個 current session), 那麼你一定不得不開始想方設法的提升網站的效能

2010/1/20

多功能 FileUpload 使用者控制項

我寫了一個可以處理檔案上傳的多功能使用者控制項,除了可以處理一般的檔案上傳之外,還可以動態修改上傳路徑、讓使用者決定是否覆蓋舊檔,並動態決定是否限制使用者只能接受圖型檔案