ไม่กี่วันก่อนนึกขึ้นมาได้ว่าเรามี Voucher สอบ JAVA certificate ฟรี ที่ได้มาจาก Sun ตอนไปแข่ง Open Jive นี่หว่า ว่าแล้วก็ลาก @iMuping กับ @toffeetoffee มาคุยกันว่าจะเอายังไง เพราะ voucher มันจะหมดอายุสิ้นปีนี้แล้ว ก็ตกลงกันว่าไปสอบวันที่ 24 (วันนี้) เพราะเป็นวันที่ทุกคนว่างตรงกัน (วันอื่นๆ แต่ละคนก็ติดสอบกลางภาคกันหมด)

หลังตกลงกันได้ก็เข้าไปสมัครในเว็บ http://www.prometric.com/ ก็กรอกข้อมูลต่างๆ ไป พอถึงตอนกดยืนยันถึงได้รู้ว่า voucher ที่ถืออยู่ในมือนี่มูลค่า 9569 บาทเลยทีเดียว! (แพงจังวุ้ย)

เอาล่ะ สมัครเสร็จก็ต้องเตรียมตัวสอบสินะ แต่ว่าปัญหาคือ ผมกำลังอยู่ช่วงสอบกลางภาคนี่สิ 😕
แล้วจะหาเวลาไหนอ่านล่ะเนี่ย สรุปแล้วก็เหลือแค่เวลาเดียว คือคืนก่อนไปสอบ! คุณพระ! ปกติเค้าเตรียมตัวกันไม่รู้กี่เดือน กว่าจะไปสอบ ไอ้นี่อาจหาญมาจากไหน เตรียมตัวคืนเดียว เช้าไปสอบ

คืนก่อนสอบ (23 ธ.ค.) ผมกับ @imuping และ @toffeetoffee ก็นั่งสุมหัวกันตั้งแต่หนึ่งทุ่ม จ้องหน้าจอโน้ตบุ๊คที่กำลังเปิด e-book เตรียมสอบ JAVA cert. ความยาว 700-800 หน้าเห็นจะได้ นั่งอ่านกันไปแบบผ่านๆ แว้บไปกินข้าวแป๊บนึงก็มาอ่านต่อ กว่าจะจบก็ปาเข้าไปห้าทุ่ม หลังจากนั้นก็เปิดหาตัวอย่างคำถามตามอินเตอร์เน็ต ก็ตอบได้บ้างไม่ได้บ้าง ใจหนึ่งก็เผื่อไว้แล้วล่ะว่า พรุ่งนี้เจ๊งแน่ๆ (เพิ่มเติม…)

เมื่อวันศุกร์ที่ผ่านมา ผมได้มีโอกาสได้ไปร่วมงาน Sun Developer Days 2009 ที่โรงแรม Intercontinental ในฐานะทีมรองชนะเลิศอันดับหนึ่งจากการแข่งขัน Open Jive 2009 ซึ่งสิ่งที่ทีมผมต้องไปทำในงานก็คือไปตั้งโต๊ะนำเสนอผลงานที่ใช้ส่งเข้าแข่งขัน

คนมาร่วมงานเยอะมาก… ดูจากรูปได้ครับ
(เพิ่มเติม…)

หลังจากคราวก่อนพูดเรื่อง Mediator ไปแล้ว คราวนี้ก็จะพูดเรื่อง Observer บ้าง 😀

Observer คือ pattern หนึ่งของการเขียนโปรแกรมเชิงวัตถุ โดยให้วัตถุหนึ่งมีความสามารถในการรับรู้การเปลี่ยนแปลงข้อมูลในตัวแปรของวัตถุอีกตัวหนึ่งได้ แล้วจึงปรับเปลี่ยนการทำงานตามการเปลี่ยนค่านั้น

observer
จากตัวอย่างนี้ มีคลาส UserInterface ซึ่งทำหน้าที่รับ input จาก user ส่งไปให้คลาส XValue เพื่อคำนวณ(อะไรสักอย่าง) แล้วคลาส UserInterface ก็จะวาดกราฟจากผลลัพธ์ที่คำนวณได้

จาก diagram จะเห็นว่าคลาส XValue มีการ extends คลาส Observable มา ซึ่งเป็นคลาสที่มีมาให้ในจาวาแล้ว ส่วนคลาส UserInterface ก็ implements คลาส Observer ที่มีมาให้ในจาวาเช่นกัน

เมื่อ UserInterface ทำการส่งค่า input ไปให้ XValue ค่านั้นก็จะถูกนำไปคำนวณให้ได้คำตอบออกมา แล้วทำการเปลี่ยนค่า attribute ในคลาสตัวเองให้เป็นคำตอบใหม่ที่คำนวณได้ ตอนนี้เองที่ observer จะเข้ามามีบทบาท คือหลังจากที่ XValue ทำการเปลี่ยนค่า attribute แล้วก็จะต้องเรียกใช้ method ชื่อ notifyObservers() ที่ได้จากการ extends เพื่อเตือน Observer ทุกตัวว่ามีการเปลี่ยนแปลงค่าเกิดขึ้นแล้ว (รีบเข้ามาดูเร็วๆ) นั่นหมายความว่า Observer มีได้มากกว่าหนึ่งตัว (แต่ในตัวอย่างมีแค่ตัวเดียว)

หลังจากพวก Observer รับรู้แล้วว่ามีการเปลี่ยนแปลงค่า มันก็จะเรียกใช้ method ชื่อ update(Observable o, Object arg) โดยอัตโนมัติ ทีนี้ก็อยู่ที่เราแล้วว่าจะให้มันทำอะไรในนี้

ตัวอย่างอาจจะไม่ดีเท่าไหร่ เพราะมี observer แค่ตัวเดียว ซึ่งถ้าเป็นแบบนี้ก็ใช้วิธีเรียก method get/set เอาก็ได้ แต่ถามว่าถ้ามี object ที่การทำงานขึ้นกับค่า x ใน XValue สักยี่สิบตัวล่ะ จะเรียก get/set ยี่สิบรอบมั้ย… ก็คงจะไม่ นี่แหละที่ Observer pattern จะเข้ามามีบทบาท 8)

ข้อมูลเพิ่มเติม: http://en.wikipedia.org/wiki/Observer_pattern

ทำไม้… ทำไม…

ทำไมเราถึงไม่หาหน่วยวัดเวลาที่มันเป๊ะกับธรรมชาติมากกว่านี้
1 วัน คือช่วงเวลาที่ดวงอาทิตย์เคลื่อนไปบนฟ้า ลับขอบฟ้าไป แล้วกลับมาโผล่ที่เดิม (เมื่อมองจากโลก) อันนี้รับได้
1 ปี คือช่วงเวลาที่โลกโคจรรอบดวงอาทิตย์ครบหนึ่งรอบพอดี อันนี้ก็พอรับได้
แต่ทำไม 1 ปี ต้องมี 12 เดือน แล้วแต่ล่ะเดือนก็ดันมีวันไม่เท่ากัน 30 บ้าง 31 บ้าง 28 บ้าง (ทุก 4 ปี กลายเป็น 29 วันอีก – -“)

บ่นมาตั้งนาน เกี่ยวอะไรกับ Java เนี่ย…
ก็คือว่า วันนี้โดนเพื่อนขอ (สั่ง) ให้ช่วยเขียน method คำนวณระยะห่างระหว่างวันสองวัน เช่น 28/06/2009 กับ 30/06/2009 ก็ห่างกันสองวัน
หลังจากนั่งงมอยู่พักหนึ่ง ก็ได้ความคิดที่จะใช้ java.util.Calendar เพราะว่ามันมี method ชื่อ getTimeInMillis() ที่ให้ค่ามิลลิวินาทีของเวลาปัจจุบันออกมา แหม… ดีจัง 🙂

ว่าแล้วข้าพเจ้าก็ละเลงหน้า Netbeans ด้วยโค้ดยุบยับ สร้าง Calendar มาสองตัว เอามาเก็บวันที่สองวัน เรียก millisecond ของทั้งคู่ เอามาลบกัน จับหารด้วย 1000,60,60 และ 24 ก็ได้ออกมาเป็นจำนวนวัน อะฮ้า~ ท่าจะเวิร์ก

ทดสอบโดยใส่วันแรกเป็น 16/06/2009 อีกวันเป็น 25/06/2009 ผลออกมาว่าห่างกัน 9 วัน
ว้าวววว… เป๊ะจริงๆ เขียนทีเดียวรันผ่าน ใช้ได้ด้วย MegaHappy ดีใจสุดๆ จริงๆ 😀

คราวนี้ลองใหม่ ใส่ 28/02/2009 กับ 01/03/2009 รันไปป๊าบบบ…

เจ๊งครับพี่น้อง ผลออกมาได้ 4 วัน!!!

งานเข้าแล้วไง ได้มาได้ไงเนี่ย สี่วัน จะบ้าเหรอ หมด 28 กุมภาฯ มันก็ขึ้นเดือนใหม่แล้วนะค้าบ
คิดไปคิดมาก็เลยสรุป(ตามความเข้าใจตัวเอง)ได้ว่า มันคิดเวลาโดยให้ทุกเดือนมี 31 วันสินะ…

มิน่าล่ะ เวลาเป็นเดือนเดียวกันมันคำนวณได้ ไม่พลาด แต่พอข้ามเดือนล่ะเจ๊ง – -”

ทำให้รู้สึกสงสัยขึ้นมาว่า ทำไม้ทำไม ต้องแบ่งเดือนให้มันไม่เท่ากันด้วย แบ่งเท่าๆ กันได้มั้ย ว่าที่โปรแกรมเมอร์อย่างผมจะได้เขียนตัวคำนวณง่ายๆ หน่อย เฮ้อ~

ตอนนี้ได้ความคิดว่า คงจะต้องเขียนเงื่อนไขคิดวันเดือนปีซะเองแล้วล่ะมั้ง แต่ว่า… ขี้เกียจอะ เอาไว้มีอารมณ์ค่อยลองเขียนแล้วกัน (โปรแกรมมิ่งก็เป็นศิลปะแขนงหนึ่งนะครับ ต้องใช้อารมณ์ในการเขียน LOL)

ปล. ตอนนี้ลองค้นไปเรื่อยๆ จนไปเจอไอ้นี่เข้า
ucar.nc2.units.DateRange

ก็ไม่รู้ว่าเวิร์กมั้ย เพราะยังไม่ได้ลอง เดี๋ยวว่างๆ ลองสักหน่อยดีกว่า 😀