CWT powered by Python!
Moblin 2.1 กับภาษาไทย และ wireless
เมื่อวันเสาร์ที่ผ่านมาผมได้ไปต่อแถวซื้อ Windows 7 (ราคาโปรโมชั่น) พอได้ก็รีบเอามาลองใน netbook (Lenovo S10) ปรากฏว่ายังไม่ถูกใจเท่าไหร่ ประกอบกับตอนนี้ที่ office มี laptop อีกตัวให้ใช้ทำงานแล้ว เจ้า netbook นี่เลยกลายเป็นของที่ผมจะลงอะไรเล่นก็ได้ ก็เลยลองเอา Moblin 2.1 ซึ่งยังเป็นตัว preview มาลองดู ซึ่งวิธีการลงก็ง่ายมากครับ แค่ download image มาเขียนลง flash drive หรือ DVD แล้วก็ boot ได้เลย ตอน boot จะมี menu ถามว่าจะ run แบบ live image หรือจะ install ซึ่งผมก็ เลือก install
ขั้นตอนการลงก็ไม่ได้ต่างจากการลง Linux distro อื่นๆ นัก แต่ตัดขั้นตอนต่างๆ ให้ง่ายกว่าเดิม พอลงเสร็จ และ reboot เครื่องก็พบกับสิ่งที่น่าประทับใจทันที นั่นคือการ boot ที่เร็วอย่างไม่น่าเชื่อ แค่ประมาณ 15 วินาทีเท่านั้น เสร็จนี่คือพร้อมใช้งานเลยนะครับ harddisk ก็หยุดการอ่านแล้ว GUI ขึ้นมาพร้อมใช้งานได้ทันที
สิ่งแรกที่ผมตรวจสอบเจ้า Moblin ที่ boot ขึ้นมาคือการเชื่อมต่อกับ network ซึ่งก็พบว่า wireless นั้นใช้ไม่ได้ แต่ใช้ LAN และ Bluetooth ได้ทันที ซึ่งก็ไม่น่าแปลกใจเพราะเจ้า S10 นี้ใช้ chip wireless ของ broadcom ซึ่งยังไม่มี driver แบบ opensource ดังนั้นผมจึงต้องเสียบสาย LAN ไปก่อนเพื่อไป download driver
เนื่องจาก Moblin นี้มีระบบการจัดการ package ที่อินเทลใช้คำว่า "ยืม" มาจาก Fedora ดังนั้นผมจึงเปิด terminal แล้ว sudo -i เป็น root shell จากนั้นก็สั่ง
# yum upgrade
เพื่อทำการ upgrade ทุกๆ package ให้เป็นตัวล่าสุดเสียก่อน จากนั้นก็ reboot หนึ่งรอบ แล้วก็ลง kernel-headers, kernel-netbook-devel และ "Development Tools" เพราะผมต้องการจะ compile wireless driver เอง
# yum install kernel-headers
# yum install kernel-netbook-devel
# yum groupinstall "Development Tools"
เท่านี้ก็พร้อมที่จะ compile wireless driver แล้วครับ ต่อไปก็ download driver จากเว็บ broadcom (http://www.broadcom.com/support/802.11/linux_sta.php) ก็เลือกเอาตัว 32-bit มาครับ เพราะ Atom N270 ใช้ 64-bit ไม่ได้อยู่แล้ว และเจ้า Moblin ก็ยังไม่ได้ออก image สำหรับ 64-bit ด้วย
พอได้ driver มาเสร็จก็ compile
# mkdir wl
# cd wl
# tar zxvf <path-to-file>/hybrid-portsrc-x86_32-v5.10.91.9.3.tar.gz
# make
# make install
เป็นอันเสร็จสำหรับเรื่อง wireless ไปอย่างครับ ลอง reboot ดู wireless ควรจะ "ON" และเจอ SSID ที่อยู่รอบๆ ได้ สำหรับผม ก็จัดการ ถอดสาย LAN แล้ว connect เข้า wireless router แทน
ขั้นต่อไปก็คือเรื่อง font ภาษาไทย ที่โครงการ Moblin ยังไม่มีมาให้ ผมจึงไป download SRPM "thai-scalable-fonts" ของ Fedora 11 มาแล้วแก้ SPEC นิดหน่อยให้มันใช้ ThaiFonts-Scalable ตัวล่าสุด แล้วก็สร้างเป็น RPM ซึ่งมีขั้นตอนค่อนข้างยาว และยุ่งยาก ผมจึง upload RPM ที่ทำเสร็จแล้วไว้ที่ http://cwt.bashell.com/files/moblin/ คนที่ต้องการสามารถเอาไปใช้ได้เลย เช่นถ้า download ทุกไฟล์ไว้ในที่เดียวกันหมด ก็สั่ง
# rpm -Uvh *.rpm
ได้ทันที แต่พอลงเสร็จแล้วจะต้องมีการปรับแต่งนิดหน่อยเพื่อการแสดงผลที่สวยงาม เริ่มจากจับ fonts เหล่านี้ไปเข้ากลุ่มที่มันควรอยู่ (serif, sans-serif, monospace)
# cd /etc/fonts/conf.d
# ln -s ../conf.avail/64-ttf-thai-tlwg.conf
แล้วก็ไปที่ tab (menu) ของ Moblin เลือก application มันจะมีช่องสำหรับค้นหา applications ต่างๆ ในเครื่อง ก็พิมพ์ "font" ลงไป จะเจอ "Wallpaper and Fonts" นั่นแหละครับ เปิดมาตั้งค่า font ได้เลย โดยปกติ Moblin จะเลือก font ตระกูล Droid มาให้ ก็เปลี่ยนเป็น Sans หรือ Serif ตามใจชอบ แต่ Fixed width font ผมยังใช้ Droid Sans Mono อยู่นะครับ มันสวยดี
ส่วน Rendering เลือกเป็นแบบ Subpixel smoothing (LCDs) ด้วยก็ดีครับ ผมว่ามันคมขึ้นกว่าเดิม อันนี้ก็แล้วแต่ความชอบของแต่ละคน
ตอนนี้ก็มี font แล้ว อ่านไทยได้แล้ว ก็ต้องทำให้มันพิมพ์ไทยได้ด้วยถึงจะครบ ก็เข้าไปที่ applications อีกครับ คราวนี้ search keyboard จะเจอ Keyboard กับ Keyboard Shortcuts ครับ ให้เลือก Keyboard แล้วก็เพิ่ม Layouts "Thailand" ลงไปได้เลย อย่าลืมเลือกปุ่มเปลี่ยนภาษาใน "Layout Options..." ด้วย สำหรับผมก็ใช้ Alt+Shift กับ Alt+Space ครับ (ติดจาก OSX) เสร็จแล้วครับ แต่การเปลี่ยนภาษาใน Moblin นี่จะไม่มีอะไรบอกเรานะครับว่าตอนนี้ใช้ภาษาอะไรอยู่ ก็ต้องลองพิมพ์ดูครับ ถ้าไม่ใช่ภาษาที่ต้องการก็กดปุ่มเปลี่ยนภาษาเอา
ขอให้โชคดีและสนุกกับ Moblin ครับ
Google Wave Workshop - Day 1
ในที่สุด bot ก็คุยกับผมได้แล้ว ใส่คำสั่งภาษา python ลงไปให้มันทำงานได้ด้วย

code ที่ใช้
# -*- encoding: utf-8 -*-
from waveapi import events
from waveapi import model
from waveapi import robot
from waveapi import document
import logging
def OnParticipantsChanged(properties, context):
"""Invoked when any participants have been added/removed."""
added = properties['participantsAdded']
for p in added:
Notify(properties, context)
def OnRobotAdded(properties, context):
"""Invoked when the robot has been added."""
root_wavelet = context.GetRootWavelet()
root_wavelet.CreateBlip().GetDocument().SetText("Wazzup!")
def Notify(properties, context):
root_wavelet = context.GetRootWavelet()
root_wavelet.CreateBlip().GetDocument().SetText("Yo Man!")
def on_blip_submitted(properties, context):
blip = context.GetBlipById(properties['blipId'])
contents = blip.GetDocument().GetText()
if 'mr.fusion' in contents.lower():
man_img = document.Image('http://www.pantip.com/cafe/toy/image/man.gif')
new_blip = blip.CreateChild()
new_blip.GetDocument().AppendElement(man_img)
new_blip.GetDocument().AppendText(u'...เข้ามาดู')
else:
try:
pyobj = eval(contents)
except Exception, e:
pyobj = u'%s' % contents
new_blip = blip.CreateChild()
new_blip.GetDocument().SetText(unicode(pyobj))
if __name__ == '__main__':
myRobot = robot.Robot('chaiwat-suttipongsakul',
image_url='http://cwt.bashell.com/files/img/cwt.png',
version='9',
profile_url='http://cwt.bashell.com/')
myRobot.RegisterHandler(events.WAVELET_PARTICIPANTS_CHANGED, OnParticipantsChanged)
myRobot.RegisterHandler(events.WAVELET_SELF_ADDED, OnRobotAdded)
myRobot.RegisterHandler(events.BLIP_SUBMITTED, on_blip_submitted)
myRobot.Run()
ภาพ HDR
เคยถ่ายภาพแล้วเอามาทำ HDR ไว้ตั้งแต่ตอนไปทำงานที่ New York

อยากรู้เรื่อง HDR ก็ต้องรู้เรื่อง DR (Dynamic Range) ก่อน ลองหาด้วย google แล้วเจอ บทความนี้ เกี่ยวกับการมองเห็นของมนุษย์ครับ และเรื่อง HDR จาก wikipedia ลองอ่านดูเลย

