2009年9月30日 星期三

MCTS/MCPD認證

Visual Studio 2008 的 Windows Developer 3.5
  • MCTS 必要條件:TS: Microsoft .NET Framework – Application Development Foundation(Exam 70-536 (Exam 70-536)
  • MCTS 必要條件:TS: Microsoft .NET Framework 3.5 – Windows Forms Application Development(Exam 70-505)
  • MCPD 的需求:PRO: Designing and Developing Windows Applications Using the Microsoft .NET Framework 3.5(Exam 70-563)
70-536->70-505 ->70-563
================================================
Visual Studio 2008 的 ASP.NET Developer 3.5
  • MCTS 必要條件:TS: Microsoft .NET Framework – Application Development Foundation(Exam 70-536)
  • MCTS 必要條件:TS: Microsoft .NET Framework 3.5, ASP.NET Application Development(Exam 70-562)
  • MCPD 的需求:PRO: Designing and Developing ASP.NET Applications Using the Microsoft .NET Framework 3.5(Exam 70-564)
70-536->70-562->70-564
================================================
Visual Studio 2008 的 Enterprise Application Developer 3.5
  • MCTS 必要條件:TS: Microsoft .NET Framework – Application Development Foundation(Exam 70-536)
  • MCTS 必要條件:TS: Microsoft .NET Framework 3.5 – Windows Forms Application Development(Exam 70-505)
  • MCTS 必要條件:TS: Microsoft .NET Framework 3.5, ASP.NET Application Development(Exam 70-562)
  • MCTS 必要條件:TS: Microsoft .NET Framework 3.5, ADO.NET Application Development(Exam 70-561)
  • MCTS 必要條件:TS: Microsoft .NET Framework 3.5 – Windows Communication Foundation Application Development(Exam 70-503)
  • MCPD 的需求:PRO: Designing and Developing Enterprise Applications Using the Microsoft .NET Framework 3.5(Exam 70-565)
70536->70505->70562->70561->70503->70565
================================
自修參考資源
70-536參考資源:
* 參考用書: MCTS Self-Paced Training Kit (Exam 70-536): Microsoft® .NET Framework—Application Development Foundation, Second Edition
* 準備方向:Preparation Guide for Exam 70-536
* 參考課程:
o 2956A: Core Foundations of Microsoft .NET 2.0 Development(3天)
o 2957A:Advanced Foundations of Microsoft .NET 2.0 Development(3天)

70-502參考資源:
* 參考用書:MCTS Self-Paced Training Kit (Exam 70-502): Microsoft® .NET Framework 3.5—Windows® Presentation Foundation
* 準備方向:Preparation Guide for Exam 70-502
* 參考課程:6460: Visual Studio 2008: Windows Presentation Foundation(3天)

70-503參考資源:
* 參考用書:MCTS Self-Paced Training Kit (Exam 70-503): Microsoft® .NET Framework 3.5—Windows® Communication Foundation
* 準備方向:Preparation Guide for Exam 70-503
* 參考課程: Course 6461: Visual Studio 2008: Windows Communication Foundation (3天)

70-504參考資源:
*參考用書:MCTS Self-Paced Training Kit (Exam 70-504): Microsoft® .NET Framework 3.5 Windows® Workflow Foundation
* 準備方向:Preparation Guide for Exam 70-504
* 參考課程:Course 6462: Visual Studio 2008: Windows Workflow Foundation(2天)

70-505參考資源:
* 參考用書:MCTS Self-Paced Training Kit (Exam 70-505): Microsoft® .NET Framework 3.5—Windows® Forms Application Development
* 參考課程: Course 6265: Visual Studio 2008 : Windows Forms (5 days)(未定)
* 準備方向:Preparation Guide for Exam 70-505

70-561參考資源:
*參考用書:MCTS Self-Paced Training Kit (Exam 70-561): Microsoft® .NET Framework 3.5 - ADO.NET Application Development
* 準備方向:Preparation Guide for Exam 70-561
* 參考課程:6464: Visual Studio 2008 Connected Systems: ADO.NET 3.5(2天)

70-562參考資源:
* 參考用書:MCTS Self-Paced Training Kit (Exam 70-562): Microsoft .NET Framework 3.5 - ASP.NET (2009年第一季)
* 準備方向:Preparation Guide for Exam 70-562(4/24)
* 參考課程:6463: Visual Studio 2008 - ASP.NET 3.5(2天)

70-563參考資源:
* 準備方向:Preparation Guide for Exam 70-563

70-564參考資源:
* 準備方向:Preparation Guide for Exam 70-564

70-565參考資源:

=>好感動哦,一直不知道準備的方向,終於有了頭緒,呼呼

命名空間(M01)

using關鍵字與命名空間
使用命名空間分類及避免命名衝突
  • 直接使用命名空間
System.Console.WriteLine("AAA");
  • 使用using關鍵字引用命名空間
using System;
Console.WriteLine("AAA");
==============================
常用命名空間
System:基本程式所需要物件類別定義
System.Xml:提供處理XML資料時所需要的物件類別定義
System.Net:提供處理網路存取所需的物件類別定義
System.Data:提供ADO.NET存取資料所需要的物件類別定義
==============================
編譯應用程式
  • .NET Framework所提供C#編輯器
檔名:csc.exe
路徑:%WindowDir%\Microsoft.NET\Framework\v2.0.50727
cmd編譯
=>csc /out:HelloWorld.exe HelloWorld.cs
=>/out:用來設定編譯後輸出編件的檔名

2009年9月24日 星期四

自訂安裝程式

自訂安裝程式
  • Setup專案只能進行一般的安裝作業(一般應用程式、Web應用程式...等包裝程式的包裝作業)
  • 額外的安裝作業必須撰寫自訂安裝程(ex:安裝軟體順便安裝資料庫)
  • 自訂安裝程式有哪些
1、撰寫Script-vbs、js
2、一般執行檔-exe
3、撰寫可配合Setup專案安裝的Installer類別
=====================================================================
認識Installer類別
  • 提供專案的安裝程序
  • 簡化使用者安裝流程
  • 允許在安裝過程中詢問用程式的初始化設定
  • 如何撰寫Installer
1、繼承Installer類別
2、覆寫Install、Commit、Rollback及Uninstall方法
3、加入RunInstallerAttribute
4、將寫好的類別放到安裝程式中
5、執行安裝程式
=>Installer類別是自訂安程式的基底類別,隨著自訂安裝的需求可以覆寫以下類別
  • Install:在安裝程序時進行的程式
  • Commit:在完成安裝程式並確認安裝成功時進行程式
  • Rollback:在安裝失敗後將環境復原到原狀時所需進行的程式
  • Uninstall:在移除程式時進行的程式。
=>Installer的延伸類別可以透過安裝程式工具Installutil.exe及Setup專案上執行。
=>RunInstallerAttribute:預設為false。若設成true表示安裝程式可以讓Installutil.exe及Setup專案進行安裝作業。
=====================================================================
如何撰寫Installer類別
1、建立Class Library專案
2、加入參考Add Reference項目System.Configuration.Install
3、加入類別
4、繼承Installer

自訂Section區段(CustomConfig)(M08)

自訂Section區段
  • 使用時機:.Net Framework內定的Section不符合使用時

1、新增一個Departement區段,代表應用程式的使用部門

2、使用類別物件(新的Class),以便於後續開發者方便存取這個設定檔的內容
Public Class Department
Public Name As String
Public Manager As String
End Class

3、
建立一個實作IConfigurationSectionHandler介面的類別(新的Class),用來實作IConfigurationSectionHandler介面。使用Create方法,以取得組態區段中的attribute、element。
  • 第一個參數為父項物件,型別為Object
  • 第二個參數為組態內容物件,型別為Object
  • 第三個參數為區段的XML節點,型別為XmlNode

Imports System.Configuration
Public Class DepartmentHandler
Implements IConfigurationSectionHandler

Public Function Create(ByVal parent As Object, ByVal configContext As Object, ByVal section As System.Xml.XmlNode) As Object Implements System.Configuration.IConfigurationSectionHandler.Create
Dim dept As New Department
dept.Name = section.SelectSingleNode("Name").InnerText
dept.Manager = section.SelectSingleNode("Manager").InnerText
Return dept
End Function

End Class
4、必須在專案中的app.Config組態檔的區段中宣告Department型別

"Mod08_Section.DepartmentHandler,Mod08_Section"
專案名稱.處理Department類別名稱,專案名稱

5、取出自訂Section區段,使用Confurationmanager類別的GetSection方法取的Department區段再轉型為Department類別,即可使用存取
Imports System.Configuration

Dim dep As Department = CType(ConfigurationManager.GetSection("Department"), Department)
TextBox1.Text = dep.Name
TextBox2.Text = dep.Manager




2009年9月22日 星期二

使用ConfigurationManager管理組態檔

使用ConfigurationManager管理組態檔
命名空間
  • System.Configuration
方法
  • OpenExeConfiguration:開啟執行中應用程式的組態檔
  • OpenMachineConfiguration:開啟本機Machine.config的組態檔
  • AppSettings:取得目前應用程式的設定資訊
  • ConnectionString:取得目前應用程式的連線字串資訊
==================================
組態檔除了可以使用文字編輯器手動編輯外,也可以利用程式碼進行控制。
ConfigurationManager可以讓程式存取本機、應用程式、使用者的組態資訊。

組態檔的使用者層級
在開啟應用程式時可以指定使用者階級,它的列舉常數名稱是ConfigurationUserLevel,包含下列列舉值:
  • None:取得套用給全部使用者的組態資訊
  • PerUserRoaming:取得套用給目前使用者的漫遊(Roamining)組態資訊
  • PerUserRoamingAndLocal:取得用給目前使用者的本機組態資訊
=>漫遊(Roamining)在網域(Domain)環境中,使用者允許漫遊於網域中其它電腦,而使用者設定檔會隨著使用者的登入而更新到登入的那台電腦。
==================================
如何開啟組態檔
  • 開啟應用程式的組態檔
config = ConfigurationManager.OpenExeConfiguration( _
ConfigurationUserLevel.None)
TextBox1.Text = config.FilePath
=>D:\NET\U2956A\Exercise\Mod08\Mod08\bin\Debug\Mod08.vshost.exe.config
  • 開啟本機的組態檔
config = ConfigurationManager.OpenMachineConfiguration
TextBox2.Text = config.FilePath
=>c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Config\machine.config
==================================
開啟應用程式組態檔的步驟如下:
1、專案須參考System.Configuration組件
2、匯入System.Configuration命名空間
3、宣告ConfigurationManager
4、呼叫ConfigurationManager類別所提供的靜態方法OpenExeConfiguration
==================================
如何存取組態
  • 修改組態檔

==================================
appSettings區段的組態存取
Windows應用程式專案必須自行開啟app.Config檔案編輯。
=>測試要到D:\NET\U2956A\Exercise\Mod08\Mod08\bin\Debug\Mod08.exe測試才會準
=>如用D:\NET\U2956A\Exercise\Mod08\Mod08\bin\Debug\Mod08.vshost.exe修改組態檔會沒有效果

程式實作
'寫入
Dim config As Configuration
config = ConfigurationManager.OpenExeConfiguration( _
ConfigurationUserLevel.None)
config.AppSettings.Settings("FileServer").Value = TextBox6.Text
config.Save()
'讀取
TextBox6.Text = config.AppSettings.Settings("FileServer").Value
==================================
connectionStrings區段的組態存取
'寫入
Dim config As Configuration
config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
config.ConnectionStrings.ConnectionStrings("Mod08.My.MySettings.cnToNorthwind").ConnectionString = TextBox7.Text'可修改application層級
config.Save()
'讀取
TextBox7.Text = ConfigurationManager.ConnectionStrings( _
"Mod08.My.MySettings.cnToNorthwind").ConnectionString'如用ConfigurationManager修改Application層級會顯示只能唯讀錯誤

使用工具編輯應用程式組態檔(M08)

使用工具編輯應用程式組態檔
Web專案

  • WebSite->ASP.NET Configuration
  • 連線字串、應用程式組態、安全性…
Windows專案
  • Solution Explorer選取My Project按滑鼠右鍵選取Open
  • 連線字串
  • 應用程式組態
Window應用程式組態項目分成二個存取範圍
  • Application:指應用程式所有的使用者共享的組態資訊,像是連線字串,應用程式專屬的環境變數。
  • User:指應用程式登入使用者的個別組態資訊,每個使用者都可以有自己的組態設定值,並且存在系統的使用者設定檔中「C:\Document and Settings\[使用者]\Local Settings\Application Data\[公司名稱]\[組件].exe_Url_[GUID]\版本\user.config
=====================================================
如何存取Application/User範圍的組態項目
  • Visual Basic使用My的Settings類別
Visual Basic TextBox1.Text=My.Settings.CompanyName

  • C#使用專案根命名空間的Properties.Settings
C# TextBox1.Text=WinConfig.Properties.Settings.Default.CompanyName;

存取Application範圍的組態項目
Application範圍的組態項目:只能讀取。
User範圍的組態項目:允許讀寫的項目。

程式實例

Imports System.Configuration
'寫入
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
My.Settings.ForeColor = Color.FromName(TextBox2.Text)
My.Settings.BackColor = Color.FromName(TextBox3.Text)
End Sub
'讀取
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
TextBox1.Text = My.Settings.CompanyName
TextBox2.Text = My.Settings.ForeColor.Name
TextBox3.Text = My.Settings.BackColor.Name
End Sub

2009年9月21日 星期一

Shared Assembly VS Private Assembly(M08)

私有組件與共享組件
共享組件(Shared Assembly)
1、要有StrongName,Version
2、載入檢查SimpleName, StrongName,Version
3、可放在任何位置除了CAS(Global Assembly Cache在「系統磁碟:\WINDOWS\assembly」位置下)以外的位置要寫設定檔

共享組件設計步驟:
共享組件必須有強式名稱(Strong-Name),強式名稱組件的設定如下:
1、Solution Explorer上選取My Project按滑鼠右鍵選取「Open」
2、在專案屬性頁上選取(左邊)「Signing」(簽署),並勾選「Sign the assembly」(簽署組件)

3、在「Choose a strong name key file:」下拉選項選,接著會出現「Create Strong Name Key」視窗,在此視窗的「Key file name:」輸入強式名稱金鑰的檔名,並清除「Protect my key file with a password」。

================================================
私用組件(Private Assembly)
1、載入時只檢查SimpleName
2、必須放在應用程式所在的目錄或子目錄下
3、若放Application所在的子目錄必須寫設定檔
=>.NET預設是私有組件(Private Assembly),必須與應用程式放在同一個目錄下。
=============================================================
開發階段用來取代GAC組件
  • 避免開發週期不斷的將組件重新置放到GAC
步驟
  • 設定環境變數DEVPATH
  • 組態檔指定developmentMode

如何新增環境變數
1、在「我的電腦」上按滑鼠右鍵選取「內容」,點選「進階」頁籤,按「環境變數」按鈕。
2、在「環境變數」視窗上選取「新增」。
假設您正在建置 (Build) 稱為 SharedAssembly 的共用組件,而輸出目錄為 D:\SharedAssembly\Debug。您可以將 D:\SharedAssembly\Debug 放在 DEVPATH 變數中。
3、您必須接著在電腦組態檔中指定項目。這個項目會告訴 Common Language Runtime 要使用 DEVPATH 來找出組件。

developerInstallation:指定執行階段是否在 DEVPATH 環境變數所指定的目錄中搜尋組件。true:在 DEVPATH 環境變數所指定的目錄中搜尋組件。


精力管理

<精力管理>
必須在消耗精力和恢復精力取得平衡,學習超越極限,像頂尖運動員一樣自我訓練。
一、充份投入:靠關連的精力相互運用
(1)身體精力:動作提示、運動
(2)情緒精力:喜、怒、哀、樂
(3)心理精力:邏輯思考、忍耐力、穩定度
(4)精神精力:痛苦指數,超越極限
二、不要過與不及:使用太多或太少精力會使我們身體的能量降低。
(1)消耗精力與恢復精力取得Balance
三、超越正常極限:為了建立能力,我們常常強迫自己超越極限,有系統的訓練自己
四、養成固定習慣:要充份投入和維持高績效的關鍵,就是在於「把精力管理當成自己的習慣」。

這是一篇偶然得到的文章,我也不知道出處和作者是誰,只是這個如何維持身體精力平衡的概念讓我覺得蠻有趣的,超越自我界限,不要過與不及,隨時保持精力的平衡,有點類似中庸之道。

簡單而言,就是在追求某種極限之餘,也要讓身體適度的休息,讓精神保持彈性,才有力氣再去迎接接下來的挑戰。說到這就想到最近在追求提升自我的專業力和語言力,努力努力著,短期內無法達到目標,但我相信,再不斷不斷的接近,會讓我達到我要的需求…加油。

2009年9月17日 星期四

組態及安裝應用程式(M08)

認識.NET Framework2.0的組態檔
  1. XML格式的檔案
  2. 用來設定應用程式的連結字串、安全性、應用程式的環境組態及版本控制
  3. 本機層級(Machine.config,預設儲存於[安裝磁碟]:\WINDOWS\Microsoft.Net\Framework\版本\CONFIG)
  4. 應用程式層級(一般應用程式:組件名稱.exe.config,一般應用程式組態檔必須和執行檔放在相同目錄、Web應用程式:Web.config)
  5. 編修方式有文字編輯器、MMC管理工具、Visual Studio 2005提供的工具、ConfiguratonManager類別
=========================================================
.Net Framework執行階段的版本控制
  • 電腦同時有.Net1.0、.Net1.1而未寫組態檔的情況
一般應用程式或組件在什麼版本下建置,程式執行時在執行組件當時所建置的版本。

=========================================================
.NET Framework執行版本控制
  • 只支援.NET1.0版
=>.NET Framework 1.0所建置的應用程式,必須使用requiredRun指定應用程式所支援的.NET Framework版本。requiredRuntime的version:指定版本;safemode:指定程式碼是否援譣註冊機碼以決定Runtime版本,預設為false,設為true時代表不搜尋註冊機碼







  • 支援.NET1.1以後版本
=>.NET framework1.1(含)以後建置的應用程式,必須使用supportedRuntime指定應用程式所支援的Runtime版本。






===========================
NET1.0=>V.S.2002
NET1.1=>V.S.2003
NET2.0=>V.S.2005
NET3.5=>V.S.2008(2.0、3.0、3.5)
===========================
=>.NET Framework2.0版所建置的應用程鋨只能在有.NET Framework2.0的環境執行,原因是大量引進新的類別與指令,舊版Runtime不支援。
=>.NET Framework1.0版所建置的應用程式通常可以在.NET Framework 1.0、1.1、2.0的環境上執行。.NET Framework1.1通常也可以在.NET Framework1.1、2.0上執行。但必須實際上測試才知道。

使用SortedList集合(M03)

使用SortedList集合
  • 可使用數值索引(Index)和Key值存取集合中的項目
  • 類似HashTable與Array的組合體
  • 內部維護兩個陣列(以key排序的陣列和以Value排序的陣列)
  • 根據Key值進行排序
使用SortedList物件的考量
SortedList是Key/value配對所成的集合,以key值排序,可以利用key或索引存取其中的項目。當新增時,會適當進行排序,因此建立SortedList成本是相當昂貴的。
適用SortedList情境
  • 當資料變動性不大時,新增、刪除集合項目不頻繁,或資料量不大時。
  • 要快速利用索引值,或key值讀取集合中的項目時。
  • 需要排序的項目,或查詢特定物件時。
避免使用SortedList情境
  • 集合中的項目大量變動時,因為新增項目之後需排序,需花費很久時間。若變動性大,不如改成ArrayList,它也提供排序功能,但花費的時間比SortedList少。
  • 不要使用SortedList排序字串,會額外花費轉型的負擔,若有需要排序字串,可以改用StringCollection集合。
==================================================
使用StringCollection集合
  • 定義在System.Collections.Specialized命名空間
  • StringCollection集合
=>位於System.Collections.Specialized命名空間之下
=>許多字串所成的集合
  • StringDictionary集合
=>內部實作一個HashTable
=>每個項目是一個DictionaryEntry物件

2009年9月16日 星期三

HashTable VS HybridDictionary(M03)

使用HashTable
  • Key/Value成對出現的資料結構。
  • 項目存放的順序,和加入的先後次序無關,內部項目排列順序是根據HashCode排序。
  • 索引鍵可以是文字或數值。
=>因為Hashtable中項目沒有按新增的順序排列,因此新增、行除項目的方法只能使用Add、Remove方法。Clear可以清除所有項目

程式實作
Module Module1

Sub Main()
Dim ht As Hashtable = New Hashtable
ht("10") = "Mary"
ht("20") = System.DateTime.Now
ht("30") = 100

For Each o As DictionaryEntry In ht
Console.WriteLine("Key:{0}-->Value:{1}", o.Key.ToString, o.Value.ToString)
Next
ht.Remove("10")

End Sub

End Module

使用Hashtable的考量
  • 適用在變動程度高,以及不易變動資料上。當然由於Hashtable根據Hash Code排序,資料變動的程度高代表要額外花費計算hash值的成本。
  • 如果集合中項目少於10個,使用ListDictionary來存放Key/Value配對所成的集合,可得較佳的效能。
=====================================================
使用HybridDictionary
  • 位於System.Collections.Specialized命名空間之下
  • 集合中的項目需要Key/Value配對出現
  • 內部用來儲存資料的物件(項目少:使用ListDictionary;項目多:使用HashTable)
  • 適合在無法預期集合中的資料量時
  • 不適用在排序

使用Stack VS Queue(M03)

使用堆疊(Stack)

1、循序存取集合中的項目
2、後進先出(LIFO)類型的資料架構
3、常用方法
  • Push:新增一個項目到頂端。
  • Pop:從Stack頂端取出一個項目。
  • Peek:允許檢視堆疊頂端上的項目,但不將之移除。若在空的堆疊上呼叫Peek,會觸發InvalidOperationException
程式實作
Module Module1

Sub Main()
Dim st As New Stack
st.Push(1)
st.Push(2)

Dim nIndex As Integer = 0

For Each o As Object In st
Console.WriteLine("移除前Queue->{0}:" + ControlChars.Tab + "{1}", nIndex, o.ToString)
nIndex = nIndex + 1
Next o
st.Pop()

nIndex = 0

For Each o As Object In st
Console.WriteLine("移除後Queue->{0}:" + ControlChars.Tab + "{1}", nIndex, o.ToString)
nIndex = nIndex + 1
Next o
st.Clear()

End Sub

End Module

使用Stack考量
  • 需以後進先出時。
  • 使用完資料之後就可以丟棄此資料項目時。
  • 建立時最好設定初始的容量(Capacity),避免無意義的浪費記憶體。
=====================================================
使用佇列(Queue)
1、先進先出(FIFO)類型的資料結構
2、常見方法
  • Enqueqe:新增一個項目到Queue的後面。
  • Dequeue:從Queue中移除一個項目,並回傳目前被移除的這個項目。若從空的佇列中移除一個項目會觸發InvalidOperationException例外。
  • Clear:清除所有項目。
  • Peek:查詢第一個項目,不移除此項目。若從空的佇列中呼叫Peek方法,一個項目會觸發InvalidOperationException例外。
3、常見屬性
  • Count:回傳此Queue有多少個項目。
程式實作
Sub Main()
Dim q As New Queue
q.Enqueue(1)
q.Enqueue(2)
q.Enqueue(3)
Dim nIndex As Integer = 0
For Each o As Object In q
Console.WriteLine("Queue->{0},{1}", nIndex, q.ToArray(nIndex).ToString)

nIndex += 1
Next
End Sub

使用Queue的考量
  • 需使用先進先出時
  • 為循序資料時

DataSet序列化(M04)

1、使用DataSet內建方法
  • WriteXML方法:將DataSet寫成XML檔
  • ReadXML方法:將XML檔還原為DataSet
  • GetXML方法:取得序列化後的XML字串資料
2、控制DataSet序列化格式
  • 修改DataSet的DataSetName屬性
  • 修改DataTable的DataTable屬性
  • 修改DataColumn的ColumnName屬性
  • 修改DataColumn的ColumnMapping屬性
===================================
程式實作
Public Class Form1

Private Sub JobsBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles JobsBindingNavigatorSaveItem.Click
Me.Validate()
Me.JobsBindingSource.EndEdit()
Me.JobsTableAdapter.Update(Me.PubsDataSet.jobs)

End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'TODO: 這行程式碼會將資料載入 'PubsDataSet.jobs' 資料表。您可以視需要進行移動或移除。
Me.JobsTableAdapter.Fill(Me.PubsDataSet.jobs)

End Sub
Public ds As New pubsDataSet
Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripWriteDataSet.Click
Me.JobsTableAdapter.Fill(Me.ds.jobs)
ds.DataSetName = "工作列表"
For Each dc As DataColumn In ds.Tables(0).Columns
dc.ColumnMapping = MappingType.Attribute

Next
ds.Tables(0).Columns("job_id").ColumnName = "工作編號"
ds.WriteXml(Application.StartupPath & "\DataSet.xml")
End Sub

Private Sub ToolStripButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripReadDataSet.Click
ds.Clear()
ds.ReadXml(Application.StartupPath & "\DataSet.xml")
MessageBox.Show("共讀取到" & ds.Tables(0).Rows.Count.ToString & "筆資料")
End Sub

Private Sub ToolStripButton3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripGetDataSet.Click
MessageBox.Show(ds.GetXml)
End Sub
End Class

SOAP序列化(M04)

SOAP序列化
SOAP(Simple Object Access Protocol)標準定義基本物件型別的XML描述方法,也定義了遠端程序呼叫的標準。
SOAP序列化和反序列化物件
SOAP結合XML序列化和Binary序列化的兩個重要特性,一是格式為標準XML,具備跨網際網路的特性,二是對於Private資料也能夠保存。
=====================
1、參考System.Runtime.Serialization.formatters.Soap.dll
2、SOAP序列化和反序列化物件
  • System.Runtime.Serialization.Formatters.Soap
  • 使用Formatter物件
  • 使用Stream物件
  • 呼叫Serialize和Deserialize方法
========================================
Public Class Person
Public strName As String = "Jerry"
Private intAge As Integer = 18
End Class
=====================

Imports System.Runtime.Serialization.Formatters.Soap
Imports System.IO
Public Class Form1


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'1、建立及使用物件
Dim obj As New Person


'2、序列化SOAP物件
Dim Formatter As New SoapFormatter()
Dim fs As New FileStream(Application.StartupPath & "\Person.xml", FileMode.Create)

Formatter.Serialize(fs, obj)
fs.Close()
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'3、反序列化還原物件
Dim Formatter As New SoapFormatter()
Dim fs As New FileStream(Application.StartupPath & "\Person.xml", FileMode.Open)
Dim obj As Person = CType(Formatter.Deserialize(fs), Person)
fs.Close()
MessageBox.Show("Deseriablize OK...Name = " & obj.strName)

End Sub
End Class

2009年9月13日 星期日

序列化(M04)_Binary VS XML

序列化是一種轉換記憶體的物件資料格式技術,目的在於將物件資料轉換成可以保存於檔案或其他儲存位置的技術,方便未來將物件資料保存或傳送。
  • 跨AppDomain時使用
何謂序列化與反序列化
序列化技術同時也包含反序列化方法,當物件資料序列化成資料串流(Stream)格式,藉由網路送到其他位置時,需使用反序列化的方法將之還原成物件方能繼續使用物件

.NET相關序列化技術
1、Binary Serialization
  • 提供物件的完整型別保存,通常用鄉跨不同應用程式之間的物件交換ex:剪貼簿可將物件序列化後放進剪貼簿,就像應用程式關閉,也可從剪貼簿反序列化到另一個應用程式使用。
  • 將物件序列化之後可以轉換到 資料串流、硬體或記憶體,透過網路就可和各應用程式交換資料。ex:Romoting技術就是依靠序列化技術完成遠端呼叫的資料傳遞。
Binary Serialization實作
(1)建立一個可序列化的類別
  • 套用Serializable Attribute
  • 套用NonSerialized Attribute
(2)序列化及反序列化物件
  • System.Runtime.Serialization.Formatters.Binary
  • 使用Formatter物件
  • 使用Stream物件
  • 呼叫Serialize與Deserialize方法

Imports System.Runtime.Serialization.Formatters.binary
Imports System.IO

Public Class BinaryClass
Private Name As String = "Jerry"
Private Age As Integer = 10
Private Birthday As Date

Public Property strName() As String
Get
Return Name
End Get
Set(ByVal value As String)
Name = value
End Set
End Property

Public Property intAge() As Integer
Get
Return Age
End Get
Set(ByVal value As Integer)
Age = value
End Set
End Property

Public Property dateBirthday() As DateTime
Get
Return Birthday
End Get
Set(ByVal value As DateTime)
Birthday = value
End Set
End Property
End Class

=====================
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.IO

Public Class Form1
'1、建立物件及使用物件
Dim People As New BinaryClass()
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

People.strName = "Jerry"
People.intAge = 18
People.dateBirthday = "2009/09/15"

'2、將序列化成Binary檔案
Dim formatter As New BinaryFormatter()
Dim fs As New FileStream(Application.StartupPath & "People.bin", FileMode.Create)
formatter.Serialize(fs, People)
fs.Close()
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'3、反序列化為物件
Dim formatter As New BinaryFormatter
Dim fs As New FileStream(Application.StartupPath & "People.bin", FileMode.Open)
Dim obj As BinaryClass = CType(formatter.Deserialize(fs), BinaryClass)
fs.Close()
Messagebox.Show("Deserialize OK...Private strName" & obj.strName)
'MessageBox.Show(Application.StartupPath & "People.bin")
End Sub
End Class
========================================
2、XML Serialization
  • 只保存物件當中Public的成員資料與成員屬性,不保證資料完整性,通常應用在單純的資料保存及傳遞,且由於序列化後資料格式為XML,為一個開放的標準,適合於現今的網路中。
  • 但因XML格式完全開放自行定義,會導致不相容於所有應用程式的情況發生,而SOAP標準就成為應用程式之前XML資料格式的標準了,讓資料更具通透性。
XML Serialization實作

(1)建立一個類別包含Public的資料
(2)XML序列化和反序列化物件
  • System.Xml.Serializtion
  • 使用Stream物件
  • 呼叫Serialize與Deserialize方法

Public Class MyBook
Public bookID As Integer
Public bookName As String
End Class
=====================
Imports System.IO
Imports System.Xml.Serialization
Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'1、建立及使用物件
Dim obj As New MyBook
obj.bookID = 10
obj.bookName = "琦真說童年"
'2、序列化XML物件
Dim ser As New XmlSerializer(GetType(MyBook))
Dim fs As New FileStream(Application.StartupPath & "\MyBook.xml", FileMode.Create)
ser.Serialize(fs, obj)
fs.Close()
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'3、反序列化還原物件
Dim ser As New XmlSerializer(GetType(MyBook))
Dim fs As New FileStream(Application.StartupPath & "\MyBook.xml", FileMode.Open)
Dim obj As MyBook = CType(ser.Deserialize(fs), MyBook)
fs.Close()
MessageBox.Show("Deseriablize OK...PublicBookName = " & obj.bookName)
End Sub
End Class
========================================
使用Attribute控制XML序列化
(1)建立一個類別包含Public資料
(2)XML序列化及反序列化物件
(3)如何使用Attribute控制XML序列化
  • System.Xml.Serialization Namespace
  • XmlRoot Attribute
  • XmlElement Attribute
  • XmlAttribute Attribute
(4)控制陣列型別的序列化
  • XmlArray Attribute
  • XmlArrayItem Attribute
=====================
Imports System.Xml.Serialization

Public Class MyProduct
Public productID As Integer
Public productName As String
End Class
=====================

Imports System.IO
Imports System.Xml.Serialization
Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'1、建立及使用物件

Dim obj As New MyProduct
obj.productID = 123
obj.productName = "可愛小寶具"


'2、序列化XML物件
Dim ser As New XmlSerializer(GetType(MyProduct))
Dim fs As New FileStream(Application.StartupPath & "\MyProduct.xml", FileMode.Create)
ser.Serialize(fs, obj)
fs.Close()
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'3、反序列化還原物件
Dim ser As New XmlSerializer(GetType(MyProduct))
dim fs as New FileStream(application.StartupPath & "\MyProduct.xml",FileMode.Open)
Dim obj As MyProduct = CType(ser.Deserialize(fs), MyProduct)
fs.Close()

MessageBox.Show("Deseriablize OK...PublicBookName = " & obj.productName)
End Sub
End Class
========================================
使用控制Array型別序列化
Imports System.Xml.Serialization

Public Class MyProduct
Public productID As Integer
Public productName As String
End Class

=====================

Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
'1、建立及使用物件
Dim obj As New Group
Dim emp1 As New Employee
Dim emp2 As New Employee
emp1.Name = "Jerry"
emp2.Name = "John"

obj.Employees(0) = emp1
obj.Employees(1) = emp2
'2、序列化XML物件
Dim ser As New XmlSerializer(GetType(Group))
Dim fs As New FileStream(Application.StartupPath & "\Group.xml", FileMode.Create)
ser.Serialize(fs, CType(obj, Group))
fs.Close()
End Sub

Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
'3、反序列化還原物件
Dim ser As New XmlSerializer(GetType(Group))
Dim fs As New FileStream(Application.StartupPath & "\Group.xml", FileMode.Open)

Dim obj As Group = CType(ser.Deserialize(fs), Group)
fs.Close()
MessageBox.Show("Deseriablize OK...Group = " & obj.Employees(0).Name)

End Sub

2009年9月8日 星期二

工作管理員和記憶體定址空間(M2)

工作管理員

一、記憶體使用歷程記錄:圖示包含全部的虛擬記憶體,也就是實體記憶體+交換檔。記憶體的指標在上下游移就已經可能有問題,因為代表持續需要使用硬碟交換檔上的記憶體。

二、總計:左上角的總計代表著系統中多個應用程式所使用的Windows物件,由於存取Windows各種物件都需要透過2個32位元的「控制碼(Handles)」,所以這裡代表著系統中用了多少個Windows的基礎物件。
=>在「處理程序」頁籤,選擇主選單上「檢視」->「選擇欄位」選項,在「選擇欄位」對話窗中勾選「控制碼計數(Handle Count)」或「執行緒計數(Thread Count)」,再將各程序這兩欄的值加總。而「處理程序」則代表系統上正在執行的處理程序數目。

三、實體記憶體(K):「總共」代表系統實體記體的總數,以KByte為單位。「可用」代表實體記憶體中,尚未被使用的數量。「系統快取記憶體」代表被系統保留做快取用的記憶體大小,這是系統保留給I/O等核心運作時所需的暫存區。

四、確認負載(K):代表虛擬記憶體的使用狀況。「總共」代表已經使用的虛擬記憶體。「限制」代表系統最大虛擬記憶體量。「尖峰」代表曾經使用到最大虛擬記憶體量。

五、核心記憶體(K):代表作業總系統核心所使用的記憶體量。「已分頁」代表可以被置換出去到硬碟的記憶量。「未分頁」代表無論如何都不可以被置換出去到硬碟的記憶體的量。

X86架構下程序的記憶體定址空間
在32位元的定址架構下,理論上是4GBytes空間大小,而實際上該空間會對切成使用者(user)和系統(system)區塊。
=>一般來說,應用程式使用的空間最大為2GB,放的是應用程式的程式碼、公共變數、資料結構、每一條執行緒的堆疊,以及DLL程式碼。
=>系統區塊則放著作業系統的程式碼、HAL、各種系統的資料結構,以及各種驅動程式等等。

當要存取這兩個不同區塊的記憶體時,CPU必須要切換模式,避免一般應用程式出錯時損毀系統區塊,導致整個系統當機。

但所有在系統記憶體區塊執行彼此並沒有保護,因此往往不佳的驅動程式會讓系統呈現極不穩定的狀態。
=>當系統超過2GB以上實體記憶體空間時,需要在boot.ini設定啟動數/3GB或PAE,應用程式才可以使用超出2GB以上的實體記憶體。

2009年9月2日 星期三

各項硬體使用剖析

各項硬體使用剖析
=>不管是使用系統上的哪一項資源,當使用率持續趟過80%時,系統的整體效能必定會急速下滑,而不會呈現線性關係,表示此系統已達「臨界門檻」或「可用性門檻」。

動力泉源

前陣子在工作上遇上的瓶頸,那就是MIS日復一日重覆的工作,
上班不能看雜七雜八的書,至少也讓我有動力動一動吧,
讓人身心感到厭煩,生活沒有成就感,直覺性的操作感覺好像機器,
最近I部上課,讓我從這困境爬了出來,
學習~輸出~學習~輸出,果然還是成長的動力來源,
我要在這邊努力加油,用我的手腦產生的成果,
不要在意別人了…趕緊加油吧…

2009年9月1日 星期二

SQL Service架構(M02)

一、SQL Service架構
1、Database Engine
a、是用於儲存、處理和保護資料的核心服務。
b、可建立線上交易或分析的關聯式資料庫,包括資料表、索引、檢視和預存程序等資料庫物件,以檢視管理和保護資料。
c、整合.NET CLR引擎到SQL Server核心,讓程式設計者可用.NET語言來開發SQL Server內物件。
d、支援ANSI SQL 2003與W3C的XML標準,讓關聯式資料與XML兩種常用的資料儲存格式都可集中到Database Engine來處理。

2、Full Text Search
a、SQL Server 7.0,使用Microsoft Search Service讓資料表欄位內容可以全文檢索方式查詢
b、SQL Server 2000之後,增加image資料格式檢索能力,可將.doc、.xls、.ppt、.txt、.htm直接放入SQL Server大型二進位欄位一併檢索。
d、SQL Server2005建立全文檢索的Catalog內容時,擴展Index population的速度較舊版速度快上一倍,查詢效率30~50%。
=>全文檢索服務支援多執行個體(multi-instanced),而各SQL Server執行個體使用各自全文檢索服務執行個體時,不會互相干擾。
=>支援叢集架構以提高可獲得性
=>可以備份/還原、卸離/附加(detach/attach)全文檢索的catalog,讓資料庫還原或搬移時,不需重建catalog

3、Replication
複寫用於從某個資料庫複製/散發資料和物件至另一資料庫,之後在兩個資料庫之間進行同步處理以維護一致性。
SQL Server提供三種複寫
a、快照式複寫
b、交易式複寫
c、合併式複寫

4、Query Notification
SQL Server2005在使用者存取的資料被他變更時,可主動地通知前端應用程式。

5、Service Broker
提供訊息導向或非同步程式的開發平台,透過SQL Server所提供的佇列(Query),讓服務間非同步的溝通,並保證訊息傳遞間的品質,訊息一定送達且按照發送的先後順序只寄達一次。

6、Analysis Services 2005提出的概念
a、整合異質型資料來源
b、豐富的資料呈現與瀏覽模型,以專業領域的用詞呈現符合商業邏輯的資料
c、深入分析
d、進階的快取

7、Integration Services

8、Reports Services
=============================
二、SQL Server資料存取架構
1、查詢:透過各種物件建立SQL查詢語法
2、使用者端Net-Library採用預設的協定,或是以「用戶端網路公用程式」(SQL Server Client Network Utility)設定通訊協定,經由呼叫Windows的IPC(communication)API,將封包轉由作業系統所支援的通訊協定堆疊傳出。
=>一般來說SQL Server7.0之前優先採用具名管道(Named Pipes),SQL Server 2000之後改採TCP/IP。
=>可採用各種加/解密法傳輸,但會降低效率。
3、ODS(Open Data Services)負責將TDS(Tabular Data Stream)封包內的SQL語法還原,並轉交給關聯式引擎。關聯式引擎最佳化執行計劃後,再賦予儲存式引擎執行。
4、儲存引擎執行完關聯式引擎交付的執行計劃後,將結果傳回給關聯式引擎,關聯式引擎再將其包裝成結果集(resultset),並傳遞給ODS。
5、ODS將結果轉成TDS封包,繼續回傳給「伺服器端Net-Libraries」,「伺服器端Net-Libraries」與「使用者端Net-Library」合作,將結果透過網路傳回。
「使用者端Net-Library」將網路封包還原成TDS封包,轉給上層資料庫介面OLE DB或ODBC等等。
6、OLE DB或ODBC將TDS所描述的結果集還原成上層應用程式可以接受的「結果集 」也就是我們一般應該程式存取的結果。
=============================
三、SQL Server的核心分成兩大引擎
1、Relational Engine

=>SQL Manager總管所有事務的流程,因為透過TDS傳遞有可能是一般SQL語法/pseudo預存程式。
=>一般SQL語法交由左方單元執行。
=>pseudo系統預存程序則由SQL Manager自行處理。
=>再透過ODS轉成TDS通訊協定還給使用者。
=>Catolog Service主要處理Create Table、Create View等語法,Catalog Services主要可橫跨兩個引擎(關聯式引擊/儲存引擎)
=>UMS(User Mode Scheduler)與ODS合作,將工作排程賦予到Thread或fiber。負責有效地運用多CPU的硬體資源,且避免過多的Thread反而拖垮系統。
=>系統預存程序則是由一堆額外之DLL實作出來的,主要提供SQL Server延伸的功能(ex:COM元件)。

a、Relational Engine主要工作
(1)掃描與分析SQL語法,將其分成各個邏輯單元,如關鍵字、參數、運算子及識別項。
(2)建立最佳的執行計畫:此為關聯式引擎最重要的工作。一般而言相同的SQL語法其執行並建立結果集的方式不止一種。查詢最佳化程式(Query Optimizer)必須判斷各種方式、估計其成本(以檔案I/O與使用CPU為主),選擇其成本最低的方式。
(3)處理資料定義語言(DDL)和其它SQL語法(例如:Create、Set等語法)。
(4)格式化結果:關聯式引擎會將回用戶端的結果格式化,可能會格式化成傳統的表格式結果集,或成為XML文件。然後結果會被封裝成一個以上的TDS封包,再傳回前端應用程式。
=============================
2、Storage Engine
=>Access methods manager:設定並要求對資料表或索引做掃描的動作,準備記錄集以傳回關聯式引擎。
=>Row operations manager:存取、修改和執行其它與單筆記錄相關的運作。
=>Index manager:存取索引的搜尋。
=>Page manager:控制分頁(Page)和extent的存取。
=>Text manager:控制text和image資料型態的儲存。
=>Lock manager:要求並釋放鎖定、解決死結,並在需要時升高鎖定的層級。
=>Log manager:將在記憶體中的交易記錄成可寫進硬碟記錄檔。
=>Sort manager:管理資料排序工作。
=>Transaction manager:管理交易,並與Lock Manager協調鎖定的運作。
=>File/Device manager:管理硬碟上的檔案和備援裝置。
=>Buffer manager:讀取實體分頁,將分頁的內容放入記憶體,並協助其它的manager讀取分頁內容。
=& gt;其它的manager:管理各種工具程式,如大量載入(bulk load), DBCC,備份和還原,以及虛擬裝置介面(Virtual Device Interface;VDI)。VDI讓工具程式可以存取SQL Server的資料結構而不需要經過關聯式引擎。

a、儲存引擎主要的工作表如下:
(1)管理資料庫的實體檔案
(2)建立及讀取硬碟上儲存著資料的分頁。
(3)管理實體檔案的資料緩衝區及I/O。
(4)控制多個需求的並行處理。
(5)管理交易並使用鎖定來控制平行存取的資料行。
(6)記錄(Log)與復原。
(7)實作公用程式功能(ex:BACKUP、RESTORE和DBCC陳述式及大量複製(Bulk Copy)等)