Category: Developer

งานพัฒนาระบบ, เขียนโปรแกรม

  • การบริหารโครงการโดยใช้เครื่องมือ Team Foundation Server (Phase 4 : การวางแผนงาน)

    จาก บทความ “การบริหารโครงการโดยใช้เครื่องมือ Team Foundation Server (Phase 3 : ขั้นตอนการคัดเลือกความต้องการ และความหมายของ State)” ทำให้เราทราบแล้วว่าในรอบการพัฒนา (Sprint) เราจะต้องดำเนินการตามความต้องการ หรือ Backlog item ใดบ้างแล้วนั้น ต่อไปเราจะมาดูเรื่องการกำหนดทรัพยากรบุคคล และมอบหมายงานต่อไป


    ขั้นตอนการกำหนดทรัพยากรบุคคล ที่จะมาทำโครงการ

    เป็นขั้นตอนของการสร้าง Team และการเลือกคนเข้ามาอยู่ในทีมนั้นเอง ซึ่งแต่ละโครงการทีมงานอาจจะเป็นคนละคนกันได้ ในการสร้าง Team และกำหนดบุคลากร สามารถดำเนินการได้ตามขั้นตอนดังนี้

    จาก TFS เลือก หมายเลข 1 ตามรูปที่ 1

    รูปที่ 1

    ทำการสร้าง Team โดยทำตามขั้นตอนตามรูปที่ 2

    รูปที่ 2

    จะปรากฎหน้าจอ เพื่อให้ใส่ข้อมูลรายละเอียดต่างๆ เกี่ยวกับข้อมูล Team ที่จะสร้าง ดังรูปที่ 3

    รูปที่ 3

    โดย

    หมายเลข 1 คือ ชื่อของ Team ที่ต้องการเพิ่ม

    หมายเลข 2 รายละเอียดเพิ่มเติม เกี่ยวกับ Team

    หมายเลข 3 ประเภทของการตั้ง Team เพื่อจุดประสงค์ ใด โดย TFS มีให้เลือก ดังรูปที่ 4

    รูปที่ 4

    เมื่อเราได้ Team แล้ว เราจะมา Add สมาชิก หรือทรัพยากรบุคคล ใน Team ที่สร้าง โดยทำตามขั้นตอน ในรูปที่ 5

    รูปที่ 5

    จะปรากฎหน้าจอ ดังรูปที่ 6 จากนั้น จะทำการ Add Members หรือสมาชิกในทีม โดยทำตามขั้นตอน ข้อ 1 ในรูปที่ 6

    รูปที่ 6

    จะปรากฎหน้าจอ เพื่อให้การพิมพ์ชื่อ เพื่อจะ Add Member ดังรูปที่ 7 โดยสามารถ ได้ ทีละหลายๆ คน และทำการ Save changes เพียงครั้งเดียว

    รูปที่ 7

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


    ขั้นตอนการกำหนดงานย่อย (Tasks) และมอบหมายงาน

    จากบทความก่อนหน้า นั้น เราได้มีการสร้างรอบการพัฒนา ที่เรียกว่า Sprint ไว้แล้ว และได้ตกลงกับผู้ใช้เพื่อเลือกความต้องการ หรือ Backlog items ที่จะทำให้แล้วเสร็จในรอบการพัฒนาที่สร้างไว้ ซึ่งจะทำให้เห็นว่ามีความต้องการอะไรบ้างที่จะต้องทำให้เสร็จ จากนี้ Project Manager จะต้องทำการแตกงาน หรือ Task ลงไปว่าในแต่ละ Backlog item แต่ละตัวนั้น จะมีงานย่อย หรือ Task อะไร บ้าง ซึ่ง Project Manager จะต้องวางแผนไว้ และสามารถมาบันทึกใน TFS ได้ ดังขั้นตอนต่อไปนี้

     

    จาก TFS เลือกโครงการที่ต้องการสร้าง Task ย่อย ตามหมายเลข 1 รูปที่ 8

    รูปที่ 8

    คลิกเลือก ตามรูปที่ 9 เพื่อไปสู่การบันทึก Task

    รูปที่ 9

    เมื่อทำตามขั้นตอนข้างต้น ทำการเลือก Sprint และ Backlog ในขั้นตอนที่ 1 และ 2 ของรูปที่ 10 จะได้หน้าจอเหมือนรูปที่ 10

    รูปที่ 10

    จากรูปที่ 10 จะแสดงรายละเอียดของ Backlog Items ทั้งหมด ในรอบ  Sprint 5 ที่ได้ตกลงกับผู้ใช้ แล้วว่าจะดำเนินการเรื่องใดบ้างนั่นเอง

     

    จากนั้น ให้ทำตามขั้นตอนในรูปที่ 11

    รูปที่ 11

    จากรูปที่ 11 ทำการกดเลือกหมายเลข 1 ก็จะปรากฎข้อมูลดังหน้าจอ ในรูปที่ 11 ขึ้นมา

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

     

    ในกรณีที่ต้องการสร้าง Task หรืองานย่อย ผู้เขียนขอยกตัวอย่าง ใน Backlog item ที่ เป็น “รายงาน งบกระแสเงินสด” นะค่ะ หากต้องการสร้าง Task ย่อย ให้กดที่เครื่องหมายบวก (+) ดังขั้นตอนที่ 3 ในรูปที่ 11 ค่ะ ซึ่งจะได้หน้าจอ ดังรูปที่ 12

     

    ก่อนอื่นเลย Project Manager จะต้อง List มาก่อนว่าจะมี Task ย่อย ๆ อะไรบ้าง ก่อนจะมาบันทึกใน TFS ซึ่งในกรณีนี้ สำหรับงานพัฒนาระบบ ก็จะหนีไม่พ้น ตามกระบวนการ SDLC นั่นเอง ซึ่งหลักๆ จะประกอบไปด้วย

    • Desgin and Analysis
    • Develop
    • Review Develop
    • ส่งมอบเพื่อทดสอบ
    • System Test
    • Review System Test
    • Delpyment    เป็นต้น

    รูปที่ 12

    สำหรับรูปที่ 12 เป็นตัวอย่างของการสร้าง Task โดยมีรายละเอียดดังนี้

    หมายเลข 1 : ชื่อ Task ย่อย

    หมายเลข 2 : รอบการพัฒนาที่จะให้ดำเนินการ ซึ่งจะ Default ตาม Backlog item นั้นๆ

    หมายเลข 3 : ทำการ Assign ให้ใครดำเนินการ

    หมายเลข 4 : ระยะเวลาที่มอบหมายงานให้ ซึ่งชื่อจะปรากฎตามที่ ได้ Add ไปในขั้นตอนการกำหนดทรัพยากรบุคคล

    หมายเลข 5 : เป็นขั้นตอนใด ซึ่งประกอบด้วย

    Design

    Development

    Documentation

    Requirements

    Testing

    Deployment

    หมายเลข 6 : เป็นการอธิบายรายละเอียดของ Task ว่าจะดำเนินการ หรือมีเงื่อนไขอย่างไรบ้าง

    และกดหมายเลข 7 เพื่อทำการบันทึกข้อมูล

     

    หลังจากที่ทำการบันทึกข้อมูล Task ทั้งหมดเข้าสู่ TFS เรียบร้อยแล้ว Project Manager สามารถตรวจสอบ หรือดูภาพรวม ได้ทำตามขั้นตอน ในรูปที่ 13 คือ

    ขั้นตอน 1 จาก TFS เลือก Backlog

    ขั้นตอน 2 สำหรับส่วนที่ 2 จะแสดงรายละเอียด Task ย่อยต่างๆ ในแต่ะ Backlog item ทำให้ใเห็นว่ามี Activity ใดบ้าง Assign ให้ใคร และต้องใช้เวลาเท่าไหร่

    ขั้นตอน 3 สำหรับส่วนที่ 3 แสดงให้ว่า

    Work : จำนวนชั่วโมงที่ใช้ในเวลาทำงาน

    Work By Activity : จำนวนชั่วโมงของแต่ละ Activity

    Work By Assign To : จำนวนชั่วโมงที่ได้มอบหมายให้แต่ละบุคคล

    รูปที่ 13

    ถึงตอนนี้ ก็จะทำให้เห็นปริมาณของงาน และระยะเวลาที่ต้องใช้ทั้งในภาพรวมของรอบการพัฒนานั้นๆ ภาพรวมของแต่ละ Activity และยังสามารถเห็นในภาพรวมของการมอบหมาย หรือ Assign ให้แต่ละคนภายในทีมงานด้วย


    ในครั้งต่อไป จะมาอธิบายขั้นตอนในการ บันทึกผลการปฏิบัติงาน และการติดตามงานโดยใช้เครื่องมือ TFS กันต่อนะค่ะ อย่าลืมติดตามกันนะค่ะ ขอบคุณค่า ^____^

     

  • เขียน CSS Selectors อย่างไรให้มีประสิทธิภาพ ?

    ในการเขียน css selectors นั้น เรารู้ดีว่ามี selectors แบบไหนให้เราเลือกใช้ได้บ้าง และแต่ละแบบนั้นมีวิธีการใช้งานอย่างไร แต่หลายๆ คน อาจไม่รู้ว่าการเขียน selectors ในแต่ละแบบนั้น มันมีผลต่อ performance ด้วย

     Web Browsers แบ่ง CSS Rules ออกเป็นกลุ่มๆ

    เรามาทำความเข้าใจถึงหลักการทำงานของ web browsers กันก่อน ไม่ว่าเราจะเขียน css rules อย่างไร web browsers จะแบ่ง rules ของเราออกเป็น 4 กลุ่ม ด้วยกัน ดังนี้

    • IDใช้เวลาในการหาน้อยที่สุด
    • Classใช้เวลาในการหามากกว่า ID เล็กน้อย
    • Tagใช้เวลาในการหามากกว่า Class
    • Universalใช้เวลาในการหามาก

    ซึ่งการจะดูว่า rule นี้ถูกจัดให้อยู่ในกลุ่มไหนนั้นจะดูจาก “key selector” หรือ selector ที่อยู่ขวาสุดนั่นเอง

     กลุ่ม ID

    rule ที่ถูกจัดให้อยู่ในกลุ่มนี้จะต้องมี id selector เป็น key selector

    #latest-news { }
    ul#latest-news { }
    #latest-news[title=”Latest News”] { }
    section > div > ul#latest-news:first-child { }

    จากโค้ดด้านบน จะได้ว่า rules ทั้ง 4 แบบ ถูกจัดให้อยู่ในกลุ่ม id ทั้งหมด

     กลุ่ม Class

    rule ที่ถูกจัดให้อยู่ในกลุ่มนี้จะต้องมี class selector เป็น key selector

    .list-item { }
    #latest-news .list-item { }
    div ul li.list-item { }
    ul > .list-item:hover { }

    จากโค้ดด้านบน จะได้ว่า rules ทั้ง 4 แบบ ถูกจัดให้อยู่ในกลุ่ม class ทั้งหมด

     กลุ่ม Tag

    ถ้า key selector ของ rule นั้นไม่ใช่ทั้ง id selector และ class selector ให้ดูว่ามีการระบุ tag เอาไว้หรือไม่ ถ้ามี จะถูกจัดให้อยู่ในกลุ่ม tag

    a { }
    li > a { }
    #latest-news div[class*=”post”] { }
    ul#latest-news li.list-item a:hover { }

    จากโค้ดด้านบน จะได้ว่า rules ทั้ง 4 แบบ ถูกจัดให้อยู่ในกลุ่ม tag ทั้งหมด

     กลุ่ม Universal

    หาก rule นั้นไม่ตรงกับ 3 กลุ่มข้างต้นเลย จะถูกจัดให้อยู่ในกลุ่ม universal

    * { }
    [id*=”post”] { }
    .home [class*=”entry”] { }
    form > [type=”text”] { }

    จากโค้ดด้านบน จะได้ว่า rules ทั้ง 4 แบบ ถูกจัดให้อยู่ในกลุ่ม universal ทั้งหมด

     วิธีการอ่าน CSS Rules ของ Web Browsers

    ในการดูว่า CSS Rule นี้ จะถูก apply ให้กับ html elements ใดบ้าง web browsers จะต้องทำการ “match” โดยมันจะอ่าน selectors จากขวาไปซ้าย คือจะเริ่มจาก key selector ซึ่งอยู่ทางด้านขวาสุดก่อน web browsers จะดูว่ามี elements ใดที่ match กับ selector ตัวนี้บ้าง ถ้าไม่มีเลย ก็จะหยุดไป แต่ถ้ามี มันก็จะทำการเช็คต่อโดยการเลื่อนไปยัง selector ทางซ้ายมือทีละอันๆ แล้วดูว่า elements ที่ match มาก่อนหน้านี้นั้น ยังคง match กับ selector ตัวใหม่นี้อีกหรือไม่ ถ้ายังมีอีกก็จะเลื่อนไปยัง selector ตัวต่อไปทางซ้ายอีก มันจะทำเช่นนี้ต่อไปเรื่อยๆ จนกว่าจะครบทุกๆ selectors ใน rule นั้นๆ หรือจนกว่าจะไม่เจอ elements ใดๆ ที่ตรงกับ rule นั้นๆ เลย

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

    การเขียน css rules ก็เหมือนกับการกำหนดวิธีการจำแนกเด็กนักเรียนให้กับครู การใส่ id ให้กับ element เปรียบเหมือนการเขียนป้ายชื่อของเด็กนักเรียนคนนั้นแล้วเอามาห้อยคอ ทีนี้เวลาครูจะหา ด.ช. เอ สิ่งที่ครูต้องทำก็แค่มองหาเด็กที่มีป้ายชื่อห้อยคอก่อนว่ามีใครบ้าง พอเจอแล้วก็ดูต่อว่าป้ายนั้นเขียนไว้ว่า ด.ช. เอ ใช่หรือไม่ การหา element จาก id ของ web browsers นั้นจะใช้เวลาน้อยมาก เนื่องจาก id มีได้แค่ที่เดียวเท่านั้น

    การกำหนด class ให้กับ elements ต่างๆ จะเหมือนกับการแบ่งเด็กนักเรียนออกเป็นกลุ่มๆ หากเรากำหนด class ให้กับ elements แล้วล่ะก็ web browsers จะสามารถหาตัว elements เจอได้ง่ายเหมือนกับการที่ครูมองหาเฉพาะเด็กที่แต่งชุดลูกเสือที่มีอยู่ในห้องเรียน แค่มองปราดเดียวก็ดูออกแล้ว

    ส่วนการเขียน css rule โดยใช้ tag เป็น key selector นั้นจะเหมือนกับการมองสิ่งที่เด็กนักเรียน “เป็น” วิธีนี้ web browsers จะมองหาตัว elements เหมือนกับการที่ครูมองหาเฉพาะเด็กนักเรียนที่เป็นผู้ชาย มันอาจใช้เวลาเพิ่มขึ้นนิดหน่อย แต่ก็ไม่นานมากนัก

    และสุดท้ายคือการเขียน css rule ที่อยู่ในกลุ่ม universal วิธีนี้ก็เหมือนกับการที่ครูต้องการจะหาเด็กมาเข้าร่วมการประกวดร้องเพลงในโรงเรียน เขาไม่สามารถดูภายนอกแล้วรู้ได้ทันทีว่าใครร้องเพลงเพราะบ้าง เขาจำเป็นต้องไล่ดูไปทีละคนๆ เราจะเห็นว่าวิธีนี้นั้นมี candidates เยอะมาก

    ขั้นตอนการหา elements ของ web browsers นี้เองที่จะมีเรื่องของ performance เข้ามาเกี่ยวข้อง ยิ่ง rule นั้นซับซ้อนมากเท่าไร ยิ่งใช้เวลาในการ match มากขึ้นเท่านั้น จากการทดลองของ Steve Souders เขาได้เรียงลำดับประสิทธิภาพของ selectors ในแบบต่างๆ เอาไว้ดังนี้

    1. ID – #header
    2. Class – .post
    3. Tag – div
    4. Sibling – h1 + ph1 ~ p
    5. Child – ul > li
    6. Descendant – ul li
    7. Universal – *
    8. Attribute – [type="text"]
    9. Pseudo-classes, Pseudo-elements – a:hoverp::first-letter

    จากการจัดอันดับประสิทธิภาพของ selectors ด้านบน เราจะเห็นว่า selectors ในแต่ละแบบนั้น มีประสิทธิภาพที่ต่างกัน โดย id นั้นจะใช้เวลาในการ match น้อยที่สุด ส่วน pseudo-classes และ pseudo-elements จะใช้เวลาในการ match มากที่สุด และอย่าลืมว่า web browsers นั้นอ่าน selectors จากขวาไปซ้ายทีละตัวๆ ยิ่งเขียน selectors ยาวมากเท่าไร ประสิทธิภาพก็ยิ่งลดลงมากเท่านั้น

     เขียน Selectors อย่างไรให้มีประสิทธิภาพ ?

    หลังจากที่เราเข้าใจวิธีการอ่าน css rules ของ web browsers เราจึงได้รู้ว่าการเลือกใช้ selectors นั้นมีความสำคัญ ในการเขียน selectors ให้เรายึดหลักต่อไปนี้

      อย่าเขียน Selectors เกินความจำเป็น

    อย่างที่ทุกคนทราบกันดีว่า id นั้นมีได้เพียงที่เดียวในหนึ่งหน้า ฉะนั้นหากเราจะใช้ id selector แล้ว เราไม่ควรใส่อะไรเพิ่มเข้าไปอีก

    BAD

    div#latest-news { }
    .box#latest-news { }
    .sidebar #latest-news { }

    นี่เป็นตัวอย่างการใช้ id selector ที่แย่ ในตัวอย่างแรก web browsers ทั้งหลายจะมองหา elements ที่มี id ชื่อว่า “latest-news” ก่อน เมื่อเจอแล้วก็จะดูต่อว่า element นั้นเป็น div หรือไม่ ซึ่งจริงๆ แล้ว มันไม่จำเป็นต้องเช็คอีก เพราะ id นั้นมีได้เพียงที่เดียวเท่านั้น เช่นเดียวกับตัวอย่างที่ 2 ที่จะต้องเช็คต่อว่า element นั้นมี class “box” อยู่ด้วยหรือไม่ และในตัวอย่างที่ 3 ที่แย่สุดเลยก็ว่าได้ เนื่องจากมันต้องไปไล่เช็ค ancestors ทุกตัวของ element นี้ ว่ามีตัวที่มี class “sidebar” บ้างหรือไม่

    GOOD

    #latest-news{ }

    ในทำนองเดียวกัน เราก็ไม่จำเป็นต้องใส่อะไรหน้า class อีก เพราะมันจะทำให้เสียเวลาในการ match เพิ่มโดยไม่จำเป็น

    BAD

    p.red { }

    GOOD

    .red { }

    อย่างไรก็ตาม การใส่อะไรข้างหน้า class บางทีก็มีประโยชน์เหมือนกันในเรื่องของ semantic การใช้ p.red มีข้อดีตรงมันช่วยให้เรารู้ว่า css rule นี้มีไว้เพื่อทำให้ตัวอักษรใน paragraph เป็นสีแดง หรือบางทีเราอาจจะต้องการกำหนดสไตล์สำหรับ class “red” เฉพาะที่ p element เพียงอย่างเดียวเท่านั้น

     ลดการใช้ Descendant Selector

    การใช้ descendant selector นั้นทำให้ประสิทธิภาพลดลงอย่างมาก เราจึงควรหลีกเลี่ยง

    BAD

    ul#latest-news li a {  }      /* แย่มาก */
    ul#latest-news > li > a {  }  /* ดีขึ้น แต่ก็ยังแย่อยู่ดี */

    จากตัวอย่างนี้ web browsers จะมองหา key selector ซึ่งก็คือ a ก่อน แล้วค่อยเลื่อนต่อไปทางซ้ายมือ โดยดูว่า a นั้นเป็น descendant ของ li หรือไม่ ถ้าเป็นให้ดูต่อว่า li นั้นเป็น descendant ของ #latest-news หรือไม่ และถ้ายังเป็นอีกให้ดูว่า #latest-news นั้นเป็น ul หรือไม่ การเขียน selector แบบนี้ส่งผลเสียต่อ performance เป็นอย่างมาก

    GOOD

    .latest-news-link {  }

    วิธีแก้ง่ายๆ คือการเพิ่ม class “latest-news-link” ให้กับ a ทีนี้ web browsers ก็จะสามารถหา elements นั้นๆ เจอได้อย่างรวดเร็ว แต่การเขียนแบบนี้ก็มีข้อเสียตรงที่มันจะทำให้การ maintenance ลำบากขึ้น เพราะเราอาจดูไม่ออกว่า .latest-news-link นี้เป็น link ที่อยู่ใน ul#latest-news

     ลดการใช้ CSS Rules ที่อยู่ในกลุ่ม Universal

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

    BAD

    [type=”text”] { }           /* แย่มาก */
    [class~=”input-text”] { }   /* แย่มากๆ เพราะไม่จำเป็น */

    GOOD

    input[type=”text”] { }      /* ดีขึ้นมาก */
    .input-text { }             /* ดีที่สุด */

    จะเห็นว่า css rules 2 แบบแรกนั้น ถูกจัดให้อยู่ในกลุ่ม universal เพราะใน key selector ไม่มี id, class หรือ tag เลย ทำให้ web browsers จะต้องไปไล่เช็คกับ elements ทุกตัวในหน้านั้นๆ การเขียน css rules 2 แบบหลัง เป็นวิธีที่ดีกว่า

     มันจะช้าลงสักแค่ไหนกันเชียว ?

    เชื่อเหลือเกินว่าหลายๆ คนคงอยากจะรู้ว่าการเลือกใช้ selectors โดยไม่คำนึงถึง performance เลยนั้น มันจะทำให้เว็บช้าลงขนาดไหน คำตอบคือมันไม่ใช่แค่ช้าลงเพียงไม่กี่วินาที แต่มันช้าลงเพียงแค่ไม่กี่มิลลิวินาที อ่าว ? แล้วจะเอาเรื่องนี้มาเขียนบทความทำไม !!!

    เรื่อง performance ของ css selectors นี้อาจจะเห็นผลไม่ค่อยชัดนัก เนื่องจากความเร็วของการประมวลผลในสมัยนี้นั้นเรียกได้ว่าเร็วเอามากๆ สมมติว่าเราเลือกใช้ selectors โดยเน้นไปที่ performance เป็นหลัก เมื่อลอง render ดู เราพบว่ามันใช้เวลาเพียงแค่ 400ms แต่พอเราเลือกใช้ selectors แบบตามใจตัวเอง เมื่อลอง render ดูใหม่เราอาจจะพบว่ามันใช้เวลาเพิ่มเป็น 600ms จะเห็นว่าส่วนต่างขนาด 150% นั้น ฟังดูเยอะก็จริง แต่ผู้ใช้งานนั้น อาจจะสัมผัสความต่างเพียงแค่ 200ms นี้ไม่ได้

    อย่างไรก็ตาม การเลือกใช้ selectors โดยคำนึงถึง performance นี้ จะเห็นผลได้ชัดมากขึ้นหากในหน้านั้นๆ มี html elements และ css rules อยู่เป็นจำนวนมาก นอกจากนี้ หากเว็บของเราเป็นเว็บที่เน้นในเรื่องของ performance เป็นหลักแล้วล่ะก็ การคำนึงถึง performance ของ selectors คงจะเป็นเรื่องที่มองข้ามไม่ได้

    การเลือกใช้ selectors โดยคำนึงถึง performance ก็เหมือนกับจรรยาบรรณของ developers แม้สิ่งที่เราทำนั้นผู้ใช้งานส่วนใหญ่อาจจะสัมผัสไม่ได้ก็จริง แต่อย่างน้อยก็มีหนึ่งคนที่รู้คือตัวเรานั่นเอง การปล่อยงานที่ไร้คุณภาพออกไปนั้นถือเป็นการดูถูกตัวเอง นี่เป็นสิ่งที่ไม่ควรทำ

     ความพอดี

    การคำนึงถึง performance นั้นไม่ได้แปลว่าห้ามใช้ selectors นอกเหนือจาก id, class และ tag แต่อย่างใด แต่มันหมายถึงการเขียน selectors แบบคุ้มค่า ไม่ฟุ่มเฟือย selectors แบบอื่นๆ นั้นใช้ได้ แต่ควรใช้เมื่อจำเป็นจริงๆ เท่านั้น

    บางคนอาจจะสงสัยว่า หากเราต้องการเขียน css rules ให้ render หน้าเว็บได้เร็วสุดๆ เราก็ต้องกำหนด class ให้กับ html elements ทั้งหมดในหน้านั้นเลยงั้นหรือ ? คำตอบคือ “ไม่ใช่”

    จริงอยู่ที่การทำอย่างนั้น ดูเหมือนจะทำให้ web browsers หา elements ที่ต้องการได้เร็วขึ้น แต่การใส่ class มาก “เกินไป” นั้นก็มีข้อเสียอยู่เหมือนกัน

    หากใส่ class ให้ทุกๆ elements เลย ขนาดของโค้ด html จะต้องใหญ่ขึ้นอย่างแน่นอน ซึ่งส่งผลให้ปริมาณไฟล์ที่เราต้องดาวน์โหลดมานั้นมากขึ้นตามไปด้วย การดาวน์โหลดไฟล์ส่วนต่างที่เพิ่มขึ้นมานี้ อาจใช้เวลามากกว่าเวลาที่ลดลงไปจากผลของ performance ที่ดีขึ้นเสียอีก

    นอกจากนี้ การใส่ class ให้กับทุกๆ elements อาจไม่ได้ทำให้หน้าเว็บ render ได้เร็วอย่างที่เราคิด สมมติในห้องเรียนห้องหนึ่ง มีเด็กนักเรียนนั่งอยู่เต็มไปหมด ผู้ปกครองต้องการพบลูกของเขา จึงบอกลักษณะกับครูไปว่าเด็กคนนั้นใช้กระเป๋าหนังยี่ห้อ Jacob สิ่งที่ครูต้องทำคือมองหาเด็กที่ 1. มีกระเป๋าหนัง 2. กระเป๋าหนังนั้นมียี่ห้อ Jacob หากในห้องนั้นมีเด็กเพียงไม่กี่คนที่มีกระเป๋าหนัง ครูก็จะสามารถหาเด็กที่มีกระเป๋าหนังยี่ห้อ Jacob ได้อย่างง่ายดาย ในทางกลับกัน หากเด็กในห้องนั้นมีกระเป๋าหนังกันทุกคน เท่ากับว่าครูต้องไล่ดูยี่ห้อของกระเป๋าหนังไปทีละคนๆ จนครบทั้งห้อง บางคนอาจสงสัยว่าทำไมครูไม่ตะโกนถามเด็กๆ ล่ะว่า ใครมีกระเป๋าหนังยี่ห้อ Jacob บ้าง จะได้ไม่ต้องมาเสียเวลาหา คำตอบคือ html นั้นพูดไม่ได้

     บทสรุปการเลือกใช้ CSS Selectors

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

     

    แหล่งอ้างอิง

    http://www.siamhtml.com/css-selectors-performance/

  • สร้าง Barcode แบบง่ายๆ ด้วย Word

    ถ้าพูดถึงการสร้าง Barcode ในปัจจุบันก็จะมีมากมายหลายวิธี แล้วแต่เราจะเลือกใช้ แต่สำหรับ Blog นี้ผู้เขียนจะขอแนะนำการสร้าง Barcode แบบง่ายๆ ใช้เวลาไม่นาน โดยที่เราไม่ต้องเพิ่มโปรแกรมเสริม หรือใช้โปรแกรมอื่นๆ เข้ามาช่วยเลย ขอแค่มี Microsoft Word version 2013 หรือ 2016 ในเครื่อง … เท่านี้ก็เพียงพอแล้ว 🙂

     

    มาทำความรู้จัก ระบบบาร์โค้ด (Barcode System) กันหน่อย 

    ระบบบาร์โค้ด หมายถึงการใช้สัญลักษณ์บาร์โค้ดบ่งชี้ไปยังข้อมูลตัวเลขหรือตัวอักษร และประยุกต์ต่อยอด โดยการนำตัวเลขหรือตัวอักษรเหล่านั้นบ่งชี้ไปยังสิ่งต่างๆ เช่น สินค้า (Product), วันหมดอายุ (Expiration date), บุคคล (Person), URL Website เป็นต้น ซึ่งจะมี 2 ประเภทหลักคือ 1 Dimension และแบบ 2 Dimension

     

    *สำหรับคำสั่งในการสร้างบาร์โค้ด DISPLAYBARCODE ใน Blog นี้ที่เราจะพูดถึงนั้น จะรองรับบาร์โค้ดแบบต่างๆ ดังนี้ QR, CODE128, CODE39, JPPOST, EAN, JAN, UPC, ITF14, NW7, CASE

     

    ขั้นตอนที่ 1 : เปิดโปรแกรม Word ขึ้นมา

     

     

     

     

     

     

     

     

     

     

     

    ขั้นตอนที่ 2 : กดปุ่ม Ctrl + F9 จากนั้นเราก็จะเห็นวงเล็กปิดเปิดเพิ่มเข้ามาใน Word ของเรา

     

     

     

     

     

     

     

     

     

     

     

    ขั้นตอนที่ 3 : พิมพ์คำสั่งตาม DISPLAYBARCODE ลงไปในวงเล็บ ตัวอย่างคำสั่งเช่น

    DISPLAYBARCODE “https://sis.psu.ac.th” QR \q 3

     

     

     

     

     

     

     

     

    ขั้นตอนที่ 4 : จากนั้นคลิก Alt + F9 เพื่อดูผลลัพธ์ แท่น แท๊นนน เท่านี้ก็เสร็จเรียบร้อย

     

     

     

     

     

     

     

     

     

     

     

    *ขออธิบายความหมายของแต่ละส่วนในคำสั่งสักนิดนึง เพื่อให้ผู้ใช้ได้เข้าใจง่ายขึ้น สำหรับส่วนแรก

     

    DISPLAYBARCODE   — คือคำสั่งที่เราจะใช้

    “https://sis.psu.ac.th” — เป็นข้อมูลที่เราจะใส่ในบาร์โค้ด ให้ใส่ไว้ภายในเครื่องหมาย ” ”

    QR — เป็นคำสั่งที่ระบุว่าสร้างบาร์โค้ดแบบ QR หากต้องการแบบอื่นเช่น CODE128 ก็เปลี่ยนได้

    โดยให้อิงตามรหัสบาร์โค้ดที่รองรับ

    \q 3  — เป็นการกำหนด Error correction level สำหรับใน QR code เท่านั้น

    หมายเหตุ : ระดับการแก้ไขข้อผิดพลาดของข้อมูล (Error Correction Level) คือ ความสามารถในการกู้คืนข้อมูลที่เสียหาย สามารถกำหนดได้ 4 ระดับ ดังนี้ L=7%, M=15%, Q=25%, H=30% ซึ่งการกำหนดในระดับที่สูงขึ้นจะมีผลทำให้ขนาดของ QR Code เพิ่มขึ้น

     

    เป็นยังไงกันบ้างเอ่ย ง่ายๆ ไม่กี่ขั้นตอนเองใช่มั้ย สำหรับ Blog นี้ผู้เขียนก็จะนำเสนอแบบสั้นๆ ง่ายๆ แต่หากผู้ใช้ท่านไหนต้องการศึกษาแบบละเอียด อย่างลึกซึ้งในส่วนอื่นๆเพิ่มเติมก็สามารถศึกษาเพิ่มเติมหรือดู syntax ได้ที่ MSDN.MICORSOFT

    เจอกันใหม่รอบ TOR หน้าเน้อผู้อ่านทุกคน แฮ่ …

    ขอขอบคุณแหล่งข้อมูลอ้างอิง

    • https://msdn.microsoft.com/en-us/library/hh745901%28v=office.12%29.aspx?f=255&MSPPError=-2147217396
    • https://www.scandit.com/types-barcodes-choosing-right-barcode/
  • Automation Testing

    ในการพัฒนา application ในปัจจุบันที่มีความเปลี่ยนแปลงอย่างรวดเร็ว ปัญหาที่จะพบตามมาด้วยก็คือ bug ของตัวระบบอันเนื่องมาจากความเร่งรีบในการพัฒนา ซึ่งการที่จะลด bug ที่อาจจะเกิดขึ้นก็จำเป็นที่จะต้องมีการทดสอบ (testing) ในส่วนต่างๆทั้งหมดเพื่อหาความผิดพลาด หรือผลกระทบที่เกิดขึ้นจากการเปลี่ยนแปลง เพิ่มเติม code ใหม่ๆ เข้าสู่ระบบหรือ application

    การทำ testing ส่วนต่างๆซ้ำทั้งหมดเพื่อหาความผิดพลาดที่เกิดขึ้นจากการเปลี่ยนแปลง เพิ่มเติม code ใหม่ๆ ต้องใช้เวลาค่อนข้างมาก อาจจะทำให้ผู้พัฒนาเลือกที่จะทำการ testing เฉพาะส่วน และนั่นอาจนำมาซึ่ง bug ที่เกิดจากส่วนอื่นๆที่ไม่ได้ทดสอบ การทำการทดสอบแบบอัตโนมัติทำให้สามารถลดเวลาใน testing ลงแต่ยังคงไว้ซึ่งการทดสอบ ส่วนต่างๆทั้งหมด

    สิ่งจำเป็นที่ควรจะรู้ในการทำ automation test คือการเขียนชุดทดสอบโดยเฉพาะ unit test ที่ดี

    • แต่ละ test case ต้องทำงานได้รวดเร็ว
    • แต่ละ test case มีความเป็นอิสระแก่กัน นั่นคือแต่ละ test case จะไม่เกี่ยวข้องกัน ทำให้สามารถทดสอบแบบสุ่มและแบบขนานได้ แต่สิ่งที่พบเจอเป็นประจำคือ ผลจาก test case ที่ 1 เป็น input ของ test case ที่ 2 แล้วผลจาก test case ที่ 2 เป็น input ของ test case ที่ 3 และ …. ซึ่งถ้าเป็นแบบนี้หมายความว่าแต่ละ test case ผูกมัดกันไปหมด และต้องทำงานแบบเรียงลำดับกันด้วย
    • อีกสิ่งหนึ่งที่สำคัญคือ แต่ละ test case จะต้องไม่มีการทำงานร่วมกับระบบ Network และ Database ใด ๆ ทั้งสิ้น และใช้ Mock หรือ Fake ทำการควบคุมสิ่งที่ควบคุมไม่ได้ ทำให้สามารถเขียน test case ได้ดีขึ้น เนื่องจากการทำงานกับ Network และ Database อาจเกิดเหตุการณ์ที่ไม่สามารถควบคุมได้ทำให้ ผลของการทดสอบผิดพลาด ซึ่งแต่ละ test case ต้องสามารถทำงานซ้ำ ๆ และควรได้ผลเหมือนเดิมทุกครั้ง ไม่ใช่ทำงานผ่านบ้างไม่ผ่านบ้าง ไม่มีความน่าเชื่อถือ สุดท้ายก็จะเลิกใช้ เลิกทำและกลับไปทำแบบเดิมก่อนหน้านี้
    • โครงสร้างของชุดการทดสอบต้องดีด้วย เริ่มตั้งแต่ชื่อของ test case ต้องสื่อถึงสิ่งที่ต้องการจะทดสอบ ทั้ง input และ expected result ชื่อยาวไม่มีปัญหากับเรื่องของ performance ว่าจะช้าเนื่องจากมันอยู่ในส่วนของการทดสอบไม่ใช่ระบบงานจริง โครงสร้างหลัก ๆ ของแต่ละ test case ควรประกอบไปด้วย การกำหนดหรือจัดการค่าเริ่มต้นที่ต้องการ, การกระทำที่ต้องการทดสอบ และ ตรวจสอบผลการทำงานว่าเป็นไปตามที่คาดหวังหรือไม่ อย่าลืมว่าชุดการทดสอบ มันคือเอกสารชนิดหนึ่งที่ใช้อธิบายการทำงานภายในของระบบ ทั้ง class และ function ต่าง ๆ เพื่อให้คนอื่น ๆ เข้ามาอ่านอีกด้วย
    • การคิดก่อนทำ นั่นคือก่อนที่จะเริ่มต้นทำ จะต้องเข้าใจปัญหาหรือมีเป้าหมายก่อน จากนั้นจึงแบ่งปัญหาใหญ่ออกเป็นปัญหาย่อยเพื่อให้แก้ไขปัญหาได้ง่ายขึ้น

    การทดสอบจะง่ายหรือไม่นั้นสิ่งที่สำคัญมาก ๆ คือโครงสร้างของ code ที่พัฒนานั้นได้คิดหรือออกแบบการทดสอบกันอย่างไรหรือไม่ ซึ่งถ้าไม่ได้คิดถึงการทดสอบตั้งแต่แรก การทดสอบจะทำได้ยากมาก

     

    แหล่งอ้างอิง : http://www.somkiat.cc/write-automation-test/

  • การบริหารโครงการโดยใช้เครื่องมือ Team Foundation Server (Phase 3 : ขั้นตอนการคัดเลือกความต้องการ และความหมายของ State)

    จากบทความ การบริหารโครงการโดยใช้เครื่องมือ Team Foundation Server (Phase 2 : การบันทึกความต้องการ)

    ผู้เขียนได้กล่าวถึงการบันทึกความต้องการโดยใช้เครื่องมือ TFS ไปแล้ว สำหรับบทความครั้งนี้ ผู้เขียนจะกล่าวถึงขั้นตอนหลังจากรับความต้องการเข้ามา และจะเข้าสู่ขั้นตอนการคัดเลือกความต้องการ และการกำหนด State ในเครื่องมือ TFS


    การคัดเลือก Backlog items (Backlog items)


    หลังจากขั้นตอนการรวบรวมความต้องการ หรือ Backlog items จากลูกค้ามาแล้วนั้น Backlog items ที่ได้ทุกข้อจะถูกบันทึกเข้าสู่ TFS ซึ่ง Backlog items ที่ได้มาทั้งหมด อาจจะไม่ถูกเลือกให้ดำเนินการ หรือไม่ต้องดำเนินการด้วยเหตุผลต่างๆ ขึ้นอยู่กับการตกลงกันระหว่างผู้จัดโครงการ กับลูกค้า

    สำหรับเครื่องมือ TFS นำมาช่วย Project Manager ในขั้นตอนการคัดเลือก Backlog Items โดยการ Update State ของแต่ละ Backlog Items เพื่อให้ทราบว่า  Backlog item อยู่ใน State ใด ตามความหมายดังนี้

    รูปที่ 1

    จากรูปที่ 1 นะค่ะ

    1. New : คือ Backlog items ที่เข้ามาใหม่ ยังไม่ผ่านการพิจารณา หรือยังไม่ผ่านขั้นตอนการคัดเลือก
    2. Approved คือ Backlog items ที่ผ่านการคัดเลือก แต่ยังไม่ดำเนินการในรอบปัจจุบัน ซึ่งอาจจะรอในรอบการพิจารณาถัดไปเพื่อให้ดำเนินการ
    3. Commited คือ Backlog items ที่ผ่านการคัดเลือก และตกลงให้แล้วเสร็จในรอบปัจจุบัน ซึ่งจะต้องประเมินเรื่องของความเหมาะสมของเวลาด้วย ว่าสามารถดำเนินการได้กี่ Backlog items
    4. Done คือ Backlog items ที่ผ่านการคัดเลือก และดำเนินการเสร็จเรียบร้อยแล้ว หรือ คือ Backlog items ที่ผ่านการคัดเลือกแต่ไม่ถูกให้ดำเนินการให้ทำ (ซึ่งจะมีการบันทึกไว้ใน หมายเหตุ หรือ History)

    ในบทบาทของ Project Manager คือ

    1. หลังจากได้ตกลงกับลูกค้าและร่วมกันคัดเลือกความต้องการแล้วแล้ว Project Manager จะทำการ Update State ของ Backlog item แต่ละข้อตามข้อตกลง
    2. สร้างรอบการพัฒนา หรือ Iteration
    3. ระบุ Backlog items ที่ทำการ Commited เข้าสู่รอบ Iteration ที่ต้องการ
    4. ทำการวางแผนย่อย (Tasks) ต่อไป

    วิธีการสร้างรอบการพัฒนา หรือ Iteration

    จาก Link ของ TFS

     

    รูปที่ 2

    เลือก Configuration หมายเลข 1 ในรูปที่ 2 เพื่อเข้าไปจัดการเกี่ยวกับโครงการ จะปรากฎหน้าจอดังรูปที่ 3 

    รูปที่ 3

    ในรูปที่ 3 จะแสดงโครงการ หรือ Project ทั้งหมดที่รับผิดชอบ ให้ทำตามขั้นตอน คือ

    • เลือกโครงการ ตามหมายเลข 1
    • จะปรากฎรายละเอียดด้านขวา เลือก Link ตามหมายเลข 2 เพื่อเข้าไปทำการจัดการเกี่ยวกับรายละเอียดของโครงการที่เลือก
    • จะปรากฎหน้าจอดังรูปที่ 4

     

    รูปที่ 4

    จากรูปที่ 4 ทำตามขั้นตอนเพื่อสร้างรอบการพัฒนา หรือ Iteration ดังนี้

    • กดเลือก หมายเลข 1 Iterations เพื่อจัดการเกี่ยวกับรอบการพัฒนา หรือ Iterations
    • กดเลือกหมายเลข 2 เพื่อเลือก Release ที่ต้องการ ซึ่งอาจจะมีหลาย Release ขึ้นอยู่กับข้อตกลงกับลูกค้า หรือขึ้นอยู่กับความต้องการที่ได้รับ
    • กดเลือกหมายเลข 3 เพื่อทำการสร้างรอบการพัฒนา ของ Release 1 โดยจะปรากฎหน้าจอขึ้นมา เพื่อให้กำหนดรายละเอียดของรอบการพัฒนา
    • หมายเลข 4 Iteration name ให้ใส่ชื่อรอบของการพัฒนา ขึ้นอยู่กับ Project Manager  แต่ละท่าน เพื่อใช้ในการสื่อสานภายในทีมพัฒนา
    • หมายเลข 5 ให้ระบุ วันที่เริ่มต้นรอบการพัฒนา (Start date) และวันที่สิ้นสุดรอบการพัฒนา (End date)
    • กดเลือกหมายเลข 6 เพื่อบันทึกรายละเอียดที่ได้กำหนดไป

    หลังจากได้ทำการสร้างรอบการพัฒนา ไปแล้วเราสามารถตรวจสอบ หรือดูรอบการพัฒนาที่เพิ่มไปได้ โดย ทำตามขั้นตอน ในรูปที่ 5 ดังนี้

    รูปที่ 5

    • หมายเลข 1 เข้าไปยัง TFS
    • หมายเลข 2 เลือกโครงการที่ได้กำหนดรอบการพัฒนาไปข้างต้น
    • จะปรากฎหน้าจอดังรูปที่ 6 โดย

    รูปที่ 6

    • กดเลือกหมายเลข 1 เพื่อดูงาน ทั้งหมด
    • กดเลือกหมายเลข 2 คือ รอบการพัฒนา ที่เราได้ทำการเพิ่มเติมนั้นเองค่ะ

    ขั้นตอนการระบุ Backlog items ที่ทำการ Commited กับผู้ใช้หรือลูกค้าว่าจะดำเนินการในรอบนี้ เข้าสู่รอบการพัฒนา หรือ Iteration ที่ต้องการ

    มีขั้นตอนดังนี้

    รูปที่ 7

    จากรูปที่ 7

    หมายเลข 1 เลือก Backlog items เลือก Board

    หมายเลข 2 ในช่อง Approved คือ Backlog items ที่ได้ตกลงกับผู้ใช้ว่าจะดำเนินการ แต่ยังไม่ได้ระบุว่าจะดำเนินการในรอบใด ให้เลือก Backlog item ที่ตกลงว่าจะทำในรอบนี้

    หมายเลข 3 Double click ที่ Backlog item ที่จะกำหนดรอบการพัฒนา จะได้หน้าจอดังรูปที่ 8

    รูปที่ 8

    จากรูปที่ 8

    หมายเลข 1 เลือกรอบการพัฒนา (Iteration) ที่ได้ตกลงกับผู้ใช้ หรือลูกค้า

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

    หมายเลข 3 กดปุ่ม Ave and Close เพื่อบันทึกข้อมูล

    โดยข้อมูล Backlog item จะไปอยู่ในช่อง Commited ดังรูปที่ 9

    รูปที่ 9

     

    รูปที่ 10

    จากรูปที่ 10 เราสามารถตรวจสอบข้อมูล ในมุมมองว่าในรอบการพัฒนานั้นๆ มี Backlog items อะไรบ้างที่เราต้องทำ โดย

    หมายเลข 1 เลือกเมนู Work

    หมายเลข 2 เลือก Iteration ที่ต้องการ

    หมายเลข 3 จะแสดง Backlog items ที่เรากำหนดให้ commited ในรอบการพัฒนาดังกล่าวนั่นเอง


    กล่าวโดยสรุป

    ในมุมมองของ Project Manager ในการนำเครื่องมือ TFS มาใช้ในกระบวนการคัดเลือกความต้องการ และกำหนดรอบการพัฒนา ทำให้เห็นภาพรวมของ Backlog Items ทั้งหมด ว่ามีความต้องการของระบบนี้ทั้งหมดกี่เรื่อง และมีการแบ่งรอบการพัฒนาขึ้นกี่รอบ เพื่อให้สามารถพัฒนาระบบให้ได้ครบทุกความต้องการ และแต่ละรอบการพัฒนา จะมีความต้องการใดบ้างที่จะต้องดำเนินการ ซึ่งเครื่องมือดังกล่าวสามารถแสดงให้ Project Manager เห็นได้ และสามารถติดตามได้นั่นเอง

     

    สำหรับขั้นตอนการวางแผนย่อย (Tasks) เพื่อให้แต่ละความต้องการ หรือแต่ละ Backlog item ทำได้สำเร็จ หรือเสร็จทันนั้นผู้เขียนขอกล่าวในรอบถัดไปนะค่ะ เนื้อหายาวไปเกรงว่าผู้อ่านจะเบื่อกันซะก่อน อยากให้ติดตามกันต่อนานๆ ค่ะ

     

    ขอบคุณค่ะ ^___^

  • Angular : Directives

    Directives คือ สิ่งที่เราเพิ่มเข้าไปใน Tag ของ HTML ซึ่งจะไปสร้าง behavior ให้กับ DOM หรือ เปลี่ยนรูป DOM จะแบ่งออกเป็น 2 ประเภทใหญ่ๆ ได้แก่

    1. Built-in Directive ซึ่งส่วนใหญ่ขึ้นต้นด้วย *ng ที่ Angular มีมาให้ก็จะมีมากมาย อาทิเช่น

    • ng-app : ฺบอกให้ Bootstrap เริ่มทำงาน Angular กับ element ไหน
    • ng-controller : จะใช้ controller จัดการกับ view ไหน
    • ng-model : binding ค่าเข้า view กับ model
    • ng-show/ ng-hide : เพื่อแสดง/ซ่อน element
    • ngFor : ใช้ในการวนลูป
    • ngIf : ใส่เงื่อนไขเช็คค่า

    2. Custom Directive ที่เราสามารถกำหนดเอง จะแบ่งเป็น

    • HTML DOMS element – เราสามารถสร้าง element ใหม่ของเราขึ้นมาเองได้ เช่น <ma-directive></ma-directive>
    • attribute เราสามารถสร้าง attribute ให้กับ element เช่น <div ma-directive=”test”></div>
    • class name ตั้งชื่อคลาส เช่น <div class=”ma-directive: test;”></div>
    • comment เช่น <!–directive: ma-directive test –>

    เราจะมาลองทำทั้งสองแบบ ก่อนอื่นสร้าง component ใหม่ชื่อ user โดยใช้คำสั่งดังภาพที่ 1 และใส่เพิ่ม tag

    <app-user></app-user> ในหน้า app.component.html

    ภาพที่ 1 สร้าง user component

    จากนั้นเปิดไฟล์ user.component.ts เพิ่มโค้ดดังภาพที่ 2 ซึ่งเป็นการกำหนดตัวแปรชื่อ users เก็บข้อมูลแบบ array แต่ละ user ประกอบไปด้วย name, code และ status ซึ่งเราจะนำไปวนลูปแสดงข้อมูล

    ภาพที่ 2 สร้าง array ของ users

    การใช้ Built-in Directive ในที่นี้จะยกตัวอย่าง ngFor สำหรับการวนลูป ซึ่งเราสามารถนำไปใส่ใน HTML Tag หรือ HTML Element นั้นๆได้เลยในไฟล์ user.component.html และหากต้องการใส่เงื่อนไข เราสามารถใช้ ngIf เพื่อเช็คค่าต่างๆ ดังภาพที่ 3

    ภาพที่ 3 ตัวอย่างการใช้ ngFor และ ngIf

    จากภาพที่ 3 เราใช้ ngIf เพื่อตรวจสอบสถานะของ user โดยถ้าสถานะเป็น single จะแสดงรูปดาว และสถานะ married จะแสดงรูปหัวใจ เมื่อรันหน้าเว็บจะปรากฎหน้าจอดังภาพที่ 4

    ภาพที่ 4 ผลลัพธ์ที่ได้

    สำหรับตัวอย่างการทำ Custom Directive เราจะมาสร้าง highlight เมื่อเอาเมาส์ไปชี้ที่ชื่อ user โดยใช้คำสั่งดังภาพที่ 5 เพื่อสร้างDirective ชื่อ highlight

    ภาพที่ 5 คำสั่งสร้าง Custom Directive

    จากนั้นเปิดไฟล์ highlight.directive.ts ดังภาพที่ 6 ซึ่ง selector เป็นตัวบอกว่าคอมโพเน้นของเราจะมีชื่อเป็นอะไรเมื่อไปปรากฎที่ HTML Element หรือ Attribute ส่วนการเรียกใช้งานก็ให้อ้าง attribute “appHighlight” ตามภาพที่ 3

    ภาพที่ 6 highlight directive

    จากภาพที่ 6 เป็นการเซตค่าเมื่อเอาเมาส์ไปชี้ onMouseEnter โดยจะไปเรียกฟังก์ชั่น highlight() เพื่อที่จะเปลี่ยนสีพื้นหลัง และ ขนาดตัวอักษร และเมื่อเอาเมาส์ออกเรียกฟังก์ชั่น undoHighlight() ซึ่งจะได้ผลลัพธ์ดังภาพที่ 7

    ภาพที่ 7 แสดงผลลัพธ์การทำ highlight directive

  • Angular : Data Binding & 2-Way Data Binding

    Data Binding เป็นการติดต่อสื่อสารกันระหว่าง Business Logic หรือไฟล์ที่เป็นนามสกุล .ts กับ .html เราจะทดลองสร้างคอมโพเนนท์ใหม่ ชื่อ Calculator ดังภาพที่ 1

    ภาพที่ 1 คำสั่งสร้างคอมโพเนนท์

    และแก้ไขไฟล์ app.component.html ให้แสดงเฉพาะคอมโพเนนท์ calculator โดยการลบโค้ดทั้งหมดในไฟล์และใส่โค้ดดังภาพที่ 2

    ภาพที่ 2 เพิ่ม Tag app-calculator

    ในไฟล์ calculator.component.html (ภาพที่ 3) เราจะใส่ property binding ใน HTML Tag ให้เป็นไปตามที่เราต้องการโดยการใช้เครื่องหมาย [ ] ซึ่งเราจะลองทำให้ตัวแปรกำหนดการ disabled ปุ่ม และในไฟล์ calculator.component.ts (ภาพที่ 4) เราจะกำหนดตัวแปรชื่อ isAllowed เป็น true ก็จะสามารถกดปุ่มได้ แต่หากเป็น false จะเป็นการ disable ปุ่ม ซึ่งตรงนี้เราเป็นการใช้ property binding

    ภาพที่3 property binding ใน HTML Tag

     

    ภาพที่ 4 สร้างตัวแปร Binding

    ต่อไปเราจะสร้าง events เช่น การกดปุ่ม การคลิ๊ก เป็นต้น เราจะใช้เครื่องหมาย ( ) ในการกำหนด โดยเราจะเพิ่ม Event Binding ลงในปุ่ม CALCULATE ในไฟล์ calculator.component.html ดังภาพที่ 5

    ภาพที่ 5 เพิ่ม events

    และสร้างตัวแปร result กับ ฟังก์ชั่น calculate() ไว้ใน calculator.component.ts ซึ่งเมื่อเรามีการกดปุ่ม แอพจะไปเรียก calculate() ขึ้นมาดังภาพที่ 6

    ภาพที่ 6 เขียนฟังก์ชั่น calculate

    หลังจากนี้เราจะมาทำ 2-Way Binding ซึ่งก็คือการนำค่าของตัวแปรมาผูกกับค่าขอ HTML Form ต่างๆ ทำให้เมื่อแก้ไขค่าใน Form นั้นๆ แล้วค่าของตัวแปรจะเปี่ยนทันที โดยจะใช้สัญลักษณ์ [( )] ในตัวอย่างต่อไปเราจะสร้างตัวแปรสองตัวและนำค่ามาแสดง โดยสามารถเปลี่ยนค่าได้จาก Textbox เปิดไฟล์ calculator.component.html ขึ้นมารับค่า input 2 ตัว ดังภาพที่ 7

    ภาพที่ 7 สร้าง input รับค่า

    และเปิดไฟล์ calculator.component.ts สร้างตัวแปรเก็บค่าชื่อ num1และ num2 และ addResult เก็บค่าผลบวกของทั้งสองตัวเพื่อเอามาแสดงใน result เมื่อกดปุ่ม calculate จะไปเรียกฟังก์ชั่น calculate() ดังภาพที่ 8 และเมื่อรันแอพขึ้นมาจะปรากฏหน้าจอดังภาพที่ 9

    ภาพที่ 8 เขียนโค้ดบวกค่า input ทั้งสอง และแสดงผล

     

    ภาพที่ 9 แสดงผลการรันแอพ

  • Angular with Bootstrap & Component

    ในบทความนี้เรานำ Bootstrap มาใช้ในโปรเจค ซึ่ง Bootstrap เป็น CSS Framework ที่ใช้ในการตกแต่งเว็บให้มีความสวยงามและเป็นระเบียบมากยิ่งขึ้น ก่อนอื่นเราต้องติดตั้ง Bootstrap โดยใช้คำสั่ง

    เปิดไฟล์ angular.json และเพิ่มโค้ดในส่วน styles

    หลังจากนั้นลองรันแอพ จะเห็นได้ว่า font ของตัวอักษรเปลี่ยนแปลงไป หากต้องการดูว่า Bootstrap 3 ทำอะไรได้บ้าง สามารถดูได้ที่ https://getbootstrap.com/docs/3.3/ ต่อไปเราจะมาดูกันว่าหลังจากรันแอพแล้วเกิดอะไรขึ้นบ้าง มีการโหลดไฟล์ใดบ้าง

    ไฟล์แรกที่จะถูกเรียกขึ้นมาก็คือ main.ts

    ในบรรทัดที่ 11 จะมีการเรียกต่อไปยังโมดูลที่ชื่อ AppModule โดยดูจากการ import ด้านบนแล้วโมดูลนี้ก็คือไฟล์ app/app.module ซึ่งอยู่ที่ src > app > app.module.ts หากเราเข้ามาดูในไฟล์นี้จะพบโค้ดตามรูปข้างล่าง

    จากรูปในบรรทัดที่15 เป็นการบอกให้เริ่มจากการโหลดคอมโพเนนท์ที่ชื่อว่า AppComponent และเราก็ดูที่ import เหมือนเดิมว่าไฟล์นี้อยู่ที่ไหน และทำการเปิดไฟล์ app.component.ts ขึ้นมา

    ในส่วนของ @Component ประกอบด้วย properties :

    1. selector: ‘app-root’ หากไปดูที่ไฟล์ index.html เราจะพบ HTML Tag ที่ชื่อว่า app-root ซึ่งเป็นการกำหนดว่าสิ่งที่เกิดขึ้นในคอมโพเนนท์นี้จะไปใส่ไว้ในไหน โดยที่ template ในข้อ2 จะถูกเอามาใส่ใน tag app-root โดยอัตโนมัติ
    2. templateUrl: เพื่อบอกว่าเราจะเอา template มาจากไฟล์ไหน ในที่นี้คือ app.component.html
    3. styleUrls: เป็นส่วนที่ใช้ตกแต่ง โดยไฟล์ในข้อ2 จะใช้ style ที่อยู่ในไฟล์ที่กำหนด

    ทดลองเพิ่มโค้ดในไฟล์ app.component.css และ index.html ตามลำดับ

    และลองดูผลลัพธ์ที่เกิดขึ้น จะเห็นว่า “Hello… World” เป็นสีดำ แต่ “Welcome to My App 22-5-2018” เป็นสีแดง เป็นเพราะว่าเราตั้งค่าไว้ว่าเฉพาะคอมโพเนนท์นี้ให้ใช้ไฟล์ตกแต่งชื่อ app.component.css ทำให้ส่วนอื่นที่ไม่ได้อยู่ใน sector ที่กำหนดไม่ได้ใช้การตกแต่งนี้

     

     

  • รู้จัก Angular กันดีกว่า

    Angular เป็น Front-end JavaScript Framework ที่ทำงานบนฝั่ง Client ที่เรานำไปสร้าง Reactive Single Page Applications (SPA) ซึ่งก็คือทุกๆหน้าจะถูกโหลดมารวมอยู่ในหน้าเดียว การคลิ๊กเปลี่ยนหน้าหรือการคลิ๊กปุ่มต่างๆ จะทำให้เรารู้สึกเหมือนเป็น Desktop Application ที่ไม่มีการโหลดเปลี่ยนหน้า Angular เป็น Model-View-Controller (MCV) และยังเป็น Model-View-ViewModel (MVVM) อีกด้วย มีการเชื่อมการทำงานระหว่าง JavaScript เข้ากับ DOM Element ของ HTML ใช้การทำงาน client-side template สามารถสร้าง template ไปใส่ไว้ในที่ที่เรากำหนดไว้ได้ และเป็น 2-way data binding เพื่อ sync Model กับ View

    เดิม Angular 1 เป็น javascript และตั้งแต่ Angular 2 ขึ้นไปเป็น typescript ปัจจุบัน Angular 6 ซึ่งมีอะไรใหม่ๆเพิ่มเข้ามา ได้แก่

    • Angular CLI เพิ่มคำสั่ง ng add, ng update, ng generate library(สร้าง Library)
    • Angular 6 ได้มีฟีเจอร์ใหม่ที่เรียกว่า Workspace ทำให้สามารถสร้าง Project ได้หลายตัวภายใน Workspace เดียว จึงได้มีการเพิ่มโฟลเดอร์ภายในโฟลเดอร์ dist เพื่อบอกว่าเป็นไฟล์ของโปรเจคใด

    • สามารถสร้าง Web Component ด้วย Angular Elements
    • Angular Material เพิ่ม Component ใหม่อย่าง Tree, Badge และ Bottom Sheet ส่วนตัว CDK ตัว overlay เพิ่ม positionStrategy แบบใหม่
    • Provider แบบใหม่ที่สนับสนุนการทำ Tree Shaking เพื่อช่วยในการลดขนาด Bundle เพิ่มประสิทธิภาพ Animation
    • มาพร้อมกับ RxJS 6 (A reactive programming library for JavaScript) เวอร์ชันใหม่ ซึ่งมีการเปลี่ยนวิธี import แบบใหม่มาตั้งแต่ versions 5

    เรามาทดลองสร้างโปรเจคกันดีกว่า ก่อนอื่นเราจะต้องติดตั้ง nodejs, Visual Studio Code และ

    1. ติดตั้ง angular

    2. สร้างแอพพลิเคชั่น

    การรัน server สามารถทำได้ด้วยการพิมพ์คำสั่งเข้าไปในโฟลเดอร์ของโปรเจค และ คำสั่งที่ใช้ในการรันแอพ ดังนี้

    3. เปิด Project โดยใช้ “Visual Studio Code” ที่ได้ติดตั้งไว้ในตอนแรก File > Open Floder… > my-app ดังในรูปด้านล่าง

    ซึ่งโฟลเดอร์ที่เราสนใจหลักๆ ก็คือ src/app เปิดไฟล์ app.component.html เพิ่มในส่วน <h1> … </h1>

    และเปิดไฟล์ app.component.ts ขึ้นมา ในส่วนนี้เป็นตัวควบคุมของ component นี้

    ในบรรทัดที่ 9,10 เป็นการสร้างตัวแปร title , Date ตามลำดับ ที่ถูกนำไปใช้ในไฟล์ app.component.html ซึ่งในส่วนนี้จะเรียกว่า Data Binding และทำการเปิด Browser ไปที่ http://localhost:4200/ จะได้ผลลัพธ์ดังรูป

    ใน Angular จะใช้โมดูลเปรียบเสมือนกล่องแต่ละชิ้นมาประกอบกันเพื่อทำงานในแต่ละส่วนโดยมีข้อดีคือสามารถนำโค้ดกลับมาใช้ใหม่ได้ (reusable) และหากมีหลายๆโมดูลที่จะเรียกใช้สามารถเรียงลำดับก่อนหลังได้ หรือจะใช้คู่ขนานก็ได้ ซึ่งในโมดูลก็จะประกอบไปด้วย

    • Controllers
    • Services
    • Filters
    • Directives
    • อื่นๆ

    ทดลองใช้ FormsModule ซึ่งเป็นโมดูลที่ใช้ในการจัดการฟอร์มต่างๆ ของ HTML รวมทั้งช่วยในการทำ Data Binding ในส่วนของข้อมูลฝั่งควบคุมกับค่าในฟอร์มของฝั่งที่แสดง เปิดไฟล์ app.module.ts และทำการแก้ไข ดังนี้

    บรรทัดที่เพิ่มเข้าไปคือการเพิ่มโค้ดเข้าไปเพื่อดึงโมดูลนี้มาใช้งาน จากนั้นลองนำส่วนของฟอร์มมาใช้กับโปรเจคโดยเปิดไฟล์ app.component.html ขึ้นมา และเพิ่มโค้ดตามรูปด้านล่าง

    และลองรัน Browser จะได้ผลัพธ์ ดังนี้