星期五, 11月 16, 2012

Convert IEnumable to IEnumable<T>

今天來這分享一下使用 Linq 遇到的小問題,當我們 Linq 用越用熟後,遇到集合 (Collecion) 都會習慣用 Linq 去解決它,今天在 WebFrom 的 Project 裡面,想要把某個 Control 下面所有個 TextBox 的 Type 抓出來,下了這一段程式

PlaceHolder1.Controls.Where(a=>a is TextBox)

結果就給我暴了..><..

為什麼會暴呢?查了 Controls 的 Source Code 看仔細,原來是 PlaceHolder1.Controls 只有實作 IEnumerable..

public class ControlCollection : ICollection, Ienumerable

Linq 常用 Extention Method 大部分都要實作 IEnumerable<T> 這個泛型,如 Where, OrderBy 等,所以沒有腦袋直直想的解決的方法就是把 IEnumable 轉成 IEnumable<T>..XD..

一開始想自己寫一個 Extention Method,不過太陽底下沒有新鮮事,MSND 找了一下,查到可以轉換的有兩個 Method,就是 OfType<T> 和 Cast<T> 這兩個 Extention Method,貼一下 MSDN 的解釋
http://msdn.microsoft.com/zh-tw/library/bb360913.aspx
Enumerable.OfType<TResult>
方法根據指定的型別來篩選 IEnumerable 的項目。

http://msdn.microsoft.com/zh-tw/library/bb341406.aspx
Enumerable.Cast<TResult>
方法將 IEnumerable 的項目轉換成指定的型別。

簡單說就是轉型成 IEnumable<T> 啦,使用時候要小心,如果用 Cast<T> 來做,集合裡面有其他 Type 的 Contnrol 會暴掉,所以我是用 OfType<TResult> 來處理

最後解決方法就是這樣啦..

PlaceHolder1.Controls.OfType<TextBox>()

有問題再討論吧!!!

星期四, 11月 08, 2012

SQL Data Project with SQL Azure

最近把自己的一個專案放到了 Windows Azure 上面,整個佈署的感覺還蠻不錯的,所以在這裡跟大家分享一下佈署的經驗。

網路上已經有好心的大大教我們怎麼把網站佈署到 Windows Azure 了

使用Windows Azure WebSite幫客戶迅速搭建網站(董老師)
 
Windows Azure - 使用FTP上傳檔案到Web Sites並取得MySQL帳號與密碼(好朋友 SKY)
 
微軟Azure測試心得分享(二) :新版管理介面+快速啟用Web Sites
 
還有資料庫要如何佈署上 SQL Azure

利用 SQL Database Migration Wizard 移轉 SQL Server 2005-2012 到 Windows Azure SQL Database
 
SQL Azure - 使用SQL Azure Migration Wizard將本地的資料庫搬移到SQL Azure(好朋友 SKY)
 
如何佈署網站和資料庫到 Windows Azure,照上面那幾篇文章的方式,應該沒有啥太大的問題,這次的文章,主要著重在 SQL Azure 上,因為在佈署的時候,Database 這部份因該是比較容易困擾大家的,不是說資料上不去的問題,而是之後如果 DB Schema 變動,或是想用 design 的介面來改變 SQL Azure,那就會有點痛苦了,為什麼會痛苦呢?我們直接看圖說故事吧!

SQL Azure 點選 table 的右鍵

clip_image001

原 SSMS 點選 table 的右鍵

clip_image002

在 table 上按右鍵,很明顯可以看出來,很多東西被閹割了XD..被 SSMS 寵壞的我,要用 T-SQL 來直接新增 table、新增 index 根本是一整個痛苦,所以上了 SQL Azure 就不會想再去動 DB Schema,但是這情況怎麼可能會發生,所以懶惰習慣的我,當然想一些有的沒有的方式來把這困擾解決掉,科技始終來至於人性,當工程師不懶惰做啥鬼工程師..^^||..

Bibby 的方式就是直接用 SQL Server Database Project 來幫我處理這件事,如果對 SQL Database Project 不熟的,可以去看一下 Bibby 之前的文章"SQL Server Database Project"複習一下,接下來就看圖說故事摟!

先看流程

clip_image003
  1. 當有新需求的時候,一定會先改 Test Database Server 上的 Schema,當改好測試完後,就可以準備上 Code 了
  2. 藉由比對的方式,把 Test Database Server 上修改的 DB Schema 的更新到 SQL Server Database Project,通常如果專案有版本控管的工具,我們也會把修改變更的內容更新到我們的版控上
  3. 藉由比對的方式,把 SQL Server Database Project 變更的檔案更新到 SQL Azure 上,這樣就大功完成了,包括新增 table,新增 index 都可以用這方法簡單的做好
上述的流程,都在"SQL Server Database Project"文章中找到,反正如果需求要改 DB Schema ,那就照流程 1,2,3 按圖施工給他做一變就是了!但是..事情不是像愚人想的這麼簡單,還是會有些小石頭來絆你的,Bibby 也把跌來跌去的經驗分享給大家,讓大家參考參考!

問題一

當你看到下面這錯誤

clip_image004

記得去設定裡面把 "Allow incompatible platform" 打勾,這樣才能產出"合適"的 SQL Statement

clip_image005






clip_image006

問題二
 
clip_image007

解決方法去把"Block on possible data loss"這選項打勾吧!

clip_image008

理由跟原因,看下方網址吧!

http://social.msdn.microsoft.com/Forums/en-US/vstsdb/thread/7799b2d2-a067-47d5-9cf3-d0332baa2ebf

問題三
 
clip_image009

這跟你說,你有些 table 沒有加 cluster index 請去加上去,SQL Azure 才允許你上傳!

問題四
 
clip_image010

這問題是權限的問題啦,會讓你編譯不過,你只要把 Security 的資料夾 Exclude From Project

clip_image011

大概就這樣啦!,希望大家都可以順利上 Azure ,有問題再一起討論吧!!

星期四, 11月 01, 2012

console.log

近來的專案越來對使用者體驗( user friendly )更加的重視,對於 client 端的程式需求越來越多,而在 Web Application 的專案裡面,client端的程式的首選當然是 javascript ,今天來分享一下對於 javascript 開發的小技巧。

在比較古老的年代,常常會倚賴 alert 這 method 來協助程式的撰寫,或是在 debug 的時候也拿來用,但是用 alert 來做這方面的處理,真的很不適合,例如:1.跳出來訊息要手動去關掉 2.正式上線時,不能留著 3.在大量訊息時,alert視窗就會爆炸等等等,這些缺點都導致開發起來礙手礙腳的,在強調快速開發且又需要大量撰寫的 javascript 的時代,現在都會用 console.log 來代替 alert,但是 console.log 又有一些缺點,那就是不是所有瀏覽器都支援 (我沒有指名道姓說IEx我沒有指名道姓說IEx),參考 黑暗大的 jQuery Logging Plugin 這篇文章,再加上自己本身的一些經驗,整合了一下作法,我們先直些看code吧!

實作

//擴充 String ,讓 String 可以有 log 的能力
jQuery.extend(String.prototype, {
    log: function (logKey) {
        var msg = this.toString()
        jQuery.fn.log.logConsole(logKey, msg);
        return msg;
    }
});
//參考 黑暗大的 jQuery Logging Plugin
jQuery.fn.log = function (logKey) {
    jQuery.fn.log.logConsole(logKey, this);
    return this;
};
jQuery.fn.log.logConsole = function (logKey, obj) {
    if (typeof console != "undefined")
        console.log("%s: %o", logKey, obj);

}

用法

var str = 'I love twMVC',
      elem = $('<div>test1</div>');
      ;    

var a = str.substr(7,5).log('s1').substr(2,3).log('s2');
elem.log('jqueryElem').hide();

image
這裡我加了對 String 的擴充,很多時候都需要把 String 顯示出來,讓自己可以有更好的參考來撰寫 javascript ,當要上正式機的時候,只需要把擴充裡的 console.log 那段註解掉就行了,對於其它有加 log 的地方都不需要改動,這樣也不會手賤手誤改錯了地方了,個人感覺算不錯的方式,跟大家分享一下,如果有更好的方法,交流一下吧

參考: