หน้าเว็บ

วันอาทิตย์ที่ 16 ตุลาคม พ.ศ. 2554

วิธีแก้บั๊ก TinyOS two source files specified (PLATFORM_MICAZ and BOARD_MICASB) make: *** [exe0] Error 1

ปัญหาเกิดจากผมทำการอัพเดท Ubuntu 11.04 ไปเป็น 11.10 พออัพเดทแล้วลองคอมไพล์โปรแกรมปรากฏว่าคอมไพล์ไม่ผ่านโดยขึ้น error ประมาณนี้ครับ

two source files specified (PLATFORM_MICAZ and BOARD_MICASB)
make: *** [sim-exe] Error 1


ซึ่งตัว PLATFORM_ กับ BOARD_ อาจเป็นอื่นๆได้ เช่น PLATFORM_IRIS เป็นต้น

ปัญหานี้เกิดจากการที่ gcc ถูกอัพเกรดเป็นเวอร์ชัน 4.6 ซึ่งจะถูกเรียกใช้ในขั้นตอนของการคอมไพล์ TinyOS โปรแกรม

ปัญหาคือ gcc 4.6 จะเพิ่ม space 1 ตัว ไประหว่าง option -D กับ argument ทำให้ปกติแล้วในของเก่า gcc จะสร้าง -DPLATFORM_MICAZ กับ -DBOARD_MICASB ออกมา เพื่อให้ nescc (nesC compiler) เอาไปใช้งานต่อ แต่ของใหม่จะสร้าง -D PLATFORM_MICAZ กับ -D BOARD_MICASB ออกมาแทน ซึ่งทำให้ nescc คอมไพล์ไม่ได้และเกิด error ดังข้างบน

วิธีแก้คือ
1) ดาวน์โหลด nescc ตัวใหม่มา (ของผมที่ใหม่สุดคือ 1.3.2) http://sourceforge.net/projects/nescc/files/nescc/v1.3.2/nesc-1.3.2.tar.gz/download?_test=goal

2) แตกไฟล์ออกมา แล้วไปแก้ source code ที่ไฟล์ nesc-1.3.2/src/nesc-compile

3) หาบรรทัด

($i, $idir) = &extractarg($i);
push @nesc_args, "-I$idir";
}
elsif (/^-o/) {
($i, $objtarget) = &extractarg($i);
}


แก้โดยเพิ่มอีกเงื่อนไขไปเป็น

($i, $idir) = &extractarg($i);
push @nesc_args, "-I$idir";
}
elsif (/^-D/) {
($i, $ddef) = &extractarg($i);
pop @nesc_args;
push @nesc_args, "-D$ddef";
}
elsif (/^-o/) {
($i, $objtarget) = &extractarg($i);
}


4) เสร็จแล้วให้ออกมาที่โฟลเดอร์หลัก nesc-1.3.2 ทำการคอมไพล์โค้ด

./configure
make
sudo make install


5) ลองทดสอบดูว่า nescc ตัวใหม่ติดตั้งแล้วหรือยังโดยสั่ง

ncc --version

ผลลัพธ์ควรจะแจ้งเวอร์ชันของ nescc ออกมาเป็น 1.3.2

ถ้ายังไม่เป็นให้เรา move binary ใหม่ไปแทนเอง

sudo cp /usr/bin/nescc /usr/bin/nescc.old
sudo cp /path/to/nesc-1.3.2/tools/nescc /usr/bin/nescc


6) เมื่อเสร็จแล้วก็ลองสั่งคอมไพล์ TinyOS โปรแกรมใหม่อีกรอบ เช่น

make micaz sim

ก็น่าจะคอมไพล์ผ่านเรียบร้อย

ระบบที่ทดสอบ
OS: Ubuntu 11.10
TinyOS: 2.1.1
ncc: 1.2.4
gcc: 4.6.1
nescc: 1.3.2

อ้างอิง
http://sourceforge.net/tracker/index.php?func=detail&aid=3153727&group_id=56288&atid=480036

วันอาทิตย์ที่ 9 ตุลาคม พ.ศ. 2554

วิธีการหา replace บรรทัดที่ขึ้นต้นด้วย pattern ด้วยข้อความใหม่

สมมติว่ามีไฟล์นึงอยู่ชื่อว่า file.txt โดยมีเนื้อหาดังนี้

hello world
how are you
hello man
Long time no see
no hello


ถ้าเราอยากจะเอาคำว่า "Hi" ไปแทนในทุกบรรทัดที่ขึ้นต้นด้วยคำว่า "hello" สามารถทำได้โดยใช้คำสั่ง sed ดังนี้


sed "s/^hello.*\$/Hi/" file.txt > temp
mv temp file.txt


คราวนี้เมื่อเปิดไฟล์ใหม่เนื้อหาก็จะถูกเปลี่ยนเป็น

Hi
how are you
Hi
Long time no see
no hello


โดย s หมายถึง search and replace
^hello.*\$ หมายถึงขึ้นต้นด้วย hello ไปจนสุดบรรทัด
Hi หมายถึงคำที่จะนำมา replace

ระบบที่ทดสอบ
OS: Ubuntu 11.04

วันเสาร์ที่ 10 กันยายน พ.ศ. 2554

วิธีแก้ไข Metadata Title ของไฟล์ PDF

ถ้ามีไฟล์ pdf แล้วอยากแก้ไข metadata เช่น Title ของไฟล์สามารถทำได้ง่ายๆโดยใช้ Tool ชื่อ exiftool

เวลาใช้งานก็สั่งดังนี้
exiftool -Title="New Title" filename.pdf

วันพุธที่ 1 มิถุนายน พ.ศ. 2554

วิธีใช้ latex สร้างไฟล์ pdf โดยให้ embed font ติดไปด้วย

ผมมีปัญหาว่าเขียนไฟล์ .tex (latex) แล้วพอจะคอมไพล์เป็นสกุล .pdf แล้วมันไม่ยอม embed font บางตัวติดไปให้ โดย font ส่วนใหญ่ที่ไม่ embed ติดไปให้นั้นจะเป็น font พวก Base 14 ได้แก่
ผมจึงนำวิธีที่แก้ไขปัญหานี้มาเขียนไว้ครับ (ผมใช้ latex, dvips, ps2pdf)

1. ทำการคอมไพล์ไฟล์ .tex ให้ได้เป็นไฟล์ .dvi
latex filename.tex

2. หลังจากนั้นแปลงไฟล์ .dvi ให้เป็นไฟล์ .ps
dvips filename.dvi

3. สุดท้ายก็แปลงเป็น .pdf
ps2pdf -dPDFSETTINGS=/printer -dEmbedAllFonts=true filename.ps


จุดสำคัญคือข้อ 3 ครับ ตรง -dPDFSETTINGS ถ้าเกิดผมไม่ใช่ option นี้เข้าไป ตรงส่วน -dEmbedAllFonts จะไม่ทำงาน ซึ่งผมคิดว่าค่า default ของ -dPDFSETTINGS ในเครื่องผมเป็น screen ไม่ใช่ printer ซึ่ง screen จะทำให้ EmbedAllFonts เป็น false โดยอัตโนมัติ

สำหรับการตรวจสอบว่า Font ได้ถูก embed เข้าไปรึยังนั้นให้ใช้คำสั่ง
pdffonts filename.pdf
โดยดูชื่อ Font ที่ใช้ และดูที่คอลัมน์ emb ว่าเป็น yes

ส่วนวิธี embed font ด้วยโปรแกรมและระบบปฏิบัติการอื่นดูเพิ่มเติมได้จาก
http://www.sas.upenn.edu/computing/help/students/dissertation-pdf



ระบบที่ทดสอบ
OS: Ubuntu 11.04
latex: TexLive 2009 (pdftex 3.1415926-1.40.10-2.2)
dvips: 5.98
ps2pdf: 9.01

ที่มา
http://www.sas.upenn.edu/computing/node/1225/
http://ismir2005.ismir.net/pdf.html

วันจันทร์ที่ 23 พฤษภาคม พ.ศ. 2554

Double.NaN == Double.Nan ได้ false !!!

วันนี้เพิ่งรู้ว่า Double.NaN == Double.Nan จะได้ค่าเป็น false เสมอ (ทดสอบในภาษา Java)

ขอสรุปวิธีแก้ปัญหาไว้ตรงนี้เผื่อคนขี้เกียจอ่านครับ
ถ่าจะทดสอบว่าค่าหนึ่งๆเป็น NaN รึเปล่าจะใช้ x == Double.NaN ไม่ได้ แต่สามารถใช้ Double.isNaN(x) ได้แทน (ภาษา Java)


ส่วนคำอธิบายขอก๊อปปี้จาก twitter ตัวเองมาแปะตามลำดับเวลาล่ะกัน (ขี้เกียจเรียบเรียงเช่นกัน :P)

- ที่ไม่เท่ากันเกิดจากคอมไพเลอร์ทำตามมาตรฐาน floating point IEEE 754 ที่บอกว่า NaN ไม่เท่ากับ NaN

- จริงๆแล้ว bit pattern ที่ represent ค่า NaN นั้นไม่ได้มีค่าเดียว แต่มีเป็น range เลย

- โดย Double.NaN จะไปเรียกเมธอด Double.longBitsToDouble(0x7ff8000000000000L) ซึ่ง 0x7ff8000000000000L เป็น bit pattern หนึ่งที่เป็นไปได้

- ซึ่งถ้าดูผิวเผินแล้วเหมือนว่า Double.NaN กับ Double.NaN ก็น่าจะได้ค่าเดียวกัน เพราะส่ง bit pattern เดียวกันเข้าไป

- (เสริม NaN มี 2 แบบถ้า bit ขึ้นต้นด้วย 0 คือ signaling NaN (sNaN)ถ้าขึ้นต้นด้วย 1 คือ quiet NaN (qNaN) ดังนั้น 0x7ff8000000000000L คือ sNaN)

- ซึ่งถ้า sNaN ถูกกระทำการทางคณิตศาสตร์แล้วค่าจะเปลี่ยนเป็น qNaN ซึ่งค่าไม่เท่าเดิม

- ในขณะที่บางโปรเซสเซอร์ เพียงแค่มีการ copy ค่า (ในระดับโปรเซสเซอร์) ก็จะทำการแปลงค่าทันที

- นอกจากแปลงประเภทแล้ว bit pattern ก็อาจเปลี่ยนไปใน range ของ NaN ที่มีอยู่

- ดังนั้นการเรียก Double.NaN หรือ Double.longBitsToDouble(0x7ff8000000000000L) ก็อาจจะได้ค่า NaN ในรูปแบบ double ที่มีbit patternไม่เหมือนเดิม

- ดังนั้นถ่าจะทดสอบว่าค่าหนึ่งๆเป็น NaN รึเปล่าจะใช้ x == Double.NaN ไม่ได้ แต่สามารถใช้ Double.isNaN(x) ได้แทน (ภาษา Java)

อ้างอิง
Javadoc
- http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Double.html#NaN
- http://download.oracle.com/javase/6/docs/api/java/lang/Double.html#longBitsToDouble(long)

IEEE 754 Standard
- http://en.wikipedia.org/wiki/IEEE_floating-point_standard
- http://en.wikipedia.org/wiki/NaN
- http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=4610935&con=yes&userType=inst

วันศุกร์ที่ 20 พฤษภาคม พ.ศ. 2554

วิธีตรวจสอบ encoding ของไฟล์บน Ubuntu

ในกรณีที่เราอยากรู้ว่าไฟล์นั้นมี encoding เป็น UTF-8, TIS-620 ฯลฯ นั้นสามารถทำได้โดยใช้คำสั่งนี้

file -bi filename

ระบบจะบอกประเภทไฟล์ และ encoding ของไฟล์มาให้ เช่น

text/x-php; charset=utf-8

หมายถึงประเภทไฟล์คือไฟล์ที่เป็นข้อความประเภท php และมี encoding เป็น utf-8 เป็นต้น


ระบบที่ทดสอบ
OS: Ubuntu 11.04

วันพฤหัสบดีที่ 5 พฤษภาคม พ.ศ. 2554

บีบไฟล์ (Compress) PDF สำหรับ Ubuntu

ถ้ามีไฟล์ PDF ซึ่งมีขนาดใหญ่มากและต้องการบีบอัดให้มีขนาดเล็กลง ขอแนะนำตัวนี้ครับ PDF Compress https://launchpad.net/compress-pdf โดยจะทำงานในรูปแบบของ Nautilus Script นั่นคือสามารถคลิกขวาที่ไฟล์แล้วสั่งงานได้เลยไม่ต้องเปิดโปรแกรมเพิ่มครับ

ที่ผมลองใช้กับไฟล์ PDF ที่มีแต่รูปขนาดใหญ่ๆรวมกัน 800MB สามารถลดลงมาได้เหลือ 700KB ครับ

วิธีการติดตั้ง
1) ดาวน์โหลดจาก https://launchpad.net/compress-pdf
2) ทำการแตก zip ไฟล์ออกมา (tar zxvf Compress-PDF-1.x.tar.gz)
3) เอาไฟล์ Compress PDF ที่แตกออกมาไปไว้ใช้ ~/.gnome2/nautilus-scripts

วิธีการใช้งาน
1) คลิกขวาไฟล์ที่ต้องการทำการบีบอัด แล้วเลือก สคริปต์ (Scripts)-> Compress PDF
2) เลือกระดับการบีบอัด (ความเล็กของไฟล์ แลกมากับ ความละเอียดของรูปหลังการบีบอัด)
3) บันทึกไฟล์ไว้ที่ที่ต้องการ

ระบบที่ทดสอบ
Compress PDF: 1.4
OS: Ubuntu 11.04 with Unity

ที่มา
https://launchpad.net/compress-pdf

ป.ล. เนื่องจากเป็น Nautilus Script ดังนั้นรองรับ GNOME แต่ไม่รู้รองรับ KDE รึเปล่า

ป.ล. 2 มีอีกเทคนิคนึงคือใช้ pdf2ps ในการแปลงไฟล์ไปเป็น .ps (postscript) ก่อนแล้วค่อยใช้ ps2pdf แปลงกลับมาเป็น pdf ก็จะมีขนาดเล็กลงมาก
ตัวอย่าง
pdf2ps original.pdf middle.ps
ps2pdf middle.ps compressed.pdf

ที่มา http://pandemoniumillusion.wordpress.com/2008/05/07/compress-a-pdf-with-pdftk/