
MoCA from paper to application
หลายๆก็คงทราบว่าในยุคปัจจุบัน อะไรๆหลายอย่างได้มาเป็น applications หมดแล้ว เนื่องจากง่ายต่อการเก็บข้อมูลและการใช้งาน พวกเราจึงได้รับมอบหมายให้ทำ application ที่มีชื่อว่า MoCA
MoCA ย่อมาจาก Montreal Cognitive Assessment ซึ่งเป็นแบบทดสอบที่ใช้จำแนก ผู้ป่วยโรคสมองอย่างรวดเร็วสำหรับผู้ที่มี Mild Cognitive Dysfunction โดยสามารถหน้าที่ด้านต่างๆได้ดังนี้ ความตั้งใจ ,สมาธิ, การบริหารจัดการ (Executive function), ความจำ, ทักษะสัมพันธ์ของสายตากับการสร้างรูปแบบ (Visuoconstructional skills), ความคิดรวบยอด , การคิดคำนวณ และการรับรู้สภาวะรอบตัว (Orientation) ใช้เวลาประเมินทั้งหมดประมาณ 10 นาที โดยมีคะแนนเต็ม 30 คะแนน โดยมีจุดตัดในการตรวจคัดกรองโรคที่ค่าคะแนน < 25 คะแนน โดยมีค่าความไวร้อยละ 90 และค่าจำเพาะร้อยละ 87
โดย MoCA test ในรูปแบบ Paper จะมีหน้าต่างดังนี้

มารู้จัก Frameworks ที่ใช้กันเถอะ !!
โดยเรานั้นจะทำ iPad Application โดยใช้ SwiftUI framework, Alamofire ในการเขียน application ตัวนี้ขึ้นมา ในส่วนของ Back-end นั้นเราได้เลือก Golang, Gin framework ในการทำ APIs และในส่วนของ database นั้นเราใช้ MariaDB และ Redis เป็น in-memory data structure store


ตัวอย่าง Views ใน Application ของเรา
โดยเราจะแบ่ง Views หลักๆของเราตามหัวข้อใน MoCA test

หน้านี้จะเป็นหน้าที่ Staff จะ Login เข้ามาใน Application ของเรา โดยจะมีการแสดงถ้า Device ไม่ต่อ Internet หรือกรอก Username/Password ผิดจะมีการแสดง Alert เตือน โดย View นี้นั้นมีการ Request ไปที่ APIโดยจะเช็คว่า Result ที่ได้กลับมานั้น Successful หรือไม่

หน้า Visuospatial นั้นจะให้ Patient ลากเส้นโดยดูจากความสัมพันธ์ดังรูป โดยเราได้ใช้ PencilKit ในการสร้าง drawing ขึ้นมา และอีกทั้งยังทำการเก็บข้อมูลต่างๆของคนไข้ตอนที่ทำ test เช่น Coordinates, Force, Altitude, Azimuth, Timestamp เอาไปใช้ในการทำ Model Machine Learning ในอนาคตอีกด้วย

ใน NamingView นั้นเราจะให้ได้สร้าง Alert with Textfield ขึ้นมาสำหรับการส่งข้อมูลไปยัง Database อีกทั้งยังใช้ UIInterfaceOrientationMask.landscapeRight ในการหมุนหน้า Application ของเราไปยัง Staff โดยอัตโนมัติอีกด้วย

View นี้นั้นได้มีการใช้ UITapGestureRecognizer ในการสร้าง Custom TapGesture ของเราขึ้นมาเอง เนื่องจากในหน้านี้นั้นจะมีการกดปุ่มที่ต้องคำนวณ Timestamp อย่างแม่นยำและต้องดูระยะเวลาที่กดค้างไว้ด้วย จึงต้องมีการสร้าง Gesture ขึ้นมาใช้เอง

ในส่วนของ View นี้นั้นมีการใช้ LifeCycle ของตัว View ของเรา โดยจะมีการเล่นเสียงคำสั่งเมื่อ View นี้นั้นได้เข้ามาอยู่ใน Foreground State โดยใช้คำสั่ง onAppear อีกทั้งใน View นี้เราได้ใช้ AVAudioRecorder และ AVAudioPlayer ในการบันทึกและเล่นเสียงตามลำดับ โดยเราใน Model ของเรานั้นได้ทำการ try-catch ในส่วนของเราเล่นเสียง เนื่องจากเสียงที่เล่นนั้นจะเป็นเสียงที่เราไป Request มาจึงมีโอกาสที่จะ Fail ได้ในบางกรณี ซึ่งเป็นสาเหตุที่ทำให้ Application Crash ได้

SummaryView นั้นจะเป็น View สุดท้ายสำหรับการ test แต่ละครั้ง View นี้นั้นจะเป็นการ Recheck ผลของการ test โดยเป็นการดึงข้อมูลจาก Database มา Display ทั้งนั้น และมีการคำนวณคะแนนหน้านี้ด้วย Structure หลักๆของ View นี้จะเป็น ScrollView และการคำนวณคะแนนนั้นมีการแสดงผลแบบ Dynamic และสุดท้ายและจะทำการส่งข้อมูลทั้งหมดที่ Staff เช็คแล้วไปยัง Database และ Application จะกลับไปสู่หน้า Register อีกครั้ง
ทีนี้เรามาดูที่ฝั่ง Back-end กันบ้างดีกว่า
ในส่วนของ Architecture

ส่วนสำหรับฝั่ง Backend นะครับ Stack ที่เลือกใช้กันเป็น Golang สำหรับเซิฟเวอร์ Backend, MariaDB (คล้ายๆ MySQL) สำหรับ Database, แล้วก็เป็น Redis เสริมเข้ามา เป็นตัวเก็บข้อมูลแบบ Temporary เอาไว้ Handle เกี่ยวกับข้อมูลระหว่าง Session โดยเฉพาะเลย ทั้งหมดนี้ครอบด้วย Docker ซึ่งมี Nginx Proxy ดักอีกทีครับ
สำหรับ Phase แรกที่คุยกันสำหรับแอพนี้ จะมีแค่ 3 ตัวครับ ส่วนภาพข้างต้นจะรวมไปถึงหน้าเว็บ Admin และ Machine Learning Server สำหรับ Phase ต่อๆไปด้วย
Golang คืออะไร ?
ภาษา Golang เป็นภาษาที่ค่อนข้างแปลกสำหรับบางคนนะครับ ส่วนตัวมองว่าเป็นภาษาที่ลักษณะการเขียนกับไวยากรณ์การเขียน เหมือนเอา C มาผสมกับ Python ก็คือมองรวมๆแล้วค่อนข้างใช้งานสะดวกครับ ใช้ง่าย แต่กลับใช้ Compiler + Type Safety ก็เลยเป็นข้อดี (หรือข้อเสีย? แล้วแต่คนมั้งครับ 555) ที่เพิ่มขึ้นมาจาก Python อีกครับ
นอกจาก Type Safety แล้ว Golang จัดการเรื่อง Thread ได้ดีกว่า Python มากๆ (แต่จริงๆใน Golang จะจัดการตรงนี้โดยการใช้ goroutine ซึ่งย่อยลงมาจาก Thread ทั่วๆไปอีกครับ ส่วนตรงนี้แนะนำให้หาอ่านเพิ่มเติมตามเน็ตครับ) ส่วน Framework ที่ใช้ในงานนี้จะเป็น Gin-Gonic สำหรับการทำ Backend Server ซึ่งลึกๆก็จะจัดการ goroutine ให้อยู่แล้ว ก็เลยไม่ต้องแตะ goroutine อะไรมากครับ

ส่วนเรื่องอื่นๆของ Backend ที่นอกจาก Architecture เรียนตามตรงว่ามีเยอะมากๆจนเลือกมาพูดในนี้ไม่ถูกเลยครับ 555555 เอาที่นึกออกตอนนี้ก็อาจจะได้โอกาสดีที่ได้ใช้ Server ของทางคณะแพทย์ครับ (ใช้ On-Premise นะครับงานนี้ พอดีด้วยเหตุผลทางกฎหมายเลยใช้ Cloud ไม่ได้) นอกจากนั้นก็คงเป็นโอกาสได้เรียนรู้เรื่องอื่นๆด้วย เช่น ทักษะการใช้ Ubuntu (ใช้จนคล่องเลยครับ ด้วยความที่เป็น On-Prem ก็เลยได้ Deploy เองด้วย ssh scp อยู่ตลอด เรียกได้ว่าสนุกสนานกันเลยทีเดียว ;-;), ทักษะการ Debug (Bug มาเรื่อยๆเลยครับ อาจจะเป็นเพราะผมเองด้วยก็ได้ 555555 ก็เลยกลายเป็นว่าได้เรียนรู้จากพี่ๆที่เข้ามาช่วย ว่าในโลกจริงๆ เค้าทำ Debug กันยังไง มีการ Logging ฯลฯ), Security (ตรงนี้ผมเจอเองจังๆเลยครับ ซึ่งก็ค่อนข้างทำผมเสียวหลังวูบอยู่เหมือนกัน 555 ตอนกำลังอ่าน Log ของ Nginx อยู่กับพี่ๆ ก็ได้เห็นเลยครับ ว่าจะมี IP Address แปลกๆ คอยแสกน Port เราตลอดเวลาเลยครับ /index เอย ทั้ง /phpMyAdmin เอย เต็มไปหมดเลยครับ โชคดีที่ไม่ได้ใช้ Database Portal ไรพวกนั้น 55), Cryptography (ก็ได้พอรู้พวกเบื้องต้นครับ เพราะ กลัวจะมี attack ตลอด ก็เลยต้องมีพวก Hash Password, Encrypt/Decrypt Sensitive Data ฯลฯ), นอกเรื่องจากพวกนี้ แถมยังได้ Generate .pdf จาก Golang อีกครับ (ซึ่งก็ยากลำบากพอควร) เพราะว่าทางแพทย์จำเป็นต้องมี Report การทำเทส App นี้เสร็จ ไปเข้าระบบข้อมูลของโรงพยาบาลครับ รวมๆแล้วฝั่ง Backend ก็ค่อนข้างเปิดโลกใช้ได้เลยครับ มีอะไรให้เรียนรู้เต็มไปหมด
สิ่งที่ได้จากการทำ Project นี้
สิ่งที่ได้จากการทำงานในครั้งนี้ ก็คือทักษะในการพัฒนา Application ด้วยภาษาใหม่ๆที่ไม่เคยได้ใช้ และยิ่งไปกว่านั้นก็คือการได้ทำงานเป็นทีมร่วมกับผู้อื่นโดยมีการแบ่งฝ่ายทำอย่างจริงจังเป็นครั้งแรกในชีวิต ซึ่งถือว่าเป็น Project ที่ใหญ่ที่สุดในชีวิตที่พวกผมได้เคยทำมาเลยครับ ถือว่าคุ้มค่ามากๆที่ได้ร่วมทำงานกับพี่ๆที่มีประสบการณ์ ได้เรียนรู้ระบบการทำงานต่างๆมากมายครับ :-)
Our team

นายพลเอก ตั้งมั่นจิตธรรม
นายธนัยนันท์ ลิ
นายอลงกต อินทรกำแหง
นิสิตชั้นปีที่ 2 คณะวิศวกรรมศาสตร์ สาขาวิศวกรรมคอมพิวเตอร์