หน้าเว็บ

วันจันทร์ที่ 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