🇺🇦 Go for two :)
1.17K subscribers
22 photos
3 files
188 links
Telegram channel about tricks and engineering practices in the Go programming language over a cup of coffee ☕️.

author: @a_soldatenko
personal blog: https://asoldatenko.org

#golang #go #kubernetes #debugging
Download Telegram
Сегодня зарелизился Delve v1.6.0

Из важных изменений:
- Go 1.16 support, Apple M1 support, syntax highlighting for code blocks, and more!


dlv version
Delve Debugger
Version: 1.6.0
Build: 75485427957fba167a6eaca76b1ee9549d62916f

Полный CHANGELOG -> https://github.com/go-delve/delve/blob/master/CHANGELOG.md#160-2021-01-28
January 28, 2021
Automatically Detecting and Fixing Concurrency Bugs in Go
Software Systems

https://songlh.github.io/paper/gcatch.pdf

Также у автора есть интересный репозиторий https://github.com/system-pclub/go-concurrency-bugs

Ну и список багов

https://docs.google.com/spreadsheets/d/1mDxB6IRxrTodF9CrmpUu72E6673y5s9BkjKuTjtx1qc/edit#gid=0

подсмотрел у https://twitter.com/dgryski
March 16, 2021
golang deep comparison for testing:

https://github.com/maxatome/go-testdeep

import (
"testing"
"time"
)

func TestCreateRecord(t *testing.T) {
before := time.Now().Truncate(time.Second)
record, err := CreateRecord()

if err != nil {
t.Errorf("An error occurred: %s", err)
} else {
expected := Record{Name: "Bob", Age: 23}

if record.Id == 0 {
t.Error("Id probably not initialized")
}
if before.After(record.CreatedAt) ||
time.Now().Before(record.CreatedAt) {
t.Errorf("CreatedAt field not expected: %s", record.CreatedAt)
}
if record.Name != expected.Name {
t.Errorf("Name field differs, got=%s, expected=%s",
record.Name, expected.Name)
}
if record.Age != expected.Age {
t.Errorf("Age field differs, got=%s, expected=%s",
record.Age, expected.Age)
}
}
}

можно переписать в:
import (
"testing"
"time"

"github.com/maxatome/go-testdeep/td"
)

func TestCreateRecord(t *testing.T) {
before := time.Now().Truncate(time.Second)
record, err := CreateRecord()

if td.CmpNoError(t, err) {
td.Cmp(t, record.Id, td.NotZero(), "Id initialized")
td.Cmp(t, record.Name, "Bob")
td.Cmp(t, record.Age, 23)
td.Cmp(t, record.CreatedAt, td.Between(before, time.Now()))
}
}


P.S. в проде не юзал но выглядит аккуратно, особенно когда происходит расхождение с ожидаемым результатом.
March 16, 2021
A Golang library for generating high-entropy random passwords similar to 1Password or LastPass.

Example passwords this library may generate:
0N[k9PhDqmmfaO`p_XHjVv`HTq|zsH4XiH8umjg9JAGJ#\Qm6lZ,28XF4{X?3sHj
7@90|0H7!4p\,c<!32:)0.9N
UlYuRtgqyWEivlXnLeBpZvIQ
Q795Im1VR5h363s48oZGaLDa
wpvbxlsc


https://github.com/sethvargo/go-password

Из интересного сразу идет моком для тестов:
// func MyFunc(p *password.Generator)
func MyFunc(p password.PasswordGenerator) {
// ...
}

func TestMyFunc(t *testing.T) {
gen := password.NewMockGenerator("canned-response", false)
MyFunc(gen)
}
March 18, 2021
Docker Security Cheat Sheet:

RULE #0 - Keep Host and Docker up to date
RULE #1 - Do not expose the Docker daemon socket (even to the containers)
RULE #2 - Set a user
RULE #3 - Limit capabilities (Grant only specific capabilities, needed by a container)
RULE #4 - Add –no-new-privileges flag
RULE #5 - Disable inter-container communication (--icc=false)
RULE #6 - Use Linux Security Module (seccomp, AppArmor, or SELinux)
RULE #7 - Limit resources (memory, CPU, file descriptors, processes, restarts)
RULE #8 - Set filesystem and volumes to read-only
RULE #9 - Use static analysis tools
RULE #10 - Set the logging level to at least INFO
Rule #11 - Lint the Dockerfile at build time

more details about each rule: https://cheatsheetseries.owasp.org/cheatsheets/Docker_Security_Cheat_Sheet.html
Source: https://github.com/OWASP/CheatSheetSeries
March 21, 2021
March 25, 2021
Kubernetes deployment strategies

Коротко о том какие в k8s есть стратегии деплоя с примерами:

https://github.com/ContainerSolutions/k8s-deployment-strategies

tl;dr:
* recreate: terminate the old version and release the new one
* ramped: release a new version on a rolling update fashion, one after the other
* blue/green: release a new version alongside the old version then switch traffic
* canary: release a new version to a subset of users, then proceed to a full rollout
* a/b testing: release a new version to a subset of users in a precise way (HTTP headers, cookie, weight, etc.). This doesn’t come out of the box with Kubernetes, it imply extra work to setup a smarter loadbalancing system (Istio, Linkerd, Traeffik, custom nginx/haproxy, etc).
* shadow: release a new version alongside the old version. Incoming traffic is mirrored to the new version and doesn't impact the response.
March 25, 2021
23 апреля приглашаем всех гоферов на GopherCon Russia 2021: online, бесплатно, лучшие доклады, стенды партнёров, горячие споры в чатах! Среди спикеров этого года Mat Ryer, Aaron Schlesinger и Felix Geisendörfer. А для тех, кто хочет не только пообщаться и послушать доклады, но и прокачать свои навыки на практике, подготовили 4 воркшопа: Kubernetes-операторы, линтеры с ruleguard, профилирование и оптимизация, Fuzz и Property-Based тесты. Все подробности регистрация на https://www.gophercon-russia.ru/
April 12, 2021
image_2021-05-13_20-49-54.png
150.1 KB
May 13, 2021
How to Make Your Code Reviewer Fall in Love with You:

1. Review your own code first
2. Write a clear change list description
3. Automate the easy stuff
4. Answer questions with the code itself
5. Narrowly scope changes
6. Separate functional and non-functional changes
7. Break up large change lists
8. Respond graciously to critiques
9. Be patient when your reviewer is wrong
10. Communicate your responses explicitly
11. Artfully solicit missing information
12. Award all ties to your reviewer
13. Minimize lag between rounds of review

https://mtlynch.io/code-review-love/
September 3, 2021
September 8, 2021
September 9, 2021
September 17, 2021