ย่อรูปลง Facebook

ความห่วยของ Facebook อย่างหนึ่งคือ รูปภาพที่อัปโหลดขึ้นไป จะถูกย่อขนาดลงให้เหลือกว้างxยาวไม่เกิน 720 pixel แถมยัง quality ลดลงอีกด้วย ลองเอารูปถ่ายเดียวกันอัปโหลดขึ้น Facebook เทียบกับ Flickr จะเห็นความแตกต่างด้านคุณภาพอย่างชัดเจน

ดังนั้น ถ้าเราเอาไฟล์ภาพคุณภาพสูงอัปโหลดขึ้น Facebook มันก็ออกจะเสียเวลา เปลือง bandwidth ไปซะเปล่าๆ เรามาย่อรูปกันก่อนอัปโหลดดีกว่า

ย่อรูปด้วย sips

บน Mac OS X มีคำสั่งชื่อว่า sips เอาไว้สำหรับย่อรูป วิธีใช้งานก็ตรงไปตรงมา เช่นถ้าจะย่อรูปให้เหลือกว้างxยาว ไม่เกิน 720 pixel ก็ใช้คำสั่งตามนี้

$ sips -Z 720 photo.jpg

ลดคุณภาพด้วย jpegoptim

แค่การลดความละเอียดภาพอย่างเดียว อาจจะยังได้ไฟล์ไม่เล็กพอ ก็มีคำสั่ง jpegoptim สำหรับ optimize ภาพ JPEG ให้มีขนาดเล็กลงได้ แต่พอดีคำสั่งนี้ไม่มีติดมากับ OS X ถ้าต้องการใช้งาน ก็ลงผ่าน fink จะง่ายที่สุด

$ sudo fink install jpegoptim

วิธีใช้ jpegoptim ก็ระบุคุณภาพของภาพที่ parameter -m เช่น

$ jpegoptim -f -m80 --strip-all photo.jpg

เวลาจะย่อทีละหลายๆ ภาพก็เขียน bash script สักเล็กน้อย

$ for f in *.jpg do; sips -Z 720 "$f"; jpegoptim -f -m80 --strip-all "$f"; done

ลองทำตามขั้นตอนนี้ สามารถย่อภาพ JPEG จำนวน 450 รูป ขนาดรวม 750 MB ให้เหลือแค่ 28 MB ได้ อัปโหลดขึ้น Facebook ไม่นานก็เสร็จ

QR Code Bookmarklet

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

วันนี้คิดออกอีกวิธีนึงคือ แปลง URL ปัจจุบันให้กลายเป็น QR code ซะ แล้วเอากล้องมาอ่าน ก็จะง่ายดี

วิธีแปลง URL ให้กลายเป็น QR code ได้แบบง่ายๆ คือทำเป็น bookmarklet (โดยใช้บริการสร้าง QR code ของ kaywa.com) ได้ bookmarklet มาตามนี้ ลากไปใส่ใน bookmark toolbar ได้ทันที (คนที่อ่าน blog นี้จาก feed reader อาจจะไม่เห็น)

QR Code

code สั้นๆ สำหรับผู้สนใจ
javascript:document.location='http://qrcode.kaywa.com/img.php?s=8&d='+encodeURIComponent(document.location)

The Daily Dose Plugin for Plex.app

The Daily Dose เป็นรายการวิเคราะห์สถานการณ์ทั้งเรื่องการเมือง/เศรษฐกิจ คนจัดรายการเป็น ม.ล.ปลื้ม ฉายทางเคเบิลช่อง Voice TV

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

การจะทำแบบนี้ได้ต้องมีระบบคอมที่ต่อกับทีวีไว้อยู่แล้ว และรันซอฟต์แวร์ประเภท media center ไว้ด้วย ซึ่งตัวปัจจุบันที่ใช้อยู่คือ Plex.app สามารถเขียน Plugin เข้าไปเพิ่มความสามารถ เพิ่มช่องที่ต้องการเข้าไปเองได้

ตัว Plugin framework ของ Plex.app ออกแบบมาให้เขียนด้วย python แต่ document มีให้ดูไม่เยอะเท่าไหร่ อาศัยแกะจากโค้ดของ plugin ตัวอื่นๆ เอา สุดท้ายก็ได้ plugin สำหรับ The Daily Dose ออกมา หน้าตาตามรูป

ตอนนี้โค้ดยังง่อยๆ แสดงแค่รายการตอนล่าสุดเท่านั้น ถ้าขยันจะทำเพิ่มสำหรับดูย้อนหลังด้วย

ใครที่ใช้ Plex.app เหมือนกัน สามารถโหลดไปใช้ได้ตามลิงก์นี่เลย

TheDailyDose.bundle

เป็นไฟล์ zip แตกออกมาแล้วเอาไปใส่ไว้ที่ ~/Library/Application Support/Plex Media Server/Plug-ins/ เวลาเปิดโปรแกรมขึ้นมา จะไปโผล่อยู่ในเมนู Video > The Daily Dose

สำหรับคนที่ใช้โปรแกรมอื่นอย่าง XBMC ก็น่าจะเอาไปแก้นิดๆ หน่อยๆ แล้วใช้ได้เหมือนกันนะ

WordPress query caching in Memcached

มีปัญหาเรื่อง performance ของ wordpress อยู่เรื่องนึง ที่น่าหงุดหงิดใจมานานแล้ว คือในตอนที่ใช้ memcached มาทำเป็น cache backend ให้ wordpress เพื่อลดภาระของ database มันก็ช่วยได้เยอะอยู่ แต่ก็ยังมีบาง query ที่ตัว wordpress มันไม่ยอม cache ให้ ดังเช่น query ด้านล่างนี้

SELECT SQL_CALC_FOUND_ROWS  wp_posts.* FROM wp_posts  WHERE 1=1 
AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish') 
ORDER BY wp_posts.ID ASC LIMIT 0, 1

เป็น query เจ้าปัญหาที่ถูกเรียกทุกครั้ง ทั้งๆ ที่ query อื่นถูก cache ไว้หมดแล้ว ทำให้ 1 request ที่เข้ามา ต้องมีการ query อย่างน้อย 1 query เสมอ ซึ่งดูเหมือนไม่เยอะเท่าไหร่ แต่ถ้าเว็บใหญ่ๆ ในระดับที่มีคนเข้าชั่วโมงละเป็นหลายหมื่น มันก็ทำให้ database ร่วงได้เหมือนกัน (อันนี้ยังไม่นับเรื่อง stampeding requests)

เมื่อมาลอง debug + ไล่โค้ดไปเรื่อยๆ ก็เจอเข้ากับ default filter ตัวหนึ่งของ wordpress ที่เพิ่มเข้ามาตอน wordpress 2.8 ที่ชื่อว่า start_post_rel_link มีหน้าที่แทรกแท็ก link เข้าไปที่ส่วน head ของหน้านั้นๆ ประมาณนี้

<link rel='start' title='Current Post Title'
href='http://www.pittaya.com/CurrentPostTitle/' />

แค่นี้แหละ ที่ต้องทำให้มี query ทุกๆ ครั้งที่เปิด (ซึ่งเป็น query ประเภท using filesort ที่ประสิทธิภาพห่วยอีกด้วย)

วิธีเอาออกก็ไม่ยากอะไร แค่ไป remove filter ออก โดยใส่โค้ดตามนี้ไว้ใน functions.php ของ theme ที่ใช้

remove_action('wp_head', 'start_post_rel_link', 10, 0);

แค่บรรทัดเดียวเท่านั้น ทำให้ลดโหลดของ database ลงไปได้มหาศาล สมกับคำโปรโมทของ wordpress ที่ว่า “โค้ดเป็นดั่งบทกวี”

เพียงแต่บทกวีบรรทัดนี้เสียเวลาเขียนอยู่ตั้ง 3 ชั่วโมง

Key-Value Stores

เว็บ Engine Yard มีบทความน่าสนใจเกี่ยวกับเรื่องการใช้งาน Key-Value Stores กับ Ruby (เขียน Ruby ไม่เป็นก็อ่านรู้เรื่อง) พูดถึง product หลายๆ ตัวที่กำลังอยู่ในความสนใจ อย่าง Tokyo Cabinet, Redis, Cassandra, MongoDB

ขณะที่เขียน มีให้อ่านทั้งหมด 5 ตอน