Day: May 31, 2022

  • กรณีศึกษา การสำรองข้อมูล Neo4j Graph Database

    สวัสดีครับ

    บทความนี้เป็นกรณีศึกษาเกี่ยวกับการสำรองข้อมูล Neo4j Graph Database เรื่องมันมีอยู่ว่า สำนักนวัตกรรมดิจิทัลและระบบอัจฉริยะ หรือชื่อเดิมคือ ศูนย์คอมพิวเตอร์ ได้พัฒนาระบบเอกสารอิเล็คทรอนิกส์ เวอร์ชั่นใหม่ ซึ่งได้เปลี่ยนเทคโนโลยีในการเก็บข้อมูลมาใช้ Neo4j Graph Database แทนของเดิมที่ใช้ Microsoft SQL Server จึงต้องมีการวางแผนความเสี่ยงในเรื่องของการสำรองข้อมูล คราวนี้ตัวผมเองไม่ได้มีความเชี่ยวชาญหรือรู้จักกับ Neo4j Graph Database มากเท่าไหร่ แต่น้องที่สำนักนวัตกรรมที่เป็นผู้พัฒนาระบบและเรียนรู้การใช้งานก็ได้ไปศึกษา ทดสอบวิธีการส่งออกและนำเข้าข้อมูลจนมีความรู้ ความเข้าใจ ก็ได้มาถ่ายทอดต่อ ส่วนตัวผมเองก็นำวิธีการนี้ไปบวกกับความรู้เรื่อง Batch Script + PowerShell เล็กน้อย ทำเป็นระบบสำรองข้อมูลขึ้นมา ซึ่งขณะนี้ได้ทดสอบมาประมาณ 1 เดือนก็ยังสามารถทำงานได้ จึงจะขอมาเล่าสู่กันฟังในบทความนี้ครับ

    ข้อมูลที่ได้รับมาก็คือ

    1. Neo4j Graph Database ที่ใช้เป็นรุ่น Community ข้อดีคือ ไม่มีค่าใช้จ่ายในการใช้งาน แต่จะมีข้อจำกัดคือ ในการส่งออกและนำเข้าไฟล์ฐานข้อมูลนั้นจะไม่มีเครื่องมือให้ใช้งานมากมายจะต้องใช้คำสั่่งผ่านทาง Command Line

    2. ข้อจำกัดอีกอย่างคือ การส่งออกไฟล์นั้นจะทำในขณะ Neo4j ทำงานอยู่ไม่ได้ ต้องหยุดการทำงานก่อนเสร็จแล้วจึงทำการสตาร์ท Neo4่j ขึ้นมาทำงานใหม่

    นำข้อมูลที่ได้มาวางแผนการเขียน Script

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

    – เนื่องจากมีหลายขั้นตอนในการทำงานจีงใช้วิธีเขียนไฟล์ Script แยกการทำงานออกไป เช่น

    • Batch File ชื่อ neo4j-stop.bat เอาไว้หยุดการทำงาน Neo4j
    • Batch File ชื่อ neo4j-dump.bat เอาไว้ส่งออกไฟล์ฐานข้อมูล Neo4j ออกมา

    เมื่อได้รับข้อมูลและวางแผนการทำงานเรียบร้อยแล้ว จึงเริ่มต้นเขียน Script ตามลำดับขั้นตอนดังนี้

    1. สร้าง Batch File ชื่อ neo4j-stop.bat เอาไว้สำหรับหยุดการทำงานของ Neo4j จะมีคำสั่งที่เขียน ดังนี้

    @echo off

    for /f %%a in (‘powershell -Command “Get-Date -format ‘HH:mm:ss’”‘) do set “TimeStart=%%a”echo === Start Backup Neo4j On %DATE% %TimeStart% === > log.txt

    net stop neo4j >> log.txt

    call neo4j-dump.bat

    อธิบายได้ดังนี้
    – เริ่มต้นจะมีการรับค่าวันและเวลาปัจจุบัน คือ %DATE% และ %TimeStart%
    – จากนั้นจึงเริ่มใช้คำสั่งหยุดการทำงานของ Neo4j
    – สังเกตว่าทุกคำสั่งจะมีการส่งออกไปเก็บที่ log.txt
    – เสร็จแล้วจะมีการเรียก Batch Script neo4j-dump.bat ให้ทำงานต่อ

    2. สร้าง Batch File ชื่อ neo4j-dump.bat เอาไว้สำหรับส่งออกไฟล์ Neo4j จะมีคำสั่งที่เขียน ดังนี้

    @echo off

    for /f %%a in (‘powershell -Command “Get-Date -format ‘HH:mm:ss’”‘) do set “TimeDumpStart=%%a”

    echo == Start Dump Database On %TimeDumpStart% == >> log.txt

    neo4j-admin dump –database=neo4j –to=C:\neo4j_dump\backup_%date:~10,4%%date:~4,2%%date:~7,2%.dump > logtmp.txt 2>> log.txt & call neo4j-start.bat

    อธิบายได้ดังนี้
    – จะมีคำสั่ง dump ฐานข้อมูล Neo4j ออกมาเก็บไว้ที่ C:\neo4j_dump ตั้งชื่อไฟล์ว่า backup ต่อด้วยวันที่สร้าง เช่น backup_20220531.dump
    – เสร็จแล้วจะมีการเรียก Batch Script neo4j-start.bat ให้ทำงานต่อ

    3. สร้าง Batch File ชื่อ neo4j-start.bat เอาไว้สำหรับสตาร์ทการทำงานของ Neo4j จะมีคำสั่งที่เขียน ดังนี้

    @echo off

    net start neo4j >> log.txt

    call backup-to-nas03.bat

    อธิบายได้ดังนี้
    – จะมีคำสั่งสตาร์ทการทำงานของ Neo4j
    – เสร็จแล้วจะมีการเรียก Batch Script backup-to-nas03.bat ให้ทำงานต่อ

    4. สร้าง Batch File ชื่อ backup-to-nas03.bat เอาไว้สำหรับส่งไฟล์สำรองข้อมูล Neo4j ไปเก็บยัง Nas Server Backup จะมีคำสั่งที่เขียน ดังนี้

    @echo off

    for /f %%a in (‘powershell -Command “Get-Date -format ‘HH:mm:ss’”‘) do set “TimeSendNas03Start=%%a”

    echo == Start Send Backup File to Nas03 On %TimeSendNas03Start% == >> log.txt

    net use z: \\nas03.psu.ac.th\backup2\docs /user:[user] [password] >> log.txt

    “C:\Program Files\7-Zip\7z.exe” a -tzip z:\docs_db_%date:~10,4%%date:~4,2%%date:~7,2%.zip C:\neo4j_dump\backup_%date:~10,4%%date:~4,2%%date:~7,2%.dump >> log.txt

    net use z: /delete /yes >> log.txt

    for /f %%a in (‘powershell -Command “Get-Date -format ‘HH:mm:ss’”‘) do set “TimeEnd=%%a”

    echo === Finish All Process Backup Neo4j On %DATE% %TimeEnd% === >> log.txt

    xcopy log.txt C:\admin-scripts\logs\log_%date:~10,4%%date:~4,2%%date:~7,2%.txt*

    Powershell.exe -executionPolicy ByPass -noexit -File C:\admin-scripts\sendmail.ps1

    อธิบายได้ดังนี้
    – จะมีคำสั่งสำหรับสร้าง Map Drive z: ที่ Mount มาจาก Nas Server Backup

       – /user:[user] [password] คือ parameter ที่เป็นการระบุชื่อผู้ใช้และรหัสผ่านที่มีสิทธิ์เข้าถึงพื้นที่ที่กำหนดไว้

    – จะใช้โปรแกรม 7zip ทำการบีบอัดไฟล์ backup ที่ได้สร้างขึ้นจากข้อที่ 2 ตั้งชื่อว่า docs_db ต่อด้วยวันที่สร้าง เช่น docs_db_20220531.zip ไฟล์ดังกล่าวจะไปสร้างที่ Nas Server Backup โดยตรง
    – เสร็จแล้วจะมีคำสั่ง Powershell เรียกไฟล์ sendmail.ps1 ให้ทำงานต่อ

    5. สร้างไฟล์ Powershell ชื่อ sendmail.ps1 เอาไว้สำหรับส่งเมลแจ้งไปยังผู้ดูแลพร้อมกับส่ง log.txt ไปกับอีเมลด้วยเพื่อให้สามารถตรวจสอบได้

    $DateTime = Get-Date -format ‘yyyy-MM-dd’
    $From = “docsdb@psu.ac.th”
    $To = “somchai.wa@psu.ac.th”
    $Copy = “somchai.wanathanasin@gmail.com”
    $Attachment = “C:\admin-scripts\log.txt”
    $Subject = “Server DocsDB Backup Successfully on $DateTime”
    $Body = “Dear Admin,

    The System send log file backup docsdb.Please see details in attached file.

    Thank you”
    $SMTPServer = “smtp.psu.ac.th”
    $SMTPPort = “25”

    Send-MailMessage -From $From -to $To -Cc $Copy -Subject $Subject -Body $Body -SmtpServer $SMTPServer -Port $SMTPPort -Attachments $Attachment

    stop-process -id $PID -Force

    อธิบายได้ดังนี้
    – ใน Powershell จะมีคำสั่งที่ใช้ในการส่งเมลคือ Send-MailMessage ซึ่งจะประกอบไปด้วยพารามิเตอร์หลายค่าที่จะต้องระบุให้ถูกต้อง โดยด้านบนจะมีการสร้างตัวแปรต่าง ๆ เพื่อเก็บค่าไว้ นำไปใช้ในการส่งอีเมล
    – ข้อสังเกตคือ ด้านล่างสุดจะมีคำสั่ง stop-process -id $PID -Force คำสั่งนี้เป็นการสั่งให้ Powershell หยุดทำงานคือปิดตัวลงไปทันทีที่ทำงานเสร็จ เพราะเคยพบปัญหาว่าเมื่อมีการรัน Script นี้แล้ว Process Powershell จะยังคงเปิดอยู่ ทำให้ Script ทำงานผิดพลาด

    6. จะสร้าง Batch File Script ที่ชื่อ backup-docsdb.bat เอาไว้สำหรับระบุพื้นที่เก็บ Script ไฟล์ทั้งหมดและทำการเรียกไฟล์ neo4j-stop.bat ให้ทำงานเป็นลำดับแรก จะมีคำสั่งที่เขียน ดังนี้

    @echo off

    cd C:\admin-scripts

    call neo4j-stop.bat

    อธิบายได้ดังนี้
    – Script ที่เขียนทั้งหมดจะทำงานอยู่ที่ C:\admin-scripts รวมทั้ง log ไฟล์ก็จะเก็บอยู่ที่นี้

    7. เพื่อให้กระบวนการสำรองข้อมูลทำงานอัตโนมัติทุกคืนตอนเวลา 02:00 น. โดยจะต้องไปสร้าง Task Schedule ใน Windows แล้วเรียกไฟล์ backup-docsdb.bat ให้ทำงานอัตโนมัติ

    8. ตัวอย่างเมลที่ส่งมาแจ้งผู้ดูแล มีดังนี้

    ขอจบการเขียนบทความแต่เพียงเท่านี้ หวังว่าผู้อ่านคงได้ประโยชน์ไปไม่มากก็น้อย

    ขอบคุณครับ

  • การสร้าง Visual Studio Project Template

    ความสามารถอย่างหนึ่งที่น่าสนใจของ Visual Studio คือ การนำ Project ที่เราสร้างขึ้นมาใช้เป็นตัวตั้งต้นหรือ Project Template เพื่อสร้าง Project ต่อๆ ไปได้ ทำให้ Project ใหม่ที่สร้างขึ้น มีฟังกชันพื้นฐานพร้อมใช้งานแล้ว ตามที่กำหนดไว้ใน Template เช่น มีระบบเมนู มีตัวอย่างหน้าจอพร้อมการเชื่อมต่อฐานข้อมูล มีระบบ Authentication เป็นต้น ฟังกชันพื้นฐานต่าง ๆ เหล่านี้ จะทำให้เราสามารถเริ่ม Project ใหม่ได้อย่างรวดเร็ว

    วิธีการสร้าง Project Template ด้วย Visual Studio 2022 หลังจากที่เราเตรียม Project ตั้งต้นไว้แล้ว ดังนี้

    1. ไปที่เมนู Project -> Export Template

    2. Export Template Wizard เลือก Project template จากนั้นคลิก Next

    3. ระบุ Template name, Template description, Icon Image จากนั้นคลิก Finish

    เท่านี้ก็จะทำให้ได้ไฟล์ Project Template ไปใช้งานแล้ว โดย Visual Studio จะทำการนำเข้า Project Template ที่สร้างขึ้นมาให้โดยอัตโนมัติ ทำให้เราสามารถใช้สร้าง Project ใหม่ได้เลย

    วิธีการสร้าง Project ใหม่ จาก DIISBlazorTemplate

    1. เปิด Visual Studio 2022 ขึ้นมา แล้วไปที่เมนู File -> New -> Project
    2. จะปรากฏหน้าจอ Create a new project ให้เราพิมพ์ชื่อ DIIS ในช่องค้นหา ก็จะเจอผลลัพธ์ดังรูป ให้เลือก DIISBlazorTemplate และคลิกปุ่ม Next

    3. หน้าจอ Configure your new project ให้ระบุ Project name, Location จากนั้นคลิก Create

    4. ผลลัพธ์ที่ได้จะเป็น Project ใหม่ ดังรูป

    5. ทดลองรัน Project จะพบว่า เราสามารถใช้ฟังกชันพื้นฐานต่าง ๆ ได้ตามที่กำหนดไว้ใน Project ตั้งต้น เช่น การ Authentication, หน้าจอแสดงข้อมูลที่ได้จากการ Query จากฐานข้อมูล เป็นต้น

    หน้าจอเข้าสู่ระบบ
    หน้าจอตัวอย่างการแสดงผลข้อมูลจากฐานข้อมูล
  • สร้าง Dashboard ต้องคิดถึงอะไรบ้าง

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

    รูปแบบการวิเคราะห์ข้อมูลเบื้องต้น

    1.ต้องการแสดงความสัมพันธ์ (Relationship) เพื่อเชื่อมต่อสองข้อมูลตัวแปรที่สนใจ หรือมากกว่านั้น เช่น จังหวัดที่เกิดกับวิทยาเขตที่เรียน

    รูปแสดงตัวอย่างการวิเคราะห์ความสัมพันธ์ (Relationship)


    2.ต้องการเปรียบเทียบข้อมูล (Comparison) ใช้ Bar chart หรือ line chart เพื่อแสดงข้อมูลรับนักศึกษาในแต่ละปี

    รูปแสดงตัวอย่างการวิเคราะห์ข้อมูลแบบเปรียบเทียบ (Comparison)


    3.ต้องการแสดงการเปลี่ยนแปลงข้อมูลตามช่วงเวลา (Trend)

    รูปแสดงตัวอย่างการวิเคราะห์เปลี่ยนแปลงข้อมูลตามช่วงเวลา (Trend)


    4.ต้องการแสดงการจ่ายของข้อมูล (Distribution) โดยการเอาข้อมูลมาจัดกลุ่ม (Grouping) หรือเรียง (Ranking) แล้วนับจำนวนเพื่อดูการกระจายของข้อมูล
    เช่น อายุงานบุคลากรแยกทุก 10 ปีของการทำงาน เพื่อดูว่าบุคลากรส่วนใหญ่อายุงานอยู่ที่กี่ปี เป็นต้น

    รูปแสดงตัวอย่างการวิเคราะห์การจ่ายของข้อมูล (Distribution)

    สิ่งที่ต้องเอาใจใส่

    1. เลือก Data Visualization ให้ตรงกับจุดประสงค์ของการนำเสนอ และผู้ใช้งานต้องเข้าใจ Visualization ที่ใช้ด้วยเป็นสำคัญ
    2. โทนสีที่เลือกใช้งานควรจะไม่มากเกินไป และควรจะเป็นโทนเดียวกัน (ลองค้นหาตารางโทนสีใน Google ดูครับ)
    3. ควรจะคำนึงถึง ขนาด สี ที่มีความสัมพันธ์กัน เช่น ใน 1 Dashboard ใช้สีชมพูแทนเพศหญิง ก็ควรจะใช้สีชมพูในแต่ละ Visualization เพื่อแทนเพศหญิงเหมือนกัน
    4. ทำให้ผู้ใช้งานมองติดตามข้อมูลได้ง่ายและเข้าใจ
    5. การมีเส้นนำสายตาก็จะมีผลต่อการแบ่งกลุ่มข้อมูลโดยอัตโนมัติสำหรับผู้ใช้งาน
    6. (five-second rule) กฏ 5 วินาที Dashboard ควรจะตอบโจทย์ที่ได้รับมาโดยการมองเพียงแค่ 5 วินาที ซึ่งต้องได้คำตอบหลักแล้ว ส่วนถ้าต้องการหาสาเหตุหรือต้องการข้อมูลเชิงลึกก็จะเข้าส่วน
    7. ออกแบบแบบปรามิดคว่ำ คือส่วนบน เป็น indicators ส่วนที่ 2 เป็น Trends ส่วนที่ 3 เป็น รายละเอียด
    8. ใน 1 Dashboard ควรมี Visualization ประมาณ 5-9 Visualization (ตามข้อมูลการศึกษาการรับรู้ของสมองมนุษย์จะเข้าใจภาพได้ประมาณ 7 +- 2)
    9. จำไว้ว่าข้อมูลสมบูรณ์ครบถ้วน ไม่สู่ตอบโจทย์ที่ผู้ใช้ต้องการนะครับ เพราะเราต้องการตอบสนองผู้ใช้งานไม่ใช่ตอบสนองข้อมูลหรือตัวผู้จัดทำ Dashboard

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

    อ้างอิง :

    https://www.sisense.com/blog/4-design-principles-creating-better-dashboards/
    https://realmonkey.co/web-design/principles-of-effective-dashboard-design/
    https://www.netsolutions.com/insights/good-dashboard-design-principles/
    https://wandr.studio/blog/dashboard-design-principles/
    https://medium.com/madt-and-bads-nida/4-principles-of-dashboard-design-%E0%B8%AB%E0%B8%B1%E0%B8%A7%E0%B9%83%E0%B8%88-4-%E0%B8%82%E0%B9%89%E0%B8%AD%E0%B8%AA%E0%B8%B3%E0%B8%AB%E0%B8%A3%E0%B8%B1%E0%B8%9A%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%AD%E0%B8%AD%E0%B8%81%E0%B9%81%E0%B8%9A%E0%B8%9A-dashboard-957b79e0179a

  • การสร้างรหัสผ่านให้ไฟล์ PDF

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

    1. เข้าเว็บ https://www.ilovepdf.com/protect-pdf


    2. คลิก Select PDF

    3. เลือกไฟล์ PDF ที่ต้องการสร้างรหัสผ่าน

    4. ระบุรหัสผ่านให้เหมือนกันทั้ง 2 ช่อง จากนั้นกดปุ่ม Protect PDF

    5. ระบบจะสร้างรหัสผ่าน ให้กดปุ่ม Download protected PDFs เพื่อ Download เอกสารไปใช้งาน

    6. เมื่อ Download เรียบร้อยแล้ว ทดลองเปิดไฟล์ PDF จะพบว่า ไฟล์ของเราปรากฏให้ใส่รหัสผ่านก่อน

    7. เมื่อใส่รหัสผ่านที่เราได้ตั้งค่าไว้ ก็จะสามารถเปิดไฟล์ PDF ได้

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