Category Archives: Blog

skuld.kitty.in.th

เมื่อวานขับรถกลับบ้าน .. 420 กิโลเมตร เติมน้ำมันที่กรุงเทพ 500 บาท ไฟเตือนน้ำมันหมดสว่างตั้งแต่เมืองพล (~70 ก.ม. ก่อนถึงขอนแก่น) .. มาเติมอีกทีที่ขอนแก่น น้ำมันเกือบเกลี้ยงถัง .. เบนซิน 95 อยู่ขอนแก่น ลิตรละ 22 บาทกว่า (T_T)

ที่บ้าน .. ลูกๆ ห้าตัวไม่ได้อาบน้ำหลายวันเพราะฝนตก แดดไม่ค่อยมี หมาที่บ้านถ้าแดดไม่ออกแล้วอาบน้ำมันจะเป็นหวัด … ป๊อกกี้น้ำหนักไม่ลดเลย น้องสาวบอกว่าถ้ากลับมาคราวหน้า น้ำหนักไม่ลดจะไม่ให้ตังค์ไปซื้อขนม .. อดแน่เอ็ง (- -‘)

วันนี้แวะเข้ามาจัดการ skuld.kitty.in.th ที่สัปดาห์ก่อนมันดับไปแล้วบูตไม่ขึ้น .. ปรากฏว่าเป็นเพราะแบ่งพาร์ทิชันใหม่ แล้วลืมตั้ง bootable flag .. พอรีบูตมันก็เลยไม่ไปไหน (- -‘) .. แต่ไหนๆ ก็ไหนๆ .. อัปเดตระบบซะหน่อย .. freebsd-update ทีนึง .. portupgrade ทีนึง .. rsync repository + web อีกทีนึง .. แก้ DNS records .. เปลี่ยน heatsink + พัดลมให้อีก .. สรุปตอนนี้ skuld.kitty.in.th ก็รันบนเครื่องตัวเองเหมือนเดิมแล้ว :D

Kernel 2.6.8 again / How THNIC serves .TH

First, new software releases: X11 R 6.8.0, gcc 3.4.2, and cdrtool 2.01

It seems that the new kernel (>= 2.6.8) still breaks user applications. The thing is that they tightened security of some of the commands within the kernel. Programs that were able to run by suid may not run properly unless you run it as root. AFAIK, these programs include cdrecords, k3b, and some dvd tools. I had reported the problem and solution for cdrecord some days ago, it was not it. Some people need to patch k3b too. The patch was suggested by Linus himself. MrChoke reported that k3b patched would allow root to write CD/DVD, non-root users still do not get any luck. So, for the next release of TLE, which is expected to use kernel >= 2.6.8, you may need to be root to burn CD/DVD.

Man, there are so many patches released to workaround the problem of kernel >= 2.6.8 and cdrecord (and k3b). Some of them just comment out parts of the code. It works, but the side effect is that it unlocks some limitations and would allow you to overwrite the firmware of your CD/DVD burner – gotta be careful ! This is why, as a package maintainer, I do not accept any patch easily. I want to know how the patch solve the problem. For this particular case, it tooks me days to read those patches, review, decide which ones should apply, and test them before actually build the binary packages.

me: I am using kernel 2.6.8.1-ck4. The kernel allows to burn CDs by just suid, without applying any patches to user programs (i.e., k3b, and cdrecord). The ck4 (and the later 2.6.8.1 ck tree) modifies SCSI command filters inside the kernel. Of course, this modification sacrifices levels of kernel security. I think it is, more or less, as secure as 2.6.7. It should be okay at least for desktop installation.

(เอ่อ .. ช่วงนี้กำลังเขียนธีสิส คิดอะไรเป็นภาษาอังกฤษจนลืมตัว พิมพ์ blog มาครึ่งนึงเป็นภาษาอังกฤษหมด .. เลยตามเลยละกัน .. – -‘)

For kitty.in.th, I’m still on building the backup site. My repository has been transferred to two servers: Belldandy in Ratchaburi, and Skuld at Khonkaen. A name server has been setup at each site. DNS records have been written so that the query to Ratchaburi would get answers of IP of Belldandy, and the query to Khonkaen would get those of Skuld. I expect Belldandy to primarily serve services of kitty.in.th. If she is off for one hour (TTL of the domain), all traffic to kitty.in.th would be redirected to her younger sister, Skuld, at Khonkaen automatically. Cool eh ? :)

Anyway, after set this up, I’ve seen quite a number of users had been redirected to Skuld even Belldandy was still up and fully operational. I think this is about DNS, so I asked Parkpoom, the manager of THNIC, about how the network of name servers of THNIC actually works. He explained that for a single .th domain, you need at least two name servers – logically labeled as primary and secondary name server. The RFC suggested that queries will go to ALL servers in round-robin fashion. However, he said the ISC/BIND software would check RTT to all name servers of the domain, and let the smallest RTT one to answer the query. So, it does not mean that the primary name server will always answer the queries, the secondary servers(s) may answer the queries too. In other words, the concept of primary/secondary name server is NOT for selecting the server to answer a query. (note: the primary/secondary thing is to synchronize DNS records among those servers of the domain).

So, I gotta reconfigure the name servers again. Skuld should be a secondary name server, providing the same DNS records as the primary. And if Belldandy is off, Skuld will be reconfigured to answer different DNS records so that traffic to kitty.in.th will be redirected to Khonkaen.

Damage Report !

หลังจากกลับมากจากราชบุรีได้วันเดียว เครื่องยืมที่เอาฮาร์ดดิสก์ไปฝากก็ออกอาการงอแงอีก จนในที่สุดประมาณเที่ยงๆ ของวันอาทิตย์เครื่องก็ freeze .. แล้วก็บูตไม่ขึ้นอีกเลย .. ปล่อยมันไปก่อน .. คิดว่ายังไงก็มีเครื่องสำรองที่ขอนแก่น ..

พอเข้าไปเตรียมระบบของเครื่องสำรอง .. ข่าวร้ายที่สองตามมาติดๆ เครื่องสำรองที่ขอนแก่น (skuld.kitty.in.th) ไม่ทำงาน ไม่รู้ดับ หรือโดนปลดสายแลน หรือ ฯลฯ .. อันนี้ยิ่งทำอะไรไม่ได้หนักไปใหญ่เพราะเครื่องนี้อยู่ในห้องทำงาน มีผมถือกุญแจคนเดียว .. นั่งคิดอยู่พักนึง ก็นึกได้ว่าเหลือเซิร์ฟเวอร์ที่ขอนแก่นอีกเครื่องที่เปิดไว้เป็น Secondary DNS อยู่ และกำลังจะทำเป็น mirror ของ TLE ไว้ที่ขอนแก่น .. เลยใส่ IP ของ skuld เป็น alias แล้วฝากเว็บของ kitty ไว้ชั่วคราว พร้อมกับโอน repository ทั้งหมดของ kitty ไปไว้ด้วย (ยังไงก็จะ mirror TLE อยู่แล้วนิ) .. ระหว่างโอนไฟล์ ก็เมลไป THNIC เปลี่ยน primary/secondary DNS ของ kitty.in.th ไปด้วย .. กะว่าไหนๆ ก็ไหนๆ revise ระบบใหม่เลยก็ดี วิกฤติพอจะพลิกเป็นโอกาสได้แล้วนิ .. บ่ายๆ เย็นๆ เว็บและ repository ก็โอนไปขอนแก่นเรียบร้อย .. รอ portupgrade อย่างเดียวก็ใช้งานได้แล้ว

ตกดึก .. ทางราชบุรีก็บอกมาว่า เครื่องยืมที่ราชบุรี ก็บูตได้แล้ว (อุวะ .. – -‘) เข้าไปเช็คไม่เจอร่องรอยอะไรแปลกๆ เลยนอกจากทางโน้นบอกมาว่าฮาร์ดดิสก์ทำงานเสียงดัง เป็นช่วงสั้นๆ ไม่กี่วิ .. เช็ค log ก็ยังไม่เจอรายงานข้อผิดพลาดในการทำงาน .. ก็เลยใช้ไปเรื่อยๆ .. เว็บทำงานได้ปกติดี ใช้งานได้หลายชั่วโมงเลย แต่พอเข้าหลังบ้านของเว็บ .. หน้าเว็บแสดงเป็นขยะออกมาให้ดู ไม่รู้มันส่งอะไรมา .. เช็ค log อีกที คราวนี้ error ขึ้นมาบาน ประมาณโพรเซส httpd พยายามอ่านข้อมูลจากพาร์ทิชันข้อมูลแล้วล้มเหลว .. คงเป็นปัญหาที่ดิสก์ Seagate 20 GB ที่เมานท์เป็นพาร์ทิชันข้อมูล เลยพยายามจะ unmount เพื่อ fsck ถ้าผ่านจะได้โอนข้อมูลมาเก็บไว้ที่ดิสก์อีกตัว (Quantum 8 GB – เหลือว่าง 5 GB) ที่เมาท์เป็น / อยู่ .. lsof เช็ค .. ไม่มีโพรเซสไหนอ้างอิงถึงพาร์ทิชัน .. สั่ง umount .. เคาะ Enter .. เครื่องก็ freeze ไปเลย .. บูตใหม่ก็ไม่ยอมเมานท์แล้ว อาการเพียบขนาดนี้ เลยตัดใจถอดสายแพกับสายไฟออกจากดิสก์ที่เจ๊ง .. ยังไงก็ยังเหลือที่ในดิสก์อีกตัวมากพอทำงานต่อได้ .. ช่วงกลางวัน วันนี้คงพยายามทำให้เว็บทำงานให้ได้ก่อน .. ส่วน repository คืนนี้ดึกๆ ถึงจะโอนไปไว้ที่ราชบุรี ..

ก็ยังดีที่เซิร์ฟเวอร์ทั้งหมดวางไว้ตั้งแต่แรกแล้วว่ามีไว้บริการจริงๆ ไม่ได้เก็บข้อมูลสำคัญอะไรเลย ถึงจะเจ๊งก็ไม่ถึงกับล้มละลายทางข้อมูล .. kitty repository ตอนนี้มี online ถึง 5 สำเนาแล้ว … จะล่มหมดก็ให้มันรู้ไป

.. แสดงว่าที่มันมีปัญหาตั้งแต่แรกก็คงเป็นที่ดิสก์นี่ล่ะมั๊ง .. (- -‘)

Guest House Ratchaburi

พุธ-พฤหัสที่ผ่านมา มีเพื่อนจะไปราชบุรีเพื่อถ่ายรูปสำหรับประชาสัมพันธ์เกสต์เฮาส์ราชบุรี (เจ้าของเดียวกับ ISP ที่ฝาก belldandy ไว้) เลยได้ติดรถแวะไปดูเครื่องที่เอามาใช้แทนด้วย (Gateway 2000 G6-266 P-II 266 MHz 192 MB RAM – HDD ตัวเดิม 8 + 20 GB) .. ไหนๆ ก็ไหนๆ ไปถ่ายรูปที่เกสต์เฮาส์ด้วยเลยก็แล้วกัน .. ปลายปีนี้กีฬาแห่งชาติจัดที่ราชบุรี ใครผ่านก็แวะไปพักได้ รับรองว่าสะอาดและสะดวกสบายกว่าโรงแรมอื่นๆ ในตัวจังหวัด และแน่นอนว่ามีอินเทอร์เน็ตให้ใช้ทุกห้อง :)

[nggallery id=23]

Scribus 1.2 ออกแล้วตั้งแต่ราวๆ ปลายสัปดาห์ก่อน มีข่าวว่าสำนักพิมพ์ในต่างประเทศเอามาใช้งานจริงๆ จังๆ กันแล้ว (สูตร: Scribus + Inkscape + GIMP) .. ส่วนภาษาไทยภาษาไทยแสดงผลได้ดีขึ้น วรรณยุกต์ สระบน-ล่างไม่เยื้องเหมือนแต่ก่อนแล้ว ถ้าแก้สระลอยกับตัดคำไทยได้ก็สวยเลย :)

Philips-based Webcam Driver

เมื่อไม่นานมานี้ ลินุสได้ตัดสินใจถอดไดรเวอร์ Philips-based USB webcam ออกจากลินุกซ์ เคอร์เนลเวอร์ชันถัดไปอาจจะไม่สนับสนุนเว็บแคมที่ใช้ชิปของ Philips แล้ว … เรื่องนี้ส่งผลกระทบต่อผู้ใช้เต็มๆ เลยกลายเป็นเรื่องที่วิพากษ์วิจารณ์กันเยอะทีเดียว

เรื่องของเรื่องก็คือไดรเวอร์ตัวนี้มันไม่โอเพ่นซอร์ส หรืออาจจะเรียกว่ากึ่งโอเพ่นซอร์ส .. ไดรเวอร์นี้ประกอบด้วยสองส่วนคือ PWCX ที่เป็นโค้ดของไดรเวอร์ พัฒนาโดย Nemosoft Unv. โค้ดส่วนนี้ไม่ได้โอเพ่นซอร์สเพราะติด NDA (Non-Disclosure Agreement) ทาง Nemosoft จึงจำต้องเผยแพร่เป็นไบนารีเพียงอย่างเดียว เมื่อเปิดเผยไม่ได้ PWCX จึงไม่สามารถอยู่ในเคอร์เนลได้ .. เพื่อแก้ปัญหาเรื่องนี้จึงมีโค้ดส่วน PWC ทำหน้าที่เป็นจุดเชื่อม หรือ ‘hook’ ให้กับ PWCX โดย PWC เผยแพร่ด้วย GPL และอยู่ในเคอร์เนลของลินุกซ์ .. โค้ด PWC เป็นไดรเวอร์ทำงานด้วยตัวมันเองได้ แต่จำกัดมากๆ และในความเป็นจริง PWC ไม่ได้เขียนเป็นไดรเวอร์ แต่ใช้เพื่อเป็น hook โดยเฉพาะ .. การทำ hook สำหรับไดรเวอร์แบบไบนารีในเคอร์เนลถือเป็นเรื่องที่ยอมรับไม่ได้ เพราะทำให้เคอร์เนลไม่ ‘สะอาด’ จริง .. เมื่อเป็นเช่นนั้น Greg Kroah (USB maintainer) จึงตัดโค้ดส่วนของ hook ใน PWC ออก (เน้น: ตัดโค้ดของ hook .. ไม่ใช่ตัด PWC) ทำให้ต่อไป PWC จะไม่สามารถโหลด PWCX มาใช้งานได้ .. Nemosoft เห็นเช่นนั้นก็มีท่าทีที่ไม่พอใจเท่าไหร่นัก จึงตัดสินใจหยุดพัฒนาไดรเวอร์นี้ทั้ง PWC/PWCX และขอให้ถอด PWC ออกจากเคอร์เนล .. และลินุสก็ทำตามประสงค์ของ Nemosoft

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

  1. PWC เรียกว่าเป็น hook-only for binary-only driver ซึ่งทำให้เคอร์เนลไม่เสรี/โอเพน
  2. ไม่มีคนรับดูแล PWC ต่อจาก Nemosoft และ
  3. ลินุสถือว่า Nemosoft เป็นเจ้าของโค้ด PWC/PWCX เมื่อเจ้าของไม่ต้องการให้โค้ดอยู่ในเคอร์เนล ก็ถือว่าเป็นเรื่องใหญ่และควรจะให้เกียรติทำตามความต้องการ ถึงแม้ว่าในความเป็นจริงแล้วไม่มีใครเป็นเจ้าของโค้ดนี้ตั้งแต่แปะคำว่า GPL ..

เหตุผลที่ลินุสเน้นย้ำที่สุดคือข้อ 3 นี่แหละ ..

ใครถูกใครผิดก็ไม่รู้เหมือนกัน สำหรับผม เรื่องโอเพนซอร์สมีความสำคัญเหนือกว่าเรื่องเอาใจผู้ใช้เสมอ ไม่ว่าน้ำหนักผู้ใช้จะกดดันขนาดไหน แต่ถ้าทำให้โอเพนซอร์สไม่สะอาดเมื่อไหร่ คำว่า ‘โอเพน’ หรือ ‘ฟรี’ (as in free speech) จะไม่มีความหมายอีกเลย หากหลักการนี้ล้ม ปัญหาจะตามมาหลังจากนั้นอีกเยอะมาก ไม่เพียงเรื่องแนวคิดของโอเพน/ฟรีจะเสียไป แต่ในแง่เทคนิคก็จะเสียไปด้วย การที่มันโอเพน/ฟรีทำให้ลินุกซ์ก้าวไปได้เร็วและมั่นคง เพราะทุกคนเห็นซอร์ส ทุกคนสามารถช่วยกันแก้ไข ทุกคนสามารถช่วยปรับปรุงให้มันดีขึ้นได้ การปกปิดซอร์สทำให้ไม่สามารถคงสภาพการทำงานแบบนี้ได้อีก เสถียรภาพ และความปลอดภัยย่อมลดน้อยลง หากเกิดขึ้นกับเคอร์เนลก็คงไม่ใช่เรื่องดี

ทางออกสำหรับเรื่องนี้ ให้สวยที่สุดคือพัฒนาไดรเวอร์ที่เป็นโอเพนซอร์ส ถ้าทำไม่ได้จริงๆ ก็ย้ายส่วนไบนารีไปอยู่นอกเคอร์เนล หรือทำไดรเวอร์โมดูลที่ไม่ต้องใช้ hook ในเคอร์เนล ..

.. สุดท้ายจะออกมายังไง คงต้องติดตามดูกันต่อไป

PHP 4.3.8 on FreeBSD

เมื่อวานสั่ง portupgrade -a บน belldandy เสร็จแล้ว restart apache ขึ้นมาปรากฏว่า http://kitty.in.th เปลี๊ยนไป๋ .. feed ก็เจ๊งไปด้วย .. งงไปพักนึงก่อนจะหาเจอว่า แพ็กเกจ PHP บน FreeBSD หันมาแยกโมดูลเป็นส่วนๆ แล้ว โดยแยกไปไว้คนละที่กันเลย .. ใน ports ของ FreeBSD ตัวหลักยังเป็น lang/php4 หรือ www/mod_php4 (conflict กัน เลือกลงตัวเดียวพอ) .. จากนั้นต้องการอะไรเพิ่มเติมก็ต้องตามไปติดตั้งเอาเอง เช่น ต้องการเชื่อมกับ MySQL ก็ต้องลง databases/php4-mysql (หรือ php3- / php5- ) จะใช้ iconv ก็ต้องลง converters/php4-iconv หรือ จะใช้ zlib ก็ต้องลง archivers/php4-zlib ..

อืม ภาระเพิ่มขึ้นอีกนิด ถ้ารู้แล้วก็ไม่ใช่เรื่องยากอะไร .. ทำแบบนี้ก็ดีเหมือนกัน จะใช้อะไรก็คอมไพล์ติดตั้งเฉพาะโมดูลนั้นๆ โดยไม่ต้องเสียเวลาคอมไพล์ PHP ใหม่ทั้งหมดหมด จะถอดโมดูลออกก็ง่าย :)

Pentium III optimized packages

ค้างเรื่อง optimization packages ไว้นาน นั่งหาข้อมูลเพิ่มเติมแล้วก็เจอว่า โปรแกรมที่ optimize ไม่เหมือนกันอาจมี running time ต่างกันได้ถึง 20 – 30% .. เท่าที่รู้คือ default optflag ของ Red Hat/Fedora Core และ TLE ตั้งไว้ที่

-O2 -g -march=i386 -mcpu=i686

ซึ่งมีเสถียรภาพที่ดี และการันตีว่าใช้งานกับซีพียู x86 >= i386 ได้ทุกรุ่น แต่เรื่องประสิทธิภาพยังอัดได้อีกเยอะ อย่างแพ็กเกจที่ผม build ทั้งหมด (*.kit.{i386|i486|i686}.rpm) ตั้ง optflags ไว้ที่

-O3 --march=i386 --mcpu=i686 --pipe --fomit-frame-pointer

ก็จะเร็วขึ้นอีกนิด .. เมื่อวานอยากทำแพ็กเกจสำหรับ Pentium III มาใช้กับ Peorth (P-III 1 GHz) เลยซัด optflag ของ Pentium III ซะเต็มๆ (เอ่อ จะว่าเต็มๆ ก็ไม่ใช่แฮะ จะใส่มากกว่านี้ก็ได้ถ้าจะยอมลดเสถียรภาพ)

-O3 -march=pentium3 -pipe -fomit-frame-pointer
-fforce-addr -falign-functions=4 -fprefetch-loop-arrays

ที่จริงแล้วถ้าขยายออกมาจะยาวกว่านี้ เพราะ flag บางตัวจะ imply ตัวอื่นด้วย เช่น -O3 จะใส่ –finline-functions กับ -frename-registers เป็นต้น .. อุวะ .. ท่าทางเรื่องมันจะยาว ไว้จะเขียนมาให้อ่านอีกที .. กลับมาที่เรื่องแพ็กเกจก่อน เมื่อวานที่ optimize ไปแล้วคือ (ยก src.rpm มาให้ดูละกัน)

freetype-2.1.8-1.bci.1.pentium3.kit.src.rpm
glib2-2.4.5-1.pentium3.kit.src.rpm
gtk2-2.4.4-1.pentium3.kit.src.rpm
libgnome-2.6.1-1.pentium3.kit.src.rpm
metacity-2.8.1-2.1.pentium3.kit.src.rpm
nautilus-2.6.3-1.pentium3.kit.src.rpm
pango-1.4.1-2.pentium3.kit.src.rpm
qt-3.3.3-1.pentium3.kit.src.rpm
xorg-x11-6.7.0-2.1.pentium3.kit.src.rpm

เท่าที่ใช้งานจนถึงตอนนี้เสถียรภาพก็ถือว่า ok ยังไม่เจออะไรแปลกๆ .. ส่วนเรื่องประสิทธิภาพ ยังไม่รู้จะวัดยังไง ไม่มีเครื่องมือเลย .. ที่จริงพยายาม optimize glibc ด้วย แต่ไม่สำเร็จ ได้ binary มาไม่ครบ งงไปเลย (- -‘) .. ถ้า optimize glibc ได้ล่ะก็ ถึงจะใช้ทะเลประสิทธิภาพการทำงานก็ไม่ห่าง Gentoo เท่าไหร่แล้ว :)

หลังจากนี้ก็จะเป็นคิว optimize Athlon XP … ฮุๆๆ

Belldandy upgraded

ระยะหลังเซิร์ฟเวอร์หลัก (belldandy.kitty.in.th) เริ่มมีอาการไม่ค่อยดี วันนี้เลยได้รบกวนให้ทาง ISP ย้ายฮาร์ดดิสก์ มาไว้อีกเครื่องนึงที่ว่างๆ อยู่ .. ตอนนี้ belldandy เปลี่ยนมาใช้เครื่อง P-II 266 MHz เป็นการชั่วคราว ระบบทำงานได้ราบรื่น แต่ปัญหา segfault ยังอยู่เหมือนเดิม memtest หลายรอบแล้วก็ปกติ ซีพียูก็ไม่น่าใช่ ถ้าไม่ใช่ฮาร์ดแวร์ก็เหลือแต่ซอฟต์แวร์แล้วเนี่ยะ .. ยังไง ตอนนี้ต้องทนใช้ไปก่อน พร้อมกับหาสาเหตุไปด้วย

และเพราะเหตุนี้ เมื่อวานเลยสำรองข้อมูลเกือบทั้งหมดไปไว้ที่ขอนแก่น (skuld – mirror/backup ของ kitty.in.th) .. ถ้าเครื่องหลักเจ๊งจริงๆ ก็ยังมีเครื่องสำรองไว้บริการ .. :P

Gaim / Auto Identify with NickServ

หลายคนอาจจะพอทราบแล้วว่าการรับส่ง IM ที่เป็น 8-bit ใน gaim นั้นมีปัญหาเพราะเขา assume ว่า 8-bit เป็น ISO-8859-1 เสมอ .. ผมเคยแฮ็กตรงนี้ไปแล้วโดยให้ assume ตาม locale ของระบบแทน (เช่น th_TH จะเป็น TIS-620) แล้วก็ตรวจสอบผู้รับด้วยว่าสามารถรับ UTF-8 ได้หรือไม่ ถ้าไม่ได้ก็จะส่งข้อความโดย encode ตาม locale เช่นกัน .. ผมส่งแพตช์นี้ไปให้ gaim ตั้งแต่สมัยเวอร์ชัน 0.6 กว่าๆ ทีมพัฒนาเขาเคยปฏิเสธไปทีนึงแล้ว แต่ระยะหลังเริ่มมีคนเจอปัญหาแบบเดียวกันนี้ในภาษาอื่นๆ เลยมีแรงสนับสนุนให้แก้ปัญหามากขึ้น ท้ายที่สุดปัญหาการแสดง IM ที่ยังรับ-ส่งเป็น 8-bit อยู่ก็ได้รับการแก้ไขแล้วใน CVS โดยตั้ง encoding สำหรับการรับส่งข้อความ 8-bit ได้ที่ preferences .. ต่อไปก็ไม่ต้องแพตช์เองแล้ว :D .. (อาจจะได้แพตช์เพื่อตั้ง default encoding เป็น TIS-620 แทน :P)

อีกเรื่องนึง เกี่ยวกับ gaim เหมือนกัน .. ผมใช้ gaim เข้า IRC เป็นประจำ เพราะปกติก็จะ online IM ด้วย gaim ตลอดอยู่แล้ว สำหรับ IRC จะน่ารำคาญนิดหน่อยตอน login เพราะผม register nickname ไว้กับ NickServ ของ irc.freenode.net เวลาเชื่อมเข้าเซิร์ฟเวอร์เลยต้อง identify ตัวเองด้วย .. ทำบ่อยๆ เข้าก็เลยคิดว่าหาวิธีให้มัน identify อัตโนมัติดีกว่า .. ก็พอดีว่า gaim มันสามารถตั้งให้ส่งข้อความเวลามี buddy sign-on, online, ฯลฯ เลยใช้วิธีนี้แหละง่ายดี .. วิธีการก็คือ

  1. เพิ่ม NickServ เข้ามาเป็น buddy ก่อน วิธีที่ง่ายๆ คือส่ง “/msg NickServ help” ไปทีนึง พอ dialog ของ NickServ ปรากฏก็เลือกเมนู Conversation » Add .. ทำตามขึ้นตอนเพิ่ม buddy จนเสร็จ
  2. คลิ๊กขวาที่ชื่อ NickServ ที่ปรากฏใน Buddy List จะปรากฏเมนูขึ้นมา ให้เลือก Add Buddy Pounce แล้ว gaim จะแสดง dialog New Buddy Pounce
  3. ตั้งค่าดังนี้
    • Account: เลือก irc account
    • Buddy Name: NickServ – ถ้าทำตามขั้นตอนมามันควรจะขึ้นเป็น NickServ อยู่แล้ว ก็ไม่ต้องไปแตะมัน
    • Pounce When: เลือก Sign on อย่างเดียว
    • Pounce Action: เลือก Send a message แล้วพิมพ์ข้อความ IDENTIFY ตามด้วยรหัสผ่านที่ใช้
    • เลือก Save this pounce after activate
    • กด Save

ทีนี้เวลาเข้า irc มันก็จะ identify เองอัตโนมัติ ไม่ต้องพิมพ์เองแล้ว :)

Added: gaim 0.82 เพิ่งรีลีสตะกี้ .. account ICQ ตั้ง default encoding ได้แล้ว :)

Some Kernel Trees :P

เมื่อวาน blog เรื่องเคอร์เนลแพตช์ของ mm และ ck ไปแล้ว ยังมีแพตช์เคอร์เนลอีกหลายตัว แต่ละตัวก็ maintain tree ของตัวเอง มีจุดประสงค์ในการใช้ต่างๆ กันไป สรุปมาให้อ่านกัน:

  • aa tree ของ Andrea Arcangeli เน้นเรื่อง VM เป็นหลัก .. aa tree merge เข้าเคอร์เนลตั้งแต่ 2.4.10 .. VM ของเคอร์เนล 2.6 ก็มีพื้นฐานมาจาก aa tree
  • ac tree ของ Alan Cox .. Alan เป็น kernel maintainer ตั้งแต่ปลาย 2.0 2.2 เลยมาถึง 2.4 ช่วงต้นๆ ทุกคนยกย่องให้เป็นมือขวาของ Linus .. หลังวางมือ Alan ก็ยังมีส่วนช่วยงานเคอร์เนลอยู่อย่างต่อเนื่อง โดย maintain ac tree ที่มีฟีเจอร์ใหม่ๆ ที่ไม่อยู่ในวานิลลา .. ac tree ยังนับเป็นการทดสอบ bugfix และฟีเจอร์ ก่อนจะส่งให้ Marcello Tosatti (2.4 kernel maintainer ต่อจาก Alan) อีกทีด้วย .. ac patch หายร่วมปีแล้ว เพราะ Alan หยุดงานเคอร์เนลชั่วคราวไปเรียนต่อด้านบริหาร
  • bk tree เป็น snapshot จากโค้ดล่าสุดที่ merge เข้าเคอร์เนล .. ชื่อ bk มาจาก BitKeeper ซึ่งเป็นซอฟต์แวร์ SCM ที่ใช้ในการจัดการโค้ดของเคอร์เนลทั้งหมด คล้ายๆ CVS, SVN .. ลินุสเลือกใช้ BitKeeper เพราะสะดวกในการจัดการ changeset มากกว่าตัวอื่น .. BitKeeper เป็น commercial software แต่โครงการโอเพนซอร์สใช้งานได้ฟรี (as in free beer)
  • ck tree ของ Con Kolivas .. Con รวบรวมแพตช์เพื่องานเดสก์ท็อป/interactive/low latency เป็นหลัก และยังแฮ็ก scheduling ในเคอร์เนลให้เหมาะกับงานเดสก์ท็อป สมัยนึง ck tree เป็นแพตช์เซ็ตที่ทำงานเร็วกว่าวานิลลาจนรู้สึกได้
  • mm tree ของ Andrew Morton .. ตอนจะรีลีส 2.6 Linus ชวนให้ Andrew มาช่วย maintain kernel แต่ Andrew ก็แบ่งรับแบ่งสู้ สุดท้ายแล้ว Linus เลยเป็นคน maintain อย่างเป็นทางการ ในขณะที่ Andrew ช่วยรวบรวมแพตช์และแยก mm tree ไว้เพื่อให้ทดสอบกันในทำนองเดียวกับ ac tree / 2.4

นอกจาก tree ยอดนิยมข้างบนนี้ ก็ยังมี patch/patchset อีกเยอะนะ :

  • mjb ของ Martin J. Bligh (Scalability)
  • wli ของ William Lee Irwin (VM)
  • lsm ของ Chris Wright (Linux Security Modules)
  • osdl ของ OSDL (database/enterprise-level hacks)
  • dj ของ Dave Jones (I/O AGP)
  • rmap Rik van Riel (reverse mapping vm)

me:

[kitt@peorth web]$ uname -a
Linux peorth.kitty.in.th 2.6.8.1-ck4 #4
Tue Aug 24 21:30:27 ICT 2004 i686 i686 i386 GNU/Linux