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


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

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

    После смены работы сменились и коллеги. Но и на новом месте тоже начали благодарить за ревью. Решил разобраться, почему, и разложил по полочкам. Получилось 11 рекомендаций.
    Читать дальше →
  • Из засилья карликовых шпицев туда, где домоседу хочется гулять (1.5 месяца в Испании)


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

      Не так давно провёл полтора месяца в Испании. За это время я излечился от домоседства, застал каталонский референдум, попал в детство, научился отличать испанский от каталанского, сделал предложение, нашёл на улице дефибриллятор и успокаивал девушку после столкновения с полуметровой медузой.
      Читать дальше →
    • Добавление to_string упрощает разработку и дебаг кода на Elixir'е

        Проверим на примере: пишем сервис с аэропортами и направлениями.

        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 берётся за дело
      • Неудобно редактировать ERb/EEx шаблоны? Попробуйте Slim/Slime

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

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


            Один из методов библиотеки 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?
            • +12
            • 6.5k
            • 3
          • Анализ покрытия кода тестами в Ruby

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



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


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


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


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

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

                  Решил я недавно на примере одного проекта узнать, насколько сильно влияет на скорость загрузки сайта domain sharding. Напомню, суть этой оптимизации в том, что статические файлы грузятся с разных доменов (которые, впрочем, могут указывать на один и тот же сервер), и это позволяет обходить ограничение браузеров на количество одновременных подключений к одному домену. Интуитивно кажется, что в случае большого количества мелких файлов это должно существенно ускорить загрузку сайта в целом. Проверим, так ли это на самом деле.
                  Читать дальше →
                • Краудфандинговая кампания OpenMandriva на IndieGoGo

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

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

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

                  Если ОС уже существует, почему мы проводим кампанию?
                • Вышли Rails 4.1 beta1

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

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

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

                    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)
                    

                    Читать дальше →
                    • +34
                    • 30.4k
                    • 2