Проблема
Нет нужных библиотек● изменчивость мира
○ 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
Проблема
Нет нужных библиотек● изменчивость мира● использование плохих реализаций
○ OpenSSL○ crypto○ любая библиотека на C++ для работы с JSON○ 90% open source библиотек
Проблема
Нет нужных библиотек● изменчивость мира● использование плохих реализаций
○ OpenSSL○ crypto○ любая библиотека на C++ для работы с JSON○ 90% open source библиотек○ C++
Проблема
Нет нужных библиотек● изменчивость мира● использование плохих реализаций● нежелание делиться кодом
Проблема
Нет нужных библиотек● изменчивость мира● использование плохих реализаций● нежелание делиться кодом
○ код больше никому не нужен (часто верно)○ код == деньги (как правило, неверно)○ нет ресурсов на доведение до ума
Проблема
Нет нужных библиотек● изменчивость мира● использование плохих реализаций● нежелание делиться кодом● отсутствие продвижения
Решение
● принять проблему● выбрать интересную часть кода● договориться с начальством● найти единомышленников
Решение
● принять проблему● выбрать интересную часть кода● договориться с начальством● найти единомышленников● выложить на GitHub
Решение
● принять проблему● выбрать интересную часть кода● договориться с начальством● найти единомышленников● выложить на GitHub● заняться продвижением
Решение
● принять проблему● выбрать интересную часть кода● договориться с начальством● найти единомышленников● выложить на GitHub● заняться продвижением● работать с сообществом
Требования● возможность настройки уровня логирования● обработка событий в течение всего времени работы● работа как в отладочной, так и в релизной сборках● возможность переопределения направления вывода● как можно более простая работа с библиотекой
Хостинг
github.com/2gis/uniassert — уже доступнаgithub.com/2gis/unilog — скоро!
uniassertUNI_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_FUNCTIONUNI_UNUSED(var);
unilogvoid InitializeLogger(
// Info, Verbose, Warning, Error, FatalSeverityLevel min_severity,const ILogMessageSinkPtr sink);
unilogUNI_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
Выводы
● делитесь кодом● продвигайте свои решения● работайте с сообществом● используйте библиотеки uniassert и unilog