Month: June 2019

  • วิธีการคำนวณหาอายุด้วย Oracle Datetime Functions

    อายุเป็นเพียงตัวเลข มีคนพูดไว้แบบนี้ แล้วถ้าเราอยากจะรู้ล่ะว่าไอ้ตัวเลข จำนวนปี จำนวนเดือน และจำนวนวัน ของอายุเรามันเป็นตัวเลขอะไร ถ้าไม่อะไรมากใช้เครื่องคิดเลข หรือนับเอาก็ได้อยู่ แต่ถ้าต้องคำนวณของทุกคนในองค์กรล่ะจะนับเอง หรือเครื่องคิดเลขก็คงไม่ไหวแล้ว ดังนั้นวันนี้จึงจะขอแนะนำ Oracle Datetime Functions ที่สามารถนำมาประยุกต์ใช้ เพื่อคำนวณหาอายุของเรากันค่ะ

    Oracle Datetime Functions ที่จะแนะนำในวันนี้คือ ฟังก์ชัน TRUNC (date), ADD_MONTHS และฟังก์ชัน MONTHS_BETWEEN โดยมีรายละเอียดของฟังก์ชันดังนี้

    ฟังก์ชันคำอธิบาย
    ADD_MONTHSเพิ่มจำนวนเดือนลงในวันที่ที่ระบุ
    MONTHS_BETWEEN หาจำนวนเดือนระหว่าง 2 วันที่ที่ระบุ
    TRUNC (date)คืนค่าวันที่พร้อมส่วนเวลาของวันที่ตัดให้เป็นหน่วยที่ระบุ

    ตัวอย่างการใช้งานฟังก์ชัน ADD_MONTHS
    Syntax :
    ADD_MONTHS(date, integer)

    รูปแสดงตัวอย่างการเขียน query และผลลัพธ์ที่ได้ของฟังก์ชัน ADD_MONTHS

    ตัวอย่างการใช้งานฟังก์ชัน MONTHS_BETWEEN
    Syntax :
    MONTHS_BETWEEN(date1, date2)

    รูปแสดงตัวอย่างการเขียน query และผลลัพธ์ที่ได้ของฟังก์ชัน MONTHS_BETWEEN

    ตัวอย่างการใช้งานฟังก์ชัน TRUNC (date)
    Syntax :
    TRUNC ( date [, format ] )

    โดยที่ format ไม่ต้องระบุก็ได้ กรณีไม่ระบุวันที่จะถูกตัดเป็นวันที่ใกล้ที่สุด สามารถแสดงตัวอย่างของ format ได้ดังต่อไปนี้

    รูปแบบ Formatหน่วยปัดเศษ
    SYYYY, YYYY, YEAR. SYEAR, YYY, YY, Y ปี
    MONTH, MON, MM, RM เดือน
    DDD, DD, J วัน
    DAY, DY, D วันเริ่มต้นของสัปดาห์
    HH, HH12, HH24 ชั่วโมง
    MIนาที

    รูปแสดงตัวอย่างการเขียน query และผลลัพธ์ที่ได้ของฟังก์ชัน TRUNC (date)

    จากตัวอย่าง query การใช้งานทั้ง 3 ฟังก์ชันข้างต้น เราสามารถประยุกต์ใช้เพื่อคำนวณหาจำนวนปี จำนวนเดือน และจำนวนวันของอายุได้ดังนี้

    รูปแสดงตัวอย่าง query การหาจำนวนปี จำนวนเดือน และจำนวนวันของอายุ

    คิดว่านอกเหนือจากการคำนวณหาอายุแล้วก็ยังไปประยุกต์ใช้สำหรับการหาช่วงเวลาอื่นๆ ได้อีกเช่น ระยะเวลาในการปฏิบัติงานเป็นต้น

  • Windows 10, Version 1903, May 2019 Update installation

    Windows 10, Version 1903, May 2019 Update เป็นรุ่นปรับปรุงที่ออกเมื่อ พฤษภาคม 2562 การติดตั้งเปลี่ยนแปลงไปนิดหน่อยดังนี้

    จะพูดถึงการติดตั้งใหม่เท่านั้น ใครจะอัพเดตผ่าน Windows update ก็สามารถอัพเดตได้เลย

    สำหรับนักศึกษา

    • Windows 10 ที่สามารถติดตั้งได้คือ Windows 10 Education เท่านั้น เนื่องจากหมายเลขผลิตภัณฑ์ (Product key) ที่ได้จาก Microsoft Azure เป็น Windows 10 Education โหลดได้จาก Microsoft Azure และ https://licensing.psu.ac.th/windows-10/
    • การ activate สามารถทำได้เพียงวิธีเดียวคือใช้ Product key จาก Microsoft Azure เท่านั้น
    • เมื่อติดตั้งจะมีหน้าจอให้เลือกว่าจะติดตั้งรุ่นไหน ก็ให้เลือก Windows 10 Education เท่านั้น
    Windows Setup
    Windows 10 Education 

    สำหรับบุคลากร

    • เลือกติดตั้งได้ 3 รุ่นได้แก่ Windows 10 Education, Windows 10 Pro และ Windows 10 Pro for workstation เท่านั้น รุ่น Enterprise และรุ่นที่มี N ต่อท้ายติดตั้งไม่ได้
    • การ activate สามารถทำได้ 2 วิธี คือ
      • กดรับ Product key ได้ที่ CD-Key ซึ่งเป็นคีย์กลางของมหาวิทยาลัย ใช้ร่วมกันทั้งมหาวิทยาลัย activate 1 ครั้งนับ 1 ครั้ง ฉะนั้นก่อน activate ควรติดตั้ง Software ตัวอื่น ๆ ให้เสร็จเรียบร้อยจนแน่ใจว่าจะไม่ติดตั้ง Windows ใหม่ในระยะเวลา 6 เดือน
      • activate ผ่าน KMS ของมหาวิทยาลัย วิธีนี้เหมาะสำหรับห้องปฏิการคอมพิวเตอร์ และเครื่องในสำนักงาน ที่เปิดใช้งานทุกวัน (หรืออย่างน้อย 1 ครั้งใน 6 เดือน) และเชื่อมต่อกับเครือข่ายของมหาวิทยาลัยตลอดเวลา

    เริ่ม…ได้

    • ดาวน์โหลดแผ่นได้ที่ https://licensing.psu.ac.th/windows-10/
    • สร้าง flash drive สำหรับบูต (flash drive ต้องมีขนาดอย่างน้อย 8GB) ด้วย Rufus https://rufus.ie/ หรือเขียนแผ่น DVD ให้เรียบร้อย
    • เปิดเครื่องบูตด้วย flash drive หรือ DVD ที่สร้างเตรียมไว้แล้ว
    Boot
    (more…)

    Pages: 1 2 3

  • การเข้ารหัส Password หรือข้อมูลส่วนบุคคลในฐานข้อมูล ด้วย Hash Function กับ Salt Value

    การ Hash
    การ Hash หรือ Hashing ชื่ออย่างเป็นทางการคือ Cryptographic Hash คือการสร้างข้อมูลที่เป็นตัวแทนของข้อมูลที่ต้องการ ซึ่งอาจจะเป็นรหัสผ่าน หรือข้อมูลส่วนบุคคลอื่นๆ และนำไปจัดเก็บในฐานข้อมูลหรือใน Text file หรือในที่อื่นๆ ซึ่งข้อดีของการทำ Hash คือจะไม่สามารถถอดรหัส หรือกระทำการใดๆ เพื่อที่จะ Reverse ให้ออกมาเป็นข้อความต้นฉบับ ซึ่งในปัจจุบันมีวิธีการ Hash มากมาย เช่น MD5, SHA1, SHA256, SHA512, RipeMD, WHIRLPOOL, SHA3 เป็นต้น

    การเขียนโปรแกรม
    ในแง่การเขียนโปรแกรมของแต่ละภาษา จะมี Library หรือเครื่องมือที่เอาไว้ใช้ทำ Hash อยู่แล้ว สามารถเปิดจากคู่มือ ได้เลยครับ

    MD5 Hashing & Cracking
    เป็นการทำ Hash ที่พื้นฐานที่สุด และเมื่อหลายปีที่ผ่านมามีข่าวออกมาว่ามีผู้ Crack ได้สำเร็จ ซึ่งรายละเอียดคร่าวๆ ของเรื่องนี้คือ การทำ Hash ทุกชนิดจะมีการเกิดการซ้ำกันของค่า Hash เนื่องจากการมีคุณสมบัติแทนข้อมูลที่ต้องการ ซึ่งค่า Hash ที่สร้างขึ้นจะมีความยาวที่เท่ากันเสมอ ซึ่งสำหรับ MD5 ก็จะมีความยาว 16 bytes (128 bits) ซึ่งค่า hash ที่เป็นไปได้ทั้งหมดก็จะมีค่า 256^16 (หรือ 2^128) ค่าเท่านั้น ในขณะนี้ที่ข้อมูลที่เราต้องการแทนตัวนั้นอาจเป็นข้อมูลอะไรก็ได้ที่มากกว่าค่า 256^16 (หรือ 2^128) แน่นอน จึงเป็นไปได้ที่จะพบข้อมูลมากกว่า 1 ชุดจะมีค่า Hash ที่ตรงกัน
    ความจริงแล้ว MD5 จะไม่สามารถถอดรหัสได้ เนื่องจาก Hash ทุกชนิดจะผ่านกระบวนการเข้ารหัสแบบทางเดียว ดังนั้นทางที่จะสามารถจะรู้ได้ว่าค่าตั้งต้นของ Hash นี้คืออะไร คือการพยายามสุ่มรหัสที่เป็นไปได้ จากนั้นเอาไปแปลงค่าเป็น MD5 และนำค่าที่ได้ไปเปรียบเทียบ (เรียกว่าเป็นการ Brute force นั่นเอง) ซึ่งถ้าเป็นข้อมูลที่มีความยาวหรือมีความซับซ้อนมาก ก็จะต้องใช้เวลาที่นานขึ้น

    Rainbow Table
    เป็นการเก็บข้อมูล Hash โดยมีข้อมูลต้นฉบับจากการ Brute Force เพื่อความรวดเร็วในการตรวจสอบ ซึ่งในปัจจุบัน GPU ระดับปานกลางหลายๆ รุ่นจะสามารถคำนวน Hash ได้ในระดับ 10 ล้าน Hash ต่อวินาที ซึ่งในปัจจุบันมีผู้ยอมเสียเวลาเพียงครั้งเดียวเพื่อสร้าง Hash ที่มีควายาวมากๆ และมีความซับซ้อน เพื่อในครั้งต่อๆ ไปจะสามารถนำมาาใช้งานได้ทันที และมีให้ดาวน์โหลดได้ฟรีอีกด้วย

    ปัญหาของ Rainbow Table ในปัจจุบันคือ ยังไม่มีการสร้าง rainbow table ขึ้นมาสำหรับ hash ทุกชนิดหรือทุกความยาวของข้อมูลที่ต้องการ ถึงแม้จะมี CPU หรือ GPU ความสามารถสูงๆ แต่การทำ Hash ก็ยังคงใช้พลังในการประมวลผลมากเช่น SHA-2 ขนาด 256 bits ขึ้นไป เป็นต้น

    Image result for hashing with salt

    Salting
    เป็นเทคนิคนึงสำหรับเพิ่มความปลอดภัยสำหรับข้อมูลตั้งต้นของเรา ซึ่งทำให้ใช้เวลาในการถอดรหัสมากขึ้น ดังตัวอย่างเช่น ข้อความที่ต้องการเข้ารหัสตั้งต้นคือ “ThisIsMyPassword” และเมื่อรวมเข้ากับ Salt (ซึ่งอาจมาจากข้อความที่สุ่มขึ้นมา) คือ “3gswgW09seh” จะได้เป็น “ThisIsMyPassword3gswgW09seh” จากนั้นนำข้อความนี้ไป Hasing ซึ่งถ้าคำนวนความน่าจะเป็นของข้อความ กรณีที่เป็นตัวอักษรตัวเล็ก ตัวใหญ่ และตัวเลข มีความเป็นไปได้ 62 แบบ จะเท่ากับว่าถ้ารหัสผ่านที่เราเก็บมีความยาว 16 ตัวอักษร ก็ต้อง Hash ถึง 16^62 แบบ แต่ถ้าเป็นข้อความที่รวมกับSalt แล้วข้างต้น เป็นความยาว 27 ตัวอักษร ผู้ไม่ประสงค์ดีต้อง Hash ถึง 27^62 ถึงจะได้ข้อความที่ถูกต้อง ซึ่งต้องใช้เวลามหาศาลมากกว่าเดิม แต่ข้อเสียของวิธี Salting จะต้องมีการเก็บ Salt Value ในลักษณะของ Plain Text หรือเก็บไว้ในโปรแกรมที่พัฒนา เพื่อการถอดรหัสที่ถูกต้อง และถ้าหาก Salt Value มีการเสียหายหรือเปลี่ยนค่าไปหลังจากการเข้ารหัสเสร็จแล้ว จะไม่สามารถเทียบ Hash เพื่ออ่านข้อความต้นฉบับได้เลย

    Image result for hashing with salt

    Conclusion
    1. การเก็บข้อมูลที่สำคัญ เช่น รหัสผ่าน หรือแม้กระทั่งเลขประจำตัวประชาชน ในฐานข้อมูล ควรเก็บในรูปแบบ Hash เท่านั้น
    2. รหัสผ่านยิ่งยาว ยิ่งใช้เวลาในการถอดรหัสมากขึ้น และยิ่งมีการใช้ Salt Value จะใช้เวลามากยิ่งขึ้น โดยเฉพาะการใช้ Salt Value เพิ่มเข้าไปเพื่อให้มีความยาวมากขึ้น
    3. MD5 ก็ยังเพียงพอต่อการเก็บรหัสผ่านและข้อมูลอื่นๆ แต่ก็ยังสู้ SHA-2 ไม่ได้
    4. ทางที่ดีที่สุดคือ อย่าให้รหัสผ่านหรือข้อมูลที่เก็บอยู่ ถูกเข้าถึงจากภายนอก แม้แต่จะเป็นแค่ Hash ก็ตาม

    Reference:
    https://crackstation.net/hashing-security.htm

  • SQL Expression สำหรับหาช่วงเวลาที่ต้องการ

    ใครที่เคยสร้าง Materialized View จะทราบว่าต้องมีการกำหนดช่วงเวลาเพื่อให้ Materialized View นั้นทำการ Refresh ข้อมูลเพื่อให้ได้ข้อมูลที่เป็นปัจจุบัน หรือแม้แต่ Job ก็เช่นกันต้องกำหนดช่วงเวลาเพื่อให้ Job ทำงานตามช่วงเวลาที่กำหนด บางคนอาจจะเจอปัญหาว่าไม่รู้ว่าต้องกำหนดอย่างไร เช่น อยากให้ทำงานทุก 8 โมงเช้า หรืออยากให้ทำงานทุกเที่ยงคืน เป็นต้น เพื่อให้ปัญหานั้นหมดไป เรามาทำความเข้าใจเกี่ยวกับช่วงเวลาบน Oracle กันดีกว่า

    จากที่เราทราบกันว่า 1 วันมี 24 ชั่วโมง 1 ชั่วโมงมี 60 นาที และ 1 นาทีมี 60 วินาที บน Oracle เราสามารถเขียนเป็น Expression ได้ตามตัวอย่างข้างล่างนี้

    ช่วงเวลา : PeriodExpression 1Expression 2
    1 Day11
    1 Hour1/241/24
    1 Minute1/(24*60)1/1440
    1 Second1/(25*60*60)1/86400

    ดังนั้นจาก Expression ข้างต้นเราก็สามารถเขียนช่วงเวลา ด้วย SQL Expression ดังตัวอย่างต่อไปนี้

    ช่วงเวลาที่ต้องการSQL Expression
    Nowsysdate
    Tomorrowsysdate+1
    Yesterdaysysdate-1
    One hour from nowsysdate + 1/24
    Ten minutes from nowsysdate + 10/1440
    Thirty seconds from nowsysdate + 30/86400
    Tomorrow at 12 Midnighttrunc(sysdate+1)
    Tomorrow at 8 AMtrunc(sysdate+1) + 8/24
    Yesterday at 10 AMtrunc(sysdate-1) + 10/24
    Next Monday at 12 Noonnext_day(trunc(sysdate),’MONDAY’) + 12/24

    คราวนี้เราลองมาเขียนคำสั่งในการ select ข้อมูลตามช่วงเวลาที่ต้องการกันดีกว่าค่ะ

    ตัวอย่างที่ 1 ต้องการ query ข้อมูลเพื่อหาข้อมูลช่วงเวลาดังนี้ วันเวลาปัจจุบัน, หนึ่งชั่วโมงถัดไปจากปัจจุบัน, พรุ่งนี้ตอนเที่ยงคืน และพรุ่งนี้ตอน 8 โมงเช้า สามารถเขียน query เพื่อให้ได้ช่วงเวลาที่ต้องการได้ดังนี้ค่ะ

    ผลลัพธ์ที่ได้จาก query ตัวอย่างที่ 1

    ตัวอย่างที่ 2 ต้องการ query ข้อมูลเพื่อหาข้อมูลช่วงเวลาดังนี้ วันเวลาปัจจุบัน, สิบนาทีถัดไปจากปัจจุบัน, 30 วินาทีถัดไปจากปัจจุบัน และเวลาเที่ยงของวันศุกร์ถัดไป สามารถเขียน query เพื่อให้ได้ช่วงเวลาที่ต้องการได้ดังนี้ค่ะ

    ผลลัพธ์ที่ได้จาก query ตัวอย่างที่ 2

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

  • การเขียน SQL เพื่อเลื่อนลำดับขึ้นลงอัตโนมัติ

    การเขียน SQL เพื่อเลื่อนลำดับขึ้นลงอัตโนมัติของ column ที่ระบุลำดับเป็นตัวเลข

    รูปที่ 1 ตัวอย่างรูปแบบตาราง
    (more…)
  • CrystalReport : ข้อมูลส่วน DetailSection กับการแสดงผลส่วน PageFooterSection

    เนื่องจากผู้เขียนได้รับมอบหมายให้มีการตรวจสอบข้อมูลว่า ถ้ามีข้อมูลใน Field1 ขึ้นต้นด้วยเครื่องหมาย “*” ต้องแสดงข้อความที่ส่วนท้ายของรายงานทุกแผ่นว่า “มีข้อมูลที่มีเครื่องหมาย * นำหน้า”

    ผู้เขียนจึงได้ทำการสร้าง Formula Field ขึ้นมาทั้งหมด 4 อัน คือ

    1. ffCountSubjectStar : ใช้สำหรับเก็บค่าจำนวนข้อมูลใน Field1 ที่ขึ้นต้นด้วย *
    2. ffResetCountStarSubject : ใช้สำหรับ Reset ค่าเมื่อขึ้นหน้าใหม่
    3. ffSumStarSubjectCode : ใช้สำหรับเก็บค่าจำนวนรวมของ Field1 ที่ขึ้นต้นด้วย *
    4. ffPageFooter : ใช้สำหรับเก็บข้อความที่ต้องการให้แสดงท้ายกระดาษ

    1. ffCountSubjectStar

    WhilePrintingRecords;
    Global numberVar
    isStarSubjectCode;

    if (Left({@Field1 },1) = “*”) then
    isStarSubjectCode := 1
    else isStarSubjectCode := 0

    โค้ดส่วนนี้เป็นการตรวจสอบว่าถ้า Field1 นั้นมี * นำหน้า ให้เก็บค่านั้นไว้ในตัวแปร isStarSubjectCode โดย Formula Field นี้จะต้องนำไปใช้ในส่วนของ DetailSection เนื่องจากต้องมีการตรวจสอบข้อมูลทุก Record


    2. ffResetCountStarSubject

    WhilePrintingRecords;

    Global numberVar isStarSubjectCode := 0;
    Global numberVar countStarSubjectCode := 0;

    โค้ดส่วนนี้เป็นส่วนที่ใช้สำหรับ Reset ค่าตัวแปร โดยกำหนดค่าเริ่มต้นให้ตัวแปร ให้เท่ากับ 0 โดย Formula Field นี้จะต้องนำไปใช้ในส่วนของ Page Header เนื่องจากต้องมีการตรวจสอบข้อมูลทุก Record


    3. ffSumStarSubjectCode

    whileprintingrecords; //ทำราย Rec ที่มีการพิมพ์
    Global numberVar countStarSubjectCode;
    Global numberVar isStarSubjectCode;

    countStarSubjectCode := countStarSubjectCode + isStarSubjectCode

    โค้ดส่วนนี้เป็นการนับจำนวน Field1 ที่มี * นำหน้า ให้เก็บผลรวมไว้ในตัวแปร countStarSubjectCode โดย Formula Field นี้จะต้องนำไปใช้ในส่วนของ DetailSection เนื่องจากต้องมีการตรวจสอบข้อมูลทุก Record


    4. ffPageFooter

    ” มีข้อมูลที่มีเครื่องหมาย * นำหน้า”

    เก็บข้อมูลที่ต้องการให้แสดงในส่วนของ PageFooter โดย Formula Field นี้จะต้องนำไปใช้ในส่วนของ PageFooterSection

    ผู้เขียนหวังว่าบทความครั้งนี้จะเป็นประโยชน์ต่อผู้อ่านไม่มากก็น้อย แล้วพบกันใหม่ครั้งหน้าจ้าาาาา ^^

  • AutoMapper

    AutoMapper คือ component ที่ใช้ในการ map ข้อมูลระหว่าง object ต่างชนิดกัน โดยทำการแปลงข้อมูลจาก object ชนิดหนึ่ง ไปกำหนดค่าให้กับ object อีกชนิดหนึ่ง ซึ่งถ้า object ปลายทางตรงตามข้อกำหนดของ AutoMapper ก็ไม่จำเป็นต้อง config ค่าใดๆเลย

    การแปลงข้อมูลจาก object ชนิดหนึ่งไปยัง object อีกชนิดหนึ่ง เกิดขึ้นได้บ่อยในการพัฒนา application โดยเฉพาะ application ที่อยู่ในลักษณะ multi tiers ที่ต้องมีการส่งผ่าน object ระหว่างกัน เช่น UI layer กับ Service layer หรือ Data access layer กับ Service layer

    การใช้งาน AutoMapper

    เมื่อต้องการแปลงข้อมูลจาก object ต้นทางไปยัง object ปลายทางอีกชนิดหนึ่ง ถ้า object ปลายทางมี property name ชื่อเดียวกับ object ต้นทาง AutoMapper จะทำการกำหนดค่าให้กับ property ของ object ปลายทางโดยอัตโนมัติ การกำหนดค่า config การแปลงข้อมูลระหว่าง object ทำได้โดยใช้ MapperConfiguration ซึ่งจะมีเพียงหนึ่งเดียว และสร้างขึ้นตอนเริ่ม application หรือ ใช้ Mapper.Initialize static method

    //static method 
    Mapper.Initialize(cfg => cfg.CreateMap<Person, PersonPoco>());
    
    //instance method
    var config = new MapperConfiguration(cfg => cfg.CreateMap<Person, PersonPoco>());

    type ที่อยู่ทางซ้ายของ cfg.CreateMap<>() คือ type ต้นทาง ส่วนทางด้านขวาคือ type ปลายทาง ซึ่งเราจะทำการ mapping โดยใช้ static Mapper method หรือจะใช้ instance method ก็ได้

    var mapper = config.CreateMapper();
    
    //instance method
    var mapper = new Mapper(config);
    PersonPoco poco = mapper.Map<PersonPoco>(person);
    
    //static method
    PersonPoco poco = Mapper.Map<PersonPoco>(person);

    ในกรณีที่เรามี object ที่มีโครงสร้างซับซ้อน ซึ่งการใช้งานในบางโอกาสที่ต้องการดูข้อมูลเพี่ยงบางส่วน เราสามารถใช้งาน AutoMapper mapping ข้อมูล มาสู่ object ที่มีโครงสร้างเรียบง่ายใช้งานได้สะดวก ตัวอย่างเช่น object Order ที่มีโครงสร้างค่อนข้างซับซ้อนด้านล่างนี้

    public class Order
    {
        public Customer Customer { get; set; }
        public OrderLineItem[] OrderLineItems()
        public decimal GetTotal()
        {
           return OrderLineItems.Sum(li => li.GetTotal());
        }
    }
    
    public class Product
    {
        public decimal Price { get; set; }
        public string Name { get; set; }
    }
    
    public class OrderLineItem
    {
        public Product Product { get; private set; }
        public int Quantity { get; private set;}
        public decimal GetTotal()
        {   
           return Quantity*Product.Price;
        }
    }
    
    public class Customer
    {
         public string Name { get; set; }
    }

    ถ้าต้องการข้อมูลเพียงแค่ CustomerName และ Total เราสามารถนำ AutoMapper มาช่วย Mapping ข้อมูลได้ดังนี้

    public class OrderPoco
    {
        public string CustomerName { get; set; }
        public decimal Total { get; set; }
    }
    
    Mapper.Initialize(cfg => cfg.CreateMap<Order, OrderPoco>()); 
    OrderPoco poco = Mapper.Map<Order, OrderPoco>(order); 
    

    config mapping โดยใช้ static method ทำการ map Order กับ OrderPoco และทำการ mapping โดยเรียกใช้ medthod Map ซึ่งการทำงานเบื้องหลัง AutoMapper จะทำการจับคู่ OrderPoco.Total property กับ Order.GetTotal(), ในส่วนของ OrderPoco.CustomerName จะทำการจับคู่กับ Order.Customer.Name ซึ่งจะเห็นว่าถ้า property name ของ object ปลายทางของการ mapping มีความเหมาะสม ก็ไม่จำเป็นต้องทำการ config mapping สำหรับ property นั้นๆ

    อ้างอิง : http://docs.automapper.org/en/stable/Lists-and-arrays.html

  • เช็คฟอนต์สวย ด้วย WhatFont ~ Extension

    อะ แฮ่ม และแล้วก็เดินมาถึง Blog สุดท้ายในรอบ TOR ของปีนี้จนได้ แต่กว่าจะได้ฤกษ์เขียนได้ก็ปาเข้าไปกลางปีกันเลยทีเดียว (55+)

    มาๆๆ เรามาเข้าเรื่องกันเลยดีกว่า ต้องบอกว่าหลายครั้งที่เราได้เข้าเว็บไซต์นู้นนั่นนี่ แล้วเห็น font สวยๆ แต่ไม่รู้ว่านั่นน่ะมันคือ font อะไร ชนิดไหน … วันนี้ทางผู้เขียนขอนำเสนอ Chrome Extension (อีกแล้วเหรอ !) ที่เรียบง่ายแต่ใช้งานได้จริง นั่นคือ * WhatFont *

    WhatFont คืออะไร ???

    WhatFont เป็นหนึ่งในส่วนขยายของ Google Chrome ซึ่งเป็นเครื่องมือที่ใช้ในการดูได้ว่า Font ที่ใช้หรือแสดงอยู่ในหน้าเว็บไซต์ต่างๆ นั้น คือ Font ชนิดอะไร ขนาดเท่าไหร่ และมีค่าสี เป็นอะไร อ๊ะๆ ยังไม่หมดนะ มันสามารถระบุได้แม้กระทั่งความหนา ความบาง ของ Font นั้นๆ กันเลยทีเดียว เพียงแค่เรานำเมาส์ไปวางบนตัวอักษรที่เราต้องการจะดูรายละเอียดเท่านั้นเอง

    วิธีการติดตั้ง

    • ดาวน์โหลดได้จาก Chrome เว็บสโตร์ คลิก จากนั้นให้คลิกปุ่ม “เพิ่มใน CHROME” หรือ Add to Chrome
    • ระบบจะแสดง pop up ขึ้นมาให้คลิกเลือก “เพิ่มส่วนขยาย”
    • เมื่อเราติดตั้งเรียบร้อยแล้ว หน้าจอก็จะแสดง pop up ขึ้นมาแจ้งให้เราทราบว่าได้ติดตั้งเสร็จเรียบร้อยแล้ว
    • สำหรับวิธีการใช้งาน ให้เข้าเว็บที่เราต้องการ จากนั้นให้คลิกที่ Icon ที่มุมบนด้านขวาของ Browser
    • ให้นำเมาส์ไปวางไว้บนข้อความ / ตัวอักษร ที่เราต้องการจะรู้ว่าเป็น font อะไร
    • และหากต้องการจะดูรายละเอียดเพิ่มเติม เช่น ขนาด สี ความหนา ความบาง ก็ให้คลิกเลือกบนข้อความดังกล่าว จากนั้นจะมีส่วนแสดงข้อมูลเพิ่มเติมขึ้นมาให้เราได้ดูกัน

    เป็นยังไงกันบ้างเอ่ย ข้อมูลอันนี้นี่พอจะช่วยผู้อ่านได้บ้างมั้ย ??

    ยังไงก็แล้วแต่ทางผู้เขียนอยากแนะนำให้ทุกคนไปลองใช้กันดูนะ ง่ายดี ฟรีด้วย แทนที่เรา จะมานั่งคาดเดา หรือมโน กันเองว่า เอ๊ ! ตัวนี้นี่มันเป็น font อะไรแล้วน๊าา แบบนั้นมันล้าสมัยไปแล้ว เสียเวลาเปล่าๆ ติดตั้งตัวนี้กันเลย ง่าย ครบ จบในตัวเดียว 55+

    อย่าลืมลองเล่นกันดูนะ ไว้ปีหน้าฟ้าใหม่ เราจะมาเจอกันอีกใน Blog ถัดๆ ไปเน้ออออ

    ขอบคุณแหล่งอ้างอิง http://photoloose.com/what-font-chrome-extension/

  • แลกเปลี่ยนเรียนรู้ Virtual Desktop Infrastructure (VDI)

    ผมได้จัดแลกเปลี่ยนเรียนรู้ เรื่อง “การจัดการห้องบริการคอมพิวเตอร์ในแนวทาง Virtual Desktop Infrastructure” เมื่อวันที่ 11 มิถุนายน 2562 ณ ห้องปฏิบัติการคอมพิวเตอร์ 3 งานเทคโนโลยีสารสนเทศ ฝ่ายสารสนเทศและทรัพยากรการเรียนรู้ อาคารวิทยบริการ ชั้น 3 มหาวิทยาลัยสงขลานครินทร์ วิทยาเขตตรัง

    คิดว่านำมาเล่าสู่กันฟังในที่นี้น่าจะเกิดประโยชน์

    คุณลักษณะของระบบ

    • VMware vSphere ESXi 6.7 เป็น software จัดการ server
    • Dell EMC PowerEdge Systems เป็น hardware ชนิด Rack Server จำนวน 5 เครื่อง แต่ละเครื่องมี RAM 512 GB มี GPU ชนิด NVIDIA Tesla M10 32 GB และมี SAN Storage ขนาด 50 TB
    • L2/3 network switch ที่มี 10 G Base-T จำนวน 2 ตัว
    • VMware Horizon 7 เป็น software สำหรับทำ VDI
    • เครื่องที่ให้ใช้งานเป็น PCoIP zero client จำนวน 480 ชุด
    • user account เป็น Local Microsoft AD สำหรับห้องคอม

    ประโยชน์ที่ได้รับจากการแลกเปลี่ยนเรียนรู้ในครั้งนี้

    • ได้ทดลองใช้งานเป็นผู้ใช้งาน
    • ได้รับข้อคิดเห็นจากประสบการณ์ใช้งานตั้งแต่จัดซื้อเป็นเวลาเกือบ 1 ปีแล้ว
    • ได้เห็นวิธีการ cloning VM ทำภายใน server สะดวกมาก เพราะ zero client ไม่มี hard disk เป็นแค่จอภาพ+อุปกรณ์เชื่อมต่อกับ server

    สิ่งที่ต้องเตรียมพร้อมในการนำระบบ VDI ไปใช้งาน

    • ผู้ดูแลต้องมีความรู้เกี่ยวกับระบบ Virtualization Technology
    • ผู้ดูแลต้องมีความรู้เกี่ยวกับ DHCP Sever, DNS Server
    • ผู้ดูแลต้องมีความรู้เกี่ยวกับ Microsoft AD
    • ผู้ดูแลต้องมีความรู้พื้นฐานการจัดการ PC , Windows
    • ผู้ดูแลควรมีการติดตั้งและทดสอบโปรแกรมที่จะนำมาใช้กับระบบ VDI
    • ผู้ดูแลต้องมีความรู้เกี่ยวกับระบบ Server และ Network
    • ระบบไฟฟ้าและเครื่องปรับอากาศภายในห้อง Data Center ที่มีประสิทธิภาพ

    ปัญหาที่เจอในการใช้งานระบบ VDI

    • vcenter ล่ม (ระบบไฟฟ้าภายในห้อง Data Center มีปัญหา,ไฟล์สำคัญโดนลบ)
    • การ Clone เครื่อง (ใช้งานได้ไม่ครบทุกเครื่อง)
    • ค่า Error ไม่สื่อความหมาย (Clone แล้วเครื่องไม่พร้อมใช้งาน)
    • ข้อมูลทั้งระบบมีขนาดที่โตขึ้น (การเก็บข้อมูลในเครื่องผู้ใช้งาน Drive C,D)
    • ทรัพยากรไม่เพียงพอเมื่อมีการสร้างเครื่องใช้งานเยอะเกินไป ต้องประเมิน Disk Storage ให้เพียงพอ
    • ปัญหาเกี่ยวกับ user account ที่จะใช้ VM ในตอนแรกจะให้ใช้ Microsoft AD ของมหาวิทยาลัย แต่เนื่องจาก AD ของมหาวิทยาลัยไม่ได้ออกแบบมาให้คอนฟิกได้ง่าย จึงเปลี่ยนเป็นสร้าง Local AD ผูกกับ zero client เป็นเครื่อง ๆ ไป เปิดเครื่อง กด Enter ก็เข้าถึงหน้าต่าง Windows ราว ๆ 30-40 วินาที

    ข้อดีของการนำระบบ VDI มาใช้งาน

    • การบริหารจัดการเครื่องมีประสิทธิภาพขึ้น เมื่อเทียบระหว่าง Zero Client กับ PC
    • ประหยัดพลังงาน เมื่อเทียบระหว่าง Zero Client กับ PC
    • ลดอุณหภูมิภายในห้อง LAB Computer เมื่อเทียบระหว่าง Zero Client กับ PC
    • มีความยืดหยุ่นในการใช้งานทรัพยากร เมื่อเทียบระหว่าง Zero Client กับ PC
    • ประหยัดพื้นที่บนโต๊ะภายในห้อง LAB Computer เมื่อเทียบระหว่าง Zero Client กับ PC
    • การ Backup ข้อมูลทั้งระบบทำได้ง่าย เมื่อเทียบระหว่าง Zero Client กับ PC

    ถาม-ตอบ ที่พอจะประมวลได้จากการพูดคุย

    ถาม: วิทยาเขตตรัง มีนโยบายการให้บริการห้องคอมพิวเตอร์สำหรับการเรียนการสอน กี่แบบ
    ตอบ: มีแบบเดียว คือ มีเครื่องให้ใช้ร่วมกัน เก็บบันทึกไฟล์ไว้เอง เนื่องจากระบบ VDI ที่จัดซื้อทรัพยากรไม่เพียงพอที่จะสร้าง VM แยกให้นักศึกษาหรือให้แต่ละวิชา

    ถาม: ระบบนี้มีค่าใช้จ่ายเท่าไร แยกเป็นค่าอะไรบ้าง ขอทราบ specification ที่ใช้งานอยู่
    ตอบ: ไม่สามารถระบุเฉพาะระบบ VDI ได้ เพราะเป็นการเช่ารวมกับ PC และ Notebook อีกจำนวนหนึ่ง (ประมาณหยาบ ๆ ได้เครื่องละ 20,000 บาท/3ปี หรือ คิดเป็นค่าใช้เครื่อง 18 บาท/วัน) ส่วนการกำหนด VDI specification ได้คำนวณจากปริมาณ (PC, RAM และ Disk) ที่ต้องการใช้งาน บวกส่วนเผื่อไว้อีก 25%

    ถาม: ระบบนี้น่าจะเหมาะกับคณะที่ให้บริการห้องคอมพิวเตอร์สำหรับการเรียนการสอนการติดตั้งโปรแกรมหรือไม่
    ตอบ: ทำได้เพราะเปิดสิทธิ Administrator เหมือนกับ PC

    ถาม: ระบบนี้น่าจะเหมาะกับหน่วยงานที่ให้บริการฝึกอบรมหรือไม่
    ตอบ: ขึ้นอยู่กับความพร้อมของ data center ให้บริการได้ต่อเนื่องหรือไม่ และโปรแกรมที่อบรมได้ทดสอบติดตั้งใช้งานแบบ VDI ได้

    ถาม: ระบบนี้ดีกว่าระบบเก่าอย่างไร
    ตอบ: มีความยืดหยุ่นในการเพิ่มทรัพยากรให้ zero client ที่ต้องการใช้มาก ๆ ปรับเปลี่ยนได้สะดวก การ cloning สามารถ remote เข้าทำได้ที่ server ไม่ต้องทำที่ห้องคอม

    ถาม: ตั้งแต่เริ่มใช้ระบบนี้มีการประเมินการใช้งานแล้ว คุ้มหรือไม่คุ้ม ดีหรือไม่ดี อย่างไร
    ตอบ: ยังไม่ได้ประเมิน

    ขอขอบคุณข้อมูลที่ได้รับจาก presentation ของคุณพงษ์พันธ์ ประพันธ์ หัวหน้าฝ่ายสารสนเทศและทรัพยากรการเรียนรู้ มหาวิทยาลัยสงขลานครินทร์ วิทยาเขตตรัง