หน้าเว็บ

วันอาทิตย์ที่ 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/

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

เหตุผลที่แนะนำให้ใช้ Mozilla Firefox หรือ Google Chrome

วันนี้ได้ทำการส่งอีเมลให้ความรู้เกี่ยวกับ IE, Firefox และ Chrome กับบุคลากรในสำนักงานนวัตกรรมแห่งชาติ จึงเอามาแชร์กันไว้ที่นี่ด้วยครับ
---------------------------------------------------------------------------------------------
เหตุผลที่ฝ่าย IT แนะนำให้ใช้ Mozilla Firefox หรือ Google Chrome

หลายท่านในสำนักงานคงคุ้นเคยกับการที่ฝ่าย IT พยายามผลักดันให้ใช้ Firefox หรือ Chrome แทน Internet Explorer (IE) ของ Microsoft นะครับ ซึ่งก่อนจะอธิบายเหตุผลในแง่ความสามารถแล้ว ผมอยากให้ดูสถิติการใช้งาน Web Browser ตั้งแต่ปี 2008 - 2011 http://gs.statcounter.com/#browser-ww-monthly-200807-201102

จากสถิติแสดงให้เห็นว่า IE นั้น คนทั่วโลกใช้งานน้อยลงเรื่อยๆ (45.44%) โดยมี Firefox (30.37%) และ Chrome (16.54%) ที่กินส่วนแบ่งมาได้ (โดยเฉพาะ Chrome ที่กำลังมาแรงมาก) โดยถ้าดูในทวีปยุโรปจะเห็นว่ามีคนใช้ Firefox มากกว่า IE แล้ว http://gs.statcounter.com/#browser-eu-monthly-200807-201102

ส่วนอีก 2 ประเทศที่น่าสนใจคือเวียดนาม http://gs.statcounter.com/#browser-VN-monthly-200807-201102 กับ ไทย http://gs.statcounter.com/#browser-TH-monthly-200807-201102 มีการใช้ IE (44.14% กับ 72.28%) มีการใช้ Firefox (39.62% กับ 15.07%) (ตัวเลขแรกคือเวียดนาม ตัวที่สองคือไทยครับ)


แล้วทำไมคนทั่วโลกถึงได้มีอัตราการใช้ IE ที่ลดลงเรื่อยๆ?

ที่เห็นได้ชัดสุดผมอยากให้ลองดูการวัดประสิทธิภาพโดยเว็บ Six Revisions ซึ่งเป็นเว็บที่มีชื่อเสียงในด้านการให้ความรู้เกี่ยวกับการพัฒนาเว็บ ไซต์ http://sixrevisions.com/infographs/browser-performance/ และเว็บ CybernetNews http://cybernetnews.com/browser-comparison-internet-explorer-firefox-chrome-safari-opera/
จะเห็นได้ว่า IE 8 ซึ่งเป็นตัวปัจจุบันมีประสิทธิภาพแย่กว่า Web Browser ตัวอื่นมาก ไม่ว่าจะเป็นในแง่ ความเร็วในการเปิดหน้าเว็บ การใช้งาน CPU หรือปริมาณ RAM ที่ใช้ก็ตาม

แต่ที่สำคัญคือในเรื่องการปฏิบัติตามมาตรฐานเว็บไซต์ จากการทดสอบด้วยชุดทดสอบ Acid3 คะแนนเต็ม 100 Firefox 3.5 ได้ 93 Chrome 3 ได้ 100 แต่ IE 8 ได้เพียง 20 ซึ่งประเด็นนี้ทำให้นักพัฒนาเว็บทั้งหลายปวดหัวกันมาก เพราะสร้างเว็บตรงตามมาตรฐานแต่ถ้าเปิดด้วย IE กลับเปิดแล้วเพี้ยนหรือเปิดไม่ขึ้น ดังนั้นนักพัฒนาจึงต้องทำเว็บหลายเวอร์ชันให้รองรับกับสิ่งที่ไม่ใช่มาตรฐาน (เว็บไซต์ nia.or.th ก็ทำทั้งรูปแบบที่รองรับ IE และ Web Browser อื่นที่ได้มาตรฐาน แต่ในขณะที่เว็บไซต์ที่ใช้กันเองภายในเพื่อเป็นการประหยัดเวลาจึงเน้นพัฒนา ตามมาตรฐานก่อน เพราะสามารถควบคุมการใช้งาน Web Browser ได้)

แล้วทำไมคนส่วนใหญ่ยังใช้ IE กันอยู่?
เหตุผลง่ายๆเหตุผลหนึ่งคือ IE แถมติดมากับ Windows ครับ โดยเฉพาะ Windows XP ที่แถม IE 6 มาให้ ซึ่งอายุของ IE 6 ก็ร่วมทศวรรษแล้ว (เริ่มปี 2001) ถึงกับมีบางเว็บตั้ง campaign ต่อต้าน IE 6 เลยทีเดียว (http://www.ie6nomore.com/) ในยุโรปถึงกับออกใช้มาตรการป้องกันการผูกขาดโดยให้ผู้ใช้สามารถเลือก Browser ได้เองตอนลง Windows ครั้งแรก

ซึ่งหน่วยงานราชการไทยหลายแห่งก็ยังคงไม่ทราบข้อมูลเหล่านี้ และนิยม IE เป็น Browser หลัก ทำให้เป็นเรื่องขบขันในหมู่นัก IT ว่าหน่วยงานราชการไทยต้อง IE Only แต่ในขณะนี้ผมภูมิใจที่ได้บอกกับคนอื่น ว่าสำนักงานนวัตกรรมแห่งชาติไม่ได้อยู่ในกลุ่มนั้นแล้วครับ

แต่ก็น่ายินดีที่ในอนาคต IE 9 ของ Microsoft ที่กำลังจะออกมาในเร็วๆนี้ในสนใจที่จะทำตามมาตรฐานเว็บมากขึ้น และได้พัฒนาประสิทธิภาพที่ดีขึ้นมาก มาช้ายังดีกว่าไม่มานะครับ

แล้วถ้า Browser ตัวใหม่ของแต่ละค่ายออกมาเมื่อไหร่จะมาเล่าสู่กันฟังอีกทีนะครับ
---------------------------------------------------------------------------------------------------

วันอาทิตย์ที่ 13 กุมภาพันธ์ พ.ศ. 2554

วิธีแปลงรูปเป็นภาพวาดดินสอด้วย GIMP (Image to pencil drawing)

สมมติว่ามีภาพถ่ายวิวหรือคนอยู่ภาพหนึ่ง แล้วต้องการเปลี่ยนภาพนี้ให้เป็นภาพร่างดินสอ สามารถใช้ GIMP ทำแบบดิบๆได้ดังนี้

1. เปิดไฟล์ภาพขึ้นมา
2. ให้ทำการ duplicate layer ของภาพนี้ขึ้นมาอีกอัน
3. ใน layer ที่ duplicate ขึ้นมา ให้ไปที่ Color (สี) -> Colorize (ธาตุสี-ความอิ่มสี) แล้วปรับ Saturation ให้เป็น -100 เพื่อลบสีออกก่อน
4. ให้ทำการ duplicate layer ที่ไม่มีสีนี้เพิ่มขึ้นมาอีกอัน (กลายเป็นมี 3 layer)
5. ใน layer ใหม่ให้ไปที่ Filter (ฟิลเตอร์) -> Blur (มัว) -> Gaussian Blur แล้วปรับ Blur Radius ให้เป็น 4.0 ทั้ง vertical และ horizontal และ Blur method ใช้เป็น RLE
6. ไปที่ Color (สี) -> Invert (กลับสี) แล้วไปปรับ opacity (ความทึบแสง) ของ layer นี้เป็น 50%
7. ทำการ merge layer นี้กับ layer อันด้านล่าง (อันก่อนนี้)
8. แล้วทำการ duplicate layer ใหม่นี้อีกครั้งนึง และปรับ mode ของ layer ใหม่นี้เป็น dodge เป็นอันเสร็จเรียบร้อย

แต่ถ้าทำแล้วรู้สึกว่าเส้นดินสอมันจางไป ให้ทำเพิ่มดังนี้
9. merge layer ใหม่กับ layer อันด้านล่าง
10. duplicate layer นี้อีกครั้ง และปรับ mode ของ layer ใหม่เป็น multiple เส้นจะเข้มขึ้น
11. ถ้ายังเข้มไม่พอก็ให้ทำ step 9-10 ใหม่จนกว่าจะพอใจ

ระบบที่ทดสอบ
OS: Ubuntu 10.10
GIMP: 2.6.10

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

Grigori Perelman ผู้พิชิตโจทย์ปัญหารางวัล 1 ล้านเหรียญ

วันนี้นั่งอ่านประวัติของคนพิสูจน์ Poincare conjecture ใน wiki แล้วสนุกดีครับ

Poincare conjecture เป็นปัญหาเดียวที่มีคนแก้ได้และได้รับการยอมรับในกลุ่มปัญหา Millennium Prize Problemsที่มีอยู่ 7ข้อ (P vs NP เป็นหนึ่งในนี้) ถ้าใครแก้ข้อไหนได้จะได้รับรางวัล 1 ล้านเหรียญ

คนที่แก้ ปัญหานี้ได้ชื่อว่า Grigori Perelman เป็นนักคณิตศาสตร์ชาวรัสเซีย แต่ Perelman ปฏิเสธที่จะรับรางวัล 1 ล้านเหรียญนี้ และไม่ไปเข้าร่วมพิธียกย่องสำหรับการแก้ปัญหานี้ได้

เหตุผล ที่เค้าปฏิเสธคือ proof ของเค้านั้นก็เกิดขึ้นจาก Richard Hamilton ได้แนะนำโปรแกรมสำหรับหา solution แต่ไม่มี proof เค้าบอกว่าการ proof ของเค้านั้นไม่ได้ยิ่งใหญ่ไปกว่า Richard Hamilton ดังนั้นเค้าจึงคิดว่ามันไม่แฟร์ที่จะไม่แชร์รางวัลกับ Hamilton เลยคิดว่าการตัดสินใจที่จะมอบรางวัลนี้ให้กับเค้ามันไม่ยุติธรรม ก็เลยปฏิเสธรางวัลไป

เหตุการณ์นี้คือเมื่อปีที่แล้วที่ผ่านมา (ปี 2010) แต่ก่อนหน้านั้นในปี 2006 เค้าเคยได้รับการเสนอชื่อให้รับเหรียญรางวัล Fields Medal ของ IMU (International Mathematical Union) ซึ่งรางวัล Fields Medal ถือว่าเป็นรางวัลที่สูงสุดสำหรับนักคณิตศาสตร์ โดยจะจัด 4 ปีครั้ง ให้เหรียญรางวัล 2-4 คน ในแต่ละครั้ง แต่ Perelman ก็ปฏิเสธที่จะรับรางวัลเช่นกัน โดย Sir John Ball ได้ไปหาเค้าเองและให้ทางเลือกคือ 1. รับและไปร่วมงาน 2. รับแต่ไม่ไปร่วมงาน ถ้ารับแต่ไม่ไป จะจัดส่งเหรียญมาให้ แต่ Perelman เลือกข้อ 3 คือ ไม่รับและไม่ไปร่วมงาน สาเหตุที่ปฏิเสธคือรางวัลไม่ได้มีส่วนเกี่ยวอะไรกับเค้าเลย เมื่อทุกคนเข้าใจว่าการพิสูจน์นั้นถูกต้องเค้าก็ไม่จำเป็นต้องได้รับการยอมรับอื่นอีก เค้าไม่สนใจในเงินทองหรือชื่อเสียง เค้าไม่ต้องการเป็นสัตว์ในสวนสัตว์ เค้าไม่ใช่ฮีโร่ของคณิตศาสตร์ เค้าไม่แม้กระทั่งว่าเค้าประสบความสำเร็จ และนั่นเป็นเหตุผลที่เค้าไม่ต้องการให้ใครมาคอยจ้องมองที่เค้า

โดย ก่อนหน้ารางวัลนี้เค้าก็เคยปฏิเสธรางวัลให้ทรงเกียรติจาก European Mathematical Society โดยเหตุผลคือ เค้ารู้สึกว่ากรรมการที่ตัดสินรางวัลนั้นมีคุณสมบัติไม่ผ่านที่จะประเมินผล งานของเค้า แม้จะประเมินในทางบวกก็ตาม

ตอนเด็กๆนั้น Perelman เคยแข่งคณิตศาสตร์โอลิมปิกนานาชาติ (IMO) โดยได้เหรียญทองซึ่งเค้าสามารถทำ perfect score ได้

ใครอยากเห็นหน้าตาของ Grigori Perelman หรืออ่านประวัติส่วนอื่นๆก็ลองดูได้นะครับ http://en.wikipedia.org/wiki/Grigori_Perelman (อ้างอิงจากวันที่ 28 ม.ค. 54)

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

วิธี switch version ของ java บน ubuntu

ในกรณีที่เราลง java ไว้หลาย version เช่น 1.5, 1.6 แล้วเราต้องการเปลี่ยนเวอร์ชันให้ใช้คำสั่ง

sudo update-alternatives --config java

จะมีรายการ java ทั้งหมดที่มีในเครื่องขึ้นมาให้เลือก ก็ให้เลือกเลขที่ต้องการ เป็นอันเสร็จ

สามารถตรวจสอบว่าตอนนี้ version เป็นอะไรได้ด้วยคำสั่ง

java -version


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

ที่มา
http://ubuntuforums.org/showthread.php?t=655101

วิธีทำให้ Python เรียก script อื่นทำงาน (execute external script)

ถ้าเรามี script ไฟล์ python (.py) อยู่ไฟล์นึง แล้วเราอยากให้ script ไฟล์ python อีกฝ่ายมาเรียกไฟล์แรกทำงาน(คล้ายๆการ include ใน php) ทำได้ดังนี้

สมมติว่ามีไฟล์ hello.py ซึ่งมีโค้ดดังนี้อยู่
print 'hello world'


คราวนี้ในไฟล์ที่สองชื่อ run.py จะเรียกใช้ hello.py

วิธีแรก
ในไฟล์ run.py ให้ใช้คำสั่ง execfile

...
execfile('hello.py')
...


กรณีแรกนี้คือสั่งเรียกไฟล์ python อื่น แต่ว่าถ้าเราต้องการเรียก script หรือ shell command ใดๆนอกจาก python ก็ทำได้เหมือนกัน โดยใช้วิธีที่สอง

วิธีที่สอง
ในไฟล์ run.py ให้ import โมดูลชื่อ os แล้วเรียก os.system(command) เช่น

import os
...
os.system('python hello.py')
...


หรือ

import os
...
os.system('cat hello.py | grep hello')
...


สำหรับวิธีแรกจะใช้ได้กับ python-2.x แต่ถ้าเป็น python-3.x ให้ใช้วิธีตาม link นี้แทน http://stackoverflow.com/questions/436198/what-is-an-alternative-to-execfile-in-python-3-0

ระบบที่ทดสอบ
Python: 2.6.6
OS: Ubunut 10.10

ที่มา
http://stackoverflow.com/questions/1027714/how-to-execute-a-file-within-the-python-interpreter

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

วิธีตรวจสอบว่า PHP request เป็น GET หรือ POST

มีหลายๆครั้งที่เราต้องการให้โค้ด php ไฟล์หนึ่งรองรับทั้ง GET และ POST ดังนั้นจะต้องมีส่วนที่ใช้ในการตรวจสอบว่า request ที่เข้ามายังหน้าเว็บเป็นประเภท GET หรือเป็นประเภท POST วิธีทำก็ง่ายๆดังนี้

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// …
}


ระบบที่ทดสอบ
PHP: 5

ที่มา:
http://stackoverflow.com/questions/1372147/php-check-whether-a-request-is-get-or-post

วันอังคารที่ 4 มกราคม พ.ศ. 2554

วิธี FTP แต่ไม่เอา (exclude) บาง folder

มีรุ่นน้องถามมาว่าถ้าอยาก FTP เอาไฟล์แต่ว่าไม่อยากเอาโฟลเดอร์ที่มีชื่อบางอย่าง เช่น โฟลเดอร์ .svn ที่มีอยู่ในทุกๆโฟลเดอร์ย่อยมาด้วยจะทำยังไง

จริงๆก็คงทำได้หลายวิธี แต่วิธีที่ผมชอบสุดคงเป็น wget ครับ

wget -r ftp://url/folder --exclude-directories="*/foldername"


เช่น ถ้าต้องการ copy ตั้งแต่โฟลเดอร์ xyz ลงไปทั้งหมด แต่ไม่เอาโฟลเดอร์ .svn ก็ทำดังนี้

wget -r ftp://abc.com/xyz --exclude-directories="*/.svn"


ในกรณีที่ต้องมี username, password ก็ให้ execute command สำหรับการ log in ไปก่อน ดังนี้

wget --execute "login=username" --execute "passwd=password" -r ftp://abc.com/xyz --exclude-directories="*/.svn"

จริงๆพวก username, password ใส่ไว้รวมกับ ftp://username:password@abc.com/xyz เลยก็ได้ แต่จะมีปัญหาถ้า username มี special character เช่น เครื่องหมาย "@"

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

อ้างอิง
http://www.gnu.org/software/wget/manual/wget.html