https://devcrowd.ru/go-2023/research/
Проблема XY — это проблема, возникающая при обращении в службу поддержки и в других похожих ситуациях, когда обратившийся за помощью человек ставит не проблему X напрямую, а спрашивает решение проблемы Y, которая по его мнению позволит решить проблему X. Тем не менее, решение проблемы Y часто не решает проблему X, или является не самым удачным для неё решением. При этом человек, пытающийся помочь, может испытывать проблемы коммуникации и/или предлагать не самые оптимальные решения.
Проблема XY обычно встречается в среде технической поддержки или обслуживания клиентов, где конечный пользователь пытается решить проблему самостоятельно и неправильно понимает реальную природу проблемы, полагая, что их реальная проблема X уже решена, за исключением некоторых мелких деталей Y в их решении. Неспособность обслуживающего персонала решить реальную проблему или понять природу запроса может привести к разочарованию конечного пользователя. Ситуация может проясниться, если конечный пользователь спросит о какой-то «бессмысленной» детали, которая не связана с полезной конечной целью. Решение для обслуживающего персонала состоит в том, чтобы задавать наводящие вопросы: зачем нужна эта информация, чтобы выявить корень проблемы и перенаправить конечного пользователя с непродуктивного пути исследования.
package main import "github.com/gin-gonic/gin" func RequestLogger() gin.HandlerFunc { return func(c *gin.Context) { t := time.Now() c.Next() latency := time.Since(t) fmt.Printf("%s %s %s %s\n", c.Request.Method, c.Request.RequestURI, c.Request.Proto, latency, ) } } func ResponseLogger() gin.HandlerFunc { return func(c *gin.Context) { c.Writer.Header().Set("X-Content-Type-Options", "nosniff") c.Next() fmt.Printf("%d %s %s\n", c.Writer.Status(), c.Request.Method, c.Request.RequestURI, ) } } func main() { r := gin.Default() // Add logging middleware r.Use(RequestLogger()) r.Use(ResponseLogger()) r.GET("/", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "Hello, World!", }) }) r.Run() // listen and serve on 0.0.0.0:8080 }
services: web: build: . ports: - "80:80" depends_on: db: condition: service_healthy restart: always db: image: postgres healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5
https://www.youtube.com/watch?v=36Hm1DEl82M
https://threedots.tech/post/basic-cqrs-in-go/
Isn’t CQRS one of these C#/Java/über enterprise patterns that are hard to implement, and make a big mess in the code? A lot of books, presentations, and articles describe CQRS as a very complicated pattern. But it is not the case.
https://www.conventionalcommits.org/en/v1.0.0/#summary
The Conventional Commits specification is a lightweight convention on top of commit messages. It provides an easy set of rules for creating an explicit commit history; which makes it easier to write automated tools on top of. This convention dovetails with SemVer, by describing the features, fixes, and breaking changes made in commit messages
ping
brew install gping
https://github.com/orf/gping
Данный репозиторий представляет собой наглядную шпаргалку по основным темам в области Backend-разработки. Весь материал разбит на темы и подтемы. Структура материала состоит из трех частей:
https://github.com/cheatsnake/backend-cheats
https://devcoops.com/block-visitors-by-country-in-nginx/
https://mailfud.org/geoip-legacy/
https://ru.stackoverflow.com/questions/1378257/%D0%9A%D0%B0%D0%BA-%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B8%D1%82%D1%8C-geoip-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C-%D0%B2-docker-%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D0%B5-nginx
http { ... geoip_country /usr/share/GeoIP/GeoIP.dat; map $geoip_country_code $allowed_country { default no; US yes; } } server { ... if $(allowed_country = no) { return 403; } }