24 октября 2009

C/C++/Obj-C closures

Не так давно решил таки ознакомиться (никак не мигрировать, боже упаси) на представленный в MacOS X 10.6 GCD, почитал их введение в это дело (ровно одна строчка кода, всё остальное - маркетоидный буллщит), но одна фраза заставила на себя обратить внимание - основной компонент этого GCD - блоки - что-то подозрительно напоминали. И добрался до расшаренной коллегой статьи про реализацию блоков, и понял - ну точно, это ж самые что ни на есть closures, которым скоро 50 лет, их наконец-то добавят и в эти языки... Однако, всё сильнее и сильнее этот лагерь офункционаливается.
Со статьёй крайне рекомендую ознакомиться, а потом по ссылкам в конце. Особенно по первой, там чуть ли не дословно цитируют ruby stdlib и часть парадигм RoR и вообще рубишных фреймворков.
Однако в руби их использование гораздо более синтаксически-слаще...

12 октября 2009

Cache money warm-up

С недавнего времени использую в своём проекте Cache money. Вещь хорошая, но, конечно же, есть и недостатки, впрочем, это предмет для форка и багфиксов. Стоит также отметить, что решение может уже и существует среди форков, коих много.
Если у вас всё в порядке с памятью (RAM, I mean), то может возникнуть желание принудительно заполнить кеш по всем индексам всех моделей. Сниппет извлечён из моего Rakefile'а и адаптирован для использования в рельсах. Предупреждение: не тестировалось именно в рельсах и против составных индексов (хотя и предусматривает их использование).

namespace :rails do
desc "Fills Cache money's caches for all indexes of all models - rails version"
task :warmup_cache => :env do
logger = Logger.new(STDOUT)
ActiveRecord::Base.logger = logger
Dir.glob(RAILS_ROOT + '/app/models/*.rb').each { |file| require file }
models = Object.subclasses_of(ActiveRecord::Base)
models.each do |klass|
table_name = klass.name.to_s.tableize
klass.cache_config.indices.each do |index|
logger.info "Warming #{klass.name} for #{index.attributes} index"
values = ActiveRecord::Base.connection.select_values("select #{index.attributes * ', '} from `#{table_name}`")
values.reject!{|val| val.kind_of?(Array) ? val.any?{|subval| subval.nil?} : val.nil? }
values.each {|val| klass.send(:"find_by_#{index.attributes * '_and_'}", *val)}
end
end
end
end
view raw Rakefile.rb hosted with ❤ by GitHub