Еженедельный подкаст о разработке web сервисов.
- свой ранер (runner) на gitlab и какие проблемы при этом возникли (Docker in Docker, несовместимость конфига `.gitlab-ci.yml`); - ушли с shared ранера потому что: * нет кеша слоев Docker'а; * мало ресурсов; * иногда нужно ждать когда выделят ранер). - немного про файловую систему Docker'a; - тестирование с использованием `docker-compose`; - статья ["Don't Touch My Code"][1] о качестве кода в зависимости от ownership'а. [1]: https://www.microsoft.com/en-us/research/publication/dont-touch-my-code-examining-the-effects-of-ownership-on-software-quality/
- когда использовать `done` канал в Go; - немного про го-рутины и их равноправие; - пара предложений по работе на Upwork; - хранение логов в time series БД, rsyslog, CloudWatch logs и вообще поиск альтератив ElasticSearch + Graylog;
- [эффект Даннинга — Крюгера][1]; - немного про код-ревью; - возможные ошибки в concurrency коде; - буферизация; - всегда используйте defer; - тестирование в конкурентной среде (race флаг). [1]: https://ru.wikipedia.org/wiki/%D0%AD%D1%84%D1%84%D0%B5%D0%BA%D1%82_%D0%94%D0%B0%D0%BD%D0%BD%D0%B8%D0%BD%D0%B3%D0%B0_%E2%80%94_%D0%9A%D1%80%D1%8E%D0%B3%D0%B5%D1%80%D0%B0
- что такое race condition на примере; - пример приложения, в котором мы ушли от go-рутины за счет инфраструктурного решения на базе kubernetes; - kubernetes SDK для создания своих типов (`kind`); - удобство двух мониторов при разработке frontend web-приложений; - первые впечатления от TypeScript'а; - [react-testing-library][1]; - мысли о том, что стоит попробовать Python (Django) для следующего проекта. [1]: https://github.com/testing-library/react-testing-library
Большинство программистов не используют широко математический аппарат в ежедневной практике. Еще раз поговорили об этом после того как я закончил чтение первой главый [A Programmer's Introduction to Mathematics][1]. Концептуально коснулись проблемы доказательства **существования** и **уникальности** в математическом анализе. Компьютерная эра могла начаться на 50-70 лет раньше. Этого не произошло из-за того, что для существующих научных открытий не смогли найти приложение в создании вычислительных машин. Бинарный оператор `xor` и его применение. Боря порекомендовал также неплохой [YouTube-канал Eddie Woo][2] для тех, кто хочет вспомнить базовые концепции в математике. [1]: https://pimbook.org/ [2]: https://www.youtube.com/user/misterwootube
**Концовка эпизода к сожалению не записалась из-за проблем со связью.** Поговорили о: 1) недавнем запуске Dragon компанией SpaceX: миссия Demo-2; 2) [World's fastest internet speed from a single optical chip][1]; 3) игра по крупному в крупных корпорациях; 4) структура с единственным полем в `errors` package в Golang. [1]: https://www.sciencedaily.com/releases/2020/05/200522095504.htm
Три модели ведения IT-бизнеса: * создание своего одного продукта; * саппорт существующего одного продукта; * решение текущих бизнес-задач. Удвоение рынка облачных вычеслений в ближайшие 2-3 года. В рамках этой темы упомянули Game-as-a-service: PlayStation Now (Sony), Stadia (Google), xCloud (Microsoft), GameFly (ElectronicArts). Для подобных сервисов нужны кластера. Рассматриваю возможный свич в углубление знаний кластерных технологий, например, Kubernetes. Коснулись тем языка программирования Go: * пустых структур для создания set'а через map `map[string]struct{}`; * `io` пакета; * поговорили о маленьком пакете [go-gelf][1]; * и [fsnotify][2]. [1]: https://github.com/Graylog2/go-gelf [2]: https://github.com/fsnotify/fsnotify
embedding интерфейсов в Go - возможность встроить один тип в другой. Самый частый пример в Go - это mutex'ы. Zero value интерфейса - это `nil`. Организация кода в Go-приложении в части интеграции со сторонними сервисами. Впечатления о книге ["A Programmer's Introduction to Mathematics"][1]. Математика, необходимая для Computer Science для тех, кто подзабыл про неё. [1]: https://pimbook.org/
Пару недель назад в сайд-проекте решил попробовать MongoDB. Несколько поделился первыми ощущениями от MongoDB. Коснулись [доклада][1] Айка Саргсяна (Юла) "Крупный проект на одной NoSQL". Обсудили общую тему базы данных для стартапа на начальной стадии. Коснулись хранения данных в MongoDB, [спецификацию BSON][2], join'ы, мигарции. Упомянули отличную книгу [Designing Data-Intensive Applications][3]. ## Overlay fs Неплохая свежая [статья][4] объясняющая как работают docker images на примере overlay fs. Немного про организацию наших проектов: gitlab, registry, CI, k8s. [1]: https://www.youtube.com/watch?v=ZLOFOxsDJIY [2]: http://bsonspec.org/spec.html [3]: https://www.amazon.com/Designing-Data-Intensive-Applications-Reliable-Maintainable/dp/1449373321 [4]: https://dev.to/napicella/how-are-docker-images-built-a-look-into-the-linux-overlay-file-systems-and-the-oci-specification-175n
Поговорили о конфигурировании Go-приложения. Касались следующих тем: - [12-factor app][1], а конкретно [3ий раздел, посвященный конфигам][2]; - глобальный контекст - хорошо или плохо; когда глобальный контекст плох; - популярные/удобные проекты для конфигурирования: - https://github.com/spf13/viper; - https://github.com/plaid/go-envvar; - простое решение по конфигурированию для небольших проектов - функция, заполняющая структуру со значениями по умолчанию из переменных окружения; - [плагин][3] для GoLand для использования `.env`-файла при запуске билда/тестов; - тестирование http-хендлеров; - table-тестирование в интеграционных тестах; - пирамида тестов; Также я поделился первым знакомством с couchbase документной БД: - важная разница community & enterprise версий; - язык запросов N1QL - спинофф ANSI SQL; - [сравнение][4] Couchbase и MongoDB [1]: https://12factor.net/ [2]: https://12factor.net/config [3]: https://plugins.jetbrains.com/plugin/7861-envfile [4]: https://db-engines.com/en/system/Couchbase%3BMongoDB
Проект loon Обратил внимание на ballon'ы на сайте https://www.flightradar24.com/. Это проект [loon][1] воздушные шары, обеспечивающие интернетом наземных клиентов. Если коротко, то это летающая базовая станция. Дженерики в Golang Первое и важное: [дженерикам в Go быть][2]! В течении первых 24 часов после публикации Go возник вопрос о наличии дженериков. До сих пор это один из top вопросов. Летом 2019 года был опубликован [дизайн-документ дженериков][3] для Go. Определение дженериков: > Generic programming enables the representation of functions and data structures in a generic form, with types factored out. Уже сейчас можно [поиграть с дженериками в Golang][5] с помощью [wasm-go-playground][4]. Уже сейчас можно писать универсальный код для разных типов с помощью: - интерфейсов; - кодогенерации; - приведения типов (`interface{}`). Немного про Дональда Кнута [1]: https://loon.com/ [2]: https://go-review.googlesource.com/c/go/+/187317 [3]: https://go.googlesource.com/proposal/+/4a54a00950b56dd0096482d0edae46969d7432a6/design/go2draft-contracts.md [4]: https://github.com/ccbrown/wasm-go-playground [5]: https://ccbrown.github.io/wasm-go-playground/experimental/generics/#A4Qwxg1iDmCmAEBbEBLAdgKA2A9mgLgE7j7wDOR6chAFACoCU8A3hgJB3wDKla0NTCoSoYAvlnwBPYAh7gINKTPichVWISYBtALp0sAMwCuaMPBplu+efQZMACrFgKmnVm0Kx8RwmnJaAG1g0CwYAWgBGHTFDEzMLeAAqOUhbBxxgARZ2RMsAXnNchi0ALiCQosjo8QxjU3NLZOtUxgcjMgALGgA3EACjBEZstlz4ApBgGTQAExpcgBp4Xv7YBhjauIarG1arYT4stT5hz1ISgoAiC/YDHEJ4AH1F7vhz+GI+BEt3NhQDd688AAhJcLsM2B5AQBqS6La4Q8QQ07wGFLAB0PH2/DWbERpx8flO6yUCAAspIAPIAIwAVrAwKQhEYGcMAHIgRBfXjQdZ1eI4WnwcnUukMpiYqiHbknLwE+ACmlo9mc3mbZDoLLuXr3CjybapYW0+n4HG6yBo+ztLqG0X4ZgXW44C6iU3NCAWq00G3G+1UkCEZ044D7fABEJm90Sg52GJAA=
Не проследили за балансом микрофонов, поэтому Боря в этом выпуске звучал тише, чем обычно. Приносим извенения за неудобства. Поговорили про логгирование в web-сервисах. - пакет `log` стандартной библиотеки; - написание своих кастомных логеров; - упомянули наше решение [gluent-bit][1], которое мы используем для трансляции логов в Graylog; - [logrus][2] в ~20 раз медленнее [zap][3]; - немного упомянули json-экстрактор Graylog; - уровни логирования: DEBUG, INFO, WARN, ERROR, FATAL; - особенности [zap][3]: - поддержка уровней логирования; - sampling для дедупликации потока логов; - не использует рефлексию и стандартный `json` пакет: работает через `append`; - `SugaredLogger` и `Logger`; - нет ротации логов. - ротация логов через [lumberjack][4] - что имеет смысл логировать, а что выносить в мониторинг; - `Reference-Id` для идентификации request-response и связанных операций; - отказ от логирования запросов, не изменяющих состояние системы; - унификация логов. [1]: https://github.com/ostretsov/gluent-bit [2]: https://github.com/sirupsen/logrus [3]: https://github.com/uber-go/zap [4]: https://godoc.org/gopkg.in/natefinch/lumberjack.v2
В подкасте подняли вопрос о сообщениях об ошибках в API. RFC7807 "Problem details" Этот документ предлагает унифицированное решение по форматированию (схеме) ответа проблемы/ошибки для API-сервисов. Несмотря на то, что документ достаточно свежий (весна 2016) мы едва ли обнаружили для себя удобное решение, которое одновременно будет удобно и для клиента API. RFC предлагает дополнительный Content-Type: application/problem+json. Частичное применение некоторых идей мы нашли в API DHL v4 Обсудили применимость использования Content-Language для последующей локализации. В большинстве наших проектов мы используем английский. Обсудили предложение RFC по использованию в качестве кодов ошибок URI и насколько это удобно использовать клиенту. Рассказали схему ошибки, которую мы используем в своих проектах.
тестирование unexported методов в Go через создание exported алиаса; создание *_test пакета для решения проблемы циклических импортов в тестах; unicode пакет; тестирование через публичные интерфейсы; преждевременная оптимизация; преждевременная абстракция: функции, классы, интерфейсы, новые протоколы; правило трех; читаемость против преждевременной абстракции; соблюдение уровней абстрации; правило бойскаута;
чуть-чуть о Google Cloud Spanner - реляционная геораспределенная БД от Google коснулись темы документные базы против реляционных consistency в базах данных дорогие облачные БД от Google научные публикации на google research / google scholar удобные облачные сервисы, которые мы используем регулярно: AWS S3, SES, Google Places API поддерживать самому кластер k8s или нет проекты, в которых "поставили точку" трудности, с которыми мы столкнулись, когда впервые развернули своей k8s кластер история одной проблемы в k8s на hetzner, суть которой мы так и не выяснили возможно стоит подписаться на changelog k8s https://github.com/urfave/cli для создания CLI-приложений на Go http://docopt.org/ ACID вобще и ACID в MongoDB
Удаленная работа boltdb Встраиваемая key-value база данных. Чем-то напоминает SQLite за исключением того, что это просто key-value. Всего
Поговорили о: ActiveRecord vs Repository паттерне; pgbouncer; проекты типа аггрегатор и интегратор.
Подкасть чуть более чем полностью о Go Зависимости в хендлерах Обсудили два способа инжектирования зависимостей в хендлерах: использование глобальных переменных; явная передача зависимостей через арументы фунции-хендлера; использование структуры-контейнера. Много говорили о базе данных в роли зависимости. Вынесение request и response структур в хендлер func Handler(db *storage.DB) gin.HandlerFunc { type request struct { // } type response struct { // } return func(ctx *gin.Context) { // } } Go поощряет написание "скучного" кода Оптимистическое программирование Опубликовано: 05.03.2020 Теги: Go, сервис-контейнер, зависимости, python, оптимистическое программирование
excelize, упомянутый в прошлом эпизоде удалось за прошедшую неделю применить. В деле показал себя отлично. Не часто заказчик требует обмен данных в XLSX-формате через API. Это был тот редкий случай. Алгоритмы Проходил на coursera курс по алгоритмам от ВШЭ. Среди языков, на которых можно делать submission нет Go, но для мня это неплохой повод попрактиковаться в Python или Rust. Последний мы не используем в проектах, а вот проекты на Python у нас есть. Так вот на каждый язык свои лимиты по рантайму: Язык программирования Лимит времени выполенения, сек C, C++, Rust 1 Java, C# 1.5 Haskell 2 Scala 3 Ruby, JavaScript, Python 5 Несколько неожиданно, что Scala дали такой лимит. Концепция стресс-тестирования Идея в том, чтобы написать две имплементации и сравнивать выходные значение при одинаковых входных. Чаще применяется для тестирования алгоритмов когда есть медленное, но простое решение и быстрое, но, возможно, с ошибками в реализации. В тестах мы чаще сами придумываем входные данные для тестируемого метода. При стресс-тестировании входные данные генерируются произвольным образом. Стресс-тесты не отменяют необходимости в корнер-кейсах, когда мы тестируем пограничные состояния: отрицательные, одинаковые значение, неверные типы, нулевые значения и т.д. Рейтинг языков программирования от IEEE Графики предварены несколько сомнительной цитатой: Engineers love Python, JavaScript, and Java. Employers, on the other hand, shine their light on Go. Пожалуй действительно любят из этой тройки Python. JavaScript как раз едва ли любят, поэтому и перетягивает на себя популярность TypeScript, добавивший строгости. А Go - это хороший шаг в сторону упрощения кода и он оппонирует Java, C++, C#, Scala. Go в рейтинге IEEE №1. pkg.go.dev вместо godoc.org На главной популярные и рекомендуемые репозитории. В каждом пакете можно посмотреть зависимости и кто использует этот пакет. Другое Обсудили также пару пакетов из x/sync: https://godoc.org/golang.org/x/sync/singleflight https://godoc.org/golang.org/x/sync/errgroup Коротко обсудили алгоритм зайца и черепахи для поиска петли в связанном списке. Вдохновился на некоторое углубление в тему этим видео (каким бы было аниме о программировании).
tamago Позволяет запускать Go-приложение прямо на процессоре, без операционной системы. Концепция unikernel. Пока поддерживается только их же (f-secure) SoC (Systm-on-Chip) MkII (~150USD). В планах добавить поддержку Raspberry PI Zero (~25USD). Кстати будет упомянуть книгу Code: The Hidden Language of Computer Hardware and Software by Charles Petzold. Основы изложены лучше, чем вам их дадут в университете. excelize Просто упомяну библиотеку для чтения и записи XLSX-файлов в Go: Excelize is a library written in pure Go providing a set of functions that allow you to write to and read from XLSX files. Supports reading and writing XLSX file generated by Microsoft Excel™ 2007 and later. Supports saving a file without losing original charts of XLSX. This library needs Go version 1.10 or later. Go vs Python Статья о использовании Python для небольших скриптов. Полностью поддерживаю автора. Среди прочего автор упомянул сложность идентификации версии Go-программы: имеешь дело с бинарным файлом. В Go можно использовать ldflags: $ go build -ldflags="-X 'main.Version=v1.0.0'" Отличная вводная статья на DigitalOcean про использование go build для модификации значений переменных пакета. Также к недостаткам Go автор отнес отсутсвие REPL, но он есть. Применение NLTK для опредления HC/HTC Обсудили популярную библиотеку NLTK, написанную на Python, для решения нашей одной из повседневных задач для определения HTC-кода посылки по её описанию для таможни в США.
Первый пилотный подкаст. Борис и я записали тестовый эпизод и коснулись zen Golang, поговорили немного о Rust, глянули Diesel ORM и плохо настроили звук.