2008年7月29日

ASP.NET 3.5 -- 擴充方法

本來這篇前幾天就要發的
無奈最近坎尼搬家 整理東西就夠頭大了
昨天還整理到睡著 orz
今天中午休息一趴下去就沒醒來過 (我是指中途醒來)


好了 今天要講的是.net 3.5的新功能 -- Extension Methods

還記得坎尼在 阿拉伯數字轉中文數字 裡提到的方法嗎?
這個就很適合做在 string的擴充方法裡

好啦 我們就直接看抓圖吧


首先新增一個class 坎尼給他取名叫 myExtentions
裡面會有個 靜態 的class
再來就是轉換的Method 注意 一樣要宣告成 靜態

其他的跟寫一般的method沒兩樣
比較需要注意的是 要擴充的型別前要加上 this 關鍵字

以上圖這個範例來講 因為我們要擴充的是 string 類別
所以在第一個傳入參數前面加上 this
且 Intellisense 會自動把那個參數當作預設要處理的 string
所以 myText.Text.TaiwaneseNumber("") 這裡只需要傳入一個參數
也就是後面的 strMode



這是坎尼稍稍改寫過的Method範例
當然大家也可以繼續往下擴充
目前範例中支援四種轉換模式


當然 在呼叫這個擴充方法前
需要先 using 擴充方法的 namespace (上圖是using myExtentions)

接下來 只要是 string 的類別
都可以呼叫 TaiwaneseNumber 這個方法了
只要注意該傳入哪種的轉換模式即可

利用這個方式
我們可以編寫許多會用到的型別處理方法
像範例這種轉換 就是台灣特有的文化之一 (尤其是公部門常會要求)

2008年7月21日

ASP.NET 3.5一些心得

最近坎尼還是一直k 3.5的書
說真的 東西真的太多了
一時間要理解消化真的有點困難

光是 Linq 砍尼就研究了一兩個月 (包括看書、國外的blog、一堆對岸的教學...)
而Silverlight又沒有第一時間就跟進 (當時被案子纏身 orz
當時只能看看msdn上的教學影片
等到要自己動手作的時候 2.0 beta都出了 囧>

不過從 vs 2005 到 vs 2008的確進步了不少
說到這個 坎尼又想到去研討會時講師說的笑話
「有人說 vs 2005 → vs 2008 只增加3個新控制項」
「故得證 vs 2008 = vs 2005」
「好了,今天可以下課了」 (喂喂...課才剛開始啊 orz

說真的 想專心研究新技術的人
.NET 3.5真的夠大家花上個半年三個月閉關修鍊
像坎尼這種什麼都想學 卻又學不精 工作上也碰不到新技術 (真羨慕在 RD的 Tim
所需花費的時間就很可觀了 (書都念不完了 每天又會有新技術出現

若是大家像坎尼一樣 也很想學新技術
建議先去看看各個技術的介紹 (MSDN或其他知名.NET Blog)
看是要從 .NET 3.5的新功能著手 (隱含型別、擴充方法、Lambda Expression...)
還是這幾年大紅大紫的 AJAX
或是著重畫面顯示的Silverlight
另外還有一定要會的 Linq (至少要看的懂別人在寫什麼)

當然 以上所列都是相輔相成
只要繼續要走.NET這條路 多多少少都會碰上
以後坎尼也會寫些.NET 3.5的學習心得文章
但可能要看工作的情況允不允許了
公司裡還有同事在改 .NET 1.1的專案呢!! (捏鼻)

2008年7月20日

[VBA / VBScript] What is ProgID?

上週為了解一個怪問題,所以找了關於寫 VBA / VBScript / Javascript create ActiveX Object 時要用到的「ProgID」這個參數的意義,結果找到以下資料:
  1. MSDN 的定義
  2. What is a ProgID and How Do I Change It?
  3. How to determine the Path for an Office Application?

簡單的說,用 VBScript / Javascript Create COM / ActiveX object 時,通常會寫以下的程式:

Dim objWord as object = CreateObject("Word.Application")

其中的 "Word.Application" 就是所謂的 ProgID。


上述第二個參考資料很清楚的解釋了 ProgID 在 COM / ActiveX 裡的重要性,
如果需要在 ASP 或者其他非微軟的語言去 Create COM / ActiveX 物件時,
就需要對 ProgID 有一定程度的了解。


不過對第二個參考資料中,因元件新增功能而產生的 "change ProdID" 的需求,
倒是有其他的作法可以避免 COM 元件升級帶來的麻煩,
只要元件裡面的 public sub/function 的 interface 不變,基本上只要把版本號更新,
runtime 的時候就會抓到最新版本的元件,也不需要去修改 ProgID,
由於Create物件的時候 ProgID 通常都是寫死的(除非原始程式考慮的很周到,用類似 web.config 的方式將 ProgID 存在外部檔案),
不然元件每升級一次,就要全文取代是很痛苦的,ASP 時代根本沒有能跟 VS 相提並論的 IDE (除了 UltraEdit 勉強堪用)。


但是這樣到底要怎麼增加新功能呢?其實只要預留一個 public sub / function,
而這個 function 主要的作用就是接收一個指定 provate sub / function 的字串,
然後根據這個字串來執行指定的 function,這樣就可以了。
新增的功能以 private sub / function 的方式加到舊有的元件中,
而外部的 ASP 程式,因為新增功能本來就要寫新的程式去呼叫,
只要把本來呼叫舊有 sub / function 的程式改為呼叫上述預留的 public sub / function,再把新增的功能的 sub / function name 丟進去就可以了。


至於第三點的參考資料,則是說明到底如何在 registry 中找出 Office 應用程式的 ProgID,而後進一步找出執行檔的 physical path,看來不只是 Office 是採用這樣的機制,只要是在 Windows 平台,很多其他廠商的軟體也是用類似這樣的機制,如 Adobe 等等。


Windows registry 裡面有很多有趣的東西,有空的時候應該多找些相關資料來研究一下...

2008年7月19日

在同一個專案裡使用vb及c#建置類別庫

hihi 好久不見的坎尼浮出水面了
最近要每天都工作到很晚 且還要忙著找新屋子
lively room 都沒好好的去管理 (大概要變空屋了吧)

今天要講的是,在同個專案裡,同時使用VB及C#去編輯類別庫
首先,要在WebConfig裡加入下列設定


接著在App_Code裡加上設定的資料夾名稱
注意,要和config裡的相同喔


然後我們就可以如下面抓圖一樣
在同一個專案裡,同時建置.cs和.vb的class了

CSharp的Class

VB的Class


在畫面上拉兩個Button做事件處理


Button事件,分別引用 CSharp 的 myClassvb 的 MyClass2


結果畫面,左圖為點下 CSharp鍵,右圖為點下VB鍵


以上都是參考網路上人家寫的範例
再來是坎尼測試的結果

雖然vs 2005允許 .cs 和 .vb共存
但卻不能夠利用 partial 關鍵字來同時編寫同一個class
以上面的圖為例
坎尼已經在 .cs裡宣告一個 myClassclass
此時還要去 .vb裡宣告另一個 myClass 時 .NET就跟坎尼說「不可以」

後來坎尼想一想也對
兩邊的東西本來就不相同 (語法、內建類別、函數...等)
在同一個class裡寫 恐怕在編譯時 電腦會先瘋掉吧

partial 的用途就是 在compile時 把兩個相同的class 編成同一個 dll
所以如果.vb和.cs共存 就可以想像成我們在同一個class裡
上一個函數還是 public string myMethod(){}
下一個函數怎麼會變成 public Function myFunction() As String

好了 最後再來課後補充一點
上述的方法是在講 App_Code 裡的東西
其實網頁專案平常就可以讓 .cs 和 .vb共存了

只要在新增一個WebForm時 選擇要用的語言即可
見下圖 (這是可以run的程式喔)


以上 這兩天放假坎尼就來多寫一些好了 (不過還是找房子先)
Tim一直說沒文章 (自己還不給我上來寫 大怒)

2008年7月15日

IIS - Going Live With IIS 7.0

全文請見 Microsoft TechNet Magzine July,裡面提到的重點包括:
  • 如何利用 IIS 7 同時 Host ASP.NET & PHP WebSite
  • The top 10 improvements with IIS 7
  • "IIS Architecture" & "Integrated and Classic Modes",說明 IIS 是如何可以做到同時 Support ASP.NET & PHP Website
另外還有一篇 IIS.net 的 Learn IIS7: Using URL Rewrite Module,裡面也有很詳細的解說,看來 IIS.net 的內容還蠻充實的。

WCG網格計畫 (World Community Grid)

六月份的時候,看到 TWGrid 有一篇新聞,講到 IBM 在 2004 年成立的 WCG 計畫 (World Community Grid),後來在 6/14 就下載了 Agent 開始 Run,總覺得跟現在的工作相比,這樣對世界比較有貢獻,反正每天晚上電腦就開著給他跑,除了抓一些盜版的影片以外,也貢獻一些資源出來。

目前這個計畫的參與者有 39萬多人,共註冊了100多萬台機器,每天平均貢獻的 CPU Time 有 12x 年的樣子,自己 run 完的 job 有分數可以拿,目前我排名 17萬2千多(努力設法累積 Project Badge中:p),感覺累積這些數字比 online game 的數字有意義的多,如果有興趣的話,請至 WCG 官網

2008年7月10日

SQL語法組成,邏輯運算子 vs Between

最近坎尼出差都回不了家
在昏暗的飯店房間裡根本沒心情上來寫文章 真抱歉
Tim最近也忙於公司的事 看來大家都很忙 哈


好,今天要講的是 SQL 語法的組成
坎尼看到同事寫的 取某期間內的資料 的 Sql 語法
(起始日結束日 並未強制使用者輸入)

首先 他傳了 date1 和 date2 (date1為起始日 date2為結束日)
接著寫下了下面的組成判斷式

if (date1 != "" && date2 != "")
strSql += " and date between @date1 and @date2 ";
else if (date1 != "" && date2 == "")
strSql += " and date >= @date1 ";
else if (date1 == "" && date2 != "")
strSql += " and date <= @date2 ";

ok 以上還是坎尼幫他簡化過的 Sql 語法
然後坎尼看到了所有跟日期有關的 Sql 部分 都是寫成類似上述的判斷

應該有人會說 這麼寫有錯嗎?
坎尼跟你說:沒錯啊 XDDDD (瞬間被打飛)

不是啦,坎尼是想說,這只要兩行就可以結束的東西,不必寫這麼多啦
以下是坎尼改寫過的 Sql 組裝句
strSql += (date1 != "") ? " and date >= @date1 " : "" ;
strSql += (date2 != "") ? " and date <= @date2 " : "" ;

怎樣?是不是簡潔許多? (看不懂上面寫法的人 請Google 三元運算式 )
在這種不確定是否有兩個值傳入的比較式
坎尼不會輕易動用 between (平常也沒用between的習慣就是)

當然,這也可以用於其他 數值比較 的語法中
只要條件和上述的一樣:不強制輸入值、比較值需與傳入值(複數)作比較
都可以用上述的寫法
不要再寫成 落落等 的一大堆 if else 啦 不然以後維護的人員會很痛苦 (就是坎尼)

2008年7月2日

驗證 Multiline Textbox 字數 (使用Javascript)

上篇
本篇來講講怎麼用Javascript去驗證Text中的字數
其實也沒什麼祕訣
只要利用 .length 的屬性就可以算出字數
直接看下面的抓圖吧


上圖為計算字數的 js function
關鍵在於用 return 的 true/false 值來控制 button 會不會 submit


上圖為 Button 控制項的屬性
OnClick 事件是承襲 上篇 的 Button 事件
不過這邊要多加上個 OnClientClick 事件 return CheckWordCount()
這是控制 Button 會不會 submit 的關鍵


送出驗證事件



驗證失敗事件

由上圖可得知 上一篇 坎尼提到斷行的問題
Javascript 裡會將斷行視為一個字 (坎尼認為是\n)

兩個方式都可用來驗證目前字數
不過需注意兩個方法對文字字數的處理結果

2008年7月1日

驗證 Multiline Textbox 字數 (使用驗證項)

最近又碰到要做輸入字數控制
坎尼想說要不要用非常不熟的 驗證控制項 來做
看同事他們都用的蠻高興的

以前在當學生時都會胡亂用這個東西 (當時是 vs 2003)
在一個頁面裡大量使用的結果是 導致 user 用起來會非常的不爽
這也是坎尼後來都不想用它的原因 (vs 2005中只用過一兩次)
後來坎尼都改用 JavaScript 去控制 沒輸入的還會直接 focus 過去

標題還有提到 Multiline TextBox
原因在於:它不能用Maxlength屬性去控制輸入的字串長度
好啦 直接看以下抓圖 最後再來做解釋


上圖為版面配置
一個textbox、一個button控制項
一個RegularExpressionValidation、一個Validation Summary


RegularExpressionValidation屬性設定
為了這邊,坎尼又去把生成灰塵的RegularExpression文件翻出來
\s 比對任何泛空白字元
\S 比對任何非泛空白字元
再用 {}來控制字數


Validation Summary屬性設定
主要是讓錯誤訊息alert出來


按鈕事件,若是通過字數驗證,則會alert訊息


若通過驗證的畫面


若是沒通過驗證的畫面

上述程式和坎尼之前用來算字數的Javascript的結果不太一樣
驗證式會將斷行視為兩個字 (坎尼猜想應該是 \r\n)
但Javascript卻會判斷為一個字
不過用驗證項會比Javascript簡單許多
端看各位如何去使用

下篇坎尼會把Javascript版本驗證字數的方法補上

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D