Author: kanakorn.h

  • วิธีใช้ 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 ได้ตามปรกติ

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

  • เมื่อฉัน “แหก” (ใบแจ้งค่าน้ำประปา) การประปาส่วนภูมิภาค

    Disclaimer: คำเตือน บทความนี้ ผู้เขียนมีจุดประสงค์ “แค่” นำเสนอ วิธีการแก้ปัญหาเมื่อจ่ายค่าน้ำประปา ผ่านทาง Mobile Application ไม่ได้เท่านั้น

    ปัญหา: ทุก ๆ เดือน เจ้าหน้าที่การประปาจะมาจดมาตรวัตน้ำ และปริ้นท์ใบเสร็จมาใส่กล่องจดหมายหน้าบ้าน และก็สามารถจ่ายผ่าน True Money Wallet ได้ทุกครั้ง … แต่มาครั้งนี้ จ่ายไม่ได้

    จากภาพ จะเห็นว่า ใบเสร็จประกอบด้วยข้อมูลต่าง ๆ แต่ที่น่าสนใจ ได้แก่
    – เลขที่ใบแจ้งค่าน้ำ: 1227620229846
    – เลขที่ผู้ใช้น้ำ: 1227052xxxx
    – หน่วยงาน: 1227-21
    – วันที่อ่าน: 09/06/62
    – รวมเงินที่ต้องชำระทั้งสิ้น: 353.10

    คราวนี้ … ใบแจ้งนี้ จะมี QR Code และ Barcode ซึ่ง ทดลองใช้ Google Lens อ่านพบว่า ได้ค่าออกมาเป็น

    |09940001649041111227052xxxx1906621227620229846000930000035310

    นับแล้ว ได้ความยาว 62 ตัวอักษร

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

    ก็เลย ไปที่ 7-Eleven ผลคือ ก็ยิง Barcode ได้ แต่ไม่สามารถจ่ายเงินได้อยู่ดี !!!

    พอดีสาขาที่ไป ช่วงนั้นลูกค้าไม่คับคั่ง จึงสอบถามพนักงานว่า ไม่ทราบมีวิธี Manual ไม๊ จะได้ทราบว่า มี โดยที่ Counter สามารถ Key เลขที่ใบแจ้งค่าน้ำ, เลขที่ผู้ใช้น้ำ, หน่วยงาน ได้

    แต่ …. เมื่อ Key ตามช่องที่ระบบมีให้นั้น ปรากฏว่า ตั้งแต่ เลขที่ใบแจ้งค่าน้ำ ระบบก็บอกว่าไม่ถูกต้อง

    ก็เลย ขอรบกวนเค้า ให้ลอง Key ตัวเลขใต้ Barcode ขนาดความยาว 58 ตัวอักษร ลงไป ในช่อง เลขที่ใบแจ้งค่าน้ำ เลย ผลปรากฏว่า จ่ายได้ !!!

    12276202298461227052xxxx122721190662000035310

    อึ่มมมมม มันต้องมีอะไรแน่ ๆ …. ก็เลขมาสังเกตดู

    ถ้าเอา เลขที่ใบแจ้งค่าน้ำ, เลขที่ผู้ใช้น้ำ, หน่วยงาน มาต่อกัน จะได้
    1227620229846 1227052xxxx 122721

    ส่วนต่อมา
    190662
    น่าจะเป็น 19/06/62 ซึ่ง ก็คือ 10 วัน หลังจาก วันที่อ่าน (09/06/62)

    และ
    000035310
    น่าจะเป็น จำนวนเงิน หลักล้าน ทศนิยม 2 ตำแหน่ง Padding ด้วย 0 ด้านหน้า
    0,000,353.10

    อย่ากระนั้นเลย ไหน ลองเอาของเดือนที่แล้วมาดูซิ ซึ่งเคยจ่ายผ่าน App ได้

    09940001649041111227052xxxx2105621227620148723000930000037343

    เปรียบเทียบ 2 เดือน

    |09940001649041111227052xxxx1906621227620229846000930000035310
    09940001649041111227052xxxx2105621227620148723000930000037343

    อ่อ เพราะเดือนที่ยิงไม่ได้ มีเครื่องหมาย | ข้างหน้า

    และ มีเลข 0994000164904111
    UPDATE: 0994000164904 คือ เลขที่ผู้เสียภาษี (Tax ID) ส่วน 111 อาจจะเอาไว้คั่น มั้ง

    สรุป

    เดือนไหนจ่ายไม่ได้ ลองเอาเลขใต้ Barcode ให้ 7-Eleven คีย์เข้าไปดูในช่อง “เลขที่ใบแจ้งค่าน้ำ” ก็จะจ่ายได้จร้า

    แล้ว …. ถ้าเอา
    09940001649041111227052xxxx1906621227620229846000930000035310
    ไปสร้าง QR Code หล่ะ (ไม่เอา | นำหน้า)

    เฮ้ยยยยยยยย !!!!

  • วิธีสร้างสมุดโทรศัพท์ของหน่วยงานด้วย Google Contact

    เคยเป็นไม๊ จะโทรศัพท์หาเพื่อนร่วมงาน แต่ไม่รู้ว่า เบอร์มือถือ เบอร์ที่โต๊ะ หรือ Email อะไร วิธีการที่บางหน่วยงานทำ คือ ทำแผ่นพับเป็นสมุดโทรศัพท์เก็บใส่กระเป๋าตังค์บ้าง เป็นกระดาษแปะบ้าง บางทีก็หาย บางทีก็ไม่ได้พกบ้าง หรือ บางทีทำเป็นเว็บให้ค้นหาบ้าง … บางแห่งถึงกับต้องลงแรงเรียน Mobile App ก็มี (อิอิ)

    จะดีกว่าไม๊ ถ้าแค่ฝ่ายบุคคล แค่รวบรวม ชื่อ นามสกุล ชื่อเล่น เบอร์มือถือ เบอร์โต๊ะ และ Email ใส่ Excel แล้วจากนั้น ใครใคร่จะ Import ใส่ Google Contact ของตนเองได้เลย แล้วหลังจากนั้น จะโทร จะค้นหา ก็สามารถทำในมือถือของตนเองได้เลย !!! ไม่ต้องพก ไม่ต้องติดตั้ง App เพิ่ม ใช้ได้ทั้ง iOS, Android และบน Computer ก็ยังได้

    มาดูกัน

    สร้าง Excel เก็บข้อมูล

    การนำเข้า (Import) ข้อมูลเข้า Google Contact มีทริคนิดเดียว คือ บรรทัดแรกของไฟล์ จะต้องเป็น Header ที่กำหนดชื่อตามรูปแบบมาตราฐาน กล่าวคือ ตั้งหัวข้อว่า “ชื่อ”, “นามสกุล”, “ชื่อเล่น”, “มือถือ”, “เบอร์โต๊ะ” อะไรอย่างนี้ +++ไม่ได้+++

    ต้องตั้งเป็น

    "Given Name","Family Name", "Name Suffix","Phone 1 - Type","Phone 1 - Value","Phone 2 - Type","Phone 2 - Value","Group Membership"

    Given Name = ชื่อ
    Familay Name = นามสกุล
    Name Suffix = ใช้เป็นชื่อเล่นก็ได้
    Phone 1 – Type = ประเภทโทรศัพท์อันที่ 1 (เช่น Mobile)
    Phone 1 – Value = หมายเลขโทรศัพท์อันที่ 1 (เช่น เบอร์มือถือ)
    Phone 2 – Type = ประเภทโทรศัพท์อันที่ 2 (เช่น Work)
    Phone 2 – Value = หมายเลขโทรศัพท์อันที่ 2 (เช่น เบอร์โต๊ะ)
    Group Membership = จะให้ Label ว่าอย่างไร

    ดังตัวอย่างนี้

    จากนั้น Save เป็นแบบ CSV File สมมุติชื่อว่า contact.csv

    นำเข้า Google Contact

    เปิด Gmail/Google Mail แล้วคลิกที่ App > Contacts
    ใน Google Contact คลิกที่ More > Import
    เลือกไฟล์

    เสร็จแล้ว ก็จะได้ใน Google Contact มี Label ตามภาพ (1 contact มีหลาย ๆ label ได้)
    ในภาพ จะเห็นว่า Contact ที่เพิ่งนำเข้าไป จะปรากฏใน Label cc2019, myContact และ Imported on 5/7 ซึ่งเป็น Default

    วิธีการนี้ มีข้อดีคือ แม้จะมี contact ที่ซ้ำกัน ก็ไม่เป็นไร เราสามารถ Merge ทีหลังได้ หรือ เลือกลบที่เป็น Label ของปีก่อน ๆ ได้ ถ้าต้องการ


    พร้อมใช้งานทันที

    เมื่อ Import เสร็จแล้ว ในมือถือที่ Sync กับ Google Account ที่เราเอา Contact ใส่เข้าไปก็จะสามารถค้นหาได้ทันที

    หาตามเบอร์โทรศัพท์ก็ได้

    เย ๆ

  • วิธีการจองทรัพยากร (ห้องประชุม/รถ/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 ข้อมูลได้ง่ายยิ่งขึ้น

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

  • วิธีเชื่อมต่อ PostgreSQL จาก python

    ในการเชื่อมต่อกับ PostgreSQL จาก Python นั้น จะต้องใช้ Package ‘psycopg2’

    คำสั่งในการติดตั้งคือ

    pip install psycopg2

    วิธีการเรียกใช้จาก python

    
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import psycopg2
    from IPython.display import display, HTML # used to print out pretty pandas dataframes
    import matplotlib.dates as dates
    import matplotlib.lines as mlines
    
    %matplotlib inline
    plt.style.use('ggplot') 
    
    # specify user/password/where the database is
    sqluser = 'username'
    sqlpass = 'userpasswordgohere'
    dbname = 'dbname'
    schema_name = 'someschema'
    host = 'host.postgresql.server'
    
    query_schema = 'SET search_path to ' + schema_name + ';'
    
    # connect to the database
    con = psycopg2.connect(dbname=dbname, user=sqluser, password=sqlpass, host=host)
    
    query = query_schema + 'select * from sometable'
    df = pd.read_sql_query(query,con)

    ก็จะได้ df เป็น Dataframe เอาไปใช้งานต่อได้

    จบ

  • วิธีสร้าง User บน PostgreSQL ให้สามารถเข้าถึงฐานข้อมูลได้แบบ Read-Only

    บันทึกเอาไว้สั้น ๆ ในที่นี้ ต้องการสร้างผู้ใช้ ‘username’ ให้มีรหัสผ่านเป็น ‘userpasswordgohere’ ให้สามารถใช้งาน ‘someschema’ โดยให้ใช้เฉพาะ ‘SELECT’ ได้กับทุก Tables ใน someschema

    บน PostgreSQL ใช้คำสั่งนี้ ในการสร้างและ Grant สิทธิ์

    CREATE USER username WITH ENCRYPTED PASSWORD 'userpasswordgohere';
    GRANT USAGE ON SCHEMA someschema TO username;
    GRANT SELECT ON ALL TABLES IN SCHEMA someschema TO username;

    จบ

  • python #07 Sentiment Analysis – IMDB

    ต่อจาก python #06 – Sentiment Analysis ด้วย Keras + Tensorflow เนื่องจากเรา Train โมเดล ด้วย ประโยคเพียง 9 ประโยค ซึ่งประกอบด้วยคำ 19 คำ เมื่อถูกทดสอบด้วยคำที่ “ไม่เคยเจอมาก่อน” ก็จะไม่สามารถวิเคราะห์ได้ถูกต้องนัก ยิ่ง ถ้าเจอกับประโยคที่ ไม่มีคำที่เคยเจออยู่เลย ก็จะได้ Zero Vector ไปเลย (ในทางเทคนิค สามารถตั้งค่าห้ Unknown Word มี Index = 1 ได้)

    แก้ไขอย่างไร ?

    ตอนนี้ เปรียบเหมือนโมเดลเป็นเด็กเล็ก รู้จักคำแค่ 19 คำ พอมีคำใหม่ ๆ มาก็จะไม่เข้าใจ วิธีการคือ ต้องสอนคำใหม่ ๆ และรูปแบบประโยคใหม่ ๆ ให้เค้า … แล้วจะหามาจากไหนหล่ะ ??

    IMDB Movie reviews sentiment classification

    เป็น Dataset การรีวิวภาพยนต์ 25,000 รายการ มี Label เป็น Positive/Negative รายละเอียดตามนี้

    https://keras.io/datasets/#imdb-movie-reviews-sentiment-classification

    เริ่มต้นใช้งาน

    [ดู Jupyter Notebook ]

    ทำตามตัวอย่างของ Keras ซึ่งมีข้อสังเกตว่า oov_char หรือ เมื่อเจอคำที่ไม่เคยรู้จักมากก่อน (Out-Of-Vocab) จะแทนค่าด้วย 2 และ index_from เริ่มจาก 3 (0,1 จะไม่ใช้ ส่วน 2 แทนคำที่ไม่รู้จัก ดังนั้น index แรกของคำที่ใช้คือ 3) จะเป็นคำที่พบ “มากที่สุด” ไล่ตามลำดับไป (ยิ่งตัวเลข index มาก ยิ่งมีการใช้น้อย)

    สำรวจข้อมูล

    พบว่า ถ้าเอาคำทั้งหมดจากรีวิวทั้งหมดมา จะมีคำทั้งหมด 88,584 คำ และ ประโยคที่มีความยาวสูงสุดคือ 2,494 คำ

    Idea of Reverse IMDB word index Source: Source: https://jamesmccaffrey.wordpress.com/2018/04/27/inspecting-the-imdb-dataset-reverse-mapping-the-index-values/imdb_review_index_to_words/

    แล้ว ส่วนใหญ่รีวิวจะมีความยาวกี่คำ ?
    Idea จาก http://www.awesomestats.in/python-dl-imdb-classification-1/

    ถ้าเอา ค่า Mean + 2 SD ก็จะพบว่า ความยาวประมาณ 591 คำ

    ข้อมูลจะอยู่ในรูป Sequence หรือ Vector of Integer แล้ว

    ต่อไป ก็ Pad ข้อมูล และ Truncate ให้อยู่ในความยาวที่กำหนด (ในที่นี้คือ most_sentence_len = 591)

    ข้อมูลหน้าตาประมาณนี้

    แบบที่ 1 ใช้ข้อมูลทั้งหมด

    ทดลองใช้ คำทั้งหมดในจากข้อมูล IMDB (88,584 คำ) และ ใช้ความยาวประโยค 591 คำ

    ผลที่ได้ ไม่ค่อยดี

    แบบที่ 2

    กำหนดให้ Vocab ที่รู้จัก เป็น 500 คำแรกที่ใช้มากที่สุด และกำหนดความยาวประโยคสูงสุด 100 คำ


    ผลที่ได้ ดูดีขึ้น
    (สังเกต Param ใน Embedding Layer = 16,000 และ เวลที่ใช้ต่อ Epoch ประมาณ 60-70 วินาที)

    วัด Accuracy ตอน Train ได้ 76.86% โดย Test Dataset ประมาณ 76.79% ก็ถือว่า พอดี

    แบบที่ 3

    กำหนดให้ Vocab ที่รู้จัก เป็น 50,000 คำแรกที่ใช้มากที่สุด และกำหนดความยาวประโยคสูงสุด 100 คำ

    ผลที่ได้ ดูดีขึ้น
    (สังเกต Param ใน Embedding Layer = 1,600,000 และ เวลที่ใช้ต่อ Epoch ประมาณ 80 วินาที)

    ตอน Train ได้ Accuracy ถึง 94.46% แต่ ตอน Test แต่แค่ 78.12% อย่างนี้เรียกว่า “Overfit”

    สรุปคร่าว ๆ

    จะเห็นได้ว่า การสร้าง Deep Neural Network ด้วย Keras นั้น ไม่ยาก แต่การปรับค่า Hyper parameter ต่าง ๆ นี่แหล่ะ เป็นศิลปะ

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

  • python #06 – Sentiment Analysis ด้วย Keras + Tensorflow

    บทความนี้กล่าวแบบทางเทคนิค ไม่เน้นวิชาการ ทฤษฏีมากนัก

    Sentiment Analysis เป็นตัวอย่างที่ดีของการเริ่มต้นทำงานด้าน NLP (Natural Language Processing) เริ่มจากหาตัวอย่างประโยค (Inputs) และเป้าหมาย (Labels) แยกคำจากประโยค (Tokenization) แปลงให้เป็นตัวเลข (Word Representation) แล้วสอน NN (Train) วัดผล (Test/Evaluate) แล้วนำไปใช้ โดยป้อนประโยคเข้าไป แล้วดูว่า โมเดลของเราจะจัดให้เป็น Labels ใด (ในตัวอย่างนี้จะเป็น Multiclass (Multinomial) Classification)

    ดู Jupyter Notebook

    Input

    สมมุติเรามีตัวอย่างประโยคประมาณนี้
    แบ่งเป็น Positive, Neutral, Negative เพื่อไว้ใส่เพิ่มเติมได้ แล้วเอามารวมกันเป็น data โดยแปลงเป็น Numpy Array เพื่อสะดวกในการ Tokenization ต่อไป

    Tokenization

    ใน Keras มีเครื่องมือให้แล้ว คือ Tokenizer ใน Keras Text Preprocessing fit_on_texts ทำหน้าที่ แปลงข้อมูล “หลาย ๆ ประโยค” จาก data ในคอลัมน์ 0 ให้เป็นคำ ๆ โดยแยกคำด้วย “เว้นวรรค” และกำหนด Index ให้แต่ละคำ (word_index) โดย “เรียงตามความถี่” จะสังเกตุว่า คำว่า i , it อยู่อันดับ 1, 2 ตามลำดับ (และจะเห็นว่า มีการแปลงเป็น lower ทั้งหมด)

    One-hot Encode สำหรับค่า labels

    keras มี to_categorical method ทำหน้าที่เปลี่ยน Integer เป็น One-hot Encode ดังตัวอย่างด้านล่าง ในการแปลงกลับ ใช้ argmax method ของ Numpy

    เตรียมประโยค ให้เป็น Sequence ที่มีความยาวเท่ากัน

    การนำข้อมูลเข้าสู่ NN ต้องเตรียม Array ที่มีขนาดเท่า ๆ กัน ดังตัวอย่าง
    ในที่นี้ใช้ texts_to_sequences แปลง ประโยค ให้เป็น Sequence (Array of Integer)
    จากนั้น หาความยาวของประโยค และหาค่าสูงสูด (maxlen) — มีทั้งข้อดีข้อเสีย
    แล้ว เติมเต็ม (Padding) ให้ทุกประโยค มีความยาวเท่ากัน โดยเติม 0 ข้างท้าย (padding=’post’)

    Word Embeding

    Word Embedding เป็น “หนึ่งในหลายวิธี” ของการแปลง คำ เป็น เวคเตอร์ของจำนวนจริง (vector of real number) จะเห็นได้ว่าตัวแปร x ข้างต้น เป็นจำนวนเต็ม (Integer) มีมิติเดียว ส่วน Word Embedding จะแปลง คำ ๆ นี้ (แทนด้วย) เป็นเวคเตอร์หลายมิติตามต้องการ (output_dim) โดยคำนวนจาก input_dim=จำนวนคำทั้งหมด (vocab_size) และ input_length=ความยาวของประโยคสูงสุด (maxlen)

    ตัวอย่างต่อไปนี้ แปลง x จำนวน 9 ประโยค เป็น Word Embedding ซึ่งกำหนด input_dim=vocab_size, input_length=maxlen (ในที่นี้คือ 6) และ ต้องการแสดง Word Embedding เป็น Vector 2 มิติ (output_dim=2)

    จะเห็นได้ว่า ผลจาก Word Embedding จะได้ Array ขนาด 9 x 6 x 2 นั่นคือ ได้ เวคเตอร์ของแต่ละคำมี 2 มิติ แต่ละประโยคมี 6 คำ และ มีทั้งหมด 9 ประโยค (ตัวอย่างข้างต้น แสดงตัวอย่างแรก คือ จาก [ 1 8 2 0 0 0] )

    ถ้าลองเปลี่ยน output_dim = 16 จะได้ผลดังนี้

    วิธีการนี้ ทำให้สามารถคำนวณว่า คำใด มีความสัมพันธ์กันขนาดใดได้ เช่น king – man + woman = ?? ซึ่งมนุษย์เราจะตอบว่า queen เป็นต้น

    Source: https://towardsdatascience.com/deep-learning-4-embedding-layers-f9a02d55ac12

    ลองใช้ Flattern และ Dense

    จาก python #03 – Train/Validation/Test and Accuracy Assessment with Confusion Matrix ได้กล่าวถึง Layer แบบ Fully-Connected หรือที่เรียกว่า Dense มาแล้ว ตอนนี้จะเอามาต่อกับ Embedding Layer แต่ เนื่องจาก Dimension ที่ออกจาก Embedding Layer เป็นแบบ 3D จึงต้องนำมาแผ่ หรือที่เรียกว่า Flattern ก่อน

    ผลที่ได้คือ

    ซึ่ง … ดูไม่ดีเลย

    LSTM – Long Short-Term Memory

    ในการทำงานด้าน NLP มี Layer อีกประเภทที่เรียกว่า Recurrent Neural Network (RNN) ซึ่งเหมาะสำหรับงานที่มีลำดับเวลา เช่น ประโยคคำพูดเป็นต้น แต่ RNN พื้นฐานมีปัญหากับการ Train ข้อมูลที่มีความยาวมาก ๆ จึงมีการพัฒนา LSTM และ GRU ขึ้นมา (ขอข้ามรายละเอียด) ต่อไป จะลองนำ LSTM มาแทน Flattern และ Dense

    ผลที่ได้คือ

    ดูดีทีเดียว !!!

    ทดสอบการใช้งาน

    สร้างข้อมูลทดสอบ โดยประกอบไปด้วย คำที่โมเดลเคยเจอ และคำที่ไม่อยู่ใน Dictionary ซึ่งจะถูกแทนด้วย 0 ตามนี้

    ผลที่ได้คือ

    สวยงาม พอรับได้

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