Monday, June 25, 2007

เขียนโปรแกรมสั่งให้ Shutdown วินโดว์

เนื่องจากผมต้องเขียนโปรแกรมตัวหนึ่ง ซึ่งเมื่อ run เสร็จแล้ว ก็จะต้องสั่งให้เครื่องคอมพิวเตอร์ shutdown เองได้ ผมจึงต้องหาวิธีที่ทำให้โปรแกรม Visual Basic 6.0 ของผมสามารถ shutdown ได้

โดยปกติในระบบปฏิบัติการวินโดว์มี command-line สำหรับการสั่งให้เครื่อง shutdown คือ

>>shutdown

ผมจึงปิ้งไอเดียขึ้นมาทันทีครับ ก็สั่ง command-line ว่า shutdown ในโค้ดของโปรแกรม เมื่อทำงานเสร็จแล้วก็ได้นิครับ

Sub FunctionX()
...
Shell "shutdown -s -f"
End Sub

แค่นี้โปรแกรมนี้ก็จะสั่งให้วินโดว์ Shutdown ตัวเองแล้วล่ะครับ สำหรับ -s คือ Shutdown, -f คือการบังคับให้ shutdown แม้ว่ามีโปรแกรมใดเปิดค้างไว้ก็ตาม

ทั้งนี้ใน VB.NET ก็สามารถใช้คำสั่ง Shell นี้ได้ด้วยนะครับ

Friday, June 22, 2007

Refactor!™ for Visual Basic® .NET 2005

ถ้าใครใช้ VB.NET แล้วรู้สึกน้อยใจที่ไม่มี Refactor แบบ C# บ้างล่ะก็
ลองเข้าไปดูที่นี่ครับ

http://www.devexpress.com/Products/NET/IDETools/VBRefactor/

เป็น tools สำหรับการทำ refactor บน VB.NET ครับ พัฒนาโดย Devexpress ครับ
มีความสามารถในการทำ refactor ที่ดี เช่น
  • Create Overload
  • Extract Interface
  • Extract Method
  • Extract Property
  • Encapsulate Field
  • Remove Parameter
  • Reorder Parameters
  • Rename
  • ฯลฯ
โดยทั้งหมดนี้ **ฟรี** ครับ

Tuesday, June 19, 2007

E-learning Windows Vista and the .NET 3.0

Microsoft เปิดหลักสูตร E-learning ฟรี ทั้งหมด 3 หลักสูตร ดังนี้
แนะนำว่าผู้เรียนต้องมี High-speed internet ครับ
สามารถดูรายละเีอียดได้ที่ http://www.microsoft.com/learning/windowsvista/dev/default.mspx

Client Callbacks without Postbacks in ASP.NET ตอนที่ 2

ในตอนที่แล้ว ผมได้อธิบายถึงหลักการในการเขียนโปรแกรม Callback without Postbacks ไปแล้ว ซึ่งทำให้เบราว์เซอร์ไม่จำเป็นต้อง Postback กลับไปยังเซิร์ฟเวอร์ทั้งเพจ content โดยใช้ Interface ชื่อ ICallbackEventHandler โดย implement เมธอด RaiseCallbackEvent และ GetCallbackResult มาในตอนนี้ ผมจะพูดถึงขึ้นตอนการเขียนโค้ดครับ

การสร้างเพจ Callbacks without Postbacks
ผมแสดงตัวอย่างเป็นขั้นตอน ดังนี้

1. ก่อนอื่นให้สร้างเพจ aspx ตามรูป

  • TextBox1 เป็นตัวรับข้อความ
  • TextBox2 เป็นตัวแสดงข้อความ
  • Button เป็น HTML control (ไม่มี runat="server") เป็นตัวเรียกฟังก์ชัน Callback
2. ทำการ Implement ICallbackEventHandler
  
Partial Class _Default
Inherits System.Web.UI.Page
Implements ICallbackEventHandler
...
End Class

3. เขียนไคลเอ็นต์สริปต์เพื่อเรียกใช้เมธอด callback ในเพจ aspx ระหว่าง head tag
      
<head>
<script type="text/javascript">
01 function ShowText()
02 {
03 nametxt = document.getElementById("TextBox1").value;
04 CallServer(nametxt);
05 }
06 function ReceiveServerData(retVal)
07 {
08 document.getElementById("TextBox2").value = retVal;
09 }
</script>
<head>

และกำหนดอีเว็นต์ OnClick ของ Button เพื่อเรียกฟังก์ชัน ShowText()

<input id="Button1" type="button" value="button"
onclick="return ShowText();" />

อธิบายได้ดังนี้
  • โค้ดบันทัดที่ 03 เป็นการดึง value ของ TextBox1 มา้เก็บไว้ที่ตัวแปร nametxt
  • โค้ดบันทัดที่ 04 เป็นการเรียกฟังก์ชันชื่อ CallServer ซึ่งเป็นสคริปต์ฟังก์ชัน ที่เราจะเขียนขึ้นใน Code-behind อีกที เพื่อเรียกใช้ฟังก์ชันในเซิร์ฟเวอร์ต่อ
  • ฟังก์ชัน ReceiveServerData เป็นฟังก์ชัน CallBack ที่รับผลลัพท์จากเซิร์ฟเวอร์กลับมา โดยฟังก์ชั่นนี้ จะถูกเรียกหลังจากที่การประมวลผลบนเซิร์เวอร์ เสร็จเรียบร้อยแล้ว ส่วนมากใช้เพื่อแสดงผลลัพท์ที่ได้รับกลับมา โดยมีโค้ดบันทัดที่ 08 เป็นการ assign ค่าที่ได้รับกลับมาแสดงใน TextBox2
4. เขียนโค้ดใน page_load อีเว็นต์ เพื่อสร้างสคริปต์ฟังก์ชัน CallServer ที่ถูกเรียกใช้จากข้อ 3 บันทัดที่ 04 โดยฟังก์ชันนี้เป็นฟังก์ชันที่ทำงานเสมือนการ PostBack กลับไปยังเซิร์เวอร์

       Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
01 Dim callbackRef As String
02 callbackRef = ClientScript.GetCallbackEventReference(Me, "arg", "ReceiveServerData", "context")
03 Dim callbackScript As String
04 callbackScript = "function CallServer(arg, context) {" & callbackRef & "; }"
05 ClientScript.RegisterClientScriptBlock(Me.GetType, "CallServerScript", callbackScript, True)
End Sub

อธิบายโค้ด
  • ในอีเว็นต์ page_load นี้จะทำการเพิ่มไคลเอ็นต์สคริปต์โค้ด ที่จะ PostBack กลับไปยังเซิร์เวอร์ ให้สังเกตว่า "ReceiveServerData" นั้นเป็นชื่อฟังก์ชันสคริปต์ ที่เราได้สร้างไว้ตั้งแต่ข้อ 3 ซึ่งได้อธิบายไปแล้วว่าเป็นฟังก์ชันที่ใช้เพื่อแสดงผลลัพท์ที่ได้รับกลับมา
  • ในบันทัด 04 เป็นการสร้างฟังก์ชันชื่อ CallServer ที่จะถูกเรียกใช้จากฟังก์ชัน ShowText ที่เขียนไว้แล้วในข้อที่ 3
  • บันทัดที่ 05 เป็นการบอกให้เพิ่มสคริปต์นี้เข้าไปในเพจ aspx ตอน run-time
5. ทำการ implement เมธอดดังนี้ ใน code-behind
    private retval as String
Public Sub RaiseCallbackEvent(ByVal eventArgument As
String) Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent
retval = "Hello world : " & eventArgument & ", " & Now.Date.ToShortDateString
End Sub

Public Function GetCallbackResult() As String Implements
System.Web.UI.ICallbackEventHandler.GetCallbackResult
Return retval
End Function
  • เมธอด RaiseCallbackEvent เป็นเมธอดที่ทำงานเมื่อมีการเรียกใช้ เมธอด CallServer ที่ได้สร้างไว้ในข้อ 4 โดยทำการ concat ข้อมูลที่ได้ส่งมาใน eventArgument พารามิเตอร์ ซึ่งก็คือข้อมูลใน TextBox1.Text นั่นเอง เพราะถ้าดูจากโค้ดในข้อ 3 แล้ว ในบันทัดที่ 04 มีการเรียกใช้เมธอด CallServer โดยส่งข้อมูล TextBox1.Text เป็นพารามิเตอร์
  • เมธอด GetCallbackResult เป็นเมธอดคืนผลลัพท์ไปยังเมธอด Callback ที่ได้ระบุไว้ขณะสร้างฟังก์ชัน CallServer ในข้อที่ 4 บันทัดที่ 02 ซึ่งเมธอด Callback นั้นก็คือ ReceiveServerData โดยใน ReceiveServerData ก็จะรับข้อมูลที่ได้ส่งมาจาก GetCallbackResult
  • ส่วนตัวแปร retval เป็นตัวแปรแบบโกลบอลเพื่อเก็บค่าของข้อมูลระหว่างเมธอด RaiseCallbackEvent และ GetCallbackResult

ลองทดสอบโดย run โปรแกรมและลองใส่ชื่อใน TextBox1 แล้วกดปุ่ม Button ข้อความและแสดงบน TextBox2 โดยที่เพจไม่มีการ refresh


โค้ดในส่วนของ code-behind ทั้งหมด
Partial Class _Default
Inherits System.Web.UI.Page
Implements ICallbackEventHandler

Private retval As String
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim sb As New StringBuilder
Dim callbackRef As String
callbackRef = ClientScript.GetCallbackEventReference(Me, "arg", "ReceiveServerData", "context")
Dim callbackScript As String
callbackScript = "function CallServer(arg, context) {" & callbackRef & "; }"
ClientScript.RegisterClientScriptBlock(Me.GetType, "CallServer", callbackScript, True)
End Sub

Public Function GetCallbackResult() As String Implements System.Web.UI.ICallbackEventHandler.GetCallbackResult
Return retval
End Function

Public Sub RaiseCallbackEvent(ByVal eventArgument As String) Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent
retval = "Hello world : " & eventArgument & ", " & Now.Date.ToShortDateString
End Sub
End Class

และโค้ดเพจ Default.aspx ทั้งหมด
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
<script type="text/javascript">
function ShowText()
{
nametxt = document.getElementById("TextBox1").value;
CallServer(nametxt);
}
function ReceiveServerData(retVal)
{
document.getElementById("TextBox2").value = retVal;
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Font-Bold="True" Font-Italic="False" Font-Size="Large"
Font-Underline="True" Text="Client Callbacks Without Postbacks in ASP.NET"></asp:Label>
<br />
<br />
<asp:TextBox ID="TextBox1" runat="server">TextBox1</asp:TextBox>
<br />
<input id="Button1" type="button" value="button" onclick="return ShowText();" /><br />
<asp:TextBox ID="TextBox2" runat="server" Width="304px">TextBox2</asp:TextBox> <br />
</div>
</form>
</body>
</html>

ด้วยความสามารถในการ Callback without Postback นี้เอง ทำให้เราสามารถเขียนโปรแกรม ASP.NET ได้โดยปราศจากการ submit ทั้งเพจ เพื่อเพิ่มความรวดเร็วในการทำงานของเว็บเพจ ให้ทำงานได้อย่างรวดเร็วและราบรื่น

Wednesday, June 13, 2007

Client Callbacks without Postbacks in ASP.NET

ตามปกติในการเขียนโปรแกรม ASP.NET นั้น การทำงานของโค้ด ในฝั่งเซิร์ฟเวอร์ที่อยู่ใน code-behind หรือภายใน script runat="server" จะต้องมีการส่ง request ไปยังเซิร์ฟเวอร์ และ เซิร์ฟเวอร์ก็จะส่ง response กลับมา โดยในการส่ง request ไปยังเซิร์ฟเวอร์นั้น จะเป็นการทำการ submit form ซึ่งส่งผลให้ต้องส่ง content ทั้งหมดของเพจไปยังเซิร์ฟเวอร์ แล้วเซิร์ฟเวอร์ก็นำไปประมวลผลเพื่อส่ง content ของเพจที่ประมวลผลใหม่กลับมา ด้วยวิธีการนี้ทำให้เกิดการรอคอย โดยผู้ใช้ได้รับรู้การรอคอยนั้น ด้วยการกระพริบของเพจ ซึ่งบางครั้งกระพริบช้า บางครั้งกระพริบเร็ว เนื่องจากปัจจัยต่างๆ เช่น ความเร็วของสัญญาณ การประมวลของเซิร์ฟเวอร์ เป็นต้น

ด้วยเหตุนี้ใน ASP.NET 2.0 จึงมีวิธีในการจัดการการเรียกใช้เมธอดบนเซิร์ฟเวอร์ เพื่อนำมาแสดงผลบนเพจได้โดยที่ไม่ต้องทำการ Postback ทั้งเพจ ซึ่งเรียกว่า Callbacks without Postbacks

ด้วยวิธีการ Callbacks without Postbacks จะทำให้อีเว็นต์ที่เกิดขึ้นบนบราว์เซอร์ สามารถส่งการร้องขอไปยังเมธอดที่อยู่ใน Code-behind หรือ script runat="server" ได้ และเมื่อเมธอดบนเซิร์ฟเวอร์ได้ประมวลผลเพื่อให้ได้ผลลัพท์ที่ต้องการแล้ว ก็จะส่งหน้าที่กลับไปยังเมธอด Callback บนบราว์เซอร์เพื่อนำผลลัพท์ที่ได้มาแสดงบนเพจในบราว์เซอร์ โดยที่ไม่ต้อง PostBack เพจกลับไปยังเซิร์ฟเวอร์

Callbacks without Postbacks เกี่ยวข้องกับ Interface ชื่อ ICallbackEventHandler ซึ่งประกอบด้วยเมธอด
  • RaiseCallbackEvent เป็นเมธอดที่ถูกเรียก เมื่อมีการเรียกใช้เมธอดสำหรับการ Callback
  • GetCallbackResult เป็นเมธอดที่คืนผลลัพท์ของการทำงาน ไปยังเมธอด Callback

ตอนต่อไปผมจะแสดงวิธีการเขียนโค้ดครับ

Monday, June 11, 2007

การป้องกันการโจมตีแบบ Cross Site Scripting (XSS)

การโจมตีแบบ XSS เป็นการโจมตีแบบ Injection Attack รูปแบบหนึ่งที่อาศัยช่องโหว่ของการเขียนโค้ดในการรัีบ input data ต่างๆ เช่น field, query string และ cookie เพื่อการฝังโค้ดสคริปต์ เ่ช่น javascript ในการโจมตี

เช่น
<%@ Language="C#" ValidateRequest="false" %>
<html>
<script runat="server">
void btnSubmit_Click(Object sender, EventArgs e)
{
// If ValidateRequest is false, then 'hello' is displayed
// If ValidateRequest is true, then ASP.NET returns an exception
Response.Write(txtString.Text);
}
</script>
<body>
<form id="form1" runat="server">
<asp:TextBox id="txtString" runat="server"
Text="<script>alert('hello');</script>" />
<asp:Button id="btnSubmit" runat="server" OnClick="btnSubmit_Click"
Text="Submit" />
</form>
</body>
</html>
เมื่อ run เพจนี้จะปรากฏข้อความ "Hello" เป็น message box ขึ้นมา เนื่องจากสคริปต์ใน txtString ได้ส่งเข้่ามาและถูก render เป็นไคลเอ็นต์ไซต์สริปต์ในเว็บบราว์เซอร์

การป้องกัน XSS
1. กำหนดแอตทริบิวต์ validateRequest="true" ใน configuration ไฟล์ หมายความว่า จะมีการตรวจจับทุก HTML และ character ต่างๆที่จะส่งไปยังเซิร์ฟเวอร์ ถ้ามีการส่งสคริปต์ก็จะถูกตรวจพบและแสดงข้อความผิดพลาดประเภท HttpRequestValidataionException ขึ้นมา
ตัวอย่างการกำหนด
...
<pages validateRequest="true"/>
...
ซึ่งการกำหนด validateRequest โดย default จะกำหนดให้เป็น true อยู่แล้ว
2. กำหนดข้อบังคับในการ input เช่น มีการตรวจสอบ input ฝั่งเซิร์ิฟเวอร์เสมอ, กำหนด length, range, format และ type ที่แน่นอนให้กับแต่ละ input เป็นต้น โดยการใช้ RegularExpressionValidator, Regex Class, RangeValidator, CustomValidator
3. ทำการ Encode ข้อมูล output ที่ไม่น่าไว้ใจ โดยการใช้ HttpUtility.HtmlEncode หรือ HttpUtility.UrlEncode และ Encode URL ที่ไม่น่าไว้วางใจโดยใช้ HttpUtility.UrlEncode

เช่น

<%@ Page Language="C#" ValidateRequest="false" %>

<script runat="server">
void submitBtn_Click(object sender, EventArgs e)
{
Response.Write(HttpUtility.HtmlEncode(inputTxt.Text));
}
</script>

<html >
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="inputTxt" Runat="server"
TextMode="MultiLine" Width="382px" Height="152px">
</asp:TextBox>
<asp:Button ID="submitBtn" Runat="server" Text="Submit"
OnClick="submitBtn_Click" />
</div>
</form>
</body>
</html>
    HttpUtility.UrlEncode(urlString);

เนื้อหาอ้างอิงจาก http://msdn2.microsoft.com/en-us/library/bb355989.aspx

38th at the All Season

หลายวันก่อนได้มีโอกาสไปสัมมนาที่ ไมโครซอฟท์ ประเทศไทย ณ อาคาร All Season (CRC) ชั้น 38
วิวสวยมากครับ จึงถ่ายรูปมาให้ชมกันครับ


รูปแรกถ่ายเห็นสวนลุมฯครับ ส่วนอาคารสีขาวรูปตัว L ด้านหน้าคือสถานฑูตสหรัฐฯครับ
ถ้าสังเกตดีๆ จะเห็นรางรถไฟฟ้า BTS ด้วยนะครับ



รูปนี้ดูเพลินๆครับ

ถ่ายมาได้ 2 รูปเองครับ เกรงใจครับ รปภ. ยืนจ้องตาเขม็งเลยครับ

Sunday, June 10, 2007

เรียน OOP C# ASP.NET ด้วยตนเอง

บังเอิญมากครับที่ได้พบกับสุดยอดเว็บบล็อกอีกแห่งหนึ่งของคนไทย !!!!!

เรียน OOP C# ASP.NET ด้วยตนเอง

ผู้เขียนบล็อกเป็นผู้ที่มีประสบการณ์อย่างมากในวงการคอมพิวเตอร์นานกว่า 20 ปี
และอีกไม่นานเกินรอก็จะมี หนังสือ "เรียนรู้ด้วยตัวเอง OOP C# ASP.NET" ก็จะพิมพ์ออกจำหน่ายแล้วครับ
ผมเป็นอีกคนหนึ่งที่กำลังรอหนังสือภาษาไทยดีๆ แบบนี้อยู่ครับ

Tuesday, June 5, 2007

การสอบ Certificate

เนื่องจากผมเคยสอบได้ Microsoft Certified Solution Developer for .NET (MCSD.NET) มาแล้ว และกำลังเตรียมตัวเพื่อจะสอบเป็น MCPD ต่อไป จึงขอเล่าสู่กันฟังตั้งแต่แรกของการสอบ Certificate ของผมกันเลยครับ

แต่เดิมตอนที่ผมกำลังเริ่มสอบทาง Microsoft ยังไม่ได้ออก Visual Studio 2005 ผมเริ่มสอบวิชาแรกคือ 70-229 Microsoft SQL Server 2000 Database Design and Implementation ตอนนั้นผมลงทุนซื้อหนังสือเล่มข้างล่างนี้เลยครับ ราคาก็ประมาณ 1300 บาท ถือว่าราคาแพงมากครับ (เป็นหนังสือเล่มที่แพงที่สุดที่ผมเคยซื้อเลยครับ ตอนเรียน ป.ตรี ซื้อ text book ราคาแพงสุดยังแค่ 800 บาทเอง)

ภายในประกอบไปด้วยเนื้อหาและแบบฝึกหัดหลายร้อยข้อ และแถม CD โปรแกรม SQL Server 2000 Enterprise Edition (180 วัน) เพื่อเตรียมสอบโดยเฉพาะเลยครับ
และก็อ่านอีกเล่มเป็นภาษาไทยครับ MS SQL Server 2000 เล่มสีเขียว

(รายละเอียด)

เกือบลืมบอกไปครับว่า อ่านข้อสอบเก่าด้วยของ TestKing ด้วยครับ ซึ่งส่วนใหญ่จะตรงครับแต่ต้องใช้วิทยายุทธนิดนึงครับในการค้นหาข้อสอบเก่า

เมื่อเตรียมตัวพร้อมแล้วก็ลงทะเบียนสอบครับโดยลงทะเบียนที่ www.vue.com หรือ www.prometric.com แต่ผมเลือก vue ครับ เมื่อลงทะเบียนเสร็จก็เลือกวิชาที่ต้องการสอบ และเลือกศูนย์สอบ พร้อมกับชำระเงิน $40 แต่ถ้าซื้อ voucher ที่ศูนย์สอบในเมืองไทยโดยตรงจะคิดราคา 2,200 บาท(ไม่รวม VAT)
โดยผมชำระเงินด้วย credit card ผ่านระบบ SSL ของ vue ตอนแรกก็กลัวเหมือนกันครับ แต่หลังๆ ก็ชินครับ

เมื่อใกล้วันที่สอบประมาณ 1-2 วันทางศูนย์สอบจะโทรฯ ติดต่อเข้ามายืนยันการสอบของเรา ถ้าเราร้อนใจก็สามารถโทรไปยืนยันเองก่อนได้ครับ
วันที่สอบก็ให้เตรียมตัวไปถึงก่อนแต่เนิ่นๆ สัก 15 นาทีครับเพราะบางทีอาจจะพบกับปัญหาจุกจิกบ้าง เช่น รอ Upload ข้อสอบ ไฟดับ เครื่องแฮงค์ เป็นต้น
ในการสอบใช้เวลาประมาณ 2 ชั่วโมง 30 นาที ถึง 3 ชั่วโมง ข้อสอบประมาณ 40 ถึง 45 ข้อ แล้วแต่วิชาครับ ส่วนข้อสอบจะเป็น multiple choice ไม่มี simulate เลยครับ (แต่ตัวใหม่ MCPD, MCTS มี simulate เพียบ) เมื่อสอบเสร็จก็จะทราบผลคะแนนทันทีแบบไม่ต้องรอลุ้นเลย ตัวแรกสอบผ่านก็จะได้ MCP เลยครับ

ผมรอ e-mail ยืนยันประมาณ 2-3 วัน หลังจากนั้นก็สมัครสมาชิกที่ MCP Member site ครับ โดยใช้เลข MCP ID เพื่อ Activate ครับ และทำการยืนยันที่อยู่ของเราเพื่อให้ Microsoft ส่ง Welcome Kit มาให้ครับ

รอประมาณ 2 สัปดาห์ Welcome Kit ก็ส่งมาให้ถึงบ้าน ซึ่งประกอบด้วย ใบ Certificate, เข็มกลัด MCP, บัตรสมาชิก MCP

จากนั้น 6 เดือน ผมก็สอบ 70-306 Developing and Implementing Windows-based Applications with Microsoft Visual Basic .NET and Microsoft Visual Studio .NET
ต่อมา 2 เดือน สอบ 70-310 Developing XML Web Services and Server Compoments with Microsoft Visual Basic .NET and the Microsoft .NET Framework

เมื่อสอบครบ 3 วิชา ได้ MCAD มาก่อนครับ และตั้งใจจะสอบต่อไปให้ได้ MCSD ซึ่งต้องสอบอีก 2 วิชาครับ

และอีก 3 เดือนต่อมา สอบ 70-305 Developing and Implementing Web Applications with Microsoft Visual Basic .NET and Microsoft Visual Studio .NET

และสุดท้าย อีก 4 เดือนต่อมา สอบ 70-300 Analyzing Requirements and Defining Microsoft .NET Solution Architectures ซึ่งเป็นวิชาที่ผมคิดว่ายากที่สุดเลยครับ พูดง่ายๆ คือ เป็นวิชาที่คะแนนผมน้อยที่สุด และได้คะแนนแบบเกือบตกครับ

ทั้ง 4 วิชานี้ ผมอ่านหนังสือหลายอย่างครับ ทั้งภาษาไทย ภาษาอังกฤษ และแบบฝึกหัดจาก MOC ของหัวหน้าที่ได้ไปอบรมมาครับ ทั้งนี้ส่วนใหญ่แล้วที่ผมสอบได้ทั้งหมดนี้ก็เป็นเพราะหัวหน้าผมล่ะครับที่คอยสนับสนุนอยู่ตลอดเวลาครับ ค่าสอบทั้งหมดประมาณ 10,000 บาท เบิกบริษัทได้เกือบทั้งหมดครับ

ผมสอบครบ 5 วิชา ผมก็จะได้ MCSD แล้วครับ แต่คราวนี้ผมต้องรอ Welcome Kit เป็นเดือนเลยครับ เนื่องจากช่วงเวลาที่ผมสอบได้เป็นช่วงที่ Microsoft กำลังเปลี่ยน Certificate ครับ จึงล่าช้ากว่าปกติไปหน่อย แต่ก็ไม่ว่ากันครับ

ด้านล่างเป็นรายชื่อวิชาที่ผมได้สอบไปแล้วทั้งหมดครับ ส่วน 70-431 TS: Microsoft SQL Server 2005 - Implementation and Maintenance ผมได้ voucher สอบมาฟรีครับ ซึ่งจะหมดอายุวันที่ 31 ธันวาคม 2549 ผมก็เลยสอบวันที่ 28 ธันวาคม 2549 ซะเลย (ที่ไม่สอบวันที่ 29 หรือ 30 หรือ 30 ธันวาคม นั้น เพราะว่า ศูนย์สอบหยุดครับ ถ้าไม่หยุดก็กะสอบวันที่ 31 นะเนี่ย)

ส่วนวิชา 70-306 ที่มี Canceled ไป 1 รายการนั้น เป็นเพราะผมต้องการย้ายวันครับ จึงต้อง Canceled รายการเก่าก่อน ซึ่งผมจำได้ว่าผมต้องเสียค่า Cancel ไปประมาณ 40 กว่าบาท เนื่องจากอัตราการซื้อ/ขายค่าเงินบาทมันต่างกันครับ T_T

จากนี้ไปก็จะสอบ MCPD ต่อครับ ตอนนี้กำลังเตรียมตัวอยู่ ก็คงจะสอบเสร็จภายในสิ้นปีนี้แน่นอน


การย้าย Database SQL Server 2000

เนื่องจากทางออฟฟิตผมต้องทำการย้ายเครื่อง Database Server ที่เป็น SQL Server 2000 ผมจึงต้องคิดแผนในการย้ายครั้งนี้ โดยผมได้สรุปแผนได้ดังนี้

1. ทำการย้ายโดยการ copy ไฟล์ *.mdf และ *.ldf

เป็นวิธีที่ง่ายที่สุด แต่ต้อง stop บริการของ SQL Server ในเครื่องเก่าก่อนจึงสามารถ copy ไฟล์ได้ โดยทำการ copy ไปยังเครื่องใหม่ โดยต้องกำหนดไดเรกทอรี่ทุกอย่างของไฟล์ให้เหมือนเดิม ซึ่งในการ copy ไฟล์จะต้อง copy ทุกไฟล์แม้กระทั่ง master, model, msdb ไฟล์ (system database) เพื่อให้ข้อกำหนดทุกอย่างของ Server เหมือนเดิม เช่น Login, DTS, Job เป็นต้น

2. ทำการย้ายโดยการ restore ฐานข้อมูล master

วิธีนี้ทำให้ไม่ต้อง stop บริการของ SQL Server ในเครื่องเก่าก่อน แต่มีวิธีการที่ยุ่งยากมากเนื่องจากต้อง restore ฐานข้อมูล master, msdb และ user database ทั้งหมดเอง

การ restore master database

เนื่องจาก master database เป็น system database จึงไม่สามารถ restore ได้ทันที ต้อง start ระบบแบบ single-user ก่อนจึงสามารถ restore ได้ โดยการ start ระบบ SQL Server ให้เป็น single-user ให้ทำดังนี้

1. ยังไม่ต้อง start SQL Server ให้เปิด command-line และไปที่ C:Program FilesMicrosoft SQL ServerMSSQLBinn

2. พิมพ์ Sqlservr -m -s <instance_name> เช่น Sqlservr -m -s SQL_instance_2 ถ้าไม่มี instance ก็ไม่ต้องกำหนด -s ครับ เช่น Sqlservr -m

3. บริการ SQL Server จะ start แบบ single-user โดยมีข้อความใน command prompt ดังนี้

ยังไม่ต้องปิด command prompt นี้

4. จากนั้นก็สามารถ restore master database ได้แล้วครับ จะ restore โดยใช้ Enterprise Manager หรือ เปิด Command prompt อีกอันก็ได้ครับ

5. เมื่อ restore master เรียบร้อยแล้ว ก็สามารถปิด command prompt ที่ start ไว้ได้แล้ว

6. ทำการ restore msdb

7. ทำการ restore user database ทั้งหมด

ส่วนใน DTS และ Job ที่มีการอ้างถึง SQL Server ตัวเดิม ให้ทำการเปลี่ยนเป็น SQL Server ตัวใหม่

ตรวจสอบรายละเอียดอื่นๆ ว่าสามารถทำงานได้ปกติหรือไม่ เช่น การกำหนด operation เพื่อส่ง e-mail การกำหนด Link-server