12.18.2006

.NET 漫談 (1)

.NET的程式開發過程裡,New這個動作到底代表了甚麼,我想這個要從Object life cycle(物件的生命週期)講起。

在電腦的世界裡面,我們定義的Class代表的就是一個我們設定好的記憶體模型,可以把它當作一個模子,我們可能準備了許多的模子,但是不代表我們有用模子壓出東西來,這個時候算是準備時期,程式開發的術語叫做Design-Time

當程式開始執行之後,這時候的狀態叫做Run-Time。這個時候電腦會根據你想要的東西,找到相對應的模子在記憶體裡面壓出你所想要的東西,這個東西叫做Object,你也可以稱它為Instance,不管Object或是Instance都是佔有記憶體的。

好啦,假設我們有兩個模子,要壓出小白兔跟花,所以一個叫做Rabbit,另一個叫做Flower,那我們要怎麼叫電腦幫我們做產生Object的動作呢?我們需要寫下像下面的的程式碼:

Rabbit melody=new Rabbit();
Flower rose=new Flower();

沒錯,New就是建立Instance的動作。但是你的內心一定有一些疑惑,那為甚麼有些東西需要New,但是有些東西不用New。

這個問題就回到我們以前討論的Value Type與Reference Type的差異。這兩個形態的分別就是因為Value Type夠簡單,夠單純,.NET可以完全掌控它,所以一般來說它是不需要New的,但是你可以試試看下面的程式碼:

Int32 i = new Int32();

然後Build看看,IDE應該只會吐一個warning CS0219: The variable 'i' is assigned but its value is never used警告訊息給你,還是可以過的。

所以說Value Type也是可以New的,只是.NET本身認為他很單純,簡單,所以Value Type才可以略過。再進一步的說來,.NET將(Type)區分成兩種大類,一種是所謂的Primitive Type, 也就是我們剛剛講的Value Type,不管是Primitive Type還是Reference Type的Instance都是在Runtime配置在記憶體中,但是兩者之間配置的位置是不一樣的,Reference Type是位在Heap裡面,受GC的管理,但Primitive Type是不在GC Heap裡面。

所以相對的Primitive Type的Instance在使用上會比較沒有額外的負擔,但是要記住,Primitive Type是記憶體大小不可變的,也就是當你宣告變數是Int32的型別之後,並無法改變它的大小,這部分我們就要注意System.String這個型別,這個型別的特殊的地方是它是個Reference Type,但它的狀態也是記憶體大小不可變,這個有看過String與StringBuilder比較的Demo都應該可以快速的體認到差異並懂得避免非效率的Coding行為。

11.15.2006

I am back

Finally, The Integration of database is completed.


I spent almost half year to complete this case, wrote a new program to transfer data without dependence upon database’s schema. Dynamically Database choice, Error message flow…
Maybe this program do not perfect, it also excellent for me, now.


And now, I give a course to training my colleague. I am trying to broach the O.O concept and introduce to difference method of development.


Up to now, Polymorphism is the bottleneck of learning for my most colleagues. I am trying to slow down and present more demo, next, I thought the better to comprehend the concept is practice.

In the end, The next post would be the note of my course.

8.14.2006

獨占性的好用與勉強可以的相容

過了很久,總算有空寫了。
工作忙到一定程度,人生就不知不覺得消失,想想真可怕。

獨占性的好用勉強可以的相容。我想說的是軟體的類型。
老實講,我不知道哪一個比較好,但是個人的立場是 勉強可以用,卻相容其他軟體的工具 最討我歡心。

Picasa推出了Web Albums,亮眼的程度可以跟Yahoo的Flickr相比,雖然只有250MB,不過感覺還真的不錯。不過,兩者互不相容,無法同步。我的朋友裡面有用Yahoo的就很少會用Picasa,那怎麼辦,一定要我人工同步嗎?

那個Google Calendar能跟Outlook同步嗎?要是Google不肯作,MS願意做嗎?

看到最近的Israel-Lebanon,好像到處都不相容...

--------------------

WWW,從Netscape對IE,Java對.NET,一路走來紛亂不已,讓我很害怕,所以就算Ajax跑出來,老實講,我還是寧願把Indigo搞清楚再說。

這是我的Picasa Web Albums
http://picasaweb.google.com/Robert.Yu.Tw
這個則是Flickr
http://www.flickr.com/photos/robertyu-tw/

至於MSN Live Space...耶....我喜歡那個Windows Live Favorites,尤其新出的Live Toolbar,不過其他的要是有.NET 1.0剛出來的氣勢,我想會好很多,畢竟MSN Messenger有他的市場優勢。

5.26.2006

[閒聊]鐵軌寬度的由來

經濟學中有個名詞稱為「路徑依賴」,它是類似於物理學中 的"慣性",一旦選擇進入某一路徑(無論是 「好」的、還是「壞」的),就可能對這種路徑產生依賴。以下美國鐵軌的故事也許有助於我們理解這一概念,並且加深對其後果的印象。

美國鐵路兩條鐵軌之間的標準距離是四點八五英尺。這是一個很奇怪的 標準,究竟從何而來的?

原來這是英國的鐵路標準,因為美國的鐵路最早是由英 國人設計建造的。那麼,為什麼英國人用這個標準呢?

原來英國的鐵路是由建電車軌道的人設計的,而這個四點八五英尺正是電車所用的標 準。電車軌標準又是從哪裡來的呢?

原來最先造電車的人以前是造馬車的。而他們是用馬車 的輪寬做標準。好了,那麼,馬車為什麼要用這個一定的輪距離標準呢?

因為如果那時候的馬車用任何其他輪距的話,馬車的輪 子很快會在英國的老路上撞壞的。為什麼?
因為這些路上的轍跡的寬度為四點八五英尺。這些轍跡又是從何而來呢?

答案是古羅馬人定的,四點八五英尺正是羅馬戰車的寬 度。如果任何人用不同的輪寬在這些路上行車的話,他的輪子的壽命都不會長。我們再問:羅馬人為什麼用四點八五英尺為戰車的輪距寬度呢?

原因很簡單,這是兩匹拉戰車的馬的屁股的寬度。故事 到此應該完結了,但事實上還沒有完。

下次你在電視上看到美國太空梭立在發射臺上的雄姿 時,你留意看,在它的燃料箱的兩旁有兩個火箭推進器,這些推進器是由設在猶他州的工廠所提供的。如果可能的話,這家工廠的工程師希望把這些推進器造得再胖一些,這樣容量就會大一些,但是他們不可以,為什麼?因為這些推進器造好後,要用火車從工廠運到發射點, 路上要通過一些隧道,而這些隧道的寬度只比火車軌道的寬度寬了一點點,然而我們不要忘記火車軌道的寬度是由馬的屁股的寬度所決定的。

因此,我們可以斷言:可能今天世界上最先進的運輸系 統的設計,是兩千年前便由兩匹馬的屁股寬度決定了。這就是路徑依賴,看起來有幾許悖謬與幽默,但卻是事實。
=====================
上面是轉貼的東西,老實講我念經濟系的,卻也不知道有啥路徑依賴的理論,後來有一天終於受不了,上網找了找。

真的有這個東西耶,看來我的大學生涯真是...。

一開始想說應該可以用使用者成本就可以解釋掉這一塊。但是後來越想越不對,要是這麼簡單的話,不就沒有人去做這一塊的論析。

再上網找了找,看到Amazon一本書,作者是我熟悉的W. Brain Arthur...果然有人在討論這個東西了,還出書了咧...

下面是Arthur那本書的的Amozon網址
http://www.amazon.com/gp/product/0472064967/ref=si3_rdr_bb_product/102-2614839-5381743?%5Fencoding=UTF8

P.S. 因為我不知道上面轉貼的文章是哪來的,有人知道的話請告訴我,我比較希望上面只是個聯結,而不是完整的一篇文章。

3.29.2006

About System.Security.SecureString

SecureString的特性很迷人,在記憶體裡是加密的字串,可以Dispose掉,不會在CLR下很輕易的被反組譯。

詳細特性可以看http://msdn2.microsoft.com/en-us/library/7kt014s1.aspx,或是在MSDN裡找到。在應用上的特點你可以看MSDN Magazine裡的資料,http://msdn.microsoft.com/msdnmag/issues/06/00/SecurityBriefs/default.aspx,裡面提到的安全性加強真是令人血脈僨張。

不過,當你看到MSDN也好,MSDN Maganize也好,都沒有相關的範例,怎麼辦。好吧!向Google大神求助吧!
http://blogs.msdn.com/shawnfa/archive/2004/05/27/143254.aspx
shawnfa的Blog算是最清晰的一個了,有教你怎麼把該加密的字串送進去,有教你怎麼把他從記憶體裡清掉。

但是那怎麼把字串弄出來送到Connection.ConnectionString呢?

這裡就是我試出來的答案,不過還是有疑慮,那ConnectionString安全嗎?在轉出到ConnectionString的期間,安全嗎?我不知道,這兩天會找找答案在哪裡。

//Insert String into SecureString in Constructor, I dont try this
SecureString password = new SecureString(char[],length);

//Append String into SecureString
foreach(char c in s) {
SecureString.AppendChar(c);
}

//GetString, Apply, And Dispose
void RunXX(){
IntPtr ptr = Marshal.SecureStringToBSTR(SecureConnectionString);(*1)
try {
SqlConnection conn = new SqlConnection();
conn.ConnectionString = Marshal.PtrToStringBSTR(ptr);(*2)
conn.Open();
... Run Query or something....
} finally {
Marshal.ZeroFreeBSTR(ptr);(*3)
}
}

以下是我的想法啦,畢竟對於Unmanage Code的使用真的不太熟,請盡量糾正錯誤,不要客氣。

*1: 這裡算是把SecureString的資料解到一個Unmanage的指標下。
*2: 把Unmanage的字串解到Connection的ConnectionString裡,就是這裡有安全性疑慮。
*3: 最後要把放在Unmanage的指標字串清掉,就沒人能反組譯到了。

2.16.2006

.NET 2.0 And Configuration 2/4

接下來我們來看針對使用者範疇的三種狀況下,我們的使用者所選定的配色資料到底會跑到哪裡去。

在.NET 2.0 裡面,檔案會放在這個路徑下
\\__\\user.config

我們就解釋其中幾項代表的意義,之後我們會來弄個實作來驗證Configuration System。

首先是,在Windows XP裡,指的就是C:\Documents and Settings下你所登入的User名字的資料匣,當然啦,如果你的系統碟不在C,或是Documents And Setting資料匣路徑有改過,你就要找你所設定的位置。 在你的應用程式裡的這個AssemblyCompanyAttribute,會帶到這個地方。__ 這個就要看你的程式了。 就是程式的版本,這個後續我們會討論到版本變動的問題。

這個路徑不能改變!除非你自己實作自己的SettingProvider,SDK裡面有相關的資訊。

那為甚麼這個路徑不能改變呢?Prabhu並沒有解釋很多,不過這裡倒是有一個面向可以考慮一下。

假設現在公司裡有架AD環境,使用者可以在任何電腦裡面登入,但都會取用他本身所屬的檔案與設定,像我的文件阿!我的最愛之類。那是因為公司裡有一台AD伺服器,會做這些設定的管理。現在問題來了,公司裡的每台電腦的設定與作業系統不一定會相同,當Tom的資料在他本機裡面是放在C:\Documents And Setting\Tom裡面,但是當跑到秘書Emily的電腦時,路徑卻變成D:\WINNT\Profile\Tom...難怪路徑會是固定的形式。至少現階段我打EA Sport的電動,它們的設定檔路徑就是設成這個格式的。

所以就這個面向說來,這應該是作業系統架構的概念上的問題,並不是.NET 2.0 的 Configuration System的問題。不過關於上述的Roaming profile的東西,有一篇關於它的好文章,倒是一定要看一下。http://blogs.msdn.com/oldnewthing/archive/2005/06/30/434209.aspx

2.06.2006

.NET 2.0 And Configuration 1/4

在.Net Framework的時候我是從來沒用過Configuration,一直到了Enterprise Library出來,我才開始使用。就算到了現在,我對Configuration還是不輕易使用,畢竟我還是覺得IO的動作能少就少,講到這個,我還撥不出空去看是不是.Net 2.0之後,Configuration是不是有Cache的動作。

不過老實講,Configuration是有好處的,至少不用透過複雜又難搞的Register來做動作,就只要放在確定的地方,在某種層面來看,Configuration的出現,算是對.Net 宣稱的XCOPY部署作一個良性的相對應。雖然有點馬後炮,不過要是用過Register應該或多或少被搞到一陣子。

Configuration在.NET 2.0做了一些個改變,可以把它想做是把Enterprise Library的Configuration Block吸收進來,然後做了些改進。

之前的Configuration分成Machine.config與ApplicationName.exe.config兩塊,現在分的比較有架構的感覺(不過也有點制式)。

舉個例子來說,現在的Configuration分成兩個部份,假設我們建立了一個程式,這個程式呢,有一些設定可以由使用者變動的,假設說是應用程式的配色方式,當然啦,我們也會有一個預設的設定值。現在我們考慮將這些設定值交給Configuration來儲存使用,首先,Configuration可以分成兩部份,一部分是所謂的應用程式的範疇,另一部份就是使用者的範疇。簡單的說,應用程式的範疇就是預設值,就是應用程式出廠的設定值,可以放在Config檔一起出廠;而使用者的範疇就是使用者自己設定自己喜歡的配色後,所儲存的設定檔。

因為預設值是不給使用者改變的,也就是說在Runtime是不能由應用程式作改變的,所以它是唯讀的。

那使用者的範疇又劃分成none,PerUserRomaing,PerUserRoamingAnaLocal,第一個就是不管他,交給API去處理,後面兩個就是以前.NET 1.0、.NET 1.1沒有的東西了。由字面上來看我們可以知道PerUserRoaming指的是漫遊使用者,第二個就泛指兩者;如果你的Application會在AD的環境下使用,卻對漫遊使用者完全沒頭緒的話,請先研究一下AD。不過我通常會把第二個當作Local User。

1.16.2006

上閤屋的青菜

死了!

這一陣子公司在報客戶的信託所得稅,加上原有要做的工作,忙翻了,都快變成月休四日了!

家裡的電腦也跟我鬧脾氣,老是有小問題。手上有一份關於Configuration的資料也一直都沒空整理...

昨天,公司尾牙,去上閤屋吃。一桌兩個夾子,可以選炸的,炒的...等等之類的東西。但是很久才會來,大概半小時左右。

這張圖片就是,當夾子選了炒青菜後,過了半個小時後送了的。重點是,大家的筷子都還沒動,他一來就是這個樣子,-_-'''

上閤屋限時兩個小時吃飯,那我不就只能用兩個小時湊到勉強一盤的青菜,ㄟ...這個會不會太扯。

以前上閤屋旗艦店開張沒多久,我就有去交關(台語,消費的意思)過,那時候品質很優,蝦子新鮮送菜快,昨天吃尾牙沒抽到大獎就很悶了,蝦子不是很鮮也算了,那青菜真的就太無敵了!

------------------------------------------------------------------------------------

Here are practice for English writing, welcome any comment for grammar or tech.

I have been on the go all month!