28 февр. 2010 г.

"на Украине" | Российская википедия жжжет :-)



Полез както я на википедию посмотреть за "Goblin'a" в миру Дми́трий Ю́рьевич Пучко́в

Читаю биографию

Родился 2 августа 1961 года в семье военнослужащего в г. Кировограде


ну чудесно, но дальше ...

В школу пошёл на Украине,


я никогда не слышал "на России", "на Беларуси" и т.д. в отношении государства. По моей логике: человек рождается в государстве, а не на "территории" - понятии размытом и не устойчивом во времени. Ну, думаю, надо бы поправить... ан нет...




Хамство чистой воды призывает не устраивать войны правок o_O


Оказывается Украине дадено особое исключение



ПОСОЛЬСТВО РОССИЙСКОЙ ФЕДЕРАЦИИ В УКРАИНЕ
и
Указ Президента РФ №937 от 5 августа 2009 о назначении "Чрезвычайным и Полномочным Послом Российской Федерации НА Украине" г-на М. Ю. Зурабова.

По ходу кто-то при подготовке указа таки прочитал Википедию :-)

P.S. Предлагаю внести в правила российской википедии пункт об обязательных хамских "камментах" в отношении безграмотных и наглых "самостийников" aka украиноязычных жителей родившихся _в_ Украине которые учат нас как правильно "гаварить".

P.S.S Если кому показалось "абыдным", то сорри... я хотя-бы пишу об этом не в "камментах" и не вношу в правила. Но завтра мы договоримся называть буйвола слоном...

ЧаВО по Украине В_НА

25 февр. 2010 г.

Кеширование счетчиков в Rails

Иногда требуется получить некую статистику, проще говоря агрегировать информацию.
Получение количества членов ассоциации самый простой случай.
Но бывает и так, что желаемая величина состоит из многих факторов и подсчетов.
Например, подсчет рейтингов по многим параметраи или кармы в социальных сетях.

Запускать трехэтажные запросы с пересчетов на каждый чих просто расточительство и рано или поздно сервер ляжет под непосильной нагрузкой даже если запросы идеально оптимизированны и проиндексированы. Единственный выход это расчитать все зарание или же расчитывать только изменения которые произошли с момента последнего пересчета.


class Blog
has_many :posts
end

class Post
belongs_to :blog, :counter_cache => true
end



create_table :blogs do |t|
...
t.integer :posts_count
...
end


Такой вот нехитрый код позволит вам избавиться от довольно дорогостоящей операции COUNT, которая в версионных RDBMS еще, как правило инициализирует сборку мусора.

Такой подход работает только на добавление и удаление объекта в ассоциацию.

Если расчет более сложен чем увеличение увеличение/уменьшение счетчика, то можно использовать обратные вызовы модели(before_save, after_save) или триггеры, если их поддерживает ваша БД.

Если операция не требует сиюминутного пересчета, то можно подвесить ее как периодическую задачу для cron, предварительно оформив как Raketask или использовать delayed_job. Такой подход был использована мною при подсчете рейтинга пользователей на rubyclub.com.ua когда величина состоит из оценки которую дали не только топику или комментарию но и посту в блоге.

P.S. В начале своей каръеры я считал это бредом начитавшись книг по построению БД и нормальным формам. Правило, "если информацию можно получить двумя путями то один должен быть устранен", долго было основным и значимым. Но когда написанная мною учетная система которая считала итоги по всем торговым накладным SQL запросом начала безбожно тормозить через некоторое время здравый смысл подсказал, что теория не всегда практична :-) И стало легко и быстро.

22 февр. 2010 г.

Bundler - инструмент для управления rubygems

Описание


Bundler - инструмент для управления зависимостями в ваших ruby-приложениях. После опредиления файла манифеста вы можете скачивать и устанавливать пакеты и все зависимости, которые определены в этом файле. Так же возможно управление обновлениеми уставноленных пакетов и выполнения ruby кода в контексте установленных пакетов.

Основной функцией Bundler является сохранение работоспособности приложения в системе с отсутсвующими зависимостями и решение проблемы когда установлены версии пакетов более новых чем требуются приложению. Например пакет responders версии 0.5.0 работает с Rails 3 и приложения на Rails 2.3 не могут стартовать с версиями ниже указанной. C Bundler это возможно.

Установка


$ sudo gem install bundler 


для Rails 2.3.5
$ sudo gem install bundler -v=0.9.5 


так как это единственная на данный момент версия которую мне удалось более-менее нормальнольно заставить работать с Rails 2.3.5

в старших версиях почемуто была удалена возможность указывать несколько рабочих окружений в параметре :group

так раньше я писал
gem "sqlite3-ruby", :require => "sqlite", :group => [:development, :test] 

и это работало.

В версиях выше 0.9.5 это возможность убрали и по логике теперь я должен писать две строки вместо одной. ИМХО это дублирование кода.

Использование


Заходим в каталог проекта и пишем
$ bundle init

после этого получаем в корне файла манифеста вида

# A sample Gemfile
source :gemcutter
#
# gem "rails"


подключим несколько пакетов

# A sample Gemfile
source :gemcutter
#
gem "rails", "2.3.5"
gem "haml"

# если имя пакета отличается от включаемого файла,
# то положение можно исправить с помощью опции :require
gem 'thinking-sphinx', :require => 'thinking_sphinx'

# Эти пакеты будут включены в :test и :development
# окружении
gem "faker", :group => [:test, :development]
gem "populator", :group => [:test, :development]

group :test do
gem "factory_girl", "1.2.3"
gem "shoulda"
end



Комманды



bundle check # Проверка зависимостей указанных в файле манифеста
bundle exec # Запуски ruby-кода в контексте установленных пакетов
# указанных в файле манифеста
bundle help [TASK] # Получение помощи по указанной команде
bundle init # Генерация файла манифеста
bundle install # Установка зависимостей по указанному
# окружению(пакеты без указания окружения
# относятся к группе default)
bundle lock # Фиксация зависимостей, включая все дочерние
bundle pack # Установка всех зависимостей в папку vendor/cache
bundle show # Показ всех установленных пакетов
bundle unlock # Снятие фиксации с установленного набора зависимостей


При использовании Bundler надобность указывать зависимости в файлах окружения через config.gem отпадает и может быть удалена, кроме случаев которые будут описаны ниже.

Проблемы


Для использования с Rails 2.3.5 необходимо внести в проект изменения описанные тут

config/preinitializer.rb

begin
# Require the preresolved locked set of gems.
require File.expand_path('../../.bundle/environment', __FILE__)
rescue LoadError
# Fallback on doing the resolve at runtime.
require "rubygems"
require "bundler"
if Bundler::VERSION <= "0.9.5"
raise RuntimeError, "Bundler incompatible.\n" +
"Your bundler version is incompatible with Rails 2.3 and an unlocked bundle.\n" +
"Run `gem install bundler` to upgrade or `bundle lock` to lock."
else
Bundler.setup
end
end


config/boot.rb

class Rails::Boot
def run
load_initializer
extend_environment
Rails::Initializer.run(:set_load_path)
end

def extend_environment
Rails::Initializer.class_eval do
old_load = instance_method(:load_environment)
define_method(:load_environment) do
Bundler.require :default, Rails.env
old_load.bind(self).call
end
end
end
end


Bundler не поддерживает функцию autoload для модулей и потому такие пакеты как inherited_resources, devise, fails-footnotes могут не работать.
Решение: прописать config.gem "имя_пакета" в соответствующем файле окружения. Например, environment.rb

Отсутствие пакетного индекса
Решение: закоментировать в файле bundler/lib/runtime.rb строки с 246 по 252.

21 февр. 2010 г.

the update | RubyGems.org

Gemcutter закончил миграцию RubyGems.org.
Вышла новая версия RubyGems 1.3.6 поэтому пора выполнить команду

sudo gem update --system


Скорее всего gem.rubyforge.org будет отключен, а будет использоваться Gemcutter.

the update | RubyGems.org

14 февр. 2010 г.

Rubybarcamp Kyiv, 2009. Видео.

Не прошло и полгода... как говориться ... :-)

Видеоматериал с ноябрскокого Ruby && Rails Barcamp 2009 года в Киеве.

Thor. Инструмент автоматизации рабочего процесса.







З.Ы. За это время Jose Valim успел присоединиться к команде Rails ;-)