Category: Automation System

  • มารู้จักวิธีการบันทึกข้อมูลจาก Microsoft Form ลง List ใน SharePoint ด้วยเจ้าเครื่องมือ Power Automate กันเถอะ (EP.2 : ลงมือสร้าง Flow ด้วย Power Automate)

                หลังจากที่ EP. ที่แล้ว เราได้มีการเตรียมเครื่องมือ อุปกรณ์ทั้งในส่วนของแบบฟอร์มที่จะใช้ในการกรอกข้อมูล และลิสต์ที่ใช้ในการเก็บข้อมูลกันไปแล้ว แต่ถ้าใครยังไม่เคยอ่าน สามารถติดตามได้ที่ลิงค์นี้นะคะ มารู้จักวิธีการบันทึกข้อมูลจาก Microsoft Form ลง List ใน SharePoint ด้วยเจ้าเครื่องมือ Power Automate กันเถอะ (EP.1 : ขั้นตอนการเตรียมตัว) และมาถึง EP.นี้ ก็ได้เวลาลงมือสร้าง Flow ที่จะควบคุมการทำงานแบบอัตโนมัติ ที่จะช่วยลดขั้นตอนการทำงานให้กับเราได้โดยที่เราไม่ต้องลงมือเองกันแล้ว และเพื่อไม่ให้เป็นการเสียเวลา เรามาเริ่มขั้นตอนต่อไปกันเลยดีกว่านะคะ

    ขั้นตอนการสร้าง Flow โดยใช้ Power Automate 

    1.ไปยัง Power Automate เพื่อสร้าง Flow การทำงานที่เราต้องการ โดยการกดปุ่ม เพื่อเลือก Apps ที่เป็น Power Automate จาก Microsoft 365 ที่เราต้องการเช่นเคยค่ะ


    2. สร้าง Flow : โดยการกดปุ่ม Create ที่ฝั่งซ้ายมือ และเลือกรูปแบบ Flow ที่ต้องการ ซึ่งมีทั้งแบบที่สร้างใหม่ด้วยตนเองและสร้างจากต้นแบบที่มีก็ได้ แต่สำหรับกรณีนี้ขอเลือกแบบ Automated cloud flow นะคะ


    3. ระบุชื่อ Flow และเหตุการณ์ที่ต้องการให้ทำงานอัตโนมัติ : เมื่อเลือกรูปแบบ Flow ที่ต้องการได้แล้ว เราจะต้องตั้งชื่อ Flow และทำการเลือกเหตุการณ์ที่เราต้องการให้ระบบทำงานอัตโนมัติกันค่ะ ซึ่งในที่นี้ขอเลือกเป็นเหตุการณ์ที่แบบฟอร์มมีการบันทึกข้อมูล หรือตัวเลือก “When a new response is submitted” ตามภาพค่ะ


    4. เลือกแบบฟอร์มที่จะใช้ในการบันทึกข้อมูล : หลังจากระบุเหตุการณ์เรียบร้อยแล้ว เราจะต้องทำการเลือกแบบฟอร์มที่เราสนใจหลังมีการบันทึกข้อมูล โดยเลือกระบุในค่า Form Id โดยระบบจะแสดงตัวเลือกแบบฟอร์มที่เราสร้างขึ้นไว้ทั้งหมดมาให้เลือก ในที่นี้ขอเลือก “แบบฟอร์มยืมอุปกรณ์ในหน่วยงาน” นะคะ


    5. สร้างขั้นตอนถัดไป : หลังจากเลือกแบบฟอร์มที่เราต้องการนำข้อมูลมาบันทึกเรียบร้อยแล้ว ให้เลือก New Step เพื่อกำหนดขั้นตอนการทำงานขั้นต่อไป ตามภาพค่ะ


    6. ระบุเนื้อหาที่ต้องการใช้งาน : โดยขั้นตอนการทำงานต่อไปที่เราต้องดำเนินการก็คือ การนำเนื้อหาของแบบฟอร์มที่เราต้องการมาใช้งานค่ะ โดยเราจะต้องเลือก “Get response details” ซึ่งขอแนะนำวิธีในการค้นหาให้ง่ายขึ้นโดยการใส่คำค้น “Microsoft Form” ลงไป เพื่อให้ค้นหาได้ง่ายขึ้น เนื่องจากแบบฟอร์มของเราเป็น Microsoft Form นั่นเอง แต่หากแบบฟอร์มที่ท่านต้องการใช้เป็นชนิดอื่น ก็สามารถค้นหาตามชนิดนั้นๆได้ค่ะ


    7. ระบุแบบฟอร์มและ Response Id : หลังจากนั้น ระบบจะแสดงหน้าจอให้ทำการระบุแบบฟอร์มที่ต้องการเอาเนื้อหาข้อมูลมาใช้งาน และกำหนด Response Id


    8. การระบุแบบฟอ์มทำเช่นเดียวกับที่ได้กล่าวไว้แล้วข้างต้น หลังจากนั้นให้ทำการเลือก Response Id จากแบบฟอร์ม ตามภาพได้เลยค่ะ


    9. เมื่อกำหนดค่าต่างๆเรียบร้อยแล้ว จะได้ผลลัพธ์ดังภาพ ให้ทำการสร้างขั้นตอนถัดไป โดยการกดปุ่ม New Step เพื่อจัดการขั้นต่อไปกันเลยค่ะ


    10. ระบุ SharePoint และลิสต์ที่ใช้ในการบันทึกข้อมูล : ขั้นตอนถัดมา ถึงเวลาที่เราจะต้องระบุว่าข้อมูลจากแบบฟอร์มที่เราระบุในขั้นตอนก่อนหน้านี้จะนำไปบันทึกลงที่ใด โดยในที่นี้จะบันทึกลงลิสต์ใน SharePoint ที่เราเตรียมไว้กันนะคะ โดยการใช้คำค้น “Sharepoint” และเลือก “Create Item” เพื่อให้ข้อมูลจากแบบฟอร์มที่เราได้มาถูกบันทึกลงในลิสต์ใน Share Point ที่เราต้องการกันค่ะ


    11. โปรแกรมจะให้เราระบุไซต์ของ Share Point และลิสต์ที่เราต้องการเก็บข้อมูล


    12. ระบุไซท์ใน SharePoit : เลือกไซต์ Share Point ซึ่งเป็นที่อยู่ของลิสต์ที่เราเตรียมไว้ในการเก็บข้อมูลให้ถูกต้อง


    13. ระบุลิสต์ที่ต้องการเก็บข้อมูล : เลือกลิสต์ที่จะใช้ในการเก็บข้อมูลจากแบบฟอร์ม ในกรณีนี้ขอเลือกลิสต์ที่ชื่อว่า “การยืม-คืนอุปกรณ์ในหน่วยงาน” ตามที่ได้สร้างไว้ในขั้นตอนที่ 2 ข้างต้น


    14. จับคู่คอลัมน์ในลิสต์กับข้อมูลในแบบฟอร์มที่ต้องการบันทึกข้อมูล : หลังจากนั้น โปรแกรมจะให้เราทำการจับคู่คอลัมน์ในลิสต์กับข้อมูลจากแบบฟอร์มที่เราสร้างขึ้น ว่าต้องการให้ข้อมูลจากแบบฟอร์มส่วนไหนถูกบันทึกลงในคอลัมน์ใด โดยข้อมูลจากแบบฟอร์มจะอยู่ฝั่งขวามือเพื่อให้เราเลือกมาใส่ในแต่ละคอลัมน์ของลิสต์ ตามภาพค่ะ


    15. หลังจากที่เราจับคู่คอลัมน์กับข้อมูลในแบบฟอร์มเรียบร้อยแล้ว จะได้ผลลัพธ์ดังภาพ


    16. บันทึก Flow ที่สร้าง : หลังจากนั้นให้ทำการบันทึกข้อมูล Flow ที่เราสร้างขึ้นให้เรียบร้อย โดยการกดปุ่ม Save ที่อยู่ฝั่งขวามือ


    17. เมื่อบันทึกข้อมูลเรียบร้อยแล้ว จะขึ้นแถบสีเขียวแสดงให้ทราบว่าการบันทึกเสร็จสมบูรณ์ เพียงเท่านี้เราก็จะได้ Flow การบันทึกข้อมูลจากแบบฟอร์มมาลงลิสต์ใน Share Point ของเราโดยไม่ต้อง import ข้อมูลใหม่ให้เสียเวลาค่ะ

    ตัวอย่างการนำไปใช้งานและผลลัพธ์

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

    2. เมื่อทำการบันทึก หรือกดปุ่ม Submit ข้อมูลที่กรอกในแบบฟอร์มจะถูกบันทึกในลิสต์ที่อยู่ใน Share Point ที่ชื่อว่า “การยืม-คืนอุปกรณ์ในหน่วยงาน” ที่เราเตรียมไว้ให้โดยอัตโนมัติ ดังภาพ

                   เพียงเท่านี้ ท่านก็จะมีข้อมูลที่ต้องการเก็บไว้ในลิสต์จากแบบฟอร์มที่ผู้ใช้กรอกมา โดยที่ไม่ต้องทำงานซ้ำซ้อนในการนำเข้าข้อมูลอีกต่อไป แถมยังลดการใช้กระดาษได้อีกด้วยนะคะ ซึ่งวิธีการข้างต้นนี้ เป็นเพียงหนึ่งในวิธีที่หวังว่าจะช่วยให้การทำงานของผู้ที่ต้องทำงานกับแบบฟอร์มอยู่แล้วง่ายขึ้น และสามารถลดขั้นตอนการดำเนินการที่มีในปัจจุบันไม่มากก็น้อยนะคะ แต่จริงๆแล้วเจ้า Power Automate ยังมีความสามารถที่หลากหลาย และสามารถนำไปประยุกต์ใช้ได้ในอีกหลายทางเลยค่ะ อย่าลืมไปลองใช้งานและลองเล่นกันดูนะคะ ขอบคุณที่ติดตามเช่นเคยนะคะ ไว้เจอกันใหม่ในบทความหน้าค่ะ ^^v

  • มารู้จักวิธีการบันทึกข้อมูลจาก Microsoft Form ลง List ใน SharePoint ด้วยเจ้าเครื่องมือ Power Automate กันเถอะ (EP.1 : ขั้นตอนการเตรียมตัว)

                   ในปัจจุบันพบว่า มีการใช้งานแบบฟอร์มในรูปแบบออนไลน์มากขึ้น เพื่อความสะดวก และลดการใช้ทรัพยากรกระดาษ ไม่ว่าจะเป็น Google Form หรือ Microsoft form เพื่อรับข้อมูลจากผู้ใช้ เนื่องจากใช้งานง่าย และสะดวก และทำให้ผู้ที่กรอกข้อมูล สามารถกรอกข้อมูลได้จากที่ใดก็ได้โดยไม่ต้องอาศัยการกรอกแบบฟอร์มกระดาษอย่างแต่ก่อน แต่ในส่วนของการเก็บข้อมูลและการนำไปใช้ก็อาจจะมีวิธีการจัดการที่แตกต่างกันออกไป ซึ่งโดยปกติแบบฟอร์มออนไลน์เหล่านี้ก็จะสามารถ Export ข้อมูลออกมาในรูปแบบไฟล์ Excel หรือ CSV ได้อยู่แล้ว แต่สำหรับบทความนี้ ผู้เขียนจะขอหยิบยกวิธีการเก็บข้อมูลจาก Microsoft form มาเก็บในลิสต์(List) ซึ่งเป็นเปรียบเสมือนฐานข้อมูลหรือตารางที่ใช้เก็บข้อมูลใน SharePoint  โดยที่ไม่ต้องมา Import ข้อมูลจากไฟล์ Excel หรือ CSV ที่เรานำมาจากแบบฟอร์มอีก ซึ่งเราจะใช้ตัวช่วยที่ชื่อว่า Power Automate เพื่อมาลดขั้นตอนการทำงานเหล่านี้ให้กับเรากันค่ะ

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

    1. แบบฟอร์ม Microsoft Form ที่ใช้ในการกรอก
    2. ลิสต์ใน SharePoint ที่ใช้ในการเก็บข้อมูลจากแบบฟอร์ม
    3. Flow ที่สร้างจาก Power Automate ที่ใช้ในการบันทึกข้อมูลจากแบบฟอร์มลงในลิสต์นั่นเองค่ะ

    หมายเหตุ : ในบทความนี้ ผู้ใช้จะไม่ขอลงรายละเอียดในส่วนของการสร้างฟอร์ม และลิสต์ที่ใช้เก็บข้อมูลใน SharePoint แต่จะขอเน้นไปที่วิธีการสร้าง Flow ใน Power Automate เพื่อบันทึกข้อมูลแทนนะคะ และการใช้งาน Microsoft Form SharePoint และ Power Automate จริงๆแล้วสามารถเข้าใช้งานได้จากหลายช่องทาง แต่ในตัวอย่างนี้จะใช้ผ่าน Office 365 นะคะ

                   โดยใน EP. นี้จะเป็นขั้นตอนการจัดเตรียมอุปกรณ์ในข้อ 1 และ 2 ให้เรียบร้อยก่อน จึงจะไปสร้าง Flow ในขั้นตอนที่ 3 ให้โปรแกรมทำงานอัตโนมัติกันใน EP. ถัดไปนะคะ เพื่อไม่ให้เป็นการเสียเวลา เรามาเริ่มขั้นตอนการจัดเตรียมเครื่องมือใน 2 ขั้นตอนแรก กันเลยดีกว่าค่ะ

    ขั้นตอนที่ 1 : การจัดเตรียมแบบฟอร์ม Microsoft Form โดยเราจะเตรียมและสร้างแบบฟอร์ม Microsoft Form ที่ต้องการให้เรียบร้อย ซึ่งจะต้องมีการระบุชนิดและการบังคับกรอกในข้อมูลแต่ละรายการให้ครบถ้วน โดยจะขอแนะนำวิธีการคร่าวๆ ดังนี้

    1.ไปยังแบบฟอร์ม โดยการกดปุ่มเพื่อเลือก Apps ที่เป็น Form จาก Microsoft 365 ที่เราต้องการกันค่ะ

    กดปุมเพื่อเลือก Apps ที่ต้องการใช้งานจาก Microsoft 365


    2. หลังจากนั้นจะแสดงรายการ App ใน Microsoft Office365 มาให้เลือก ในที่นี้ขอเลือก Form ดังภาพ


    3. จะปรากฎหน้าจอและปุ่มให้สร้างแบบฟอร์ม ให้กดลูกศร และเลือก New Form ตามภาพ

    หมายเหตุ : ในส่วนนี้ต้องระวัง เพราะหลายคนจะเลือกผิดเป็น New Quiz ต้องสังเกตให้ดีนะคะ


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


    5. หากเราเคยมีการทำแบบฟอร์มและใส่หัวข้อก่อนหน้านี้ โปรแกรมจะดึงข้อมูลที่เราเคยทำไว้มาแนะนำ เพื่อช่วยอำนวยความสะดวกให้กับเรา กรณีที่ข้อมูลหัวข้อคล้ายๆกัน และไม่ต้องระบุใหม่ทั้งหมด โดยจะเลือกจากส่วนของ Recommended ค่ะ หรือเราจะเลือกสร้างใหม่เองก็ได้นะคะ


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


    7. หลังจากนั้น ให้ทำการระบุชื่อหัวข้อ และสามารถระบุค่าต่างๆได้ ดังนี้

    • ชื่อหัวข้อ
    • ระบุว่าเป็นข้อมูลที่ต้องบังคับกรอกหรือไม่
    • ระบุว่าต้องการให้เป็นหัวข้อที่มีการกรอกข้อมูลที่มีความยาวมากกว่า 1 บรรทัด เช่น ข้อมูลพวกรายละเอียดต่างๆ หรือไม่
    • การเลื่อนลำดับหัวข้อ โดยการกดลูกศรขึ้น-ลง หรือลากไปทั้งกล่องเพื่อไปยังลำดับที่ต้องการได้
    • การทำสำเนาหัวข้อ ในกรณีที่หัวข้อมีลักณะคล้ายกัน เพื่อประหยัดเวลาในการสร้างข้อใหม่
    • การลบหัวข้อ
      ดังภาพค่ะ

    8. หลังจากที่ได้สร้างแบบฟอร์มและกำหนดค่าต่างๆในแต่ละข้อของแบบฟอร์มเรียบร้อยแล้วจะได้ผลลัพธ์ดังภาพค่ะ

    ตัวอย่างของแบบฟอร์มที่ใช้ในการกรอกข้อมูลในมุมมองของผู้กรอก

    1. ตัวอย่างผลลัพธ์แบบฟอร์มหน้าแรก


    2. ตัวอย่างหน้าจอการกรอกข้อมูลในแบบฟอร์ม


    เพิ่มเติม ท่านสามารถ Copy ลิงค์ของฟอร์มไปใช้งาน ได้โดยการกดปุ่ม Collect Response ดังภาพ


                   ซึ่งจะปรากฏหน้าจอให้ระบุการตั้งค่าต่างๆเพิ่มเติม และเราสามารถ Copy ลิงค์ของฟอร์มเพื่อให้ผู้ใช้กรอกข้อมูล และสามารถทำเป็นลิงค์แบบสั้นได้ ดังภาพ

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

    ขั้นตอนที่ 2 : การจัดเตรียมลิสต์ในการเก็บข้อมูล ที่มีใน SharePoint โดยมีการระบุชื่อและชนิดของแต่ละคอลัมน์ และต้องอย่าลืมว่าข้อมูลคอลัมน์แต่ละรายการในลิสต์ต้องสอดคล้องกับข้อมูลที่มีในแบบฟอร์มในขั้นตอนที่ 1. โดยวิธีการสร้างลิสต์ มีดังนี้

    1.ไปยัง SharePoint โดยการกดปุ่ม เพื่อเลือก Apps ที่เป็น SharePoint จาก Microsoft 365 ที่เราต้องการกันค่ะ


    2. หลังจากนั้นให้ทำการสร้างลิสต์ขึ้นมา  โดยการคลิกปุ่ม New และเลือก List ตามภาพ


    3. เลือกชนิดของลิสต์ที่ต้องการสร้าง ซึ่งจะเห็นว่าสามารถนำเข้าข้อมูลจากลิสต์ที่มีอยู่ หรือจากไฟล์ Excel และ CSV ได้ด้วย แต่ในกรณีเราจะสร้างจาก “Blank list” ตามภาพค่ะ


    4. ระบุชื่อของลิสต์ที่เราต้องการเก็บข้อมูล ในที่นี้จะขอระบุชื่อเป็น “การยืม-คืนอุปกรณ์ในหน่วยงาน” ดังภาพ


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


    6. โปรแกรมจะขึ้นหน้าจอให้เราระบุชนิดของข้อมูลในคอลัมน์ที่เราต้องการจะเพิ่ม ดังภาพค่ะ


    7. จากนั้น โปรแกรมจะให้เราระบุรายละเอียดของคอลัมน์ที่ต้องการเพิ่มเติม ซึ่งจะมีรายละเอียดแตกต่างกันไปในแต่ละชนิดของข้อมูล


    8. หลังจากที่เราสร้างคอลัมน์จนครบตามที่ต้องการแล้ว เราก็จะมีลิสต์ที่ใช้ในการเก็บข้อมูล ซึ่งเราสามารถเพิ่มเติมหรือแก้ไขในภายหลังได้ ดังภาพค่ะ


    9. การจัดการข้อมูลในลิสต์ โดยปกติข้อมูลในลิสต์ เราสามารถเพิ่มได้โดยตรงจากหน้าลิสต์ในขั้นตอนต่างๆ อย่างสังเขป ดังนี้

    • การเพิ่มข้อมูล โดยการกดปุ่ม New ซึ่งจะแสดงหน้าจอให้กรอกข้อมูล ดังต่อไปนี้


                   นอกจากนี้ ยังสามารถเพิ่ม/แก้ไขข้อมูลได้โดยการกดปุ่ม Edit in grid view เพื่อจัดการข้อมูลในรูปแบบตาราง ซึ่งจะแสดงหน้าจอให้แก้ไขในอีกมุมมอง แล้วแต่ความถนัด ดังนี้


                   ท่านสามารถเพิ่มข้อมูลใหม่ในมุมมอง grid view ได้โดยการกดปุ่ม Add new item หากกรอกข้อมูลเรียบร้อยแล้ว สามารถกลับไปยังมุมมองแรกได้โดยการกดปุ่ม Exit grid view เพื่อกลับไปยังมุมมองการดูข้อมูลปกติดังนี้

    • การแก้ไขข้อมูลจากมุมมองดูข้อมูลทั่วไป สามารถทำได้หลายวิธี โดยการกดปุ่ม Edit หรือ Edit in grid view ตามที่ได้กล่าวไปแล้วก่อนหน้านี้ หรือ หากต้องการลบข้อมูล สามารถเลือกรายการที่ต้องการลบ และกดปุ่ม Delete ได้ตามภาพ

                    จะเห็นว่า ในลิสต์เองก็มีความสามารถในการจัดการข้อมูล เพิ่ม/แก้ไข/ลบได้ในตัวเองอยู่แล้ว แต่บทความที่ผู้เขียนหยิบยกมานี้ ได้มีการนำแบบฟอร์มมาใช้เป็นช่องทางให้ผู้ใช้กรอกข้อมูลเข้ามา เพื่อความสะดวก และใช้งานง่ายในการกรอกข้อมูลจากผู้ใช้นั่นเอง
                    และมาถึงตรงนี้เราก็จะมีทั้ง แบบฟอร์ม และ ลิสต์ ที่พร้อมจะใช้ในการเก็บข้อมูลกันแล้ว ขั้นตอนต่อไปก็ถึงคราวที่เราต้องไปเตรียม Flow กันบ้าง แต่สำหรับการสร้าง Flow ที่จะใช้ในการบันทึกข้อมูลจากฟอร์มมาลงลิสต์ที่เตรียมไว้จะขอพูดถึงใน EP. ถัดไปละกันนะคะ(เนื่องจาก EP. นี้ก็เริ่มจะยาวเกินไปแล้ว) ไว้เจอกันใน EP.2 นะคะ ขอบคุณที่ติดตามอ่านจนจบ และหวังว่าจะพอเป็นประโยชน์กับทุกท่านนะคะ

  • วิธีใช้งาน Google Form ให้เฉพาะผู้เกี่ยวข้องเท่านั้นที่จะตอบแบบฟอร์มได้ โดยต้องไม่บังคับ Login ด้วย Google Account ด้วย

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

    แต่ ถ้าต้องการให้เฉพาะคนในองค์กรซึ่งใช้ G Suite (เช่น กรณีของ มหาวิทยาลัยสงขลานครินทร์ ใช้ G Suite for Education โดเมน psu.ac.th เป็นต้น) ตอบแบบสอบถามเท่านั้น ก็พอจะทำได้ แต่ก็จะเจอปัญหาคือ ผู้ใช้ในองค์กรอาจจะ Login ด้วย Web Browser ซึ่ง Sign-In ด้วย Gmail ส่วนตัว ก็จะยุ่งยากหน่อย ต้องสลับ Account เป็นต้น แล้วยิ่งบางคน ใช้ LINE เพื่อ Scan QR Code แล้วก็ไปใช้ In-App Browser ซึ่งก็ไม่รู้ว่า Sign-In ด้วย Account ไหน ยิ่งไปกว่านั้น ถ้าเป็นการไปใช้งานนอกสถานที่ที่ใช้ประจำ Google ก็มักจะ Challenge โดยการ ให้ระบุ เบอร์โทรศัพท์มือถือ หรือ Email ที่ใช้ Recovery สร้างความวุ่นวายได้เป็นอย่างมาก

    แล้ว ก็มี Requirement “ง่าย ๆ” มาให้คิด

    • ต้องการออกแบบระบบ ลงคะแนน ให้คณะกรรมการ ซึ่งอยู่ทั้งในและนอกองค์กร
    • ท่าน ๆ เหล่านี้ ล้วน … ทรงคุณวุฒิ และ วัยวุฒิ
    • ใช้อุปกรณ์หลากหลาย
    • ส่งแบบฟอร์มไปให้กรอก โดยผ่าน Email ท่าน ๆ ซึ่งเป็น @yahoo.com, @hotmail.com, @gmail.com, @xxx.edu, @xxxxxxxxx
    • บางท่าน ไม่มี Email แต่มี LINE เท่านั้น
    • การลงคะแนน ต้องมั่นใจว่า กรรมการแต่ละท่าน เป็นผู้ลงคะแนนจริง ๆ
    • ท่าน ๆ ลงคะแนนได้ 1 เสียงเท่านั้น
    • เปลี่ยนใจได้ด้วย คือ ตอนแรกจะลงคะแนนอย่างนึง แล้วก็ Submit ไปแล้ว แต่ก็คิดว่า เอ๊ะ เปลี่ยนใจแระ (ในกรอบเวลา)
    • ไม่สามารถทราบได้ว่าใครเป็นผู้ลงคะแนนได้ (โดยง่าย)

    แนวทางการแก้ปัญหา

    Google Form มี Feature นึง ที่บางคนไม่เคยใช้ นั่นคือ “Get pre-filled link”

    Pre-filled Link กล่าวคือ ทำการกรอกข้อมูลบางอย่างใน Google Form แล้วส่งให้ผู้ใช้ เช่น เรารู้อยู่แล้วว่า จะส่งแบบฟอร์มนี้ ไปทาง Email ของกรรมการท่านนี้ ก็แทนที่ต้องให้ท่าน กรอกชื่อตัวเอง เราก็กรอกไปให้ท่านเลย อะไรทำนองนั้น

    Idea ของเราคือ จะสร้าง “Question” ชื่อ Token ขึ้นมา (จะตั้งว่าอะไรก็ได้นะ)

    แล้วคลิกที่ “Get Pre-filled Link”

    จะได้แบบฟอร์มพร้อมกรอกอย่างนี้ เราก็จะ Mark ตำแหน่งที่จะแทนค่า Token ด้วยการใส่คำอะไรก็ได้ แต่ในที่นี้ จะใส่เป็นคำว่า “token” ตัวพิมพ์เล็ก ไปใส่ แล้วคลิกปุ่ม Get Link จากนั้น คลิกปุ่ม COPY LINK

    Link ที่ได้ จะเป็นแบบนี้

    https://docs.google.com/forms/d/e/XXXXXXXXXX/viewform?usp=pp_url&entry.625502761=token

    จากนั้นแค่ค่า ข้อความ “token” ด้วยค่า Hash เช่น เอาชื่อ นามสกุล และ email address ของแต่ละคนมาเข้ารหัส MD5 (จะกล่าวถึงวิธีการได้มาในตอนท้าย) เช่น ได้เป็น

    b4771c1c4d65442b32d7029d13fb6e41

    ก็จะได้ URL ที่จะส่งให้ท่านกรรมการ อย่างนี้

    https://docs.google.com/forms/d/e/XXXXXXXXXX/viewform?usp=pp_url&entry.625502761=b4771c1c4d65442b32d7029d13fb6e41

    เมื่อผู้รับคลิก Link ก็จะได้หน้าตาฟอร์มแบบนี้

    คราวนี้ ในภาพใหญ่ ก็ต้องหาทางทำสร้าง Hash ของกรรมการแต่ละท่าน อันนี้เป็นตัวอย่าง

    ต่อไปนี้เป็นวิธีการหาค่า Hash (เขียนด้วย Google App Script)
    Source: https://www.answiz.com/questions/2594/hash-of-a-cell-text-in-google-spreadsheet

    function MD5 (input) {
      var rawHash = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, input);
      var txtHash = '';
      for (i = 0; i < rawHash.length; i++) {
        var hashVal = rawHash[i];
        if (hashVal < 0) {
          hashVal += 256;
        }
        if (hashVal.toString(16).length == 1) {
          txtHash += '0';
        }
        txtHash += hashVal.toString(16);
      }
      return txtHash;
    }

    จากนั้นก็เขียน Script ส่ง Email / LINE แจ้งข้อความที่ต้องการ พร้อม Link ที่กรอกข้อมูล Hash ของแต่ละท่าน

    เป็นอันเรียบร้อย …

    เหมือนเดิม เพิ่มเติมคือ ความซับซ้อน

    คราวนี้ ท่าน ๆ ก็ลงคะแนนกันมา แต่ว่า

    • ช่อง Token นั้น บน Google Form มันแก้ไขได้ ไม่มีทาง Lock ทำให้บางท่าน เอ่อ เผลอ แก้ไข/ลบ/ทดลอง
    • บางท่าน ก็ ลงคะแนน Submit แล้ว อยากเปลี่ยนใจทำไงดี ?

    ดังนั้น ต้องหาทางทำให้

    • ถ้า Hash ไม่ตรงกับข้อมูลที่มี ไม่นับคะแนน
    • ถ้า Hash ตรง แต่ซ้ำ ๆ มา ให้นับคะแนนจาก Record ล่าสุด

    ก็มาร่าย Formula กันหน่อย

    หน้าตา Google Sheets ซึ่งเป็นผลการลงคะแนนที่ได้จาก Google Form

    ไปเขียนสูตรใน Column D โดย จะนำค่าจาก Column C ไปตรวจสอบกับ Hash ซึ่งขอยกตัวอย่างว่า อยู่ที่ Sheet2 ใน Column A โดยใช้สูตร

    =IF(ISNA(VLOOKUP(C2,Sheet2!A:A,1,false)),"Not Match","Match")

    จากภาพแสดงให้เห็นว่า แถว 5 นั้น ค่า Hash ไม่ตรง จึงขึ้นคำว่า “Not Match”

    ต่อไป ก็ Filter เฉพาะที่ Match แล้ว Sort ตาม Timestamp

    สูตรประมาณนี้

    =sort(filter(A2:D6,D2:D6="Match"),3,True)

    คราวนี้ เราจะรู้ต้องหาว่า อันไหนหล่ะ ที่เป็น Record ล่าสุดในแต่ละกลุ่ม

    ใช้สูตรประมาณนี้

    =if(C14=C15,"","1")

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

    สุดท้าย จะก็ได้ผลสรุป Record ที่ Hash ตรง และเป็นการ Submit ล่าสุดของแต่ละกลุ่ม

    สูตรประมาณนี้

    =filter(A14:E17,E14:E17="1")

    ก็เอาไปทำ Chart สรุป ได้แล้ว

    หวังว่าจะเป็นประโยชน์ครับ

  • วิธีสร้างตาราง HTML Table จาก CSV File

    โจทย์คือ ต้องสร้างระบบ เพื่อให้ผู้ใช้ สร้าง โครงสร้างแบบฟอร์ม ด้วย Excel แล้วต้องแปลงให้เป็น Web Page ซึ่ง จะต้องการตกแต่งด้วย Bootstrap

    หน้าตาต้นแบบเป็นแบบนี้ (ในที่นี้ใช้ Google Sheets แต่ก็ทำวิธีการเดียวกันกับ MS Excel)

    ถ้า ใช้วิธี Save As เป็น HTML ตรง ๆ จะได้หน้าตาประมาณนี้

    ซึ่งจะยุ่งยากมาก ในการจัดการ และการควบคุมการแสดงผล

    วิธีการคือ !!!

    1 Save As เป็น CSV

    2 เปิดเว็บ
    http://www.convertcsv.com/csv-to-html.htm

    3 แล้ว Upload ไฟล์ หรือจะ Copy Paste ก็ได้

    4 ก็จะได้ plain HTML

    5 เอาไปประกอบกับ Bootstrap ได้สบาย (ในภาพ ใช้ django template tag ด้วย เลยได้ widget ตามที่กำหนด)

    หวังว่าจะเป็นประโยชน์ครับ

  • วิธีแจ้งเตือนจาก Google Forms เข้า LINE

    ต้องยอมรับว่า ปัจจุบันพฤติกรรมผู้ใช้ “ทั่วไป” จะเปิด LINE อ่านบ่อย และเร็วกว่าการเปิดอ่าน Email

    ต่อไปนี้ เป็นวิธีการ ตั้งค่าที่ Google Forms ว่า เมื่อมีคน Submit แบบฟอร์มมา ให้มา Alert ที่ LINE ของเรา หรือ ส่งเข้า LINE Group ก็ได้ โดยอาศัยความสามารถของ Google App Scripts ที่เรียก REST API ของ LINE

    สร้าง หรือ แก้ไข Google Forms ที่ต้องการ

    จากนั้น ไปที่ “More” หรือ ปุ่มสามจุดแนวตั้งด้านขวามือบน แล้ว คลิกที่ Script Editor

    จากนั้น ใส่ Google App Script

    ตามนี้ ในที่นี้ ตั้งชื่อ Function คือ sendLineNotification

    **** อย่าลืมเปลี่ยน YOUR-TOKEN-GO-HERE ที่จะได้จากขั้นตอนต่อไป ****

    function sendLineNotification(e)
    {
      // เลือกใช้ Form ที่กำลังใช้งานนี้
      var form = FormApp.getActiveForm() 
      
      // รับค่าจาก Form Response
      var itemResponses = e.response.getItemResponses();  
      
      // ข้อความที่แสดงในบรรทัดแรก
      var result="New Response" 
      
      // Loop แต่ละข้อคำถาม และ คำตอบ
      for (var i = 0; i < itemResponses.length; i++) {
        var itemResponse = itemResponses[i];
        
        // ต่อข้อความจากทุกคำถาม เป็นข้อความยาวข้อความเดียว
        // getTitle คือ Question Title แต่ละข้อ
        // getResponse คือ ถามตอบที่ส่งมา
        result += '\n'+itemResponse.getItem().getTitle()+': '+itemResponse.getResponse()
      }
      
      // สร้างรูปแบบที่จะส่งไปให้ LINE -- ในที่นี้คือข้อความอย่างเดียว
      var formData = {
        'message': result,
      };
      
      // LIINE token : ได้มาจาก https://notify-bot.line.me/my/
      // ในตัวอย่างนี้ เป็นแบบ Personal
      var token = 'YOUR-TOKEN-GO-HERE'
      
      // POST แบบใน Token ใน Header ไปยัง LINE Notify REST API
      var options = {
        'method' : 'post',
        'headers' : {'Authorization': "Bearer "+token},
        'contentType': 'application/x-www-form-urlencoded',
        'payload' : formData
      }
      UrlFetchApp.fetch('https://notify-api.line.me/api/notify', options)
    }
    

    ตั้งชื่อ Project, Save แล้ว Run

    ** อย่าลืม ตั้งชื่อ Project แล้ว Save ด้วย

    จากนั้น กดปุ่ม Run เพื่อให้เกิดการขอ Authorization ตาม OAuth Scope

    ซึ่งจะเจอ Error นี้ ก็ไม่เป็นไร (เพราะไม่มี ข้อมูลส่งมาจริง ๆ นั่นเอง) ให้กด Dismiss ไป

    ไปตั้ง Trigger

    ไปที่ เมนู Edit > Current project’s triggers

    ตั้งค่า Trigger ให้ทำงานทันทีที่มีการ Submit แบบฟอร์ม

    Trigger คือการตั้งค่าให้ Script นี้ทำงานอัตโนมัติ เมื่อมีการ Submit แบบฟอร์ม

    คลิก Add Trigger แล้วเลือก Function “sendLineNotification” เลือก “on form submit” และ “Notify me immediately” เพื่อให้เมื่อมีการ Submit แบบฟอร์ม ก็จะแจ้งทาง LINE ทันที

    จากนั้น กดปุ่ม Save

    ผลที่ได้คืออย่างนี้

    ขั้นตอนการขอ LINE Token

    ไปที่เว็บไซต์

    https://notify-bot.line.me/my/

    แล้ว Login ด้วย LINE Account ของท่าน

    จากนั้น คลิกปุ่ม Generate token

    ตั้งชื่อ และ เลือกว่าจะ Notify ไปที่ใด เราสามารถเลือกได้ว่า

    • ให้ Notify ไปที่เราคนเดียว
    • ให้ Notify ไปยัง Group Chat

    *** เราต้องเพิ่ม Line Notify เป็นเพื่อนก่อน และ Invite เข้าไปใน Group Chat นั้น ๆ ด้วย

    จากนั้น คลิกปุ่ม Generate Token

    ก็จะได้ Token ให้คลิกปุ่ม Copy แล้วคลิก Close

    จากนั้น นำไปแทนที่ YOUR-TOKEN-GO-HERE ใน Google App Script ข้างต้น แล้ว Save

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

    เมื่อมีคน Submit แบบฟอร์ม ก็จะมี LINE แจ้งเตือน

    อันนี้ แบบ Basic ง่าย ๆ เดี๋ยวค่อยมาเล่าการใช้งานที่ซับซ้อนกว่านี้

    หวังว่าจะเป็นประโยชน์ครับ

  • djsurvey – Google Forms Alternative #01

    ต่อจาก ddready – แพ็ครวม django + bootstrap4 + crispy form + docker พร้อมใช้งาน ในบทความนี้ ผมได้พยายามทำให้ใช้งาน Django ได้ง่ายขึ้น จนได้ แบบสำรวจอย่างง่าย พร้อมใช้งาน ใน 3 ขั้นตอน

    Prerequesite

    ติดตั้ง Python 3.6+ หรือ ใช้ Python Container แล้ว

    Repository

    https://github.com/nagarindkx/djsurvey

    ง่าย ๆ 3 ขั้นตอน

    1. Clone Repository

    ใช้คำสั่ง git

    git clone https://github.com/nagarindkx/djsurvey.git

    หรือ Download ไปก็ได้

    https://github.com/nagarindkx/djsurvey/archive/master.zip

    2. กำหนดข้อคำถามในแบบสำรวจ

    แก้ไขไฟล์

    /code/main/survey/models.py

    ตัวอย่างเช่น แบบสำรวจ ประกอบด้วย

    1. ชื่อ
    2. อีเมล
    3. เพศ
    4. วันเดือนปีเกิด
    5. ผลไม้ที่ชอบ
    6. ข้อเสนอแนะ

    ก็สร้าง Model ตามนี้ ( แรก ๆ อาจจะรู้สึกน่ากลัว แต่พอเข้าใจแล้ว มันง่ายมาก)

    from django.db import models
    class Survey(models.Model):
        fullname = models.CharField(
            verbose_name="ชื่อ",
            max_length=255,  blank=False)
        email = models.EmailField(
            verbose_name="อีเมล",
            blank=False)
        gender = models.CharField(
            verbose_name="เพศ",
            max_length=1,    blank=False,
            choices=[('F', 'หญิง'), ('M', 'ชาย')],
            default='F',
        )
        birthdate = models.DateField(
            verbose_name="วันเดือนปีเกิด",
            auto_now=False,  blank=False)
        fruit = models.CharField(
            verbose_name="ผลไม้ที่ท่านชอบ",
            max_length=1,    blank=False,
            choices=[('a', 'แอปเปิ้ล'), ('b', 'มะละกอ'),
                     ('c', 'กล้วย'), ('d', 'ส้ม')],
            default='c',
        )
        comment = models.TextField(
            verbose_name="ข้อเสนอแนะ",
            blank=True)

    แนะนำให้ใช้ Visual Studio Code จะทำงานได้ง่ายมาก

    3. Migrate แล้ว Run

    ใช้คำสั่งต่อไปนี้

    python manage.py migrate
    python manage.py runserver 0:8080

    ชมผลงาน

    http://localhost:8080/survey/

    หรือ ตกแต่งอีกนิดหน่อย ก็จะได้แบบนี้

    http://localhost:8080/advancedsurvey/

    สำหรับผู้ที่ใช้ Docker สามารถ ทำตามขั้นตอนใน แนวทางการพัฒนา Web Application ด้วย django จาก local docker สู่ Google Cloud Run เพื่อนำขึ้น Google Cloud Run ได้เลย (แต่ต้องเชื่อมกับ Database จริง ๆ ก่อนนะ – โปรดติดตามตอนต่อไป)

    คุณกำลังเจอปัญหาเหล่านี้อยู่ใช่ไม๊ ?

    • Google Forms ก็ง่ายดีแหล่ะ แต่ จะทำอย่างไรให้เก็บข้อมูลไว้ในฐานข้อมูลได้ ?
    • อยากให้ ผู้ใช้งาน Upload เอกสารเข้ามา / แก้ไขข้อมูล ซึ่ง Google Forms ก็ทำได้ แต่ต้อง Login ด้วย Google Account ก่อน จึงจะทำได้
    • Google Forms ก็ทำ Conditions ได้แหล่ะ (Go to section base on answer) แต่ ถ้าจะให้มีการคำนวนที่ซับซ้อนกว่านั้น ก่อนจะเลือกคำถามถัดไป จะทำอย่างไร ?

    ปัญหาเหล่านี้จะหมดไป เมื่อคุณใช้ Django !

    • ติดตั้งได้ บน Web Server ของคุณ!
    • Login ด้วย Facebook/Twitter/Google/Line หรือ Email หรือ จะเป็น Single Sign-On ก็ยังได้
    • ทุกอย่างสามารถ Customize ได้ ทำแบบสอบถามที่ซับซ้อนได้

    ไว้เจอกันในตอนต่อ ๆ ไปครับ

  • ddready – แพ็ครวม django + bootstrap4 + crispy form + docker พร้อมใช้งาน

    สำหรับใครที่อยากจะลองพัฒนา Web Application ด้วย django web framework ผมได้รวบรวมเป็นชุดเริ่มต้น ซึ่งจะสามารถสร้าง Responsive Web และ มีแบบฟอร์มที่สวยงามด้วย crispy form มาเรียบร้อย ใช้งานได้ทั้ง แบบ Python บนเครื่อง และ แบบ Docker ลองทำตามดูได้ครับ

    ต้นแบบ มี Bootstrap 4 พร้อมใช้งาน
    มี Login Form มาให้เลย
    เข้ามาในส่วนของ Profile และ Logout ได้

    Repository

    สามารถเปิด URL ต่อไปนี้ เพื่อไป Download หรือ จะใช้ git clone ก็ได้

    https://github.com/nagarindkx/ddready.git

    https://gitlab.psu.ac.th/kanakorn.h/ddready.git

    จากนั้น ให้เปิด cmd ไปยังตำแหน่งที่ clone ลงมา

    สำหรับผู้ที่ติดตั้ง python อยู่แล้ว

    แล้วใช้คำสั่งต่อไปนี้

    pip install -r requirements.txt
    cd code
    cd main
    waitress-serve --listen *:8080 main.wsgi:application

    สำหรับผู้ที่จะใช้ Docker

    บน Windows ใช้คำสั่งต่อไปนี้

    set PROJECTNAME="projectname"
    set GCP-PROJECT-ID="gcp-project-id"
    set SERVICE="service"
    docker build --rm -f "Dockerfile" -t %PROJECTNAME%:dev .
    docker run -d -v %CD%\code:/code -p 8080:8080 --name %PROJECTNAME% %PROJECTNAME%:dev
    docker exec -it %PROJECTNAME% /bin/sh -c "[ -e /bin/bash ] && /bin/bash || /bin/sh"

    ทดสอบใช้งาน

    http://localhost:8080

    ในตอนต่อไป จะแนะนำวิธีการสร้าง แบบสอบถาม ทดแทนการใช้ Google Forms ครับ

  • แนวทางการพัฒนา Web Application ด้วย django จาก local docker สู่ Google Cloud Run

    ในการพัฒนาแอพพลิเคชั่น เราก็จะเจอปัญหานึงเสมอ ๆ คือ เวอร์ชั่น (Version) ของเครื่องมือที่ใช้ในการพัฒนานั้น แต่ละโปรเจคมีความแตกต่างกัน เช่น ในกรณีของ การพัฒนา Web Application ด้วย django web framework เราอาจจะอยากใช้ python รุ่นล่าสุด คือ 3.8 แต่ในขณะเดียวกัน เมื่อหลังบ้านต้องการไปติดต่อ Tensorflow 2.0 ซึ่งยังต้องใช้งานกับ Python 3.6 เป็นต้น วิธีแก้ไขปัญหาทั่วไปคือ ติดตั้ง package ‘virtualenv’ เพื่อให้การพัฒนาแต่ละโปรเจค มี Environment แตกต่างกันได้

    แต่จากการใช้งานจริง พบว่า สุดท้าย ตอนเอาไป Production บนเครื่อง Server ก็ต้องตามไปติดตั้งเครื่องมือ และรุ่นที่ถูกต้อง แม้ใน Python จะมีคำสั่ง pip install -r requirements.txt ก็ตาม แต่ก็ยังไปติดปัญหาว่า OS ของเครื่องที่จะ Production นั้น รองรับรุ่นของเครื่องมืออีกหรือไม่ด้วย

    แนวทางการใช้ Container ด้วย Docker จึงเป็นที่นิยม เพราะ เมื่อเราพัฒนาเสร็จแล้ว สามารถ Pack เข้าไปใน Container แล้วเอาไป Deploy ได้ โดย (แทบจะ) ไม่ต้องกังวลกับ Environment ปลายทาง อีกทั้ง ยังสามารถทดสอบ Environment ใหม่ ๆ ก่อนจะ Deploy ได้ด้วย เช่นการเปลี่ยนรุ่นของ Python เป็นต้น

    ในบทความนี้ จะนำเสนอ แนวทางการสร้าง docker container เพื่อใช้เป็นฐานในการพัฒนา django และ สามารถต่อยอด ติดตั้ง package อื่น ๆ ตามต้องการ ตั้งแต่ Development ไปจนถึง Deployment สู่ Serverless Environment อย่าง Google Cloud Run

    สร้าง Development Container

    เริ่มจาก สร้างโฟลเดอร์ใหม่ขึ้นมา ในนั้นมี 2 ไฟล์ คือ Dockerfile และ requirements.txt กับ โฟลเดอร์ ชื่อ code

    Dockerfile

    • ใช้ image ของ python เป็นรุ่น 3.7-slim ซึ่งตัดส่วนที่ไม่จำเป็นออกแล้ว (ไม่ใช้ alpine เนื่องจาก พบรายงานว่า แม้จะมีขนาดเล็กกว่า แต่ถูกจำกัดทรัพยากรบางอย่าง ทำให้ทำงานได้ช้ากว่า)
    • สร้าง /code แล้วเข้าไปใช้พื้นที่นี้ (เหมือนคำสั่ง mkdir /code ; cd /code อะไรประมาณนั้น)
    • สั่งให้ copy ไฟล์ requirements.txt ไปใช้ที่ root ( / )
    • จากนั้น Upgrade คำสั่ง pip เป็นรุ่นล่าสุด แล้ว ติดตั้ง package ตามที่กำหนดใน requirements.txt
    • เปิด Port 8080 ไว้ เพื่อใช้ในการทดสอบ และเป็นไปในแนวทางเดียวกับการใช้บน Google Cloud Run ต่อไป
    FROM python:3.7-slim
    WORKDIR /code/
    COPY requirements.txt /
    RUN pip install -U pip \
        && pip install -r /requirements.txt
    EXPOSE 8080

    requirements.txt

    ในการพัฒนา django เมื่อทำการติดตั้ง package ใดเพิ่มเติมด้วยคำสั่ง pip install ก็จะบันทึกรายการ พร้อมรุ่นของ package มาในไฟล์นี้ ในที่นี้ ใช้ django, guincorn และ whitenoise เป็นหลัก (จะมีรายการ dependency ติดเข้ามาด้วย)

    Django==2.2.6
    gunicorn==19.9.0
    pytz==2019.3
    sqlparse==0.3.0
    whitenoise==4.1.4

    จากนั้นใช้คำสั่งต่อไปนี้ สร้าง (build) docker image จากไฟล์ Dockerfile ข้างต้น โดยมี option ที่เกี่ยวข้องดังนี้

    docker build --rm -f "Dockerfile" -t mydjango:dev .
    • –rm เมื่อ build แล้ว ก็ลบ container ชั่วคราวทิ้ง
    • -f กำหนดว่าจะเรียกจากไฟล์ใด วิธีนี้ มีประโยชน์ เวลาที่จะต้องมี Dockerfile ทั้ง Development และ Production ในโฟลเดอร์เดียวกัน ซึ่งจำเป็นต้องใช้ชื่อไฟล์ที่แตกต่างกัน
    • -t เป็นตั้งชื่อ docker image และ ชื่อ tag
    • . คือ ให้ build จากตำแหน่งปัจจุบัน

    ขั้นตอนนี้จะได้ docker image ชื่อ mydjango และมี tag เป็น dev แล้ว้

    (ในที่นี้ พัฒนาบนเครื่องคอมพิวเตอร์ที่เป็น Windows 10 ซึ่ง %CD% จะให้ค่า Current Directory แบบ Absolute path ออกมา เช่นเดียวกับบน Linux ที่ใช้ $(pwd) )

    ต่อไป สั่ง run ด้วยคำสั่ง และ options ดังต่อไปนี้

    docker run --rm -it -p 8080:8080  -v %CD%\code:/code  mydjango:dev bash
    • –rm เมื่อจบการทำงาน ก็ลบ container ชั่วคราวทิ้ง
    • -it คือ interactive และเปิด TTY
    • -p เพื่อเชื่อม port 8080 จากภายนอก เข้าไปยัง port 8080 ภายใน container
    • -v เพื่อเชื่อม Volume หรือโฟลเดอร์ของเครื่อง host กับ /code ภายใน container ขั้นตอนนี้สำคัญ
    • bash ข้างท้าย เพื่อส่งคำสั่ง เรียก bash shell ขึ้นมา ซึ่งจะสัมพันธ์กับ -it ข้างต้น ทำให้สามารถใช้งาน shell ภายใน container ได้เลย

    ผลที่ได้คือ bash shell และ อยู่ที่ /code ภายใน container

    root@757bcbb07c7f:/code#

    ตอนนี้ เราก็สามารถสร้าง django ได้ตามปรกติแล้ว (คลิกดูตัวอย่างเบื้องต้น) แต่ในตัวอย่างนี้ จะเริ่มจากการสร้าง project ชื่อ main เพื่อใช้ในขั้นตอนต่อไป ด้วยคำสั่งต่อไปนี้

    django-admin startproject main
    cd main

    ในระหว่างการพัฒนา สามารถใช้คำสั่ง runserver โดยเปิด Port 8080 ใน container เพื่อทดสอบได้ดังนี้ (สอดคล้องตามที่อธิบายข้างต้น)

    python manage.py runserver 0.0.0.0:8080

    สร้าง Production Docker Image

    คำสั่งข้างต้น สามารถใช้ได้เฉพาะขั้นตอนการพัฒนา แต่เมื่อพัฒนาเสร็จแล้ว ควรใช้ Application Server แทน ในที่นี้จำใช้ gunicorn แต่ก่อนอื่น จะต้องปรับ Configuration ของ django ให้พร้อมในการ Deployment ก่อน

    main/settings.py

    # แก้ไข
    DEBUG = False
    ALLOWED_HOSTS = ['localhost','SERVICE-ID.run.app']
    
    # เพิ่ม
    MIDDLEWARE = [
        ...
        # Whitenoise
        'whitenoise.middleware.WhiteNoiseMiddleware',
        ...
    ]
    # เพิ่ม
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')

    มีเพิ่มเติมคือ whitenoise ซึ่งเป็น package สำหรับจัดการเกี่ยวกับการให้บริการ static file ในตัว มิเช่นนั้นจะต้องไปตั้งค่าใน Web Server ให้จัดการแทน

    เมื่อเราตั้งค่า DEBUG = False จะต้องกำหนด ALLOWED_HOSTS เสมอ ในที่นี้กำหนดให้เป็น localhost และ Production URL (SERVICE-ID.run.app) ที่จะเกิดขึ้นเมื่อสร้าง Service บน Google Cloud Run ครั้งแรกไปแล้ว (ค่อยกลับมาแก้ไขแล้ว Revision อีกครั้ง)

    ใช้คำสั่งต่อไปนี้เพื่อรวบรวม static files ต่าง ๆ มาไว้ในที่เดียวกัน ในที่นี้ คือที่ โฟลเดอร์ static

    python manage.py collectstatic

    ทดสอบ Production ด้วย gunicorn ด้วยคำสั่งต่อไปนี้

    gunicorn --bind 0.0.0.0:8080 main.wsgi

    ทดสอบเรียก Local Admin Console ( http://localhost:8080/admin ) ดู ถ้าเรียก static file เช่นกลุ่ม css ได้ ก็พร้อมสำหรับจะนำขึ้น Google Cloud Run ต่อไป

    สุดท้าย สร้าง Production Dockerfile และ สรุป requirements.txt ดังนี้

    Dockerfile.production

    FROM python:3.7-slim
    WORKDIR /code
    COPY ./code/* ./
    RUN pip install -U pip \
        && pip install -r requirements.txt
    EXPOSE 8080
    CMD [ "gunicorn","--bind","0.0.0.0:8080", "main.wsgi"]

    requirements.txt

    pip freeze > requirements.txt

    จากนั้น ใช้คำสั่งต่อไปนี้ เพื่อสร้าง Production Docker Image (ออกมาจาก Development Container shell ก่อน) โดยจะใช้ tag เป็น latest

    docker build -t mydjango:latest -f "Dockerfile.production" .

    ส่ง Production Docker Image ขึ้น Google Container Registry

    Google Cloud Run จะเรียกใช้ docker image ที่อยู่บน Google Container Registry เท่านั้น

    • เปิด Google Console
    • สร้าง Project ใหม่ และ ตั้งค่า Billing
    • เปิดใช้งาน Google Cloud Run และ Google Container Registry
    • ติดตั้อง Google Cloud SDK เพื่อให้สามารถ push ขึ้นได้ และ ยืนยันตัวตนด้วย Google Account

    แล้วใช้คำสั่งต่อไปนี้ เพื่อ tag

    docker tag mydjango:latest gcr.io/YOUR-GCP-PROJECT-ID/SERVICE-NAME
    • YOUR-GCP-PROJECT-ID เป็น Project ID ที่สร้างขึ้น
    • SERVICE-NAME ชื่อ service ที่จะสร้าง

    แล้วก็ push ขึ้น Google Container Registry

    docker push gcr.io/YOUR-GCP-PROJECT-ID/SERVICE-NAME

    สร้าง Google Cloud Run Service

    สร้าง Service โดยเลือก Image ที่ต้องการ

    เมื่อเสร็จแล้วจะได้ URL อย่าลืมเอาไปแก้ไขใน main/settings.py ในส่วนของ ALLOWED_HOSTS แทน SERVICE-ID.run.app

    จากนั้น build, tag และ push ขึ้น Google Cloud Registry อีกครั้ง แล้ว Deploy New Revision เป็นอันเรียบร้อย

    อันนี้เป็นการ Proof of Concept ในบทความต่อไป จะนำเสนอตัวอย่างการใช้งานจริงครับ

  • วิธีการระบบการจองตั๋ว (Ticket Reservation System ) alf.io

    ALF.io เป็น Open Source Ticket Reservation System แบบ Web Application

    • ผู้ดูแลระบบสามารถสร้าง Event อย่างเช่นงานประชุมสัมนา เมื่อเปิดรับลงทะเบียนเข้าร่วมงานได้ (แบบเก็บเงินหรือฟรีก็ได้) กำหนดจำนวนที่นั่งได้
    • ผู้เข้าร่วมงานกรอกข้อมูลส่วนตัว (และชำระเงินก็ได้)
    • ระบบจะส่ง Ticket ไปให้ทาง Email ในรูปแบบ QR Code
    • เมื่อถึงวันงาน เจ้าหน้าที่ที่หน้างานติดตั้ง Application บน Smartphone ของตนเอง (ซึ่งต้องลงทะเบียนกับระบบ)
    • ผู้เข้าร่วมงานแสดง QR ของตนเองให้เจ้าหน้าที่ Scan ได้เลย

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

    ต่อไปนี้ เป็นวิธีการติดตั้ง alf.io รุ่น 2.0-M1-1909 บน Windows 10 Education และ Windows Server 2016

    Prerequisite

    1. Java JDK
      เนื่องจาก alf.io พัฒนาด้วย Java รุ่น 12 จึงแนะนำให้ติดตั้ง Oracle JAVA SE รุ่นล่าสุด (ปัจจุบันคือ Java SE 13) โดยสามารถ download จาก Link นี้
      https://www.oracle.com/technetwork/java/javase/downloads/index.html
    2. Database Server
      สำหรับ Database แนะนำให้ใช้ Postgresql (ปัจจุบัน รุ่นล่าสุดคือ รุ่น 11) จากนั้น
      – สร้าง Database ชื่อ alfio
      – User ชื่อ alfio ให้สามารถสิทธิ์ CREATE ได้ โดยสามารถ Download จาก Link นี้
      https://www.postgresql.org/download/windows/

    ขั้นตอนการติดตั้ง

    1. สร้าง Folder
      เช่น C:\alfio เป็นต้น
    2. Download alf.io
      จาก https://github.com/alfio-event/alf.io/releases/tag/2.0-M1-1909
      เลือกไฟล์ชื่อ alfio-2.0-M1-1909-boot.war
      เก็บไว้ใน Folder ที่สร้างขึ้น (ในที่นี้ C:\alfio)
    3. สร้างไฟล์ Configuration
      สร้างไฟล์ชื่อ application.properties เพื่อกำหนดค่าเกี่ยวกับ Database ได้แก่ Host, Database, User, Password และอื่น ดังตัวอย่าง (อย่าลืมเปลี่ยน Password ให้ตรงกับที่ตั้งไว้)
    datasource.dialect=PGSQL
    datasource.driver=org.postgresql.Driver
    datasource.url=jdbc:postgresql://localhost:5432/alfio
    datasource.username=alfio
    datasource.password=ALFIO_PASSWORD_HERE
    datasource.validationQuery=SELECT 1
    spring.profiles.active=dev

    Run !

    ด้วยคำสั่ง

    java -jar alfio-2.0-M1-1909-boot.war

    หน้า Event

    http://localhost:8080/

    หน้า Admin

    http://localhost:8080/admin

    ตัวอย่างการใช้งาน

    https://ticket.psu.ac.th/event/KPC2019/

    เมื่อ Admin ของงาน (แต่ละ Server มีได้หลาย Event) สร้าง Ticket ให้ หรือ ผู้สนใจเข้าร่วมงาน เข้ามาสมัครร่วมงานเองก็ได้ จะได้ Email แจ้งดังนี้

    ซึ่งจะมี QR Code แนบมา (ที่เห็นเป็น # เพราะยังไม่ได้ใส่ Font ภาษาไทยในการ Generate PDF ให้ถูกต้อง — ไว้ค่อยเล่าให้ฟัง)

    เมื่อถึงวันงาน เจ้าหน้าที่รับลงทะเบียน จะติดตั้ง Application ลงใน Smartphone ของตนเอง แล้วมีการสร้าง Account เพื่อรับ Check-in (ค่อยมาลงรายละเอียด)

    ก็สามารถคลิกที่ Scan Attendees QR Code ของผู้มาลงทะเบียนเข้างานได้เลย

    หวังว่าจะเป็นประโยชน์ครับ