Нам нужны твои мозги

Хотите расти как разработчик и найти крутую работу? Не протирайте штаны — займитесь Open Source проектами. Так легче всего попасть в лучшие команды разработчиков и положить себе в резюме настоящий проект, вместо нелепых «примеров кода». Но найти подходящий проект для участия сложно. Начинаются лень и отговорки, а за ними — отсутствие профессионального роста, критики по-настоящему крутых программистов, уныние и застой.

На Cult of Martians мы собираем интересные задачи для современных веб-программистов. Можно выбрать подходящую по сложности, продолжительности и специализации. Задачи не выдуманы «из воздуха» — каждая решает насущную проблему, и решить ее можно через создание нового Open Source проекта или улучшение существующего. Решайте задачи, прокачивайтесь, присылайте решение на оценку. Лучших могут пригласить к себе на работу компании, программистам которых понравится ваше решение.

Помощь запрашивает Вова Дем Вова ДемВова Дем

Бэк: TestProf: добавить улучшенную поддержку сэмплирования тестов

Для уверенных в себе, задача на несколько дней

Gem test-prof включает в себя инструмент для запуска случайного набора тестов (документация).

Текущая реализация имеет ряд ограничений:

  • можно запускать только случайный набор файлов, а не отдельных тестов (из-за этого количество тестов в сэмплах может значительно отличаться);
  • не поддерживает фильтрацию тестов в RSpec (например, по тэгам или по описанию).

Необходимо усовершенстовать поддержку сэмплирования в TestProf.

Польза: узнать, как работают изнутри популярные библиотеки для тестирования в Ruby (RSpec и Minitest), принести пользу сообществу.

Инструкции по выполнению

  1. Ознакомиться с более подробным описанием задачи.
  2. Форкнуть проект test-prof на GitHub.
  3. Реализовать необходимый функционал.
  4. Сделать Pull Request.

— Можно мне взять эту задачу?

Все задачи на этой странице еще не решены. Если задача вам интересна — берите и смело делайте. Спрашивать разрешения и становиться в очередь не нужно. Даже если кто-то сделает задачу быстрее вас, не останавливайтесь — ваше решение может быть лучше. Это Open Source!

Помощь запрашивает Вова Дем Вова ДемВова Дем

Бэк: Добавить интеграцию с OptionParse в anyway_config

Для новичков, задача на неделю

Gem anyway_config предоставляет единый API для конфигурирования Ruby приложения из разных источников данных (YAML файлы, переменные окружения), позволяя без лишних усилий следовать принципам Twelve-Factor App методологии.

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

Для этого предполагется добавить интеграцию стандартной Ruby библиотеки OptionParse в anyway_config.

Польза: познакомится с OptionParse в Ruby, принести пользу сообществу.

Инструкции по выполнению

  1. Ознакомиться с более подробным описанием задачи.
  2. Форкнуть проект anyway_config на GitHub.
  3. Реализовать необходимый функционал.
  4. Сделать Pull Request.

Помощь запрашивает Юлия Олецкая Юлия ОлецкаяЮлия Олецкая

Бэк: Добавить API для поддержки различных адаптеров в Ruby gem jwt_sessions

Для уверенных в себе, задача на несколько дней

Gem jwt_sessions предоставляет базовый инструментарий для использования JWT для аутентификации пользователей.

Для хранения токенов сейчас используется Redis, и нет простой (то есть, без monkeypatching) возможности использовать другие хранилища — такие, например, как база данных, или память приложения (что может быть полезно в тестовом окружении).

Необходимо в рамках gem’а реализовать интерфейс для написания сторонних адаптеров, реализовать через него существующий Redis адаптер, а также добавить из коробки in-memory адаптер.

Польза: познакомиться поближе c JWT, применить навыки рефакторинга в Ruby, принести пользу сообществу.

Советы по реализации

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

Во-первых, нужно вынести общую логику из текущей реализации (RedisTokenStore) в абстрактный или базовый адаптер (например, AbstractTokenStore).

Во-вторых, переписать существующий RedisTokenStore с использованием абстрактного адаптера.

И, наконец, добавить новый MemoryTokenStore для хранения токенов в памяти приложения.

Также необходимо добавить параметр конфигурации, отвечающий за выбор адаптера:

JWTSessions.store_adapter = JWTSessions::RedisTokenStore.new(options)

# можно также использовать символы
JWTSessions.store_adapter = :redis, options

Помощь запрашивает Андрей Ситник Андрей СитникАндрей Ситник

Фронт: Убрать Cairo из postcss-conic-gradient

Для новичков, задача на неделю

postcss-conic-gradient — полифил для конических градиентов в CSS.

Он генерирует SVG-картинку для градиента и вставляет эту каринку в CSS как data:uri. Для генерации изображения он сейчас использует Cairo — бинарную зависимость, которую надо отдельно ставить в систему.

Нужно заменить Cairo на какую-то другую библиотеку на чистом JavaScript или вручную генерировать SVG.

Польза: получить опыт работы с графикой в JavaScript, улучшить очень полезный полифил.

  1. Изучить текущий код.
  2. Найти способы сгенерировать SVG на чистом JS.
  3. Форкнуть postcss-conic-gradient и исправить его.

Помощь запрашивает Андрей Ситник Андрей СитникАндрей Ситник

Бэк: Исправить реакцию на неизвестное событие в Logux Rails

Для новичков, задача на несколько дней

Logux Rails — gem, позволяющий связать Logux-сервер и приложение на Ruby on Rails. В каталоге app/logux/ разработчик описывает права доступа и контроллеры для разных типов событий от Redux и подписок.

Если разработчик не создал обработчик для какого-то события или подписки, gem выбросит ошибки NoPolicyError и NoActionError. Вместо этого нужно в ответ выдавать ['unknownAction', meta.id] или ['unknownChannel', meta.id].

Польза: получить open source портфолио в Ruby, научиться работать с Logux.

  1. Форкнуть Logux Rails.
  2. Убрать выбрасивание ошибки NoActionError. Иногда имеет смысл не иметь код в app/logux/actions для события.
  3. Для неизвестного события вместо NoPolicyError писать ['unknownAction', meta.id].
  4. Для неизвестной подписки вместо NoPolicyError писать ['unknownChannel', meta.id].
  5. Обновить тесты.

Помощь запрашивает Андрей Ситник Андрей СитникАндрей Ситник

Бэк: Добавить strong params в Logux Rails

Для новичков, задача на несколько дней

Logux Rails — gem, позволяющий связать Logux-сервер и приложение на Ruby on Rails. В каталоге app/logux/ разработчик описывает права доступа и контроллеры для разных типов событий от Redux и подписок.

Нужно, чтобы в Logux::Actions работала та же фильтрация входящих параметров, что и в контроллерах Rails.

Польза: получить open source портфолио в Ruby, научиться работать с Logux.

  1. Форкнуть Logux Rails.
  2. Прочитать про strong params: причины, документацию, API.
  3. Разобраться, как strong params подключаются к контроллерам Rails.
  4. Подключить их так же в Logux::Actions.
  5. Покрыть тестами.

Помощь запрашивает Андрей Ситник Андрей СитникАндрей Ситник

Бэк: Улучшить ответ при ошибке в Logux Rails

Для новичков, задача на несколько дней

Logux Rails — gem, позволяющий связать Logux-сервер и приложение на Ruby on Rails. В каталоге app/logux/ разработчик описывает права доступа и контроллеры для разных типов событий от Redux и подписок.

Сейчас при ошибке gem всегда выдает ['error'] в ответ. Нужно возвращать ['error', meta.id, error_stack] или ['error', auth_id, error_stack].

Польза: получить open source портфолио в Ruby, научиться работать с Logux.

  1. Форкнуть Logux Rails.
  2. Изучить текий способ обработки ошибок.
  3. Изменить обработку ошибок, чтобы знать, какая команда из command_params вызвала ошибку.
  4. Для ошибки во время команды action нужно писать в ответ ['error', meta.id, error_stack].
  5. Для ошибки во время команды auth нужно писать в ответ ['error', chunk.auth_id, e.backtrace.join("\n")].
  6. Убедиться, что ошибка в одной команде не мешает обработать остальные команды.
  7. Обновить тесты.

Помощь запрашивает Андрей Ситник Андрей СитникАндрей Ситник

Фронт: Перезапустить easings.net

Для новичков, задача на несколько недель

Easings.net — каталог easing-функций. Easing-функции — очень важный элемент анимаций, поэтому многие разработчики посещают этот сайт, чтобы правильно подобрать анимацию на веб-странице.

Польза: получить опыт JavaScript-разработки; модернизировать популярную шпаргалку для разработчиков.

  1. Изучить текущий сайт.
  2. Изучить, что надо переделать, а что оставить.
  3. Придумать дизайн и нарисовать его набросок.
  4. Опубликовать набросок вашего дизайна в комментариях к issue.
  5. После одобрения дизайна, форкнуть репозиторий и написать новый код.
  6. Отправить новый код в pull request.

Помощь запрашивает Вова Дем Вова ДемВова Дем

Бэк: Добавить поддержку Plezi/Iodine в LiteCable

Для новичков, задача на неделю

LiteCable – это альтернативная реализация фреймворка ActionCable из Rails, совместимая с ActionCable-клиентами, но при этом имеющая минимум зависимостей.

Необходимо добавить в LiteCable интеграцию с Plezi (Iodine) “из коробки” (по аналогии с тем, как это сделано для AnyCable).

Польза: познакомиться и научиться работать с новым веб-сервером для Ruby приложений (Iodine); разобраться во внутреннем устройстве real-time фреймворков.

Постановка задачи

Iodine – это новый веб-сервер для Ruby приложений (альтернатива Unicorn/Puma/etc), спроектированный специально для работы с большим количеством одновременных подключений (например, веб-сокетов).

LiteCable реализует бизнес-логику работы с сокетами (“каналы”) и предоставляет API для интеграции с непосредственно сервером (на данный момент “из коробки” доступна интеграция с AnyCable.

Задача состоит в том, чтобы сделать использование Iodine в качестве сервера для LiteCable возможным и максимально простым.

Советы по реализации

Вместо “голого” Iodine можно сделать интеграцию с Plezi – микро-фреймворком для работы с веб-сокетами.

Информацию о внутреннем устройстве подписок можно посмотреть тут.

Инструкции по выполнению

  1. Обсудить задачу, если есть вопросы.
  2. Форкнуть проект litecable на GitHub.
  3. Реализовать необходимый функционал.
  4. Сделать Pull Request.

Помощь запрашивает Андрей Ситник Андрей СитникАндрей Ситник

Фронт: Событийная архитектура PostCSS

Для продвинутых, задача на месяц

Нужно придумать новый API для плагинов PostCSS — чтобы они все работали вместе, в одном цикле прохода по AST-дереву.

Задание сложное. Оно меньше про код и больше про переговоры, анализ и архитектуру. Но зато дает максимальное количество опыта.

Польза: стать одним из ведущих коммитеров PostCSS, добавить в резюме строку о разработке грамотной архитектуры в мировом проекте.

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

У Babel есть более правильный visitor API: когда плагины подписываются на какие-то типы узлов. А внутри PostCSS запускается один проход по дереву, который в нужных местах дергает подписанные плагины.

Первый этап:

  1. Придумать такой API.
  2. Сделать пару примеров псево-кода: как API будет использоваться в простейших плагинах?
  3. Отправить эти примеры Андрею (Gist или проект на GitHub).

Помощь запрашивает Сергей Долганов Сергей ДолгановСергей Долганов

Бэк: Добавить новые источники данных в Ossert: Reddit

Для уверенных в себе, задача на несколько дней

Нужно добавить в Ossert новые источники данных. Отличным кандидадатом с достаточно богатым API является Reddit.

Это позволит охватить еще один важный аспект развития Open-Source библиотек — доступность и объем поддержки, а также заинтересованность в них.

Польза: возможность научиться работать с API Reddit и узнать больше о метриках и поведении разработчиков свободного ПО.

Как это должно работать?

На данный момент сбор информации уже работает для Rubygems, Github, Bestgems и StackOverflow. Необходимо совместимым образом организовать сбор с новых источников.

Советы по реализации

За основу предлагается взять любой из существующих классов для сбора в Ossert. Например, Ossert::Fetch::Rubygems, и реализовать класс, осуществляющий сбор интересной информации:

module Ossert
  module Fetch
    class Reddit
      def initialize(project)
        ...
      end

      def process
        # Метод сбора основных метрик по проекту
      end
    end
  end
end

Для начала, вам потребуется вникнуть в проблему, решаемую проектом — оценку зрелости свободного ПО.

Для этого нужно проанализировать возможность API вашего источника данных и выбрать:

  1. параметры для сбора;
  2. полезные метрики, которые можно измерить на их основании.

Например:

  • «сколько было комментариев к постам о проекте с момента последнего релиза»;
  • «сколько уникальных пользователей комментировали посты о проекте».

А затем, конечно, организовать сбор этих метрик и параметров.

Инструкции по выполнению

  1. Форкнуть проект Ossert на Github.
  2. Реализовать необходимый функционал.
  3. Сделать Pull Request.