วันศุกร์ที่ 27 สิงหาคม พ.ศ. 2553

[VB.NET Tips] AddHandler ,Addressof

ช่วยยกตัวอย่าง AddHandler ,Addressof ให้หน่อยนะครับผู้รู้ งงมานานแล้ว ว่าใช้ทำอะไร

AddHandler ใช้ในการ "ผูก" อีเว้นต์ของอ๊อบเจ็กต์ กับ procedure ที่ใช้เป็น "event handler"
นอกจาก AddHandler แล้ว ยังมี RemoveHandler ด้วยนะครับ

ตัวอย่างเช่น
[codevb]AddHandler Button2.Click, AddressOf Button1_Click[/codevb]
ทำให้เมื่อคลิก Button2 จะไปทำงานที่ Sub Button1_Click ด้วย
(สมมุติว่าคุณมี Sub procedure ดังกล่าวอยู่แล้ว)

AddressOf เป็นคีย์เวิร์ดที่ให้ค่า reference ของ procedure ครับ
ใช้ในหลายเรื่อง นอกจากใช้กับประโยค AddHandler และ RemoveHandler แล้ว
ยังใช้มากในเรื่องเกี่ยวกับ Threading และ Asynchronous ด้วยครับ

reference : http://greatfriends.biz/webboards/msg.asp?id=11972

วันพฤหัสบดีที่ 26 สิงหาคม พ.ศ. 2553

[OOP] ความแตกต่างระหว่าง interface กับ abstract class

ผมเข้า ใจว่าเจ้าของกระทู้ต้องการทราบความแตกต่างระหว่าง interface กับ abstract class และวิธีการเลือกใช้ให้ถูกต้องเหมาะสมใช่มั้ยครับ (สังเกตจาก คห.3 กับ คห.6)
เท่าที่อ่านดูยังพบว่ามีคนเข้าใจผิดเรื่องความแตกต่างระหว่าง interface กับ abstract base class อยู่
อันที่จริงเรื่องนี้มีคนสงสัยและสับสนกันเยอะครับ และก็ไม่แปลกที่จะสับสน เพราะหากดูในเชิง technical แล้วทั้งสองอย่างมันมีการทำงานที่แทบจะเหมือนกัน แต่หากดูในเชิง conceptual แล้ว สองอย่างนั้นมีการใช้งานและแนวคิดที่แตกต่างกันโดยสิ้นเชิง
ก่อนหน้านี้ก็เคยมีกระทู้ที่ถามแบบเดียวกันนี้มาแล้วครับ แต่มันก็นานมากแล้ว (ถ้าจำไม่ผิดจะอยู่ในหมวด Java) ซึ่งก็ไม่แปลกหากจะมีคนตั้งกระทู้ขึ้นมาถามซ้ำอีก เพราะด้วยระบบ searching ที่ดีเยี่ยมของบอร์ด pantip นี้ ให้คุณ search หาให้ตายยังไงก็ไม่พบหรอกครับ เพราะงั้น knowledge base ที่ท่านๆในยุคก่อนๆได้ตอบไว้ทั้งหลายจึงหายหมด
ผมไม่ถนัด .net นะครับ เพราะงั้นผมจึงไม่สามารถให้ตัวอย่างที่เป็นภาษาตระกูล .net ได้ แต่อันที่จริงเรื่องนี้มันเป็นเรื่อง concept OOP ล้วนๆ เพราะงั้นมันไม่เกี่ยวกับตัวภาษาอยู่แล้ว (ไม่รู้ภาษา OOP อะไรเลยซักอย่าง ยังสามารถเข้าใจได้)
เข้าเรื่องดีกว่าคับ...
สำหรับในเชิง technical แล้ว interface กับ abstract class ดูเหมือนแทบจะมีการทำงานที่เหมือนกันทีเดียวครับ อธิบายได้ดังนี้
- interface ประกอบไปด้วย abstract method เท่านั้น no state, no value, no implementation
- abstract class เป็นคลาสที่มี abstract method อย่างน้อยหนึ่งเมธอด และส่วนใหญ่จะมี concrete method (เมธอดที่มีส่วน implementation แล้ว) ด้วยก็ได้ นอกจากนั้น abstract class ยังสามารถมี state (พวก attribute หรือ instance variable ต่างๆ) ได้ด้วย
- concrete class ใดๆที่ได้ inherit จาก abstract class หรือได้ implement interface ใดๆไป ก็ย่อมต้อง implement พวก abstract method เหล่านั้นให้ครบถ้วนสมบูรณ์ จึงจะถือว่า class นั้นเป็น concrete class และสามารถสร้าง instance จาก class นั้นได้
- class ใดๆก็ตามจะสามารถ inherit จาก abstract class ได้เพียงหนึ่งเท่านั้น แต่จะสามารถ implement interface ได้มากกว่าหนึ่ง (เคยสงสัยมั้ยครับว่าเพราะอะไร นี่แหล่ะครับที่เป็นส่วนหนึ่งที่ทำให้ concept ในการใช้งานระหว่าง interface กับ abstract class แตกต่างกันโดยสิ้นเชิง)
ฟังดูเหมือนว่าไม่แตกต่างกัน ฟังดูเหมือนว่าทั้งสองอันนำมาใช้แทนกันได้ และดูเหมือนว่า interface มันก็คือ abstract class ที่มีแต่ abstract method และไม่มี instance variable ใดๆเลย ซึ่งก็ใช่ครับ ในภาษา OOP ยุคเก่าๆบางภาษา เช่น C++ นั้น ไม่มี interface ให้ใช้งานหรอกครับ ไม่มีแม้กระทั่ง keyword interface เลยด้วยซ้ำ (ไม่เหมือนกับภาษา Java หรือ VB.net ที่สนับสนุน interface มาตั้งแต่แรกดั้งเดิมในตัวภาษาเลย) แต่โปรแกรมเมอร์ภาษา C++ ก็ยังสามารถใช้ประโยชน์ในเรื่อง interface ได้ ก็ด้วยการใช้ abstract class ที่มีแต่ abstract method นี่ยังไงหล่ะครับ
ทั้งหมดนั้นคือเชิง technical ครับ ทีนี้มาถึงจุดสำคัญแล้วครับ เรื่องของ concept ที่ทำให้การใช้งาน interface และ abstract method แตกต่างกัน ต้องขอออกตัวไว้ก่อนว่า ผมอธิบายใครไม่ค่อยเป็นเท่าไร ยิ่งเป็นเรื่อง concept เนี่ยก็รู้ๆกันอยู่คับว่ามันเข้าใจยาก ถ้าหากใครอ่านจบแล้ว ทำหน้างงๆ ไม่เข้าใจที่ผมอธิบาย ผมก็ต้องขออภัยไว้ ณ ที่นี้ด้วยครับ
interface ถ้าแปลกันตรงๆก็อาจจะหมายความว่า "การติดต่อประสาน" ในโลกของความเป็นจริง (และในโลกของ OO) คุณจะพบ interface ได้มากมายในชีวิตประจำวันครับ ยกตัวอย่างเช่น
- คุณกับผม คุยกันรู้เรื่อง เพราะอะไร? เพราะเรามี interface เรื่องภาษาที่ตรงกัน สมมติว่าเป็น interface IThaiLang ก็แล้วกัน คุณกับผมต่างก็เข้าใจ IThaiLang นี้เหมือนกัน (มองในมุมโปรแกรมมิ่งก็คือ คุณกับผมต่างก็ implement IThaiLang นี้เหมือนกัน) แน่นอนย่อมต้องคุยกันรู้เรื่อง ผมเดินๆไปไปเจอฝรั่งจ๋าคนนึง เผอิญฝรั่งจ๋าคนนั้นพูดไทยไม่ได้ (ไม่ได้ implement IThaiLang นะสิ) แน่นอนผมกับฝรั่งจ๋าคนนั้นก็สื่อสารกันไม่ได้ เพราะไม่เข้าใจ interface ที่ตรงกัน
- รถยนต์ทุกคันต่างก็หยุดจอดที่สี่แยกเมื่อเห็นสัญญาณไฟแดง เพราะอะไร? เพราะรถยนต์คันนั้น (อันที่จริงคือคนขับรถยนต์คนนั้น) เข้าใจว่า สัญญาณไฟสีแดง หมายถึง ให้หยุดรถ นั่นแสดงว่า รถยนต์มีความเข้าใจที่ตรงกันกับป้ายสัญญาณไฟจราจรหรือสามารถติดต่อสื่อสาร กันได้ สมมติว่ารถยนต์คันใดก็ตามที่จะเข้าใจสัญญาณไฟจราจรได้จะต้องเข้าใจ interface ITrafficLight (หรือ implement ITrafficLight นั่นเอง) ทีนี้เมื่อรถยนต์ต่างๆวิ่งมาถึงสี่แยกที่มีป้ายสัญญาณไฟจราจรอยู่ ป้ายสัญญาณไฟจราจรเหล่านั้นก็จะส่ง message ไปบอกรถยนต์ต่างๆว่าตอนนี้ไฟจราจรเป็นสีอะไร message ที่ส่งไปนี้ส่งไปโดยใช้ interface ITrafficLight เพราะฉะนั้นรถยนต์คันใดก็ตามที่ implement ITrafficLight นี้ก็จะเข้าใจและหยุดรถเมื่อเห็นสัญญาณไฟสีแดง ในทางกลับกันหากรถยนต์คันไดที่ไม่ได้ implement ITrafficLight นี้ ก็ย่อมจะไม่เข้าใจใน message ที่ส่งมา และแน่นอนย่อมส่งผลให้ขับฝ่าไปแดงไปและถูกหมาต๋าซิวไปในที่สุด
- เมื่อเข้าหน้าหนาว(เหมือนอย่างตอนนี้) อากาศจะหนาว อุณหภูมิจะลดลง ร่างกายคุณย่อมจะรู้สึกว่าหนาว ขนลุก ตัวสั่น เป็นเวลาเดียวกันกับที่ สารปรอทในเทอร์โมมิเตอร์หดตัวลง เพราะอะไร? แน่นอนเพราะคุณและสารปรอทต่างก็เข้าใจว่าอุณหภูมิมันลดลง สมมติว่าออปเจคต์ใดก็ตามที่จะเข้าใจได้ว่าอุณหภูมิลดลงจะต้อง implement ITemperature แสดงว่าทั้งคุณและปรอทในเทอร์โมมิเตอร์ต่างก็ implement ITemperature นี้เหมือนๆกัน และที่คุณและปรอทรู้ว่าอุณหภูมิได้ลดลงแล้วก็เพราะว่าออปเจคต์ Weather ได้ส่ง message มาบอกคุณและปรอทผ่านทาง interface ITemperature นี้เอง ซึ่งคุณและปรอทต่างก็เข้าใจมันได้ดี แต่จะตอบสนองต่อ message นี้อย่างไรก็ขึ้นอยู่กับออปเจคต์มันเอง เช่น คุณอาจตอบสนองโดยการ ตัวสั่น ปากซีด ขนลุก แต่อีกทางหนึ่ง ปรอทตอบสนองต่อ message นี้ด้วยการหดตัว พันธะระหว่างอะตอมแน่นหนาขึ้น ระยะพันธะหนสั้นลง เป็นต้น
จากตัวอย่างทั้งหมดนี้ คุณสังเกตเห็นอะไร
- ออปเจคต์หนึ่งๆอาจถูกสร้างขึ้นมาเพื่อให้สามารถติดต่อสื่อสารกับออปเจคต์ใดๆโดยผ่านทาง interface หนึ่งๆ
(ออปเจคต์คนไทยคนหนึ่งติดต่อสื่อสารกับออปเจคต์คนไทยอีกคนหนึ่งโดยผ่าน interface IThaiLang)
(ออปเจคต์รถยนต์สามารถเข้าใจ message จากป้ายสัญญาณไฟจราจรได้ผ่านทาง ITrafficLight)
จากที่คุณสังเกตเห็น คุณคงจะพอมองออกแล้วว่า interface เหมือนเป็นข้อตกลง (protocol) เพื่อให้ออปเจคต์สามารถติดต่อสื่อสารกันได้ interface บอกถึงลักษณะของช่องทางการสื่อสารว่ามีมาตรฐานเป็นอย่างไร ในเชิงของโปรแกรมมิ่ง interface อาจจะเป็นข้อตกลงที่บอกถึงลักษณะของ message ที่ออปเจคต์จะได้รับหรือส่งไป หรือลึกกว่านั้นก็คือ บอกถึงว่า message ที่จะรับหรือส่งนั้นมี parameter เป็นอย่างไร data type ไหน return ค่าอะไร เป็นต้น
นอกจากนั้นคุณจะสังเกตเห็นว่า ออปเจคต์ที่ implement interface หนึ่งๆ ไม่ได้หมายความถึงความสัมพันธ์แบบ IS-A เฉกเช่นการสืบทอดแบบ inheritance ทั่วๆไป เช่นคุณบอกไม่ได้ว่า "ออปเจคต์คนไทย is a IThaiLang" หรือ "ออปเจคต์รถยนต์ is a ITrafficLight" หรือ "ออปเจคต์ปรอท is a ITemperature" เป็นต้น ต่างจากการสืบทอดแบบ inheritance ทั่วไป เช่นใน คห.7 ซึ่งคุณจะบอกได้โดยสามัญสำนึกว่า "ออปเจคต์ Men is a Person" หรือ "ออปเจคต์ Women is a Person"
และในเมื่อความสัมพันธ์ไม่ได้เป็น IS-A เหมือนอย่าง classical inheritance เพราะฉะนั้นคนส่วนใหญ่มักจะไม่ใช้คำว่า inherit from interface แต่จะใช้ว่า implement interface มากกว่า เมื่อคลาส A เข้าใจใน interface I เราจะเรียกว่า "class A implement interface I" ไม่ใช่ "class A inherit from interface I" และหากคุณสังเกตตั้งแต่ต้น ผมจะใช้คำว่า implement กับ interface เท่านั้น ซึ่งนี่คือเหตุผล
นอกจากนั้นคุณจะพบว่าออปเจคต์ใดๆอาจจะ implement interface ได้มากกว่าหนึ่ง ซึ่งแน่นอนว่ามันควรจะเป็นอย่างนั้น เพราะออปเจคต์อาจจะต้องติดต่อสื่อสารกับออปเจคต์ภายนอกได้มากมายอยู่แล้ว เพราะฉะนั้นการมี interface ไว้ติดต่อสื่อสารกับภายนอกมากกว่าหนึ่งจึงไม่ใช่เรื่องแปลก กลับกันในภาษาที่ไม่นิยม multiple inheritance คุณจะพบว่าคุณไม่สามารถ inherit จาก abstract class ได้มากกว่าหนึ่ง เพราะมันผิดกฏตัวภาษา (ก็ภาษามันไม่นิยม multiple inheritance นี่นา)
ทั้งหมดคือเรื่องของ interface (อันที่จริงผมควรจะอธิบายเรื่อง abstract class ก่อน interface นะ) ทีนี้ในเรื่องของ abstract class เนี่ยผมเข้าใจว่าคุณคงจะพอเข้าใจบ้างอยู่แล้ว (อันที่จริงเริ่มขี้เกียจพิมพ์แล้ว ฮา~)
abstract class ก็คือ class (ไม่ได้กวนนะ) เพราะฉะนั้นสิ่งที่คุณรู้เกี่ยวกับเรื่อง class inheritance ทั่วๆไป ก็ไม่แตกต่างกับการ inheritance จาก abstract class
คร่าวๆก็คือ abstract class คือคลาสที่คุณยังไม่รู้หรือยังไม่แน่ใจว่างานบางอย่างจะต้อง implement ยังไง ซึ่งคุณก็จะปล่อยให้ method เหล่านั้นเป็น abstract ไป และปล่อยให้คลาสลูกไป implement กันเอาเอง การที่คุณจะ inherit จาก abstract class อะไร คุณควรจะต้องนึกถึงความสัมพันธ์แบบ IS-A ด้วย อย่า inherit มั่วๆ เพราะจะทำให้โครงสร้างมันเสีย ส่วนใหญ่ abstract class มักจะเกิดจากการที่คุณสร้างๆ(หรือออกแบบ)คลาสไปแล้วสังเกตเห็นถึงความ สัมพันธ์ระหว่างสองคลาสหรือมากกว่าว่ามีบางอย่างที่เหมือนๆกัน มี method เดียวกัน (แต่อาจจะ implement ไม่เหมือนกัน) คุณก็จะดึงพวกที่เหมือนๆกันเหล่านั้นขึ้นไปเป็น abstract class และปล่อยให้บาง method เป็น abstract ไป แต่อันที่จริงการทำแบบนี้มันไม่ดีแน่นอน สิ่งที่คุณควรทำก็คือ ออกแบบระบบทั้งหมดให้ดีก่อนตั้งแต่ต้น พยายามนึกถึง top-down design คุณคิดว่าในระบบของคุณจะต้องมีคลาสอะไรบ้าง แล้วคลาสอะไรที่พอจะจับเป็นหมวดหมู่เดียวกันได้ ก็สร้างเป็น base class ไป พยายามจัดหมวดหมู่ให้มากที่สุดเท่าที่จะทำได้ base class บางอันของคุณที่ได้อาจจะแค่เป็นต้นแบบให้กับคลาสลูกอื่นๆก็ไม่เป็นไร method ไหนของ base class ที่ no idea to implement ณ จุดนั้นก็ปล่อยเป็น abstract ไป แล้วปล่อยให้เหมือนกับเป็นการบังคับว่าคลาสใดที่จะมาเป็นลูกคลาสนี้จะต้อง make sense กับ method พวกนั้นด้วยเท่านั้นเอง (รู้สึกจะคร่าวๆเกินไป แต่คิดว่าคงเข้าใจดีอยู่แล้วนะครับ)
>คำถามที่คาใจคือ คลาสบัญชีของผมนี้
>ผมควรมี interface สำหรับการ ฝาก-ถอน
>หรือ
>ผมควรทำเป็น abstract method ?
สำหรับคำตอบของ คห.6 นั้น ไม่มีใครรู้ดีเท่าคุณ เพราะคุณย่อมรู้จักระบบของคุณเองดีที่สุด แต่ผู้อื่นคงได้แต่แนะนำเท่านั้น
สมมติ scenario ที่เป็นไปได้อันหนึ่ง
มี interface ชื่อ ITransaction
ซึ่งมีเฉพาะเมธอด "ฝาก" กับ "ถอน" เท่านั้น
มี abstract class ชื่อ Account ซึ่ง implement ITransaction
ซึ่งมีเมธอดอื่นๆเพิ่มเติมจาก "ฝาก" กับ "ถอน" บางเมธอดอาจจะเป็น concrete บางเมธอดอาจจะเป็น abstract
มีคลาส SavingAccount กับ LoanAccount สืบทอดจาก Account
ซึ่งทุกเมธอดที่สืบทอดมาจะมีการ implement ให้เป็น concrete หมด
อนาคตอาจมีออปเจคต์อื่นๆเพิ่มเติม ซึ่งอาจจะ implement ITransaction ด้วยก็ได้ (เช่นออปเจคต์ตู้ ATM หรือออปเจคต์พนักงานประจำสาขา ฯลฯ)
อนาคตไปอีก อาจมีออปเจคต์เพิ่มเติมที่สามารถไปทำรายการ "ฝาก" "ถอน" ได้ (เช่นออปเจคต์ Computer, ออปเจคต์ Person หรือออปเจคต์ Robot ฯลฯ) ก็ให้ออปเจคต์พวกนั้นติดต่อผ่านทาง ITransaction กับออปเจคต์ Account, ออปเจคต์ตู้ ATM, ออปเจคต์พนักงานประจำสาขา หรือออปเจคต์อะไรก็ได้ที่เข้าใจใน interface ITransaction
จากคุณ : BlueBlood - [ 20 ธ.ค. 48 12:32:59 ] www.pantip.com

วันพุธที่ 25 สิงหาคม พ.ศ. 2553

[SQL] เกี่ยวกับ UNION

พอดีวันนี้งง ว่าทำไม UNION แล้ว record หายวะ -*-? ขอมาเมมไว้ใน blog หน่อยละกัน

environment ที่ลองคือ SQL Server 2005

สรุปคือ UNION นั้น จะมีการ Distinct ข้อมูลซ้ำออกไปด้วยโดยอัตโนมัติ

ถ้าไม่ต้องการให้ลบข้อมูลซ้ำออกไป ให้เพิ่มคำว่า ALL ตามท้าย
เช่น
UNION ALL

[VB.NET Tips] ผูก Enum ใดๆ ไปกับ Combo Box

Bind a Combo Box to an Enumeration in Visual Studio .NET

Provided by: Jim Ferguson, Project Manager

An enumeration is a related set of constants. The enumeration members between the Enum and End Enum statements are initialized to constant values. Enumeration is used to group a set of constants under a common name, so the value can be referred to by a string value rather than the numeric value. For example, this enumeration provides a list of constants for the provided names:

Private Enum PeopleNames

bob

mary

jane

joe

fred

End Enum

By default, the first enumerator has a value of 0, and each successive enumerator is one larger than the value of the previous one, unless you explicitly specify a value for a particular enumerator. The value for "bob" is 0, "mary" is 1, and so on to "fred" which is 4.

It is possible to bind a combo box or a list box to the values in the enumeration so that the values in the dropdown list are the string names, but the underlying constant values can be retrieved from the selected item. The Enum class provides a static method called "GetValues" which returns an array of all items in the enumeration. You can bind a combo box to this enumeration with code such as the following:

Me.ComboBox1.DataSource = _

System.Enum.GetValues(GetType(PeopleNames))

The argument to GetValues is a type value for the enumeration you wish to retrieve. GetType returns a type object based on the name of the enumeration. Change this value to the name of the enum you are interested in.

After this line of code executes the list portion of the combo box contains the names "bob", "mary", "jane" etc. If you just want to know which name was selected you can use the .SelectedText property of the combobox. However if you want to know the constant value associated with the name, you need to use the .SelectedValue property (which is a generic object) and cast it to the type of enum you are interested in. In this example:

Dim nameid As PeopleNames = CType(ComboBox1.SelectedValue, PeopleNames)

The variable "nameid" contains a 0, or 1, or 2 etc. depending on the value of the enumerated item that is currently selected.


Reference : http://www.fmsinc.com/free/NewTips/NET/NETtip4.asp

วันศุกร์ที่ 20 สิงหาคม พ.ศ. 2553

[โจทย์ SQL] Selecting the one maximum row from each group

Target : Show minimum price of each group variety

Database
+--------+------------+-------+
| type | variety | price |
+--------+------------+-------+
| apple | gala | 2.79 |
| apple | fuji | 0.24 |
| apple | limbertwig | 2.87 |
| orange | valencia | 3.59 |
| orange | navel | 9.36 |
| pear | bradford | 6.05 |
| pear | bartlett | 2.14 |
| cherry | bing | 2.55 |
| cherry | chelan | 6.33 |
+--------+------------+-------+

Result
+--------+----------+-------+
| type | variety | price |
+--------+----------+-------+
| apple | fuji | 0.24 |
| orange | valencia | 3.59 |
| pear | bartlett | 2.14 |
| cherry | bing | 2.55 |
+--------+----------+-------+

====================================================
Solution1
select f.type, f.variety, f.price
from (
select type, min(price) as minprice
from fruits group by type
) as x inner join fruits as f on f.type = x.type and f.price = x.minprice;

Reference : http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

วันพุธที่ 18 สิงหาคม พ.ศ. 2553

[SQL] EXISTS กับ IN ต่างกันอย่างไร

2 keyword นี้ เวลาเีขียน SQL มันก็หน้าตาคล้ายๆกันนี่นา (มี query นอก และมี sub query ใน)
ต่างกันยังไง?

EXISTS
ใช้เทียบว่า sub query นั้น มี record บ้างหรือไม่ (ไม่สนใจว่า value คืออะไร)
ถ้ามี เป็น TRUE

IN
ใช้เทียบว่าค่าที่ return จาก sub query นั้นเทียบกับ query นอก ตรงกันหรือไม่
ถ้าตรงกัน เป็น TRUE โดยเทียบทุก value

ความเห็น :
จริงๆแล้ว เป้าหมายของ 2 keyword นี้ต่างกัน แต่หากเราจะนำมาใช้เขียนเพื่อหาผลลัพท์เดียวกัน
มันก็ทำได้
แต่เท่าที่ศึกษามา ถ้าเป็นไปได้ ให้เลี่ยงการใช้ IN ซะ เพราะช้า ให้ใช้ EXISTS แทนครับ

วันพฤหัสบดีที่ 12 สิงหาคม พ.ศ. 2553

Data rate units

Data rate units
ในระบบ telecommunication นั้น ความสามารถในการส่งข้อมูลระหว่างอุปกรณ์ต่างๆ จะเทียบในรูปของ bits
ดังนั้น เราจึงมักจะได้ยินคำว่า "bit per second" หรือ bps

แล้ว bps หรือ mbps ที่เราเห็นกันประจำ ตอนจะเลือกใช้ package internet ซักอัน มันแปลว่าอะไร
ก่อนอื่น ต้องรู้ก่อนว่า bit กับ byte สัมพันธ์กันอย่างไร

8 bit = 1 byte
k = 1000
m = 1000 x 1000

ตัวอย่าง
1) โมเด็ม 56 k (kbps) โหลดได้ 56 x 1000 = 56000 bit ต่อวินาที
เป็น byte = 56000 / 8 = 7000 byte ต่อวินาที หรือ 7 kbytes / s
2) ADSL ยุคแรก 256 k (kbps) โหลดได้ 256 x 1000 = 256000 bit ต่อวินาที
เป็น byte = 256000 / 8 = 32000 byte ต่อวินาที หรือ 32 kbytes / s
3) ADSL สมัยนี้(วันที่ 13/08/2010) 6 เมก (mbps) โหลดได้ 6 x 1000 x 1000 = 6000000 bit ต่อวินาที
เป็น byte = 6000000 / 8 = 857,142.85 byte ต่อวินาที หรือ 857 kbytes /s หรือ วินาทีละ 0.8 mbytes /s -*- (วิละเกือบเมก)

จบครับ