สิงหาคม 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

Advertisements

**เนื้อหาต่อไปนี้ มีการกล่าวถึงเนื้อเรื่องบางส่วนของ You’re Under Arrest:the movie และ Die Hard 4.0 หากท่านไม่ต้องการเสียอรรถรสในการชมภาพยนตร์ กรุณาหลีกเลี่ยงการอ่านเนื้อหาต่อไปนี้**

ที่จริงผมก็ดูทั้ง You’re Under Arrest:the movie ที่เป็นอนิเมะ และ Die Hard 4.0 ที่เป็นหนังฮอลลีวู้ดจบไปตั้งนานแล้ว

แต่เมื่อไม่นานมานี้นึกครึ้มอกครึ้มใจ เอา You’re Under Arrest:the movie มาดูซ้ำอีกรอบ แล้วความคิดหนึ่งก็วิ่งเข้ามาในหัว “เฮ้ย! แนวคิดมันคล้ายๆ กันเลยนี่หว่า” ก็เลยเอา Die Hard 4.0 มาดูอีกสักรอบ แล้ววันนี้ก็ได้ฤกษ์เขียนบล็อกเปรียบเทียบกันซะเลย LOL

You’re Under Arrest:the movie เป็นการ์ตูนญี่ปุ่นฉบับฉายในโรงภาพยนตร์ที่ญี่ปุ่น เข้าฉายเมื่อปี 1999 (ข้อมูลเพิ่มเติมที่ http://www.imdb.com/title/tt0377008/)

ส่วน Die Hard 4.0 เป็นภาพยนตร์ฮอลลีวู้ดฟอร์มยักษ์ เข้าฉายปี 2007 (ข้อมูลเพิ่มเติมที่ http://www.imdb.com/title/tt0337978/) (เพิ่มเติม…)

หลังจากเรียนวิชา Object-oriented and design pattern มาได้ครึ่งเทอม ก็ถึงเวลานำสิ่งที่ได้เรียนมามาใช้สักที ถึงจะเป็นแค่การเอามาใช้ทำการบ้านก็เถอะ เพราะการบ้านที่อาจารย์ให้ทำมันไม่ได้ง่ายอย่างที่คิดเลย ไหนๆ ก็นั่งทำความเข้าใจเรื่องที่เรียนซะตั้งนาน (ไม่งั้นทำการบ้านไม่ได้) ก็ขอเอามาเขียนลงบล็อกซะหน่อยนะครับ (ฮา)

ตอนแรกกะว่าจะเขียนทีเดียวทั้ง Mediator และ Observer ซึ่งเป็น pattern สองตัวหลักๆ ที่ต้องใช้ในการทำการบ้านนี้ แต่ว่าดูท่าจะยาวเกินไป ก็เลยขอตัดเรื่อง Observer ไปเขียนเป็นเรื่องใหม่ดีกว่า 🙂

หลักการของ Mediator pattern พอสรุปได้ว่ามันคือรูปแบบการสร้างคลาสและออบเจ็กต์ โดยให้มีคลาสหนึ่งเป็นตัวกลาง (Mediator) ในการติดต่อคลาสอื่นๆ ในโปรแกรม

mediator1
จากตัวอย่าง สมมติว่าเป็นโปรแกรมระบบข้อมูลสักอย่าง ซึ่งข้อมูลถูกเก็บอยู่ใน DataEntity (ไม่ใช่ database นะ) แล้ว user จะทำการแก้ไขข้อมูลที่เก็บไว้ใน DataEntity ผ่านทาง GUI ที่สร้างขึ้นใน UserInterface

จากแผนภาพจะเห็นได้ว่าตัวที่ทำการ implement พวก Listener มาใช้ หรือก็คือตัวที่ตอบสนองต่อเหตุการณ์ต่างๆ ที่เกิดจากผู้ใช้ก็คือคลาส Mediator ไม่ใช่ UserInterface

คลาส UserInterface เป็นเพียงตัวสร้าง component ต่างๆ เช่น drop-down list หรือปุ่มกดต่างๆ

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

จะเห็นได้ว่า Mediator จะทำหน้าที่เป็นตัวกลางในการตอบสนองต่อเหตุการณ์ต่างๆ ที่เกิดขึ้น นอกจากนี้ยังใช้เป็นตัวกลางเพื่อให้ออบเจ็กต์ต่างๆ ทำงานร่วมกันได้ด้วย เช่น
mediator2
ในตัวอย่าง(ส่วนหนึ่งของการบ้านที่ต้องทำเลยนะเนี่ย) คลาส PostOffice ให้บริการระบบธนาณัติ โดยจะมีการสร้างออบเจ็กต์ของไปรษณีย์แต่ละสาขา แล้วก็สร้างออบเจ็กต์ของธนาณัติแต่ละใบเก็บไว้ใน list ของออบเจ็กต์ไปรษณีย์สาขาต่างๆ ซึ่งจากแผนภาพจะเห็นว่ามีออบเจ็กต์ของ PostOffice สามออบเจกต์ แล้วก็มีออบเจ็กต์ของ MoneyTransfer อีกสามออบเจ็กต์ ทั้งหมดทำงานร่วมกันได้ผ่านทาง Mediator นั่นคือ หากมีการส่งธนาณัติจากไปรษณีย์สาขาหนึ่งไปอีกสาขาหนึ่ง Mediator ก็จะรับหน้าที่ย้ายออบเจ็กต์ธนาณัติจากออบเจ็กต์ไปรษณีย์สาขาหนึ่งไปยังอีกสาขาหนึ่ง หรือก็คือ Mediator ทำหน้าที่ mapping ออบเจ็กต์ทุกตัวในระบบนั่นเอง

สามารถศึกษาข้อมูลเพิ่มเติมได้จาก http://en.wikipedia.org/wiki/Mediator_pattern (มีตัวอย่างโค้ดด้วย :D)

ยังจำกันได้ไหมครับ เมื่อประมาณสองปีก่อน ช่วงรัฐบาลที่นำโดยพลเอก สุรยุทธ์ จุลานนท์ ช่วงนั้นเป็นช่วงที่รัฐบาลเอาจริงเอาจังกับการกวาดล้างเว็บไซต์ที่มีเนื้อหาไม่เหมาะสม กระทบความมั่นคงของชาติ หมิ่นเบื้องสูง ฯลฯ

ซึ่งผลของนโยบายดังกล่าวคือ กระทรวงเทคโนโลยีสารสนเทศ หรือ ICT ได้ทำการบล็อคเว็บไซต์ทั้งในและต่างประเทศไปมากมายหลายเว็บไซต์ ซึ่งรวมถึงเว็บไซต์ชื่อดังอย่าง youtube และ wikipedia ที่มีเนื้อหาบางส่วนเข้าข่ายการดูหมิ่นเบื้องสูง

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

เมื่อเวลาผ่านไป ทุกอย่างก็กลับคืนสู่ภาวะปกติ เว็บไซต์ต่างๆ กลับมาใช้งานได้อีกครั้ง (ไม่นับบางเว็บไซต์ที่ถูกสั่งปิดไป) ทุกคนก็กลับมาอยู่บนโลกออนไลน์อย่างเป็นสุข จนอาจจะลืมไปว่า เราเคยเจอกันอะไรมา

แต่ผลของการกระทำครั้งนั้นมันยังเหลือตกค้างเป็นเศษซากอารยธรรมของกระทรวง ICT มาจนทุกวันนี้ สิ่งนั้นก็คือ veoh.com

veoh เป็นเว็บไซต์ที่ให้บริการวีดีโอออนไลน์ในลักษณะใกล้เคียงกับ youtube แต่สิ่งที่พิเศษกว่าคือ veoh.com มีโปรแกรม client ของตัวเอง ซึ่งอนุญาตให้ผู้ใช้ทำการติดตั้งลงบนเครื่องคอมพิวเตอร์ แล้วใช้โปรแกรมดังกล่าวเปิดดูวีดีโอต่างๆ ภายในเว็บไซต์ รวมถึงดาวน์โหลดวีดีโอเหล่านั้นลงเครื่องคอมพิวเตอร์ได้อีกด้วย

หากคุณเข้าไปที่หน้าเว็บไซต์ veoh คุณก็จะพบข้อความว่า

“Veoh is no longer available in THAILAND. If you are not in THAILAND or think you have received this message in error, please go to veoh.com and report the issue.”

บางคนอาจจะไม่รู้สึกอะไร อยากบล็อคก็บล็อคไป แต่สำหรับผม ผมรู้สึกเหมือนว่ามันเป็นคำพูดประชดคนไทย ในเมื่อคุณบล็อคเราได้ เราก็บล็อคคุณได้เหมือนกัน แม้ว่าจะผ่านมาประมาณสองปีแล้ว แต่ veoh ก็ยังคงบล็อค IP address จากประเทศไทยต่อไป…

ปล. ผมยังจำช่วงเวลานี้ได้ดี เพราะตอนนั้นเป็นช่วงที่อนิเมะเรื่อง You’re Under Arrest ภาคใหม่ (Full Throttle) เริ่มออกอากาศที่ญี่ปุ่น ซึ่งผมก็อาศัย veoh เป็นช่องทางในการดูอนิเมะเรื่องนี้ จนกระทั่งเว็บไซต์ถูกบล็อค ผมก็ต้องเลิกดูไปโดยปริยาย (ว่ากันว่าเว็บไซต์ถูกบล็อคเพราะมีการ์ตูนโป๊ ซึ่งผมก็ไม่เคยเห็น เลยไม่อาจทราบได้ว่ามีจริงหรือเปล่า) แต่ยังไงซะมันก็ยังมีช่องทางอื่นให้ดูอยู่ดีล่ะนะ

คำกล่าวที่ว่าต่างคนต่างความคิดยังคงเป็นจริงอยู่เสมอ แต่ละคนย่อมมีความคิดความเห็นแตกต่างกัน ขึ้นอยู่กับการคิดวิเคราะห์ การรับรู้ข้อมูล ประสบการณ์ ฯลฯ

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

แต่ถ้าความเห็นของคนส่วนมากนั้นไม่ได้มาจากการคิดวิเคราะห์ด้วยตนเองล่ะ? ถ้าหากคนส่วนใหญ่เหล่านั้นคิดเห็นไปในทางเดียวกันเพราะปัจจัยบางอย่าง ซึ่งที่เห็นกันทุกวันนี้ก็คงจะหนีไม่พ้นตัวบุคคล ที่เป็นผู้คิดวิเคราะห์ และโน้มน้าวให้ผู้อื่นคล้อยตาม จนคนส่วนใหญ่เห็นด้วยกับความคิดดังกล่าว

ยกตัวอย่างประเด็นร้อนเมื่อเร็วๆ นี้ก็คงเป็นเรื่อง Mr.Twitter ที่ @thaksinlive ได้รับคะแนนโหวตไปอย่างท่วมท้น ซึ่งก็ทำให้ฝ่ายที่ไม่เห็นด้วยกับ พ.ต.ท.ดร.ทักษิณ เกิดความเคลือบแคลงสงสัยถึงที่มาของคะแนนโหวตดังกล่าว หลายคนแสดงความเห็นว่ามาจากการเกณฑ์คนมาโหวต บ้างก็ว่ามาจากการเขียนสคริปต์ยิงคะแนนโหวตแบบทั้งวันทั้งคืน นอกจากนี้หลายคนยังเห็นว่า @thaksinlive ไม่ควรได้ Mr.Twitter เพราะเพิ่งเริ่มใช้งาน Twitter เพียงไม่กี่เดือน แถมยังส่งข้อความ หรือ tweet เพียงไม่กี่ครั้ง

ส่วนฝ่ายที่เห็นด้วยกับ พ.ต.ท.ดร.ทักษิณ ก็ออกมาแสดงความเห็นว่า การโหวตคือการออกคะแนนเสียงของมหาชน ใครพอใจโหวตให้ใครก็โหวตไป ใครได้คะแนนมากที่สุดก็ชนะไป และการโหวตก็เกิดจากความชื่นชอบของมหาชน ไม่เกี่ยวว่าจะส่งข้อความมากเท่าไร จะใช้งานมานานแค่ไหน

คำถามคือ หากคนที่ได้ที่หนึ่งนั่นไม่ใช่ @thaksinlive แต่เป็นคนอื่นล่ะ ผมขออนุญาตยกตัวอย่างเป็น “เบิร์ด ธงไชย แมคอินไตย์” ถ้าเบิร์ดเพิ่งเริ่มใช้งาน Twitter ได้เดือนเดียว ส่งข้อความแค่ 10 ข้อความ แต่จากการที่มีแฟนคลับมากมายทำให้มีผู้ติดตาม(follower)อย่างล้นหลาม รวมถึงคะแนนโหวตที่ถล่มทลาย จนได้ตำแหน่ง Mr.Twitter ไปครอง ผมถามว่าจะมีใครตั้งข้อครหากับเบิร์ดไหม จะมีคนคิดว่าเบิร์ดโกงคะแนนไหม จะมีคนคิดว่าเบิร์ดไม่สมควรได้ Mr.Twitter เพราะเพื่งเริ่มเล่นเพียงเดือนเดียวไหม

ในทางกลับกัน หาก @PM_Abhisit ได้เป็น Mr.Twitter จะเกิดอะไรขึ้น ก็คงไม่พ้นเรื่องประมาณว่า ฝ่ายที่ไม่เห็นด้วยกับนายอภิสิทธิ์ ออกมาแสดงความเห็นว่ามีการเกณฑ์คนมาโหวต ส่วนฝ่ายที่เห็นด้วยก็ออกมาแสดงความเห็นว่านี่เป็นคะแนนโหวตจากมหาชน

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

หากประชาธิปไตยยึดถือเสียงข้างมากเป็นที่ตั้ง แต่เสียงข้างมากนั้นถูกชักนำโดยคนไม่กี่คน ก็ไม่แปลกที่จะเกิดคำว่า “เผด็จการเสียงข้างมาก” …

ปล. เฮ้อ~ จากที่โหวตกันเล่นๆ สนุกๆ กลายเป็นอะไรไปแล้วก็ไม่รู้…

เคยไหมครับ อยากจะพิมพ์หน้าเว็บออกมาสักหน้า แต่ไม่ได้อยากได้ทุกอย่างในหน้านั้นอะ ซึ่งวิธีการแก้ก็คงไม่พ้นการ copy & paste ลงโปรแกรม word processing แล้วก็จัดหน้าตามที่อยากได้ แล้วค่อยสั่งพิมพ์

แต่วันนี้ไม่ต้องทำเช่นนั้นอีกต่อไป เพราะเรามีสิ่งดีๆ มานำเสนอแล้ว 😀
http://www.printwhatyoulike.com
printwhatyoulike

เพียงแค่คุณกรอก url ของหน้าเว็บที่อยากจะสั่งพิมพ์ลงไป ก็จะพบกับหน้าเว็บแบบนี้
printwhatyoulike_2

ทางซ้ายคือแถบเครื่องมือที่มีมาให้ใช้ในการจัดหน้าเว็บ ทางขวาก็คือหน้าเว็บที่อยากจะพิมพ์ (ในตัวอย่างคือ http://www.thairath.co.th)

เท่าที่ลองเล่นดู สามารถย่อ-ขยาย หรือแม้กระทั่งลบ content บนหน้าเว็บได้ ลด-เพิ่มขนาดตัวอักษรทั้งหน้าได้ ลบพื้นหลังของเว็บได้ สั่งลบรูปทั้งหมดบนหน้าเว็บได้

คิดว่าเว็บนี้น่าจะใช้ AJAX ในการจับ source code ของเว็บ แยกตามแท็กจำพวก <h1>, <p>, <div> ทำให้เราสามารถเลือก content บนหน้าเว็บที่อยากจะแก้ได้ (ตัวอย่างในรูปนั่นกำลังเลือกแถบอัตราแลกเปลี่ยนสกุลเงิน)

แต่สิ่งที่ยังทำไม่ได้คือการย้าย content จากที่หนึ่งไปอีกที่หนึ่ง ฉะนั้นถ้าอยากย้าย content เช่นย้ายรูปภาพจากด้านขวามาด้านซ้าย คุณก็คงต้องใช้ word processing อยู่ดี 😦

ก็เป็น online-service ที่น่าสนใจดีนะครับ

ขอได้รับความขอบคุณจาก @my_TORi ที่แนะนำเว็บดีๆ แบบนี้มาครับ 😀

เมื่อวันศุกร์ที่ผ่านมา ก่อนจะเดินทางกลับบ้าน(ราชบุรี) ผมก็ได้แว่บไปเดินเล่นที่ Kinokuniya สาขา Central World หลังจากที่เคยไปเดินมาหลายต่อหลายครั้ง แล้วก็ไม่เสียเงินแม้แต่บาทเดียว(แต่ก็ทำท่าจะเสียไปหลายรอบแล้วล่ะ) ในที่สุดวันนี้ผมก็เสียเงินให้คิโนะจนได้…

สิ่งที่ได้กลับมาก็คือนี่… Strike Witches Official Fanbook

นับเป็นหนังสือแนว Fanbook/Artbook เล่มแรกในชีวิตเลยนะเนี่ย (ราคาพอๆ กับฟิกม่าตัวนึงเลยอ่า TT)

มาดูหน้าปกกันก่อน
IMG_1857_thumbnail (เพิ่มเติม…)

หน้าต่อไป