.Net constants, Settings.settings, Resources.resx

ไม่รู้คนอื่นเป็นหรือเปล่า แต่เรามีความสับสนในการกำหนดค่าต่างๆ ในโปรแกรม ไม่รู้ว่าควรจะกำหนดยังไงดี

  • กำหนดเป็นค่าคงที่ใน Code
  • กำหนดใน Settings.settings
  • กำหนดใน Resources.resx
ก็ไปอ่านเจอบทความหนึ่ง ซึ่งรู้สึกว่าอ่านแล้วกระจ่างมาก เลยแปลมาให้กัน สำหรับใครที่อยากอ่านต้นฉบับดูที่ที่ลิงค์ท้ายบทความค่ะ

เค้าบอกว่าเกณฑ์ในการเลือกว่าควรจะกำหนดค่าอะไรไว้ยังไงมีดังนี้
  1. ถ้าเป็นค่าที่ไม่ได้ให้ผู้ใช้แก้ไข และเกี่ยวข้องกับ class ใด class หนึ่งโดยเฉพาะ ให้กำหนดเป็นค่าคงที่ใน class นั้นๆ
  2. ถ้าเป็นค่าที่ไม่ได้ให้ผู้ใช้แก้ไข แต่เกี่ยวข้องกับหลาย class ให้กำหนดเป็นค่าคงที่ใน class กลางของโปรเจค
  3. ถ้าเป็นค่าที่ให้ผู้ใช้แก้ไขได้ ให้กำหนดใน Settings.settings.
  4. ถ้าเป็นค่าที่ต้องแก้ไขโดยขึ้นกับ locale ให้กำหนดใน Resources.resx
  5. ถ้าเป็นค่าที่ต้องเปลี่ยนแปลงตามกลุ่ม (เข้าใจว่า เช่นค่าที่กำหนดสำหรับแต่ละหน้าจอ เหมือนที่เรากำหนด label ในหน้าจอ) ก็ให้กำหนดใน Resource.resx ตามโฟลเดอร์
และในบทความก็สรุปว่า Resources.resx จะกำหนดได้ก่อน build เท่านั้น ผู้ใช้ไม่สามารถเปลี่ยนค่าได้ ในขณะที่ Settings.settings สามารถแก้ได้โดยผู้ใช้ แต่ Settings.settings จะไม่เปลี่ยนตาม locale เหมือนกับ Resources.resx

References:

การ Generate Entity class จาก Entity Framework

ที่เราใช้อยู่ขณะนี้เป็น EF 6 นะค่ะ

1. คลิ๊ก Add > New Item... ที่โปรเจค


2. เลือก ADO.NET Entity Data Model และตั้งชื่อ ซึ่งจะเป็นชื่อของ .edmx ไฟล์


3. เลือกวิธีที่จะได้ diagram มา ซึ่งเราเลือกเป็น Empty EF Designer model ซึ่งจะได้ diagram เปล่าๆ มาแล้วมาใส่ entity ต่างๆ เองค่ะ


4. จากนั้นก็สร้าง Entity โดยใช้ Toolbox ด้านข้าง
5. หลังจากนั้นก็ถึงวิธีการ generate Entity โดยคลิ๊กขวาที่ diagram เลือก Generate Database from Model...


6. ถ้าเป็นการ generate ครั้งแรก VS จะขึ้นหน้าต่างมาให้เราสร้าง Connection string โดยเราจะต้องเลือกฐานข้อมูลที่เราต้องการจะให้สร้าง Entity (ทั้งนี้มันจะไม่ได้ไปสร้าง table หรืออะไรในฐานข้อมูลนั้นๆ หรอกนะค่ะ แค่เลือกเพื่อเอาไปสร้าง Connection string เฉยๆ เราจะต้องไปสร้าง table เองค่ะ)

เมื่อเสร็จแล้ว มันจะให้เรายืนยันว่าจะให้บันทึก password ของฐานข้อมูลใน Connection string หรือเปล่า ซึ่งเราจะให้มันบันทึกหรือไม่ก็ได้ค่ะ

7. เราจะได้

  • file .sql มา สำหรับไป execute ในฐานข้อมูล
  • ได้ Entity Container .cs 
  • ได้ Entity .cs 
เป็นอันเสร็จค่ะ

หมายเหตุ
- ใน Entity Framework ไม่สามารถสร้าง unique key ที่ไม่ใช่ primary ได้ค่ะ ตามลิงก์

การเปลี่ยน edmx file ใน .Net

คราวที่แล้ว พูดถึงการเปลี่ยนชื่อโปรเจค คร่าวนี้มาถึงตาที่เราอยากจะแก้ชื่อ edmx หรือ entity data model ที่เป็นไฟล์ XML กันบ้าง ซึ่งโดยปกติ edmx นี้จะสร้างมาจากการ add item ADO.NET Entity Data Model และเมื่อเราสร้างแล้ว เราสามารถให้ VS มันสร้าง file entity .cs ได้ ซึ่งมันก็จะสร้าง 


  • Model Context.tt
  • Model Context.cs
  • Model .tt
ขึ้นมาด้วย ซึ่งชื่อของไฟล์ทั้งหมดก็จะมาจากชื่อของ file .edmx นั่นเอง แต่ถ้าเราจะเปลี่ยนชื่อของ .edmx ก็จะเป็นเรื่องใหญ่ ที่เดียว แต่ก็ไม่ใช่ว่าทำไม่ได้ โดยเรา

1. rename file .edmx 
โดยคลิ๊กขวา ที่ file .edmx แล้วเลือก rename 

2. ลบ ไฟล์ที่เป็น .Context.tt และ .tt ออก
3. สร้างไฟล์ .Context.tt และ .tt ใหม่ โดยคลิ๊กขวาที่ Diagram และ คลิ๊ก "Add Code Generation Item..."


เสร็จแล้ว เลือก version ของ Entity Framework ที่ใช้ ตั้งชื่อไฟล์ .tt กด Add


เสร็จแล้ว ก็อย่าลืมลอง Generate database from model ใหม่อีกทีนะค่ะได้เลยคะ





การเปลี่ยน namespace & project folder ใน .Net

จากความที่เคยเขียน java มา พอมาใช้ .Net รู้สึกถึงความไม่คุ้นอย่างมาก อย่างแรกเลย คือ folder ของ .Net ไม่ได้เกี่ยวอะไรกับ namespace เลยสักนิดเดียว คือจริงๆ จะตั้งตรงกันหรือไม่ตรงกันก็ได้ (ซึ่งก็ไม่รู้ว่าจะไม่ตรงกันทำไม ใครมีความรู้มาบอกบ้างก็ดีนะค่ะ) และ namespace ก็ไม่จำเป็นต้องตรงกับชื่อไฟล์ project ที่เป็น .csproj แปลว่ามีชื่ออยู่ 3 ส่วนด้วยกัน คือ

  1. ชื่อ folder ของ project
  2. ชื่อ project หรือ file .csproj
  3. ชื่อ namespace 


ซึ่งไม่จำเป็นจะต้องเป็นชื่อเดียวกัน แต่ถ้าใครอยากจะแก้ให้ชื่อทั้งสามเป็นชื่อเดียวกัน ก็มีวิธีที่ไม่ได้ยากเย็นอะไร แต่ต้องเข้าใจ ดังนี้

1. แก้ชื่อ folder

วิธีคือ จะต้องแก้ชื่อ folder ตรงๆ เหมือนที่เราแก้ชื่อ folder ทั่วๆ ไป แต่...หลังจากที่เราแก้แล้ว ใน solution จะหา project นั้น ไม่เจอ แล้วมันจะยอมให้เราแก้ไข property project folder ซึ่งโดยปกติ มันจะไม่ให้เราแก้ไข เราก็แค่เลือก folder ที่เราแก้ไขชื่อให้ถูกต้องก็เป็นอันเสร็จ



2. แก้ไขชื่อ project หรือ file .csproj

ทั้งนี้ ชื่อ project ที่แสดงใน solution มันเหมือนจะดึงมาจากชื่อไฟล์ .csproj นั่นเอง ซึ่งอันนี้แก้ได้ง่ายๆ โดย click ขวาที่ชื่อ project แล้วก็เลือก rename ใส่ชื่อที่ต้องการก็เป็นอันเสร็จ


3. แก้ชื่อ namespace

คลิ๊กขวาที่ชื่อ project แล้วเลือก Properties ซึ่งจะแสดงหน้าต่างอีกอันหนึ่ง (ซึ่งไม่เข้าใจเหมือนกันว่า ทำไมไม่เป็นอันเดียวกับ properties windows แล้วแก้ไข Default namespace กันได้ (ทั้งนี้ปกติเราก็จะแก้ไข Assembly name ไปด้วย โดยเข้าใจว่า assembly name คือชื่อของ file .dll ที่เราจะได้ และก็จะแก้ไขเข้าไปถึง Assembly Information ด้วย)


ก็เป็นอันเสร็จเรียบร้อย

ปกติคุ้นกับ Eclipse ที่ rename ปุ๊บ มันแก้ทุกอย่างให้หมดเลย ทั้งนี้ .Net มันคงต้องการให้ยืดหยุ่นที่จะสามารถตั้งชื่อทุกอย่างแยกจากกันได้อ่ะมั้ง (กำลังพยายามเข้าใจมัน)

จบจ้า


TPSE 2014

เป็นอีกปีที่ไปมาค่ะ ปีนี้อาจจะไม่ประทับใจเท่าปีที่แล้ว เพราะว่าหลายเรื่องเราก็ติดตามผ่าน facebook และ blog อยู่บ้างแล้ว เลยเริ่มไม่ตื่นเต้นล่ะ

ปีนี้มี session ที่ได้ไปฟังมาวันแรกดังนี้

Agile Outsource

ซึ่งเป็นการทำ outsource แบบ Agile คือใกล้ชิดกันมากขึ้น และปรับการทำงานให้เป็น Agile นะเอง

Technical Debt

เมื่อก่อนเรางงคำนี้นะ ฟังครั้งแรกไม่ get แต่ในงานก็มีการแสดงตัวอย่างการใช้หนี้ได้ชัดเจนค่ะ แต่ถ้าใครอยากรู้จักแบบเริ่มต้น เราแนะนำ หนี้ทางเทคนิค Technical Debt มากกว่า


Case study, How to apply agile practice in government TOR design


เป็น session ที่เราได้เห็น Agile ในภาครัฐได้ดีมากขึ้น ฟังแล้วรู้เลยว่าผู้บรรยายมีประสบการณ์ตรง ประสบการณ์จริง โดยแนะนำให้เริ่มสร้าง TOR ด้วยการใช้ User Story + คะแนนความยากง่าย (ซึ่งจริงๆ เราว่าตอนประเมินความยากง่ายนี่คงตบตีกันแทบแย่เหมือนกัน แต่ก็อาจจะช่วยให้เจ้าของงานได้มองเห็นความจริง และช่วยแตก Story ได้ละเอียดขึ้น)


Test-Driven Development 101


เป็นการแนะนำการทำ TDD ค่ะ ซึ่งผู้บรรยาย blog ไว้ด้วย สรุปการแบ่งปันเรื่อง Test Driven Development ในงาน TPSE 2014



วันที่สอง

Measurement in an agile company

ผู้ถึงการวัดผลใน Agile ว่าจะวัดได้อย่างไร (อันนี้ไม่ค่อยตั้งใจฟังเท่าไรอ่ะ เพราะคิดว่ายังไงก็ยังไม่ได้ใช้หรอก เลยฟังผ่านๆ)

Project Manager Deadly Sins

เข้าใจว่าคนฟัง ตั้งใจพูดให้ PM ฟัง เผื่อให้รู้ตัวว่าตัวเองทำบาปอะไร ที่ทำให้เกิดผลกับงานบ้าง แต่คนฟังน่าจะ 70% เป็น dev อ่านะ PM ที่หนายจะมาฟัง

Wrong reasons to automate! 

เป็นความเข้าใจผิดของการนำ Automate (Test) มาใช้ ซึ่งฟังๆ แล้วสำหรับงานโปรเจคแบบ 1-2 ปี ที่คนทำงานมีอยู่ 4-5 คน ดูจะไม่ค่อยคุ้มทุนในการทำเท่าไร


ก็คร่าวๆ ก็ประมาณนี้ เรื่องที่ฟังส่วนใหญ่เป็นเรื่องที่เคยได้ยินจากที่ไหนสักแห่งมาแล้ว แต่ก็คิดว่าเป็นงานที่คุ้มที่จะไปอยู่ดี ก็ไปฟังชิวๆ หรือได้ถามเรื่องที่อยากถามทันที ก็ถือว่าคุ้มล่ะนะ

Reference:
TPSE 2014


.net unable to cast of type dbquery`1 [] to type objectquery

ช่วงนี้กำลังศึกษา .Net Entity Framework อยู่ค่ะ

แล้วก็เลยลองทำ ADO.Net Entity Framwork Quick Start ดูค่ะ

ก็ทำตามไปเรื่อยๆ แต่มาสะดุดเอาตรง (เราใช้ EF 6.1 ค่ะ ตามที่ได้ Nuget ออกมา)

this.departmentList.DataSource = ((ObjectQuery)departmentQuery).Execute(MergeOption.AppendOnly);


ซึ่งมี Exception ตอน runtime ค่ะ ซึ่งตามชื่อหัวข้อเลยค่ะ มัน cast จาก DbQuery ไป ObjectQuery ไม่ได้ ก็หาอยู่นานค่ะ เพราะก็เพิ่งจะอ่าน Quick Start อ่ะเน้อะ จะไปรู้เรื่องอะไร

สรุปเลยละกันค่ะ คือมัน cast ไม่ได้ค่ะ ถูกแล้ว เพราะ edmx มันสร้างเป็น DbSet ซึ่ง query ที่ได้จะเป็น DbQuery ก็ต้องใช้มันทั้งแบบนั้นค่ะ แต่แล้วใช้แบบนั้นมันใช้ยังไงฟร่ะ ก็หากันต่อไปค่ะ ก็มามั่วเองจนได้ ซึ่งที่ถูกควรจะเป็น

this.departmentList.DataSource = departmentQuery.ToList();

จึงแจ้งมาเผื่อใครจะเป็นเหมือนกัน

Reference:
ADO.Net Entity Framwork Quick Start

Entity Framework 4.1: Unable to cast from DbQuery to ObjectQuery

C# Format Item Syntax

สำหรับคนที่เพิ่งมาเรียนรู้ C# ใหม่ๆ เวลาเห็นคำสั่ง Console.Write หรือ Console.WriteLine (ซึ่งเราใช้มากสำหรับการทดสอบระบบ) อาจจะเห็น string แปลกๆ ที่อยู่ใน { } ซึ่งจะเขียน Format Item Syntax ซึ่งมี syntax ง่ายๆ คือ

{ index[,alignment][:formatString]}

index เป็น ลำดับของตัวแปรที่เป็น parameter ต่อท้ายมา
alignment ถ้าเป็น ค่าบวก คือชิดขวา ค่าลบ ชิดซ้าย
formatString ก็คือเป็น format ที่จะให้แสดงออกมานั้นเอง 

ตัวอย่าง


Console.Write("Name = {0}, hours = {1,1:hh}", myName, DateTime.Now);

{0} ก็จะแสดงเป็นค่าของ myName
{1:hh} จะแสดงเป็นค่า DateTime.Now โดยแสดงเป็น ชั่วโมง ชิดขวา

Reference:
Composite Formatting

Missing item ADO.Net Data Entity Model

สำหรับใครที่จะใช้ Entity Framework แล้วเป็นเหมือนเรา คือพยายามตามหา item ADO.Net Data Entity Model แต่ว่าไม่มี


หาอ่านอยู่หลายที่ก็ยังไม่รู้ว่าวิธีแก้ทำยังไงนะค่ะ ติดตั้ง EntityFramework package จาก NuGet ก็แล้ว ก็ยังไม่ได้

ง่ายมากค่ะ ให้หา Entity Framework Tools มาลงค่ะ (ลิงค์ที่ให้ไว้เป็นของ version 6 ค่ะ) แค่นั้นเอง ไม่ได้เกี่ยวกับการ install Entity Frameowork package เลยแม้แต่น้อย 


Test run C# console application

เพิ่งจะเรียน C# ค่ะ เปิดใช้ Visual Studio ด้วยความงุนงง เพราะที่เคยใช้มันตั้งแต่เมื่อสมัยยังละอ่อน ยังไม่มี .Net Framework นู้นเลย และโปรแกรมแรก Hello World ซึ่งเป็น Console Application เขียนเสร็จ เอาละซิ จะเทสต์ยังไงฟร่ะ พอกด Start มันก็จะทำงานเปิด Console ขึ้นมาอย่างรวดเร็ว และจบไปอย่างรวดเร็ว สรุปว่า Hello World ของตรูสำเร็จม่ะเนี้ยะ มองไม่ทัน "-__-

และแล้วก็ได้มาเจอคำสั่ง หยุดหน้าจอ (ไม่ใช่ล่ะ) คือเป็นคำสั่งที่รอรับแป้นพิมพ์ก่อนด้วย

Console.ReadKey() 

โอ้ว เห็น Hello World แล้ว

บทเรียนต่อไปค่ะ โปรแกรมสำหรับรับ argument เขียนเสร็จ เอ่อ ... แล้วมันจะใส่ argument ยังไงฟร่ะ ตอนเทสต์ หาไปค่ะ หายังไงก็หาไม่เจอ (เพราะมันไม่มี) และได้มาพบกับ Tools Command Prompt บน Visual Studio Tools ค่ะ ซึ่งจะมาพร้อมกับตอนที่เราลง VS เลยค่ะ


แต่อ้าว.. แล้วนู๋จะต้องสั่ง compile บน Command Prompt หรือนี่... จริงๆ ก็ไม่ยากนะค่ะ แต่ แล้วตรูจะมี VS ไว้ทำแป๊ะอาราย แต่ก็นึกขึ้นได้ว่า ใน VS มันมี Build นี่หว่า Build แล้วไปไหนหว่า อันนี้หาไม่ยากค่ะ ไปส่องๆ ใน directory ที่เราเขียนโปรแกรมนะแหละ มันจะมี directory ชื่อ bin ค่ะ ถ้าเราสร้าง project เป็น Console Application พอ build แล้วก็จะได้ .exe อยู่ใน directory นี่แหละค่ะ เช่น ถ้าเราสร้าง solution ชื่อ Example และ project ชื่อ ConsoleTutorial ไว้ ก็จะได้ .exe อยู่ใน

...\Example\ConsoleTutorial\bin

เมื่อรู้ดังนี้แล้วก็ง่ายละค่ะ เราก็ใช้ VS build solution ตามปกติค่ะ แล้วก็เปิด Tools Command Prompt แล้วเปิดไป directory bin เลยค่ะ แล้วก็สั่ง

> ConsoleTutorial.exe 1 2

อ่า... เรียบร้อย เทสต์ได้แล้ว... ไม่น่าเชื่อว่า เรื่องแค่นี้ หามาช้านาน เศร้าใจ สงสัยจะแก่แล้วจริงๆ

การติดตั้ง SQL Server 2012

หนีไปใช้ของฟรีซะนานค่ะ พอกลับมาต้องลง SQL Server 2012 ถึงกับงงเล็กๆ อะไรเยอะแยะฟร่ะเนี้ยะ หลังจาก ลงไปประมาณ 3 รอบ ก็พอจะรู้ว่าจะต้องลงอะไรบ้างค่ะ (จริงๆ คนอื่นเค้าอาจจะเข้าใจแต่ทีแรกอ่ะนะ แต่เผอิญฉลาดน้อยไปหน่อย) ก็เอามาบอกต่อกันนะค่ะ

คือที่จะติดตั้งให้ดูเป็นการติดตั้งเฉพาะตัว SQL Server ที่จำเป็นจริงๆ สำหรับคนที่เก่งแล้ว ต้องมีการลงอะไรพิเศษก็เลือกเอานะค่ะ

เริ่มเลย 

1. พอเปิดแผ่นเข้ามาจะเจอประมาณนี้ (แค่เห็นก็งงแหละ มันอะไรให้เลือกเยอะแยะฟร่ะเนี้ยะ)


ก็เอาเป็นว่าเค้าพัฒนาไปเยอะมากจากตอนที่เราใช้อ่ะนะค่ะ ก็เลือกอันแรกเลยค่ะ (เข้าใจว่าอันอื่นเป็นการลงเพิ่มเติม สำหรับ server)

2. หลังจากนั้นก็เป็นขั้นตอนเล็กๆ น้อยๆ พวกใส่ product key, accept license และสุดท้ายเป็นการเลือกตัวเลือกสำหรับการติดตั้ง ซึ่งสำหรับคนยังไม่รู้จะลงยังไง ขอลงครบๆ ไว้ก่อน ก็เลือกอันสุดท้ายตามรูปก็ได้ค่ะ แต่เราเลือกลงตัวบนสุดค่ะ แล้วก็ไปเลือก Feature อีก





3. จากนั้นมันจะแสดง Feature ที่เราเลือกไว้ ซึ่งตอนนี้เราก็สามารถเอาออกอีกได้ค่ะ ซึ่งตัวที่จำเป็นจริงๆ คือตัวที่เราเน้นไว้ให้ เนื่องจากเป็นตัว engine และตัวโปรแกรมจัดการที่เป็น GUI ค่ะ


4. จากนั้นก็เป็นการใส่ชื่อ Instance ID ซึ่งใน 1 เครื่องเราลงได้หลาย instance ได้ค่ะ (instance ไม่ใช่ database นะค่ะ ใน 1 instance ก็จะสามารถสร้างได้หลาย database) แต่สำหรับคนที่จะลงแค่ instance เดียวก็ใช้ค่า default เลยค่ะ ง่ายดี


แล้วมันก็จะแสดงเนื้อที่ที่จะใช้ในการลงโปรแกรมค่ะ


5. จากนั้นก็เป็นการกำหนดรหัสผ่านสำหรับ sa สำหรับเรานิยมเลือกแบบ Mixed Mode ที่สามารถใช้ได้ทั้ง Windows account และ SQL Server authentication ค่ะ เผื่อไว้ก่อนค่ะ เพราะลงสำหรับ develop อยู่แล้วค่ะ ไม่ได้ลงเป็น server จริง


6. จากนั้นก็ Next ไปเรื่อยๆ ได้เลยค่ะ แล้วก็รอ ร๊อ รอ 

ขอให้โชคดีกันนะค่ะ

WCAT

เนื่องจากได้รับมอบหมายให้วัดประสิทธิภาพของระบบโดยใช้ WCAT ก็เลยต้องลอง ต้องเทสต์อยู่พักหนึ่ง และเท่าที่ลองหาข้อมูล คือข้อมูลในเน็ตมีน้อยมาก ไม่ต้องคิดถึงภาษาไทยเลย (ไม่รู้เป็นอะไรข้อมูล .net ในเวปก็น้อย หรือว่าคนเค้าเลิกใช้ไปแล้วก็ไม่รู้) ก็เลยต้องลองผิดๆ ถูกๆ ไปเรื่อย และคิดว่าน่าจะเป็นประโยชน์สำหรับใครที่เผอิญหลงมาใช้ หรือจะใช้ หรืออะไรก็แล้วแต่

อย่างแรกเลยค่ะ ข้อมูลที่ดีที่สุดสามารถหาได้จาก User Guide ของมันเอง แต่...ไม่รู้ว่าคนอื่นๆ จะเป็นหรือเปล่า คือพอลง WCAT แล้ว User Guide มันควรมากับโปรแกรม แต่ปรากฎว่าไฟล์ที่เราได้จากการติดตั้งมันเป็นไฟล์เจ๊ง เปิดไม่ได้ ซึ่งทีแรกก็ไม่รู้ว่ามันคืออะไร เลยปล่อยมัน และกว่าจะค้นหามาหลากหลายเวป ถึงรู้ว่า User Guide เนี้ยะดีสุดแล้ว แล้วก็กว่าจะหา User Guide มาได้ ก็ไม่ใช่ง่าย (เรียกว่า search หาอีกที หาไม่เจอแล้ว) ก็เอาเป็นว่าจะพยายามหาลิงค์มาให้ท้ายบทความละกันค่ะ

บ่นมาซะนาน เริ่มเลยนะค่ะ ก่อนอื่นจะใช้ WCAT เรามาเข้าใจหลักการทำงานของมันก่อน คือ wcat เป็นโปรแกรมที่เราใช้ทดสอบประสิทธิภาพของระบบเวป ซึ่งเท่าที่ลองใช้ ไม่จำเป็นจะต้องเขียนด้วยภาษาอะไร คือภาษาอะไรก็ได้  web server จะเป็นอะไรก็ได้ (ที่เคยลองใช้กับ Tomcat มันก็ใช้ได้นะค่ะ) ขอให้เราเข้าใจว่าจะต้องเรียกใช้มันยังไงก็พอ ซึ่งการใช้งานจะใช้ใน test environment ซึ่ง test environment ในที่นี้สามารถทำได้ 3 แบบ

  1. Single Machine คือมีเครื่องเดียว ลงทุกอย่าง Web Server, WCAT ซึ่งใช้เป็นทั้ง controller และ client (เดี๋ยวจะค่อยบอกอีกทีว่าอะไรคือ controller อะไรคือ client) และถ้ามี database ก็ลงมันไปด้วย ซึ่งแบบนี้ในเอกสารบอกว่าไม่ดี เพราะว่าเครื่องทำงานหลายอย่าง ทำให้ไม่สามารถทดสอบได้ประสิทธิภาพจริงๆ ของระบบได้ (เป็นแบบที่เราลองเทสต์มานะค่ะ เพราะว่าทำบนเครื่องตัวเองก่อน ยังไม่ได้เอาไปใช้จริง)
  2. Dual Machine แบบ 2 เครื่อง คือมีเครื่องหนึ่งเป็น Web Server อีกเครื่องเป็นทั้ง database server WCAT Controller และ WCAT client แบบนี้ก็จะดีขึ้นมาหน่อย เพราะว่าจะได้เห็นประสิทธิภาพของโปรแกรมจริงๆ แต่ทั้งนี้ก็ต้องระวัง ไม่ให้เครื่องที่สองที่ใช้เป็น WCAT Controller และ Client ใช้ทรัพยากรเต็ม เช่น memory, CPU ซึ่งทำให้การวัดไม่ถูกต้อง
  3. Muliple Machine, Isolated Environment จะเป็นแบบที่ทาง Microsoft แนะนำ คือมีเครื่อง database server แยกไป web server แยกไป และมีเครื่อง WCAT Controller อีก 1 เครื่องและ client อีกแล้วแต่ load ที่เราต้องการจะวัด (ซึ่งในเอกสาร ก็จะมีการบอกถึงวิธีการตั้งค่าสำหรับการสร้าง test environment แบบนี้เอาไว้)
ซึ่งการทำงานของ WCAT ก็คือเราจะติดตั้ง WCAT ไว้ที่ WCAT Controller และทำการติดตั้ง WCAT ที่เครื่อง client และเวลาวัดประสิทธิภาพ เราก็จะ start web แล้วให้ตัว WCAT Controller เป็นตัวควบคุมให้ WCAT Client แต่ละตัวส่งคำสั่ง (เสมือนกับเราเรียกเวป) ไปยัง web server แล้วตัว WCAT Controller ก็จะเป็นตัวเก็บค่าที่วัดได้จาก Client แต่ละตัวมารวบรวมไว้ แล้วคำนวณเป็นค่าทางสถิติ เช่นค่าเฉลี่ย และอื่นๆ 

แต่การติดตั้ง WCAT ที่เครื่อง client และการสั่งให้ client ส่งคำสั่งไปยัง web server สามารถสั่งงานได้ที่ WCAT Controller เพียงเครื่องเดียว จากนี้ก็จะเป็นภาคปฏบัติแล้วค่ะ 

ติดตั้ง WCAT
  1. download โปรแกรมมานะค่ะ ซึ่งเรา download จากที่ Microsoft เลย ตามนี้
  2. install จาก wcat.msi 
  3. run command as administrator
  4. run 'cscript //H:Cscript' (สำหรับคนที่ไม่ได้ run command ด้วย administrator ตรงนี้จะ error ค่ะ)
  5. run 'wcat.wsf -terminate -update -clients {comma separated client machine}' คำสั่งนี้จะทำการติดตั้ง WCAT ที่เครื่อง client ทุกเครื่องที่เรากำหนดค่ะ (ไม่ต้องไปลงเองทีละเครื่องให้เมื่อย)
เช่น ถ้าอย่างเราใช้เครื่องเดียว เอาเครื่องตัวเองเป็น WCAT client ด้วย
> wcat.wsf -terminate -update -clients localhost

แต่ถ้ามี client หลายเครื่องก็ใส่ , แล้วใส่ชื่อเครื่องไปนะค่ะ โดยไม่ต้องมี space (แต่ทั้งนี้เครื่อง client ทุกเครื่องจะต้องมี password ของ administrator เป็น password เดียวกันค่ะ)

หลังจากนั้นเราก็ต้องมีการตั้งค่า scenario file (หรือ client file เพราะเป็นไฟล์ที่ client จะต้องใช้ในการส่ง request ไปค่ะ) และ setting file สำหรับการตั้งค่าให้ลองดูตามเอกสารนะค่ะ และในตัวติดตั้งของ WCAT จะมีตัวอย่างมาให้บ้างแล้วก็แก้เอาจากตรงนั้นก็ได้ค่ะ ถ้ามีเวลาและประสบการณ์มากกว่านี้อาจจะมาเขียนให้อีกทีค่ะ

และสุดท้ายก็ได้เวลาเก็บผลแล้วค่ะ ซึ่งเป็นการสั่งให้ WCAT client สั่งคำสั่งไปยัง web server นะค่ะ โดย
  1. run command as administrator
  2. run 'wcat.wsf -terminate -run -client {comma separated client machine} -t {scenario file} -f {setting file} -s {web server} -x
เช่น
> wcat.wsf -terminate -run -clients localhost -t scripts\home.ubr -f scripts\settings.ubr -s localhost -x

    เสร็จแล้ว Controller ก็จะไปสั่งให้ Client มันส่งคำสั่ง request ไปค่ะ ก็ระดมยิงไปเรื่อยๆ ตามที่เราตั้งค่าไว้ พอมันทำเสร็จเรียบร้อย เราก็จะได้ไฟล์ log.xml มา 1 ไฟล์ ซึ่งเป็นผลที่ได้ค่ะ

    ส่วนวิธีอ่านผล มันจะงงๆ เล็กน้อย เนื่องจากตอนที่เราติดตั้ง WCAT มันจะมีไฟล์ report.xsl มาให้ค่ะ สำหรับใช้คู่กัน แต่...มันดันทำงานไม่ได้กับโปรแกรมที่อ่าน XML อื่นๆ ยกเว้น IE ซึ่งวิธีอ่านก็ค่อนข้างลึกลับอยูค่ะ ตามนี้ค่ะ
    1. เปิด log.xml ด้วย IE ค่ะ  สำหรับหน้าจอเราก็จะเห็นเป็นข้อความยาวต่อกันเป็นพืดเลย อ่านไม่รู้เรื่อง
    2. กด F12 เข้า dev mode ของ IE ค่ะ
    3. เลือก Browse Mode เป็น IEx Compatible เช่นเครื่องเราเป็น IE 10 ก็เลือกเป็น Internet Exploere 10 Compatibility View มันจะถามว่า script unsafe นะ จะเปิดมั้ย ก็ตอบไปเลยค่ะ Yes
    4. แล้วกลับไปดูที่หน้าต่าง IE ใหม่ค่ะ จะได้หน้าจอสวยงาม อ่านรู้เรื่อง ดังนี้

    ก็เป็นการใช้งานเบื้องต้น สำหรับคนที่สนใจก็ลองดูค่ะ อย่างที่บอกถ้ามีเวลาจะเขียนส่วนการตั้งค่าให้นะจ๊ะ

    เพิ่มเติม

    หลังจากผ่านไป 1 ปี เลยถูกเร่งด้วยงานด่วนต้องกลับมาใช้ แล้วพบว่าตอนนี้ IE 11 ไม่สามารถหา compatibility ได้แล้ว ถึงจะมี Emulation ใน Developer Tools แต่ก็ไม่สามารถอ่านรายงาน log.xml ได้ แล้วจึงพบว่าไฟล์ report.xml ใน WCAT ุุ6.3 ที่ใช้อยู่มันผิด ต้องทำการแก้ไขตาม stackoverflow

    1. Cut the code on lines 1151-1157 and paste it on line 1146.
    2. On line 51 add: var i=0;
    Reference:
    WCAT User Guide
    Stress and Load testing on Windows - Using WCAT 6.3 Introduction
    WCAT – Simple Performance Test Tool for your .NET web app

    WCAT report.xsl invalid

    Test Double

    วันนี้ได้อ่านบทความที่เกี่ยวกับการทำ test และได้รู้คำใหม่ๆ เช่น Test Double ที่ใช้เรียก class ที่ใช้ในการกันส่วนที่ไม่เกี่ยวข้องกับส่วนที่ต้องการทดสอบออกไป ซึ่ง Test Double มีหลายตัว คือ

    Dummy <-- and="" fake="" mock="" p="" spy="" stub="">
    ที่เขียนแบบนี้เพราะมีบทความจาก Robert C. Martin ที่บอกว่า Mock เป็นประเภทหนึ่งของ Spy และ Spy เป็นประเภทหนึ่งของ Stub และ Stub เป็นประเภทหนึ่งของ Dummy แต่ว่า Fake เป็นประเภทที่แตกต่างออกไป (ทั้งนี้ควรจะอ่านบทความควบคู่ไปด้วย เพื่อความเข้าใจมากขึั้น มิฉะนั้น อาจจะเข้าใจผิดได้ เช่น ถึงแม้ Stub จะเป็นประเภทหนึ่งของ Dummy แต่ว่าการใช้ในการทดสอบก็ต่างกัน เพราะว่า Dummy มักใช้เป็น parameter ในการส่งเข้า method แต่ว่า Stub เราใช้แทน class เพื่อให้ทำงานบางวัตถุประสงค์)

    ทั้งนี้จากบทความเอง ก็ช่วยให้เรารู้ว่าโดยปกติการเขียน unit test เค้ามักจะใช้ Stub กับ Spy ส่วน Dummy ใช้น้อยมาก และจะใช้ Mock น้อยมากๆ เนื่องจาก syntax ในการเขียนที่ดูยุ่งๆ ของ Mocking Tools (ตามบทความนะจ๊ะ แต่เราก็รู้สึกแบบนั้น)

    ก็ถือเป็นการเปิดหูเปิดตาในการทำ Unit Test อย่างมาก

    Reference:
    The Little Mocker

    .Net Unit Test Framework

    พอดีเพิ่งได้มีโอกาสมาลองศึกษา .Net และต้องศึกษาเฉพาะส่วน unit test โดยเฉพาะ และได้ลอง search ดู ซึ่งในเวป Microsoft ทำไว้ค่อยข้างดีทำตามได้เลย แต่ก็ขอสรุปสั้นๆ ให้เข้าใจดังนี้

    1. การจะสร้าง Unit Test ใน .Net จะเป็นลักษณะสร้างเป็นโปรเจ็คต่างหากใน solution เดียวกัน โดยเลือก template เป็น Unit Test Project ซึ่งตัวอย่างของ Microsoft ก็จะสร้างเป็น C# แล้วเลือกไปเมนูที่ Test ตอนสร้างโปรเจ็ค (ซึ่งเข้าใจว่าไม่จำเป็นที่จะต้องแยกเป็นคนละโปรเจ็ค เพียงแต่จะต้องใส่ using Microsoft.VisualStudio.TestTools.UnitTesting; เพื่ออ้างอิงถึง library ที่ต้องใช้ในการทดสอบ แต่ที่แยกเป็นคนละโปรเจ็ค เพื่อแยกส่วนที่จะเป็นตัวโปรแกรมจริงๆ ออกจากส่วนทดสอบ)

    2. แล้วเลือก Add Reference... เป็นโปรเจ็คที่ต้องการจะทดสอบ

    3. สร้าง class ใหม่ สำหรับเป็น unit test ซึ่งจะต้องใส่ attribute [TestClass] และ [TestMethod] ไว้ที่ class และ method ที่ต้องการให้ run เพื่อทดสอบ

    4. ส่วนการ run test ให้ใช้ Test Explorer ในการ run จากเมนู TEST > Windows > Test Explorer

    ตัวอย่างของ class ที่ใช้ทดสอบ

    // unit test code
    using System;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    
    namespace BankTests
    {
        [TestClass]
        public class BankAccountTests
        {
            [TestMethod]
            public void TestMethod1()
            {
            }
        }
    }
    
    
    นอกจากนั้นยังสามารถใส่ attribute อื่นๆ ได้อีก เช่น [ExpectedException(typeof(ArgumentOutOfRangeException))] ดังนี้ 
    
    
    //unit test method
    [TestMethod]
    [ExpectedException(typeof(ArgumentOutOfRangeException))]
    public void Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange()
    {
        // arrange
        double beginningBalance = 11.99;
        double debitAmount = -100.00;
        BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);
    
        // act
        account.Debit(debitAmount);
    
        // assert is handled by ExpectedException
    }

    Reference:
    Walkthrough: Creating and Running Unit Tests for Managed Code Using Microsoft.VisualStudio.TestTools.UnitTesting Members in Unit Tests
    Using the Assert Classes
    Anatomy of a Unit Test

    การกำหนดรหัสผ่านสำหรับ Postgres ด้วยไฟล์

    คงไม่ค่อยได้มีคนไทยใช้ Postgres มากนัก เพราะส่วนใหญ่คงใช้ MySQL กัน แต่ก็นานาจิตตัง เอาเป็นว่าใครใช้แล้วมีปัญหาต้องการใช้ password แบบไม่ต้องพิมพ์ เช่นต้องการใช้ pg_dump หรือคำสั่งอย่างอื่นผ่านทางโปรแกรม ทำเป็นระบบอัตโนมัติ แต่ไอ้คำส่งพวก psql หรือ pg_dump ดันจะต้องเด้งขึ้นมาให้ใส่ password ก็มีวิธีแก้กัน ก็คือกำหนด password ไว้ในไฟล์

    โดย Windows กำหนดไว้ในไฟล์ %APPDATA%\postgresql\pgpass.conf โดยรูปแบบก็จะเป็น

    hostname:port:database:username:password

    ตัวอย่าง

    localhost:5432:anydb:backupuser:password

    ดูเหมือนไม่ค่อยมีอะไรเน้อะ แต่ไอ้ความไม่มีอะไรนี่แหละทำพิษ เพราะว่าในตอนท้ายบรรทัด คุณจะต้องใส่ enter ให้มันขึ้นบรรทัดใหม่ไปด้วย มิฉะนั้น มันจะไม่รับรู้ คือเหมือนหา password ไม่เจอซะดื้อๆ หาอยู่ครึ่งวัน จมน้ำครึ่งแข้ง เซ็ง

    Reference
    The Password File


    Google Takeout

    ใช้ผลิตภัณฑ์ของพี่ Google เค้าหลายตัว ก็เพิ่งจะรู้ว่า Google เค้ามี Takeout ด้วย ซึ่งเป็นตัว backup เนื้อหาหลายอย่างที่เราใส่เข้าไป ไม่ว่าจะเป็น Messenger, Hangout, Photos, Youtube หรือแม้กระทั่งหน้า Google+ เจ้าตัว Takeout ก็สามารถ backup ได้หมด แต่จะได้ฟอร์แมตไหนต้องลองไปศึกษากันดูนะค่ะ

    ส่วนตัวรู้สึกว่าเอ่อ มันใช้งานง่ายดี ลอง backup รูปมาก็โอเคเลย แบบว่าวางใจเก็บ backup รูปไว้ที่ Google+ โดยไม่ต้องกังวล จะเอารูปเข้าก็ backup อัตโนมัติจากมือถือก็ได้ หรือว่าจะ ใช้ Google+ Auto Backup จากเดสต์ทอปก็ได้ ตอนจะเอาออกก็ใช้ตัว Takeout นี่แหละ ที่นี่ก็ไม่ต้องห่วงทั้ง import, export แล้วล่ะ

    Agile: an Alternative Software Development

    ไปอบรมมาค่ะ เรื่อง Agile: an Alternative Software Development ได้ความรู้อีกเยอะ และเคยเขียนถึง Agile ไว้น้อยนึงตอนที่ไปงาน Thailand SPIN 2012 แล้วก็ไม่ได้เคยเขียนถึงอีกเลย เพราะเห็นว่ามีอยู่เยอะแยะแล้วตามเน็ต ทั้ง Agile Manifesto ทั้ง 4 ข้อ และ Agile Principle 12 ข้อ

    ซึ่งแม้หัวข้ออบรมจะเป็นเรื่อง Agile แต่ practice ที่ทำให้ workshop เป็น Scrum ก็เลยได้ Scrum มาด้วย จึงขอสรุป scrum แบบสั้นสุดๆ ไว้ เนื่องจากคงยังไม่มีโอกาสได้ใช้อีกนาน เอาไว้ระลึกในภายหลังละกันค่ะ

    โดยทฤษฎี Scrum จะทำให้เกิด
    - Transparency ทำให้เกิดความโปร่งใส ไม่ใช่แค่ทำให้เกิดความยุติธรรมนะค่ะ ตามที่เราเข้าใจความโปร่งใสจะทำให้เกิดความคล่องตัว รู้ว่าใครทำอะไรอยู่ สถานะงานอยู่สถานะไหน ทำให้เกิดการแก้ไขความล่าช้า หรือปัญหาที่เกิดได้อย่างรวดเร็ว
    - Inspection ทำให้มีการตรวจสอบงานกับเป้าหมายได้ง่าย เห็นว่างานที่ทำตรงกับเป้าหมายที่ลูกค้าต้องการหรือเปล่า มีการตรวจสอบปัญหา และอุปสรรคเป็นระยะๆ
    - Adaptation ทำให้ทีมได้ปรับตัวได้รวดเร็ว ถ้ามีข้อผิดพลาด ก็จะผิดพลาดแค่เพียงเล็กน้อย สามารถแก้ไขได้รวดเร็ว

    Scrum team ประกอบด้วย 3 กลุ่มบทบาท
    1. Product owner 1 คน เป็นตัวแทนทางธุรกิจของสินค้านั้นๆ เป็นคนกำหนดว่าอะไรที่ทำให้เกิดกำไร อะไรสำคัญกว่าอะไร ซึ่งสิ่งที่ PO หรือ Product owner ทำกับ Product backlog โดยการจัดลำดับความสำคัญ, แบ่งขนาดของ item (หรือ user story), ประเมินขนาดของแต่ละ story เรียกว่า Backlog grooming
    2. Development team 3 - 9 คน ถ้าน้อยไป อาจจะมีปัญหาเรื่องทักษะ, ความรู้ ในการทำงานให้สำเร็จ ถ้ามากไป จะทำให้เกิดปัญหาเรื่องการสื่อสารไม่ทั่วถึง และความซับซ้อนในการจัดการคน ลักษณะของคนในทีมมีดังนี้

    • Self-organizing team
    • Cross-functional team
    • No titles
    • No sub-team

    3. Scrum master 1 คน เป็นคนดูแลให้มีการนำ Scrum มาใช้ตามวัตถุประสงค์ที่ถูกต้อง สร้างความเข้าใจในการทำกิจกรรมของ Scrum

    Scrum Artifact
    1. Product backlog

    • Feature - มาจาก Product owner
    • Technical work - เป็นงานดูแล Infrastructure ทั้งหมด งานส่วนนี้จะมาจาก Development team
    • Bug - มาจาก Product owner หรือ Development team
    • Knowledge acquisition - เป็นงานในการศึกษาหาความรู้ เพื่อให้สามารถทำงานให้สำเร็จ ซึ่งมาจาก Development team
    2. Sprint backlog
    เป็นส่วนหนึ่งของ Product backlog ที่จะต้องทำให้เสร็จในแต่ละรอบการทำงาน ซึ่งเป็นงานที่ มีรายละเอียดชัดเจนพอที่ Development team จะนำไปทำได้


    Scrum Events
    การทำงานในแบบ Scrum จะแบ่งออกเป็นรอบเล็กๆ เพื่อให้ได้งานที่เสร็จสมบูรณ์เป็นชิ้นเล็กๆ  (Potentially shippable product) โดย 1 รอบจะเรียกว่า 1 Sprint ซึ่งในแต่ละ Sprint จะเป็นเวลาเท่าๆ กัน (time-box) เป็นการจำกัดเวลาในแต่ละรอบ และประกอบไปด้วยกิจกรรมต่างๆ ที่กำหนดเป็น time-box เช่นเดียวกัน ดังนี้
    1. Sprint planning ใช้ 8 ชั่วโมงสำหรับ Sprint ที่ยาว 1 เดือน

    • Part 1 - What can be done this Sprint? ซึ่ง Development team จะประชุมร่วมกับ Product owner เป็นส่วนที่ต้องตกลงกันว่าอะไรควรจะต้องทำก่อน เพราะอะไร อะไรมีความสำคัญกว่าอะไร
    • Part 2 - How will the chosen work get done? เป็นการประชุมภายในของ Development team เพื่อทำ Work break down จากงานใน Part 1 ซึ่งมาจะสามารถประเมินงานแต่ละชิ้นได้หลายวิธี แต่จะต้องให้ทั้งทีมประเมินร่วมกัน และเห็นชอบร่วมกัน ซึ่งวิธีหนึ่งที่นิยมทำกันก็คือ Planning poker
    2. Daily scrum เป็นการประชุมทุกวัน วันละ 15 นาที โดยหัวข้อการประชุมคือ
    • What did I do yesterday?
    • What will I do today?
    • Do I see any impediment?
    3. Sprint review ใช้เวลา 4 ชั่วโมงสำหรับ Sprint ที่ยาว 1 เดือน ประชุมร่วมกันระหว่าง Development team, Product owner และ Stakeholders ทั้งหมด เพื่อนำเสนองานที่ได้ทำมา ตอบคำถามจาก Stakeholders รับฟังความเห็น แจ้งปัญหาและอุปสรรค แจ้งความต้องการความช่วยเหลือหรือสนับสนุน

    4. Sprint retrospective ใช้เวลา 3 ชั่วโมงสำหรับ Sprint ที่ยาว 1 เดือน เป็นการให้โอกาส Development team ได้ตรวจสอบตัวเอง สร้างแผนในการพัฒนาทีม และเป็นการเพิ่มคุณภาพให้กับทีมโดยปรับข้อกำหนดของ "Done" (definition of "Done") โดยจะประชุมกันคือ Good, Bad, Try และผลของการประชุม ก็คือใน Sprint ถัดไป ทีมจะปรับปรุงอะไร




    จากรูปน่าจะชัดเจนที่สุดนะค่ะ


    Reference:
    Agile Manifesto
    Agile Principle
    Art of Project Management
    Scrum Guide