วันอาทิตย์ที่ 26 กันยายน พ.ศ. 2553

ปรับ Rails เป็น 2.3.9 เข้าใกล้ 3.0 เข้าไปทุกทีๆ

อืม Rails 3.0 ใกล้จะออกตัว Release เข้าไปทุกทีแล้ว ดังนั้น คาดว่าในอนาคตจะต้องมีการปรับเวอร์ชั่นของ jjthai ให้เป็น Rails 3.0 แน่นอน ดังนั้นก่อนที่จะปรับเป็น 3.0 ก็ปรับความเตรียมพร้อมให้เข้าใกล้ (เพราะว่าเวอร์ชั่น 2.3.9 จะมีคำเตือน deplicate เยอะ) ก็ลองดูปรับดู เพราะเท่าที่ตรวจสอบแล้ว ไม่ได้มีการปรับแก้ code เลย มีแต่การปรับ version gem ซะมากกว่า

ก่อนอื่นก็ อัพเดต gem
# gem update --system

จากนั้น เพื่อความชัวร์ นะ อยากจะใช้ Rails 2.3.9 ก็ติดตั้ง เข้าไปซะเลย
# gem install rails --version=2.3.9

หลังจากรัน Rails 2.3.9 มีคำเตือนขึ้นมา เกี่ยวกับ config.load_paths ก็แก้ซะ ตามนี้

# Rails 2.3.x deplicated
#config.load_paths += %W( #{RAILS_ROOT}/app/sweepers )
# support Rails 2.3.x and Rails 3.x
config.autoload_paths += %W( #{RAILS_ROOT}/app/sweepers )

ตอนนี้กำลังทดสอบ Rails อยู่ตอนนี้ยังไม่พบปัญหาจ้า

วันพฤหัสบดีที่ 16 กันยายน พ.ศ. 2553

อยากจะจัดการกับ log ให้มีประสิทธิภาพ

แก้ไข ไฟล์นี้ /etc/newsyslog.conf ไฟล์เดียว จบเกมส์เลย

/home/nutjang/log/xxx.log nutjang:wheel 640 10 * @T00 JN

FLAG ที่เป็นไปได้

J = bzip
N = ไม่ส่ง signal เมื่อ rotate log
Z = gzip

* ล่าสุด จากการทดสอบ พบว่า newsyslog สามารถ backup log ได้ แต่ ดูเหมือนว่า ต้องมีการส่ง signal เพื่อ ปิด process ด้วย ไม่งั้น ไฟล์ log อันใหม่มันไม่เก็บ ดังนั้น solution นี้ยังไม่พร้อมใช้งานจริง ต้องรอแก้ไขปรับ config ก่อน

วันอังคารที่ 14 กันยายน พ.ศ. 2553

ว่าด้วยเรื่อง subdomain ใน ruby on rails

อยากจะแจก subdomain ให้ user แต่ละคนไหม ?

ตัวอย่างเช่น เรามี user 2 คน มาเปิดร้านค้าย่อยที่ jjthai.net

user starwar1 ก็จะได้ URL ร้านค้าเป็น starwar1.jjthai.net
user starwar2 ก็จะได้ URL ร้านค้าเป็น starwar2.jjthai.net

อ่านนี่ซะ จะได้ทำเป็น

http://s2.diffuse.it/blog/show/49-Subdomain_routing_with_rails

ถ้าอยากอ่านเป็นภาษาไทยก็รอไปก่อน

1 Rails App สำหรับ หลายๆ โดเมน

โอ้วๆ หามานาน เรื่องมันมีอยู่ว่า นานมาแล้ว นั่งทำเว็บไซต์ด้วย Rails มาตั้งนาน เสร็จแล้วก็ออกแบบ ซะดิบดี ได้ออกมาเป็นเว็บหน้าตาดี 1 อัน ทีนี้ อยากได้เว็บที่มันใช้ Engine เดียวกันนี่เหละ แต่รายละเอียดมันต่างกันออกไปนิดนึง (อย่างเช่น layout ไม่เหมือนกัน) แต่ส่วนใหญ่ ใช้แนวคิดเดิมๆ ถ้าแยก Rails App กันซะ มันก็หมดเรื่อง แต่มันก็ ต้องแก้ bug ทั้ง 2 อัน

แล้วจะทำไงดีหล่ะ อยากจะรับจ้างทำเว็บไซต์ แต่ใครจะมานั่ง deploy & Bug fix ทุกๆอัน ก็เลยออกมาเป็น solution ดังนี้

1. ใช้ทริ๊กของ Rails Route โดยปรับให้รับเงื่อนไข เรื่อง request.host, request.domain เพิ่มเติมเข้ามา
2. จากนั้น สร้างเป็นไฟล์ เพื่อเข้าไปใน /config/initializers (ชื่อไฟล์อะไรก็ได้)

จากนั้นก็ลองทดสอบดูดิ ว่า ถ้า request host มาหลายๆแบบ แล้ว route ไปคนละ ทาง

# /config/initializers/multiple_domain_route.rb ################################

#
# This allows us to set up custom routes that depend on the domain or host of the request, ie:
# map.connect '', :controller => 'blah', :action => 'blah', :conditions => {:domain => 'blah'}
#

module ActionController
module Routing
class RouteSet
def extract_request_environment(request)
env = { :method => request.method }
env[:domain] = request.domain if request.domain
env[:host] = request.host if request.host
env
end
end
class Route
alias_method :old_recognition_conditions, :recognition_conditions
def recognition_conditions
result = old_recognition_conditions
result << "conditions[:domain] === env[:domain]" if conditions[:domain]
result << "conditions[:host] === env[:host]" if conditions[:host]
result
end
end
end
end

############################################################

# /cofig/route.rb ###############################################

ActionController::Routing::Routes.draw do |map|

map.connect '/', :controller => 'nutjang2', :action => 'index', :conditions=>{ :host=>'www.nutjang2.com' }
map.connect '/', :controller => 'nutjang3', :action => 'index', :conditions=>{ :host=>'www.nutjang3.com' }

map.root :controller => "welcome"

map.connect ':controller/:action/:id'
map.connect ':controller/:action/:id.:format'
end

############################################################

วิธีการทดสอบบน windows ที่จะชี้ไปว่าเป็น หลายๆ โดเมนก็ง่ายแสนง่าย c:/windows/system32/driver/etc/hosts

เพิ่มบรรทัดพวกนี้เข้าไป แล้วลองเปิด browser เรียก www.nutjang2.com, www.nutjang3.com ดู แล้วเทียบกับ log ของ Rails ว่า มัน route ถูกไหม

192.168.1.201 www.nutjang2.com
192.168.1.201 www.nutjang3.com

วันจันทร์ที่ 13 กันยายน พ.ศ. 2553

เพิ่มประสิทธิภาพของ Rails ด้วย Nginx + Gzip

ไม่พูดพล่ามทำเพลง คือ พอใช้งาน google webmaster มันบอกว่าเว็บเราโหลดช้าไป โดบให้คำแนะนำมาว่า ให้ใช้ module gzip ไฟล์ text ต่างๆ อืม... พอมานั่งคิดๆดู มันจริงนะ เพราะ browser + cpu สมัยนี้ ใช้แตก gzip หน้าเว็บเนี่ยเป็บเดียวเอง แล้วมันก็เป็นการประหยัด bandwidth ในการเชื่อมต่อเน็ตด้วย (ทำให้โหลดเร็วขึ้นอย่างเห็นได้ชัด) ok ว่าไงว่าตามกัน เพิ่ม config ข้างใต้นี้เข้าไปใน nginx.conf แค่นั้นเอง จากนั้นก็ restart service nginx ทีนึง จบ.

# output compression saves bandwidth
gzip on;
gzip_buffers 16 8k;
gzip_http_version 1.0;
gzip_comp_level 9;
gzip_proxied any;
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript application/css;