Port Exhaustion

ตามที่ได้เคย blog ไว้ว่า บังเอิญได้มาเกี่ยวข้องกับการทดสอบประสิทธิภาพของระบบซึ่งเป็น Window-base และได้เห็นปัญหาในการได้มาของ software จึงอยากจะจดบันทึกไว้เตือนตัวเอง และเผื่อจะเป็นประโยชน์กับคนอื่นได้บ้าง

ซึ่งจากการทดสอบระบบ เราพบว่า web application ที่ได้ทดสอบมีปัญหา เมื่อต้องรองรับผู้ใช้จำนวนมากๆ และจากผู้รู้หลายคนช่วยกันตรวจสอบจึงรู้ว่า อาการนี้เรียกว่า port exhaustion ซึ่งก็คือ application มีการใช้ dynamic port จนเต็ม ซึ่ง port ที่ใช้จะเป็น outbound connection (เพราะถ้าเป็น inbound มันจะมีอยู่ port เดียวอ่ะนะ)

ซึ่งวิธีการที่จะตรวจสอบการใช้ คือการใช้ netstat

> netstat -nao

ซึ่งจะแสดง connection ทั้งหมด และ pid เราจะต้องมองหา connection ที่ผิดปกติเอง ซึ่งโดยปกติถ้ามีอาการของ port exhaustion แสดงว่าจะต้องมีการใช้ port จำนวนมากจาก application หนึ่ง ซึ่งอาจจะดูได้จาก application ที่มี pid เดียวกัน และมีการใช้ port เป็นจำนวนมาก

ทีนี้หาได้แล้วทำไง ซึ่งจากเอกสารที่อ่านมา ที่ทำได้คือแจ้งเจ้าของ application ให้มาดูและแก้ไข หรือไม่ในฐานะของผู้พัฒนา application ก็คือจะต้องตรวจสอบ application ของเราเองว่ามีการใช้ connection เยอะเกินไปหรือไม่ แต่สำหรับบาง application ที่มาไกลเกินว่าจะแก้ไข วิธีที่จะแก้ไขได้ก็คือ

  1. เพิ่ม dynamic port ซึ่งแต่เดิม Windows Server 2012 จะมีการกำหนดค่า MaxUserPort ไว้ใน Windows Registry โดยสามารถกำหนได้สูงสุดคือค่า 65534 (แต่ port 1024 แรก จะกันไว้สำหรับ application บางตัวอยู่แล้ว)
  2. กำหนด connection timeout ของ port ให้ลดลง เนื่องจาก หลังจากที่ application ได้มีการปิด port ไปแล้ว port นั้นๆ จะยังใช้ไม่ได้จนกว่า 4 นาทีต่อมา ซึ่งจะต้องไปแก้ไขค่า TcpTimedWaitDelay ใน Windows Registry (แต่อยากให้ลองหาข้อมูลเพิ่มเติมกันนะค่ะ ว่าทำไมมันถึงต้องกันไว้ 4 นาที เพื่อสวัสดิภาพของระบบโดยแท้จริง) 

ทั้งนี้วิธีแก้ไข Port หรืออาการของ Port โดยละเอียด ดูได้จาก reference ข้างท้ายนะค่ะ (งานใหม่ๆ ไม่ได้มาพร้อมความลำบากเพียงอย่างเดียว มันมาพร้อมความรู้ใหม่ๆ เสมอ - เหรียญมี 2 ด้านเสมอเช่นเดียวกัน)

Reference:
Port Exhaustion
Avoiding TCP/IP Port Exhaustion
TcpTimedWaitDelay
MaxFreeTcbs

Thailand SPIN 2015


- เน้น business value สำหรับแต่ละ feature
- gap between business and technical make agile stuck.
- อะไรที่เกี่ยวกับ budget เป็นหน้าที่ของ pm.
- cost of quality มีจริง (including agile)
- การได้ cert มาง่าย การรักษาให้ quality of process คงอยู่ยาก
- agile ต้องทำทุกระดับในองค์กร
- agile เป็นแค่ tools เลือกใช้ให้ถูก

ติดตั้ง Git เชื่อมต่อกับ GitHub

1. สมัคร GitHub ที่ https://github.com/
เมื่อสมัครแล้ว GitHub จะส่งเมล์มา verify email ที่เราใส่ไป เพราะจะใช้เป็น email ในการส่งการเปลี่ยนแปลงของ project ที่เราเข้าร่วมมาให้ ให้เราทำการ verify ให้เรียบร้อย

2. download โปรแกรมจาก http://git-scm.com/

3. double click เพื่อติดตั้ง

4. สร้าง ssh key สำหรับเชื่อมต่อกับ GitHub ในการ push, pull ไฟล์
โดยการ คลิ๊กขวาที่ directory ใดๆ เลือก Git Bash



เมื่อเข้าหน้า command ให้ใช้คำสั่ง

$ ssh-keygen

ซึ่ง git จะไปสร้าง key file ใน home directory\.ssh ของ user ซึ่งสำหรับ Windows จะอยู่ที่ C:\Users\[username]\.ssh

ซึ่งไฟล์จะประกอบด้วย

  • known_hosts เป็น ip และ public key ของ GitHub
  • id_rsa ซึ่งเป็น private key
  • id_rsa.pub เป็น public key

5. add public key ใน GitHub
โดย login เข้า GitHub
เลือก Setting
เลือก SSH Keys
กดปุ่ม Add SSH Key


ตั้งชื่อ title ซึ่งเป็นอะไรก็ได้
copy content ของ id_rsa.pub ใส่ใน key

โดย 1 user จะสามารถมี key ที่เครื่องใดๆ ได้ 1 key เท่านั้น แต่ถ้า 1 user มีหลายเครื่องก็จะต้องสร้าง key สำหรับแต่ละเครื่องในการติดต่อกับ GitHub

6. ตั้งค่า user name, email
ใน Git Bash

$ git config --global user.name "xxx"
$ git config --global user.email "xxx@xxx"


เท่านี้ก็น่าจะเสร็จเรียบร้อยสำหรับการติดตั้งค่ะ





สรุปคำสั่ง run Robot Framework

สำหรับการทำงานพื้นฐานเลย คือสั่งให้ script ทำงานธรรมดา

> pybot [filename.txt]

สำหรับการกำหนดตำแหน่งที่เก็บไฟล์ที่ได้จากการทำงานของ script

> pybot --output [folder] [filename.txt]
> pybot --log [folder] [filename.txt]
> pybot --report [folder] [filename.txt]

หรือถ้าต้องการเก็บทั้งหมดไว้ใน folder เดียวกัน 
> pybot --outputdir [folder] [filename.txt]
> pybot -d [folder] [filename.txt]

และถ้าต้องการให้ไฟล์ที่ได้มีการใส่วันเวลาต่อท้าย เพื่อไม่ให้ทับไฟล์เก่า
> pybot --timestampoutputs [filename.txt]
> pybot -T [filename.txt]


หรือในกรณีต้องการกำหนดค่าตัวแปรที่จะใส่เข้าไปใน script

> pybot --variable [name]:[value]

หรือกำหนดประเภทการทำงานซึ่งได้แก่ ExitOnFailure, random:test, random:suit, randam:all

> pybot --runmode [mode] [filename.txt]










ติดตั้ง Sublime สำหรับ Robot Framework

Sublime เป็น text editor ตัวหนึ่งเท่านั้นเองค่ะ แต่ว่ามันมี package เสริมสำหรับเขียน Robot Framework script

วิธีการติดตั้ง
1. download โปรแกรมกันได้ที่ http://www.sublimetext.com/
สำหรับเราเลือก download เป็น portable ค่ะ

2. extract ตัว .zip ก็เป็นอันเสร็จเลย

3. ติดตั้ง package control ของ sublime โดย copy คำสั่งใน https://packagecontrol.io/installation#st2
ไปที่ sublime console (เมนู View > Show Console) แล้ว enter เลย

4. ติดตั้ง Robot Framework package
ไปที่เมนู Tools > Command Palette...
พิมพ์และเลือก "Package Control : Install Package"
พิมพ์ Robot เลือกติดตั้ง Robot Framework 2 package


เสร็จแล้วค่า... ต่อไปก็เริ่มเขียนได้เลย


ติดตั้ง Robot Framework

ก่อนจะติดตั้ง Robot Framework กรุณาติดต้้ง Python ก่อนนะค่ะ
หลังจากติดตั้ง Python เสร็จแล้ว ก็ติดตั้ง Robot Framework จาก pip เลยค่ะ

1. ติดตั้ง Robot Framework โดย run command

> pip install robotframework

จากนั้นให้ลอง run command

> pybot 

จะได้ดังนี้



2. ติดตั้ง Selenium บน Robot Framework เพื่อใช้ในการทดสอบ web application

> pip install robotframework-selenium2library


แค่นี้เสร็จแล้วค่ะ

ติดตั้ง Python และ pip

เริ่มมาจากไปเรียน Robot Framework ซึ่งเป็น Tools สำหรับทำการทดสอบโปรแกรม และตัว Robot Framework มันเป็น Python ค่ะ ก็เลยต้องติดตั้ง ก็เลยเอามาฝากเล่นๆ


1. download Python ก่อนค่ะ ที่นี่ https://www.python.org/downloads/ ซึ่งสำหรับ Robot Framework จะต้องใช้ version 2 เพราะเหมือนยังมีปัญหากับ version 3 ก็ download version 2.7.9 มาค่ะ เป็น file .msi สำหรับการติดตั้งบน Windows

2. ก็ double click ที่ตัว .msi ที่ได้มา แล้วอย่าลืมเลือก "Add python.exe to Path" ด้วยนะค่ะ จะได้ไม่ต้องมา add เองทีหลัง

แต่ถ้าใครลืม ก็สามารถเพิ่ม PYTHON_HOME ไปยัง directory ที่ติดตั้ง ลงในตัวแปร PATH ใน environment variable ที่หลังได้ค่ะ

ทดสอบโดยการพิมพ์ python ที่หน้า command


ถ้าได้ฉะนี้ ก็แปลว่า ลง Python เรียบร้อย

3. จากนั้น ติดตั้ง pip ซึ่งเป็นตัวจัดการ package สำหรับ Python (Package Installation for Python)
โดยการ download get-pip.py จากหน้า http://www.pip-installer.org/en/latest/installing.html

4. แล้ว run command
> python get-pip.py
5. เพิ่ม %PYTHONE_HOME%/Scripts ในตัวแปร PATH เพื่อให้สามารถ run pip ได้

เมื่อลงเสร็จแล้ว เราสามารถลบตัว get-pip.py ออกไปได้เลยค่ะ

Cloud (สรุปอย่างย่อ)

Cloud Computing Definition - Key Character


  • On-demand self-service
  • Ubiquitous network access
  • Location independent resource polling
  • Rapid elasticity
  • Pay per use

Cloud Delivery Model

Traditional Model
  • Software as a Service (SaaS)
  • Platforms as a Service (PaaS)
  • Infrastructure as a Service (Iaas)
Latest Model
  • Process as a Service คือ Traditional Model ที่ความสามารถ Business Process Management, Service Oriented Architecture, Social Software

Cloud Technology's Type

  • Cloud 1.0 : IaaS - ทดแทน Hosting Service
  • Cloud 2.0 : Iaas + Mobile App - จัดการพวก non-sql data, non-structure data (Hadoop)
  • Cloud 3.0 : IaaS, PaaS, HPC, Big Data Analysis

Cloud Computing Standard Recommendation

  • ISO 27001 (Security Foundation)
  • ISO 22301 (BCM)
  • CSA Star Cert (Cloud, Governance)
  • ISO 50000 (Energy Management)
  • ISO 14001 (Environmental)
  • ISO 14064 (Greenhouse Gas)

Big Data's Type

  • 1.0 (Transaction Data, Structure Data) - ข้อมูลจากในองค์กร ex. ERP ใช้ Data Mining
  • 2.0 (Non-structure Data) - เพิ่มข้อมูลจาก Social Nework ใช้ Grid Computing (Hadoop)
  • 3.0 (Huge, Very Large Data) - เพิ่มข้อมูลจาก IoT ใช้ HPC ไม่เน้น Hadoop

.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