21 December 2011

\newcommand กับ Optional Argument

\newcommand ใน LaTeX เป็นคำสั่งสำหรับนิยามคำสั่งใหม่ โดยกำหนดให้เป็น macro ของคำสั่งเก่าผสมกัน อย่างเช่น เวลาผมจะเขียนตัวอย่างในเอกสารการสอน ผมจะใช้ \paragraph{Example} เสมอ แทนที่ผมจะพิมพ์แบบนี้ทุกครั้ง ผมก็นิยามคำสั่งขึ้นมาได้ โดยใช้
\newcommand{\example}{\paragraph{Example}}
ทำให้ได้คำสั่ง \example เอาไว้ใช้ได้ทุกครั้ง พิมพ์สั้นกว่าเดิม แล้วจะเปลี่ยนลักษณะรูปแบบก็ทำได้ง่าย ทีนี้คำสั่ง \newcommand ยอมให้เรากำหนด argument ได้ด้วย อย่างเช่น
\newcommand{\mypages}[1]{There are #1 pages in this note.}
เวลาใช้คำสั่ง \mypages{10} ก็จะได้ข้อความ "There are 10 pages in this note." ออกมา LaTeX ยอมให้เรากำหนด argument ได้ถึง 9 อัน แล้วเราก็สามารถระบุให้ argument อันแรกสุดเป็น optional argument ได้ด้วย โดยเราสามารถกำหนดค่า default ของ argument แรกได้เอง เช่น
\newcommand{\mypages}[2][note]{There are #2 pages in this #1.}
ถ้าเรียกใช้ด้วย \mypages{10} ก็จะได้ผลเหมือนเดิม แต่เราสามารถเรียกใช้โดยกำหนดค่าของ optional argument ได้ด้วย เช่น \mypages[examination]{10} ก็จะได้ผลเป็น "There are 10 pages in this examination."

17 October 2011

Dennis Ritchie

ช่วงสองสัปดาห์ที่ผ่านมา มีข่าวการเสียชีวิตของบุคคลที่มีความสำคัญในวงการคอมพิวเตอร์ 2 คน คนแรกคือ Steve Jobs ซึ่งข่าวการเสียชีวิตของเขาดังไปทั่วโลก อีกคนหนึ่ง เรื่องไม่ค่อยเป็นข่าวเท่าไหร่ คือ Dennis Ritchie ผู้ร่วมสร้างภาษา C และระบบ Unix
แม้ว่าจะไม่ค่อยมีคนรู้จัก ผมคิดว่า Dennis Ritchie เป็นบุคคลที่ทำให้เรามีเทคโนโลยีคอมพิวเตอร์ต่างๆ ใช้งานกันได้อย่างเพียบพร้อมและต่อยอดไปได้ไม่รู้จบ ภาษา C ที่เขาสร้างขึ้น เป็นภาษาพื้นฐานสำหรับพัฒนาซอฟท์แวร์แทบทุกประเภท ตั้งแต่ ระบบโทรศัพท์มือถือ ไปจนถึงเครื่องซุเปอร์คอมพิวเตอร์ ระบบ Unix เป็นระบบปฏิบัติการที่ดีที่สุด เป็นแนวคิดพื้นฐานของระบบปฏิบัติการแทบจะทุกระบบที่เราใช้อยู่ ไม่ว่าจะเป็น Windows, Mac OS X หรือว่า Linux รวมไปถึง Android และ iOS
ผมเชื่อว่า แนวคิดหลักที่ทำให้ภาษา C และระบบ Unix ทำงานได้อย่างดี ก็คือ "ความเรียบง่าย" และ "การลงมือทำด้วยตัวเอง" แนวคิดเหล่านี้ดูได้ ภาษา C เป็นภาษาที่โครงสร้างภาษาไม่มีอะไรซับซ้อน ถ้าเข้าใจโครงสร้างนั้น ก็จะสามารถเขียนโปรแกรมภาษา C ได้อย่างไม่มีปัญหา อีกอย่างหนึ่งคือภาษา C เป็นภาษาไม่มีข้อยกเว้น ไม่มีกรณีพิเศษ อย่างเช่น เราเห็นว่าฟังก์ชัน printf สามารถรับพารามิเตอร์ได้จำนวนไม่จำกัด เราก็สามารถเขียนฟังก์ชันแบบนั้นขึ้นมาใช้งานได้เช่นกัน ฟังก์ชัน printf ไม่ได้เป็นข้อยกเว้น หรือกรณีพิเศษของภาษา หลายคนอาจจะเห็นต่างจากผมว่าภาษา C นั่นยุ่งยากและซับซ้อน ผมเชื่อว่านั่นเป็นเพราะเราจำเป็นจะต้องเข้าใจหลักการทำงานของระบบปฏิบัติการ และระบบคอมพิวเตอร์บางส่วนก่อน จึงจะสามารถเขียนโปรแกรมภาษา C ได้อย่างเต็มที่
ส่วน Unix เป็นระบบปฏิบัติการที่ออกแบบมาให้ทำงานแบบเรียบง่ายเช่นกัน จะเห็นว่า Unix นั้นประกอบด้วยโปรแกรมเล็กๆ หลายโปรแกรม ซึ่งสามารถนำมาประกอบกัน เพื่อทำงานที่ต้องการได้ง่าย ด้วยเครื่องหมาย redirection และ pipe แถมยังเอาคำสั่งต่างๆ มาประกอบกันกลายเป็น script สำหรับทำงานที่ซับซ้อนได้ด้วย ดังนั้นเวลาเราจะสร้างโปรแกรมเพื่อทำงานอะไรสักชิ้น ก็เพียงแต่คิดว่าเราจะประกอบโปรแกรมที่มีอยู่อย่างไรให้ทำงานที่เราต้องการได้ ถ้าไม่มีส่วนประกอบบางส่วนก็เขียนส่วนนั้นเอง ไม่จำเป็นต้องคิดถึงโปรแกรมซับซ้อนที่เราต้องทำส่วนประกอบต่างๆ ทุกส่วน