สำหรับแฟนๆ เว็บเบราว์เซอร์ Mozilla Firefox คงได้ยินข่าวคราวกันมาแล้วบ้างว่า Firefox เวอร์ชัน 3 กำลังจะออกในช่วงกลางปีนี้ ในบ้านเราก็ตื่นตัวกับเรื่องนี้และพยายามผลักดันให้ภาษาไทยได้เป็น supported language ทำให้ผู้ใช้บ้านเราไม่ต้องมาคอยโหลดตัวตัดคำ ตั้งค่าโน่นนี่เอาเอง แค่โหลดมาลงก็ใช้ได้ทันที!

ปัญหาที่ผู้ใช้ Firefox บ้านเราเจอกันและเป็นอุปสรรคใหญ่มากคือตัวของ Firefox มันตัดคำไทยไม่ได้ ทำให้เวลาเข้าเว็บหลายๆ แห่งแล้วหน้าตามันจะดูเละๆ (แต่บางเว็บมันก็หน้าตาเละๆ ด้วยตัวมันเองอยู่แล้ว ไม่เกี่ยวกับ Firefox สักหน่อย) ปัญหานี้ค้างมาเป็นเวลานาน แต่ในที่สุดก็ได้รับการแก้ไขให้ตัดคำไทยได้สวยงามทั้งบน Windows, GNU/Linux และ Mac ในเวอร์ชัน 3 นี่เอง

ปัญหารองลงมาอีกคือ ค่าปริยาย (default) ของ Firefox มันออกแบบมาไม่เหมาะกับผู้ใช้บ้านเรา เปิดเว็บแล้วตัวหนังสือเล็กไปบ้าง ใหญ่ไปบ้าง ไม่รู้จะไปแก้ค่าตรงไหน ซึ่งใน Firefox 3 มีวิธีการแก้ปัญหานี้แล้ว หลังจากนี้ไปถ้าโหลดเวอร์ชันภาษาไทยมาใช้ ก็จะตั้งค่าเริ่มต้นให้แล้ว ดูได้สวยงาม

สำหรับคนที่ต้องการทดสอบ Firefox 3 Thai Localized Build (ตัดคำได้สวยงาม หน้าตา เมนู เป็นภาษาไทย) ที่ทีมงานทำขึ้นมา สามารถดาวน์โหลดได้จากหน้าโครงการ

  • Firefox ตัวจริงจะออกตอนกลางปี ตัวปัจจุบันล่าสุดที่มีให้ใช้คือเวอร์ชัน beta5 สำหรับรุ่น Thai Localized Build ที่เอามาให้ดาวน์โหลดกันนี้สร้างจากโค้ดล่าสุดของทาง Mozilla เอง
  • ดาวน์โหลด Firefox 3 รุ่นภาษาไทย มีทั้งบน Mac OS X (Universal binary), GNU/Linux, และ Windows XP (สำหรับ Windows Vista จะตามมาในเร็ววัน)
  • ถ้าพบปัญหา แปลไม่ถูกใจ ใช้งานยาก ส่ง feedback กลับมาได้ที่ หน้ารวม issue ของโครงการ (ต้องมี account ของ Google)

บางคนอาจจะสงสัยว่า “ทำไมต้องไปแปลหน้าตาของ Firefox ให้มันเป็นภาษาไทยด้วย ในเมื่อภาษาอังกฤษก็ใช้งานได้ดีอยู่แล้ว” แต่จริงๆ แล้วยังมีผู้ใช้ในบ้านเราอีกจำนวนมากที่ประสบปัญหาในการใช้งานโปรแกรมที่มีหน้าตาเป็นภาษาอังกฤษ (เช่น กลุ่มเด็กนักเรียนหรือคุณลุงคุณป้า) อยากให้ลองช่วยกันใช้ ช่วยกันทดสอบ แล้วแจ้งปัญหากลับมาเพื่อเราจะได้มีโปรแกรมดีๆ ไว้ใช้กัน

ติดตามความคืบหน้าของการพัฒนา Firefox 3 รุ่นภาษาไทย ได้ที่ Google Code และ Google Groups

Google App Engine

by pittaya

Google App Engine เป็นหมัดเด็ดของ Google ที่ออกมาเพื่อต่อกรกับ Amazon Web Services ของ Amazon โดยเฉพาะ

ในขณะที่ AWS มีบริการให้ใช้คือ S3 (เก็บข้อมูล), EC2 (ประมวลผล) และ SimpleDB (ฐานข้อมูล) แต่ละบริการจะแยกออกจากกัน จะใช้ทั้งหมดหรือแค่ตัวใดตัวหนึ่งก็ได้ แต่สำหรับบริการของ Google App Engine จะต่างออกไป โดย Google จะให้บริการแบบครบวงจรกว่า แยกใช้งานแบบเป็นบริการเดี่ยวๆ ไม่ได้

บริการของ Google App Engine จะมีลักษณะเป็นการให้บริการ infrastructure ที่ระดับ high-level มากกว่า โดยสามารถรัน application ที่เขียนด้วยภาษา python เท่านั้น (ภาษาอื่นจะตามมาในอนาคต) ทาง Google จะมี SDK มาให้นักพัฒนาสามารถเขียนโปรแกรมทดสอบในเครื่องตัวเองได้ก่อน แล้วนำมา deploy ลงในระบบของ Google App Engine ทีหลังได้ โดยระบบเก็บข้อมูลจะใช้ GFS และใช้ฐานข้อมูล BigTable

Google App Engine ในช่วงแรกจะเปิดแบบ beta ให้นักพัฒนา 10,000 คนแรก และจำกัดการใช้งานไว้ที่เนื้อที่ 500 MB และ bandwidth ไม่เกิน 10 GB ต่อวัน หลังจากนั้นเมื่อเปิดเต็มตัวแล้วจะมีโมเดลเก็บเงินอีกครั้งหนึ่ง (ยังไม่กำหนดราคา)

ในช่วงปี 2005 ตอนนั้น Google ไปจ้าง Guido Van Rossum คนสร้างภาษา python เข้ามาทำงานด้วย เป็นข่าวฮือฮาอยู่พักนึงว่า Google จะจ้างเอาไปทำอะไร แต่เจ้าตัวก็ติด NDA พูดอะไรมากไม่ได้ สุดท้ายเวลาผ่านไป 3 ปี ก็ได้ Google App Engine ออกมาให้ได้ลองใช้กัน

นอกจากนี้แล้ว Google App Engine ยังสนับสนุน Django ซึ่งเป็น web framework ยอดฮิตในภาษา python ด้วย ทำให้การสร้าง application สามารถทำได้รวดเร็วยิ่งขึ้น (ตัวอย่างเว็บที่ใช้ django ก็เช่น Pownce, Revver)

เปรียบเทียบกันแล้ว Google App Engine ยังเป็นรอง Amazon Web Service อยู่พอสมควร เนื่องจากที่ว่ามันใช้ได้แค่ python ภาษาเดียวเท่านั้น ซึ่งจำนวนนักพัฒนา python (สำหรับเว็บ) เมื่อเทียบกับ PHP หรือ Ruby แล้วยังห่างกันเยอะมาก และในปัจจุบัน application จำนวนมากพิสูจน์แล้วว่า AWS นั้นสามารถใช้งานได้ในระดับใหญ่จริง (เช่น Twitter, Pownce, Slideshare ฯลฯ)

นักพัฒนาที่มี application เก่าที่เป็นภาษาอื่น คงยากที่จะยอมย้ายมาลงบน platform ของ Google สู้ไปใช้งาน AWS เฉพาะในส่วนที่จำเป็นจะดีกว่า อันนี้ก็เป็นปัญหาของ Google ต่อไปที่ต้องเร่งมือทำให้ Google App Engine รองรับภาษาอื่นมากขึ้น ถ้าให้เดา ภาษาถัดไปน่าจะเป็น Ruby (คนต่อไปที่จะโดนจ้างอาจเป็น MatZ หรือ David Heinemeier Hansson)

อ่านเพิ่มเติมจากแหล่งข่าว

ลิงค์ที่เกี่ยวข้อง

Agile vs. CMMi

by pittaya

ไปอ่านเรื่อง Behavioral-Driven Development มาจาก blog ของ อ.มะนาว ติดใจตรงที่เขียนว่า

ถ้าสวมวิญญาณพวก agile คงบอกว่า code คือ document (อันนี้จะตรงกันข้ามกับพวกสาย cmmi เพราะสายนั้นกะว่าจะเขียน document แล้ว generate ออกมาให้เป็น code แทน)

ถึงแม้ว่าผลลัพธ์สุดท้ายจะได้ออกมาทั้ง code และ document แต่ผมว่าการเขียน code มันสนุกกว่าการเขียน document เป็นไหนๆ เลยนะ

ปกติผมใช้ Cyberduck เป็น FTP client สำหรับการอัพโหลดไฟล์ต่างๆ ขึ้นเวบ การใช้งานก็ง่ายดี แค่ลากไฟล์จาก Finder ไปหย่อนลงในหน้าต่างของ Cyberduck แล้วมันก็จะอัพโหลดให้ แต่ว่าปัญหาอย่างหนึ่งที่กวนใจคือ ใน Finder มันไม่แสดงไฟล์ที่ถูกซ่อนไว้ ส่วนใหญ่ก็เป็นไฟล์ระบบทั้งหลายแล้วก็ไฟล์ที่ขึ้นต้นด้วยจุด (.) สำหรับการใช้งานทั่วๆ ไปก็ไม่ได้สนใจไฟล์เหล่านี้อยู่แล้ว ยกเว้นแค่ไฟล์เดียวคือ .htaccess

.htaccess เป็นไฟล์สำหรับกำหนดค่าการทำงานของเว็บเซิร์ฟเวอร์ apache ซึ่งที่ใช้งานบ่อยๆ ก็จะใช้ทำพวก url rewrite หรือกำหนดค่า default บางอย่าง แล้วทีนี้ในเมื่อ Finder มันไม่โชว์ไฟล์ .htaccess ก็ไม่รู้จะลากไฟล์ไปลงเซิร์ฟเวอร์ยังไง

วันนี้นึกวิธีแก้ไขออกคือ ปกติผมใช้ TextMate เป็นตัวเขียนโปรแกรมอยู่แล้ว ซึ่งตัว TextMate มันจะมี drawer ข้างๆ แสดงไฟล์ที่กำลังใช้งานอยู่แล้ว และเจ้า TextMate เนี่ยมันฉลาดอยู่แล้ว รู้ว่า .htaccess เป็นไฟล์ที่โปรแกรมเมอร์ใช้งาน มันก็เอามาโชว์ให้ดู ดังนั้นเวลาจะอัพโหลดไฟล์ .htaccess นี่ก็แค่ลากจากใน drawer ของ TextMate ไปใส่ใน Cyberduck ได้เลย

ง่ายๆ อย่างงี้ทำไมเพิ่งนึกออก

Tweetfreq 0.1

by pittaya

ช่วง 2-3 วันนี้ หลังจาก BarCamp Bangkok บรรดาผู้ร่วมงานหลายคนเกิดอาการติด twitter กันงอมแงม วันนี้ตอนที่อ่าน tweet ของคนโน้นคนนี้ไปมาก็เกิดอาการคัน อยากลองเล่น API ของ twitter ดู ก็เลยเป็นที่มาของ Tweetfreq ตัวนี้

Tweetfreq เป็นตัวสร้างกราฟบอกความถี่ในการ tweet ภายใน 24 ชม. ของเรา หลักการทำงานก็คือตัว Tweetfreq จะคอยไปดึงค่า user timeline ของเรากำหนดเพื่อนำมาเก็บเป็น log ไว้ แล้วเอามาสร้างกราฟบอกความถี่ในการ tweet ของเรา

ทีแรกเขียนไว้เป็น python แต่ว่า server บางเครื่องไม่มี python ก็จะรันไม่ได้ ทำให้ต้องเปลี่ยนโค้ดมาเป็น PHP แทน โดยส่วนการดึงข้อมูล user timeline ใช้ cURL library ดูดมาเป็น format RSS จากนั้นเอามา parse ด้วย simplexml สุดท้ายตอนสร้างกราฟใช้ Google Chart API

Requirement

PHP 5.2 ขึ้นไป และต้องมี cURL library ด้วย

Installation

เอาไฟล์ tweetfreq.php ไปวางไว้บน server แล้วตั้ง cron ให้มาเรียกทำงานทุกๆ 5 หรือ 10 นาทีก็ได้ โดย script ตัวนี้จะสร้างไฟล์ไว้ใน directory เดียวกันสองไฟล์ ชื่อ tweets.txt เอาไว้เก็บข้อมูลการ tweet และไฟล์ tweets.png ซึ่งเป็นกราฟที่สร้างขึ้นโดยผ่านทาง Google Chart API

License

ใช้สัญญาอนุญาตแบบ Creative Commons Attribution 3.0 ใครอยากเอาไปพัฒนาต่อ ทำได้ตามสบาย

Download

โหลดได้ที่นี่

Todo

  • แก้เรื่อง timezone ของ server
  • แก้ส่วนที่ hard-coded ไว้ (เช่น สี, ขนาด ของกราฟ, url ของ feed) ให้สามารถคอนฟิกได้ง่ายๆ
  • ทำให้โค้ดอ่านง่ายกว่านี้

ถ้ามีปัญหาการใช้งานยังไง แปะไว้ได้ข้างล่างนี่ครับ

Thai on Android

by pittaya

หลังจากเมื่อวานลองเล่น emulator ของ Android ดูแล้วพบว่ามันแสดงผลภาษาไทยไม่ได้ ก็ได้คอมเมนต์จาก pradt ทำให้คิดว่าอาจเป็นเพราะฟอนต์ของ Android ไม่มีตัวหนังสือภาษาไทย บวกกับความช่วยเหลือจาก kengggg ทำให้รู้ path ของฟอนต์ที่อยู่ใน emulator

เราสามารถเรียกใช้งาน console ชองตัว emulator ได้เหมือนกับ linux ทั่วไป แต่คำสั่งบางอย่างก็ไม่มีให้ (อย่างเช่น mv หรือ find) ทำให้ตอนใช้งานก็ลำบากอยู่บ้าง แต่ก็สามารถลุยเข้าไปดูในไดเรกทอรีต่างๆ ได้ ลองดูใน /system/fonts ก็เห็นมีไฟล์ฟอนต์อยู่ตามนี้

DroidSans-Bold.ttf
DroidSans.ttf
DroidSansFallback.ttf
DroidSansMono.ttf
DroidSerif-Bold.ttf
DroidSerif-BoldItalic.ttf
DroidSerif-Italic.ttf
DroidSerif-Regular.ttf

ลองแก้เอาโง่ๆ เลยคือ backup ตัวฟอนต์ต้นฉบับเก็บไว้ก่อน จากนั้นก็เอาฟอนต์ Tahoma คือไฟล์ tahoma.ttf กับ tahomabd.ttf มาเปลี่ยนชื่อเป็น DroidSans.ttf กับ DroidSans-Bold.ttf ตามลำดับ แล้วใส่กลับเข้าไปใน emulator แทนฟอนต์เก่าโดยใช้ adb

$ adb push DroidSans.ttf /system/fonts/DroidSans.ttf
$ adb push DroidSans-Bold.ttf /system/fonts/DroidSans-Bold.ttf

ผลที่ได้คือ หน้าเวบที่แสดงผลแบบใช้ฟอนต์ตระกูล sans ก็สามารถแสดงภาษาไทยได้แล้ว

Thai on Android

วิธีนี้ออกจะเถื่อนๆ ไปหน่อย เพราะตัวหนังสือภาษาอังกฤษของเดิมก็จะถูกทับไปด้วยตัวหนังสือของฟอนต์ Tahoma ทางที่ดีควรจะเอาไฟล์ฟอนต์ของ emulator มาแก้โดยการเพิ่มตัวหนังสือภาษาไทยเข้าไปมากกว่า แต่คงต้องไปหัดใช้ fontforge เสียก่อน

Paranoid Android

by pittaya

ใครไม่รู้จัก Android ลองไปอ่านได้ที่ blognone

ตัว Emulator ของ Android มันจะมี web browser แถมมาให้ด้วย ลองเล่นๆ ดูปรากฏว่าเข้าเวบที่เป็น AJAX อย่าง Google Reader ได้ด้วย

Google Reader

แต่พอลองเข้า youtube ดันเล่นวิดีโอไม่ได้ แสดงว่าตอนนี้ยังใช้งาน flash ไม่ได้

YouTube on Android

ลองเช็ค user-agent ดู จะเห็นว่ามันเป็น WebKit

Android’s user agent

แต่สำหรับภาษาไทย ตอนนี้ยังแสดงผลไม่ได้ ออกมาเป็นแค่ตัวสี่เหลี่ยม

Thai on Android

ทดลองเล่น emulator แค่นี้ก่อน วันหลังจะลองเขียน app ดูมั่ง

Cropping E-book

by pittaya

วันก่อนไปค้นเจอ e-book เล่มนึงที่อยากอ่านมานานแล้ว แต่เวอร์ชันที่ไปเจอมานี้ มันเป็นต้นฉบับเอามาสแกน แล้วเซฟเป็นไฟล์ภาพ ทีละหน้าๆ แล้วถึงเอามารวมเป็น pdf ไฟล์นึง ทำให้หนังสือยาว 500 กว่าหน้านี้ มีขนาดไฟล์ใหญ่ถึง 246 MB และที่สำคัญอีกอย่างหนึงคือ ไฟล์ pdf แต่ละหน้ามีขนาดใหญ่ แต่ว่าเนื้อหาที่เป็นรูปมีขนาดนิดเดียว ประมาณในรูปนี้

E-book
เนื้อหามีกระจิ๊ดเดียว

อยากจะ crop เอาเฉพาะเนื้อหาที่อยู่ข้างใน มันก็เลยต้องมีขึ้นตอนกันเล็กน้อย อันดับแรกคือ ใช้ Automator เซฟทุกๆ หน้าของ pdf ไฟล์นี้ออกมาเป็นรูป png ความละเอียด 200 dpi

กระบวนการ crop เอาแต่เนื้อหาที่ต้องการ ใช้คำสั่งจาก Imagemagick

for $f in *.png
do
convert $f -fuzz 20% -trim +repage $f
done

พอดีช่วงนี้กำลังเห่อ ipod ก็เลยอยากเอาหนังสือเล่มนี้ยัดลงไปใน ipod เพื่ออ่านตอนอยู่นอกบ้านได้ด้วย ซึ่งก็มีวิธีอยู่สองแบบคือใช้ OCR แปลงจากรูปภาพไปเป็นข้อความ แล้วเซฟเป็น Note เอาไว้อ่าน และวิธีที่สองคือตัดหนังสือเป็นไฟล์รูปภาพ แล้วใส่เข้าไปใน photo gallery แทน

วิธีแรกเป็นอันต้องตกไปด้วยเหตุผลที่ว่า หาโปรแกรม OCR ภาษาไทยบน Mac ไม่ได้ และต่อให้แปลงออกมาเป็น text ได้ แต่ใน ipod nano รุ่นนี้มันก็อ่านภาษาไทยไม่ได้อยู่ดี สรุปคือ ต้องใช้วิธีที่สอง

ข้อจำกัดการแสดงผลรุปภาพบน ipod คือ มันสามารถแสดงได้เฉพาะแบบพอดีกับหน้าจอเท่านั้น ซูมเข้า ซูมออกไม่ได้ แต่เนื่องจากหนังสือเล่มนี้ตัวหนังสือมีขนาดใหญ่พอ ก็เลยจะใช้วิธีการตามรูป

Cropping E-book
แบ่งหน้า

ก็คือการแบ่งหนังสือหน้าหนึ่งออกเป็นสองส่วน ส่วนละ 320×240 pixel (ขนาดหน้าจอของ ipod) ทำให้หนังสือหนึ่งหน้า ประกอบด้วยไฟล์รูปสองไฟล์ ถ้าตั้งชื่อให้เรียงกันดีๆ ก็จะอ่านได้ต่อเนื่องกัน

for $f in *.png
do
# ย่อขนาดให้เหลือพอดีกับที่จะตัด
convert $f -resize 320×440! $f

# crop เอาส่วนบนของหน้า
convert $f -crop 320×240+0+0 cropped/`basename $f .png`”1.png”

# crop เอาส่วนล่างของหน้า (ให้เหลื่อมกับส่วนบนเล็กน้อย เวลาอ่านจะได้ไม่งง)
convert $f -crop 320×240+0+200 cropped/`basename $f .png`”2.png”
done

หลังจากนั้น sync รูปพวกนี้กับ ipod ผ่านทาง iTunes ก็เป็นอันเรียบร้อย

Pipes

by pittaya

ลองเช็คสถิติจาก google reader พบว่า Feed ที่อ่านบ่อยที่สุด คือ feed ข่าวกีฬาจากเวบผู้จัดการ (ราวๆ 30 ข่าวต่อวัน) แต่ว่า feed ตัวนี้มันเป็น “ข่าวกีฬา” แบบรวมๆ ทำให้มีข่าวที่ไม่สนใจจะอ่านโผล่มาให้เห็นอยู่เรื่อยๆ เช่นข่าวเทนนิส, แข่งรถ, NBA, NFL อะไรพวกนี้ ซึ่งไม่ได้สนใจจะอ่านเลย ที่อยากอ่านมีแต่ข่าวฟุตบอลอย่างเดียว

ก็เลยมานั่งคิดดูว่า ทำยังไงถึงจะ filter เอาข่าวที่ไม่สนใจพวกนี้ออกไปได้ สุดท้ายก็มาปิ๊งไอเดียว่า ใช้ Yahoo Pipes ดีกว่า

Yahoo Pipes เป็นบริการสำหรับ ตัด ต่อ ผสม ข้อมูลที่อยู่บนเวบในรูปแบบต่างๆ (ทั้ง feed, csv, xml ฯลฯ) ขั้นตอนการทำก็คือ จับเอาโมดูล Fetch feed มาวางก่อน แล้วใส่ URL ของ feed ที่เราต้องการลงไป (ในกรณีนี้คือ feed ข่าวของผู้จัดการ) จากนั้นก็ต่อ output ของ Fetch feed มาลงที่โมดูล Filter แล้วใส่กฎให้มันบล็อกทุก item ที่ใน description มีคำว่า “บาสเกตบอล” หรือ “เทนนิส” อยู่ สุดท้ายก็ต่อ output ออกไปที่ Pipe output

เท่านี้เราก็ได้ feed ข่าวกีฬาที่ไม่มีข่าวบาสเกตบอล และข่าวเทนนิสแล้ว (ด้วยวิธีลูกทุ่งๆ หน่อย คิดวิธีหรูกว่านี้ไม่ออก) แต่พอลองเปิดดูเนื้อหา feed ดูแล้วพบว่า มันอ่านไม่ออก ก็ต้องย้อนไปดูที่ feed ต้นฉบับซึ่งก็เป็นอย่างที่คิด คือ มันใช้ encoding แบบ Windows-874 พอดูดเข้าไปใน yahoo pipes ที่มันเป็น UTF-8 มันก็เลยออกมาอ่านไม่ออก

ไปดูในโมดูลต่างๆ ที่มีให้ใช้ ก็ไม่เห็นมีโมดูลสำหรับแปลง encoding (ท่าทาง yahoo คงคิดว่าโลกนี้เค้าใช้ utf-8 กันหมดแล้ว) ทางแก้ที่พอคิดออกคือ แปลง feed จาก windows-874 ให้กลายเป็น utf-8 ก่อน แล้วค่อยเอาใส่ pipes ก็เลยต้องเขียน script ขึ้นมาทำเอง ประมาณนี้

< ?php
$content = @file_get_contents("http://www.manager.co.th/RSS/Sport/Sport.xml");
header("Content-Type: text/xml; charset=utf-8");
echo iconv('cp874', 'utf-8', $content);
?>

แล้วก็ให้โมดูล Fetch feed ของ pipes มาดึงเอาจาก script ตัวนี้แทน

Yahoo Pipes

ประมาณเอาคร่าวๆ ก็ลดจำนวนข่าวจาก feed นี้ไปได้เกือบครึ่งเลย

Vote NO on Facebook

by pittaya

ใครใช้ Facebook สามารถแปะแบนเนอร์ we vote no ในหน้า profile ได้แล้ว เพียงแค่ add “We Vote No” application

We Vote No

App ตัวนี้จะสุ่มแบนเนอร์ (มีอยู่ 6 แบบ - แนวนอนกับแนวตั้ง อย่างละ 3 รูป) ขึ้นมาแสดง ถ้าคลิกที่แบนเนอร์ก็จะลิงค์ไปที่เวบ wevoteno

เสียดายที่ app ตัวนี้อายุมีแค่ 2 วัน พอหลังจากวันลงปาหี่มติก็ล้าสมัยไปแล้ว น่าจะทำออกมาเร็วกว่านี้

Next Page »