Ruby

Как добавить в конкретный Ruby-объект какое-нибудь свойство 11 января 10

Вообще задача такая:

class Book < ActiveRecord::Base
  has_many :ratings
  has_many :tags, :through => :ratings
end
 
class Rating < ActiveRecord::Base
  belongs_to :book
  belongs_to :tag
  validates_presence_of :score
end

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

Ущербные решения

Затык был не в том, как закодить саму выборку суммы, а в каком виде возвращать результат. Первая мысль – массивом хешей типа {:tag => tag, :score => score}. Мало того, что это попахивает PHP, так с такими хешами еще и неудобно работать. Потом я хотел сделать total_score методом Tag:

class Tag < ActiveRecord::Base
  def total_score(book)
    return score_computed_some_way
  end
end
 
@book.tags.first.total_score(@book)

Но это тоже бредовая тавтология, как по мне.

Расширение Ruby-объектов на уровне объекта

Итак. Есть такой метод Object#instance_eval – он позволяет запихнуть в объект практически все, что угодно. (Если бы что-то угодно было чем-то более сложным, чем возвращение объекта, можно было бы вынести его в модуль и подключать через Object#extend)

# scores = {tag_id => score, ...}
def inject_scores_into_tags(tags, scores)
  tags.each do |tag|
    tag.instance_eval do
      @total_score = scores[tag.id]
      def total_score
        @total_score
      end
    end
  end
end

После этого у тегов появляется метод total_score.

Штука для проверки прокси-серверов на доступность и анонимность 27 декабря 09

Вот, давно хотел выложить, но она раньше выглядела еще ужаснее, чем сейчас.

Идея проста: ты даешь ей список прокси-серверов в текстовом файле, она отвечает, какие из них вообще доступны (и отдают правильную страницу), какие анонимные (не открывают твой IP), какие – неанонимные.

Легким прикосновением напильника можно довести ее до нужного в каждом конкретном случае результата.

http://github.com/leonid-shevtsov/proxytools

Друзья друзей Вконтакте на Ruby 23 сентября 09

Захотелось мне написать нечто непосредственно полезное.

Немного логики

Если несколько твоих знакомых знакомы с Васей Пупкиным, то с большой вероятностью ты тоже с ним знаком. Логично?

Реализация

На «Моем круге», например есть такое понятие, как «второй круг» – друзья твоих друзей. На Вконтакте «второй круг» просто так не посмотришь. То есть можно, конечно, лазить по друзьям и высматривать знакомые лица (если Лицо не поставило идиотскую аватарку) и имена (если Лицо не пытается анонимизироваться). У меня на это нет времени.

Задача: написать скрипт, который собирает «второй круг» автоматически и сортирует по числу общих знакомых.

Много букoв?

Можешь просто скачать работающий скрипт с Github. В него только нужно дописать свои собственные логин/пароль. Кроме того, пригодятся гемы: mechanize, json, haml.

Я бы сделал онлайн-версию, но, боюсь, паранойя помешает тебе им воспользоваться.
читать дальше →