Wednesday, April 14, 2010

GNOME บน FreeBSD 8.0

อีกหนึ่งโปรเจกต์ FreeBSD ของผมคือการเอา FreeBSD มาใช้เป็นเดสก์ท็อปครับ (ฮ่าๆๆๆ เท่มั้ยหละ) แน่นอนว่าจะเอามาใช้เป็นเดสก์ท็อปก็ต้องมีการติดตั้ง Desktop Environment ไม่งั้นจะใช้ไงหละ

DE ที่ผมเลือกแบบไม่ต้องคิดเลยก็คือ GNOME ครับ (เห็นบางคนอ่านมันว่า "กะโนม" (คล้ายๆแบบกะนู) แต่ผมอ่านมันว่าจีโนม) ขี้เกียจหาอันใหม่ เอาอันนี้แหละ คุ้นเคยกันดีเพราะผมเคยลองใช้บน FreeBSD 7.x มาก่อนแล้วรอบนึงครับ ก็เลยคิดว่าบน 8.0 ก็คงเหมือนๆเดิม ก็ลงตามเสต็ปเดิม ปรากฏว่าตอนสั่ง GNOME ทำงานมันดันฟ้องว่าไม่มีไฟล์ /var/run/dbus.pid

หลังจากโง่อยู่นานก็พบว่า GNOME บน 8.0 มันต้องการเซอวิส dbus ด้วย (ไอ้ error ที่มันฟ้องแปลว่ามันหาไฟล์ process id dbus ไม่เจอ นั่นเป็นเพราะว่า dbus มันไม่ได้รันอยู่) เพราะงั้นเราต้องสตาร์ทมันก่อนสตาร์ท GNOME

หลังจากที่รัน GNOME ขึ้นมาได้ก็พบปัญหาอีกอย่างนึงคือ touchpad มันไม่ทำงานครับ ผมไม่สามารถควบคุมเคอเซอร์ได้ ตอนแรกก็นึกว่าเป็นปัญหาที่ FreeBSD กับ touchpad ของผม แต่บน X ธรรมดามันดันทำงานได้แฮะ อืม แล้วเป็นเพราะอะไรหละเนี่ย

พอค้นไปค้นมาก็เจอว่า GNOME เนี่ยมันต้องการเซอวิส hald รันด้วย ดังนั้นเราก็ต้องไปสตาร์ทมันก่อนอีกเหมือนกัน
หลังจากที่สตาร์ทเซอวิส 2 ตัวนี้แล้ว GNOME ก็จะใช้งานได้ตามปกติ

ปล[0] การสตาร์ท dbus กับ hald สามารถสตาร์ทได้ด้วย rc script ใน /usr/local/etc/rc.d ชื่อสคิปท์คือ dbus และ hald (ถ้าตอนลงไม่ได้คอนฟิกอะไรเป็นพิเศษมันจะอยู่ที่พาธนี้แหละ)
ปล[1] ปกติผมสั่ง `gdm` จากคอมมานด์ไลน์เลย แต่วันนี้พึ่งนึกได้ มันต้องมี rc script สิ พอลองค้นดูก็เห็นอยู่ที่ /usr/local/etc/rc.d/gdm

Monday, April 12, 2010

[C code] string copy ใน C

ความสุขอย่างนึงในการเขียนโปรแกรมของผมคือการแก้โค้ดที่ทำงานได้ให้มันสั้นลงครับ (แล้วโค้ดที่ทำงานได้มันจะบั๊กก็ตอนแก้ให้สั้นเนี่ยแหละ ฮ่าๆๆ) ไม่รู้สิ รู้สึกว่่ามันเจ๋งดีนะเวลาได้เขียนโค้ด while หรือ for ปล่าวๆแบบให้การทำงานอยู่ในเงื่อนไขของลูปไปเลย เหอๆ
เมื่อวานผมก็อ่านโค้ด string copy ในหนังสือภาษาซีเล่มนึง โค้ดนี้เขียนโดยใช้ใช้พอยท์เตอร์ (เพราะมันอยู่ในบทเรื่องพอยท์เตอร์) โค้ดในหนังสือตอนแรกออกมาเป็นแบบนี้ครับ

void strcpy(char *s, char *t) {
while((*s = *t) != '\0') {
s++;
t++;
}
}

ไอ้คนอย่างผมก็เลยนั่งเขียนให้มันเหลือแค่บรรทัดเดียวไอ้ตรงวน while โค้ดผมได้ออกมาแบบนี้ครับ

void strcpy(char *s, char *t) {
while((*s++ = *t++) != '\0');
}

แฮ่ ในที่สุดมันก็เหลือบรรทัดเดียว ซึ่งพอผมอ่านหนังสือต่อไปมันก็ลดรูปมาเหลือเท่าที่ผมเขียนครับ
แต่ยังไม่หมด ตัวอย่างต่อมามันดันเขียนลูปได้สั้นกว่านี้อีก!!!

void strcpy(char *s, char *t) {
while(*s++ = *t++);
}

โห มันใช้ความบังเอิญที่ว่า character constant '\0' ดันมีค่าเป็น 0 พอดีมาเป็นเงื่อนไขในการเช็ค
สุดยอดไปเลยหวะ ชอบๆ

ก็เลยต้องมาเขียนบล็อกเก็บไว้หน่อย :)

Friday, April 9, 2010

[C code] if in C

ไปอ่านเจอมาจาก stackoverflow (แต่จำกระทู้ไม่ได้เลยไม่ได้ทำลิงค์ไป) เห็นมีคนมาถามว่าเวลาเขียน if เปรียบเทียบตัวแปรกับตัวเลข เขียนแบบนี้มันดีกว่ายังไง

if(4 == i)

งงดิครับ ตั้งแต่เกิดมาไม่เคยเห็นครูบาอาจารย์ที่ไหนบอกว่าเขียนแบบนี้มันดีกว่า ไอ้คนตั้งกระทู้มันก็ไม่รู้ไปได้ยินมาจากไหน แต่ก็มีคนเข้ามาตอบให้ได้ว่าดีกว่ายังไง
โค้ดแบบนี้จะดีกว่าเฉพาะในภาษาซีเท่านั้นครับ เพราะว่าเป็นการลดบั๊กจากการพิมพ์ผิด เพราะว่าในภาษาซีถ้าเราตั้งใจจะเปรียบเทียบค่าโดยพิมพ์แบบนี้

if(i == 4)

เป็น

if(i = 4)

จะได้ว่า if นี้เป็นจริงเสมอ (ส่วนจาวาจะคอมไพล์ไม่ผ่าน) ดังนั้นพอเขียนกลับกัน ถึงเขียนผิดเป็น

if(4 = i)

คอมไพเลอร์ก็จะฟ้องขึ้นมา
แหม่ ไอ้คนคิดวิธีเขียนโค้ดแบบนี้มันสุดยอดจริงๆ