เขียน 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

Read More »

สร้าง 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 นี้ผู้เขียนก็จะนำเสนอแบบสั้นๆ ง่ายๆ แต่หากผู้ใช้ท่านไหนต้องการศึกษาแบบละเอียด

Read More »

Oracle / PLSQL: LISTAGG Function

LISTAGG เป็นฟังก์ชันการรวมสตริงของ Oracle ที่นำค่าข้อมูลในคอลัมภ์ที่ระบุมาเรียงต่อกัน และดำเนินการจัดเรียงลำดับของข้อมูลที่นำมาต่อกันตามคอลัมภ์ใน order_by_clause ซึ่งฟังก์ชัน LISTAGG สามารถแสดงผลได้หลายรูปแบบดังนี้ Single-set aggregate function : LISTAGG เป็นฟังก์ชันที่ดำเนินการกับข้อมูลแล้วคืนค่ากลับมาเพียงเร็คคอร์ดเดียว Group-set aggregate function : LISTAGG เป็นฟังก์ชันที่ดำเนินการกับข้อมูลและคืนค่ากลับมาหลายเร็คคอร์ดตามกลุ่มที่กำหนดในเงื่อนไข GROUP BY  Analytic function : LISTAGG เป็นฟังก์ชันที่ดำเนินการจัดแยกผลการค้นหาออกเป็นกลุ่มตามเงื่อนไขที่กำหนดใน query_partition_clause Syntax LISTAGG (measure_column [, ‘delimiter’]) WITHIN GROUP (order_by_clause) [OVER (query_partition_clause)] โดยที่  measure_column คือ คอลัมภ์ที่ต้องการนำค่าข้อมูลมาเรียงต่อกัน โดยจะดำเนินเฉพาะค่าที่ไม่เป็น null เท่านั้น delimiter คือ ตัวเลือกที่ให้สามารถระบุตัวคั่นระหว่างค่าข้อมูลที่จะนำมาเรียงต่อกัน order_by_clause คือ ค่าที่นำมาเรียงต่อกันจะเรียงตามค่าในคอลัมภ์ที่กำหนดใน order_by_clause   ตัวอย่างการใช้งาน  สมมติเรามีข้อมูลคะแนนภาษาอังกฤษของนักศึกษาใหม่ซึ่งประกอบด้วย 6 ฟิลด์ข้อมูลแสดงดังตัวอย่างด้านล่าง ข้อมูล: ตาราง TEST_NEW_STUDENT เป็นตัวอย่างข้อมูลคะแนนภาษาอังกฤษของนักศึกษาใหม่จำนวน 16 รายการ Single-set aggregate function ตัวอย่างในส่วนนี้จะแสดงชื่อ-นามสกุลนักศึกษาทุกคนที่อยู่ในคณะ ’06’ โดยจัดเรียงลำดับข้อมูลตามชื่อนักศึกษา(stud_name_thai) SELECT LISTAGG (stud_name_thai || ‘ ‘ || stud_sname_thai, ‘,’) WITHIN GROUP (ORDER BY stud_name_thai) “NAME LIST” FROM test_new_student WHERE fac_id = ’06’; ผลลัพธ์ที่ได้ : จะคืนค่ากลับมาเพียงเร็คคอร์ดเดียวตามเงือนไขที่ระบุ Group-set aggregate function  ตัวอย่างในส่วนนี้จะแสดงชื่อ-นามสกุลนักศึกษาทุกคนแยกตามคณะที่สังกัด โดยจัดเรียงลำดับข้อมูลตามชื่อนักศึกษา(stud_name_thai) SELECT fac_id,LISTAGG (stud_name_thai || ‘ ‘ || stud_sname_thai, ‘,’) WITHIN GROUP (ORDER BY stud_name_thai) “NAME LIST” FROM test_new_student GROUP BY fac_id ORDER BY fac_id; ผลลัพธ์ที่ได้ : จะคืนค่ากลับมาหลายเร็คคอร์ดตามเงื่อนไข GROUP BY Analytic function ตัวอย่างในส่วนนี้จะแสดงข้อมูลเฉพาะคนที่ได้คะแนนมากกว่า 60 และจัดแยกผลการค้นหาตามคณะที่สังกัด SELECT fac_id,stud_name_thai||’ ‘||stud_sname_thai student_name,eng_score, LISTAGG (stud_name_thai||’ ‘||stud_sname_thai, ‘,’) WITHIN GROUP (ORDER BY eng_score, stud_name_thai) OVER (PARTITION BY fac_id) AS “NAME_LIST” FROM test_new_student WHERE eng_score > 60 ORDER BY fac_id, eng_score ผลลัพธ์ที่ได้ : ดำเนินการจัดแยกผลการค้นหาออกเป็นกลุ่มตามเงื่อนไขที่กำหนดใน PARTITION BY 

Read More »

Oracle : ROLLUP Extension to GROUP BY

การจัดกลุ่มข้อมูลด้วย GROUP BY เมื่อต้องการจัดกลุ่มข้อมูล เราสามารถใช้ประโยค GROUP BY เพื่อทำการแบ่งออกเป็นรายการย่อย ๆ การคิวรีที่รวมประโยค GROUP BY จะเรียกว่าการคิวรีแบบกลุ่ม เพราะว่ามันจะรวมกลุ่มข้อมูลจากคำสั่ง SELECT แล้วสร้างเป็นเร็คคอร์ดสรุปเพียงเร็คคอร์ดเดียวให้กับแต่ละกลุ่ม  ส่วนขยาย ROLLUP  ในการคิวรีข้อมูลเราสามารถค้นหาแถวข้อมูลผลรวมของแต่ละกลุ่ม รวมถึงสรุปผลรวมที่มาจากผลลัพธ์ทั้งหมดในตอนท้ายของการคิวรีอีกทีได้ โดยใช้ส่วนขยายที่เรียกว่า ROLLUP ซึ่งมีรูปแบบการใช้งานดังนี้ ROLLUP Syntax SELECT…GROUP BY ROLLUP(grouping_column_reference_list) ตัวอย่างการใช้งาน สมมติเรามีข้อมูลคะแนนภาษาอังกฤษของนักศึกษาใหม่ซึ่งประกอบด้วย 6 ฟิลด์ข้อมูลแสดงดังตัวอย่างด้านล่าง ข้อมูล: ตาราง TEST_NEW_STUDENT เป็นตัวอย่างข้อมูลคะแนนภาษาอังกฤษของนักศึกษาใหม่จำนวน 16 รายการ โจทย์ เราต้องการนับจำนวนนักศึกษาใหม่แยกตามคณะที่นักศึกษาสังกัด และรหัส สน.ที่สอบได้ เราสามารถใช้ประโยค GROUP BY เพื่อแก้ปัญหาข้อนี้ ดังตัวอย่างคิวรีต่อไปนี้ SELECT fac_id, sn_code, COUNT (*) NUM_STUDENT FROM test_new_student GROUP BY fac_id, sn_code ORDER BY fac_id, sn_code; ผลลัพธ์ที่ได้ : แสดงจำนวนนักศึกษาแยกตามคณะที่สังกัด และรหัส สน.ที่สอบได้ แสดงเรียงตามรหัสคณะ และรหัส สน.ที่สอบได้ โจทย์ หากเราต้องการนับจำนวนนักศึกษาใหม่แยกตามคณะที่นักศึกษาสังกัด และรหัส สน.ที่สอบได้ พร้อมทั้งแสดงผลรวมของนักศึกษาแต่ละคณะ และหาผลรวมของนักศึกษาทั้งหมดด้วย เราสามารถใช้ส่วนขยายที่เรียกว่า ROLLUP เพื่อแก้ปัญหาข้อนี้ ดังตัวอย่างคิวรีต่อไปนี้ SELECT fac_id, sn_code, COUNT (*) NUM_STUDENT FROM test_new_student GROUP BY ROLLUP (fac_id, sn_code) ORDER BY fac_id, sn_code; ผลลัพธ์ที่ได้ : แสดงจำนวนนักศึกษาแยกตามคณะที่สังกัด และรหัส สน.ที่สอบได้ แสดงเรียงตามรหัสคณะ และผลรวมของนักศึกษาแต่ละคณะ และผลรวมนักศึกษาทั้งหมด ลองใช้งานกันดูนะคะ  สำหรับส่วนขยาย ROLLUP เพื่อหาสรุปผลรวมที่มาจากผลลัพธ์ทั้งหมดในตอนท้ายของการคิวรี

Read More »

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/

Read More »