Friday, December 31, 2004

ซ่อม RAID-1 บน Samurai

Samurai มี HD สองตัวมองเห็นเป็น /dev/sda กับ /dev/sdb แบ่ง Partition เหมือนกันทุกอย่าง เอาอันสุดท้าย /dev/sda4 กับ /dev/sdb4 ทำเป็น RAID-1 (Mirror) ไว้ แบบนี้
# cat /etc/raidtab
raiddev             /dev/md1
raid-level                  1
nr-raid-disks               2
chunk-size                  16
persistent-superblock       1
nr-spare-disks              0
    device          /dev/sda4
    raid-disk     0
    device          /dev/sdb4
    raid-disk     1
วันนี้ทำความสะอาดบ้าน ปิดเปิดเครื่องหลายรอบ สังเกตว่าเปิดเครื่องครั้งล่าสุด sdb หายไปทั้งตัว /dev/md1 ยังใช้ได้ แต่มีเฉพาะ /dev/sda4 ตัวเดียว

รีบูทใหม่ sdb กลับมาเหมือนเดิม sdb1-3 ทุกอย่างเป็นปกติ ยกเว้น /dev/md1 ดูเหมือนจะยังไม่ยอมเอา sdb4 กลับเข้ากลุ่ม คงเป็นเพราะมันหายไปพักนึง

# cat /proc/mdstat 
Personalities : [linear] [raid0] [raid1] [raid5] 
md1 : active raid1 sda4[0]
      102036736 blocks [2/1] [U_]
มีแค่ sda4 ตัวเดียว

ไปดูที่ Linux Software RAID How-To: Reconstruction เขาบอกแก้ง่ายๆ โดยใส่ sdb4 กลับเข้าไปใหม่ แบบนี้

# raidhotadd /dev/md1 /dev/sdb4
สั่งปุ้บ ใน /var/log/messages จะมี
kernel: RAID1 conf printout:
kernel:  --- wd:1 rd:2
kernel:  disk 0, wo:0, o:1, dev:sda4
kernel:  disk 1, wo:1, o:1, dev:sdb4
kernel: md: syncing RAID array md1
kernel: md: minimum _guaranteed_ reconstruction speed: 1000 KB/sec/disc.
kernel: md: using maximum available idle IO bandwith (but not more than 200000 KB/sec) for reconstruction.
kernel: md: using 128k window, over a total of 102036736 blocks.
ถ้าไปดู mdstat จะเห็นว่าเริ่มมีการ recovery
# cat /proc/mdstat 
Personalities : [linear] [raid0] [raid1] [raid5] 
md1 : active raid1 sdb4[2] sda4[0]
      102036736 blocks [2/1] [U_]
      [>....................]  recovery =  2.8% (2861824/102036736) finish=35.4min speed=46641K/sec
รอสักพัก
# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid5] 
md1 : active raid1 sdb4[2] sda4[0]
      102036736 blocks [2/1] [U_]
      [=======>.............]  recovery = 36.5% (37258368/102036736) finish=24.4min speed=44238K/sec
พอเสร็จแล้วก็กลับมาเหมือนแต่ก่อน
# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid5] 
md1 : active raid1 sdb4[1] sda4[0]
      102036736 blocks [2/2] [UU]

Tuesday, December 28, 2004

ต้องคอยระวัง AfterShock อีกเป็นปี

ดูข่าวทีวี เขาบอกว่าแผ่นดินไหวที่เพิ่งเกิดไปนี้ มีความน่าจะเป็นที่จะเกิด AfterShock ที่รุนแรงต่ำกว่าเดิม 1-1.5 (คือ ประมาณ 7-8) ได้อีกครั้งภายใน 6-12 เดือน เขายกตัวอย่างมีแผ่นดินไหวใหญ่ครั้งหนึ่งในญี่ปุ่นที่มี AfterShock ตามมาเมื่อเวลาผ่านไป 2 เดือน

เขาบอกด้วยว่า โดยเฉลี่ย Tsunami จะเกิดเมื่อแผ่นดินไหวมีขนาดมากกว่า 6.3 ดังนั้น ถ้า AfterShock ขนาดประมาณ 7-8 มีมาจริงๆ โอกาสที่ Tsunami จะมาอีกภายในระยะเวลาดังกล่าว ก็ยังมี

ไปเจอข่าวบนเว็บเขียนทำนองเดียวกัน ว่าให้คอยระวังอีกเป็นปี คงต้องบอกคนใกล้ตัวให้ระวังอย่าไปแถวนั้นภายใน 1-2 ปีนี้ ภูเก็ตคงเงียบเหงาไปอีกพักใหญ่

地球3周の地震波を観測、長野で気象庁 スマトラ沖地震

ในข่าวนี้บอกด้วยว่า คลื่นแผ่นดินไหวครั้งนี้ใหญ่มาก เครื่องวัดความไวสูงที่เมือง Nagano ยังสามารถวัดคลื่นที่เดินทางรอบโลกไปแล้วได้สามครั้ง ครั้งแรกหลังเกิดใหม่ๆเวลา 10:20 ครั้งที่สองหลังจากวนโลกมาแล้ว 1 รอบ 12:55 และครั้งที่สามหลังจากวนโลกมาแล้วอีกรอบ 15:30

Monday, December 27, 2004

Mac/Win Keyboard Symbols

กำลังจะเขียน Blog เกี่ยวกับ Mac หาทางพิมพ์รูปปุ่ม Command (Apple)

ดูเหมือนจะทำได้โดยกำหนดฟอนต์ Wingdings เช่น

z ÿ

ลองแล้ว ดูได้ทั้งบน Mac (Safari) และ Windows (IE) โดยไม่ต้องทำอะไรเองเพิ่มเติม คือ เห็นเป็นเหมือนรูปข้างล่างนี้ (ยังไม่ได้ลองบน Linux)

แต่หากเปิดด้วย Firefox จะเละตุ้มเป๊ะ คือ

  • บน Firefox/Windows ไม่เห็นสักอัน
  • บน Firefox/Mac เครื่องหมายรูป Command ยังดีอยู่ แต่รูปหน้าต่าง Windows กลายเป็นหัวลูกศรสามเหลี่ยม
หรือว่าเลิกใช้ Firefox ไปเลยดีกว่า ? ตัดคำก็หาตัดไม่

เพิ่มเติม

เพิ่งลองบน Linux (TryLinux) มา Firefox ให้ผลเหมือนกับ Windows คือ ขึ้นเป็นตัว z, y ส่วน Konqueror ดูเหมือนเกือบจะได้ แต่ไม่มีฟอนต์ Wingdings เลยไม่ได้ ลองกำหนด Webdings เพิ่มอีกอัน ได้มาคนละรูป เป็น ห้ามสูบบุหรี่ กับ เมฆฝน แทน

ส่วน Firefox ไม่สนใจทั้ง Webdings, Wingdings ไม่รู้มันเป็นอะไร ขึ้นมาเป็น z, y ลูกเดียว

สรุปว่าจากการทดลองนี้ บน Windows ควรใช้ IE, บน Mac ควรใช้ Safari, บน Linux ถ้าใช้ Konqueror ยังพอมีลุ้น, ส่วน Firefox อย่าไปใช้มัน ไม่ว่าบน OS ใดๆ

เขียนชื่อปุ่มเป็น "Apple" หรือ "Command" หรือ "Windows" น่าจะปลอดภัยกว่าสำหรับทุก Browser

Questia - The Online Library of Books and Journals

วันก่อนสมัคร Safari Bookshelf ไป ยังรู้สึกว่าไม่ค่อยได้เข้าไปอ่านหรือใช้บริการเท่าไร กำลังคิดว่าจะเลิกดีหรือเปล่า

วันนี้สมาชิกในแล็บ เพิ่งไปสมัครบริการคล้ายๆกัน ชื่อ Questia แต่เน้นหนังสือและสิ่งพิมพ์ในวงการศึกษามากกว่า เช่น มีหนังสือของ MIT Press, Academic Press, ฯลฯ เห็นว่าปีละประมาณ US$100

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

Questia - The Online Library of Books and Journals

ย้ายตำแหน่ง META ... charset ... ของ BLOG

ปกติจะทำ Bookmark หน้าสารบัญของ BLOG นี้เอาไว้ จะได้ค้นหาเรื่องเก่าๆได้สะดวก

จะเจอบ่อยๆว่า IE แสดงหน้าสารบัญนี้ไม่ได้ คือ ขึ้นมาเป็นหน้าว่างเปล่า สาเหตุมาจาก Encoding ผิดเป็นภาษาญี่ปุ่นบ้าง ไทยบ้าง ต้องไปเลือกใหม่ให้เป็น UTF-8 ด้วยตัวเอง ทั้งๆที่ใน Template ของ Blog ก็ใส่ META ไว้ชัดเจนแล้วว่า

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
แต่ META นี้กลับไม่มีผล อาการนี้เป็นเฉพาะกับ BLOG บางเรื่อง ไม่ทุกเรื่อง

วันก่อน Otto ก็ถามมาว่าเจอปัญหาแบบนี้กับ linux.thai.net บางหน้าเหมือนกัน ก็เลยลองโน่นลองนี่หาทางแก้ไขกันดู

สรุปพบว่า อาการนี้เกิดขึ้นกับ หน้าที่ <TITLE></TITLE> เป็นภาษาไทย และ <TITLE></TITLE> โผล่มาก่อน <META charset> คือ IE เจอภาษาไทยใน TITLE ก่อน ก็เลยเดา charset ไปก่อน เจ้า META ที่ตามมาเลยไม่มีผล

แก้ไขได้โดยไปเขียน TEMPLATE ใหม่ ให้ META โผล่มาก่อน TITLE แบบนี้

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>...</title>
ของ Otto ดูเหมือนจะหาที่แก้​ Template ไม่ได้ ตกลงต้องไปเปลี่ยน​ TITLE ให้เป็นอังกฤษล้วน

Saturday, December 25, 2004

PiBench/HuiBench

PiBench เป็นโปรแกรมที่เขียนขึ้นมาเล่นๆเพื่อทดสอบความเร็วในการคำนวณเลขทศนิยม (Floating Point) บนเครื่องต่างๆในแลบเมื่อหลายปีก่อน

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

เคยเขียนถึงใน TLWG เลยมีสมาชิกร่วมส่งผลบนเครื่องต่างๆเข้ามามากมาย ตารางยาวขึ้นเรื่อยๆ เดิมเก็บผลไว้บน thaigate คิดว่าย้ายมาบน BLOG น่าจะเก็บได้นานกว่า

เดี๋ยวนี้ CPU เริ่มเร็วขึ้นจนโปรแกรมเสร็จในพริบตา ชักกลัวว่า Overhead ในการ โหลด/เริ่ม/หยุด โปรแกรมจะมีผลมากขึ้น อีกไม่นานคงต้องเพิ่มศูนย์อีกสักตัวในลูปเป็น 300 ล้าน

Cray C90 ครองแชมป์มานานมากแล้ว (ตั้งแต่เริ่มเก็บเมื่อ 6-7 ปีก่อน) สมกับเป็น Vector Super Computer วิ่งที่ความเร็วแค่ 250MHz ผ่านมาหลายปี Opteron248 (2.2GHz) เพิ่งจะเริ่มทำคะแนนไล่ทัน แต่ก็เร็วแค่โปรแกรมนี้แหละที่ลูปหลักทำ Vectorize ได้เต็มๆ และงานหลักคือคำนวณเลขทศนิยม เคยเอามารันโปรแกรม Simulation ทั่วไป อืดเป็นเต่า

ถ้าแก้โปรแกรมเพิ่มลูปไปคงไม่มีเครื่องให้ลองแล้ว (ศูนย์คอมฯเลิกใช้แล้ว)

ตัวโปรแกรม

#include <stdio.h>

main()
{
  int i,j;
  int a=0;
  double x=0;
  for(i=1;i<30000000;i+=4) { 
    x += 1.0/i - 1.0/(i+2); 
  } 
  printf("Pi %lf\n", x * 4.0); 
}

วิธีทดสอบ

$ gcc -O2 -o test test.c   // GCC -O2

or
$ gcc -O3 -o test test.c   // GCC -O3

or
$ cc -fast -o test test.c  // SUN's cc

or
$ cc -n32 -Ofast -o test test.c  // SGI's cc

or on Pentium4 Linux machine using ICC
$ icc -O3 -axW -tpp7 -mcpu=pentium4 -march=pentium4 -o test test.c

$ time test      
หรืออาจกำหนดตัวเลือกอื่นๆพิเศษ (-funroll-loops) ตามในช่อง Model/Note

Results

Machine      OS          CPU              Compiler      Time  Model/Note
--------------------------------------------------------------------------
Yamabiko     SunOS413    Sparc/25         GCC          24.45  Sparc IPC 
Hinata       SunOS4132   Sparc            GCC          13.05  Sparc II
Gio's Home   Linux       AMD5x86/133      GCC          11.41  
Pruet's      Linux2034   Pentium/75       GCC          10.04  HP/Vectra 
Pruet's      Linux2036   Pentium/90       GCC           8.27  AST 
Pubnet       Linux       Pentium/100      GCC           7.010 Micron
NSIAS        Solaris     Sparc/110        GCC           6.6   Sparc 5
PostOffice   LinuxSparc  Sparc/110        GCC           6.530 Sparc 5
Gateway      Linux       Pentium/120      GCC           5.800 Gateway
Hagane       SunOS413    Sparc/?          GCC           5.58  Sparc 10
Miffy        Solaris7    SuperSparcII/75  GCC           4.22  Sparc 20
Vulab        IRIX6.2     R4400/200        GCC           3.392 SGI Indigo2
Ott          Linux21124  PPro/200         GCC           3.33  Ott PC
Vumedia      IRIX5.3     R4400/200 x7     GCC           3.228 SGI Onyx
Thaigate     Solaris251  U-SparcI/143     GCC           3.17  Ultra I
List         Linux       PPro/200         GCC           2.930 Micron Tower
Vulab        IRIX6.2     R4400/200        CC            2.755 SGI Indigo2
Vumedia      IRIX5.3     R4400/200 x7     CC            2.713 SGI Onyx
Banpot's     Linux2035   PentiumII/233    GCC 2723      2.38  DELL dimension xps
Micron       BeOS R4     PentiumII/266    GCC 2.9-beos  2.225 Micron XRU
Pruet's      Linux2034   PentiumII/266    GCC           2.19  HP/NetServerE
Vuapp        Solaris26   PentiumII/266    GCC           2.14  Dell Poweredge 2200
Test         Linux2036   PentiumII/266    GCC           2.070 Dell Poweredge 2200
Micron       Linux2036   PentiumII/266    GCC           2.070 Micron XRU
Pruet's      Linux220p4  Celeron/300      GCC           1.94  HomeMade 
Owl          Linux2032   PentiumII/300    GCC 2723      1.870 Dell Something
Nu+          FreeBSD     PentiumII/266    GCC           1.795 HomeMade
Kyoto        FreeBSD225  PentiumII/266    GCC           1.793 Dell Poweredge 2200
Suisho       DigitalUnix Alpha5/333       GCC           1.776 AlphaStation600 5/333
Hide         OS X 10.3   PowerPC G4 400   GCC 3.3       1.75  15" PowerBook G4 Mercury/TiBook
Pearl        BeOS R4     PentiumII/350    GCC 2.9-beos  1.737 Gateway
Ru           IRIX 6.4    R10000/200 x32   GCC           1.665 SGI Origin2000
Nu+          FreeBSD     PentiumII/300    GCC           1.59  HomeMade
Fubuki       Solaris26   U-SparcII/300 x2 GCC           1.57  Ultra II
Hide         OS X 10.3   PowerPC G4 400   GCC 3.3       1.55  15" PowerBook G4 Mercury/TiBook -funroll-loops
Bamboo       Solaris26   U-SparcII/300 x2 GCC           1.52  Ultra 450
Celeron      Linux223    Celeron/400      GCC           1.47  Dell Dimension V
Hui's        OS X 10.2.8 PowerPC G3 500   GCC 3.1       1.37  PowerBook G3-500 Pismo
New3D        WinNT4.0    PentiumII/450    GNU-Win32 gcc 1.332 Micron 
Nu+Home      Linux       PentiumII/450    GCC           1.30  Gateway
Hui's        OS X 10.2.8 PowerPC G3 500   GCC 3.1       1.27  PowerBook G3-500 Pismo -funroll-loops
Hui Crusoe   Linux       CrusoeTM5400/600 GCC 332       1.18  SONY PCG-C1VR/BP
Precision    Linux223    PentiumIII/500x2 GCC           1.17  Dell 410
Bamboo       Solaris26   U-SparcII/300 x2 CC            1.12  Ultra 450
Nu+          FreeBSD     PentiumII/450    GCC 2721      1.10  HomeMade 256MB
CPUs         DigitalUnix Alpha5/440 x14   GCC           1.06  AlphaServer8400 5/440 
INET         Linux       PentiumIII/600   GCC           0.97  DELL OptiPlex GX110
Ott          DigitalUnix Alpha5/466 x2    CC            0.94  AlphaServer4100 5/466
SISSRV       IRIX 6.5    R12000/400 x32   GCC/CC        0.79  SGI Origin 3000
CPUs         DigitalUnix Alpha5/440 x14   CC            0.72  AlphaServer8400 5/440 
Fon's        OS X 10.3   PowerPC G4 1.33  GCC           0.67  12" Mac PowerBook
POSTOFFICE   Linux       PentiumIII/1000  GCC           0.57  DELL Dimension 4100
Fon's        OS X 10.3   PowerPC G4 1.33  GCC           0.53  12" Mac PowerBook -funroll-loops
Omega        Linux 2.4   PentiumIII/1333  GCC 3.2       0.43  TOSHIBA TabletPC 3500 SS
WebLS        Linux 2.4   Pentium4/2400    GCC 2.95.4    0.270 DELL Dual Xeon 2.40GHz
WebLS        Linux 2.4   Pentium4/2400    ICC 7.1       0.216 DELL Dual Xeon 2.40GHz
Samurai      Linux 2.6   Pentium4 540/3.2 GCC 3.3.5     0.207 Hui-Built Machine
Fon's        Linux 2.6   Pentium4/3600F   GCC 3.3.4     0.192 HP xw4200(Gentoo Linux)
Samurai      Linux 2.6   Pentium4 540/3.2 ICC 8.1       0.164 Hui-Built:  icc -O3 -axW
Fon's        Linux 2.6   Opteron248/2.2x2 GCC 3.4       0.122 HP-DL145 Dual Opteron248 (2.2GHz)
C90          UNICOS902   C90/250MHz x12   CC            0.12  Cray C916/12256 2GB
-------------------------------------------------------------      

หมายเหตุ

  • Only one CPU is used (single process) on all SMP machines listed above.
  • Native cc can generate considerably faster code than GCC on many platforms.
  • On x86 platforms, execution time on FreeBSD is shorter than on Linux.

Friday, December 24, 2004

Reason #2 for Java 1.5: XSL Transformations ใน 1.4.2 อืด

ต่อจาก: เหตุผลข้อ 1

สมมติว่ามีไฟล์ XML ชื่อ small.xml แบบนี้

$ cat small.xml
<?xml version="1.0" encoding="UTF-8"?>
<body>
<p align="center">
<module name="Real Module">
UEsDBBQACAAIAJCKkTEAAAAAAAAAAAAAAAAGAAAAMDEuSlBH7bsJWFPJ1i68FZXuVqGdQETAAbQV
BQEBBTF204iIQivzECJiQAxhEEIUOknbKhwFQUFAxihTgBAQAoQEIU6AMoUpCRAgKgokIUQlCbpD
kj/aw+lz7pm+77/ffc69zymevbNrWrVW1aq13lV7oxxSvgC+PnrY6TCwaPEi4IjqD1AKl5f+cDYi
JiL6bETkJguTPcC+75yOqwmBT+nrTy2ARcDi334/1S1Z+bluierS/5zX+cu82tzn/JfAr2nRZ4pL
vvo18zm3/evPua8+5T+nz5TVJJ+fjwCmwcGqmjDVfdmvvX4puZed83uJ+ee7r+r+W4nl5/vuP5d8
pvnh83OkStK/mdSmP1X/76/7LPMXv87iZ7kXH/rl+rVO//dZ+yW/4XM+9HfufxEBrbrEn9tZqCTb
A5j9Qut/SX8o+9T+U79/lj6PuuqXLr+u0drfefo8d0tWfMp+ufJX+qo5BNxVjz8AQLhKji/eAeuB
</module>
</p>
</body>
และเขียนไฟล์สำหรับแปลง XML คือ huitest.xsl แบบนี้
$ cat huitest.xsl 
<?xml version="1.0"?>
<xsl:stylesheet
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:preserve-space elements="p" />
<xsl:output method="xml" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/">
        <body>
        <xsl:apply-templates/>
        </body>
</xsl:template>

<xsl:template match="module">
<module>
<xsl:value-of select="./@name" />
</module>
</xsl:template>

</xsl:stylesheet>
คือ ต้องการเปลี่ยนจาก <module name=xxx>yyy</module> เป็น <module>xxx</module> ตัดส่วนที่เป็นเนื้อหา yyy ทิ้งให้หมด

งานนี้สามารถใช้คลาส javax.xml.transform.Transformer ของ Java ทำได้เลย โดยส่งไฟล์ XML ต้นทาง กับไฟล์ XSL ที่กำหนดหลักการแปลงไปให้ เช่น เอาโปรแกรมส่วนของ Transformer ที่ฝนเคยทำไว้มาแก้เป็น Transform.java

$ cat Transform.java 
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;

public class Transform {
    public static void main(String [] arg) {
        System.out.println("Transform\n");

        try {
            InputStreamReader xmlReader = 
                new InputStreamReader(new FileInputStream(arg[0]), "UTF8");
            TransformerFactory tFactory = TransformerFactory.newInstance();
            OutputStreamWriter out = 
                new OutputStreamWriter(new FileOutputStream("out-"+arg[0]), 
                                       "UTF8");
            Source xmlSource = new StreamSource(xmlReader);
            Source srcSource = new StreamSource(arg[1]);
            Transformer transformer1 = tFactory.newTransformer(srcSource);
            System.out.println("Transform: start");
            transformer1.transform(xmlSource, new StreamResult(out));
            System.out.println("Transform: complete");
            xmlReader.close();
            out.flush();
            out.close();
        } 
        catch (Exception ex) {
            System.out.println("Error: "+ex);
        }
    }
}
แล้วเรียกใช้งานโดย
$ javac Transform.java 
$ java Transform small.xml huitest.xsl 
Transform
Transform: start
Declared encoding "UTF-8" does not match actual one "UTF8"; this might not be an error.
Transform: complete

$ cat out-small.xml 
<?xml version="1.0" encoding="UTF-8"?>
<body>
<module>Real Module</module>
</body>
ซึ่งดูเหมือนจะทำงานได้เรียบร้อยดี

ปัญหา คือ ข้อมูลที่เป็น Base64 ตรงกลางระหว่าง <module> กับ </module> ในไฟล์ที่ใช้จริง มีขนาดยาวมากๆ (มาจาก Video) ประมาณ 30 MB ! คือ

$ cat large.xml
<?xml version="1.0" encoding="UTF-8"?>
<body>
<p align="center">
<module name="Real Module">
UEsDBBQACAAIAJCKkTEAAAAAAAAAAAAAAAAGAAAAMDEuSlBH7bsJWFPJ1i68FZXuVqGdQETAAbQV
BQEBBTF204iIQivzECJiQAxhEEIUOknbKhwFQUFAxihTgBAQAoQEIU6AMoUpCRAgKgokIUQlCbpD
kj/aw+lz7pm+77/ffc69zymevbNrWrVW1aq13lV7oxxSvgC+PnrY6TCwaPEi4IjqD1AKl5f+cDYi
...
... (~30MB of text)
...
JiL6bETkJguTPcC+75yOqwmBT+nrTy2ARcDi334/1S1Z+bluierS/5zX+cu82tzn/JfAr2nRZ4pL
vvo18zm3/evPua8+5T+nz5TVJJ+fjwCmwcGqmjDVfdmvvX4puZed83uJ+ee7r+r+W4nl5/vuP5d8
pvnh83OkStK/mdSmP1X/76/7LPMXv87iZ7kXH/rl+rVO//dZ+yW/4XM+9HfufxEBrbrEn9tZqCTb
A5j9Qut/SX8o+9T+U79/lj6PuuqXLr+u0drfefo8d0tWfMp+ufJX+qo5BNxVjz8AQLhKji/eAeuB
</module>
</p>
</body>
ลองคำสั่งเดิมกับไฟล์นี้ คือ java Transform large.xml huitest.xsl ปรากฏว่าเงียบหายไป ~45 นาที ! แถมไม่ได้ผลลัพท์อะไรออกมา ได้แต่ข้อความ
Exception in thread "main" java.lang.OutOfMemoryError
2810.596u 6.453s 46:57.57 99.9% 0+0k 0+0io 1pf+0w
เป็นงงว่า Transform ใน Java 1.4.2 มัวทำอะไรอยู่ ? กิน CPU เต็มตลอด 99.9% และทำไมกินหน่วยความจำมากนัก ?

ปัญหานี้เจอมาหลายเดือนแล้ว ตอนนั้นเลี่ยงไปใช้วิธีอื่น ไม่เอาข้อมูลวิดีโอใส่ลงไปในไฟล์ XML ตรงๆ พอดีเริ่มลองเล่น 1.5 ก็เลยลองอีกทีกับ 1.5 ดู ใช้ Transform.class ตัวเดิมที่คอมไพล์ไว้ด้วย javac ของ 1.4.2

$ time ~/temp/jdk1.5.0/bin/java Transform large.xml huitest.xsl
Transform
Transform: start
Transform: complete
4.555u 0.392s 0:04.02 122.8%    0+0k 0+0io 1pf+0w
ทำเสร็จได้ผลลัพท์ถูกต้องภายในเวลา 4.5 วินาที ! เร็วกว่าเดิม (Java 1.4.2_06) ประมาณ 60 เท่า !

Thursday, December 23, 2004

HDBench Virtual PC 7

HDBench เป็นโปรแกรม Benchmark ที่วารสารญี่ปุ่นเคยชอบใช้ ขนาดเล็กดี ไม่ต้องติดตั้งวุ่นวาย Unzip ออกมาก็รันได้เลย

วันนี้เอาไปลองรันบน Windows XP บน Virtual PC บน PowerBook G4-1.33 ได้ผลดังนี้

ตัวเลขไม่เลวทีเดียว คงดูสวยเฉพาะกับโปรแกรม Benchmark วนลูปเล็กๆพวกนี้แหละ คาดว่าถ้าเจอโปรแกรมโตๆ น่าจะแย่ลงเยอะแบบเดียวกับ Crusoe

เอาผลนี้ไปรวมกับ ผล HDBench บนเครื่องต่างๆ ที่เคยเก็บสะสมไว้แล้ว จะได้เปรียบเทียบได้สะดวก

Wednesday, December 22, 2004

SoftEther 2 Beta 1 ออกแล้ว

อยู่นี่: SoftEther VPN 2.0 ベータ版

เขาบอกว่าเร็วขึ้นกว่าเดิม ประมาณเกือบ 3 เท่า ! เพราะปรับปรุงหลายๆอย่าง และใช้หลาย TCP Connection ด้วย ! ทีแรกก็งงว่าในเมื่อ Bandwidth รวมยังเท่าเดิม เปิด TCP หลาย Connection แล้วมันจะเร็วขึ้นได้อย่างไร ?

อ่านๆดู สรุปว่าหลาย Connection ช่วยได้ตรง Delay ตอนเริ่มส่งข้อมูล ถ้าข้อมูลมาเป็น Packet เล็กๆหลายๆอัน และการส่งแต่ละ Packet ต้องมีการโต้ตอบกัน ก็จะเสียเวลามาก รายละเอียดเกี่ยวกับการกระจายข้อมูลเป็นหลายๆ Connection ไม่ได้บอกไว้

นอกจากความเร็วแล้วก็มีคุณสมบัติใหม่อีกเยอะแยะ เช่น สร้าง NIC ปลอมได้หลายอันบนเครื่องเดียวเพื่อต่อกับหลาย VPN ตัว HUB สามารถเชื่อมต่อ Cascade กันได้ ตัวลูกๆไม่ต้องตะลุมบอนไปที่ HUB เครื่องเดียวกันอีก

ที่รู้สึกว่าแย่ลงคือเล่นผ่าน SSH ไม่ได้แล้ว ต้องต่อโดยตรง หรือผ่าน SOCK หรือ HTTP Proxy เท่านั้น เนื่องจากมี Network Admin หลายคนบ่นไปว่าถ้าเล่นผ่าน SSH เขาตรวจจับไม่ได้ !

แต่ความจริงถ้าเรียก ssh ให้ทำการ Forward พอร์ตเอาไว้เองก่อน แล้วให้ SoftEther2 ต่อเข้ากับพอร์ตนี้บน localhost เอา ก็น่าจะยังทำได้ ไว้รุ่นจริงออกมาเมื่อไรค่อยลอง

One reason to switch to Java 1.5

คือ เมื่อทำการ POST ข้อมูลไปให้เว็บเซิร์ฟเวอร์โดยใช้คลาส HttpURLConnection คลาสนี้จะทำการเก็บข้อมูลทั้งหมดใส่ Buffer เอาไว้ก่อน ไม่ Post ออกไปทันทีเลย ทำนองต้องรู้ก่อนว่าขนาดข้อมูลมีเท่าไร จะได้เขียน "Content-Length" ตรงหัวได้ถูกต้อง

ปัญหาคือเมื่อ POST ไฟล์โตๆ เช่น มากกว่า 30MB หน่วยความจำที่ JavaVM ใช้ได้อาจจะไม่พอ และได้ "OutOfMemoryError" ออกมา

อาจแก้โดยเรียก "java -Xmx..." เอาได้ แต่ไม่สะดวกนักโดยเฉพาะเมื่อทำเป็น Applet ให้ชาวบ้านใช้ (ต้องไปตั้งค่าหน่วยความจำ Java Plugin ใน Control Panel กันวุ่นวาย)

ใน Java 1.5 คลาส HttpURLConnection จะมี StreamingMode ให้ใช้ (ไม่ทำการ Buffer) โดยสามารถบอกขนาด Content-Length ล่วงหน้าได้โดย เรียก setFixedLengthStreamingMode()

ดูเหมือน Java 1.4 จะทำไม่ได้จริงๆ ยังแปลกใจไม่มีใครใช้ Java 1.4 POST ข้อมูลโตๆแล้วเจอปัญหาบ้างเลยเหรอ มีคนสงสัยแบบนี้เหมือนกัน เขาบอกให้ไปใช้คลาสอื่นจาก Apache Jakarta แทน

Preventing URLConnection from buffering entire output stream

ตกลงเลิกใช้ HttpURLConnection แล้วไปเขียนข้อมูลใน TCP Socket ตรงๆเลย เอาคลาส TCPConnection ที่เคยทำไว้สำหรับ PantipPost มาใช้

Friday, December 17, 2004

MacXP: Windows XP บน Virtual PC บน PowerBook

ในกล่อง Office:mac Pro 2004 มี "Virtual PC with Win XP" (2 แผ่น CD) กับ "Windows XP" (1 แผ่น CD) แถมมาด้วย ตอนติดตั้งดูเหมือนจะใช้แค่ "Virtual PC with Win XP" สองแผ่นก็พอ แต่ดันไปเลือกแป้นพิมพ์ภาษาไทย เลยต้องใส่ "Windows XP" เข้าไปด้วย เพราะต้องการบางไฟล์ใน D:\I386

ตั้งชื่อเครื่องว่า "MacXP" ป้อนรหัสทุกอย่างเรียบร้อย ได้หน้าตาแบบนี้ระหว่างทำงาน

เล่นๆดูไม่เร็วเท่าไรแต่ก็ไม่อืดมาก เปิด Property ของ My Computer ได้ว่าเป็น CPU ตระกูล 686 ความเร็วประมาณ 300MHz ! (บน PowerBook G4 1.33GHz) เนื่องจากเมาส์แมคมีปุ่มเดียว ต้องจำลองปุ่มขวาโดยกดปุ่ม Control ค้างไว้

ดูดีๆตรง "Dock" ของ Mac มีไอคอน "Start Menu" โผล่ขึ้นมาด้วย

คลิกดูก็จะมีรายการโปรแกรมเหมือนใน Windows XP จริงๆ ถ้าเลือกโปรแกรมในรายการนี้ Virtual PC จะเปิดขึ้นมาเองแล้วเรียกโปรแกรมดังกล่าวโดยอัตโนมัติ

พอเปิด IE ใน Windows XP ใน Virtual PC ปรากฏว่ามีไอคอนของ IE โผล่มาข้างนอกที่ "Dock" ด้วยแฮะ แต่จะมีไอคอนของ Virtual PC เล็กๆทับอยู่ด้วย

Virtual PC ค่อนข้างจะพยายามทำให้ผู้ใช้รู้สึกว่าโปรแกรมใน Windows ก็เป็นส่วนหนึ่งของ Mac ?

เจอคนชื่อเหมือนกันแล้ว "Hui"

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

โดนทักมาว่าไปเขียน Comment ในเรื่อง "Anti-Microsoft" ด้วยเหรอ ?

เฮ้ย ไม่รู้เรื่อง เคยเห็นหัวข้อนี้แวบๆในเว็บบอร์ดของ LTN แต่ยังไม่ได้ไปเขียนอะไร เข้าไปดูจึงเห็นว่ามีคนชื่อ "Hui" เหมือนกัน เขียนว่าชอบโปรแกรมไมโครซอฟท์

วันนี้ PowerBook G4 ที่โดนบอกให้รีบสั่งๆไปมาแล้ว มาพร้อมกับ "Office:mac 2004" ในกล่อง Office มี "Virtual PC for Mac 7 with Windows XP Pro" มาให้ด้วย ดีเหมือนกันแฮะซื้อหนึ่ง (Office) ได้สาม (แถม VirtualPC + WindowsXP)

เครื่องมาแล้วก็หมดข้ออ้าง ต้องรีบๆแก้โปรแกรมให้ใช้กับแมคได้ !

Thursday, December 16, 2004

ASIMO เริ่มวิ่งได้แล้ว

เมื่อวานเห็นในข่าวทีวี หุ่นเดินสองขาของ HONDA ชื่อ ASIMO เริ่มวิ่งได้แล้ว (Video)

คำว่า "วิ่ง" หมายความว่า มีจังหวะหนึ่ง (0.05 วินาที) ที่ไม่มีเท้าใดแตะพื้น ความเร็วสูงสุดที่ทำได้ตอนนี้ คือ 3 กม./ชม. คาบการก้าวเท้า 0.36 วินาที พอๆกับคนวิ่งจ๊อกกิ้ง

ก่อนหน้านี้ หุ่น QRIO ของ SONY เคยวิ่งได้มาก่อนแล้ว ยังสงสัยว่าทำไมเมื่อวานในทีวีบอกว่ารายแรกในโลก

Wednesday, December 15, 2004

ลอง WebDAV กับ Apache

กำลังเซ็งกับการที่ต้องรับส่งไฟล์ระหว่าง Windows กับ Linux บ่อยๆ ถ้าเป็นเครื่องใกล้ตัวก็เปิด Samba เอา แต่ถ้าไกลหน่อย ที่ผ่านมาก็ใช้ sftp, scp ฯลฯ เพราะพอร์ตของ Samba มักจะถูกบล็อคเอาไว้ มีแค่ 22 (SSH), 80 (HTTP), 443 (HTTPs) เท่านั้นที่มักจะเปิดให้ใช้กันได้

อีกอย่างไม่อยากเปิด Samba ให้ชาวอินเทอร์เน็ตทั่วโลกเข้ามาลองเล่นได้

วันนี้ไม่รู้ทำไม จู่ๆก็นึกถึง WebDAV (Web-based Distributed Authoring and Versioning) ขึ้นมา เป็นส่วนขยายของ HTTP สำหรับแก้ไขและจัดการไฟล์บนเว็บเซิร์ฟเวอร์. โปรแกรม Explorer บน Windows เปิดใช้ได้เลย น่าจะเอามาใช้แทน Samba ได้ เล่นผ่าน Web Proxy Server ก็น่าจะได้ (เพราะใช้ HTTP Protocol ?) ไหนๆ Apache ก็รันไว้อยู่แล้ว

ทดลอง TryLinux

การติดตั้งบน TryLinux ไม่ยาก หลังจากมี apache (Apache 1.3) แล้ว ก็ติดตั้ง libapache-mod-dav เพิ่มอีกตัวหนึ่ง จะได้โมดูลสำหรับทำ webdav มา และถูกเพิ่มเข้าไปในไฟล์ /etc/apache/modules.conf ให้เองโดยอัตโนมัติ

เพิ่งรู้ว่า ถ้าจะเพิ่มลดรายการโมดูลในไฟล์นี้ เขาไม่ทำกันด้วยมือ แต่ใช้คำสั่ง /usr/sbin/apache-modconf apache enable|disable ... มันก็จะสร้างไฟล์ /etc/apache/modules.conf ขึ้นมาใหม่เอง

การตั้งค่าที่เกี่ยวกับ WebDAV จะอยู่ใน /etc/apache/conf.d/libapache-mod-dav มีตัวอย่างการตั้งค่า WebDAV ให้ดูด้วย

สมมติว่า Apache รันอยู่บนเครื่อง b.com และจะเปิด WebDAV ที่ http://b.com/dav ก็ไปแก้ใน httpd.conf ว่า

<VirtualHost *>
ServerName b.com
...
...
<Location /dav>
DAV On
AuthType Basic
AuthName TestDAV
AuthUserFile /path/to/httpauth.txt
AuthGroupFile /dev/null
Order deny,allow
Deny from all
Allow from 192.168.  .b.com
<LimitExcept GET OPTIONS>
require valid-user
</LimitExcept>
</Location>
</VirtualHost>
ในกรณีนี้จะบังคับให้ผู้ใช้ Login ก่อน (require valid-user) และจำกัด IP/Domain ของผู้ที่จะต่อเข้ามาเล่นได้ (Allow from) สองอย่างนี้อันไหนไม่จำเป็นก็เอาออกได้

จากนั้นก็ไปสร้าง mkdir dav ใต้ DocumentRoot ให้เรียบร้อย

WindowsXP เจ้าปัญหา

ปัญหาที่พบคือ ถ้าใช้จาก Windows XP โดยไปที่ "My Network Places" แล้วเลือก "Add a network place" (จากตัวเลือกใต้ "Network Tasks" ด้านซ้าย) แล้วป้อน URL เป็น http://b.com/dav มันจะถามให้ใส่ Login/Password แต่เมื่อกรอกไปแล้ว จะถูกด่ากลับมาว่ารหัสไม่ถูกต้อง และชื่อ Login จะถูกเปลี่ยนไป เป็น b.com\login เช่น ป้อนไปว่า "vuthi" มันจะถามมาใหม่เป็น "b.com\vuthi"

"b.com\vuthi" คือ Login name ที่ Windows XP ส่งไปให้ Apache Apache ก็เลยตรวจรหัสผ่านไม่เจอ ไม่ถูกต้อง เพราะไม่มีชื่อนี้ในไฟล์ /path/to/httpauth.txt ลองไปสร้างดูแล้วก็ไม่สำเร็จ

ค้น Google มีคนบอกให้เอา mod_encoding มาใช้ จะแก้ปัญหานี้ได้ ลองดูหลายรอบ ไม่สำเร็จ ปัญหาไม่หาย

สุดท้ายไปเจอว่า ต้องระบุหมายเลขพอร์ต 80 ใน URL ด้วย คือ ให้ใช้ http://b.com:80/dav แทน ในกรณีนี้ Windows XP จะส่งชื่อไปแค่ "vuthi" สามารถ Login ได้เรียบร้อยดี สุดท้ายก็จะได้ "dav on b.com" โผล่ขึ้นมาใน "My Network Places" ให้เรียกใช้เมื่อต้องการ

มีหมายเลขพอร์ตกับไม่มีมันต่างกันตรงไหน ? ไปดูที่ Log ไฟล์ของ Apache จะเห็นว่า

  • ถ้าไม่ระบุพอร์ต 80: User-Agent จะเป็น Microsoft-WebDAV-MiniRedir /5.1.2600
  • ถ้าระบุพอร์ต 80: User-Agent จะเป็น Microsoft Data Access Internet Publishing Provider Protocol Discovery
คงเป็นคนละโมดูล ทำงานไม่เหมือนกัน

เขาว่ากันว่า Windows 2000 ไม่มีปัญหานี้ ไม่มีการเติม Domain หน้า Login ให้เอง ถึงแม้จะไม่ระบุหมายเลขพอร์ต

Deep Blue โกงหรือเปล่า ?

Deep Blue สร้างประวัติศาสตร์เล่นหมากรุกชนะ Garry Kasparov ในปี 1997

มีภาพยนต์ออกมา Game Over: Kasparov and the Machine ว่า เบื้องหลัง Deep Blue อาจจะมี "มนุษย์" คอยช่วยเล่นอยู่ ?

ถ้ามีโอกาสคงต้องหามาดูสักหน่อย

Tuesday, December 14, 2004

MSN Toolbar Suite With Desktop Search คู่แข่ง Google Desktop

Microsoft ส่งออกมาแล้ว คู่แข่ง Google Desktop

Microsoft Introduces MSN Toolbar Suite Beta With Desktop Search

MSN Toolbar Suite

Image Converter 2 มีขายแล้ว 1000 เยน

เมื่อวานใช้โปรแกรมฟรี ลองแปลงไฟล์วิดีโอสำหรับ PSP แล้ว เปิดดูได้ ไม่แน่ใจว่า Image Converter 2 จาก SONY เอง จะให้คุณภาพดีกว่าหรือเปล่า เห็นขายอยู่ 1000 เยน ตอนนี้ยังเป็นรุ่น Preview รุ่นจริงออกเมื่อไรเขาบอกว่าอัพได้ฟรี

Image Converter 2 が販売開始

อาจต้องอดข้าวเที่ยงสักมื้อ ไปซื้อมาลองเปรียบเทียบดู

Monday, December 13, 2004

ไปดูเขาชำแหละ PSP

หมดจดทุกชิ้นส่วน

PSPハードウェアレポート

Create Video file for PSP

ไปเจอวิธีแปลงไฟล์วิดีโอสำหรับ PSP โดยไม่ต้องใช้ Image Converter 2 (ที่ยังไม่มีวางขาย มีแถมมากับ CLIE VZ90) ของ SONY

PSPでMPEG動画を再生できるぽい? (ญี่ปุ่น)

สรุป คือ ต้องไปเอาโปรแกรม

3GP Converter (ญี่ปุ่น)

แปลงเสร็จก็ใส่ไว้ใน MemoryStick DUO โดยให้ไฟล์ชื่อ \MP_ROOT\101MNV01\M4V0****.MP4

เพิ่มเติม

ลองทำดูแล้ว เอาไฟล์ QuickTime ที่ถ่ายโดยกล้อง Nikon 5200 มาแปลงโดย 3GP Converter แล้วจัดเก็บลงไปที่ \MP_ROOT\101MNV01\M4V00001.MP4 เปิดดูได้จริงๆด้วย

ทีแรกลองตั้งชื่อไฟล์เป็น M4V00000.MP4 ตัว PSP มองไม่เห็น แสดงว่าต้องเริ่มจาก "1"

Sunday, December 12, 2004

ไปต่อแถวตากฝนมาแล้ว เพื่อ PSP

เมื่อคืนดูเว็บร้านใกล้บ้าน เขาบอกว่าจะเริ่มขาย 6 โมงเช้า ! คิดว่าคงไม่ไปเช้าขนาดนั้น แต่ก็ยังลังเลเล็กน้อย

รู้สึกตัว 5 โมงเช้า เกือบลุกไปแล้วแต่โดนเบรคเอาไว้ "จะบ้าเรอะ" ! ก็เลยลงไปนอนต่อ ตื่นมาแปดโมงกว่า กินอาหารเช้า แต่งตัว คิดว่าจะไปดีหรือเปล่า อาจจะขายหมดไปแล้ว ? แต่ไปดูหน่อยก็แล้วกัน ถึงจะขายหมดก็ได้ไปดูมาแล้ว

ถึงร้านประมาณ 9:20 แปลกใจไม่มีคนเท่าไร (สงสัยว่าขายหมด) แต่พอเดินเข้าไปจะซื้อ เขาบอกว่าให้ไปต่อแถวนอกร้านอีกด้านนึง โหมีคนต่ออยู่สักร้อยกว่าได้มั้ง เขาแบ่งเป็นกลุ่มๆ (เปิดช่องตรงทางเข้าออก) กลุ่มละ 50-60 คน ตอนไปถึงต่ออยู่ในกลุ่มที่สาม

ก่อนต่อแถวเขาแจกบัตรคิวให้คนละใบ เอาไว้ยื่นที่เคาน์เตอร์ บัตรคิวก็มีเท่าจำนวน PSP ที่เหลือ ได้มาเบอร์ 740 มีบัตรแล้วก็อุ่นใจว่าคงได้เสียตังค์แน่ (เขาให้ซื้อได้คนละหนึ่งชุดเท่านั้น) ถ้าหมายเลขคือจำนวนเครื่องที่ขายได้ ก็แปลว่าเขาน่าจะขายไปแล้ว 740x2 = 1480 ชุด ? (คูณสองเพราะมีหมายเลขสองชุดสำหรับ ชุด VALUE PACK กับ ชุดธรรมดา และสมมติว่าขายได้พอๆกัน)

รอได้ห้านาทีฝนก็เทลงมา โห จะออกนอกแถวก็ไม่ได้ เขาบอกว่าถ้าออกนอกแถวบัตรคิวเป็นโมฆะ พวกที่ต่อคิวก็ทนกันหมด ไหนๆก็มาจนถึงนี่ รอจนถึงนี่แล้ว ไม่มีใครเดินออกไปไหน ใครมีร่มก็กาง ไม่มีร่มก็ตากฝน โชคดีคุณลุงข้างหลังเผื่อแผ่ร่มมาให้ ยังไม่เปียกมาก

ทางร้านคงรู้ สักพักก็เอาร่มพลาสติกมาเดินแจก :) ได้รับมาอันนึง เขาให้ยืมใช้ มีคนเก็บคืนหน้าเคาน์เตอร์

ประมาณ 9:40 เขาเริ่มประกาศว่าเหลือบัตรคิวเหลืออีกไม่กี่สิบใบ ใครอยากได้ให้รีบมาต่อแถว ได้ซื้อตอนประมาณ 10:00 เร็วกว่าที่คิด คือ รอไปประมาณ 40 นาที ไม่ถึงชั่วโมง

(หัวแถว)

แกะกล่อง

กล่องเล็กกว่าที่คิด แต่ตัวเครื่องหนากว่าที่คิดหน่อยนึง ชุด VALUE PACK ต่างจากชุดธรรมดาตรงมี หูฟัง+รีโมท, Memory Stick DUO, ซอง, สายร้อยข้อมือ มาให้ด้วย หม้อแปลงใช้ได้ทั่วโลก เปิดเครื่องขึ้นมาก็ถามว่าจะเอาเมนูภาษาญี่ปุ่นหรืออังกฤษ ซื้อกลับไปเล่นเมืองไทยได้สบายมาก

ลองตั้ง Wireless LAN ให้ต่อกับ AP ที่บ้าน SCAN ESSID เองได้ ต้องทำเองแค่ป้อนรหัส WEP ดูสถานะแล้วได้ IP Address ฯลฯ เรียบร้อย ในเครื่องไม่มี Browser อะไรมาให้แต่มีเมนู "Network Update" เอาไว้อัพเดท Firmware ตัวเองจากเน็ต

ลองดูแล้ว มันบอกว่าโปรแกรมใหม่ล่าสุดแล้ว

ดูหนัง เปิดรูป ฟังเพลง

เอาสาย USB ต่อกับคอมพิวเตอร์ จะมองเห็น MemoryStick ขึ้นมาเป็นไดรฟ์ คู่มือบอกให้โยนไฟล์รูปถ่ายไปไว้ที่โฟลเดอร์ PSP/PHOTO (ต้องสร้างเองก่อน) และไฟล์ MP3 ไปไว้ที่ PSP/MUSIC ส่วน Video ต้องใช้โปรแกรม Image Converter 2 (ต้องซื้อต่างหาก แต่ตอนนี้ยังไม่มีขาย กำหนดวางตลาดภายในเดือนนี้) แปลงเป็น MPEG4 สำหรับมันก่อน

รายละเอียด

ตอนนี้ใต้เมนู "ดูหนัง เปิดรูป ฟังเพลง เกมส์" มีตัวให้เลือกว่าเอาข้อมูลมาจาก แผ่น UMD หรือ MEMORY STICK เท่านั้น น่าจะมี NETWORK ด้วย คือ เปิดไฟล์ที่แชร์ไว้บนคอมพิวเตอร์เครื่องอื่น จะได้ดูหนังผ่าน Wireless LAN ?

คู่มือบอกว่า ตัวเลือก "Memory Stick" ของ "เกมส์" นั้น เอาไว้รันโปรแกรมอัพเดทเกมส์ทั้งหลายที่ดาวน์โหลดมาจาก Network ซึ่งแปลว่าตัวเครื่องสามารถดาวน์โหลดโปรแกรมใส่ใน Memory Stick แล้วเรียกมาใช้งานได้ น่าจะมี SDK ออกมาให้เขียนโปรแกรมเล่นได้ด้วย

Saturday, December 11, 2004

พรุ่งนี้แล้ว PSP

พรุ่งนี้ 12/12 กำหนดขาย SONY PSP

มีคนรู้จักบอกว่าจะไปต่อแถวซื้อตั้งแต่หกโมงเช้า ! ความจริงตอนนี้(คืนวันที่ 11) ตามร้านใหญ่ๆน่าจะมีแถวแล้ว บางร้านบอกว่าจะเริ่มขายตอน 6:55 ! (17 สาขาของ BIC Camera)

ビックカメラ、PSPを12月12日6時55分から販売開始

คิดว่าตื่นคงออกไปดูๆเหมือนกัน ถ้าได้ก็ถือว่าโชคดี ไม่ได้วันแรกก็ไม่เป็นไร รอสั่งเอาอีกที

Friday, December 10, 2004

dist-upgrade แล้ว mono เจ๊ง

บน Samurai ลองทำ apg-get dist-upgrade เพราะรู้สึกไม่ได้ทำมานาน (ประมาณ 2 สัปดาห์;)) เผื่อทำแล้ว pladao จะอาการดีขึ้น

เจอบอกว่ามีให้ up ประมาณร้อยกว่าแพคเกจ ก็ปล่อยให้ทำไป ในนั้นมี mono ปรากฏอยู่ด้วย ทำเสร็จทุกอย่าง พบว่าคำสั่ง mcs, mono หายไปแล้ว

สั่ง apt-get install mono อีกครั้ง ติดปัญหาว่า

The following packages have unmet dependencies:
  mono: Depends: mono-jit (= 1.0.4-1) but it is not going to be installed or
                 mono-mint (= 1.0.4-1) but it is not going to be installed
        Depends: mono-utils (= 1.0.4-1) but it is not going to be installed
        Depends: mono-assemblies-arch but it is not going to be installed
ลองติดตั้งตัวที่ depend อยู่ด้วยมือ
# apt-get install mono-jit
...
The following packages have unmet dependencies:
  mono-jit: Depends: mono-assemblies-base-1.0.4 but it is not installable
E: Broken packages
ตามด้วย
# apt-get install mono-assemblies-base
...
The following packages have unmet dependencies:
  mono-assemblies-base: Depends: mono-jit (>= 1.0.1) but it is not going to be installed or
                                 mono-mint (>= 1.0.1) but it is not going to be installed
E: Broken packages
อิงกันเป็นลูปแฮะ ลอง -f install ก็ไม่แตกต่างกัน สงสัยแพคเกจกำลังปรับปรุง ฐานข้อมูลเลยเพี้ยนๆ ? ลองสองตัวเลยก็แล้วกัน
# apt-get -f install mono-assemblies-base mono-jit

The following packages have unmet dependencies:
  mono-jit: Depends: mono-assemblies-base-1.0.4 but it is not installable
E: Broken packages
แปลว่า mono-assemblies-base ไม่ใหม่พอ ? แล้วจะใช้ mono ได้ยังไง ตอนนี้ ?

ดูเหมือน apt, dpkg*, dselect พวกนี้ ลึกล้ำเกินกว่าจะเข้าใจ

Wednesday, December 08, 2004

ลอง PladaoOffice 3.1 ไม่สำเร็จ

ไปเห็นมาจาก bact' Blog ว่า "ปลาดาว ออฟฟิศ ๓.๑" ออกแล้ว ก็เลยไปดาวน์โหลดรุ่นสำหรับ Linux มาลองดู ได้ไฟล์ pladao-linux-3.1.tar.gz มา ขนาดประมาณ 85 570 599 ไบต์

จัดการติดตั้งโดยเรียก install ใน pladao-linux-3.1 ที่แตกออกมาจาก pladao-linux-3.1.tar.gz

เสร็จแล้วก็เงียบหาย

ลองเลื่อนหน้าจอขึ้นไปดู เจอข้อความ unpack file: /usr/local/OpenOffice.org1.1.1/program/... อ้อ ไปอยู่ใน /usr/local/OpenOffice.org1.1.1 นี่เอง

ตกลงเลยเพิ่ม /usr/local/OpenOffice.org1.1.1/program เข้าไปใน PATH แล้วเรียกโปรแกรม soffice เจอหน้าจอให้ Setup กันอีกรอบ ! สุดท้ายได้ Symbolic Link ของ soffice อีกอันหนึ่งใน ~/PladaoOffice3.1 ใต้โฮมตัวเอง

สงสัยที่ถูกต้อง ต้องเล่นจากตรงนี้ วุ่นวายไปแก้ PATH ใหม่ เอา /usr/local/OpenOffice.org1.1.1/program ที่เพิ่งใส่เข้าไปออก แล้วใส่ ~/PladaoOffice3.1 เข้าไปใหม่

ลองใช้โดยเรียก "soffice" ได้โลโก้ Pladao 3.1 สวยงาม :) แต่พอเปิดเอกสารใหม่ลองพิมพ์ภาษาไทยยาวๆ

เฮ้ย ทำไมไม่ตัดคำ !! ตัดกันระดับตัวอักษรเลย แถมขึ้นบรรทัดใหม่ล่วงหน้าเป็นวา ตั้งขอบย่อหน้าตรงประมาณเลข 8 แต่ไม่ถึงเลข 5 ก็ตัดแล้ว

เป็นงง สงสัยเครื่องเราจะมีอะไรไม่ครบ ไปอ่าน วิธีติดตั้ง ตรง "ความต้องการสำหรับ GNU/Linux" ดูๆแล้วน่าจะผ่านทุกข้อ Kernel ก็ 2.6, libc ก็ใช้ 2.3.2 เกินความต้องการ (2.1.3), libstdc++ ก็ 3.3.5 เกินความต้องการ (3.0), "ระบบภาษาไทย" เป็น Link ให้ไปอ่าน The Linux Thai-HOWTO มันกว้างเกินจนไม่รู้ว่าขาดอะไรไป

ยังงงอยู่ว่าเป็นอะไร เดี๋ยวล้างออกหมดแล้วลองใหม่ดีกว่า !

เพิ่มเติม

สงสัยว่าเป็นเพราะ เครื่องที่เล่น (KNOPPIX-TH) มี office-tle อยู่แล้วเกิดอาการทะเลาะกัน ก็เลยลบทิ้งทั้งหมดด้วยการ

  • dpkg -r office-tle
  • rm -fr ~/OpenOffice....
  • และก็ลบปลาดาวตัวเดิมด้วย rm -fr ~/PladaoOffice3.1 และ rm -fr /usr/local/OpenOffice.org1.1.1
แล้วก็ติดตั้งใหม่จาก tgz โดยเรียก setup คราวนี้โปรแกรมทั้งหลายลงไปที่ ~/PladaoOffice3.1 เพียงแห่งเดียว

ลองเรียก soffice พบว่าเหมือนเดิม ไม่ดีขึ้น ตัดคำขึ้นบรรทัดยังเพี้ยนๆอยู่

เลิกกลับไปใช้ Office-TLE เหมือนเดิมดีกว่า

Monday, December 06, 2004

TurboLinux Home สำหรับชาวบ้าน

แต่ไหนแต่ไรมา TurboLinux คงเรียกได้ว่าเป็น Linux ที่เก่าแก่ที่สุดตัวนึงในตลาดญี่ปุ่น อีกความพยายามที่จะทำ Linux สำหรับผู้ใช้ตามบ้านทั่วไป

TurboLinux Home

หน้าตาอย่างกะเมนูในเกมส์ญี่ปุ่น แบ่งเป็นสามแถว เล่นเน็ต, กล้องดิจิตอล+กราฟิก, อื่นๆ (ดูหนัง, Office) สนนราคา 16,590 Yen ! ไม่ถูกเลย คงเพราะแถม Commercial Software ตัวดัง เช่น 筆ぐるめ (ทำโปสการ์ดอวยพร) และ ATOK for Linux (ป้อนข้อมูลภาษาญี่ปุ่น) มาให้ด้วย

และก็ยังมีโปรแกรมตระกูล Turbo* เช่น Turbo Media Player ซึ่งบอกว่ามีการ License เทคโนโลยีจากไมโครซอฟท์ (เอาไว้เล่นไฟล์ .wm* ?), และ Turbo Update ไว้อัพเดทตัวเองโดยอัตโนมัติ

นอกนั้นก็รวมโปรแกรมที่เคยเห็นทั่วๆไป เช่น RealPlayer, Mozilla, Gimp, digikam, K3b, OpenOffice, Acrobat Reader, gtkpod, Image Scan! for Linux

อีกหน่อยอาจจะมี LinuxTLE-บ้าน อะไรทำนองนี้ก็ได้ :)

Sunday, December 05, 2004

ข่าวดี Good News of the Year

เจอข่าวดี ขอเก็บลิงค์เอาไว้หน่อย

"ชมรมคนรู้ทัน"ชี้คดี"ซุกหุ้น"แผลงฤทธิ์"แม้ว"อาจโดนถอด!
โดย ผู้จัดการออนไลน์ 4 ธันวาคม 2547 23:23 น.

จะดียิ่งขึ้นหากมีการนำไปขยายผลต่อจริง

Friday, December 03, 2004

ใช้ transcode แปลงวิดีโอ

วันก่อนถามโต้งว่าใช้โปรแกรมอะไรแปลง MPEG2 เป็น DIVX แกแนะนำให้ใช้ ffmpeg แต่แนะนำเพิ่มว่า ได้ยินมาว่า transcode ดีกว่า

สรุปว่าลอง transcode ก็แล้วกัน

apt-get transcode ไม่ได้ ไม่เจอ transcode อะไรเลย เริ่มจะรู้สึกว่า Debian ไม่สะดวกอย่างที่คิด โต้งบอกว่า Debian มันเอาแพคเกจที่ติดปัญหา License ฯลฯ ทั้งหลายออกไป ทำให้ตอนนี้แกเองเปลี่ยนมาใช้ Gentoo แทนแล้ว

สรุปว่าต้องไปเอา Source มาคอมไพล์เอง ซึ่งก็ไม่ยากอะไร แต่สุดท้ายทำไปสองรอบ รอบแรกคอมไพล์แล้วยังเปิดไฟล์ MPEG2 ไม่ได้ มันบอกว่าต้องการ libLAME-dev ซึ่ง apt-get ไม่ได้เหมือนกัน ต้องเอา Source มาคอมไพล์เอง

** อุตส่าห์ใช้ Debian แล้วยังต้องเอา Source มาคอมไพล์เอง **

transcode มีตัวเลือกมากไปหน่อย กว่าจะเข้าที่เข้าทางต้องลองหลายรอบ สรุปว่าสำหรับรายการวิดีโอ (720x480 MPEG2) ที่อัดไว้ที่บ้านมากมายนั้น สามารถแปลงเป็น DIVX แล้วยังได้คุณภาพที่พอดูได้ด้วยคำสั่ง

transcode -b 96 -w 900 -Z 640x480,fast -V -i 'file.mpg' -o 'file.avi' 
    -x mpeg2 -y ffmpeg -F mpeg4
โดยที่ -b 96 คือ bandwidth ของเสียง, -w 900 คือ bandwidth ของภาพ, -Z 640x480,fast คือสัดส่วนภาพที่ต้องการ ใช้วิธีการย่อภาพแบบรวดเร็ว (fast), -V ทำงานใน YUV Domain ไม่งั้นจะแปลงเป็น RGB ก่อนแล้วแปลงกลับ เท่าที่ทดลองถ้าไม่มี -V มันไม่ใช่ช้าลงอย่างเดียว แต่สีจะเพี้ยนและภาพตีลังกาอีกด้วย, -i 'file.mpg' -o 'file.avi' คือ ชื่อไฟล์เข้าออก, -x mpeg2 คือ ฟอร์แมตไฟล์ต้นทาง, -y ffmpeg คือ ฟอร์แมตไฟล์ปลายทาง ในที่นี้ระบุให้ใช้โมดูล ffmpeg ทำให้ต้องกำหนดฟอร์แมตจริงๆเป็นตัวเลือกไปให้ ffmpeg อีกทีด้วย -F mpeg4

ความจริง -y ffmpeg กับ -F mpeg4 สามารถแทนได้ด้วย -y divx5 อันเดียว แต่ลองดูแล้วมันต้องการ .so ของ DIVX5 ไปดาวน์โหลดมาจาก divx.com แล้วเจอบ่นว่าคนละเวอร์ชั่น เรื่องมากก็เลยใช้ของ ffmpeg แทน

ถ้าอยากทำ Two-Pass Encoding ก็ใช้คำสั่ง

transcode -b 96 -w 900 -Z 640x480,fast -V -i file.mpg -o /dev/null 
    -x mpeg2,null -y ffmpeg,null -F mpeg4 -R 1

transcode -b 96 -w 900 -Z 640x480,fast -V -i file.mpg -o file.avi 
    -x mpeg2 -y ffmpeg -F mpeg4 -R 2
รอบแรกทำเพื่อเก็บข้อมูล เลยไม่ต้องกำหนดไฟล์ขาออก (/dev/null ไปเลย) และไม่ต้องทำการแปลงเสียง (,null ในส่วนของ -x, -y) ในรอบแรก(-R 1)จะได้ไฟล์ divx4.log ออกมา ซึ่งจะถูกใช้ในรอบสอง(-R 2)

Thursday, December 02, 2004

Driver(s) for Samurai from Intel

วันอาทิตย์ที่ผ่านมา เซียน Linux สองคน (Otto & Poonlap) มาที่บ้าน พยายามจะช่วยให้ Samurai หายเป็นไบ้ ลองอยู่สักพัก แต่ก็ยังไม่สำเร็จอยู่ดี แปลว่าใน Kernel คงยังไม่มี Driver ค่อนข้างแน่นอน ต้องไปหามาลงเอง

วันนี้ลองดูอีกที เริ่มต้นจากหน้าของผู้ผลิต MoBo เขาบอกว่า Samurai ใช้ระบบเสียงของ C-Media CMI9880 8-channel audio CODEC ซึ่งเขาบอกด้วยว่า Compliant with Intel Azalia Specification (Intel High Definition Audio Specification)

งั้นลองไปหาที่ INTEL ดูก็แล้วกัน โชคดีเจอ Driver คล้ายๆกันสำหรับ MotherBoard ของ INTEL มีสำหรับ Audio และ Graphics (X11) ด้วย :)

Drivers: Intel® Desktop Board D915GEV

ลองติดตั้ง Integrated Audio Driver ได้มาเป็น Source Code ตัว Script ที่ INTEL ให้มาจัดการแตกไฟล์ แล้วคอมไพล์เข้ากับ Kernel ให้เลย สุดท้ายบอกว่า

อาจจะใช้ได้ ? ดูใน /var/log/messages ก็เหมือนมีการโหลดไดรเวอร์ เดี๋ยวกลับถึงบ้านคงรู้ ตอนนี้คอมไพล์ & ติดตั้งผ่าน ssh ทดลองไปก็ไม่ได้ยินอะไร

น่าจะซื้อ MoBo ของ INTEL ซะตั้งแต่แรก !

เพิ่มเติม

ลองแล้วย้งไม่สำเร็จเท่าไรแต่พอได้ยินเสียงบ้าง ทีแรก amixer ไม่ทำงาน เรียก alsamixer Kernel ก็เดี้ยงไปเลย ต้องซ่อมโดยเรียก alsa_snddevices ให้มันสร้าง /dev/* ให้เรียบร้อย จากนั้นก็ใช้ Mixer ได้

# amixer 
Simple mixer control 'Master',0
  Capabilities: pvolume pswitch pswitch-joined
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 64
  Front Left: Playback 64 [100%] [on]
  Front Right: Playback 64 [100%] [on]
Simple mixer control 'Capture',0
  Capabilities: cvolume
  Capture channels: Front Left - Front Right
  Limits: Capture 0 - 35
  Front Left: Capture 0 [0%]
  Front Right: Capture 0 [0%]
ตรงตามที่ INTEL เขียนไว้ใน README คือ ยังใช้ได้แค่ 2 CH จากทั้งหมด 8! และเปิดเพลงฟังด้วยบางโปรแกรม เสียงจะขัดๆ เขาบอกให้เปลี่ยนโปรแกรม ตอนนี้มีแค่ "play" ของ SOX ไม่รู้จะลองด้วยโปรแกรมอะไรอีก

ส่วน MIDI ดูเหมือนจะยังใช้ไม่ได้

# amidi -l
Device    Name
cannot determine device number: Inappropriate ioctl for device

สารบัญ Table of Contents ของ Blog นี้

เขียน BLOG มานานเหมือนกัน เปิดย้อนดูเริ่มรู้สึกว่าหาเรื่องเก่าๆลำบากชะมัด ไปฝาก Samurai ให้ทำสารบัญให้หน่อย วันละครั้ง

แบ่งกลุ่ม

ไม่แบ่งกลุ่ม

←←← เปิดสารบัญนี้ได้ทุกเมื่อ จากเมนูข้างซ้าย ←←←

อ่าน GMail ผ่าน Atom Feed

ใช้โปรแกรมพวก RSS/Atom Reader ทั้งหลายก็อ่าน GMail ได้แล้ว :) เพียงแต่ตั้ง URL ไปที่

https://gmail.google.com/gmail/feed/atom

แล้วก็กรอก Login/Password ของ GMail

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 นี่ลงไปเลยไม่ได้ ต้องแก้ให้โหลดจากเน็ตมาทีหลังแทน