Что посеешь
Гоферы ведут примитивное сельское хозяйство, стимулируя рост корней, а затем поедая их. Мы же продолжаем пропалывать просторы интернета и собирать полезные материалы месяца. Вот наш июльский урожай.
Фаззинг в грядущем 1.19
Версия Go 1.19 доросла до первого релиз-кандидата. Новая версия должна улучшить фаззинг, впервые включенный в язык с версии 1.18. Если упростить, то внутри есть движок libfuzzer, подающий данные на вход тестируемой функции. Эти данные в идеальном варианте должны быть как корректными, так и намеренно искажёнными. Так отлавливают баги, связанные с неправильной обработкой данных.
Всего было добавлено три улучшения. Первое — поддержка 8-битных счётчиков. Это устраняет проблемы при фаззинге циклов, когда число проходов кратно большим степеням двойки. Раньше из-за этого можно было потенциально потерять немного данных. Но теперь это не доставит неприятностей.
Второе — перехват сравнения строк. Для фаззера код со сравнением строк был проблемой из-за сложности генерации тестовых примеров. Теперь же фаззер может залезать в ветви, защищенные сравнением строк, и генерировать мутации данных. Методов перехвата пока не слишком много, но в дальнейшем их легко будет расширить.
Третье улучшение затрагивает перехват целочисленных сравнений. В фаззер включили специальный режим профилирования целочисленных значений. Раньше это была не слишком полезная функция из-за особенностей реализации (единый адрес возврата). Множество целочисленных сравнений для фаззера были единым целым и не рассматривались как отдельные сравнения. Теперь же вводятся синтетические, но рабочие адреса возврата. Разные целочисленные сравнения для фаззера теперь представляют собой отдельные сущности, что улучшает профилирование.
Долгоживущие соединения в Go
Соединения в дикой природе живут недолго. У них много естественных врагов. Самые злые — брандмауэры. Достаточно администратору установить максимальное время простоя и всё. TCP-сессии будут безжалостно уничтожены. В некоторых случаях соединения кажется живым. Но как только с помощью него попытаться отправить сообщение… не будем о грустном. Поговорим о том, как нам поддерживать активность TCP-соединений.
Первое, что приходит на ум, это функция TCP под названием Keepalive. Удалённому хосту с определённой периодичностью отправляются пакеты без полезной нагрузки, но требующие подтверждения приёма (ACK). В Golang эта функция для любого TCP-соединения net.TCPConn включается методом net.TCPConn.SetKeepAlive() со значением true. Делается это и на стороне сервера, и на стороне клиента.
Важно понимать, что поведение Keepalive будет сильно зависеть от операционной системы. Например, в Linux тюнинг можно производить через команду sysctl -w. Чтобы зафиксировать это и после рестарта, можно прописать параметры в /etc/sysctl.conf.
Поговорим о значениях по-умолчанию. Если соединение бездействует, то пакеты Keepalive начнут отправляться только через 2 часа (7200 секунд). Нужно меньше — используем net.ipv4.tcp_keepalive_time, задавая конкретное значение в секундах. Интервал между Keepalive-пакетами задается параметром tcp_keepalive_intvl. Из коробки это 75 секунд и также меняется в /etc/sysctl.conf. И ещё один параметр — tcp_keepalive_probes. Он отвечает за количество неотвеченных пакетов. Стандартное значение 9. Так что если 9 раз удалённый хост не отвечает ACK, то соединение считается мёртвым.
В Golang для переопределения системных значений ОС предназначен метод net.TCPConn.SetKeepAlivePeriod(). Это особенно полезно, когда приходится иметь дело с системами, в которых параметры по-умолчанию изменены в большую или меньшую сторону.
Странности go install
Если любого дебианщика разбудить среди ночи и спросить как поставить какой-либо программный пакет, то услышим apt install <name>. Это будет почти автоматический ответ. В Golang для установки сторонних программ из исходников использовалась команда go get <name>, но сейчас она считается устаревшей. Теперь мы должны использовать go install <name>@latest. Правда, есть нюанс. Вместо желаемого ПО мы часто получаем ошибку вида:
The go.mod file for the module providing named packages contains one or more replace directives. It must not contain directives that would cause it to be interpreted differently than if it were the main module.
Причина такого поведения — наличие директив replace и exclude. Увы, но если в вашем go.mod эти директивы есть, то придётся от них отказаться и сделать дополнительные релизы без них. Или же придётся переключиться на использование Go multi-module workspace mode. В любом случае считается, что такое поведение go install не баг, а фича.
Видеть как гофер
Системные администраторы любят команду watch в Linux. Она позволяет в реальном времени отображать выводимую информацию из отслеживаемой команды. Это вполне заменяет прогресс-бар при создании или копировании файлов, отображает состояние оперативной памяти, отслеживает прерывания и многое другое. Но, как оказалось, некоторые разработчики посчитали, что эту команду можно реализовать лучше и удобнее. Так на свет появился viddy — продвинутый аналог команды watch.
Viddy расширяет привычное отображение за счет добавления новых элементов интерфейса, возможности цветного вывода и подсветки. Киллер-фича — перемотка времени. Если в процессе выполнения команды что-то пошло не так, можно буквально отмотать время назад и обнаружить какой вывод был на момент возникновения проблемы. Инструмент написан на Go и действительно хорош, чтобы его попробовать в деле.
Интересно посмотреть
Если вы пропустили наш Go meetup, состоявшийся 29 июня 2022, то не переживайте. Все видеозаписи уже есть на нашем Youtube-канале.
Виталий Исаев из компании МойОфис рассказал про особенности потребления оперативной памяти в Golang.
Создание высоконагруженных проектов без бенчмарков практически невозможно. Но и абсолютно доверять им не стоит. Про это и многое другое поведал Юрий Букаткин из компании Программный Регион.
Популярное заблуждение — NeoVim сложный и неудобный. Реально же он обладает впечатляющими возможностями и может служить в роли основное среды. Продираться сквозь дебри заблуждений нам помогал Антон Губарев из Авито.
Конкурсы для разработчиков
Go Quiz
до 25 августа 2022
Мы подготовили 8 каверзных вопросов уровня сложности от «easy» до «hard». У вас есть право на одну ошибку, чтобы стать финалистом квиза.
Среди всех, набравших не менее 7 правильных ответов мы разыграем приз — Яндекс Станцию. Счастливчика определит генератор случайных чисел в прямом эфире на нашем Youtube.
Митапы
Осенний Go Meetup
19 октября 2022 19:00
Рады сообщить, что мы запланировали проведение Go Meetup. Его программа формируется, но регистрация уже открыта. Детальная информация о мероприятии будет опубликована позже, следите за наши новостями.
Если у вас есть идея доклада и вы хотите стать спикером, то пишите на почту andy@evrone.com.
Вакансии
Удаленка / Офис
Evrone
Мы открыты для новых Go-разработчиков. В Evrone можно работать удалённо с первого дня, мы поддерживаем и оплачиваем участие в Open-source проектах и выступления на конференциях, а расти в грейдах можно с помощью честной системы проверки навыков и менторства.