blog code updated / gaim 0.77

วันนี้เพิ่ม code ในหน้า blog ให้สร้างและจัดการเรื่องปฏิทิน ก็ได้อาศัย code ทำปฏิทินจาก zend บวกกับเชื่อมการแสดงผลกับ mysql และทำให้แสดงเป็นภาษาไทย ผลที่ได้ก็อย่างที่เห็นนี่ล่ะครับ :)

gaim รีลีสเวอร์ชัน 0.77 แล้ว system log ที่หายไปนาน เวอร์ชันนี้กลับมาแล้ว .. วันนี้เลยนั่งทดสอบและทำแพ็กเกจ gaim 0.77 ให้ทะเล 5.5 .. gaim ยังคงมีปัญหากับ sim อยู่เหมือนเดิม .. ส่วนภาษาไทย ต้องทำแพตช์กันใหม่เพราะแพตช์ตัวเดิมใช้กับ 0.77 ไม่ได้ .. TLE 5.5 สั่ง apt-get update ตามด้วย apt-get upgrade ครับ

Tip of the day: ลินุกซ์อัพเดต atime (access timestamp) ของไฟล์ตลอดเวลา ฮาร์ดดิสก์จึงมีการเขียนข้อมูลตลอดเวลา .. ปกติแล้ว atime ไม่ใช่ attribute ที่สำคัญนักสำหรับเครื่องที่ทำงานแบบเดสก์ท็อป เราสามารถยกเลิก atime ได้โดยแก้ไฟล์ /etc/fstab ใส่ option noatime เพิ่มเข้าไป เช่น

/dev/hda2   /   ext3  defaults,noatime 1 1

จากนั้นก็รีบูต เป็นอันเรียบร้อย

Ogg-ize my CDs

เรื่องของเรื่องก็คือวันนี้ อยากฟังเพลง Praise ของ T-Square (ชุด Gravity) ก็เลยตั้งใจว่าจะเอาแผ่น CD มา rip + encode เป็น ogg .. แต่ไหนๆ ก็ไหนๆ ยก CD มาทั้งลังโลด .. ว่าแล้วก็นั่งเอา grip มา rip + encode ไปหลายสิบแผ่น ไล่จาก A ยัน Z ขาดไปไม่กี่ตัว ก็มี

  • Al Jarreau
  • Boy Thai
  • Casiopea
  • Dave Grusin
  • Dave Koz
  • David Foster
  • Earl Klugh
  • Fourplay
  • George Benson
  • George Winston
  • Larry Carlton
  • Lee Ritenour
  • Mile Davis
  • Shakatak
  • Steve Vai
  • T-SQUARE
  • Thom Rotella Band
  • Tommy Emmanuel
  • Zard

.. พื้นที่ฮาร์ดดิสก์หายไปเป็นกิ๊กๆ .. :P

gaim v.s. sim

เปล่าๆๆ ไม่ใช่จะเปรียบเทียบข้อดีข้อเสีย แต่ที่เขียนถึงเพราะมันมีปัญหาต่ะหาก เรื่องของเรื่องก็คือ sim ส่ง instant message เป็น HTML มาให้ gaim ซึ่งเดิม gaim < 0.76 แสดงผลได้ไม่มีปัญหา เพราะ parse HTML ให้ด้วย แต่มาถึงเวอร์ชัน 0.76 ทีมพัฒนาพิจารณาแล้วว่าโพรโตคอล Oscar ICQ มันไม่ได้ออกแบบให้สนับสนุน HTML มาตั้งแต่แรก ก็เลยตัดส่วน parse HTML ออกไป ทำให้ message ของ sim แสดงเป็น HTML tag อันไม่พึงประสงค์ขึ้นมาด้วย .. วันนี้ผมเลยทำ workaround patch เติมเข้าไปใน gaim 0.76 แล้ว build package สำหรับ TLE 5.5 .. patch นี้คงไม่ submit เข้าต้นน้ำเพราะไม่ใช่วิธีแก้ปัญหาจริงๆ (ซึ่งทาง gaim บอกว่าต้่องให้ sim เป็นคนแก้ .. ไม่รู้ทีมพัฒนาของ sim จะว่ายังไง :P)

kitty.in.th ขึ้นปีที่สามแล้ว

ที่รู้ก็เพราะ …. มีใบทวงค่าโดเมนเนมมาน่ะสิ (T_T)

ปีละ 800 + VAT 7%

.. ไม่มาก ไม่น้อย .. ใครจะบริจาคเพื่อช่วยเหลือไซต์กิ๊กก๊อกแห่งนี้ ติดต่อ kitty (a) kitty · in · th ได้ตลอดเวลาครับ :P

Site History

ใส่ไว้เป็นหลักฐานเสียหน่อย

Fri, 01 Mar 2002       :: Born
Fri, 01 March 2002     :: Under Construction Page
Sun, 17 March 2002     :: Mail Configured
Fri, 4 May 2002        :: Site Configured
Thu, 16 May 2002       :: VirtualHost Configured
Sun, 2 June 2002       :: Zen Content Acquired
Mon, 10 June 2002      :: PHP Implemented
Sat, 15 June 2002      :: Favicon Created
Tue, 23 July 2002      :: Upgrade to gzipslack 8.1
Thu, 3 October 2002    :: Severely crashed by electric shock
Sat, 11 October 2002   :: Server recovered
Sat, 02 November 2002  :: New server, FreeBSD 4.5-RELEASE
Sat, 19 April 2003     :: Script rewritten
Sun, 03 August 2003    :: Upgrade OS to FreeBSD 4.8-RELEASE
Sat, 28 September 2003 :: Site update / Rewrite all scripts
Thu, 8 January 2004    :: Site update / Add gallery management
Tue, 13 January 2004   :: Add APT supported
Fri, 19 January 2004   :: Upgrade OS to FreeBSD 4.9-RELEASE
Thu, 4 March 2004      :: Add repository page

กรุงเทพ – ขอนแก่น = 10 ชั่วโมง

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

ระยะทางจากเอไอทีถึงขอนแก่นประมาณสี่ร้อยกิโลเมตร ปกติผมใช้เวลาประมาณสี่ถึงห้าชั่วโมง (ดีที่สุดที่ทำได้คือสามชั่วโมงสิบนาที) วันนี้ออกจากเอไอที ถึง สระบุรีก็ปกติดีอยู่หรอก แต่หลังจากนั้นก็ติดอนาถ .. จากสระบุรีถึงสี่คิ้วร้อยกิโลนิดๆ ฟาดไปเกือบเจ็ดชั่วโมง “เจ็ด” ชั่วโมง ครับพี่น้อง .. มันอะไรกันเว้ยยย

.. ก็ยังดี หลังจากพ้นสี่คิ้วก็ไม่ติด ถึงแม้รถจะเยอะกว่าปกติ .. สรุป ออกจากเอไอทีบ่ายสอง ถึงขอนแก่นสี่ทุ่ม .. เฮ่อ ประเทศไท๊ยย

ALSA : Playback เสียงพร้อมกันด้วย Dmix

ปกติแล้วระบบเสียงบนลินุกซ์ ไม่ว่าจะใช้ ALSA หรือ OSS อนุญาตให้แอพพลิเคชันใช้งานได้เพียงตัวเดียวเท่านั้น เพราะเหตุนี้ หาก XMMS กำลัง playback ผ่าน ALSA แล้ว โปรแกรมอื่นๆ จะใช้ ALSA ไม่ได้ .. ที่จริงแล้วระบบเสียงทุกๆ โอเอสก็เป็นแบบนี้ล่ะครับ เพราะข้อจำกัดจริงๆ อยู่ที่ซาวด์การ์ดซึ่งเกือบทั้งหมดนี้มีชิปสังเคราะห์เสียงเพียงตัวเดียว .. เพื่อแก้ปัญหานี้ บนลินุกซ์จึงมีซอฟต์แวร์ที่เรียกกันว่าซาวด์เซิร์ฟเวอร์ เช่น aRTs ESD NAS หรือ JACK ทำหน้าที่เป็นตัวบริการแทนไดรเวอร์ โดยรับหน้าที่ในการมิกซ์เสียงเพื่อให้แอพพลิเคชันหลายๆ ตัวใช้งานระบบเสียงได้พร้อมๆ กัน .. อย่างไรก็ตาม ข้อเสียของซาวด์เซิร์ฟเวอร์ที่พบในปัจจุบันคือคุณภาพเสียงจะลดลงเมื่อแอพพลิเคชันใช้งานกันหลายตัว โดยเฉพาะการ playback ในอัตราแซมปลิ้งที่ต่างๆ ไปจากความสามารถของซาวด์การ์ด อีกทั้งโปรแกรมต้องเขียนให้สนับสนุนซาวด์เซิร์ฟเวอร์นั้นๆ ด้วย

ที่จริงแล้ว หากใช้ ALSA แล้ว ไม่จำเป็นต้องมีซาวด์เซิร์ฟเวอร์ แอพพลิเคชันก็สามารถสั่ง playback เสียงพร้อมๆ กันได้ โดยใช้ Dmix plugin

ใช้งาน Dmix

Dmix เป็น PCM direct stream mixing plugin ของ ALSA ปลั๊กอินนี้ทำหน้าที่มิกซ์เสียงเพื่อให้แอพพลิเคชันสั่ง playback เสียงได้พร้อมๆ กัน .. Dmix ฝังอยู่ใน libasound มาตั้งแต่ ALSA เวอร์ชัน 0.9 กว่าๆ แล้ว เพียงแต่ไม่ค่อยมีใครรู้และเอามาใช้งานมากนัก ข้อดีของ Dmix คือมันไม่ได้ใช้โมเดลแบบไคลเอนด์/เซิร์ฟเวอร์เหมือนซาวด์เซิร์ฟเวอร์ แต่ใช้วิธีรับข้อมูลแล้วเขียนลงบัฟเฟอร์ของซาวด์การ์ดโดยตรงผ่านทาง DMA ผลคือ Dmix ไม่มีข้อจำกัดเรื่องจำนวนไคลเอนด์ และได้คุณภาพเสียงที่ดี

ในขั้นพื้นฐานที่สุด การใช้งาน Dmix ทำได้โดยระบุดีไวซ์ของ ALSA เป็น Dmix plugin เช่น โปรแกรม aplay ใช้พารามิเตอร์ -D กำหนดดีไวซ์ที่ต้องการใช้ ลองเปิดเทอร์มินัลสองตัว แล้วเรียกใช้ aplay ตามข้างล่างนี้:

$ aplay -Dplug:dmix file.wav

ควรจะได้ยินเสียงจาก file.wav สองเสียงพร้อมกัน

หรือ XMMS ก็สามารถใช้ ALSA plugin แล้วระบุดีไวซ์เป็น plug:dmix ได้เช่นกัน

อย่างไรก็ตาม การใช้งาน Dmix โดยตรงนี้มักจะให้คุณภาพเสียงที่ไม่ดีมากนัก และมักจะมี noise การใช้งานจริงจึงมักจะสร้างดีไวซ์ PCM ขึ้นมาใหม่ โดยสร้างหรือแก้ไขไฟล์ ~/.asoundrc ตามนี้

pcm.intel8x0 {
    type dmix
    ipc_key 1313
    slave {
        pcm "hw:0,0"
        period_time 0
        period_size 1024
        buffer_size 8192
        rate 44100
    }
}

อธิบายคร่าวๆ

~/.asoundrc เป็นคอนฟิกไฟล์ของ libasound นอกเหนือจากคอนฟิกค่าปริยายใน /usr/share/alsa/alsa.conf เราสามารถสร้างดีไวซ์ PCM ของ ALSA ขึ้นมาใหมได้โดยการกำหนดไว้ในไฟล์นี้ จากตัวอย่างนี้ผมสร้างดีไวซ์ PCM ของ ALSA ในชื่อ “intel8x0” ชื่อนี้จะตั้งเป็นอะไรก็ได้ครับ ขอเพียงไม่ซ้ำกับที่กำหนดไว้ก่อนหน้านี้เท่านั้น

  • ผมตั้งเป็น intel8x0 ตามไดรเวอร์ของ i830 AC’97
  • ชนิดของ PCM เป็น dmix หมายความว่า PCM ตัวนี้จะใช้ Dmix plugin เป็นตัว playback ส่วนของ
  • slave มีไว้กำหนดดีไวซ์ที่ intel8x0 ทำงานครอบอยู่ จากตัวอย่างนี้กำหนดเป็น
    • ดีไวซ์ PCM “hw:0,0” อ้างอิง ฮาร์ดแวร์ PCM (บนซาวด์การ์ด) ไอดี 0 พอร์ต 0
    • period_time ขนาดของข้อมูลที่ส่งเข้า/ออกซาวด์การ์ด หน่วยเป็น usec ค่าปริยายจะส่งข้อมูลเข้าซาวด์การ์ดเป็นจังหวะทุก 125 msec (ค่าปริยาย = 125000 usec) กำหนดเป็น 0 เพื่อ override ค่าปริยาย
    • period_size ขนาดของข้อมูลที่ส่งเข้า/ออกซาวด์การ์ด หน่วยเป็นไบต์ ค่าที่กำหนดต้องเป็นสองยกกำลัง n กำหนดมากหรือน้อยไปจะมี noise รบกวน
    • buffer_size กำหนดขนาดของบัฟเฟอร์ กำหนดมากไปอาจจะทำให้มี latency สูง กำหนดน้อยไปก็จะทำให้เสียงขาดช่วง
    • rate อัตราแซมปลิ้ง ที่ 44.1 kHz (ค่าปริยาย = 48 kHz)

ออปชันอาจจะมากหรือน้อยกว่านี้ก็ได้ ค่า period_size กับ buffer_size ไม่จำเป็นต้องเป็นค่า 1024/8192 เสมอไป เพราะขึ้นกับซาวด์การ์ดและชิป PCM ด้วย ต้องลองปรับกันเอาเองครับ

หลังจากได้ดีไวซ์ PCM ตัวใหม่แล้วทีนี้เราก็สามารถอ้างอิงดีไวซ์นี้เพื่อใช้ playback เช่น

$ aplay -Dintel8x0 file.wav

และ หากต้องการกำหนดให้ใช้ดีไวซ์ Dmix โดยปริยาย สามารถทำได้โดยเพิ่มบรรทัดต่อไปนี้ ลงไปใน %HOME/.asoundrc

pcm.!default {
    type plug
    slave.pcm "intel8x0"
}

กรณีนี้แอพพลิเคชันที่ตั้งดีไวซ์ PCM เป็น default ไว้แล้ว เช่น xine และ xmms ก็จะใช้งาน Dmix โดยอัตโนมัติ โปรแกรมอื่นๆ ก็เพียงกำหนดให้ใช้ดีไวซ์ที่เป็น Dmix เท่านั้น เช่น กรณีของ mplayer/gmplayer หากใช้ ALSA จะ playback ออก hw:0,0 โดยตรง เราสามารถกำหนดดีไวซ์ที่ต้องการ playback ได้โดยใช้ออปชัน -ao เช่น

$ mplayer -ao alsa9:intel8x0 file.mpg

หรือ

$ mplayer -ao alsa9:default file.mpg

หากจะตั้งถาวรก็ตั้งในไฟล์ ~/.mplayer/config เช่น

ao=alsa9:intel8x0

หรือในกรณีของ gaim ซึ่งไม่สนับสนุน ALSA โดยตรง ก็สามารถใช้โปรแกรม aplay แทนได้ โดยเลือก

Preferences -> Sounds เลือก Method เป็น Command กรอกในช่อง Sound command เป็น

$ aplay -Dintel8x0 %s

โดยสรุปคือ

ถ้าตั้งดีไวซ์ได้ ก็ให้ตั้งเป็นดีไวซ์ที่มี type เป็น Dmix หรือมี slave เป็น Dmix

ถ้ากำหนดคำสั่งในการ playback ได้ ให้ใช้ aplay โดยกำหนดให้ใช้ดีไวซ์ที่มี type เป็น Dmix หรือมี slave เป็น Dmix

ปัญหาที่เจอเมื่อใช้ Dmix

เวลานี้มีอยู่สองอย่างคือ

  1. xmms อาจจะหยุด playback กลางคัน โปรแกรมไม่แครช กด play อีกครั้งก็จะเริ่ม playback ได้ปกติ .. ตอนนี้ยังไม่มีทางแก้ครับ
  2. mplayer หาก playback ไฟล์ที่อัตราแซมปลิ้งสูงหรือต่ำกว่าที่ตั้งไว้ใน .asoundrc เสียงจะเพี้ยน (xine ไม่มีปัญหาตรงจุดนี้) ทางแก้คือกกำหนดให้ใช้ดีไวซ์ที่เหมาะกับการ playback เช่น กรณีที่ playback ไฟล์ที่มีอัตราแซมปลิ้ง 44.1 kHz อาจใช้ -ao alsa9:default หรือ -ao alsa9:intel8x0 แต่ถ้าไฟล์มีอัตราแซมปลิ้งที่ 48 kHz ให้ใช้ -ao alsa9:hw เป็นต้น

.. ลองใช้งานกันดูนะครับ :)

ใช้ซอฟต์โมเด็ม ICH3/ICH4 บนลินุกซ์

หลายๆ คนที่ใช้โน้ตบุ๊ก หรือเดสก์ทอปที่มีซอฟต์โมเด็ม (AMR/CNR/MDC/ACR) คงเจอปัญหาโมเด็มใช้งานบนลินุกซ์ไม่ได้ แต่วันนี้มีข่าวดีสำหรับซอฟต์โมเด็มบน Southbridge ตระกูล ICH3 ICH4 และชิปเซ็ตอื่นๆ ครับ .. บริษัท SmartLink เขาทำไดรเวอร์บนลินุกซ์ให้แล้ว :D .. ไดรเวอร์ตัวปัจจุบัน (2004-02-05) คือเวอร์ชัน 2.9.6 จากเอกสารที่มากับไดรเวอร์ระบุว่าใช้ได้กับชิปเซตต่อไปนี้ครับ

HAMR5600 based AMR/CNR/MDC/ACR modem cards on the following Southbridge
chips:
- Intel ICH0,ICH2, ICH3, ICH4
- Via 686A, 686B, 8231, 8233
- SiS 630
- ALI 1535.
SmartPCI56/561/562/563 based PCI modem cards.
SmartUSB56 based USB modem.

ของใครไม่ตรงกับที่ระบุก็เสียใจด้วยเน้อะ :P

ส่วนโมเด็มบนเครื่อง Peorth ของผมเป็น ICH3 วินโดว์สบอกว่าเป็น Lucent AMR Softmodem ส่วนลินุกซ์ (lspci -v) บอกว่า

00:1f.6 Modem: Intel Corp. 82801CA/CAM AC'97 Modem Controller (rev 01)
(prog-if 00 [Generic])
        Subsystem: Acer Incorporated [ALI]: Unknown device 1022
        Flags: medium devsel, IRQ 10
        I/O ports at a000 [size=256]
        I/O ports at a400 [size=128]

ใช้ไดรเวอร์ slmodem ตัวนี้ได้แน่นอน :D

ติดตั้ง..

ตัดฉากมาที่การติดตั้งกันเลยดีกว่า.. วิธีติดตั้งก็เหมือนการคอมไพล์โปรแกรมทั่วไป แต่เพราะมันเป็นไดรเวอร์บนลินุกซ์ซึ่งจะคอมไพล์ออกมาเป็นเคอร์เนลโมดูล ดังนั้นสิ่งที่จำเป็นอีกอย่างก็คือซอร์สของเคอร์เนลครับ อ่อ ที่เจ๋งอีกอย่างคือ slmodem 2.9 นี่ใช้กับเคอร์เนล 2.6 ได้ด้วย:)

ก่อนอื่นก็ดาวน์โหลดซอร์สของไดรเวอร์มาก่อนที่ ftp://ftp.smlink.com/linux/unsupported/slmodem-2.9.6.tar.gz

อย่าได้แปลกใจ ที่มันอยู่ใน unsupported ก็เพราะไดรเวอร์นี้ยังเป็น beta อยู่ครับ แต่ไม่ต้องกังวลเพราะเท่าที่ลองก็ใช้งานได้ดี ได้มาแล้วก็

$ tar xvzf slmodem-2.9.6.tar.gz
$ make
$ su -
# make install

เท่าเนี้ยะ เป็นอันเสร็จการติดตั้ง ตัวติดตั้งจะติดตั้งโปรแกรม เคอร์เนลโมดูล และ mknod ใน /dev เตรียมไว้ให้

เริ่มใช้งาน

สำหรับ AMR ก็เริ่มต้นที่เคอร์เนลโมดูลก่อน

# modprobe slamr

โพรบแล้วลองเช็ค /var/log/messages ควรจะเห็นอะไรประมาณนี้ครับ

Feb 12 20:25:23 peorth kernel: slamr: module license 'Smart Link Ltd.' taints kernel.
Feb 12 20:25:23 peorth kernel: slamr: SmartLink AMRMO modem.
Feb 12 20:25:23 peorth kernel: slamr: probe 8086:2486 ICH card...
Feb 12 20:25:23 peorth kernel: PCI: Found IRQ 10 for device 0000:00:1f.6
Feb 12 20:25:23 peorth kernel: PCI: Sharing IRQ 10 with 0000:00:1f.3
Feb 12 20:25:23 peorth kernel: PCI: Sharing IRQ 10 with 0000:00:1f.5
Feb 12 20:25:23 peorth kernel: slamr: mc97 codec is SIL27
Feb 12 20:25:23 peorth kernel: slamr: slamr0 is ICH card.

ตอนนี้เราก็จะได้ดีไวซ์ /dev/slamr0 เป็นตัวเชื่อมกับซอฟต์โมเด็ม

ต่อไปก็รัน slmodemd เป็น daemon ประมวลผลแทนฮาร์ดแวร์ (ซึ่งเป็นส่วนที่ซอฟต์โมเด็มไม่มี .. ก็เลยต้องใช้ซอฟต์แวร์ทำงานแทนนั่นเอง) อย่าลืมระบุประเทศด้วยเพราะสัญญาณโทรศัพท์ของแต่ละประเทศจะต่างกัน และที่ขาดไม่ได้ก็คือดีไวซ์ของโมเด็ม:

# slmodemd --country=THAILAND /dev/slamr0
SmartLink Soft Modem: version 2.9.6 Feb 12 2004 20:27:49
modem `slamr0' created. TTY is `/dev/pts/3'
symbolic link `/dev/ttySL0' -> `/dev/pts/3' created.
Use `/dev/ttySL0' as modem device, Ctrl+C for termination.

เอาล่ะ พร้อมทำงานแล้ว สังเกตว่าโปรแกรมจะสร้าง /dev/ttySL0 เป็นดีไวซ์ของโมเด็ม ดีไวซ์นี้จะปรากฏเฉพาะช่วงที่เรารัน slmodemd ไว้เท่านั้น

ทีนี้ก็มาเซ็ตโมเด็มให้โทร. เชื่อมอินเทอร์เน็ตกัน ผมก็ลองกับ TOT Online นี่ล่ะ บนลินุกซ์ทะเล/FC/RH ใช้ redhat-config-network ก็ได้ (เรียกได้จากเมนู Applications » System Settings » Network) เสร็จแล้วลองดู /etc/wvdial.conf สักนิด ถ้าใช้ redhat-config-network โปรแกรมจะใส่ Modem = /dev/modem ให้เป็นค่าปริยาย แต่เราต้องใช้ /dev/ttySL0 ครับ ดังนั้นมีืืทางเลือกสองทาง คือ 1. แก้ /etc/wvdial.conf ให้ Modem = /dev/ttySL0 หรือ 2. ทำ symlink เอา โดย ln -sf /dev/ttySL0 /dev/modem

# cat /etc/wvdial.conf
[Modem0]
Modem = /dev/ttySL0
Baud = 57600
SetVolume = 2
Dial Command = ATDT
Init1 = ATZ
Init3 = ATM1L2
FlowControl = Hardware (CRTSCTS)
[Dialer TOT_Online]
Username = [email protected]
Password = xxxxxxxx
Phone = 1222
Stupid Mode = 1
Inherits = Modem0

ออนไลน์!

ได้เวลาสั่งหมุนโทรศัพท์กันแล้นน .. ลินุกซ์ทะเล/FC/RH จะใช้ redhat-control-network ก็ได้ครับ (เรียกจากเมนู Applications -> System Tools -> Network Device Control) หรือจะ wvdial อย่างที่ผมใช้ก็ได้

# wvdial TOT_Online
--> WvDial: Internet dialer version 1.53
--> Initializing modem.
--> Sending: ATZ
ATZ
OK
--> Sending: ATM1L2
ATM1L2
OK
--> Modem initialized.
--> Sending: ATDT1222
--> Waiting for carrier.
ATDT1222
CONNECT 37333
--> Carrier detected.  Starting PPP immediately.
--> Starting pppd at Thu Feb 12 20:30:47 2004
--> pid of pppd: 3056

โทร. ติดแล้วลอง lsmod ดูน่าจะเห็นอะไรประมาณนี้

ppp_deflate             4800  0
zlib_deflate           21880  1 ppp_deflate
zlib_inflate           21344  1 ppp_deflate
bsd_comp                5184  0
ppp_async               9952  1
ppp_generic            22288  7 ppp_deflate,bsd_comp,ppp_async
slhc                    6176  1 ppp_generic
slamr                 317956  2

/var/log/message ก็ประมาณนี้

Feb 12 20:30:47 peorth pppd[3056]: pppd 2.4.1 started by root, uid 0
Feb 12 20:30:47 peorth pppd[3056]: Using interface ppp0
Feb 12 20:30:47 peorth pppd[3056]: Connect: ppp0  /dev/pts/2
Feb 12 20:31:03 peorth pppd[3056]: local  IP address 172.17.212.15
Feb 12 20:31:03 peorth pppd[3056]: remote IP address 203.113.60.8
Feb 12 20:31:03 peorth pppd[3056]: primary   DNS address 203.113.93.1
Feb 12 20:31:03 peorth pppd[3056]: secondary DNS address 203.113.93.2

และ ifconfig ก็จะประมาณนี้

# ifconfig
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:1202 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1202 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:957852 (935.4 Kb)  TX bytes:957852 (935.4 Kb)

ppp0      Link encap:Point-to-Point Protocol
          inet addr:172.17.212.15  P-t-P:203.113.60.8  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:3 errors:1 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:66 (66.0 b)  TX bytes:87 (87.0 b)

เป็นอันเรียบร้อย ใช้อินเทอร์เน็ตผ่านโมเด็มได้ซะที :D

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/

ใช้ x2x แทน KVM switcher

ผมมีเครื่องที่ใช้งานประจำอยู่สองเครื่องคือ Peorth และ Yggdrasil .. ปกติแล้วก็จะใช้มอนิเตอร์ คีย์บอร์ด เมาส์สองชุด โต๊ะเขาออกแบบให้วางคีย์บอร์ดและเมาส์เพียงชุดเดียว การจะวางสองชุดจึงไม่สะดวก ยิ่งผมต้องสลับการใช้งานบ่อยๆ ก็ยิ่งเป็นปัญหา สุดท้ายก็เลยกัดฟันซื้อ KVM Switcher ขนาดสี่พอร์ตมาตัวนึง ราคาประมาณสามพันกว่าบาท .. แต่เพราะผมมีจอแสดงผลอยู่แล้วสองจอ (จอ TFT ของ Peorth ซึ่งเป็นโน้ตบุ๊ก และมอนิเตอร์ของ Yggdrasil ที่เป็นเครื่องเดสก์ทอป) ผมเลยต่อเฉพาะคีย์บอร์ดและเมาส์เข้ากับ KVM switcher .. ไหนๆ ก็พูดถึง KVM แล้ว ขอบ่นหน่อยละกัน :P … เจ้า KVM Switcher ที่ผมซื้อมานี่มันมีฮอตคีย์สำหรับสลับการควบคุมไปยังแต่ละเครื่อง มันก็น่าจะสะดวกดีใช่มั้ยครับ ? แต่ฮอตคีย์ของมันคือ กด Ctrl+Alt+Shift พร้อมกันทีนึง จากนั้นกดเลขพอร์ต (1 2 3 หรือ 4) ทีนึง และกด Enter อีกทีนึง สรุปคือต้องกดตั้งห้าปุ่มในสามจังหวะ แบบนี้มันเป็น ‘ฮอต’ คีย์ตรงไหนฟะ เฮ่อ .. สมน้ำหน้าตัวเองไม่ถามให้ดีก่อน (.. แต่ตอนซื้อนั่นไม่คิดว่าจะมีฮอตคีย์ที่กดยากขนาดนี้นี่หว่า เคยใช้แต่กด Ctrl x 2 ก็เลยนึกว่าจะเหมือนกัน .. ซวยไปครับ)

แล้ววันนึง ระหว่างหาข้อมูลในกูเกิ้ลสายตาก็เหลือบไปเห็น Software-based KVM ซึ่งเป็นซอฟต์แวร์ที่ทำงานได้เหมือน KVM switcher คือสามารถใช้คีย์บอร์ด เมาส์ มอนิเตอร์ เพียงชุดเดียวในการควบคุมคอมพิวเตอร์หลายๆ เครื่อง โดยแต่ละเครื่องต้องรันซอฟต์แวร์ KVM และต้องเชื่อมกับเครือข่าย ผมเห็นว่าน่าสนใจก็เลยค้นเพิ่มเติมแล้วก็เจอ Software-based KVM switcher ที่เป็นโอเพ่นซอร์สด้วย ที่กล่าวถึงกันบ่อยๆ ก็มีสามตัวคือ Synergy x2vnc และ x2x … สองตัวแรกขั้นต้นผมลองแล้วแต่ไม่ประสบผลสำเร็จ ประกอบกับความต้องการของโปรแกรมดูจะมากเกินความจำเป็น ก็เลยข้ามมาลอง x2x ซึ่งกลายเป็นซอฟต์แวร์ที่ลงตัวที่สุดในเงื่อนไขที่ผมตั้งไว้ คือ สองเครื่อง สองจอ หนึ่งคีย์บอร์ด หนึ่งเมาส์ สลับการควบคุมง่าย โปรแกรมเล็ก และทำงานได้อย่างปลอดภัย (เรื่องมากจังแฮะ)

x2x

โปรแกรม x2x ยอมให้คีย์บอร์ดและเมาส์ที่เชื่อมกับคอมพิวเตอร์เครื่องหนึ่งไปควบคุมคอมพิวเตอร์อีกเครื่องนึงได้ นั่นคือ คีย์บอร์ดและเมาส์ชุดเดียว คุมเครื่องได้หลายเครื่อง (ผมเดาว่าได้เต็มที่สามเครื่อง เพราะอะไรเดี๋ยวมาดูกัน) .. จากชื่อคงพอเดาได้ว่ามาจาก X-to-X ซึ่งแปลว่ามันทำงานกับระบบเอ็กซ์วินโดว์โดยไม่จำกัดแพลตฟอร์ม (ถ้าติดตั้ง X บนวินโดว์ส ก็ใช้กับวินโดว์สได้) .. ขนาดโปรแกรม x2x ก็เพียงแค่ 20 กว่ากิโลไบต์เท่านั้นเอง และการสลับการควบคุมก็ทำได้โดยเลื่อนเมาส์ไปมาระหว่างสองจอภาพ สะดวกดีทีเดียว .. และเช่นเดียวกับ Software-based KVM ทั้งหลาย สิ่งที่ x2x ต้องการก็คือเครื่องที่จะใช้งานก็ต้องเชื่อมอยู่บนเครือข่าย

ภาพนี้เป็นคอนฟิกของผมที่ใช้อยู่ ประกอบด้วยคอมพิวเตอร์สองตัว Peorth กับ Yggdrasil .. มอนิเตอร์ของเครื่อง Yggdrasil อยู่ทางขวามือของโน้ตบุ๊ก Peorth ผมจะใช้คีย์บอร์ดและเมาส์ที่ต่อกับ Peorth ในการควบคุมทั้งสองเครื่อง

x2x ต้นฉบับให้มาเป็นซอร์ส สำหรับผู้ใช้ TLE 5.5 ผมทำ rpm ให้แล้ว apt-get ได้เลยครับ .. ดิสโตรอื่นจะคอมไพล์เองก็ได้ครับ ใช้แค่ทูลพื้นฐาน + Xlib เท่านั้นเอง

wget -c http://ftp.digital.com/pub/Digital/SRC/x2x/x2x-1.27.tar.gz
tar -xvzf x2x-1.27.tar.gz
cd x2x-1.27
xmkmf
make

ก็จะได้ x2x เป็นไบนารีมาหนึ่งตัว ก๊อบปี้ไปไว้ที่ ~/bin หรือ /usr/bin หรือ /usr/local/bin ก็ได้ เสร็จแล้วก็สั่งรันโดยระบุพารามิเตอร์ว่าจะเข้าไปควบคุม X display ตัวไหน อย่างกรณีของผม คือต้องการให้ Peorth สามารถควบคุม X display บน Yggdrasil ได้ ก็จะเรียกใช้ x2x บน Peorth ด้วยคำสั่ง:

x2x -to yggdrasil:0.0 -east

โดย

  • -to yggdrasil:0.0 เป็นการระบุ X display ที่ x2x จะเชื่อมเข้าไปควบคุม ในที่นี้คือ :0.0 ของ yggdrasil (yggdrasil เป็น hostname ของเครื่อง Yggdrasil ผมตั้งไว้ใน /etc/hosts .. ตรงนี้อาจจะใช้ FQDN หรือไอพีแอดเดรสไปเลยก็ได้)
  • -east เป็นการระบุว่า yggdrasil:0.0 นั้นอยู่ทิศตะวันออก หรือทางขวามือของ Peorth .. หากอยู่ซ้ายมือก็จะใช้ -west .. ตรงนี้เองที่ทำให้ผมเดาว่ามันคุมได้มากที่สุดสามเครื่อง คือเครื่องที่ต่อคีย์บอร์ดและเมาส์ เครื่องทางซ้ายมือ และเครื่องทางขวามือ

เมื่อสั่งงานแล้ว x2x ก็จะทำการเชื่อมไปยัง X display yggdrasil:0.0 ของ Yggdrasil และคอยตรวจจับการเคลื่อนไหวของเมาส์ที่เชื่อมกับ Peorth หากเคอร์เซอร์ของเมาส์เลื่อนมาจนเลยขอบขวาบนจอภาพของ Peorth เคอร์เซอร์ก็จะโผล่มาที่ขอบซ้ายบนจอภาพของ Yggdrasil ทั้งเมาส์และคีย์บอร์ดที่ต่อกับ Peorth ก็จะเข้ามาควบคุมเครื่อง Yggdrasil และในทำนองเดียวกัน หากเลื่อนเมาส์จนเลยขอบซ้ายของ Yggdrasil เคอร์เซอร์ก็จะกลับมาที่ Peorth การควบคุมก็จะโอนกลับมาที่ Peorth

ในช่วงแรก ผมต้องให้ X บน Yggdrasil เปิดพอร์ต 6000/TCP เพื่อรอรับการเชื่อมต่อจากเครื่องภายนอก และต้องสั่ง

xhost +peorth

เพื่ออนุญาตให้ Peorth เชื่อมต่อเข้ามาได้ (peorth = hostname ของ Peorth) .. แต่อย่างที่รู้กันว่า การเปิดพอร์ต 6000/TCP เป็นเรื่องที่ไม่ค่อยโสภาเท่าไหร่นัก เพราะมันเป็นการทำให้ระบบมีช่องโหว่ด้านความปลอดภัยรูบะเร่อ

ความปลอดภัย ?

x2x ไม่มีระบบความปลอดภัยใดๆ เลย การเชื่อมต่อของ x2x ใช้โพรโตคอลของ X เพียงอย่างเดียว ซึ่งค่อนข้างเปราะ โดยเฉพาะอย่างยิ่งเมื่อต้องเปิดให้ X ใช้งานผ่านเครือข่ายได้ นอกจากนี้การเชื่อมต่อ X display เปลือยๆ ก็ไม่ปลอดภัยเพราะไม่มีการปกป้องข้อมูลด้วยวิธีใดๆ เลย ถ้าเทียบ X เป็น remote login มันก็แย่พอๆ กับ telnet นั่นล่ะครับ .. โจทย์จึงกลายเป็นว่า ผมต้องหาทางใช้ x2x โดยไม่ผ่านพอร์ด 6000/TCP ของ X และต้องทำให้การเชื่อมต่อระหว่างสองเครื่องปลอดภัยมากพอด้วย ..

คำตอบของโจทย์นี้ไม่ยากเลย .. SSH tunnel นั่นเอง :D .. หลักการก็คือ แทนที่จะใช้ x2x เชื่อม X display เปลือยๆ ก็ใช้ SSH เชื่อมเข้าไปที่เครื่องปลายทางแล้วรัน x2x เชื่อมกับ :0.0 ที่ปลายทางเพื่อให้มันส่งข้อมูลผ่าน SSH tunnel กลับมาที่ต้นทาง .. ซึ่งหมายความว่าปลายทางจะต้องติดตั้ง x2x ไว้ ส่วนต้นทางที่เป็นตัวควบคุมไม่ต้องมีอะไรเลยนอกจาก SSH client :D ด้วยวิธีนี้ผมก็ไม่ต้องเปิดพอร์ต6000/TCP เพราะ x2x เชื่อมเข้า :0.0 ตรงๆ โดยไม่ผ่านชั้นของเครือข่าย จึงไม่ต้องสั่ง xhost ด้วย .. และการเชื่อมต่อทั้งหมดถูกห่อด้วย SSH ซึ่งมีการเข้ารหัสข้อมูลทุกชิ้นจึงไม่ต้องกังวลเรื่องข้อมูลรั่วบนเครือข่าย แถมการสั่งงานก็ไมได้ยากอะไรเลย แบบนี้ผมชอบแฮะ :D .. กลับมาดูคอนฟิกของผมอีกที

  • มอนิเตอร์เครื่อง Yggdrasil อยู่ขวามือของ Peorth
  • ใช้คีย์บอร์ดและเมาส์ของ Peorth
  • ติดตั้ง x2x บน Yggdrasil

การเชื่อมต่อที่เครื่อง Peorth ก็จะสั่งแบบนี้:

ssh -f yggdrasil x2x -to :0.0 -east

ssh ก็จะเชื่อมไปที่เครื่อง Yggdrasil แล้วรันคำสั่ง ‘x2x -to :0.0 -east’ ที่เครื่อง Yggdrasil ผลลัพธ์การทำงานจะถูกส่งกลับผ่าน tunnel ของ SSH ที่เราเชื่อมไปนั่นเอง ออปชัน -f เป็นการสั่งให้ SSH รันเป็น background ดังนั้นเมื่อ SSH เชื่อมต่อไป Yggdrasil ได้สำเร็จก็จะกลับมาที่เชลล์ทันที

เท่าที่ทดลองดูวิธีห่อ x2x ด้วย SSH นี่ได้ผลดีทีเดียว การตอบสนองก็รวดเร็วดี .. ผมลองวัดอย่างหยาบๆ พบว่า ถ้าขยับเมาส์ไม่หยุดจะมันจะส่งข้อมูลเข้าเครือข่ายในอัตราประมาณ 20 กิโลไบต์ต่อวินาที ถ้ากดคีย์บอร์ดค้างก็ใช้ราวๆ 8 กิโลไบต์ต่อวินาที ซึ่งผมคิดว่าไม่ใช่เรื่องใหญ่เพราะการใช้งานลักษณะนี้เครื่องคอมพิวเตอร์ทั้งสองเครื่องต้องอยู่ใกล้ๆ กัน (หรืออย่างน้อยจอมอนิเตอร์ก็ต้องอยู่ใกล้ๆ กัน) การเชื่อมต่อก็น่าจะอยู่บนเครือข่ายเดียวกัน อัตราการส่งข้อมูล 20-30 กิโลไบต์ต่อวินาทีจึงไม่ใช่ปัญหา .. ห้องแล็บที่ผมนั่งประจำมีเครือข่ายสามวง สอง ASes ผมลองย้าย Yggdrasil ไปอยู่เครือข่ายอื่นก็ใช้งานได้ไม่มีปัญหา

สรุปตอนนี้ผมก็ไม่จำเป็นต้องใช้ KVM Switcher แล้ว .. มีใครสนใจจะซื้อต่อมั้ยอ่ะ :P