unilog 
или история о публикации в open source
О себе 
Пишу на C++ уже 12 лет 
Из них 9 мне за это платят 
В 2GIS уже 5,5 лет
Введение 
Всё написано до нас
Введение 
Всё написано до нас 
Особенно на C++
Введение 
Всё написано до нас 
Особенно на C++ 
Ложь!
Проблема 
Нет нужных библиотек
Проблема 
Нет нужных библиотек 
● изменчивость мира
Проблема 
Нет нужных библиотек 
● изменчивость мира 
○ CAS-операции (1970; 2008 Qt 4.4) 
○ Asynchronous I/O (2000-2002; 2005 libevent, 2008 boost::asio) 
○ inotify (2007) 
○ OpenCL (2008) 
○ Metal (2014)
Проблема 
Нет нужных библиотек 
● изменчивость мира 
● использование плохих реализаций
Проблема 
Нет нужных библиотек 
● изменчивость мира 
● использование плохих реализаций 
○ OpenSSL 
○ crypto 
○ любая библиотека на C++ для работы с JSON
Проблема 
90% open source библиотек — плохие!
Проблема 
90% open source библиотек — плохие! 
● неопытные разработчики 
● нет поддержки
Проблема 
Нет нужных библиотек 
● изменчивость мира 
● использование плохих реализаций 
○ OpenSSL 
○ crypto 
○ любая библиотека на C++ для работы с JSON 
○ 90% open source библиотек
Проблема 
Нет нужных библиотек 
● изменчивость мира 
● использование плохих реализаций 
○ OpenSSL 
○ crypto 
○ любая библиотека на C++ для работы с JSON 
○ 90% open source библиотек 
○ C++
Проблема 
Нет нужных библиотек 
● изменчивость мира 
● использование плохих реализаций 
● нежелание делиться кодом
Проблема 
Нет нужных библиотек 
● изменчивость мира 
● использование плохих реализаций 
● нежелание делиться кодом 
○ код больше никому не нужен (часто верно) 
○ код == деньги (как правило, неверно) 
○ нет ресурсов на доведение до ума
Проблема 
Нет нужных библиотек 
● изменчивость мира 
● использование плохих реализаций 
● нежелание делиться кодом 
● отсутствие продвижения
Результат 
Большое количество велосипедов
Решение 
● принять проблему
Решение 
● принять проблему 
● выбрать интересную часть кода
Решение 
● принять проблему 
● выбрать интересную часть кода 
● договориться с начальством
Решение 
● принять проблему 
● выбрать интересную часть кода 
● договориться с начальством 
● найти единомышленников
Решение 
● принять проблему 
● выбрать интересную часть кода 
● договориться с начальством 
● найти единомышленников 
● выложить на GitHub
Решение 
● принять проблему 
● выбрать интересную часть кода 
● договориться с начальством 
● найти единомышленников 
● выложить на GitHub 
● заняться продвижением
Решение 
● принять проблему 
● выбрать интересную часть кода 
● договориться с начальством 
● найти единомышленников 
● выложить на GitHub 
● заняться продвижением 
● работать с сообществом
Проблема 
Слишком много библиотек логирования
Требования 
● возможность настройки уровня логирования 
● обработка событий в течение всего времени работы 
● работа как в отладочной, так и в релизной сборках 
● возможность переопределения направления вывода 
● как можно более простая работа с библиотекой
Результат 
Единая библиотека логирования
Подготовка к open source 
Отличный способ командообразования!
Хостинг 
github.com/2gis/uniassert — уже доступна 
github.com/2gis/unilog — скоро!
Продвижение 
Прямо сейчас!
uniassert 
UNI_ASSERT(expr); 
UNI_VERIFY(expr); 
UNI_ENSURE_THROW(condition[, exception_type], message); 
UNI_ENSURE_RETURN(condition[, return_code]); 
UNI_THROW_IF(condition[, exception_type], message); 
UNI_RETURN_IF(expr[, return_code]); 
UNI_FUNCTION 
UNI_UNUSED(var);
unilog 
UNILOG(Info) << “Variable value is “ << var << “ (some other text)”;
unilog 
void InitializeLogger( 
// Info, Verbose, Warning, Error, Fatal 
SeverityLevel min_severity, 
const ILogMessageSinkPtr sink);
unilog 
struct ILogMessageSink 
{ 
virtual void Transmit(const LightweightMessage &message) = 0; 
};
unilog 
UNI_ENSURE_LOG_THROW(expr[, exception_type], error_message, severity, log_message); 
UNI_ENSURE_LOG_THROW(expr, error_message, severity); 
UNI_ENSURE_LOG_RETURN(expr[, return_code], severity, log_message); 
*_ELOG_* 
*_WLOG_* 
*_THROW_IF 
*_RETURN_IF
Работа с сообществом 
Ждём предложений!
Работа с сообществом 
Ждём предложений и pull request’ов!
Выводы 
● делитесь кодом
Выводы 
● делитесь кодом 
● продвигайте свои решения
Выводы 
● делитесь кодом 
● продвигайте свои решения 
● работайте с сообществом
Выводы 
● делитесь кодом 
● продвигайте свои решения 
● работайте с сообществом 
● используйте библиотеки uniassert и unilog
Что дальше? 
Другие библиотеки
Спасибо! 
woodroof@gmail.com 
@_woodroof

Данил Ильиных и Владимир Иванов, «Велогосипед»