Хотите расти как разработчик и найти крутую работу? Не протирайте штаны — займитесь Open Source проектами. Так легче всего попасть в лучшие команды разработчиков и положить себе в резюме настоящий проект, вместо нелепых «примеров кода». Но найти подходящий проект для участия сложно. Начинаются лень и отговорки, а за ними — отсутствие профессионального роста, критики по-настоящему крутых программистов, уныние и застой.
На Cult of Martians мы собираем интересные задачи для современных веб-программистов. Можно выбрать подходящую по сложности, продолжительности и специализации. Задачи не выдуманы «из воздуха» — каждая решает насущную проблему, и решить ее можно через создание нового Open Source проекта или улучшение существующего. Решайте задачи, прокачивайтесь, присылайте решение на оценку. Лучших могут пригласить к себе на работу компании, программистам которых понравится ваше решение.
Помощь запрашивал Андрей Ситник
Помог Усман Юнусов
Для новичков, задача на неделю
Помощь запрашивал Андрей Ситник
Помог col3name
Для новичков, задача на пару недель
node-build — скрипт для сборки версий Node.js. Он используется в разных менеджерах контроля версий Node.js, например, в asdf.
Когда выходит новая версия Node.js, бот nodenv-bot
присылает PR в node-build
с файлами новой версии. Есть пример такого PR. К сожалению, у мейнтейнеров может ути несколько дней, чтобы вмержить его.
Можно добавить скрипт в GitHub Action CI, который будет автоматически мержить PR от nodenv-bot
после прохождения тестов.
Польза: получить опыт работы с CI.
Помощь запрашивал Андрей Ситник
Помог bijela-gora
Для уверенных в себе, задача на пару недель
Нужно добавить типы в culori, библиотеку для работы с цветом.
Автор библиотеки хотел бы добавить типы не через .d.ts
-файлы, а через JSDoc-комментарии в JS-файлах.
Польза: получить опыт работы с TypeScript.
Помощь запрашивал Дмитрий Цепелев
Для уверенных в себе, задача на неделю
Необходимо написать инструмент для Ruby-стека, который будет обнаруживать участки кода, способные вызвать memory bloat.
Польза: разобраться с тем, как Rails работает с I/O; написать инструмент, которым будет активно пользоваться Ruby-сообщество.
Помощь запрашивал Андрей Ситник
Помог Виктор Малий
Для уверенных в себе, задача на пару недель
Сейчас logux.io использует Parcel для сборки сайта — он генерирует HTML-шаблон и ассеты, которые потом наполняет другой скрипт.
Нужно перевести проект на Vite — чтобы увеличить скорость сборки и уменьшить размер node_modules
.
Польза: получить open source портфолио на Node.js.
Помощь запрашивал Андрей Ситник
Помог sult4novars
Для уверенных в себе, задача на пару недель
Сейчас postcss.org использует Parcel для сборки сайта — он генерирует HTML-шаблон и ассеты, которые потом наполняет другой скрипт.
Нужно перевести проект на Vite — чтобы увеличить скорость сборки и уменьшить размер node_modules
.
Польза: получить open source портфолио на Node.js.
Помощь запрашивал Вова Дем
Помогли Дмитрий Немыкин
Для новичков, задача на пару дней
Альтернативное решение от @deflexor.
Гем anyway_config предоставляет единый API для конфигурирования Ruby приложений из разных источников данных (YAML файлы, переменные окружения, Rails Credentials).
Сейчас в геме есть поддержка окружений (development
, production
) только для Rails приложений (и только для загрузки данных из YAML файлов).
Однако понятие «окружения» имеет смысл не только в контексте Rails или даже других веб-фреймворков.
Предлагается добавить поддержку окружений в основную часть (а не только в Rails расширение).
Польза: познакомится с Anyway Config, попробовать поработать с RBS (проект покрыт типами), принести пользу Ruby сообществу.
Помощь запрашивал Дмитрий Цепелев
Помог Alexandr Borisov
Для новичков, задача на пару дней
rubocop-graphql — Ruby gem, проверяющий соответствие стилю код, использующий DSL graphql-ruby.
Необходимо реализовать коп UnusedArgument
, предотвращающий объявление полей, не используемых в resolve
.
Польза: научиться писать копы для rubocop, принести пользу Ruby-сообществу.
Помощь запрашивал Андрей Ситник
Помог bijela-gora
Для уверенных в себе, задача на пару недель
Нужно обновить pino
в Logux Server. Главная проблема в том, что нужно переписать humanFormatter
на Pino Transports.
Польза: получить open source портфолио на Node.js.
Помощь запрашивал Андрей Ситник
Помог Усман Юнусов
Для новичков, задача на неделю
lint-staged позволяет запускать тесты/форматеры на измененных файлах в pre-commit-хуке.
Это отличный инструмент, но 7 МБ много для ее простой утилитарной функции. Хочется иметь минималистичный аналог, пусть и ценой потери функционала.
Что аналог должен уметь:
"*.js": ["eslint", "prettier"]
.Чем можно пожертвовать:
simple-git-hooks
вида "pre-commit": "./node_modules/.bin/nano-staged ./package.json"
.git add -p
— для них можно не запускать скрипты (предупредив об этом в документации и в выводе в консоль при коммите)."*.js": "./node_modules/.bin/prettier"
.Задача — создать новый проект минималистичного аналога lint-staged.
Польза: получить open source портфолио на JS.
Помощь запрашивал Андрей Ситник
Помог Иван Бакланов
Для новичков, задача на неделю
Сейчас Nano Stores I18n загружает все переводы для выбранного языка сразу. Разработчик должен передать функцию вида:
get (locale) {
return fetch(`/translations/${locale}.json`)
}
Но было бы круто иметь тут опциональный аналог tree-shaking, чтобы грузить переводы блоками — только те блоки, который нужны для используемых на странице компонентов.
Например, разработчик может ввести правило давать имена компонентам (которые используются в функции перевода) вида main/post
или settings/user
. Переводы он тоже будет хранить блоками, объединяя компоненты с одинаковым префиксом: translations/ru/main.json
или translations/settings/ru.json
.
В get
I18n будет передавать имена всех компонентов, для которых не хватает перевода. Тогда разработчик может передать такую функцию:
get (locale, components) {
return Promise.all(
components
.map(name => name.split('/')[0])
.unique()
.map(chunk => fetch(`/translations/${locale}/${chunk}.json`))
)
}
Польза: получить open source портфолио на JS.
Помощь запрашивал Андрей Ситник
Помог Сергей Королёв
Для новичков, задача на неделю
Nano Stores I18n — библиотека для перевода приложений.
Есть интересная идея: добавить процессоры в переводы. Например, на базе этих препроцессоров можно сделать смену перевода при смене ширины экрана.
// stores/i18n.js
import { atom, onMount } from 'nanostores'
import { createI18n, sizePreprocessor } from '@nanostores/i18n'
const screenSize = atom('big')
onMount(screenSize, () => {
let media = window.matchMedia('(min-width: 600px)')
function check () {
screenSize.set(media.matches ? 'big' : 'small')
}
media.addEventListener('change', check)
() => {
media.removeEventListener('change', check)
}
})
size.setSource(screenSize)
export const i18n = createI18n(locale, {
get: …,
preprocessors: [
sizePreprocessor
]
})
Надо отправить PR в Nano Stores I18n с реализацией препроцессоров.
Польза: получить open source портфолио на JS.
Помощь запрашивал Андрей Ситник
Помог Сергей Колесников
Для новичков, задача на неделю
Я медленно начал переводить свои проекты на фреймворк тестов uvu. Предлагается помочь с переходом репозитория Browserslist на uvu.
Польза: строка в резюме с PR в популярный проект.
Помощь запрашивал Андрей Ситник
Помог Андрей Ким
Для новичков, задача на неделю
Я медленно начал переводить свои проекты на фреймворк тестов uvu. Предлагается помочь с переходом репозитория PostCSS на uvu.
Польза: строка в резюме с PR в популярный проект.
Помощь запрашивал Вова Дем
Помог Георгий Мельников
Для новичков, задача на пару дней
Гем ckeditor позволяет легко и просто интегрировать популярный WYSIWYG текстовый редактор CKEditor в Ruby on Rails приложения.
Данная интеграция в том числе позволяет прикреплять картинки и произвольные файлы к тексту, что требует установки защиты на стороне сервера — авторизации.
Сейчас гем ckeditor предлагает из коробки интеграции с такими библиотеками, как Pundit и CanCanCan. Помимо них в мире Ruby есть ещё один инструмент для авторизации, который набирает популярность, — Action Policy.
Предлагается добавить поддержку Action Policy в гем ckeditor.
Польза: познакомится с CKEditor и Action Policy, принести пользу Ruby сообществу.
Помощь запрашивал Андрей Ситник
Помог Артём Тумин
Для новичков, задача на неделю
Когда Size Limit проверяет размер библиотеки, он собирает ее с помощью webpack, чтобы оценить влияние добавления библиотеки на webpack-проект.
Но esbuild становится все популярнее. К тому же, он весит меньше, работает быстрее и позволяет получить оценку размера, которая все равно будет применима и для webpack-проекта (с небольшой погрешностью).
Нужно создать плагин для Size Limit, который будет использовать esbuild вместо webpack.
Польза: строка в резюме с PR в популярный проект.
Помощь запрашивал Андрей Ситник
Помог Егор Огарков
Для новичков, задача на неделю
Сейчас @size-limit/webpack
весил 70 МБ. Большая часть размера идет от функций, которые очень редко нужны — опции --why
и поддержки CSS.
Нужно вынести их в отдельные плагины @size-limit/webpack-why
и @size-limit/webpack-css
.
Польза: строка в резюме с PR в популярный проект.
Помощь запрашивал Андрей Ситник
Помог Богдан Долин
Для новичков, задача на неделю
Разработчики часто допускают ошибку в настройке сборки и запускают PostCSS без плагинов или опции parser
и stringifier
. В этом случае PostCSS ничего полезного не делает, но потребляет ресурсы на ненужный парсинг CSS.
Сейчас в таком случае мы предупреждаем разработчиков о ненужной работе. Но они жалуются, что часто ошибку в настройке допустили авторы инструментов, а сами уже не могут ничего исправить.
Мы можем убрать это предупреждение, если ничего не будем делать в этом случае.
Польза: строка в резюме с PR в популярный проект.
Помощь запрашивал Андрей Ситник
Помог bijela-gora
Для новичков, задача на неделю
В логах Logux Server есть много длинных полуслучайных кодов, которые надо между собой сравнивать:
10:FnXaqDxY
.1487805099387 10:FnXaqDxY 0
(в середине содержит ID клиента).action.id
у action с type logux/processed
и logux/undo
.Нужно добавить цветовой код (например, 3 цвета на ID клиента и 5 цветов на Action ID), чтобы можно было быстро искать связанные записи в логе.
Задача требует дизайн-похода: не просто реализовать код, а попробовать разные варианты, чтобы найти самый полезный.
Польза: получить open source портфолио на Node.js.
Помощь запрашивал Андрей Ситник
Помог Алексей Чазов
Для новичков, задача на неделю
Yaspeller позволяет проверить орфографию в документации проекта через сервисы Яндекса.
Он занимает в node_modules
3,6 МБ, что много для такого простого инструмента.
Кажется, что можно легко уменьшить размер раза в 2, проанализировав зависимости.
Польза: получить open source портфолио на Node.js.
Помощь запрашивал Миша Меркушин
Помог Igor Platonov
Для новичков, задача на несколько дней
graphql-connections — Ruby gem, расширяющий стандартные имплементации пагинаций GraphQL Ruby.
В текущей версии для пагинации Stable поддерживается только :asc
сортировка в режиме :primary_key
. Необходимо добавить поддержку :desc
сортировки.
Польза: разобраться с устройством graphql-ruby, прокачаться в Ruby, принести пользу сообществу.
Помощь запрашивал Андрей Ситник
Помог Виталий Якунин
Для новичков, задача на неделю
Если в конфиге PostCSS написать tailwindcss()
вместо tailwindcss
, то плагин будет инициироваться много раз, что плохо влияет на производительность.
Надо исследовать причину такого поведения и предложить решение.
Польза: строка в резюме с PR в популярный проект.
Помощь запрашивал Вова Дем
Помогли Артем Коротченко
Для новичков, задача на пару дней
WebSocket Director — это инструмент для выполнения сценариев взаимодействия WebSocket-клиентов с сервером.
Сейчас он поддерживает сценарии в только формате YAML, что удобно для работы с небольшими сценариями и при их ручном написании.
Однако YAML имеет несколько недостатков:
С обеими этими проблемами с лёгкостью справляется JSON.
Предлагается добавить поддержку сценариев в формате JSON, передаваемых как в качестве файлов, так и через опцию CLI.
Польза: поэкспериментировать с вебсокетами и CLI-утилитами, принести пользу Ruby сообществу.
Помощь запрашивал Вова Дем
Помогли Виктор Малий
Для новичков, задача на пару дней
Недавно выпущенная библиотека AnyCable JS является альтернативой стандартному пакету из Rails (@rails/actioncable
). Она предоставляет более современный API и новые возможности для написания WebSocket-приложений, использующих Action Cable или AnyCable.
В AnyCable JS понятие канала абстрагировано от транспортного слоя (сокетов), что позволяет рассматривать классы каналов как обычные JS-классы. В свою очередь, это открывает возможности для создания инструментов unit-тестирования каналов — это мы и предлагаем попробовать реализовать.
Польза: получить опыт работы с JS/TS, разобраться в том, как устроены клиентские библиотеки для работы с Action Cable, принести пользу Rails-сообществу.
Помощь запрашивал Вова Дем
Помог Игорь Платонов
Для новичков, задача на неделю
AnyCable Rack Server — это реализация AnyCable WebSocket-сервера на Ruby, предназначенная для использования в локальном или тестовом окружении.
Одна из целей создания этого проекта — упростить проведение экспериментов с новым функционалом для AnyCable (так как не требует инфраструктурных изменений и вмешательства в код библиотек на других языках).
Сейчас AnyCable предоставляет большое количество функций помимо стандартного набора из Action Cable. В частности, поддержку бинарных протоколов: Msgpack и Protobuf.
Данные форматы уже поддерживаются AnyCable Client из коробки, однако в AnyCable Rack Server есть только поддержка Msgpack. Требуется добавить поддержку Protobuf.
Польза: получить опыт работы с Google Protocol Buffers в Ruby, узнать получше, как работает AnyCable, принести пользу Ruby сообществу.
Помощь запрашивал Вова Дем
Помогли Alexander Baygeldin
Andrey Viktorov
Для новичков, задача на неделю
Ruby Next — транспайлер для Ruby, который позволяет трансформировать новые синтаксические конструкции в совместимые со старыми версиями Ruby и альтерантивными имплементациями.
Сейчас Ruby Next позволяет транспилировать синтаксис в двух режимах: в рантайме и используя прекомпилированные файлы. Однако, есть один вариант выполнения Ruby кода, который сейчас не поддерживается — внутри интерактивной консоли (IRB или Pry).
Требуется добавить расширения для IRB и Pry, которые позволят использовать Next синтаксис при выполнении кода внутри консоли.
Польза: узнать, как работают IRB и Pry, познакомиться с миром транспайлеров, принести пользу Ruby-сообществу.
Помощь запрашивал Вова Дем
Помогли Илья Григоришин
Артем Коротченко
Для новичков, задача на пару дней
WebSocket Director — это инструмент для выполнения сценариев взаимодействия WebSocket-клиентов с сервером. Он позволяет описывать последовательность действий и ожиданий в текстовом формате (YML), создавать сразу несколько соединений и следить за результатами выполнения. Используется для blackbox-тестирования и в качестве вспомогательного инструмента при разработке.
Зачастую сценарии содержат повторяющиеся шаги: отправить сообщение, получить ответ, отправить еще раз и т.д.
Предлагается добавить новую директиву loop
для оптимизации подобных последовательностей.
Польза: поэкспериментировать с вебсокетами и CLI-утилитами, принести пользу Ruby сообществу.
Помощь запрашивал Андрей Ситник
Помог Усман Юнусов
Для новичков, задача на неделю
Надо сделать npm-пакет, который расширяет Nano Colors парсером строки с особым языком для указания цвета:
import { colorize } from "nanocolors-template";
colorize`
CPU: {red ${cpu.totalPercent}%}
RAM: {green ${(ram.used / ram.total) * 100}%}
DISK: {yellow.bold ${(disk.used / disk.total) * 100}%}
`;
Польза: получить open source портфолио на Node.js.
Помощь запрашивал Андрей Ситник
Помог Himank Pathak
Для новичков, задача на неделю
С Browserslist можно использовать команду команду npx browserslist --update-db
, чтобы обновить версию caniuse-lite
в текущем проекте. Эта команда не поддерживала Yarn 2.
В Yarn 3 добавили команду yarn up -R caniuse-lite
, которая сама может обновить все вложенные зависимости.
Польза: строка в резюме с PR в популярный проект.
Помощь запрашивал Андрей Ситник
Помог Усман Юнусов
Для новичков, задача на неделю
Autoprefixer неправильно обрабатывает ::file-selector-button
. На входящий CSS:
input::file-selector-button {
color: black;
}
input:hover::file-selector-button {
color: white;
}
Autoprefixer выдает:
input:hover::-webkit-file-upload-button {
color: white;
}
input:hover::file-selector-button {
color: white;
}
input:hover::file-selector-button {
color: white;
}
Хотя должен:
input::-webkit-file-upload-button {
color: black;
}
input::file-selector-button {
color: black;
}
input:hover::file-selector-button {
color: white;
}
input:hover::file-selector-button {
color: white;
}
Польза: строка в резюме с PR в популярный проект.
Помощь запрашивал Андрей Ситник
Помог Виктор Малий
Для новичков, задача на неделю
PostCSS 8.1 неправильно обрабатывает CSS:
.stuff {
.foo {
svg {
display: none;
}
.bar {
display: inline;
}
}
}
Получается:
.stuff .foo .stuff svg {
display: none;
}
.stuff .foo .stuff .bar {
display: inline;
}
А должно:
.stuff .foo svg {
display: none;
}
.stuff .foo .bar {
display: inline;
}
Польза: строка в резюме с PR в популярный проект.
Помощь запрашивал Андрей Ситник
Помог Константин Стефанович
Для новичков, задача на неделю
У Size Limit используется больше 100 под-зависимостей. Согласно npm.anvaka.com, большинство под-зависимостей идут от read-pkg-up
и ora
, которые не настолько полезны, чтобы мириться с таким их количеством.
Нужно заменить их на аналоги.
Польза: получить open source портфолио на Node.js.
Помощь запрашивал Андрей Ситник
Помог Виктор Малий
Для новичков, задача на неделю
Nano ID генерирует случайные ID, поэтому случайность влияет на тесты. В итоге, иногда не вызывается строка 50 в async/index.js
, и тесты падают из-за недостаточного покрытия.
Не хочется снижать критерий на покрытие тестами. Лучше подобрать такие параметры длины алфавита, чтобы строка вызывалась чаще.
Польза: получить open source портфолио на Node.js, строка в резюме с PR в популярный проект.
Помощь запрашивал Андрей Ситник
Помог Виктор Малий
Для новичков, задача на неделю
postcss-nested
неправильно работает с 3-м уровнем вложенности:
.text {
&:hover {
border-color: red;
&:before {
color: red;
}
}
}
Польза: получить open source портфолио на Node.js, строка в резюме с PR в популярный проект.
Помощь запрашивал Андрей Ситник
Помог Александр
Для новичков, задача на неделю
Сообщение dir-dependency
используется PostCSS-плагинами, чтобы сообщить сборщику о том, что нужно следить за добавлением файлов в папке. Например, потому что плагин читает из папки список миксинов.
result.messages.push({
type: "dir-dependency",
plugin: "postcss-import",
dir: "/imported",
glob: "**/*.css",
parent: result.opts.from,
});
Плагин postcss-mixins
использует только сообщение depenency
для использованных файлов, но не dir-dependency
для папок, где он ищет файлы с миксинов.
Польза: получить open source портфолио на Node.js, строка в резюме с PR в популярный проект.
Помощь запрашивал Андрей Ситник
Помог Усман Юнусов
Для новичков, задача на неделю
Web Manifest — это JSON-файл, который описывает иконки и настройки для интеграции веб-приложения в браузер и ОС.
Из-за ссылок на иконки, нельзя взять просто статичный JSON-файл — ссылки на иконки надо взять из webpack, чтобы они содержали cache buster и прошли через loader’ы.
Польза: получить open source портфолио на Node.js.
Помощь запрашивал Андрей Ситник
Помог Никита Карамов
Для новичков, задача на неделю
lint-staged со всеми зависимостями занимает 21 МБ на диске:
$ mkdir test && cd test
$ yarn add lint-staged
$ du -sh node_modules
21M node_modules
Главная причина — огромное, глубокое дерево зависимостей.
Задача — заменить зависимости с кучей подзависимостей на минималистичные альтернативы. Совсем простые зависимости реализовать заново в проекте.
Польза: получить open source портфолио на Node.js, строка в резюме с PR в популярный проект.
Помощь запрашивал Андрей Ситник
Помог Алексей Шлык
Для новичков, задача на неделю
В старых версиях postcss-loader
, postcss
была в зависимостях пакета. Теперь она в peerDependencies
— пользователь должен поставить postcss
сам в свой проект паралелльно с postcss-loader
.
Многие пользователи пропустили это в списке изменений postcss-loader
. Из-за особенностей работы npm, у них может устанавливаться postcss
неожиданных версий. Часто это оказывается старая PostCSS 7, которая отказывается работать с новыми плагинами и путает пользователей.
Можно улучшить опыт разработчиков с помощью дополнительной проверки:
postcss().version
7, то пытаемся найти package.json
.package.json
можно искать только в текущей папке (process.cwd()
).package.json
нет postcss
в dependencies
или devDependencies
, то выводим ошибку, требуя явно установить postcss
.postcss
в прямых зависимостях есть, то ставим глобальный флаг, чтобы не запускать проверку снова.Польза: получить open source портфолио на Node.js, строка в резюме с PR в популярный проект.
Помощь запрашивал Андрей Ситник
Помог Виктор Малий
Для новичков, задача на неделю
На сайте Logux есть раздел с API веб-клиента и node-сервера. Сейчас боковое меню разбито на категории: классы, функции, переменные.
API-страницы можно сделать удобнее для изучения Logux, если сгруппировать классы и функции по смыслу. Например:
Польза: получить open source портфолио на Node.js.
Помощь запрашивал Андрей Ситник
Помог Михаил Горбунов
Для новичков, задача на неделю
В сообществе разработчиков есть много инструментов для установки Git-хуков. Хуже и лучше, медленнее и быстрее, некоторые с существенными ограничениями. Например, марсиане создали быстрый и фичастый Lefthook, который мы используем в коммерческих проектах, больших и маленьких.
Возникла идея создать альтернативу средству с максимальными возможностями: микро-менеджер Git-хуков, для «легких» frontend open source проектов. Под капотом — лишь запуск lint-staged
. Без парсинга конфигов в рантайме, с минимумом или совсем без зависимостей и лишь парой дополнительных строк в package.json
:
"simple-pre-commit": "npx lint-staged",
Польза: внести вклад в дело уменьшения коллективного размера node_modules
. Получить open source портфолио на Node.js.
Помощь запрашивал Андрей Ситник
Помог Александр Слепченков
Для новичков, задача на неделю
Сейчас Logux Server использует Yargs, чтобы работать с CLI-аргументами и выводить --help
.
Но у Yargs некрасивый вывод --help
— хочется, как минимум, разделить блоки цветом.
Кроме CLI-аргументов, Logux Server получает настройки через переменные среды и опции JS API. Хочется упростить код, совместив обработку всех элементов.
Польза: получить open source портфолио на Node.js.
Помощь запрашивал Дмитрий Цепелев
Помог Дмитрий Цепелев
Для новичков, задача на несколько дней
graphql-ruby-persisted_queries — реализация механизма persisted queries для graphql-ruby, которая позволяет клиенту отправлять хэш GraphQL запроса вместо его полного текста.
В текущей реализации библиотека кэширует только текст запроса. Необходимо добавить возможность кэширования результата разбора запроса и придумать, как заставить среду исполнения пропустить шаг разбора.
Польза: разобраться с устройством graphql-ruby, прокачаться в Ruby, принести пользу сообществу.
Помощь запрашивал Андрей Ситник
Помог Степан Воскресла
Для новичков, задача на неделю
У Browserslist есть свой конфиг, в файлах .browserslistrc
или browserslist
.
Нужно добавить подсветку синтаксиса для этого конфига в GitHub.
# Comment
defaults
# Not keyword
not dead
# Market share with %
> 10%
< 1.5% in US
>= .5%
# Rare queries
maintained node versions
supports es6-module
# Extend keyword
extend @company/browserslist-config
# Direct versions
Chrome 50
Firefox ESR
Safari TP
OperaMini all
# Block header
[production]
# and keyword
Edge > 40 and Edge < 43
# or/, keywords
IE 11 or IE 10, ie 9
Польза: добавить строку в резюме с PR в популярный проект.
Помощь запрашивал Андрей Ситник
Помог Антон Пермяков
Для новичков, задача на неделю
У Browserslist есть свой конфиг, в файлах .browserslistrc
или browserslist
:
# Comment
defaults
# Not keyword
not dead
# Market share with %
> 10%
< 1.5% in US
>= .5%
# Rare queries
maintained node versions
supports es6-module
# Extend keyword
extend @company/browserslist-config
# Direct versions
Chrome 50
Firefox ESR
Safari TP
OperaMini all
# Block header
[production]
# and keyword
Edge > 40 and Edge < 43
# or/, keywords
IE 11 or IE 10, ie 9
Нужно добавить подсветку синтаксиса для этого конфига для Visual Studio Code. Как минимум, нужно подсветить:
#
).all
, esr
и tp
).50%
, 0.5%
, .5%
).not
, and
, or
, extends
и ,
).[production]
).Задача «творческая»: дополнения к этому списку или другие подходы к подсветке приветствуются.
Польза: получить опыт разработки для VS Code, добавить строку в резюме с инструментом для популярного проекта.
Помощь запрашивал Андрей Ситник
Помог Александр Слепченков
Для новичков, задача на неделю
Многие JavaScript-библиотеки используют process.env.NODE_ENV
, чтобы включать инструменты разработчика или дополнительные проверки на этапе разработки:
if (process.env.NODE_ENV !== "production") {
heavyArgsCheck(args);
}
Webpack и другие сборщики умеют вырезать такие конструкции в фронтенд-библиотеках. Но новые сборщики созданные с прицелом на ES-модулей полагаются на package.exports.production
вместо process.env.NODE_ENV
.
Нужно добавить в dual-publish
конвертацию process.env.NODE_ENV
в package.exports.production
.
Польза: расширить open source портфолио в Node.js.
Помощь запрашивал Андрей Ситник
Помог Александр Слепченков
Для новичков, задача на неделю
Browserslist использует caniuse-lite как базу данных актуальных браузеров. Эту базу данных надо регулярно обновлять; есть команда npx browserslist --update-db
, которая сама обновляет версию базы данных в lock-файле.
Но многие пользователи волнуются о том, как обновление может повлиять на поддержку браузеров. Хочется добавить сравнение «было/стало»:
Current version: 1.0.30001148
New version: 1.0.30001154
Removing old caniuse-lite from lock file
Installing new caniuse-lite version
$ yarn install
caniuse-lite has been successfully updated
Target browser changes:
- chrome 67
+ chrome 80
Польза: расширить open source портфолио в Node.js, добавить строку в резюме с PR в популярный проект.
Помощь запрашивал Андрей Ситник
Помог Родион Демихов
Для новичков, задача на неделю
В экосистеме PostCSS есть плагин postcss-nested
для добавления в CSS синтакса вложенных правил (в духе SCSS).
Сейчас postcss-nested
некорретно работает, если другие свойства идут после вложенного правила.
.foo {
a: 1;
&bar {
b: 2;
}
b: 1;
}
.foo {
a: 1;
b: 1;
}
.foobar {
b: 2;
}
В этом примере b: 1
из .foo
после компиляции оказалось выше b: 2
из .foobar
.
Правильный результат:
.foo {
a: 1;
}
.foobar {
b: 2;
}
.foo {
b: 1;
}
Польза: получить open source портфолио на Node.js, строка в резюме с PR в популярный проект.
Помощь запрашивал Дмитрий Цепелев
Помог Yuriy Orlov
Для новичков, задача на пару дней
rubocop-graphql — Ruby gem, проверяющий на соответствие стилю код, использующий DSL graphql-ruby.
Необходимо реализовать коп ObjectDescription
, проверяющий, что для всех типов (включая мутации, подписки, резолверы) заполнено описание (метод description
).
Польза: научиться писать копы для rubocop, принести пользу Ruby–сообществу.
Помощь запрашивал Дмитрий Цепелев
Помог Adel Nabiullin
Для новичков, задача на пару дней
rubocop-graphql — Ruby gem, проверяющий на соответствие стилю код, использующий DSL graphql-ruby.
Необходимо реализовать коп FieldHashKey
, проверяющий, что при объявлении поля везде, где возможно, используется опция :hash_key
.
Польза: научиться писать копы для rubocop, принести пользу Ruby–сообществу.
Помощь запрашивал Дмитрий Цепелев
Помог Shpak Roman
Для новичков, задача на неделю
rubocop-graphql — Ruby gem, проверяющий соответствие стилю код, использующий DSL graphql-ruby.
Необходимо реализовать коп ExtractType
, предлагающий вынести поля с одинаковым префиксом в отдельный тип.
Польза: научиться писать копы для rubocop, принести пользу Ruby-сообществу.
Помощь запрашивал Фил Пирожков
Помог Вячеслав Мефодин
Для уверенных в себе, задача на неделю
RuboCop RSpec — Ruby gem, проверяющий каноничность и соответствие стилю код тестов, написанных с использованием фреймворка RSpec. Многие проверки ориентируются на стандартные методы из RSpec DSL (например, it
, context
и т.д.). Этого недостаточно, если пользователь определяет псевдонимы (aliases) или использует сторонние гемы, расширяющие базовый функционал RSpec.
Например, если пределить псевдоним к it
, story
, то RuboCop RSpec может ошибочно определить группу примеров (example group) как не содержащую ни одного теста.
Необходимо добавить возможность расширять набор распознаваемых RuboCop RSpec методов через YML конфигурацию и обновить существующие копы.
Польза: познакомиться с работой расширений RuboCop, прокачаться в Ruby, принести пользу сообществу.
Помощь запрашивал Дмитрий Цепелев
Помог Yasha Krasnov
Для уверенных в себе, задача на неделю
StoreModel — Ruby gem, позволяющий работать с JSON-колонками как с объектами, очень похожими на обычные ActiveRecord
модели.
Необходимо добавить в StoreModel полиморфные типы, которые будут оборачивать значение из JSON в нужный класс–обертку согласно условиям.
Польза: познакомиться с работой атрибутов в Rails, прокачаться в Ruby, принести пользу сообществу.
Помощь запрашивал Александр Аброськин
Помог Роман Шпак
Для новичков, задача на пару дней
Lefthook — менеджер Git-хуков для проектов на любых языках.
Требуется добавить возможность управлять логом вывода.
В текущей реализации Lefthook не предоставляет возможности пользователю управлять выводом. Для большого числа проверок количество сообщений может быть излишне большим и лог теряет информативность. Хочется через конфиг указать какие сообщения выводить, а какие нет. Например:
output:
- meta
- failures
- success
- summary
Польза: попрактиковаться с Go, познакомиться с git hooks.
Инструкции по выполнению
Помощь запрашивал Вова Дем
Для новичков, задача на неделю
Logidze позволяет работать с версиями объектов Active Record моделей и историей их изменений, хранящейся в виде инкрементального лога в отдельной колонке таблицы БД.
Лог изменений генерируется автоматически (с помощью триггеров в БД), и, как правило, разработчики в приложении используют его только для чтения. Однако, в некоторых случаях может возникнуть необходимость зафиксировать текущее состояние записи вручную: например, при массовом обновлении или вставке удобно отключать встроенный трекинг (Logidze.without_logging { ... }
), что может привести к неконсистентности лога и текущего состояния записей.
Для решения данной проблемы предлагается добавить специальный метод model.fixup_log_data!
, который будет добавлять запись в лог, актуализируя его состояние.
Польза: возможность поработать с базой данных на более низком уровне, принести пользу Rails сообществу.
Помощь запрашивал Вова Дем
Помог Вячеслав Мефодин
Для новичков, задача на неделю
Ruby Next — транспайлер для Ruby, который позволяет трансформировать новые синтаксические конструкции в совместимые со старыми версиями Ruby и альтерантивными имплементациями.
Один из возможных способов сделать это — воспользоваться ruby-next
CLI. Текущая версия CLI
позволяет указывать версию Ruby, для которой необходимо сгенерировать код (ruby-next nextify --min-version=2.5
), что отлично работает для CRuby и совместимых реализаций, но не всегда подходит для таких платформ как mruby, Opal и других.
Требуется расширить функционал CLI и добавить возможность указывать список преобразований явно: ruby-next nextify --rewrite=pattern-matching --rewrite=endless-method
.
Польза: попрактиковаться в написании и тестировании CLI на Ruby, познакомиться с миром транспайлеров, принести пользу Rails сообществу.
Помощь запрашивал Андрей Ситник
Помог Александр Слепченков
Для новичков, задача на неделю
Помощь запрашивал Андрей Ситник
Помог Алексей Наумов
Для новичков, задача на неделю
Нужно перевести Ruby gem logux-rack
на новую версию протокола общения с Logux-сервером. Изменения:
logux-rack
, в случае ошибки, всегда возвращает ["error", stack]
. В новой версии логика сложнее. Если ошибка произошла в момент обработки конкреного action или подписки, сервер должен ответить ["error", meta.id, stack]
. В остальных случаях сервер должен ответь HTTP-кодом 500 с текстом ошибки в теле ответа (прекратив обработку остальных команд).password
на secret
в теле запросов от Logux-сервера и запросов к Logux-серверу.logux-rack
.Польза: получить open source портфолио в Ruby, научиться работать с Logux.
Помощь запрашивал Андрей Ситник
Помог Александр Приворотский
Для новичков, задача на неделю
У Logux есть WebSocket-сервер, который посылает новые сообщения в Rails-приложение. Сейчас новое сообщение проходит 2 стадии — проверку прав доступа и сохранение данных в БД. Нужно добавить третий шаг — определение того, в какие каналы нужно переслать сообщение.
Обработка сообщений от Logux идет в Logux::ActionController
:
module Actions
class Comment < Logux::ActionController
def add
respond :processed
end
end
end
Нужно добавить метод resend
, который будет принимать хэш:
def add
resend channel: 'users'
respond :processed
end
Этот метод будет писать в ответ Logux-серверу:
["resend", @meta.id, { "channel": "users" }]
Польза: получить open source портфолио в Ruby, научиться работать с Logux.
Помощь запрашивал Андрей Ситник
Помог Александр Приворотский
Для новичков, задача на неделю
У Logux есть WebSocket-сервер, который посылает новые сообщения в Rails-приложение. Обработка всех сообщений от Logux идет в Logux::BaseController
(который расширяется в Logux::ActionController
и Logux::ChannelController
):
module Actions
class Comment < Logux::ActionController
def add
respond :processed
end
end
end
Нужно добавить метод send_back(action, meta)
, который будет ставить meta.clients = [meta.client_id]
и вызывать Logux.add(action, meta)
:
def add
send_back(type: 'added')
respond :processed
end
Польза: получить open source портфолио в Ruby, научиться работать с Logux.
Помощь запрашивал Андрей Ситник
Помогла jayhoney
Для новичков, задача на неделю
Нужно добавить новый аргумент: size-limit --watch
, который будет следить за изменением файлов и заново запускать Size Limit.
Можно следить только за изменением JS-файлов, package.json
и конфига Size Limit, игнорируя node_modules
.
Польза: опыт работы с JavaScript в большом опенсорс-проекте.
Помощь запрашивал Андрей Ситник
Помог Иван Соловьев
Для новичков, задача на неделю
Browserslist берет данные Can I Use из пакета caniuse-lite
. Многие команды его не обновляют и данные last 2 version
становятся устаревшими. Сейчас Browserslist определяет, что данные устарели и выводит предупреждение.
К сожалению, npm и Yarn не дают готовые инструменты для обновления версий в глубине дерева зависимостей.
Польза: опыт работы с JavaScript в большом опенсорс-проекте, строка в резюме с PR в известный проект.
Помощь запрашивал Андрей Ситник
Помог Аяз Зайнутдинов
Для новичков, задача на неделю
Сейчас PostCSS сохраняет строку и колонку каждого токена. Но команде Sass для совместимости нужна позиция в CSS-строке (offset) вместо строки и колонки. Можно перевести токенайзер на offset, а строку/колонку вычислять. Это упростит токенайзер и уменьшит расход памяти.
Польза: опыт работы с JavaScript в большом опенсорс-проекте, строка в резюме с PR в известный проект.
Помощь запрашивал Андрей Ситник
Помог Олег Левшин
Для новичков, задача на неделю
Инструмент print-snapshots
печает Jest snapshots.
Нужно добавить два параметра, --update
и --watch
, для обновления snapshots и запуска обновления snapshots при изменении JS-файлов в проекте.
Польза: опыт работы с JavaScript опенсорс-проекте, опыт работы с инструментами тестирования.
Помощь запрашивал Андрей Ситник
Помог Иван Соловьев
Для новичков, задача на неделю
Надо сделать Autoprefixer умнее и генерировать только -moz-
внутри выражения @-moz-document
.
body {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
}
@-moz-document domain('example.com') {
body {
- -webkit-appearance: none;
-moz-appearance: none;
appearance: none;
}
}
Польза: опыт работы с JavaScript в большом опенсорс-проекте, строка в резюме с PR в известный проект.
Помощь запрашивал Андрей Ситник
Помог Виктор Шабрацкий
Для новичков, задача на неделю
clean-publish — CLI-инструмент по очистке npm-пакета от лишних конфигов перед публикацией.
Он берет текущий проект, копирует во временную папку, чистит и вызывает npm publish
на очищенную временную папку.
Нужно добавить опцию beforeScript
, которая перед вызовом npm publish
вызовет какой-то другой скрипт, передав туда путь ко временной папке как аргумент.
"clean-publish": {
"beforeScript": "esm-compiler"
}
Польза: получить опыт разработки под Node.js.
Помощь запрашивал Андрей Ситник
Помог Иван Малов
Для новичков, задача на неделю
Gitter Sidecar — виджет чата для open source-проектов. Его использует PostCSS и Logux.
В виджете оказалось много лишнего кода. 17 KB кода, скорее всего, можно ужать до 5-10 KB.
Польза: опыт улучшения производительности, строка в резюме с PR в известный проект.
Помощь запрашивал Дмитрий Цепелев
Помог Ярослав Литвинов
Для уверенных в себе, задача на несколько дней
StoreModel — Ruby gem, позволяющий работать с JSON-колонками как с объектами, очень похожими на обычные ActiveRecord
модели.
Ранее в StoreModel был добавлен метод #unknown_attributes
, возвращающий Hash
с атрибутами, присутствующими в колонке БД, но не объявленными в модели (подробнее — в в документации). Однако, он не работает с array-типами:
class Config
include StoreModel::Model
attribute :model, :string
end
data = { name: "Apple iPhone" }
config = Config.to_type.cast_value(data)
config.unknown_attributes
# => { name: "Apple iPhone" }
Config.to_array_type.cast_value([data])
# => ActiveModel::UnknownAttributeError
Необходимо дополнить реализацию модуля StoreModel::Types::ArrayType
таким образом, чтобы он собирал все неизвестные атрибуты в #unknown_attributes
для каждого из объектов списка:
data = { name: "Apple iPhone" }
configs = Config.to_array_type.cast_value([data])
configs.first.unknown_attributes
# => { name: "Apple iPhone" }
Более подробно проблема описана в задаче.
Польза: прокачаться в Ruby, принести пользу сообществу.
Помощь запрашивал Дмитрий Цепелев
Помог Paul Blaze
Для уверенных в себе, задача на несколько дней
StoreModel — Ruby gem, позволяющий работать с JSON-колонками как с объектами, очень похожими на обычные ActiveRecord
модели.
Необходимо добавить в StoreModel возможность установить связь между объектом-оберткой и его родителем — объектом класса ActiveRecord
. В результате, у классов, включающих в себя StoreModel::Model
, должен появиться метод #parent
.
Польза: познакомиться с работой атрибутов в Rails, прокачаться в Ruby, принести пользу сообществу.
Помощь запрашивал Андрей Ситник
Помог Никита Мигунов
Для новичков, задача на неделю
Estimo запускает JS-файл в Puppeteer (Chrome без UI) и сообщает, сколько потребовалось времени на компиляцию и запуск файла. Size Limit использует его для оценки времени выполнения JS-бандла.
Puppeteer очень долго скачивает сборку Chrome. В 1.0 Estimo перешел на Puppeteer Core и самм начал искать и скачивать Chrome. В итоге, если у пользователя уже установлен браузер Chrome, Estimo может использовать его.
Однако, код поиска и скачивания Chrome работает плохо, особенно на Travis CI. Нужно переписать код и исправить ошибки.
Польза: получить глубокий опыт в работе Puppeteer.
Помощь запрашивал Вова Дем
Помогли Александр Мусаев
Артём Анохин
Для уверенных в себе, задача на выходные
Gem store_attribute добавляет возможность приведения типов для атрибутов Active Record моделей, созданных с помощью store_accessor
.
Данный gem предоставляет интерфейс (и использует «под капотом») Attributes API, за исключением возможности указания значений по умолчанию.
Необходимо добавить данный функционал в gem.
Польза: узнать, как устроен Attributes API в Active Record, принести пользу Rails сообществу.
Помощь запрашивал Андрей Ситник
Помог Иван Соловьев
Для новичков, задача на неделю
Size Limit собирает JavaScript-библиотеку с помощью webpack, чтобы потом проверить результирующий размер.
Иногда непонятно, почему получился именно такой размер — хотелось бы посмотреть содержимое сборки.
Для этого можно добавить аргумент --save-bundle ./dir
в CLI.
Польза: получить опыт в open source проекте и новых синтаксисах JavaScript.
Помощь запрашивал Андрей Ситник
Помог Павел Винник
Для новичков, задача на неделю
Documentation.js — прекрасная замена мертвому JSDoc. Но все темы для него довольно плохие.
Самое грустное, что для проекта сделали отличную тему documentation-theme-light, но она не закончена.
Нужно добавить JS-скрипты генерации HTML и, опционально, чуть отполировать тему.
Польза: задача идеальна для CSS-разработчиков, которые хотят прокачаться в JavaScript.
Помощь запрашивал Андрей Ситник
Помог Павел Востриков
Для новичков, задача на неделю
В CLI Size Limit нужно добавить опцию size-limit --json
, которая будет
менять формат вывода на JSON:
[
{
"name": "index.js",
"passed": true,
"size": 1024,
"loading": 0.05,
"running": 0.1
}
]
Польза: получить опыт в open source проекте и новых синтаксисах JavaScript.
Помощь запрашивал Долганов Сергей
Для продвинутых, задача на неделю
Нужно создать новую библиотеку, которая состоит из:
Внутри библиотека:
Приведенная на Ruby библиотека используется для создания контрактов в приложении.
Контракт — это набор валидаций (тестов), которые запускаются во время production сессии взаимодействия с внешней системой по API (например, CRM системой или социальными сетями).
Такие валидации решают проблему упрощения отладки и распознавания отклонений в поведении внешних зависимостей.
Польза: создать гибкую и универсальную Go библиотеку, вдохновленную функциональным программированием.
Помощь запрашивал Долганов Сергей
Для продвинутых, задача на неделю
Нужно создать новую библиотеку, которая состоит из:
Внутри библиотека:
Приведенная на Ruby библиотека используется для создания контрактов в приложении.
Контракт — это набор валидаций (тестов), которые запускаются во время production сессии взаимодействия с внешней системой по API (например, CRM системой или социальными сетями).
Такие валидации решают проблему упрощения отладки и распознавания отклонений в поведении внешних зависимостей.
Польза: создать гибкую и универсальную Node библиотеку, вдохновленную функциональным программированием.
Помощь запрашивал Андрей Ситник
Помог Иван Соловьев
Для новичков, задача на неделю
PostCSS парсит значения CSS Custom Properties как обычные значения в CSS-свойствах. Оказалось, что по спецификации там могут быть {
и другие символы.
/* Валидный CSS */
html {
--bracket-block: {1, 2, 3};
--JSON: [1, "2", {"three": 3}, [4]];
--javascript: function(rule) { console.log(rule) };
}
Нужно изменить парсер, чтобы правильно обрабатывать CSS Custom Properties.
Польза: получить опыт JavaScript в известном проекте.
Помощь запрашивал Андрей Ситник
Помог Владимир Щедрин
Для новичков, задача на неделю
В Logux Server надо провести рефакторинг, переведя код на новый синтаксис JavaScript. Поскольку мы теперь требуем Node.js >= 10
, Promise
можно заменить на async
/await
.
Польза: получить опыт в open source проекте и новом синтаксисе JavaScript.
Помощь запрашивал Андрей Ситник
Помог Семён Левенсон
Для новичков, задача на неделю
В Autoprefixer нужно добавить поддержку нового свойства — mask-composite.
Польза: получить опыт JavaScript в известном проекте.
Помощь запрашивал Николай Сверчков
Помог Евгений Гаврилов
Для новичков, задача на несколько дней
Clowne — это Ruby gem для гибкого клонирования моделей, поддерживающий несколько ORM адаптеров.
На данный момент ActiveRecord
адаптер реализует клонирование следующих ассоциаций: has_one
, has_many
, has_and_belongs_to_many
. В первой версии это было сделано специально, чтобы избежать возможных избыточных клонирований и неверного результата в конечном итоге.
Но бывают ситуации, когда к клонируемой модели добавляют связь belongs_to
, и для ее поддержки необходимо переделывать весь стек клонера, что требует много изменений. Проще добавить клонирование лишь этой одной новой связи.
Для покрытия подобного рода кейсов нужно добавить в gem поддерку belongs_to
связей (только для ActiveRecord
адаптера).
Польза: прокачаться в Ruby, получить опыт работы со сложными Ruby библиотеками.
Помощь запрашивал Николай Сверчков
Помог Антон Локтиков
Для новичков, задача на несколько дней
Clowne — это Ruby gem для гибкого клонирования моделей.
Начиная с версии 1.0, Clowne поддерживает два коллбека для обработки клонируемой записи:
finalize
вызывается до сохранения записи в процессе формирования результата клонирования.after_persist
вызывается после сохранения записи для уже сформированной записи.Однако, существуют промежуточные ситуации, когда необходимо обработать собранную, но еще не сохраненную запись.
К примеру, чтобы избежать использования after_persist
и дополнительных операций c базой:
class UserCloner < Clowne::Cloner
# клонируем пользователя и его посты, которые являются черновиками
include_association :posts, scope: :draft
after_clone do |_origin, clone, mapper:, **|
# актуализируем значение атрибута пользователя
clone.draft_count = clone.posts.count
end
end
Альтернативным примером использования может послужить проверка собранной записи по некоторой бизнес-логике:
class UserCloner < Clowne::Cloner
include_association :posts, scope: :draft
after_clone do |origin, clone, errors:, **|
errors.unshift("user clone of #{origin.cache_key} is invalid") if clone.posts.empty?
end
end
errors = []
operation = UserCloner.call(user, errors: errors)
raise errors.join('; ') if errors.any?
Для покрытия подобного рода кейсов мы можно реализовать after_clone
коллбек.
Польза: прокачаться в Ruby, получить опыт работы со сложными Ruby библиотеками.
Помощь запрашивал Вова Дем
Помогла Юлия Олецкая
Для уверенных в себе, задача на несколько дней
AnyCable позволяет использовать сторонние WebSocket-сервера, более производительные и конкурентно-способные, вместе с Action Cable.
Однако это накладывает определенные ограничения — в том числе, необходимость запускать несколько процессов вместо одного.
И хотя AnyCable предполагает использование стандартного Action Cable сервера при разработке и тестировании, многие разработчики (см. например, статью From Action to Any) предпочитают запускать полноценную конфигурацию локально.
Чтобы упростить локальную разработку, мы предлагаем написать AnyCable-совместимый вебсокет-сервер на Ruby с Rack интерфейсом.
Польза: познакомиться с AnyCable, получить опыт написания конкуретных приложений на Ruby.
Помощь запрашивал Андрей Новиков
Помог Дмитрий Швецов
Для новичков, задача на два-три дня
Фреймворк yabeda позволяет легко объявлять и собирать метрики о работе Ruby-приложения — и с помощью адаптеров экспортировать их в системы мониторинга. Сейчас есть адаптеры для Prometheus (yabeda-prometheus) и NewRelic (yabeda-newrelic), но это далеко не полный список систем, которых мы хотели бы поддерживать.
Необходимо написать адаптер (Ruby gem) для yabeda, который позволит отправлять кастомные метрики в DataDog.
Польза: познакомиться с работой систем мониторинга изнутри, получить опыт в Ruby open source, принести пользу сообществу.
Решение: победителем признана реализация Дмитрия Швецова на основе Dogstatsd сделанная в соавторстве с Николаем Малининым. Николай начинал решать задачу отдельно, но решил объединить усилия с Дмитрием.
Помощь запрашивал Вова Дем
Для уверенных в себе, задача на несколько дней
Gem graphql-ruby предоставляет объектно-ориентированный интерфейс для построения GraphQL API на Ruby.
Одним из преимуществ GraphQL часто называют возможность агрегировать данные из разных источников в одном запросе и прозрачно для клиента.
Отдельно рассматривают случай, когда один провайдер GraphQL API агрегирует данные из других GraphQL API. Этот сценарий носит название schema stitching.
К сожалению, на сегодняшний день поддержка объединения (или сшивания) схем отсутвует в реализации на Ruby.
Необходимо написать плагин (gem) для graphql-ruby, который позволит создавать «внешние» поля в локальную схему.
Польза: познакомиться с GraphQL в Ruby, получить open source опыт Ruby, принести пользу сообществу.
Помощь запрашивал Вова Дем
Помог Александр Аброськин
Для уверенных в себе, задача на несколько дней
Gem graphql-ruby предоставляет объектно-ориентированный интерфейс для построения GraphQL API на Ruby.
Одной из ключевых особенностей GraphQL является возможность запросить клиентом только те данные, которые ему нужны (а не все те, которые предлагает API).
Однако, запросы к БД, которые выполняются при работе, например, с Active Record, не являются оптимальными:
используется "SELECT * ..."
вместо выборки лишь тех полей, которые необходимы для формирования ответа клиенту.
При большом количестве колонок в таблице или при хранении значений большого размера выгрузка всех полей и инициализация Active Record могут привести к разбуханию памяти или отрицательно повлиять на скорость выполнения запроса.
Необходимо написать плагин (gem) для graphql-ruby, который позволит «помочь» делать более эффективные запросы.
Польза: познакомиться с GraphQL в Ruby, получить опыт в Ruby open source, принести пользу сообществу.
Помощь запрашивал Вова Дем
Помог Андрей Кривко
Для новичков, задача на неделю
Gem anyway_config предоставляет единый API для конфигурирования Ruby приложения из разных источников данных (YAML файлы, переменные окружения), позволяя без лишних усилий следовать принципам Twelve-Factor App методологии.
Необходимо добавить возможность использовать аргументы коммандной строки в качестве еще одного источника данных для конфигурации.
Для этого предполагется добавить интеграцию стандартной Ruby библиотеки OptionParse
в anyway_config
.
Польза: познакомится с OptionParse в Ruby, принести пользу сообществу.
Помощь запрашивал Вова Дем
Помог Михаил Рянзин
Для уверенных в себе, задача на несколько дней
Gem test-prof включает в себя инструмент для запуска случайного набора тестов (документация).
Текущая реализация имеет ряд ограничений:
Необходимо усовершенстовать поддержку сэмплирования в TestProf.
Польза: узнать, как работают изнутри популярные библиотеки для тестирования в Ruby (RSpec и Minitest), принести пользу сообществу.
Помощь запрашивал Юлия Олецкая
Помог Дмитрий Цепелев
Для уверенных в себе, задача на несколько дней
Альтернативное решение от Леонида Батижевского.
Gem jwt_sessions
предоставляет базовый инструментарий для использования JWT для аутентификации пользователей.
Для хранения токенов сейчас используется Redis, и нет простой (то есть, без monkeypatching) возможности использовать другие хранилища — такие, например, как база данных, или память приложения (что может быть полезно в тестовом окружении).
Необходимо в рамках gem’а реализовать интерфейс для написания сторонних адаптеров, реализовать через него существующий Redis адаптер, а также добавить из коробки in-memory адаптер.
Польза: познакомиться поближе c JWT, применить навыки рефакторинга в Ruby, принести пользу сообществу.
Помощь запрашивал Андрей Ситник
Помог Василий Стяжкин
Для новичков, задача на день
Nano ID — это очень маленькая библиотека, где идет борьба за каждый байт. Во многих файлах Nano ID есть строка алфавита. Одна из техник оптимизации — менять порядок символов в алфавите так, чтобы он повторял слова из JS-кода. Тогда gzip работает более эффективно.
Нужно написать скрипт, который бы перебирал все варианты порядка символов, чтобы найти оптимальный порядок.
Польза: получить опыт в JavaScript и оптимизации.
Помощь запрашивал Андрей Ситник
Помог Андрей Александров
Для новичков, задача на день
Autoprefixer старается конвертировать Grid Layout для Internet Explorer. Эту функцию надо явно активировать, передавая опцию grid: true
.
Не у всех пользователей есть возможность выставить опции для Autoprefixer. Надо сделать включение функции с помощью комментария /* autoprefixer grid: on */
.
Польза: получить опыт JavaScript в известном проекте.
Помощь запрашивал Андрей Ситник
Помог Богдан Долин
Для новичков, задача на день
Autoprefixer старается конвертировать Grid Layout для Internet Explorer. Некоторые пользователи делают ошибку и пишут grid-area
и grid-row
и/или grid-column
в одном и том же правиле (это бессмысленно).
Надо показывать предупреждение, если в одном правиле есть grid-area
и grid-row
или grid-column
.
Польза: получить опыт JavaScript в известном проекте.
Помощь запрашивал Андрей Ситник
Помог janczer
Для новичков, задача на день
Autoprefixer старается конвертировать Grid Layout для Internet Explorer. Однако свойства align-content
, align-items
, justify-content
и justify-items
нельзя сконвертировать.
Надо показывать предупреждение, если в одном правиле есть display: grid
или display: inline-grid
и свойства из списка выше.
Польза: получить опыт JavaScript в известном проекте.
Помощь запрашивал Андрей Ситник
Помог Александр Хованский
Для новичков, задача на неделю
postcss-conic-gradient
— полифил для конических градиентов в CSS.
Он генерирует SVG-картинку для градиента и вставляет эту каринку в CSS как data:uri
. Для генерации изображения он сейчас использует Cairo — бинарную зависимость, которую надо отдельно ставить в систему.
Нужно заменить Cairo на какую-то другую библиотеку на чистом JavaScript или вручную генерировать SVG.
Польза: получить опыт работы с графикой в JavaScript, улучшить очень полезный полифил.
Помощь запрашивал Андрей Ситник
Помог ojab
Для новичков, задача на несколько дней
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.
Помощь запрашивал Андрей Ситник
Помог Дмитрий Топорнин
Для новичков, задача на несколько дней
Logux Rails — gem, позволяющий связать Logux-сервер и приложение на Ruby on Rails. В каталоге app/logux/
разработчик описывает права доступа и контроллеры для разных типов событий от Redux и подписок.
Каждое событие в Logux имеет уникальный ID в meta.id
. Но пока Logux Rails не умеет генерировать этот ID.
Польза: получить open source портфолио в Ruby, научиться работать с Logux.
Помощь запрашивал Андрей Ситник
Помог Андрей Падерин
Для новичков, задача на несколько дней
Logux Rails — gem, позволяющий связать Logux-сервер и приложение на Ruby on Rails. В каталоге app/logux/
разработчик описывает права доступа и контроллеры для разных типов событий от Redux и подписок.
Нужно улучшить вывод gem’а в консоль согласно списку в issue.
Польза: получить open source портфолио в Ruby, опыт работы с логером в Rails, научиться работать с Logux.
Помощь запрашивал Андрей Ситник
Помог Дмитрий Салахутдинов
Для новичков, задача на несколько дней
Logux Rails — gem, позволяющий связать Logux-сервер и приложение на Ruby on Rails. В каталоге app/logux/
разработчик описывает права доступа и контроллеры для разных типов событий от Redux и подписок.
Нужно, чтобы в Logux::Actions
работала та же фильтрация входящих параметров, что и в контроллерах Rails.
Польза: получить open source портфолио в Ruby, научиться работать с Logux.
Помощь запрашивал Андрей Ситник
Помог Юрий Лебедев
Для новичков, задача на несколько дней
Logux Rails — gem, позволяющий связать Logux-сервер и приложение на Ruby on Rails. В каталоге app/logux/
разработчик описывает права доступа и контроллеры для разных типов событий от Redux и подписок.
Нужно добавить две rake-задачи:
rake logux:actions
— чтобы вывести action.type
, которые ожидают все обработчики событий из app/logux/actions
.rake logux:channels
— чтобы вывести все подписки, которые ожидают обработчики подписок из app/logux/channels
.Польза: получить open source портфолио в Ruby, разобраться с Rake, научиться работать с Logux.
Помощь запрашивал Андрей Ситник
Помог Марк Фрост
Для новичков, задача на несколько дней
Logux Rails — gem, позволяющий связать Logux-сервер и приложение на Ruby on Rails. В каталоге app/logux/
разработчик описывает права доступа и контроллеры для разных типов событий от Redux и подписок.
Logux умеет откатить любое событие, которое было создано клиентом или отправлено с сервера. Для этого нужно сгенерировать особое событие. Нужно перенести эту логику в Rails в метод Logux.undo()
.
Польза: получить open source портфолио в Ruby, научиться работать с Logux.
Помощь запрашивал Андрей Ситник
Помог Дмитрий Ивлиев
Для новичков, задача на несколько дней
Logux Rails — gem, позволяющий связать Logux-сервер и приложение на Ruby on Rails. В каталоге app/logux/
разработчик описывает права доступа и контроллеры для разных типов событий от Redux и подписок.
Если разработчик не создал обработчик для какого-то события или подписки, gem выбросит ошибки NoPolicyError
и NoActionError
. Вместо этого нужно в ответ выдавать ['unknownAction', meta.id]
или ['unknownChannel', meta.id]
.
Польза: получить open source портфолио в Ruby, научиться работать с Logux.
Помощь запрашивал Андрей Ситник
Помог Иван Соловьев
Для новичков, задача на несколько недель
Easings.net — каталог easing-функций. Easing-функции — очень важный элемент анимаций, поэтому многие разработчики посещают этот сайт, чтобы правильно подобрать анимацию на веб-странице.
Польза: получить опыт JavaScript-разработки; модернизировать популярную шпаргалку для разработчиков.
Помощь запрашивал Вова Дем
Помог Дмитрий Цепелев
Для уверенных в себе, задача на несколько дней
В ActiveRecord предусмотрено несколько методов для предварительной загрузки ассоциированных записей (такие как includes
, eager_load
и другие). Это позволяет выгружать данные, избегая так называемой проблемы N+1 запросов.
В некоторых случаях мы не знаем заранее, какие ассоциации нам понадобятся при выполнении запроса (простой пример — работа с GraphQL).
Приходится либо предзагружать лишние данные (например, указывая все ассоциации в includes
), либо использовать альтернативные подходы, такие как batch loading.
Необходимо написать ленивую реализацию метода preload
, которая предзагружает ассоциации только если они используются.
Польза: детально узнать, как работает Rails и ActiveRecord изнутри, принести пользу Rails-сообществу.
Помощь запрашивал Андрей Ситник
Помог Юрий Тимофеев
Для новичков, задача на день
Nano ID генерирует случайные ID. Так как идентификаторы полностью случайные, частью буквенно-цифрового идентификатора может стать обсценное слово.
Нужно создать nanoid-good
, который будет проверять ID на плохие слова и, если надо, генерировать ID еще раз.
Польза: получить больше опыта в JavaScript и пополнить open-source портфолио.
Помощь запрашивал Андрей Ситник
Помог Богдан Долин
Для новичков, задача на день
Autoprefixer умеет генерировать префиксы для Grid Layout только если имена областей уникальные. Например, в этом случае сгенерировать префиксы нельзя:
.parent-alpha {
grid-template-areas: "delta echo";
}
.parent-beta {
grid-template-areas: "echo delta";
}
.grid-cell {
-ms-grid-column: ???; /* не понятно, от какого родителя брать местоположение */
arid-area: echo;
}
В этих случаях надо выводить предупреждение.
Польза: указать в резюме коммит в известный проект.
Помощь запрашивал Андрей Ситник
Помог Иван Малов
Для новичков, задача на день
В некоторых случаях Autoprefixer генерирует вложенные медиа-выражения. В этих случаях надо объединять медиа-выражения в одно.
@media (min-width: 30em) {
.wrapper {
display: grid;
grid-template-areas: "a b";
}
}
@media (min-width: 60em) {
.wrapper {
grid-template-areas: "a b";
}
}
@media (min-width: 30em) {
.a {
grid-area: a;
}
}
@media (min-width: 30em) {
.b {
grid-area: b;
}
}
Польза: указать в резюме коммит в известный проект.
Помощь запрашивал Андрей Ситник
Помог Даниил Шашков
Для продвинутых, задача на неделю
В современном JavaScript даже у маленького проекта есть куча инструментов разработки — хотя бы линтер и тесты. Для каждого инструмента надо иметь настройки. Иногда настроек получается больше, чем кода самой библиотеки.
Можно держать все эти настройки в отдельных файлах — тогда в папке проекта будет много файлов. Например, из-за длинного списка файлов README на GitHub будет далеко после большого списка файлов.
Можно перенести настройки в package.json
, но тогда они окажутся в npm-пакете, что увеличит его размер.
Можно решить проблему, если создать инструмент clean-publish
. Он будет копировать файлы проекта во временную папку, убирать лишнее из package.json
и вызывать npm publish
на временной папке.
Польза: получить больше опыта в JavaScript.
Помощь запрашивал Андрей Ситник
Помог Даниил Шашков
Для новичков, задача на неделю
shortid
использует опасные методы генерации ID. К сожалению, его использует уже слишком много проектов. Поэтому надо заменить в нем метод генерации ID, сохранив прежний API.
Польза: получить больше опыта в JS.
Помощь запрашивал Долганов Сергей
Помог Меркушин Михаил
Для продвинутых, задача на неделю
Контракт — это набор валидаций (тестов), которые запускаются во время production сессии взаимодействия с внешней системой по API (например, CRM системой или социальными сетями).
Такие валидации решают проблему упрощения отладки и распознавания отклонений в поведении внешних зависимостей. Пример реализации — poro_contract.
Нужно создать новый gem (назовем его simple_contracts
), который:
Польза: получить отличный опыт с многопоточным программированием в Ruby; освоить контрактный подход к тестированию API.
Помощь запрашивал Андрей Ситник
Помог Даниил Шашков
Для новичков, задача на день
Сейчас yaspeller
берет свои настройки только из файла .yaspellerrc
. Хотелось бы, чтобы он поддерживал поле "yaspeller"
в package.json
, как многие остальные инструменты из npm.
Чтобы не писать много кода поиска настроек, можно использовать библиотеку cosmiconfig
.
Польза: получить больше опыта в JavaScript.
Помощь запрашивал Андрей Ситник
Помогла Аня Кирюхина
Для уверенных в себе, задача на неделю
В хороших парсерах разбор разбит на два шага: строка → токены и токены → дерево объектов. Первый шаг называется токенайзер.
Сейчас токенайзер возвращает [token_name, content, start_line, start_column, end_line, end_column]
. Есть мнение, что можно сильно ускорить токенайзер, если:
Uint32Array(token_code, offset_start, offset_end, start_line, start_column, end_line, end_column)
. То есть, вместо строки с именем токена использовать цифровой код. А content
парсер может взять сам из строки входящего CSS по offset_start
и offset_end
.Uint32Array
. В итоге не будет постоянно создаваться больше объектов и вызываться сборщик мусора.Польза: указать в резюме коммит в известный проект.
Помощь запрашивал Вова Дем
Помог Василий Федосеев
Для новичков, задача на день
FactoryDefault – это один из инструментов, входящих в состав TestProf.
Он позволяет переиспользовать уже созданные фабрикой объекты для вложенных ассоциаций, решая таким образом проблему каскадов фабрик.
Необходимо сделать так, чтобы FactoryDefault учитывал используемые при создании ассоциаций трейты.
Польза: узнать, как работает FactoryGirl изнутри, принести пользу сообществу.
Помощь запрашивал Андрей Ситник
Помог Евгений Петухов
Для новичков, задача на неделю
Autoprefixer умеет вставлять префиксы Grid Layout для Internet Explorer. Поддерживается даже grid-template-areas
.
Но, в некоторых случаях, префиксы для grid-template-areas
в медиа-выражении могут быть вставлены не в том месте. Нужно изменить логику.
Польза: указать в резюме коммит в известный проект.
Помощь запрашивал Андрей Ситник
Помог Антон Тужик
Для новичков, задача на неделю
Многие пользователи Autoprefixer и Babel забывают обновлять базу браузеров caniuse-lite
. В этой базе есть информация о времени релиза каждой версии браузера. Взяв дату самой свежей версии браузера, можно примерно узнать время релиза caniuse-lite
. Если база не обновлялась уже полгода, надо показать предупреждение пользователю.
Польза: указать в резюме коммит в известный проект.
Помощь запрашивал Андрей Ситник
Помог Evilebot Tnawi
Для новичков, задача на неделю
cssnano сжимает CSS и используется по умолчанию в webpack. Эта задача поможет с выпуском cssnano 4.
Надо обновить зависимости и API.
Польза: указать в резюме коммит в известный проект.
Помощь запрашивал Андрей Ситник
Помог Игорь Уваров
Для новичков, задача на неделю
cssnano сжимает CSS и используется по умолчанию в webpack. Эта задача поможет с выпуском cssnano 4.
Нужно разобраться с ошибкой шрифтов.
Польза: указать в резюме коммит в известный проект.
Помощь запрашивал Андрей Ситник
Помог Влад Янчевский
Для новичков, задача на неделю
cssnano сжимает CSS и используется по умолчанию в webpack. Эта задача поможет с выпуском cssnano 4.
Сейчас cssnano, встретив:
.a {
all: initial;
color: red;
}
.b {
all: initial;
color: blue;
}
может превратить свойства в:
.a {
color: red;
}
.a,
.b {
all: initial;
color: red;
}
.b {
color: blue;
}
В итоге правило будет работать неправильно.
Польза: указать в резюме коммит в известный проект.
Помощь запрашивал Андрей Ситник
Помог Evilebot Tnawi
Для уверенных в себе, задача на неделю
cssnano сжимает CSS и используется по умолчанию в webpack. Эта задача поможет с выпуском cssnano 4.
Правило mergeLonghand
иногда работает неправильно. Надо изучить его и починить.
Польза: указать в резюме коммит в известный проект.
Помощь запрашивал Андрей Ситник
Помог Евгений Грачев
Для новичков, задача на неделю
cssnano сжимает CSS и используется по умолчанию в webpack. Эта задача поможет с выпуском cssnano 4.
Сейчас cssnano, встретив :-ms-input-placeholder {} ::-ms-input-placeholder { }
, объединит правила в :-ms-input-placeholder, ::-ms-input-placeholder { }
. К сожалению, это ломает поддержку Internet Explorer.
Польза: указать в резюме коммит в известный проект.
Помощь запрашивал Андрей Ситник
Помог Сергей Карапетян
Для новичков, задача на неделю
cssnano сжимает CSS и используется по умолчанию в webpack. Эта задача поможет с выпуском cssnano 4.
Сейчас cssnano, встретив padding: 10px; padding: var(--name)
, удалит первое свойство. Надо исправить это поведение.
Польза: указать в резюме коммит в известный проект.
Помощь запрашивал Андрей Ситник
Помог Павел Винник
Для новичков, задача на неделю
Скоро postcss-preset-env заменит cssnext и станет одним из «главных» плагинов PostCSS. Но на сайте PostCSS мы все еще рекомендуем cssnext.
Задача подойдет, если вы больше фокусируетесь на дизайне и CSS, но хотите получить больше опыта с React.
Польза: указать в резюме коммит в известный проект.
Помощь запрашивал Андрей Ситник
Помог Даниил Северин
Для новичков, задача на неделю
Скоро postcss-preset-env заменит cssnext и станет одним из «главных» плагинов PostCSS.
У плагина есть сайт, но его главная страница совсем не информативная.
Задача подойдет, если вы больше фокусируетесь на дизайне и CSS.
Польза: указать в резюме коммит в известный проект.
Помощь запрашивал Андрей Ситник
Помог Станислав Ботев
Для новичков, задача на неделю
Многие пользователи пользуются сайтами с клавиатуры; у некоторых даже нет другой возможности. Но большинство фронтенд-разработчиков забывают указать :focus
стили.
Эту проблему можно уменьшить, если добавить в Stylelint правило, которое будет напоминать разработчику писать :focus
стиль.
Чтобы понять, каким элементам нужен :focus
, можно использовать стили :hover
. Можно считать, что всем стилям с :hover
, нужен какой-то парный стиль с :focus
.
Польза: указать в резюме коммит в известный проект.
Помощь запрашивал Андрей Ситник
Помог Станислав Ботев
Для новичков, задача на неделю
Некоторым пользователям не нравится, когда на странице много анимаций. В Safari есть специальное медиа-выражение @media (prefers-reduced-motion) { }
. Если пользователь не хочет анимаций, Safari будет его применять.
Но большинство фронтенд-разработчиков про него забывают. Эту проблему может решить новое правило для Stylelint.
Польза: указать в резюме коммит в известный проект.
Помощь запрашивал Андрей Ситник
Помог Павел Востриков
Для новичков, задача на неделю
Сейчас Autoprefixer понимает особые комментарии /* autoprefixer: off */
и /* autoprefixer: on */
, которые выключают или включают его на весь блок стилей.
Нужно добавить поддержку комментария /* autoprefixer: ignore next */
,
чтобы Autoprefixer игнорировал только следующее свойство или правило.
Польза: указать в резюме коммит в известный проект.
Помощь запрашивал Андрей Ситник
Помог Павел Востриков
Для новичков, задача на неделю
Browserslist — общий конфиг списка браузеров для Autoprefixer, Babel и других front-end инструментов. В конфиге разработчики пишут запросы вида last 2 versions
, Browserslist переводит это в список конкретных версий браузеров.
Но для Babel и ESLint нужно указывать не только браузеры, но и версии Node.js.
Польза: указать в резюме коммит в проект с 20 млн. загрузок в месяц.
Помощь запрашивал Андрей Ситник
Помог Сергей Лысенко
Для новичков, задача на неделю
CSS-свойство color-adjust
из черновика CSSWD работает в webkit-браузерах через свойство -webkit-print-color-adjust
.
Нужно добавить поддержку этого свойства в Автопрефиксер.
Польза: написать в резюме, что сделали минорный релиз Автопрефиксера.
Помощь запрашивал Сергей Долганов
Помог Салахутдинов Дмитрий
Для уверенных в себе, задача на несколько дней
Нужно добавить в Ossert новые источники данных. Отличным кандидадатом с достаточно богатым API является Twitter.
Это позволит измерить еще один важный аспект развития Open-Source библиотек — хайп, реакцию на посты про проект, а также количество заинтересованных проектом.
Польза: возможность научиться работать с API Twitter, написать надежный API клиент и узнать больше о метриках и поведении разработчиков свободного ПО.
Помощь запрашивал Вова Дем
Для новичков, задача на неделю
LiteCable – это альтернативная реализация фреймворка ActionCable из Rails, совместимая с ActionCable-клиентами, но при этом имеющая минимум зависимостей.
Необходимо добавить в LiteCable интеграцию с Plezi (Iodine) “из коробки” (по аналогии с тем, как это сделано для AnyCable).
Польза: познакомиться и научиться работать с новым веб-сервером для Ruby приложений (Iodine); разобраться во внутреннем устройстве real-time фреймворков.
Помощь запрашивал Андрей Ситник
Помог Алексей Комаров
Для новичков, задача на неделю
NanoID — JavaScript-библиотека для генерации случайных ID. Как и у UUID, есть определенная вероятность того, что будет сгенерированы два одинаковых ID.
Вероятность очень мала; в то же время, у многих пользователей генерируется небольшое количество идентификаторов, так что они могут уменьшить длину желаемого ID без особых рисков. Но чтобы понять, насколько можно уменьшить такую длину, нужно сделать калькулятор.
Польза: получить опыт JS-разработки; получить публичный сайт в свое резюме.
Помощь запрашивал Вова Дем
Помогли Никита Мишарин
Александр Шагов
Для продвинутых, задача на неделю
Необходимо написать инструмент для Ruby-стека, который будет отслеживать выполнение потенциально опасных действий внутри транзакции БД (например, HTTP-запросов или отправки фоновых задач в очередь).
Польза: разобраться в том, как работают популярные ORM и другие библиотеки для работы с «внешним миром»; написать инструмент, которым будет активно пользоваться Ruby-сообщество.
Помощь запрашивал Кирилл Кузнецов
Для продвинутых, задача на пару дней
postgresql_lwrp — самый удобный и гибкий кукбук для системы управления конфигурациями Chef, обеспечивающий установку и настройку БД PostgreSQL.
Нужно обеспечить его работу в Chef Client версии 13.
Польза: возможность попрактиковаться в написании кукбуков Chef, разобраться в особенностях Chef 13.
Помощь запрашивал Андрей Дерябин
Помог Михаил Мандронов
Для новичков, задача на пару дней
Помощь запрашивал Андрей Ситник
Помог Владимир Боровик
Для новичков, задача на неделю
Прямо сейчас Size Limit читает свои настройки из package.json
. Но было бы хорошо добавить поддержку отдельного файла настроек, например, .size-limit
с JSON внутри.
Польза: получить больше опыта работы с Node.js.
Помощь запрашивал Андрей Ситник
Помог Алексей Комаров
Для новичков, задача на неделю
Autoprefixer умеет вставлять -ms-
префиксы для CSS Grid Layout, заменяя синтаксис, но эта поддержка очень ограничена. Есть мнение, что ее можно улучшить.
Польза: разобраться в Grid Layout, принять участие в большом open-source проекте.
Помощь запрашивал Андрей Ситник
Помог Игорь Дерябин
Для новичков, задача на неделю
Browserslist — инструмент для Autoprefixer и Babel для выбора браузеров, которые нужно поддерживать в проекте.
Есть хорошая идея добавить запрос вида since 2013
для выбора версий
браузеров, вышедших с 2003 года.
Польза: принять участие в проекте с 11 млн. загрузок.
Помощь запрашивал Вова Дем
Помог Юрий Лебедев
Для продвинутых, задача на неделю
Необходимо реализовать возможность хранить данные для ассоциаций (внешние ключи) в поле колонки типа JSONB (PostgreSQL), сохранив при этом большую часть функционала ассоциаций Active Record.
Польза: возможность научиться работать с внутренностями ActiveRecord и JSONB.
Помощь запрашивал Вова Дем
Помог Николай Сверчков
Для продвинутых, задача на неделю
Необходимо написать инструмент для клонирования моделей (например, Active Record) с гибкими настройками. Существующие гемы (deep_clonable и amoeba), к сожалению, неудобны при работе со сложной бизнес-логикой и завязаны на ActiveRecord.
Польза: попрактиковаться в написании расширяемого DSL на Ruby и написать инструмент, которым будет активно пользоваться сообщество.
Помощь запрашивал Андрей Новиков
Помог Игнат Закревский
Для новичков, задача на неделю
Необходимо разработать OmniAuth-стратегию для входа в приложения на Ruby с учетной записью eBay в виде отдельного гема.
Сейчас есть гемы, которые реализуют вход через метод Auth’n’auth (например, подзаброшенный гем omniauth-ebay), а через метод OAuth — нет. (Технически оба метода работают по протоколу OAuth, что вносит путаницу).
Для работы с новыми REST API eBay пользователь должен входить именно через новый метод входа.
Польза: возможность разобраться, как же работает вход через соцсети протокол OAuth и библиотека OmniAuth.
Решение: итоговая реализация основана на решении Игната Закревского, но и Андрей Падерин и Илья Долгирев прислали рабочие решения, за что им выражается благодарность.
Помощь запрашивал Вова Дем
Помог Илья Долгирев
Для новичков, задача на неделю
Помощь запрашивал Вова Дем
Помог Руслан Гафуров
Для новичков, задача на неделю
TestProf – это набор инструментов для профилирования тестов, который включает в себя FactoryProf, анализатор использования фабрик в тестах.
Необходимо добавить поддержку Fabrication (альтернатива FactoryGirl) в FactoryProf: сбор общей статистики по использованию фабрик, построение factory flame графиков.
Польза: узнать, как работают профайлеры кода изнутри, познакомиться с гемом Fabrication.
Помощь запрашивал Андрей Ситник
Помог Игорь Лобанов
Для новичков, задача на неделю
EmojiMart — один из лучших контролов для выбора эмодзи. Сейчас у него в зависимостях есть огромный core-js
. Эта зависимость нужна для поддержки ES2016+ в IE. Но, судя по всему, они загружают такую большую зависимость ради пары строк кода.
Нужно убрать core-js
и починить работу в IE более простыми способами.
Польза: получить опыт оптимизации размера проекта.
Помощь запрашивал Андрей Ситник
Помог Никита Филатов
Для новичков, задача на неделю
EmojiMart — один из лучших контролов для выбора эмодзи. Но сейчас они собирают всё с помощью webpack. В итоге, если пользователь подключает emoji-mart
и core-js
, у него в сборке оказывается два core-js
— один пользовательский и второй от EmojiMart.
Нужно переделать сборку с webpack на просто Babel, сохраняя древовидную структуру. После чего добавить плагин для вырезания propTypes
.
Польза: получить опыт оптимизации размера проекта.
Помощь запрашивал Андрей Ситник
Помог Игорь Дерябин
Для новичков, задача на неделю
Logux Status показывает состояние синхронизации. Функция status()
является фундаментом, чтобы построить свой UI состояния синхронизации.
Одни из шагов синхронизации — connecting
и connectingAfterWait
. Они говорят о том, что Logux пытается подключится к серверу.
Когда нет Wi-Fi, состояния connecting
и connectingAfterWait
отображаются слишком быстро — всего на 1—10 мс. В итоге интерфейс неприятно мигает.
Польза: принять участие в разработке Logux.
Помощь запрашивал Андрей Ситник
Помог Игорь Дерябин
Для новичков, задача на неделю
Logux хранит события в логе. Чтобы чистить лог, он использует понятие «смысла жизни». У каждого события есть «смысл жизни» — массив строк. В любой момент разработчик может убрать смысл жизни у события. Как только у события не остается смыслов жизни, оно удаляется.
Однако, на практике, часто нужно одно и то же действие — хранить в логе только одно событие какого-то типа. Для этого приходится часто повторять один и тот же код:
log.add({ type: "app/A" }, { reasons: ["app/lastA"] }).then((meta) => {
log.removeReason("app/lastA", { maxAdded: meta.added - 1 });
});
Этот код добавляет в лог событие со смыслом жизни app/lastA
и удаляет этот смысл у всех предыдущих событий.
Код приходится писать слишком часто. Стоит добавить опцию keepLast
, которая бы делала то же самое.
log.add({ type: "app/A" }, { keepLast: "app/lastA" });
Польза: принять участие в разработке Logux.
Помощь запрашивал Андрей Ситник
Помог Владимир Боровик
Для новичков, задача на неделю
Logux, при разрыве связи, раз в несколько секунд пытается подключиться снова.
Браузеры посылают событие online
при появлении связи. Мы можем запускать попытку связи чуть раньше.
Польза: принять участие в разработке Logux; получить опыт работы с редкими API браузера.
Помощь запрашивал Андрей Ситник
Помог Алексей Никифоров
Для новичков, задача на неделю
Yaspeller — JS-утилита, которая проверяет орфографию, посылая запрос на сервера Яндекса. Интернет не всегда стабилен — иногда запрос заканчивается ошибкой связи.
Нужно исправить Yaspeller, чтобы он, в случае ошибки, делал еще 2 запроса и только потом возвращал ошибку.
Польза: получить опыт разработки под Node.js.
Помощь запрашивал Андрей Ситник
Помог Антон Артамонов
Для новичков, задача на неделю
Сейчас у Logux Server два типа логов — Human и Bunyan. Но можно сильно упростить код, если генерировать формат Human из Bunyan.
Польза: принять участие в разработке Logux; получить опыт разработки на Node.js и Bunyan.
Помощь запрашивал Андрей Ситник
Помог Константин Мамаев
Для новичков, задача на неделю
Logux может хранить лог в разных хранилищах — в памяти или IndexedDB. На подходе SQL-хранилище.
Сейчас у каждого хранилища свои тесты — много тестов дублируются. Нужно создать общие тесты для всех хранилищ.
Польза: принять участие в разработке Logux; получить опыт тестирования и Promise.
Помощь запрашивал Андрей Козин
Помог Владимир Катюрин
Для новичков, задача на день
Необходимо доработать сообщение об ошибке RSpec-матчера exceed_query_limit
из гема rspec-sqlimit таким образом, чтобы показывать выполненные SQL запросы вместе с их переменными.
Польза: возможность сделать первый вклад в Open Source проект (особенно если вы не знаете, с чего начать). Попутно можно познакомиться с механизмами ActiveSupport Notifications и Instrumentation, разобраться в устройстве матчеров RSpec.
Помощь запрашивал Андрей Ситник
Помог Виктор Пасынок
Для новичков, задача на пару дней
У Stylelint есть сайт со списком правил. Они перечисленны списком, но их сложно читать последовательно — нет ссылок на следующее и предыдущее правило.
Польза: получить опыт в JS.
Помощь запрашивал Вова Дем
Помог Андрей Новиков
Для продвинутых, задача на неделю
Необходимо разработать инструмент (gem) для создания частичного, анонимизированного дампа базы данных Rails (ActiveRecord) приложения.
Это позволит нам использовать на тестовых серверах данные, максимально приближенные к боевым, но при этом не делать полный дамп (который может быть очень большим). Дополнительно в целях безопасности мы также хотим анонимизировать часть данных (персональные данные и т.п.).
Польза: возможность познакомится с внутренностями ActiveRecord, попрактиковаться в написании Ruby gems и написать инструмент, которым будет активно пользоваться сообщество.
Помощь запрашивал Вова Дем
Для новичков, задача на неделю
Необходимо разработать Ruby-инструмент (CLI) для выполнения сценариев взаимодействия WebSocket-клиентов с сервером.
Утилита может быть использована как для blackbox-тестирования (в том числе и нагрузочного) WebSocket-приложений, так и просто в качестве удобного консольного клиента при разработке.
Польза: возможность применить на практике методы многопоточного программирования, попрактиковаться в написании CLI, поближе познакомиться с технологией WebSocket.
Решение: итоговая реализация основана на решениях Кирилла Архипова и Сергея Елушева, за что им выражается особая благодарность.
Помощь запрашивал Андрей Козин
Помог Тимур Рамазанов
Для новичков, задача на один-два дня
В GitHub-репозитории tram-policy опубликована документация к gem, реализующему базовый класс для контексто-специфичных валидаторов в Ruby. В описании приводится мотивация, примеры интерфейса и поддерживаемых фич; дан список классов и объектов, составляющих публичный интерфейс. Сейчас репозиторий содержит только документацию без какого-либо кода (помимо тривиальных объявлений).
Задача состоит в том, чтобы полностью разработать gem в соответствии с описанием.
Польза: возможность попрактиковаться в написании gem’ов, реализовать один из базовых паттернов разработки средствами чистого Ruby (попутно сняв «ауру магизма» с валидаторов, как мы привыкли к ним в Rails), познакомиться с классической библиотекой I18n, создать простыми средствами один из базовых компонентов для сложных Rails/PORO приложений.
Решение: Второе и третье места с благодарностью за участие в разработке достаются Анастасии Власовой и Сергею Чечаеву, также предложившим свои решения.
Помощь запрашивал Андрей Ситник
Помог Евгений Шкодин
Для новичков, задача на неделю
Нужно сверстать виджет статуса синхронизации по макетам Антона Ловчикова.
Польза: принять участие в разработке Logux; получить больше опыта в webpack и создании виджетов.
Помощь запрашивал Андрей Ситник
Помогла Жулдуз Жанкенова
Для новичков, задача на пару дней
Browserslist используют Автопрефиксер, ESLint и Babel. У него есть консольный интерфейс. Но он не покрыт тестами — регулярно в нем находят проблемы.
Польза: получить больше опыта в тестировании.
Помощь запрашивал Андрей Ситник
Помог Антон Артамонов
Для новичков, задача на пару дней
Bunyan становится форматом логов де-факто в Node.js. Для удобной интеграции с инфраструктурой в Logux Server нужно добавить поддержку этого формата.
Польза: принять участие в разработке Logux; получить больше опыта в JS и построении систем логирования.
Помощь запрашивал Андрей Ситник
Помог Максим Гатилин
Для новичков, задача на пару дней
У CSSComb есть шикарный инструмент для генерации настроек. Он содержит неколько шагов, и на каждом шаге показывает несколько примеров кода. Пользователь выбирает, какой ему больше нравится — и после всех шагов получает готовые настройки для CSSComb.
Надо создать такой же для Stylelint. Только показывать настройки прямо в процессе.
Польза: получить реальный сайт в резюме, получить опыт в JS.
Помощь запрашивал Андрей Ситник
Помог Владимир Трухин
Для новичков, задача на пару дней
Logux-сервер работает с клиентом по веб-сокету. При ошибке сервера, клиент не отобразит страницу с ошибкой, как было бы с PHP или Ruby on Rails.
Поэтому надо добавить способ отображения серверной ошибки к консоли браузера.
Польза: внести свой вклад в протокол Logux; получить больше опыта в JS.
Помощь запрашивал Андрей Ситник
Помог Роман Фурсов
Для новичков, задача на пару дней
В Logux Status есть log()
, который выводит в консоль информацию о том,
что происходит с Logux. Вывод идет обычным текстом,
хотя Chrome уже поддерживает цветной вывод.
Польза: принять участие в разработке Logux; получить больше опыта в JS
и console
.
Помощь запрашивал Андрей Ситник
Помог Алексей Кузнецов
Для новичков, задача на пару дней
Для UI-функций недостаточно модульного тестирования. В Logux Status нужна страница, где можно было бы в реальности посмотреть на все его возможности.
Польза: принять участие в разработке Logux; получить больше опыта в JS и webpack.
Помощь запрашивал Андрей Ситник
Помог Роман Фурсов
Для новичков, задача на пару дней
Logux написан на ES5, чтобы работать в браузере без компиляции. Но Logux Server не будет работать в браузере. Минимальной версией node.js будет 4, так что его можно переписать на ES6.
Польза: принять участие в разработке Logux; получить больше опыта в работе с ESLint и ES6.
Помощь запрашивал Андрей Ситник
Помог Константин Епишев
Для новичков, задача на пару дней
Logux написан на ES5, чтобы работать в браузере без компиляции. Но Logux Server не будет работать в браузере. Минимальной версией node.js будет 4, так что его можно переписать на ES6.
Польза: принять участие в разработке Logux; получить больше опыта в работе с ESLint и ES6.
Помощь запрашивал Андрей Ситник
Помог Андрей Мануйлов
Для новичков, задача на пару дней
Logux Status — это подборка методов отображения статуса синхронизации
в браузере. Нужно добавить вывод процесса синхронизации через console.log
.
Польза: принять участие в разработке Logux; получить больше опыта в JS.
Помощь запрашивал Андрей Ситник
Помог Антон Савоськин
Для новичков, задача на пару дней
Logux-сервер сейчас использует пакет ws
для работы с веб-сокетами.
Но пакет uWebSockets
гораздо быстрее.
Польза: принять участие в разработке Logux; получить больше опыта в работе с веб-сокетами.
Помощь запрашивал Андрей Ситник
Помог Владимир Трухин
Для новичков, задача на пару дней
Logux Status — это подборка методов отображения статуса синхронизации в браузере. Нужно добавить подтверждение закрытия вкладки при неотправленных событиях в логе.
Польза: принять участие в разработке Logux; получить больше опыта в JS.
Помощь запрашивал Андрей Ситник
Помог Андрей Мануйлов
Для новичков, задача на пару дней
Logux Status — это подборка методов отображения статуса синхронизации в браузере. Нужно добавить смену favicon при онлайне, офлайне и ошибке.
Польза: принять участие в разработке Logux; получить больше опыта в JS.
Помощь запрашивал Андрей Ситник
Помог Андрей Мануйлов
Для новичков, задача на пару дней
Logux Status — это подборка методов отображения статуса синхронизации
в браузере. Нужно добавить смену <title>
при ошибке, чтобы подсветить
вкладку в браузере.
Польза: принять участие в разработке Logux; получить больше опыта в JS.
Помощь запрашивал Вова Дем
Помог Тимур Рамазанов
Для уверенных в себе, задача на неделю
Библиотека Logidze позволяет работать с версиями объектов ActiveRecord моделей и историей их изменений.
Необходимо расширить эту интеграцию, добавив поддержку ассоциаций.
Польза: возможность познакомится с внутренностями ActiveRecord и научиться с ними работать.
Помощь запрашивал Андрей Ситник
Помог Денис Раслов
Для новичков, задача на пару дней
Нужно добавить в Logux Sync код, который будет проверять формат и типы принятых сообщений.
Польза: принять участие в разработке Logux; разобраться с его протоколом.
Помощь запрашивал Андрей Ситник
Помог Павел Ковалев
Для новичков, задача на пару дней
Сейчас порт, хост и пути к TLS-ключам можно задать только в коде сервера. Нужно добавить в Logux-сервер чтение CLI-аргументов и переменных среды.
Польза: принять участие в разработке Logux; разобраться в Logux-сервере.
Помощь запрашивал Андрей Ситник
Помог Григорий Мороз
Для новичков, задача на пару дней
Нужно вывести подробное описание по самым распространенным ошибкам запуска Logux-сервера и объяснить что делать, чтобы их исправить.
Польза: принять участие в разработке Logux.
Помощь запрашивал Андрей Ситник
Помог Павел Ковалев
Для новичков, задача на пару дней
Logux-сервер сейчас использует свою систему снимков для тестирования. Но у Jest уже есть хорошая система снимков. Нужно перенести тесты на них.
Польза: принять участие в разработке Logux; получить больше опыта в тестировании.
Помощь запрашивал Андрей Ситник
Помог Никита Гусаков
Для новичков, задача на пару дней
Нужно написать eslint-plugin-es5
с правилами для ESLint для проверки того,
что в коде не используется ES2016.
Польза: получить опыт расширения ESLint, поучаствовать в проекте Logux.
Помощь запрашивал Андрей Ситник
Помогла Анна Столяр
Для новичков, задача на пару дней
Нужно добавить на клиент предупреждение о нешифрованом веб-сокете в продакшене. Убрать эти ограничения на сервере.
Польза: принять участие в разработке Logux и разобраться с его внутренним устройством.
Помощь запрашивал Андрей Ситник
Помог Олег Алешкин
Для уверенных в себе, задача на месяц
PostCSS имеет сменные синтаксисы. Это особо полезно для Stylelint, чтобы проверять исходники. Сейчас можно работать с Less и SCSS.
Нужно взять dart-sass и сделать на его основе парсер синтаксиса Sass, который использует отступы.
Польза: познакомиться с командой Sass; многие крупные проекты смогут использовать ваш проект для Stylelint.
Помощь запрашивал Андрей Ситник
Помогла Наталия Короткова
Для новичков, задача на пару дней
PostCSS использует чат Gitter для помощи разработчикам. У сервиса появился скрипт для добавления чата на любой сайт. Надо добавить его на postcss.org.
Польза: получить опыт с React и красивую строку в резюме.
Помощь запрашивал Эмиль Кашкевич
Для новичков, задача на пару дней
Сейчас gem npmdc проверяет наличие установленных npm-пакетов и соответствие их версий на основе файла package.json
.
Нужно добавить поддержку Yarn.
Польза: возможность попрактиковаться в программировании на чистом Ruby и написании gem’ов, помочь полезному проекту, который нужен в каждом современном большом Ruby веб-приложении.
Помощь запрашивал Андрей Ситник
Помог Максим Семенов
Для новичков, задача на пару дней
Автопрефиксер, Stylelint, babel-preset-env и cssnext используют Browserslist, чтобы пользователь мог разом указывать список браузеров, которые нужно поддерживать в этом проекте.
Нужно доработать Browserslist, чтобы в browserslist
можно было указывать
отдельный список для production
и development
среды.
Польза: сделать функцию, которой будут пользоваться многие веб-разработчики.
Эта функция будет использоваться в create-react-app
Дэна Абрамова.
Помощь запрашивал Андрей Ситник
Помог Степан Кузьмин
Для новичков, задача на пару дней
Автопрефиксер, Stylelint, babel-preset-env и cssnext используют Browserslist, чтобы пользователь мог разом указывать список браузеров, которые нужно поддерживать в этом проекте.
Нужно доработать Browserslist, чтобы он смотрел не только в browserslist
,
но и в ключ browserslist
в package.json
.
Польза: сделать функцию, которой будут пользоваться многие веб-разработчики.
Эта функция будет использоваться в create-react-app
Дэна Абрамова.
Помощь запрашивал Андрей Ситник
Помог Олег Алешкин
Для новичков, задача на пару дней
Автопрефиксер, Stylelint, babel-preset-env и cssnext используют Browserslist, чтобы пользователь мог разом указывать список браузеров, которые нужно поддерживать в этом проекте.
Browserslist поддерживает указание браузеров по проценту рыночной доли. Можно указывать реальную статистику пользователей сайта, чтобы точнее считать долю.
Нужно добавить поддержку файла browserslist-stats.json
для указания
статистики сайта.
Польза: сделать функцию, которой будут пользоваться куча веб-разработчиков.
Помощь запрашивал Вова Дем
Помог Тимур Рамазанов
Для новичков, задача на неделю
В библиотеку Logidze нужно добавить функционал фильтрации полей, учитываемых при версионировании.
Это позволит уменьшить размер лога, а значит расход ресурсов и время на обработку.
Польза: возможность поработать с базой данных на более низком уровне, попрактиковаться в написании процедур и разобраться в том, как работают триггеры.
Помощь запрашивал Андрей Ситник
Помог Макс Ларионов
Для новичков, задача на пару дней
Нужно добавить поддержку синтаксиса SugarSS в плагин PostCSS для Sublime Text.
Польза: очень простая задача, чтобы разобраться в опенсорсе; позволит понять, как устроен Sublime Text внутри; попасть в анонсы PostCSS.
Помощь запрашивал Андрей Ситник
Помог Алексей Бондаренко
Для продвинутых, задача на месяц
Нужно придумать новый API для плагинов PostCSS — чтобы они все работали вместе, в одном цикле прохода по AST-дереву.
Задание сложное. Оно меньше про код и больше про переговоры, анализ и архитектуру. Но зато дает максимальное количество опыта.
Польза: стать одним из ведущих коммитеров PostCSS, добавить в резюме строку о разработке грамотной архитектуры в мировом проекте.
Помощь запрашивал Сергей Долганов
Помог Дмитрий Тонконогов
Для уверенных в себе, задача на несколько дней
Нужно добавить в Ossert новые источники данных. Отличным кандидадатом с достаточно богатым API является StackOverflow.
Это позволит охватить еще один важный аспект развития Open-Source библиотек — доступность и объем поддержки, а также заинтересованность в них.
Польза: возможность научиться работать с API StackOverflow и узнать больше о метриках и способах измерения зрелости свободного ПО.
Помощь запрашивал Вова Дем
Помог Кирилл Садовник
Для новичков, задача на неделю
Нужно написать скрипт (и упаковать его в гем), который позволит проводить аттестационное тестирование (от англ. “conformance testing”) приложений-серверов для AnyCable.
Это повысит скорость и удобство разработки новых реализаций серверов, а также поможет поддерживать актуальность текущих реализаций.
Польза: возможность подробно изучить ActionCable и AnyCable, попрактиковаться в написании гемов и написать инструмент, которым будет активно пользоваться сообщество.
Помощь запрашивал Сергей Долганов
Помог null
Для уверенных в себе, задача на несколько дней
Нужно добавить в Ossert новые источники данных. Отличным кандидадатом с достаточно богатым API является Reddit.
Это позволит охватить еще один важный аспект развития Open-Source библиотек — доступность и объем поддержки, а также заинтересованность в них.
Польза: возможность научиться работать с API Reddit и узнать больше о метриках и поведении разработчиков свободного ПО.
Помощь запрашивал Сергей Долганов
Помог Сергей Максимов
Для уверенных в себе, задача на неделю
Пусть существует Rails приложение с некоторым HTTP API. Будем каждый URL этого API считать эндпоинтом, например:
GET /api/v1/projects/:project_id/notes
GET /api/v1/projects/:project_id/notes/:note_id
POST /api/v2/projects
PUT /api/v3/projects/:project_id
Что хочется получить:
Gem для сбора, просмотра и тэгирования проб (пар запрос/ответ) определенных эндпоинтов HTTP API произвольного Rails-приложения. Тэгом считать произвольную строку.
Помощь запрашивал Андрей Ситник
Помог Евгений Жаров
Для новичков, задача на неделю
Нужно сделать скрипт, который будет брать пару популярных сайтов (типа GitHub) и на их верстке тестировать все минификаторы с помощью gemini или подобного тестирования по скриншотам. Результатом работы будет HTML страница с результатами каждого минификатора.
Польза: разобраться в тестировании по снимкам; познакомиться со всеми разработчиками CSS-минификаторов; строчка в резюме о том, что на качество всех CSS-минификаторов повлияли лично вы.