Thai on Android

หลังจากเมื่อวานลองเล่น 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

ใครไม่รู้จัก 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

วันก่อนไปค้นเจอ 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

ลองเช็คสถิติจาก 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

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

We Vote No

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

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