ลาภลอย's profileเรียนรู้ด้วยตนเอง OOP C#...PhotosBlogListsMore Tools Help

Blog


    June 08

    ตัวอย่างวิธีใช้ ADO.NET อย่างง่ายที่สุด

    ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

     

    ตัวอย่างวิธีใช้ ADO.NET อย่างง่ายที่สุด

     

    หัวข้อนี้ผู้เขียนจะสาทิตการใช้ ADO.NET อย่างง่ายที่สุด เมื่อท่านได้คิวรีที่ต้องการแล้วขั้นตอนต่อไปคือเขียนโปรแกรมภาษา C# ใน MSVS2008 ให้ท่านเปิดโปรแกรม MSVS2008 แล้วสร้างโปรเจ็กต์ใหม่ เลือกชนิดเท็มเพลตเป็น Console Application แล้วตั้งชื่อว่า AdoTest01 หรือชื่ออื่นๆ ตามใจชอบตามที่เห็นในภาพ 31-2

    002

    ภาพ 31-2: เลือกชนิดเท็มเพลตเป็น Console Application

    เมื่อสร้างโปรเจ็กต์ใหม่แล้วให้ป้อนพิมพ์โค้ดตามในภาพ 31-3 ลงในไฟล์ Program.cs เนื่องจากเป็นโค้ดสั้นๆ เพื่อทดสอบผู้เขียนจึงใส่ทั้งหมดไว้ภายในเมธอด Main เพื่อความสะดวก ในการเขียนโปรแกรมจริงท่านควรจะนิยามคลาสแยกไว้ต่างหาก บรรทัดที่ 1 และ 2 คำสั่ง Using จับรวมเนมสเปสที่จำเป็นต้องใช้สองเนมสเปสคือ System และ System.Data.SqlClient ซึ่งเป็นส่วนหนึ่งของ ADO.NET เพื่อให้โปรแกรมไคลแอนท์สามารถติดต่อกับ SQL2008 ได้

    003

    ภาพ 31-3: โค้ดภาษา C#

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

    โค้ดบรรทัดที่ 19 ประกาศตัวแปรชื่อ connection เพื่อใช้ทำหน้าที่เป็นช่องทางติดต่อกับเซอฟเวอร์ โค้ดบรรทัดที่ 20 ประกาศตัวแปรชื่อ command เพื่อใช้ทำหน้าที่เป็นตัวส่งคำสั่งไปยัง SQL2008 โค้ดบรรทัดที่ 21 ประกาศตัวแปรชื่อ dataReader เพื่อใช้ทำหน้าที่อ่านแถวข้อมูลจาก SQL2008

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

    คำสั่ง new ในบรรทัดที่ 22 ทำหน้าที่สร้างออพเจ็กต์แบบ SqlConnection เพื่อใช้ทำหน้าที่เป็นช่องทางติดต่อกับเซอฟเวอร์ ผู้เขียนส่งค่า sqlConnect ไปเป็นอาร์กิวเมนต์เพราะเมธอดคอนสทรักเตอร์ของคลาสนี้รับพารามิเตอร์เป็นข้อความที่จะใช้เพื่อเชื่อมต่อกับเซอฟเวอร์ คำสั่งบรรทัดที่ 23 เรียกเมธอด Open ของคลาส SqlConnection เพื่อเริ่มต้นเปิดการเชื่อมต่อ

    คำสั่ง new ในบรรทัดที่ 24 ทำหน้าที่สร้างออพเจ็กต์แบบ SqlCommand เพื่อใช้ทำหน้าที่เก็บข้อความที่เป็นคิวรีซึ่งจะดึงข้อมูลจากเซอฟเวอร์ ผู้เขียนใส่อาร์กิวเมนต์สองตัวคือ sqlCommand และ connection เพราะเมธอดคอนสทรักเตอร์ของคลาสนี้รับพารามิเตอร์เป็นข้อความที่เป็นคิวรี และออพเจ็กต์ SqlConnection ที่ท่านจะใช้เป็นช่องทางติดต่อกับเซอฟเวอร์

    บรรทัดที่ 25 สร้างออพเจ็กต์แบบ SqlDataReader ซึ่งมีวิธีสร้างวิตถารกว่าคลาสอื่นใด เพราะในขณะที่คลาสอื่นๆ สร้างโดยใช้คำสั่ง new และคอนสทรักเตอร์ แต่คลาส SqlDataReader กลับสร้างด้วยการเรียกเมธอด ExecuteReader ของคลาส SqlCommand ท่านสร้างออพเจ็กต์แบบ SqlDataReader ไว้เพื่อทำหน้าที่อ่านแถวข้อมูลแบบเดินหน้าได้ทางเดียว (ย้อนหลังไม่ได้)

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

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

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

    เมื่อป้อนพิมพ์และตรวจสอบดีแล้วว่าไม่มีการสะกดให้กดปุ่ม Ctrl+F5 เพื่อรันโปรแกรม ท่านจะเห็นกรอบ cmd ปรากฏขึ้นเหมือนในภาพ 31-4 สิ่งที่แสดงอยู่ใน cmd คือแถวข้อมูลที่เป็นผลลัพธ์ของการคิวรี โปรดสังเกตว่าข้อมูลเหล่านี้เหมือนผลลัพธ์ของคิวรีในหัวข้อก่อนหน้านี้

    004

    ภาพ 31-4: ผลลัพธ์การทำงานของโปรแกรม

    April 16

    GreatFriends VTALKS ครั้งที่ 11

    ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

    title

     

    GreatFriends VTALKS ครั้งที่ 11

     

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

     

    Seminar Information

    Title
    GreatFriends VTALKS ครั้งที่ 11

    Date
    วันอาทิตย์ที่ 26 เมษายน 2552

    Time
    8:30 AM - 5:00 PM

    Price
    ไม่เก็บค่าใช้จ่าย

    (รับไม่เกิน 120 ท่าน)

    Agenda

    GreatFriends VTALKS sessions:

    • 08:30 - 09:30 Register & Community Talks
    • 09:30 - 10:30

      Session 1 - Preview Visual Studio 2010
      By MVP Chalermpon Areepong (nine)GreatFriends.Biz Community Lead

    • 10:30 - 11:00 Break

    • 11:00 - 12:00

      Session 2 - Introducing to Entity Framework
      By MVP Suthep Sangvirotjanaphat (surrealist)
      GreatFriends.Biz Founder and Community Lead

    • 12:00 - 13:00 Lunch (free)

    • 13:00 - 14:00

      Session 3 - To be announced later
      By MVP Chalermvong Vijitpiyakul (mie)GreatFriends.Biz Community Lead

    • 14:00 - 14:30 Break

    • 14:30 - 15:30

      Session 4 - Using ASP.NET Chart Control
      By MVP Banpote RyanGreatFriends.Biz

    • 15:30 - 16:45

      Session 5 - Developing Questionnaire Generator (QG)

      เล่าให้ฟังแบบไม่เครียดถึงเบื้องหลังการพัฒนาโปรแกรม QG ซึ่งเป็นโปรแกรมสำหรับสร้างระบบสอบถาม เพื่อให้ผู้ใช้สามารถสร้างหน้าเว็บระบบสอบถามได้ด้วยตนเอง ผู้ใช้สามารถออกแบบลักษณะของแบบสอบถามได้ตามใจชอบ เช่นมีหัวข้ออะไรบ้าง (เช่น ชื่อ ที่อยู่) ผู้ใช้จะป้อนข้อมูลได้อย่างไร (เช่นป้อนเป็นข้อความหรือเลือกรายการจาก dropdown listbox) กำหนดหมวดหมู่ของหัวข้อในแบบสอบถาม กำหนดรูปภาพที่จะใช้เป็น banner ฯลฯ เมื่อผู้ใช้กำหนดเสร็จแล้วจะได้ผลลัพธ์เป็นระบบสอบถามที่ประยุกต์ใช้ได้กับ หลายสถานการณ์ เช่น ระบบสมัครสมาชิก ระบบสอบถามตอนลงทะเบียนเข้าชมงานแสดงสินค้า ระบบสอบถามเพื่อเก็บข้อมูลทั่วไป ฯลฯ ผู้ใช้สามารถสร้างแบบสอบถามได้อย่างไม่จำกัดจำนวนและเรียก project เดิมมาแก้ไขเปลี่ยนแปลงได้ ผู้ใช้ไม่จำเป็นต้องมีความรู้ทางเทคนิคเพราะโปรแกรมมีระบบ deploy ที่จะแปลง project แบบสอบถามที่สร้างไว้ไปเป็นหน้าเว็บให้โดยอัตโนมัติ และโปรแกรมจะสร้างฐานข้อมูลขึ้นตามลักษณะแบบสอบถามที่กำหนดโดยอัตโนมัติผู้ ใช้จึงไม่จำเป็นต้องมีความรู้ในการเซตค่าหรือการจัดการฐานข้อมูล ผู้เข้าฟังบรรยายจะได้ดูวิธีประยุกต์เทคนิคการพัฒนาซอต์แวร์ หลายอย่าง อาทิ การสร้างและวิธีประยุกต์ใช้งาน user control การสืบทอดคุณสมบัติของ user control การทำดิลีเกตแบบหลายระดับ วิธีประยุกต์ใช้นิพจน์แลมดาเพื่อประกาศดิลีเกต วิธีสร้าง dropdown listbox แสดงรายชื่อประเทศหรือรายการอื่นด้วยคลาส วิธีทำ O/RM จากเครื่องมืออำนวยความสะดวกของ MSVS2008 วิธีใช้ LINQ เพื่อคิวรีข้อมูลในตาราง วิธีใช้งาน dataGridView ระดับสูงเช่นการใส่ไอคอน แก้ไข ลบ เรียงข้อมูล ฯลฯ

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

    • 16:45 - 17:00
      Wrap-Up

    ลงทะเบียนโดยกรอกแบบฟอร์มลงทะเบียนด้านล่างของเพจนี้

    Venue
    Microsoft (Thailand) Co., Ltd. 38th Floor. CRC Tower.

    Description
    งานสัมมนาฟรี สำหรับสมาชิกและบุคคลทั่วไป บรรยายหัวข้อต่างๆ จัดงานและบริหารโดย GreatFriends Community Votunteers ซึ่งเป็นกลุ่มสมาชิกอาสาสมัครที่มีน้ำใจมาร่วมช่วยงานกัน เราจะเชิญวิทยากรผู้ทรงคุณวุฒิมาบรรยายให้ความรู้แก่ผู้ร่วมงาน และยังยินดีเป็นเวทีเล็กๆ ให้กับผู้สนใจเป็นวิทยากรใหม่อีกด้วย หัวข้อจะเหมาะสมกับนักพัฒนาซอฟท์แวร์ในเทคโนโลยีด้าน Microsoft .NET และอื่นๆ ที่เกี่ยวข้อง

    Contact:
    ต้องการติดต่อ กรุณาส่ง e-mail มาที่
    community@greatfriends.biz

    Previous VTALKS:
    VTALKS #10 - September 28, 2008.
    VTALKS #9 - March 22, 2008.
    VTALKS #8 - January 27, 2008.

    May 24

    ระเบียนบทความ

    ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

    ระเบียนบทความ

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

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

     


      

    สร้างกราฟอย่างง่ายใน ASP.NET   
    ฝึกหัดสร้างกราฟเส้นอย่างง่ายในหน้าเว็บแบบ ASP.NET โดยใช้ control สำเร็จรูปชื่อ WebChart สอนวิธีเขียนโปรแกรมภาษา C# เพื่อกำหนดค่าของกราฟ เป็นแบบฝึกที่ละขั้น (step by step approach) อย่างง่ายที่สุดสำหรับมือใหม
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!636.entry

     


      
      

    เชื่อมต่อฐานข้อมูล Oracle   
    ฐานข้อมูลสำหรับ WebApp นอกจาก Microsoft SQL แล้วหน่วยงานต่างๆ ยังนิยมใช้ Oracle 10g กันมาก เนื่องจากมีท่านผู้อ่านสอบถามมาในกระดานข้อความ www.laploy.com/gbook เกี่ยวกับเรื่องนี้มาก ผู้เขียนตัดสินใจเขียนรับใช้เป็นบทความนี้ โดยจะสอนวิธีเซตค่าให้หน้าเว็บ ASP.NET 2.0 เพื่อเชื่อมต่อกับฐานข้อมูล Oracle 10g โดยใช้ control ของ .NET Framework ชื่อ SqlDataSource
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!661.entry

     


     

    วัดอุณหภูมิและความชื้นด้วย C# ตอน 1   
    เขียนโปรแกรมภาษา C# ใน .NET Framework นิยามคลาสวัดอุณหภูมิและความชื้นที่นำไปใช้ได้ทั้งใน WinForm และ WebForm
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!709.entry

     

     

    วัดอุณหภูมิและความชื้นด้วย C# ตอน 2 (ตอนจบ)   
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!876.entry

     


      

    สร้างหุ่นยนต์ใหม่จากซากไดร์ฟเก่า   
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!755.entry
    ดัดแปลงดิสก์ไดร์ฟที่เสียแล้วนี้ให้เป็นหุ่นหนูน้อย (สับเซทของหุ่นหนู)พื้นฐานการใช้งานสเต็ปปิ้งมอเตอร์ การประกอบโครงสร้างหุ่น และการใช้คอมพิวเตอร์ในการควบคุมหุ่น

     


      

    สร้าง Hash table ( ตารางแฮช ) ด้วยภาษา C++ และจาวา ตอน 1   
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!807.entry
    ตารางแฮช หรือ Hash table คือโครงสร้างข้อมูลชนิดหนึ่ง นักเขียนโปรแกรมสามารถนำตารางแฮช มาใช้เก็บข้อมูลขนาดใหญ่ได้อย่างมีประสิทธิภาพ ในบทความนี้คุณจะได้เรียนวิธีสร้างและประยุกต์ใช้งาน

     

      

    สร้าง Hash table ( ตารางแฮช ) ด้วยภาษา C++ และจาวา ตอน 2   
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!808.entry

     


      

    หน่วยความจำ ชนิดของข้อมูล และการระบุตำแหน่ง   
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!841.entry
    ถ้าคุณพยายามค้นหาชื่อของคุณที่อยู่ในรายชื่อหนึ่งล้านชื่อ คุณต้องพยายามมากสุดกี่ครั้ง ถ้าตอบว่าหนึ่งล้านครั้งละก็ผิด ไม่ใกล้เคียงเลยด้วยซ้ำ อันที่จริงแล้วคำตอบคือ 20 แต่คุณจะต้องจัดรายชื่อให้เป็นโครงสร้างที่ค้นหาได้ง่าย

     


      

    Windows Mobile 6   
    WM6 มีอินเตอร์เฟสที่สวยทันสมัยเข้ากับ Windows Vista และทำงานเร็วขึ้นมาก เพียงเท่านี้จะคุ้มค่ากับการอัพเกรดหรือไม่ การปรับปรุงคุณสมบัติต่างๆ แม้จะไม่หวือหวา แต่เมื่อมองโดยรวมแล้ว WM6 น่าใช้กว่า WM5 จริงหรือ
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!894.entry

     


      

    Gostai บริษัทหุ่นยนต์ผู้ท้าชนไมโครซอฟต์   
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!964.entry
    บริษัทเล็กๆ ที่เพิ่งก่อตั้งได้ปีเดียว มีพนักงานไม่ถึงสิบคน มีไม้ตายอะไรจึงกล้าท้าชนยักษ์ใหญ่?

     

    สร้าง Stack ด้วย C#   
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!970.entry
    นักเขียนโค้ดจำนวนมากคิดว่าภาษา C# ใช้เขียนโปรแกรมสร้าง Stack ไม่ได้ การสร้าง Stack จำเป็นต้องเขียนด้วยภาษาซีหรือภาษา C++ เท่านั้น ความเข้าใจเช่นนั้นผิด เราสามารถใช้ภาษา C# สร้าง Stack ได้ และสนุกด้วย

     


       

    Flash memory – แผ่นจิ๋วแห่งความจำ   
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!976.entry
    การ์ดความจำจิ๋วขนาดเล็บนิ้วมือนี้มีความเป็นมาอย่างไร และจะมีอนาคตเป็นอย่างไร อะไรคือ NAND อะไรคือ NOR การ์ดแบบ  SD ต่างจาก MMC อย่างไร มันจะมาแทนที่ฮาร์ดดิสก์ได้หรือไม่

     


       

    Multi-touch screen ลาก่อนแป้นพิมพ์-เมาส์ สวัสดี!จอหลากสัมผัส    
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!1034.entry
    อหลากสัมผัสเป็นนวัตกรรม มันแตกต่างจากจอภาพระบบสัมผัสธรรมดาที่เราคุ้นเคยกัน จอภาพระบบสัมผัสธรรมดาอย่างที่เห็นตามตู้เอทีเอ็ม ตู้ให้ข้อมูลตามห้างสรรพสินค้า (kiosk) หรือแม้แต่ในเครื่องคอมพิวเตอร์พกพา  (PDA) รับรู้การกดได้เพียงจุดเดียวเท่านั้น แต่จอหลากสัมผัสรับรู้การกดพร้อมๆ กันได้หลายจุด (มากกว่า 50 ตำแหน่ง)  นอกจากนั้นมันยังสามารถแยกแยะอากัปกริยาของนิ้วและความหนักเบาในการกดได้อีกด้วย ยิ่งไปกว่านั้น จอชนิดนี้สามารถ “เห็น” สิ่งที่ถูกวางไว้บนมัน และมีปฏิสัมพันธ์กับอุปกรณ์พกพาดิจิตอลที่มันเห็นได้

     


        

    ActionScript 3 ตอน 1 สร้างเว็บลวดลายจัด   
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!1087.entry
    ยุคการสร้าง application ในเว็บมาถึงนานแล้ว นานจนกระทั่งคำว่า client/server ไม่มีใครพูดกันอีก เพราะใครๆ ก็สร้าง web application (webapp) ที่เป็น client/server จนเป็นเรื่องธรรมดา แต่ webapp วันนี้จะไม่เป็นเพียง form ที่มีช่องให้กรอกมีปุ่ม submit ให้กดส่งข้อมูลอีกต่อไป webapp สมัยใหม่ต้องมีลูกเล่นมากมีลวดลายจัด

     


        

    นิยายนักสืบตอน 1 : Hackarmy-A   
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!1109.entry
    “ดูเหมือนว่า...” คำพูดของผมหายไปเฉยๆ จนต้องกลืนน้ำลายแล้วกระแอมก่อนจะพูดต่อไปว่า “file server ของคุณได้กลายเป็นแหล่งเผยแพร่ซอฟท์แวร์เถื่อนไปแล้วนะครับ”

     


        

       
        

    มาทำลายคอมพิวเตอร์กันเถอะ!!  
    ขั้นตอนง่ายๆ และประหยัด ที่คุณก็ทำเองได้ เพื่อทำให้คอมพิวเตอร์ของคุณมีประสิทธิภาพต่ำกว่าศูนย์
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!1120.entry
    ความสุขของคุณคือการเห็นคอมพิวเตอร์ชำรุด - การได้แบกคอมฯ ไปซ่อมที่ร้าน - การได้จ่ายเงินค่าซ่อมให้ช่าง เป็นอย่างนั้นใช่หรือไม่? ถ้าใช่! โปรดอ่านบทความนี้ เพราะผู้เขียนจะแนะนำเคล็ดลับต่างๆ เพื่อให้คุณสมหวังได้ไม่ยาก!

     



       

    สร้าง IrDA ด้วยตนเอง   
    สร้างตัวรับส่งอินฟราเรดโดยใช้อุปกรณ์หาง่ายราคาถูก เพื่อเชื่อมต่อคอมพิวเตอร์ของคุณกับอุปกรณ์ไฮเทคแบบไร้สาย
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!1168.entry
    สอนวิธีสร้าง IrTxRx ขึ้นใช้เอง โดยใช้วัสดุเหลือใช้รอบๆ ตัว หรือซื้อจากร้ายขายอะไหล่อิเล็กทรอนิกส์ วงจรไม่ซับซ้อน (ออกแบบโดย Alain Gailland) ใช้อุปกรณ์ไม่กี่ชิ้น ใครก็ตามที่บัดกรีเป็นก็สามารถทำได้เอง และจะแสดงตัวอย่างการประยุกต์ใช้งาน โดยการสาทิตวิธีเชื่อมต่อ Pocket PC กับเครื่องพีซีเพื่อทำ ActiveSync แบบไร้สาย และสุดท้ายจะแสดงวิธีเชื่อมต่อกับโทรศัพท์มือถือเพื่อเข้าอินเตอร์เน็ตผ่านระบบ GPRS

     


        

    ชนิดข้อมูลในภาษา C# (ตอน 1)   
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!1176.entry
    อ่านเรื่องซับซ้อนก้าวหน้ากันมามากแล้ว วันนี้มาดูเรื่องพื้นฐานใกล้ๆ ตัวที่ต้องพบเจอกันทุกวันบ้าง ในบทความชุดนี้จะนำเสนอเรื่องของหน่วยความจำ การอ้างแอดเดรส และชนิดข้อมูลในภาษา C# กันหน่อย เพราะเป็นเรื่องสำคัญในการเขียนโปรแกรมจัดการข้อมูลและโครงสร้างข้อมูลทุกแบบ

     


        

    ชนิดข้อมูลในภาษา C# (ตอน 2)  
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!1192.entry
    เรากำหนดขนาดของหน่วยความจำที่ต้องการจองได้โดยเลือกกลุ่มชนิดของข้อมูล จากนั้นก็ต้องเลือกชนิดของข้อมูลที่อยู่ในกลุ่มนั้น ว่าชนิดใดจึงเหมาะกับข้อมูลที่จะจัดเก็บ

     


        

    ชนิดข้อมูลในภาษา C# (ตอนจบ)   
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!1199.entry
    การอ้างหน่วยความจำหรือ memory addressing หมายถึงการระบุตำแหน่งของหน่วยความจำ (แรมในคอมพิวเตอร์) เพื่อบอกให้ตัวแปลภาษารู้ว่าเราจะเอาอะไรไปเก็บที่ไหน เนื่องจากภาษา C# มีลักษณะ managed code ทำให้ปรกติเราจะไม่เขียนอ่านหน่วยความจำโดยตรง แต่จะให้ CLR และระบบปฏิบัติการจัดการให้โดยอัตโนมัติ ที่ผู้เขียนหยิบยกเรื่องนี้มาพูด เพราะการการรู้ว่าการอ้างหน่วยความจำเป็นอย่างไร ก็เป็นสิ่งที่น่าสนใจและจะช่วยให้เห็นภาพรวมของโครงสร้างข้อมูลได้ดี

     

    นิยายนักสืบ ตอน : วิชามาร Social Engineering    
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!1209.entry
    หากผมล้วงงูพิษหรือระเบิดออกมาวางบนโต๊ะ ปฏิกิริยาของผู้เข้าประชุมคงไม่แตกต่างจากตอนนี้ เพราะทุกคนทำท่าทางเลิกลักส่งเสียงพึมพำ เว้นแต่คุณลีลาวดีที่ไม่ส่งเสียงอะไร นั่งนิ่งหน้าถอดสี

     


        

    แจกโค้ด C# วันสงกรานต์ 2551   
    วันนี้ฤกษ์งามยามดี วันสงกรานต์ ปี พ.ศ. 2551 อะไรจะดีสำหรับผมไปกว่าการเขียนรับใช้ท่านผู้อ่าน โดยแจกโค้ดแบบ Tricks & Tips ที่น่าสนใจและมีประโยชน์
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!1212.entry
    เชื่อมสองเทเบิ้ลภายในหนึ่งดาต้าเซต  /  สร้างวิวภายในดาต้าเทเบิ้ล /  โหลดไฟล์ XML เข้าสู่ดาต้าเซต  /  การสร้างเท็กซ์ไฟล์  /  การอ่านเท็กซ์ไฟล์  /  การแทรกข้อมูลเข้าสู่เท็กซ์ไฟล์  /   เซฟรูปภาพสามฟอร์แมต  /  จับข้อมูลใส่ DataGridView   /   อัพเดตฐานข้อมูลจาก DataGridView /  ยืนยันการลบ  /  กำหนดความกว้างโดยอัตโนมัติให้ DataGridView  /  กำหนดความกว้างโดยอัตโนมัติให้ DataGridView  /  เลือกและทำแถบเน้นให้ DataGridView

     


        

    สกิมเมอร์ : เทคโนโลยีโฉดเพื่อทรชน   
    ว้ายร้ายยุคไฮเทคปล้นเงินของคุณได้โดยไม่ต้องชักมีดหรือปืน อาวุธเพียงอย่างเดียวของมันคือสกิมเมอร์
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!1250.entry
    สกิมเมอร์ (skimmer เครื่องดูดหรือกวาดข้อมูล) คือสิ่งประดิษฐ์ที่คนร้ายสร้างขึ้นโดยนำเครื่องอ่านแถบแม่เหล็ก วงจรถอดรหัส และวงจรหน่วยความจำมาประกอบเข้าด้วยกัน สกิมเมอร์มีหลายขนาดตั้งแต่เท่ากับกล่องใส่รองเท้า ไปจนถึงขนาดเท่าซองบุหรี่ที่คนร้ายซ่อนไว้ในอุ้งมือได้ ใช้พลังงานจากแบตเตอรี่จึงสามารถพกพาได้สะดวก

     

     

        

    คิวสวยด้วย C#  
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!1259.entry
    ในบทความตอนที่แล้วผู้เขียนเสนอวิธีสร้าง Stack ด้วยภาษา C# บทความตอนนี้ก็เป็นเรื่องของโครงสร้างข้อมูลอีกเช่นกัน แต่คราวนี้เราจะมาดูวิธีสร้าง “คิว” (Queue) โดยใช้ภาษา C# กันบ้าง สิ่งที่ท่านจะได้เรียนรู้จากบทความตอนนี้คือ
        * หลักการทำงานของโครงสร้างข้อมูลแบบคิว
        * วิธีนิยามคลาสคิวด้วยภาษา C#
        * วิธีทำ constructor overloading
        * วิธีใช้งาน generic queue ของ .NET Framework

     


        

    ActionScript ตอน 2 สร้างลูกศรหันตามเมาส์   
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!1287.entry
    เขียนโปรแกรมภาษา ActionScript 3.0 สร้างออพเจ็กต์ลูกศรที่หันหัวชี้ไปตามการเคลื่อนไหวของเมาส์พอยน์เตอร์ ได้ผลลัพธ์เป็น Flash Movie ไว้ใช้งานในหน้าเว็บ

     


        


        

    มาสร้างแผงเสียบ USB กันเถอะ   
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!1326.entry
    สร้างแผงเสียบ USB ติดตั้งด้านหน้าเครื่องเพื่ออำนวยความสะดวกในการใช้งานอุปกรณ์ USB

     



        

    เขียนโค้ดให้สนุกในยุค 64 บิต  
    เชิญท่องแดนหฤหรรษ์แห่งการเขียนโปรแกรมในซีพียูแบบ 64 บิต
    http://thai-cs.spaces.live.com/blog/cns!4D52C1812766D2D7!1356.entry
    บัดนี้ซีพียู 64 บิตกลายเป็นซีพียูมาตรฐานไปแล้ว จึงได้ฤกษ์อันเป็นมงคล ที่เหล่าโปรแกรมเมอร์ จะอพยพจากโลก 32 บิต ไปเขียนโค้ดแบบ 64 บิตกันเสียที ผู้เขียนขอเสนอตัวเป็นมัคคุเทศก์ นำท่านไปเที่ยวชมโมเดลการเขียนโปรแกรม 64 บิต ทั้งแบบอินเทลและแบบ AMD ความเป็นมาของซีพียู 64 บิต สาเหตุที่ทำให้ AMD สามารถสร้างซีพียูเลียนแบบอินเทลได้และแซงหน้าไปในที่สุด  ตำนานสถาปัตยกรรม อิทาเนียม อันลือลั่นของอินเทล ที่ AMD เยาะว่าไม่ช้าจะสิ้นชื่อ


    เขียนโค้ดให้สนุกในยุค 64 บิต

    ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

    • วันจันทร์ที่ 15 ตุลาคม พ.ศ. 2550
    • บทความโดย : ลาภลอย วานิชอังกูร (laploy.com)
    • ลงพิมพ์ใน : นิตยสาร WinMag

    เขียนโค้ดให้สนุกในยุค 64 บิต
    เชิญท่องแดนหฤหรรษ์แห่งการเขียนโปรแกรมในซีพียูแบบ 64 บิต

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

    หากท่านต้องการทราบคำตอบว่า อะไรคือสถาปัตยกรรม x86-64, IA32, IA64, EM64, Intel64 และ AMD64 โมเดลเขียนโปรแกรมของซีพียู 64 บิตจาก AMD และอินเทล เหมือนหรือแตกต่างกันหรือไม่ ซอฟต์แวร์เดิมแบบ 16 และ 32 บิตจะยังทำงานกับซีพียู 64 บิตได้หรือไม่ นักเขียนโปรแกรมต้องปรับตัว หรือเปลี่ยนวิธีเขียนโปรแกรมอย่างไรบ้าง จึงจะสามารถสร้างซอฟต์แวร์แบบ 64 บิตได้ ขอเชิญพบคำตอบเหล่านี้ และหัวข้อที่น่าสนใจอื่นๆ อีกมากได้ในบทความนี้

     

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

    ระบบปฏิบัติการสำหรับซีพียู 32 บิตอ้างหน่วยความจำได้สูงสุดเพียง 4 GB และคำนวณเลขทศนิยมได้ไม่เร็วนัก งานที่ต้องใช้หน่วยความจำมากๆ และต้องคำนวณเลขทศนิยมอย่างหนัก เช่น เกมและโปรแกรมสร้างภาพสามมิติจึงทำงานได้อย่างจำกัด ส่วนระบบปฏิบัติการซีพียู 64 บิต อ้างหน่วยความจำได้สูงสุด 16 เทราไบต์ เรียกใช้งานรีจิสเตอร์ 64 บิตและรีจิสเตอร์คำนวณเลขทศนิยม 128 บิตได้เต็มที่ ทำให้เกมและโปรแกรมสร้างภาพสามมิติทำงานเร็วขึ้นมาก

     

    ที่มาของตัวเลข 64

    หน่วยต่ำสุดของข้อมูลที่คอมพิวเตอร์ประมวลผลได้คือหนึ่งบิต แทนค่าได้สองค่าคือศูนย์และหนึ่ง เหมือนสวิทช์หนึ่งตัวที่อาจอยู่ในตำแหน่งปิดหรือปิด เนื่องจากบิตเดียวไม่สามารถแทนข้อมูลอะไรได้มากนัก การประมวลผลจึงใช้หน่วยไบต์ หรือแปดบิต สาเหตุที่เป็นแปดบิต (แทนที่จะเป็นเจ็ดหรือเก้าบิต) เพราะในระบบเลขฐานสองการเพิ่มหลักของตัวเลขจะเพิ่มแบบยกกำลังสอง (คือเพิ่มจาก 2 เป็น  4,8,16,32,64,128 ฯลฯ)

    การพิจารณาว่าไมโครโปรเซสเซอร์มีขนาดกี่บิต ให้ดูจากขนาดของหน่วยประมวลผลทางตรรกะและคณิตศาสตร์ หรือ ALU (Arithmetic Logic Unit) ไมโครโปรเซสเซอร์ ตัวแรกของบริษัทอินเทล ชื่อ 4004 มี ALU ขนาดสี่บิต ออกจำหน่ายในปี ค.ศ. 1971 แต่ไมโครโปรเซสเซอร์ที่ได้รับความนิยมนำไปใช้ในไมโครคอมพิวเตอร์คือ 8088 ที่ออกจำหน่ายในปี 1979 ไมโครโปรเซสเซอร์ 8088 เป็นซีพียูแบบกึ่งแปดบิตกึ่งสิบหกบิต เพราะ ALU มีขนาด 16 บิต รีจิสเตอร์ภายในก็เป็นสิบหกบิต แต่บัสข้อมูลมีขนาดแปดบิต

    007

    ไมโครโปรเซสเซอร์ 8088

     

    นิทานอินเทล

    บริษัทอินเทลออกจำหน่ายไมโครโปรเซสเซอร์ 8086 ซึ่งเป็นซีพียูขนาด 16 บิตตัวแรกในปี 1978 และตามด้วย 80386 ซึ่งเป็นซีพียูขนาด 32 บิตในปี 1986 ปัจจุบันอินเทล เรียกสถาปัตยกรรมนี้ว่า IA-32  กลายเป็นรากฐานของโมเดลการเขียนโปรแกรมมาตลอดสิบสองปีไม่เปลี่ยนแปลง ซีพียูรุ่นต่อมาไม่ว่าจะเป็น  486, เพนเทียม, เพนเทียมทู, เพนเทียมทรี, Celeron, แพนเทียมโฟร์, Xenon, แพนเทียมเอ็ม ฯลฯ ล้วนใช้โมเดลเดียวกันนี้

    จุดเด่นของสถาปัตยกรรม IA-32 คือบัสข้อมูลภายนอกและภายในเป็น 32 บิตล้วน สามารถอ้างหน่วยความจำได้ต่อเนื่องเป็นผืนเดียวกัน (flat memory space) และมีกลไกที่ช่วยให้ใช้ฮาร์ดดิสก์เป็นหน่วยความจำเสมือนได้ง่าย ถึงสามารถรันโปรแกรมและอ้างถึงข้อมูลที่มีขนาดใหญ่กว่าปริมาณของแรมในเครื่องได้ อินเทลมีซีพียูแบบ IA-32 บิตที่ได้รับความนิยมจำนวนมาก เช่น Celeron, Pentium 4, Dual-Core, Core2Duo และ Xenon

         001
    สถาปัตยกรรมของซีพียู 386DX จะเห็น ALU บัสข้อมูลภายนอกและภายในเป็น 32 บิตล้วน  (กดเพื่อขยาย)

     

    002
    สถาปัตยกรรม อิทาเนียม จะเห็นว่าบัสภายในมีขนาด 64, 128 และ 256 บิต

    64 บิตสไตล์อินเทล

    อินเทลเริ่มพัฒนาซีพียู 64 บิตมาตั้งแต่ปี 1994 โดยทำงานร่วมกับบริษัท ฮิวเลต เพคการ์ด (HP) เพื่อสร้างโปรเซสเซอร์สำหรับเครื่องแม่ข่าย ช่วงแรกเรียกสถาปัตยกรรมนี้ว่า IA-64 แต่ต่อมาเปลี่ยนเป็น อิทาเนียม สถาปัตยกรรมนี้แตกต่างจากสถาปัตยกรรม IA-32 มาก มีนวัตกรรมโดดเด่นหลายอย่าง มีรีจิสเตอร์เลขจำนวนเต็ม 128 ตัว รีจิสเตอร์เลขทศนิยม 128 ตัว และรีจิสเตอร์คำสั่งกระโดด 64 ตัว อ้างตำแหน่งหน่วยความจำแรมได้ 16 เทราไบต์ โปรเซสเซอร์มีหน่วยทำงานภายในภายในสามสิบหน่วย แต่ละหน่วยทำงานเป็นอิสระจากกันและทำงานพร้อมๆ กันได้ แบ่งออกเป็นกลุ่มต่างๆ ดังนี้

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

     

    อิทาเนียมรุ่นที่ออกขายก่อนปี 2006 มีฮาร์ดแวร์ที่สนับสนุนสถาปัตยกรรม IA-32 เพื่อให้ใช้งานได้กับแม่ข่ายรุ่นเก่า ในชิพรุ่นหลังปี 2006 เช่น อิทาเนียม II : Montecito อินเทลได้เพิ่มคุณสมบัติใหม่บางอย่างเช่น สนับสนุนการทำงานแบบหลายเทรธ แบบใหม่ที่มีประสิทธิภาพมากขึ้น และคุณสมบัติที่ทำให้วิ่งซอฟต์แวร์ระบบปฏิบัติการมากกว่าหนึ่งระบบได้พร้อมกันได้ ปัจจุบันมีระบบปฏิบัติการที่ใช้กับอิทาเนียมได้หลายตัว เช่น Windows Server 2003, Windows Vista, Linux, HP-UX, และ OpenVMS

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

    •    อิทาเนียม : Merced ออกจำหน่ายปี 2001
    •    อิทาเนียม ทู : McKinley ออกจำหน่ายปี 2004
    •    อิทาเนียม ทู : Madison 9M ออกจำหน่ายปี 2005
    •    อิทาเนียม ทู : Montecito เป็นอิทาเนียม ที่มีจำหน่ายในปัจจุบัน

    008

    อิทาเนียมทู McKinley

     

    เทพนิยาย  AMD

    ยุคก่อนเครื่องเลียนแบบไอบีเอ็มพีซี (IBM PC Compatible หรือเครื่องโคลน) ลูกค้ารายใหญ่ที่ซื้อชิพ 8086 ของอินเทลมีไอบีเอ็มเจ้าเดียว ในปี 1982 ไอบีเอ็มออกนโยบายจัดซื้อให้ซื้อจากผู้ผลิตอย่างน้อยสองราย บีบให้อินเทล ต้องจับมือกับบริษัท AMD ( AMD  Advance Micro Device) และเปิดเผยเทคโนโลยีการผลิตชิพแก่ AMD 

    เมื่อเครื่องโคลนครองตลาดคอมพิวเตอร์ส่วนบุคคลในปี 1986 ไอบีเอ็มไม่ใช่ลูกค้าสำคัญอีกต่อไป บริษัทอินเทลจึงยกเลิกสัญญาเปิดเผยเทคโนโลยีผลิตชิพ แต่ AMD ก็สามารถผลิตชิพรุ่นต่อมาที่เข้ากันได้กับชิพของอินเทล ช่วงแรก AMD ตั้งชื่อชิพโดยใช้เลขอนุกรมตรงกับอินเทล (คือ 8088, 8086, 80286 และ 80386) ในปี 1993 อินเทลเปลี่ยนวิธีตั้งชื่อซีพียูจากตัวเลขไปเป็นตัวอักษร (คือ 80586 เป็นอินเทลเพนเทียม)  AMD ไม่สามารถใช้ชื่อนี้ได้จึงเปลี่ยนไปใช้ชื่อที่นำหน้าด้วยตัว K โดยกลุ่ม K6 เทียบได้กับเพนเทียม ถึงเพนเทียมทรี และ K7 เทียบได้กับ เพนเทียม 4

         009
        AMD K6-III

     

    64 บิต ของดีของ  AMD

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

    •    Athlon 64 : เป็น K8 แบบคอร์เดียว มีทั้งแบบเดกส์ท็อปและโน้ตบุ๊ก  เป็นซีพียูหลักของ AMD
    •    Athlon 64x2 : เป็น K8 แบบสองคอร์
    •    Opteron :  เป็น K8 รุ่นที่ออกมาก่อนเพื่อน เพื่อให้นำไปสร้างคอมพิวเตอร์แม่ข่าย
    •    Sempron 64 : เป็น K8 รุ่นราคาสบายกระเป๋า มีทั้งแบบเดกส์ท็อปและโน้ตบุ๊ก มาแทนที่ซีพียู Duron เพื่อต่อกรกับ Celeron D 64 ของอินเทล
    •    Turion 64 : เป็น K8 รุ่นกินพลังงานน้อย เหมาะใช้ทำโน้ตบุ๊ก

    นอกจาก K8 แล้ว AMD ยังซุ่มพัฒนาสถาปัตยกรรม K9 มาตั้งแต่ปี 2001 โดยตั้งใจจะให้เป็นสถาปัตยกรรมซึ่งจะมาแทนที่ K8 แต่โครงการนี้ถูกล้มเลิกไปในปี 2006 เพราะ AMD ต้องการผลักดันโครงการที่ใหม่กว่า นั่นคือ K10 (ข้ามจาก K8 ไปเป็น K10 เลย)  AMD แถลงว่าจะนำ Phenom ซีพียู 64 บิตแบบสี่คอร์ (ซึ่งจะเป็นซีพียูที่ใช้สถาปัตยกรรม K10 ตัวแรก) ออกวางตลาดได้ช่วงปลายปีนี้ (พ.ศ. 2550)

     

    003

    ไฟล์ภาพ 003.png : สถาปัตยกรรม K8

     

    อินเทล 64 ตัวทำเงิน

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

    •    Core 2 Duo : ซีพียู 64 บิตสองคอร์สำหรับเดสก์ทอป เป็นซีพียูหลักของอินเทล
    •    Celeron D 64 : ซีพียู 64 บิตราคาย่อมเยา มีทั้งแบบเดสก์ทอปและโน้ตบุ๊ก
    •    Centrino Duo และ Pro : ซีพียู 64 บิตสองคอร์เพื่อใช้สร้างโน้ตบุ๊ก
    •    Core 2 Quad : ซีพียู 64 บิตสี่คอร์สำหรับแม่ข่ายหรือเดสก์ทอปที่ต้องการซีพียูพลังสูงเป็นพิเศษ
    •    Xeon : ซีพียู 64 บิตมีทั้งแบบสองและสี่คอร์สำหรับแม่ข่ายระดับสูงสุด

    010 Xeon แบบสี่คอร์

     

    เรื่องไส้ๆ ของ K8

    ดูในตารางจะเห็นว่าเมื่อเราเขียนโปรแกรมในโหมดเดิม เราจะมีรีจิสเตอร์อเนกประสงค์ขนาด 32 บิต อยู่แปดตัว แต่ถ้าเขียนในโหมด 64 บิต เราจะมีรีจิสเตอร์ 64 บิตถึง 16 ตัว โปรแกรมเมอร์ภาษาแอสเซมบลีจะสนุกกว่าเพื่อน เพราะชื่อรีจิสเตอร์เปลี่ยนหมด แถมมี R8 ถึง 15 เพิ่มมาให้ใช้อย่างจุใจ ส่วน ST และ MM ไม่มีอะไรเปลี่ยน เพราะเดิมก็เป็น 64 บิตอยู่แล้ว

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


    004 

     

    เทียบเท่าถึงปู่ทวด

    ลองมาดูรีจิสเตอร์ A หรือแอคคิวมูเลเตอร์ซึ่งเป็นรีจิสเตอร์หลักของซีพียูกันหน่อย จากรูปจะเห็นว่าหากเขียนโปรแกรมแบบ 64 บิต รีจิสเตอร์นี้จะมีชื่อว่า RAX มีขนาด 64 บิต หากเขียนโปรแกรมแบบ 32 บิต รีจิสเตอร์นี้จะมีชื่อว่า EAX มีขนาด 32 บิต หากเขียนโปรแกรมแบบ 16 บิต รีจิสเตอร์นี้จะมีชื่อว่า AX มีขนาด 16 บิต และหากเขียนโปรแกรมแบบ 8 บิต รีจิสเตอร์นี้จะกลายเป็นรีจิสเตอร์ขนาด 8 บิตสองตัว คือ AH และ AL

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

    005

    ขนาดของแอคคิวมูเลเตอร์ในสถาปัตยกรรม K8

     

    ตัวอย่างโปรแกรม K8

    ต่อไปมาดูคำสั่งภาษาแอสเซมบลีของ K8 ในการบวกเลขจำนวนเต็มสองจำนวน เลขจำนวนแรกเก็บอยู่ในรีจิสเตอร์ A และตัวที่สองอยู่ใน B เราจะนำค่าใน A ไปบวกกับ B ผลลัพธ์จะถูกนำไปเก็บไว้ใน B

    ก่อนการบวก A และ B มีค่าดังนี้ RAX = 0002_0001_8000_2201 RBX = 0002_0002_0123_3301

    •    บวกแบบ 64 บิต : ADD RBX,RAX      ผลลัพธ์: RBX = 0004_0003_8123_5502
    •    บวกแบบ 32 บิต : ADD EBX,EAX      ผลลัพธ์: RBX = 0000_0000_8123_5502
    •    บวกแบบ 16 บิต : ADD BX,AX           ผลลัพธ์: RBX = 0002_0002_0123_5502
    •    บวกแบบ 8 บิต :   ADD BL,AL           ผลลัพธ์: RBX = 0002_0002_0123_3302

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

     

    013 
    ซีพียู Opteron แบบสี่คอร์

     

    คำสั่งที่เปลี่ยนไปใน AMD64

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

     

    • เพิ่ม REX : REX คือเป็นโค้ดชุดใหม่เอี่ยม ใช้เติมด้านหน้าคำสั่งเดิมเพื่อการระบุรีจิสเตอร์และโอเปอเรนด์ขนาด 64 บิต
    • เปลี่ยนแปลง Segment-Override Prefixes (SOP) : เมื่อเขียนโปรแกรมแบบ 64 บิต SOP  จะไม่มีผลกับ DS, ES, SS และ CS แต่มีผลกับ FS และ GS
    • การบังคับขนาดโอเปอเรนด์ : ขนาดโดยปริยายของโอเปอเรนด์ในการเขียนโปรแกรมแบบ 64 บิต คือ 32 บิต แต่สามารถใช้ REX เปลี่ยนเป็น 64 บิตได้
    • การเติมศูนย์นำหน้าผลลัพธ์ : อย่างที่เห็นในหัวข้อที่แล้ว เมื่อเราดำเนินการแบบ 32 บิต เลขศูนย์จะถูกเติมไว้ด้านหน้าของผลลัพธ์จนครบ 64 บิต
    • การบังคับขนาดตำแหน่งหน่วยความจำ : เมื่อเขียนโปรแกรมแบบ 64 บิตขนาดของตำแหน่งหน่วยความจำจะเป็น 64 บิต แต่เราสามารถใช้โค้ด 67h เพื่อเปลี่ยนเป็น 32 บิตได้
    • ค่าป้อนสด (Displacement และ Immediate) : ยังคงเป็น 32 บิตเท่าเดิม ยกเว้นคำสั่ง MOV ที่มีเพิ่มให้ใส่เป็น 64 บิตได้ด้วย
    • การเติมศูนย์นำหน้าตำแหน่งหน่วยความจำ : เมื่อทำการคำนวณตำแหน่งหน่วยความจำแบบ 16 และ 32 บิต เลขศูนย์จะถูกเติมด้านหน้าจนครบ 64 บิต
    • การอ้างตำแหน่งหน่วยความจำแบบใหม่ : วิธีอ้างตำแหน่งหน่วยความจำแบบสัมพันธ์โดยใช้ค่าในรีจิสเตอร์ชี้คำสั่งบวกกับดีสเพลสเมนท์ ได้ผลลัพธ์เป็นตำแหน่งหน่วยความจำขนาด 64 บิต
    • สแต็กขนาด 64 บิต : เพิ่มคำสั่งที่เกี่ยวข้องกับรีจิสเตอร์ชี้สแต็กขนาด 64 บิต (RSP)
    • คำสั่งกระโดด (branch) : คือคำสั่งในกลุ่มที่เปลี่ยนแปลงค่าของรีจิสเตอร์ RIP เช่น CALL, JMP และ RET ถูกนิยามการทำงานใหม่แตกต่างจากเดิมเล็กน้อย (ทั้งแบบกระโดดใกล้และกระโดดไกล)
    • การสลับสแต็ก : การสลับสแต็กแบบอัตโนมัติถูกเปลี่ยนแปลงให้สนับสนุน 64 บิต
    • คำสั่ง NOP : ออพโค้ด 90h ในเลกาซีคือคำสั่ง XCHG EAX, EAX ถูกเปลี่ยนเป็นไม่ทำอะไรเลยจริงๆ (เหมือนในสมัยแปดบิต)
    • เปลี่ยนโค้ด INC และ DEC : สองคำสั่งนี้เดิมใช้เพิ่มค่ารีจิสเตอร์ แต่ใน K8 โค้ดกลุ่มนี้ถูกนำไปใช้ทำอย่างอื่น ออพโค้ดของสองคำสั่งนี้จึงถูกเปลี่ยนใหม่
    • คำสั่ง MOVSXD : เป็นคำสั่งใหม่ ทำหน้าที่คล้ายคำสั่ง MOVSX เดิม
    • ยกเลิกคำสั่ง : มีคำสั่งหลายคำสั่งถูกยกเลิกไป เช่น AAA, INTO, LES ฯลฯ หากนำไปใช้จะเกิดเออเรอร์ตอนแปลโปรแกรม สาเหตุที่ยกเลิกเพราะบางคำสั่งออพโค้ดถูกนำไปใช้ทำอย่างอื่น (เช่นนำไปใช้ร่วมกับ REX) ขณะที่บางคำสั่งถูกยกเลิกเพราะเข้ากันไม่ได้กับสถาปัตยกรรม 64 บิต
    • เก็บไม่ให้เหลือ : คำสั่ง FXSAVE คำหน้าที่นำข้อมูลในรีจิสเตอร์ทั้งหมดไปเก็บในหน่วยความจำ และคำสั่ง FXRSTOR ทำหน้าที่นำข้อมูลกลับคืนมาใส่ในรีจิสเตอร์

    011 
    Athlon 64 บิตแบบสองคอร์

     

     

    เขียนโปรแกรม 64 บิตใน อิทาเนียม

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

    •    โปรเทคโหมด : เป็นการทำงานแบบโปรเทคโหมดภายใต้ซีพียูอิทาเนียม
    •    เรียลโหมด : เป็นการทำงานแบบเรียลโหมดภายใต้ซีพียูอิทาเนียม
    •    เวอร์ช่วลโหมด : เป็นการทำงานแบบเวอร์ช่วลโหมดภายใต้ซีพียูอิทาเนียม
    •    โหมดอิทาเนียม : เป็นการทำงานแบบอิทาเนียมเต็มรูปแบบ

    อิทาเนียมสามารถสลับการทำงานระหว่าง 32 และ 64 บิตได้ตลอดเวลาโดยอาศัยคำสั่งพิเศษและอินเตอร์รัพต์ โดยขณะทำงานอยู่ในโหมด 64 บิตจะใช้คำสั่ง br.ia เพื่อเปลี่ยนไปเป็นแบบ 32 บิต และคำสั่ง jmpe เพื่อเปลี่ยนไปเป็น 64 บิตขณะทำงานแบบ 32 บิต

     

    012

    อิทาเนียมทู

     

    รีจิสเตอร์ของอิทาเนียม

    รีจิสเตอร์ของอิทาเนียมที่เกี่ยวข้องกับนักเขียนโค้ดซึ่งเขียนโค้ดระดับต่ำ อย่างภาษาแอสเซมบลีหรือภาษาซี (รวมถึง C++) มีดังนี้

    •    รีจิสเตอร์ใช้งานทั่วไป (GR): จำนวน 128 ตัวขนาด 64 บิต ใช้งานอเนกประสงค์
    •    รีจิสเตอร์เลขทศนิยม (FR): จำนวน 128 ตัวขนาด 82 บิต ใช้คำนวณเลขมีทศนิยม
    •    รีจิสเตอร์พยากรณ์ (PR): จำนวน 64 ตัวขนาด 1 บิต ใช้พยากรณ์การกระโดด
    •    รีจิสเตอร์กระโดด (BR): จำนวน 8 ตัวขนาด 64 บิต ใช้ในการกระโดด
    •    รีจิสเตอร์ตัวชี้คำสั่ง (IP): จำนวน 1 ตัวขนาด 64 บิต ใช้ชี้คำสั่ง
    •    รีจิสเตอร์สร้างเฟรม (CFM): จำนวน 1 ตัวขนาด 38 บิต ใช้บอกสภาพสแต็กเฟรม
    •    รีจิสเตอร์ประยุกต์ (AR): จำนวน 128 ตัวขนาด 64 บิต กลุ่มรีจิสเตอร์ใช้งานเฉพาะกิจ
    •    รีจิสเตอร์เฝ้าระวัง (PMD): ขนาด 64 บิต ใช้ตรวจสอบประสิทธิภาพของฮาร์ดแวร์
    •    รีจิสเตอร์มาสก์ (UM): ขนาด 6 บิต ทำหน้าที่เหมือนแฟลก
    •    รีจิสเตอร์ระบุโปรเซสเซอร์ (CPUID): ขนาด 64 บิต ใช้บอกข้อมูลจำเพาะของชิพ

    ในการเขียนโค้ดแบบอิทาเนียม 64 บิตเต็มยศรีจิสเตอร์เหล่านี้จะถูกใช้ทั้งหมด และเพื่อให้เข้ากันได้กับการเขียนโค้ดในสถาปัตยกรรม IA-32 เดิม รีจิสเตอร์เหล่านี้จะถูกจำลอง (register mapping) เป็นรีจิสเตอร์ของแพนเทียม 32 บิต

     

    006 

     

     

    ตัวอย่างโปรแกรมอิทาเนียม

    ไม่ใช่แค่ใน C# และจาวาเท่านั้นที่มีเนมสเปส แต่ในภาษาแอสเซมบลีของอิทาเนียมก็มีเนมสเปสกับเขาด้วยเหมือนกัน แต่ความหมายคนละเรื่องกันเลย เนมสเปสในอิทาเนียมมีสามตัวคือ ซิมโบล (Symbols สัญลักษณ์) รีจิสเตอร์ และนีโมนิก ลองดูตัวอย่างโค้ดต่อไปนี้

    1    r5:
    2    movl r4=r5#
    3    ld4 r28=[r8]
    4    add r9=2,r1

    จากโค้ดข้างบน คำสั่งบรรทัดที่หนึ่งเรากำหนดลาเบลชื่อ r5 นี่คือตัวอย่างการใช้ซิมโบล บรรทัดต่อมาคำสั่ง movl ทำหน้าที่นำข้อมูลในหน่วยความจำตำแหน่งที่ระบุโดย r5 มาใส่ไว้ในรีจิสเตอร์ r4 คำสั่งบรรทัดที่ 3 โหลดข้อมูลสี่ไบต์มาใส่ใน r28 นี่คือตัวอย่างของการอ้างถึงรีจิสเตอร์ บรรทัดที่ 4 นำ 2 มาบวกกับ r1 แล้วนำไปใส่ใน r9 คำสั่ง add คือนีโมนิก ซึ่งอาจะเป็นคำสั่งของอิทาเนียมจริงๆ หรืออาจเป็นพซิวโดออพ (Pseudo-op หมายถึงคำสั่งเทียมที่จะถูกนำไปแปลเป็นภาษาเครื่องอีกที) ก็ได้

     

    ภาษาแอสเซมบลี 64 บิต

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

     

    C++ 64 บิต

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

    char buf[9];
    sprintf(buf, "%p", pointer);

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

    size_t ArraySize = N * 4;
    intptr_t *Array = (intptr_t *)malloc(ArraySize);

    อย่างนี้ก็จะเออเรอร์เช่นกันเพราะจองเนื้อที่อาร์เรย์ไว้ไม่พอ วิธีแก้คือใช้ฟังก์ชัน sizeof() ดังนี้

    size_t ArraySize = N * sizeof(intptr_t);
    intptr_t *Array = (intptr_t *)malloc(ArraySize);

    ถ้าเขียนแบบนี้โปรแกรมจะทำงานได้ถูกต้องทั้งใน 32 และ 64 บิต ต่อไปลองดูปัญหาที่เกิดจากการเลื่อนบิต

    ptrdiff_t SetBitN(ptrdiff_t value, unsigned bitNum) {
      ptrdiff_t mask = 1 << bitNum;
      return value | mask;
    }

    ฟังก์ชันนี้หาก bitNum เท่ากับ 32 เมื่อทำงานแบบ 32 บิต mask จะเป็นศูนย์ แต่ถ้าทำงานแบบ 64 บิต mask จะไม่ใช่ศูนย์ปัญหาเกิดจากเลข 1 ที่ใช้ทำ mask มีจำนวนไบต์ต่างจาก ptrdiff_t  วิธีแก้ง่ายๆ คือทำแปลงไทป์ให้ตรงกันแบบนี้ จะทำงานได้ถูกต้องทั้งใน 32 และ 64 บิต

    ptrdiff_t mask = ptrdiff_t(1) << bitNum;

     

    จาวา 64 บิต

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

    ตอนนี้มีจาวารันทามน์หลายแพลตฟอร์ม เช่น ในระบบปฏิบัติการโซลาริสสำหรับซีพียู SPARC 64 บิต ใน Windows Server 2003 ที่ใช้ซีพียู Opteron และในลินุกซ์เรดแฮต ที่ใช้ Opteron เช่นกัน ส่วนจาวารันทามน์ที่ทำงานได้ในซีพียูอิทาเนียมตอนนี้ยังไม่เห็นแม้แต่เงา

           

     

    ดอตเน็ต 64 บิต

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

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

     

    ActionScript 64 บิต
    ภาษา ActionScript เวอร์ชันสาม (AS3) ที่ใช้ร่วมกับ Flex 2 ถือว่าเป็นภาษาที่มีกลุ่มผู้ใช้มาก เป็นภาษา OOP คล้าย C# และจาวา แต่คอมไพล์ออกมาเป็น .swf จึงทำงานได้กับตัวเล่นแฟลช 9 ได้ ทำให้นักเขียนโค้ดเขียนสคริปต์ฝั่งไคลเอนได้อย่างหวือหวา ผู้เขียนโค้ดภาษา AS3 ก็เช่นเดียวกับนักเขียนโค้ดดอตเน็ตและจาวา คือไม่ต้องกังวลกับการอพยพจาก 32 ไปยัง 64 บิต เพราะรันทามน์ในตัวเล่นแฟลชจะเป็นผู้จัดการทุกอย่างให้ทั้งหมด ปัญหาหลักคือขณะนี้บริษัท Adobe ยังสร้างตัวเล่นแฟลชที่ทำงานในบราวเซอร์ 64 บิตไม่เสร็จ (ตัวปลักอิน) และยังไม่มีกำหนดว่าจะเสร็จเมื่อใด
            

     

    อนาคตสดใสในโลก 64 บิต

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

    เมื่อมีผู้ใช้ชิพ 64 บิตมากขึ้นอีกไม่นานเราคงได้เห็นซอฟต์แวร์ 64 บิตพันธุ์แท้ มันจะเป็นซอฟต์แวร์ที่ทรงพลังอย่างที่ไม่เคยมีมาก่อน โปรแกรมที่จะได้รับประโยชน์จากการเขียนโค้ดแบบ 64 บิต คือโปรแกรมที่กินแรงซีพียู และต้องการหน่วยความจำมากๆ เช่นโปรแกรมสร้างภาพสามมิติและเกม ลองนึกภาพดูว่า เกมเอนจิน (game engine)อย่าง Half-Life2 หรือ Oblivion หากถูกนำมาสร้างใหม่เป็นแบบ 64 บิตจะดีเด่นเพียงใด แค่คิดก็ตื่นเต้นจนอดใจรอไม่ไหวแล้ว

    เกี่ยวกับผู้เขียน
    ลาภลอย วานิชอังกูร
      : เป็นผู้เชี่ยวชาญด้าน .Net C# และ OOP ทำงานด้านคอมพิวเตอร์มานานกว่ายี่สิบปี เขียนโปรแกรมคล่องหลายภาษา เคยทำงานด้านคอมพิวเตอร์ที่ประเทศสหรัฐอเมริกา ประเทศเยอรมัน และประเทศสวิส เคยเป็นครูสอนวิชาคอมพิวเตอร์ เคยเป็นบรรณาธิการนิตยสารคอมพิวเตอร์ มีผลงานบทความ และตำราคอมพิวเตอร์จำนวนมาก ปัจจุบันทำหน้าที่เป็นผู้ให้คำปรึกษาด้าน .Net ให้แก่บริษัท Accenture ท่านสามารถติดต่อผู้เขียนได้ที่ กระดานบทความในเว็บไซต์ laploy.com และที่อีเมล laploy@gmail.com

         vtalk802-small

    May 17

    มาสร้างแผงเสียบ USB กันเถอะ

    ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

    มาสร้างแผงเสียบ USB กันเถอะ

    สร้างแผงเสียบ USB ติดตั้งด้านหน้าเครื่องเพื่ออำนวยความสะดวกในการใช้งานอุปกรณ์ USB

     

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

     

    OLYMPUS DIGITAL CAMERA

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

    จากนิตยสาร CompToday

     

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

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

    สิ่งที่ผมจะทำคือนำฝาปิดช่องไดร์ฟด้านหน้า (คือชิ้นพลาสติกแบนๆ ยาวๆ ที่ใช้ปิดช่องว่างสำหรับติดตั้งซีดีรอมไดร์ฟด้านหน้าเครื่อง) มาเจาะรู้ใส่ช่องเสียบ USB ผลลัพธ์ที่ได้เป็นอย่างที่เห็นในรูปที่ 1

     

    OLYMPUS DIGITAL CAMERA         แผงเสียบ USB ด้านหลังแบบสองช่อง (ดูรูปที่ 2) เป็นอุปกรณ์ที่หาซื้อได้ตามศูนย์ไอทีทั่วไป แผงนี้จะมีหัว USB แบบ A ตัวเมียติดอยู่สองตัว พร้อมสายยาวประมาณยี่สิบสี่นิ้ว ซึ่งเหมาะพอดี (หัว USB มีสองแบบคือแบบแบนๆ ที่เราเห็นอยู่ที่ตัวคอมพิวเตอร์เรียกว่าแบบ A และแบบสี่เหลี่ยมที่เราเห็นตามอุปกรณ์รอบข้างเช่นเครื่องพิมพ์และสแกนเนอร์ เรียกว่าแบบ B)

    << รูปที่ 1 : แผงเสียบ USB ติดตั้งด้านหน้าเครื่องที่ประดิษฐ์ขึ้นเอง

     

    เพื่อให้ข้อความกะทัดรัด ต่อไปจะเรียก “แผงเสียบ USB ด้านหลังแบบสองช่อง” ว่า USBP เรียก “ฝาปิดช่องไดร์ฟด้านหน้า” ว่า DP และเรียก “หัว USB แบบ A ตัวเมีย” ว่า USBAF

    รูปที่ 2 : แผงเสียบ USB ด้านหลังแบบสองช่อง >>
          OLYMPUS DIGITAL CAMERA

     

    OLYMPUS DIGITAL CAMERA

    แกะ USBAF ออกจาก USBP แล้วนำมายึดไว้กับ DP ตอนแรกผมลองยึดแบบแนวนอน ปรากฏว่าไม่สามารถใส่ USBAF ครบสี่ตัวบน DP ชิ้นเดียวได้ จึงเปลี่ยนไปยึดแบบแนวตั้งแทน

     

    << รูปที่ 3 : การยึด USBAF กับ DP แบบแนวนอนซึ่งไม่ใช่วิธีที่ถูกต้อง

     

    การเจาะช่องเสียบ USBAF บน DP จะต้องอาศัยแบบ (template) ที่ถูกต้อง ผมจึงนำ USBP ที่ถอด USBAF ออกแล้ว ไปเข้าเครื่องสแกนแล้วพิมพ์ออกมา

     

    รูปที่ 4 : แบบที่สร้างจากการนำ USBP (ที่ถอด USBAF ออกแล้ว) นำไปสแกนแล้วพิมพ์ >>

        OLYMPUS DIGITAL CAMERA          

     

    OLYMPUS DIGITAL CAMERA

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

     

    << รูปที่ 5 : เจียรแนวเส้นพลาสติกออกเพื่อให้ใส่ USBAF ได้

    OLYMPUS DIGITAL CAMERA         OLYMPUS DIGITAL CAMERA
    รูปที่ 6 : นำ USBAF มายึดกับ DP เจาะรูใส่นอต โดยยังไม่ต้องเจาะช่องเสียบ USB รูปที่ 7 : ด้านหน้า DP เมื่อยึดนอตแล้ว
    OLYMPUS DIGITAL CAMERA         OLYMPUS DIGITAL CAMERA
    รูปที่ 8 : เมื่อได้รูนอตที่ถูกต้องแล้ว ให้นำแบบมาทาบด้านหน้า DP ใส่นอตเพื่อบังคับให้แบบอยู่ในตำแหน่งที่ถูกต้อง แล้วใช้ดินสอขีดตามช่องเพื่อกำหนดบริเวณที่จะเจาะ รูปที่ 9 : เจาะช่องโดยใช้สว่านแล้วตะใบให้ได้ช่องสี่เหลี่ยมผืนผ้าที่เรียบตรง
    OLYMPUS DIGITAL CAMERA         OLYMPUS DIGITAL CAMERA
    รูปที่ 10 : เมื่อเจาะช่องเสร็จแล้วนำ USBAF มายึดไว้ด้วยนอต รูปที่ 11 : เมื่อนำสาย USB มาเสียบจะเป็นแบบนี้
    OLYMPUS DIGITAL CAMERA
    เมื่อทำเสร็จแล้วผมทดลองนำไปติดด้านหน้าเคส แล้วลองเสียบถอดสาย USB ปรากฏว่า DP จะหลุดออกเมื่อถอดสาย USB เพราะสลักที่ยึด DP ไม่แน่นหนาพอ ผมจึงคิดแก้ไขโดยจะนำ DP ติดตั้งกับโครงซีดีรอมเก่าที่เสียแล้ว
    รูปที่ 12 : ทำซ้ำกับส่วนที่เหลืออีกสามช่อง  
       
     
    OLYMPUS DIGITAL CAMERA         OLYMPUS DIGITAL CAMERA
    รูปที่ 13 : ถ้ามีซากซีดีไดร์ฟอยู่ใกล้มือจะดีมาก ถ้าไม่มี ให้ซื้อซีดีไดร์ฟที่เสียแล้วจากศูนย์ไอที รูปที่ 14 : แกะไส้ในของซีดีไดร์ฟออก ให้เหลือแต่โครงเปล่าๆ
    OLYMPUS DIGITAL CAMERA         OLYMPUS DIGITAL CAMERA
    รูปที่ 15 : ตัดด้านหน้าของฝาซีดีไดร์ฟออกครึ่งนิ้วเพื่อให้ใส่แผ่น DP ได้พอดี รูปที่ 16 : นำ DP มาติดตั้งด้านหน้าซีดีไดร์ฟ ยึดด้วยหนังยาง ใส่กาวอิพ็อกซี่ ทิ้งไว้ให้แห้งหนึ่งคืน เมื่อกาวแห้งแล้วให้แถะหนังยางออก
    OLYMPUS DIGITAL CAMERA         OLYMPUS DIGITAL CAMERA
    รูปที่ 17 : นำโครงซีดีไดร์ฟ (ซึ่งมี DP อยู่ด้านหน้า) ติดตั้งลงในเคส แล้วนำสาย USB ทั้งหกเส้นเสียบกับขาต่อพอร์ท USB เมนบอร์ด รูปที่ 18 : เมื่อติดตั้งเสร็จสมบูรณ์แล้วจะเป็นแบบนี้

     

    รายการอุปกรณ์

    • แผงเสียบ USB ด้านหลังแบบสองช่อง 2 ชิ้น
    • ซีดีรอมไดร์ฟที่เสียแล้ว 1 ตัว
    • ฝาปิดช่องไดร์ฟด้านหน้า 1 ชิ้น

     

    สรุป

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

    May 11

    สร้างลูกศรหันตามเมาส์

    ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

    as3title

    บทความนี้เขียนขึ้นเมื่อ วันอังคารที่ 28 สิงหาคม พ.ศ. 2550

    ผู้เขียน : ลาภลอย วานิชอังกูร www.laploy.com

    ลงพิมพ์ในนิตยสาร Windows IT Pro

     

    สร้างลูกศรหันตามเมาส์

    เขียนโปรแกรมภาษา ActionScript 3.0 สร้างออพเจ็กต์ลูกศรที่หันหัวชี้ไปตามการเคลื่อนไหวของเมาส์พอยน์เตอร์ ได้ผลลัพธ์เป็น Flash Movie ไว้ใช้งานในหน้าเว็บ

     

    ในบทความตอนที่แล้วผู้เขียนแนะนำวิธีพัฒนาโปรแกรมด้วยภาษา ActionScript เวอร์ชัน 3.0 (ต่อไปจะเรียกว่า AS3) เบื้องต้น ได้แนะนำไว้ว่าภาษา AS3 ต่างจากภาษา ActionScript เวอร์ชันก่อนๆ มาก ภาษา ActionScript เวอร์ชัน 1 และ 2 เป็นเพียงภาษาสคริปต์ที่ผูกติดกับทามน์ไลน์ (time line) แต่ AS3 เป็นภาษาเพื่อการเขียนโปรแกรมอย่างเต็มรูปแบบ เราสามารถพัฒนาโปรแกรมได้ด้วยวิธีการใกล้เคียงกับการสร้างแอพลิเกชันด้วยภาษาจาวาและ C#

     

    เครื่องมือสำหรับพัฒนาโปรแกรมหรือ IDE ที่แนะนำให้ใช้คือโปรแกรม Adobe Flex Builder 2 (ต่อไปจะเรียกย่อว่า AFB2) มีวิธีใช้งานคล้ายกับ IDE ที่เราคุ้นเคย (เช่นวิสชวลสตูดิโอและเน็ตบีนส์) ทำให้นักพัฒนาโปรแกรมมืออาชีพสามารถก้าวเข้าสู่โลกแห่งการสร้าง rich internet application (โปรแกรมประยุกต์ในอินเตอร์เน็ตที่มีลักษณะการใช้งานใกล้เคียงกับโปรแกรมในเดกส์ท็อป) ได้อย่างรวดเร็ว และที่สำคัญคือภาษา AS3 สนับสนุนหลักการ OOP เหมือนจาวาและ C# (ทุกอย่างเป็นออพเจ็กต์ ใช้คลาสเพื่อสืบคุณสมบัติ ไม่ได้ใช้โปรโตไทป์เหมือนอย่างเวอร์ชันก่อน) ช่วยให้การนำโค้ดกลับมาใช้ใหม่ทำได้อย่างมีประสิทธิภาพ

     

    คลาสกับออพเจ็กต์

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

     


    003

    แม่ค้าขายขนมครกที่เก่ง OOP

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

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

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

     

    คลาสสร้างภาพลูกศร

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

     

    s01

    โค้ดย่อแบบโครงสร้าง (outline) ของคลาส Arrow

     

    โค้ดที่เห็นข้างบนคือ โค้ดย่อแบบโครงสร้าง (outline) ของคลาส Arrow จะเห็นว่าคลาส Arrow มีสมาชิกเพียงสองตัว เป็นเมธอดทั้งคู่ คำสั่งบรรทัดที่ 1 ประกาศแพคเกจ (package เหมือนแพคเกจในจาวาและเนมสเปสใน C# ทำหน้าที่เป็นแหล่งเก็บกลุ่มของคลาส เหมือนคลาสไลบรารี) ชื่อ LoyClass ไฟล์เก็บนิยามต่างๆ ของแพคเกจนี้จะต้องอยู่ในโฟลเดอร์ชื่อเดียวกันนี้

    บรรทัดที่ 3 คำสั่ง import ทำหน้าที่จับรวมนิยามต่างๆ ในแพคเกจที่ระบุรวมเข้ามา ทำให้เราสามารถอ้างถึงนิยามเหล่านั้นได้โดยไม่ต้องระบุชื่อแบบยาว (fully qualified name)

    บรรทัดที่ 5 ทำหน้าที่ประกาศส่วนหัวของคลาส จะเห็นว่าประกอบด้วยคำว่า public ทำหน้าที่กำหนดขอบเขตการเข้าถึงว่าให้เรียกได้จากทุกแห่ง (หากไม่กำหนดจะมีค่าโดยปริยายเป็น internal) คำว่า class เป็นคำสงวน บอกให้รู้ว่านี่คือการนิยามคลาส Arrow เป็นชื่อคลาสที่เราตั้งขึ้น คำว่า extends ทำหน้าที่บอกการ inherit (เหมือนภาษาจาวา และเหมือนเครื่องหมาย : ใน C#) Sprite คือชื่อคลาสที่เราต้องการสืบคุณสมบัติ

    บรรทัดที่ 7 และ 11 คือนิยามเมธอด ที่จะอธิบายในหัวข้อถัดไป

     

    สมาชิกแบบเมธอดของคลาส Arrow

    สมาชิกแบบเมธอดของคลาส Arrow มีเพียงสองตัว ตัวแรกเป็นคอนสทรักเตอร์ (constructor) มีโค้ดดังนี้

     

    s02

    บรรทัดแรกนิยามส่วนหัวของเมธอด โปรดสังเกตว่ามันมีตัวจำกัดการเข้าถึงเป็น public ไม่มีรีเทินไทป์ (return type ค่าส่งกลับ) และมีชื่อเดียวกับคลาส ซึ่งเป็นปรกติของคอนสทรักเตอร์ ผู้เขียนกำหนดให้คอนสทรักเตอร์ของคลาส Arrow มีพารามิเตอร์หนึ่งตัวชื่อ color ทำหน้าที่รับค่าสี ซึ่งเราจะนำไปกำหนดให้เป็นสีของลูกศร พารามิเตอร์นี้มีดาต้าไทป์เป็น unit (เลขจำนวนเต็มไม่มีเครื่องหมายขนาด 32 บิต)

    ไส้ในของคอนสทรักเตอร์นี้มีเพียงบรรทัดเดียว ทำหน้าที่เรียกเมธอด DrawArrow ที่จะอธิบายในหัวข้อถัดไป

     

    เมธอด DrawArrow

    เมธอด DrawArrow ทำหน้าที่ลากเส้นวาดภาพลูกศร มีโค้ดดังนี้

     

    s03

    บรรทัดแรกนิยามส่วนหัวของเมธอด คำว่า private จำกัดการเข้าถึงเมธอดนี้ ให้เข้าถึงได้จากโค้ดภายในคลาสนี้เท่านั้น คำว่า void ทางขวาสุดระบุว่าเมธอดนี้ไม่มีค่าส่งกลับ บรรทัดที่ 3 คำว่า graphics เป็นชื่อคลาสในแพคเกจ flash.Graphics ทำหน้าที่เกี่ยวข้องกับการวาดภาพที่เกิดจากการลากเส้น (vector shape) lineStyle คือชื่อเมธอด (ของ graphics) ทำหน้าที่กำหนดลักษณะของเส้น

    บรรทัดที่ 14 beginFill คือเมธอดทำหน้าที่กำหนดสีที่จะระบายภายในสไปร์ท เราใช้พารามิเตอร์ color เป็นตัวกำหนด บรรทัดที่ 15 moveTo คือเมธอดทำหน้าที่กำหนดตำแหน่งที่จะวาด

    บรรทัดที่ 16 ถึง 22 เรียกเมธอด lineTo เพื่อวาดภาพ อาร์กิวเมนต์ทางซ้ายคือค่าในตำแหน่งที่จะวาดในแนว x อาร์กิวเมนต์ทางขวาคือค่าในแนว y บรรทัดที่ 23 เมธอด endFill ทำหน้าที่ระบายสีที่กำหนดไว้แล้วด้วย beginFill

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

     

    p05  << ภาพลูกศรที่เกิดจากเมธอดนี้

     

    คลาสที่ทำให้ลูกศรหันตามเมาส์

    คลาสซึ่งทำหน้าที่ให้ลูกศรเคลื่อนไหวได้คือคลาสชื่อ ArrowRotate มีโค้ดย่อแบบโครงสร้าง (outline) ดังนี้

     

    s04

    บรรทัดแรกกำหนดแพคเกจเป็น LoyClass เพราะไฟล์นี้อยู่ในโฟลเดอร์ชื่อเดียวกันนี้ เนื่องจากทั้งคลาสนี้และคลาส Arrow เป็นคลาสที่อยู่ในแพคเกจเดียวกัน (แต่อยู่คนละไฟล์) ทำให้คลาสนี้อ้างถึงคลาส Arrow ได้โดยไม่ต้อง import ก่อน

    บรรทัดที่ 3 ถึง 5 จับแพคเกจไลบรารีของแฟลช (ที่เราต้องการใช้) ผนวกเข้ามาด้วยคำสั่ง import บรรทัดที่ 7 คือนิยามส่วนหัวของคลาส ArrowRotate โปรดสังเกตว่าคลาสนี้ก็สืบสันดานจากคลาส Sprite เช่นเดียวกับคลาส Arrow เพราะในคลาสนี้เราจำเป็นต้องอ้างถึงคุณสมบัติบางอย่างของสไปรท์ด้วยเช่นกัน

    บรรทัดที่ 9 ถึง 13 คือสมาชิกแบบดาต้าฟิลด์ ที่จะอธิบายรายละเอียดในหัวข้อถัดไป บรรทัดที่ 15 ถึง 17 คือสมาชิกแบบพร็อพเพอร์ตี ซึ่งจะอธิบายรายละเอียดในหัวข้อถัดจากดาต้าฟิลด์ และสุดท้าย บรรทัด 19 ถึง 33 เป็นสมาชิกแบบเมธอด ซึ่งจะอธิบายรายละเอียดในหัวข้อถัดจากพร็อพเพอร์ตี

     

    สมาชิกแบบดาต้าฟิลด์ของคลาส ArrowRotate

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

    สมาชิกแบบดาต้าฟิลด์ของคลาส ArrowRotate มีห้าตัวดังนี้

    • arrow : มีชนิดข้อมูลเป็น Arrow ทำหน้าเก็บค่าอ้างอิงออพเจ็กต์ลูกศร
    • bkg : มีชนิดข้อมูลเป็น Stage ทำหน้าที่เก็บค่าอ้างอิงฉากหลัง (background) หรือพื้นที่วาดภาพ
    • posX : มีชนิดข้อมูลเป็น int ทำหน้าที่กำหนดค่าตำแหน่งทางแนวนอนของลูกศร
    • posY : มีชนิดข้อมูลเป็น int ทำหน้าที่กำหนดค่าตำแหน่งทางแนวตั้งของลูกศร
    • color : มีชนิดข้อมูลเป็น uint ทำหน้าที่เก็บค่าสีของลูกศร

     

    โปรดสังเกตว่าฟิลด์บางฟิลด์ (เช่น posX) เรากำหนดค่าเริ่มต้นไว้ในบรรทัดเดียวกับการประกาศเลย (เช่น posX:int = 0) ภาษา AC3 ยินยอมให้ทำเช่นนี้ได้ ซึ่งนับว่าสะดวกดี และทำให้โค้ดกะทัดรัดขึ้น

     

    สมาชิกแบบพร็อพเพอร์ตีของคลาส ArrowRotate

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

    • PosX : ใช้เซตตำแหน่งทางแนวนอนของออพเจ็กต์ลูกศร
    • PosY : ใช้เซตตำแหน่งทางแนวตั้งของออพเจ็กต์ลูกศร
    • Color : ใช้เซตสีของออพเจ็กต์ลูกศร

     

    โปรดสังเกตว่าพร็อพเพอร์ตีต้องมีตัวจำกัดการเข้าถึงเป็น public และตามปรกติจะมีไทป์ตรงกันกับฟิลด์ที่มันทำหน้าที่เซตค่า (ยกตัวอย่างเช่นฟิลด์ posX มีไทป์เป็น int พร็อพเพอร์ตี PosX ก็จะมีไทป์เป็น int ด้วย)

     

    สมาชิกแบบเมธอดของคลาส ArrowRotate

    เมธอดคือโค้ดส่วนกำหนดการทำงานหรือส่วนประมวลผลของออพเจ็กต์ คลาส ArrowRotate มีเมธอดสามตัว รายละเอียดของเมธอดแต่ละตัวเป็นดังนี้

     

    s05

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

     

    s07

    โค้ดข้างบนคือเมธอดชื่อ Show ทำหน้าที่สร้าง กำหนดค่าเริ่มต้น และแสดงภาพลูกศร บรรทัดที่ 25 สร้างออพเจ็กต์ลูกศรโดยใช้สีที่ระบุไว้ในพร็อพเพอร์ตี color บรรทัดที่ 26 นำลูกศรไปใส่ในฉากหลัง ซึ่งเป็นพื้นที่วาดภาพที่รับค่าอ้างอิงมาจากโค้ดภายนอก บรรทัดที่ 27 และ 28 กำหนดตำแหน่งของลูกศร บรรทัดที่ 29 และ 30 กำหนดขนาดของลูกศร บรรทัดที่ 31 เรียกเมธอด addEventListener (เป็นเมธอดของคลาส EventDispatcher) ทำหน้าที่กำหนดเมธอดบริการอีเวนต์ (event handler method) ในโค้ดนี้กำหนดให้เมธอด onEnterFrame ทำงานทุกครั้งที่มีการอัพเดตเฟรม

     

    s08

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

    คำสั่งบรรทัดที่ 35 ประกาศตัวแปรชื่อ dx คำว่า mouseX คือพร็อพเพอร์ตีของคลาส DisplayObject ทำหน้าที่ให้ค่ำตำแหน่งทางแกน x ของเมาส์ คำสั่งบรรทัดที่ 36 ประกาศตัวแปรชื่อ dy และพร็อพเพอร์ตี mouseY ให้ค่าตำแหน่งทางแกน y คำสั่งบรรทัดที่ 37 ประกาศตัวแปรชื่อ radians คำว่า Math.atan2 คือคลาสทำหน้าที่คำนวณหามุมของ y และ x บรรทัดที่ 38 นำค่าใน radians มาคำนวณหาค่าการหมุนของลูกศร

     

    โปรแกรมทดสอบการทำงาน

    เมื่อนิยามคลาสต่างๆ ที่จำเป็นครบแล้ว เราต้องเขียนโปรแกรมเพื่อทดสอบคลาสเหล่านั้นด้วย เราจะนิยามคลาสชื่อ test ซึ่งทำหน้าที่นำคลาส ArrowRotate มาสร้างออพเจ็กต์ลูกศรสองตัว ตัวหนึ่งสีเหลืออยู่ที่ตำแหน่ง 100,100 และอีกตัวสีแดง อยู่ที่ตำแหน่ง 200,100

    คลาส test ประหลาดกว่าคลาส Arrow และคลาส ArrowRotate เพราะเราไม่ต้องนำคลาส test ไปสร้างออพเจ็กต์ก่อนจึงจะใช้งานได้ แต่รันทามน์ (run-time) ของแฟลชจะเรียกคลาส test ให้ทำงานโดยอัตโนมัติ ที่เป็นเช่นนั้นเพราะเราวางคลาสนี้ไว้ในระดับบนสุดของเส้นทางคลาส (class path) ทำให้มันมีภาวะเหมือนเมธอด Main ในภาษาจาวาและ C#

     

    s09

    โปรแกรมทดสอบการทำงาน

     

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

     

    icon_start  ทดลองรันโปรแกรมที่ระบุในบทความนี้แบบออนไลน์

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

     

    ซอร์สโค้ด

    โค้ดทั้งหมดในบทความนี้เป็นแฟ้มข้อมูลตัวอักษรธรรมดา (plain text file)สามารถป้อนพิมพ์ด้วยโปรแกรมแก้ไขแฟ้มข้อมูลตัวอักษร (text editor) อะไรก็ได้ (เช่นโปรแกรม Notepad ในวินโดวส์) แล้วจัดเก็บไฟล์ไว้เป็นนามสกุล .as แต่ถ้าใช้โปรแกรม AFB2 ให้สร้างโปรเจ็กต์โดยเลือกเมนู New/ActionScript Project แล้วให้ใส่ไฟล์ test.as ไว้ระดับนอกสุด (ที่รูทโฟลเดอร์ของโปรเจ็กต์)

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

    ขณะป้อนพิมพ์โค้ดหากต้องการตรวจสอบข้อผิดพลาด ท่านไม่จำเป็นต้อง build หรือคอมไพล์โปรแกรมก่อน เพียงกดปุ่ม Save (ปุ่มรูปแผ่นดิสก์เก็ต) โปรแกรม AFB2 จะตรวจสอบและแจ้งความผิดพลาดขณะคอมไพล์ (compile-time error) ในหน้าต่าง Problems ให้โดยอัตโนมัติ เมื่อต้องการคอมไพล์ให้กดปุ่ม Run (ปุ่มกลมเขียวมีสามเหลี่ยมขาวภายใน) AFB2 จะคอมไพล์โปรแกรมและเก็บไฟล์ผลลัพธ์ไว้ในโฟลเดอร์ bin

     

    หากท่านมีข้อสงสัยใดๆ โปรดโพสคำถามไว้ที่กระดานถาม-ตอบซึ่งอยู่ในเว็บไซต์เดียวกัน

     

    เกี่ยวกับผู้เขียน
    ลาภลอย วานิชอังกูร
    ทำงานด้านคอมพิวเตอร์มานานกว่ายี่สิบปี เขียนโปรแกรมคล่องหลายภาษา เคยทำงานด้านคอมพิวเตอร์ที่ประเทศสหรัฐอเมริกา ประเทศเยอรมัน และประเทศสวิส เคยเป็นครูสอนวิชาคอมพิวเตอร์ เคยเป็นบรรณาธิการนิตยสารคอมพิวเตอร์ มีผลงานบทความ และตำราคอมพิวเตอร์จำนวนมาก ปัจจุบันทำหน้าที่เป็นผู้ให้คำปรึกษาด้าน .Net ให้แก่บริษัท Accenture ท่านสามารถติดต่อผู้เขียนได้ที่ กระดานบทความในเว็บไซต์ laploy.com และที่อีเมล laploy@gmail.com

            vtalk802-small

    April 27

    คิวสวยด้วย C#

    ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

    title

    คิวสวยด้วย C#

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

     

    ในบทความตอนที่แล้วผู้เขียนเสนอวิธีสร้าง Stack ด้วยภาษา C# บทความตอนนี้ก็เป็นเรื่องของโครงสร้างข้อมูลอีกเช่นกัน แต่คราวนี้เราจะมาดูวิธีสร้าง “คิว” (Queue) โดยใช้ภาษา C# กันบ้าง สิ่งที่ท่านจะได้เรียนรู้จากบทความตอนนี้คือ

     

    • หลักการทำงานของโครงสร้างข้อมูลแบบคิว
    • วิธีนิยามคลาสคิวด้วยภาษา C#
    • วิธีทำ constructor overloading
    • วิธีใช้งาน generic queue ของ .NET Framework

     

    แบบนี้ที่เรียกว่าคิว

    โครงสร้างข้อมูลแบบคิว (queue data structure) มีหลักการทำงานเหมือนตอนเราไปเข้าแถวชำระเงินค่าของชำในร้านสะดวกซื้อ ผู้ที่เข้าไปในคิวคนแรกจะได้อยู่หน้าสุด ผู้ที่เข้าคิวภายหลังจะอยู่ต่อจากคนแรก (และถัดมาเรื่อย) ตามปรกติผู้ที่เข้าคิวก่อนจะได้ออกจากคิวก่อนเสมอ ตามหลักการที่เรียกว่า First in, first out หรือเรียกย่อว่า FIFO เมื่อคนแรกออกจากคิวไปแล้ว ผู้ที่อยู่ต่อจากคนแรกจะได้เลื่อนตำแหน่งมาเป็นคนแรกบ้าง

    การเขียนโปรแกรมสร้างคิว เราจะใช้อาร์เรย์เป็นตัวเก็บพักข้อมูล และจะแตกต่างจากคิวของมนุษย์ ตรงแทนที่จะเป็นแถวตรง เรากลับทำเป็นวงกลม (Circular buffer) ข้อมูลแรกที่ออกจากคิวไปแล้วจะไม่ถูกลบจากอาร์เรย์ เราจะใช้วิธีเลื่อนตัวชี้หัวคิวและตัวชี้ท้ายคิว แทน การเลื่อนตัวชี้สองตัวนี้จะเป็นสิ่งกำหนดว่าหน่วยใดของอาร์เรย์ (หน่วยของอาร์เรย์คือ Array Element ต่อไปจะเรียกย่อว่า AE) มีตำแหน่งเป็นหัวคิวและท้ายคิว จุดสำคัญที่ต้องเข้าใจคือคิวไม่ใช่อาร์เรย์ คิวเป็นกลไกที่เราสร้างขึ้นโดยอาศัยอาร์เรย์เป็นที่เก็บพักข้อมูล

     

    001

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

     

     

    การเข้าคิว

    การนำข้อมูลใส่ในคิวเรียกว่าการเข้าคิว หรือ enqueue การเข้าคิวต้องนำข้อมูลไปต่อท้ายแถว เราจึงต้องสร้างตัวชี้ตำแหน่งท้ายแถวชื่อ back ตัวเลขที่มันเก็บคือค่าดรรชนีของอาร์เรย์ ยกตัวอย่างเช่นเมื่อโปรแกรมเริ่มทำงาน ค่าของ back จะเท่ากับ 0 เมื่อมีการเข้าคิวเราจะนำข้อมูลไปใส่ที่ AE 0 จากนั้นเราต้องเพิ่มค่า back ขึ้นหนึ่ง เมื่อมีการเข้าคิวอีกครั้งข้อมูลจะถูกเก็บไว้ที่ AE 1 และเพิ่มค่า back อีกเช่นนี้เรื่อยไป จนกระทั้งค่า back เท่ากับ AE สุดท้ายของอาร์เรย์ ค่า back จะกลับเป็นศูนย์ใหม่ วิธีทำให้ค่า back วนเป็นวงกลมเช่นนี้ทำได้โดยใช้วิธีหารเอาเศษ (หรือ modulo ในภาษา C# ใช้สัญลักษณ์ %) สูตรจะเป็นดังนี้

     

    back = (back + 1) % size

     

    ยกตัวอย่างเช่น หาก size เป็นแปด เมื่อโปรแกรมเริ่มทำงานค่าของ back จะถูกทำให้เป็นศูนย์ จากนั้นจะเพิ่มขึ้นหนึ่งทุกครั้งที่มีการเข้าคิว (คือกลายเป็น 1, 2, 3, 4… ไปจนถึง 6) เมื่อ back มีค่าเท่ากับ 7 หากนำมาแทนค่าในสูตรจะได้เป็น

     

    back = (7 + 1) % 8

    back = 8 % 8

    back = 0

     

    จะเห็นว่าค่าที่ได้จะกลายเป็น 0 เหมือนตอนเริ่มโปรแกรม จากนั้นเมื่อมีการเข้าคิวอีก ค่าของ back ก็จะกลายเป็น 1, 2, 3.. ไปเรื่อยๆ วนเวียนไปเช่นนี้ไม่มีวันจบ สิ่งสำคัญคือก่อนเข้าคิวต้องตรวจสอบก่อนว่าคิวเต็มแล้วหรือไม่

     

     

    การออกคิว

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

     

    front = (front + 1) % size

     

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

     

     

    นิยามคลาส Queue

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

     

    002

    โครงสร้างแบบ outline ของคลาสคิว

     

     

    Constant

    ผู้เขียนนิยาม constant (ตัวคงค่า หรือตัวเก็บค่าคงที่) ชื่อ default_size ทำหน้าที่เก็บค่าโดยปริยายของขนาดคิว เพื่อป้องกันการเกิด error ในกรณีที่ผู้นำคลาสนี้ไปสร้าง object ลืมกำหนดขนาดของคิว

     

    private const int default_size = 8;

     

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

     

     

    ฟิลด์สมาชิก

    ผู้เขียนกำหนดให้ฟิลด์ทุกตัวมี access modifier เป็นแบบ private โปรดสังเกตว่าเราสามารถละคำว่า private (ไม่ใส่) ก็ได้ เพราะในภาษา C# หากไม่กำหนด access modifier ตัวแปลภาษาจะถือว่าตัวแปรนั้นเป็น private ไปโดยปริยาย

     

            private int size;
            private int front;
            private int back;
            private int[] values;

     

    ฟิลด์ size ทำหน้าที่เก็บขนาดของคิว ค่าของ size จะไม่เปลี่ยนแปลงตลอดการทำงาน ฟิลด์ front ทำหน้าที่เป็นตัวชี้ตำแหน่งแรกของคิว อย่าลืมว่าตำแหน่งแรกของคิวไม่ใช่ตำแหน่งแรกของอาร์เรย์ (คือ AE ที่ 0) เสมอไป แต่ตำแหน่งแรกของคิวจะเปลี่ยนไปเรื่อยๆ เมื่อมีการเข้า-ออกคิว เพราะคิวเป็นสิ่งที่มีพลวัต ฟิลด์ back ทำหน้าที่เป็นตัวชี้ท้ายแถวของคิว ค่าของมันจะเปลี่ยนแปลงไปเมื่อมีการเข้า-ออกคิวเช่นกัน สุดท้ายคือ values เป็นอาร์เรย์ทำหน้าที่เป็นตัวเก็บข้อมูลในคิว (เป็นตัวพักข้อมูลหรือ data buffer)

     

     

    Default Constructor

    ผู้เขียนนิยาม constructor (ต่อไปจะเรียกว่า mc) ไว้สองแบบ แบบแรกเป็นแบบไม่มีอาร์กิวเมนต์ เรียกว่า default mc มีโค้ดดังนี้

     

    public Queue(): this(default_size)
    {
    }

     

    จะเห็นว่า default mc ไม่มีโค้ดอะไร เพียงกำหนดให้มันไปเรียก mc แบบที่สองอีกทอดหนึ่ง ผลลัพธ์ของโค้ดนี้คือหาก CC สร้าง object โดยไม่ระบุขนาดของคิว โปรแกรมจะนำค่าโดยปริยาย (คือค่าจาก constant default_size) มาใช้เรียก mc ตัวที่สองที่จะอธิบายในหัวข้อต่อไป

    (CC คือ Client Class หมายถึงคลาสที่นำคลาสนี้ไปสร้างออพเจ็กต์ใช้งาน)

     

     

    Constructor overloading

    mc ตัวที่สองเป็นแบบมีอาร์กิวเมนต์ สาเหตุที่ผู้เขียนทำ overload ก็เพื่อป้องกันไม่ให้เกิด error ในกรณีที่ CC สร้าง object โดยไม่กำหนดขนาดของคิว

     

    public void  Queue(int size)
    {
        this.size = size;
        values = new int[size];
        front = 0;
        back = 0;
    }

     

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

    นี่คือวิธีจัด “ขอบเขตของตัวแปร” (variable scope) ในภาษา C# จำง่ายๆ คือโค้ดทุกแห่งในคลาสามารถเข้าถึงฟิลด์ได้ทั้งหมด แต่ตัวแปรที่ถูกประกาศไว้ใน block ใด (block หมายถึงระหว่างเครื่องหมายปีกกาสองอัน) จะมีขอบเขตอยู่ภายใน block นั้นเท่านั้น

    ด้วยเหตุนี้โค้ดบรรทัดแรก this.size = size จึงทำหน้าที่นำค่าที่ CC ส่งมา (ตอนสร้าง object) ไปกำหนดขนาดของคิว คำสั่งบรรทัดต่อมา values = new int[size] กำหนดขนาดของอาร์เรย์ (ซึ่งจะใช้เพื่อเป็นที่เก็บข้อมูล) ให้มีขนาดเท่ากันกับคิวด้วย และคำสั่งสองบรรทัดสุดท้าย กำหนดค่าเริ่มต้นให้แก่ฟิลด์ front และ back ให้เป็นศูนย์ เพราะเมื่อเริ่มต้นคิวจะว่างเปล่า หัวคิวและท้ายคิวจึงมีตำแหน่งเดียวกัน

     

     

    การตรวจสอบว่าคิวเต็มหรือไม่

    ก่อนเข้าคิวเราต้องดูว่าคิวเต็มหรือยัง ดังนั้นเราจึงจำเป็นต้องนิยามเมธอดชื่อ IsFull ซึ่งมีโค้ดดังนี้

     

            public Boolean IsFull()
            {
                if ((back + 1) % size == front)
                    return true;
                else
                    return false;
            }

     

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

     

    003

    แสดงสภาพของอาร์เรย์และตัวชี้หัว-ท้ายคิวเมื่อคิวเต็ม

     

    ในภาพนี้ front มีค่าเท่ากับ 5 นั้นคือหัวคิวอยู่ที่ AE5 ของอาร์เรย์ ข้อมูลแรกของคิวจึงอยู่ที่ AE5 ข้อมูลถัดไปของคิวจึงอยู่ใน AE6 และไล่ไปเช่นนี้ ขณะนี้คิวเต็มแล้ว back จึงอยู่ที่ AE4 เมื่อในค่าในตัวอย่างนี้มาแทนค่าตัวแปรในเงื่อนไขของคำสั่ง if จะได้เป็น

     

    (back+1) % size == front

    (4+1) % 8 == 5

    5 % 8 == 5

    5 == 5

     

    ผลลัพธ์คือเงื่อนไขเป็นจริง แสดงว่าคิวเต็มแล้ว โปรแกรมจะส่ง return value เป็นบูลลีน true (จริง) ในกรณีที่คิวยังไม่เต็ม เงื่อนไขจะเป็นเท็จ โปรแกรมจะส่ง return value เป็น fault (เท็จ)

     

     

    การตรวจสอบว่าคิวว่างเปล่าหรือไม่

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

     

            public Boolean IsEmpty()
            {
                if (back == front)
                    return true;
                else
                    return false;
            }

     

     

     

    เข้าคิวด้วยเมธอด EnQueue

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

     

            public void EnQueue(int x)
            {
                if (!IsFull())
                {
                    back = (back + 1) % size;
                    values[back] = x;
                }
            }

     

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

     

     

    ออกคิวด้วยเมธอด DeQueue

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

     

            public int DeQueue()
            {
                if (!IsEmpty())
                {
                    front = (front + 1) % size;
                    return values[front];
                }
                return 0;
            }

     

    จากโค้ดข้างบนให้สังเกตว่าเราจำเป็นต้องตรวจสอบก่อนว่าคิวว่างหรือไม่ หากคิวว่าง คำสั่ง return บรรทัดล่างสุด (ก่อนวงเล็บปีกกาสุดท้าย) จะทำงานโดยส่ง return value เป็นศูนย์ หากคิวไม่ว่าง เราจะเพิ่มค่า front แล้วทำ modulo จากนั้นจะนำค่าใน AE ที่ชี้โดย front ส่งกลับไปเป็น return value

     

     

    โปรแกรมทดสอบคิว

    เมื่อนิยามคลาส Queue เสร็จแล้วเราต้องทดสอบการทำงานโดยเขียนโปรแกรมขึ้นดังนี้

     

           static void Main(string[] args)
            {
                Queue myQueue = new Queue(5);
                myQueue.EnQueue(10);
                myQueue.EnQueue(20);
                myQueue.EnQueue(30);
                for (int i = 0; i < 3; i++)
                    Console.WriteLine(myQueue.DeQueue());
                Console.ReadLine();
            }

     

    ผลลัพธ์การทำงานของโปรแกรมนี้คือ

    10

    20

    30

     

    โค้ดโดยสมบูรณ์ของคลาสคิว

    เมื่อนำโค้ดทั้งหมดมารวมกันจะได้เป็นคลาสคิวที่สมบูรณ์ดังนี้

     

    using System;
    
    namespace NormalQueue
    {
        class Queue
        {
            private const int default_size = 8;
    
            private int size;
            private int front;
            private int back;
            private int[] values;
    
            public Queue(): this(default_size)
            {
            }
            public Queue(int size)
            {
                this.size = size;
                values = new int[size];
                front = 0;
                back = 0;
            }
    
            public Boolean IsFull()
            {
                if((back+1) % size == front)
                    return true;
                else
                    return false;
            }
            public Boolean IsEmpty()
            {
                if (back == front)
                    return true;
                else
                    return false;
            }
            public void EnQueue(int x)
            {
                if (!IsFull())
                {
                    back = (back+1) % size;
                    values[back] = x;
                }
            }
            public int DeQueue()
            {
                if (!IsEmpty())
                {
                    front = (front+1) % size;
                    return values[front];
                }
                return 0;
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                Queue myQueue = new Queue(5);
                myQueue.EnQueue(10);
                myQueue.EnQueue(20);
                myQueue.EnQueue(30);
                for (int i = 0; i < 3; i++)
                    Console.WriteLine(myQueue.DeQueue());
                Console.ReadLine();
            }
        }
    }
    

     

     

    คิวแบบ Generic

    คลาส Queue ที่ผู้เขียนนิยามไว้ในหัวข้อที่ผ่านมา ใช้เพื่อศึกษาการทำงานของคิวเท่านั้น ในการใช้งานจริง .NET Framework มีคลาสไลบรารีที่จัดการคิวไว้ให้แล้ว (อยู่ใน namespace System.Collections.Generic) และดีกว่าคลาสที่เรานิยามในตัวอย่าง เพราะเป็นคิวแบบ Generic คือสามารถรับข้อมูล type อะไรก็ได้ โค้ดตัวอย่างการใช้งานเป็นดังนี้

     

            static void Main(string[] args)
            {
                Queue<string> myQueue = new Queue<string>();
                myQueue.Enqueue("abc");
                myQueue.Enqueue("hello");
                myQueue.Enqueue("thailand");
                myQueue.Enqueue("bangkok");
                while (myQueue.Count > 0)
                    Console.WriteLine(myQueue.Dequeue());
                Console.ReadLine();
            }

     

    ผลลัพธ์การทำงานของโปรแกรมนี้คือ

    abc

    hello

    thailand

    bangkok

     

     

    สรุปเรื่องการสร้างคิวในภาษา C#

    การสร้างและใช้งานคิวในภาษา C# ทำได้ง่ายมากเพราะในคลาสไลบรารีของ .NET Framework มีคลาส Queue มาให้แล้ว ในบทความตอนนี้ผู้เขียนแสดงวิธีนิยามคลาส Queue ขึ้นเองเพื่อศึกษาการทำงานของคิวเท่านั้น

     

    ผู้เขียนจัดทำโค้ดตัวอย่างประกอบบทความนี้ไว้เป็นไฟล์ชื่อ QInCSharp.zip (ภายในเป็น solution ที่สร้างจาก MS Visual Studio .NET 2005) ท่านสามารถดาวน์โหลดได้จากเว็บไซต์ของผู้เขียนที่ www.laploy.com (เลือกหัวข้อ download) หากท่านมีข้อสงสัยใดๆ โปรดโพสคำถามไว้ในเว็บบอร์ดที่เว็บไซต์ดังกล่าว

    April 20

    สกิมเมอร์ : เทคโนโลยีโฉดเพื่อทรชน

    ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

    สกิมเมอร์ : เทคโนโลยีโฉดเพื่อทรชน

    ว้ายร้ายยุคไฮเทคปล้นเงินของคุณได้โดยไม่ต้องชักมีดหรือปืน อาวุธเพียงอย่างเดียวของมันคือสกิมเมอร์

      • บทความโดย : ลาภลอย วานิชอังกูร
      • เขียนเมื่อ : 12 มิ.ย. 50
      • ลงพิมพ์ในนิตยสาร : WinMag

     

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

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

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

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

     

    อะไรหรือคือสกิมเมอร์

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

    เมื่อนำบัตรเครดิต (หรือบัตรเดบิตเช่นบัตร ATM) มารูด สกิมเมอร์จะอ่านข้อมูลจากแถบแม่เหล็กและนำไปเก็บไว้ในหน่วยความจำ สกิมเมอร์ที่มีหน่วยความจำน้อยจะเก็บข้อมูลบัตรเครดิตได้ 50 ใบ ส่วนสกิมเมอร์ที่มีหน่วยความจำมากอาจเก็บข้อมูลได้หลายหมื่นใบ

     

    สกิมเมอร์โผล่ที่พัทยา

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

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

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

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

     

    015

    ศูนย์สืบสวนปราบปรามคนร้ายข้ามชาติและอาชญากรรมบัตรเครดิตประสานงานกับตำรวจท่องเที่ยวจับกุม นายสะไมย ทาชชิฟินี (SMAINE TACHEFINI) สัญชาติฝรั่งเศส อายุ 20 ปี 2.นายกูอาสเมีย อะเล็กชานเดอร์(GUASMIA ALEXNDRE) สัญชาติฝรั่งเศสอายุ 21 ปี ข้อหาร่วมกันมีเครื่องมือหรือวัตถุสำหรับให้ได้ข้อมูลในการปลอมหรือแปลง เพื่อใช้หรือให้ได้ข้อมูลในการปลอมหรือแปลง ร่วมกันมีไว้เพื่อใช้ซึ่งสิ่งใดๆ อันได้มาโดยรู้ว่าเป็นของที่ปลอมหรือแปลงขึ้น

     

    016

    ทางซ้ายคือโฉมหน้าสองคนร้ายเศษฝรั่ง ทางขวาคือสกิมเมอร์ของกลางที่ตำรวจยึดไว้ได้

     

    สกิมเมอร์แอ่วเหนือ

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

    เมื่อค้นรถยนต์และบ้านของ Mr. Svein เจ้าหน้าที่ตำรวจก็พบสกิมเมอร์และบัตรเครดิตปลอมจำนวนมาก จึงแจ้งข้อกล่าวหาว่าร่วมกันทำเครื่องมือ หรือวัสดุสำหรับปลอมหรือแปลง หรือสำหรับให้ได้ข้อมูลในการแลอมหรือแปลงสิ่งใด ซึ่งระบุเอาไว้ในมาตรา 269/1 ป.อาญา หรือมีเครื่องมือหรือวัตถุเช่นว่านั้นเพื่อใช้หรือให้ได้ข้อมูลในการปลอมหรือแปลง และมี ร่วมกันมีไว้เพื่อใช้ในสิ่งใดๆ ซึ่งระบุเอาไว้ในมาตรา 269/1 ป.อาญา

     

    014

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

     

    ของขวัญแด่เดนสังคม

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

    • การลักบัตรเครดิต : หากเป็นการขโมยบัตรก็เข้าข่ายการลักทรัพย์ซึ่งเป็นการกระทำความผิดตามประมวลกฎหมายอาญามาตรา ๓๓๔ จะต้องระวางโทษจำคุกไม่เกิน ๓ ปี และปรับไม่เกินหกพันบาท แต่ในกรณีของการดูดข้อมูลบัตรเครดิตด้วยสกิมเมอร์ศาลฎีกายังไม่ได้วินิจฉัยเป็นบรรทัดฐานว่าการกระทำดังกล่าวเป็นการลักทรัพย์หรือไม่
    • การยักยอกบัตรเครดิต : มีความผิดตามประมวลกฎหมายอาญามาตรา ๓๕๒ การยักยอกบัตรเครดิตเป็นเรื่องที่สร้างปัญหากับธนาคารและเจ้าของบัตรเครดิตเป็นอย่างมาก เนื่องจากเจ้าของบัตรเครดิตไม่อาจทราบได้ว่าบัตรเครดิตถูกนำไปใช้ จะรู้ก็ต่อเมื่อได้รับใบแจ้งหนี้จากธนาคารให้ไปชำระเงินที่เกิดจากการใช้บัตรเครดิต
    • ปลอมบัตร : เทียบได้กับการกระทำความผิดในฐานปลอมเอกสารสิทธิ ตามประมวลกฎหมายอาญามาตรา ๒๖๕ วิธีนี้คนร้ายจะสร้างบัตรปลอมที่มีตัวอักษรนูนและลวดลายเหมือนบัตรจริง จากนั้นนำข้อมูลของบัตรเครดิตจากสกิมเมอร์มาบันทึกลงในแถบแม่เหล็ก ข้อมูลที่บันทึกประกอบด้วยหมายเลขบัญชีของผู้ถือบัตร หมายเลขบัตร วันหมดอายุบัตร และ ชุดตัวเลขที่ธนาคารเข้ารหัสไว้ ข้อมูลดังกล่าวเป็นข้อมูลที่ใช้ยืนยันได้ว่าบัตรนั้นเป็นบัตรเครดิตที่ธนาคารออกให้จริงๆ

     

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

    • การฉ้อโกง : มีความผิดฐานฉ้อโกงตามประมวลกฎหมายอาญา มาตรา ๓๔๑ เพราะคนร้ายที่นำบัตรเครดิตไปใช้ (ด้วยวิธีการขโมยหรือสร้างบัตรเครดิตปลอมขึ้นก็ตาม) จะต้องแสดงตนเป็นเจ้าของบัตร จึงเข้าข่ายความผิดฐานฉ้อโกง
    • การปลอมใบบันทึก: การปลอมใบบันทึกการขายและนำไปใช้เป็นความผิดฐานปลอมและใช้เอกสารสิทธิปลอมตามมาตรา ๒๖๕ อาจเกิดจากการกระทำความผิดของร้านค้าที่ทุจริต หรือพนักงานที่ทุจริตโดยเจ้าของร้านค้าไม่มีส่วนรู้เห็นด้วย คนร้ายจะนำบัตรเครดิตของลูกค้ามารูดชำระค่าสินค้าและบริการสองครั้ง หลังจากนั้นจะปลอมลายมือในบันทึกการขายอันที่สอง

     

    ปฏิบัติการหีนชาติ

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

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

     

    017

    เจ็ดประการในบัตรพลาสติก

    ในการปลอมบัตรเครดิตแบบเหมือนจริงคนร้ายจะคัดลอกข้อมูลสำคัญเจ็ดอย่างดังนี้

    1. เลขบัญชีขนาดสิบหกหลักพิมพ์ตัวนูน
    2. วันเริ่มและหมดอายุของบัตร
    3. ตัวอักษรพิเศษพิมพ์ตัวนูน
    4. ชื่อผู้ถือบัตรพิมพ์ตัวนูน
    5. รหัสพิเศษสามหลัก
    6. ลายเซ็นผู้ถือบัตร
    7. แถบแม่เหล็ก

    018

    รหัสพิเศษสามหลักในบัตรเครดิตแบบต่างๆ จะอยู่ในตำแหน่งที่แตกต่างกัน

     

    ATM ก็โดนกับเขาด้วย

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

    1. ใช้สกิมเมอร์พกพา : คนร้ายปลอมตัวเป็นนักท่องเที่ยวที่มีปัญหาในการใช้งานตู้ ATM เมื่อพลเมืองดีอาสาให้ความช่วยเหลือคนร้ายทำอุบายขอดูบัตรเพื่อลอบดูดข้อมูลจากบัตรด้วยสกิมเมอร์แบบพกพาขนาดจิ๋วที่ซ่อนไว้ตามส่วนต่างๆ ของร่างกาย ร่วมกับการแอบดูการกดรหัสของเจ้าของบัตรโดยเข้าแถวต่อด้านหลัง หรือใช้กล้องส่องทางไกล หรือซ่อนกล้องวิดีโอขนาดจิ๋ว
    2. ติดตั้งสกิมเมอร์กับตู้ ATM : วิธีนี้คนร้าจะนำสกิมเมอร์ใส่ฝาครอบติดไว้กับตู้ ATM ร่วมกับการแอบดูการกด รหัสของเจ้าของบัตรโดยเข้าแถวต่อด้านหลัง ใช้กล้องส่องทางไกล หรือใช้กล้องวิดีโอขนาดจิ๋ว

     

    วิธีสร้างสกิมเมอร์

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

    001

    เครื่องอ่านแถบแม่เหล็กก่อนและหลังการถอดปลอกโลหะด้านนอกออก

     

    เครื่องอ่านแถบแม่เหล็กเมื่อถอดปลอกออกแล้วมองจากด้านบน จะเห็นหัวอ่านแถบแม่เหล็กเหมือนหัวอ่านเทปบันทึกเสียง(ด้านล่าง) มีวงจรขยายและแปลงสัญญาณอนาล็อกเป็นดิจิตอล (ด้านบน)

    007

    ภายในเครื่องอ่านแถบแม่เหล็กจะมีวงจรอิเล็กทรอนิกส์และหัวอ่านแถบแม่เหล็ก >>

    009

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

     

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

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

     

    เครื่องอ่านแถบแม่เหล็กส่วนมากจะมีส่วนเชื่อมต่อเพื่อใช้เสียบกับพอร์ทอนุกรม (RS-232) มีบ้างเหมือนกันที่ใช้เสียบช่องเดียวกับแป้นพิมพ์คอมพิวเตอร์ มันมักเลือกแบบพอร์ทอนุกรมเพราะนำไปดัดแปลงได้ง่ายกว่า

     

    002

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

     

    << โลจิกอนาไลเซอร์ถูกนำมาใช้เพื่อวิเคราะห์ข้อมูลที่ส่งออกมาจากเครื่องอ่านแถบแม่เหล็ก

     

    003 

    ภาพแผนภูมิตามช่วงเวลา (timing diagram) ที่แสดงบนหน้าจอของโลจิกอนาไลเซอร์

     

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

    << วงจรแปลงสัญญาณจากเครื่องอ่านบัตรแม่เหล็กเพื่อจัดเก็บไว้ในหน่วยความจำคอมพิวเตอร์

     

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


    การนำเครื่องเล่น MP3 มาดัดแปลงเป็นอุปกรณ์เก็บข้อมูลทำให้เก็บข้อมูลบัตรเครดิตได้มากถึง 50,000 ใบ
    >>
         005

     

    OLYMPUS DIGITAL CAMERA         << เมื่อมิจฉาชีพต้องการอ่านข้อมูลบัตรเครดิตที่เก็บอยู่ในสกิมเมอร์ มันจะต้องนำสกิมเมอร์ไปต่อเชื่อมกับคอมพิวเตอร์ก่อน ซึ่งไม่ค่อยสะดวก คนร้ายบางคนจึงอาจสร้างสกิมเมอร์ที่มีจอ LCD ในตัวทำให้อ่านข้อมูลได้จากสกิมเมอร์ได้โดยตรง

     

    แม้จะเป็นสกิมเมอร์ที่มีจอ LCD ในตัวก็ยังมีขนาดเล็กพอที่จะซ่อนไว้ในอุ้งมือได้ หากถอดจอ LCD ออกคงไว้แต่หัวอ่านและวงจรเก็บข้อมูล และเปลี่ยนไปใช้แบตเตอรี่ขนาดจิ๋ว คนร้ายอาจลดขนาดสกิมเมอร์ลงเหลือเท่าซองบุหรี่หรือกล่องใส่นามบัตร >>      OLYMPUS DIGITAL CAMERA

     

    วิธีติดตั้งสกิมเมอร์กับตู้ ATM

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

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

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

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

     

    ยี่สิบสี่คาถาคุ้มกาย

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

    1. ดูให้แน่ใจว่าบัตรเครดิตอยู่ในสายตาตลอดเวลา อย่าให้พนักงานนำไปรูดในที่ลับตา เพราะพนักงานอาจร่วมมือกับคนร้ายแก๊งค์ดูดบัตร

    2. อย่าให้คนแปลกหน้าจับถือบัตร เพราะอาจถูกลอบดูดบัตร

    3. อย่าตอบอีเมลที่ต้องการข้อมูลบัตร เพราะอาจเป็นอีเมลที่มาจากคนร้าย

    4. อย่ากรอกข้อมูลบัตรเครดิตในเว็บไซต์ที่ไม่ปลอดภัย เพราะอาจเป็นเว็บไซต์ปลอมที่ดำเนินงานโดยคนร้าย

    5. ให้เซ็นชื่อไว้ในบัตร เพราะบัตรที่มีลายมือชื่อจะปลอมยากกว่า

    6. ถ้าทำบัตรแบบใส่รูปได้ให้เลือกแบบใส่รูป เพราะหากบัตรถูกขโมยคนร้ายจะนำไปใช้ได้ยากกว่า

    7. ตรวจสอบตู้ ATM ก่อนสอดบัตร หากพบสิ่งผิดปรกติให้แจ้งเจ้าหน้าที่ธนาคาร

    8. ทำลายใบสมัครบัตรเครดิตที่กรอกแล้ว เพราะคนร้ายอาจนำข้อมูลไปสมัครบัตรเครดิตได้

    9. อย่าเขียนรหัสไว้บนบัตร เพราะหากทำบัตรหายหรือถูกขโมยคนร้ายจะสามารถใช้บัตรได้ทันที

    10. อย่าวางใบรับ (credit card receipt) ไว้ในที่ล่อแหลม เพราะคนร้ายอาจลอบดูหมายเลขบัตรได้

    11. หาอะไรบังเมื่อป้อนรหัสที่ตู้ ATM เพราะอาจมีกล้องซ่อนไว้

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

    13. พกพาเฉพาะบัตรเครดิตที่จำเป็นต้องใช้เท่านั้น จะช่วยจำกัดวงความเสียหายเมื่อทำกระเป๋าสตางค์หาย

    14. เปิดซองและตรวจสอบใบแจ้งหนี้บัตรเครดิตทันทีที่ได้รับ เพราะจะได้รู้แต่เนิ่นๆ ว่ามีรายการผิดปรกติหรือไม่

    15. แจ้งธนาคารทันทีหากพบรายการใช้บัตรที่ผิดปรกติ เพราะอาจเกิดจากการใช้บัตรปลอม

    16. ทำลายใบรับที่เขียนผิดทุกครั้ง เพราะคนร้ายอาจนำไปใช้ทำรายการปลอมได้

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

    18. อย่าเซ็นชื่อลงในใบรับที่ยังไม่ได้กรอกรายการ เพราะคนร้ายอาจนำไปใช้ทำรายการปลอมได้

    19. ทำลายสำเนาใบรับ (ถ้ามี) เพราะคนร้ายอาจนำไปใช้ทำรายการปลอมได้

    20. อย่าเขียนหมายเลขบัตรเครดิตไว้ในที่ๆ ผู้อื่นพบเห็นได้ เพราะคนร้ายอาจนำไปใช้ประโยชน์ได้

    21. หากไม่จำเป็นอย่าเก็บบัตรเครดิตไว้ในกระเป๋าสตางค์ เพราะช่วยให้ปลอดภัยหากถูกขโมยหรือทำกระเป๋าสตางค์หาย

    22. อย่าให้ผู้ใดยืมบัตรเครดิต เพราะอาจตกถึงมือคนร้ายได้

    23. เมื่อย้ายที่อยู่ต้องแจ้งย้ายการส่งใบแจ้งหนี้ด้วย เพื่อป้องกันคนร้ายใช้ข้อมูลใบแจ้งหนี้ที่ส่งไปยังที่อยู่เดิมที่ไม่มีผู้อยู่อาศัย

    24. อย่าทิ้งเอกสารลงถังขยะ ให้ทำลายโดยการใช้เครื่องซอยก่อน เพราะคนร้ายรวบรวมเอกสารจากถังขยะเพื่อสร้างบัตรปลอมได้

     

    สูงสุดคืนสู่สามัญ

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

    เพื่อแก้ปัญหานี้บริษัทบัตรเครดิตได้ประดิษฐ์บัตรรุ่นใหม่ที่มีชิปฝังในตัว ชิปเช่นนี้มีวงจรรับส่งข้อมูลแบบไร้สายซึ่งสามารถอ่านข้อมูลได้เมื่อนำไปใกล้เครื่องอ่าน (proximity) แม้การลอบอ่านข้อมูลจากบัตรที่มีชิปอาจทำได้ง่ายกว่า (คนร้ายอาจดูดข้อมูลจากบัตรได้ทั้งที่เรายังไม่ได้นำบัตรออกจากกระเป๋าสตางค์) แต่การถอดรหัสข้อมูลเพื่อนำไปสร้างสำเนาอาจทำได้ยาก เพราะชิปเหล่านี้ถูกเข้ารหัสไว้อย่างอย่างซับซ้อนและใช้ระบบรักษาความปลอดภัยแบบกุญแจส่วนตัวและกุญแจสาธารณะ

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

     

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

    vtalk802-small

    April 14

    แจกโค้ด C# วันสงกรานต์ 2008

    ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

    csharptitle

    แจกโค้ด C# วันสงกรานต์ 2551

    วันนี้ฤกษ์งามยามดี วันสงกรานต์ ปี พ.ศ. 2551 อะไรจะดีสำหรับผมไปกว่าการเขียนรับใช้ท่านผู้อ่าน โดยแจกโค้ดแบบ Tricks & Tips ที่น่าสนใจและมีประโยชน์

     

    เชื่อมสองเทเบิ้ลภายในหนึ่งดาต้าเซต

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

    System.Data.DataColumn oParentColumn;
    System.Data.DataColumn oChildColumn;
    oParentColumn = oDS.Tables["Customers"].Columns["CustomerID"];
    oChildColumn = oDS.Tables["Orders"].Columns["CustomerID"];
    
    System.Data.DataRelation oRelation = 
    [ic:ccc]new System.Data.DataRelation("CustomerOrders", 
    [ic:ccc]oParentColumn, oChildColumn);
    oDS.Relations.Add(oRelation);

     

    สร้างวิวภายในดาต้าเทเบิ้ล

    ใน ADO.NET มีดาต้าวิว (DataView) ทำหน้าที่กรองและเรียงข้อมูล วิธีสร้างวิวภายในดาต้าเทเบิ้ลในภาษา C# ทำอย่างนี้

    System.Data.DataTable oTable = oDS.Tables["Customers"]; 
    System.Data.DataView oView = new System.Data.DataView(oTable);
    
    oView.RowFilter = "City='Berlin'";
     

    โหลดไฟล์ XML เข้าสู่ดาต้าเซต

    สิ่งที่ทำให้ดาต้าเซตทำงานได้คือ XML การโหลดไฟล์ XML เข้าสู่ดาต้าเซตจึงเป็นเรื่องสำคัญ โค้ดต่อไปนี้โหลดไฟล์ชื่อ customers1.xml เข้าสู่ดาต้าเซต

    System.Data.DataSet oDS = new System.Data.DataSet();
    oDS.ReadXml("http://localhost/sql2000/template/customers1.xml");

     

    การสร้างเท็กซ์ไฟล์

    เมื่อเขียนโปรแกรมบ่อยครั้งที่เราต้องการสร้างแฟ้มที่เก็บตัวอักษรล้วนๆ หรือ text file เพื่อบันทึกข้อมูลบางอย่างที่มีขนาดเล็กและทำงานได้รวดเร็ว โค้ดต่อไปนี้สร้างไฟล์ชื่อ MyTextFile.txt ไว้ที่รูทไดเรคทอรีของฮาร์ดดิสก์ (โฟลเดอร์ c:\) หัวใจของการทำงานคือการเรียกใช้ไทป์ StreamWriter ของ .Net

    static void WriteToFile()
    {
        StreamWriter SW;
        SW = File.CreateText("c:\\MyTextFile.txt");
        SW.WriteLine("God is greatest of them all");
        SW.WriteLine("This is second line");
        SW.Close();
        Console.WriteLine("File Created SucacessFully");
    }
    
     

    การอ่านเท็กซ์ไฟล์

    เมื่อเขียนโปรแกรมบ่อยครั้งที่เราต้องการอ่านแฟ้มที่เก็บตัวอักษรล้วนๆ หรือ text file เพื่ออ่านข้อมูลบางอย่างที่มีขนาดเล็กและทำงานได้รวดเร็ว โค้ดต่อไปนี้อ่านไฟล์ชื่อ MyTextFile.txt ซึ่งอยู่ที่รูทไดเรคทอรีของฮาร์ดดิสก์ (โฟลเดอร์ c:\) หัวใจของการทำงานคือการเรียกใช้ไทป์ StreamReader ของ .Net

    public class FileClass
    {
        public static void Main()
        {
            ReadFromFile("c:\\MyTextFile.txt");
        }
        static void ReadFromFile(string filename)
        {
            StreamReader SR;
            string S;
            SR = File.OpenText(filename);
            S = SR.ReadLine();
            while (S != null)
            {
                Console.WriteLine(S);
                S = SR.ReadLine();
            }
            SR.Close();
        }
    }
     
    การแทรกข้อมูลเข้าสู่เท็กซ์ไฟล์

    เราสามารถเขียนข้อมูลเพิ่มเข้าสู่เท็กซ์ไฟล์ (append) ได้โดยไม่ต้องทับข้อมูลเก่า คือของเก่าก็ยังอยู่ ของใหม่ก็ถูกเพิ่มต่อท้ายเข้าไป โค้ดเป็นดังนี้

    public class FileClass
    {
        public static void Main()
        {
            AppendToFile();
        }
        static void AppendToFile()
        {
            StreamWriter SW;
            SW = File.AppendText("C:\\MyTextFile.txt");
            SW.WriteLine("This Line Is Appended");
            SW.Close();
            Console.WriteLine("Text Appended Successfully");
        }
    }

     

    เซฟรูปภาพสามฟอร์แมต

    โค้ดต่อไปนี้แสดงวิธีเซฟรูปภาพ โดยแสดงกรอบข้อความให้ผู้ใช้ป้อนพิมพ์ชื่อไฟล์และสามารถเลือก ฟอร์แมต ของไฟล์ได้สามแบบคือ bmp, gif และ jpg โปรดอ่านคำอธิบายที่แทรกไว้ในโค้ดครับ

    private void button2_Click(object sender, System.EventArgs e)
    {
    
       // แสดง SaveFileDialog เพื่อให้ผู้ใช้เซฟรูปภาพ
       // โดยกำหนดการทำงานไว้ที่ปุ่ม Button2
        SaveFileDialog saveFileDialog1 = new SaveFileDialog();
        saveFileDialog1.Filter = "JPeg Image|*.jpg|Bitmap Image|*.bmp|Gif Image|*.gif";
        saveFileDialog1.Title = "Save an Image File";
        saveFileDialog1.ShowDialog();
    
        // ตรวจสอบว่าชื่อไฟล์เป็นว่างเปล่าหรือไม่
        if (saveFileDialog1.FileName != "")
        {
            // เซฟภาพโดยใช้ FileStream ที่สร้างจากเมธอด OpenFile
            System.IO.FileStream fs = (System.IO.FileStream)saveFileDialog1.OpenFile();
          // เซฟไฟล์ให้ถูกฟอร์เมต โดยดูจากชนิดของไฟล์ที่ถูกเลือกใน dialog box
          // ค่าของ FilterIndex เริ่มจากหนึ่ง ไม่ใช่ศูนย์
            switch (saveFileDialog1.FilterIndex)
            {
                case 1:
                    this.button2.Image.Save(fs,
                       System.Drawing.Imaging.ImageFormat.Jpeg);
                    break;
    
                case 2:
                    this.button2.Image.Save(fs,
                       System.Drawing.Imaging.ImageFormat.Bmp);
                    break;
    
                case 3:
                    this.button2.Image.Save(fs,
                       System.Drawing.Imaging.ImageFormat.Gif);
                    break;
            }
    
            fs.Close();
        }
    }

     

    จับข้อมูลใส่ DataGridView

    โค้ดต่อไปนี้อ่านแถวจากตารางในฐานข้อมูลโดยอาศัย SqlDataAdapter ดึงข้อมูลมาไว้ใน DataSet แล้วนำมาผูกไว้กับ DataGridView โค้ดนี้เป็นวินฟอร์ม ส่วนที่ใส่ข้อมูลเขียนเป็นเมธอดแยกไว้ชื่อ LoadData()

    public partial class Form1 : Form
    {
        private SqlDataAdapter da;
        private SqlConnection conn;
        BindingSource bsource = new BindingSource();
        DataSet ds = null;
        string sql;
    
        public Form1()
        {
            InitializeComponent();
        }
    
        private void btnLoad_Click(object sender, EventArgs e)
        {
            LoadData();
        }
    
        private void LoadData()
        {
            string connectionString = "Data Source=localhost;Initial Catalog=Northwind;" + "Integrated Security=SSPI;";
            conn = new SqlConnection(connectionString);
            sql = "SELECT OrderID, CustomerID, EmployeeID, OrderDate, Freight," + "ShipName, ShipCountry FROM Orders";
    
            da = new SqlDataAdapter(sql, conn);
            conn.Open();
            ds = new DataSet();
            SqlCommandBuilder commandBuilder = new SqlCommandBuilder(da);
            da.Fill(ds, "Orders");
            bsource.DataSource = ds.Tables["Orders"];
            dgv.DataSource = bsource;
        }
    } 

     

    อัพเดตฐานข้อมูลจาก DataGridView

    คงดีแน่ๆ หากผู้ใช้แก้ไขข้อมูลบน DataGridView แล้วกดปุ่มๆ เดียวก็สามารถอัพเดตข้อมูลในฐานข้อมูลได้ โค้ดเป็นดังนี้

    private void btnUpdate_Click(object sender, EventArgs e)
    {
        DataTable dt = ds.Tables["Orders"];
        this.dgv.BindingContext[dt].EndCurrentEdit();
        this.da.Update(dt);
    }

     

    ยืนยันการลบ

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

    private void dgv_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)

    private void dgv_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
    {
        if (!e.Row.IsNewRow)
        {
            DialogResult res = MessageBox.Show("Are you sure you want to delete this row?", "Delete confirmation",
                     MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (res == DialogResult.No)
                e.Cancel = true;
        }
    }

     

    กำหนดความกว้างโดยอัตโนมัติให้ DataGridView

    โค้ดต่อไปนี้จะปรับความกว้างของคอลัมน์ใน DataGridView ให้มีขนาดพอดีกับความยาวของข้อมูลโดยอัตโนมัติ

    private void btnResize_Click(object sender, EventArgs e)
    {
        dgv.AutoResizeColumns();
        dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
    
    }

     

    เลือกและทำแถบเน้นให้ DataGridView

    โค้ดต่อไปนี้จะเลือกแถวที่สามของ DataGridView และทำแถบเน้น (Highlight) ด้วย

    int rowToBeSelected = 3; // เลือกแถวที่สาม
    if (dgv.Rows.Count >= rowToBeSelected)
    {              
           //เนื่องจากค่าดรรชนีเริ่มจากศูนย์จึงต้องชดเชยโดยการลบหนึ่ง
            dgv.Rows[rowToBeSelected - 1].Selected = true; 
    }

    =================== จบ ===================

    April 07

    นิยายนักสืบ ตอน : วิชามาร

    ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

    นิยายนักสืบ

    ตอน : วิชามาร Social Engineering

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

     

    “แฮกเกอร์มืดคือโจรใจชั่วที่ใช้แป้นพิมพ์ดังมีดปืน”

     

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

     

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

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

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

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

    “เป็นอย่างนั้นหรือครับ?” คุณไชยมง หัวหน้าแผนกทรัพยากรบุคคลถามอย่างประหลาดใจ

    “ไม่เลย” ผมตอบสวนทันที “ในทางตรงกันข้าม แฮกเกอร์มืดส่วนมากเป็นพวกถนัดเรื่องพบปะผู้คน เจรจาคล่องแคล่ว มีทักษะในการพูดจาหลอกล่อจูงใจ มีความสามารถในการปั่นหัวคน หรือฉวยโอกาสจากสภาวะการต่างๆ เพื่อให้ได้ในสิ่งที่ตนต้องการ หรือที่เรียกว่า Social Engineering พูดง่ายๆ คือพวกมันไม่ต่างจากสิบแปดมงกุฎนัก”

     

    “พวกแฮกเกอร์มืดหน้าตาเป็นยังไงครับ” คุณมโนมัย หัวหน้าแผนกนักลงทุนสัมพันธ์ถาม

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

    “จุดประสงค์ในการหลอกล่อคืออะไรครับ” คุณศรีข่าง หัวหน้าแผนกพัฒนาธุรกิจยกมือถาม

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

     

    image001-outline

    ระบบเครือข่ายของบริษัทชัยชนะเป็นระบบที่มีความปลอดภัยสูง ได้รับการออกแบบมาอย่างถูกต้อง server ต่างๆ ถูกกันไว้ในเครือข่ายย่อยที่เรียกว่า DMZ หรือเขตกันชน (Demilitarized zone) และมีการติดตั้ง firewall ในตำแหน่งต่างๆ

     

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

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

    “ไม่มีทางที่แฮกเกอร์จะหารหัสผ่านได้หรอก” คุณลีลาวดี system admin พูดอย่างปั้นปึ่ง พนักงานแผนกสารสนเทศที่เข้าประชุมต่างพยักหน้าอย่างเห็นด้วย

    “ตรงกันข้าม อันที่จริงแล้วง่ายดายอย่างยิ่ง” ผมกล่าวสวน

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

    “อันที่จริงผมได้รับการว่าจ้างจากคุณทวีป หัวหน้าแผนกวิจัยและพัฒนา ให้ทดลองเจาะระบบ หรือทำ penetration test ซึ่งผมได้ลงมือทำแล้ว และประสบผลสำเร็จอย่างง่ายดาย โดยใช้อุบาย social engineering อย่างพื้นๆ”

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

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

    “อาจารย์ช่วยเล่าหน่อยได้ไหมว่าใช้เทคนิคอะไรบ้าง” คุณมารศรีถาม

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

     

    “นี่คือ social engineering มาตรฐานที่แฮกเกอร์มืดนิยมใช้เพื่อให้ได้มาซึ่งรหัสผ่าน” ผมชี้ไปบนจอซึ่งมีข้อความดังนี้

    • หลอกถามตามชั่ว
    • แกล้งมั่วรหัสหาย
    • แปลงกายเป็น admin
    • พลิกลิ้นเป็น ISP
    • อวดดีสอดแนม
    • หาแถมจากขยะ
    • จอมสวะตกทอง

    “คำอธิบายโดยย่อของแต่ละวิธีเป็นดังนี้...

     

    หลอกถามตามชั่ว

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

    แกล้งมั่วรหัสหาย

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

    แปลงกายเป็น admin

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

    พลิกลิ้นเป็น ISP

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

    อวดดีสอดแนม

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

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

    วิธีนี้แม้จะเสี่ยงต่อการถูกจับ แต่ในหน่วยงานที่ใหญ่มากๆ ผู้คนสับสนวุ่นวาย พนักงานมักยุ่งอยู่กับธุระของตนเอง จนไม่สังเกตความผิดปรกติใดๆ

    หาแถมจากขยะ

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

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

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

    จอมสวะตกทอง

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

    ในกรณีที่การใช้อีเมลเป็นเหยื่อล่อไม่อาจทำได้ หรือทำแล้วไม่ได้ผล แฮกเกอร์มืดจะใช้วิธีนำแผ่นดิสก์เก็ต แผ่นซีดี หรือแม้กระทั่ง thumb drive (แฟลชเมโมรีที่มีหัว USB) ไปวางไว้ในที่สาธารณะที่เป้าหมายมักเดินผ่าน เช่นบนพื้นใกล้รถยนต์ของเป้าหมาย ตามทางเดินในอาคารเป็นต้น”

     

    “แล้วอาจารย์ใช้วิธีไหน” คุณมิติ หัวหน้าแผนกบัญชีถาม

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

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

    “คุณเป็นใคร”

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

    “ดิฉันไม่ได้โทรแจ้ง อาจเป็นคุณประดิษฐ์เพราะเบอร์ภายในคล้ายกัน มีคนโอนมาผิดเป็นประจำ”

    “แล้วคอมพิวเตอร์ของคุณปรกติดีไหม มีช้าไหม”

    “บางที่ก็ช้าเหมือนกัน”

     

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

    “ได้ แต่ดิฉันเพิ่งเข้าใหม่ ไม่คุ้นกับระบบที่นี่”

    “ไม่เป็นไร เพียงแต่ทำตามขั้นตอนง่ายๆ ที่ผมกำลังจะบอกก็พอ พร้อมไหม”

    “ค่ะ”

    “ถ้างั้นคุณช่วย sing-off หน่อยผมจะลอง sing-on ด้วย account ของคุณ เพื่อจะได้ตรวจสอบได้ว่ามีอะไรผิดปรกติไหม”

    “ต้องทำยังไงคะ”

    “ป้อนชื่อและรหัสในหน้าพิเศษ”

    “หน้าที่ว่าอยู่ตรงไหน”

    “เอางี้นะครับ ผมจะป้อนที่เครื่องของผมก็ได้ ชื่ออะไรครับ”

    “รติลักษ์ค่ะ”

    “แล้วรหัสผ่านละครับ”

    “panda500ค่ะ”

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

     

     

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

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

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

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

    “ถูกต้องครับ ผมจึงต้องใช้เสาอากาศพิเศษเพื่อขยายสัญญาณให้แรงเพียงพอที่จะเชื่อมต่อได้อย่างมั่นคง”

    “มีของแบบนี้ขายด้วยหรือคะ”

    “มีสิครับ ถ้าไม่อยากซื้อจะประดิษฐ์ขึ้นเองจากหลอดใส่มันฝรั่งทอดก็ยังได้”

     

    image002
    เสาอากาศขยายสัญญาณระบบเครือข่ายไร้สายย่านความถี่ 2.4GHz

    “ถ้าแค่ sign-on เข้ามาใน account ของคุณรติลักษ์ก็ไม่น่าจะทำอะไรได้มาก เพราะมีสิทธิจำกัด” คุณมารศรีตั้งข้อสังเกต

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

    “ไม่จริง ชัยชนะไม่ใช่สถาบันการเงิน คุณจะยักยอกเงินอะไรได้” คุณมิติ หัวหน้าแผนกบัญชีแย้ง

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

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

     

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

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

     

    จบเรื่องนิยายนักสืบตอน 2

    February 23

    ชนิดข้อมูลในภาษา C# (ตอนจบ)

    ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

    ชนิดข้อมูลในภาษา C# (ตอนจบ)

    ผู้เขียน : ลาภลอย วานิชอังกูร (laploy.com) 

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

     

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

     

    การอ้างหน่วยความจำ
    การอ้างหน่วยความจำหรือ memory addressing หมายถึงการระบุตำแหน่งของหน่วยความจำ (แรมในคอมพิวเตอร์) เพื่อบอกให้ตัวแปลภาษารู้ว่าเราจะเอาอะไรไปเก็บที่ไหน เนื่องจากภาษา C# มีลักษณะ managed code ทำให้ปรกติเราจะไม่เขียนอ่านหน่วยความจำโดยตรง แต่จะให้ CLR และระบบปฏิบัติการจัดการให้โดยอัตโนมัติ ที่ผู้เขียนหยิบยกเรื่องนี้มาพูด เพราะการการรู้ว่าการอ้างหน่วยความจำเป็นอย่างไรก็เป็นสิ่งที่น่าสนใจและจะช่วยให้เห็นภาพรวมของโครงสร้างข้อมูลได้ดี

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

     


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

     

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

     

    ตำแหน่งจริงของหน่วยความจำ
    ผู้เขียนระบุตัวเลขที่ใช้อ้างตำแหน่งหน่วยความจำที่กล่าวถึงในบทนี้โดยใช้ตัวเลขฐานสิบมาตลอด เช่น กล่องใบที่ 423 แต่ในความเป็นจริงแล้ว การอ้างตำแหน่งหน่วยความจำคอมพิวเตอร์เราจะใช้เลขฐานสิบหก (Hexadecimal) เป็นตัวเลขที่มีขนาด 32 หรือ 64 บิต ขึ้นอยู่กับระบบปฏิบัติการที่ใช้ (เช่นใน Windows XP จะเป็น 32 บิต แต่ใน Windows XP64 จะเป็น 64 บิต)

    เลขฐานสิบหกก็คล้ายคลึงกับเลขฐานสองและฐานสิบ ในแง่ที่ว่ามันถูกใช้เพื่อการนับ และการกระทำทางคณิตศาสตร์ได้ ตัวเลขที่ใช้ในระบบเลขฐานสิบหกมีจำนวนสิบหกตัว คือจาก 0 ถึง 9 และ A ถึง F ซึ่งใช้แทนที่ 10 ถึง 15 ยกตัวอย่างเช่น ถ้าตำแหน่งของหน่วยความในเลขฐานสิบเป็น 258,425,506 จะเขียนเป็นเลขฐานสิบหกได้ว่า 0x0F6742A2

     

     DecHexBin

    ตารางเปรียบเทียบระหว่างเลขฐานสิบ สิบหก และเลขฐานสอง

     

    สาเหตุที่เราใช้เลขฐานสิบหกเพราะต้องการเขียนเลขฐานสองแบบย่อ เพื่อให้เราเองอ่านและเขียนได้ง่ายขึ้น และที่สำคัญคือตัวแปลภาษา C# ไม่สนับสนุนการป้อนเลขฐานสอง เมื่อต้องการทำงานกับเลขฐานสองหรือทำงานในระดับบิต เราจึงจำเป็นต้องใช้เลขฐานสิบหกแทน ยกตัวอย่างเช่นเราต้องการอ้างถึงตำแหน่งหน่วยความจำที่ 0000 1000 0001 0010 เขียนเป็นเลขฐานสองแบบนี้ยาวเกินไปและเขียนผิดได้ง่าย เราจึงเขียนเป็นเลขฐานสิบหกแทนได้ว่า 0x0812 ซึ่งมีความหมายดังนี้

      • 0x คือหมายเหตุในภาษา C# บอกให้รู้ว่าจำนวนต่อไปนี้เป็นเลขฐานสิบหก
      • 0000 ในเลขฐานสองเท่ากับ 0 ในเลขฐานสิบหก
      • 1000 ในเลขฐานสองเท่ากับ 8 ในเลขฐานสิบหก
      • 0001 ในเลขฐานสองเท่ากับ 1 ในเลขฐานสิบหก
      • 0010 ในเลขฐานสองเท่ากับ 2 ในเลขฐานสิบหก

     

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

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

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

     

    คำถามท้ายบท
    โปรดตอบคำถามต่อไปนี้ ถ้าข้อไหนตอบไม่ได้ให้อ่านทบทวนเนื้อหาในบทความชุดนี้อีกที ตอบได้ครบทุกข้อเมื่อไหร่จึงจะถึอว่าผ่าน
    1.    อะไรคือชนิดข้อมูล
    2.    ชนิดข้อมูลแบบใดเหมาะสำหรับเก็บจำนวนเต็ม
    3.    จงอธิบายวิธีอ้างตำแหน่งข้อมูล เมื่ออ้างถึงชนิดข้อมูลที่โตกว่าหนึ่งไบต์
    4.    ข้อมูลชนิด float ต่างจาก double อย่างไร
    5.    ความเที่ยงตรง (ความละเอียดแม่นยำ) คืออะไร
    6.    จงอธิบายวิธีการการจัดเรียงหน่วยความจำในคอมพิวเตอร์
    7.    อะไรคือระบบเลขฐาน
    8.    เพราะเหตุใดคอมพิวเตอร์จึงใช้ระบบเลขฐานสอง
    9.    เพราะเหตุใดเมื่อเราจองเนื้อที่ในหน่วยความจำ เราจึงไม่จำเป็นต้องกำหนดจำนวนไบต์
    10.    จงอธิบายว่าตัวเลขแบบแสดงเครื่องหมาย และแบบไม่แสดงเครื่องหมาย ถูกเก็บในหน่วยความจำแตกต่างกันอย่างไร

     

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

    vtalk802


    February 22

    Rich Internet Application (แบบไทยๆ)

    ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

    as3title

     

    Rich Internet Application (แบบไทยๆ)

    ที่ผมกำลังพูดถึงอยู่นี้คือการพัฒนาหน้าเว็บที่ไม่ธรรมดา มันคือการสร้างโปรแกรมที่ทำงานในเว็บเบราวเซอร์ ที่ให้ความรู้สึกใกล้เคียงกับโปรแกรมในเดกส์ทอป ที่ฝรั่งเรียกว่า RIA เป็นโปรแกรมประยุกต์ใช้งานในอินเตอร์เน็ต ที่มีส่วนติดต่อกับผู้ใช้แบบหรูหรา อลังการงานสร้าง (Rich Internet Application)

     

    siriraj

    รายนามแพทย์ศิริราช กดที่นี่เพื่อทดลองใช้งานแบบออนไลน์

     

    ถ้าเป็นโปรแกรมที่เลียนแบบการทำงานของระบบปฏิบัติการก็เรียกว่า Web OS ทั้งๆ ที่ความจริงมันเพียงแต่เลียนแบบส่วน shell หรือส่วน GUI (Graphical User Interface ส่วนปฏิสัมพันธ์กับผู้ใช้แบบภาพ) เท่านั้น ในเมืองฝรั่งมีการทำกันเป็นล่ำเป็นสัน แต่ในเมืองไทยยังไม่ค่อยเห็นมีใครทำกัน

    เนื่องจากขณะนี้ผมกำลังทำงานชิ้นหนึ่งให้แก่ รพ. ศิริราช เป็นงานด้านฐานข้อมูล เป็นโปรแกรมที่จะต้องทำงานได้ทั้งจากแผ่นซีดี และในเว็บไซต์ ผมจึงตัดสินใจว่าไหนๆ จะต้องทำเว็บแอพลิเกชันกันแล้วก็ควรทำให้มีลักษณะเป็น RIA และกึ่งๆ Web OS ไปเสียเลย ดีกว่ามาทำเป็น text mode ที่ดูล้าสมัย เพื่อเป็นแบบอย่างให้อนุชนนักพัฒนาเว็บแอพลิเกชันรุ่นน้อง (และหลาน) ได้เห็นว่าทำแบบนี้บ้างก็ดีเหมือนกัน ไม่ถึงกับยากเย็นอะไรมากนัก

    ข้อมูลจำเพาะ

    • ชื่องาน : รายนามแพทย์ศิริราช
    • ขอบเขตของงาน : แสดงรายนาม (และพระนาม) ของแพทย์ นักเรียนแพทย์ พยาบาล ครู ฯลฯ ทั้งหมดตั้งแต่ก่อตั้งจนถึงปัจจุบัน ค้นหาข้อมูลได้ ทำงานได้ทั้งจากในแผ่นซีดี (ไม่ต้องติดตั้ง) และเว็บด้วย
    • เทคโนโลยีที่ใช้ : Flex 2.0 ActionScript 3.0 และ Flash 9
    • Database : flat text file
    • ผู้พัฒนา : ลาภลอย วานิชอังกูร (laploy.com)
    • ทดลองใช้งาน : http://www.laploy.com/demo

    โปรดทราบว่าเทคโนโลยีนี้ไม่ได้เหมาะกับทุกงาน (ยกตัวอย่างเช่นบางงานใช้ C#+ASP.NET+SQL+AJAX อาจจะเวิร์คกว่า) สิ่งสำคัญคือการเลือกเทคโนโลยีและเครื่องมือให้เหมาะสมกับงาน นักพัฒนาซอฟต์แวร์จึงต้องเรียนรู้เทคโนโลยีไว้หลายๆ ชนิด เหนื่อยนะครับ แต่ช่วยไม่ได้ ก็อยากเกิดมาเป็นกรรมกรซอฟต์แวร์ทำไมแหละ

    February 20

    ชนิดข้อมูลในภาษา C# (ตอน 2)

    ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

    title

    ชนิดข้อมูลในภาษา C# (ตอน 2)

    ผู้เขียน : ลาภลอย วานิชอังกูร (laploy.com) 

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

     

    กลุ่มชนิดข้อมูล

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

    กลุ่มชนิดข้อมูลมีสี่กลุ่มดังนี้

    • จำนวนเต็ม (integer) : ใช้เก็บเลขจำนวนเต็ม และเลขแบบมีเครื่องหมาย เหมาะสำหรับเก็บจำนวนที่ไม่สนใจเศษ เช่นจำนวนเงินในกระเป๋าสตางค์ของคุณ
    • เลขทศนิยม (Floating-point) : ใช้เก็บเลขจำนวนจริง (จำนวนเศษส่วน) เหมาะสำหรับเก็บเลขในบัญชีธนาคารที่มีเศษสตางค์ (คือเศษส่วนของบาท) และสามารถนำมาบวกกันให้เป็นจำนวนบาทได้อย่างรวดเร็ว
    • อักขระ (Character) : ใช้เก็บตัวอักษร เหมาะสำหรับเก็บชื่อของสิ่งต่างๆ
    • บูลีน (Boolean) : ใช้เก็บค่าจริง หรือเท็จ (true/false) เหมาะสำหรับเก็บคำตอบของคำถามว่าใช่หรือไม่ใช่ จริงหรือเท็จ

     

    จำนวนเต็ม

    กลุ่มข้อมูลชนิดนี้ใช้จองพื้นที่ในหน่วยความจำเพื่อเก็บเลขจำนวนเต็ม มีทั้งหมดเก้าแบบเช่น byte, short, int, long และอื่นๆ ดังแสดงในตารางนี้

     

    intgeral table

     

    ข้อมูลชนิดจำนวนเต็มสามารถใช้เก็บเลขที่แสดงเครื่องหมาย คือเลขบวกและเลขลบ เช่น +10 และ –5 ถ้าไม่ระบุเครื่องหมายตามปรกติแล้วจะถือว่าเป็นเลขบวก ดังนั้นเครื่องหมายบวกจึงสามารถละไว้ในฐานที่เข้าใจ เลขจำนวนเต็มเมื่อเก็บแบบแสดงเครื่องหมายจะเรียกว่า signed number เมื่อเก็บแบบไม่สนแสดงเครื่องหมายจะเรียกว่า unsigned number

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

    ยกตัวอย่างเช่นข้อมูลแบบ byte ใช้เนื้อที่ในหน่วยความจำแปดบิต หากเก็บเลขจำนวนเต็มแบบไม่แสดงเครื่องหมาย จะก็จะเก็บเลขได้จาก 0 ถึง 255 หากเป็นเลขจำนวนเต็มแบบแสดงเครื่องหมาย หรือ sbyte ก็จะเก็บเลขได้น้อยกว่าครึ่งหนึ่ง คือเก็บจำนวนได้จาก –128 ถึง +127 (ดูในตาราง) ภาษา C# สนับสนุนเลขจำนวนเต็มทั้งแบบแสดงและไม่แสดงเครื่องหมาย เลขที่ไม่แสดงเครื่องหมายจะถูกเหมาว่าเป็นบวก เครื่องหมายลบจะไม่ถูกเก็บไว้ในหน่วยความจำ และจำนวนศูนย์จะถูกถือว่าเป็นจำนวนลบ

     

    ข้อมูลชนิด byte

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

     

    byte x = 10, y = 20;
     

    โค้ดที่เห็นข้างบนทำหน้าที่ประกาศตัวแปรสองตัวชื่อ x และ y โดยมีชนิดข้อมูลเป็น byte ทั้งคู่

     

    ** จงใช้ชนิดข้อมูลแบบ byte เมื่อใดก็ตามที่คุณต้องการรับ-ส่งข้อมูลในเครือข่าย หรือเมื่อต้องการทำงานกับข้อมูลในระดับบิต **

     

    อักขระ (Characters)

    ชนิดข้อมูลแบบอักขระเป็นการใช้ตัวเลขแทนค่าชุดตัวอักษร อันประกอบด้วยอักษรต่างๆ เครื่องหมาย และสัญลักษณ์ที่ใช้ในภาษาต่างๆ ยกตัวอย่างเช่นตัวอักษร A (เอตัวใหญ่) จะถูกเก็บไว้ในหน่วยความจำเป็นตัวเลข 65 ถ้าเราจองหน่วยความจำไว้โดยใช้คีย์เวิร์ด char คอมพิวเตอร์จะรู้ว่าจะต้องปฏิบัติกับข้อมูลนี้ว่าเป็นตัว A ไม่ใช่ตัวเลข 65

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

     

    ** จงใช้ชนิดข้อมูลแบบ char เมื่อใดก็ตามที่คุณต้องการเก็บตัวอักษรในหน่วยความจำ  **

     

    ข้อมูลชนิด short

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

     

    ** จงใช้ชนิดข้อมูลแบบ short เมื่อคุณต้องการเขียนโปรแกรมสำหรับคอมพิวเตอร์รุ่นเก่ามากๆ  **

     

    ข้อมูลชนิด int

    ชนิดข้อมูลแบบ int เป็นชนิดข้อมูลที่นิยมใช้มากที่สุดในกลุ่มชนิดข้อมูลจำนวนเต็มด้วยเหตุผลหลายประการ

     

    ** จงใช้ชนิดข้อมูลแบบ int เมื่อ

    • ใช้เป็นตัวแปรสำหรับควบคุมการทำงานซ้ำ (loop)
    • ใช้เป็นดรรชนีของอาร์เรย์ (array index)
    • ใช้ในการกระทำทางคณิตศาสตร์ของเลขจำนวนเต็ม **

     

    ข้อมูลชนิด long

    ชนิดข้อมูลแบบ long เหมาะสำหรับใช้เมื่อต้องการทำงานกับตัวเลขที่มีขนาดใหญ่เกินกว่าจะใช้ชนิดข้อมูลแบบ int

     

    ** จงใช้ชนิดข้อมูลแบบ long เมื่อต้องการเก็บตัวเลขจำนวนหลายๆ หลัก เช่นมูลค่าทรัพย์สินของบิล เกสต์ ของนายกฯ ทักษิณ หรือของตัวคุณเอง **

     

    จำนวนทศนิยม (Floating-Point)

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

     

    fp

     

    สาเหตุที่ใช้คำว่า floating-point (จุดลอย) เกิดจากวิธีที่มันเก็บตัวเลขทศนิยมในหน่วยความจำ ซึ่งใช้วิธีเก็บตัวเลขทั้งหมด (จำนวนทั้งหน้าและหลังจุดทศนิยม) เป็นจำนวนเต็ม แล้วตำแหน่งของจุดทศนิยมไว้ต่างหาก วิธีเก็บเช่นนี้ทำให้ดูเหมือนว่าจุดทศนิยมลอยตัว (float) อยู่เหนือตัวเลข ยกตัวอย่างเช่นเลข 43.23 จะถูกเก็บเป็น 4323 (เก็บเป็นจำนวนเต็มไม่มีทศนิยม) การกำหนดจุดทศนิยมทำได้โดยการอ้างถึงหลักของตัวเลขที่จะประจุดทศนิยม ซึ่งในกรณีนี้คือหน้าหลักที่สอง

     

    Float_example[1]

    โครงสร้างของข้อมูลแบบ floating-point มีสามส่วนคือ sing bit, exponent และ mantissa

     

    ข้อมูลชนิด float

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

     

    ** จงใช้ float เมื่อคุณต้องการตัวเลขแบบมีทศนิยมที่ต้องการความละเอียดขนาดจำนวนหลักหลังจุดทศนิยม 7 หลัก  **

     

    ข้อมูลชนิด double

    ชนิดข้อมูลแบบ double ใช้เก็บจำนวนมีทศนิยมซึ่งมีค่าสูงมากๆ หรือต่ำมากๆ ใช้พื้นในหน่วยความจำมากเป็นสองเท่าของ float

     

    ** จงใช้ double เมื่อต้องการเก็บตัวเลขที่มีจำนวนหลักหลังจุดทศนิยมมากกว่า 7 หลัก  **

     

    ข้อมูลชนิด บูลีน

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

     

    ** ข้อควรระวังในการใช้ข้อมูลชนิดบูลีนคือในภาษา C++ เราสามารถแปลงข้อมูลชนิดบูลีนไปเป็นแบบจำนวนเต็มได้เลย คือ true ไปเป็น 1 และ false ไปเป็น 0 แต่ในภาษา C# ทำเช่นนั้นไม่ได้ เพราะภาษา C# เราจะแปลงข้อมูลชนิดบูลีนไปเป็นชนิดอื่นๆ ไม่ได้  **

     

    int x = 123;
    if (x)  
    {
        printf_s("The value of x is nonzero.");
    }
     

    โค้ดข้างบนเป็นภาษา C++ ใน C# ต้องเขียนแบบข้างล่างแทน

     

    int x = 123;
    if (x != 0)   
    {
        Console.Write("The value of x is nonzero.");
    }

     

    นอกจากชนิดข้อมูลที่ว่ามาทั้งหมดแล้ว C# ยังมีข้อมุลแบบ String และ Array ซึ่งมีรายละเอียดมาก สมควรนำเสนอแยกต่างหากออกไป นอกจากนั้น C# ยังมีชนิดข้อมูลแบบพิเศษอื่นๆ อีกหลายแบบเช่น struc, nullable และ delegate ที่จะนำเสนอในต่อต่อๆ ไปเช่นกัน

     

    จบตอน 2 โปรดติดตามตอน 3

     

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

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

    February 16

    ชนิดข้อมูลในภาษา C# (ตอน 1)

    ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

    title

    ชนิดข้อมูลในภาษา C# (ตอน 1)

    ผู้เขียน : ลาภลอย วานิชอังกูร (laploy.com) 

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

     

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

     

    สำรวจหน่วยความจำ

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

    หน่วยความจำแคชในซีพียู ใช้เก็บข้อมูลและคำสั่งที่ใช้บ่อยๆ หรือเพิ่งถูกใช้ไป หรือคาดว่าจะถูกเรียกใช้ในอนาคตอันใกล้ แคชจะถูกแบ่งเป็นส่วนๆ เรียกว่ารีจิสเตอร์ (Register) รีจิสเตอร์คือหน่วยความจำขนาดเล็กที่อยู่ภายใน ซีพียู (CPU Central Processing Unit หน่วยประมวลผลกลาง) ทำหน้าที่เก็บข้อมูลหรือคำสั่งเป็นการชั่วคราว

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

     


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

    เป็นเรื่องปรกติที่ซอฟต์แวร์ระบบปฏิบัติการ (Operating System เช่น Windows และ Linux) จะนำหน่วยความจำถาวรบางส่วน มาทำเป็นหน่วยความจำเสมือน (Virtual memory) อันเป็นเทคนิคที่ระบบปฏิบัติการใช้ เพื่อเพิ่มความจุของหน่วยความจำหลัก ให้มากกว่าปริมาณของแรมที่มีอยู่ในเครื่อง การทำงานของมันเป็นดังนี้ เมื่อหน่วยความจำหลักถูกใช้ไปจนเกินความจุของแรม ระบบปฏิบัติการจะนำข้อมูลที่เกินนี้ไปเก็บไว้ที่ในฮาร์ดดิสก์ ครั้นเมื่อคอมพิวเตอร์ต้องการใช้ข้อมูลนั้น ระบบปฏิบัติการจะนำข้อมูลในฮาร์ดดิสก์ มาสลับที่กับข้อมูลในแรมส่วนที่ยังไม่จำเป็นต้องใช้ในตอนนั้น

     

    << บัสคือสายไฟเชื่อมต่อระหว่างซีพียู หน่วยความจำ และอุปกรณ์ I/O

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

     

     เรื่องของข้อมูลและหน่วยความจำ

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

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

     

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

    อย่างไรก็ดี จำนวนหนึ่งบิตไม่สามารถเก็บอะไรได้มากนัก จึงต้องใช้สวิตช์หลายตัวๆ มารวมกัน เช่นสวิตช์สองตัว จะได้สองบิต ซึ่งทำให้เก็บค่าที่แตกต่างกันได้สี่ค่า ดังแสดงในตาราง 1-1 คือใช้แทนเลขได้จาก 0 ถึง 3 ข้อให้สังเกตว่า ตัวเลขต่ำสุดในระบบเลขฐานสอง คือเลขศูนย์ ไม่ใช่เลขหนึ่ง หาเราใช้หน่วยความจำขนาดแปดบิต หรือที่เรียกว่าหนึ่งไบต์ (Byte) จะเก็บค่าที่แตกต่างกันได้ 256 ค่า ซึ่งนำมาใช้แทนตัวเลขจาก 0 ถึง 255 ได้

     

    เราใช้ทรานซิสเตอร์หนึ่งตัวทำสวิตช์ ได้หนึ่งตัว แทนค่าได้หนึ่งบิต ในชิพซีพียูและแรมจะมีทรานซิสเตอร์บรรจุอยู่ภายในหลายร้อยล้านตัว >>

      

    การนับเลขฐานสอง

    ระบบจำนวน (Numbering system) คือวิธีนับ และวิธีกระทำทางคณิตศาสตร์ มนุษย์ใช้เลขฐานสิบในการนับ ส่วนคอมพิวเตอร์ใช้เลขฐานสองในการนับ ทั้งสองระบบทำงานเหมือนกันทุกประการ หากคุณบวกลบคุณหารโดยใช้เลขฐานสอง คุณจะได้คำตอบเช่นเดียวกันหากใช้เลขฐานสิบ

    อย่างไรก็ดี ข้อแตกต่างอันควรสังเกตระหว่างเลขฐานสอง และเลขฐานสิบคือ เลขฐานสิบประกอบด้วยตัวเลขที่แตกต่างกันสิบตัว (0 ถึง 9) ส่วนเลขฐานสองประกอบด้วยตัวเลขเพียงสองตัวเท่านั้น (0 และ 1)

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

     

    กฎในการบวกเลขฐานสอง

     

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

     

    นี่คือกฎของการบวกเลขฐานสองเมื่อแสดงในลักษณะตารางความจริง (truth table) จะเห็นว่าเมื่อ 1 บวกกับ 1 จะเกิดตัวทดหรือ carry ขึ้น

     

    การจองหน่วยความจำ

    หน่วยความจำหนึ่งหน่วยเก็บข้อมูลได้หนึ่งไบต์ แต่ข้อมูลในโปรแกรมอาจโต 2, 4 หรือ 8 ไบต์ก็ได้ ดังนั้นคุณจึงต้องจองเนื้อที่ในหน่วยความจำโดยการกำหนดชนิดข้อมูลหรือ Abstract data type เสียก่อนจึงจะเก็บข้อมูลได้

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

    ชนิดข้อมูลในภาษา C# มีขนาดตายตัว เพราะโปรแกรมที่เขียนด้วยภาษา C# จะรันบนสภาพแวดล้อมเหมือนเดิมตลอด (เรียกว่า CLR หรือ Common Language Runtime) ส่วนภาษา C และ C++ ชนิดข้อมูลจะมีขนาดไม่แน่นอน ขึ้นอยู่กับขนาดของรีจิสเตอร์ของคอมพิวเตอร์ที่จะใช้ ชนิดข้อมูล int และ float จะมีขนาดเท่ารีจิสเตอร์ ส่วน short จะมีขนาดครึ่งหนึ่งของ int ส่วนชนิดข้อมูล long จะมีขนาดเป็นสองเท่าของ int

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

     

    datatype

    ชนิดข้อมูลพื้นฐานในภาษา C# แบ่งออกเป็นหลายแบบดังแสดงในตารางข้างบน คอลัมน์แรกแสดงคีย์เวิร์ด คอลัมน์ถัดมาเป็นชื่อคลาสที่นิยามชนิดข้อมูล คอลัมน์ถัดมาอีกเป็นขอบเขตของจำนวนที่เก็บได้

     

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

     

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

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

    February 01

    กรอกแบบฟอร์มแล้วรับรางวัล

    กรอกแบบฟอร์มแล้วรับรางวัล

     

     

    บก. ของนิตยสาร Windows ITPro ฝากบอกมาว่า

    เพื่อที่จะปรับปรุงการให้บริการด้านต่างๆ ให้มีนิตยสาร Windows ITPro มีประสิทธิภาพมากยิ่งขึ้น จึงขอเชิญทุกท่านร่วมตอบแบบสอบถาม และร่วมลุ้นรับของรางวัลต่างๆ มากมาย อาทิ

    โชคชั้นที่ 1 รับฟรีทันที
            -  Microsoft Visual Studio 2008 Express
    โชคชั้นที่ 2 ลุ้นรับฟรี !! ****
            - USB Phone 8 รางวัล
            - SKYGATE Box จำนวน 4 รางวัล
            - BitDefender Internet Security 5 รางวัล

    หมดเขตรับแบบสอบถามภายในวันที่  30 เม.ย. 2551
    ประกาศรายชื่อผู้โชคดีในนิตยสาร Windows ITPro ฉบับ เม.ย. 2551
    สามารถดาวน์โหลดแบบสอบถามได้ที่เว็บไซต์ www.windowsitpro.net/Download
    หรือส่งแฟกซ์มาได้ที่ 0-2246-4251 ถึง กองบรรณาธิการ นิตยสาร Windows ITPro

    **** สงวนสิทธิ์สำหรับผู้กรอกแบบสอบถามครบถ้วนเท่านั้น

    บก. ของนิตยสาร Windows ITPro ฝากบอกมาว่า
    ถ้าไม่มีเครื่องแฟกซ์จะส่งกลับไปทางอีเมลก็ได้ที่ suwaschai@windowsitpro.net
    ส่วนที่้ต้องกาในแบบฟอร์มใช้ป้ายสีแทนได้

    สร้าง IrDA ด้วยตนเอง

    ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

    สร้าง IrDA ด้วยตนเอง
    สร้างตัวรับส่งอินฟราเรดโดยใช้อุปกรณ์หาง่ายราคาถูก เพื่อเชื่อมต่อคอมพิวเตอร์ของคุณกับอุปกรณ์ไฮเทคแบบไร้สาย

    เขียนโดย : ลาภลอย วานิชอังกูร    [บทความจาก นิตยสารไมโครคอมพิวเตอร์ ]

    อุปกรณ์ไฮเทคเช่น Pocket PC, คอมพิวเตอร์พกพา, กล้องถ่ายภาพแบบดิจิตอล และโทรศัพท์มือถือ ล้วนมี “วงจรสำหรับการเชื่อมต่อด้วยแสงอินฟราเรด” (ต่อไปจะเรียกย่อๆ ว่า IrDA) เพื่อให้เราสามารถเชื่อมต่ออุปกรณ์เหล่านี้กับคอมพิวเตอร์และรับส่งแลกเปลี่ยนข้อมูลได้โดยไม่ต้องใช้สาย

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

    อุปกรณ์ไฮเทคที่สนับสนุน IrDA มีจำนวนมาก ยกตัวอย่างเช่น
    •    มือถือโนเกียรุ่น 5000 series, 6000 series, 7000 series, 8000 series
    •    มือถือโมโตโลรารุ่น 7689, 7389, L2000, A6288, 388, time port
    •    มือถืออิริคสันรุ่น T39, T68, T68i, R320, R380
    •    มือถือซีเมน 2588, 3568i, 3618, 6618, 6686, 6688
    •    เครื่องพิมพ์ยี่ห้อฮิวเลตเพคการ์ด รุ่น 5MP Laser Printer, HP 6P Laser Printer และ HP DeskJet 990C series Printer
    •    กล้องโซนี่ DSC-F1 3COM
    •    คอมพิวเตอร์พกพาแบบ ปามล์ รุ่น Palm III, Palm V, Palm M100, Palm Vx
    •    Pocket PC, Smart Phone และ PDA ทุกรุ่น
    •    คอมพิวเตอร์แบบ note book ส่วนใหญ่

    005

    วินโดวส์ทุกเวอร์ชันสนับสนุนการเชื่อมต่อ IrDA โดยใช้โปรโตคอลแบบจุดต่อจุด ความเร็วในการรับ-ส่งข้อมูลประมาณ 4MBps (MBps คือล้านบิตต่อวินาที) ตามทฤษฏีแล้ว IrDA สามารถทำงานได้ที่ความเร็วสูงสุดถึง 16MBps และทำงานได้ภายในระยะทางประมาณหนึ่งถึงสองเมตร

    โชคดีที่เมนบอร์ดส่วนใหญ่มี  IrDA มาให้ด้วย แต่วงจรนี้จะไร้ประโยชน์โดยสิ้นเชิงหากเราไม่มี “หัวรับ-ส่งสัญญาณอินฟราเรด” (ต่อไปจะเรียกย่อว่า IrTxRx)  แย่หน่อยที่ IrTxRx ไม่มีมาในกล่องเมนบอร์ด เราต้องหาซื้อแยกต่างหาก  ผู้ที่อยู่ไกลศูนย์ไอทีอาจพบว่า IrTxRx เป็นสิ่งที่หาซื้อยากและมีราคาแพง  

     

     

    << หัวรับ-ส่งสัญญาณอินฟราเรด หรือ IrTxRx 

    บทความนี้จะสอนวิธีสร้าง IrTxRx ขึ้นใช้เอง โดยใช้วัสดุเหลือใช้รอบๆ ตัว หรือซื้อจากร้ายขายอะไหล่อิเล็กทรอนิกส์ วงจรไม่ซับซ้อน (ออกแบบโดย Alain Gailland) ใช้อุปกรณ์ไม่กี่ชิ้น ใครก็ตามที่บัดกรีเป็นก็สามารถทำได้เอง และจะแสดงตัวอย่างการประยุกต์ใช้งาน โดยการสาทิตวิธีเชื่อมต่อ Pocket PC กับเครื่องพีซีเพื่อทำ ActiveSync แบบไร้สาย และสุดท้ายจะแสดงวิธีเชื่อมต่อกับโทรศัพท์มือถือเพื่อเข้าอินเตอร์เน็ตผ่านระบบ GPRS




    หัวรับ-ส่งสัญญาณอินฟราเรด หรือ IrTxRx เมื่อประกอบเสร็จแล้ว  >>
    001

     

    ช่องต่อ IrDA บนเมนบอร์ด

    เมนบอร์ดส่วนใหญ่มีจุดต่อวงจรอินฟราเรด (ต่อไปจะเรียกย่อว่า IRC) เตรียมมาให้แล้ว เปิดฝาเคสดูที่เมนบอร์ด มองหาหัวต่อ (jumper pin) ที่เขียนว่า IR, IRDA, IRCON, SIR, SIRCON หรืออะไรทำนองนี้ ถ้าหาไม่เจอให้ดูในคู่มือเมนบอร์ด (ถ้าหาคู่มือไม่เจอให้ดาว์นโหลดจากเว็บไซต์ของผู้ผลิต)  บทความนี้จะยกตัวอย่างเมนบอร์ดยี่ห้อ Asus รุ่น A7N8X ซึ่งมี IRC ที่มุมขวาด้านล่าง มีตัวอักษรเขียนว่า IR_CON1
     

    IRC ปรกติจะมีสี่ถึงหกขาขึ้นอยู่กับเมนบอร์ดแต่ละรุ่น ในเมนบอร์ดยี่ห้อ Asus รุ่น A7N8X หากดูในคู่มือจะเห็นว่าขา IRC มีสิบขา แต่เป็นขาที่ไม่ได้ใช้งานไปเสียสามขา ขาของ IRC ที่เราต้องการใช้งานมีเพียงสี่ขาคือ ขาส่งสัญญาณ (IRTX) ขารับสัญญาณ (IRRX) ขากราวด์ (GND) และขาจ่ายไฟเลี้ยง (+5v) ตำแหน่งของขาเหล่านี้จะแตกต่างกันในเมนบอร์ดแต่ละรุ่น โปรดตรวจดูในคู่มือให้แน่ใจ เพราะหากต่อผิดอาจทำให้เมนบอร์ดหรือเหล่งจ่ายไฟชำรุดได้

     

    002 003

    จุดต่อวงจรอินฟราเรดในเมนบอร์ดยี่ห้อ Asus รุ่น A7N8X

    การจัดวางขา IR_CON1 ในเมนบอร์ดยี่ห้อ Asus รุ่น A7N8X

     

    อุปกรณ์ที่ต้องใช้

    อุปกรณ์ที่เราจะใช้สร้าง IrTxRx เป็นอุปกรณ์อิเล็กทรอนิกส์ธรรมดาที่หาซื้อได้ตามร้านอะไหล่ใกล้บ้าน (ถ้าอยู่ใกล้บ้านหม้อก็สบายหน่อย) ถ้าคุณมีซากอุปกรณ์อิเล็กทรอนิกส์เก่าๆ ที่ชำรุดแล้วอาจแกะอะไหล่มาใช้ได้ ยกตัวอย่างเช่นหลอด LED แบบอินฟราเรด (IED) และตัวรับอินฟราเรด หากคุณมีเมาส์แสง (optical mouse) เก่าที่เสียแล้ว ก็สามารถแกะตัวรับส่งอินฟราเรดมาใช้ได้ (ปรกติในเมาส์แสงจะมีตัวรับส่งอินฟราเรดอยู่สี่ชุด)  หรือทรานซิสเตอร์จะใช้เบอร์อะไรก็ได้ เพียงแต่ให้เป็นชนิด NPN และมีขนาดยิ่งเล็กยิ่งดี


    รายการอุปกรณ์
    ตัวต้านทาน ¼ w    22โอห์ม, 4.7K, 47K, 15k และ 1K     อย่างละตัว
    ตัวเก็บประจุ    10nf    หนึ่งตัว
    ทรานซิสเตอร์    2N4041 หรือ BC548 (หรือเบอร์อื่นๆ ที่เป็น NPN)    สองตัว
    ตัวรับส่งอินฟราเรด    เบอร์อะไรก็ได้    หนึ่งชุด
    แผ่นวงจรอเนกประสงค์    แผ่นเล็ก    หนึ่งแผ่น
    สายแพ    แบบสี่เส้น     2เมตร

     

    ประกอบวงจร

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

    เมื่อประกอบเสร็จให้ตรวจสอบโดยการไล่วงจร จนแน่ใจว่าไม่มีข้อผิดพลาด (เช่นทรานซิสเตอร์ หรือ LED สลับขา) จากนั้นนำวงจร IrTxRx เชื่อมต่อเข้ากับ IRC ของเมนบอร์ด (เมนบอร์ดยี่ห้อ Asus รุ่น A7N8X คือ IR_CON1)  ให้ต่อจุดที่เขียนว่า IRTX, IRRX, GND และ +5v ใน IrTxRx เข้ากับ IRC ในเมนบอร์ดในตำแหน่งที่มีชื่อตรงกัน ระวังอย่าต่อสลับขากันเพราะอาจทำให้วงจรในเมนบอร์ดชำรุดได้

    วงจรหัวรับ-ส่งอินฟราเรด >>
    004
    006 การเชื่อม IrTxRx กับเมนบอร์ดให้ใช้สายแพ (ดูภาพ) ยาวหนึ่งถึงสองเมตรเพื่อให้เราสามารถวาง IrTxRx ไว้ภายนอกเคสในตำแหน่งที่สะดวกต่อการใช้งาน เช่นบนโต๊ะทำงานใกล้กับแป้นพิมพ์ สาเหตุที่ควรใช้สายแพเพราะหากใช้สายไฟธรรมดาสี่เส้นจะรุงรัง หากคุณหาสายแพไม่ได้จะนำสายโทรศัพท์ที่ภายในมีสี่เส้นมาใช้แทนก็ได้เหมือกัน


    << สายแพแบบแปดเส้น หากใช้แบบนี้ต้องฉีกออกครึ่งหนึ่งให้เหลือสี่เส้น

     

    การติดตั้งในวินโดวส์

    เมื่อติดตั้ง IrTxRx เรียบร้อยแล้วให้เปิดคอมพิวเตอร์แล้วเข้าโปรแกรมไบออส (กดปุ่ม Del ขณะเครื่องกำลังตรวจสอบตัวเองก่อนเข้าวินโดวส์) เพื่อกำหนดค่าในไบออสให้ IrDA ทำงาน เมื่อตั้งค่าแล้วให้บูตใหม่ เมื่อเข้าวินโดวส์แล้ววินโดวส์จะตรวจพบ IrDA โดยอัตโนมัติและจะแสดงกรอบข้อความ Found New Hardware Wizard

     

    007


    กรอบข้อความ Found New Hardware Wizard

     

    009 
    วิธีตรวจสอบว่า IrDA ถูกวินโดวส์ติดตั้งเรียบร้อยหรือไม่ทำได้โดย 1) กดปุ่ม Start 2) เลือกหัวข้อ Setting 3) เลือกหัวข้อ Control Panel จะเห็นไอคอน Infrared

     

    ทำ ActiveSync กับ Pocket PC

    ตอนนี้ IrDA พร้อมใช้งานแล้ว ต่อไปเป็นวิธีเชื่อม Pocket PC กับพีซีเพื่อทำ ActiveSync แบบไร้สาย

    010 
    เปิดโปรแกรม ActiveSync แล้วเลือกเมนู File คลิกที่หัวข้อ Connection Setting…

     

    011 
    กดให้มีเครื่องหมายถูกหน้าข้อความ Allow serial cable or infrared connection to this COM port แล้วเลือก Infrared (IR) จาก drop down list box

     


    012

    เปิดโปรแกรม ActiveSync ใน Pocket PC


    013

    นำ Pocket PC มาวางให้ตรงกับ IrTxDx แล้วคลิกคำสั่ง Tool และ Connect via IR


    014

    Pocket PC จะรับสัญญาณได้และทำการเชื่อมต่อ
    เมื่อเชื่อมต่อได้แล้วก็สามารถโยกย้ายไฟล์ระหว่าง Pocket PC และพีซีได้ตามปรกติ

     

    ใช้โมเด็มในมือถือ


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


    015

    นำมือถือมาเปิดเมนู เลือก Tools เลือก Setting แล้วเลือก Connection

    017

    เลือกหัวข้อ Access points แล้วใส่ค่าต่างๆ ตามที่ผู้ให้บริการระบุ เช่น ชื่อ รหัสผ่าน ดูรายละเอียดในคู่มือการใช้งานของมือถือแต่ละยี่ห้อแต่ละรุ่น และคู่มือวิธีกำหนดค่าของผู้ให้บริการ หรือใช้ระบบ OTA (การตั้งค่าผ่าน SMS) ต่อไปนี้เป็นแนวทางในการตั้งค่าโดยทั่วไป

    1.    หัวข้อ Connection Name ให้กำหนดดังนี้

    •    เครือข่าย AIS ใช้ AIS GPRS INTERNET
    •    เครือข่าย DTAC ใช้ DTAC GPRS INTERNET
    •    เครือข่าย Orange ใช้ Orange GPRS Internet
    •    หรือจะใช้ชื่ออะไรก็ได้ที่เข้าใจง่าย


    2.    หัวข้อ Data Bearer เลือกเป็น GPRS


    3.    หัวข้อ Access Point name ให้กำหนดดังนี้

    •    เครือข่าย AIS ให้กำหนดเป็น internet
    •    เครือข่าย DTAC ให้กำหนดเป็น www.dtac.co.th
    •    เครือข่าย Orange ให้กำหนดเป็น internet


    4.    หัวข้อ User Name ให้กำหนดดังนี้

    •    เครือข่าย AIS ปล่อยว่าง
    •    เครือข่าย DTAC ปล่อยว่าง
    •    เครือข่าย Orange ให้กำหนดเป็น orange

    5.    หัวข้อ Prompt Password ปล่อยว่าง


    6.    ห้อข้อ Password ให้กำหนดดังนี้

    •    เครือข่าย AIS ปล่อยว่าง
    •    เครือข่าย DTAC ปล่อยว่าง
    •    เครือข่าย Orange ให้กำหนดเป็น orange

    7.    หัวข้อ Authentication เป็น Normal

    8.    หัวข้อ Homepage ให้กำหนดดังนี้

    •    เครือข่าย AIS ใส่

    http://wap.mobilelife.co.th
    •    เครือข่าย DTAC ปล่อยว่าง
    •    เครือข่าย Orange ให้กำหนดเป็น
    http://www.orange.co.th

    9.    หัวข้อ Connection security ให้กำหนดเป็น off

    10.    หัวข้อ Session mode ให้กำหนดเป็น Temporary

     

    ต่อไปเป็นการตั้งค่า Advance Setting ใน Option / Advance Setting

    1.    หัวข้อ Phone IP Address ให้กำหนดเป็น automatic
    2.    Primary name server ให้กำหนดเป็น 0.0.0.0
    3.    Second name server ให้กำหนดเป็น 0.0.0.0
    4.    Proxy serv. Address ให้กำหนดเป็น
    •    เครือข่าย AIS ให้กำหนดเป็น 203.170.299.34
    •    เครือข่าย DTAC ให้กำหนดเป็น 203.155.200.133
    •    เครือข่าย Orange ให้กำหนดเป็น orange 010.004.007.039
    5.    Proxy port number ให้กำหนดเป็น 8080

    018

    เปิดการใช้งาน IrDA ในมือถือโดยเลือก Connect, Modem และ Connect Via Infrared

     

    008


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

     

    016 
    มือถือจะแสดงข้อความว่ากำลังเชื่อมต่อกับพีซีผ่านอินฟราเรด

     

    019 
    วิธีตรวจสอบว่าวินโดวส์ติดตั้งไดร์ฟเวอร์ของโมเด็มเรียบร้อยหรือไม่ทำได้โดยคลิกขวาที่ My Computer, Properties กดที่ tab Hardware กดปุ่ม Device Manager จะเห็นกรอบข้อความนี้ ดูในหัวข้อโมเด็มจะมีข้อความว่า Standard Modem over IR link (หรืออื่นๆ ที่คล้ายกัน)


     

    021

    ต่อไปเป็นการกำหนดการเชื่อมต่ออินเตอร์เน็ตผ่านโมเด็มของมือถือซึ่งทำได้โดยเรียก Wizard ของวินโดวส์ กดปุ่ม Start, Setting, Network Connection ในกรอบ Network Connections เลือกหัวข้อ New Connection Wizard


     

    020

    New connection Wizard จะทำงาน ให้ทำตามขั้นตอนไปเรื่อยๆ เมื่อมีหัวข้อให้เลือกการเชื่อมต่อ ให้เลือกโมเด็มของมือถือ

     

    อิสระกับอินฟราเรด

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

     

     

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

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

    January 22

    มาทำลายคอมพิวเตอร์กันเถอะ

    ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

    มาทำลายคอมพิวเตอร์กันเถอะ!!

     

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

    เขียนโดย ลาภลอย วานิชอังกูร    บทความจากนิตยสาร ComToday

     

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

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

    คุณเคยดูเรื่อง A.I. หรือไม่? (ภาพยนตร์ปีค.ศ. 2001 กำกับโดยสตีเวน สปิลเบิร์ก) ในภาพยนตร์เรื่องนั้น เมื่อประชากรหุ่นยนต์มีมากเกินไป เค้ายังต้องจัดงาน “เฟรชแฟร์” (Flesh Fair) ลากหุ่นยนต์ออกมาทำลายเล่น เพื่อสะใจและเป็นการควบคุมประชากรหุ่นไปด้วยในตัว แน่ละ! ทั้งคุณและผมย่อมมีสิทธิที่จะได้ลิ้มรสความสุขใจเช่นนั้นบ้าง!

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

     

    (คำเตือน : บทความนี้เป็นเรื่องของการใช้กำลังและความรุนแรง มีเนื้อหาไม่เหมาะต่อเยาวชนอายุต่ำกว่า 13 ปี ผู้ปกครองควรให้คำแนะนำ)

     

    เริงร่ารอบตู้เคส

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

    1. เดินอ้อมไปหลังโต๊ะคอมพิวเตอร์เพื่อพิจารณาด้านหลังของเคสคอมพิวเตอร์
    2. กวาดสายตาดูรอบๆ คุณจะเห็นว่าฝาเคสคอมพิวเตอร์ของเรามันช่างมีนอตเยอะเสียจริงๆ นอตที่ว่านี้เป็นนอตหัวแฉกหรือที่พวกช่างเรียกว่า “นอตหัวฟิลลิป” นั่นเอง นอตอย่างนี้ปกติใช้ไขควงหัวแฉกขนาดกลางขันเบาๆ นอตก็จะคลายเกลียวออกมาได้อย่างง่ายดาย แต่งานนี้ย่อมไม่มีการใช้ไขควงแบบนั้นอยู่แล้ว!
    3. นำไขควงแฉกไปเก็บซ่อนไว้ให้หมด
    4. ไปหา “ไขควงแบน” มา เอาไขควงแบนที่มีหัวใหญ่ๆ หน่อย นำมาไขโดยออกแรงให้มากเข้าไว้
    5. หากคุณสามารถทำให้ไขควงแฉลบออกไปทิ่ม “คอนเนคเตอร์” (connector ช่องเสียบสายอุปกรณ์ต่างๆ) จนขาหักได้จะถือว่าดีเลิศ (ของคอนเนคเตอร์ ไม่ใช่ขาของคุณ)
    6. ไม่ควรให้มือพลาดไปทิ่มสันโลหะของเคส เพราะอาจจะทำให้คุณบาดเจ็บ อย่าลืมว่าเป้าหมายของเราคือต้องการสร้างความเสียหายให้แก่คอมพิวเตอร์ ไม่ใช่รางกายของเรา
    7. ถ้าคุณใช้เครื่องหรูมีระดับ (เครื่องแบรนเนม) อาจต้องเจอกับนอตแบบ “โปสิไดร์ฟ” นอตแบบนี้เป็นนอตพิเศษ ถูกออกแบบมาเพื่อป้องกันคนที่ไม่ใช่ช่างมาเปิดฝาเคสเล่น หน้าตามันก็คล้ายๆ กับนอตหัวแฉกนี่แหละ แต่ร่องจะชันน้อยกว่า ถ้าไปหาซื้อไขควงโปสิไดร์ฟมาขัน นอตก็จะหลุดออกได้โดยง่าย แต่ผมขอบอกว่าอย่าไปซื้อให้เปลืองเงิน ใช้ ไขควงฟิลลิป นี่แหละเหมาะที่สุด ควรใช้แรงไขมากๆ เพราะจะทำให้นอตหัวแบะดูงามตา และถ้าคุณมีโชค ไขควงของคุณก็อาจจะหัวแบะตามไปด้วยเช่นกัน
    8. หากคุณเป็นสุภาพสตรี หรือมีแรงน้อย ให้ใช้ค้อนตอกที่ท้ายไขควงแรงๆ ทำเช่นนั้นซ้ำๆ จนกว่านอตจะหัวแบะ
    9. เป็นเรื่องสำคัญเมื่อถอดนอตด้านหลังเครื่อง ควรจะถอดให้ครบทุกตัว ไม่ใช่ถอดเฉพาะนอตที่รายล้อมอยู่รอบๆ ฝาเคสเท่านั้น นอตที่อยู่กลาง อยู่ล่าง อยู่บน และนอตซึ่งทำหน้าที่ยึดกล่องหน่วยจ่ายไฟ (power supply unit) นั้นควรค่าแก่การไขออกมามากที่สุด เพราะหากคุณมีโชค หน่วยจ่ายไฟจะร่วงออกจากที่ยึด หล่นลงไปใส่แผงวงจรในเครื่อง ซึ่งจะก่อให้เกิดความเสียหายอย่างรุนแรง ก่อนที่คุณจะทันได้ถอดฝาออกเสียอีก
    10. การแกล้งลืมไขนอตออกบางตัว แล้วพยายามงัดฝาเคสออกด้วยกำลัง ถือว่าเป็นความพยายามที่น่าชื่นชม จงพยายามงัดฝาเคสออกด้วยไขควงแบนตัวใหญ่ที่สุดที่หาได้ ลองงัดด้านนู้น แล้วย้ายมางัดด้านนี้ ออกแรงให้มากเข้าไว้เช่นเคย และถ้าคุณกำลังดวงขึ้น คุณก็อาจจะได้เห็นฝาหน้าแตกร้าว โลหะบิดงอ หรือมีชิ้นส่วนอะไรหลุดกระเด็นหายไปที่มุมห้อง
    11. เรียนผูกแล้วต้องเรียนแก้ เมื่อถอดฝาเคสแล้วควรฝึกใส่กลับเข้าที่ด้วย นับเป็นบุญที่เคสบางรุ่นออกแบบมาได้แย่มาก คือมีช่องและร่องมากมาย หากถอดหรือใส่ฝาผิดนิดเดียว สลักก็จะพับงอ มีเคล็ดลับอยู่หน่อยคือตอนใส่ฝาให้กดแรงๆ ใช้กำลังดันเข้าไป (ใช้ค้อนช่วยหากมีแรงน้อย) ถ้ามีสายไฟแลบออกมา ให้ดันฝาเคสกดทับสายไฟไปด้วยจะดีมากๆ ตอนขันนอตปิดควรขันให้แน่นที่สุด ประหนึ่งว่านอตตัวนั้นทำหน้าที่ยึดตึกระฟ้าทั้งหลังไว้ ภายหลังเมื่อเราถอดฝาเคสอีก นอตและรูนอตนั้นจะมีโอกาสเกลียวหวาน หรือหัวแบะได้สูง (เคล็ดลับ : ถ้าอยากผ่อนแรงขอแนะนำให้ใช้ไขควงไฟฟ้าที่มีแรงบิดสูงๆ แบบที่ช่างซ่อมรถใช้)
    12. ควรละลึกไว้เสมอว่าเคสของคอมพิวเตอร์นั้นเป็นสิ่งที่แข็งแรงเหลือเชื่อ จึงควรจัดให้มีน้ำหนักจำนวนมากกดทับไว้เสมอ เช่นเอาตู้เซฟมาตั้งบนเคส หรือมีเก้าอี้ในห้องน้อยๆ เข้าไว้ เมื่อมีแขกมาเยี่ยมก็ให้แขกนั่งบนเคสต่างเก้าอี้ นานๆ เข้าเคสจะบิดงอ เป็นสาเหตุสำคัญในการสร้างความเสียหายให้แก่แผงวงจรภายในได้เป็นอย่างดี

     

    ม่วนซื่นกันให้สุดขีด!

     

    ไฟฟ้าสถิตจ๋า

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

    1. เปิดฝาเคสให้เรียบร้อย (หรือจะยับเยินก็ตามใจ)
    2. หมายตาไว้ที่ชิพซีพียู หรือแรมโมดูลก็ได้
    3. ปรับอากาศในห้องให้แห้งและเย็น
    4. ใส่ถุงเท้าขนสัตว์หรือที่ทำจากสารสังเคราะห์ เดินลากๆ ขาบนพรมไปๆ มาๆ รอบห้องสักสองสามรอบ
    5. เดินไปที่เครื่องคอมฯ ระวังอย่าให้มือโดนเคสหรือโต๊ะ หรือโลหะชิ้นใดที่มีสภาพเป็นเป็นกราวนด์
    6. ค่อยๆ สอดมือเข้าไปสัมผัสลูบไล้ชิพไอซีตัวนู้นตัวนี้ตามใจชอบ
    7. ถ้าอยากให้การทำลายมีประสิทธิภาพสูงขึ้นอีก ควรถอดซีพียูและแรมออกจากเมนบอร์ดก่อนสัมผัส
    8. เครื่องดูดฝุ่นเล็กๆ สำหรับทำความสะอาดคอมพิวเตอร์นับว่าเป็นเครื่องกำเนิดไฟฟ้าสถิตชั้นดี พยายามนำมาใช้ดูดซอกซอนตามหลืบมุมต่างๆ ให้ทั่วถึง ถ้าจะให้ได้ผลดีควรทำเมื่ออากาศในห้องมีความชื้นน้อยที่สุด

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

     

    ใช้แสนยานุภาพทางอากาศ

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

    1. ค้นดูในบ้านว่ามีอากาศอัดกระป๋องหรือไม่ หน้าตาเหมือนกระป๋องสเปรย์ ปรกติเราจะซื้อมาไว้เป่าฝุ่นเพื่อทำความสะอาดอุปกรณ์ต่างๆ กำลังลมของสเปรย์นี้มีอำนาจมากพอที่จะทำให้ชิ้นส่วนอิเล็กทรอนิกส์ในคอมพิวเตอร์หลุดกระเด็นออกมาได้อย่างสบาย
    2. หากต้องการแสนยากรทางอากาศที่ทรงพลังจริงๆ เราต้องอาศัยเครื่องปั๊มลม (Air compressor) อย่างที่ช่างซ่อมรถและนักพ่นสีใช้กัน นำมาปรับให้มีแรงดันสูงสุด (สักยี่สิบบาร์กำลังดี) แล้วนำมาเป่าส่วนต่างๆ ในตู้ ซอกซอนให้ทั่วทุกซอกมุม เช่นในซีดีรอมไดร์ฟ ลึกลงไปในเมนบอร์ด หากคุณมีพรสวรรค์ คุณจะสามารถทำให้ ชิพไอซี แรม หรือแม้กระทั่งตัวเก็บประจุ กระเด็นหลุดออกมาได้

     

    ใช้ยุทธนาวี

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

    1. วางคอมพิวเตอร์ไว้ใกล้หน้าต่าง ในวันครึ้มฝน อย่าปิดหน้าต่าง
    2. ควรวางแก้วกาแฟและน้ำอัดลมไว้ใกล้ๆ คอมพิวเตอร์ หลักการนี้ได้ผลดีเป็นพิเศษกับคอมพิวเตอร์แบบ notebook
    3. ประดับเคสด้วยโหลปลาทองก็ถือว่าเป็นไอเดียที่ไม่เลว
    4. หากทำน้ำหกใส่คอมพิวเตอร์ อย่านำไปร้านซ่อมในวันนั้น ให้ประวิงไว้สักหนึ่งเดือน เพราะถึงตอนนั้นสนิมได้กินแผงวงจรโดยสมบูรณ์แล้ว

     

     

    อำนาจแห่งความร้อน

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

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

     

    โจมตีที่จุดอ่อน

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

    1. ใช้ฝ่ามือตบที่เคสแรงๆ ขณะฮาร์ดดิสก์อ่านหรือเขียนข้อมูล จุดประสงค์คือเราต้องการสร้าง “แรงสะเทือน” ฮาร์ดดิสก์ส่วนใหญ่จะมีระบบต้านความสั่นสะเทือนอยู่แล้ว จึงอาจจะต้องหาวัตถุที่แข็งและหนัก (เช่นที่ทับกระดาษ) ทุบ คุณอาจถามว่าแล้วจะรู้ได้อย่างไรว่าฮาร์ดดิสก์กำลังอ่านหรือเขียนข้อมูล คำตอบคือให้สังเกตที่หลอดไฟสีแดงเล็กๆ หน้าเครื่อง (ปรกติหลอดนี้จะมีตัวอักษรเขียนว่า H.D. หรืออาจเป็นสัญลักษณ์รูปกลอง) หลอดไฟนี้จะติดสว่างขณะฮาร์ดดิสก์อ่านหรือเขียนข้อมูล
    2. ยกเคสขึ้นลอยจากพื้นเล็กน้อย (หนึ่งนิ้ว) แล้วปล่อยให้ตกกระแทกพื้นขณะฮาร์ดดิสก์อ่านหรือเขียนข้อมูล
    3. ในกรณีที่เป็นคอมพิวเตอร์แบบ note book งานของเราจะง่ายขึ้นมาก เพียงผลักให้มันตกจากโต๊ะขณะฮาร์ดดิสก์อ่านหรือเขียนข้อมูล หากเป็นวันที่คุณดวงขึ้นอาจได้โบนัสคือจอภาพแตกร้าวเป็นของแถมพกด้วย

     

     

    สองเกลอลุยไฟ

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

    1. หาสาย USB แบบ AA มาหนึ่งเส้น สายชนิดนี้จะมีหัว USB แบบแบนทั้งสองปลาย
    2. นำปลายหนึ่งเสียบกับช่อง USB ในเครื่องของคุณ
    3. นำปลายอีกด้านหนึ่งเสียบกับช่อง USB ในเครื่องของเพื่อนคุณ
    4. เปิดคอมพิวเตอร์ทั้งสองเครื่อง
    5. รอสักหนึ่งนาทีจะเริ่มมีควันขึ้นที่คอมพิวเตอร์ทั้งสองเครื่อง ถ้าคุณเคราะห์ดี อาจมีไฟลุกขึ้นมาด้วย

     

    เริงใจกับการถอด-ใส่

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

    1. เปิดฝาเครื่อง
    2. จ่ายไฟเข้าเครื่อง
    3. ถอดนอตออกจากแผงวงจรในเครื่อง จะเป็นแผงวงจรเชื่อมต่อจอภาพ หรือการ์ดเสียง หรืออะไรก็ดีทั้งนั้น ถ้าคอมพิวเตอร์ของคุณไม่มีแผงวงจะอะไรเลยเพราะทุกอย่างมีมาพร้อมในเมนบอร์ดทั้งหมด (build-in) ก็คงไม่มีทางเลือกนอกจากต้องหมายตาไว้ที่แผ่นหน่วยความจำแรม
    4. ถอดแผ่นวงจรออกจากเมนบอร์ด
    5. นำใส่กลับเข้าไปใหม่
    6. ถอดออกมาอีก
    7. ขณะทำขั้นตอนเหล่านี้ดูให้แน่ใจว่ามีไฟจ่ายเข้าเครื่อง และคอมพิวเตอร์เปิดอยู่

     

     

    เล่นงานไบออส

    ไบออส (BIOS ย่อจาก Basic Input Output System) คือโปรแกรมในไอซีแบบ EEPROM ไบออสเป็นโปรแกรมระดับรากหญ้ามันจะทำงานทันทีที่เราเปิดคอมพิวเตอร์ หากไบออสชำรุด คอมพิวเตอร์จะบูตไม่ได้ ดังนั้นไบออสน่าจะเป็นเป้าหมายที่ยอดเยี่ยมเลยใช่ไหม? วิธีทำลายไบออสให้ดำเนินการตามนี้

    1. เปิดเว็บไซต์ผู้ผลิตไบออส
    2. ดาวน์โหลดโปรแกรมสำหรับ Flash หรือปรับปรุงไบออส
    3. ดาวน์โหลดไบออสตัวล่าสุดมาด้วย
    4. ดูให้แน่ว่าไบออสตัวที่ดาวน์โหลดมาไม่ใช่รุ่นเดียวกับเมนบอร์ดของเรา
    5. ติดตั้งแล้วรันโปรแกรม Flash ไบออส

     

    ถอดใจซีพียู

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

    1. เปิดฝาเครื่อง
    2. ถอดสายไฟออกจากพัดลมซีพียู ทำได้โดยดูที่พัดลมซึ่งติดอยู่บนครีบระบายความร้อน จะมีสายไฟสีแดงและดำ ไล่สายนี้ไป จะพบว่ามีหัวเสียบกับเมนบอร์ด ให้ถอดหัวนี้ออก
    3. หากเป็นไปได้ให้ถอดครีบระบายความร้อนออกด้วย แต่ขอเตือนก่อนว่าถอดยากมาก
    4. ปิดฝาเครื่อง
    5. ใช้เทปกาวปิดช่องระบายความร้อน
    6. เปิดคอมพิวเตอร์ แล้วเปิดเกม Half-Life 2 หรือโปรแกรมอะไรก็ได้ที่กินแรงซีพียูมากๆ หน่อย
    7. ดูให้แน่ใจว่าไม่ได้เปิดเครื่องปรับอากาศหรือพัดลม
    8. ทิ้งไว้เช่นนั้นสักสองชั่วโมง

     

    ม้วยด้วยหฤหรรษ์

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

    January 16

    เจอกันในงาน vTalks #8

    ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

    vTalks #8

    อ.สุเทพ แสงวิโรจนพัฒน์

    ผมได้รับการทาบทามจาก อ. นเรศ นันทบุรมย์ (ผู้เขียนตำรา ASP.NET 2.0 สนพ Success Media) เพื่อเชิญไปเป็น guest speaker ในงาน vTalks#8 โดย อ. นเรส แจ้งว่า อ. สุเทพ แสงวิโรจนพัฒน์ (Microsoft MVP suthep@greatfriends.biz) จะจัดงานดังนี้

    • ชื่องาน : Greatfriends vTalks #8
    • สถานที่ : อาคารสำนักงานบริษัท Microsoft (Thailand)
    • วันที่ : 27 January 2008
    • ลักษณะงาน : สัมนา พบปะพูดคุยเกี่ยวกับ software development

    งานนี้ฟรีทุกอย่างเพราะไมโครซอฟต์เป็นสปอนเซอร์ ผมจะไปร่วมด้วย จึงขอเรียนเชิญท่านผู้อ่านหนังสือและเว็บ เรียนรู้ด้วยตนเอง OOP C# ASP.NET ไปพบกันในวันและเวลาดังกล่าว (อย่าลืมลงทะเบียนก่อน) ส่วนรายละเอียดหมายกำหนดการกรุณาดูใน Link ต่อไปนี้


    January 09

    นิยายนักสืบตอน 1

    ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

    Hackarmy-A

    เขียนโดย : ลาภลอย วานิชอังกูร laploy@gmail.com

    บทความตีพิมพ์ในนิตยสาร WinMag

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

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

    “พี่สบายดีไหมครับ กิจการตอนนี้เป็นไงบ้าง” ผมถามหยั่งเชิง

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

    คุณชูศักดิ์พูดจบก็ลุกเดินไปหน้าห้อง ร้องบอกเลขาให้เรียกคนชื่อ ใจทิพย์ ผมไม่รูจักคนชื่อ ใจทิพย์ เดาว่าคงเป็นซิสเต็มเอ็ดมิน (system administrator)

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

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

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

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

     

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

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

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

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

     

    clip_image002

    แผนภูมระบบ LAN ของบริษัทยามเดือนเอ็กซ์พอร์ท

    clip_image004

    อุปกรณ์ระบบ LAN ของบริษัทยามเดือนถูกติดตั้งไว้ในโครงเหล็กขนาด 19 นิ้ว

     

    ประเมินสถานการณ์: 10:00 น.

    “ปัญหาเกิดขึ้นเมื่อไหร่ครับ” ผมถามพลางล้วงคอมพิวเตอร์เล็กๆ ในซองหนังเก่าคร่ำคร่าออกมาจากกระเป๋าเสื้อด้วยความเคยชิน

    “เริ่มเป็นเมื่อสองวันก่อนค่ะ” ผมพยักหน้าหงึกๆ แล้วจดบันทึกไว้

    “ที่นี่ต่ออินเตอร์เน็ตแบบไหนครับ”

    “เป็นสายเช่าความเร็ว 4 เม็กของบริษัทสยามเทวะคะ”

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

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

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

     

    การสืบสวน: 10:30น.

    “ผมขอใช้คอมพิวเตอร์เครื่องนี้ได้มั๊ยครับ” ผมชี้ไปที่เครื่องคอมพิวเตอร์ของ admin บนโต๊ะ

    “ได้ค่ะ” หญิงสาวตอบแล้วหลีกทางให้ มันเป็นระบบปฏิบัติการ Windows XP ก่อนอื่นผมต้องการตรวจสอบว่า station นี้เข้าอินเตอร์เน็ตได้หรือไม่ ผมจึงกดเมนู Start/Run แล้วพิมพ์ว่า command กรอบคอมมานด์พร็อมพ์ ปรากฏขึ้นทันที นั้นผมลอง ping เว็บไซต์ google โดยพิมพ์ว่า Ping www.google.com ผลลัพธ์เป็นดังนี้

     

    clip_image006

    คำสั่ง ping บอกให้รู้ว่าคอมพิวเตอร์เครื่องนี้สามารถเข้าถึง server ที่ระบุได้หรือไม่ โดยใช้เวลาเท่าใด

     

    ผลลัพธ์จากการ ping บอกให้รู้ว่าคอมพิวเตอร์เครื่องนี้ต่อกับเครือข่ายอินเตอร์เน็ต ผมพบว่าแม้เพ็กเก็ตที่ส่งและรับจะครบ แต่การทำงานก็ช้าผิดปรกติ ผมอยากจะรู้ว่าต้นเหตุของการช้าเกิดขึ้นที่ router ตัวใดจึงพิมพ์ว่า tracert www.google.com

     

    clip_image008

    คำสั่ง tracert ทำหน้าที่ตรวจสอบว่าการเชื่อมต่อระหว่างคอมพิวเตอร์เครื่องนี้กับ server ต้องผ่าน router กี่จุด แต่ละจุดใช้เวลาเท่าใด

     

    จากข้อมูลของ tracert บอกให้รู้ว่าเส้นทางเชื่อมต่อจากคอมพิวเตอร์เครื่องนี้ไปยังเว็บไซต์ของ google ที่ฮ่องกง ต้องผ่าน routher ทั้งหมด 16 ตัว และตัวการที่ทำให้เกิดความช้าอยู่ในสำนักงานแห่งนี้นี่เอง สิ่งที่ต้องทำต่อไปคือสืบหาว่าอะไรกำลังบริโภค bandwidth อยู่

    “คิดว่าเป็นไงค่ะ” ใจทิพย์ถาม

    “คิดว่าถูกบุกรุกโดยแฮกเกอร์มืดครับ” ผมตอบโดยไม่ละสายตาจากจอภาพ

    “เราโดนแฮกเกอร์บุกหรือค่ะ”

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

    “sniff คืออะไรค่ะ” หญิงสาวถามอย่างประหลาดใจ ผมเงยหน้าขึ้นสบตาหล่อนหล่อน

    “ผมหมายถึงวิ่งโปรแกรมเพื่อสแกนตรวจสอบเครือข่ายครับ”

    “ไม่เคยเลยค่ะ”

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

    หลังจากตรวจดูใน Programs ผมพบโปรแกรม CommView เป็นโปรแกรมแบบ sniffer ที่มีประสิทธิภาพดีและใช้งานได้ง่ายตัวหนึ่ง ผมจึงกดที่ไอคอนด้วยความโล่งใจ

     

    clip_image010

    โปรแกรม CommView เป็นโปรแกรมประเภท sniffer ที่มีประสิทธิภาพสูงและใช้งานได้ง่าย (ใบอนุญาตเป็นแบบเพื่อใช้ในชิงพาณิชย์)

     

    สิ่งที่ CommView แสดง ไม่ใช่เฉพาะแพ็กเก็ตระหว่างคอมพิวเตอร์เครื่องนี้กับเครือข่ายเท่านั้น แต่เป็นจากทุกๆ node ในวง LAN นี้ ผมกวาดสายตาดูปราดเดียวก็พบผู้ต้องสงสัยทันที เพราะมีการรับ-ส่ง แพ็กเก็ต มากผิดปรกติที่ IP 192.168.1.666

    “คนนี้เป็นใครครับ” ผมชี้บนจอ ใจทิพย์หยิบสมุดบันทึกขึ้นมาพลิกดู

    “โลจิสติกค่ะ ชื่อคุณพรหมา”

    “ผมคิดว่าเราควรจะไปเยี่ยมแผนกโลจิสติกกันหน่อยแล้วละครับ”

     

    ผู้ต้องสงสัย: 11:15 น.

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

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

    “อ๊ะ!..ทำไมล่ะครับ” พรหมาอึกอัก

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

    “เปล่า”

    “เปิดทีวีหรือวิทยุในอินเตอร์เน็ตหรือเปล่า”

    “เปล่า”

    “กำลังอัพโหลดหรือดาวน์โหลดไฟล์ขนาดใหญ่อยู่หรือเปล่า”

    “เปล่า”

    “โหลดบิตหรือทำ P2P อื่นๆ เช่นกาสาหรือเปล่า”

    “เปล่าๆ ไม่มีๆ ไม่ได้มีอะไรเกี่ยวกับอินเตอร์เน็ตเลย ผมกำลังทำรายงานใช้โปรแกรม Excel อยู่” พรหมากล่าวอย่างละล้ำละลัก

    ผมมองจ้องตา ชายผู้นี้พูดจริง นี่คงเป็นเพียงเหยื่อผู้เผลอไผล ผมเสียบ USP ไดร์ฟขนาดจิ๋วแล้วติดตั้งโปรแกรมเพื่อสแกนคอมพิวเตอร์ของเขา โดยมีใจทิพย์และพรหมายืนดูอย่างใจจรดใจจ่อ ครู่หนึ่งก็มีรายชื่อไวรัส addware หนอน และโทรจันปรากฏขึ้น ส่วนใหญ่แล้วเป็นพวกที่พบได้ทั่วไปและไม่มีอันตรายมากนัก แต่ทันใดนั้นสายตาของผมไปสะดุดอยู่ที่ชื่อๆ หนึ่ง “Hackarmy-A”

    นิ้วมือเร็วเท่าความคิด ผมกดปุ่ม Ctrl-Alt-Del เพื่อเรียก task manager พร้อมกับภาวนาให้สิ่งที่กลัวไม่เป็นความจริง แต่เมื่อไล่สายตาดูในคอลัมน์ Image Name ก็พบชื่อที่ทำให้หัวใจของผมเต้นผิดจังหวะไปวูบหนึ่ง “Win32server.exe” เป็นอย่างที่คาดไว้จริงๆ Hackarmy-A คือโปรแกรมประเภทม้าไม้โทรจัน มันช่วยให้แฮกเกอร์มืดใส่ back door ไว้ในเครื่องของผู้ถูกบุกรุก ขณะนี้แฮกเกอร์มืดสามารถส่งคำสั่งควบคุมการทำงานของคอมพิวเตอร์เครื่องนี้ผ่านโปรโตคอล IRC ได้เลย

    ผมมองภาพทีมยูไนเต็ดอย่างครุ่นคิด back door ก็เป็นอีกเรื่องหนึ่ง แต่สิ่งที่ต้องทำอย่างแรกคือค้นหาว่าแฮกเกอร์มืดใช้โปรแกรมอะไรเพื่อสูบ bandwidth แล้วกำจัดโปรแกรมนั้นเสีย อย่างที่สองคือค้นหาวิธีที่ที่แฮกเกอร์มืดนำ back door มาใส่ไว้ แล้วอุดช่องทางนั้น ผมไล่ดูรายชื่อในคอลัมน์ Image Name อีกครั้งก็พบชื่อที่ไม่ควรอยู่ที่นั่น “FTPserv.exe” พนักงานแผนกโลจิสติก ไม่น่าจะมีความจำเป็นต้องใช้โปรแกรม FTP server นี่ต้องเป็นฝีมือของแฮกเกอร์มืดอย่างแน่นอน

    ผมไล่หาที่ตั้งของโปรแกรม FTP server เมื่อพบแล้วจึงเปิด log file เพื่อตรวจสอบว่ามีการรับ-ส่งไฟล์อะไรจากไหนไปไหนบ้างหรือไม่ ก็พบว่าเป็นอย่างที่คาดไว้ คือมีการรับ-ส่งไฟล์ .zip จำนวนมาก ระหว่าง IP 192.168.10.2 ซึ่งเป็น IP ภายในกับ IP นอกระบบ LAN จำนวนหลายสิบ IP กิน bandwidth ประมาณร้อยละเจ็ดสิบ ทั้งหมดนี้เริ่มขึ้นเมื่อสามวันก่อน นี่คือต้นเหตุที่ทำให้การสื่อสารอืดลงไปทั้งระบบ

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

    “file server ค่ะ”

    “ดูเหมือนว่า...” คำพูดของผมหายไปเฉยๆ จนต้องกลืนน้ำลายแล้วกระแอมก่อนจะพูดต่อไปว่า “file server ของคุณได้กลายเป็นแหล่งเผยแพร่ซอฟท์แวร์เถื่อนไปแล้วนะครับ”

     

    เหยื่อ: 13:20 น.

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

    “แฮกเกอร์มืดเข้ามาสร้างโฟลเดอร์พวกนี้ได้ยังไงคะ ทั้งๆ ที่ file server มี firewall และระบบรักษาความปลอดภัยอย่างดี” ใจทิพย์ถามขณะหย่อนตัวลงข้างๆ ผมในห้องชงกาแฟ

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

    “แล้วเราควรจะทำอะไรต่อไปดีค่ะ”

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

    “หาต้นเหตุโดยการทำยังไงคะ”

    “เราต้องไปคุยกับพรหมาอีกรอบ”

    ครู่ต่อมาผมก็พบว่าตนเองกำลังนั่งสอบปากคำพรหมาอยู่ในคอกของเขา

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

    “ผมก็พยายามคิดแล้ว แต่นึกไม่ออก” เขาส่ายศีรษะ

    “ยูไนเต็ดเตะกับอีซีมิลานเมื่อวานนี้สนุกดีนะครับ” ผมเปลี่ยนเรื่องเพื่อลดความตึงเครียดพลางมองภาพนักเตะในโปสเตอร์

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

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

     

    ปิดคดี: 15:20 น.

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

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

    “มีทางเป็นไปได้มั๊ยค่ะที่เราจะโดนโจมตีจากแฮกเกอร์อีก” หญิงสาวถาม

    “แฮกเกอร์มืดครับ เป็นไปได้อย่างแน่นอน ไม่มีวิธีไหนที่จะป้องกันได้ร้อยเปอร์เซ็นต์หรอกครับ” ผมตอบตามตรง

    “วิธีป้องกันที่ดีที่สุดคืออะไรครับ เราควรห้ามพนักงานเปิดวีดิโอหรือโหลดบิตไหม” ชูจิตถาม

    “ไม่ประโยชน์ที่จะทำแบบนั้นหรอกครับ วิธีป้องกันที่ดีที่สุดคือ patch ซอฟท์แวร์บ่อยๆ ทั้งด้าน server และ client ดูให้แน่ว่า firewall ถูกตั้งค่าไว้อย่างเหมาะสมในทุกๆ เครื่อง สแกนพอร์ตต่างๆ ถ้าพอร์ตไหนไม่ได้ใช้ให้ปิดไปให้หมด”

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

    “อย่าลืม sniff บ่อยๆ และหวังว่าเราคงไม่ต้องเจอกันอีกนะครับ” ขณะที่ประตูลิฟต์กำลังปิด ผมเห็นใจทิพย์ทำหน้าฉงน แต่แล้วก็เปลี่ยนเป็นอมยิ้ม

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

    January 02

    น้อมรำลึกถึงพระพี่นางฯ

    ร่วมไว้ทุกข์กับคนไทยทั้งชาติ

    king_sister03_181

    สมเด็จพระเจ้าพี่นางเธอ เจ้าฟ้ากัลยาณิวัฒนา กรมหลวงนราธิวาสราชนครินทร์ ประสูติ 6 พฤษภาคม พ.ศ. 2466 ณ เมืองเอดินเบอระ แคว้นสก็อตแลนด์ สิ้นพระชนม์ 2 มกราคม พ.ศ. 2551 ณ กรุงเทพมหานคร สิริพระชันษา 84 ปี ทรงเป็นสมเด็จพระเจ้าพี่นางเธอใน พระบาทสมเด็จพระเจ้าอยู่หัวอานันทมหิดล และ พระบาทสมเด็จพระปรมินทรมหาภูมิพลอดุลยเดช