Halaman

Jumat, 16 April 2010

[shared] to_xml_params with attributes from hash

sejauh yang saia tau, rails .to_xml dari hash tidak dapat menghasilkan xml tag dengan attribute selain type.
tetapi saia membutuhkan hal tersebut pada project yang saia kerjakan. karena itu saia membuat method to_xml_params untuk mengubah hash menjadi xml string:

def self.to_xml_params(data)
if data.is_a? Hash
data.collect do |key, value|
tag_attr = []
if key.is_a? Array
tag = key.first
key[1..-1].each do |key_attr|
key_attr.each do |k, v|
tag_attr << "#{k}=\"#{v}\""
end
end
else
tag = key
end
tag = tag.to_s.tr('_', '-')
result = "<#{tag}#{" #{tag_attr.join(' ')}" unless tag_attr.empty?}>"
result << to_xml_params(value)
result << "</#{tag}>"
result
end.join('')
elsif data.is_a? Array
data.inject(''){|result, v|
result << to_xml_params(v)
}
else
data.to_s
end
end


contoh penggunaan:


to_xml_params :a => "b"
# -> b
to_xml_params :a => {:b => "c"}
# -> c
to_xml_params [:a,{:x => :y}] => {:b => "c"}
# -> c
to_xml_params [:a,{:x => :y, :z => "w"}] => {[:b, {:p => "q"}] => "c"}
# -> c
to_xml_params :a => {:b => "c", :d => "e"}
# -> ec
to_xml_params :a => [{:b => "c"}, {:d => "e"}]
# -> ce sama dengan diatas

Selasa, 06 April 2010

[shared] "whenever" - cron simplified

karena beberapa waktu lalu saia menyadari kalau rufus-scheduler bermasalah bila digunakan di passenger maka saia beralih kembali menggunakan cron.
namun cron mengharuskan saia untuk meng-update crontab setiap kali saia ingin menambahkan task baru, karenanya saia mencoba mencari alternatif lain yg reliable dan mudah digunakan..

http://github.com/javan/whenever/

sebagai alternatif rufus-scheduler gem ini cukup mudah untuk digunakan, walaupun sedikit lebih "repot".

saia rasa dokumentasi di github sudah cukup jelas jadi saia hanya akan membahas implementasi yg saia gunakan.

yang menyusahkan dari gem ini, saia diharuskan meng-convert schedule.rb ke cron dengan menggunakan

whenever --update-crontab MyApp

setiap kali saia melakukan perubahan di schedule.rb
dokumentasi di github menunjukkan cara integrasi dengan capistrano, tetapi saia tdk mau direpotkan dengan menginstall gem tambahan, jadi yg saia lakukan hanya menambahkan bbrp baris di script untuk deploying pada staging dan production server:

.... svn up, rsync, etc ....

cd /home/rails/myapp && whenever --update-crontab MyApp --set environment=staging
cd /home/rails/myapp/script && chmod 755 runner

baris 1 untuk meng-update crontab. --set environment digunakan untuk merubah environment dari default production
baris 2 untuk memberi ijin execute pada script runner, karena saia menggunakan model method bukan rake untuk task2 nya

contoh schedule.rb yg saia gunakan:

every 30.minutes do
runner "QueuedEmail.deliver_all"
end

every 10.minutes do
runner "Message.destroy_all_expired"
end

every :day do
runner "ReferData.give_rewards!"
runner "SystemMailer.deliver_scheduler_check"
end

How to report bugs effectively

http://www.chiark.greenend.org.uk/~sgtatham/bugs.html
artikel yg saia pikir sangat berguna, tidak hanya untuk user, tetapi juga untuk developer.

finding a way to reproduce problem is already a half of the debugging progress ^_^