ch
Feedback

不要被骗子欺骗!Telemetrio 会找到并标记这些频道 👉 如果想查看标记,请订阅

myStack

myStack

前往频道在 Telegram

Меня зовут Ростислав и я разработчик. Это мой личный блог. Я пишу на Go, читаю книги про технологии и пишу об этих и других вещах сюда. Книги: https://bit.ly/rostislav-books Личка: https://t.me/Rostislaved Сайт: Rostislav.me

显示更多
877
订阅者
无数据24 小时
-17 天
-430 天
帖子存档
vscode сегодня я узнал, что режим сравнения в VS code можно запустить из терминала вот так:
code --diff ./config ./config_bak 
что конкретно мне намного приятнее, чем через UI натыкивать: Select for Compare и Compare with Selected

Telegram Export Parser Написал небольшой скрипт, который парсит экспорт чата телеграма https://github.com/rostislaved/telegra
Telegram Export Parser Написал небольшой скрипт, который парсит экспорт чата телеграма https://github.com/rostislaved/telegram-export-parser Основная ценность скрипта в структуре, в которую парсится экспорт чата, она нетривиальная. Кроме нее там просто json.Unmarshal - Запись только текста сообщений в файл (converted.txt). - Печать сообщений в stdout в немного отформатированном виде - Можно задать дату, сообщения до которой игнорируются - Можно задать число сообщений, которое будет обрабатываться Я это написал, чтобы в Gemini загружать экспорт чата и задавать по нему вопросы

Go Clean Architecture Template v0.0.4 (15.12.2025) https://github.com/rostislaved/go-clean-architecture - Сборка и запуск при
Go Clean Architecture Template v0.0.4 (15.12.2025) https://github.com/rostislaved/go-clean-architecture - Сборка и запуск приложения теперь не в main, а в app.New() и app.Start() - Файл конфига toml -> yaml - Структуры конфигов находятся каждая в своем пакете, а не все в общем (стало возможно полностью, благодаря новой либе конфига) - Обновлен конфиг линтеров до 2.6.0 (https://github.com/rostislaved/golangci-lint-config)

Либа конфига При организации пакета конфига часто используют следующий вариант:
package config

type Config struct {
   Database DatabaseConfig
   Kafka    KafkaConfig
}

type DatabaseConfig struct { /// }

type KafkaConfig struct { /// }
Пакет config, который содержит главную структуру конфига, а также все подструктуры. Минус этого варианта в том, что пакет, например, бд будет делать импорт DatabaseConfig из пакета общего конфига, пакет кафки - KafkaConfig итд. Гораздо более логичен вариант, когда каждая подструктура конфига лежит в своем пакете, а в пакет общего конфига всё это импортируется:
package config

type Config struct {
   Database database.Config
   Kafka    kafka.Config
}
Однако, тогда в подструктурах могут быть теги от либы, считывания конфига, что делает хоть и неявную, но все же зависимость от либы конфига:
package database

type Config struct {
   User     string `yaml:"user"`
   Password string `env:"password"`
}
и если тэг для user можно иногда убрать (т.к. user считается неявно в некоторых либах т.к. они под капотом используют mapstructure), то с env так сделать не выйдет. Из-за отсутствия этой возможности и некоторых других я написал свою либу для конфига. Она по большей части основывается на koanf - имхо лучшей либе для конфига в go (у нее прекрасный интерфейс, намного более красивый, чем у viper) и добавляет некоторые фичи. Чего не хватало в существующих: - Возможности задать название env'а не в тегах структуры, а в самом файле конфига {"env": "DB_PASSWORD"} - Ошибки, если поле в структуре есть, а в ямле отсутствует (чтобы забытое значение не превратилось в zero-value) - Ошибки, если поле в ямле есть, а в структуре отсутствует (чтобы мусора в ямле не было) - Опционального считывания. Если поле в структуре - указатель, то ошибки не будет при отсутствии его в ямле Также либа поддерживает всё, что поддерживает сам koanf https://github.com/rostislaved/cleanconfig

Купил эту мышку Что было неочевидно на рендерах - вокруг резинки под большим пальцем есть промежуток. Сложно придумать более
Купил эту мышку Что было неочевидно на рендерах - вокруг резинки под большим пальцем есть промежуток. Сложно придумать более удобное место для грязи. Непонятно, зачем так сделали... А в целом мышка понравилась. Из побочных плюсов type-c коннектора - его можно вставлять в разъем для зарядки мышки, чтобы не терялся при переноске. Удобно т.к. специального отсека для него никогда не было. Ну и материал выглядит более живучим, чем резина в прошлой модели

OpenAPI 101 https://github.com/rostislaved/open-api-101 Репозиторий с примерами кода на основе трёх самых популярных библиоте
OpenAPI 101 https://github.com/rostislaved/open-api-101 Репозиторий с примерами кода на основе трёх самых популярных библиотек для работы с OpenAPI: - go-swagger - oapi-codegen - ogen Зачем? Документация у разных библиотек разная и часто довольно неочевидная, из-за чего сложно сделать даже самый базовый пример, который работает. В этом репозитории представлены как раз такие примеры.

golangci-lint config v1.1.0 (for golangci-lint v2.6.0) https://github.com/rostislaved/golangci-lint-config Конфигурация golan
golangci-lint config v1.1.0 (for golangci-lint v2.6.0) https://github.com/rostislaved/golangci-lint-config Конфигурация golangci-lint, в которой включено как можно больше проверок. Зачем? - В репозитории golangci-lint нет конфига с максимальным числом включенных линтеров, а включение всех линтеров не включает все правила внутри каждого линтера (например gocritic и revive). - Более того, каждый линтер кроме отдельно включаемых правил имеет "настройки", которые тоже по умолчанию могут быть выключены. Что в конфиге - В этом конфиге по возможности включено максимальное число линтеров и правил линтеров - Для некоторых линтеров включены дополнительные настройки, например:
# report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`.
# Such cases aren't reported by default.
# Default: false
check-blank: true
- всё же это opinionated конфиг и некоторые линтеры в нем отключены. Там где это сделано есть комментарий о причине отключения и можно легко его включить. P.S. К сожалению мейнтейнер golangci-lint не хочет добавлять пример конфига со всеми дефолтными настройками и предлагает самостоятельно следить за changlog'ом, чтобы не пропустить новые правила и настройки

hyperfine https://github.com/sharkdp/hyperfine Нашел приятную утилиту - hyperfine (rust). Она нужна чтобы бенчмаркать разные команды в терминале. Измерим, сколько выполняется sleep 0.1:
 > hyperfine "sleep 0.1"                         
Benchmark 1: sleep 0.1
  Time (mean ± σ):     102.0 ms ±   1.1 ms    [User: 0.6 ms, System: 1.4 ms]
  Range (min … max):   100.5 ms … 104.3 ms    29 runs
Выполняется 100 мс (кто бы мог подумать). Также можно запустить несколько команд и тогда hyperfine еще покажет насколько самая быстрая была быстрее других:
 > hyperfine "sleep 0.1" "sleep 1.1" "sleep 1.2" 
Benchmark 1: sleep 0.1
  Time (mean ± σ):     101.9 ms ±   1.1 ms    [User: 0.5 ms, System: 1.4 ms]
  Range (min … max):   100.2 ms … 103.4 ms    29 runs
 
Benchmark 2: sleep 1.1
  Time (mean ± σ):      1.102 s ±  0.001 s    [User: 0.001 s, System: 0.001 s]
  Range (min … max):    1.100 s …  1.103 s    10 runs
 
Benchmark 3: sleep 1.2
  Time (mean ± σ):      1.201 s ±  0.001 s    [User: 0.001 s, System: 0.001 s]
  Range (min … max):    1.200 s …  1.203 s    10 runs
 
Summary
  sleep 0.1 ran
   10.81 ± 0.12 times faster than sleep 1.1
   11.79 ± 0.13 times faster than sleep 1.2

#книги Chris Sanders - Practical Packet Analysis 18.08.2025 - 31.10.2025 Первое, что хочу сказать, что у этой книги название
#книги Chris Sanders - Practical Packet Analysis 18.08.2025 - 31.10.2025 Первое, что хочу сказать, что у этой книги название вводящее в заблуждение. Может показаться, что книга по каким-то глубоким исследованиям пакетов, но фактически это книга по сетям с акцентом на то, чтобы руками в wireshark'е смотреть, как происходят различные процессы вроде tcp handshak'ов, retransmission'ов, запросов http, ответов итд итп. Это прекраснейшная книга и на данный момент это мой топ 1 кандидат в "первую книгу по сетям". Мой опыт довольно травмирующий, начинал с ютуба с курса Созыкина (для меня сложно представить более бесполезный способ получения информации), потом Таненбаум (не начинайте изучать что-либо с больших книг), потом Michael W. Lucas - Networking for Systems Administrators (в целом норм, но не как первая) и вот сейчас эта книга. Ну и конечно параллельно с работой все происходило, хотя я всё же разработчик, а не сетевой инженер. А еще заглядывал в "сети для самых маленьких" и не понял, кто подразумевается по маленьким.. Но явно не новичок в сетях По главам так: 1-2: вводные про то, как и где эти пакеты получать - какой-то закос под хакерство что ли или попытка оправдать название 3-5: wireshark 6: command line: tcpdump, tshark 7-9: tcp\ip стек - заголовки и основные механизмы их работы все с примерами в wireshark'е как все происходит. Отличные главы и максимально полезные. 10-12: Всякие кейсы в wiresharke: почему не открывается сайт, почему медленный интернет итд. Тоже отличные главы. По сути практика знаний из глав 7-9 Из минусов: - Книга 2017 года. В целом это практически не чувствуется: пару ссылок устарело, устройство в примере wifi адаптера старенькое, поколения wifi перечислены до 802.11n (wifi 4, а сейчас уже 7 начинает продаваться). Но это не влияет ни на что - Книга с акцентом на windows. Тоже особо ни на что не влияет, но некоторый софт, который упоминается - для винды. В остальном отличная книга! Рекомендую

Месяц как я слез с иглы подписки на телеграм премиум и обнаружил, что вот это - максимальный размер поста с картинкой. А как
Месяц как я слез с иглы подписки на телеграм премиум и обнаружил, что вот это - максимальный размер поста с картинкой. А как постить?
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc et enim luctus, condimentum arcu ut, volutpat neque. Donec et metus ante. Integer ipsum elit, ultrices et dignissim non, posuere at quam. In auctor ipsum eu eros fringilla, quis fringilla enim fringilla. Suspendisse eget lectus sed nibh cursus commodo non in odio. Etiam urna ligula, luctus eget est quis, vehicula pharetra lectus. Sed dictum elit massa. Integer gravida fringilla dolor, vel feugiat nunc congue fringilla. Suspendisse varius odio eu pellentesque euismod. Nam vel mauris vel urna egestas pellentesque eget vitae lacus. Phasellus fermentum lacinia est non vestibulum. Donec id ornare lectus. Integer purus orci, eleifend a mi commodo, blandit ultrices odio. Sed pretium tortor dui, a auctor enim pellentesque nec. Nunc nulla felis, mollis sit amet convallis eu, dignissim est. Pellentesque hendrerit eleifend.

Мой любимый линтер - это wsl, который заставляет вставлять пустые строки между разными логическими блоками. Но теперь у него появился конкурент😈 noinlineerr Disallows inline error handling: if err := ...; err != nil {

Потребление памяти при декодинге json стандартной либой Создал два файла с json'ами по 65 МБ каждый В первом слайс сложной структуры (~ 70полей разных типов) Во втором слайс структуры из одного интового поля Парсил их в коде и смотрел потребление памяти. - Значения для второго файла - в скобках - Alloc - размер всех объектов в памяти программы - Sys - память зарезервированная у ОС 1. json.NewDecoder Alloc х4.6 (x3) от размера файла
func func1() {
  printMemStats() // Alloc/Sys: 0/7 MiB (0/7 MiB)

  f, err := os.Open("file.json")
  if err != nil {
    panic(err)
  }

  printMemStats() // Alloc/Sys: 0/7 MiB (0/7 MiB)

  var dto Dto

  err = json.NewDecoder(f).Decode(&dto)
  if err != nil {
    panic(err)
  }

  printMemStats() // Alloc/Sys: 304/317 MiB (197/401 MiB)
}
2. json.Unmarshal Alloc x2.2 (x2) от размера файла
func func2() {
  printMemStats() // Alloc/Sys: 0/7 MiB (0/7 MiB)

  b, err := os.ReadFile("file.json")
  if err != nil {
    panic(err)
  }

  printMemStats() // Alloc/Sys: 65/75 MiB (65/76 MiB)

  var dto Dto

  err = json.Unmarshal(b, &dto)
  if err != nil {
    panic(err)
  }

  printMemStats() // Alloc/Sys: 145/191 MiB (134/232 MiB)
}
3. json.Unmarshal + runtime.GC() Alloc x2.2 (x2) от размера файла
func func3() {
  printMemStats() // Alloc/Sys: 0/7 MiB (0/7 MiB)

  b, err := os.ReadFile("file.json")
  if err != nil {
    panic(err)
  }

  printMemStats() // Alloc/Sys: 65/76 MiB (65/76 MiB)

  var dto Dto

  err = json.Unmarshal(b, &dto)
  if err != nil {
    panic(err)
  }

  printMemStats() // Alloc/Sys: 145/190 MiB (145/190 MiB)

  b = nil
  runtime.GC()

  printMemStats() // Alloc/Sys: 47/191 MiB (38/232 MiB)

  fmt.Println(dto.Objects[0].Field)
}
go1.25.3 Без вывода, просто значения для понимания порядка величин

Чистка ноута Во второй раз поставил: node_exporter prometheus grafana чтобы посмотреть, как поможет чистка ноута и замена тер
Чистка ноута Во второй раз поставил: node_exporter prometheus grafana чтобы посмотреть, как поможет чистка ноута и замена термопасты. Судя по графику разница где-то 7 градусов. Хотя, возможно, еще повлияла сама перезагрузка: я редко перезагружаю, может какие процессы фоновые вносили свой вклад. Поэтому построил дополнительную метрику T/cpu. Возможно странная, но вроде логичная. Разница получилась 9%. Грустно всё не у apple.

Книги по Concurrency в Golang 📕 📚Katherine Cox-Buday - Concurrency in Go (2017) С давних пор по сути единственная книга на
Книги по Concurrency в Golang 📕 📚Katherine Cox-Buday - Concurrency in Go (2017) С давних пор по сути единственная книга на эту тему. Рейтинг 4.5, что в целом хорошо, но не могу сказать, что понравилась. Примеры можно было написать проще. 📚 James Cutajar - Learn Concurrent Programming with Go (2024) Хорошее издательство - Manning. Пока 8 отзывов на амазоне, все пятерки. Возлагаю на нее надежды. 📚 Burak Serdar - Effective Concurrency in Go (2023) Не читал. 8 отзывов, почти все положительные. Но издательство Packt - оно не часто публикует хорошие книги. 📚 Christian Maurer - Nonsequential and Distributed Programming with Go (2021) Начинал читать, но бросил. Сильно академическая, как будто читаешь чью-то диссертацию с примерами на го.

Парочка книг, о которых писал в недавнем посте 😁
+1
Парочка книг, о которых писал в недавнем посте 😁

Clean Code Увидел, что появилась новая книга со словом Clean Code: Clean Code Cookbook. Recipes to Improve the Design and Qua
Clean Code Увидел, что появилась новая книга со словом Clean Code: Clean Code Cookbook. Recipes to Improve the Design and Quality of your Code Сразу заглянул в нее и меня привлекла глава с названием Readability, Performance, or Both, где был описан шикарный подход, которого я сам придерживаюсь и всем советую:
For performance mission-critical solutions the best strategy is to write clean code, cover it with tests, and then improve the bottlenecks using Pareto rules.
Для критически важных по производительности решений лучшая стратегия - писать чистый код, покрывать его тестами, а затем улучшать узкие места следуя закону Парето.

Вот табличка с книгами и рейтингом. Порядок книг - тот в котором, можно читать (или пропускать, если рейтинг низкий).
| Название                                                   | Goodreads | Amazon |
| ---------------------------------------------------------- | --------- | ------ |
| Jon Bodner - Learning Go                                   | 4.47      | 4.6    |
| Kernighan Donovan - Go Programming Language                | 4.44      | 4.7    |
| Teiva Harsanyi - 100 Go Mistakes and How to Avoid Them     | 4.64      | 4.7    |
| Alex Edwards - Let's Go                                    | 4.56      | -      |
| Alex Edwards - Let's Go Further!                           | 4.76      | -      |
| Concurrency in Go - Katherine Cox-buday                    | 4.26      | 4.5    |
| Cloud Native Go - Matthew A. Titmus                        | 4.24      | 4.5    |
| Pro Go                                                     | 4.29      | 4.2    |
| Mihalis Tsoukalos - Mastering go (го для профи) 3е издание | 3.84      | 4.1    |

Вот табличка с книгами и рейтингом. Порядок книг - тот в котором, можно читать (или пропускать, если рейтинг низкий).
| Название                                                   | Goodreads | Amazon |
| ---------------------------------------------------------- | --------- | ------ |
| Jon Bodner - Learning Go                                   | 4.47      | 4.6    |
| Kernighan Donovan - Go Programming Language                | 4.44      | 4.7    |
| Teiva Harsanyi - 100 Go Mistakes and How to Avoid Them     | 4.64      | 4.7    |
| Alex Edwards - Let's Go                                    | 4.56      | -      |
| Alex Edwards - Let's Go Further!                           | 4.76      | -      |
| Concurrency in Go - Katherine Cox-buday                    | 4.26      | 4.5    |
| Cloud Native Go - Matthew A. Titmus                        | 4.24      | 4.5    |
| Pro Go                                                     | 4.29      | 4.2    |
| Mihalis Tsoukalos - Mastering go (го для профи) 3е издание | 3.84      | 4.1    |

Книги Golang 📕 Часто вижу вопрос в чатах про то, какие книги по Go можно читать. Т.к. я стараюсь книги читать и еще предвари
Книги Golang 📕 Часто вижу вопрос в чатах про то, какие книги по Go можно читать. Т.к. я стараюсь книги читать и еще предварительно искать хорошие, то перечислю книги, которые я (и не только я) считаю лучшими. В скобках буду указывать рейтинг книг на сайтах (Goodreads/Amazon). Две отличные книги про Go - это: 📚 Kernighan Donovan - Go Programming Language (4.44/4.7) 📚 Jon Bodner - Learning Go (4.47/4.6) Первая считается классикой. Хорошая книга, знаменитые авторы, но лично мне понравилась больше вторая, она показалась более практичной, описывала разные best practices и ее было приятно читать. Книги, которые я считаю хорошими, но которые сам еще не прочитал: 📚 Teiva Harsanyi - 100 Go Mistakes and How to Avoid Them (4.64/4.7) 📚 Alex Edwards - Let's Go (4.56/-) 📚 Alex Edwards - Let's Go Further! (4.76/-) Эти пять книг имхо - лучшее, что есть. Кратко пройдусь по другим. 📚 Concurrency in Go - Katherine Cox-buday (4.26/4.5) - мне не очень понравилась, имхо примеры можно было написать проще. Но кроме этой книги по Concurrency в Go еще нет ничего вменяемого. 📚 Cloud Native Go - Matthew A. Titmus (4.24/4.5) - В названии этой книги есть слово "Go", но я бы не сказал, что это книга про Go. Она больше про идеи облачных приложений с примерами на языке Go. Сама книга не очень глубокая, но довольно неплохая. 📚 Mihalis Tsoukalos - Mastering go (3.84/4.1) . Уж не знаю, почему эта книга обладает такой популярностью, возможно, потому что ее русское название это "Го для профи", но ее я советовать не могу. Я ее не читал, но рейтинг очень низкий и обычно такие книги читать неприятно.

The piece of advice from Sam Altman
The piece of advice that people later say they wish they had listened to um is that it is very easy to get sucked into a path in life and you know you can do things like say oh i want to start a startup someday or oh i want to be a you know AI researcher someday but first i'm going to go do this other job to like you know make money and gain experience and whatever and it's so easy to like get sucked into a path where you spend your entire life doing something that is not really what you want to do um that's probably the piece of advice that i have given people that they have most often come to me like five years later and said i really wish i had listened to that thank you sure
https://www.youtube.com/shorts/sKJgGPwO4N4