Category: it

Codded

GRPC: обработка ошибок на клиенте

Разрабатывая сервис на GO с GRPC встал вопрос при описании proto файлов "Нужно ли вносить описание ошибки приложения в ответ?". Изначально я так и сделал. Определил новый тип Error и добавил его первым полем во все ответы, получилось так:

message Error {
message Metadata {
string key = 1;
string value = 2
}
string code = 1; // код ошибки, константа
string message = 2; // сообщение об ошибке
string detail = 3; // дополнительные данные об ошибке, пояснения 
repeated Metadata meta = 4; // метаданные в виде ключ=значение
}
message ConfigStatusAnswer {
// Данные ошибки. Заполнено в случае ошибки выполнения запроса
Error error = 1;
// дата последнего изменения конфигурации
google.protobuf.Timestamp last_changed_time = 2;
// контрольная сумма конфигурации (опционально)
string checksum = 3;
}

Вроде бы логично. Но я решил все таки посмотреть, как это рекомендуют делать разработчики gRPC.
Оказалось они предлагают не вносить это информацию в каждый ответ, а вписывать ее в метаданные и оттуда клиент их должен достать. Меня интерисовало также как это будет выглядеть в коде на TypeScript, т.к. мы используем Improbable grpc-web для публикации API и он умеет работать с TypeScript. В нашем проекте один из клиентов это одностраничик (SPA) на Vuejs, похоже на это пример в статье "A TODO app using grpc-web and Vue.js (12.2018)"

Как же создавать ошибки на сервере (Go) и обрабатывать их на клиенте (TypeScript) тогда?

Collapse )
Codded

Visual Studio Code: мои настройки

Я начал исползовать Visual Studio Code, когда два года назад начал изучать язык программирования GO.
Сначала эта среда мне не очен понравилась, не было панели нструментов, кнопки Запустить, да еще и на 32 разрядной Windows нельзя установить отладчик для GO. Поработав в ней я привык и даже считаю ее удобной.
Конечно не все поддерживается из коробки, но расширения с успехом удовлетворяют дополнительные потребности.

Для работы использую тему "Material Theme" - у нее плюс втом, что область кода выделяется более контрастно, в то время как у других элементов шрифт более приглушенный.

Также классная вешь Zen Mode, когда редактор открывается в полный экран и скрывается все кроме кода, он отцентрирован посередине экрана - ничего не отвлекает.

Подключаю шрифт с лигатурами Fira Code. В настройках задать его:
"editor.fontFamily": "Fira Code",
"editor.fontLigatures": true


Я использую следующие расширения VS CodeCollapse )

Codded

GoLang: код, который растет с изяществом

Прочитал статью-презентацию Andrew Gerrand "Go: code that grows with grace" https://talks.golang.org/2012/chat.slide 2012 год

В ней даны примеры постепенного внесений нового функуионала в программу на GO. Как это можно делать без усложнения кода.
Примеры в основном затрагивают работу с сетью по TCP, HTTP, Websocket на примере приложения ЧатРулетка, где каждый подключившийся соединяется со следующим первым подключившимся.
В коде можно увидеть, как подключение к серверу сделано по TCP, HTTP, Websocket. Как одновременно в одном сервере можно обрабатывать сообщеия по TCP и WebSocket. Как интерфейсы упрощают переиспользование и работу с кодом разных классов. При этом показывается модель конкурентного исполнения при помощи горутин и взаимодействие через каналы. В примере даже добавляют чат бота на основе цепей Маркова, который будет выдавать фразы и отвечать, если к человеку не подсоединился партнер в течении заданного интервала времени.

Серьёзно о главном

GoLang: продвинутые техники для конкурентного программирования

Просмотрел видео "Google I/O 2013 - Advanced Go Concurrency Patterns" https://www.youtube.com/watch?v=QDDwwePbDtw
Что стоит запомнить и применить?

1. Техника  "цикл for-select"
2. Техника "Служебный канал, канал для ответа (chan chan error)"
3. Техника  "nil-каналы в выражениях select для временной приостановки"
4. Используйте инструменты для обнаружения состояния гонки данных (data race, флаг -race) и взаимоблокировок.

На видео описывется три ошбики к коде с конкурентным исполнением (1 - состояние гонки при обращении к данным / решение (канал с каналом для отчетов/ошибок), 2-приостановка цикла из-за Sleep / Решение (делаем задержку по готовности канала), 3-цикл может заблокироваться навсегда если нет данных в канале) и способы их решения приведенными техниками.

Также даны несколько техник улучшения работы главного цикла обработки:

  1. Дедупликация заданий для дочерних элементов перед их исполнением в горутине (код на видео, фильтрация через map уже обработанных ранее заданий)

  2. Как приостановить выборку заданий, если их уже слишком много в очереди (код в видео, использет технику 3)

  3. Как сделать основную процедуру получения данных неблокируемой (код в видео, создает канал для результатов, техника 2)

Collapse )
Codded

GoLang: Модули Go в реальной жизни

Прочитал статью Go Modules In Real Life (Chip Keyes, 06.2019г.). В ней описываются ситуации нюансы использования модулей GO в разработке.Модули Go появились с версии 1.11 и позволяют уйти от жесткой привязке к GOPATH. Чем же еще это полезно и как и когда их использовать?

Краткая выжимка:

1. Модуль — это коллекция пакетов GO объединенных в одну общую единицу.
Collapse )
Codded

Работа со строками в GoLang — fmt.Sprintf или strconv?

Прочитав Bad Go: frivolous Sprintf (2019 год) вот что понял:

1) fmt.Sprintf — хорошо и удобно, но если надо быстро — используй strconv.Format* и другие его методы. Оно меньше памяти потребляет и работает почти в 4 раза быстрее с выводом. 

2) fmt.Sprintf — тратит время на разбор формата из первого аргумента. 

3)Когда используете fmt.Sprintf  формируйте все строку сразу, т.к. Sprintf для кусочков и конкатенация — это дополнительное выделение памяти и это замедляет.


Codded

7 незаметных подводных камней в языке Go

1. Размеры Int могут меняться в зависимости от разрядности. Так что ваш код может перестать работать на 32 разрядной машине, банально вызывая переполнение.

Эту ошибку можно увидеть в построителе парсеров языка antlr4 - разработчики просто не учли, что люди пользуются еще 32-разрядными системами, в итоге код на 32-разрядной ОС не работает из-за меншего размера Int вызывая переполнение.

2. Осторожнее с приведением типов к типам указателям. Указатель на тип — это не сам тип, тут не будет разыменовывание работать автоматически.

Пример:
f { ... return nil, NotFoundError } err = f()
if _, ok := err.(*NotFoundError); ok { // ... } // это не сработает!

Используйте лучше подход стандартной библиотеки GO — проверка ошибок не по типу, а по назначению, см. os.IsExist(error) и os.IsPermission(error).

Collapse )Collapse )
Серьёзно о главном

Интерфейсы и композиция для эффективного тестирования программ на языке Go

Оригинал: nathan leclaire, https://nathanleclaire.com/blog/2015/10/10/interfaces-and-composition-for-effective-unit-testing-in-golang/ 10.10.2015

К чему призывает автор:

1. Используйте интерфейсы GO — это удобно в работе, широко используется в стандартной библиотеке, и упрощает тестирование, избавляя от использование mock и stub библиотек.

2. Составляйте высокоуровневые интерфейсы через композицию (встраивание).

3. Будьте хорошо знакомы с go test и пакетом testing

Где, как применить?

Collapse )
Серьёзно о главном

Пакеты для проверки выражений, правил в GoLang

В процессе разработки своего решения для подбора правил обработки — процессора правил, узнал о существовании алгоритмов сопоставления с образцом. Для Go есть реализация алгоритма Rete (1: https://github.com/GNaive/naive-rete-go, 2: https://github.com/phomola/rete). 

Для поиска правил мы проверяем их условия совпадения. Как можно сохранить эти условия, если правила меняются динамически? Можно придумать свое решение или использовать библиотеки для проверки выражений, они преобразуют текстовую строку в исполняемые код и проверяют его, обычно это логическое выражение, возвращающее true/false.

Что такое Процессор правил (Rule Engine) смотри уhttps://martinfowler.com/bliki/RulesEngine.html

Итак рассмотрим некоторые пакеты.

Collapse )