Posts Tagged ‘Programming’

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 [...]

Key-Value Stores

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

part 1 - Key-Value Stores in Ruby
part 2 - Tokyo Cabinet
part 3 - Cassandra and Ruby: A Love Affair?
part 4 - To Redis or Not To Redis?
part 5 - MongoDB: A Light [...]

Checking wordpress user’s role

วิธีตรวจสอบว่า wordpress user ปัจจุบันว่าเป็น admin หรือไม่ ทีแรกมั่วๆ ไปดูที่ function is_admin() แต่อ่านโค้ดดูแล้วไม่ใช่ อันนั้นมันเอาไว้ดูว่าหน้าปัจจุบัน เป็นหน้า wordpress admin หรือเปล่า
วิธีตรวจสอบที่ถูก คือดูจาก capability ของ user นั้นๆ (reference สำหรับเช็ค capability ของ role ต่างๆ) โดยใช้ function current_user_can() เช็คว่าทำได้หรือไม่
เช่น จะดูว่า user สามารถลบคอมเมนต์ได้หรือไม่ ก็เช็คว่า current_user_can(‘moderate_comments’) หรือถ้าต้องการจะเช็คจริงๆ ว่า user เป็น admin หรือเปล่า ก็ใช้ current_user_can(‘level_8′)
แต่ถ้าสำหรับ wordpress MU จะมี function is_site_admin() ให้ใช้ด้วย

Open link from XULRunner

วันก่อนงมหาวิธีทำให้เวลาคลิก link ใน XULRunner แล้วไปเปิดหน้านั้นๆ ใน browser ของเราอยู่นาน สุดท้ายก็ไปดาวน์โหลดโค้ดของ Flickr Uploadr เอามาแกะดู ถึงได้พบดวงตาเห็นธรรม (โค้ดเป็น GPLv2)

1
2
3
4
5
6
7
8
9
10
11
12
13
function launch_browser(url) {
try {
var io = Components.classes[’@mozilla.org/network/io-service;1′]
.getService(Components.interfaces.nsIIOService);
var uri = io.newURI(url, null, null);
var eps = Components.classes[’@mozilla.org/uriloader/external-protocol-service;1′]
.getService(Components.interfaces.nsIExternalProtocolService);
[...]

LIMIT optimization

จดไว้กันลืม
เวลาที่เรา SELECT ข้อมูลจาก MySQL ปกติก็จะเขียนกันแบบนี้
SELECT * FROM data ORDER BY id LIMIT 10,10
แต่ถ้าวันหนึ่ง เรามีข้อมูลมากๆ แล้วต้องการข้อมูลที่ LIMIT เยอะๆ เช่น
SELECT * FROM data ORDER BY id LIMIT 900000,10
Query แบบหลัง จะช้ากว่าแบบแรกอยู่เยอะ
วิธีที่จะ optimize ให้ query แบบหลัง ทำงานได้เร็วขึ้นทำได้แบบนี้
SELECT * FROM data WHERE id >= (SELECT id FROM data ORDER BY id LIMIT 900000,1) LIMIT 10
โดยที่ id ต้องเป็น index จะทำให้ใน subquery [...]