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

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

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

  • โต๊ะลงทะเบียนมี 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 ไว้ให้ห่างตีนกรรมการ


Rss Commenti

4 Comments

  1. ขำพิทอะ

    #1 กกก
  2. ที่บ้านใช้ Wireless router ของ Zyxel (จำชื่อรุ่นไม่ได้) ก็ไม่ค่อยดีจริงๆนั่นแหละ แต่ Netgear ที่เคยใช้อีกรุ่นหนึ่งก็ไม่ดีกว่ากันเท่าไร ต่อสายเอาปลอดภัยสุดจริงๆ แต่ต้องหาอะไรครอบสายกันคนเท้าหนักอีก -_-

    อ้อ เก็บ Server ให้ห่างกรรมการดูจะเป็นทางเลือกที่สะดวกกว่าในตัวอย่างนี้!

    #2 s65
  3. แล้วสรุปว่าใช้เวลาทำกี่ชั่วโมงครับ

    #3 wiennat
  4. ตกไปข้อนึงมั้งพี่ สำหรับปัจจัยที่ควบคุมไม่ได้

    - ต้องเตรียมพัดลมไว้เอาใจ access point ด้วย เพราะหากท่านร้อน ท่านก็จะไม่จ่าย IP ครับ

    555+

    #4 mormmam

Leave a comment