ในไลบรารีมาตรฐานของภาษาซี มีฟังก์ชันสำหรับจัดการข้อมูลที่สำคัญอยู่ 2 ฟังก์ชัน คือ bsearch สำหรับการค้นหาข้อมูลแบบ binary search และ qsort สำหรับเรียงลำดับข้อมูลโดยใช้อัลกอริทึม quick sort โดยปกตินักศึกษาส่วนใหญ่มักจะไม่ใช้ เพราะมันดูเหมือนจะยุ่งยากซับซ้อน โดยเฉพาะเรื่องเกี่ยวกับ pointer วันนี้ต้องเขียนโปรแกรมเพื่อเรียงลำดับสายอักขระ เลยเอามาเขียนอธิบายวิธีการใช้ไว้หน่อย เผื่อจะเป็นประโยชน์ต่อตัวเอง และคนที่ผ่านมาเห็น
void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *))
จาก function prototype จะเห็นว่าฟังก์ชันนี้ต้องการ argument 4 ตัว คือ
ตัวอย่าง ผมต้องการเรียงลำดับสตริง ซึ่งในภาษาซีจะใช้ char * ดังนั้นผมจึงสร้างตัวแปรแบบ char ** เพื่อเป็นอะเรย์สำหรับเก็บ pointer ที่ชี้ไปยังสตริงแต่ละตัว ส่วน nmemb ก็คือจำนวนสมาชิกของอะเรย์ กับ size ก็คือ sizeof(char) หาได้ไม่ยาก ปัญหาหลักอยู่ที่ฟังก์ชันสำหรับเปรียบเทียบข้อมูล ซึ่งจะเห็นว่าเรามีฟังก์ชัน strcmp สำหรับเปรียบเทียบสตริงอยู่แล้ว เพียงแต่ prototype อาจจะไม่เหมือนกัน เลยต้องทำฟังก์ชันขึ้นมาห่อไว้หน่อย
int compare(const void *a, const void *b) { const char **pa = (const char **)(a); const char **pb = (const char **)(b); return strcmp((*pa), (*pb)); }
อ้อ เวลาฟังก์ชัน qsort เรียก compar มาทำงาน จะเรียกโดยส่ง pointer ที่ชี้ไปยังสมาชิก 2 ตัวในอะเรย์ไปให้ ฉะนั้นจึงต้องมา cast ให้เป็น char ** ก่อน แล้วถึงจะไปเรียกใช้ strcmp ได้ ส่วนการเรียกฟังก์ชัน qsort ก็แค่
qsort(a, n, sizeof(char *), compare);
สุดท้ายที่อยากฝากไว้ก็คือ “don’t reinvent the wheel” เราควรจะใช้สิ่งที่มีอยู่แล้วให้เป็นประโยชน์ให้มากที่สุด โดยเฉพาะอย่างยิ่งฟังก์ชันมาตรฐานต่างๆ เพราะฟังก์ชันเหล่านี้ได้รับการพัฒนามายาวนาน ผ่านร้อนผ่านหนาวมาเยอะ น่าจะทำงานได้ดีกว่าการเขียนฟังก์ชันขึ้นมาใช้งานเอง แต่ทั้งนี้ไม่ได้บอกว่าไม่ควรทำเองนะ เพียงแต่พยายามปรับใช้สิ่งต่างๆ ที่มีอยู่ให้ดี เพื่อจะได้มีเวลาไปทำให้สิ่งใหม่ๆ
อ้างอิง: man qsort
Tags: C, programming, qsort
ช่วงนี้กำลังพัฒนาระบบให้กับที่ทำงานอย่างที่พูดถึงไปแล้วในหัวข้อก่อน เสร็จแล้วระบบนี้จะต้องสร้าง report ออกมาเป็น PDF ตอนแรกก็พยายามไปค้นๆ เจอ fpdf ซึ่งเป็นไลบรารีสำหรับสร้างเอกสารแบบ PDF โดยใช้ php แต่ลองใช้ดูสักพักก็รู้สึกว่าใช้งานยาก คือจะปรับแต่งให้ได้ดั่งใจค่อนข้างยาก (เผอิญ report ที่ต้องการ ประกอบด้วยตารางเป็นส่วนใหญ่) สุดท้ายเลยกลับมาตายรังโดยใช้ php สร้าง source สำหรับ LaTeX จากนั้นก็ใช้ pdflatex รันก็เสร็จแล้ว
ทีนี้พอทำส่วนประกอบต่างๆ เสร็จ ก็อยากจะทำเท่ห์โดยให้ pdflatex ทำงานแบบพื้นหลัง แล้วค่อยใช้ Ajax มาคอยเช็คดูว่าสร้าง pdf เสร็จหรือยัง ก็จำเป็นต้องสร้าง process ใหม่ขึ้นมาเพื่อเรียก pdflatex มาทำงาน ลองค้นดูก็พบว่า php มีกลุ่มคำสั่ง pcntl (Process Control) สำหรับควบคุม process ต่างๆ ซึ่งในนั่นจะมีคำสั่ง pcntl_fork() เอาไว้สร้าง process ลูก และ pcntl_exec(…) สำหรับกำหนดให้เรียกโปรแกรมมาทำงาน
พอใช้ก็โดนเตือนว่าไม่รู้จักคำสั่งพวกนี้ ลองหาไปหามา ก็มีคนบอกว่าต้อง enable pcntl ก่อน ใน ubuntu ไม่ได้ทำมาให้ สุดท้ายก็เลยไปพยายามสร้าง .deb ขึ้นมาใหม่เพื่อการนี้ แต่ก็ยังใช้ไม่ได้ ลองค้นดูอีกเจอว่า คำสั่งพวกนี้จะใช้ได้เฉพาะเวลาใช้ php แบบ CGI เท่านั้น ไม่สามารถใช้ได้เวลาทำงานเป็น module หนึ่งของ Apache (คิดว่าคงเพราะทำงานเป็นส่วนหนึ่งของ process ของ Apache ถ้ายอมให้ทำได้ ก็อาจจะเกิดปัญหาต่างๆ ได้ ต่างจากแบบ CGI ที่ทำงานอยู่บน process ของ php เอง)
สุดท้ายก็เลยเปลี่ยนใจไม่ใช้แล้ว เพราะดูท่าทางจะยุ่งยาก แล้ว pdflatex มันก็ไม่ได้ทำงานนานเท่าไหร่ เนื่องจากไฟล์ค่อนข้างเล็ก
Tags: php, programming
CakePHP เป็น API และ framework สำหรับพัฒนาโปรแกรมบนเว็บ โดยอิงกับรูปแบบ MVC ที่มี Ruby on Rails เป็นผู้นำทาง รู้จัก CakePHP โดยบังเอิญ เนื่องจากจะต้องพัฒนาระบบงานระบบหนึ่งให้กับสถาบันฯ แบบเร่งรัด โดยส่วนตัวก็ชอบแนวคิดของ RoR แต่รู้สึกไม่ค่อยชินกับไวยากรณ์และโครงสร้างของภาษา Ruby สักเท่าไหร่ แม้ว่าจะใช้ Ruby เขียนสคริปต์เป็นหลักตอนเรียนปริญญาเอก แต่ทำยังไงก็ไม่คุ้น หยุดใช้ไปซักหน่อยก็จะลืมหมด จะเขียนใหม่ก็ต้องมานั่งอ่านกันทุกที เลยลองหาไลบรารีเพิ่มเติมของ PHP ซึ่งใช้ไวยากรณ์คล้ายภาษาซีที่ติดอยู่ในสายเลือดแล้ว หาไปหามาก็เจอ CakePHP ตัวนี้แหละ
ข้อดีของ CakePHP ก็คือ เป็นแค่ library เพิ่มเติม ที่ทำงานร่วมกับ interpreter ของภาษา PHP ทำให้ติดตั้งโปรแกรมหรือระบบได้ง่าย ไม่ต้องการอะไรพิเศษ ดาวน์โหลดมาแล้ว พอระเบิดออกก็จะได้ directory มาหนึ่งอัน ที่เราสามารถเพิ่มโปรแกรมของเราเข้าไปตามโครงสร้างที่วางไว้ และ directory นี้ก็มีลักษณะเช่นเดียวกับระบบที่พัฒนาด้วย PHP แบบเดิม เอาไปวางไว้บน web server แก้ config นิดหน่อยก็ใช้งานได้แล้ว สะดวกมาก นอกจากนี้ CakePHP ยังเหมาะกับคนที่เข้าใจไวยากรณ์ของ PHP อยู่แล้ว เรียกว่าไม่ต้องปรับตัวมากมาย ก็เข้าใจระบบ และสามารถเขียนโปรแกรมได้ทันที
Tags: php, programming
แม้ว่าคนส่วนใหญ่จะพูดกันว่ารัฐธรรมนูญ พ.ศ. 2540 ที่เพิ่งโดนฉีกไปหมาด เป็นรัฐธรรมนูญที่ดีที่สุดฉบับหนึ่ง แต่ในสายตานักเขียนโปรแกรม ผมรู้สึกว่ารัฐธรรมนูญฉบับนั้นดูแย่มาก ทำไมเหรอ? ก็เพราะเห็นปัญหาต้องตีความอยู่บ่อยๆ (ไม่รู้หรอกว่าบ่อยกว่าฉบับก่อนๆ หรือเปล่า เกิดไม่ทัน แหะๆ) สาเหตุที่เห็นส่วนใหญ่คือการเขียนข้อความที่เฉพาะเจาะจงกับกรณีปกติ ไม่ได้คิดถึงปัญหาที่จะเกิดขึ้นในอนาคต เหมือนกับเขียนโปรแกรมที่รับข้อมูลเข้า โดยไม่มีการตรวจสอบ ตั้งสมมติฐานไว้ก่อนว่าข้อมูลเข้านั้นถูกต้องเสมอ ฉะนั้นเวลาผู้ใช้ใส่ข้อมูลผิดพลาด หรือมีกรณีผิดปกติอะไรเกิดขึ้น โปรแกรมก็ไม่สามารถทำงานต่อไป หรือไม่ก็ทำงานต่อโดยไม่สามารถคาดเดาผลลัพธ์ได้
ถ้าจำไม่ผิดรัฐธรรมนูญฉบับนี้มีปัญหาตั้งแต่การเลือกตั้งส.ว.ครั้งแรกแล้ว ดูเหมือนจะไปกำหนดไว้ว่าต้องมีวุฒิสภาภายในกี่วัน โดยไม่ได้ระบุไว้ว่าถ้าไม่ได้ต้องทำยังไง สุดท้ายก็ต้องมานั่งตีความอีกว่าจะทำยังไงได้บ้าง นอกจากนี้มักจะกำหนดค่าคงที่ต่างๆ เป็นค่าตายตัว โดยไม่ได้คิดว่าถ้าหาค่านั้นไม่ได้แล้วต้องทำยังไง สุดท้ายก็เกิดปัญหา อย่างกรณีสรรหาปปช. ครั้งล่าสุด ที่กำหนดไว้ว่าต้องมีตัวแทนฝ่ายค้านกี่คนหรือกี่พรรคอะไรทำนองนั้น พอไม่ครบขึ้นมาก็เกิดทางตันไปหมด
แต่ยังไงก็แล้วแต่ผมไม่ใช่ผู้เชี่ยวชาญด้านกฎหมาย (ไม่มีความรู้เลยต่างหาก) ผมไม่รู้หรอกว่ากฎหมายที่ดีควรเป็นยังไง แต่โปรแกรมที่ดีควรคำนึงถึงปัญหาต่างๆ ที่อาจจะเกิดขึ้นในทุกกรณี เพื่อให้โปรแกรมทำงานตามที่เราคาดการณ์ไว้ ไม่เกิดเงื่อนไขแปลกๆ แล้วทำให้เกิดทางตัน หรือผลลัพธ์ที่ไม่เป็นไปตามที่ต้องการ
สำหรับโปรแกรมหรือซอฟท์แวร์นั้น เรามีวิชาวิศวกรรมซอฟท์แวร์ ที่พูดถึงวิธีการทดสอบซอฟท์แวร์แบบต่างๆ เพื่อให้เกิดความมั่นใจว่าเราจะได้ซอฟท์แวร์ที่มีคุณภาพ เอ…อย่างนี้เราควรจะต้องมีวิชาวิศวกรรมกฎหมายหรือเปล่า เผื่อว่าเราจะได้กฎหมายที่ดีขึ้น (ในแบบของผม)
Tags: politics, programming