Tuesday, November 30, 2004

เจอ SETI Signal Candidate SHGb21+16o !

ไปลองเล่น Search Engine ของ MSN หาชื่อตัวเอง ก็เลยไปเจอหน้า

SETI@home: Signal Candidate SHGb21+16o

เพิ่งจะรู้ว่ารัน SETI@home กะเขามาตั้งหลายปี ก็มีเจออะไรน่าสนใจบ้างเหมือนกัน

เจอตั้งแต่เมื่อไรก็ไม่รู้ เขาอาจจะมีเมล์มาบอก แต่คงไม่ได้รับ เพราะสมัครไว้โดยใช้อีเมล์ของโดเมนเก่า ซึ่งเลิกใช้ไปแล้ว

ตอนนี้ไม่รู้จะทำไง ไปตั้ง ทีม Thai เอาไว้ แก้ไขอะไรก็ไม่ได้ URL ในชื่อก็ใช้ไม่ได้แล้ว คงต้องเมล์ไปขอแก้

Monday, November 29, 2004

RAID 5 on WindowsXP

ใครเคยเล่น Windows XP แบบหนักๆพอสมควร จะรู้ว่า Windows XP ก็ทำ Software RAID ได้เหมือนกัน แต่จะมีให้เลือกแค่ RAID0 (STRIP), RAID1 (MIRROR), SPAN (ดิสก์มาต่อกัน) ซึ่งไม่มี RAID5

เครื่อง Windows XP ที่ใช้เป็น Printer/File Server ที่โต๊ะทำงานก็ทำ RAID0 อยู่ ทีแรกอยากทำ RAID5 แต่จำได้ว่าไม่มีให้เลือก ดูเหมือนถ้าจะเอา RAID5 ต้องใช้ Windows รุ่น Server

อ่าน tomshardware ต่อจากเรื่อง "AGP Express" เมื่อกี้ไปเรื่อยๆ ไปเจอวิธี Hack Windows XP ธรรมดาให้ทำ RAID5 ได้

Unleashing RAID 5 Under WindowsXP

เขาทดสอบละเอียดดีมาก สร้าง RAID5 ด้วย Disk 4 ตัวเสร็จ ก็ชักสาย SATA ออกตัวนึง ขณะที่กำลังทำงานอยู่ ดูสิว่ามันจะเป็นอย่างไร หลังจากนั้นก็เสียบกลับเข้าไปแล้วลองให้มัน Rebuild RAID5 ใหม่

แถมทดสอบอีกด้วยว่า เมื่อเอา Disk ทั้ง 4 ตัว ไปทำ RAID5 เหมือนๆกันบนอีกเครื่องหนึ่ง ข้อมูลยังอ่านได้ไหม

ปรากฏว่าทุกอย่างทำได้เรียบร้อยง่ายดาย สรุปว่า Windows XP ก็ทำ RAID5 ที่ใช้งานได้จริงเหมือนกัน

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

AGP Express = Double PCI

สังเกตว่า บอร์ดที่ใช้ชิบ i915(G/P) ส่วนมากจะไม่มี AGP Slot เพราะว่า 915 ย้ายไปเป็น PCI Express หมดแล้ว แต่ samurai ที่ซื้อมาวันก่อน ดันมีช่อง "AGP Express" แถมยังใช้ได้อีกต่างหาก เพราะสัปดาห์ก่อนเอาการ์ด GeForce2MX เก่าๆ (AGP) ไปเสียบ เรียก XFree ขึ้น ใช้งานได้เรียบร้อยดี

สงสัยว่า "AGP Express" คืออะไรกันแน่ ไปเจอคำตอบที่

Double PCI = AGP Express

เขาบอกว่า "AGP Express" ก็คือ PCI ธรรมด๊าธรรมดาสองอันมารวมกัน ช่วยทำให้พอถูไถใช้การ์ดวิดีโอ AGP กับ i915 ได้ แต่ช้ากว่า AGP ปกติแน่นอน เออ samurai ก็มีจุดเด่นที่พอเป็นประโยชน์บ้างเหมือนกันแฮะ

มิน่าวันก่อนทดลองรัน "xengine" บน samurai+geforce2mx (AGP Express) ได้แค่สองพันกว่าๆ ช้ากว่าเรียก xengine บน samurai แต่ตั้ง DISPLAY ข้ามเครือข่ายไปโผล่บน cygwin XFree บนเครื่องวินโดส์ข้างๆอีก (ประมาณเจ็ดพันกว่า)

บนโน้ตบุ๊ค TryLinux ได้ 4750 เดี๋ยวค่อยทำตารางสรุป

เพิ่มเติม

เอารูป Slot ที่เคยถ่ายไว้มาแปะ (PCI, PCI, AGP Express, PCI Express x1, PCI Express x1, PCI Express x16)

Saturday, November 27, 2004

Thermal Throttling ของซีพียู

&

วันก่อนระหว่างลองคอมไพล์ Kernel 2.6.9 ให้ Samurai ไปเจอตัวเลือกน่าสนใจ "check for P4 thermal throttling interrupt" (CONFIG_X86_MCE_P4THERMAL=y) สงสัยว่าเหมือนกับ Speed Step ของพวก Notebook หรือเปล่า น่าสนใจว่าเดี๋ยวนี้ P4 ตั้งโต๊ะก็มีแบบนี้ด้วย

ปรากฏว่าเลือกตัวเลือกนี้แล้วก็เห็นผลทันตา บูทด้วย Kernel ใหม่ แล้วคอมไพล์โปรแกรมอะไรหนักๆสักหน่อย จะขึ้นข้อความใน Log และบนจอของผู้ใช้ทุกคนเลย ว่า

Nov 22 20:41:55 samurai kernel: CPU0: Temperature above threshold
Nov 22 20:41:55 samurai kernel: CPU1: Temperature above threshold
Nov 22 20:41:55 samurai kernel: CPU1: Running in modulated clock mode
Nov 22 20:41:55 samurai kernel: CPU0: Running in modulated clock mode
พอดีมี HyperThread ก็เลยขึ้นแยกกันของ CPU0/1 แต่จริงๆแล้วมีตัวเดียว สงสัยว่าทำอย่างไรจึงไปขึ้นบนจอทุกคนด้วย ไปเจอคำตอบในไฟล์ /etc/syslog.conf เขียนไว้ว่า
*.emerg                         *
แล้วพอดีข้อความ "Temperature above threshold" นี่ถูกส่งออกมาที่ระดับ "emerg" ดูได้ใน linux-2.6.9/arch/i386/kernel/cpu/mcheck/p4.c

หลังจากนั้นเมื่อไม่มีโหลดสักพัก ข้อความว่าทุกอย่างกลับคืนสู่สภาวะปกติจะปรากฏขึ้นดังนี้

Nov 22 20:42:00 samurai kernel: CPU0: Temperature/speed normal
Nov 22 20:42:00 samurai kernel: CPU1: Temperature/speed normal

ประเมินปัญหา

อยากรู้ว่าเครื่องจะช้าลงแค่ไหน ลองดูใน /proc/acpi/processor/CPU1/throttling แล้วเห็นในอยู่สถานะ T0 คือ ปกติ ตลอด ไม่ได้บอกว่าช้าลง

# cat /proc/acpi/processor/CPU1/throttling 
state count:             8
active state:            T0
states:
   *T0:                  00%
    T1:                  12%
    T2:                  25%
    T3:                  37%
    T4:                  50%
    T5:                  62%
    T6:                  75%
    T7:                  87%
ตกลงเลยเอาโปรแกรม PiBench ฉบับ Java มาแก้ ให้วนลูปทำซ้ำไปเรื่อยๆ และแสดงเวลาแต่ละครั้งออกมา ถ้าเวลาเพิ่มขึ้นเรื่อยๆก็แสดงว่าซีพียูทำงานช้าลง

ได้ผลดังนี้

Pi 3.1415926445762157 Time:1862 at 1862
Pi 3.1415926445762157 Time:1857 at 3721
...
Pi 3.1415926445762157 Time:1865 at 26012
Pi 3.1415926445762157 Time:1885 at 27897
Pi 3.1415926445762157 Time:1912 at 29809
Pi 3.1415926445762157 Time:1936 at 31746
Pi 3.1415926445762157 Time:1951 at 33697
Pi 3.1415926445762157 Time:1958 at 35655
Pi 3.1415926445762157 Time:1991 at 37646
Pi 3.1415926445762157 Time:1992 at 39638
Pi 3.1415926445762157 Time:2002 at 41640
...
Pi 3.1415926445762157 Time:2194 at 107595
Pi 3.1415926445762157 Time:2200 at 109796
Pi 3.1415926445762157 Time:2202 at 111999
Pi 3.1415926445762157 Time:2207 at 114206
คือ เริ่มต้นใช้เวลาประมาณ 1.8 วินาทีต่อการคำนวนหนึ่งครั้ง แต่จะเริ่มช้าลงเมื่อเวลาผ่านไปประมาณ 27 วินาที จนไปคงที่ ที่ประมาณ 2.2 วินาทีต่อการคำนวนหนึ่งครั้ง คือ ช้าลงไปประมาณ 18%

เอาข้อมูลไปวาดกราฟได้ ดังนี้ (แกนนอนคือเวลาที่ผ่านไป แกนตั้งคือเวลาที่ใช้ในการคำนวนหนึ่งรอบ)

เห็นชัดว่าช้าลงจริง

ลองจนสนุกพอแล้วชักเริ่มเกิดอาการเครียด พัดลมตัวเบ้อเริ่ม ที่ใช้ก็เป็นอันที่แถมมากับ CPU ในกล่องสีส้มของ Intel ทำไมยังระบายความร้อนไม่พอ ? Intel ไม่น่าจะให้มาต่ำกว่าความต้องการ แถมอากาศในห้องก็เย็นประมาณ 20C ไม่ได้ OverClock ด้วยซ้ำไป มันน่าจะมีอะไรผิดปกติ

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

เลือดขึ้นหน้าเปิดเครื่องออกมาใหม่ กดอีกสองมุมที่เหลือแรงสุดๆ Motherboard งอแทบติดตัวกล่อง ได้ยินเสียง ติ้ก ไม่รู้ติ้กเพราะยึดติด หรือติ้ก Motherboard หัก

ปรากฏว่าได้ผลแฮะ ข้อความ Thermal Interrupt หายไปจากจอไม่โผล่ขึ้นมาให้เห็นอีกเลย และกราฟก็ดูสวยขึ้น

แต่ถ้ายังอยากให้เครื่องช้าลง สามารถสั่งได้โดย

echo 5 > /proc/acpi/processor/CPU1/throttling 
ตัวเลขที่ใช้ได้ ก็ 0-7 ดังที่แสดงออกมาตอน cat หรืออยากได้กราฟแบบนี้อีกก็ถอดไฟพัดลมออกได้

คิดว่ายังโชคดีที่ซื้อ Pentium 4 มา เคยได้ยินว่าถ้าเป็นแบบนี้กับ Athlon ละก็ ไหม้ ไปเลย ไม่รู้ว่ารุ่นใหม่ๆดีขึ้นแล้วหรือยัง

ปัญหาบนเครื่อง Notebook

เอาไปลองกับ P4 ใน Notebook ของ SONY บ้าง รุ่นนี้ SONY เอา P4-2.6 สำหรับ Desktop มายัดใสตัวถัง Notebook หนักกว่า 3Kg เอาไว้ตั้งโต๊ะแทน Desktop คงไม่มีใครหิ้วไปหิ้วมา

ผลออกมาเกินคาด รันโปรแกรมไว้ 1 ชม. ความเร็วลดลงไปเหลือประมาณ 1/2 ของความเร็วปกติ แปลว่าระบบระบายความร้อนของ SONY Notebook พวกนี้ทำมาชุ่ยๆ มิน่าวันก่อนรันโปรแกรมแปลงไฟล์รายการทีวีที่อัดไว้เป็น DIVX หรือ Import รูปเยอะๆเข้ามาด้วย ACDSee/Picasa ตั้ง Priority ไว้ที่ IDLE ต่ำสุดๆแล้วยังรู้สึกว่าเครื่องโหลดไปเยอะ ที่แท้ไม่ใช่เพราะ CPU Time ถูกแย่งไปอย่างเดียว ความเร็วของ CPU ยังลดลงไปอีกด้วย

ถ้าเป็นรุ่นบางๆเบาๆ เคยเจอมาหลายรุ่นแล้ว (เช่น TOSHIBA PORTEGE เก่าๆ) ถือว่าช่วยไม่ได้ ก็มันบางและเบานี่ แต่นี่รุ่นหนาหนัก น่าจะทำมาให้ดีหน่อย สรุปว่าอย่าเอา Notebook ไปทำงานหนัก

โปรแกรม

ตัวโปรแกรม JHuiBench2.java

import java.util.*;

class JHuiBench2 {
    public static void main(String[] args) {
        int i,j;
        long t0 = (new Date()).getTime();

        while(true) {
        double x=0;
        long t1 = (new Date()).getTime();
        for(i=1;i<300000000;i+=4) {
            x += 1.0/i - 1.0/(i+2);
        }
        long t2 = (new Date()).getTime();
        System.out.println("Pi "+(x * 4.0)+" Time:"+(t2-t1)+" at "+(t2-t0));
        }
    }
}
รันโดย
javac JHuiBench2.java
java JHuiBench2 > out.txt &
tail -f out.txt 
ปล่อยไว้นานพอแล้วก็ Kill ทิ้ง แล้วเอามาวาดกราฟโดยใช้ gnuplot ผ่านสคริปต์ plot.sh โดยเรียก plot.sh out.txt
$ cat plot.sh
#!
gnuplot <<EOF
set terminal png
set output '$1.png'
plot [0:][0:] '$1' using 2:1 'Pi %*lf Time:%lf at %lf' t "Time (msec)" with lines   

EOF
จะได้ out.txt.png ออกมา

หมายเหตุ: "&" บรรทัดแรกสุดเอาไว้หลอก Planet

Friday, November 26, 2004

เรื่องของ "Longdo" ใน กรุงเทพธุรกิจ

สังเกตมาตั้งแต่เมื่อวานแล้วว่า สถิติการดู Blog หน้า Longdo Toolbar & Windows XP SP2 เพิ่มขึ้นมาก สงสัยว่าจู่ๆทำไม Longdo จึงฮิตขึ้นมาได้

วันนี้ Otto ส่ง MSN มาบอกว่า ที่กรุงเทพธุรกิจสัมภาษณ์เรื่องลองดูไปเมื่อหลายเดือนก่อน เขาลงให้แล้ว ที่

'ลองดู' พจนานุกรมออนไลน์ เปิดพรมแดนความรู้สู่เวบนอก

Wednesday, November 24, 2004

กำเนิด "samurai"

ปกติชอบตั้งชื่อเครื่องคอมพิวเตอร์ที่ใช้ตามยี่ห้อหรือรุ่น เช่น "X22", "Precision", "Gateway", "P4", หรือเครื่องประกอบเอง "ASUS" เพราะเป็นยี่ห้อของ Motherboard

อาทิตย์ที่ผ่านมาออกไปเดิน 秋葉原 (Akihabara) ตั้งใจจะหาคอมพิวเตอร์สักเครื่องมาทำ Linux Server (หลังจากที่มี Linux Desktop "TryLinux") ที่ต้องไปถึง 秋葉原 ก็เพราะว่าร้านทั่วไปมักขายแต่ของมียี่ห้อ ให้ OS เป็น Windows ติดมาด้วย และถ้าสั่งตามร้านบนเน็ตมันก็เป็น Made-to-Order ต้องรอเกือบสัปดาห์

ตรงไปร้านที่พอรู้ว่ามีทำขายเป็น "ยี่ห้อของร้าน" เช่น TSUKUMO ก็เจอรุ่นที่ถูกใจนะ P4-3.0E, 512MB, 160GB แต่พอถามว่าจะเพิ่ม RAM เป็น 1GB ได้ไหม เขาบอกว่ามี Slot แค่ 2 ช่อง ตอนนี้ใส่ 256x2 เต็มแล้ว ต้องซื้อ 512MB ใหม่สองแผ่น แล้ว 256x2 ที่อยู่ในเครื่องตอนนี้ก็เอามาขายคืนร้าน

ปัญหาคือ มันซื้อคืนในราคาของมือสอง ! เห็นว่า 256MB ให้ราคา 2000 กว่าเยนต่อแผ่น ทั้งๆที่เครื่องเพิ่งซื้อออกจากร้านเลยนั่นแหละ อ้างว่าเครื่องเขาประกอบใส่กล่องแล้ว ทดสอบแล้ว มีประกันร้านแล้ว ถ้าเปลี่ยนแปลง Spec ตอนนี้ มันจะประกันไม่ได้ เรื่องมากเลยไปดูร้านอื่นต่อ (ร้านญี่ปุ่นชอบเป็นแบบนี้แหละ เรื่องมากแทนคนซื้อ)

ไปเจอ TWOTOP เอาอุปกรณ์มารวมขายเป็นชุดๆ เจอชุด P4 540 3.2G ราคาก็ไม่ต่างกันมาก RAM ก็ให้ 1GB อยู่แล้ว แต่ให้ DVD-R/RW มาด้วย คิดว่าคงไม่ใช้เพราะ Desktop ที่บ้านมีอยู่แล้ว เลยขอเปลี่ยนเป็น DVD/CD-RW Combo ธรรมดาแล้วเพิ่มขนาดดิสก์จาก 160G เป็น 250G เอา RAM ที่มีประกัน 5 ปี (เดิมประกันร้านให้ไม่กี่เดือน) คิดไปคิดมาราคาเท่าเดิม :)

มัวแต่เลือก RAM+ต่อราคา DVD/HD ลืมดู Motherboard ไปได้ยี่ห้อที่ไม่เคยได้ยินมา คือ ECS EliteGroup ECS 915G-A (1.2A) บนกล่องเขียนว่า "รุ่นสำหรับญี่ปุ่น SAMURAI" ดีเหมือนกันเอาเป็นชื่อเครื่องซะเลย ถ้าตอนนั้นไม่ลืม คงเลือกเอา ASUS กลับมาอีก ซวยตายชื่อซ้ำ ต้องนั่งคิดชื่อใหม่ :)

ตอนซื้อคนขายถามไม่เอา OS ด้วยเหรอ บอกว่าไม่ต้องจะลง Linux แกบอกว่า Linux มีปัญหานะ ถามว่าปัญหาอะไร แกนิ่งสักพักแล้วบอก Boot ไม่ขึ้น เฮ้ยเป็นไปได้ไง พวก Chipset ฯลฯ ก็เป็นของ Intel ดูปกติดี (ปกติไม่ชอบ VIA/SIS) ท่าทางคนขายไม่ค่อยแม่นเท่าไร ก็เลยเชื่อดวงซื้อมาก่อนละกัน

samurai ใช้ Chipset i915G+ICH6 (ไม่มี R) มีอะไรใหม่ๆมาเยอะจนหลายๆอย่างคงไม่ได้ใช้ หรือ อาจจะยังใช้ไม่ได้บน Linux เช่น ระบบเสียง 8 ช่อง (7.1), GMA900 Graphic, PCI Express, AGP Express, Gigabit LAN เรียกว่า Overspec สำหรับเอามาทำ Linux Server ถ้าเป็น ICH6R อาจจะได้ "Intel Matrix Storage" (RAID) มาด้วย

กลับบ้านนั่งประกอบต่อหน้ากองเชียร์ Otto/หนู ใส่แผ่น KNOPPIX-TH บูทได้ ติดตั้งใส่ HD ได้ แต่ Reboot จาก HD ไม่ขึ้น ! โห คนขายแม่น(หวะ) ดูเหมือนจะเป็นเพราะใช้ HD แบบ Serial ATA (SATA) ไม่ใช่ IDE ธรรมดา

ไม่ขึ้นไม่เป็นไร บูทจาก CD อีกทีแล้วทำ Boot Floppy ก็ได้ ปรากฏว่าไม่ขึ้นเหมือนเดิม

มั่วไปมั่วมา จนได้ grub> กับความว่างเปล่า ตอนบูท ต้องไปเขียน /boot/grub/menu.lst ด้วยมือ จนในที่สุดก็บูทจาก HD ได้

ตอนนี้ X11 ยังเล่นได้แค่แบบ vesa ขนาด 640x480 ! ดูเหมือน Driver ของ i810 ในตัว XFree 4.3 ที่มากับ KNOPPIX ยังไม่รู้จัก i915G ไปดู changes ของ XFree เขาบอกว่า i915G เพิ่มเข้าไปใน i810 Driver ในรุ่น XFree 4.4.99

แต่ XFree 4.4 ไม่มีให้ apt-get ก็เลยต้องไปดูดซอร์สมาจาก CVS แล้ว make World กันเอาเอง

ผล: เรียก X ปุ้บ เครื่อง Reboot ไปเลย ! เอา Kernel 2.6.9 ล่าสุด (ไม่มี Patch ใดๆ) มาลองดูก็ไม่ดีขึ้น แค่สั่ง modprobe เพิ่มโมดูลที่เป็น DRM ของ i915G มันก็รีบูทตัวเองเหมือนกัน ทำหลายรอบจนหลายไฟล์ใน / Filesystem เช่น mkboot เริ่มเจ๊งหรือหาย ต้องติดตั้งใหม่จากแพคเกจ

เลิกดีกว่า เดี๋ยวเอา Geforce2MX เก่าๆมาใส่แทน :) เรื่องเสียง 7.1 หรืออื่นๆคงอีกสักพักใหญ่ๆค่อยลอง

Before

Samurai

CPU

After

Tuesday, November 23, 2004

Need 64-bit Linux ?

เช้าวันหยุดนั่งเอาเมล์เก่าๆที่เก็บไว้หลายปี แสนกว่าฉบับ (รวม Mailing Lists ฯลฯ) มาใส่ mhonarc วันหลังจะได้ทำระบบ Search/เปิดดูได้ด้วย Browser

ผ่านไปประมาณ 130,000 ฉบับ เครื่องอืดลงมาก พบว่า mhonarc กินเมโมรี่ไปเกือบ 2.7GB ! (ในเครื่องมี 1GB RAM + 2GB Swap)

ก่อนที่ Kernel มันจะตายก็เลยรีบ kill -STOP mhonarc-pid หยุดพักไว้ก่อน แล้วไป mkswap ...+swapon ... เพิ่มให้อีก 2GB รวมเป็น 4GB Swap จากนั้นก็ไปสั่งให้ mhonarc ทำงานต่อ kill -CONT mhonarc-pid

สุดท้ายมันก็ไปตายตอนชนขีดจำกัด 3GB ต่อ Process ของ Linux อยู่ดี

ในเครื่อง 32-bit อ้างตำแหน่งหน่วยความจำได้ 4GB แต่ Linux เก็บไว้ให้ Kernel ใช้ 1GB เหลือสำหรับ Process 3GB คงต้องแบ่งเมล์เก่าเป็นปีๆซะแล้ว หรือไม่ก็ต้องใช้ 64-bit Linux ?

จาก Maximum Heap Size

You have 3Gb of virtual space for an application on x86. This is basically hardware limitations of the processor (1Gb is used for kernel mappings and having kernel and user mappings overlapping costs every syscall).

Monday, November 22, 2004

Recent Pentium 4 Family

ดูแค่ 3.2GHz อย่างเดียวก็เวียนหัวแล้ว เดี๋ยวนี้ Clock ไม่ค่อยเร็วขึ้นเท่าไร เล่นเปลี่ยน ABC แทน
Intel Pentium 4 540 3.2GHz 
3.20GHz, Prescott, LGA 775, 800 FSB, 1 MB L2 Cache 

Intel Pentium 4 3.2EE (Extreme Edition aka Extremely Expensive)
3.20GHz, Northwood, Socket 478, 800 FSB, 512 KB L2 Cache, 2 MB L3 Cache 

Intel Pentium 4 3.2F
with EM64T

Intel Pentium 4 3.2E
3.20GHz, Prescott, Socket 478, 800 FSB, 1 MB L2 Cache 

Intel Pentium 4 3.2C 
3.20GHz, Northwood, Socket 478, 800 FSB, 512 KB L2 Cache 

Friday, November 19, 2004

TryLinux-9: เครื่องพิมพ์ / Xprint

ที่ลองเล่นๆมา ก็แสดงผล และป้อนข้อมูล ภาษาไทย บน TryLinux ได้แล้ว มาลองสั่งพิมพ์กันดูบ้าง

เครื่องพิมพ์

เครื่องพิมพ์ที่ใช้อยู่ เป็น PostScript (Level 3) ของ EPSON ใช้มาหลายปีแล้ว เก่ากว่าตึกออฟฟิสนี่อีกอีก (เพราะขนย้ายมาจากออฟฟิสเก่า) ต่อเข้ากับ LPT1 ของเครื่อง Windows XP ที่ทำเป็น Server ให้สั่งพิมพ์จากเครื่องอื่นๆได้

ก่อนหน้านี้เคยเปิดบริการ TCP/IP Print Server (lpd) บนเครื่อง Windows เอาไว้แล้ว เพื่อให้สั่งพิมพ์จาก Unix ทั้งหลายได้ (เคยใช้จาก Solaris ด้วย)

ความจริงเรื่องเครื่องพิมพ์ ขอให้เป็น PostScript Printer + lpd ก็ไม่ค่อยจะมีปัญหาเรื่อง Driver และการใช้ผ่านเครือข่ายบน OS ทั้งหลายเท่าไร มักจะรู้จักและใช้กันได้หมด

ลอง Cups

บน TryLinux จะตั้งให้พิมพ์ผ่าน lpd อีกก็ได้ แต่อยากลองทำโดยใช้ GUI และเลือกพิมพ์ผ่าน Samba ดูมากกว่า จะได้เป็นประสบการณ์ เพราะก่อนหน้านี้เคยแก้แต่ /etc/printcap (เก่ามาก) ยังไม่เคยเล่น CUPS หรืออะไรที่ใหม่กว่านั้นเลย

เริ่มจากเปิดไปที่ KDE Control Center เลือก Peripherals → Printers แล้วกดปุ่ม Add ก็จะมี "Add Printer Wizard" โผล่ขึ้นมา

ตรงนี้ก็ตอบคำถามไปเรื่อยๆ เลือกว่าเป็น "SMB shared printer (Windows)" กรอก User/Password ที่ใช้บน Windows กรอกชื่อ Workgroup, Server, ชื่อแชร์ของเครื่องพิมพ์ สุดท้ายก็เลือกว่าเป็น "PostScript Printer" ไม่ต้องเลือก Driver อะไร

จากนั้นก็ไปดูว่า Control Center ไปทำอะไรไว้ที่ไหนบ้าง เริ่มจาก /etc/printcap เขียนไว้ว่า

# This file was automatically generated by cupsd(8) from the
# /etc/cups/printers.conf file.  All changes to this file
# will be lost.
epson|EPSON LP8400 PS3:rm=TryLinux:rp=epson:
แปลว่าอย่ามายุ่งกับฉัน epson ที่ถูกเพิ่มเข้ามาก็ดูแปลกๆ ไม่เหมือน printcap ที่เคยเห็น ลอง man lpr ดู เจอตอนท้ายๆว่า
SEE ALSO
  cancel(1), lp(1), lpstat(1), CUPS Software Users Manual
อันนี้เลยแน่ใจว่ามีอะไรที่ไม่เหมือนเดิม เพราะปกติแล้ว คำสั่ง lpr จะอยู่ในกลุ่มเดียวกับ lpq, lprm ใน SunOS (BSD) ซึ่งเป็นชุดคำสั่งคนละระบบกับ lp, lpstat, cancel ใน Solaris

นี่สั่ง man lpr ดันบอกให้ไปดู lp แสดงว่า CUPS มันทำคำสั่งเหล่านี้ขึ้นมาทดแทน สำหรับผู้ใช้จากทั้งสองระบบ ลองสั่ง lsof -i ดู ก็ไม่เห็นมีใครรออยู่ที่ Port ปกติของ printer คือ 515 และไม่มี Process ชื่อ lpd

มีแต่ cupsd รันให้บริการอยู่ที่ Port ipp (Internet Printing Protocol) คือ 631 แทน แสดงว่าเขาเลิกใช้ lpd กันหมดแล้ว ถ้าต่อเครื่องพิมพ์เข้ากับ Linux ยุคนี้ แล้วอยากพิมพ์จาก Solaris เก่าๆจะทำไงดีเนี่ย ? เอาไว้ค่อยหาทางออกเมื่อถึงเวลา :)

cupsd

เมื่อกี้เขาบอกให้ไปดู /etc/cups/printers.conf ปรากฏว่าไปเจอ

<DefaultPrinter epson>
Info EPSON LP8400 PS3
Location Hui Desk
DeviceURI smb://username:password@WORKGROUP/servername/EPSON
State Idle
Accepting Yes
JobSheets none none
QuotaPeriod 0
PageLimit 0
KLimit 0
</Printer>
ดูแล้วเข้าใจง่ายดี DeviceURI ก็ตรงไปตรงมา ตอนแรกคิดว่าเป็น XML แต่ไหงเริ่มด้วย <DefaultPrinter epson> แล้วลงท้ายด้วย </Printer> ? เอาเหอะ ใช้ได้ก็พอแล้ว

ในเมื่อ lpr ทั้งหลายถูกแทนด้วยตัวปลอมจาก CUPS แล้ว ไอ้ไฟล์ /etc/printcap จะมีไว้ทำไม ? เวลาเรียก lpr มันก็น่าจะต่อไปที่ CUPS เลยนี่ หรือไม่ก็ดูแค่ /etc/cups/printers.conf ไม่มายุ่งกับ /etc/printcap อีกต่อไปแล้ว

ทดลอง strace lpr a.ps >& foo แล้วดูใน foo ดูเหมือนไม่มีการเปิดไฟล์ /etc/printcap และ /etc/cups/printers.conf แต่ต่อไปที่พอร์ต IPP แล้วก็ส่งภาษา HTTP ไปว่า

send(4, "POST / HTTP/1.1\r\n", 17, 0)   = 17
send(4, "Content-Length: 137\r\n", 21, 0) = 21
send(4, "Content-Type: application/ipp\r\n", 31, 0) = 31
send(4, "Host: localhost\r\n", 17, 0)   = 17
มั่วเอาเองว่าคงเก็บไฟล์ /etc/printcap เอาไว้ให้โปรแกรมโบราณดูว่ามีเครื่องพิมพ์ชื่ออะไรให้ใช้ได้บ้าง จากนั้นโปรแกรมโบราณเหล่านั้นก็สั่งพิมพ์ด้วย lpr ตัวปลอมอยู่ดี

ทดลองพิมพ์

เริ่มจากไฟล์ PostScript ง่ายๆ ใช้ a2ps สร้างออกมา

$ a2ps -o a.ps .cshrc
$ lpr a2ps
ได้ .cshrc พิมพ์ออกมาเรียบร้อย สวยงาม ลองค้นดูคำสั่งเกี่ยวกับพิมพ์ที่ใช้บ่อยๆก็มีอยู่ครบ เช่น psnup (ทำหลายหน้าในแผ่นเดียว), psselect (เลือกออกมาบางหน้า) สมัยก่อนใช้คำสั่งพวกนี้บ่อย เพราะได้ไฟล์มาเป็น PS เดี๋ยวนี้กลายเป็น PDF กันหมดแล้ว สั่งบน Acrobat แทน

OpenOffice TLE

ในเมื่อ lpr ใช้ได้แล้ว โปรแกรมโบราณทั้งหลายคงไม่มีปัญหาในการพิมพ์ ลองโปรแกรมยุคใหม่แบบ OpenOffice หรือโปรแกรมที่ใช้ KDE หรือที่ใช้ฟอนต์ TrueType ผ่าน FreeType ฯลฯ ดูบ้าง ดูซิว่าจะพิมพ์ยังไง ?

  • OpenOffice TLE พิมพ์ได้ไม่มีปัญหา เลือกฟอนต์ TrueType ที่มากับ KNOPPIX-TH เช่น JS-Charnchai หรือฟอนต์ที่ใส่ไว้ใน .fonts ส่วนตัว เช่น Angsana New ก็พิมพ์ได้ มีปัญหาตรงที่ว่า ถ้าเป็นฟอนต์จาก NECTEC เช่น Norasi วรรณยุกต์จะลอยละลิ่ว ทั้งบนจอและบนกระดาษ (JS-Charnchai กับ Angsana New ไม่ลอย)

    ที่ใช้อยู่เป็น OpenOffice TLE 1.1.0 เห็น Otto บอกว่าเขาแก้ปัญหานี้แล้วในรุ่นใหม่ล่าสุด (ไม่รู้เลขเท่าไร) อีกปัญหาหนึ่งคือตัวอักษรในเมนู และ Dialog ทั้งหลายโตมาก เช่น เปิด Print Dialog นี่ ทะลุจอ 1024x768 ที่ใช้อยู่ตกจอไปเลย

  • Konqueror ก็พิมพ์ได้ ทั้งไทยและอังกฤษ แต่ไม่ได้ลองหลายๆฟอนต์เพื่อดูว่าแตกต่างกันหรือไม่อย่างไร เท่าที่ทดสอบ Tahoma ก็พิมพ์ออกมาดี มีปัญหาหน่อยตอนเปิดดูหน้า นสพ.ผู้จัดการ มันดูบนจอได้ แต่พิมพ์ไม่ออก ตรงที่เป็นตัวอักษรไทยว่างเปล่า

    คิดว่าเป็นปัญหาของ Konqueror ในการวาดอักษรไทยไปที่เครื่องพิมพ์มากกว่า และเกิดกับหน้าที่ซับซ้อน เช่น ผู้จัดการ เท่านั้น ลองหน้าง่ายๆ เช่น Linux.Thai.Net พบว่าภาษาไทยพิมพ์ได้ดี ไม่มีปัญหาอะไร

  • FireFox 1.0 ภาษาอังกฤษพิมพ์ได้ดี แต่ภาษาไทยพิมพ์ไม่ได้ คือ กลายเป็น PostScript Error ลองให้พิมพ์ใส่ไฟล์ PS แล้วเปิดดูด้วย GhostScript ปรากฏว่ามันไม่ได้ฝังฟอนต์ไทยมาให้ ก็เลยเจอแต่ฟอนต์ไม่รู้จัก พิมพ์ไม่ออก

    เดี๋ยวไปลอง XPrint (ยังไม่แน่ใจว่าคืออะไร เล่นยังไง) แล้วค่อยมาเขียนต่อ

อะไรคือ X-Print ?

ไปดูเรื่อง แนะนำการใช้ Xprint ปรินต์หน้าภาษาไทยจาก mozilla ของ โต้ง รู้สึกว่าเครื่องพิมพ์ชื่อประหลาดๆแบบนี้เคยเห็นแล้วนี่ ลอง ps aux เจอว่ามี Process ชื่อ /usr/bin/Xprt รันอยู่แล้ว สอบถามได้ความว่ามาจากแพคเกจชื่อ

# dpkg -S /usr/bin/Xprt
xprt-xprintorg: /usr/bin/Xprt
ดูๆแล้ว X-Print ก็เป็นอะไรที่ช่วยให้โปรแกรมที่วาดหน้าจอบน X11 ได้อยู่แล้ว สามารถวาดออกไปที่เครื่องพิมพ์ได้ด้วย ก่อนหน้านี้โปรแกรมบน Unix ส่วนมากจะแสดงผลโดยใช้ X11 แต่พอจะพิมพ์ ต้องมานั่งเขียนออกมาเป็นคำสั่ง PostScript อีกที เลยเกิดปัญหา แสดงผลได้ แต่พิมพ์ไม่ได้ ฯลฯ

โดย X-Print จะทำตัวเป็น X-Server อีกตัว ให้โปรแกรมวาดหน้าจอไปที่นี่ แล้วก็แปลงภาพที่ได้เป็น PostScript (เท่าที่เห็นมี PDF/PCL ด้วย อาจจะอ้อมมาทาง GhostScript อีกที ?) ก่อนส่งต่อไปที่เครื่องพิมพ์อีกที

ประโยชน์ก็ชัดเจน คนทำโปรแกรมประยุกต์บน Unix ไม่ต้องมานั่งทำส่วนสำหรับเครื่องพิมพ์เองอีกต่อไป แค่วาดหน้าจอได้ ก็พิมพ์ได้ (อย่างพวก Qt ก็ทำได้อยู่แล้วนี่หว่า ? คงเป็นอีกทางเลือก) ถ้าจะวาดแผนผังของทั้งหมดก็คงเป็นแบบนี้ (วาดด้วย GraphViz เจ้าเก่า)

ถ้าใช้ Xprint คนทำโปรแกรมประยุกต์ก็ไม่ต้องทำเส้นจาก Application Program ไปที่ PostScript เอง เหมือนกับของ Windows ที่โปรแกรมประยุกต์วาดโดยใช้ GDI แล้วอาศัย Driver แปลงจาก GDI ไปเป็นหน้าจอหรือเครื่องพิมพ์อีกที

ทดลองใช้ X-Print

เปิด Firefox สั่งพิมพ์ไปที่เครื่องพิมพ์ที่ชื่อ xp_ps_spooldir_HOME_Xprintjobs สักพักก็จะได้ไฟล์ที่โฮมของตัวเองใต้ ~/Xprintjobs/ สงสัยว่าโผล่มานี่ได้ยังไง พบว่าคำสั่งสำหรับจัดเก็บไฟล์ไว้ที่นี่จะอยู่ที่ /usr/share/Xprint/xserver/C/print/models/PSspooldir/spooltodir.sh

ลองเอาไฟล์ PS ที่ได้ส่งไปให้เครื่องพิมพ์ lpr xxx.ps ปรากฏว่าพิมพ์ออกมาเหลือแค่ขนาด 1/4 ของกระดาษ !!!

สงสัยว่า DPI จะไม่ถูก หาที่แก้จนไปเจอที่ /etc/Xprint/C/print/attributes/document แก้ความละเอียดของ PSspooldir จาก 300 เป็น 600 DPI ก็จะพิมพ์ได้ออกมาขนาดพอดี A4 ที่ตั้งค่าไว้

# PSspooldir.default-printer-resolution: 300
PSspooldir.default-printer-resolution: 600

เพิ่มเครื่องพิมพ์ของ Xprint

การพิมพ์ออกมาเป็นไฟล์ PS ก่อน แล้วสั่ง lpr อีกที ไม่ค่อยจะสะดวกนัก ดูเหมือนว่าเครื่องพิมพ์ของ Xprint ที่ปรากฏในรายการเครื่องพิมพ์ของ FireFox จะมาจากไฟล์ /etc/Xprint/C/print/Xprinters ก็เลยเข้าไปเพิ่มอีกเครื่อง

Printer epson_xprint
ในไฟล์นี้เห็นเขียนกันอยู่แค่นี้ ! ไม่ยักบอกว่าพิมพ์อะไรยังไง หรือเป็นเครื่องพิมพ์แบบไหน หาต่อไปเรื่อยๆ ดูเหมือนรายละเอียดที่จะให้กำหนดว่าเครื่องพิมพ์ใหม่ epson_xprint นี่เป็นยังไงอยู่ในไฟล์อื่นๆใต้ /etc/Xprint/C/print/attributes/ ลองดยู่สักพักสรุปได้ว่าต้องไปแก้หลายๆไฟล์ ดังต่อไปนี้

ใน /etc/Xprint/C/print/attributes/printer เพิ่ม

epson_xprint.xp-model-identifier: HUIEPSON
epson_xprint.xp-ddx-identifier: XP-POSTSCRIPT
epson_xprint.document-formats-ready: { PostScript 2 }
ใน /etc/Xprint/C/print/attributes/document เพิ่ม
HUIEPSON.default-printer-resolution: 600
แล้วก็ไปสร้าง HUIEPSON เพิ่มใต้ /usr/share/Xprint/xserver/C/print/models โดย
$ cd /usr/share/Xprint/xserver/C/print/models
$ cp -av PSspooldir HUIEPSON
ความจริงเห็นมี PSdefault เหมือนกัน แต่เมื่อกี้พิมพ์โดย PSspooldir สำเร็จไปแล้ว เอาอันชัวร์ๆดีกว่า แล้วก็แก้ไฟล์ HUIEPSON/model-config อีกหน่อย โดยเปลี่ยนคำสั่งสำหรับพิมพ์เป็น
*xp-spooler-command: /usr/bin/lpr -P epson
จากนั้นก็ restart ตัว Xprint ด้วย /etc/init.d/xprint restart และเปิด Firefox ขึ้นมาใหม่อีกที

แค่นี้เครื่องพิมพ์ตัวใหม่ epson_xprint ก็ไปโผล่อยู่ในรายการของ Firefox ลองสั่งพิมพ์ ก็ใช้ได้แฮะ :) หากันวุ่นเลยกว่าจะออกมาได้ อย่าบอกนะว่ามี GUI สำหรับตั้งค่าอยู่ที่ไหน

Uncertainty in Hashset

เมื่อวาน บ.ก. Otto ทวงต้นฉบับ TryLinux ภาค 9 ว่าจะเขียนอยู่นี่แหละ แต่เปลี่ยนใจเอาเรื่องสั้นๆคาใจก่อนดีกว่า

ความแน่นอนของโปรแกรม ?

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

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

หรือกดปุ่ม "คำนวณ" ซ้ำอีก ในตัวโปรแกรมนั้น เมื่อกดปุ่มคำนวณ มันจะเรียก GenMap gm = new GenMap() ซึ่งเป็นการสร้างคลาสสำหรับคำนวณขึ้นมาใหม่ทุกครั้ง ไม่มีการใช้ตัวแปร static หรือเอาค่าใดๆจากการคำนวณครั้งที่แล้ว (gm ตัวเก่า) มาใช้เลย โดยโปรแกรมจะหยุดแสดงผลเมื่อเจอคำตอบแรก

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

ไอน์สไตน์ยังเคยพูดว่า "God does not play dice (with the universe)" !

Hashset คือตัวการ

ลองไล่ๆดู รู้สึกว่าจะเป็นเพราะการใช้ Hashset เก็บรูปแบบเหรียญที่เป็นไปได้ แล้วเลือกออกมาลองทีละอันด้วย iterator() ลำดับของรูปแบบที่ออกมาทาง iterator() เนี่ยแหละ มันเปลี่ยนไป ในการเรียกแต่ละครั้ง

ลองทดสอบดูง่ายๆ โดยตัดบางส่วนของโปรแกรมออกมาทำเป็นโปรแกรมทดสอบ สั้นๆ ดังนี้

for(int i=0;i<4;i++)
  (new TestHashset()).test();
โดยใน test() เขียนไว้ว่า
..
    Hashset hs = new Hashset();

    public void test() {
        addlist();
        printlist();
    }

    private void addlist() {
        int count = 2;
        int patcount = (int) (Math.pow(3, count));
        System.out.print("Add: ");
        for (int i = 1; i < patcount; i++) {
            CoinPattern cp = new CoinPattern(count);
            cp.setValue(i);
            hs.add(cp);
            System.out.print(cp+" ");
        }
        System.out.println("");
    }

    private void printlist() {
        System.out.print("Get: ");
        Iterator iter = hs.iterator();
        while (iter.hasNext()) {
            CoinPattern item = (CoinPattern)iter.next();
            System.out.print(item+" ");
        }
        System.out.println("");
        System.out.println("");
    }
ผลที่ได้ออกมาเป็น
Add: L- R- -L LL RL -R LR RR 
Get: -L R- LR RR RL L- -R LL 

Add: L- R- -L LL RL -R LR RR 
Get: R- -L L- RL RR LL LR -R 

Add: L- R- -L LL RL -R LR RR 
Get: -L RR LR R- RL LL L- -R 

Add: L- R- -L LL RL -R LR RR 
Get: LL LR -R RL -L R- L- RR 
คือ Add ลำดับเหมือนเดิมทุกครั้ง แต่ลำดับที่ออกมาแตกต่างกัน

ไม่รู้ข้างใน Hashset เขาเขียนไว้อย่างไร ลำดับใน iterator() จึงเปลี่ยนแปลงไปในการเรียกแต่ละครั้ง (หรือว่าขึ้นกับ เวลา/ตำแหน่งในหน่วยความจำ/ทอยลูกเต๋า ?)

โดยทั่วไป iterator() ก็คงไม่รับประกันลำดับของข้อมูลอยู่แล้ว และโปรแกรมก็ไม่ได้(และไม่ควร)เรียกร้องว่าลำดับต้องเหมือนเดิม กรณีนี้ก็ไม่ถือว่า Hashset ทำงานผิด แต่มันน่าสนใจ

Wednesday, November 17, 2004

WhichCoin: โปรแกรมแก้ปัญหาชั่ง n เหรียญ

Blog นี้ เป็นเรื่องราวต่อจาก ปัญหาชั่งก้อนหิน นั่งนึกดูดีๆ ก้อนหินขนาดพอดีๆกันคงไม่มี เปลี่ยนเป็นเหรียญน่าจะถูกต้องมากกว่า

ตอนที่แล้วจบที่ว่า ถ้าหากชั่ง k ครั้ง จำนวนเหรียญสูงสุดที่นำมาชั่งแล้วจะบอกได้ว่าเหรียญไหนมีน้ำหนักผิดปกติ และผิดปกติอย่างไร (หนักหรือเบา) คือ (3^k-1)/2 -1 เหรียญ แต่ไม่ได้พูดถึงว่าในหนังสือเขา คิดยังไง ?

เอามาสรุปใส่ BLOG สักครั้งก็ดี

การเขียนวิธีชั่ง

ยกตัวอย่างกรณีชั่งสองครั้ง จำนวนเหรียญ 3 เหรียญ วิธีชั่งอาจจะเขียนเป็นรูปแบบนี้

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

Trial #1
On  LEFT: 2  (1)
On RIGHT: 3  (1)
On TABLE: 1  (1)
------------------------
Trial #2
On  LEFT: 1  (1)
On RIGHT: 3  (1)
On TABLE: 2  (1)
------------------------
แล้วก็เอาผลการชั่งแต่ละครั้ง มาเปิดตารางตรวจผล
-L = HI 1
-R = LO 1
L- = HI 2
LL = LO 3
R- = LO 2
RR = HI 3
ในตาราง L คือเอียงซ้าย R คือเอียงขวา และ - คือไม่เอียง เช่น บรรทัดแรกบอกว่า ถ้าครั้งแรกไม่เอียง ครั้งที่สองเอียงซ้าย แสดงว่า เหรียญเบอร์ 1 หนัก (HI)

ในวิธีชั่งแบบเปิดตาราง จะเห็นว่า วิธีวางเหรียญในการชั่งครั้งที่สอง (1 อยู่ซ้าย 3 อยู่ขวา 2 อยู่บนโต๊ะ) จะไม่ขึ้นกับผลการชั่งครั้งแรกเลย คือ ไม่ว่าชั่งครั้งแรกจะออกมาเอียงเช่นใด ครั้งที่สองจะชั่งโดยวางแบบเดิม เพียงแต่ในภาพ อาจจะแทนเหรียญที่รู้แล้วว่าน้ำหนักปกติด้วย O จึงเห็นเป็น 1-O, O-3

ในกรณี 12 เหรียญ ก็เขียนแบบนี้ได้เหมือนกัน เช่น รูปวิธีชั่งนี้

เขียนเป็นตารางได้

Trial #1
On  LEFT: 7 9 10 11  (4)
On RIGHT: 3 5 8 12  (4)
On TABLE: 1 2 4 6  (4)
------------------------
Trial #2
On  LEFT: 1 3 9 12  (4)
On RIGHT: 4 6 8 10  (4)
On TABLE: 2 5 7 11  (4)
------------------------
Trial #3
On  LEFT: 2 5 6 11  (4)
On RIGHT: 3 4 8 10  (4)
On TABLE: 1 7 9 12  (4)
และจากผลการชั่ง เปิดตาราง
Results Lookup Table
--L = HI 2
--R = LO 2
-L- = HI 1
-LL = LO 4
-LR = LO 6
-R- = LO 1
-RL = HI 6
-RR = HI 4
L-- = HI 7
L-L = HI 11
L-R = LO 5
LL- = HI 9
LLL = LO 8
LR- = LO 12
LRL = LO 3
LRR = HI 10
R-- = LO 7
R-L = HI 5
R-R = LO 11
RL- = HI 12
RLL = LO 10
RLR = HI 3
RR- = LO 9
RRR = HI 8
รูปกับตาราง ก็คือ วิธีชั่งแบบเดียวกัน (ความจริงเอาข้อมูลจากตารางไปวาดรูป) การวางเหรียญในการชั่งครั้งที่ 2, 3 ไม่ได้ขึ้นกับผลการชั่งครั้งที่ 1, 2 ก่อนหน้าเลย เพียงแต่ในรูปจะวาดเหรียญที่รู้ว่ามีน้ำหนักปกติแล้ว ด้วย O และถ้าหากมี O ทั้งสองข้าง ก็เอาออกซะเป็นคู่ๆ ให้แลดูสะอาดตา เพราะไม่มีผลต่อผลการชั่ง

วิธีชั่ง คิดจากตาราง

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

--L = HI 2
--R = LO 2
ก็เพราะว่าเหรียญเบอร์ 2 วางไว้บน โต๊ะ-โต๊ะ-ซ้าย ในการชั่งครั้งที่ 1-2-3 ตามลำดับ ถ้าผลออกมาตรงกับการวางนี้ คือ เป็น --L ย่อมแสดงว่า เบอร์ 2 หนักกว่าปกติ และหากสลับ L กับ R ในทุกหลักให้หมด เป็น --R ผลก็ย่อมเป็นตรงข้าม คือ เบอร์ 2 เบากว่าปกติ

ถ้าดูของเบอร์ 3 ก็จะเหมือนกัน คือ เบอร์ 3 หนักเมื่อผลการชั่งเป็น RLR และเบาเมื่อ LRL เพราะว่าเบอร์ 3 ถูกวางบนตาชั่งฝั่ง ขวา-ซ้าย-ขวา

สรุปแล้ว ถ้าหากกำหนดวิธีการขึ้นตาชั่งสำหรับแต่ละเหรียญให้แตกต่างกัน ก็จะสามารถแยกแยะจากผลการชั่งที่ออกมาได้ว่า เหรียญใด มีน้ำหนักผิดปกติ และผิดปกติอย่างไร โจทย์ที่ให้หาวิธีการชั่งสำหรับ n เหรียญใน k ครั้ง ก็กลายเป็นโจทย์ให้เลือกวิธีขึ้นตาชั่ง n แบบ จากจำนวนรูปแบบทั้งหมด 3^k แบบ โดยจำนวนเหรียญสูงสุดที่เลือกได้ หาได้จาก

  • ในการชั่ง k ครั้ง รูปแบบวิธีการขึ้นตาชั่งจะมีทั้งหมด 3^k แบบ คือ ---, --L, --R, -L-, -LL, -LR, ..., RRR

  • ตัดรูปแบบที่ไม่ขึ้นตาชั่งเลยออกไป --- (เนื่องจากถ้าไม่ขึ้น จะไม่รู้ว่าหนักหรือเบา) เหลือรูปแบบที่เลือกใช้ได้ 3^k-1

  • ในจำนวนนี้ มีรูปแบบที่เป็นส่วนกลับ L/R ของกันและกันอยู่ เช่น -LR กับ -RL ซึ่งรูปแบบที่เป็นส่วนกลับของกันและกันนี้ จะต้องกำหนดให้กับเหรียญเดียวกัน จะได้แยกแยะได้ว่า หนัก หรือ เบา กว่าปกติ ดังนั้นจึงเหลือจำนวนรูปแบบที่เลือกสำหรับเหรียญได้ (3^k-1)/2 รูปแบบ ซึ่งหารสองลงตัวเนื่องจาก 3^k เป็นเลขคี่แน่นอน

  • ในแต่ละรูปแบบ จะมี k หลัก ซึ่งแต่ละหลักจะแทนการชั่ง 1 ครั้ง (ซ้ายสุดหรือขวาสุดจะเป็นครั้งแรกก็แล้วแต่จะเลือก) ในแต่ละหลักจำเป็นที่จะต้องเลือกให้มีจำนวน L เท่ากับจำนวน R (มิฉะนั้นตาชั่งจะเอียงเพราะจำนวนเหรียญแต่ละข้างไม่เท่ากัน)

    ในจำนวน (3^k-1)/2 = (3^k-3)/2+1 รูปแบบที่เหลือ หากเอามาหาร 3 จะได้ (3^(k-1)-1)/2+(1/3) คือ ใน L, R, - จะมีสองอันที่นับได้ (3^(k-1)-1)/2 และอีกอันนับได้ (3^(k-1)-1)/2+1 เนื่องจาก --- ถูกลบออกไปในตอนต้น - จึงต้องน้อยกว่า L, R แน่นอน ดังนั้นที่เกินมา +1 จึงต้องเป็นของ L หรือ R เท่านั้น

    ตรงนี้เลยต้องเอารูปแบบออกไปอีก 1 เพื่อลดจำนวน L หรือ R สุดท้ายจะเหลือ (3^k-1)/2-1 รูปแบบ ที่จำนวน L เท่ากับ R ในทุกๆหลัก (ในการชั่งทุกครั้ง) และไม่เป็นส่วนกลับ L/R ของกันและกัน

    แปลว่าจำนวนเหรียญสูงสุดที่ชั่งได้ คือ (3^k-1)/2-1 เหรียญ

วิธีชั่ง n เหรียญ

ในหนังสือไม่พิสูจน์ว่าจะสามารถเลือก n รูปแบบออกมาได้จริง เลยลองทำโปรแกรมมาทดสอบดู ให้โปรแกรมลองเลือก n รูปแบบจาก 3^k ดูว่าจะหา n รูปแบบที่เหมาะสมได้ที่ทุก n จริงหรือเปล่า

โปรแกรม WhichCoin: WhichCoin.jar

เมื่อรันโปรแกรมแล้ว ป้อนจำนวน n โปรแกรมจะคำนวณหาค่าจำนวนครั้งที่ชั่ง k ที่เหมาะสม และเลือก n รูปแบบ ที่เหมาะสม พร้อมแสดงตารางวิธีการชั่ง และตารางตรวจสอบผลการชั่ง

จากนั้นหากกดปุ่ม "วาดภาพ" โปรแกรมจะวาดวิธีการชั่ง เช่น ในกรณี n=5

เนื่องจากคำตอบมิได้มีเพียงคำตอบเดียว หากดปุ่ม คำนวณ ไปเรื่อยๆ อาจจะได้คำตอบที่แตกต่างออกมาอีก เช่น

ซึ่งแสดงให้เห็นว่า ในการชั่งครั้งแรก ไม่จำเป็นต้องวางเหรียญให้มากที่สุดเสมอไป

ถ้า k>4 ...

ถ้า k เป็น 5 จำนวน n จะถูกเลือกมาจาก 3^5-1 = 242 รูปแบบ ซึ่งกินเวลามาก ยังไม่เคยรอจนโปรแกรมทำงานเสร็จสักที สูงสุดที่เคยลองคือ n=13 และ n=39 ของ k=4 ทั้งคู่

กรณี n=13

กรณี n=39 (คลิกบนภาพจะได้ภาพเต็ม)

เลือก n=13,39 จาก 3^4-1=80 ก็พยายามใส่ไบ้+Optimize ไปแยะแล้ว ของ k>=5 ไว้ค่อยๆคิดจะเลือกยังไงให้ฉลาดขึ้น

แก้ไขเพิ่มเติม

เอาภาพหน้าจอมาแปะ (ข้างบน)

Tuesday, November 16, 2004

ล้างเครื่อง Windows ลง Cygwin

วันนี้ล้างเครื่อง Gateway (ยี่ห้อเครื่อง) ที่รับมาใช้ต่อ เดิมเป็น Windows XP ฝรั่ง เปลี่ยนให้เป็นญี่ปุ่น เพราะว่าใช้กับโปรแกรมที่เกี่ยวกับงานหลายโปรแกรมมีปัญหาเรื่องตัวอักษร เปลี่ยน Locale ฯลฯ ก็แก้ปัญหาได้บ้างไม่ได้บ้าง ที่สำคัญโปรแกรมญี่ปุ่นเก่ามากๆบางตัวเปิดขึ้นมาขนาดจอ Dialog เปลี่ยนไป ตำแหน่งปุ่มหรือช่องต่างๆเพี้ยนหมด

ตัดปัญหาล้างทิ้งลงใหม่หมดซะเลย

จากนั้นก็เริ่มติดตั้งเครื่องไม้เครื่องมือ ที่ขาดไม่ได้ก็ได้แก่ cygwin กับ wincvs เหมือนได้ Windows กับ Unix มารวมอยู่บนเครื่องเดียวกัน :)

ลำดับก็ต้องติดตั้ง cygwin ให้เสร็จก่อน จะได้มี ssh มาให้ wincvs ใช้ ปกติใช้ cvs จะเล่นผ่าน ssh ตลอด ยังไม่เคยใช้ pserver สักที

cygwin

ติดตั้งจาก cygwin ที่เคยดาวน์โหลดมาเก็บไว้ รุ่นวันที่ 20040308 เลือกเกือบทุกอย่าง เสร็จกินเนื้อที่ไปประมาณ 937MB ได้ไอคอน cygwin บน Desktop มาอันหนึ่ง ซึ่งเป็น shortcut ของ C:\cygwin\cygwin.bat อีกที

เนื่องจากเป็นชนกลุ่มน้อยที่ชอบ tcsh มากกว่า อันดับแรกก็ต้องเปลี่ยน shortcut นี่ให้เรียก tcsh แทน bash โดยแก้ไฟล์ C:\cygwin\cygwin.bat ตรงๆเลยให้เป็นแบบนี้

@echo off

C:
chdir C:\cygwin\bin

echo bash --login -i
tcsh -l
คือเอา bash ออกแล้วเรียก tcsh -l แทน จากนั้นก็แก้ใน /etc/passwd ให้เป็น /bin/tcsh ด้วย โปรแกรมพวก xterm จะได้ใช้ tcsh ตั้งแต่แรก

สุดท้ายก็ทดสอบ startx, latex ฯลฯ ดูเหมือนจะใช้ได้หมด ไม่มีปัญหา

WinCVS

ยังใช้รุ่นเก่ามาก ประมาณ 1.20 ติดตั้งเสร็จก็ต้องไปตั้งค่า CVSROOT และเลือกให้ใช้ ssh ของ CygWin ตามหน้าจอต่อไปนี้

ใส่ไฟล์ id_rsa เพราะขี้เกียจพิมพ์รหัสผ่านทุกครั้ง

TryLinux ภาค 8: หน้าจอ คีย์บอร์ด

สรุปเรื่องฟอนต์

หลังจากเอาฟอนต์จาก Windows มาใช้ หน้าตาของ TryLinux ก็ดูเริ่มคุ้นเคยขึ้น เช่น xterm ก็ใช้ Courier New หรือดูเว็บก็ใช้ Tahoma

แต่ยังรู้สึกว่าการทำ AntiAliasing ของ FreeType2 ยังสู้บน Windows ไม่ได้ ถ้าเปิด SubPixel Rendering จะเห็นว่าสีเหลื่อมชัดเจน พยายามเลือกหลายๆแบบ (RGB,BGA,etc) แล้วก็ไม่ดีขึ้น

ยังหาไม่เจอว่า SubPixel มีให้ปรับอะไรอีกไหม อยากปรับแบบ ClearType Tuner คือ ให้ตัวหนังสือออกมาดู หนา หรือ บาง ตามชอบใจได้อีก

ตอนเล่น FreeType ดูเหมือนจะมีค่า Gamma ให้เลือกด้วย แต่หาไม่เจอว่าสำหรับ Xft/fontconfig จะปรับ Gamma ยังไง

สรุปบน TryLinux เลยเปิด AntiAliasing+Hint เฉยๆ ไม่เปิด SubPixel

หน้าจอ TryLinux เลยออกมาคล้ายๆบน Mac OS X คือ สวยเนียนแบบเบลอๆ ส่วนตัวแล้วชอบของ Windows มากกว่า โดยเฉพาะตัวคันจิภาษาญี่ปุ่น OSX มันเล่นเอะอะอะไรก็ Anti-Aliasing ตัวอักษรขนาดปกติถึงขนาดเล็กจึงดูออกเบลอๆมากกว่าสวย สงสัย OSX ไม่มีบิตแมพสำหรับตัวอักษรขนาดเล็กฝังไว้ ?

ป้อนข้อมูล: Keyboard Layout

เล่นมาตั้งนานยังไม่รู้ว่าป้อนภาษาไทยยังไง รู้แต่ว่าใน xiterm กด Ctrl+Space ได้ ส่วนใน KDE นั้น Otto บอกว่าตั้งไว้ที่ F12 กดๆดูแล้วไม่มีอะไรเกิดขึ้น ลองใช้เมาส์ไปกดตรงรูปธงชาติที่ Taskbar เลือกภาษาเอา

ลองกดเมาส์ขวาบนธงชาติ มีเมนู Configure... เลือกแล้วมีหน้าจอขึ้นมาว่า "Configre - Keyboard Layout" ดูเหมือนจะมาถูกที่ ข้างในก็มี Tab สามอัน คือ "Layout", "Switching Options", "Xkb Options" อันกลางน่าจะใช่ที่สุด แต่หาหมดทั้งสามอัน ก็ไม่มีตัวเลือกว่าจะตั้งปุ่มสลับภาษา (Layout) ได้ยังไง ! สรุปว่า มาผิดที่

สุดท้าย Otto บอกว่าต้องไปเปิดมาจาก Control Center แล้วเลือก "Keyboard Shortcuts" (อยู่ใกล้ๆกับ "Keyboard Layout" เมื่อกี้แหละ) ข้างในมี Tab มากมาย อันที่ต้องการอยู่ใน "Shortcut Schemes" - "Global Shortcuts" แล้วก็ Scroll ลงไปล่างสุดๆ จนเจอ "Switch to Next Keyboard Layout" ถูกตั้งอยู่ที่ค่าปกติ คือ Alt+Ctrl+K

สงสัยจะถูกเปลี่ยนจาก F12 ที่ Otto ตั้งไว้ กลับเป็นค่าปกตินี้ตอน Upgrade KDE

Keyboard Map

ความวุ่นวายเรื่องคีย์บอร์ดยังไม่หมดสิ้น สังเกตว่าในโปรแกรม OfficeTLE ขณะที่ Layout เป็น ไทย อยู่ สามารถเปลี่ยนภาษาไทย/อังกฤษได้โดยกด Alt+Shift ! แต่ไม่มีไอคอน หรือเครื่องหมายใดๆ บอกถึงสถานะปัจจุบันบนจอ

Otto บอกว่า เป็นเพราะ Thai Layout นั้นมันมี Map สองอัน ภาษาไทยกับอังกฤษ ว่างั้นเถอะ

  • ไอ้ปุ่ม Alt+Ctrl+K เมื่อกี้เอาไว้เลือก Layout ที่ติดตั้งไว้

  • ถ้าหากอยู่ใน Thai Layout ยังสามารถใช้ Alt+Shift เลือก Map ไทย หรือ อังกฤษ ได้อีก คือ ใน Thai Layout ก็ยังพิมพ์อังกฤษได้
ข้อดีของการมี 2 Map ใน Thai Layout คือ สามารถกด Ctrl+C, Ctrl+V ฯลฯ ได้ใน Thai Layout มิฉะนั้นจะต้องสลับกลับไปที่ Layout อังกฤษก่อน Ctrl+C จึงจะใช้งานได้

เดี๋ยวต้องไปเอา Layout ฝรั่งออก ใช้แต่ Thai Layout แล้วก็สลับภาษาด้วยปุ่ม Alt+Shift ก็แล้วกัน เพราะดูในช่อง Command ที่ KDE เรียกใช้เมื่อเลือกแต่ละ Layout แล้ว Thai Layout มันก็เป็น SuperSet ของ Layout ฝรั่ง คือ

US Layout: setxkbmap -model pc105 -layout us
TH Layout: setxkbmap -model pc105 -layout us,th -variant ,basic
เพราะฉะนั้นใช้แค่ TH Layout อย่างเดียวก็พอ พอเหลืออันเดียว รูปธงชาติบน Taskbar ก็หายไป ได้เนื้อที่ขึ้นมาอีก สงสัยว่า Xkb ทำไมถึงใช้ปุ่ม Shift+Alt เพื่อสลับภาษา ไปเจอคำตอบในไฟล์ /etc/X11/XF86Config-4 มีเขียนอยู่ว่า
Option "XkbOptions" "grp:alt_shift_toggle,grp_led:scroll"
บรรทัดนี้บอกด้วยว่า ดูภาษาที่ใช้อยู่ตอนนี้ได้จากไฟ Scroll ลองดูแล้ว ถ้าไฟติดเป็นภาษาไทย ไฟดับเป็นภาษาอังกฤษ

เครื่องพิมพ์

เปลี่ยนใจ รอไว้เขียนต่อใน TryLinux-9

Sunday, November 14, 2004

เอาฟอนต์ Garuda ไปใช้กับ SimpleThai/มือถือ

ความเป็นมา

เดี๋ยวนี้หน้าจอมือถือมีความละเอียดสูงขึ้นเรื่อยๆ ขนาดจอไม่ได้โตขึ้น แต่จุดมันเล็กลง น่าจะประมาณ 200DPI ได้แล้วมั้ง (ขนาดจอ LCD ปกติจะ ~ 100DPI, ของ Windows XP ค่า Default จะเป็น 96DPI)

ก่อให้เกิดปัญหาคือโปรแกรม SimpleThai ใช้ฟอนต์ Bitmap ทีฝังเอาไว้ ขนาดตัวอักษรก็เลยเหลือตัวนิดเดียว อ่านสักพักแล้วเวียนหัว

ตอนเริ่มทำจอมันประมาณ 160x120 (ดูรูป) แต่เดี๋ยวนี้เครื่องถูกๆไม่กี่พันเยนก็ได้จอ QVGA 320x240 กันหมดแล้ว คิดง่ายๆ ตัวหนังสือก็เตี้ยลงเหลือครึ่งหนึ่ง

สมัยที่จอยังหยาบ พยายามเลือกฟอนต์ที่เล็กที่สุด จะได้แสดงภาษาไทยได้หลายบรรทัด สุดท้ายลงเอยด้วยฟอนต์ไพศาล

บนจอร้อยกว่าคูณร้อยกว่าของโทรศัพท์รุ่นเก่าหน่อยกำลังอ่านได้ดี

แก้สำหรับ J-Phone

ใช้จอ QVGA เครื่องแรกเป็น J-Phone รุ่นที่เล่นเกมส์แข่งรถ 3D ได้ ตอนนั้นเอาฟอนต์ Norasi มาใช้ โดยดึงมาทาง XFS

ออกเป็น SimpleThai-HiRes สำหรับผู้ใช้ J-Phone ตัวอักษรโตขึ้น แต่ดูๆแล้วไม่สวยเท่าไร วรรณยุกต์ก็ลอยละลิ่ว คิดว่าว่างๆอยากจะทำใหม่ให้มันมี Anti-Aliasing สักหน่อย

ใช้ FreeType

จนไม่กี่วันก่อนมาเล่น FreeType เอาโปรแกรมตัวอย่างใน FreeType 2 Tutorial มาดัดแปลง ให้มันวาดฟอนต์ออกมาในแบบที่ SimpleThai เอาไปใช้ได้เลย พร้อมข้อมูลเกี่ยวกับตัวอักษรต่างๆที่จำเป็นออกมาเป็น .java เลือกใช้ Hint และ AntiAliasing แบบต่างๆได้

พอดีกับ Otto ทำโทรศัพท์ตกเจ๊ง ไปซื้อเครื่องใหม่ QVGA มาเหมือนกัน บอกว่าอยากได้ Garuda ก็เลยทำออกมาชุดแรก 16pt@100DPI

เปิดดูบนเครื่อง Otto ก็ได้แบบนี้ มี Anti-Aliasing แล้วดูดีขึ้นเยอะเลยแฮะ แต่วรรณยุกต์ยังไม่ได้แก้

จะเอามาใส่ Docomo ที่ใช้อยู่บ้าง แต่คงต้องแก้อีกเยอะเพราะ Docomo จำกัดขนาดของ JAR เอาไว้เล็กกว่า AU ใส่ฟอนต์ Garuda แบบมี Anti-Aliasing นี่ลงไปเลยไม่ได้ ต้องแก้ให้โหลดจากเน็ตมาทีหลังแทน

Saturday, November 13, 2004

Facts About Using Banknote Images

Facts About Using Banknote Images

ไปเจอโฮมเพจนี้ เพราะดันเอาธนบัตร 1000 เยน รุ่นใหม่ เพิ่งออกไม่กี่สัปดาห์ก่อนใส่เครื่องแสกน จะเก็บไว้เป็นที่ระลึก เคยได้ยินมานานแล้วว่าโปรแกรมประมวลภาพหลายตัวจะป้องกันไม่ให้ประมวลภาพที่เกี่ยวกับธนบัตรได้ เพิ่งเจอเข้ากับตัวเองก็วันนี้

เท่าที่ทดสอบ

  • การตรวจสอบอยู่ที่ตัวโปรแกรม ไดรเวอร์หรือฮาร์ดแวร์ของแสกนเนอร์ที่ใช้ ไม่ตรวจอะไรเลย
  • จากที่ทดลองใข้ 4 โปรแกรม สองโปรแกรม แสกนไม่ได้ อีกสองโปรแกรม แสกนได้
  • เลือกให้ไดรเวอร์ (TWAIN) แสกนเป็นภาพขาวดำ ก็ยังไม่ยอม
  • หมุนภาพ 90 หรือประมาณ 30 องศาก็ยังไม่ยอม
  • ลดความละเอียดให้ต่ำมากๆ เช่น 50 DPI จะแสกนได้เป็นบางครั้ง/บางมุม ครั้งที่แสกนได้บางทีก็ Save ไม่ได้
  • พยายามหาว่ารหัสลับ อยู่ตรงไหน โดยแสกนเป็นส่วนๆ แบ่งออกเป็น 4 ส่วน ปรากฏว่า รหัสลับ มีอยู่ในทุกส่วน แสกนไม่ได้เลย
  • ลดขนาดเนื้อที่แสกนให้เล็กลงอีก ประมาณเท่าใบหน้ารูปในธนบัตร จึงจะเริ่มแสกนได้เป็นบางส่วน เช่น ตรงใบหน้าแสกนได้ แต่รอบๆก็มีได้บ้างไม่ได้บ้าง
  • ธนบัตร 1000 เยนรุ่นเก่า แสกนได้ไม่มีปัญหา

ทดสอบตัดคำไทยด้วย ICU4J 3.0

Post นี้ตัดคำไว้ให้แล้ว

ไปเห็นว่า ICU (International Components for Unicode) ของ IBM รุ่นล่าสุด 3.0 บนเว็บ อาจจะตัดคำไทยได้ดีกว่ารุ่นที่ฝังอยู่ใน Java VM โดยเขาเขียนไว้ว่า ความสามารถใหม่ของ 3.0 ข้อหนึ่ง คือ

Enhanced Word-Break Detection – Rule-based, supports Thai 
ก็เลยเอามาลองดูสักหน่อย จะเอามาแค่ .jar ก็ได้ แต่เนื่องจากโปรแกรมสาธิต (Demo) จะมีอยู่เฉพาะใน src ตกลงก็เลยเอามา Build เอง บนเครื่อง Linux ที่มี Java/Ant พร้อมอยู่แล้ว
$ mkdir XXX; cd XXX
$ wget ftp://www-126.ibm.com/pub/icu4j/3.0/icu4jsrc_3_0.jar
$ jar xf icu4jsrc_3_0.jar
$ ant all

all:
...
...
BUILD SUCCESSFUL
Total time: 42 seconds
เสร็จแล้วก็ทดสอบโดย
java -classpath ./classes 
     -DUnicodeData=./src/com/ibm/icu/dev/data/unicode 
     com.ibm.icu.dev.test.TestAll -nothrow
หน้าจอจะขึ้น ผ่าน ผ่าน ผ่าน (passed) เต็มไปหมด ไฟล์ที่ได้ตอนนี้มี
APIChangeReport.html  META-INF/  build.xml  classes/  doc/  
icu4j.jar  license.html  readme.html  src/
ยังไม่มี richedit ที่พูดถึงใน UserGuide แฮะ แปลกใจทำไม ant all ไม่ all จริง ต้องสั่งเพิ่มโดย
ant richeditJar
ก็จะได้ไฟล์มากขึ้นมาอีกหน่อย
APIChangeReport.html  META-INF/  build.xml  classes/  doc/  icu4j.jar  
license.html  readme.html  richedit/  src/
UserGuide บอกว่ามีโปรแกรมทดสอบตัดคำมาให้แล้วด้วย เรียกใช้ได้โดย
java -classpath classes com.ibm.icu.dev.demo.rbbi.TextBoundDemo
เขาบอกให้กด ctrl+P กับ ctrl+N เพื่อกระโดดไปมาระหว่างคำก่อนหน้ากับคำถัดไป ลองดูบน Windows ด้วย Java 1.5.0 กดเท่าไรก็ไม่มีอะไรเกิดขึ้น โปรแกรมเจ๊งหรือไงไม่รู้

เล่นโปรแกรมทดสอบไม่ได้ ก็เอาโปรแกรมเดิมที่เคยทำไว้ (อยู่ใน BLOG ตัดคำไทย ด้วย Java) มาแก้ให้ใช้ ICU4J นี่ดูก็แล้วกัน

เนื่องจาก API เหมือนเดิม ดูเหมือนจะไม่ต้องแก้มาก แค่เปลี่ยนบรรทัดตรงหัวบรรทัดเดียว ให้ใช้ BreakIterator จาก ICU ก็พอ (จาก java.text.BreakIterator เป็น com.ibm.icu.text.BreakIterator)

// import java.text.*;  
import com.ibm.icu.text.BreakIterator;
จากนั้นก็ดูผลที่ได้

เมื่อตัดด้วย ICU4J 3.0

เมื่อตัดด้วย Java VM เอง 1.5.0

ชอบของ Java VM เดิมๆมากกว่า อันใหม่จาก ICU4J 3.0 ตัดถี่เกินไป

Wednesday, November 10, 2004

อัด/เล่น MP3 บน Fedora Core I

Post นี้ตัดคำไว้ให้แล้ว

ตอนนี้เลยมี Linux อยู่สองเครื่อง คือ TryLinux ติดตั้ง KNOPPIX-TH ของ Otto เอาไว้ กับ Crusoe ซึ่งวันก่อนเอามาลง FC1 (Fedora Core I) เพราะใช้ Windows แล้วอืดมาก ใน Linux ก็ใช้แค่ xinit ไม่กล้าเรียก GNOME/KDE

หลายวันก่อนพยายามจะฟังเพลง MP3 ด้วย Crusoe ลองใช้ xmms และ rhythmbox เปิดไฟล์ MP3 ดู มันทั้งสองก็นิ่งไปเฉยๆ เหมือนไฟล์เราเจ๊งหรือมีปัญหาอะไรก็ไม่พูดออกมา ลองเอาไฟล์ MP3 อื่นมาลองก็เหมือนเดิม

ปล่อยให้เดาอยู่จนต้องไปถามเว็บ ได้ความว่า MP3 ติดปัญหาเรื่องสิทธิบัตร ฯลฯ (อีกแล้ว) ต้องไปเอา Library สำหรับ เล่น/อัด มาลงด้วยตนเอง

สรุป คือ ถ้าจะเล่น MP3 ก็ต้องมี libMAD แต่ถ้าจะอัด MP3 ก็ต้องมี libLAME ไม่รู้ใครตั้งชื่อก่อนกัน เข้ากันเป็นปี่เป็นขลุ่ย

ใน FC1 สามารถติดตั้ง MAD/LAME ทั้งสองได้โดยใช้ yum โดยก่อนอื่นต้องไปเพิ่มบรรทัดเหล่านี้ใน /etc/yum.conf

[livna-stable]
name=Livna.org Fedora Compatible Packages (stable)
baseurl= http://rpm.livna.org/fedora/$releasever/$basearch/yum/stable
# gpgcheck=1

[livna-unstable]
name=Livna.org Fedora Compatible Packages (unstable)
baseurl=http://rpm.livna.org/fedora/$releasever/$basearch/yum/unstable
# gpgcheck=1

[livna-testing]
name=Livna.org Fedora Compatible Packages (testing)
baseurl=http://rpm.livna.org/fedora/$releasever/$basearch/yum/testing
# gpgcheck=1
ตรงบรรทัด # gpgcheck=1 นั้นใส่ # เพื่อเอาออกไปเอง มิฉะนั้นมันจะบ่นว่าตรวจ GPG ฯลฯ ไม่ได้ และดาวน์โหลมาเฉยๆ ไม่ยอมติดตั้งให้

แก้ /etc/yum.conf เสร็จ ก็สั่ง yum list ดูว่าชื่อจริงของแพเกจ LAME/MAD ชื่ออะไร เจอแล้วก็สั่งติดตั้งโดย

yum install lame lame-devel 
yum install libmad libmad-devel
แค่นี้ก็ฟังเพลง MP3 ด้วย xmms/rhythmbox ได้ แต่ลองใช้คำสั่ง play xxx.mp3 เพื่อฟังจาก command-line (sox) แบบไม่มี X11 ดู ปรากฏว่ายังเล่นไม่ได้ ต้องเอา sox มาคอมไพล์ใหม่ ให้มันรู้ว่าตอนนี้มี lame/mad แล้วนะ

อันนี้ไม่ได้พึ่งพา yum อีก แต่เอา source มาเลย แล้วก็สั่ง

./configure
make
make install
ตามปกติ

ตกลงในเครื่องเลยมี sox สองชุด อันใหม่ที่เพิ่งคอมไพล์เองจะอยู่ใต้ /usr/local ตรวจดู PATH ให้ /usr/local มาก่อนก็เป็นอันใช้ได้

เวลาเล่นจาก command-line ปรับระดับเสียงลำบากหน่อยนึง ใช้คำสั่ง aumix ปรับต่างหาก ปกติก็ใช้

aumix -w70 -v70
หรือถ้าเรียก aumix เฉยๆ ก็มีหน้าจอเลอะเทอะๆขึ้นมาให้ปรับโน่นนี่เต็มไปหมด

ลองเล่นดู sox ก็มีอะไรหลายอย่างให้เล่นสนุกดี เช่น

  • rec -v40 hui.mp3: อัดเสียงใส่ไฟล์ hui.mp3

  • play hui.mp3: เล่นไฟล์ hui.mp3

  • play hui.mp3 speed 2: เล่นไฟล์ hui.mp3 ความเร็วสองเท่า (เสียงเพี้ยนสูงขึ้น)

  • play hui.mp3 stretch 0.5: เล่นไฟล์ hui.mp3 ความเร็วสองเท่า (เสียงปกติ ไม่เพี้ยนสูงขึ้น)

Tuesday, November 09, 2004

ภาพเคลื่อนไหวเปรียบเทียบตัวอักษร

ใช้คำสั่ง ftview -r 96 9 .fonts/arial.ttf กด space จนได้แสดงผลแบบนี้ แล้วจับหน้าจอมาทำภาพเคลื่อนไหว

เปิด/ปิด Hint

ใช้ปุ่ม h เพื่อเปิดปิด Hint

เปิด/ปิด Hint มี Anti-Aliasing

กด a เพื่อเปิด Anti-Aliasing แล้วใช้ปุ่ม h เพื่อเปิดปิด Hint

เปิด Hint เลือก Anti-Aliasing หลายแบบ

กด L เลือก Subpixel แบบต่างๆ (Horizontal/Vertical RGB/BGR)

TryLinux ภาค 7: คอมไพล์ FreeType

Post นี้ตัดคำไว้ให้แล้ว

ต่อจาก TryLinux 6 เรื่องแสดงผลฟอนต์ Arial แบบไม่ใช้ Anti-Aliasing ได้ไม่สวยเท่า Windows คิดว่า Arial คงไม่มี Bitmap ฝังอยู่ เพราะต่างกับฟอนต์ญี่ปุ่นตรงที่เปิด ClearType ได้ (พวกที่เอา Bitmap มาทแทนขนาดเล็กจะไม่มี ClearType ที่ขนาดเล็กเหล่านั้น)

ดังนั้นที่ตัวอักษรออกมาดูสวย/น่าเกลียด น่าจะอยู่ที่ฝีมือในการวาด TrueType เนื่องจาก FreeType บอกว่าปกติแล้วจะไม่เปิดใช้ BYTECODE INTERPRETER สำหรับทำ Hint เนื่องจากติดสิทธิบัตรของ Apple ถ้าอยากจะใช้ต้องไปเปิดแล้วคอมไพล์ใหม่

วันนี้ก็เลยจะลองดู ทำตามคำอธิบายใน Basics of the Debian package management system เริ่มจากเอา Source ของ FreeType มาก่อน

apt-get source libfreetype6
apt-get build-dep libfreetype6
จะได้ไฟล์เหล่านี้มา
freetype_2.1.7-2.2.diff.gz  
freetype_2.1.7-2.2.dsc  
freetype_2.1.7.orig.tar.gz
และอีกหนึ่งโฟลเดอร์ freetype-2.1.7 ซึ่งดูเหมือนถ้าไม่มีสามารถสร้างได้โดย
dpkg-source -x freetype_2.1.7-2.2.dsc  
จากนั้นก็ cd เข้าไปใน freetype-2.1.7 แล้วลองให้คอมไพล์+สร้าง Package ดู
cd freetype-2.1.7
dpkg-buildpackage -rfakeroot -b
ก็จะได้ไฟล์ *deb ออกมามากมายเหนือโฟลเดอร์ปัจจุบันขั้นหนึ่ง
../freetype2-demos_2.1.7-2.2_i386.deb  ../libfreetype6-dev_2.1.7-2.2_i386.deb
../libfreetype6_2.1.7-2.2_i386.deb     ../libfreetype6-udeb_2.1.7-2.2_i386.udeb
ไม่แน่ใจว่าไฟล์เหล่านี้คอมไพล์โดยเปิด Hint แล้วหรือยัง ลองดูใน docs/PATENT เขาบอกให้ไปอ่าน docs/INSTALL ซึ่งบอกให้ไปอ่าน docs/TRUETYPE อีกที หลายต่อ(โว้ย)

เขาบอกให้ไปเปิดไฟล์ include/freetype/config/ftoption.h แล้ว หาบทัดที่ #define ค่า TT_CONFIG_OPTION_BYTECODE_INTERPRETER ถ้าหากว่า #undef อยู่ ก็ให้แก้เป็น #define ลองเปิดดูแล้ว เจอว่า


  /*   Do not #undef this macro here, since the build system might         */
  /*   define it for certain configurations only.                          */
  /*                                                                       */
#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER
ดูเหมือนว่าจะ #define เอาไว้อยู่แล้ว และบรรทัดข้างล่างก็มีบอกว่า
#define TT_CONFIG_OPTION_UNPATENTED_HINTING
แปลว่ามีวิธี Hint ที่ไม่ติด Patent แล้วก็เลยเปิดไว้ตลอด ?

แต่ติดใจตรง Comment ข้างบนว่าอย่า #undef ตรงนี้ ! แปลว่าตรงนี้จะ #define ทิ้งไว้ตลอด ?

แล้วทำไมในไฟล์ docs/TRUETYPE บอกให้มาดูตรงนี้ ?

ค้นไปค้นมาสรุว่า ในไฟล์ docs/CHANGES บอกว่า BYTECODE INTERPRETER ถูกปิดไปในรุ่น 2.0.2 ซึ่งถ้าดูในไฟล์ ChangeLog ก็ตรงกับวันที่ 2001-03-24

เอกสาร docs/TRUETYPE (ไม่รู้แก้ไขเมื่อไรแต่วันที่ของไฟล์คือ 2003/4) บอกให้ไปแก้ include/freetype/config/ftoption.h ก็น่าจะถูกต้อง

ตกลงตอนนี้มันใช้ BYTECODE INTERPRETER หรือเปล่าและถ้าจะใช้ต้องแก้ตรงไหนก็ไม่รู้ ไม่รู้จะไปอ่านอะไรอีก

ลองไปดูในไฟล์ debian/rules

...
        # Turn on bytecode interpreter, but use unpatented hinting
        # and forces its use.  Many thanks to Graham Asher for this great
        # feature to circumvent bad Apple's patent.  :-p
        patch -p0 -i $(patchdir)/030-bytecode-interpreter.diff
        #patch -p0 -i $(patchdir)/031-compile-unpatented-hinting.diff
        #patch -p0 -i $(patchdir)/032-force-unpatented-hinting.diff
...
ค่อยยังชั่วหน่อย เจออะไรให้ลองเปลี่ยนดูแล้ว

ลองเข้าไปดู patches/030-bytecode-interpreter.diff แล้วก็เข้าใจว่าทำไมเขาถึงบอกว่าอย่า #undef ข้างบน เพราะของเดิมมันแค่ /* .. */ เอาไว้

-/* #define  TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
+#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER
แสดงว่าไฟล์ docs/TRUETYPE ก็ไม่ได้ล้าสมัยมาก ผิดที่บอกว่าให้แก้ #undef เป็น #define เพราะของเดิมเป็น /* .. */

ลองดูในไฟล์ 031-compile-unpatented-hinting.diff ดูเหมือนจะเกี่ยวกับตัวเลือก TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING ซึ่งไม่มีใน include/freetype/config/ftoption.h ของ Freetype-2.1.7 แล้ว ตกลงอันนี้เลยไม่เกี่ยว

ในอีกไฟล์ 032-force-unpatented-hinting.diff ก็ไปตั้งตัวแปร TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING ไม่มีใน include/freetype/config/ftoption.h อีกเหมือนกัน

สรุปว่า Freetype2 ของ Debian มันใช้ Hint เท่าที่จะทำได้อยู่แล้ว ?

ไหนก็อุตส่าห์คอมไพล์แล้ว ลองให้มันใช้อันที่เพิ่งคอมไพล์เสร็จ

TryLinux:/home/vuthi/temp# dpkg -i ../libfreetype6_2.1.7-2.2_i386.deb 
(Reading database ... 129063 files and directories currently installed.)
Preparing to replace libfreetype6 2.1.7-2.2 (using .../libfreetype6_2.1.7-2.2_i386.deb) ...
Unpacking replacement libfreetype6 ...
Setting up libfreetype6 (2.1.7-2.2) ...
ปิด Anti-Aliasing แล้วเรียก xterm -fa Arial -fs 12 ตัวอักษรที่ได้ยังน่าเกลียดเหมือนเดิม ไม่มีอะไรดีขึ้น หรือว่า FreeType ยังทำ Hint ของ TrueType ไม่ครบ หรือว่า Windows มันทำอะไรเป็นพิเศษ ?

ยังติดใจหน่อยนึงตรง TT_CONFIG_OPTION_UNPATENTED_HINTING เขาบอกให้เลือกใช้ตอน runtime


  /* Define TT_CONFIG_OPTION_UNPATENTED_HINTING (in addition to            */
  /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER) to compile the unpatented      */
  /* work-around hinting system.  Note that for the moment, the algorithm  */
  /* is only used when selected at runtime through the parameter tag       */
  /* FT_PARAM_TAG_UNPATENTED_HINTING; or when the debug hook               */
  /* FT_DEBUG_HOOK_UNPATENTED_HINTING is globally actived                  */
ไม่รู้เหมือนกันว่าจะไปเลือกยังไง

เพิ่มเติม: FreeType ไม่ได้แย่

ไหนก็ได้ freetype2-demos_2.1.7-2.2_i386.deb มาแล้ว ลองติดตั้งดู พบว่ามีโปรแกรมสนุกหลายโปรแกรมให้ลองเล่น

เช่น ftstring -r 96 -m 'T r y L i n u x' 12 /usr/share/fonts/truetype/msttcorefonts/Arial แล้วกด a/h เพื่อเปิด/ปิด Anti-Aliasing กับ Hint ได้ผลดังนี้


ไม่มี Hint

มี Hint

มี Hint+Anti-Aliasing

ออกมาสวยใช้ได้เลยแหละ ยังแปลกใจว่าทำไม xterm ไม่สวยแบบนี้ ต้องไปตั้งค่าตัวเลือก Xft/fontconfig อะไรตรงไหนหรือเปล่า ?

Firefox 1.0 Coming Today ?

Post นี้ตัดคำไว้ให้แล้ว

ไปเห็นมาจากเว็บของ Firefox

ความจริงที่ญี่ปุ่น ตอนนี้ก็เช้าของวันที่ 9 พฤศจิกายน แล้ว สงสัยต้องรอถึงวันที่ 10 เวลาเดินเร็วกว่าเขานี่ดีอยู่อย่างหนึ่ง คือ ตอนส่ง Paper รู้สึกเหมือนได้ส่งช้ากว่า Deadline หน่อยนึง

The Wait is Over

เมื่อกี้สามทุ่มพอดี ไปดาวน์โหลมาแล้ว กำลังลอง

Monday, November 08, 2004

TryLinux ภาค 6: วาดอักษรให้สวย

Post นี้ตัดคำไว้ให้แล้ว

เปิดปิด Anti-aliasing/Subpixel

เท่าที่ลองเล่นดู ในไฟล์ ~/.fonts.conf มีคำสั่งที่เกี่ยวกับการเปิดปิด Anti-aliasing คือ

 <match target="font" >
  <edit mode="assign" name="antialias" >
   <bool>true</bool>
  </edit>
 </match>
ถ้าไม่ต้องการ Anti-aliasing ก็เปลี่ยนเป็น false

แปลกใจว่าถ้าหากใช้ Control Center ของ KDE (ของ Knoppix-TH) แก้ไขตัวเลือก Anti-Aliasing มันจะเขียนทับไฟล์ ~/.fonts.conf นี้ และจะไม่มี หัวข้อ antialias นี้ (คือเอาออกไปเลยทั้งยวง) ยังหาไม่เจอเหมือนกันว่า KDE ไป เปิด/ปิด Anti-Aliasing ที่ไหน ลองดูใต้ /etc/fonts/... แล้วก็ไม่เห็นมีไฟล์ไหนพูดถึง antialias

หลังจากที่แก้ไฟล์ ~/.fonts.conf เสร็จแล้วสามารถเรียก xterm -fa ... ทดสอบดูได้เลย เห็นผลทันตา

และหากต้องการเลือกว่าจะใช้ Subpixel หรือไม่ ต้องไปแก้ที่

 <match target="font" >
  <edit mode="assign" name="rgba" >
   <const>rgb</const>
  </edit>
 </match>
ถ้าไม่เอา Subpixel ก็เปลี่ยนตรง rgb เป็น none และถ้าหากใช้ Control Center ของ KDE แก้ไขตัวเลือก Subpixel มันจะเขียนทับไฟล์ ~/.fonts.conf โดยจะลบหัวข้อ rgba นี้ ออกไปทั้งหัวข้อเลยเหมือนกัน ทำให้โปรแกรมต่างๆจะใช้การตั้งค่า rgba ที่อยู่ใน /etc/fonts/local.conf แทน (ซึ่งกำหนดไว้ว่า rgb)

นี่คงเป็นสาเหตุที่ก่อนหน้านี้ ไม่สามารถใช้ Anti-Aliasing แบบธรรมดาใน KNOPPIX-TH นี้ได้ คือ เปิดปิด Subpixel อย่างไรก็ไม่มีผล มันจะใช้แต่ Subpixel ตลอด เพราะว่าในไฟล์ /etc/fonts/local.conf ระบุไว้เช่นนั้น

เปิด/ปิด Hint แบบต่างๆ

วันก่อนเขียนเป็นการบ้านไว้ว่า จะลองคอมไพล์ FreeType ดูใหม่เพื่อเปิดการใช้ Hint ตอนนี้ไม่แน่ใจว่ามันเปิดอยู่แล้วหรือเปล่า ? เพราะลองแก้ตัวแปรเกี่ยวกับ Hint ใน ~/.fonts.conf แล้ว มันก็เหมือนจะได้ผล

ก่อนจะทดสอบ เปิด/ปิด Hint ต้องไปปิด Anti-Aliasing ก่อน มิฉะนั้นผลจะเห็นไม่ชัด

 <match target="font" >
  <edit mode="assign" name="antialias" >
   <bool>false</bool>
  </edit>
 </match>
จากนั้นก็ลองเปิดปิด Hint ดู โดยแก้ที่
 <match target="font" >
  <edit mode="assign" name="hinting" >
   <bool>true</bool>
  </edit>
 </match>
ลองเปลี่ยนเป็น false แล้วเปรียบเทียบกัน จะเห็นได้ชัดว่าไม่มี Hint แล้วความหนาของเส้นจะหนาบ้างบางบ้าง ดูน่าเกลียด (ทดสอบด้วยคำสั่ง xterm -fa 'Arial' -fn 12)


ไม่มี Hint


มี Hint

ในกรณีของ มี Hint ตรงตัว T กับ L จะไม่หนาเกินไป คือ หนาพอดีเท่ากับ i แต่ในทั้งสองรูป ตัว n กับ u ยังดูน่าเกลียดอยู่ ในตัวเลือกเกี่ยวกับ Hint ยังมี hintstyle ให้เลือกเป็น hintmedium, hintfull, ... อีกด้วย ลองเลือกดูแล้วได้ผลออกมาไม่ต่างกัน (ในกรณีรูปนี้)

 <match target="font" >
  <edit mode="assign" name="hintstyle" >
   <const>hintmedium</const>
  </edit>
 </match>
สงสัยถ้าอยากได้ n กับ u ที่สวยกว่านี้ ต้องลองเอา FreeType มาคอมไพล์ใหม่ดูจริงๆ ? ลองเปรียบเทียบกับ WindowsXP ดู เลือกใช้ฟอนต์ Arial เหมือนกัน ขนาด 12pt เท่ากัน ได้ออกมาสวยงาม

ยังไม่ขอยืนยันว่า WindowsXP วาดเก่งกว่า เพราะไม่แน่ใจว่าใน Arial.ttf จะมีบิแมพฝังอยู่หรือเปล่า (ปกติฟอนต์ญี่ปุ่น .ttc มักมีบิแมพฝังอยู่สำหรับแสดงผลเมื่อเลือกใช้ขนาดเล็กๆ [1]) แต่ถึงจะฝังอยู่ FreeType ก็น่าจะเอาออกมาใช้ได้เหมือนกัน ?

ใช้ Anti-Aliasing แล้วยังจำเป็นต้อง Hint ?

ความจำเป็นของ Hint ดูเหมือนจะลดน้อยลง เมื่อเปิดใช้ Anti-Aliasing


เปิด Anti-Aliasing, ไม่มี Hint


เปิด Anti-Aliasing, มี Hint

ก็ยังพอมองออกหน่อยนึงว่าแตกต่างกัน Hint ยังมีประโยชน์

อ้างอิง

  1. วิธีเอา Bitmap ออกจากฟอนต์ญี่ปุ่น (เพื่อจะได้ใช้ ClearType ที่ทุกขนาด): MSゴシックとMS明朝で、ClearTypeを有効にする