Tag Archives: hack

PO Day

#tlwg คึกคักมาก วันนี้ใช้ gaim เข้า irc แทน xchat .. อืมม ต่อไปคงใช้ gaim นี่ละ คุ้นมือ

ยังไม่ได้ลงมือแฮ็กเคอร์เนลเลย มัวแต่เคลียร์งานอื่นๆ อยู่ (i.e., ดูการ์ตูน) TODOs ใน sticky note บนจอลดลงไปอีกสองเรื่อง เรื่องแรกคือแปล po ของ XFce4 ใช้ gtranslator เกิดมาก็เพิ่งเคยทำ กรอก header ผิดหรือเปล่าก็ไม่รู้ ยังไงก็ส่งไปให้ทะเลตรวจทานแล้ว ผ่านแล้วจะได้ rebuild XFce4 กันอีก เรื่องที่สองก็เกี่ยวกับ po อีก โครงการแปล po ผ่านเว็บ ร่างไปคร่าวๆ พรุ่งนี้เข้าไปคุยกับทีมที่เนคเทคอีกที

วาดรูปแกลลี่ เสร็จไปหนึ่งรูป

ใช้ inkscape ลอกจากต้นฉบับ ตอนแรกบอกน้องฝ้ายไปว่าจะวาดอีกรูปนึงแต่มันโคตรยากเลย ก็เปลี่ยนเป็นรูปนี้แทน เห็นเรียบๆ อย่างนี้ใช้เวลา 2 ชั่วโมงกว่าครับ

ตามไปเจอ blog เพื่อนๆ เลยเพิ่มลิงก์เข้าไปอีกสาม (วีร์ น้องฝ้าย และ Neverlock)

เกลียด OO.o .. อยากใช้ Abiword ทำ Thai word break ให้เสร็จเร็วๆ นะครับ :P

Kernel Hacking

อั้นไว้หลายวัน วันนี้ sync แพ็กเกจเข้าเซิร์ฟเวอร์ไปสิบกว่าตัว รวมถึงแพ็กเกจบางตัวก็ย้ายเข้า testing ไปแล้ว เช่น beep music player, mplayer 1.0pre4, libdv 0.102, และ gflashplayer-installer ตัวท้ายนี่เป็น official stand-alone flashplayer ที่ Macromedia Inc. แจกให้ใช้ฟรีสำหรับลินุกซ์ แต่ห้าม redistribute เช่น เดียวกับ flash plugin ผมเลยทำเป็น installer แทน (ไอเดีย installer นี่ debian เขาใช้กันอยู่ พี่เทพแนะนำมาอีกที) installer ตัวนี้ช่วยติดตั้งและถอดโปรแกรม gflashplayer ออกจากระบบอัตโนมัติ แต่ไฟล์ที่ติดตั้งไปจะไม่อยู่ในสารบบของ rpm ทำให้ไม่สามารถตรวจสอบ conflict ได้ ผลก็คือ rpm อาจติดตั้งไฟล์ทับ gflashplayer หรือลบไฟล์ของ gflashplayer หรือแพ็กเกจที่ conflict ออกไปโดยไม่รู้ตัว .. โอกาสเกิดเหตุแบบนี้มีน้อยมากๆๆๆๆๆๆ ครับ ถ้ายังไม่ไว้ใจก็ยังไม่ต้องลงก็ได้ ผมจะหาทางแก้ปัญหาดูอีกที

ระหว่าง sync แพ็กเกจ เผลอลบไฟล์ในเซิร์ฟเวอร์ไป 1 GB เลยเสียเวลา sync ไฟล์ไปซะหลายชั่วโมง เฮ่อ ..

สายๆ นั่งแฮ็กเคอร์เนลแก้ IRQ routing ของ CardBus ในโน้ตบุคที่ใช้อยู่ (Acer TravelMate 361Evi, CardBus controller ของ O2Micro OZ6933) .. ปัญหามันก็คือ IRQ table ทั้งของ BIOS และ ACPI มันผิด มันกำหนดให้ CardBus ใช้ IRQ 11 ทั้งที่จริงๆ มันควรจะเป็น IRQ 9 หรือ 10 พอมัน route ไป IRQ 11 ซึ่งไม่ได้เชื่อมอยู่จริงๆ ก็ Oops ! กระจาย ไม่ก็ freeze ไปเลย .. ทางแก้ทำไปแล้วตั้งแต่ต้นๆ เดือน แดเนียล ริตซ์ เขาช่วยดูให้ วิธีการคือฮาร์ดโค้ดใน arch/i386/pci/irq.c (2.6 branch) เช็คว่าถ้าเป็น BIOS ของ TravelMate 360 series และมี pmask เป็น 0x63 (pmask ของ OZ6933) จะสั่ง route ไปที่ IRQ 10 เสมอ .. สำเร็จครับ CardBus ทำงานได้แจ๋วเลย .. แดเนียลเมลมาถามให้ทดสอบว่าทุกอย่างใช้งานได้ปกติแล้วหรือเปล่า ผมเช็คแล้วทุกอย่างดูดีก็เลยบอกเขาว่าแพตช์น่าจะใช้ได้ จึง reply all กลับไปให้ แดเนียล, แอนดรูว์ มอร์ตัน (co-maintainer 2.6 กับ ลินุส ทอร์วาลด์), มาร์เซลโล โทซัตติ (maintener 2.4), และ เลน บราวน์ (Linux ACPI) .. ไม่กี่ชั่วโมงต่อมาแอนดรูว์รีลีสแพตช์ 2.6.5-mm4 ผมอ่าน ChangeLog เห็นมีแพตช์ของแดเนียลรวมเข้าไปแล้ว .. เร็วโคตร .. ดูๆ ไปวิธีฮาร์ดโค้ดแบบนี้ออกจะดุไปสักหน่อย เลน บราวน์ เองก็ไม่ค่อยชอบ เขาอยากหาต้นเหตุของปัญหานี้มากกว่า อีกอย่างคือวิธีฮาร์ดโค้ดแบบนี้แม้จะตรงไปตรงมาแต่ไม่ใช่วิธีที่ดีนัก เพราะมันไม่สเกล .. ทำไงได้ เท่าที่ผมทดสอบและให้ข้อมูลไป ก็ไม่มีวิธีแก้ทางอื่นเลย ข้อมูล IRQ table มันผิดตั้งแต่แรก

เวลาล่วงเลยไปหลายสัปดาห์ จนผมเปลี่ยนมาใช้ 2.6.5-mm6 .. วันนี้เพิ่งได้เสียบ HandyDrive (USB Storage) ใช้งาน ปรากฏว่าทำงานตะกุกตะกักมาก แถมมี error message ขึ้นมาเป็นระยะๆ ผมก็เริ่มเอะใจว่าจะเป็นที่แพตช์ของแดเนียลหรือเปล่า เพราะเขาก็เคยบอกนัยๆ ว่ามันอาจจะมีปัญหากับ USB แต่ในเวลานั้นผมทดสอบกับวานิลลา 2.6.5 ละเอียดแล้ว ทดลองใช้งานดูก็ปกติดี .. อย่างไรก็ตามสาเหตุเรื่องนี้น่าจะเป็นเพราะหนึ่งใน USB controller ใช้ pmask เป็น 0x63 เหมือน CardBus ก็เลยโดน route ไปที่ IRQ 10 ด้วย (ปกติควรอยู่ที่ IRQ 11) .. งานนี้จะกวนแดเนียลอีกก็กระไร อีกอย่างผมอยากทดสอบเองก่อนจะให้ข้อมูลเขา ก็เลยแฮ็กเคอร์เนลเอง เพิ่มโค้ดให้เช็ค vendor id และ device id ไปเลย จะได้ชัวร์ๆ ว่า re-route IRQ ไม่ผิดตัว (โค้ดก็เลยฮาร์ดหนักเข้าไปใหญ่ทีนี้) .. หลังแฮ็กแล้วก็ดูเหมือนจะดีขึ้น ไม่มี error message แล้ว การทำงานของ HandyDrive ลื่นเป็นปกติดี น่าจะใช้ได้แล้วล่ะ ผมส่งโค้ดกลับไปให้แดเนียลดูแล้ว พรุ่งนี้อาจจะรู้ว่าเขาคิดยังไงกับโค้ดที่แก้ไป :)

บ่ายๆ ออกไปจ่ายเบี้ยประกัน (กรมธรรม์แบบสะสมตังค์) แรกๆ ก็รู้สึกว่าเงินหายไปเยอะ แต่คิดอีกทีก็เหมือนโอนเงินจากธนาคารนึงไปฝากอีกธนาคารนึง ได้ดอกเยอะกว่าด้วย อืมคิดแบบนี้ค่อยสบายใจ กินซิซซ์เลอร์ เป็นมื้อเย็น อิ่มโคตร น้องๆ ที่ไปด้วยกันบอกว่าผมกินไม่คุ้ม (- -‘)

LinuxTLE LiveCD !

วางแผนทำ TLE LiveCD มาตั้งนาน แต่เพราะผมขี้เกียจตัวเป็นขน เลยไม่ทำออกมาซะที MrChoke ก็เลยตัดหน้าไปซะแล้ว 555 .. ดีเหมือนกัน วันนี้ MrChoke เอา iso แผ่น beta มาให้ลอง ก็เลยเผาแผ่นมาลองดูสักหน่อย เด่นๆ คงเป็น GNOME 2.6 ภาพรวมเหมือนใช้ทะเลธรรมดาๆ เลย การตอบสนองก็อยู่ในขั้นดี (ทดสอบบน AthlonXP 2000+, RAM 384 MB, GeForce4 MX440 64MB) .. แต่ก็ยังมีขาดๆ เกินๆ อยู่บ้าง สรุปเบต้าแรกนี้ถือว่าดีทีเดียว ตัวจริงน่าจะดีขึ้นอีก ออกเมื่อไหร่จะได้เอามาทำเป็นต้นฉบับใช้เองมั่ง เหตุที่จะทำเอง คือ ไม่ชอบการจัด default desktop ของ TLE บวกกับ apps บางตัวผมก็ไม่ได้ใช้แต่ใส่มาเป็น default และบางตัวผมต้องใช้แต่ไม่มีให้ใช้ ตรงนี้ไม่ได้ comment ว่า TLE ดีหรือไม่ดี ภายใต้เงื่อนไขการทำดิสโตรอย่างทะเล และภายใต้หน่วยงานที่ทำ ก็คงต้องเป็นอย่างที่เห็นนั่นล่ะเหมาะแล้ว .. ส่วน LiveCD มันไม่ได้ทำยากทำเย็นอะไรนักหนา ยิ่งมีฐานดีๆ อย่าง Knoppix หรือ Fedora LiveCD หรือ TLE LiveCD อยู่แล้ว จะเอามาทำเองยิ่งสะดวก .. ไว้ผมทำได้แล้วจะเขียนวิธีสร้าง LiveCD ไว้ให้อ่าน :)

Hello World ด้วย GNU Autotools

เรื่องของเรื่องก็คือ อยากจะหัดใช้ Autotools สักหน่อย .. ง่ายสุดก็ต้องกับโปรแกรม Hello World นี่ล่ะ :D

แนะนำ GNU Autotools

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

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

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

ปัจจุบันมีการใช้งาน Autotools กันอย่างแพร่หลายบนลินุกซ์และยูนิกซ์ อย่างที่เรามักจะเห็นขั้นตอนการติดตั้งซอฟต์แวร์โดยสั่ง ./configure; make; make install นั่นก็เป็นผลของ Autotools เหมือนกัน เพราะสคริปต์ configure โปรแกรมไหนๆ ก็สร้างมาจาก Autotools เกือบทั้งนั้น

มาดูกันสักหน่อยว่า Autotools ประกอบด้วยอะไรบ้าง

เครื่องมือ

เครื่องมือของ GNU Autotools หลักๆ ประกอบด้วย autoscan aclocal autoconf autoheader และ automake แต่ละตัวใช้สร้างไฟล์ที่จำเป็นในการ build ซอฟต์แวร์ และมีความสัมพันธ์กันดังที่แสดงในภาพ

จะเห็นได้ว่า นอกจากซอร์สโปรแกรมแล้ว ในขั้นต่ำสุดมีเพียง Makefile.am และ configure.in (หรือ configure.ac) เท่านั้นที่นักพัฒนาซอฟต์แวร์ต้องเขียนเอง ที่เหลือ Autotools สามารถสร้างให้เองอัตโนมัติ

aclocal ทำหน้าที่ในการหามาโครที่จำเป็นต้องใช้จาก configure.in สร้าง เอาต์พุตเป็น aclocal.m4 หากมีไฟล์ acinclude.m4 (user-defined macro) ก็จะถูกรวมเข้าไปด้วยในขั้นตอนนี้ ไฟล์ aclocal.m4 นี้จะเป็นอินพุตสำหรับ autoconf และ autoheader ต่อไป

autoconf ทำหน้าที่สร้างสคริปต์ configure จาก configure.in และ aclocal.m4 .. configure เป็นสคริปต์ที่ใช้ตรวจสอบระบบตามเงื่อนไขและสร้าง Makefile ที่เหมาะสมกับระบบนั้นอัตโนมัติ การสร้าง Makefile นั้น สคริปต์ configure ต้องการไฟล์สำคัญอีกตัวคือ Makefile.in ซึ่งสร้างจาก Makefile.am โดย automake

เครื่องมืออีกตัวคือ autoheader ใช้สร้าง config.h.in ซึ่งเป็นเท็มเพลตของ header ที่ configure จะเอาไปใช้งานอีกที

ลองมาดูตัวอย่างการใช้ Autotools กับโปรแกรมยอดฮิต Hello World!

Hello World Project

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

ไฟล์แรกที่ต้องเขียนก่อนก็คือซอร์สของ hello.c

#include <stdio.h>
int main() {
    printf("Hello world !");
    return 0;
}

แล้วก็เขียน configure.in อย่างง่ายๆ ประกอบด้วย

AC_INIT(hello.c)
AM_INIT_AUTOMAKE(hello,0.1)
AC_PROG_CC
AC_PROG_INSTALL
AC_OUTPUT(Makefile)

AC_INIT เป็นบรรทัดบังคับที่ต้องมีและต้องเป็นมาโครแรกของ configure.in เสมอ AM_INIT_AUTOMAKE ก็เป็นอีกหนึ่งบรรทัดที่จำเป็นต้องมีเมื่อต้องใช้งาน automake ส่วน AC_PROG_CC และ AC_PROG_INSTALL เป็นการระบุโปรแกรมที่ต้องการใช้งาน ในที่นี้คือ C compiler และโปรแกรม install บรรทัดสุดท้ายเป็นการระบุให้สคริปต์ configure สร้างผลลัพธ์เป็น Makefile

ได้ configure.in เรียบร้อยแล้ว ก็มาเขียน Makefile.am กัน … อย่างง่ายๆ ก็มีเพียงสองบรรทัด ระบุโปรแกรมที่จะ build และซอร์สของโปรแกรม

bin_PROGRAMS = hello
hello_SOURCES = hello.c

ขั้นตอนการสร้างสคริปต์ configure ก็มีเพียง

aclocal
autoconf
touch NEWS README AUTHORS ChangeLog
automake --add-missing

บรรทัดที่สามอาจจะดูประหลาดกว่าเพื่อน และไม่ได้เป็นส่วนหนึ่งของ Autotools คำสั่ง touch ใช้ในการแก้ไข timestamp ของไฟล์ แต่เราสามารถนำมาใช้สร้างไฟล์ dummy (ขนาดเป็น 0 byte) ได้ด้วย ในตัวอย่างนี้ใช้ touch สร้าง dummy ไฟล์ชื่อ NEWS README AUTHORS ChangeLog ตามลำดับ ทั้งสี่ไฟล์ไม่มีข้อมูลอะไรเลย แต่ที่ต้องสร้างไว้เพราะ automake จะตรวจหาไฟล์เหล่านี้ขณะทำงาน ถ้าไม่พบไฟล์ทั้งสี่ก็จะเกิด error ขึ้น .. ในภายหลังเราอาจจะแก้ไขไฟล์เหล่านี้เพื่อเพิ่มรายละเอียดเกี่ยวกับการพัฒนาซอฟต์แวร์ แต่ตอนนี้ทำเป็นอย่างนี้ไว้ก่อน

ออปชัน --add-missing ที่ใส่ให้กับ automake เป็นการบอกให้ automake สร้างไฟล์ที่ขาดไปอัตโนมัติ เสร็จขั้นตอน automake แล้วเราก็พร้อมที่จะ build โปรแกรม Hello World กัน

./configure
make
make install

ที่จริงแล้ว Makefile ที่สร้างโดยสคริปต์ configure จะเตรียมกฏในการ make ไว้ให้อีกหลายตัว เช่น

make uninstall
make clean
make maintainer-clean
make distclean
make dist
make distcheck

ทั้งหมดนี่ก็เป็นตัวอย่างง่ายๆ ในการใช้ GNU Autotools .. รายละเอียดของ Autotools ยังมีอีกเยอะมาก เรายังไม่ได้ลองใช้ autoscan และ autoheader กันเลย การพัฒนาโครงการซอฟต์แวร์ในทางปฏิบัติยังมีรายละเอียดอีกพอสมควร อย่างเช่น การจัดไดเรกทอรี และการทำไลบรารี เอาไว้วันหลังจะมาเล่าให้ฟัง


Reference

  1. เทพพิทักษ์ การุณบุญญานันท์, แนะนำ GNU autotools, ประชุมเชิงปฏิบัติการ “การใช้ Development Tool เพื่อการพัฒนาซอฟต์แวร์บนลีนุกซ์“, มหาวิทยาลัยขอนแก่น, สิงหาคม 2546
  2. G. V. Vaughan, B. Elliston, T. Tromey and I. L. Taylor, “GNU Autoconf, Automake, and Libtools“, http://sources.redhat.com/autobook/