Category Archives: Lab

Ubuntu Customization

ติดตั้ง apache2 + php4 + mysql

รันเทอร์มินัล สั่ง

$ sudo apt-get install apache2 php4 libapache2-mod-php4 php4-mysql

Config:

/etc/apache2/apache2.conf
/etc/apache2/mods-enabled/php4.conf
/etc/php4/apache2/php.ini
/etc/mysql/my.cnf

Locale ภาษาไทย

รันเทอร์มินัล สั่ง

$ sudo dpkg-reconfigure locales

เลือก en_US ISO-8859-1, en_US.UTF-8 UTF-8, th_TH TIS-620 และ th_TH.UTF-8 UTF-8

ตั้งคีย์บอร์ดภาษาไทย

System -> Preferences -> Keyboard
Layouts -> Add ... -> Thai (Kedmanee) -> OK
Layout Options -> Group Shift/Lock behavior -> Alt+Shift changes group

ฟอนต์ภาษาไทย

  1. ดาวน์โหลดฟอนต์ TrueType ภาษาไทยจาก LTN ไฟล์ thai-ttf-x.x.x.tar.gz
  2. แตกไฟล์ thai-ttf-x.x.x.tar.gz
  3. สำเนา / ย้ายฟอนต์ TrueType (*.ttf) ไปไว้ที่ ~/.fonts

แก้ปัญหาตัวอักษรไทยแสดงผลเพี้ยนเมื่อใช้ hinting (autohinting)

auto hinting อาจจะทำให้การแสดงผลตัวอักษรไทยเพี้ยน ปิด auto hinting โดยแก้ในไฟล์ /etc/fonts/local.conf ค้นหาข้อความ “autohint” แก้ bool จาก true เป็น false

TrueType -> X11 Fonts

รันเทอร์มินัล สั่ง

$ cd /path/to/fonts
$ mkfontdir
$ ttmkfdir > fonts.scale

เพิ่ม font path (/path/to/fonts/) ใน /etc/X11/xorg.conf

เพิ่ม font path ทันที

$ cd /path/to/font
$ xset fp+ `pwd`
$ xset rehash

ติดตั้ง TrueType ด้วย defoma

รันเทอร์มินัล สั่ง

$ defoma-hints -c --no-question truetype /path/to/fonts/*.ttf > /etc/defoma/hints/myfonts.hints
$ defoma-font reregister-all /etc/defoma/hints/myfonts.hints
$ xset fp rehash

ใช้ bitmap fonts ใน fontconfig

รันเทอร์มินัล สั่ง

$ cd /etc/fonts/conf.d/
$ sudo ln -sf /etc/fonts/conf.d/yes-bitmaps.conf 30-debconf-yes-bitmaps.conf
$ sudo fc-cache

root shell

รันเทอร์มินัล สั่ง

$ sudo -s -H

หรือ

$ sudo su -

กรอกรหัสผ่านของ user ให้ sudo

เปลี่ยนรหัสผ่าน root

รันเทอร์มินัล สั่ง

$ sudo passwd root

กรอกรหัสผ่านของ user ให้ sudo ก่อน จึงตั้งรหัสผ่านของ root

ล็อกอิน GDM ด้วย root

  1. ตั้งรหัสผ่านของ root
  2. System -> Administration -> Login Screen Setup

#แท็บ Security -> Allow root to login with GDM

ควบคุม services

  1. ไฟล์ใน /etc/rc?.d/ เป็น symlink ไป start up scripts ใน /etc/init.d
  2. Symlink name = S??* = run
  3. Symlink name = K??* = not run
  4. ทุก runlevels จะรัน /etc/rcS.d/*
  5. Default runlevel ของ Ubuntu คือ 2 ระบบจะ start up ที่ /etc/rc2.d/

ตั้ง debconf ให้ใช้ GUI

รันเทอร์มินัล

sudo dpkg-reconfigure debconf

เลือก Interface เป็น GNOME หรือ KDE

เลือก Priority ตามต้องการ (Low = ถามเยอะ, Critical = ถามน้อย)

ตั้ง mplayer ให้ใช้ XVideo และ ALSA

ใช้ text editor เปิดไฟล์ ~/.mplayer/config เพิ่มบรรทัด

vo=xv
ao=alsa

ตั้ง Nautilus CD Burner ให้ใช้งาน Burnproof

  1. Applications -> System Tools -> Configuration Editor
  2. apps -> nautilus-cd-burner
  3. เลือก burnproof

ตั้ง Nautilus CD Burner ให้ใช้งาน Overburn

  1. Applications -> System Tools -> Configuration Editor
  2. apps -> nautilus-cd-burner
  3. เลือก overburn

ตั้งอัตราเร็วในการเขียนซีดีสำหรับ Nautilus CD Burner

  1. Applications -> System Tools -> Configuration Editor
  2. apps -> nautilus-cd-burner
  3. แก้ default_speed เป็นค่าที่ต้องการ

ตั้ง Spatial Mode เป็นแบบต้นฉบับของ GNOME

  1. Ubuntu (Hoary) patch Nautilus ให้ spatial mode ทำงานโดยปิดวินโดว์ของไดเรกทอรีเดิมทุกครั้งที่เปิดวินโดว์ใหม่
  2. Applications -> System Tools -> Configuration Editor
  3. apps -> nautilus -> preferences
  4. เลือก no_ubuntu_spatial

ติดตั้ง NVIDIA driver

รันเทอร์มินัล สั่ง

$ sudo apt-get install nvidia-glx nvidia-settings
$ sudo nvidia-glx-config enable

เพิ่ม apt repository

  1. แก้ไฟล์ /etc/apt/sources.list .. หรือ
  2. เพิ่มบน Synaptic: Settings -> Repositories

Config Dial-Up Connection

  1. รัน pppconfig .. and follow the text-based user interface
  2. Authentication method ทดลองใช้ PAP ก่อน ถ้าไม่สามารถ login ได้ ให้ใช้ Chat
  3. Profile จะเก็บไว้ที่ /etc/chatscripts/
  4. รัน pon เพื่อ connect
  5. รัน poff เพื่อ disconnect

แอพพลิเคชันเสริม

ติดตั้งด้วย apt-get หรือ synaptic

Applications Packages
Macromedia Flash plug-in for Mozilla Firefox flashplayer-mozilla
Adobe Acrobat Reader acroread
Adobe Acrobat Reader plug-in for Mozilla Firefox acroread-plugin
Microsoft Core Fonts msttcorefonts
Planner (Project Management) planner
Scribus (Desktop Publishing) scribus
Blender (3D Modeller/Renderer) blender
Inkscape (Vector Drawing) inkscape
Xine xine-ui
Mplayer mplayer-{386|586|686|k6|k7}
Win32 Codec sw32codecs

ควรติดตั้ง recommended packages ด้วย

Digital Photography Workflow

นอกเหนือจากความสะดวกและประหยัดอันเป็นเหตุผลหลักของใครหลายๆ คนในการตัดสินใจซื้อกล้องดิจิทัลมาใช้งานแล้ว อีกหนึ่งเหตุผลที่ใครอีกหลายคนเลือกกล้องดิจิทัลแทนกล้องฟิล์มคือ อิสระในการควบคุมคุณภาพของภาพได้ด้วยตัวเอง ปรับแต่งภาพได้ง่าย .. จริงๆ แล้ว แต่ไหนแต่ไรมาการบันทึกภาพด้วยฟิล์มก็มีการแต่งภาพเหมือนกัน เพียงแต่เราไม่เคยได้สัมผัสเพราะเป็นหน้าที่ของร้านล้างอัดที่จะทำให้ภาพสีสวยสด นอกจากนี้ ร้านล้างอัดบางแห่งจะให้กรอกได้ว่าต้องการล้างอัดแบบใดเป็นพิเศษ เช่น ล้างอัดฟิล์มที่ push/pull กำหนดเวลาแช่น้ำยาได้ หรือใช้น้ำยาข้ามประเภท (cross processing) หรือดีไปกว่านั้น ร้านล้างอัดบางแห่งให้เช่าอุปกรณ์ ห้องมืด แบ่งซื้อน้ำยามาล้างอัดเองได้ .. พอมีกล้องดิจิทัลเราจึงพึ่งพาร้านล้างอัดน้อยลง งานปรับแต่งภาพที่แต่เดิมขึ้นกับร้านล้างอัดก็เปลี่ยนมาเป็นงานของเราไปด้วย .. คนที่เก็บบันทึกภาพด้วยกล้องดิจิทัลจึงหันมาเรียนรู้และทำความรู้จักกับขั้นตอนในการ develop ภาพดิจิทัล – Digital Darkroom / Digital Workflow – มากขึ้น .. จากนี้ไปภาพจะสวยหรือไม่ก็อยู่ที่ตัวเราแล้วล่ะ

Settings

digital workflow ไม่ได้มาเริ่มทำหลังจากได้ภาพแล้ว แต่เริ่มตั้งแต่ก่อนจะบันทึกภาพกันเลย .. นิตยสารบางเล่มที่รับภาพจากช่างภาพอิสระจะกำหนดไว้เลยว่าจะต้องปรับตั้งค่าของกล้องดิจิทัลไว้ยังไง แบบไหนถึงจะสะดวกในการปรับแต่งภาพในภายหลัง เมื่อจะนำภาพมาปรับแต่งในภายหลัง สิ่งสำคัญคือต้องพยายามเก็บรายละเอียดของภาพมาให้ได้มากที่สุด จะได้ปรับแต่งบนคอมพิวเตอร์ได้ง่าย ตรงนี้เลยกลายมาเป็นหลักคร่าวๆ ของการปรับค่าในการบันทึกภาพว่าให้พยายามรักษาต้นฉบับที่บันทึกให้ได้มากที่สุด ผ่านการประมวลผลด้วยซอฟต์แวร์บนกล้องให้น้อยที่สุดเท่าที่จะเป็นไปได้ .. อ่อ ลืมบอกไป กล้องดิจิทัลทุกตัวมีซอฟต์แวร์ในการปรับแต่งภาพฝังอยู่ข้างในทั้งนั้นแหละครับ white balance, sharpness, saturations, digital zoom, compression ฯลฯ ล้วนแต่เป็นฝีมือของซอฟต์แวร์บนกล้อง .. ถ้าจะบันทึกแล้วเอาไปอัดลงกระดาษทันทีก็แล้วไป แต่ถ้าเราจะเอามาเข้า workflow เป็นเรื่องเป็นราว เอามาปรับด้วยซอฟต์แวร์บนคอมพิวเตอร์เลยดีกว่า เพราะให้คุณภาพที่ดีกว่า มีได้อิสระในการปรับแต่งมากกว่า เห็นภาพชัดเจนกว่าด้วย .. การปรับตั้งค่าบนกล้องดิจิทัลให้เหมาะกับการนำมาปรับแต่งทั่วๆ ไปก็มีดังนี้

ขนาดและอัตราการบีบอัดข้อมูล: ตัวที่ทำลายคุณภาพของภาพมากที่สุดคือการบีบอัดของ JPEG เพราะมันเป็นการบีบอัดที่ยอมสูญเสียข้อมูลต้นฉบับบางส่วนไปเพื่อแลกกับขนาดที่เล็กลง (Lossy Compression) จึงมีคำแนะนำกันมาว่า ให้เก็บภาพด้วยคุณภาพสูงสุด บีบอัดน้อยที่สุด ที่ความละเอียดสูงสุดเท่าที่จะทำได้ ถ้าบันทึกแบบ lossless อย่างเช่น TIFF ได้ก็ดี .. ยิ่งถ้าได้เป็น raw ยิ่งดี เพราะ raw จะเก็บข้อมูลดิจิทัลดิบๆ จาก CCD/CMOS โดยไม่ผ่านการ post process ใดๆ เลย แถม raw อาจจะเก็บระดับสีได้มากกว่าด้วย เช่น 12 หรือ 16 bits/channel ซึ่งได้ความละเอียดของระดับสีมากกว่า JPEG ที่ใช้ 8 bits/channel

จากเรื่องของขนาดและคุณภาพแล้ว ถัดมาคือ ISO Sensitivity คำแนะนำคือให้ใช้ค่าต่ำสุดเท่าที่จะใช้บันทึก scene นั้นได้ .. เหตุผลก็คือ ISO Sensitivity ของกล้องดิจิทัลเป็นการอัดประจุไฟฟ้าในปริมาณต่างๆ กัน เพื่อให้ CCD/CMOS เลียนแบบความไวในการรับแสงที่ต่างกัน ยิ่งปรับ ISO สูงๆ ประจุก็จะเยอะ ยิ่งประจุเยอะก็จะมีเม็ดสีเข้ามารบกวน (noise) ในภาพเยอะตามไปด้วย ความสมบูรณ์ของภาพก็จะลดลง .. ทั่วไปแล้วจึงควรตั้งให้ค่าต่ำๆ เข้าไว้ ถ้าลงได้ต่ำสุดของกล้องนั้นๆ ได้ก็จะดี อย่างไรก็ตามในบาง scene อาจจะต้องยอมปรับให้ ISO สูงขึ้นเพื่อแลกกับความคมชัดในการบันทึก เช่น การถ่ายภาพที่ต้องการหยุดการเคลื่อนไหว หรือภาพที่บันทึกภายใต้สภาพแสงน้อยๆ

White Balance เป็นค่าที่ใช้ในการปรับให้สีถูกต้องในสภาพแสงต่างๆ .. เนื่องจากกล้องดิจิทัลไม่รู้ว่าอะไรคือสีขาว เมื่อได้ค่าจาก CCD/CMOS มันจะเทียบเอาว่าค่าน้อยสุดคือดำ และค่าสูงสุดคือขาว แล้วค่อยเอามาปรับว่าสี R G B ของแต่ละพิกเซลควรจะเป็นเท่าไหร่ ผลก็คือสีในภาพอาจจะเพี้ยนไปจากที่ตาเห็น มากน้อยขึ้นกับปริมาณและชนิดแหล่งกำเนิดแสงใน scene นั้นๆ .. white balance เป็นค่าที่ปรับยาก ไม่มีสูตรสำเร็จ .. การปรับ white balance ได้ใกล้เคียงสภาพแสงจริง ช่วยให้แก้ไขสีของภาพได้ง่ายขึ้นเยอะ .. เอาเป็นว่าถ้าต้องการให้สี ‘ถูกต้อง’ หรือใกล้เคียงกับสีจริงให้เลือกปรับ white balance ที่ใกล้เคียงกับสภาพแสงในขณะนั้น ถ้าแสงแดดดีก็ใช้ sunny/daylight ฟ้าครึ้มก็ใช้ cloudy หลอดใส้ใช้ incandescent หลอดนีออนใช้ fluorescent ฯลฯ .. ส่วน auto white balance กล้องบางรุ่นก็แม่น บางรุ่นก็ไม่แม่น ต้องลองทดสอบกันเอง .. อันที่จริง เรื่อง white balance กับโทนเกี่ยวข้องกับความพึงพอใจเป็นหลัก ดังนั้นอาจจะไม่ต้องการให้แม่นยำถูกต้องเสมอไป .. บ่อยครั้งที่ผมจงใจตั้ง white balance ผิดไปจากแสงธรรมชาติเพื่อให้ได้ภาพอีกแบบ เช่นเดียวกัน การปรับชดเชยแสงก็ขึ้นกับเรา .. ประเด็นก็คือ หากบันทึกได้ใกล้เคียงกับ ‘ภาพสุดท้าย’ ที่ตั้งใจให้มันออกมา เวลาปรับแต่งมันก็จะง่าย

Sharpness ปรับความคมชัด .. มีหลายกรณีที่กล้องดิจิทัลไม่สามารถถ่ายภาพได้คมเป็นใบมีดเหมือนที่ใครเข้าใจ เพราะยังไงก็มีข้อจำกัดของเลนส์และการโฟกัส เพื่อให้ภาพดูคมชัดขึ้น กล้องดิจิทัลหลายๆ รุ่นมักจะทำ unsharp mask เพื่อปรับภาพให้ดูคมขึ้น .. การทำ unsharp mask จริงๆ แล้วก็คือทำให้สีเข้มให้เข้มยิ่งขึ้นและอ่อนให้อ่อนกว่าเดิมตรงจุดที่เป็นขอบของวัตถุในภาพ จะมีผลกระทบกับ histogram ของภาพ และทำให้เห็นเม็ดสีรบกวนเยอะขึ้นได้ด้วย จึงไม่ควรจะตั้ง sharpness เป็น + หรือ – (note: การไม่ทำ unsharp mask บางกล้องให้ตั้ง sharpness = 0 บางกล้อง sharpness = none ) .. หากต้องการปรับให้ภาพดูคมชัด มาทำบนคอมพิวเตอร์ดีกว่า พลาดก็ยังมี undo และยังปรับได้ละเอียดกว่าด้วย :)

โหมดถ่ายภาพแบบต่างๆ เช่น Portrait, Landscape, Macro, Hi-Speed, Night Portrait, Program, Aperture Priority (Av), Shutter Priority (Tv), Manual .. ถ้าเป็นไปได้ควรเลือกอยู่แค่ 3 แบบคือ Av, Tv, Manual เพราะโหมดอื่นๆ อาจจะมีการปรับแต่งสี ความคม ฯลฯ ให้อัตโนมัติ เช่น โหมด Portrait ของกล้องบางตัวจะปรับสีไปทางแดง-เหลืองนิดๆ เพื่อให้ผิวของแบบดูไม่ซีดและอาจจะปรับความคมให้ลดลงเพื่อให้ภาพ soft ลง .. โหมด Landscape มักใช้ถ่ายภาพวิวก็จะปรับสีไปทางเขียว-ฟ้าต้นไม้จะได้สวยท้องฟ้าจะได้แจ่ม และปรับความคมมากกว่าปกติ .. การเลือกโหมดบันทึกภาพที่เหมาะสมอาจจะช่วยให้ได้ภาพสวยได้ทันทีที่กดชัตเตอร์ แต่ถ้าจะเอามาปรับแต่งทีหลังจะกลายเป็นเพิ่มความยุ่งยากของ workflow .. อีกทั้งโหมดโปรแกรมอัตโนมัติทั้งหลายจะไม่ยอมให้ควบคุมความเร็วชัตเตอร์หรือระยะชัดลึกจึงอาจจะไม่ได้ภาพอย่างที่ต้องการ .. โหมดกึ่งอัตโนมัติอย่าง Av, Tv หรือ Manual เต็มๆ จะให้อิสระในการควบคุมมากกว่า และมีการปรับแต่งด้วยซอฟต์แวร์บนกล้องน้อยกว่าด้วย :)

หลักๆ ที่ควรจะปรับก็คงมีเท่านี้แหละครับ .. ออกไปกดชัตเตอร์กันดีกว่า :)

Shoot !

ในบางแง่มุม กล้องดิจิทัลเองก็มีข้อจำกัดมากอยู่เหมือนกันเมื่อเทียบกับกล้องฟิล์ม สิ่งที่กล้องดิจิทัลด้อยกว่ากล้องฟิล์มและเป็นสิ่งที่ต้องระวังเวลาจะบันทึกภาพก็คือ ‘Latitude’ อธิบายคร่าวๆ ก็คือ ค่าความยืดหยุ่นของฟิล์มว่าทนต่อความผิดพลาดในการวัดแสงได้มากน้อยขนาดไหน ฟิล์มมี latitude สูง เรียกว่ามีพื่นที่เผื่อในกรณีวัดแสงพลาดค่อนข้างมาก ฟิล์มสไลด์ดีๆ วัดแสงผิดสัก 1-2 สต็อปก็ยังได้ภาพที่ดีสีจัดจ้าน .. ส่วน CCD/CMOS จะมี latitude ต่ำมาก วัดแสงพลาดแล้วต้องมานั่งแก้ไข ซึ่งมักจะไม่ได้ผลดีเท่าไหร่ ดังนั้นการอ่านและวัดแสงให้แม่นยำเป็นเรื่องสำคัญอันนึงที่ต้องฝึก (จริงๆ แล้วไม่ว่าจะเป็นกล้องดิจิทัล หรือฟิล์มก็ต้องฝึกเรื่องวัดแสง) .. อย่างน้อยที่สุดคือต้องระวังเรื่อง blow out เพราะมันแก้คืนไม่ได้ .. blow out เกิดจากเราปล่อยให้กล้องบันทึกแสงในปริมาณมากเกินไป ทำให้ได้ภาพหรือบางส่วนของภาพขาวสว่างมากจนไม่เหลือรายละเอียดปรากฏ กล้องบางรุ่นหลังจากบันทึกภาพแล้วจะดู highlight ซึ่งเป็นจุดที่เกิด blow out ในภาพได้ หรือบางรุ่นจะมี histogram ก็ใช้ดูได้เช่นกัน .. histogram เป็นกราฟบอกการกระจายของโทนจากดำไปขาว ภาพที่ over expose ลักษณะ histogram จะเอียงไปทางขวา ยิ่งถ้าติดขอบด้านขวาก็แสดงว่าเกิด blow out แน่นอน .. และเพราะ blow out มันทำให้รายละเอียดของภาพหาย กล้องบางตัวจึงมีการปรับจูนการวัดแสงเพื่อให้ได้ภาพ under expose นิดๆ ประมาณ 0.3 – 0.5 stop .. ไม่ต้องกังวลมากถ้าภาพออกมามืดนิดๆ ยังไงก็ดีกว่าทำให้รายละเอียดหายเพราะถ่ายเวอร์เกินไป .. เอาล่ะ หลังจากได้ภาพมาแล้ว ที่เหลือเป็นหน้าที่ของซอฟต์แวร์บนคอมพิวเตอร์กันล่ะ :)

Generic Workflow

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

  1. ดาวน์โหลดภาพเข้าเครื่องคอมพิวเตอร์ มีคำแนะนำว่าควรจะแบ่งไดเรกทอรี่เป็นสัดส่วน ตั้งชื่อให้สื่อความหมายจะได้สะดวกในการค้น อาจจะตั้งชื่อไดเรกทอรี่ตามเหตุการณ์ที่ไปบันทึกภาพมา หรือชื่อสถานที่ท่องเที่ยว กำกับวันที่ไว้ด้วยก็อาจจะช่วยค้นหาได้ง่ายขึ้นเช่นกัน
  2. ซอฟต์แวร์สำหรับดูภาพหลายๆ ตัว ช่วยจัดระบบภาพได้ โดยให้เราการกำหนดหมวดหมู่หรือใส่คำบรรยายกำกับภาพ ถ้าจัดระบบดีๆ ก็จะช่วยให้ค้นหาภาพได้ง่ายขึ้น .. การกำหนดหมวดหมู่อาจจะแบ่งได้หลายแบบ เช่น แบ่งตามประเภทของภาพ เป็น ภาพบุคคล วิว น้ำตก ภูเขา ทะเล ฯลฯ .. หรือภาพถ่ายครอบครัวก็อาจจะแบ่งตามสมาชิกในครอบครัวก็ได้ .. คำบรรยายอาจจะเขียนกำกับลักษณะ บรรยากาศ หรือ ความรู้สึกขณะบันทึกภาพก็ได้
  3. สร้าง thumbnail ไว้ จะได้ browse ได้เร็วขึ้น .. โปรแกรมส่วนใหญ่จะทำให้อัตโนมัติ อย่างไรก็ตามมีคำแนะนำว่า ถ้าโปรแกรมสามารถบันทึก thumbnail แยกเป็นไดเรกทอรี่ได้ก็จะดี เพราะเวลาเก็บลง CD จะได้บันทึก thumbnail ไว้ด้วย ไม่ต้องเสียเวลาสร้าง thumbnail ใหม่
  4. เก็บต้นฉบับลง offline media สักสองสำเนา เอา CD-R ก็ได้ แผ่นไม่กี่ตังค์ เสียภาพบางภาพไปไม่คุ้มกันหรอกครับ .. หากภาพยังไม่เต็มแผ่นพอดี ก็เผาเก็บลง CD-RW ก่อนก็ได้ ทำไปจนกว่าแผ่น CD-RW เต็มค่อยถ่าย CD-RW ลง CD-R แล้วเอาแผ่น CD-RW มาหมุนเวียนใช้งานต่อ .. แผ่น DVD+/-R/RW ก็ใช้เทคนิคเดียวกัน
  5. คัดเลือกภาพจากต้นฉบับที่ต้องการเอาไปใช้งาน แนะนำว่าให้ลบไฟล์ที่ไม่ต้องการใช้จริงๆ ทิ้งไปก่อน (อย่าลืมเก็บลง offline media !) แล้วค่อยก๊อปปี้ไฟล์ที่จะเอาไปใช้แยกออกมาไว้อีกไดเรกทอรี่สำหรับเอาไปปรับแต่งภาพ .. วิธีนี้จะยังเหลือภาพต้นฉบับที่จะนำไปใช้บนฮาร์ดดิสก์ เกิดข้อผิดพลาดกับภาพที่แต่งยังไงก็มีต้นฉบับให้เริ่มใหม่โดยไม่ต้องไปค้นออกมาจาก CD-R
  6. ปรับแต่งภาพให้ดีขึ้น .. ก่อนอื่น ต้อง calibrate จอก่อน ถ้าไม่รู้จะทำไงก็ลองทำตามคำแนะนำ ของ http://www.displaycalibration.com/ หรือ http://www.normankoren.com/makingfineprints1A.html หลังจากได้จอที่เที่ยงตรงพอสมควรแล้วค่อยมาปรับแต่งภาพกัน .. การปรับแต่งภาพขั้นพื้นฐานอยู่ไม่กี่อย่างครับ แต่ถ้าได้ทำสักนิดภาพจะแจ่มขึ้นอีกเป็นกอง …

  • Rotate – โปรแกรมหลายโปรแกรมยังไม่ฉลาด มันไม่รู้ว่าเราถ่ายภาพมาแนวตั้งหรือแนวนอน หมุนภาพซะให้ถูกต้อง โปรแกรมหลายๆ ตัวจะทำ lossless JPEG rotation ได้ ช่วยให้ไม่เสียคุณภาพขณะหมุน
  • Crop – การเปลี่ยนกรอบภาพอาจช่วยให้องค์ประกอบของภาพดีขึ้น ได้ภาพน่าสนใจมากขึ้น .. เวลา crop ภาพพยายามให้ aspect ratio คงเดิมได้ก็ดี เช่นภาพขนาด 1600×1200 ถ้า crop แนวนอนได้ 400 pixels ก็ควรจะได้แนวตั้ง 300 pixels .. อย่างไรก็ตาม การปรับ aspect ratio ก็เหมือนกับกฏการจัดองค์ประกอบภาพอื่นๆ ที่ไม่จำเป็นต้องทำตามทุกครั้งไป .. ภาพบางภาพกำหนด aspect ratio เป็น 1:1 อาจจะสวยกว่า 3:2 หรือ 4:3 หรือ 16:9
  • Level – อันนี้ต้องอธิบายละเอียดนิด เพราะเป็นตัวหลักที่จะต้องปรับแทบทุกภาพ .. level เป็นค่าที่บอกระดับความต่างของโทนแต่ละสี ปกติแล้วมีค่า 0 -255 (i.e. 8 bits/channel) โดยที่ 0 = ดำ 255 = ค่าสว่างสุดของสีนั้น .. ภาพที่เราบันทึกมาบางครั้งมันจะมีโทนไปกองอยู่ช่วงใดช่วงนึง ดูได้จาก histogram .. การปรับ level จะเป็นการขยายช่วงโทนของภาพให้กระจายเต็มที่ตั้งแต่ 0 – 255 ทำให้ความแตกต่างของสีสันมีมากขึ้น brightness contrast สูงขึ้น ผลก็คือ ภาพจะดูมีมิติมากขึ้น สีสันสดใส … ตัวควบคุม level มีสามค่า คือ black point กำหนดค่าต่ำสุดอยู่ทางซ้ายมือ, white point กำหนดค่าสูงสุดอยู่ทางขวามือ และ gamma กำหนดแฟคเตอร์การกระจายโทน .. การปรับ level ทั่วไปแล้วจะดูจาก histogram ของสี โดยเลื่อน black point มาที่ปลายด้านซ้ายของ histogram และเลื่อน white point มาไว้ที่ปลายด้านขวาของ histogram เสร็จแล้วค่อยปรับ gamma ถ้าต้องการ .. การปรับ level อาจจะปรับที่โทน (สีดำ) ตัวเดียวก็ได้ หรือ ปรับแยกแต่ละช่องสี (R G B) ก็ยิ่งดี .. วิธีการปรับนี้ไม่ใช่สูตรสำเร็จ ดังนั้นไม่ต้องไปยึดติดกับวิธีการหรือค่าต่างๆ มากนัก คำแนะนำในการปรับ level เป็นแค่ตัวช่วยคร่าวๆ คนที่ตัดสินใจว่าพอดีไม่ใช่ histogram แต่เป็นตัวเราเองต่ะหาก :)

มากกว่านี้ก็อาจจะมี color balance, sharpening, soft, noise removal หรือตกแต่งกันระดับ pixel เช่น ลบสิวฟ้า ทำหน้าเด้งหน้าใส ฯลฯ .. ที่ควรจะต้องทราบคือ ลำดับก่อน-หลังในการปรับแต่งก็สำคัญเหมือนกัน อย่าง unsharp mark ถ้าเป็นไปได้ให้ทำเป็นอันดับท้ายสุด เพราะมันกระทบกับ histogram ของภาพ ถ้าทำ unsharp mask ก่อนแล้วมาปรับ level ทีหลังจะได้ผลลัพธ์ไม่ค่อยดีนัก

เก็บภาพที่แต่งเสร็จแล้วลง offline media ใช้วิธีเดียวกับการเก็บต้นฉบับ

My workflow

เวลานี้ผมใช้ workflow จัดการภาพเพื่อความสะดวกในการค้นหาและเลือกภาพ publish ขึ้นเว็บ อุปกรณ์ที่ใช้มีกล้องดิจิทัลสองตัว (Olympus C700UZ + Nikon D70) ทั้งสองปรับตั้งค่าต่างๆ ตามที่เขียนไว้ข้างบน + ใช้ Adobe RGB + Custom Curve สำหรับ D70 .. การบันทึกภาพ ถ้าเป็นไปได้จะบันทึกเผื่อพื้นที้ไว้แล้วมา crop ปรับองค์ประกอบภาพทีหลัง .. workflow บนคอมพิวเตอร์ทำบนลินุกซ์ทั้งหมด ขั้นตอนก็มีดังนี้

  • โหลดภาพจากกล้อง มีสองวิธี ถ้าเป็น USB Storage ก็ cp เอา ถ้าเป็น PTP mode ก็จะใช้ gtkam โหลดมาแทน .. ข้อดีของ gtkam คือ เห็น thumbnail ก่อน เลยเลือกโหลดเป็นภาพๆ ได้ แต่ข้อเสียก็คือ gphoto2 ที่เป็น library ในการโหลดภาพไม่ยอมปล่อยหน่วยความจำจนกว่าจะโหลดภาพครบ ถ้าโหลดภาพจำนวนเยอะๆ กินหน่วยความจำระบบเยอะไปด้วย .. ปกติผมจะใช้ USB Storage เพราะจะโหลดภาพทั้งหมดอยู่แล้ว ชื่อไดเรกทอรีตั้งในรูปแบบ yymmdd-place เปลี่ยน permission ภาพทั้งหมดเป็น 644
  • ภาพที่กำหนด color space เป็น Adobe RGB ชื่อไฟล์มันจะเป็น _dscxxxx.nef แทนที่จะเป็น dsc_xxxx.nef ตามปกติ ผมสั่ง rename โดยใช้ script นี้:
#!/bin/sh
for f in _dsc*.*; do
    x=`echo -n dsc_; echo $f | cut -f2 -dc`
    mv $f $x
done;
  • ภาพ NEF(Nikon raw image format) ตอนนี้ยังไม่มีโปรแกรม viewer บนลินุกซ์ เลยใช้วิธีถอด JPEG (full resolution + basic compression) ที่ฝังอยู่ใน NEF มาใช้ จะได้ browse เลือกดูสะดวกๆ
$ for f in *.nef; do exiftool -b -JpgFromRaw $f > `basename $f .nef`.jpg; done
  • ใช้ GQview ในการจัดการภาพ ตั้งให้ GQview เก็บ thumbnail ลงใน .thumbnail ในไดเรกทอรี่ที่เก็บภาพ เวลาเปิดดูภาพจาก CD-R จะได้มี thumbnail พร้อมใช้
  • สำเนาต้นฉบับลง CD-R สองชุด
  • เอา GQview คัดภาพที่ต้องการลงเว็บ สำเนามาไว้ในไดเรกทอรี่สำหรับแต่งภาพ .. ขั้นตอนการปรับแต่งจะทำในไดเรกทอรีแต่งภาพเท่านั้น จะได้ไม่เผลอไปแก้ภาพต้นฉบับโดยไม่ตั้งใจ
  • อ่านภาพ NEF เข้ามาบน The GIMP ด้วย UFRaw plug-in .. ภาพจากไฟล์ NEF สามารถปรับเปลี่ยน white balance , exposure, saturation และอื่นๆ ได้ขณะ import และยังเลือก input/output color profile ได้ด้วย

  • crop ภาพให้ได้กรอบที่ต้องการ
  • แก้ไขภาพระดับ pixel ถ้าจำเป็น
  • ปรับ level/curve
  • ย่อภาพลงเหลือ 500 x 331
  • ใส่กรอบภาพ ตัวหนังสือ ฯลฯ
  • บันทึกภาพเก็บเป็นไฟล์ JPEG ผมตั้งเป้าขนาดไฟล์ไว้ไม่ให้เกิน 100 KB/ภาพ ภาพบนเว็บใหญ่เกินไปมันจะโหลดช้า พารามิเตอร์ที่ใช้คือ
    • Quality อยู่ระหว่าง 85 – 92 มากกว่านี้ไฟล์จะขนาดใหญ่ขึ้นมาก น้อยกว่านี้จะเริ่มเห็นคุณภาพที่ตกลงไป
    • Smooth = 0 .. smooth เป็นค่าปรับการกลมกลืนของสี ยิ่งตั้งค่าสูงๆ ก็จะลดจำนวนสีไปได้มาก ตั้งค่าเป็น 0 เท่ากับว่าไม่มีการลดทอนสีด้วยการ smooth
    • Force Baseline JPEG เพื่อความมั่นใจว่า JPEG decoder ใดๆ ก็จะอ่านภาพขึ้นมาได้เสมอ
    • Progressive … ภาพ JPEG ทั่วไปเวลา decode จะเห็นภาพจากซ้ายไปขวา บนลงล่าง .. Progressive JPEG จะเห็นภาพเบลอๆ ทั้งภาพแล้วค่อยๆ ชัดขึ้นๆ ..เลือก Progressive JPEG ช่วยลดขนาดภาพลงได้นิดหน่อย
    • Subsampling = (1×1, 1×1, 1×1) .. ค่า subsampling เป็นอัตราการ downsampling channel แดง/เขียว น้ำเงิน/เหลือง brightness ตามลำดับ .. ถ้าตั้ง 2×2 1×1 1×1 แปลว่า channel แดง/เขียวจะถูก downsampling ลงเหลือครึ่งนึงของตัวอื่น เช่น เดิมมี 256 ระดับสีก็จะลดลงเหลือ 128 ระดับ จึงใช้พื้นที่เก็บน้อยลง .. ถ้าตั้ง 1×1 1×1 1×1 แปลว่าไม่มีการ downsampling เลย
    • DCT Method = Floating-point DCT .. Discrete Cosine Transform เป็นหัวใจของการบีบอัดของ JPEG ตัวเลือกนี้มีไว้เปลี่ยนความแม่นยำในการคำนวณ DCT ซึ่ง output จะไม่มีผลกับขนาดของภาพ แต่มีผลกับคุณภาพและเวลาในการคำนวณเป็นหลัก เลือกใช้ Floating-point ทำให้การคำนวณ DCT มีความแม่นยำสูง และได้คุณภาพของภาพที่ดีกว่า และแน่นอนว่ามันคำนวณช้ากว่าด้วย .. แต่คอมพิวเตอร์ทำงานเร็ว ไม่รู้สึกว่าช้าหรอก :)
    • ไม่บันทึก thumbnail / EXIF data ขนาดไฟล์จะลดลงได้อีก 10-30 KB :)
  • ใช้ jhead หรือ exiftool อ่านข้อมูล EXIF มาสร้างเป็น description จะอ่าน EXIF มาจากไฟล์ต้นฉบับ
$ for f in *.jpg; do
    exiftool /path/to/original/`basename $f .jpg`.nef > desc/$f.html;
done
  • ใช้ jhead ลบ EXIF และ header ที่ไม่จำเป็น ออกจากไฟล์ภาพใน web gallery ที่อาจจะเผลอทิ้งไว้
$ jhead -dc *.jpg
$ jhead -de *.jpg
$ jhead -dt *.jpg
  • สร้าง thumbnail ของ web gallery โดยใช้โปรแกรม convert ของ ImageMagick ย่อลงเหลือ 20% … สั่งเป็น batch เลยทีเดียว เร็วกว่าย่อทีละภาพบน GIMP :)
$ for f in *.jpg; do
    convert -quality 85 -resize 20%x20% $f tn/tn_$f;
done
  • เขียน description ของแต่ละภาพ ใช้ gedit หรือ leafpad
  • sync web gallery ขึ้นเว็บเซิร์ฟเวอร์ด้วย rsync
$ rsync -e ssh -auv --progress /path/to/gallery/ user@server:/path/to/gallery/

จบแล้ว .. สรุปสักนิด .. digital workflow อาจจะดูเหมือนสร้างภาระงานให้มากขึ้น ซึ่งก็เป็นอย่างนั้นจริงๆ .. แต่ที่เขียนมานี้ตั้งใจให้เป็นเพียง guideline และคำแนะนำคร่าวๆ สำหรับใครก็ตามที่ต้องการเริ่มต้นกับการปรับแต่งภาพ มากกว่าจะสูตรตายตัวที่ต้องทำทุกครั้งกับทุกภาพ .. ขั้นตอนทั้งหมดที่กล่าวมาจะทำตามก็ได้ ไม่ทำก็ได้ หรือทำแต่ไม่เหมือนกันก็ได้เพราะ workflow ส่วนนึงต้องหาแนวทางที่ถนัดกันเอง .. ขอให้สนุกกับการบันทึกภาพ

.. May the light be with you :)

Setting Up Thai Domain Names

ไม่นานมานี้ THNIC เปิดบริการโดเมนเนมภาษาไทยฟรีให้กับเจ้าของโดเมน .th ทั้งหมดโดยที่ THNIC ให้ขอชื่อโดเมนภาษาไทยสำหรับโดเมนภาษาอังกฤษที่จดไว้กับ THNIC แล้ว หากผ่านการพิจารณาแล้ว THNIC จะทำการแม็ปชื่อโดเมนภาษาไทยกับโดเมนภาษาอังกฤษให้อัตโนมัติ โดยเซิร์ฟเวอร์ที่ THNIC จะเป็น DNS server สำหรับโดเมนภาษาไทยทุกตัวที่ขอจดไป .. อย่างไรก็ตามหากเราต้องการรัน DNS server สำหรับโดเมนภาษาไทยเองก็สามารถทำได้เช่นกัน

Internationalized Domain Name (IDN)

โดเมนภาษาไทยนี้จะต่างไปจากบริการของนิภาหรือบริการชื่อไทยอื่นๆ ก่อนหน้านี้ที่อาศัยการแฮ็กและติดตั้งซอฟต์แวร์เสริม (ที่ไคลเอ็นด์ และ/หรือที่ ISP).. สำหรับโดเมนภาษาไทยที่ THNIC ให้บริการคือระบบโดเมนหลายภาษา เป็นมาตรฐานที่ร่างโดย Internationalized Domain Name Working Group ของ IETF .. วิธีการของ IDN ปัจจุบันใช้การเก็บข้อมูลโดเมนเนมภาษาต่างๆ ในรูปแบบที่เรียกว่า punycode (กำหนดไว้ใน RFC 3492) ซึ่งสามารถบันทึกเก็บในฐานข้อมูลของ DNS เป็น ASCII ธรรมดาได้ .. เมื่อฐานข้อมูลเก็บเป็น punycode การ query จึงเป็น punycode ด้วย ตอนนี้ resolver ใน OS เกือบ/ทั้งหมดยังไม่สนับสนุนการแปลงโดเมนภาษาต่างๆ เป็น punycode ดังนั้นแอพพลิเคชันจึงต้องทำเอง (วิธีการที่ให้แอพพลิเคชันแปลงเป็น punycode เองนี่เรียกว่า IDN in Application หรือ IDNA – RFC 3490) .. ข่าวดีสำหรับลินุกซ์คือ บราวเซอร์ยอดนิยมทั้งหลาย i.e., Mozilla, Firefox, Opera จะแปลงโดเมนเนมใน URL เป็น punycode ให้อัตโนมัติ ผู้ใช้งานลินุกซ์จึงใช้งานโดเมนภาษาไทย หรือภาษาอื่นๆ ได้ทันที … ส่วน IE ต้อง ดาวน์โหลดปลั๊กอิน มาติดตั้งด้วย

Server Side

ฝั่ง DNS server ไม่จำเป็นต้องเปลี่ยนแปลง/แพตช์อะไรเลย เพราะ punycode ก็คือ ASCII ธรรมดาเหมือนโดเมนภาษาอังกฤษทั่วๆ ไป .. หากต้องการรัน DNS server สำหรับโดเมนภาษาไทยหรือภาษาอะไรก็ตาม วิธีการก็เพียงแค่สร้าง zone ใหม่สำหรับโดเมนนั้น โดยที่แปลงชื่อโดเมน หรือชื่อซับโดเมน หรือโฮสต์เนมในภาษานั้นๆ เป็น punycode ก่อนเท่านั้นเอง ยกตัวอย่างเช่น โดเมน kitty.in.th มีโดเมนภาษาไทยชื่อ แมวเหมียว.th

ขั้นแรกก็แปลง “แมวเหมียว” เป็น punycode ก่อน โดยแปลงที่ http://josefsson.org/idn.php ก็ได้ หรือจะเอาซอร์สจาก RFC 3492 หรือ http://www.gnu.org/software/libidn มาคอมไพล์ก็ได้ ..

แมวเหมียว = xn--y3cadscv5e5dg

สร้าง zone สำหรับ แมวเหมียว.th โดยใช้ punycode

zone "xn--y3cadscv5e5dg.th" {
        type master;
        file "sandbox/kitty.in.th-idn";
        allow-update { none; };
};

สร้างฐานข้อมูลในไฟล์ kitty.in.th-idn (หรืออะไรก็ตามที่ระบุไว้ใน zone) .. ข้อมูลที่ใส่ก็เหมือนฐานข้อมูลของโดเมนภาษาอังกฤษ เพียงแต่แปลงโฮสต์เนมเป็น punycode ก่อน แล้วค่อยเก็บลงไป

โดเมน = xn--l3ckx7ji

เว็บ = xn--r3cz4e3a

ไฟล์ = xn--w3cm5g8a

เมล = xn--y3ci3f

        IN      NS      ns.kitty.in.th.
        IN      MX      5       mail.kitty.in.th.

@               IN      A       203.152.18.6
xn--l3ckx7ji    IN      CNAME   ns.kitty.in.th.
xn--w3cm5g8a    IN      CNAME   ftp.kitty.in.th.
xn--r3cz4e3a    IN      CNAME   www.kitty.in.th.
xn--y3ci3f      IN      CNAME   mail.kitty.in.th.

รีสตาร์ทเนมเซิร์ฟเวอร์

# named.restart

ติดต่อ THNIC เพื่อขอให้ชี้ primary/secondary DNS server สำหรับโดเมนภาษาไทยมาที่เซิร์ฟเวอร์ของเราแทน

.. เสร็จแล้ว !

เน็ตเวิร์กไดรว์ ผ่าน sftp บน GNOME 2.6

บน GNOME เวอร์ชันก่อนๆ เราสามารถแม็ปเน็ตเวิร์กไดรว์ผ่านทาง smb หรือ ftp ส่วนใน GNOME 2.6 นอกจาก smb และ ftp แล้ว Gnome-VFS ยัง สนับสนุน sftp และ WebDAV ด้วย ทำให้เราสามารถแม็ปเน็ตเวิร์กไดรว์ผ่านโพรโตคอลเหล่านี้ได้ วิธีการคือดับเบิลคลิก “Computer” เลือกเมนู “File ? Connect to server … ” จะปรากฏไดอะล็อกกรอกข้อมูลสร้างเน็ตเวิร์กไดรว์

Link name: ชื่อลิงก์

Location (URL): กรอก sftp://[email protected]/path/to/dir/

เช่น

กด connect เป็นอันเสร็จขั้นตอนการแม็ปเน็ตเวิร์กไดรว์ ซึ่งจะมีไอคอนของเน็ตเวิร์กไดรว์ปรากฏในไดอะล็อกคอมพิวเตอร์ และบนเดสก์ท็อป การใช้งานก็เหมือนระบบไฟล์ปกติ ซึ่ง drag & drop ได้ ทำให้อัปโหลด/ดาวน์โหลดไฟล์ผ่าน sftp ได้สะดวกขึ้นมาก

โน้ต

  • วิธีนี้ใช้ได้กับทุกโพรโทคอลที่ gnome-vfs สนับสนุน (e.g., ftp://… smb://… )
  • gnome-vfs ไม่สามารถ accept host key ได้ หากไม่เคยเชื่อมต่อเครื่องปลายทางมาก่อนเลย ให้ใช้ ssh/sftp/scp บนคอมมานด์ไลน์ในการเชื่อมต่อครั้งแรกเพื่อ establish host key จากนั้นจึงใช้การเชื่อมผ่านทาง gnome-vfs
  • หากจำเป็น gnome-vfs จะถามรหัสผ่านในการเชื่อมต่อ เราสามารถเลือกให้บันทึกรหัสผ่านเก็บใน gnome-keyring ได้ และเลือกได้ว่าให้จำรหัสผ่านไปตลอด หรือเฉพาะ session นั้นๆ
  • ถ้าใช้เครื่องส่วนตัว ลองพิจารณาใช้ public-key authentication สำหรับ ssh ซึ่งสะดวกและปลอดภัยกว่าการใช้รหัสผ่าน วิธีการคือ

สร้าง public key pair เช่นสร้าง RSA key pair ขนาด 1024 บิต จะสั่งงานเป็น

$ ssh-keygen -t rsa -b 1024

จากนั้นทำตามขั้นตอนการสร้าง key pair เสร็จเรียบร้อยแล้วจะได้ไฟล์ id_rsa และ id_rsa.pub (หรือ id_dsa/id_dsa.pub กรณีสร้าง DSA key pair) เก็บไว้ใน ~/.ssh/

จากนั้นทำยังไงก็ได้ให้ข้อมูลใน id_rsa.pub (หรือ id_dsa.pub) ไปต่อท้ายไฟล์ ~/.ssh/authorized_keys ในเครื่องปลายทาง เช่น

scp id_rsa.pub [email protected]:
ssh [email protected]
password:
user@remote $ cat id_rsa.pub >> ~/.ssh/authorized_keys
user@remote $ rm id_rsa.pub

เสร็จแล้ว ลอง ssh [email protected] หากตามขั้นตอนถูกต้อง และ sshd ที่เครื่องปลายทางเปิดให้ใช้ public key authentication จะสามารถล็อกอินเครื่องปลายทายได้โดยไม่ต้องกรอกรหัสผ่าน Gnome-VFS ก็จะไม่ถามรหัสผ่านเช่นกัน

คำเตือน: key pair เป็นข้อมูลสำคัญมาก โดยเฉพาะ id_rsa/id_dsa ซึ่งเป็น private key ระวังอย่าให้ตกไปอยู่ในมือผู้อื่นเป็นอันขาด (เป็นเหตุผลว่าทำไมถึงควรใช้ public key authentication เฉพาะเครื่องส่วนตัวเท่านั้น)

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

ใช้ 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

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/

ติดตั้งลินุกซ์เคอร์เนล 2.6

ผมเริ่มทดลองติดตั้งเคอร์เนล 2.6 บน peorth ตั้งแต่ 2.6.0-test10 แต่ไม่ประสบผลสำเร็จซักที ก็เลยไม่ได้เขียนวิธีการติดตั้งเป็นเรื่องเป็นราว ปัญหาใหญ่สุดของผมคือ usbmouse ไม่ทำงาน และ touchpad ก็มีอาการกระโดดๆ จนถึง 2.6.0 released อาการนี้ก็ยังไม่หาย จนไม่นานนี้เอา 2.6.0-1.30 ของ Fedora Core 2 (FC2) เป็น rpm มาติดตั้งรวดเดียวผ่านฉลุย ก็เลยได้กลับมาลองเคอร์เนล 2.6 อีกครั้ง

ฟีเจอร์ใหม่ๆ ของ 2.6 ที่ต่างไปจากวานิลลา 2.4.24 ก็มีเยอะเหมือนกัน และก็จะมีบางส่วนที่ removed/deprecated/obsoleted ด้วย ที่เห็นชัดจะมีเรื่องการสนับสนุนฮาร์ดแวร์ และระบบขนาดใหญ่ … รายละเอียดปลีกย่อยมันเยอะ (มากๆๆ) ครับ ลองหาอ่านเอาเองนะครับ อย่างไรก็ตามอยากแนะนำให้เริ่มเปลี่ยนเคอร์เนลเป็น 2.6 กันได้เลยครับ เพราะข่าวจาก Marcelo Tosatti ที่เป็น 2.4 kernel maintainer จะเป็นรีลีสสุดท้ายของเคอร์เนล 2.4 และจะเริ่มเข้าสู่ maintainance mode ซึ่งจะไม่มีการพัฒนาฟีเจอร์เพิ่มกันอีก จะเหลือแต่แก้ไขบักเล็กน้อยเท่านั้น นักพัฒนาเคอร์เนลก็จะมุ่งไปที่เคอร์เนล 2.6 (stable branch) และ 2.7 (development branch) แทน .. (2.4.24 จะเป็นรีลีสสุดท้ายหรือเปล่า ตอนนี้ไม่แน่ใจเหมือนกันครับ เพราะออกก่อนกำหนดตั้งเดือนครึ่ง ด้วยต้องการแก้บักด้านความปลอดภัยหลายๆ ตัว)

Configuration

หลังจากลอง kernel-2.6.0-1.30 ของ FC2 แล้วประสบผลสำเร็จดี ผมก็เลยเอา kernel-source-2.6.0-1.30 มาทำ custom kernel แต่ในวันเดียวกันนั้นเอง ลินุสก็ออก 2.6.1 ผมเลยเอามาติดตั้งด้วย แล้วไม่กี่ชั่วโมงต่อมาก็มีแพตช์ mm1 ของ แอนดรูว์ มอร์ตัน ออกมา ตามด้วย mm2 ในวันเดียวกันอีก สรุปว่าผมลงเคอร์เนล 2.6 ห้าตัวในวันเดียว เล่นเอาพื้นที่ในดิสก์เกือบจะไม่พอ

วิธีการคอนฟิกเคอร์เนลหากใช้ make menuconfig จะเห็นว่าอินเทอร์เฟซแทบไม่เปลี่ยนเลย แต่ถ้าใช้ make xconfig จะกลายเป็นอินเทอร์เฟซที่ใช้ QT แทนที่จะเป็น tcl/tk และที่เพิ่มมาอีกอันคือ make gconfig สำหรับอินเทอร์เฟซที่ใช้ GTK .. แรกๆ อาจจะไม่ค่อยคุ้นนัก แต่ลองได้คอนฟิกบ่อยๆ เดี๋ยวก็ชิน มาดูส่วนที่น่าสนใจกันสักนิด

  • General setup -> Loadable module
    • Automatic kernel module loading : เคอร์เนลจะสั่ง modprobe อัตโนมัติเมื่อต้องการใช้โมดูลบางตัว -> Y
  • Power Management support
    • ถ้าฮาร์ดแวร์สนับสนุน ACPI แนะนำให้ใช้ ACPI แทน APM ครับ
    • โน๊ตบุ๊คที่ใช้ CPU/Chipset ที่สนับสนุน CPU Frequency scaling (e.g., Speedstep-ICH, Pentium-M, PowerNow!, LongRun, …) แนะนำให้ enable CPU Frequency scaling ด้วยครับ
  • Device drivers -> ATA/ATAPI/MFM/RLL support
    • ถ้ามี IDE/ATAPI CD Writer .. เคอร์เนล 2.6 ไม่จำเป็นต้องใช้ SCSI emulation (BLK_DEV_IDESCSI) แล้วครับ
  • Device drivers -> Input Device
    • ต้องเลือก Y สำหรับออพชั่นหลักสี่ตัวคือ
      • หากต้องการใช้ PC Speaker ต้องเลือก PC Speaker support (INPUT_PCSPKR) ในเมนู Misc ด้วยครับ
  • File systems -> Pseudo filesystems
    • /proc file system support (PROC_FS) -> Y
    • sysfs support (SYSFS) -> Y จำเป็นมากๆ
  • Device drivers -> Character devices
    • Virtual terminal (VT) -> Y
    • Support for console on virtual terminal (CONSOLE_VT) -> Y
  • Device drivers -> Graphics support -> Console display driver support
    • ถ้าต้องการใช้ Framebuffer ต้องเลือก Y ออพชั่นต่อไปนี้ครับ
      • VGA Text console (VGA_CONSOLE)
      • Video mode selection support (VIDEO_SELECT)
      • Framebuffer Console support (FRAMEBUFFER_CONSOLE)
  • Sound
    • แนะนำให้ใช้ ALSA แทน OSS ครับ เท่าที่ทดสอบคือต้องคอมไพล์เป็นโมดูลเท่านั้นครับถึงจะใช้งานได้ ดังนั้นสำหรับ ALSA ให้เลือกเป็น M แทน Y นะครับ และควร config เพื่อให้ ALSA จำลองตัวเองเป็น OSS สำหรับแอพพลิเคชั่นที่ยังไม่สนับสนุน ALSA ครับ
      • OSS API emulation (SND_OSSEMUL)
      • OSS Mixer (SND_MIXER_OSS)
      • API OSS PCM API (SND_PCM_OSS)
      • OSS Sequencer API (SND_SEQUENCER_OSS)

Installation

2.6 ไม่ต้อง make dep แล้วครับ ขั้นตอนการ build จะเหลือเพียง

make
make modules_install
make install

และรายละเอียดช่วงคอมไพล์ก็จะถูกตัดทอนไปเยอะ เหลือเพียงสถานะบอกว่ากำลังทำอะไรกับโมดูลไหนเท่านั้น

Post Installation

หลังจากติดตั้งแล้ว ทีนี้ก็เป็นเรื่องคอนฟิกระบบสำหรับใช้กับเคอร์เนล 2.6 นะครับ มีจุดที่ต้องแก้อยู่นิดหน่อย

ใน 2.6 ‘จำเป็น’ ต้องใช้ sysfs ครับ ดังนั้น /etc/fstab ต้องเพิ่ม entry สำหรับ sysfs เข้าไป โดยเพิ่มบรรทัด

none                    /sys                    sysfs   defaults        0 0

และสร้างไดเรคทอรี่ /sys เตรียมไว้โดย

mkdir /sys

ใน /etc/rc.sysinit ส่วนของ HID คอมเมนต์บรรทัด keybdev กับ mousedev ออกครับ เพราะใน 2.6 ส่วนของ HID (Human Interface Device) ออกแบบใหม่ครับ และจะไม่มี keybdev กับ mousedev แล้ว ถ้าไม่คอมเมนต์ออกมันจะฟ้องตอนบูตว่า modprobe หาโมดูลไม่ได้ .. ที่จริงก็ไม่ได้สร้างปัญหาอะไรครับ แต่มันน่ารำคาญเท่านั้นล่ะ :P

คอนฟิกโมดูลใน 2.4 จะใช้ /etc/modules.conf แต่ใน 2.6 จะเป็น /etc/modprobe.conf ครับ ดังนั้นต้องย้ายคอนฟิกใน /etc/modules.conf ไปไว้ที่ /etc/modprobe.conf ด้วย ผมใช้วิธีถึกๆ แบบนี้

cat /etc/modules.conf > /etc/modprobe.conf

แล้วค่อยไปแก้ไขเอาทีหลัง

สำหรับ ALSA ต้องเพิ่มข้างล่างนี้ใน /etc/modprobe.conf ด้วย คอนฟิก ALSA ของ 2.4 กับ 2.6 จะต่างกันเล็กน้อยครับ ลองตรวจเช็คดูครับ ตัวอย่างข้างล่างเป็นคอนฟิกสำหรับ Intel AC’97 นะครับ โมดูลที่ใช้ชื่อ snd-intel8x0 สำหรับเครื่องที่ใช้ซาวด์การ์ดต่างไปจากนี้ก็แก้ที่สองบรรทัดแรกให้ตรงกับโมดูลที่ต้องการใช้ครับ

alias snd-card-0 snd-intel8x0
alias sound-slot-0 snd-intel8x0
alias char-major-116 snd
alias char-major-14 soundcore
alias sound-service-0-0 snd-mixer-oss
alias sound-service-0-1 snd-seq-oss
alias sound-service-0-3 snd-pcm-oss
alias sound-service-0-8 snd-seq-oss
alias sound-service-0-12 snd-pcm-oss
install sound-slot-0
  /sbin/modprobe --ignore-install sound-slot-0 &&
  { /bin/aumix-minimal -f /etc/.aumixrc -L >/dev/null 2>&1; /bin/true;  }
remove sound-slot-0
  { /bin/aumix-minimal -f /etc/.aumixrc -S >/dev/null 2>&1; /bin/true; };
  /sbin/modprobe -r --ignore-remove sound-slot-0

NVIDIA Driver ลำบากสักหน่อยครับเพราะติดตั้งกับ 2.6 ตรงๆ ไม่ได้ ต้องแพตช์กันเล็กน้อยก่อนครับ โดยดาวน์โหลดแพตช์สำหรับ NVIDIA Driver ได้ที่ http://www.minion.de ครับ เลือกแพตช์ที่ตรงกับเวอร์ชั่นของไดรเวอร์นะครับ ตัวอย่างของผมคือใช้ไดรเวอร์ NVIDIA-Linux-x86-1.0-5328-pkg1.run ก็จะต้องใช้แพตช์ NVIDIA_kernel-1.0-5328-2.6.diff ขั้นตอนการติดตั้งต้องทำตามนี้ครับ

# sh NVIDIA-Linux-x86-1.0-5328-pkg1.run --extract-only

เพื่อแตกซอร์สที่อยู่ในแพคเกจออก ซอร์สจะแตกไว้ที่ ./NVIDIA-Linux-x86-1.0-5328-pkg1 จากนั้นก็ต้องแพตช์

cd NVIDIA-Linux-x86-1.0-5328-pkg1/usr/src/nv
cat ../../../../NVIDIA_kernel-1.0-5328-2.6.diff | patch -p1
ln -s Makefile.kbuild Makefile
cd ../../../

เสร็จแล้วก็คอมไพล์และติดตั้ง

make SYSSRC=/usr/src/linux-2.6.1-mm2/ install

อย่างที่บอกว่า IDE/ATAPI CD Writer ไม่ต้องจำลอง SCSI กันแล้ว ทำให้ลดภาระงานของเคอร์เนลที่ต้องจำลอง SCSI ลงไปเยอะครับ เท่าที่ทดสอบเขียน CD ที่ 24X ไดรว์ Lite-On 40x12x48 บนเครื่อง Athlon XP 2000+ ใช้ SCSI emulation กินซีพียูไปเกือบๆ 100% ในขณะที่ไม่ใช่ SCSI emulation เหลือราวๆ 5% เท่านั้น เบากว่ากันเยอะเลย แถม disk throughput ก็สูงกว่าด้วย :D

ทีนี้มาดูเรื่องการสั่งงานนิดนึง เพราะเราไม่ได้จำลอง SCSI แล้ว คำสั่งในการเขียนแผ่นด้วย cdrecord กับ ATAPI CD Writer ก็เลยเปลี่ยนไปเล็กน้อยครับ คือไม่ได้ระบุเป็น dev=bus,target,lun แล้ว แต่จะระบุดีไวซ์ตรงๆ เป็น dev=/dev/hdd เลย อย่างจะ simulate การเขียน ISO อิมเมจลงแผ่นก็ประมาณ:

[kitt@yggdrasil kitt]$ cdrecord -v dev=/dev/hdd speed=40 -dao -dummy driverop
ts=burnfree -overburn -data 4.9-i386-mini.iso
Cdrecord-Clone 2.01a19 (i686-redhat-linux-gnu) Copyright (C) 1995-2003 Jฟrg Schi
lling
TOC Type: 1 = CD-ROM
scsidev: '/dev/hdd'
devname: '/dev/hdd'
scsibus: -2 target: -2 lun: -2
Warning: Open by 'devname' is unintentional and not supported.
Linux sg driver version: 3.5.27
Using libscg version 'schily-0.7'
cdrecord: Warning: using inofficial libscg transport code version (schily - Red
Hat-scsi-linux-sg.c-1.75-RH '@(#)scsi-linux-sg.c       1.75 02/10/21 Copyright 1
997 J. Schilling').
Driveropts: 'burnfree'
SCSI buffer size: 64512
atapi: 1
Device type    : Removable CD-ROM
Version        : 0
Response Format: 2
Capabilities   :
Vendor_info    : 'LITE-ON '
Identifikation : 'LTR-40125S      '
Revision       : 'ZS0N'
Device seems to be: Generic mmc CD-RW.
Current: 0x0002
Profile: 0x000A
Profile: 0x0009
Profile: 0x0008
Profile: 0x0002 (current)
Using generic SCSI-3/mmc   CD-R/CD-RW driver (mmc_cdr).
Driver flags   : MMC-3 SWABAUDIO BURNFREE FORCESPEED
Supported modes: TAO PACKET SAO SAO/R96P SAO/R96R RAW/R16 RAW/R96P RAW/R96R
FIFO size      : 4194304 = 4096 KB
Track 01: data   206 MB
Total size:      237 MB (23:30.98) = 105824 sectors
Lout start:      237 MB (23:32/74) = 105824 sectors
Current Secsize: 2048
ATIP info from disk:
  Indicated writing power: 7
  Is not unrestricted
  Is not erasable
  ATIP start of lead in:  -11597 (97:27/28)
  ATIP start of lead out: 359849 (79:59/74)
Disk type:    Short strategy type (Phthalocyanine or similar)
Manuf. index: 20
Manufacturer: Princo Corporation
Blocks total: 359849 Blocks current: 359849 Blocks remaining: 254025
cdrecord: Operation not permitted. WARNING: Cannot set RR-scheduler
cdrecord: Permission denied. WARNING: Cannot set priority using setpriority().
cdrecord: WARNING: This causes a high risk for buffer underruns.
Forcespeed is OFF.
Starting to write CD/DVD at speed 40 in dummy SAO mode for single session.
Last chance to quit, starting dummy write    0 seconds. Operation starts.
Waiting for reader process to fill input buffer ... input buffer ready.
BURN-Free is ON.
Sending CUE sheet...
Writing pregap for track 1 at -150
Starting new track at sector: 0
Track 01:  206 of  206 MB written (fifo 100%) [buf  99%]  27.5x.
Track 01: Total bytes read/written: 216727552/216727552 (105824 sectors).
Writing  time:   77.203s
Average write speed  18.3x.
Min drive buffer fill was 98%
Fixating...
WARNING: Some drives don't like fixation in dummy mode.
Fixating time:    3.531s
BURN-Free was never needed.
cdrecord: fifo had 3414 puts and 3414 gets.
cdrecord: fifo was 0 times empty and 2436 times full, min fill was 85%.
[kitt@yggdrasil kitt]$

ข่าวดีคือ K3B ก็สนับสนุนการสั่งงานแบบนี้แล้ว ถ้าใช้ K3B เป็น frontend ให้ cdrecord อยู่แล้วก็ใช้งานได้ทันทีครับ K3B จะใส่พารามิเตอร์ที่เหมาะสมให้เอง

ส่วน cdrdao ไม่มีการอัพเดตมาเป็นปีแล้ว ดังนั้นตัวต้นฉบับแท้ๆ ยังจำเป็นต้องใช้ SCSI emulation ครับ … แต่ .. ข่าวดีอีกแล้ว .. cdrdao ใช้ไดรเวอร์ของ cdrecord ครับ ก็เลยมีคนแฮ็คเอาไดรเวอร์ตัวใหม่ของ cdrecord ไปใส่ใน cdrdao ผลก็คือได้ cdrdao รุ่นพิเศษที่สนับสนุน ATAPI CD Writer ในทำนองเดียวกับ cdrecord .. อันนี้ผมแฮ็คและทำเป็น rpm ไว้แล้ว (เพราะยังไงผมก็ใช้เองอยู่ดีล่ะ) พารามิเตอร์ในการระบุดีไวซ์สำหรับ cdrdao (hacked) ก็จะประมาณ --device=/dev/hdc ครับ ส่วน --driver ก็ใช้เป็นตัวเดิม เช่นสั่ง cdrdao ให้ simulate การเขียน toc/cue อิมเมจก็จะได้ดังนี้ครับ

[kitt@yggdrasil kitt]$ cdrdao simulate --device /dev/hdd --driver generic-mmc test.toc
Cdrdao version 1.1.7-tle - (C) Andreas Mueller
  SCSI interface library - (C) Joerg Schilling
  Paranoia DAE library - (C) Monty

Check http://cdrdao.sourceforge.net/drives.html#dt for current driver tables.

Warning: This version of libscg has not been configured via the standard
autoconfiguration method of the Schily makefile system. There is a high risk
that the code is not configured correctly and for this reason will not behave
as expected.
Using libscg version 'schily-0.8'

/dev/hdd: LITE-ON LTR-40125S    Rev: ZS0N
Using driver: Generic SCSI-3/MMC - Version 2.0 (options 0x0000)

Starting write simulation at speed 40...
Pausing 10 seconds - hit CTRL-C to abort.
Process can be aborted with QUIT signal (usually CTRL-).
WARNING: No super user permission to setup real time scheduling.
Turning BURN-Proof on
Writing track 01 (mode MODE2_FORM_MIX/MODE2_FORM_MIX )...
Writing track 02 (mode MODE2_FORM_MIX/MODE2_FORM_MIX )...
Writing track 03 (mode MODE2_FORM_MIX/MODE2_FORM_MIX )...
Writing track 04 (mode MODE2_FORM_MIX/MODE2_FORM_MIX )...
Writing track 05 (mode MODE2_FORM_MIX/MODE2_FORM_MIX )...
Writing track 06 (mode MODE2_FORM_MIX/MODE2_FORM_MIX )...
Writing track 07 (mode MODE2_FORM_MIX/MODE2_FORM_MIX )...
Writing track 08 (mode MODE2_FORM_MIX/MODE2_FORM_MIX )...
Writing track 09 (mode MODE2_FORM_MIX/MODE2_FORM_MIX )...
Writing track 10 (mode MODE2_FORM_MIX/MODE2_FORM_MIX )...
Writing track 11 (mode MODE2_FORM_MIX/MODE2_FORM_MIX )...
Writing track 12 (mode MODE2_FORM_MIX/MODE2_FORM_MIX )...
Writing track 13 (mode MODE2_FORM_MIX/MODE2_FORM_MIX )...
Wrote 650 of 650 MB (Buffer 100%).
Wrote 289952 blocks. Buffer fill min 81%/max 100%.
Flushing cache...
Simulation finished successfully.
[kitt@yggdrasil kitt]$

.. นอกจากนี้ผมแฮ็ค K3B ให้สนับสนุนการสั่งงาน cdrdao ให้ใช้กับ ATAPI CD Writer ด้วย .. สรุปว่า ใครที่ใช้เคอร์เนล 2.6 และ ATAPI CD Writer สามารถถอด SCSI emulation ออกแล้วใช้ cdrecord + cdrdao (hacked) + K3B (hacked) ได้เลยครับ ดาวน์โหลด cdrdao (hacked) กับ k3b (hacked) ได้ที่ ftp://ftp.kitty.in.th/pub/TLE/5.5/kitty-tle/RPMS ครับ :)

สำหรับคนที่ไม่ได้ใช้ rpm วิธีแฮ็ค cdrdao ที่ใช้คือ เปลี่ยนไดรเวอร์ scg ของ cdrdao-1.1.7 เป็นของ cdrecord 2.01a2? ครับ วิธีการคือ

  1. untar ซอร์สของ cdrdao-1.1.7 กับ cdrecord-2.01a2?
  2. ลบไดเรคทอรี่ scsilib/libscg ใน cdrdao-1.1.7/ ออก
  3. ก๊อปปี้ไดเรคทอรี่ libscg ของ cdrecord-2.01 มาใส่ใน scsilib/ ของ cdrdao-1.1.7
  4. build ด้วยขั้นตอนปกติครับ

สรุป

เท่าที่ใช้งานเคอร์เนล 2.6 เสถียรดีครับ ผลการทดสอบจากหลายๆ แห่งก็แสดงให้เห็นว่า 2.6 ทำงานได้เร็วกว่า 2.4 เมื่อระบบต้องรับภาระงานหนักๆ เช่น พวกเซิร์ฟเวอร์ที่ต้องรันแอพพลิเคชั่นหลายๆ ตัวพร้อมๆ กัน ตรงนี้เข้าใจว่าเป็นเพราะ scheduler ของ 2.6 มี scalability ดีกว่า 2.4 .. ในแง่การใช้งานเป็นเดสก์ท็อป 2.6 มีฟีเจอร์ preemptible kernel ที่ช่วยให้ระบบตอบสนองต่อการทำงานแบบ interactive หรือ real-time ได้ดีขึ้น มี NPTL ที่ทำให้การทำงานกับเธรดเร็วขึ้น อย่างไรก็ตามเท่าที่ผมและหลายๆ คนเจอคือถ้ารันแอพพลิเคชั่นตัวเดียวเดี่ยวๆ อาจจะพบว่าการทำงานบน 2.6 ช้ากว่า 2.4 ดังนั้นจะสรุปว่า 2.6 ทำงานเร็วกว่า 2.4 ทุกด้านคงไม่ได้ แต่โดยภาพรวมแล้วการทำงาน 2.6 จะตอบสนองได้ดีกว่า การทำงานราบรื่นกว่า 2.4 ครับ

หลายคนอาจจะมีคำถามในใจว่าจะอัพเกรดเป็น 2.6 ดีหรือไม่ ผมว่าอัพเกรดน่ะต้องทำแน่ๆ อยู่แล้ว แต่ว่าเมื่อไหร่แค่นั้นเอง ณ เวลานี้ 2.4 ยังถือว่าใช้งานได้ดี แต่หลังจาก 2.4.24 ที่เพิ่งรีลีสไปไม่นานนี้ และอาจจะไม่มี 2.4 รีลีสอีกแล้ว ผู้ใช้ส่วนใหญ่จึงถูกกระตุ้นให้ย้ายไปใช้ 2.6 โดยปริยาย เน้นว่า ‘กระตุ้น’ นะครับ ไม่ใช่ ‘บังคับ’ เพราะการสนับสนุนเคอร์เนล 2.4 จะยังอยู่อีกนาน (เช่นเดียวกับ 2.2 ซึ่งหยุดพัฒนาไปนานแล้ว แต่ยังมีการสนับสนุนอยู่จนถึงทุกวันนี้)

โดยส่วนตัว ผมย้ายมาใช้ 2.6 อย่างเต็มตัวแล้ว (แต่ยังแอบมี 2.4 มีไว้สำรองไว้เผื่อใช้เปรียบเทียบ) .. เวลานี้บรรดาดิสโตรฯ เริ่มทดสอบ และทำแพคเกจเคอร์เนลใหม่กันมาพักนึงแล้ว อย่าง FC2 ก็ทำ 2.6 ไว้แล้ว SuSE Mandrake ก็ทำไว้แล้วเหมือนกัน ผมว่ารีลีสหน้าของดิสโตรเหล่านี้คงเปลี่ยนมาใช้เคอร์เนล 2.6 กันแน่ๆ … คำถามก็อาจจะกลายเป็นว่า เราจะเริ่มเองวันนี้ ? หรือจะรอใช้ 2.6 ที่มากับดิสโตรในอีกไม่กี่เดือนข้างหน้า ? … ตัดสินใจเอาเองครับ :)

อัพเดตครับ ตะกี้เห็นแวบๆ ที่ http://kernel.org มี 2.4.25-pre6 แล้ว (พร้อมกับ 2.6.1-mm4) .. ถ้า Marcelo ยังยืนยันกำหนดการเดิม 2.4.25 น่าจะรีลีสราวๆ กลางเดือนกุมภาพันธ์ครับ (Updated on Fri Jan 16 2004 22:22)

Fedora Core 1 on Acer TravelMate 361EVi

Recently, I have upgraded Linux on my Acer TravelMate 361Evi to Fedora Core 1. The main reason to upgrade is that FC1 is the basis to develop packages for LinuxTLE 5.5, the next major release of Thai Linux distro that I have contributed my works to.

Kernel

FC1 comes with kernel 2.4.22-1.2115.nptl, which is – like RH’ve done before – a collection of many patches ahead of 2.4.22 backported to 2.4.22. So, their kernel is very unique and sometimes we are not comfortable with that when we recompile our custom kernel :(

First thing you should know that FC1 provides 3 versions of gcc: 3.3.2, 3,2,3 and 2.96. For kernel and kernel modules, you should use gcc 3.2.3. There are reasons for this (try google, or RHN if you want to know about). So. every time you compile kernel or kernel modules, be sure that you export CC=gcc32.

The first kernel issue of FC1 is that the yenta_socket problem is back! I don’t know the reason why it happens again, but this can easily be fixed like before, just disable PCMCIA/Cardbus support in kernel and use the pcmcia-cs package instead. — done! (One thing I’ve noticed is that those yenta_socket problem always comes when I use RH kernel, but not if I use vanilla).

Okay, yenta_socket could be workaround. The next thing is that FC1 will not start ACPI by default, So I have to put “ACPI=on” as a boot parameter. Well, 361EVi does need ACPI. Otherwise, it would not shutdown when asking OS to do so (and I need to push the power button). So, put ACPI=on in /etc/grub.conf. Oh, by the way, if you use lilo, I’d suggest you to upgrade to grub, lilo will be deprecated soon.

So far, that’s all the MUST do things in kernel. The rest are optional but I’d recommend you to look around.

Display

There are things you should do in your kernel to make display works properly. First, VESA Framebuffer won’t work anymore, but they introduced the new Intel Framebuffer (CONFIG_FB_INTEL), which should work better. So I used intelfb, and ignore the vesafb. I can still put VGA=xxx as a boot parameter, though.

For better graphic performance, AGPGART should be enabled (either CONFIG_AGP_INTEL or CONFIG_AGP_I810). DRM should be set to i830 (CONFIG_DRM_I830). I got nearly 600 fps of glxgears with 16-bit depth.

For XFree86, the device section should be something like this:

Section "Device"
        Identifier  "Videocard0"
        Driver      "i810"
        VendorName  "Videocard vendor"
        BoardName   "Intel 830"
EndSection

Sound

You can use sound support from the kernel (CONFIG_SOUND_ICH) if you want to. if you want to use ALSA as I do, here is the way. First, kernel should enable sound support (CONFIG_SOUND) but *DO NOT* select any drivers. Then, grab alsa-driver source, extract, and

./configure --with-cards=intel8x0,virmidi
make
make install

You may also want to change /etc/modules.conf to be:

alias snd-card-0 snd-intel8x0
alias snd-card-1 snd-virmidi
alias sound-slot-0 snd-card-0
alias sound-slot-1 snd-card-1
alias char-major-116 snd
alias char-major-14 soundcore
options snd major=116 cards_limit=2
options snd-intel8x0 index=0
options snd-virmidi index=1
alias sound-service-0-0 snd-mixer-oss
alias sound-service-0-1 snd-seq-oss
alias sound-service-0-3 snd-pcm-oss
alias sound-service-0-8 snd-seq-oss
alias sound-service-0-12 snd-pcm-oss
alias sound-service-1-1 snd-seq-oss
alias sound-service-1-8 snd-seq-oss

PCMCIA

Okay, for FC1, pcmcia-cs driver is needed as I described above.

My /etc/sysconfig/pcmcia is:

PCMCIA=yes
PCIC=i82365
PCIC_OPTS="do_scan=0"
CORE_OPTS=
CARDMGR_OPTS=

If you use vanilla kernel instead, you can just ignore pcmcia-cs package, then use kernel PCMCIA driver, and /etc/sysconfig/pcmcia should be changed to:

PCMCIA=yes
PCIC=yenta_socket
PCIC_OPTS=
CORE_OPTS=

As usual, enabling PCMCIA makes the Orinoco Wireless LAN works immediately because it is hard-wired on 361EVi board.

10/100 Ethernet

This should work by default, but if it does not, or you want to

customize your kernel, be sure to choose either CONFIG_E100 or CONFIG_EEPRO100 (I use EEPRO100 compile in kernel). If you choose to compile as a module, put this into your /etc/modules.conf

alias eth0 eepro100

or

alias eth0 e100

Ports/Combo Drive

All should work.

Power Management

Well, I’d suggest you to use ACPI instead of APM. ACPI seems to be better than APM for 361EVi. FC1’s kernel also supports CPU Frequency Scaling (a.k.a SpeedStep, PowerNow!, those kind of things to switch CPU frequency on-the-fly). I enabled CPU Frequency Scaling to save battery when power is offline. These are things I set in your kernel:

#
# CPU Frequency scaling
#
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_TABLE=y
CONFIG_CPU_FREQ_PROC_INTF=y

#
# CPUFreq governors
#
CONFIG_CPU_FREQ_GOV_USERSPACE=y
CONFIG_CPU_FREQ_24_API=y

#
# CPUFreq processor drivers
#
CONFIG_X86_SPEEDSTEP_ICH=y

Rebuild the kernel, and after reboot the new kernel, I got these in /proc/cpufreq:

         minimum CPU frequency  -  maximum CPU frequency  -  policy
CPU  0       731500 kHz ( 73 %)  -     997500 kHz (100 %)  -  performance

I can set frequency and power policy to save mode by:

echo -n "0:731500:997500:powersave" > /proc/cpufreq

And bring them back to full-speed by:

echo -n "0:731500:997500:performance" > /proc/cpufreq

Use cpufreqd if you want it changes frequency and/or policy automatically.

Fedora Core 1 and NPTL

Fedora Core introduces a new thread library called NPTL (Native POSIX Thread Library). Linux will use this sooner or later. NPTL increases speed of your programs by implementing thread operations natively. This would increase speed of operations like start/stop threads, etc. People have tested the performance of NPTL and it can be 4xx faster than non-NPTL. But, a bad news is that it is not backward compatible to Linux thread, so your programs may crash (segfault, etc..)… Fedora people know this and already put a workaround. By setting LD_ASSUME_KERNEL environment, you can force to disable NPTL support. So, try:

$ LD_ASSUME_KERNEL=2.4.19 /path/to/your/program

if your program fails to operate on FC1.

Well, that should be all for now. Have fun !