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

การทำ Wallpaper บน HP-UX workstation

ก่อนอื่นที่ต้องมีคือ รูปที่จะนำมาทำเป็น wallpaperรูปนี้จำกัดว่าจะต้องเป็น format XPM เท่านั้น

วิธีการสร้างสามารถดูได้จาก Blog ก่อนหน้านี้(จริงๆก็ไม่ยากอะไรอยู่แล้ว แค่ใช้ The GIMP ก็พอ - ปัญหาก็คือ The GIMP มันอยู่ใน Linux เนี่ยสิ)

เมื่อสร้างเสร็จแล้ว รูปจะมีนามสกุล .XPM ก็ให้เปลี่ยนมันเป็น .PM

หลังจากได้ file รูปภาพ .XPM หรือ .PM ขนาดไฟล์ไม่ควรใหญ่เกิน 1 MB ขึ้นไป เพราะเวลาที่จะโหลดรูปขึ้นมาแสดงมันจะค้างนานจนนึกว่าแฮงก์ไปแล้วซะอีก

ย้ายรูปไปวางไว้ที่ $HOME/.dt/backdropsถ้าไม่มี folder backdrops ก็ให้สร้างใหม่ขึ้นมาเลย
$HOME ก็คือ Home Directory ของเรา เช่น /home/user
สามารถตรวจสอบง่ายๆ โดยพิมพ์ echo $HOME ที่ Terminal

จากนั้นคลิกที่ Style Manager เลือก Backdrop
คลิกเลือกชื่อของไฟล์รูปภาพนั้น
แล้วคลิกโอเค
ขั้นตอนหลังนี้ถ้าคลิกแล้วไม่เจอรูปหรือเจอแล้วแต่ไม่แสดงเป็น Wallpaper
ให้แก้ไขง่ายๆด้วยการ restart workspace หรือ logout แล้ว login กลับเข้ามาใหม่

จบอย่างเร็ว รูปประกอบจะเอามาวันหลัง (ฝากไว้ก่อน)

วันพุธที่ 26 มีนาคม พ.ศ. 2551

sed - stream editor (5)

อือม หายไปนานเลยเรา เกือบเดือนเลยนะนี่

กลับมาต่อเรื่อง SED กันดีกว่า กับตอนที่ 5 ของเรา

มาต่อกันอีกเล็กน้อยกับ SED ในเรื่องของ substitute command (s///)
ซึ่งในคราวนี้เราจะมาต่อในเรื่องของ flag ที่จะนำมาใช้ใน command ซึ่งที่ใช้บ่อยๆก็คือ g หรือ global

วิธีใช้ก็คือ เวลาที่เราจะใช้ flag เราจะวางมันลงไปหลัง command เสมอ
(ก็คือ s///g) นั่นเอง

global มีความหมายว่าทำทั้งหมด หรือโดยนัยก็คือทำทั้งไฟล์นั่นเอง
จากตัวอย่างก็คือการ
ถึงจะเป็น Stream Editor แต่ไม่ได้หมายความว่าจะทำงานต่อเนื่องทั้งไฟล์ โดยปรกติ เวลาทำงาน SED ทำงานทีละบรรทัดไปจนตลอดทั้งไฟล์
ถ้าเราไม่ใช้ global flag จะทำให้ SED ทำงานเฉพาะตำแหน่งแรกที่หาพบของบรรทัดนั้นๆ
ถ้าต้องการให้ทำงานที่ทุกๆตำแหน่งที่พบบนไฟล์จะต้องเพิ่ม flag เข้าไปตัวนึงก็คือ flag g หรือ global

อืม ตัวอย่างนะ
ตัวอย่างอันนี้ก็คือ SED จะทำการตรวจจับทุกๆอย่างทุกๆตัวอักษรในไฟล์ old ยกเว้นช่องว่างอันนึง จากนั้นจะทำการหุ้มตัวอักษรเหล่านั้นด้วยวงเล็บ แล้วส่งไปเขียนในไฟล์ new
ตัวอย่างแรกจะทำเฉพาะตัวอักษรชุดแรกเท่านั้น ชุดต่อจากนั้นจะไม่มีผลอะไรด้วยเลย
sed 's/[^ ]*/(&)/' < old > new

ส่วนตัวอย่างที่สอง เมื่อใส่ g ต่อท้ายคำสั่ง จะให้ผลตลอดทั้งไฟล์ ทุกตำแหน่งในทุกบรรทัด
sed 's/[^ ][^ ]*/(&)/g' < old > new

อ้างอิงจาก http://www.grymoire.com/Unix/Sed.html

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

init: Id "x" respawning too fast: disabled for 5 minutes

มีปัญหาจากการ Ghost Linux โดยเป็นการ Ghost จาก Hardware หนึ่งไปยังอีก Hardware หนึ่ง
การโกสต์ก็ดำเนินไปได้เรื่อยๆดี แต่ก็คาดการณ์ไว้ว่ามันไม่น่าง่าย ถึง Hardware จะมาจากบริษัทเดียวกันก็เถอะ แต่ก็มีอะไรต่างกันหลายอย่างทีเดียว โดยตัวดีที่สุดนี่คือ Graphic Card
แล้วมันก็ไม่ง่ายดังคาด แฮ่ม
ผลการบูตเครื่องหลัง Ghost ก็คือ

เข้าได้เกือบเหมือนปรกติ
เป็นการหลอกให้ตายใจตอนบูต
โดยจะเข้ามาได้เรื่อย จนเกือบถึงหน้า Login อยู่แล้ว...แล้วมันก็เกิดขึ้น จนได้

อาการง่ายๆก็คือ จอกระพริบถี่ๆๆๆ มากๆๆๆ ประมาณนาทีนึง คล้ายๆกับว่าพยายามวิ่งเข้า Graphic Mode แต่เข้าไม่ได้ซักที
จากนั้นก็เด้งออกมา Text Mode โดย จะมีคำพูด 1 แถวถ้วน ว่า

Init: Id "x" respawning too fast: disable for 5 minutes

พอเคาะ Enter ก็จะมี Login Prompt ให้เราอันนึง

เราจะสามารถล็อกอินได้ตามปรกติ (ของ Text Mode)
ทีนี้ เข้ามาก็จะสั่ง startx เพื่อเข้าหน้าจอ Graphic
ซึ่งมันก็ต้องขึ้น Error มาก่อน ตามฟอร์ม
(ก็หมายความว่า เราไม่สามารถเข้า GUI ได้งัย)

ทีนี้ก็เลยลองหาปัญหา
โดยลองเข้าไปที่ /etc/inittab

จะพบว่า ในท้ายๆ จะมีบรรทัดหนึ่ง เขียนถึง Id = x ตัวนี้
โดยสิ่งที่ Id นี้เรียกใช้ ก็คือ สคริปต์ ชื่อ /etc/X11/prefdm
ซึ่งตัวสคริปต์ จะเอากำหนดว่าจะใช้เรียก Graphic Control ตัวใหน ระหว่าง gdm, kdm หรือ xdm

แต่ไฟล์เหล่านี้กลับไม่ใช่ปัญหา
ปัญหาอยู่ที่ /etc/X11/XF86Config
โดยทำการปรับ driver ของการ์ดจอเลย
แล้วทำการบูตอีกรอบหนึ่ง

ก็ได้แล้ว

(จริงๆจะก็อบว่า เซตไรบ้าง แต่ง่วงมากซะนี่)

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

xmodmap กับการเปลี่ยนความหมาย keyboard อย่างง่ายๆ

เนื่องจากเจอปัญหาในการทำงานของ keyboard บน Linux

ก็คือ เวลาที่เราต้องการใช้ shortcut key บนโปรแกรมหนึ่งๆ เราจะกด Ctrl+B, Ctrl+X และอะไรพวกนี้ ซึ่งมันจะทำงานได้ก็ต่อเมื่อเรา turn off เจ้าปุ่ม Numlock แล้วเท่านั้น
ไม่มีปัญหา โอเค ทำได้
แต่พอถึงเวลาที่จะใช้ key pad ในการป้อนข้อมูลตัวเลข
อ้าว...ต้อง turn on เจ้าปุ่ม Numlock ล่ะสิ
ทำไงดีหนอ จะได้ไม่ต้องมานั่งสลับปุ่ม Numlock ไปๆมาๆ
(จริงๆถ้าโปรแกรมมันรับ Shortcut Key โดยที่ไม่ต้องแคร์ปุ่ม Numlock ได้จะดีที่สุด - ปัญหาคือ ไม่รู้ทำยังงัย)

ดังนั้น เรามาแก้ปัญหาที่ปลายเหตุกันให้สนุกดีกว่า

เพราะว่าเรามี xmodmap อยู่นั่นเอง หุหุ

เท่าที่รู้ อย่างคร่าวๆ มันมีประโยชน์มากมายในการ re-map ปุ่ม keyboard
เช่น แก้ไขว่าแทนที่เรากดปุ่ม กไก่ ก็ให้มันส่ง ขไข่ มาแทน กไก่ ของเดิม (งงมั้ยหว่า)

นั่นเพราะว่า keyboard ใน UNIX จะมีสิ่งที่คล้ายๆ lookup table อยู่อันนึง เอาไว้ map ชุดตัวอักษร เข้ากับแป้น keyboard
(ซึ่งเวลาที่ทำการเปลี่ยนภาษา ก็คงจะทำแค่เปลี่ยนชุดภาษาเหล่านี้ล่ะมั้ง ดูง่ายๆดีนะ)

ทีนี้ ก็มาถึงตัวโปรแกรม
สถานที่อยู่ของมันก็คือ /usr/bin/xmodmap
เอ๊ะ ดูเหมือนจะมีอีกบ้านคือ /usr/share/xmodmap
อันนี้เป็น help ที่โชว์ syntax
ปกติเราจะใช้
xmodmap -pk หรือ
xmodmap -pke
เพื่อแสดง table ทั้งหมด ว่า key ใหน map ตัวอักษรอะไรอยู่
จากนั้น เราจะใช้
xmodmap -e
ในการเปลี่ยนความหมายของ key

ยกตัวอย่าง เช่น ในส่วนของ keypad
ถ้าดูที่ keycode 87 จะเห็นว่ามันเท่ากับ ข้อมูลสองอันคือ KP_End และ KP_1
ก็คือ ถ้า Numlock ปิด เวลากดปุ่มนี้จะมีความหมายว่ากด END
แต่ถ้า Numlock เปิด เวลากดปุ่มนี้จะมีความหมายว่ากด 1

ทีนี้ถ้าเราต้องการที่จะให้เวลากดปุ่มนี้ ให้มันแสดงแต่เลข 1
สิ่งที่เราต้องทำคือ
xmodmap -e "keycode 87 = KP_1"
เปลี่ยนมันซะทั้งบรรทัดเลย
เรียบร้อยแล้ว ทีนี้เวลากด key 1 ไม่ว่า Numlock จะเปิดหรือปิดอยู่ ก็จะส่งเลข 1 ออกมาเท่านั้น

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

sed - stream editor (4)

3. ถ้าใน pattern มี / เป็นส่วนประกอบ

นั่นหมายความว่า คำสั่ง s จะมีปัญหาถ้าเราไม่หลบเครื่องหมายก่อน เพราะในคำสั่งมันต้องใช้ / เป็นตัวคั่นนั่นเอง

เช่น ถ้าต้องการแทนคำว่า /usr/local/bin ด้วยคำว่า /common/bin ของทั้งไฟล์ new.txt ก็จะต้องทำแบบข้างล่างนี้

sed 's/\/usr\/local\/bin/\/common\/bin/' new.txt
มองดูแล้วน่าเกลียดมาก อ่านไม่รู้เรื่องเลย ซึ่งลักษณะแบบนี้เขาเรียกว่า Packet Fence

ก็คือเวลาพิมพ์ เราจะต้องคิดว่าเรากำลังแทนที่ข้อความ \/usr\/local\/bin ด้วยคำว่า \/common\/bin

นอกจากจะใช้เครื่องหมาย / มาทำเป็นตัวคั่นของคำสั่งแทนที่แล้ว จริงๆแล้วเรายังสามารถใช้เครื่องหมายอื่นๆได้ด้วย ดูจากตัวอย่างข้างล่าง

sed 's_/usr/local/bin_/common/bin_' new.txt
sed 's:/usr/local/bin:/common/bin:' new.txt
sed 's|/usr/local/bin|/common/bin|' new.txt

ซึ่งทำให้เราไม่ต้องมานั่งเขียน packet fence ให้ยุ่งยาก (แต่ในสิ่งที่เราต้องการจะแทนที่และนำไปแทนที่จะต้องไม่มีสัญลักษณ์ที่ใช้แทนอยู่ในนั้น)

sed - stream editor (3)

2. แทนที่โดยใช้ &

โดยหลักแล้ว sed สามารถใช้ & เพื่ออ้างอิงถึงสิ่งที่กำลังทำการค้นหาได้ เพื่อนำไปใช้อีกครั้งภายหลังได้

อธิบายง่ายๆโดยตัวอย่าง ดังนี้

sed 's/123/123 123/g' test.txt

ตัวอย่างนี้ จะทำการ copy ทำซ้ำตัวเอง โดยถ้า sed เจอ pattern ที่เหมือนกับ 123 ก็จะทำการแทนที่โดยเขียนตัวเองสองรอบ

เช่น ถ้าไฟล์ข้อความเป็น
123 abc

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

123 abc
456 gef
789 tgh

ซึ่งผลลัพธ์ที่ต้องการ คือต้องการให้ SED พิมพ์ข้อมูลตัวเลขซ้ำสองครั้ง

ถ้าไม่ใช้ function เสริมใน SED แล้วล่ะก็

เราก็ต้องพิมพ์คำสั่งที่ยาวเหยียดเฉียดเมตร

มาถึงจุดนี้ Regular Expression จะเริ่มเข้ามามีบทบาท ทำให้ชีวิตเราง่ายขึ้น(มาก)
โดยเราจะใช้ RegExp เพื่อทำ pattern ที่จะใช้ในการ Match ถ้าพบว่า pattern ตรงกับ RegExp ก็จะเริ่มทำงานทันที

แต่ในเวลาที่จะแสดงผล เราไม่สามารถบอกให้แสดงผลด้วย RegExp ได้ เพราะ software จะไม่เข้าใจว่าเราต้องการแสดงอะไร
จึงต้องใช้ สัญลักษณ์ในการแทนสิ่งที่ตรงกับ RegExp ซึ่งใน SED จะใช้ & ในการแสดงผล

sed 's/[0-9]*/& &/g' test.txt
sed 's/[0-9][0-9]*/& &/g' test.txt

แค่นี้ ชีวิตก็ง่ายขึ้น

วันเสาร์ที่ 1 มีนาคม พ.ศ. 2551

sed - stream editor (2)

ต่อเลยดีกว่า เพื่อไม่ให้บทความมันยาวเกินไป เลยจะตัดๆเป็นช่วงๆไป
ต่อจากนี้จะลอง test ว่ามันทำงานอะไรได้บ้าง

1. Substitue - อันนี้เป็น function หลักเลยที่เราใช้อยู่ (ตอนนี้ใช้เป็นอยู่อย่างเดียว)
sed -e 's/line/section/g' test.txt
sed 's/line/section/' test.txt
sed 's/line/section/g' test.txt

สามตัวอย่างนี้ให้ผลลัพธ์เหมือนกันเลยอ่ะ ก็คือจะเปลี่ยนข้อมูลทั้งไฟล์ โดยเปลี่ยนข้อความ 'line' ให้เป็น 'section'

sed 's/line/section/g' test.txt > result.txt

ตัวอย่างสุดท้าย จะบอกว่า ถ้าไม่ระบุ output file - SED จะส่งผลลัพธ์ออกไปยัง STDOUT ซึ่งก็คือจอภาพ ถ้าระบุไว้มันก็จะ SAVE เข้า output file ซึ่งผลก็คือเราจะได้ file ใหม่ที่ผ่านการแก้ไขแล้ว โดยไม่ไปกวนกับไฟล์ต้นฉบับ
(ซึ่งก็ดี เพราะเกิดพลาดอะไรไป ก็จะได้ไม่ต้องเศร้ามากนัก)

sed 's/line/section/g' < test.txt > result.txt

ลองเช็ค syntax ของ SED
s/regexp/replacement/flags

นี่คือคำสั่งที่ใช้ในการทำ substitute
s แรกคือ s command - substitute command
regexp - ข้อความที่จะถูกแทนที่ - สามารถใช้เป็น Regular Expression ได้ด้วย (RegExp นี่เอาไว้จะเอามาเขียนด้วยดีกว่า เพราะใช้ประโยชน์ได้เยอะ)
replacement - ข้อความที่จะเอาไปแทนที่ - อันนี้ใช้ RegExp ไม่ได้อยู่แล้ว
flags - จะมีหรือไม่มีก็ได้

flags สำหรับ substitute
g - แทนทุกๆ RegExp ด้วย Replacement - แทนทุกอัน ทุกตำแหน่ง

บางครั้งคำสั่งบางตัวใน sed อาจทำให้เกิดความสับสน(มั้ง) ดังนั้นทางที่ดี ควรใส่ quote คร่อมเอาไว้ อย่างน้อยเพื่อความสบายใจ

เช่น
sed s/line/section/g testfile.txt
sed 's/line/section/g' testfile.txt
ทั้งสองตัว(ตอนนี้)ให้ผลเหมือนกัน แต่แบบมี quote ชัวร์กว่าว่าจะไม่ error

ยังมีอีก แต่แปะไว้ก่อนนา...

sed - stream editor (1)

sed - stream editor
text processing คุณภาพสูง
ใช้งานบ่อยใน shell script บน UNIX

เนื่องจากเป็นคำสั่งหนึ่งที่ยังไม่ค่อยรู้เรื่องเกี่ยวกับมันมากนัก
เพราะเห็นว่ามันทำงานได้มาก และน่าจะช่วยให้เวลาทำงานกับ script จะทำงานได้เร็วขึ้น เลยอยากจะศึกษามันซะหน่อย

อือม ก่อนอื่นคงต้องทำความรู้จักกับมันซักหน่อย
อันนี้เป็น version และ information ของมัน บน Fedora Core6

[thada@localhost ~]$ sed --version
GNU sed version 4.1.5
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.

[thada@localhost ~]$ sed --version | grep version
GNU sed version 4.1.5

[thada@localhost ~]$ sed --version | grep version | awk '{print $4}'
4.1.5

[thada@localhost ~]$ sed
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...

-n, --quiet, --silent
suppress automatic printing of pattern space
-e script, --expression=script
add the script to the commands to be executed
-f script-file, --file=script-file
add the contents of script-file to the commands to be executed
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if extension supplied)
-l N, --line-length=N
specify the desired line-wrap length for the `l' command
--posix
disable all GNU extensions.
-r, --regexp-extended
use extended regular expressions in the script.
-s, --separate
consider files as separate rather than as a single continuous
long stream.
-u, --unbuffered
load minimal amounts of data from the input files and flush
the output buffers more often
--help display this help and exit
--version output version information and exit

If no -e, --expression, -f, or --file option is given, then the first
non-option argument is taken as the sed script to interpret. All
remaining arguments are names of input files; if no input files are
specified, then the standard input is read.

E-mail bug reports to: bonzini@gnu.org .
Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.