My Desktop

สืบเนื่องจาก my physical desktop ของ bact’ เจ้าตัวบอกว่าอยากเห็นของคนอื่นบ้าง ก็เลยเอามาให้ดู อันนี้เป็นโต๊ะที่ทำงาน

My physical desktop
คลิกที่รูปเพื่อดูโน้ต

ดูเหมือนจะยังรกสู้ของคนอื่นไม่ได้

Level of reliability

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

ขั้นตอนการทำงานของระบบ ตอนแรกคือ ผู้สมัครลงทะเบียนผ่านเวบไว้ก่อนแล้ว พอมาถึงวันงานก็จะมาลงทะเบียนพร้อมกับถ่ายรูปที่หน้างาน ขั้นตอนนี้จะได้หมายเลขประจำตัวของแต่ละคนไป (เป็น 1, 2, 3 เรียงไปเรื่อยๆ) เสร็จแล้วทีมงานก็จะปล่อยให้ผู้สมัครเข้าไปให้กรรมการดูทีละ 10 คน ซึ่งตอนนี้ไม่ต้องรอให้ผู้สมัครทุกคนลงทะเบียนเสร็จก่อน คือลงทะเบียน ถ่ายรูปเสร็จ ครบ 10 คนเมื่อไหร่ก็ปล่อยเข้าไปให้กรรมการให้คะแนนได้เลย พอให้คะแนนครบทุกคนแล้ว ระบบจะรวมคะแนน เรียงลำดับตามคะแนนมากไปน้อย แสดงผลให้กรรมการเข้าไปตัดสินใจเลือกกันเองอีกครั้งหนึ่ง รอบแรกคัดคนให้เหลือ 70 คน หลังจากประกาศรายชื่อแล้วก็มีให้คะแนนรอบสอง แต่คราวนี้ให้เข้ามาทีละ 7 คน กรรมการให้คะแนน รวมคะแนน เหมือนเดิม

หน้าตาของระบบเป็นแบบนี้ เทคโนโลยีก็ใช้เป็น web-based ธรรมดา

Network layout

  • โต๊ะลงทะเบียนมี laptop 2 เครื่อง เครื่องนึงต่อกับกล้องถ่ายรูป อีกเครื่องนึงสำหรับลงทะเบียน รันวินโดวส์ ต่อ wireless
  • Server เป็น Linux (น่าจะเป็น Fedora) รัน Apache + PHP + MySql
  • ห้องกรรมการมี laptop สำหรับดูผลรวมคะแนน และคัดเลือกผู้เข้ารอบ รันวินโดวส์ ต่อ wireless
  • เวลาประกวด กรรมการจะนั่งอยู่ใน auditorium มีคอมคนละตัวเอาไว้ให้คะแนน ตรงนี้กรรมการ 5 คนใช้เครื่องรันวินโดวส์ ให้คะแนนผ่านบราวเซอร์ Firefox 2 แต่ละเครื่องต่อ LAN (100 Mb/s)
  • Wireless router ต่อสาย LAN ออกมาจากห้อง auditorium เพื่อกระจายสัญญาณให้กับจุดลงทะเบียนกับห้องรวมคะแนน รัศมีประมาณ 10-20 เมตร

ขั้นตอนทางเทคนิคที่ทำคือ

  • เนื่องจากมีข้อมูลของผู้สมัครแต่ละคนอยู่แล้ว สิ่งที่ต้องทำคือเอารูปที่ถ่าย match กับ profile ให้ตรงกัน และ generate หมายเลขให้แต่ละคน แต่เนื่องจากเครื่องที่ใช้ถ่ายรูปกับเครื่องที่ลงทะเบียนเป็นคนละเครื่อง ก็เลยต้องแชร์ไฟล์ผ่านทาง windows share
  • คนไหนลงทะเบียนเสร็จ ข้อมูลใน server ก็จะถูกอัพเดต ตัว client ในเครื่องของกรรมการจะเอาข้อมูลนี้มาแสดงผล ทีละ 10 คน
  • พอประกวดเสร็จ กรรมการประชุมกัน คัดเลือกผู้ที่ผ่านเข้ารอบ 2 จากนั้นก็ประกวดรอบ 2 กันต่อ โดย client ที่กรรมการใช้ให้คะแนนในรอบ 2 ก็จะต้องแสดงข้อมูลของเฉพาะคนที่ผ่านเข้ารอบด้วย

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

  • ปัจจัยที่ควบคุมไม่ได้ด้วยคอมพิวเตอร์มีเยอะมาก เช่น การจัดคิวผู้สมัครให้เดินเข้ามาตามหลายเลขที่ได้รับ ยังไงตรงนี้ก็ต้องเตี๊ยมกับคนจัดคิวให้ดีว่า ให้มาทีละกี่คน เรียงลำดับยังไง ซึ่งระบบเตรียมเผื่อกรณีที่คิวมันมั่วไว้แล้วระดับนึง
  • อย่าเอา wireless router ไปวางตรงจุดที่มีคนเดินผ่านไปผ่านมา สัญญาณอาจจะขาดหายเป็นพักๆ ได้ (หรือเป็นเพราะ router ยี่ห้อ Zyxel มันห่วย?)
  • ถ้าเป็นไปได้ ใช้ wired network จะชัวร์กว่า
  • เตรียม UPS ให้พร้อม กรณีที่อาจมีคนเดินเตะปลั๊กหลุด
  • client สำหรับลงคะแนน เป็น web-based ต้องออกแบบ interface ให้เป็นมิตรกับกรรมการ (แก่ๆ) ที่สุดเท่าที่จะเป็นไปได้
  • client สำหรับลงคะแนน ออกแบบให้ใช้ mouse อย่างเดียว เลยต้องเอา keyboard ไปซ่อน ซึ่งจะให้ดี ต้องเก็บ keyboard ให้ห่างเท้ากรรมการที่สุด ห้ามวางไว้ใต้โต๊ะกรรมการเฉยๆ เด็ดขาด
  • เตรียม solution สำรองไว้เสมอ อย่างตรงจุดลงทะเบียน อยู่ๆ เครื่องลงทะเบียนก็ wireless หลุดไปเฉยๆ ต่อใหม่ไม่ได้ router ไม่แจก IP ให้ โชคดีที่มีเครื่องสำรอง แต่เป็น macbook ต่อเข้า windows share ลำบากเล็กน้อย แต่ก็พออาศัยประสบการณ์เอาตัวรอดมาได้
  • เตรียมทำ backdoor ให้ตัวเองเข้าไปแก้ไขระบบได้อย่างรวดเร็ว เช่น การแก้คะแนน, reset database, แก้ไขข้อมูลบางจุดที่ผิดพลาด ฯลฯ
  • อย่าเชื่อพวก magic number ที่ได้จาก requirement ทีแรกมากนัก (คัดรอบแรกเหลือ 70 คน, ปล่อยคนเข้าไปเดินทีละ 10 คน, เอาเฉพาะข้อมูล x, y, z มาแสดง, ฯลฯ) การจัด event พวกนี้ magic number ทั้งหลาย พร้อมจะเปลี่ยนตลอดเวลา จงเขียนโปรแกรมให้สามารถแก้ config เหล่านี้ได้ง่ายๆ

ถึงแม้จะเตรียมระบบไว้อย่างไรแต่เมื่อ event ดำเนินมาจนถึงการให้คะแนน 10 คนสุดท้าย จู่ๆ กรรมการก็ไม่สามารถ submit คะแนนเข้า server ได้ ลองตรวจดูก็พบว่า server ไม่ตอบสนองในช่วงเวลานั้น วิธีแก้ไขข้อมูลเฉพาะหน้าตอนนั้นก็คือ “แจกกระดาษ+ปากกา” ให้กรรมการใช้แทนในช่วงที่ทีมงานหาสาเหตุ

พบว่าสาเหตุที่จู่ๆ server ก็ดับไป เนื่องจากมีคนเตะปุ่ม power! ต้องใครซักคนในกรรมการน่ะแหละ! (Heinlein เคยบอกไว้ว่า “Never underestimate the power of human stupidity”)

หลังจาก boot server ขึ้นมาใหม่ ก็ใช้งานได้ตามปกติ
การป้องกันการเกิดเหตุ server ล่มแบบนี้ อาจจะต้องมี server 2 เครื่อง เป็น master กับ slave มีการ sync db log กันตลอดเวลา แล้วก็ให้ตัว master ปล่อย heartbeat ถ้าเครื่อง slave ไม่ได้ยิน heartbeat ติดต่อกันเป็นเวลาหนึ่งก็ให้ take over ทำตัวเป็น master แล้วทำงานเสียเอง

หรือไม่ก็เก็บ server ไว้ให้ห่างตีนกรรมการ