Tech

CameraWindow on OSX

I have recently installed the bundle softwares that come with my Canon's camera to get the PhotoStich app. Without any knowledge I installed CameraWindow altogether. And it annoys me by showing an alert box every time I attach my USB cable to my iPhone or insert the SD card. If I forgot to remove the SD card before open the computer, it automatically greets me with the same alert box when the computer finish booting.

Today I just found the solution to keep the CameraWindow to keep silence without throwing it into trash.

  1. Open iPhoto.
  2. Go to iPhoto > Preferences....
  3. In the option "Connecting camera opens", change the option to "No application"

and voila. Goodbye CameraWindow. And see you only when I want you.

Accessibility Shortcuts

ถึงจะรู้ว่าในเรื่อง Accessibility มีคีย์ลัดอย่าง Access Key ให้ใช้ แต่ก็ไม่ได้ใช้เลยเพราะว่าเคยได้ยินว่าให้กดปุ่ม Alt + access key แต่กลับไม่สำเร็จซักครั้งเลยไม่เชื่อว่ามันจะใช้ได้จริง

วันนี้ลองเข้าเว็บของท่านนายก เพิ่งเห็นว่ามีหน้า Accessibility Help อธิบายการใช้งานเว็บมาให้ครบครัน ลองกดเล่นดูถึงได้รู้ว่าพวก Access Key ทั้งหลายทำงานได้จริง ใช้สำหรับเป็นแนวทางในการเอาไปใช้กับเว็บของท่านได้ตามสะดวก ขอบพระคุณคณะผู้จัดทำ

ข้อสังเกต แต่ละบราวเซอร์ใช้คีย์ไม่เหมือนกัน แล้วใครมันจะรู้ฟระ แมร่ง!

iPhone and Thai language input method

ตอนนี้ผมใช้ iPhone ครับ เพิ่งใช้มาได้ไม่กี่เดือน ตอนที่ซื้อก็มีคนบอกว่ารออีกหน่อยก็ได้ iPhone 4 แล้วนะ แต่ตอนนั้นผมไม่มีโทรศัพท์ใช้ ก็เลยซื้อมาใช้เลยโดยไม่แคร์ว่าอีกสองเดือนมันจะออกรุ่นใหม่

แน่นอนว่าเครื่องที่ใช้อยู่นั้นผมจัดการ jailbreak แล้วเรียบร้อย จุดประสงค์หลักไม่ใช่เพราะแอปแคร็ก แต่เพราะจะลง Anki ตอนนั้นผมยังไม่ประสีประสาครับ คำถามแรกที่ถามเพื่อนที่ใช้iPhoneมาอย่างโชกโชนคือ jailbreak แล้ว เค้าลงโปรแกรมอะไรกันบ้าง คำตอบแรกคือ คีย์บอร์ดไทย

คำตอบว่าคีย์บอร์ดไทยเป็นคำตอบที่ค่อนข้างน่าตกใจเล็กน้อยเพราะผมก็ใช้ iPhone อยู่ พิมพ์ไทยก็ได้อยู่ ก็สงสัยว่าทำไมต้องลงด้วยทั้งๆที่ iPhone ก็มีให้ คำตอบคือมันไม่เหมือนกับที่ใช้กับคอมพิวเตอร์ พอมีข่าวเรื่องฟีเจอร์ใน iPhone 5 ก็มีคนบอกว่าอยากได้คีย์บอร์ดไทยอีก เลยยิ่งสงสัยหนักว่า คีย์บอร์ดที่ใช้ใน iPhone ไม่ดีตรงไหนนอกจากไม่ชิน

สำหรับผมแล้ว ผมเข้าใจว่า iPhone ใช้คีย์บอร์ดที่ทำใหม่เนื่องจากคีย์บอร์ดไทยที่เราใช้กันอยู่ทุกวันนี้มันไม่ได้ทำให้เราพิมพ์ได้เร็วเลย อย่าลืมว่าเหตุผลของการเรียงตัวอักษรแบบนี้ส่วนหนึ่งก็เพราะต้องการลดความเร็วในการพิมพ์ให้ช้ากว่าการตีแป้นของเครื่องพิมพ์ดีด ในเมื่อเป็นเช่นนั้นการที่แอปเปิลเลือกใช้คีย์บอร์ดแบบประหลาดนี่จะต้องมีเหตุผลที่มากกว่าอย่างเด่นอยากดังแน่ๆ ที่เดาก็คือเลือกเอาตัวที่ใช้บ่อยๆ มาอยู่หน้าแรก และเรียงปุ่มให้กดได้ง่ายด้วยนิ้วเดียวหรือสองนิ้วแน่ๆ แถมขนาดคีย์บอร์ดสามแถวแบบที่ให้มาผมยังกดพลาดบ่อยๆ ไปใช้สี่แถวที่ตัวเล็กกว่า ไม่กดพลาดกันบ่อยกว่าหรือนั่น

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

ปล. ระหว่างที่เขียนๆไปก็ระแวงไปว่าจะมีคนอ่านแล้วคิดว่าเราโดนแอปเปิลล้างสมองเป็นสาวกไปแล้วรึเปล่า ขอสารภาพว่า ผมโดนล้างสมองง่ายมากครับ เปลี่ยนจากใช้ vim ไปใช้ emacs เพราะเห็น theme สวยก็มีมาแล้ว ดังนั้นทุกท่านสามารถสันนิษฐานไว้ก่อนได้ว่ากระผมถูกล้างสมองไปเรียบร้อยแล้ว

The Rules of BarCamp, once again

Barcamp Bangkok 3.5 is coming near. Just want to remind everyone who wants to participate about the rules of Barcamp.

  • 1st Rule: You do talk about BarCamp.
  • 2nd Rule: You do blog about BarCamp.
  • 3rd Rule: If you want to present, you must write your topic and name in a presentation slot.
  • 4th Rule: Only three word intros.
  • 5th Rule: As many presentations at a time as facilities allow for.
  • 6th Rule: No pre-scheduled presentations, no tourists.
  • 7th Rule: Presentations will go on as long as they have to or until they run into another presentation slot.
  • 8th Rule: If this is your first time at BarCamp, you HAVE to present. (Ok, you don't really HAVE to, but try to find someone to present with, or at least ask questions and be an interactive participant.)

by Tantek Çelik as parodied from The Rules of Fight Club.

Register now

Longdo bookmarklet

Personally, I use Longdo dict as my default dictionary. In fact, Longdo provides many channels and tools to lookup the meaning for the given word. One of my favorite channel is open search.

However, open search has its downside. I don't want to switch between longdo and google back and forth so I wish I could have more convenient way. So I take a look at Denshi Jisho's bookmarklet and replace its url with Longdo's.

If you want to use the bookmarklet, drag this link to your bookmark bar. Select a word and click the bookmark.

Thanks @keekung, @bact and @tpagon for error report.

Pickle some parts of object

ใน Python มีกระบวนการอย่างหนึ่งเรียกว่า pickle ซึ่งใช้ในการแปลงข้อมูลจาก object ไปเป็นข้อความเพื่อนำไปเก็บหรือส่งข้อความนั้นข้ามระบบแล้วแปลงข้อมูลจากข้อความกลับมาเป็น object ใหม่

>>> a = {'k1':'v1', 'k2':'v2', 'k3':[1,5,3,4]}
>>> import pickle
>>> s = pickle.dumps(a)
>>> s
"(dp0\nS'k3'\np1\n(lp2\nI1\naI5\naI3\naI4\nasS'k2'\np3\nS'v2'\np4\nsS'k1'\np5\nS'v1'\np6\ns."
>>> b = pickle.loads(s)
>>> b
{'k3': [1, 5, 3, 4], 'k2': 'v2', 'k1': 'v1'}

แล้วเกิดสมมติว่าเรามี object แบบนี้

class kls:
    def __init__(self):
        self.hello = ''
        self.b = 'b'
        self.c = 'this is c'
        self._d = 'this is d' 

โดยที่เราไม่อยากให้ pickle เอา d ไปด้วย วิธีง่ายๆคือให้ override __getstate__ เท่านั้นเอง

def __getstate__(self):
    odict = self.__dict__.copy()  # Copy because we want to modify the clone, not the source
    del odict['_d']
    return odict

ส่วนเวลาเอากลับมาก็ override __setstate__

def __setstate__(self, dict):
    self.__dict__.update(dict)   # update attributes
    self._d = 'this is d'

ซึ่งในขั้นนี้ เราอาจจะทำการคำนวณค่าต่างๆเช่น _d กลับมาอีกรอบก็ได้ สำหรับรายละเอียด สามารถอ่านได้จากเอกสารเกี่ยวกับ Pickle

Little big useful shell commands

ส่งท้ายปีเก่าด้วย shell command เล็ก ๆ น้อย ๆ ที่น่าจะมีประโยชน์

ISO

ช่วงนี้ยืมแผ่นชาวบ้านมาเยอะจนดูไม่ทันคืน เลยต้องหาทางทำให้เป็น image แล้วเอามาดูทีหลัง ถ้าใช้ linux ก็ใช้คำสั่ง

dd if=/dev/cd of='mycd.iso'

ตรง /dev/cd ก็ใส่ device path ของ CD/DVD ไป ถ้าอยากได้แบบง่ายจะใช้คำสั่งข้างล่างนี่ก็ได้

genisoimage -o file.iso /path/to/dvd

สังเกตว่าเป็น path ไปที่แผ่นที่เมาท์ไว้แล้ว ไม่ใช่ device path

เวลาเมาท์กลับถ้าเป็น GNOME ก็ง่ายตรงมี Image mounter มาให้ แต่ถ้าอยากพิมพ์เองก็ใช้คำสั่งนี้ด้วยผู้ใช้ root

mount -o loop file.iso /mount/path

ส่วนถ้าเป็นแผ่นหนังหรือซีรี่ยส์ ใช้ vlc ก็เปิดไฟล์ ISO ได้อยู่แล้วโดยไม่ต้องเมาท์ก่อน

Unix timestamp

ถ้าอยากรู้ unix timestamp ของเวลาปัจจุบันใช้คำสั่ง date เอาได้

>date +%s
1262222498

ถ้าอยากแปลงกลับเป็นเวลาที่อ่านได้ง่าย ๆ ให้ใช้ @

>date -d @1262222498
Thu Dec 31 08:21:41 ICT 2009

ย่อขยายรูปด้วย imagemagick

ถ้าลง imagemagick ไว้จะใช้คำสั่ง convert ย่อขยายรูปเอาได้ เช่น

convert input.jpg -resize 40% image.jpg         # ย่อให้เหลือ 40% แล้วบันทึกเป็น image.jpg
convert input.jpg -resize 80x100 image.jpg     # ปรับขนาดเป็น 80x100 แล้วบันทึกเป็น image.jpg

จริงๆมันมีอะไรให้เล่นมากกว่านี้ แต่ถึงเวลาที่อยากใช้ค่อยหาอีกทีก็ได้

หวังว่าจะมีประโยชน์ สวัสดีปีใหม่

Add a new argument to Python function

ถึงจะตั้งชื่อว่าเพิ่มอาร์กิวเมนท์ให้ฟังก์ชัน เอาเข้าจริงๆก็ไม่รู้เหมือนกันว่าที่ทำนี่มันจะเรียกว่าอะไร ปัญหาของผมคือผมต้องการเพิ่มการทำงานให้ฟังก์ชันที่มีอยู่แล้วโดยไม่เขียนขึ้นมาใหม่แต่ใช้วิธีเขียนครอบเอา สมมติว่ามีฟังก์ชันอยู่ 1 ฟังก์ชั่น ให้ชื่อว่าเป็น ฟังก์ชัน foo มีรายละเอียดของฟังก์ชันดังนี้

def foo(m,s,g):
    print m, s, g

ทีนี้ถ้าเราอยากเขียนฟังก์ชัน bar ขึ้นมาโดยเราอยากให้มันทำงานอะไรซักอย่างด้วย โดยครอบฟังก์ชัน foo เอาไว้อีกที เราจะใช้วิธีประกาศหัวฟังก์ชันให้เหมือน foo ก็ได้ แต่ว่าเราก็ทำแบบนี้ก็ได้เหมือนกัน

def bar(*args, **kwargs):
    if 'a' in kwargs:
        print kwargs['a'],
        del kwargs['a']
    foo(*args, **kwargs)

ลองรันดูได้ดังนี้

>>> bar(a='asfd',m='afsd', s='s', g='g')
asfd afsd s g

แอบดูน่าเกลียดนิดนึงแต่ก็แก้ปัญหาผมได้แล้ว ใครมีวิธีอะไรที่ดีกว่านี้ช่วยชี้แนะด้วยครับ

Django's ErrorDict to Python's dict

วันก่อนพยายามจะทำ ajax form validation กับ django ก็ประสบกับปัญหาว่าอยากจะส่ง error กลับมาเป็น json ซึ่งปกติจะใช้ simplejson ทำการ dump ข้อมูลจาก dict ออกมาได้เลย

from django.http import HttpResponse
import simplejson
def json_response(request, obj):
    return HttpResponse(simplejson.dumps(obj))

ปกติก็แค่ส่ง dictionary กลับไปก็ใช้ได้ ซึ่งตอนแรกก็เห็นว่า form.errors มันก็เป็น dict เลยใส่ลงไปเลยไม่ได้คิดอะไรมาก ปรากฏว่ามัน Error เพราะว่า form.errors เป็น ErrorDict ซึ่งเก็บ function ของ django อยู่ ทำให้ simplejson ไม่สามารถเอาข้อมูลออกมาได้ เลยจำเป็นต้องแปลงให้เป็น dict ก่อน

def edict_to_dict(edict):
    return dict([(key, val) for key, val in edict.iteritems()])

หลังจากนั้นมันก็กลายเป็น dict ธรรมดาส่งไปให้ simplejson ได้เลย

CBR & CBZ

ตั้งแต่ไปฟังงาน BarcampBkk3 ต้องขออภัยที่ไม่ได้บล็อกเกี่ยวกับ barcamp เลยนอกจากอันนี้

ตอนนั้นไปทำการละเมิดไฟล์มาจาก @thanr ได้ไฟล์จำพวก cbr, cbz มาชุดนึง ซึ่งไม่รู้ว่ามันคืออะไร รู้แค่ว่ามันต้องใช้โปรแกรมพิเศษเพื่อเปิดอ่าน

จำได้ลาง ๆ ว่าเคยหาข้อมูลเกี่ยวกับไฟล์พวกนี้เหมือนกัน แต่ลืมไปเรียบร้อยแล้วจนกระทั่งมาเจอสคริปต์ที่มีคุณค่าต่อมวลมนุษย์ผู้ชื่นชอบการอ่านการ์ตูนขนาดเอาไปขึ้นหิ้งได้ ก็เลยรู้ว่าจริงๆแล้วมันคือไฟล์ zip ธรรมดาๆ นี่เอง ถ้าเป็น cbr ก็เป็น Rar เข้าใจว่าจะได้ง่ายการเก็บมากกว่าเรื่องขนาดไฟล์เพราะภาพพวกนี้มันคงจะบีบอัดได้น้อยอยู่แล้ว

ดังนั้นก็แปลว่า การ์ตูนใดในโลกหล้า หากมันอยู่ในรูปแบบ zip หรือ rar และเรียงหน้าด้วยชื่อไฟล์ชัดเจนแล้วไซร้ ล้วนแต่สามารถเปิดได้ด้วยโปรแกรมอ่านการ์ตูนได้ทั้งสิ้น

การ์ตูนจงเจริญ !!! All hail manga!!! All hail comics!!!

ปล. ขอบคุณวิกิพีเดียสำหรับข้อมูลเพิ่มเติม