Category: Automation System

  • ELK #09 Anomaly Detection (Case Study)

    ระบบ PSU Email ให้บริการผู้ใช้ของมหาวิทยาลัยสงขลานครินทร์ ซึ่งมีการใช้งานจากทั่วโลก ทั้งระบบประกอบขึ้นจากคอมพิวเตอร์หลายเครื่อง การจะตรวจสอบ Log เมื่อเกิด Incident ขึ้น อาจจะต้องใช้ระยะเวลานาน และเป็นการยากพอสมควรที่จะเชื่อมโยงความสัมพันธ์ของเหตุการณ์ และสรุปออกมาเป็นรายงานได้ จึงเริ่มใช้ ELK สำหรับรวบรวม Log ของทั้งระบบไว้ที่ส่วนกลาง และพัฒนาต่อยอดเพื่อการตรวจจับความผิดปรกติต่าง ๆ ได้

    ในบทความนี้ จะนำเสนอวิธีการใช้ ELK เพื่อตรวจจับ การ Login ที่ผิดปรกติบน PSU Email โดยจะสนใจ ผู้ใช้ที่มีการ Login จากนอกประเทศเป็นหลัก

    การส่ง Log จาก Server เข้า ELK

    ที่เครื่อง Server แต่ละเครื่อง กำหนดให้ส่ง Log จาก /etc/rsyslog.d/50-default.conf เข้าไปที่ your.logstash.server:port ตามที่กำหนดไว้

    การสร้าง Logstash Filter

    ที่ Logstash Server

    • Input เพื่อรับข้อมูลจาก syslog ที่ port ที่ต้องการ เช่นในที่นี้เป็น 5516 เป็นต้น
    • Filter ใช้ Grok Plugin เพื่อจับข้อมูล จาก message แบ่งเป็นส่วน ๆ ตามลักษณะ แล้วตั้งชื่อตาม Field ตามต้องการ ในที่นี้คือ description, username, domainname, clientip, actiondate, actiontime เป็นต้น (ตัวที่สำคัญในตอนนี้คือ username และ clientip)
    • Output ตั้งว่าให้ส่งผลไปยัง Elasticsearch ที่ “your.elasticsearch.server” ที่ port 9200

    [ตรงนี้มีกระบวนการบางอย่าง ซึ่งค่อยมาลงรายละเอียด]

    เมื่อมี Log ไหลเข้าสู่ Logstash และ ถูกประมวลผลแล้ว ก็จะเข้าสู่ Elasticsearch แล้ว ก็นำไปใช้งานบน Kibana

    หลังจากนั้น สามารถ Search ข้อมูล และใส่ Fields ที่สนใจ เช่น Time, Username, geoip.country_name และ description ได้ แล้ว Save เอาไว้ใช้งานต่อ ในที่นี้ ตั้งชื่อว่า squirrelmail-geoip

    จากนั้น สามารถเอาไปสร้างเป็น Visualization แบบ Coordinate Map ได้ เช่น ดูว่า มีการ Login Success / Failed Login / Sent จากที่ไหนบ้างในโลก

    จะเห็นได้ว่า ส่วนใหญ่ ใช้งานจากในประเทศไทย (วงกลมสีแดงเข้ม ๆ) ส่วนนอกประเทศ จะเป็นวงสีเหลืองเล็ก ๆ

    การตรวจหาการใช้งานที่ผิดปรกติ

    สร้าง Search ใหม่ กรองเฉพาะ ที่มี (exist) Username และ ไม่เป็น N/A และ มี (exist) geoip.country_code และ ไม่ใช่ Thailand แล้ว Save ไว้ใช้งานต่อไป ในที่ตั้งชื่อว่า squirrelmail-geoip-outside-th

    จากนั้น เอาไปสร้าง Visualization แบบ Vertical Bar
    กำหนดให้
    Y Axis เป็นจำนวน
    X Axis เป็น Username
    โดยที่ Group by geoip.country_name และ description
    ก็จะทำให้รู้ว่า ใครบ้างที่ มีการใช้งานนอกประเทศ และ เป็นการใช้งานแบบไหน

    จะเห็นได้ว่า จะมีบางคนที่ แสดงสีแค่สีเดียว กับบางคนมีหลายสี เนื่องจาก มีหลายประเทศ และ หลายประเภทการใช้งาน เราสามารถ กรองเอาเฉพาะ ข้อมูลที่สนใจได้ โดยคลิกที่ Inspect แล้วกดเครื่องหมาย + กับข้อมูลที่ต้องการ เช่น description ที่เป็น “Failed webmail login” ก็ได้

    ก็จะกรองเฉพาะ Username ที่มีการ Login จากต่างประเทศ แต่ไม่สำเร็จ จากภาพด้านล่าง แสดงว่า 3 คนนี้ น่าจะโดนอะไรเข้าแล้ว

    หรือ ถ้าจะกรองข้อมูล เฉพาะคนที่ “Failed webmail login” และ “Message sent via webmail” ก็ได้ แต่ต้องเปลี่ยน ชนิดการ Filter เป็น “is one of”

    ผลที่ได้ดังภาพ แต่เนื่องจาก ก็ยังเป็น 3 คนนี้อยู่ จะเห็นได้ว่า คน ๆ เดียว (ซ้ายสุด) มีการ Login จากหลายประเทศ ภายใน 24 ชั่วโมง

    ต่อไป ถ้าเราสนใจเฉพาะ คนที่ “ส่งอีเมล” จากนอกประเทศ ในเวลาที่กำหนด จะได้ผลประมาณนี้

    พบว่า คนซ้ายสุด คนเดิมนั่นแหล่ะ แต่เราจะมาดูรายละเอียด ก็คลิกที่ปุ่ม Inspect แล้ว เลือก Include เฉพาะ Username นั้น

    ก็พบว่า คนนี้มีการส่ง email ออกจากประเทศ USA, Canada, Panama, Argentina, Mexico แล้วบินมา UK ภายในวันเดียว –> ทำได้ไง !!! (ดังภาพด้านล่าง)

    เมื่อลองตรวจสอบ ก็จะพบว่า Username นี้ มีพฤติกรรม ส่ง Spam จริง ๆ ก็จะจัดการ “จำกัดความเสียหาย” ต่อไป

    วิธีการที่กล่าวมาข้างต้น สามารถสร้างเป็น Process อัตโนมัติ (เว้นแต่ขั้นตอนการ จำกัดความเสียหาย จะ Automatic ก็ได้ แต่ตอนนี้ขอ Manual ก่อน) เอาไว้สำหรับ Monitoring ได้ โดยอาจจะสั่งให้ เฝ้าดู 1 ชั่วโมงล่าสุด และ Refresh ทุก 1 นาที ดังภาพ

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

    ส่วนรายละเอียด คอยติดตามตอนต่อไปครับ

  • Should Be Equal ใน Robot Framework

    วันนี้จะมาทดลองใช้ Should Be Equal (การเปรียบเทียบ) ใน Robot framework กันค่ะ ก่อนจะถึงคำสั่งเปรียบเทียบ เราก็ต้องเขียน Test Case อื่น ๆ กันก่อน งั้นวันนี้จะเขียนแบ่ง Test Case ให้อ่านง่าย ๆ กันไปเลย เพื่อเพื่อน ๆ จะได้นำไปประยุกต์ใช้งานกันได้ค่ะ

    สิ่งที่ต้องใช้ในวันนี้ คือ Notpad++ หรือ Tool อื่น ๆ ที่เพื่อน ๆ ถนัด วันนี้เราจะใช้ Visual Studio Code กันค่ะ (เพราะเหนื่อยกับการรันผ่าน command line แล้ว) มาเริ่มกันเลยดีกว่า

    จะเห็นว่า เรามีการตั้งชื่อ Test Case ให้อ่านง่าย เพื่อจะให้รู้ว่าแต่ละขั้นเราทำอะไร ตอนเป็น Report จะได้ดูง่ายเข้าไปอีก ค่อนไปดู Report ตอนท้าย

    คำสั่งนี้จะตรวจสอบว่าค่าที่ได้ตรงกันมั๊ย จะเห็นว่าเราเขียน Test Case เป็นภาษาไทยได้นะเออ จากรูปเปรียบเทียบค่าจาก xpath ที่ locator h1 ตามคำสั่ง //h1[@class=”main-header”]  เท่ากับ “ROBOT FRAME WORK/” หรือไม่

    Locator ที่กล่าวคือตำแหน่งตามรูปข้างบน คราวนี้เราลองปรับให้ ${expect} ไม่ใช่ค่าเดียวกับ locator ที่เราอ้างถึง

    จะเห็นได้ว่าที่ log console มีการแสดงผลในการเปรียบเทียบว่าไม่เท่ากัน ไปดู Report กันซะหน่อยว่าเป็นยังไง

    Report ก็ดูง่ายมากเลยเห็นมั๊ยหล่ะ ^_^

  • อ่านข้อความจากภาพ ด้วย Tesseract-OCR

    OCR หรือ Optical Character Recognition จริง ๆ ก็มีใช้กันมานานมากแล้ว แต่การใช้งานก็จะผูกติดกับ Hardware พอสมควร แต่ในปัจจุบัน เราสามารถใช้ความรู้ด้าน Machine Learning / Deep Learning เพื่อให้คอมพิวเตอร์เข้าใจภาพได้ และสามารถนำมาประกอบกับเป็น Software สำหรับใช้งานของตนเองได้

    ในบทความนี้ ทดลองใช้ Tesseract-OCR พี่พัฒนาโดย Google อ่านภาพ เอกสารที่ Print จาก Computer เป็นกระดาษ -> มีการเซ็นต์ชื่อ -> นำกลับมา Scan อีกครั้ง

    *** มันเป็น Paperless ตรงไหน ? กฏหมาย Digital Signature ก็มีแล้วนะ ***

    เอาเป็นว่า ดูผลงาน

    ด้านซ้าย เป็นเอกสารที่ Scan จากกระดาษ ด้านขวาเป็นผลการอ่านด้วย Tesseract-OCR

    อ๊ะ บางคนบอกว่า เคยใช้แล้ว แต่ทำไมไม่ได้ผลอย่างนี้หล่ะ (โดยเฉพาะ ภาษาไทย) อิอิ มันมีรายละเอียดพอสมควร ไว้มีเวลาจะมาเล่าให้ฟัง

    แต่แบบนี้ ต้องทำอะไรเพิ่มก่อน จึงจะอ่านได้

    ต้นฉบับ มีตราประทับงี้ ตัวอักษรเล็ก เลขไทย ปน เลขอังกฤษ ปน ภาษาอังกฤษ อันนี้ ยากหน่อย

    ผลก็พอจะอ่านได้ แต่ต้องทำอะไรเพิ่มก่อนจะให้ OCR อ่าน –> อันนี้คือยังไม่ทำอะไรเพิ่ม

    ผล แบบยังไม่ได้ Preprocessing ใด ๆ สังเกตว่า ตัว ตราประทับ ทำให้เกิดปัญหา และ ตัวอักษรที่เล็กมาก ๆ ทำให้ OCR อ่านผิดได้ แต่มีทางแก้ไข

    มันไม่มีคำว่า “ก็ง่าย ๆ” หรอก หึ หึ หึ

  • วิธีใช้ Google Calendar เพื่อบันทึกปฏิบัติงาน และใช้ Google Sheets เพื่อรายงานผลการปฏิบัติงาน

    บทความนี้ นำเสนอแนวทางที่ผมใช้ในการ “บันทึกการปฏิบัติงาน” และ “รายงานผลการปฏิบัติงาน” เพื่อนำไปกรอกในระบบ TOR ของมหาวิทยาลัยสงขลานครินทร์

    เครื่องมือที่ใช้

    1. Google Calendar
    2. Google Sheets
    3. Google Sheets Add-ons ชื่อ “Timesheet”
    4. Google Keep

    เป้าหมาย

    การบันทึกผลปฏิบัติงาน เพื่อ รายงานผลการปฏิบัติงานในระบบ TOR

    ระบบ TOR ของมหาวิทยาลัยสงขลานครินทร์

    TOR Online – ระบบประเมินผลการปฏิบัติงาน มหาวิทยาลัยสงขลานครินทร์

    ผู้ปฏิบัติงาน จะต้องตกลงกับหัวหน้าฝ่าย ว่า รอบ TOR นี้ เราจะทำอะไร และมีเป้าหมายอย่างไรบ้าง เอาเป็นว่า … จะกำหนดเป็น “ภาระงาน” แบ่งเป็น 3 ด้าน ได้แก่
    1. งานประจำ
    2. งานเชิงพัฒนา/งานพิเศษ
    3. ผลงานอื่นๆ(ตามที่คณะกำหนด)

    ในแต่ละ หัวข้อใหญ่ ก็จะแจกแจงว่า ทำอะไร เป็นสัดส่วนเท่าไหร่ เช่น

    1.1 5ส
    1.2 ประชุมติดตามงานของทีมงาน

    อะไรทำนองนั้น

    หัวข้อย่อย ของ ผลงานประจำ — มันสำคัญตรงการกรอก ผลการปฏิบัติงาน และ เอกสาร/ข้อมูลอ้างอิงนี่แหล่ะ

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

    ขอยกตัวอย่าง หัวข้อ “ภาระงาน” ของผมใน TOR ปี 2562
    ( TwT )

    
    1.1 5 ส
    1.2 ประชุมติดตามงานของทีมงาน
    1.3 ติดตั้ง Server/Software บริการ PSU Email
    1.4 เฝ้าระวังบริการ PSU Email
    1.5 ตอบคำถาม/ให้คำแนะนำบริการ PSU Email
    1.6 ประยุกต์ใช้ DialogFlow พัฒนา Chatbot กับ Facebook Page ของศูนย์คอมพิวเตอร์
    1.7 ประยุกต์ใช้ Deep Learning ในการคัดกรองอีเมลขยะ
    1.8 พัฒนาระบบหน่วยตรวจสอบภายใน
    1.9 โครงการปรับปรุงความปลอดภัย PSU Email
    1.10 โครงการพัฒนาอะไรสักอย่าง
    
    2.1 งานปรับปรุงและพัฒนา
    2.2 Helpdesk
    2.3 Internal Auditor
    
    3.1.1 อบรมประชุมที่ศูนย์จัด
    3.1.2 กิจกรรมมหาวิทยาลัย
    3.1.3 กิจกรรมศูนย์คอมพิวเตอร์
    3.1.4 กรรมการ/คณะทำงาน
    3.2   กิจกรรมกลุ่มงาน
    3.2.1 ประชุมติดตามโครงการ

    แล้วเราจะบันทึกผลการปฏิบัติงานอย่างไร ให้ ง่าย และสามารถ นำมากรอกใน TOR ได้ด้วย

    เริ่มจาก Google Keep

    เอาข้อหัวย่อย ของภาระงานข้างต้น มาสร้างเป็น Note ใหม่ใน Google Keep ตั้งหัวข้อว่า TOR 2562 (หรือใครอยากจะทำไว้ใช้ของ TOR 2563 ก็ค่อยลองทำดู)

    ต่อไป เราจะสร้าง Label ของแต่ละหัวข้อย่อย โดยการใส่ # ไว้ด้านหน้า หัวข้อย่อย เช่น
    1.10 โครงการพัฒนาอะไรสักอย่าง
    เป็น
    [Update – สำหรับให้รายงานสวยงามยิ่งขึ้น แนะนำให้ Replace ” ” ด้วย “_”]
    #1.10_โครงการพัฒนาอะไรสักอย่าง

    พอใส่ # หน้า 1.10 แล้ว Google Keep จะขึ้น Popup ให้สร้าง Label “1.10” เราก็สร้างไว้ (มันมีเหตุผล ทำตามไปก่อน เดี๋ยวเล่าให้ฟัง)

    Popup ให้สร้าง Label “1.10”

    ทำจนครบทุกข้อ เราจะได้ Note ใน Google Keep อย่างนี้
    จากนั้น ให้คลิก รูป Pin เพื่อปักหมุดเอาไว้
    แล้วกดปุ่ม Close ด้านล่างได้เลย

    [Update: ใน Google Keep สามารถเอาภาพ เช่น เกณฑ์การประเมิน การพิจารณาว่าเรื่องนี้ เข้าในส่วน งานประจำ หรือ งานเชิงพัฒนา เพื่อประกอบการตัดสินใจได้ จะได้ไม่ต้องไปค้นหาหลาย ๆ ที่]

    บันทึกการปฏิบัติงานใน Google Calendar

    ใน Google Calendar จะมี Panel ด้านขวามือ จะเห็น Icon ของ Google Keep สีเหลือง ๆ คลิกสิครับ รออะไร

    Icon ของ Google Keep ใน Google Calendar

    เราก็จะเห็น Note ของ Google Keep ที่เรา Pin ไว้ตะกี้ อยู่บนสุด

    Note ที่ Pin ไว้ จะอยู่บนสุด

    ใน Google Calendar นั้น ปรกติเราจะลงนัดหมายต่าง ๆ ลงไปใน Default Calendar ของเรา แต่ในที่นี้ แนะนำให้สร้างอีก Calendar นึงขึ้นมา ตั้งชื่อว่า worklog

    แนะนำให้สร้าง Calendar ใหม่ ชื่อ worklog เพื่อแยกบันทึกปฏิบัติงาน กับ การนัดหมายทั่วไป

    วิธีลงบันทึก

    เช่น วันนี้ เวลา 10:00-13:30 ทำงานของหน่วยตรวจสอบภายใน เป็นการ “ปรับปรุงโปรแกรมหน่วยตรวจสอบ” และบันทึกสิ่งที่จะต้องทำ กับ สิ่งที่ทำเสร็จไปแล้ว

    วิธีการบันทึก

    1. [Update] Copy ข้อความจาก Google Keep เช่น ข้อ #1.8_พัฒนาระบบหน่วยตรวจสอบภายใน มาใส่ใน Title
    2. [Update] อาจจะเพิ่ม ” ปรับปรุงโปรแกรมหน่วยตรวจสอบ” เป็นคำบรรยาย ในหัวข้อการทำงาน
    3. ใส่ เวลา 10:00 – 13:30 ว่าเราทำงานนี้ในช่วงเวลานี้
    4. บันทึกสิ่งที่จะต้องทำ กับ สิ่งที่ทำเสร็จไปแล้ว
    5. เลือกบันทึกลงใน worklog
    6. กดปุ่ม Save
    ขั้นตอนการบันทึกผลการปฏิบัติงาน

    วางแผนการทำงาน

    อย่างเช่น ผมมีงานที่ต้องทำทุกเช้า คือ “1.4 เฝ้าระวังบริการ PSU Email”

    1. [Update] ใส่ #1.4_เฝ้าระวังบริการ_PSU_Email
    2. เลือกบันทึกใน worklog
    3. คลิก More Option
    บันทึกปฏิบัติงาน ที่จะต้องทำทุกวัน

    เลือกเป็น Repeat > Every Weekday

    เลือกให้เกิดการบันทึกนี้ ทุกวัน

    แล้วมา Uncheck “All day” ออก เพื่อกำหนดช่วงเวลา เช่น ผมจะทำงานนี้ประจำทุกวันทำงาน เวลา 09:00-10:00 จากนั้น คลิกปุ่ม Save

    กำหนดเวลา

    สร้างนัดหมาย แล้วเอามาเป็นบันทึกปฏิบัติงานก็ได้

    เบื่อไม๊ เวลาจะนัดประชุม นอกจากจะต้องหาเวลาว่าง ห้องว่าง แล้วต้องมาหาว่า ใครว่างวันไหน แถม ลงนัดไปแล้ว ก็ยังไม่รู้ว่า ใครจะตอบรับการเข้าประชุมบ้าง

    ปัญหาเหล่านี้จะหมดไป เมื่อใช้ Google Calendar

    1. ใส่หัวข้อ เช่น “#1.10 นัดประชุม” –> เพื่อลงในบันทึกปฏิบัติงานของภาระงาน “1.10 โครงการพัฒนาอะไรสักอย่าง”
    2. ลงเวลานัด
    3. เพิ่ม Email ผู้เข้าร่วมประชุม
    4. ดูได้ว่าผู้เข้าร่วมประชุมว่างไม๊ในเวลานัด (ถ้ามันใช้ Calendar เป็นอ่ะนะ)
    5. ถ้าคนนี้ไม่สำคัญ ไม่มาก็ได้ ก็ Mark Optional
    6. ใน G Suite for Education สามารถจอง Resource ได้ เช่น จองหัองได้ ใน Free Gmail ไม่มีจร้า
    7. ใน G Suite for Education สามารถสร้างห้อง เพื่อ Video Conference ใน Google Meet ได้ ส่วน ใน Free Gmail ไม่มีจร้า
    8. คลิก Save

    ตอบ Email ก็เอามาลงบันทึกปฏิบัติงานได้

    เช่น มี Order มาให้ทำอะไร มาทาง Email ก็สามารถ เอามาลงบันทึกปฏิบัติงานได้เลย

    ก็สามารถเอามาใส่ในหัวข้อ ภาระงาน ที่ถูกต้องได้ แถม ถ้า email นี้ ถึงใครบ้าง ก็จะสร้างนัดหมายให้ได้ด้วย

    ผลการบันทึกปฏิบัติงาน

    เมื่อเวลาผ่านไป …

    วัน ๆ ไม่ได้ว่างงานนะ

    เมื่อถึงเวลารายงานผลการปฏิบัติงาน

    ใน Google Drive สร้าง Google Sheets ขึ้น จากนั้น ติดตั้ง Add-Ons ชื่อ “TimeSheet”

    เมื่อติดตั้งเสร็จจะได้อย่างนี้

    และนี่คือเหตุผลว่า ทำไมต้องใส่ # ไว้หน้าชื่อของ Event

    เริ่มเลยแล้วกัน

    Add-Ons > TimeSheet>Create Report

    เลือก Calendar และ กำหนดช่วงระยะเวลาที่ต้องการ

    ผลที่ได้

    ผลที่ได้ เรียงตามหัวข้อภาระงาน และ นับจำนวนชั่วโมงได้

    เช่น หัวข้อ #1.8 พัฒนาระบบหน่วยตรวจสอบภายใน ก็จะสามารถดูรายละเอียดและจำนวนชั่วโมงได้

    และเอาไปใส่ใน TOR ได้แระ

    ส่วน Google Sheets บันทึกผลข้างต้น ก็เอาไป Share ได้ตามปรกติ

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

  • วิธีการจองทรัพยากร (ห้องประชุม/รถ/Projector/etc…) ใน Calendar ของ G Suite for Education

    ข้อแตกต่างระหว่าง Calendar ของ G Suite for Education กับ Free Gmail

    สร้าง Event เพิ่มผู้เข้าร่วมประชุม และ จองทรัพยากร

    คลิกในช่อง วันบนปฏิทิน ที่เราต้องการนัดประชุม

    กรอกหัวข้อการประชุม แล้ว
    ใส่รายชื่อ ผู้เข้าร่วมประชุม
    และเลือกห้องประชุม


    คลิกที่ See guest availability เพื่อดูว่า ว่างพร้อมกันหรือไม่ ทั้งผู้เข้าร่วมประชุม และ ห้อง

    หากบางคนไม่ว่างในเวลาที่กำหนด สามารถคลิก Suggested times เพื่อให้ Google Calendar หาเวลาที่ว่างพร้อมกันหมดได้

    ใส่คำอธิบาย หัวข้อการประชุมก็ได้

    เมื่อกดปุ่ม Save ระบบจะแจ้งว่า ให้ส่ง Email ไปแจ้งผู้เข้าร่วมประชุมหรือไม่ แนะนำว่าควรคลิก Send

    เพิ่มเติม เมื่อคลิกเข้ามาดูรายละเอียดการนัดประชุม

    • ใน G Suite for Education มีบริการ Hangouts Meet ให้ในตัว (นัดหมายด้วย Free Gmail จะสร้างห้องเองไม่ได้ ทำได้แต่ Join เข้ามา) ซึ่งทำได้ทั้ง Video Call หรือ จะ Phone In ก็ได้ (อันนี้ไม่เคยลอง)
    • ดูได้ว่า ใครตอบรับ/ปฏิเสธ/ยังไม่ตอบ (เค้าเรียกว่า RSVP – Répondez s’il vous plaît – Please respond)
    • มีแจ้งเตือนก่อนการประชุมจะเริ่ม ตั้งค่าได้ว่าต้องการก่อนเวลานานขนาดไหน (ในตัวอย่างตั้งไว้ 10 นาที)

    Free Gmail ทำได้แค่นี้

    ต่อไป เป็นตัวอย่างนัดกับผู้ที่มีตารางนัดหมายแน่น ๆ
    และแสดงการจอง ห้องประชุม และ Projector

    เลือก จำนวนชั่วโมง (ในที่นี้ 1 ชั่วโมง) แล้วเลื่อนหาช่องที่ว่างตรงกันได้

    การทำรายงานการใช้ทรัพยาการ (ยกตัวอย่างห้องประชุม)

    คลิกที่ รูปแว่นขยาย เลือก ปฏิทินของทรัพยากร (ในที่ คือห้องประชุม) ที่ต้องการดู




    แล้วเลือก ช่วงเวลาที่จะทำรายงาน (ในที่นี้ เป็นตัวอย่างการทำรายงานการใช้ ห้องประชุม ตั้งแต่ 1 พฤษภาคม – 31 พฤษภาคม) แล้ว คลิก ปุ่ม Search

    ก็จะได้รายงานอย่างนี้

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

  • ELK #08 Oracle Audit Trail

    ต่อจา ELK #07 – Logstash คราวนี้ มาใช้งานจริง โดยใช้ ELK เพื่อเก็บ Log ของ Oracle Audit Trail

    1. Oracle Audit Trail บน Database Server เก็บ Log ในรูปแบบ XML โดยแต่ละ Event จะมี tag <AuditRecord> … </AuditRecord> คุมอยู่ ที่แตกต่างจาก Log ทั่วไปคือ ในแต่ละ Event จะมีเครื่องหมาย CRLF (การขึ้นบรรทัดใหม่) เป็นระยะ ๆ
    2. ออกแบบให้ Logstash รับข้อมูล (Input Plugin) จาก TCP Port 5515 ซึ่งต้องใช้ Codec ในการรวบ Multiline ในแต่ละ Event เข้าด้วยกัน โดยหา pattern “<AuditRecord>” เป็นจุดเริ่มต้น ส่วนบรรทัดที่ไม่เจอ Pattern ดังกล่าวนั้นการตั้งค่า negate => “true” เป็นการบอกว่า “ให้ดำเนินการต่อไป” โดยจะเอาบรรทัดที่ตามมาจากนี้ ต่อท้าย ด้วยการตั้งค่า what=> “previous”
    3. ในส่วนของ Filter Plugin จะอ่านค่าจาก “message” และ ส่งสิ่งที่ถอดจาก XML ได้ ไปยัง “doc”
    4. ในส่วของ Output Plugin จะส่งออกไปยัง ElasticSearch ที่ TCP port 9200

    ดัง Configuration ต่อไปนี้

    input {
       syslog {
          port => 5515
          codec => multiline {
               pattern => "<AuditRecord>"
               negate  => "true"
               what    => "previous"
          }
       }
    }
    filter {
       xml {
          source => "message"
          target => "doc"
       }
    }
    output {
      elasticsearch {
         hosts => ["elk.server:9200"]
      }
    }

    จากนั้น ทาง Oracle Database Server ทำการเปิด Audit Trail แล้วเขียน Log ลงไฟล์ แล้วเขียน Cron เพื่อ Netcat ไฟล์ส่งมาให้ Lostash ที่เปิด Port TCP 5515 ไว้รอรับ

    ผลที่ได้คือ

    โดยวิธีนี้ จะเป็นการนำ Log ซึ่งจากเดิมเป็น Text Format นำมาเป็น NoSQL ได้ ซึ่งจะสามารถ Query ข้อมูลได้ง่ายยิ่งขึ้น

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

  • Case Study: ระบบประเมินผลออนไลน์ด้วย Google Sheets แบบแก้ไขได้เฉพาะส่วนของตนเอง แต่มองเห็นของคนอื่นได้ด้วย

    โจทย์มีอยู่ว่า

    • ต้องการระบบประเมินผล Online ให้อาจารย์จากหลาย ๆ มหาวิทยาลัย จำนวน 5 ท่าน ประเมินผลการทำงาน ในมุมมองต่าง ๆ แยกตาม Sheet
    • และ ในแต่ละมุมมอง อาจารย์แต่ละท่าน สามารถเลือกตัวเลือกจาก Dropdown ในคอลัมน์ของตนเองในแต่ละหัวข้อย่อย
    • แต่ในขณะเดียวกัน สามารถมองเห็นได้ด้วยว่า อาจารย์ท่านอื่นให้คะแนนหัวข้อย่อยนั้นว่าอย่างไร แต่จะไม่สามารถแก้ไขของท่านอื่น หรือ แก้ไขส่วนอื่น ๆ ได้
    • มีระบบสรุปคะแนนอัตโนมัติ

    เริ่มกันเลย

    ลองคลิกไปดูตัวอย่างได้ที่นี่

    สร้าง Google Sheets โดยมีทั้งหมด 5 Sheets แต่ละ Sheet มีคอลัมน์แรก เป็นรายการที่จะประเมิน คอลัมน์ B – F เป็นส่วนที่ผู้ประเมินแต่ละท่านใช้ในการประเมิน

    ชีตที่ 1 -3 เป็น มุมมองในการประเมิน

    Sheet “มุมมองที่ 1”
    Sheet “มุมมองที่ 2”
    Sheet “มุมมองที่ 3”

    ชีตที่ 4 เป็น Rubric Score หรือ ค่าที่จะใช้ทำ Dropdown ด้วย V Lookup

    Rubric Score

    ชีตที่ 5 เป็น Summary เอาไว้แสดงภาพรวมการประเมิน (ใช้ในภายหลัง)

    Summary

    สร้าง Dropdown

    ไปที่ ชีต “มุมมองที่ 1” ที่เซล B7 (หัวข้อประเมินแรก ของผู้ประเมินคนแรก) แล้ว “คลิกขวา” เลือก Data Validation …

    จากนั้น ในบรรทัด On invalid data เลือก Reject input
    ในบรรทัด Criteria คลิกที่ช่องด้านหลัง

    แล้วไปคลิก ชีต “RubricScore” และเลือกส่วนที่จะมาแสดงใน Dropdown นั่นคือ “Not Met”, “Partially Met” และ “Met” แล้วคลิกปุ่ม OK

    จากนั้น กลับมาคลิกปุ่ม Save

    จากนั้น ก็ Copy เซล B7 ไปยังทุก ๆ ส่วนที่จะทำการประเมิน

    เพิ่มผู้ประเมินเป็น Editor

    คลิกปุ่ม Share แล้วกรอก Email Address ซึ่งเป็น Google Account ของผู้ประเมินทั้ง 5 คนลงไป ให้เป็น Editor จากนั้นคลิกปุ่ม Send

    ในขั้นตอนนี้ ทุกคนที่เป็น Editor สามารถเข้ามาแก้ไข ทุกส่วน ของ Google Sheets นี้ได้ ซึ่งไม่ใช่สิ่งที่ต้องการ ต่อไป จะเป็นการกำหนด ส่วนที่ แต่ละคนจะสามารถแก้ไขได้

    กำหนดส่วนที่ผู้ประเมินแก้ไขได้

    คิดเหมือนกับ การเจาะช่อง ให้เฉพาะส่วนที่กำหนดนี้ ให้มีการแก้ไขได้

    คลิกเมนู Tools > Protect sheet
    แล้วคลิก Except certain cells
    ในที่นี้คือ B:F

    แล้วเลือก Editor ทุกคน ให้สามารถ แก้ไขได้
    จากนั้นคลิกปุ่ม Done

    ตอนนี้ ทั้ง 5 คนจะสามารถแก้ไขสิ่งที่อยู่ในคอลัมน์ B-F ได้ แต่ยังมีปัญหาคือ อ.สมชาย สามารถแก้ไขข้อมูลในคอลัมน์ของ อ.สมหญิง ได้อยู่

    กำหนดให้ผู้ประเมินแก้ไขได้เฉพาะคอลัมน์ของตนเอง

    ต่อไป กำหนดให้ อ.สมศรี แก้ไขได้เฉพาะคอลัมน์ C ซึ่งเป็นของตนเองเท่านั้น
    เลือก คอลัมน์ C
    คลิกเมนู Data > Protected sheets and ranges …
    คลิกปุ่ม Set Permissions

    จากนั้น เลือกเฉพาะ email ของ อ.สมศรี เท่านั้นที่สามารถแก้ไขได้
    แล้คลิกปุ่ม Done

    ทำซ้ำกระบวนการนี้ กับ ผู้ประเมินทุกคน ให้แก้ไขได้เฉพาะของตนเองเท่านั้น
    ตอนนี้ อ.สมศรี จะเห็นหน้าจออย่างนี้
    กล่าวคือ แก้ไขได้เฉพาะส่วนของตนเองเท่านั้น

    Save เป็น Macro

    ทำเช่นนี้กับ มุมมองที่เหลือ หรือ จะ Save Macro ก็ได้
    โดยคลิก เมนู Tools > Macros
    จากนั้น ทำกระบวนการที่ต้องการให้บันทึกไปเรื่อย ๆ แล้ว Save
    แล้ว ค่อยไป Run Macro ที่สร้างขึ้น ในชีตที่ต้องการ

    Macro จะมีหน้าตาประมาณนี้

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

  • django – as a Dialogflow Webhook #03

    บทความนี้ จะกล่าวถึง การใช้ django ทำหน้าที่เป็น Webhook จาก Dialogflow ผ่าน Fulfillment ทาง HTTP Post Request ด้วย JSON object และ ทำการประมวลผล แล้วตอบกลับไปเป็น JSON Object เช่นกัน เพื่อให้ Dialogflow ตอบสนองต่อผู้ใช้ได้ตามต้องการ เช่น อาจจะให้ไปค้นข้อมูลจากฐานข้อมูลในองค์กรมาตอบ เป็นต้น

    Source: https://dialogflow.com/docs/intro/fulfillment

    ในมุมของ django django (ดี)จังโก้ ดีอย่างไร #01 ได้กล่าวถึงการสร้าง Web Application จาก Model โดยกำหนด Fields ต่าง ๆ จากนั้น django ก็จะสร้าง Web Form ต่าง ๆ ให้อัตโนมัติ และยังสามารถสร้าง Users ของระบบ พร้อมทั้ง กำหนดสิทธิ์การเข้าถึงของแต่ละคนได้อีกด้วย แล้วนำไปผูกกับส่วน Admin เพื่อให้ผู้ใช้ทำการ Authentication ก่อนเข้าจัดการกับข้อมูลต่างได้ และในบทความ django – Deploy to Production #02 ได้แนะนำวิธีการ Deploy ระบบที่สร้างขึ้นสู่ Production ตามลำดับ

    ในบทความนี้ จะใช้ “view” ซึ่งเป็นอีกส่วนของ django ตามขั้นตอนต่อไปนี้

    ใน myproject สร้าง App ใหม่ ชื่อ fulfillment

    python manage.py startapp fulfillment

    เพิ่ม ‘fulfillment’ app ลงใน myproject/settings.py ที่ INSTALLED_APPS
    ( ในตัวอย่างก่อนหน้า เราเพิ่ม worklog app ไว้แล้ว) 

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'worklog',
        'fulfillment'
    ]

    จากนั้น แก้ไขไฟล์ myproject/fulfillment/views.py ตามนี้

    from django.http import HttpRequest, HttpResponse
    from django.views.decorators.csrf import csrf_exempt
    import json
    # Create your views here.
    @csrf_exempt
    def sayHi(request):
        j = json.loads(request.body)
        x = {  "fulfillmentText": "This is a text response"
            }
        return HttpResponse(json.dumps(x))

    ในส่วนนี้ จะ import packages ต่อไปนี้

    • HttpRequest เพื่อรับ Input ผ่าน HTTP
    • HttpResponse เพื่อตอบ Output ผ่าน HTTP
    • csrf_exempt เพื่อบอกว่า ยอมให้ทำงานผ่าน HTTP POST โดยไม่ต้องมี CSRF Token (ถ้าไม่ใส่ อยู่ ๆ จะส่ง POST เข้ามาไม่ได้ )
    • json เพื่อจัดการ JSON object

    จากนั้น สร้าง Function ชื่อ “sayHi” มี function ที่เรียกใช้งานดังนี้

    • json.loads(request.body) ทำหน้าที่แปลง JSON Object จาก HTTP Request เข้ามาอยู่ในรูป Python Object ในที่นี้ จะนำข้อมูลจาก Dialogflow Fulfillment ที่ได้จาก Intent Matching และ Parameter Extraction ส่งมา
    • json.dumps(x) ทำหน้าที่แปลงข้อมูล จาก Python Object (ในรูปแบบ dict) ไปเป็น JSON Object ในที่นี้ แปลง { “fulfillmentText” : “This is a text response” } ไปเป็น JSON Object แล้วตอบกลับไปทาง HTTP Response

    ต่อไป สร้างไฟล์ myproject/fulfillment/urls.py เพื่อกำหนด URL ที่จะเรียกใช้ function ดังนี้

    from django.urls import path
    from . import views
    urlpatterns = [    
    	path('hi', views.sayHi )
    ]

    ในส่วนนี้ import package “path” เข้ามา และ import views ที่สร้างขึ้นใน ‘fulfillment’ app และกำหนดว่า เมื่อการเรียก “hi” ให้ไปเรียก function “sayHi” ซึ่งเป็น views

    สุดท้าย แก้ไขไฟล์ myproject/urls.py เพื่อเพิ่ม URL path ให้ fulfillment

    from django.contrib import admin
    from django.urls import path, include
    urlpatterns = [
    	path('admin/', admin.site.urls),
    	path('fulfillment/', include('fullfillment.urls'))
    ]
    

    เมื่อมีการเรียก http://server-domain/fulfillment/ ก็จะส่งไปให้ views ใน fulfillment ทำงาน โดย Include fulfillment.urls เข้ามา

    เมื่อเรียก  http://server-domain/fulfillment/hi ก็จะไปเรียก function sayHi ที่เขียนข้างต้นนั่นเอง

    Dialogflow Fulfillment

    ใน Dialogflow Console คลิกที่ Fulfillment แล้ว Enable Webhook จากนั้นใส่ URL ของ django production server ที่เราสร้างขึ้น ในตัวอย่างจะเป็น

    https://xxxxxxxxx.psu.ac.th/fulfillment/hi

    จากนั้น กดปุ่ม Save ด้านล่าง (ในทางปฏิบัติจริง ๆ ต้องมีเรื่อง Authentication/Authorization อีกพอสมควร แต่ในตัวอย่างนี้ ทำแบบง่าย ๆ ก่อน)

    ต่อไป สร้าง Intent ชุดที่ต้องการให้ส่งให้ Fulfillment ทำงาน แล้วก็คลิกที่ Fulfillment > Enable webhook call for this intent แล้ว Save

    จากนั้น ลองทดสอบดู จะเห็นได้ว่า Default Response จะแสดงข้อความ “This is a text response” แทนที่จะเป็น Text Response ที่กำหนดใน Intent นั้น

    ลองคลิก Diagnostic Info

    จะเห็นว่า มี fulfillmentText เป็น “This is a text response” ตามที่เขียนไว้ เป็นอันว่า Dialogflow สามารถเชื่อมต่อไปยัง django Webhook ที่สร้างขึ้นได้แล้ว

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

  • วิธีการทำ Group ซ้อน Group ให้สามารถส่งผ่านได้ไปถึงสมาชิกระดับล่างสุด ใน Google Groups

    มีคำถามมาว่า ใช้ Google Groups เช่น all-staffs ซึ่ง มี สมาชิกในนี้เป็น Google Groups ด้วย ชื่อ faculty01, faculty02, faculty03

    แล้ว ภายใต้ faculty01 มี department01, department02 ซึ่ง department01 นั้น จะประกอบด้วย email ของสมาชิก โดยทุก Group ตั้งค่าไว้ว่า ให้เฉพาะ Owner และ Manager เท่านั้นที่มีสิทธิ์ส่ง

    แล้ว … จะทำอย่างไร ให้เมื่อมีคน (ที่ได้รับอนุญาตให้ส่ง) สมมุติชื่อ somchai.jaidee@gmail.com ส่งเข้า all-staffs@groups.google.com แล้ว ผู้รับ ซึ่งอยู่ใน department01 สามารถรับ email ได้ ???

    วิธีการคือ ให้เพิ่ม email address ของ Group ที่เป็น Parent ลงไปใน Child Group เช่น ในที่นี้ เพิ่ม all-staffs@groups.google.com ลงไปเป็นสมาชิกของ faculty01 Group แล้วตั้งค่าให้ Email Delivery เป็น No email และ Posting Permission เป็น Override : member is allowed to post

    และ ทำเช่นนี้กับ faculty02, faculty03 …
    ส่วน department01, department02 ก็ให้เอา faculty02@groups.google.com ไปเป็นสมาชิก และตั้งค่าแบบนี้เช่นกัน