🇺🇦 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
September 10, 2019
September 24, 2019
September 26, 2019
Note 30 # Go time podcast

Давно хотел порекомендовать подкаст, который слушаю постоянно: Go Time - очень интересный Go подкаст на англ языке - и вчера вышел юбилейный эпизод #100
в котором принимали участие Rob Pike и Robert Griesemer 🎉🎉🎉

Обсуждали историю Go, текущую работу и будущее 🚀
P.S. какие подкасты слушаете вы? Жаль что больше не выходят эпизоды https://golangshow.com/ :(

Enjoy: https://changelog.com/gotime/100
September 26, 2019
Note #31 go run и exit code

Вчера в твиттере увидел как Джонни Бурсиквот задает вопрос[1]: почему go run всегда возвращает exit code 1:
$ cat main.go
package main

import "os"

func main() {
os.Exit(199)
}
$ go run main.go
exit status 199
$ echo $?
1
А если собрать бинарник, а потом запустить то все будет ок:
go build main.go
./main
$ echo $?
199
Странно почему он не догадался сразу, go run - это 2 процесса и соответственно 2 exit кода, однако go run может вернуть только один exit код :)

Крутой коммент от Дэйва Чейни (перевод):
“Go run - это для игрушечных программ, серьезные программы нужно компилировать и запускать” :lol:

Вот часть исходника go run [3] “We ignore exit status.”:
// buildRunProgram is the action for running a binary that has already
// been compiled. We ignore exit status.
func buildRunProgram(b *work.Builder, a *work.Action) error {

}
Links:
[1] Твиттер thread https://twitter.com/jboursiquot/status/1177296876779057152
[2] Issue 2015 года на эту тему: https://github.com/golang/go/issues/13440
[3] https://github.com/golang/go/blob/master/src/cmd/go/internal/run/run.go#L146-L148
September 27, 2019
September 30, 2019
October 1, 2019
Note #34 Generate coverage badger in Go

Вчера нашел интересный проект https://github.com/jpoles1/gopherbadger, который позволяет генерировать картинку c процентом тестового покрытия и совместим с go test -cover для вашего go пакета и умеет встраиваться сразу в README.md.

P.S. также это можно сделать если у вас уже подключен
https://coveralls.io/ или https://codecov.io/
October 1, 2019
October 2, 2019
Note #36 Что нас ждет в Go 1.14?! 😎

Daniel Martí выложил слайды о том, что нас ждет в Go 1.14, по сути 1 слайд 1 issue 😁

Уже можно пощупать кое-что:
go get golang.org/dl/gotip


Слайды https://docs.google.com/presentation/d/1HfIwlVTmVWQk94OLKfTGvXpQxyp0U4ywG1u5j2tjiuE/edit#slide=id.g550f852d27_228_0
October 4, 2019
🇺🇦 Go for two :)
Note #35 GopherCon UK 2019 videos Опубликовали видео с GopherCon UK 2019 🎉🍾👀 https://www.youtube.com/playlist?list=PLDWZ5uzn69ezokLCB-nGgYInxL0uP1PeZ#gopherconuk Приятного просмотра! P.S. позже сделаю рейтинг (top10)
October 8, 2019
Note# 37 Что делать, если Go сервисы видны наружу в интернет?

Оказывается то, что мы давно привыкли прятать сервисы за nginx(и альтернативы), Filippo Valsorda(широко известный в узких кругах по своим контрибьюшинам в Go, особоенно в пакет crypto) в своей статье[1], давно эксперементирует над тем, чтобы окрывать сервисы наружу на чистом Go (net/http, crypto/tls):

- как добавить сертификаты?
- редирект http -> https
- http/2
- добавляем таймауты и TCPKeepAlive,
- логгирование и сбор метрики,
- и огромное кол-во секьрити и не только багофиксов

Так же по его словам это вполне реально уже с go 1.8. Статья хоть и конца 2018 года, остается актуальной и сегодня...

Links:
- https://blog.cloudflare.com/exposing-go-on-the-internet/
October 8, 2019
Note #38 Go time 102: Application design 📻🎤

В этому выпуске Kat Zień, Peter Bourgon и Ben Johnson обсуждают тему, которая затрагивает каждый Go проект: как лучше всего организовать проект.

Краткое содержание интересных идей из эпизода:

1) выбираем структуру проекта в зависимости от вашего приложения/контекста, полезно лишний раз обсуждать с коллегами
2) никогда не используем “Global state”
3) Используем io.Reader/io.Writer вместо os.Stdout/os.Stdin для того, чтобы передавать buffer в тестах, тем самым контролировать поток ввода/вывода и логирование.
4) tiny main abstraction
func main() {
if err := run(); err != nil {
fmt.FPrintf(os.Stderr, "%s\n", err)
os.Exit(1)
}
}
// dummy
func run() error {
return nil
}
5) Пишем только то, что нужно прямо сейчас.
6) Пишем код который легко удалить, а не тот который легко расширить. 🔪
7) Не следует писать код - лишь бы удовлетворить компилятор, помним: мы пишем код для людей.
8) Фокусируемся на happy path, если пользователь что-то покупает - самое главное это как можно быстрее вернуть результат об успешной транзакции, а не упасть из-за того что лого не подгрузилось или email не отправился.
9) Начинаем с кода который выполняется последовательно и только позже добавляем concurrency.

P.S. От себя добавлю, что очень часто просматриваю как организованы чужие проекты на github. Например недавно, пересмотрел как организованы такие консольные утилиты как (docker, kubectl, helm3, doctl и так далее), что очень часто помогает выбрать наиболее удачную структуру.

https://changelog.com/gotime/102
October 10, 2019
October 22, 2019
Note #40 gops - list of your go process currently running

Нашел отличный тул gops, которые показывает список Go процессов, которые сейчас запущены.

$ go get -u github.com/google/gops


С помощью gops легко посмотреть версию Go бинарника который сейчас запущен:
$ gops
64186 81994 gops go1.13 /Users/andrii/workspace/bin/gops
76 1 com.docker.vmnetd go1.12.7 /Library/PrivilegedHelperTools/com.docker.vmnetd
….

$ gops tree
├── 81994
│ └── 70280 (gops) {go1.13}
├── 1
│ ├── 76 (com.docker.vmnetd) {go1.12.7}
│ ├── 28657 (updater) {go1.13}
│ ├── 28669 (kbfs) {go1.13}
│ └── 28663 (keybase) {go1.13}
├── 5099
│ ├── 5106 (com.docker.backend) {go1.12.7}
│ └── 5104 (com.docker.driver.amd64-linux) {go1.12.7}
└── 5032

Больше примеров как обычно в README [1]

Links:
[1] https://github.com/google/gops
October 22, 2019
October 24, 2019
October 24, 2019
Note #43: Слайды моего доклада с Kyiv Go Meetup October 2019 🎃

В этом докладе я рассказываю как писать удобные для пользователя консольные комманды, которые легко тестировать.

Сcылка на слайды 👇
https://www.slideshare.net/ssuserb92f8d/building-robust-and-friendly-command-line-applications-in-go

Видео: 👇
https://youtu.be/4AdN5q_SSbs?t=21

References:
📹 justforfunc #5: Defining a Color Flag in Go
📹 justforfunc #32: CLI tools with Cobra
📹 GopherCon 2019: Carolyn Van Slyck - Design Command-Line Tools People Love
📖 The Go Programming Language by Alan A. A. Donovan, Brian W. Kernighan
📖 Go in Practice by Matt Butcher, Matt Farina

P.S. Вопросы можно задавать в личку или чатик.
October 30, 2019
November 5, 2019
November 5, 2019
Note #46: Методы оценки безопасности для проектов Go 👮‍♂️

Ребята который проводили аудит безопасности k8s этим летом, опубликовали интересную статью о методах оценки безопасности в Go проектах [1]:

В статье говорится о:
- Статическом анализе (gosec, go-vet, and staticcheck, ineffassign, errcheck), кстати, о gosec я писал недавно https://t.me/golang_for_two/70);
- динамическом анализе: фаззинг, property testing (leanovate/gopter)
- кратко о codecoverage ( от себя добавлю визуализация codecov с помощью coveralls/codecov.io очень помогает)
и еще много полезностей 👇

https://blog.trailofbits.com/2019/11/07/attacking-go-vr-ttps/
November 8, 2019