Всем привет. Меня зовут Нещадин Иван, и я расскажу про оптимизацию одного из микросервисов Авито на Go. История построена вокруг различных инструментов, которые доступны в языке, и пойдёт от простых примеров к более сложным.
User
Миллион домашних фотографий: лица, лица, лица
Итак, все фотографии разложены по папкам и находить фотографии Новых годов или дней рождения стало быстро и удобно. Фотографии из отпусков тоже можно найти относительно быстро, но хотелось большего. А именно, искать по людям и не просто по людям, а по набору людей, например, найти все совместные фотографии детей или фотографии с бабушкой и т.д.
Поэтому я решил немного углубиться в так называемый Face Recognition.
Ladder на службе в быту, а также почему это может оказаться Вам интересно и даже полезно
Путь LED-самурая

Немного предыстории — около года назад я опубликовал обзорную статью, где была описана минимальная отладочная плата для микроконтроллера серии STM32F405. Особого интереса тогда публикация не вызвала. А зря. Согласен, слишком много «расплодилось» подобных решений на просторах интернета.
Но полезное, как известно, никогда не пропадает даром. И этот случай — тому подтверждение. Недавно коллега открыл небольшую фирму, занялся строительством жилых домов «под ключ». Одним из устройств, которое ему было очень нужно — это система управления динамическим освещением.
Паяльник, гугл, отрицание, гнев, торг, депрессия, принятие — вот его путь в одном предложении.
Теперь обо всем по порядку.
Масштабируем WebSocket соединения на Go
- 12 m уникальных пользователей в месяц;
- Версии для всех современных платформ (Web, iOS, Android);
- Достаточно нагруженное приложение – около 800 тысяч подключений онлайн по WebSocket (основной протокол общения с пользователями).
Александр Емелин из компании Авито — автор проекта Centrifugo — open-source сервера real-time сообщений, где основной протокол передачи данных как раз WebSocket. Сервер используется в проектах Mail.Ru (в том числе в Юле), а также во внутренних проектах Badoo, ManyChat, частично Авито и за рубежом (например, Spot.im). Сейчас сервер базируется на доступной всем Go-разработчикам библиотеке Centrifuge.
На конференции Golang Conf 2019 Александр рассказал, как команда Авито решала проблемы при работе с WebSocket — как про детали, касающиеся Go в частности, так и вообще про работу с большим количеством постоянных соединений.

CrowdSec — современная альтернатива Fail2Ban и коллективный иммунитет для Интернета

CrowdSec
Инструмент Fail2Ban хорошо известен админам. Программа анализирует логи на сервере и подсчитывает количество попыток доступа с конкретных IP-адресов по указанным протоколам. В случае нарушения правила данный IP-адрес блокируется на заданный отрезок времени. Например, джейл для авторизации по SSH включён с дефолтными настройками 5 попыток авторизации за 10 минут, после чего происходит бан IP-адреса на 10 минут. Отличный способ отфильтровать мусорный трафик от разных сканеров и защита от DDoS.
Fail2Ban и SSHGuard — лучшие инструменты в своей области. Однако новый опенсорсный проект CrowdSec представляется интересной альтернативой. Это локальная замена Fail2Ban, а потенциально нечто большее — глобальная база репутации IP-адресов типа иммунной системы интернета.
Мониторинг качества воздуха с использованием Raspberry Pi 4, датчика Sensirion SPS30 и Microsoft Azure
(Не)очередной MQTT-телеграм-бот для IoT

Почему (не)очередной? Потому что это не просто бот с двумя захардкоженными кнопками для управление лампочкой, примеров которых в интернете много, а это бот, который поддерживает гибкую настройку подписок и компанд для управления прямо из своего меню, без изменения исходного кода. NoCode solution, так сказать.
Бот разрабатывался на языке Go, исходный код выложен в свободный доступ на гитхаб под лицензией MIT. В статье хочу рассказать о некоторых технических моментах реализации и получившемся функционале с примерами использования.
Делаем станцию мониторинга загрязнённости воздуха в домашних условиях

В этой статье я расскажу о том, как собрать датчик загрязнённости воздуха в домашних условиях и зачем это нужно.
Asterisk от 1.8 до 16
Основная станция заменилась и научилась sip и было решено обновить Asterisk до 16.
Умное зеркало своими руками
Здесь я хочу рассказать о том, что нужно для проектирования и сборки собственного умного зеркала. Я, кроме того, коснусь тут и темы создания рамки для такого зеркала.
Для тех, кто раньше с умными зеркалами не сталкивался, опишу в двух словах суть проекта. За зеркалом, прозрачным с одной стороны, размещают монитор. При идеальном освещении всё, что на экране выведется чёрным, будет выглядеть как зеркало. А всё белое (или имеющее другой высококонтрастный цвет) будет просвечивать сквозь зеркало. Мне хотелось сделать нечто вроде информационной панели для всей семьи, на которую выводились бы календари, списки покупок, сведения о погоде. Я подумывал и о том, чтобы встроить в это зеркало AlexaPi (подробнее об этом я расскажу позже). Я заинтересовал жену рассказом о том, как это зеркало улучшит нашу жизнь и поможет быстрее справляться с делами, и принялся за работу.

Умное зеркало
Пишем движок полнотекстового поиска на Go
Сегодня мы собираемся написать собственный движок FTS. К концу этой статьи он сможет выполнять поиск по миллионам документов менее чем за миллисекунду. Начнём с простых поисковых запросов, таких как «Выдать все документы со словом cat», а потом расширим движок для поддержки более сложных логических запросов.
Примечание: самым известным движком полнотекстового поиска является Lucene (а также Elasticsearch и Solr, построенные на его основе).
Go-swagger как основа взаимодействия микросервисов

Здравствуй, NickName! Если ты программист и работаешь с микросервисной архитектурой, то представь, что тебе нужно настроить взаимодействие твоего сервиса А с каким-то новым и ещё неизвестным тебе сервисом Б. Что ты будешь делать в первую очередь?
Если задать такой вопрос 100 программистам из разных компаний, скорее всего, мы получим 100 разных ответов. Кто-то описывает контракты в swagger, кто-то в gRPC просто делает клиенты к своим сервисам без описания контракта. А кто-то и вовсе хранит JSON в гуглодоке :D. В большинстве компаний складывается свой подход к межсервисному взаимодействию на основании каких-либо исторических факторов, компетенций, стека технологий и прочего. Я хочу рассказать, как сервисы в Delivery Club общаются друг с другом и почему мы сделали именно такой выбор. И главное — как мы обеспечиваем актуальность документации с течением времени. Будет много кода!
Производство Material иконок для MacOSX приложения Home Assistant на Electron
Разрабатываем самый удобный в мире* интерфейс для просмотра логов
Если Вам приходилось когда-нибудь пользоваться веб-интерфейсами для просмотра логов, то Вы наверняка замечали, насколько, как правило, эти интерфейсы громоздки и (зачастую) не слишком-то удобны и отзывчивы. К некоторым можно привыкнуть, некоторые совсем ужасны, но, как мне кажется, причина всех проблем заключается в том, что мы неправильно подходим к задаче просмотра логов: мы пытаемся создать веб-интерфейс там, где лучше работает CLI (интерфейс командной строки). Мне лично очень комфортно работать с tail, grep, awk и прочими, и поэтому для меня идеальным интерфейсом для работы с логами было бы что-то аналогичное tail и grep, но которое при этом можно было использовать для чтения логов, которые пришли с множества серверов. То есть, конечно же, читать их из ClickHouse!
*по личному мнению хабрапользователя youROCK
Flutter и десктоп разработка
Умная хрущёвка на максималках
Вместе с тем, у меня есть опыт интеграции и со старыми домами — квартира в типовом советском пятиэтажном кирпичном доме семидесятых годов постройки уже 5 лет автоматизирована. Она имеет единую панель управления для разных подсистем и не зависит от облачных сервисов. В отличии от новостройки, эта квартира в пятиэтажке была автоматизирована не сразу, а поэтапно за несколько лет, по мере возникновения интереса к разным элементам управления и контроля, таким как:
- мониторинг приборов учета;
- датчики контроля: домофона, температуры, шума, открытия дверей, ...;
- единая панель управления умным домом;
- подъездное видеонаблюдение;
- настенный дисплей для текущего времени и температуры за окном;
- освещение в квартире, включая кнопку «выключить всё»;
- удаленное обесточивание квартиры;
- удаленное перекрытие воды.

3D модель этой двухкомнатной квартиры 47 кв.м, которая была автоматизирована, нарисованная в Sweet Home 3D
Собираем DIY шлюз для Zigbee устройств
Вступление
Пока крупные производители конечных устройств Zigbee в борьбе за кошельки пользователей имитируют поддержку оборудования сторонних производителей, группы энтузиастов изучают стандарты протоколов и изобретают "альтернативные" всеядные программные и аппаратные решения для работы с устройствами Zigbee.
Наибольший толчок развития DIY шлюзам дал проект zigbee2mqtt. На момент написания заметки в проекте реализована поддержка 785 устройства от 140 производителей.
Поиск показал наличие интересных конкурентных проектов AqaraHub(написан на с, похоже, что развитие приостановлено, последний коммит был 5 месяцев назад), нативная поддержка в ioBroker (проект ведет наш соотечественник Киров Илья), нативная поддержка в Home-assistant (поддержка появилась после появления библиотеки zigpy, активно развивается, но пока далека от совершенства). Обзор программных шлюзов хорошо разобран в интернете, имеется множество статей, желающий найдет информацию по тэгам в конце статьи.
Компьютерное зрение на WebRTC-сервере с аппаратным ускорением от Intel OWT

WebRTC упростил (в большинстве своем) получение и отправку видеопотоков в реальном времени. А значит, можно немного поразвлекаться с ними при помощи машинного обучения. В прошлом месяце я показал, как запустить компьютерное зрение (Computer Vision – CV) локально в браузере. Как я уже упоминал, локально – это, конечно, хорошо, но иногда требуется более высокая производительность, и для этого нам понадобится удаленный сервер. В данном посте я расскажу о том, как запускать серверные модели OpenCV с аппаратным ускорением на чипсетах Intel с помощью Open WebRTC Toolkit (OWT) с открытым исходным кодом.
Go: десериализация JSON с неправильной типизацией, или как обходить ошибки разработчиков API

Недавно мне довелось разрабатывать на Go http-клиент для сервиса, предоставляющего REST API с json-ом в роли формата кодирования. Стандартная задача, но в ходе работы мне пришлось столкнуться с нестандартной проблемой. Рассказываю в чем суть.
Как известно, формат json имеет типы данных. Четыре примитивных: строка, число, логический, null; и два структурных типа: объект и массив. В данном случае нас интересуют примитивные типы. Вот пример json кода с четырьмя полями разных типов:
{
"name":"qwerty",
"price":258.25,
"active":true,
"description":null,
}
Как видно в примере, строковое значение заключается в кавычки. Числовое — не имеет кавычек. Логический тип может иметь только одно из двух значений: true или false (без кавычек). И тип null соответственно имеет значение null (также без кавычек).
А теперь собственно сама проблема. В какой-то момент, при детальном рассмотрении получаемого от стороннего сервиса json-кода, я обнаружил, что одно из полей (назовем его price) помимо числового значения периодически имеет строковое значение (число в кавычках). Т. е. один и тот же запрос с разными параметрами может вернуть число в виде числа, а может вернуть это же число в виде строки. Ума не приложу, как на том конце организован код, возвращающий такие результаты, но видимо, это связано с тем, что сервис сам является агрегатором и тянет данные из разных источников, а разработчики не привели json ответа сервера к единому формату. Тем не менее, надо работать с тем что есть.
Но далее меня ждало еще большее удивление. Логическое поле (назовем его active), помимо значений true и false, возвращало строковые значения «true», «false», и даже числовые 1 и 0 (истина и ложь соответственно).
Использование OAuth и API VK в Go
Сейчас найти современный сервис, который бы не использовал авторизацию по OAuth практически невозможно. Существует большое количество сценариев использования этого протокола. Попробуем же написать простой клиент для работы с этой технологией на Go.
Information
- Rating
- Does not participate
- Location
- Челябинск, Челябинская обл., Россия
- Date of birth
- Registered
- Activity