วันพฤหัสบดีที่ 31 มีนาคม พ.ศ. 2548

apt repository ของ LTN

ต่อจากตอนที่แล้ว
ในเซิร์ฟเวอร์ของ LTN (Linux dot Thai dot Net) มี repository สำหรับ apt ด้วยและในนั้นมีโปรแกรมหลายตัวที่เกี่ยวกับภาษาไทยและใหม่กว่า repository ของ Debian. รู้สึกว่าคุณอ็อดเป็นคนทำไว้. วิธีเพิ่ม repository เพียงแค่แก้ไฟล์ /etc/apt/sources.list โดยเพิ่มบรรทัดต่อไปนี้
deb http://linux.thai.net/apt/ ./
deb-src http://linux.thai.net/apt/ ./
แล้วรันคำสั่ง apt-get update. ลองสั่ง apt-cache search thai แล้วจะเห็นมีแพ็กเกจไม่เป็นทางการแต่ใช้งานได้ดีมากมายเช่นโปรแกรมดิกชันนารีภาษาไทย, OCR อ่านไทย ฯลฯ.
# apt-cache search thai
...
xiterm+thai - x-terminal program with Thai languague support
kdictthai-data - KDE Application English-Thai dictionary, data part
arnthai - Thai OCR
thai-ttf-js-write - Converted Slackware tgz package
thai-ttf-js - Converted Slackware tgz package
t1-thai-tlwg - Thai fonts in Type1 format
ttf-thai-tlwg - Thai fonts in TrueType format
libthai-dev - LibThai library
libthai0 - LibThai library
kdictthai - An English-Thai dictionary by Thanomsub Noppaburana.
ในนั้นจะมีฟอนต์ทรูไทป์ภาษาไทยจากโครงการ thaifonts-scalable ด้วย. เลือกติดตั้งโปรแกรมที่ต้องการ.
# apt-get -s install thailatex cttex swath ttf-thai-tlwg kdictthai arnthai libthai0 libthai-dev kdictthai-data thai-ttf-js thai-ttf-js-write
แพ็กเกจบางตัวเก่าแล้วเหมือนกัน. ถ้าอยากได้ใหม่จริงต้องไปเอามาติดตั้งเองจาก CVS ครับ.

FireFox ตัดคำภาษาไทย

ใน repository ของ LTN จะมี FireFox ที่ตัดคำภาษาไทยได้อยู่ด้วย. ในไฟล์ sources.list ที่ใช้อยู่มี reposity อยู่สองที่คือ debian กับ LTN และแพ็กเกจ mozilla-firefox ใน Debian จะใหม่กว่า LTN ดังนั้นถ้า apt-get install mozilla-firefox ธรรมดา, apt-get จะเลือกติดตั้งจากไซต์ของ debian หลัก.
# apt-get -s install mozilla-filefox
Reading Package Lists... Done
Building Dependency Tree... Done
Suggested packages:
  mozilla-firefox-gnome-support latex-xft-fonts
The following NEW packages will be installed:
  mozilla-firefox
0 upgraded, 1 newly installed, 0 to remove and 14 not upgraded.
Inst mozilla-firefox (1.0.2-1 Debian:unstable)
Conf mozilla-firefox (1.0.2-1 Debian:unstable)
จะเห็นว่า apt-get เลือกเอาแพ็กเกจจาก Debian:unstable. ลองสั่ง apt-cache ดูข้อมูลของแพ็กเกจดู.
# apt-cache showpkg mozilla-firefox
...
Provides:
1.0.2-1 - www-browser
1.0+dfsg.1-5thai1 - www-browser
1.0-5thai1 - www-browser
Reverse Provides:
จะเห็นว่าจริงๆแล้วมีหลายเวอร์ชัน. ไม่รู้เหมือนกันว่า 1.0+dfsg.1-5thai1 กับ 1.0-5thai1 ต่างกันอย่างไร. เอาเป็นว่าผมจะติดตั้งรุ่น 1.0-5thai1 ก็สั่งคำสั่ง
# apt-get -s install mozilla-firefox=1.0-5thai1
Reading Package Lists... Done
Building Dependency Tree... Done
Suggested packages:
  mozilla-firefox-gnome-support latex-xft-fonts
The following NEW packages will be installed:
  mozilla-firefox
0 upgraded, 1 newly installed, 0 to remove and 14 not upgraded.
Inst mozilla-firefox (1.0-5thai1 linux.thai.net)
Conf mozilla-firefox (1.0-5thai1 linux.thai.net)
จะเห็นว่า mozilla-firefox ตัดนี้จะติดตั้งจาก linux.thai.net. ทดสอบเสร็จแล้วก็ได้เวลาติดตั้งจริง
# apt-get install mozilla-firefox=1.0-5thai1
FireFox ที่ติดตั้งตัดคำภาษาไทยได้แต่ทำไมดูบางหน้าแล้วฟอนต์แสดงอะไรแปลกๆ. ตอนนี้ขอผ่านไปก่อน. เพิ่มเติม: 1.0+dfsg.1-5thai1 แสดงผลหน้าเดียวกันไม่มีปัญหา.

อ่านเพิ่มเติม:

รู้สึกว่าใน repository ของ LTN จะไม่มีไฟล์ Release. ถ้ามีอาจจะทำให้การใช้ง่ายขึ้น (ใช้ค่า PIN ตอน apt-get ได้ ?)

บันทึกการติดตั้ง Debian - package

ต่อจากตอนที่แล้ว
เวลาจะคอมไพล์โปรแกรมเองใน Debian มักจะเจอปัญหาที่ว่าหาเฮดไฟล์ของไลบรารีโน่นนี่ไม่เจอ. อันนี้อาจจะเป็นเพราะผมติดตั้งแพ็กเกจต่างๆเท่าที่จำเป็นเลยต้องเป็นแบบนี้. เช่นเมื่อวานลองคอมไพล์ emacs ที่มีการตัดคำภาษาไทยแล้วบน Debian ดันไม่มีเฮดเดอร์ไฟล์สำหรับพัฒนาโปรแกรมที่เกี่ยวกับ X วินโดว์. คอมไพล์ผ่านแต่ดันรันบนเทอร์มินอลเท่านั้น. แถม emacs เจอข้อผิดพลาด "emacs: Cannot open termcap database file". รู้สึกว่า emacs ใช้ /etc/termcap ซึ่ง Debian ไม่มี (รู้สึกจะใช้ terminfo) แต่พอติดตั้งแพ็กเกจ termcap-compat ก็ใช้ได้.

พอรู้มาว่าแพ็กเกจใน Debian จะแบ่งเป็นแพ็กเกจสำหรับผู้ใช้, นักพัฒนาซอฟต์แวร์ (-dev) และเอกสาร(-doc). เช่นมีแพ็กเกจ fftw ก็อาจจะมีแพ็กเกจ fftw-dev เป็นแพ็กเกจที่มีไฟล์เฮดเดอร์สำหรับพัฒนาอะไรที่เกี่ยวข้องกับแพ็กเกจ abc. ตรงนี้ผมชอบ(หรือชิน)กับ Gentoo มากกว่าที่ว่ามีชื่อแพ็กเกจเดียวแต่ใช้เลือกด้วย USE แฟล็ก (flag). ส่วนใน Gentoo มันต้องคอมไพล์เองอยู่แล้วเวลาติดตั้งแพ็กเกจอะไรก็จะลงเฮดเดอร์ไฟล์อะไรทุกอย่างให้เลย.

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

สรุปแพ็กเกจที่ติดตั้งไว้สำหรับคอมไพล์โปรแกรมเองตอนนี้

  • autoconf, automake
  • x-window-system-dev
  • gnome-core-devel

วันพุธที่ 30 มีนาคม พ.ศ. 2548

ติดตั้งฟอนต์ภาษาไทยใน Debian

ต่อจากตอนที่แล้ว
ว่าด้วยเรื่องติดตั้งฟอนต์ภาษาไทยใน Debian. การติดตั้งฟอนต์มีหลายวิธี, เวลาบอกว่าจะติดตั้งฟอนต์ควรจะนึกถึงเสมอว่าเรากำลังจะติดตั้งฟอนต์ด้วยวิธีไหน, ฟอนต์อะไร (บิตแมปหรือทรูไทป์), ใช้วิธีแบบไหน, จะได้ไม่สับสนครับ. วิธีติดตั้งฟอนต์อาจแบ่งได้เป็น
  • เอาฟอนต์มาติดตั้งเอง
  • ติดตั้งจากแพ็กเกจ
  • ติดตั้งในระบบโดยรวม (system-wide)
  • ติดตั้งใช้เฉพาะบุคคล
ในที่นี้จะพูดถึงการติดตั้งในระบบโดยรวมโดยจากแพ็กเกจด้วย apt ครับ.

เกี่ยวกับระบบจัดการแพ็กเกจ

ระบบจัดการแพ็กเกจพื้นฐานใน Debian ได้แก่ dpkg (Debian package) และระบบจัดการแพ็กเกจชั้นสูงได้แก่ apt (Advanced Package Tool). ระบบ apt สามารถดาว์นโหลดและติดตั้งแพ็กเกจโดยอัตโนมัติผ่านทางอินเทอร์เน็ตโดยอาศัยข้อมูลจากไฟล์ /etc/apt/sources.list. ในไฟล์นั้นจะระบุ URL ของไซต์ที่มีแพ็กเกจของ Debian (.deb). เวลาใช้คำสั่ง apt-get ก็จะไปหาแพ็กเกจที่ต้องการ, ดาว์นโหลดแพ็กเกจที่เกี่ยวข้องและจำเป็น (จัดการเรื่อง dependency ของแพ็กเกจ), ติดตั้งให้โดยอัตโนมัติ. อันนี้เป็นเหตุผลหนึ่งในหลายๆอย่างที่ Debian ได้รับความนิยมอย่างสูง.

ในระบบ Debian จะมีแพ็กเกจที่เกี่ยวกับภาษาไทยที่นำเข้าไปใน Debian โดยคุณชนพอยู่แล้ว. เราสามารถสั่งคำสั่ง apt-get install thai-system เพื่อติดตั้งแพ็กเกจที่เกี่ยวกับภาษาไทยทั้งหมดได้เลย. แต่ในที่นี้จะไม่ทำอย่างนี้เพราะแพ็กเกจที่อยู่ในนั้นบางอันเก่าแล้ว. แผนสำหรับการลงแพ็กเกจที่เกี่ยวกับภาษาไทยที่จะทำเป็นแบบนี้ครับ.

  • ใช้ repository จาก LTN
  • ติดตั้งแพ็กเกจเท่าที่จำเป็นไม่ใช้ thai-system. เลือกแพ็กเกจทั้งจาก repository ของ Debian และ LTN.
  • ปรับแต่งแป้นพิมพ์จาก preference ของ GNOME.

ก่อนอื่นมาดูว่ามีแพ็กเกจอะไรบ้างที่เกี่ยวกับภาษาไทย.

# apt-cache search thai
aterm-ml - Afterstep XVT - a VT102 emulator for the X window system
cttex - Thai word separator for Thai TeTeX/LaTeX and HTML
emacs-intl-fonts - Fonts to allow multi-lingual PostScript printing from Emacs
koffice-i18n-th - Thai (th) translations for KOffice
language-env - simple configuration tool for native language environment
libtext-wrapi18n-perl - internationalized substitute of Text::Wrap
libtextwrap-dev - text-wrapping library with i18n - development files
libtextwrap1 - text-wrapping library with i18n - runtime
mlterm - MultiLingual TERMinal
mlterm-tiny - MultiLingual TERMinal, tiny version
nonlock - Thai (and other) Keyboard swithcher using XKB
nxml-mode - Emacs mode for editing XML documents using RELAX NG schemas
openoffice.org-l10n-th - Thai language package for OpenOffice.org
swath - Thai word segmentation program
thai-system - A meta package for Thai environment under X11
thailatex - Thai Latex package
trang - Multi-format XML schema converter based on RELAX NG
xfonts-efont-unicode - /efont/ Unicode fonts for X which cover various scripts
xfonts-efont-unicode-ib - /efont/ Unicode fonts for X (italic and bold)
xfonts-intl-asian - International fonts for X -- Asian
xfonts-thai - A collection of thai fonts for X
xfonts-thai-etl - Thai etl fonts for X
xfonts-thai-manop - Dr.Manop Wongsaisuwan's bitmap fonts for X
xfonts-thai-nectec - Thai fixed fonts for X from Nectec
xfonts-thai-ttf - Thai TrueType fonts from NECTEC
xfonts-thai-vor - Voradesh Yenbut bitmap fonts for X
xiterm+thai - x-terminal program with Thai languague support
จะเห็นว่ามีแพ็กเกจหลายตัวที่เกี่ยวกับภาษาไทยอยู่แล้ว. บางตัวก็เป็นแพ็กเกจที่เราๆท่านๆใน TLWG สร้างไว้. บางแพ็กเกจก็เป็นแพ็กเกจของโปรแกรมที่สนับสนุนภาษานานาชาติอยู่แล้ว. ในที่นี้จะติดตั้งแพ็กเกจ xfonts-thai ก่อน.

ก่อนอื่นดูว่าถ้าติดตั้งแพ็กเกจ xfonts-thai แล้วจะเกิดอะไรขึ้นโดยใช้ตัวเลือก -s (simulate) กับ apt-get.

# apt-get -s install xfonts-thai
หรือใช้คำสั่ง apt-cache ดูรายละเอียดเกี่ยวกับแพ็กเกจนั้น.
# apt-cache showpkg xfonts-thai
Package: xfonts-thai
Versions:
20040417(/var/lib/apt/lists/ftp.jp.debian.org_debian_dists_unstable_main_binary-i386_Packages)(/var/lib/dpkg/status)

Reverse Depends:
  xiterm+thai,xfonts-thai
  xfonts-thai-vor,xfonts-thai 0.2-1
  xfonts-thai-nectec,xfonts-thai 0.2-1
  xfonts-thai-manop,xfonts-thai 0.2-1
  xfonts-thai-etl,xfonts-thai 0.2-1
  thai-system,xfonts-thai
Dependencies:
20040417 - xfonts-thai-nectec (0 (null)) xfonts-thai-etl (0 (null)) xfonts-thai-manop
 (0 (null)) ttf-freefont (0 (null)) xserver (16 (null)) xfs (0 (null)) 
xfonts-intl-asian (0 (null)) xfonts-thai-vor (0 (null))
Provides:
20040417 -
Reverse Provides:
ก็จะทำให้รู้ว่า xfonts-thai จะติดตั้งแพ็กเกจอื่นๆให้ด้วยเช่น xfonts-thai-nectec, ttf-freefont ฯลฯ.

ติดตั้งฟอนต์บิตแมป

แล้วก็ได้เวลาติดตั้งจริงๆ.
# apt-get install xfonts-thai
ระบบฟอนต์บิตแมปที่ผมใช้อยู่ไม่ได้ใช้ผ่าน X ฟอนต์เซิร์ฟเวอร์, ถ้าจะทำให้ X เซิร์ฟเวอร์รู้จักฟอนต์ที่เพิ่งติดตั้งใหม่ก็สั่งคำสั่ง
$ xset fp rehash
แล้วลองดูว่าเห็นฟอนต์ใหม่ที่ติดตั้งไปแล้วหรือไม่ด้วยคำสั่ง xlsfonts ต่อไป.
$ xlsfonts | grep nectec
สำหรับคนที่ใช้ฟอนต์เซิร์ฟเวอร์ (xfs) ก็รีสตาร์ทเซิร์ฟเวอร์ใหม่เช่น
# /etc/init.d/xfs restart
อยากจะดูว่าฟอนต์มีรูปร่างอย่างไรก็ใช้คำสั่ง xfd ครับ.
$ xfd -fn nectec18

ในแพ็กเกจ xfonts-thai จะติดตั้ง ttf-freefont ให้ด้วย. แพ็กเกจนี้มีชื่อเป็นทางการคือ Free UCS Outline Fonts เป็นฟอนต์แบบทรูไทป์ยูนิโค้ดและมีส่วนที่เป็นภาษาไทยด้วย. ส่วนที่เป็นภาษาไทยจริงๆแล้วคือฟอนต์นรสีห์ (ฟอนต์แห่งชาติ) ที่ Yannis HARALAMBOUS เป็นคนสร้างไว้ครับ. แต่อย่างไรก็ตามเราจะติดตั้งฟอนต์นรสีห์ที่ได้รับการปรับปรุ่งแล้วจาก LTN ครับ. ฟอนต์รุ่นใหม่ได้รับการแก้ไขโดยคุณเทพและคุณชนพ. เอาไว้ต่อคราวหน้าครับ.

ตัวอย่างฟอนต์ FreeSerif ที่มากับ ttf-freefont ครับ. ใช้ได้เลยระดับหนึ่ง.

เปลี่ยนแป้นพิมพ์ Thinkpad R31

ปรกติคอมพิวเตอร์ที่ขายที่ญี่ปุ่นจะมีแป้นพิมพ์ภาษาญี่ปุ่น (ในลินุกซ์จะเรียกว่า jp106). แป้นพิมพืแบบนี้จะมีคีย์เยอะกว่าแป้นพิมพ์ธรรมดาและตำแหน่งคีย์ต่างจากแป้นพิมพ์ภาษาอังกฤษเล็กน้อย. บางครั้งทำให้ยุ่งยากสำหรับคนที่ต้องดูแป้นพิมพ์แล้วพิมพ์ตาม. เมื่อวานซืนสั่งซื้อแป้นพิมพ์ภาษาอังกฤษของ Thinkpad R31 ทางอินเทอร์เน็ตมาเปลี่ยนกับแป้นพิมพ์ภาษาญี่ปุ่นที่ใช้อยู่และเมื่อสักครู่พึ่งมาส่งและจ่ายเงินไปเรียบร้อยแล้ว. สะดวกมาก, ร้านที่ขายอะไหล่อยู่ต่างจังหวัด Aichi ที่จัดงาน Expo อยู่ตอนนี้. ส่วนการส่งสินค้าทำโดย Kuroneko Yamato (แมวดำ) จ่ายกับคนที่มาส่งของ, มีให้แทร็กว่าของอยู่ที่ไหนแล้วทางอินเทอร์เน็ตด้วย.

อ่านจากคู่มือของ IBM แล้วทำตามไม่ยากครับ.

วันอังคารที่ 29 มีนาคม พ.ศ. 2548

ปรับแต่งโลแคลใน Debian

ต่อจากตอนที่แล้ว

โลแคล

ในระบบที่ผมลงเรียบร้อยแล้วไม่มีโลแคลภาษาไทย.
# locale -a
C
POSIX
en_US
en_US.iso88591
ใน Debian จะมีคำสั่ง locale-gen สร้างโลแคลต่างๆตามที่ระบุในไฟล์ /etc/locale.gen. แต่เพื่อความแน่นอนจะใช้คำสั่ง dpkg-reconfigure ในการสร้างโลแคลภาษาไทยแทน (การสร้างโลแคลจริงๆจะใช้คำสั่ง localedef).
# dpkg-reconfigure locales
แล้วจะมีหน้าจอแสดงโลแคลที่ต้องการสร้างสำหรับระบบให้เลือก.

ลองสั่งคำสั่ง locale -a ใหม่ก็จะเห็น th_TH, th_TH.tis620, th_TH.utf8 และ thai ปรากฏครับ. อธิบายหน่อยแล้วกันว่า locale คือข้อมูลตัวแปรที่เกี่ยวกับภาษา. th แสดงถึงภาษาที่ใช้ว่าเป็นภาษาไทย. TH แสดงถึงประเทศที่ใช้ภาษา. ดังนั้น th_TH ก็หมายถึงภาษาไทยที่ใช้ในประเทศไทย, คงไม่มีประเทศอื่นที่ไหนที่ใช้ภาษาไทยอีกหรอก. อย่างภาษาอังกฤษนี่ที่ประเทศอังกฤษก็ใช้ภาษาอังกฤษ, ที่อเมริกาก็ใช้ภาษาอังกฤษ. คือภาษาเดียวกันยังมีความแตกต่างตามประเทศที่ใช้ด้วย. โลแคลภาษาอังกฤษที่ใช้ในสหราชอณาจักรก็จะเป็น en_GB, โลเคลภาษาอังกฤษที่ใช้ในอเมริกาก็จะเป็น en_US.

ข้อมูลส่วนสุดท้ายคือการลงรหัส (encoding) ของภาษา. ในภาษาไทยมีการลงรหัสใหญ่สองแบบคือแบบ 8 บิตกับยูนิโค้ด. แบบ 8 บิตนี่ก็ยังมีสองแบบคือ TIS-620 และ ISO-8859-11. ไม่เคยดูมาตรฐาน ISO-8859-11 เพราะเขาขาย. แต่คิดว่าเหมือนกับ TIS-620 ทุกประการ. ส่วน UTF-8 เป็นการลงรหัสอักขระของยูนิโค้ด. ตัวอย่างเช่นอักขระ "ก" ถ้าการลงรหัสเป็นแบบ TIS-620 หรือ ISO-8859-11 ก็จะมีค่าเป็น 0xA1. ส่วน UTF-8 จะมีค่าเป็น 0xE0 0xB8 0x81 กลายเป็นข้อมูลแบบ 3 ไบต์ไปแต่มีข้อดีที่ว่า ASCII ไม่เปลี่ยนแปลงและลงรหัสได้หลายภาษา.

อยากดูด้วยตัวเองก็ลองสั่งคำสั่ง

$ LANG=th_TH echo -n ก | iconv -f tis620 -t utf8 | LANG=C less
th_TH และ thai เป็นชื่อสั้นๆ (alias) ของ th_TH.TIS-620 ซึ่งเขียนไว้ในไฟล์ /usr/lib/X11/locale/locale.alias หรือ /usr/share/locale/locale.alias.

แล้วโลแคลมันดีตรงไหน? โปรแกรมต่างๆจะรับรู้ตัวแปรสภาพแวดล้อมต่างๆและตัวแปรที่เกี่ยวกับโลแคลได้แก่ LANG, LC_ALL, LC_CTYPE, LC_COLLATE, ฯลฯ. ถ้าโปรแกรมรู้ว่าค่าตัวแปรสภาพแวดล้อมเหล่านี้เป็นภาษาไทยก็จะทำอะไรๆที่เกี่ยวข้องกับภาษาให้เช่น แสดงเมนูเป็นภาษาไทย, แสดงวันที่ปีแบบไทยๆเป็นต้น. อ่าน man locale และ man localedef ต่อเองแล้วกันครับ.

$ export LANG=th_TH
$ date 
พ. 30 มี.ค. 2548 00:58:57 JST
$ cal
     มีนาคม 2005
อา จ. อ. พ. พฤ ศ. ส.
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
$ LANG=C cal
     March 2005
Su Mo Tu We Th Fr Sa
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
โลแคลพิเศษได้แก่ C กับ POSIX, มีความหมายนัยๆคือภาษาอังกฤษใช้กับคอมพิวเตอร์. เอาเท่านี้ก่อนแล้วกัน.

หมายเหตุ:
แก้คำว่า "โลเคล" ให้เป็น "โลแคล" ตามคำแนะนำของคุณเทพ.

บันทึกการติดตั้ง Debian ตอนที่ 2

ตอนที่แล้ว

ปรับแต่งแป้นพิมพ์ของคอนโซล

ปรกติจะสลับตำแหน่งคีย์ Control กับ Caps lock เวลาใช้คอนโซลก็อยากจะทำแบบนี้ด้วย.
# cp -f /usr/share/keymaps/i386/qwerty/emacs.kmap.gz /etc/console/boottime.kmap.gz
คือเปลี่ยนไฟล์ boottime.kmap.gz ให้เป็นไฟล์คีย์แมปที่สลับตำแหน่ง Control กับ Caps lock (emacs.kmap.gz).

ติดตั้งระบบ X วินโดว์

ต่อไปเป็นการติดตั้งระบบ X วินโดว์และสภาพแวดล้อมเดสก์ท็อป gnome กับ kde.
# apt-get install x-window-system gnome kde
ถ้า debconf ไม่ถามคำถามอะไรก็ต้องปรับแต่ง X เซิร์ฟเวอร์เอง. หรือจะให้ debconf ปรับแต่งสร้างไฟล์ XF86config-4 ให้ก็ใช้คำสั่ง dpkg-reconfigure xserver-xfree86 (ใน sid ยังเป็น Xfree86 อยู่ไม่ใช่ xorg).

วิธีการสร้างไฟล์ XF86config เองทำได้โดยสั่งคำสั่ง X -configure แล้วจะได้ไฟล์ XF86Config.new. ไฟล์นี้เป็นไฟล์ที่สร้างให้จากการตรวจสอบฮาร์ดแวร์โดยอัตโนมัติซึ่งอาจจะใช้ไม่ได้, มีข้อผิดพลาด. หรือใช้ได้แต่สีไม่ถูกต้อง, เมาส์ไม่ถูกต้อง. ตรงนี้ต้องดูข้อผิดพลาดที่เขียนอยู่ในล็อกไฟล์ /var/log/XFree86.0.log ตามแล้วแก้ไขให้ถูกต้อง. วิธีทดสอบไฟล์นี้คือคำสั่ง X -xf86config /root/XF86Config.new. ถ้าไม่มีปัญหาอะไรก็ก็อปปี้เป็นไฟล์ /etc/X11/XF86Config-4 สำหรับใช้ในระบบโดยรวมต่อไป.

ตามที่เจอมา, ไฟล์ XF86Config.new มักมีปัญหาตรงที่ไฟล์ดีไวซ์ของเมาส์ไม่ถูกต้องเช่นตัวโปรแกรมรับรู้ดีไวซ์เป็น /dev/mouse แต่จริงๆแล้วไม่มีไฟล์ /dev/mouse ต้องแก้ให้ถูกต้องเช่น /dev/psaux (เมาส์แบบ ps2). อีกอย่างคือเรื่องความลึกของสีโดยปริยายอาจจะมีค่าต่ำไปแสดงจำนวนสีได้น้อย. อันนี้ผมมักจะเพิ่มบรรทัด

DefaultDepth 24
ในไฟล์ XF86Config ในช่วง "Screen" เพื่อแก้ไขปัญหานี้.

ติดตั้ง gdm

แปลกใจเหมือนกันที่ gdm ไม่ได้อยู่ใน gnome ต้องติดตั้งต่างหาก.
# apt-get install gdm
ถ้า debconf ไม่ถามคำถามคำถาม, ระบบจะไม่ใช้ gdm เป็น display manager โดยปริยาย. ให้รันคำสั่ง
# dpkg-reconfigure gdm
เพื่อตั้ง display manager ปริยายให้เป็น gdm แทน xdm ซึ่งดูจืดชืดมาก. ครั้งต่อไปที่บูตเครื่องก็จะเป็น gdm แทน xdm.

Debian ตั้งค่าสำหรับ gdm ไว้ไม่ให้ root ล็อกอินจาก console. เพื่อที่จะแก้ปัญหานี้, ล็อกอินเป็นผู้ใช้ธรรมดาก่อนแล้วสั่งคำสั่ง

$ xhost +
$ su - -c "DISPLAY=:0 gdmconfig"
แล้วปรับแต่งให้ root ล็อกอินได้, ใช้ graphical greeter, เลือกธีมที่สวยๆ.
หมายเหตุ: ปรับแต่ง gdm ได้จากหน้าจอตอนที่ล็อกอินได้โดยเลือกจากเมนู action ครับ (ดูที่คอมเมนต์)

ธีมของ gnome ที่ติดตั้งไว้ตอนแรกไม่ค่อยสวยเท่าไหร่เลยติดตั้งเพิ่มจากแพ็กเกจ gdm-themes ครับ.

# apt-get install gdm-themes

บันทึกการติดตั้ง Debian

ปรกติถ้าอยู่ที่บ้านจะใช้เดสก์ท็อปที่ติดตั้ง Gentoo แต่มีโน้ตบุ๊ค Thinkpad R31 ซึ่งไม่ค่อยได้ใช้เท่าไหร่เลยคิดว่าเอามาลง Debian ดีกว่า.

Debian installer

ตั้งใจไว้ว่าจะลง Debian จากผ่านทางเน็ตเวิร์กแบบติดตั้งแพ็กเกจต่างๆเท่าที่จำเป็นแล้ว apt-get เอาเองทีหลัง, ในระบบจะได้ไม่มีขยะที่ไม่ต้องการหรือไม่ได้ใช้. เลยไปดาว์นโหลด Debian installer ซึ่งเป็นตัวติดตั้ง Debian สำหรับ Sarge (testing) ใช้ง่ายมาก. ดูเหมือนกับว่า Ubuntu ก็ใช้ตัวติดตั้งตัวเดียวกันแต่เอาไปปรับแต่ง. ตัวที่ดาว์นโหลดมาคือ netinst CD image เป็นไฟล์ iso เล็กๆ. หลังจากดาว์นโหลดมาแล้วก็ย่าง CD ในเครื่องเดสก์ท็อป Gentoo ด้วยโปรแกรม k3b. โปรแกรมนี้สะดวกมากจนเลิกใช้บรรทัดคำสั่ง cdrecord ไปแล้ว.

การติดตั้งตอนแรกจะติดตั้งระบบพื้นฐานจาก CD แล้วรีบูตหนึ่งครั้ง. หลังจากที่รีบูตแล้ว, ตัวติดตั้งจะติดตั้งแพ็กเกจต่างๆจากอินเทอร์เน็ตโดยใช้ไซต์ที่เลือกไว้. ตอนตัวติดตั้งมีให้เลือก Desktop environment, Mail server อะไรพวกนั้น, ไม่เลือกอะไรเลย แล้วให้อินสตอลล์จนจบ. ที่ไม่เลือกอะไรเลยเพราะเราจะเปลี่ยนเป็น Sid ภายหลังและไม่ต้องการตอบคำถามตอนติดตั้ง.

เปลี่ยนไปเป็น Sid

ติดตั้งเสร็จทุกอย่างแล้วก็ล็อกอินเข้าสู่ระบบ. ตอนนี้จะเป็นเท็กซ์โหมดไม่มีอะไรหวือหวา. สิ่งต่อไปที่จะทำคือแก้ไฟล์ /etc/apt/sources.list เพื่อเปลี่ยนจาก Sarge เป็น Sid. แก้บรรทัด
deb http://ftp.jp.debian.org/debian/ testing main
deb-src http://ftp.jp.debian.org/debian/ testing main
ให้เป็น
deb http://ftp.jp.debian.org/debian/ unstable main non-free contrib
deb-src http://ftp.jp.debian.org/debian/ unstable main non-free contrib
Debian ไม่เติม non-free กับ contrib ให้แล้ว. อันนี้คงต้องเติมด้วยตัวเอง.

หลังจากนั้นสั่งคำสั่งต่อไปนี้เพื่อเปลี่ยนระบบจาก Sarge เป็น Sid.

# apt-get update
# apt-get dist-upgrade 
เวลาติดตั้งแพ็กเกจต่างๆจะมีการถามคำถาม, ก็ให้ตอบไปตามเนื้อผ้าหรือกด Enter ไปเรื่อยๆก็ไม่น่าจะเป็นไร (ถ้าไม่รู้ว่าสิ่งที่ถามคืออะไร).

เพิ่มเติม: ตามที่คุณ itga แนะมาว่าควรเป็น dist-upgrade แทนที่จะเป็น upgrade อย่างเดียว. ขอบคุณครับ.

ตอนรัน apt-get dist-upgrade จะมีถามถึง debconf ด้วย. ตรงนี้สามารถเลือกให้ตัวติดตั้งถามคำถามน้อยๆในกรณีที่ขี้เกียจโต้ตอบให้เลือก critical ครับ.

วันอาทิตย์ที่ 27 มีนาคม พ.ศ. 2548

e-book ของมหาวิทยาลัยรามคำแหง

บ้านผมอยู่หลังมหาวิทยาลัยรามคำแหง. วันนี้ต้องการตรวจสอบดูที่ว่าว่ารามคำแหงเขียนเป็นภาษาอังกฤษว่าอย่างไรจึงลองเปิดหาตามเว็บไซด์ดูเลยไปเจอ e-book ของมหาวิทยาลัยรามคำแหง. มีหนังสือเรียนทั้งหมดของมหาวิทยาลัยให้อ่านและดาว์นโหลดได้ฟรีๆ. แฟร์และมีประโยชน์ดีครับ. เปิดดูหนังสือเรียนเกี่ยวกับคอมพิวเตอร์แล้วก็ตามไปดูหนังสือเกี่ยวกับการใช้ภาษาไทย. ถ้าจะทบทวนเรียนภาษาไทยใหม่จะมาอ่านที่นี่วันหลังครับ.

วันศุกร์ที่ 25 มีนาคม พ.ศ. 2548

ssh-agent และ ssh-add

ต่อจากเรื่องการใช้ public key และ private key กับ ssh ที่เคยเขียนไปแล้ว. วิธีหนึ่งสำหรับการล็อกอินโดยที่ไม่ต้องใส่พาสเฟรส (passpharse) เองคือการสร้าง public key และ private key โดยมีพาสเฟรสว่างเปล่า. ถ้าไม่อยากให้พาสเฟรสว่างเปล่าและไม่อยากใส่กรอกพาสเฟรสเองเวลาล็อกอินผ่าน ssh ต้องใช้ ssh-agent ช่วย.

ssh-agent เป็นโปรแกรมที่รันช่วงต้นๆของ X เซสชันสำหรับเก็บ private key ไว้ใช้ authenticate เวลาล็อกอินแบบใช้ public key ไปหาเครื่องอื่น. ถ้าลองดูโปรเซสด้วย pstree จะเห็นแบบนี้ครับ.

$ pstree
...
     |-gdm---gdm-+-X
     |           `-sh-+-sh---xscreensaver
     |                |-ssh-agent
     |                `-xfce4-session
...
ในกรณีนี้ผมใช้ gdm เป็นตัวล็อกอินแบบกราฟิกแล้วมันจะรัน ssh-agent ให้อยู่แล้วโดยอัตโนมัติ. ถ้าดูจากไฟล์ปรับแต่งที่เกี่ยวข้องกับ gdm จะเห็นเป็นแบบนี้.
$ cat /etc/X11/gdm/Xsession
# add ssh-agent if found
sshagent="`which ssh-agent 2>/dev/null`"
if [ -n "$sshagent" ] && [ -x "$sshagent" ] && [ -z "$SSH_AUTH_SOCK" ]; then
    command="$sshagent -- $command"
elif [ -z "$sshagent" ] ; then
    echo "$0: ssh-agent not found!"
fi
คือมีการสำรวจว่ามี ssh-agent หรือไม่. ถ้ามีก็รันโปรแกรม ssh-agent ให้โดยอัตโนมัติ.

โปรแกรม ssh-agent เป็นเอเจนต์เก็บ private key ซึ่งผู้ใช้ต้องใส่ private key (ตัวโปรแกรมจะถามพาสเฟรส) ให้กับ ssh-agent ด้วยคำสั่ง ssh-add.

$ ssh-add 
Enter passphrase for /home/poonlap/.ssh/id_dsa:
Identity added: /home/poonlap/.ssh/id_dsa (/home/poonlap/.ssh/id_dsa)
ตัวเอเจนต์จะจำพาสเฟรสในช่วงเวลาที่จำกัด. ถ้ามีการล็อกอินหาเครื่องอื่นๆผ่าน ssh และใช้ public key, ssh-agent จะทำหน้าที่จัดการเกี่ยวกับการ authentication. ผู้ใช้ไม่ต้องใส่พาสเฟรสเองอีกถ้า ssh-agent ยังจำพาสเฟรสได้อยู่.

วันพฤหัสบดีที่ 24 มีนาคม พ.ศ. 2548

จบงาน

หลังจากที่ทำงานที่ United Nations University มา 3 ปี วันนี้เป็นวันสุดท้ายที่ทำงาน. ขอบคุณพี่ฮุ้ยที่แนะนำงานนี้ครับ. ไม่เช่นนั้นคงกลับเมืองไทยไปเมื่อ 3 ปีที่แล้วแล้ว.

วันพฤหัสบดีที่ 17 มีนาคม พ.ศ. 2548

emacs สำหรับคนขี้เหงา

เมื่อสักครู่ดูข่าวทางทีวีมีการแนะนำหุ่นยนต์ที่พูดโต้ตอบกับคนได้ใช้ในงาน Expo 2005 AICHI, Japan. เวลาพูดถึงหุ่นยนต์เราอาจจะนึกไปถึงหุ่นยนต์ที่เป็นโครงเหล็ก. แต่หุ่นที่ข่าวนำเสนอนั้นมีการสร้างผิวหนัง, หน้าตา, ผม ฯลฯ ให้เหมือนคน, เวลาพูดโต้ตอบกับคนจะได้ดูเป็นคนมากกว่าหุ่นยนต์. มีการพูดโต้ตอบระหว่างโฆษกกับหุ่นยนต์แบบว่า,

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

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

เคยมีอะไรลักษณะนี้เหมือนกันเมื่อหลายปีก่อนคือ Alice (A.L.I.C.E. : Artificial Linguistic Internet Computer Entity). ตอนนี้เป็น flash รูปคนให้พูดคุยผ่านทางเว็บ chat ได้ครับ. ลองไปคุยกับเธอดูสิ.

ใช้ msn message บนลินุกซ์ด้วย web messager

วันนี้จะอินสตอลล์ MSN messenger บนเครื่องวินโดวส์เลยไปเว็บ MSN เพื่อดาว์นโหลดเลยได้รู้ว่าเดี๋ยวนี้เขามี Web messenger แล้วคือใช้ MSN messenger ผ่านเว็บเบราเซอร์ซึ่งจะเป็น FireFox บนลินุกซ์หรือที่ไหนก็ได้.

โดยปรกติถ้าจะใช้ MSN messenger บนลินุกซ์ก็จะไปหา kopete, amsn ฯลฯ มาติดตั้ง. แต่ตอนนี้ไม่ต้องทำอะไรแล้ว. ใช้ FireFox ซึ่งสนับสนุนหลายภาษาไปที่เว็บของ Web messenger ล็อกออนหนึ่งทีแล้วจะเป็นหน้าต่างใหม่เหมือนกับ messenger ธรรมดา (ถ้าไม่ใช้ไมค์, ไม่ใช้กล้อง). ใช้ภาษาไทย, ภาษาญี่ปุ่นได้ไม่มีปัญหา. chat กันหลายๆคนก็ได้, ดีมากครับ.

เห็นข่าวมีคนบอกว่า google จะทำบริการโน่นนี่คลอบคลุมทุกอย่างแบบ thin-client, ทำอะไรก็ได้ด้วยเบราเซอร์ไม่ต้องการระบบปฏิบัติการที่เจาะจงอีกต่อไป. ตอนนี้ google ก็มีบริการหลายอย่างแล้วที่มีอิทธิพลไม่น้อยเช่น toolbar, desktop serach, gmail ฯลฯ คงจะจริงอย่างที่เขาลือกันครับ.

วันพุธที่ 16 มีนาคม พ.ศ. 2548

กู้เว็บบอร์ดคืน

หลังจากที่โดนแคร็กเว็บบอร์ด phpbb เมื่อวันอาทิตย์ที่ผ่านมา, ตอนนี้สร้างใหม่เสร็จแล้ว. คนแคร็กคาดว่าไม่ใช่คนไทย.

จริงๆแล้วสร้างใหม่ก็ไม่ได้ยากอะไรมากใช้ phpbb กับ Mail 2 Forum สำหรับเชื่อมต่อ mailing list กับนิวส์กรุปเข้าด้วยกัน. ข้อความเก่าๆทั้งหลายเอาเข้ามาใหม่โดยเขียน perl สคริปต์ดูดข้อความทั้งหมดจาก thaigate มาใส่ใหม่ครับ. ว่าไปแล้วผมก็ไม่ค่อยได้ใช้เว็บบอร์ดเท่าไหร่เพราะไปใช้นิวส์กรุปแทนด้วยความเคยชินกับรูปแบบเมล. แต่ชอบเว็บบอร์ดตรงที่มันเก็บเป็น archive แล้วหาอะไรได้ดีพอควร.

เลยได้ย้อนอดีตดูข้อความเก่าๆตั้งแต่ 1999. นี่มันก็ 6 ปีแล้วที่มี TLWG. ข้อความแรกที่ส่งรู้สึกจะเป็นอันนี้. คนที่อยู่มาตั้งแต่ต้นก็มีไม่น้อย, คนที่หายไปก็ไม่มาก (คงอยู่ไม่ไกล). ว่าไปแล้วยังไม่เคยเจอคนในนี้หลายคน.

อันนี้เคยเอามาให้ดูกันแล้ว, เป็นรวมเว็บของ LTN เก่าๆจาก Internet Archive ครับ.

วันอังคารที่ 15 มีนาคม พ.ศ. 2548

ping และ arping

คำสั่ง ping เป็นคำสั่งพื้นฐานใช้ส่งแพ็กเก็ต ICMP ECHO REQUEST ให้เครื่องคอมฯที่ต่อเน็ตเวิร์กทั้งในวงแลนเดียวกันหรืออินเทอร์เน็ตตอบรับ. คอมพิวเตอร์ที่ได้รับ ICMP ECHO REQUEST ก็จะตอบรับด้วยการส่ง ICMP ECHO REPLY ตอบกลับไป. เดี๋ยวนี้คอมพิวเตอร์บางเครื่องไม่ยอมตอบรับคำสั่ง ping แล้วเพราะพวกไวรัสบางตัวก็ใช้ ICMP หาเหยื่อโจมตีเหมือนกับคำสั่ง ping ใช้ตรวจสอบว่าเครื่องคอมฯต่อเน็ตเวิร์กอยู่หรือไม่.

สำหรับเครื่องลินุกซ์, ถ้าต้องการจะไม่ตอบ ICMP ECHO REQUEST ก็แก้ค่าไฟล์ icmp_echo_ignore_all ให้เป็น 1 คือเพิกเฉย.

# ping localhost # ping เครื่องตัวเอง
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.042 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.035 ms
 
--- localhost ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.035/0.038/0.042/0.007 ms
# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
# ping localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
 
--- localhost ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 2999ms (เงียบสนิท)

ถ้ามีคอมฯที่อยู่ในวงแลนเดียวกันและไม่ตอบรับการ ping แต่เราอยากจะตรวจสอบว่าเครื่องคอมฯนั้นต่อเน็ตเวิร์กอยู่ดีหรือไม่ก็ใช้คำสั่ง arping แทน. arping ชื่อก็บอกอยู่แล้วว่าใช้ arp โพรโตคอลเป็นโพรโตคอลในระดับ ethernet คือสามารถใช้ได้ในวงแลนเท่านั้น, ข้ามแลนไม่ได้.

# ping 10.0.0.196
PING 10.0.0.196 (10.0.0.196) 56(84) bytes of data.
 
--- 10.0.0.196 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 1999ms
# arping -I eth1 10.0.0.196
ARPING 10.0.0.196 from 10.0.0.1 eth1
Unicast reply from 10.0.0.196 [00:0C:29:A9:05:07]  0.895ms
Unicast reply from 10.0.0.196 [00:0C:29:A9:05:07]  0.639ms
Sent 2 probes (1 broadcast(s))
Received 2 response(s)
จากตัวอย่าง, ตอนแรก ping 10.0.0.196 แต่ไม่มีการตอบรับ. เปลี่ยนไปใช้ arping แล้วมีการตอบรับแสดงว่าเครื่อง 10.0.0.196 ไม่ยอมตอบรับ ping (ICMP) แต่หลังจากที่ใช้ arping แล้วรู้ว่าเครื่องนั้นยังต่อกับเน็ตเวิร์กทำงานเป็นปรกติอยู่แถมยังบอก MAC address ให้ด้วย. ตัวเลือก -I ใช้เลือกอินเทอร์เฟสในกรณีที่มีแลนการ์ดมากกว่าหนึ่งใบ. ถ้าไม่ระบุจะส่ง arping ออกทางแลนการ์ดใบแรก.

วันศุกร์ที่ 11 มีนาคม พ.ศ. 2548

ฟอร์แมต FAT32 ที่เกิน 32GB

เมื่อวานเพิ่งสังเกตเห็นว่าในวินโดวส์ XP ไม่สามารถฟอร์แมตฮาร์ดดิสก์ที่มีขนาดมากกว่า 32GB ให้เป็นแบบ FAT32.

ตามปรกติ, วินโดวส์ XP จะบังคับให้ฟอร์แมตพาร์ทิชันหรือฮาร์ดดิสก์ที่มีขนาดใหญ่มากๆให้เป็นแบบ NTFS โดยปริยาย. ปัญหาคือผมมีฮาร์ดดิสก์ที่ต่อด้วย USB แบบพกพาได้ขนาด 80 GB. แบ่งพาร์ทิชันส่วนหนึ่งไว้สำหรับใช้กับวินโดวส์, เลยวางแผนว่าจะใช้ระบบไฟล์แบบ vfat (fat32) เพื่อให้ใช้ได้ทั้งจากลินุกซ์และวินโดวส์. เนื่องจากฟอร์แมตด้วยวินโดวส์ XP ให้เป็นแบบ FAT32 ไม่ได้เลยต้องมาฟอร์แมตบนลินุกซ์. แปลกดีเหมือนกัน.

ฮาร์ดดิสก์พวก USB เช่น USB flash memory, ฮาร์ดดิสก์พกพาพวกนี้จะเห็นเป็นฮาร์ดดิสก์แบบ SCSI. หลังจากต่อสายเคเบิลเข้ากับเครื่องคอมฯแล้วใช้ dmesg ดูว่าเคอร์เนลรับรู้ชื่อดีไวซ์ว่าเป็นอะไรก็ได้. หรือจะใช้คำสั่ง fdisk -l แสดงพวกบล็อกดีไวซ์ที่เคอร์เนลรับรู้.

# fdisk -l

Disk /dev/hda: 40.0 GB, 40007761920 bytes
255 heads, 63 sectors/track, 4864 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1        2433    19543041   83  Linux
/dev/hda2            2434        4805    19053090   83  Linux
/dev/hda3            4806        4864      473917+  82  Linux swap

Disk /dev/sda: 80.0 GB, 80026361344 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        2433    19543041   83  Linux
/dev/sda2            2434        4866    19543072+  83  Linux
/dev/sda3            4867        4929      506047+  82  Linux swap
/dev/sda4            4930        9729    38556000    c  W95 FAT32 (LBA)
ในตัวอย่างให้พาร์ทิชันที่ 4 (/dev/sda4) เป็น FAT32. ตอนแรกสั่งคำสั่ง fdisk /dev/sda เพื่อสร้างพาร์ทิชันก่อนแล้วเลือกประเภทของพาร์ทิชันให้เป็น W95 FAT32 (LBA) เพราะพาร์ทิชันส่วนนี้อยู่ในส่วนที่เกิน 8GB. เสร็จแล้วฟอร์แมตพาร์ทิชันนั้นด้วยคำสั่ง mkdosfs หรือ mkfs.vfat ซึ่งเป็นตัวเดียวกัน.
# mkfs.vfat -F 32 /dev/sda4
ต้องใส่ตัวเลือก -F 32 ด้วยให้ระบบไฟล์ FAT32 ไม่เช่นนั้นตัวโปรแกรมจะเลือกเองเป็น -F 12 หรือไม่ก็ -F 16. เสร็จแล้วก็เอาฮาร์ดดิสก์นั้นไปใช้กับวินโดวส์ได้ตามปรกติ. ถ้าใช้กับลินุกซ์ก็ mount -t vfat ....

วันพุธที่ 9 มีนาคม พ.ศ. 2548

R อีกครั้ง

สุดสัปดาห์ที่ผ่านมามีโอกาสได้ใช้ R อีกครั้งหลังจากที่เคยดูไปทีหนึ่งแล้ว. คราวนี้ใช้แยกคลัสเตอร์ข้อมูลดูรู้สึกว่าใช้ได้ดีทีเดียว. ก็อ่านจาก help ของโปรแกรมนั่นแหละ, หลังจากนั้นจะใช้อย่างไรก็ต้องประยุกต์กันเอง.
$ R
 
R : Copyright 2004, The R Foundation for Statistical Computing
Version 2.0.1  (2004-11-15), ISBN 3-900051-07-0
 
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
 
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
 
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for a HTML browser interface to help.
Type 'q()' to quit R.
 
>
โปรแกรม R เป็นโปรแกรมที่รันในเทอร์มินอล. หลังจากที่เริ่มทำงานแล้วจะแสดงพรอมต์ ">". จะลองใช้ฟังก์ชัน demo() เพื่อดูว่าโปรแกรมทำอะไรได้บ้างหรือง่ายๆเริ่มจากคำสั่ง help() ก่อน, โปรแกรมก็จะแสดงวิธีใช้อย่างง่ายๆ. ข้อมูลทุกอย่างใน R จะถือเป็นวัตถุหมด. และคำสั่งต่างๆต้องเขียนเป็นชื่อฟังก์ชันและมีเครื่องหมายวงเล็บเสมอ. จะมีบางครั้งที่มี shortcut เช่น "? " ใช้แทน help() ในบางครั้ง, เช่นถ้าจะดูว่าฟังก์ชัน c() ใช้อย่างไรก็พิมพ์ "?c" หรือ "help(c)".
> help(c) หรือ ?c
c                    package:base                    R Documentation
 
Combine Values into a Vector or List
 
Description:
 
     This is a generic function which combines its arguments.
 
     The default method combines its arguments to form a vector. All
     arguments are coerced to a common type which is the type of the
     returned value.
 
Usage:
 
     c(..., recursive=FALSE)
 
Arguments:
 
     ...: objects to be concatenated.
 
recursive: logical. If 'recursive=TRUE', the function recursively
          descends through lists combining all their elements into a
          vector.
...
วิธีใช้จะแสดงในเทอร์มินอลโดยมีเพจเจอร์ (less) เป็นตัวดูเอกสาร. ถ้าต้องการเลิดดูวิธีใช้ก็กด "q" เหมือนการจบทำงานคำสั่ง less ธรรมดา.

โปรแกรม R จะประกอบด้วยแพ็กเกจต่างๆ ซึ่งดูชื่อแพ็กเกจที่ใช้ได้ด้วยฟังก์ชัน library().

 library()
Packages in library '/usr/lib/R/library':
 
KernSmooth              Functions for kernel smoothing for Wand &
                        Jones (1995)
MASS                    Main Package of Venables and Ripley's MASS
base                    The R Base Package
boot                    Bootstrap R (S-Plus) Functions (Canty)
class                   Functions for Classification
cluster                 Functions for clustering (by Rousseeuw et al.)
datasets                The R Datasets Package
...
แพ็กเกจหลักที่ใช้โดปริยายคือ base จะประกอบด้วยฟังก์ชันหลักๆเช่น c() สำหรับสร้างเวกเตอร์หรือลิส. ถ้าจะดูวิธีใช้ฟังก์ชันต่างๆของแพ็กเกจทำได้โดยใช้ฟังก์ชัน "help(package=base)" แสดงฟังก์ชันต่างๆที่แพ็กเกจนั้นเตรียมไว้ให้. แล้ว help(ชื่อฟังก์ชัน) ต่อไปเพื่อดูรายละเอียด.

ฟังก์ชันพื้นฐาน

ฟังก์ชัน c() ใช้สร้างเวกเตอร์หรือลิส เช่น
> vector <- c( 1,2,3)
> vector # แสดงผลให้ผลเหมือนกับสั่ง print(vector)
[1] 1 2 3
เครื่องหมาย <- เป็นการใส่ค่าในตัวแปร.

ฟังก์ชัน rnorm() ใช้สร้างค่าสุ่ม. c(1,2,3) เป็นการสร้างเวกเตอร์ที่มีส่วนประกอบ 3 มิติ.

> rnorm(1) # สร้างค่าหนึ่งตัว
[1] 2.219303
> rnorm(3) # สร้างเวกเตอร์ 3 มิติ
[1]  0.2022113 -0.0971564 -0.1806501
>  rnorm(14,5,10) # ค่าสุ่ม 10 ตัวจากการแจกแจงปรกติ, ค่าเฉลี่ย 5, deviation 10 
 [1] -5.551333  2.232259 10.228116 27.379501 -5.934521 -8.813059 16.202268
 [8] 28.996456  8.039484  7.082158 -2.669995  7.669075 -1.374807 

ฟังก์ชัน cbind() เป็นการเอาคอลัมน์มารวมกัน

> matrix <- cbind( rnorm(3), rnorm(3), rnorm(3))
> matrix
          [,1]      [,2]       [,3]
[1,] 0.4116171 1.3162124 -0.2775072
[2,] 0.2220816 0.6748176 -0.3219150
[3,] 1.1188849 0.6240293  0.1840312
จากตัวอย่าง rnorm(3) ตัวแรกจะให้ค่า 0.4116171, 0.2220816, 1.1188849, rnorm(3) ตัวที่สองให้ค่า 1.3162124, 0.6748176, 0.6240293. cbind() เอาค่าเหล่านั้นมารวมกันในแนวของการรวมคอลัมน์.

คำสั่ง det() ไว้หา determinant ของเมตริกซ์.

det(matrix)
[1] -0.2229979
คำสั่ง t() ใช้ transpose.
> t(matrix)
           [,1]       [,2]      [,3]
[1,]  0.4116171  0.2220816 1.1188849
[2,]  1.3162124  0.6748176 0.6240293
[3,] -0.2775072 -0.3219150 0.1840312

ฟังก์ชัน rbind() รวมข้อมูลเป็นแถวๆ.

> rbind( c(1,2,3), c(4,5,6))
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
> cbind( c(1,2,3), c(4,5,6)) # เทียบกับ cbind()
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6

ใช้แพ็กเกจ

สมมติว่าจะใช้ฟังก์ชัน fanny (fuzzy clustering) แยกข้อมูลเวกเตอร์เป็นกลุ่มๆโดยอัตโนมัติต้องรู้ก่อนว่า fanny เป็นฟังก์ชันในแพ็กเกจ cluster. ต้องเรียกใช้แพ็กเกจ cluster ก่อนจึงจะใช้ fanny ได้.
> library(cluster) # ใช้แพ็กเกจ cluster
> v <- rbind( c(-10,-3),
+ c(-5,-6),
+ c(-2,-3),
+ c(-2,-2),
+ c(2,3),
+ c(5,2),
+ c(5,6))
> result <- fanny(v,2) # แยกกลุ่มอัตโนมัติ 2 กลุ่ม, เก็บผลลัพธ์ไว้ในตัวแปร result
> result
iterations  objective
 18.000000   9.977334
Membership coefficients:
          [,1]      [,2]
[1,] 0.7799103 0.2200897
[2,] 0.8665722 0.1334278
[3,] 0.8580022 0.1419978
[4,] 0.8213685 0.1786315
[5,] 0.1364783 0.8635217
[6,] 0.1101533 0.8898467
[7,] 0.1219131 0.8780869
Coefficients:
dunn_coeff normalized
 0.7489276  0.4978551
Closest hard clustering:
[1] 1 1 1 1 2 2 2
 
Available components:
[1] "membership" "coeff"      "clustering" "objective"  "diss"
[6] "call"       "silinfo"    "data"
ใช้ฟังก์ชัน plot() วาดกราฟของผลลัพธ์ได้.
> plot(result)
Hit <Return> to see next plot:
Hit <Return> to see next plot:

จากกราฟจะเห็นได้ว่าเวกเตอร์ตัวที่ 1,2,3,4 อยู่ในกลุ่มที่ 1 และ 5,6,7 อยู่ในกลุ่มที่ 2.

โปรแกรม R สามารถเปลี่ยนดีไวซ์ที่ใช้วาดกราฟเป็นอย่างอื่นเช่นไฟล์รูปภาพแบบ raster หรือพวก PostScript ก็ได้. สะดวกที่จะเอาไปใช้ประกอบกับรายงานครับ.

เริ่มสนใจอยากใช้ R หรือยัง? R ยังทำอะไรได้อีกหลายอย่าง, เขียนฟังก์ชัน, วาดกราฟสวยๆ, เก่งคำนวณสถิติ ฯลฯ. แถมมีให้ใช้บนวินโดวส์ด้วย. ถ้าจะเริ่มก็อ่านเอกสารอย่างไม่เป็นทางการที่มีคนเขียนไว้อย่างดีที่นี่ครับหรือเอกสารเป็นทางการของโครงการ.

อันนี้เป็นโปรแกรมที่เรียกว่า "ใช้ได้ดีเลย" อีกตัว. ใช้ซอฟต์แวร์เสรี, มีทางเลือก, ประเทืองปัญญา, พึ่งพาตนเองเป็น. เอาเป็นสโลแกนคำขวัญ TLWG เลยไหม.

วันจันทร์ที่ 7 มีนาคม พ.ศ. 2548

ปรับแต่งเครื่อง Windows XP ให้แขกใช้

วันนี้จะพูดถึงประสบการณ์ปรับแต่ง Windows XP สำหรับแขก (guest) ใช้ครับ. คอมพิวเตอร์สำหรับแขกใช้บางทีต้องปรับแต่งให้มันแตกต่างจากคอมพิวเตอร์ส่วนบุคคลที่ใช้เองเช่น
  • ล็อกออน (logon) ได้เอง. เครื่องที่เข้าร่วมวินโดวส์โดเมนแล้วอันนี้ต้องแก้ registry ให้มันล็อกออนได้เอง (autologon) กดปุ่มเปิดเครื่องแล้วก็ล็อกออนให้อัตโนมัติ. คนที่ใช้ซึ่งไม่ค่อยรู้เรื่องคอมพิวเตอร์ไม่ต้องรู้ว่ารหัสผ่านเป็นอะไร, เปิดเครื่องใช้ได้เลย.
  • ไม่ให้คนใช้ล็อกออฟ (logoff). บางทีแขกที่ใช้มีหลายคน, บางคนไปล็อกออฟแล้วคนอื่นมาใช้ต่อ. แต่คนที่ใช้ไม่รู้รหัสผ่านดังนั้นกันไว้ไม่ใช้ล็อกออฟจะดีที่สุด.
  • ห้าม shutdown. คือกะจะให้เปิดเครื่องแล้วใช้ตลอดไปเลย, ไม่ต้องชัตดาวน์.

ล็อกออนเอง

ตรงนี้เปิด registry editor (regedit.exe) กระจาย registry ไปที่ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon แล้วปรับแต่งค่าคีย์เหล่านี้.
  • DefaultUsername, แก้ไขค่าให้เป็นชื่อผู้ใช้ที่ต้องการให้ล็อกอินโดยอัตโนมัติ
  • DefaultDomain, แก้ชื่อโดเมนของผู้ใช้นั้นให้ถูกต้อง
  • DefaultPassword, คีย์นี้ปรกติจะไม่มีให้ต้องสร้างเอง. ให้สร้างคีย์แบบ String value แล้วค่าของคีย์คือรหัสผ่านของผู้ใช้นั้นๆ.
  • AutoAdminLogon, เปลี่ยนค่าคีย์นี้ให้เป็น 1.
ลองรีบูตแล้วระบบจะล็อกอินให้อัตโนมัติ.

แก้ start menu

การแก้ start menu ไม่ให้ผู้ใช้ล็อกออฟหรือปิดเครื่องต้องใช้ Group Policy editor (gpedit.msc) เรียกใช้จากพรอมต์จะสะดวกที่สุด.

โปรแกรมนี้ทำอะไรหลายอย่างและบางอย่างค่อนข้างอันตรายเช่นกัน. ควรจะอ่านคำอธิบายประกอบดีๆครับ.

ถ้ามีความจำเป็นต้องปรับแต่งเครื่องอะไรแบบนี้ก็ลองดูแล้วกันนะครับ.

วันพฤหัสบดีที่ 3 มีนาคม พ.ศ. 2548

ใช้ public key และ private key กับ ssh

ปรกติเวลาใช้ ssh ล็อกอินจากโฮส A ไปโฮส B, ถ้าไม่มีการปรับแต่งอะไรโฮส B จะถามรหัสผ่าน (password) ที่บันทึกอยู่ในโฮสของตัวเอง. ถ้าจะให้ปลอดภัยกว่านั้นควรจะใช้ public key กับ private key. วิธีนี้ก่อนอื่นต้องสร้าง public key และ private key ก่อนด้วยคำสั่ง ssh-keygen.
[hostA]$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/poonlap/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/poonlap/.ssh/id_dsa.
Your public key has been saved in /home/poonlap/.ssh/id_dsa.pub.
The key fingerprint is:
e6:c6:a9:e0:b0:fb:bc:73:7c:4b:2d:a0:3b:fe:2f:3e poonlap@fishbone
ตัวเลือก -t dsa คือเลือกประเภทของ key. ในกรณีนี้จะใช้คีย์ที่เข้ารหัสแบบ DSA สำหรับโพรโตคอล ssh version 2. คำสั่ง ssh-keygen จะสร้างไฟล์ id_dsa ซึ่งเป็น private key และไฟล์ id_dsa.pub ซึ่งเป็น public key ไว้ในไดเรกทอรี ~/.ssh.

เมื่อได้ private key และ public key แล้วก็ก็อปปี้ไฟล์ public key (id_dsa.pub) ไปไว้ในโฮสที่ต้องการล็อกอินด้วย ssh โดยเปลี่ยนชื่อเป็น ~/.ssh/authorized_keys. ถ้าโฮสปลายทางมีไฟล์ authorized_keys อยู่แล้วก็เพิ่มเนื้อหาของไฟล์ id_dsa.pub ต่อท้ายเข้าไป.

[hostA]$ scp ~/.ssh/id_dsa.pub poonlap@hostB:.ssh/authorized_keys
เสร็จแล้วเวลาใช้ ssh จากเครื่อง hostA ต่อไป hostB จะใช้ passphrase แทน password.
[hostA]$ ssh poonlap@hostB
Enter passphrase for key '/home/poonlap/.ssh/id_dsa':

ต่อ ssh โดยไม่ใส่ passphrase

ในกรณีที่ต้องการล็อกอินด้วย ssh จาก hostA ไป hostB โดยที่ไม่ใส่ passphrase สามารทำได้โดยสร้าง private key และ public key เหมือนปรกติ, แต่ไม่ตั้ง passphrase (ว่างเปล่า). แล้วก็ก็อปปี้เนื้อหาของไฟล์ id_dsa.pub ไปเก็บไว้ในไฟล์ ~/.ssh/authorized_keys ตามปรกติ. เวลาล็อกอินด้วย ssh จาก hostA ไป hostB สามารถเข้าสู่ระบบได้เลยโดยไม่ต้องใส่ passphrase หรือ password.

อันนี้มีข้อดีอีกอย่างคือใช้ scp เหมือนกับ cp ธรรมดาเพราะไม่ต้องใส่ passphrase อะไร.

วันอังคารที่ 1 มีนาคม พ.ศ. 2548

แปลงรูปภาพให้เป็นวิดีโอด้วยคำสั่ง convert

โปรแกรมบรรทัดที่ใช้บ่อยตัวหนึ่งได้แก่ convert ซึ่งเป็นหนึ่งในหลายๆคำสั่งของไลบรารี ImageMagick. คำสั่ง convert เป็นโปรแกรมบรรทัดคำสั่งใช้สำหรับแปลงฟอร์แมตรูปภาพ. เช่นถ้าไฟล์ที่มีอยู่ชื่อ picture.jpg แล้วต้องการแปลงเป็นฟอร์แมตอื่นๆเช่นฟอร์แมต png ก็แค่สั่งคำสั่ง.
$ convert picture.jpg picture.png
ก็จะได้ไฟล์ชื่อ picture.png เป็นฟอร์แมต png. ตรงนี้ดีที่ว่าไม่ต้องเสียเวลาเปิดโปรแกรมแบบ GUI, กดปุ่มโน้นปุ่มนี้ให้เสียเวลา. สั่งเป็นคำสั่งไปเลยเพราะเรารู้อยู่แล้วว่าเราต้องการอะไร.

ถ้าต้องการย่อรูปให้เลือกลงใช้ตัวเลือก -geometry ความกว้าง%xความสูง% เช่น

$ convert -geometry 50%x50% p1010058.jpg scaled.jpg
ก็จะได้ไฟล์รูปภาพแบบ jpg ชื่อ scaled.jpg ที่ย่อแล้ว 50 เปอร์เซ็นต์.

ที่เยี่ยมไปกว่านั้นคือคำสั่ง convert แปลงรูปภาพให้เป็นไฟล์วิดีโอได้ด้วย. สมมติว่ามีรูปที่ถ่ายด้วยกล้องดิจิตอลแล้วต้องการแปลงรูปทั้งหมดเป็นไฟล์วิดีโอฟอร์แมต mpeg แถมย่อให้รูปเล็กๆพอดีๆ, แสดงรูปละ 2 วินาทีก็สามารถทำได้ดังนี้.

$ convert -delay 200 -geometry 20%x20% *jpg test.mpg
Encoding frame 0 ...............
Encoding frame 1 ...............
vbv_delay underflow! (decoding_time=22400.0, t_EOP=32108.1
)vbv_delay underflow: -6110
Encoding frame 2 ...............
vbv_delay underflow! (decoding_time=26000.0, t_EOP=37852.5
)vbv_delay underflow: -8255
Encoding frame 3 ...............
...
ตัวโปรแกรม convert จะใช้ mpeg2enc แปลงให้เป็นไฟล์ mpg. ถ้าไฟล์รูปภาพใหญ่มากก็ควรจะย่อยไฟล์เตรียมไว้ก่อนไม่เช่นนั้นจะใช้เวลานานมากๆ.

ใช้ ffmpeg แปลงเป็นไฟล์วิดีโอฟอร์แมตอื่นได้ถ้าต้องการ.

$ ffmpeg test.mpg test.avi
Output #0, avi, to 'test.avi':
  Stream #0.0: Video: mpeg4, 320x240, 25.00 fps, q=2-31, 200 kb/s
Stream mapping:
  Stream #0.0 -> #0.0
[mpeg4 @ 0x4021bd48]removing common factors from framerate
Press [q] to stop encoding
frame=  429 q=11.1 Lsize=     872kB time=17.2 bitrate= 416.3kbits/s
$ ls -l test*
-rw-r--r--    1 poonlap  users      899938 Mar  1 22:11 test.avi
-rw-r--r--    1 poonlap  users     2582751 Mar  1 22:08 test.mpg
$ file test*
test.avi: RIFF (little-endian) data, AVI, 320 x 240, 25.00 fps, video: DivX 4
test.mpg: MPEG video stream data

ไฟล์ตัวอย่าง

ลิงก์เกี่ยวกับคำสั่ง ImageMagick