การใข้ Header Files ของ Standard C++

หมายเหตุ

  • บทความนี้เขียนครั้งแรกใน blog วิชา 517211 Programming Languages และเอามาลงใหม่ที่นี่อีกที
  • บทความนี้เกี่ยวข้องกับ Standard Library Headers ของ C/C++ เท่านั้น ไม่เกี่ยวข้องกับ Non-standard Library (เช่น conio.h หรือว่า library อื่นๆ ที่ download มาใช้เอง เช่นพวก image processing หรือว่า XML แต่อย่างใด)

ใน C++ (ตั้งแต่ C++98) เนี่ย header มันเปลี่ยนจาก .h เป็นไม่มี .h แทน เช่น iostream.h ก็เป็น iostream นอกจากนี้แล้วยังมีอีกเรื่อง คือ headers ทั้งหลายที่มาจาก C ซึ่งเปลี่ยนจาก .h เป็นใช้ c นำหน้า เช่น stdio.h เป็น cstdio แทน

โดยทุกอย่างที่อยู่ใน C++ standard library นี้จะอยู่ใน namespace ที่ชื่อ std ซึ่ง namespace ก็คือ ที่สำหรับเก็บชื่อ ว่่าชื่อนี้เป็นของอะไร เช่น std::cin คือ cin ที่อยู่ใน std เป็นต้น

ทีนี้ก็เลยกลายเป็นสาเหตุเล็กๆ น้อยๆ ที่เราควรจะสนใจและใช้ header ให้มันถูกต้องเสียที เวลาที่เขียน C++

  • ความเก่าและใหม่ เพราะว่า C++ บาง implementation ยังคงเก็บ .h headers ไว้เพื่อให้ compatible กับ code เก่าเท่านั้น (คือให้ code เก่าที่เคยเขียนมาสมัย pre-standard ยังคง compile ได้เท่านั้น) จะไม่มีการ update ให้ใช้ความสามารถใหม่ๆ ได้แต่อย่างใด

    ลองคิดว่าเป็นอารมณ์เดียวกับที่ Microsoft เลิก update Windows 98 ไปนานแล้ว …. แต่ว่าคุณยังเก็บ Win98 อยู่ เพราะว่ายังมีบางโปรแกรมที่ยังคงใช้มันอยู่ และใช้บน XP ไม่ได้น่ะแหละ

  • namespace พูดเป็นเล่นครับ นี่เรื่องใหญ่กว่าที่หลายๆ คนคิด ใครที่เคยเขียน C/C++ จะเข้าใจดี เรื่องความซ้ำกันของชื่อฟังค์ชัน หรือว่าชื่อ constant ต่างๆ เป็นปัญหาหลัก เนื่องจากว่ามันมีซ้ำไม่ได้เด็ดขาด (ห้ามประกาศซ้ำ ในหนึ่งโปรแกรม) สมมติว่าผมใช้ library บางตัว และมี function ที่ชื่อซ้ำกับ standard library หรือว่าซ้ำกันเองระหว่าง library อื่นๆ นี่จบกันเลย ต้องแก้โน่นแก้นี่เยอะมาก

    ทีนี้เป็นเรื่องครับ เพราะว่า standard library ของ C++ นั้นค่อนข้างจะใหญ่พอควร และมีชื่อที่ค่อนข้างโหลอยู่มากมาย เช่น vector (ใน header ชื่อ vector) หรือว่า max, find, count (ใน algorithm) เป็นต้น การที่พวกนี้อยู่ใน namespace std จะช่วยป้องกันปัญหาชื่อซ้ำกันได้บ้าง (เยอะเลยแหละ) เพราะว่าปกติชื่อมันจะไม่ซ้ำกันข้าม namespace

    ปัญหานี้มันก็อารมณ์เดียวกับคนชื่อซ้ำๆ กันในคณะ (เช่น ชื่อ ฝน หรือว่า เมย์ … ชื่ออะไรดีที่มีเยอะๆ?) แต่ว่าถ้าบอกว่า ฝน เอกคอมพ์ นี่คงจะน้อยลงไปเยอะเลย (โอกาสซ้ำกันก็ยังพอมีอยู่ แต่ว่าสำหรับ std namespace แล้วการันตีว่าไม่มีการซ้ำภายใน namespace เดียวกัน) .. งั้นการบอกว่า std::max ก็เหมือนกับบอกว่า เอกคอมพ์::ฝน น่ะแหละ … แต่ว่าถ้าชื่อไม่ค่อยจะโหล เช่น เอิง อะไรแบบนี้ก็แล้วไป (ถ้าเป็น C++ ก็คงจะพวก bind2nd อะไรทำนองล่ะมั้ง)

  • เรื่องความเข้ากันได้ของ C และ C++ เอง …. เรื่องนี้ไม่น่ามีล่ะครับ แต่ว่าก็ว่าไม่ได้ เพราะว่าไม่มีใครกำหนดไว้ชัดเจน แต่ว่าเนื่องจาก C และ C++ เอง นับวันก็ยิ่งจะแตกต่างกันในเรื่องของรายละเอียดเล็กๆ น้อยๆ มากขึ้นๆ เรื่อยๆ ถ้าเราใช้ .h library เมื่อไหร่ นั่นหมายถึงเราอาจจะใช้ library ของ C อย่างไม่รู้ตัวครับ นั่นแปลว่า ถึงเราจะแม่น devils in details ของ C++ มากแค่ไหน แต่ว่าถ้าเราใช้ของ C โดยที่เราคิดว่าใช้ของ C++ อยู่ล่ะ? ….. เราจะเจอปัญหาเล็กน้อยพอควรทีเดียว และเราจะไม่คิดด้วย ว่ามันเป็นปัญหาที่จุดนี้

    เรียกว่าถ้าเราจะใช้ C ก็ใช้ .h ให้ชัดเจน แต่ว่าถ้าจะใช้ C++ ก็เอา .h ออก และใช้ c ขึ้นหน้า (เช่น cstdio, cstdlib, cstring, cctype เป็นต้น)

    อ่อ ….​ และถึงตรงนี้เลยฝากไว้นิดเลยละกัน ว่า string.h ของ C (ที่มีพวก strlen) มันจะกลายเป็น cstring ใน C++ นะครับ ถ้า string ของ C++ จะเป็นอีกตัวนึง ซึ่งเป็นคนละเรื่องกันเลย

คงเป็นความรู้ประกอบการตัดสินใจในการเลือกใช้ header สำหรับการเขียน C/C++ ได้บ้างครับ

Ruby 1.9-dev released!

Ruby > Ruby 1.9.0 is released ของขวัญ Christmas จาก Matz!

รอคอยกันมานาน กับ Ruby 1.9 ซึ่งเป็น major release แรกหลังจาก 1.8 ออกมานานแล้ว ซึ่งใน version นี้จะมีอะไรหลายๆ อย่างเพิ่มเข้ามา โดยเฉพาะที่หลายๆ คนรอคอยกัน ก็คือประสิทธิภาพที่เพิ่มขึ้น ความเร็วที่เพิ่มขึ้น

  • เนื่องจากมันเป็น development release ดังนั้นมันจะยังไม่ stable นะครับ (จาก message ของ Matz เองใน ruby-forum.com

    We couldn’t make it error free, but it’s fairly good, we hope.

  • ใครที่ใช้ Ruby on Rails เป็นหลัก อย่าเพิ่ง ลงเด็ดขาดครับ เพราะว่ามันยังไม่ compatible กัน ทาง Rails จะยังต้องเปลี่ยนโน่นเปลี่ยนนี่เยอะเหมือนกันนะ (อันนี้ผมไม่ confirm ครับ เพราะว่าผมยังไม่ได้ลองดู Ruby 1.9 และภายในของ Rails ละเอียดพอที่จะให้ comment อะไรได้) แต่ว่าก็มีคนศึกษาเรื่องนี้เหมือนกัน เช่นที่ eigenclass เป็นต้น
  • ในขณะที่ประสิทธิภาพสูงขึ้นพอควรจาก benchmark ต่างๆ นั้น … ประสิทธิภาพกับ Rails (เท่าที่ test ได้) กลับไม่ดีขึ้นเท่าที่ควร (และแย่ลงด้วยในบางกรณี)

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

เอา “ความดี” มา Entrance?

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

MCOT News – นำร่องใช้คะแนนความดีเข้ามหาวิทยาลัยปีหน้า

อ่านแล้วก็ยังเกิดข้อสงสัยหลายอย่างด้วยกัน กลัวว่ามันจะเหมือนกับประเด็นการประกันคุณภาพของสถาบันอุดมศึกษา หรือว่าการใช้​ GPA ในการเข้ามหาวิทยาลัย ที่สุดท้ายก็มีปัญหาในเรื่องการควบคุมคุณภาพ

ผมไม่ได้ต่อต้านแนวคิด (concept) แต่ว่าผมกลัวปัญหาเรื่อง implementation ของ concept มากกว่า เพราะว่าเราคงจะเห็นและรู้กันจนชินแล้ว

ความดีจะวัดกันออกมาเป็นคะแนนอย่างยุติธรรมได้ยังไง? จะมีการแจกคะแนนแบบเฝือหรือไม่? จุดยืนของโรงเรียนหลายโรงเรียนในประเด็นนี้คืออะไร? จริงๆ ก็ยังมีอีกเยอะ

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

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

ปัญหาการศึกษา ยิ่งว่ายิ่งลึกครับ ….. ผมคงไม่เขียน blog เรื่องนี้บ่อยนัก เพราะว่าเขียนมาบ่อยแล้ว เอาไว้มีประเด็นจริงๆ จะเขียนให้อ่านเต็มที่แน่นอน

Joke: Schrödinger’s Cat (+ ข่าวเรื่อง Quantum Computer)

ขำมากๆ…..!

พอดีอ่านเรื่อง Light-based Quantum Circuit Does Basic Maths จาก Slashdot

เป็นเรื่องเกี่ยวกับความก้าวหน้าของงานวิจัยในการสร้าง quantum computer ของออสเตรเลีย (Queensland) ที่พัฒนา light-based 4-qubit quantum computer (ZDNet) โดยใช้เลเซอร์ในการ entangle photons ผ่าน linear optical circuit (ที่เหลืออ่านตาม link และ /. เอาเองนะครับ)

เจอ joke ที่สุดยอดมากๆ (IMO)

— Wanted —

Schrödinger’s Cat

Dead or Alive

จาก username Intron และมี reply ต่อมาจาก username geekoid

— Wanted —
Schrödinger’s Cat
Dead and Alive

โอ๊ย…. ขำมาก! (ถ้าไม่ get ลองหาเรื่องเกี่ยวกับ Schrödinger’s Cat อ่านดูนะครับ :-) และถ้าอยากอ่านเต็มๆ ผมแนะนำให้เข้าอ่านที่ตัวข่าวและบทความใน /. ดูครับ

จริงๆ ที่ /. มี comment ขำๆ เยอะครับ และมีความรู้ดีๆ เยอะครับ เรียกว่าเป็นอีก web นึงที่ผมต้องอ่านทุกวันมาตั้งแต่เรียน ป. ตรี :-)

ฟังไม่ได้ศัพท์ + ความไม่รู้… (ต่อเอาเอง)

คนเรา บางทีเวลาที่ไม่รู้อะไรแต่ว่าทึกทักไปว่ารู้ แล้วเอาพูดๆ ต่อ เนี่ยมันแย่จริงๆ แฮะ

วันนี้ได้ยินมาจากคนที่ทำงานด้วย ว่ามีคนโทษผมด้วยว่ะ ว่าผมเป็นต้นเหตุของการไม่เสถียร (หรือเรียกเป็นภาษาง่ายๆ ว่า​ “เน่า”) ของอินเทอร์เน็ตในมหาวิทยาลัย

เพราะว่าผมไป “ดูดอินเทอร์เน็ต” ไว้ และก็ได้บอกด้วยว่า ผมเคยทำให้เค้าดู

จะ debunk กันตรงนี้ก็คงจะใช่ที่ แต่ว่าสิ่งที่ผมทำน่ะนะ ไม่มีอะไรมากหรอก อย่างมากก็ใช้ wget ไปเรียก website ที่จำเป็น มาเก็บไว้ในเครื่อง ซึ่งก็ไม่มีอะไรมากไปกว่า request ไปที่ HTTP server​ ธรรมดา เพียงแต่ผลไม่ได้แสดงที่ browser แต่ว่ามาเอาเก็บไว้เป็นไฟล์ในเครื่อง เท่านั้นเอง

เดี๋ยวนี้เครื่องมือเหล่านี้ก็มีเยอะแยะไป เช่น ​Yojimbo และจริงๆ แล้วมันก็ไม่ได้มีอะไรใหม่กว่าการทำงานใน Off-line mode ของพวก browser เท่าไหร่ ที่จะพึ่งพา cache หรือว่าข้อมูลที่ดูดมาแล้วในเครื่องตัวเอง

ซึ่งก็ไม่ได้หนักอะไรมากกว่าการเล่นเน็ตด้วย browser และไม่ได้หนักกว่าการใช้งานอินเทอร์เน็ตปกติเลยแม้แต่น้อย (ยกเว้นแต่ผมจะทะลึ่งไปดูดผลลัพธ์ทุกตัวที่ google มันค้นมาได้จาก query หนึ่งๆ แบบ recursive หรือว่าไปดูด youtube แบบ recursive ซึ่งก็คงจะไม่มีใครฉลาดไปทำแบบนั้น)

จริงๆ มันค่อนข้างจะเบากว่าด้วยซ้ำ ในกรณีที่ต้องใช้งาน documentation (API reference) เพราะว่ามันต้องเปิดหน้าเดิมซ้ำไปซ้ำมาบ่อยมากๆ (ใครมันจะไปนั่งจำ syntax ของทุก function ทุก method ใน API ทุกตัว?) และ ไม่ใช่ทุก API มันจะมี Off-line doc ไว้ให้ download ไปใช้เลย (จะเป็น tar-ball หรือว่า zip หรือว่า PDF ก็แล้วแต่)

อ่อ อีกอย่างนะ ถ้าผมเป็นคนดูแล proxy นะ ผมคงจะต้องทำแบบนั้น เพื่อที่จะ cache หน้าที่มีการ request บ่อยๆ ไว้ที่ proxy ของมหาวิทยาลัย เพื่อให้เน็ตมันเร็วขึ้น (เพราะว่าไม่ต้องไป request ต่อข้างนอก) ซึ่งถ้าผมเป็นคนดูแล และมีการ cache ที่ proxy ที่ฉลาดหน่อยล่ะก็ เน็ตมันจะเร็วขึ้น ไม่ใช่เน่ามากขึ้น ซึ่งอันนี้พวกน้องๆ ที่เรียน com-sci หรือว่า ​IT มันน่าจะเข้าใจไม่ยาก

มันตลกตรงที่ คนที่ไม่รู้ และ no idea เรื่องพวกนี้ กลับเชื่อด้วยแฮะ ไม่พอ ดันเอาไปพูดกันต่อด้วย และที่น่าตลกกว่านั้น ก็คือ บางคนก็ดันเป็นคนที่เรียน com-sci/IT น่ะแหละ พวกนี้ยิ่งแย่ เพราะคิดว่าตัวเองรู้ ตัวเองมี idea และตัวเองเข้าใจถูกต้อง และที่แย่ก็คือ พวกนี้จะมี creditability อะไรบางอย่างเวลาไปพูดกับคนอื่น (ที่ไม่ได้เรียนหรือว่าทำงานด้านนี้)

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

ถามจริงเหอะนะ ไอ้คนพูดเนี่ย มันเคยไปดู traffic ในมหาวิทยาลัยหรือเปล่า เคยไปดู log พวกนี้บ้างมั้ย ว่ามันมี activity อะไรบ้าง

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

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

สรุป: เหนื่อยแฮะ

หายไปไหน?

นั่นสิ … ผมหายไปไหนจากเว็บนี้?

ผมมัวแต่ไปสร้าง community blog/website อีกแบบหนึ่งอยู่ … เป็น community blog/website ที่ผมและนักศึกษาของผมในวิชาต่างๆ จะช่วยกันค่อยๆ เขียนมันขึ้นมาให้เป็นแหล่งรวมความรู้ และประสบการณ์ที่เกี่ยวข้องกับวิชานั้นๆ

ทุก blog จะเหมือนๆ กันอย่างนึง คือ ผมจะรวบรวม reading list เป็นเรื่องๆ ไว้ (คือเรื่องหนึ่งก็มีหลาย reading) แล้วให้นักศึกษาเข้ามาอ่าน แล้วก็ต้องไปเขียนบทความเข้ามาเพิ่มเป็น entry ใหม่ใน blog โดยที่ผมจะ moderate ให้ ว่ามันควรลงหรือไม่ควรลง บางคนเขียนมาง่ายไป หรือว่าน้อยไป (แค่บรรทัดเดียว)ื ผมก็จะไม่ publish ให้ …. ใช้การสร้าง content เป็นวิธีการวัดผล ใครสร้าง content มากกว่าและเป็น content ที่มีประโยชน์ (คือนำไปสู่ creative discussion ที่ให้ได้มาซึ่ง insight ต่างๆ รวมถึงการร่วมสร้าง creative discussion) .. ก็ได้คะแนนมากกว่าไป

ลองเข้าไปดูครับ ใครอยากจะได้ account ในวิชาอะไรเพื่อเข้าไปช่วยๆ กันก็รบกวนบอกครับ ผมจะสร้างให้

แล้วก็มีอีกอัน คือเป็น web รวมๆ พวกนี้อีกที (ณ ปัจจุบัน)

จริงๆ ไอ้ตัวนี้ผมอยากจะขยายมันออกไปมากกว่านี้ มากกว่าที่จะเป็นแค่ portal ของรายวิชาที่จะมี digital content (ที่ตอนนี้ก็คงมีแต่ podcast และ RSS ที่ feed มาจากไอ้พวก link ด้านบน) …. คือผมอยากจะให้มีการสร้าง knowledge และ content ร่วมกันในหลายๆ แง่ หลายๆ มุมมากที่สุดเท่าที่จะมากได้ ต่อไปอาจจะมีเรื่องกิจกรรมนักศึกษามากกว่านี้ หรือว่า event ต่างๆ มากกว่านี้….. แต่ว่า ตอนนี้ขอให้แก้ระบบให้มันเสร็จก่อน เพราะว่ามีหลายอย่างที่มันยังผิดๆ อยู่มากมาย (เกิดจากที่ programmer ของผมมอง model และ interaction design ของระบบนี้ไม่ขาดเอง และผมเองก็ไม่ได้ลงไปดูเองมากมายเท่าไหร่)

ก็ update กันนิดครับ เดี๋ยวจะคิดว่าผมหายไปนาน….. ไม่รู้มีคนคิดถึงบ้างหรือเปล่า :-)