Как стать автором
Обновить
26
0
Антон @HedgeSky

Ruby developer

Отправить сообщение

Code review Терминатор. Ревью, за которое вам скажут спасибо

Время на прочтение4 мин
Количество просмотров7.1K

Рыжик помогает мне ревьюить код. А когда ему что-то не нравится — тоже настоящий Терминатор

«Code review Терминатор», — однажды назвал меня коллега после особо продуктивного ревью. С одной стороны, это тешило ЧСВ и было приятно. С другой — коллега действительно научился чему-то новому, и это позволило писать ему более качественный код. Так что win-win.

После смены работы сменились и коллеги. Но и на новом месте тоже начали благодарить за ревью. Решил разобраться, почему, и разложил по полочкам. Получилось 11 рекомендаций.
Читать дальше →
Всего голосов 32: ↑29 и ↓3+26
Комментарии15

Из засилья карликовых шпицев туда, где домоседу хочется гулять (1.5 месяца в Испании)

Время на прочтение5 мин
Количество просмотров7.3K

Набережная Бланеса. Знак понятен и без знания испанского.

Не так давно провёл полтора месяца в Испании. За это время я излечился от домоседства, застал каталонский референдум, попал в детство, научился отличать испанский от каталанского, сделал предложение, нашёл на улице дефибриллятор и успокаивал девушку после столкновения с полуметровой медузой.
Читать дальше →
Всего голосов 20: ↑19 и ↓1+18
Комментарии7

Добавление to_string упрощает разработку и дебаг кода на Elixir'е

Время на прочтение2 мин
Количество просмотров2.6K
Проверим на примере: пишем сервис с аэропортами и направлениями.

defmodule Airport do
  defstruct [:id, :name]
end

defmodule Direction do
  defstruct [:origin, :destination]

  def example do
    madrid = %Airport{id: "MAD", name: "Madrid"}
    riga = %Airport{id: "RIX", name: "Riga"}
    %Direction{origin: riga, destination: madrid}
  end
end

Пока что всё в порядке. Отлично, съели печеньку, смотрим, что дальше в джире. Список самых популярных направлений?

Hackerman берётся за дело
Всего голосов 9: ↑7 и ↓2+5
Комментарии7

Неудобно редактировать ERb/EEx шаблоны? Попробуйте Slim/Slime

Время на прочтение2 мин
Количество просмотров5.4K

ERb — стандартный язык разметки в мире Ruby. Это html со вставками на Ruby. В мире Elixir ту же роль выполняет EEx. Такой же синтаксис, только вместо Ruby — Elixir. Вот как это выглядит:


<!DOCTYPE html>
<html>
  <head>
    <title>Заголовок</title>
    <meta name="keywords" content="template <%= language_name %>">
    <meta name="author" content="<%= user_name %>">
  </head>
  <body>
    <h1 class="page-header"><%= page_header %></h1>
    <div id="content">
      <p><%= page_content %></p>
      Дополнительный текст.
    </div>
  </body>
</html>

То же самое можно написать в 1.5 раза короче без потери читаемости.

Читать дальше →
Всего голосов 16: ↑13 и ↓3+10
Комментарии13

Использование send для удобства, от безысходности и ради развлечения

Время на прочтение3 мин
Количество просмотров9.6K


Один из методов библиотеки Sidekiq. Объяснение смайла


send в Ruby вызывает методы объектов по имени. Вот очевидный способ применения:


# До: явно используем присваивание. Неудобно, если полей много или они определяются в рантайме.
user.name = "Иван"
user.age = 29

# После: передаём имя атрибута параметром. Решает проблемы первого способа.
def set(field, value)
  send("#{field}=", value)
end
user.set(:name, "Иван")
user.set(:age, 29)

А ещё вы наверняка видели такие строки:


after_create :send_email

Да-да, коллбэки в рельсах внутри реализованы тоже с помощью send.


Что ещё умеет send?
Всего голосов 14: ↑13 и ↓1+12
Комментарии3

Анализ покрытия кода тестами в Ruby

Время на прочтение3 мин
Количество просмотров5.7K

Для начала я приведу небольшой тестовый проект из трёх классов, проанализирую его покрытие с помощью гема SimpleCov, а напоследок немного поразмышляю о том, как анализ покрытия может приносить пользу проекту, и какие есть недостатки у Coverage в Ruby.



Подопытный проект


В качестве проекта для тестирования взята небольшая история о мальчике, который может спрашивать разрешения погулять у матери и у отца.


# Мама очень заботится о своём сыне, и не разрешает ему гулять,
# если он не надел шарф. А ещё она заботится о его успеваемости, поэтому если
# сын не сделал домашнюю работу, гулять ему она тоже не разрешит.
class Mother
  def permit_walk?(child)
    child.scarf_put_on && child.homework_done
  end
end
Читать дальше →
Всего голосов 15: ↑15 и ↓0+15
Комментарии6

DIY DI в Ruby

Время на прочтение3 мин
Количество просмотров9.9K


На Хабре уже была статья, посвящённая Dependency Injection в Ruby, но упор в ней был больше на использование паттерна IoC-container с помощью гемов dry-container и dry-auto_inject. А ведь для использования преимуществ внедрения зависимостей совершенно необязательно городить контейнеры или подключать библиотеки. Сегодня расскажу о том, как по-быстрому реализовать DI своими руками.

Читать дальше →
Всего голосов 13: ↑12 и ↓1+11
Комментарии18

Domain sharding: реализация на Ruby on Rails и результаты применения

Время на прочтение4 мин
Количество просмотров5.9K
Решил я недавно на примере одного проекта узнать, насколько сильно влияет на скорость загрузки сайта domain sharding. Напомню, суть этой оптимизации в том, что статические файлы грузятся с разных доменов (которые, впрочем, могут указывать на один и тот же сервер), и это позволяет обходить ограничение браузеров на количество одновременных подключений к одному домену. Интуитивно кажется, что в случае большого количества мелких файлов это должно существенно ускорить загрузку сайта в целом. Проверим, так ли это на самом деле.
Читать дальше →
Всего голосов 7: ↑7 и ↓0+7
Комментарии7

Краудфандинговая кампания OpenMandriva на IndieGoGo

Время на прочтение4 мин
Количество просмотров12K
Один из контрибьюторов OpenMandriva попросил меня разместить на Хабре перевод описания их краудфандинговой кампании. Я с готовностью согласился, т.к. очень уважаю opensource-сообщество (в работе использую Ruby on Rails, опенсорс — наше всё).

Некоммерческая ассоциация OpenMandriva происходит из старого сообщества Mandrake-Mandriva и является полностью независимой организацией, которая разрабатывает и поддерживает собственный линукс дистрибутив. Мы занимаемся разработкой ОС 2 года. Все участники проекта — добровольцы, которые верят в мир свободного ПО и бесплатно посвящают свое время разработке, дизайну, инфраструктуре проекта, целью которого является софт, свободный от любых шпионских программ. Юридически наша ассоциация зарегистрирована во Франции, но участники сообщества живут по всему миру, представляя более 30 стран со всех континентов.

Мы верим, что операционная система должна быть бесплатной для пользователя, быть адаптируемой к его нуждам, продвинутой технически, но в то же время легкой и удобной. У нас уже есть опыт разработки и поддержки ОС, которую вы можете уставить и попробовать прямо сейчас. Загрузить OpenMandriva Lx 2014.1 можно здесь: http://openmandriva.org/.

Если ОС уже существует, почему мы проводим кампанию?
Всего голосов 30: ↑20 и ↓10+10
Комментарии21

Вышли Rails 4.1 beta1

Время на прочтение3 мин
Количество просмотров6.9K
Не так давно, 18 декабря, состоялся релиз очередной версии Rails. Забавно, что существует пост, датированный 17-м декабря, и ссылающийся на статью из будущего. Из очередных полезностей новой версии:

  • Ускорение загрузки с помощью Spring
  • Единое место для хранения разнообразных ключей API, секретов и прочего: config/secrets.yml
  • Предпросмотр email'ов: Action Mailer Previews
  • Удобная генерация различного контента в зависимости от конкретного request с помощью Action Pack Variants
  • Добавление enum-атрибутов в Active Record

Читать дальше →
Всего голосов 22: ↑20 и ↓2+18
Комментарии14

Различные методы загрузки ассоциаций в Ruby on Rails

Время на прочтение3 мин
Количество просмотров40K
Rails предоставляют нам 4 различных способа загрузки ассоциаций: preload, eager_load, includes и joins. Рассмотрим каждый из них:

Preload


Этот метод загружает ассоциации в отдельном запросе:
User.preload(:posts).to_a

# =>
SELECT "users".* FROM "users"
SELECT "posts".* FROM "posts"  WHERE "posts"."user_id" IN (1)

Т.к. preload всегда создает два отдельных запроса, то мы не можем использовать таблицу posts в условии выборки:
User.preload(:posts).where("posts.desc='ruby is awesome'")

# =>
SQLite3::SQLException: no such column: posts.desc:
SELECT "users".* FROM "users"  WHERE (posts.desc='ruby is awesome')

А таблицу users – можем:
User.preload(:posts).where("users.name='Neeraj'")

# =>
SELECT "users".* FROM "users"  WHERE (users.name='Neeraj')
SELECT "posts".* FROM "posts"  WHERE "posts"."user_id" IN (3)

Читать дальше →
Всего голосов 38: ↑36 и ↓2+34
Комментарии2

Информация

В рейтинге
Не участвует
Откуда
Barcelona, Barcelona, Испания
Зарегистрирован
Активность