Pull to refresh
26
0
Антон @HedgeSky

Ruby developer

Send message

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

Reading time4 min
Views7.1K

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

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

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

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

Reading time5 min
Views7.3K

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

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

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

Reading time2 min
Views2.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 берётся за дело
Total votes 9: ↑7 and ↓2+5
Comments7

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

Reading time2 min
Views5.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 раза короче без потери читаемости.

Читать дальше →
Total votes 16: ↑13 and ↓3+10
Comments13

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

Reading time3 min
Views9.5K


Один из методов библиотеки 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?
Total votes 14: ↑13 and ↓1+12
Comments3

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

Reading time3 min
Views5.7K

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



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


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


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

DIY DI в Ruby

Reading time3 min
Views9.9K


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

Читать дальше →
Total votes 13: ↑12 and ↓1+11
Comments18

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

Reading time4 min
Views5.8K
Решил я недавно на примере одного проекта узнать, насколько сильно влияет на скорость загрузки сайта domain sharding. Напомню, суть этой оптимизации в том, что статические файлы грузятся с разных доменов (которые, впрочем, могут указывать на один и тот же сервер), и это позволяет обходить ограничение браузеров на количество одновременных подключений к одному домену. Интуитивно кажется, что в случае большого количества мелких файлов это должно существенно ускорить загрузку сайта в целом. Проверим, так ли это на самом деле.
Читать дальше →
Total votes 7: ↑7 and ↓0+7
Comments7

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

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

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

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

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

Вышли Rails 4.1 beta1

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

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

Читать дальше →
Total votes 22: ↑20 and ↓2+18
Comments14

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

Reading time3 min
Views40K
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)

Читать дальше →
Total votes 38: ↑36 and ↓2+34
Comments2

Information

Rating
Does not participate
Location
Barcelona, Barcelona, Испания
Registered
Activity