2010年10月12日 星期二

利用 Regex.Replace 的 MatchEvaluator 委派進行樣板字串置換

Regular Expression 真的很讚!尤其是在 .NET 中使用 Regex 物件時,你會感覺到非常幸福,不光是支援的中介符號和語法完整 (比較過 Javascript 的 Regular Expression 就知道),連 Regex.Replace 都有特別犀利的地方。

我們在程式寫作的時候的時候,偶爾會遇到需要處理樣板的情況,例如:

Hi! XXX您好,您月的贍養管理費未繳,請盡速繳納...

2010年10月10日 星期日

使用 NPOI 在匯出的 Excel 檔中逐列內嵌圖片

相信很多人都有使用 NPOI 匯出 Excel 工作表的經驗了,這次來分享一下在 Excel 中內嵌圖片的範例。

在分享的案例中,我將使用 ASP.NET MVC / C# 利用 Google 搜尋圖片的功能,將關鍵字搜尋到的圖片,導出至 Excel 工作表中的每一列,見圖如下:

image


匯出的 Excel 內容為搜尋到的每張圖片,不過我沒將圖片完整輸出,而是產生縮圖後才輸出。

懶人的 VBA 程式寫作法

由於某個衝動的承諾,最近再次接觸到 VBA (Visual Basic for Application) 程式碼,對 Excel 工作表進行客製化。雖然需求挺簡單的,程式碼也不多,可是寫 VBA 這件事對我來說,並不是像寫 C#/.NET 一樣容易遇上,再加上 VBA 中很重要的 Office Object Model 還挺複雜的,小弟實在沒辦法塞太多 Office Object Model 的東東在腦子裡,這時候要靠文件嗎?可能一個小小的需求就會查到我天昏地暗,寫不下去…

所以在這邊分享一個小方法,能讓你快速的使用 VBA 完成你的工作,懂得一些 VB 的邏輯與控制結構語法即可,關於 Office Object Model 就借助工具幫忙。

2010年10月1日 星期五

離開 LINQ 的 Expression Tree (一)

話說 .NET Framework 在 3.5 發布以後出現的 LINQ,真令人驚豔!這傢伙威力的強大相信大家早有體會了,而 expression tree (運算式樹) 是在 LINQ 中是非常重要的元素,其重要性看 namespace 就能知道 (System.Linq.Expressions)。

Expression tree 自此之後開始快速欺凌擴展 .NET 程式設計師的視野,應用之廣泛像是 ASP.NET MVC 2 中開始提供在強型別 View 中應用 lambda 運算式 (lambda 也是一種 expression tree) 來作為舊語法無法支援 IntelliSense、編譯時期檢查和 refactoring support 的取代品(強烈建議使用),可參考 ScottGu’s Blog - ASP.NET MVC 2: Strongly Typed Html Helpers 這篇文章,相信有經驗的你很快的可以分辨出孰優孰劣。

我自己則是應用 expression tree 在推論引擎的實作上,先提一下推論引擎。前一段時間為了實作規則庫推論引擎(專家系統的一種分支),花了一段時間研究,這種系統的特性是:一個規則庫(Rule Base 或 Knowledge Base)、工作記憶體(Working Memory)與推論引擎(Inference Engine),架構大致如下:

2010年9月15日 星期三

Javascript 的 prototype 特性與使用方法

一般我們在 javascript 中使用這種方式進行類別定義與活化類別
// 以 function 為建構子
function Person(firstName, lastName) {
  this.firstName = firstName;
  this.lastName = lastName;
}

//然後活化類別
var p = new Person("Dino", "Wang");


如你所見這樣的類別並不具有"成員函式",所以當你需要成員函式時你可能會手動繫結上去
// 附加一個匿名函式到 p 實體
p.fullName = function () { 
  return this.firstName + " " + this.lastName; 
}


這樣的問題是,每一個被活化的類別都需要進行一次上述動作(以下稱為成員繫結),如果你這類別會產生多個物件,就會造成匿名函式重複產生的問題(浪費記憶體)

設定 ASP.NET MVC 2 編譯時期檢查 View 的設定 MvcBuildViews 導致編譯失敗

設定了 MvcBuildViews 可以得到編譯時期檢查 View 正確性的好處,於是從善如流趕緊在專案檔找到 MvcBuildViews 選項並設為 true。

  ...
  true
  ...


隨後編譯即出現:

無法載入型別 'System.Data.Entity.Design.AspNet.EntityDesignerBuildProvider' 錯誤

結果追蹤到這篇,才發現是因為專案使用 Entity Framework 的關係,在 web.config 中增加

  ...
  


即可順利編譯囉。

2010年4月27日 星期二

在 DataTable 進行 Group by 並且取 Sum 的運算 (後續)

在前一篇 在 DataTable 進行 Group by 並且取 Sum 的運算 中,原以為已經提供可用的 solution 了,結果沒那麼順利

儲存數字的 DataColumn 型態居然是 String (在資料庫中是 NVARCHAR),我無言了...

維持著手上只有 DataTable 的條件,必須作一下轉型處理才能進行運算

2010年4月21日 星期三

在 DataTable 進行 Group by 並且取 Sum 的運算

今天幫忙同事以 DataTable 進行 Group by 並且取 Sum 的運算

知道方法有很多,我就自己懂的部分,寫下純 ADO.NET 的作法,先以 DataTable 的 ToTable 方法取得 distinct 過的群組鍵,接下來建立 Relation 關連回原 DataTable,最後利用在群組鍵 DataTable 中增加自動計算欄位 (Expression 屬性,透過 DataColumnCollection.Add method 設定) 完成關聯記錄的計算

見範例程式中 TestByPureAdoNet method 中寫得密密麻麻高亮的那幾行就是了

2010年4月12日 星期一

一些 QR Code 開放原始碼資源

編碼 與 解碼

  • QR Code for .NET Framework 支援 Windows Mobile 平台,提供範例程式碼,至 twit88CodeProject 下載
  • Open Source QR Code Library for Java,專案網頁於 SourceForge
  • ZXing project for Java / C++ / ActionScript 支援 Android 與 iPhone 平台,專案網頁於 Google Code
  • PyQrCodec for Python,其實 PyQrCodec 算是 wrapper,因為它依賴一群 DLL 元件,主要呼叫 qr_codec.dll 中的 API,至於 qr_codec.dll 的原始碼則未包含於此專案中
  • d-project for ActionScript 3 / JavaScript / PHP / Java,專案網頁於 Google Code
    (JavaScript 版是有點出乎意料到 XD)

2010年4月10日 星期六

初探網頁弱點偵測工具 Burp Suite

初次接觸 Burp Suite 這套 web 漏洞檢測工具,覺得真是簡單易用,當你懂得一些 HTTP 的原理與特性,不必寫程式就可以進行漏洞測試 (說是攻擊測試,好像更加準確)

分析 HTTP 的工具中,我其實比較常用 FiddlerWireShark,它們同樣都可以捕捉到 HTTP 封包 (WireShark 用途更廣),在 Web 偵錯時非常的好用,你可以取得非常豐富的 HTTP 資訊

相形之下,Burp Suite 就是為了攔截、修改 HTTP requests 的用途而誕生 (切記是學術、是研究!)

這裡我打算紀錄第一次使用的經驗,因為 Brup Suite 是以 Java 寫成的軟體,所以得先確認有 JRE 環境

2010年4月6日 星期二

在 SQL Server 中將欄位值重設為 Null

在 SQL Server Management Studio 中,要修改 TABLE 某列的欄位值是開發期間經常會發生的事情,但是你有遇到過需要將欄位重設為 Null 嗎?

過去我遇到這樣的情況時,都只能用很爛的步數,那就是 Copy & paste

就這樣:將作用中的儲存格移動到含有 Null 值的欄位上 copy,再移到要設為 Null 的欄位上 paste,搞定

2010年4月5日 星期一

分享 NPlurk - The Plurk API .NET Wrapper using C#

嗯... 去年底完成之後,就一直擱置著,想到時間都花了,多可惜,因此想讓有需要的人可以取用

這個 .NET Wrapper 是用 C# 寫完的,引用了 CodePlex 上的 Json.NET 組件 (新版本已改用 .NET 內建的 JavaScriptSerializer)

實作的過程中,沒有太深奧的技巧,全因原生的 Plurk API 設計結構非常簡單,剩下的都只是原始 API 對應文件的苦工

我把它發佈到 CodePlex 上了,這裡是專案網頁 NPlurk

Enjoy!

2010年4月4日 星期日

動態 CSS 選單在瀏覽器中顯示異常

週五有同事遇到了網頁程式中的動態選單無法正常顯示的問題,被 art 提供的 flash 元件遮住大半,仍舊是典型的 CSS menu 顯示異常的問題

處理過太多次了,每次都得花我很多口水精神解釋,這次乾脆著文一篇,下次好直接參考使用

一般 CSS menu 在顯示上會遇到以下的問題,稍作整理
  • 被 flash 物件所覆蓋,這種情況在 Firefox 中沒有發現,其他常見瀏覽器幾乎都會
  • 被 <select /> 網頁元素所覆蓋,目前這種情況只剩下顧人怨的 IE6 會發生

以下程式碼用來試驗各種瀏覽器不同遮蔽的情況

2010年4月2日 星期五

網頁的多重捲動(Parallax Scrolling)效果

今天在號稱 Front-End Engineer 的 James Padolsey 大大 Blog 中挖寶時,被捲動的網頁效果吸引住了

起初以為是老花,但是以我20多年前打電玩的經驗,和一天使用超過18小時卻被醫生嫌沒有近視的火眼金睛,鑑定為多重捲軸確診案例

James 的網頁確實以兩個層次捲動著 搞什麼阿

因為共有兩層,當下就想背景一定是在 body 的 CSS 中以 background-image 和動態 background-position 指定(控制 y 軸)兜出來的效果

2010年3月30日 星期二

C# 4.0 dynamic 關鍵字與 ExpandoObject

昨天翻了一下 Apress 的 Introducing .NET 4.0,看到動態語言特性的部分,一個很面熟的 expando 字眼出現在面前,它是 ExpandoObject

不清楚 expando 一詞多久以前就出現了,但是如果是 JavaScript 就不能不提 expando 特性,它讓任何一個物件能隨時隨地的被賦予新成員 (包含屬性和函式)
// JavaScript
var data = new Object();
data.name = "Dino";
data.sex = "Male";
另一種 JavaScript 等價程式碼 (JSON 表示法)
// JavaScript
var data = { name: "Dino", sex: "Male" };
程式執行下來 data 含有 name、sex 這兩個屬性,並且值也被賦予了,我不必先為他產生類別定義,多麼簡單直覺!

2010年3月28日 星期日

Lazy Load - jQuery plugin for lazy loading images

之前在瀏覽一些網站時,發現有些網站圖片內容載入好像稍微慢了一些,像是 The Ultimate jQuery List

仔細的觀察一下行為,就會查覺到這些網站的圖片載入的速度其實並不慢,只是圖片會在捲動到可視範圍內才開始載入。

這麼作真適合版面較長的網頁,可以舒緩伺服器端的瞬間吞吐量,能夠增加效率而且並不難,已經有現成的 Lazy Load Plugin for jQuery 能用,真是一整個開心吶。

簡介一下使用方法,除了 jQuery,你還需要先下載 jquery.lazyload.js,並且在網頁中把它們都載入。

2010年3月25日 星期四

C# 排列組合練習, 使用 extension method and yield return

此例用飲料口味甜度冰塊作為測試情境為求容易理解。

測試資料集 optionValueSet 型態可為 Dictionary<string, List<string>> 或 Dictionary<string, string[]> 等,主要是因為 extension method 設計對象為 IDictionary<string, IEnumerable<string>>。

主程式 (Program.cs)