С тех пор, как я вернулся с линукса на винду (а я вернулся), в SSH лазил исключительно через виртуалку. Лень было конфиг переносить в PuTTY, что довольно досадно, поскольку выходить в SSH прямо через PuTTY по ряду причин удобнее – например, можно настроить внешний вид и поведения терминала для каждого хоста, или быстро запускать сессии с помощью PuTTY-плагина к Launchy.
В общем, терпеть надоело, и я написал скрипт, создающий, на основании конфига в формате ssh-config, reg-файл, который вгружается в реестр винды и добавляет в PuTTY все недостающие сессии.
Процедура такая:
- В линуксе нужны ruby и puttygen (
apt-get install putty-tools).
- По умолчанию скрипт скидывает ключи для PuTTY в
~/putty_keys – такой каталог должен существовать. Кроме этого в скрипт нужно вписать правильный путь к каталогу винды, куда ты собираешься положить ключи для PuTTY.
- Запускаем скрипт:
./ssh_to_putty.rb >putty.reg. Вводим пароли к ключам, если будет спрашивать.
- Получаем пачку (или не пачку) ключей для PuTTY и файл
putty.reg. Первые копируем в соответствующую папку в винде, второй вгружаем в реестр.
Кстати, перед тем, как будешь вгружать конфиг в реестр, убедись, что в Default Settings в PuTTY сохранены подходящие настройки внешнего вида – цвета, шрифт, все такое. Иначе придется потом для каждой сессии настраивать отдельно.
читать дальше →
Вообще задача такая:
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.
Вот, давно хотел выложить, но она раньше выглядела еще ужаснее, чем сейчас.
Идея проста: ты даешь ей список прокси-серверов в текстовом файле, она отвечает, какие из них вообще доступны (и отдают правильную страницу), какие анонимные (не открывают твой IP), какие – неанонимные.
Легким прикосновением напильника можно довести ее до нужного в каждом конкретном случае результата.
http://github.com/leonid-shevtsov/proxytools
Захотелось мне написать нечто непосредственно полезное.
Немного логики
Если несколько твоих знакомых знакомы с Васей Пупкиным, то с большой вероятностью ты тоже с ним знаком. Логично?
Реализация
На «Моем круге», например есть такое понятие, как «второй круг» – друзья твоих друзей. На Вконтакте «второй круг» просто так не посмотришь. То есть можно, конечно, лазить по друзьям и высматривать знакомые лица (если Лицо не поставило идиотскую аватарку) и имена (если Лицо не пытается анонимизироваться). У меня на это нет времени.
Задача: написать скрипт, который собирает «второй круг» автоматически и сортирует по числу общих знакомых.
Много букoв?
Можешь просто скачать работающий скрипт с Github. В него только нужно дописать свои собственные логин/пароль. Кроме того, пригодятся гемы: mechanize, json, haml.
Я бы сделал онлайн-версию, но, боюсь, паранойя помешает тебе им воспользоваться.
читать дальше →