myStack
876 subscribers
755 photos
15 videos
24 files
305 links
Меня зовут Ростислав и я разработчик.

Это мой личный блог.

Я пишу на Go, читаю книги про технологии и пишу об этих и других вещах сюда.


Книги:
https://bit.ly/rostislav-books

Личка:
https://t.me/Rostislaved

Сайт:
Rostislav.me
Download Telegram
#книги
Michael W. Lucas - Networking for Systems Administrators
28.07.2025 - 18.08.2025

Всё еще ищу хорошую книгу про сети, которая будет состоять не на 100% из теории, как Таненбаум. Эта книга уже довольно практическая и не на 1000 страниц, как популярно в книгах по сетям, а всего на 180. Однако идеальной для первой книги тоже назвать сложно, какие-то базовые вещи не рассказываются, но тем не менее она неплоха.

В начале было немного более скучно, а потом стало интереснее. Возможно из-за того, что чем ближе к концу книги, тем выше по уровням сетевой модели поднимались. То есть Network и Transport уровни были интереснее мне, чем Data Link.

Понравилось, что есть примеры команд для терминала, чтобы можно было что-то самому посмотреть.
Не понравилось, что эти команды были относительно устаревшими: есть два популярных пакета сетевых утилит - net-tools (ifconfig, netstat, route, arp, hostname) и iproute2 (ip, ss, nstat) и второй более современный, а в книге в основном про первый была речь. Но утилиты в целом похожие и найти альтернативу из второго пакета не проблема.

Я наверное уже не верю, что существует книга, которую я могу советовать, как первую по сетям. Это не такая, но читать эту было далеко не бесполезно, ибо я что-то забыл, что-то не знал, и читая ее в голове появлялись какие-то ассоциации, я их гуглил и уточнял понимание. В первый раз кстати так плотно говорил с ChatGPT в Voice Mod, удобно вышло. В общем, чем больше что-то про какую-то тему через себя пропускаешь, даже знакомые вещи, просто в других формулировках, тем больше пазл складывается.
61
TIL Github reactions sort

В гитхабе можно сортировать PR по числу реакций. Удобно
8👍1🔥1
KYAML

Kubernetes в последней версии v1.34 добавляет поддержку нового формата KYAML, который является более строгим подмножеством YAML

Его цель - убрать неоднозначности и сделать формат читаемым и безопасным.

Пример YAML:
Traditional YAML:

apiVersion: v1
kind: Service
metadata:
name: my-service
labels:
app: web
spec:
selector:
app: web
ports:
- port: 80
targetPort: 8080


Эквивалентный KYAML:
---
{
apiVersion: "v1",
kind: "Service",
metadata: {
name: "my-service",
labels: {
app: "web",
},
},
spec: {
selector: {
app: "web",
},
ports: [{
port: 80,
targetPort: 8080,
}],
},
}


Проблемы YAML:
- Важны пробелы и отступы;
- Строки без кавычек, которые иногда неожиданно превращаются в числа или булевы значения;
- Разные варианты записи одного и того же объекта.


KYAML вводит строгие правила:
- все строки всегда в двойных кавычках;
- ключи без кавычек, кроме неоднозначных случаев;
- map-структуры всегда в {};
- списки всегда в [].


На вид KYAML напоминает JSON, но при этом:
- поддерживает комментарии;
- разрешает завершающие запятые;
- не требует кавычек у ключей.


KYAML — это подмножество YAML. Любой YAML-парсер сможет разобрать KYAML-файл, а любой KYAML остаётся валидным YAML.

source
🥴145👍1🤔1🤣1
CamelHumps

В JetBrains IDE можно установить эту настройку:
Preferences → Editor → General → Smart Keys → Use "CamelHumps" words


И тогда нажатие стрелок с зажатым ctrl будет прыгать не до следующего пробела, а также до следующего слова в названии названном через CamelCase

Из нюансов: двойной клик теперь выделяет не всё название, а только часть. Но это можно отключить убрав галочку с настройки:
Honor "CamelHumps" words settings when selecting on double click

(Она находится под Use "CamelHumps" words)
15🔥43
YAML - это надмножество JSON

То есть любой валидный JSON - это также валидный YAML

The YAML 1.2 specification was published in 2009. Its primary focus was making YAML a strict superset of JSON.

(c) spec
🤯15🤣1
Читай чтобы забывать

Итак, я читаю, чтобы забывать. Когда начинаю читать, я заранее готов потерять 98% того, что передо мной. От большинства текстов я хочу только двух вещей: во-первых, чтобы они слегка изменяли мое мышление, добавляя небольшоей кусочек к более точной модели мира; во-вторых, чтобы вытащить несколько ключевых идей, которые я, возможно, использую позже в своих текстах.

(c) Mo's blog
👍12101🖕1
Закончился премиум в телеге и при попытке вступить в очередной канал получаю вот это. Пришлось почистить группы и каналы.

Пока для меня были полезны только следующие фичи:
- Отсутствие рекламы
- Увеличенные лимиты на комьюнити
- Три реакции на сообщение

Не очень то важные, если подумать. Отсутствие рекламы, наверное, самое нужное.
👍82
Вышла MX Master 4

Из нового:
- Haptic feedback: Отдача для кнопки под большим пальцем и меню "активных действий" (для меня бесполезная фича)
- Новый материал: текстурированный силикон вместо резины (лучше против износа и загрязнения)
- USB type C Bolt Receiver (наконец-то ушли от USB type A)
- Кнопки во всю площадь и нет отстровка вокруг колесика (меньше пачкаться будет из-за меньшего числа граней. На последней картинке сравнение c Master 3)

Меня смущает область для большого пальца. Как бы она не стала меньше. И также, она теперь - отдельный островок из другого материала, то есть опять же больше пачкаться будет - неясно, зачем так сделали. В остальном вроде отличный апгрейд, надеюсь в реальности так и окажется

Цена $120
link
162🔥1
Чистка ноута

Во второй раз поставил:
node_exporter
prometheus
grafana

чтобы посмотреть, как поможет чистка ноута и замена термопасты.

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

Грустно всё не у apple.
👀4🔥111
Потребление памяти при декодинге 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

Без вывода, просто значения для понимания порядка величин
3
Мой любимый линтер - это wsl, который заставляет вставлять пустые строки между разными логическими блоками. Но теперь у него появился конкурент😈

noinlineerr

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

А как постить?

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.
2
#книги
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. Тоже особо ни на что не влияет, но некоторый софт, который упоминается - для винды.

В остальном отличная книга! Рекомендую
👍4🔥2111
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
5👍32
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'ом, чтобы не пропустить новые правила и настройки
541