คนคอมพิวเตอร์

Archive for กันยายน 2008

 

 

หน้าแรก สารบัญ เกี่ยวกับบล็อกนี้ เกี่ยวกับผู้เขียน

เขียนโปรแกรมภาษา ActionScript เวอร์ชัน 3.0 เพื่อนำไฟล์ swf มาทำเป็นออพเจ็กต์และภาพเคลื่อนไหวไว้แสดงบนหน้าเว็บ

 

  • บทความ: เล่นภาพซับซ้อนใน ActionScript
  • เขียนโดย: ลาภลอย วานิชอังกูร www.laploy.com
  • เขียนเมื่อ: วันพุธที่ 26 กันยายน พ.ศ. 2550

นี่คือตอนที่สามของบทความชุด “เรียนรู้ด้วยตนเอง OOP AS3” สำหรับท่านผู้อ่านที่ไม่เคยอ่านสอนตอนแรก ขอให้เข้าใจว่านี่คือบทความเกี่ยวกับการสร้างสคริปต์ฝั่งไคลอัน (client script) เพื่อสร้างเว็บแอพลิเกชันที่มีอินเตอร์เฟสหรูหรา (rich internet application)

ภาษาที่ใช้คือ ActionScript เวอร์ชัน 3.0 (ต่อไปจะเรียกย่อว่า AS3) เป็นภาษาสมัยใหม่ มีรูปแบบในการเขียนโปรแกรมแบบวัตถุวิธีเหมือนจาวาและ C# เครื่องมือที่ใช้คือ Adobe Flex Builder 2 (ต่อไปจะเรียกย่อว่า Flex)เป็น IDE (Integrated Development Environment) ที่มีวิธีใช้คล้ายไมโครซอฟต์ วิสชวล สตูดิโอ และเน็ตบีน ผลลัพธ์ที่ได้เป็นไฟล์ swf นำไปบูรณาการในหน้าเว็บก็ได้ หรือจะทำเป็นเว็บแอพลิเกชันเดี่ยว (stand alone web application) ก็ได้

บทความตอนที่แล้วผู้เขียนแนะนำวิธีเขียนโค้ดสร้างลูกศรหันตามเมาส์ ผู้อ่านท่านหนึ่งถามมาในอีเมลว่า นอกจากรูปทรงง่ายๆ อย่างภาพลูกศรแล้ว เราจะนำภาพวาด (vector graphic)ที่เป็นไฟล์นามสกุล swf (Shock Wave Flash บางทีเรียกว่า Flash Movie เป็นไฟล์ที่สร้างจากแฟลช) มาใช้เป็นออพเจ็กต์ใน AS3 จะได้ไหม คำตอบคือได้ และทำได้ง่ายมากด้วย

 

บทความตอนนี้ผู้เขียนจะสาทิตวิธีนำ swf มาใช้สามโปรเจคคือ

 

· LoyAS0301 : แสดงภาพเคลื่อนไหวแบบง่ายที่สุด (ดูตัวอย่าง)

 

 

· LoyAS0302 : สร้างออพเจ็กต์หลายๆ ตัวจาก swf เดียว แล้วเพิ่มจำนวนโดยใช้ตัวจับเวลา (ดูตัวอย่าง)

 

 

· LoyAS0303 : สร้างฉากหลังเป็นออพเจ็กต์ และมีตัวการ์ตูนเดินข้างหน้า (ดูตัวอย่าง)

 

 

 

โปรเจค LoyAS0301

โปรเจคนี้แสดงโค้ดสั้นสุดเพื่อดึงไฟล์ swf เข้ามาเป็นออกเจ็กต์ในคลาส หัวใจของการทำงานคือคลาส Loader ซึ่งเป็นคลาสที่นิยามไว้ภายในเนมสเปส flash.display (อยู่ในรันทามของแฟลชเพลเยอร์) ภายในโปรเจคนี้เราจะนิยามคลาสเพียงคลาสเดียว เป็นคลาสชื่อเดียวกับโปรเจค โดยมีรายละเอียดโค้ดดังนี้

 

คลาส LoyAS0301

 

บรรทัดที่ 3 ในคลาส LoyAS0301 ทำหน้าที่ดึงเนมสเปส display มารวมไว้ในเพคเกจนี้ เพราะเราต้องการใช้คลาส Sprite และ Loader ที่อยู่ในนั้น บรรทัด 4 ดึงเนมสเปส net เพราะเราต้องการใช้คลาส URLRequest

บรรทัดที่ 6 ประกาศส่วนหัวของคลาส คำสั่ง extends ทำหน้าที่บอกว่าคลาสนี้สืบคุณสมบัติจากคลาส Sprite ขอให้เข้าใจว่า Sprite (สไปร์ต) ในที่นี้คือ มูวีคลิป (MovieClip) แบบไม่อาศัยเส้นบอกเวลา (timeline)เพราะการเขียนโปรแกรมภาษา AS3 เราจะไม่ใช้เส้นบอกเวลาอย่างใน AS เวอร์ชันก่อน

บรรทัดที่ 8 ถึง 16 คือคอนสทรักเตอร์ของคลาสนี้ เนื่องจากคลาสนี้เป็นคลาสระดับบนสุด ทำให้มันมีภาวะเหมือนคลาส Main ในจาวาและ C# คือเป็นสเตติก (static) และจะทำงานเองโดยอัตโนมัติเมื่อเรารันโปรแกรม

บรรทัดที่ 10 สร้างออพเจ็กต์ (ที่มีตัวแปรอ้างอิง) ชื่อ myLoader จากคลาส Loader เราจะใช้ออพเจ็กต์นี้ทำหน้าที่เก็บ swf บรรทัด 11 นำ myLoader ไปบรรจุไว้ในคลอเลคชัน (collection) ของสไปร์ตนี้ (คือในกลุ่มออพเจ็กต์ภายในคลาส LoyAS0301)

บรรทัด 12 กำหนดที่อยู่ของ swf ผู้เขียนใส่ไฟล์ชื่อ loy.swf ไว้ภายในเว็บไซต์ของผู้เขียนแล้ว เป็นไฟล์แสดงโลโกของเว็บไซต์ myURL เป็นออพเจ็กต์ทำหน้าที่อ้างอิงที่อยู่ของไฟล์ในอินเตอร์เน็ต บรรทัด 13 ดึงไฟล์ loy.swf มาใส่ใน myLoader บรรทัด 14 และ 15 กำหนดตำแหน่งการแสดงภาพ loy.swf ในสไปรท์ AS0301 โดย x และ y กำหนดตำแหน่งแนวนอนและแนวตั้งตามลำดับ

 

โปรเจค LoyAS0302

โค้ดในโปรเจคที่ผ่านมาแม้จะทำงานได้ดี แต่ก็เป็นโค้ดที่นำกลับมาใช้ใหม่ได้ยาก ยกตัวอย่างเช่นหากเรามีไฟล์ swf เป็นภาพเมฆ แล้วเราต้องการสร้างภาพเมฆหลายๆ ก้อน หากใช้โค้ดแบบโปรแกรม AS0301 เราต้องเขียนโค้ดซ้ำๆ ยืดยาว อ่านเข้าใจยากและแก้ไขยาก จะดีกว่าหากเรานิยามคลาสขึ้นห่อหุ้ม (wrapped class) เพื่อซ่อนความซับซ้อนจากผู้ที่นำคลาสไปใช้งาน

ในโปรเจค AS0302 เราจะนิยามคลาสสองคลาส คลาสแรกชื่อ Fruit (อยู่ในไฟล์ Fruit.as อยู่ในโฟลเดอร์ LoyClass) เป็นคลาสที่นิยามไว้เพื่อใช้สร้างออพเจ็กต์ อีกคือคลาสหนึ่งคือ LoyAS0302 เรานิยามไว้เพื่อทดสอบการทำงานของ Fruit

โครงสร้างโฟลเดอร์ในโปรเจค LoyAS0302 คลาสระดับบนสุดคือ LoyAS0302 ทำหน้าที่เป็นจุดเริ่มการทำงานของโปรเจค (project entry point) ส่วนคลาสที่อยู่ในโฟลเดอร์ LoyClass เป็นคลาสผู้ให้บริการ (server class) ที่เรานิยามไว้เพื่อใช้สร้างออพเจ็กต์

 

คลาส Fruit

ผู้เขียนใช้โปรแกรม Adobe Illustrator 10 วาดภาพผลผลสตรอเบอรี จากนั้น export ไปเป็นไฟล์แบบ swf (ชื่อไฟล์ fruit01.swf) แล้วนำไปใส่ไว้ในเว็บไซต์ laploy.com ต่อไปเราจะนิยามคลาส Fruit เพื่อห่อหุ้มไฟล์นี้ โดยมีโค้ดดังนี้

 

คลาส Fruit

 

สมาชิกของคลาส Fruit

คลาส Fruit มีสมาชิกสามแบบดังนี้

  • ฟิลด์ข้อมูล : มีสองตัวคือ myLoader บรรทัดที่ 8 และ myURL บรรทัดที่ 9
  • พร็อพเพอร์ตี : มีสี่ตัวคือ set X, set Y, set ScaleX และ set ScaleY อยู่ที่บรรทัดที่ 11 ถึง 14 ตามลำดับ
  • คอนสทรักเตอร์ : ทำหน้าที่กำหนดค่าเริ่มต้นของออพเจ็กต์ อยู่ที่บรรทัด 16 ถึง 23
  • เมธอด : คือเมธอด Show ทำหน้าที่แสดงภาพสตรอเบอรี อยู่ที่บรรทัดที่ 23 ถึง 27

 

โค้ดในคลาส Fruit

โค้ดบรรทัดที่ 3 และ 4 ทำหน้าที่จับรวมเนมสเปสเหมือนที่อธิบายไปแล้วในโปรเจคที่ผ่านมา บรรทัดที่ 8 และ 9 เราประกาศฟิลด์สองตัวที่โค้ดทุกแห่งในคลาสสามารถเข้าถึงมันได้ (มีภาวะเหมือนตัวแปรท้องถิ่นของคลาส คือมีขอบเขต หรือ scope ตลอดทั่วทั้งคลาส)

พร็อพเพอร์ตี X ในบรรทัด 11 มีไว้เพื่อให้โค้ดภายนอก (client class คือคลาสที่จะนำคลาสนี้ไปสร้างออพเจ็กต์ ซึ่งในบทความนี้คือคลาส LoyAS0302) สามารถเปลี่ยนแปลงค่า x ของ myLoader ได้ ค่า x เป็นตัวกำหนดตำแหน่งทางแนวนอน ส่วนบรรทัด 12 คือค่า y ซึ่งกำหนดตำแหน่งทางแนวตั้ง

บรรทัดที่ 13 และ 14 คือพร็อพเพอร์ตี ScaleX และ ScaleY มีหน้าที่รับค่าจากโค้ดภายนอกมากำหนดให้ myLoader นี่คือวิธีกำหนดการย่อ-ขยายขนาดของสไปรท์ ยกตัวอย่างเช่น หากกำหนดให้ ScaleX และ ScaleY มีค่าเป็น 1 ออพเจ็กต์จะมีขนาดเท่ากับขนาดปรกติที่เราวาดไว้ หากกำหนดให้ ScaleX และ ScaleY มีค่าเป็น .5 ออพเจ็กต์จะมีขนาดเล็กลงครึ่งหนึ่ง และหากกำหนดค่าเป็น 2 ออพเจ็กต์จะโตขึ้นสองเท่า

โค้ดภายในคอนสทรักเตอร์ คือบรรทัดที่ 18 ถึง 21 กำหนดค่าเริ่มต้นให้แก่ออพเจ็กต์ โดยบรรทัด 18 และ 19 กำหนดขนาด ส่วนบรรทัด 20 และ 21 กำหนดตำแหน่ง การใส่โค้ดกำหนดค่าเริ่มต้นในคอนสทรักเตอร์ ช่วยให้ออพเจ็กต์ทำงานได้ แม้โค้ดภายนอกจะไม่ได้เซตพร็อพเพอร์ตีต่างๆ ไว้

บรรทัดที่ 23 ถึง 27 คือเมธอด Show ทำหน้าที่นำไฟล์ fruit01.swf มาบรรจุลงในพื้นที่วาดภาพ (stage) ในบรรทัด 23 จะเห็นว่าเมธอดนี้มีพารามิเตอร์หนึ่งตัวชื่อ bkg (คือ background หรือฉากหลัง) มีชนิดเป็น Stage (เป็นไทป์ที่นิยามไว้ flash.display) Stage คือที่เก็บกลุ่มออพเจ็กต์ (object container) เมื่อเราต้องการให้สไปรท์ใดปรากฏในพื้นที่แสดงภาพ (ของแฟลช) เราต้องบรรจุสไปรท์นั้นไว้ใน Stage โดยโค้ดภายนอกจะต้องทำหน้าที่ส่งค่าอ้างอิง Stage ของโปรแกรมมาให้

 

คลาส LoyAS0302

เมื่อนิยามคลาส Fruit เสร็จแล้วเราจะเขียนโค้ดเพื่อนำมันทดสอบการใช้งาน ผู้เขียนต้องการสร้างหน้าเว็บที่มีภาพสตรอเบอรีจำนวนหนึ่งร้อยลูก หากสร้างเป็นออพเจ็กต์ธรรดมาโค้ดจะยืดยาวมาก จึงต้องสร้างเป็นอาร์เรย์ของออพเจ็กต์ โดยให้อาร์เรย์นี้มีไทป์เป็น Fruit และมีหน่วยในอาร์เรย์ (array element) จำนวนหนึ่งร้อยหน่วย

ผู้เขียนต้องการให้สตรอเบอรีปรากฏขึ้นบนจอที่ละลูก แต่โปรแกรมทำงานงานเร็วมากจนแสดงครบร้อยลูกในคราวเดียว จึงต้องหาทางหน่วงการทำงานให้ช้าลงโดยใช้ ตัวหน่วงเวลา (timer)

 

คลาส LoyAS0302

 

โค้ดบรรทัดที่ 3 จับรวมไทป์ต่างๆ ภายในแพคเกจที่เราสร้างขึ้น (user package ชื่อ LoyClass ยูสเซอร์แพคเกจจะมีชื่อเดียวกับโฟลเดอร์) ผนวกเข้ามาในแพคเกจนี้ด้วย เครื่องหมายดอกจัน (* ทำหน้าที่เหมือน wildcards ในดอส)หมายถึงเอามาทั้งหมดทุกตัว (แต่ในตัวอย่างนี้ ภายในแพคเกจมีคลาสอยู่เพียงคลาสเดียวคือ Fruit) บรรทัดที่ 4 ถึง 7 จับรวมไทป์ต่างๆ ที่เราจะใช้ในคลาสนี้ คือ Sprint (จัดการสไปรท์) Event (จัดการเหตุการณ์) TimerEvent (จัดการเหตุการณ์ที่เกี่ยวเนื่องกับตัวหน่วงเวลา) และ Timer (ตัวหน่วงเวลา)

บรรทัดที่ 11 ประกาศฟิลด์ชื่อ myRandom ทำหน้าที่เก็บค่าสุ่ม เราจะใช้ค่าสุ่มเพื่อแสดงผลสตรอเบอรีในตำแหน่งที่เปลี่ยนไปเรื่อย บรรทัด 12 ประกาศฟิลด์ counter เป็นตัวแปรที่เราจะใช้เป็นดรรชนีของอาร์เรย์ บรรทัด 13 ประกาศฟิลด์แบบอาร์เรย์ แต่ไม่ได้ระบุว่าจะนำไปใช้กับข้อมูลแบบไหน อาร์เรย์ในภาษา AS3 ไม่เข้มงวดเหมือนในจาวาหรือ C# ใน AS3 ตอนประกาศอาร์เรย์ไม่ต้องระบุไทป์ก็ได้ และจะนำไปใช้กับไทป์อะไรก็ได้ หรือจะใช้อาร์เรย์เดียวเก็บข้อมูลหลายไทป์ก็ได้

บรรทัดที่ 15 ถึง 20 คือคอนสทรักเตอร์ ภายในมีคำสั่งเพียงสามบรรทัด บรรทัด 17 สร้างออพเจ็กต์ตัวจับเวลา (มีตัวแปรท้องถิ่นชื่อ myTimer ไว้อ้างอิง) ที่เราจะใช้เพื่อหน่วงเวลาการแสดงผลให้ช้าลง ตัวเลขในวงเล็บ 200 คือความนานในการหน่วงเวลา มีหน่วยเป็นมิลลิวินาที ส่วนเลข 100 คือจำนวนครั้งที่จะให้มันส่งอีเวนต์ ผลลัพธ์คือ myTimer จะส่งอีเวนต์ทุกๆ 200 มิลลิวินาที (เท่ากับวินาทีละห้าครั้ง) เป็นจำนวนหนึ่งร้อยหน คำสั่งบรรทัด 18 กำหนดให้เมธอด OnTimer ทำหน้าที่เป็นเมธอดบริการอีเวนต์ บรรทัดที่ 19 สั่งให้ myTimer เริ่มเดิน

บรรทัดที่ 21 ถึง 31 คือเมธอด OnTimer ซึ่งจะทำงานทุกครั้งที่ myTimer ส่งอีเวนต์ บรรทัด 23 สร้างออพเจ็กต์ Fruit โดยมีตัวแปรแบบอาร์เรย์เป็นตัวอ้างอิง บรรทัด 24 และ 25 กำหนดตำแหน่งของภาพสตรอเบอรี โดยให้เป็นค่าสุ่มที่อยู่ภายในพื้นที่ 600×350 เมธอด random ของคลาส Math ทำหน้าที่ผลิตค่าสุ่ม เมธอด floor ทำหน้าที่ปัดเศษให้เป็นเลขจำนวนเต็ม (ปรกติ random จะให้ผลลัพธ์เป็นเลขมีทศนิยม)

บรรทัด 26 นำค่าสุ่มไปใส่ในตัวแปร myRandom เราจะใช้ค่านี้กำหนดขนาดของภาพสตรอเบอรี การใช้ random แบบนี้จะได้ผลลัพธ์เป็นค่าระหว่าง .5 ถึง 1 ( >=.5 <= 1)บรรทัด 27 และ 28 นำค่าสุ่มค่าใหม่ไปกำหนดให้กับความกว้างและความสูงของภาพสตรอเบอรี บรรทัด 29 เรียกเมธอด Show โดยใส่ stage เป็นอาร์กิวเมนต์ ค่าของ stage เป็นค่าอ้างอิงไปยังพื้นที่แสดงผลของสไปรท์นี้ (สไปรท์ที่เกิดจากคลาส LoyAS0302)

ในการทำงานรอบแรก counter มีค่าเป็นศูนย์ (กำหนดที่บรรทัด 12) ที่เรากำหนดเช่นนั้นเพราะ เราต้องการใช้ counter เป็นดรรชนีของอาร์เรย์ และหน่วยแรกของอาร์เรย์มีค่าดรรชนีเป็นศูนย์ บรรทัด 30 เพิ่มค่าของ counter ขึ้นหนึ่ง เพื่อเตรียมอ้างหน่วยถัดไปของอาร์เรย์ เมื่อเมธอด OnTimer ทำงานครั้งต่อไป ผลลัพธ์คือทุกครั้งครั้งที่เมธอด OnTimer ทำงาน เราจะได้ออพเจ็กต์ใหม่ในอาร์เรย์ และได้ภาพสตรอเบอรีหนึ่งลูก เมื่อได้ภาพสตรอเบอรีครบร้อยลูก โปรแกรมจะหยุดทำงาน

 

ปัญหาและทางแก้

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

ปัญหาลักษณะนี้แก้ได้ด้วยการสืบมรดก (inheritance) วิธีทำคือนิยามคลาสโหลดภาพไว้หนึ่งคลาสเพื่อใช้เป็นคลาสฐาน (base class) จากนั้นนิยามคลาสลูก (derived class) โดยกำหนดให้รับมรดกมาทั้งหมด แล้วเปลี่ยนแปลงคุณสมบัติ URL ในคลาสลูก เมื่อทำเช่นนี้ หากวันหลังเราต้องการเปลี่ยนแปลงอัลกอริทึมใดๆ เราเพียงแก้ไขที่คลาสฐานคลาสเดียว คุณสมบัติของคลาสลูกจะเปลี่ยนไปโดยอัตโนมัติ

ผู้เขียนจะสาทิตการทำเช่นนี้ในโปรเจค LoyAS0303 โดยจะนิยามคลาสฐานชื่อ BaseArt และสร้างคลาสลูกชื่อ BackGround (เป็นภาพพื้นหลัง) และคลาส Walker (เป็นภาพตัวการ์ตูนกำลังเดิน)

วิธีแก้อีกแบบหนึ่งคือนิยามพร็อพเพอร์ตีเพื่อรับ URL จากโค้ดภายนอก แต่ผู้เขียนจะไม่ใช้วิธีนั้น เพราะผิดหลักการซ่อนความซับซ้อน (information hiding) เราต้องการให้คลาสนามธรรม (abstraction) ของออพเจ็กต์ภาพ (เช่นคลาส Walker คือรูปการ์ตูนเดิน) ไม่ต้องการให้ผู้ที่นำคลาสไปใช้รับรู้การโหลดไฟล์ swf

 

โปรเจค LoyAS0303

เมื่อดูในหน้าต่าง Navigator จะเห็นว่าโปรเจค LoyAS0303 ประกอบด้วยไฟล์สี่ไฟล์ ในโฟลเดอร์ LoyClass มีสามไฟล์ เป็นไฟล์เก็บนิยามคลาสฐานหนึ่งไฟล์ (BaseArt.as) และไฟล์เก็บนิยามคลาสลูกสองไฟล์ (BackGround.as และ Walker.as) ที่ระดับนอกสุดของโปรเจคมีไฟล์ LoyAS0303.as เป็นโปรแกรมทดสอบการทำงาน

 

ไฟล์ต่างๆ ในโปรเจค LoyAS0303 เมื่อดูในหน้าต่าง Navigator

 

 

คลาส BaseArt

เรานิยามคลาสนี้ไว้ทำหน้าที่เป็นคลาสฐาน คำสั่งต่างๆ คล้ายในคลาส Fruit ที่อธิบายไปแล้ว จึงจะอธิบายเพิ่มเติมเฉพาะส่วนที่แตกต่างกันดังนี้

  • ไม่ระบุ URL : บรรทัด 9 เราไม่ระบุ URL ของไฟล์ swf เพราะเราต้องการให้คลาสลูกทำหน้าที่นี้
  • เพิ่มพร็อพเพอร์ตี : มีพร็อพเพอร์ตีเพิ่มมาสองตัวคือ get X (บรรทัด 12) และ get Y (บรรทัด 14)เพื่อให้โค้ดภายนอกสามารถอ่านค่าตำแหน่งของออพเจ็กต์ได้ (เดิมใน Fruit มีเพียง set X และ set Y)
  • ตัดพร็อพเพอร์ตี : ผู้เขียนตัดพร็อพเพอร์ตี set ScaleX และ set ScaleY ออก
  • ตัดคำสั่งในคอนสทรักเตอร์ : ตัดคำสั่งกำหนดขนาดของออพเจ็กต์ออก
  • เพิ่มคำสั่งตรวจสอบ URL : บรรทัด 24 ตรวจสอบว่าคลาสลูกใส่ URL ไว้หรือไม่ หากไม่ใส่โปรแกรมจะออกจากเมธอด Show เพื่อป้องกันการเกิดเออเรอร์

 

 

คลาส BaseArt

 

คลาสลูก

คลาสลูกมีสองคลาสคือ BackGround และ Walker จะเห็นว่าเมื่อใช้วิธีสืบคุณสมบัติคลาสลูกจะสั้นมาก คลาส BackGround มีคำสั่งบรรทัดเดียว (บรรทัด 7) ทำหน้าที่กำหนด URL ของไฟล์ swf ส่วนคลาส Walker มีคำสั่งเพิ่มมาอีกหนึ่งบรรทัด (บรรทัด 8) ทำหน้าที่กลับภาพจากซ้ายเป็นขวา (เพราะภาพตัวการ์ตูนที่ผู้เขียนหามาได้หันหน้าไปทางซ้าย)

 

คลาส BackGround

 

คลาส Walker

 

โครงสร้างของคลาส LoyAS0303

เมื่อสร้างคลาสฐานและคลาสลูกเสร็จแล้ว ต่อไปเราจะเขียนโปรแกรมทดสอบ เป็นคลาสชื่อ LoyAS0303 มีโครงสร้างดังนี้

 

โครงสร้างของคลาส LoyAS0303

 

บรรทัดที่ 3 ถึง 7 เป็นกลุ่มคำสั่ง import ที่เหมือนคลาส LoyAS0302 ที่อธิบายไปแล้วจึงจะไม่อธิบายซ้ำ บรรทัด 11 และ 12 นำคลาส BackGround และ Walker มาสร้างออพเจ็กต์ บรรทัด 14 คือคอนสทรักเตอร์ บรรทัด 20 เมธอด SetBackGround แสดงภาพฉากหลัง บรรทัด 26 เมธอด SetWalker แสดงภาพตัวการ์ตูน บรรทัด 32 เมธอด SetTimer กำหนดค่าเริ่มต้นให้ตัวจับเวลาเพื่อหน่วงเวลา บรรทัด 38 เมธอด OnTimer ทำหน้าที่ขยับตัวการ์ตูนให้เคลื่อนที่จากซ้ายไปขวาครั้งละห้าพิกเซล

 

เมธอดในคลาส LoyAS0303

คอนสทรักเตอร์มีคำสั่งสามบรรทัด (บรรทัดที่ 16 ถึง 18) ทำหน้าที่เรียกเมธอดสามเมธอดซึ่งมีหน้าที่ดังอธิบายไปแล้วในหัวข้อที่ผ่านมา บรรทัดที่ 34 กำหนดให้ตัวจับเวลาทำงานทุกๆ 30 มิลลิวินาที เนื่องจากเราไม่ได้ใส่ค่ากำหนดจำนวนครั้งในวงเล็บ ตัวจับเวลาจึงจะทำงานซ้ำไปเรื่อยๆ จนกว่าจะปิดโปรแกรม บรรทัด 40 อ่านตำแหน่งทางแนวนอนของตัวการ์ตูนแล้วนำมาเพิ่มขึ้น 5 เพื่อให้ขยับไปทางขวาห้าพิกเซล คำสั่ง if ในบรรทัดที่ 41 ทำหน้าที่ตรวจสอบว่าตัวการ์ตูนเดินไปถึงขอบขวาสุดของ stage หรือยัง ถ้าถึงแล้วจะเซตพร็อพเพอร์ตี X ให้เป็นศูนย์เพื่อให้ตัวการ์ตูนกลับไปอยู่ตำแหน่งซ้ายสุดของ stage

 

รายละเอียดโค้ดส่วนเมธอดในคลาส LoyAS0303

 

ซับซ้อนแต่ไม่ซ่อนเงื่อน

เราสามารถใช้ภาษา AS3 สร้างภาพซับซ้อนได้โดยที่โค้ดไม่ซับซ้อนตามไปด้วย ในบทความนี้ท่านได้เรียนวิธีโหลด swf มาทำเป็นออพเจ็กต์ วิธีสืบคุณสมบัติ วิธีสร้างและใช้งานตัวจับเวลาเพื่อหน่วงเวลา วิธีนิยามพร็อพเพอร์ตี เพื่อรับและส่งข้อมูลกับโค้ดภายนอก คลาสต่างๆ ในแพคเกจ LoyClass เป็นโค้ดที่นำกลับมาใช้ใหม่ได้ (reusable code) สามารถนำไปใช้ในโปรเจคอื่นๆ ได้ทันที

ท่านสามารถดาวน์โหลดซอร์สโค้ดของบทความนี้ได้จากเว็บไซต์ laploy.com (เลือกหัวข้อดาวน์โหลด ไฟล์ชื่อ AS3003.zip ภายในมีโปรเจ็กต์ที่สร้างจาก Flex) หากท่านมีข้อสงสัยใดๆ โปรดใส่คำถามไว้ที่กระดานถาม-ตอบซึ่งอยู่ในเว็บไซต์เดียวกัน

 

 

Advertisements

 

 
หน้าแรก สารบัญ เกี่ยวกับบล็อกนี้ เกี่ยวกับผู้เขียน

 

 
ตอน 3 : DNS Pinning

  • เขีนนเมื่อ : วันจันทร์ที่ 30 กรกฎาคม พ.ศ. 2550
  • เขียนโดย : ลาภลอย วานิชอังกูร www.laploy.com

 

 

08:05 น. แผนก CRU บริษัทอารามโก้

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

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

“พี่รีบมาดูนี่หน่อยดีกว่า” เพลินตากล่าว สีหน้าเคร่งเครียด

 

 

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

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

“ปิด SG ทั้งหมดเดี๋ยวนี้เลย!”

“นั่นใคร?” ผู้ชายน้ำเสียงงงๆ พูดขึ้นที่ปลายสาย

“รัชนี วิทยาวาณี ผู้จัดการ CRU ให้ตายเถอะ รีบปิด SG เร็วๆ สิคะ!” รัชนีตะโกนอย่างร้อนรน

“CRU ไม่มีอำนาจสั่งปิดเกตเวย์นะครับ ต้อง.. หา… อะไรนะ!” ประโยคสุดท้ายเห็นได้ชัดว่าบุรุษที่ปลายสายพูดกับคนอื่น รัชนีได้ยินเสียงตึงตังแล้วหลายก็หลุดไป ทันใดนั้นก็มีเสียงฮือขึ้นรอบๆ เมื่อหล่อนหันไปดูก็เห็นสาเหตุของเสียงฮือทันที หล่อนเพ่งมองอย่างไม่เชื่อสายตา คอมพิวเตอร์บนโต๊ะทำงานของแต่ละคนบัดนี้กำลังทำสิ่งอัศจรรย์เกินความคาดคิดอย่างที่สุด!

 

 

09:00 สำนักงานนักสืบสุนทร

 

 

ผมมองข้อมูลในแฟ้มสลับกับใบหน้าของหญิงสาวอย่างประหลาดใจ

“คุณต้องกำลังล้อผมเล่นอยู่แน่ๆ ” ผมสรุป หล่อนส่ายศีรษะช้าๆ แต่ไม่พูดอะไร ทันใดนั้นเครื่องติดต่อภายในบนโต๊ะทำงานก็ดังขึ้น

“คุณชูศักดิ์โทรมา จะรับไหม หรือจะให้บอกว่าติดประชุม” ผมได้ยินเสียงสุดาดังออกมาจากลำโพง

“รับ โอนเข้ามาเลย” ผมยกหูโทรศัพท์ขึ้น และได้ยินเสียงที่คุ้นเคย

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

“แต่ว่าผมไม่ได้สอนหนังสือแล้วนะครับ…” ผมพยายามอธิบาย แต่ถูกตัดบท

“แค่ให้ฝึกงานก็พอครับ” คุณชูจิตพูดเพียงเท่านั้นก็วางหูไป ผมมองดูหูโทรศัพท์อย่างไม่อยากเชื่อสายตา ผมพลิกดูในแฟ้มอีกครั้ง ใจทิพย์ ทำงานกับยามเดือนเอ็กซ์พอร์ตมาเพียงปีเดียว จบวิยาการคอมพิวเตอร์จาก “สถาบันเทคโนโลยีพระยาสงคราม-ดุสิต” แล้วไปฝึกงานที่ “อัลฮัมบรา” บริษัทยักษ์ใหญ่ผลิตอุปกรณ์เครือข่ายคอมพิวเตอร์ ประจำอยู่ที่ซานตา คราลา หนึ่งปี ทันใดนั้นสุดาก็เปิดประตูพรวดเข้ามา

“คุณ สต็อก โทรมาค่ะ บอกเรื่องด่วน” ผมพยักหน้าแล้วยกหูโทรศัพท์

“สวัสดีสต็อก ว่าไง สบายดีไหม?” ผมกล่าวทักทายเป็นภาษาอังกฤษ

“ขอบคุณ แต่ไม่สบายอย่างยิ่ง คุณมาตอนนี้ได้ไหม” สต็อกตอบด้วยสำเนียงแมนคูเนี่ยน

“ผมไม่ได้เป็นหมอนะ ไม่สบายทำไมไม่ไปโรงพยาบาล?” ผมย้อนถาม

“ไม่ตลกนะ อารามโก้ถูกเล่นงานเข้าให้แล้ว!”

 

 

09:45 น. สถานที่เกิดเหตุ

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

“ย่อจาก Card Redemption Unit ครับ” ผมเฉลย “อารามโก้ไม่เหมือนบัตรเครดิตทั่วไป เมื่อครบระยะชำระแล้วหากผู้ถือบัตรไม่ชำระครบเต็มจำนวนบัตรจะถูกตัดทันที และเรื่องจะตกมาอยู่ที่แผนกนี้”

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

“มันผิดระเบียบอย่างแน่นอน” สต็อกกล่าวเสียงต่ำพลางปิดประตูและหมุนม่านบังตา “แต่ก็จำเป็นต้องทำ ถ้ามีคนถามละก็คุณไม่ได้ข้อมูลเหล่านี้มาจากผมนะ เข้าใจไหม?”

“ข้อมูลอะไร?” ผมถามหน้าตาย สต็อกกับผมเคยทำงานด้วยกันหลายปีที่ แฮสติง ผ่านเรื่องราวมากมายทำให้เราไม่เคยมีความลับระหว่างกัน ผมเป็นคนนอกเพียงคนเดียวที่สต็อกกล้าให้เข้าถึงเครือข่าย ผมเปิดกระเป๋าหยิบคอมพิวเตอร์พกพาขนาดเล็กออกมา แล้วนำสาย USB ต่อเข้ากับคอมพิวเตอร์บนโต๊ะทำงานแล้วเริ่มสแกน

“เหตุการณ์เริ่มตอนกี่โมง” ผมถามพลางล้วงคอมพิวเตอร์เล็กๆ ในซองหนังเก่าคร่ำคร่าออกมาจากกระเป๋าเสื้อ

“แปดโมงหน้านาที” สต็อกตอบ ผมพยักหน้าแล้วจดบันทึกไว้

“ตอนนี้เกตเวย์เป็นอย่างไร”

“ปิดอยู่ แต่ต้องรีบเปิดให้เร็วที่สุด คุณคิดว่าจะเปิดได้เมื่อไหร่” สต็อกถามอย่างประสาทเสีย ผมพบว่าการสแกนเสร็จสิ้นแล้ว จึงถอดสาย USB และเก็บคอมพิวเตอร์เข้ากระเป๋า

“สั่งให้พนักงานทุกคนบูตเครื่องแล้วเข้าโปรแกรม CRU ห้ามเปิดโปรแกรมอื่นๆ” สต็อกพยักหน้าเดินตัวปลิวออกไปจากห้อง

“เอาไงต่อคะ?” ใจทิพย์ถาม

“คุณไปเคลียแคชทุกเครื่องใน CRU ส่วนผมเห็นจะต้องไปเยี่ยมชม DPU หน่อยแล้ว”

 

 

10:20 น. แผนก PDU อารามโก้

สิบนาทีต่อมาผมกับสต็อกก็มายืนอยู่ใน DPU (Data Processing Unit) หรือแผนกคอมพิวเตอร์ของบริษัทอารามโก้ นภดล หัวหน้าแผนกยืนยิ้มฝืดๆ ท่าทางไม่ค่อยสบอารมณ์นัก ไม่บ่อยที่สต็อกจะลงมาที่ DPU และไม่บ่อยไปกว่านั้นอีกที่มีคนนอกเข้ามาในห้องนี้ ปรกติห้องนี้เปรียบเหมือนวิหารศักดิ์สิทธิ์ที่แม้แต่พนักงานระดับบริหารก็ไม่ได้รับอนุญาตผ่านเข้าออก

 

 

 

ผมมองดูรอบๆ แล้วก็เห็นด้วยกับคำพูดที่ว่า “เมนเฟรมไม่มีวันสูญพันธุ์” เพราะห้องนี้ (ซึ่งกินเนื้อที่เกือบทั้งชั้น) เต็มไปด้วยเครื่องตระกูล z9 และอุปกรณ์รอบข้างสารพัดชนิด พื้นยกระดับ มีระบบกรองฝุ่นและปรับความชื้น ผมเชื่อว่าหากไปอารามโก้ที่สิงค์โปร์, ฮ่องกง, ลิสบอน นิวยอร์ค หรือเมืองไหนก็ตาม ก็คงมีการจัดวางในลักษณะเดียวกันนี้

“เกตเวย์เชื่อมไปที่ไหนครับ” ผมหันไปถามนภดล

“เราเชื่อมสัญญาณผ่านดาวเทียมไป RHO (Regional Head Office สำนักงานหลักของภูมิภาค) ที่เมืองแคนเบอร์ราซึ่งเป็นเกตเวย์เชื่อมเราเข้ากับ CDB (Central Data Bank คลังข้อมูลหลัก) ที่เมืองฟีนิกส์ซึ่งจะเชื่อมเรากับสำนักงานที่นิวยอร์ก ปารีส ลอนดอน โตเกียว และที่อื่นๆ อีกทอดหนึ่ง” นภดลตอบเหมือท่องให้ฟัง

“CDB เดียวกับในคดีแฮกเกอร์หมวกดำ” สต็อกเสริม ผมพยักหน้า เมื่อสามปีก่อนตอนตามล่าแฮกเกอร์มืดที่เจาะระบบฐานข้อมูลบัตรเครดิต เราบินไปตรวจดู CDB และพบว่าเป็นอาคารคอนกรีตเสริมเหล็กขนาดเท่าสนามฟุตบอลสามสนามฝังอยู่ในทะเลทรายอันรกร้างของอาริโซนา คลังข้อมูลกว้างใหญ่มากจนกระทั่งการเดินทางภายในอาคารต้องอาศัยรถไฟฟ้า เจ้าหน้าที่ของ CDB บรรยายสรุปให้ฟังว่าบัตรเครติดอื่นๆ เช่นวีซา ไดเนอร์ และเอเม็กซ์ต่างใช้บริการจากศูนย์นี้ และไอบีเอ็มประกาศว่าอารามโก้เป็นลูกค้ารายใหญ่ที่สุดในโลก

“คุณเปิดเฉพาะเกตเวย์ที่ไม่เชื่อมกับอินเตอร์เน็ตได้ไหม” ผมถามนภดล

“ได้แน่นอน แต่คงจะต้องใช้เล่ห์กระเท่พอสมควร และหลายๆ แผนกต้องไม่ชอบใจแน่” นภดลบอก

“ถ้าอย่างนั้นก็เปิดเลย ส่วนอินเตอร์เน็ตผมขอเวลาตรวจสอบก่อน”

 

 

13:00 สำนักงานนักสืบสุนทร

ผมกับใจทิพย์แบ่งงานกันคนละครึ่ง เรานำบันทึกการทำงานของ proxy server ช่วงระหว่าง 8:00 น. ถึง 9:00 น. มาตรวจสอบโดยละเอียด (ถูกขัดจังหวะโดยสต็อกที่โทรฯ มาถามความคืบหน้าทุกหน้านาที) แม้จะเป็นช่วงเวลาเพียงสั้นๆ แต่ข้อมูล traffic ที่มีมากมายมหาศาลทำให้เวลาที่ผ่านไปสองชั่วโมงเรายังเหมือนอยู่ที่จุดเริ่มต้น

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

“ใจทิพย์ คุณพักทานอาหารกลางวันก่อนเถอะ” ผมได้ยินเสียงตัวเองพูด

“ค่ะ… แล้วคุณล่ะ” หล่อนลุกยืน ทำท่าจะเดินออก

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

“เพลินตา” ข้อความมีเพียงเท่านั้น นี่คงเป็นผู้ที่เรียกมาด้วยความเข้าใจผิด ผมคิด

“ผมชื่อสุนทร ไม่ใช้เพลินตา” ผมพิมพ์ตอบไปอย่างเบื่อหน่าย

“CRU” ข้อความตอบกลับมา ผมตาสว่างทันที ผลุดลุกขึ้นนั่งตรงด้วยความประหลาดใจ

 

 

“คุณเป็นใคร” ผมพิมพ์อย่างรวดเร็ว

“เพื่อน”

“ชื่ออะไร”

“เทพ255” ผมมองบนจออย่างมือแปดด้าน หรือว่านี่คือแฮกเกอร์ในคดีนี้? ไม่น่าเป็นไปได้ “คุณต้องการอะไร?” ผมพิมพ์รัวปานข้าวตอกแตก

“ผมช่วยคุณได้”

“ช่วยยังไง”

“DNS Pinning” ข้อความมีเท่านั้นก่อนที่การเชื่อมต่อจะหลุดไป ผมมองข้อความสุดท้ายอย่างตกตลึงจนซึมเซา ชิ้นส่วนปริศนาเริ่มประกอบเข้าด้วยกันช้าๆ ในสมอง ผมรีบเปิด log file ของ proxy server ขึ้นอีกครั้งเพื่อมองหาสิ่งที่กำลังสงสัย

“ดิฉันซื้อแซนวิชทูน่ามาให้” ใจทิพย์ปรากฏตัวขึ้นในอีกครึ่งชั่วโมงต่อมา ช่วยดึงผมออกจากห้วงความคิด

“ขอบคุณครับ ผมจะไปทานในรถ เราต้องกลับไปที่อารามโก้ด่วน บอกผมสิว่าคุณมีใบขับขี่”

 

 

15:10 ทางเข้าด้านหน้าบริษัทอารามโก้

“อะไรกันละนี่” ผมนึกในใจ ตำรวจปิดทางเข้าด้านหน้าอาคารไว้ทั้งหมด

“เสียใจครับ กรุณาถอยออกไปอยู่หลังเส้นเหลืองด้วย ท่านสารวัตสั่งห้ามใครเข้าออกทั้งนั้น” เจ้าหน้าที่ตำรวจกล่าวอย่างสุภาพแต่ท่าทางเอาจริง ผมกับใจทิพย์จึงต้องถอยกลับมานั่งในรถ พอดีกับที่สต็อกโทรฯ มา

“แย่ชะมัด ผ่ายธุรการดันโทรฯ แจ้งตำรวจ เห็นบอกว่าเป็นระเบียบของบริษัท ตอนนี้ผมอยู่ในสำนักงาน ถ้าอินเตอร์เน็ตใช้ไม่ได้ภายในชั่วโมงนี้ ผมแย่แน่ๆ คุณเป็นไงบ้าง ได้เรื่องไหม?”

“น่าจะได้นะ แต่ต้องเข้าไปเปิดคอมพิวเตอร์ในสำนักงานของคุณก่อน ตำรวจปิดทางเข้าไว้หมด คุณเจรจาให้หน่อยได้ไหม” สต็อกเงียบไปครู่หนึ่ง “ได้ แต่ต้องใช้เวลาหน่อย คุณแอบเข้ามาทางหนีไฟได้ไหม?”

ผมกับใจทิพย์เดินไปอาคารที่จดรถ แต่ทางเข้ามีตำรวจยืนเฝ้าอยู่ “โน้นค่ะ” ใจทิพย์ชี้ไปทางกองขยะ ที่ริมกำแพงมีประตูเหล็กสกปรก ผมแง้มประตูแล้วมองลอดเข้าไป ไม่มีใครอยู่ตรงนั้น ทางเข้าที่จอดรถอยู่ไกลออกไปห้าร้อยเมตร ตรงนั้นมีทั้งตำรวจและ รปภ. แต่ไม่มีใครมองมา เราจึงเดินขึ้นบันไดหนีไฟไปจนถึงชั้น 5 “ชั้นนี้คงไม่มีใครเฝ้า เราจะขึ้นลิฟต์ไปชั้นสามสิบแปด” ผมหันไปบอกใจทิพย์ผู้ซึ่งทำท่าทางโล่งอก แต่เมื่อผลักประตูหนีไฟเปิดออกผมก็เห็นตำรวจสองนาย คนหนึ่งท้วมคนหนึ่งผอม

“อย่าหนี อย่าต่อสู้ อย่าขัดขืน” ตำรวจร่างท้วมประกาศด้วยน้ำเสียงใจเย็น

 

 

15:30 ห้องประชุมชั้นยี่สิบสองบริษัทอารามโก้

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

“น.ห้าหนึ่งเจ็ด อุณาโลม ว.สอง เปลี่ยน” ตำรวจคนท้วมพูดกรอกในวิทยุ

“น.ห้าหนึ่งเจ็ดเปลี่ยน” มีเสียงครืดคราดสวนออกมา

“แจ้ง น.ห้าศูนย์ห้า ว.ยี่สิบ ผู้ต้องสงสัย เหตุหนึ่ง-หนึ่ง-หนึ่ง ขอทราบ ว. ศูนย์… เปลี่ยน”

“ว. หนึ่ง… เปลี่ยน” วิทยุส่งเสียงตอบหลังเงียบไปครู่หนึ่ง

“ว. สิบ ห้องประชุมชั้นสามสิบเก้า .. เปลี่ยน”

“ทราบ… ว.ศูนย์ศูนย์ น.ห้าศูนย์ห้า ว.สิบห้าเวลานี้ อุณาโลมสิบห้าสามห้า” ตำรวจนายนั้นเหน็บวิทยุไว้ที่เอวแล้วเดินออกไปกระซิบกับตำรวจคนผอมที่ยืนเฝ้าอยู่หน้าห้อง “ท่านรองฯ กำลังมา”

ไม่ถึงห้านาทีต่อมา “ท่านรองฯ” ก็ปรากฏตัวขึ้น เขาสรวมเสื้อนอกและกางเกงสีดำที่ตัดเย็บอย่างดี ผูกเน็คไทลายจุด คนที่ไม่รู้จักอาจคิดว่าเป็นพนักงานระดับบริหารของบริษัทอะไรสักแห่ง เขาเดินเข้ามาหย่อนตัวลงนั่งบนเก้าอี้ซึ่งตั้งอยู่ตรงข้ามกับผม “ต้องทำถึงขนาดนี้ด้วยหรือ?” ผมถามเสียงขุ่น

“ขี้บ่นจริงๆ พวกบิ๊กๆ สั่ง ผมไม่เกี่ยว” เขาทำเสียงรำคาญ “แล้วนี่ใคร?” เขาบุ้ยใบ้ไปทางใจทิพย์ที่สะดุ้งสุดตัวท่าทางเลิ่กลั่ก

“นี่คุณใจทิพย์ เป็นผู้ช่วยของผมเอง ไว้ใจได้… คุณใจทิพย์ครับนี่ พ.ต.ท. ครุฑ วงศ์ศิวะ รองผู้กำกับการอำนวยการศูนย์อาชญากรรมสมองกล” ใจทิพย์กระพุ่มมือไหว้ ครุฑรับไหว้ยิ้มๆ “คนที่หนังสือพิมพ์ขนานนามว่ามือปราบไซเบอร์ ผู้โด่งดังในคดีเจาะมือถือร้อยล้านใช่ไหมค่ะ?” ใจทิพย์ถามอย่างประหลาดใจ

“ ฝีมืออาจารย์ต่างหาก” ครุฑตอบติดตลก “ว่าแต่คุณได้อะไรมาบ้าง?” ประโยคสุดท้ายครุฑหันมาพูดกับผมด้วยท่าทางเอาการเอางาน

“แฮกเกอร์มืดเจาะเข้าทางอินเตอร์เน็ต เปลี่ยนแก้ข้อมูลในฐานข้อมูลสมาชิกบัตร เจตนาทำให้ระบบล่ม แล้วแสดงข้อความสัญลักษณ์บนหน้าจอ” ผมอธิบาย ครุฑพยักหน้า

“ไอ้เรื่องนั้นรู้หมดแล้ว ที่ไม่รู้คือมันผ่านเข้ามา fire wall ได้ยังไง”

“มันอาศัยช่วงโหว่ของ DNS Pinning คุณนึกออกไหมว่าคืออะไร?” ผมถาม ครุฑส่ายหน้า ผมไม่แปลกใจ ครุฑเรียนกฎหมายกับคอมพิวเตอร์มาอย่างละครึ่ง ผมพบกับเขาที่แคมบริดจ์ ตอนนั้นเขาเป็นเด็กหนุ่มหัวเกรียนผิวเกรียมแดด เพิ่งจบจากสามพราน เพราะเป็นนักเรียนทุนไส้แห้งเหมือนกัน เราจึงกลายเป็นเพื่อนสนิทอย่างรวดเร็ว

“ถ้าอย่างนั้นจะทบทวนความจำเรื่อง DNS Pining ให้ย่อๆ ปรกติเวลาเราพิมพ์ URL ของเว็บไซต์ เช่น www.google.com บราวเซอร์จะติดต่อกับแม่ข่าย DNS เพื่อทำ domain name resolution ก่อนจริงไหม เมื่อได้ IP แล้วบราวเซอร์จะเก็บตัวเลขนี้ไว้ในแคช ต่อมาหากเราอ้างถึง URL เดิมอีกบราวเซอร์จะไม่ติดต่อกับแม่ข่าย DNS อีกครั้ง แต่จะนำ IP ในแคชมาใช้แทน นี่คือหลักการ DNS Pining”

“บราวเซอร์จะติดต่อกับแม่ข่าย DNS อีกครั้งก็ต่อเมื่อเราปิดบราวเซอร์แล้วเปิดใหม่ใช่ไหม?” ใจทิพย์ถาม ผมพยักหน้า

“แล้วเกี่ยวกับการเจาะ fire wall ตรงไหน?” ครุฑกังขา

“เกี่ยวตรงแฮกเกอร์มืดอาศัยหลักการ DNS Pining หลอกว่าเครื่องของแฮกเกอร์คือเครื่องที่อยู่หลัง fire wall และสามารถทำทุกอย่างได้เหมือนผู้มีระดับสิทธิสูงสุด” ผมเฉลย ครุฑทำหน้าไม่เชื่อ แต่ก็พยักหน้าให้พูดต่อไป

“เครื่องแม่ข่ายของอารามโก้ที่แฮกเกอร์มืดต้องการแย่งยึดชื่อ sr1.aramgo.com หมายเลขไอพีคือ 235.20.10.1 นายสมชาย พนักงานแผนก CRU มีคอมพิวเตอร์ชื่อ cru1.aramgo.com ไอพีคือ 235.20.10.15 คอมพิวเตอร์ของแฮกเกอร์มืดคือ dark.hacker.com ไอพี 172.16.16.1” ผมเขียนแผนภูมิบนกระดานไปด้วยขณะอธิบาย

“สิ่งที่แฮกเกอร์มืดทำคือสร้างคอมพิวเตอร์กำมะลอชื่อ kaka.hacker.com แล้วทำ DNS spoofing ว่ามีไอพีเป็น 235.20.10.1 และ 172.16.16.1”

“ไอพีแรกตรงกันกับไอพีของแม่ข่ายอารามโก้” ใจทิพย์เสริม ผมพยักหน้า

“อย่างนี้ก็เหมือนการโจมตีแบบ DNS spoofing ในคดีธนาคารสยามไทยสิ แล้วการโจมตีเริ่มต้นอย่างไร” ครุฑถาม

“ด้วยเหตุผลใดสักอย่าง สมชายเปิดหน้าเว็บ dark.hacker.com ทำให้ java applet ถูกนำเข้าไปในเครื่อง cru1.aramgo.com แย่หน่อยที่ applet นี้คือโปรแกรมเจาะระบบ”

“เป็นไปไม่ได้!” ครุฑแย้ง “จาวาออกแบบมาไม่ให้ทำแบบนั้น”

“เป็นไปแล้ว!” ผมยืนยัน “applet ทำงานโดยร้องขอการเชื่อมต่อไป kaka.hacker.com โปรแกรม JRE (Java Runtime Environment) ตรวจสอบ DNS แล้วพบว่ามีสองไอพีคือ 235.20.10.1 และ 172.16.16.1 จากนั้น JRE เปรียบเทียบมันกับไอพีของเครื่องที่ applet ทำงาน (คือ cru1.aramgo.com ไอพี 172.16.16.1) และพบว่าตรงกัน JRE จึงอนุมัติการเชื่อมต่อโดย โดยใช้ไอพีแรกในรายการคือ 235.20.10.1”

“มันเล่นแบบนี้เลยหรือ” ครุฑอุทาน

“ถูกต้อง เนื่องจาก applet สร้างช่องทางเชื่อมต่อกลับไปยัง dark.hacker.com แล้ว แฮกเกอร์มืดจึงสามารถใช้ ซาตาน เพื่อวิเคราะห์จุดอ่อนของเครือข่ายอารามโก้ได้ทันที”

“แล้วมันเกี่ยวกับ DNS Pinning ตรงไหนคะ?” ใจทิพย์ถาม

“เกี่ยวตรงที่วิธีการที่ผมอธิบายเมื่อครู่ปรกติจะใช้ไม่ได้ผล เพราะ DNS Pinning จะทำให้บราวเซอร์ไม่ตรวจ DNS ใหม่ แฮกเกอร์จึงเขียน applet ให้แก้ไขไอพี DNS ในแคช ปิดบราวเซอร์ของสมชายและปิด dark.hacker.com ด้วย เมื่อสมชายเปิดบราวเซอร์อีกครั้ง applet จะร้องขอการเชื่อมต่อไปยัง dark.hacker.com (ที่ปิดไปแล้ว)ใหม่อีกครั้ง เนื่องจาก DNS Pinning จะไม่มีผลเมื่อเปิดบราวเซอร์ใหม่ การเชื่อมต่อนี้จึงกลายเป็นการเชื่อมต่อไปยังไอพีที่ถูกแก้ไข ซึ่งก็คือไอพีของเครื่องแม่ข่ายที่อารามโก้”

 

 

16:35 แผนก CRU บริษัทอารามโก้

ผม ใจทิพย์ ครุฑ สต็อก และรัชนีนั่งอยู่ในห้องทำงานของรัชนี ภายนอกห้อง พนักงานกะกลางวันกำลังแยกย้ายกลับบ้าน ขณะที่พนักงานกะกลางคืนกำลังเริ่มเข้าประจำที่ พวกเขาสามารถทำงานได้แล้วเพราะเกตเวย์ถูกเปิดครบตามปรกติ ผมบรรยายสรุปสถานการณ์ให้ทุกคนฟังอีกครั้ง

“ตอนนี้แฮกเกอร์จะยังเจาะเข้ามาได้ไหม” รัชนีถามขึ้นทันทีเมื่อผมพูดจบ

“ไม่ได้ เพราะเจ้าหน้าที่จาก DPU ได้เรายกเลิกจาวาในคอมพิวเตอร์ทุกเครื่องแล้ว”

“เราจะป้องการการโจมตีลักษณะอื่นๆ ได้อย่างไร” สต็อกถาม

“ไม่มีวิธีไหนจะป้องกันได้ 100% หรอก ที่ทำได้คือจำกัดให้พนักงานเข้าได้เฉพาะเว็บไซต์ที่กำหนดเท่านั้น”

คนทุกพอใจและแยกย้ายกลับฐานที่ตั้งเมื่อการประชุมสิ้นสุดลง

“นับว่าคดีนี้ประสบผลสำเร็จอย่างสมบูรณ์” ใจทิพย์ปรารภระหว่างที่เราฝ่าการจราจรกลับสำนักงาน

“สำเร็จหรือ? เรายังจับตัวคนร้ายไม่ได้เลย” ผมตอบอย่างครุ่นคิด มีหลายคำถามเหลือเกินที่ยังหาคำตอบไม่ได้ แฮกเกอร์ต้องการอะไร มันไม่ได้ยักยอกเงินแม้แต่บาทเดียว สัญลักษณ์ประหลาดนั้นคืออะไร และใครคือผู้ใช้นามเรียกขาน “เทพ 255” ผมสังหรณ์ใจว่านี่อาจเป็นเพียงแค่จุดเริ่มต้นเท่านั้น


เกี่ยวกับบล็อกนี้

เว็บบล็อก “คนคอมพิวเตอร์” หรือ Laploy’s articles เป็นบล็อกรวบรวมบทความจาก ลาภลอย วานิชอังกูร มีบทความหลายประเภทคละกัน เช่นบทความเกี่ยวกับการพัฒนาซอฟต์แวร์ บทความเกี่ยวกับการสร้างและดัดแปลงฮาร์ดแวร์ บทความเกี่ยวกับเทคโนโลยีคอมพิวเตอร์ทั่วไป บทความทั่วไป และนิยายนักสืบ

เกี่ยวกับผู้เขียน

ลาภลอย วานิชอังกูร เป็นผู้เชี่ยวชาญการพัฒนาแอพลิเกชันฐานข้อมูลและ Business Intelligence โดยเริ่มจากการพัฒนาโปรแกรมด้วย dBaseII, Clipper, FoxPro ปัจจุบันเป็นผู้เชี่ยวชาญในการบูรณาการระบบฐานข้อมูลด้วยเทคโนโลยีของไมโคร ซอฟต์เช่น ASP.NET, ADO.NET, Microsoft SQL Server 2008 และ LINQ ชำนาญการเขียนคิวรีเพื่อแก้ปัญหาทางธุรกิจที่ซับซ้อน Data mining, Data Warehouse, OLAP (SSRS), OLTP เคยออกแบบฐานข้อมูลสัมพันธ์ในองค์กรระหว่างประเทศ เคยพัฒนาแอพลิเกชันฐานข้อมูลในโครงการขนาดใหญ่หลายโครงการ และเคยให้คำปรึกษาด้าน BI ในศูนย์คอมพิวเตอร์ (T-Center) ในองค์กรของประเทศฝรั่งเศส
นอกจากงานฐานข้อมูลแล้ว ลาภลอย วานิชอังกูร ยังเชี่ยวชาญการพัฒนาซอฟต์แวร์ระบบฝังตัว (Microprocessor / Microcontroller Based Embedded System) งานพัฒนาแอพลิเกชันในอินเตอร์เน็ตแบบ RIA (Rich Internet Application) งานพัฒนาโครงสร้างพื้นฐานของซอฟต์แวร์ด้วยหลักการ OOP (Framework Development in Object Oriented Programming) ด้วยภาษา C# และ .NET Framework และงานบูรณาการระบบในองค์กรหรือ SOA (Service Oriented Architecture for Enterprise Orchestration) เคยร่วมงานกับทีมพัฒนาซอฟต์แวร์ในหลายๆ ประเทศ เช่น ไทย อินเดีย สวิส เยอรมัน และประเทศสหรัฐอเมริกา
ปัจจุบัน ลาภลอย วานิชอังกูร ทำหน้าที่ให้คำปรึกษาการวางระบบ IT (เช่น SQL, OLAP,.NET, SCADA, BI, SOA และอื่นๆ) ให้แก่หน่วยงานขนาดใหญ่หลายแห่ง และมีบทความทางวิชาการตีพิมพ์ในวารสารหลายเล่มอย่างสม่ำเสมอ และเป็นผู้เขียนหนังสือ "เรียนรู้ด้วยตนเอง DataBase - Query - T-SQL - Stored Procedure" และ “เรียนรู้ด้วยตนเอง OOP C# ASP.NET” (ISBN 13:978-974-212-598-1)
ท่านสามารถติดต่อผู้เขียนได้ที่อีเมล laploy@gmail.com

เรียนรู้ด้วยตนเอง OOP C# ASP.NET

ชื่อหนังสือ : เรียนรู้ด้วยตนเอง OOP C# ASP.NET โดย : ลาภลอย วานิชอังกูร จัดพิมพ์จัดจำหน่ายโดย : บริษัท ซีเอ็ดยูเคชั่น จำกัด (มหาชน) ISBN : 13:978-974-212-598-1 ราคา : 349 บาท จำนวนหน้า : 648 ขนาด : 19x29 ซ.ม.

เรียนรู้ด้วยตนเอง DataBase – Query – T-SQL – Stored Procedure

ชื่อหนังสือ: เรียนรู้ด้วยตนเอง DataBase - Query - T-SQL - Stored Procedure โดย: ลาภลอย วานิชอังกูร จัดพิมพ์จัดจำหน่าย: บริษัท ซีเอ็ดยูเคชั่น จำกัด (มหาชน) ISBN: 978-616-08-0009-4 ราคา: 559 บาท จำนวนหน้า: 1,100 ขนาด: 19x29 ซ.ม. วางตลาด: ตุลา 2552

กรุณาป้อนอีเมลของท่าน

Join 17 other followers

Advertisements