linux память



сколько оперативки пожирает 
ps -eo pid,comm,%mem,%cpu --sort=-%mem | head -n 20

ps aux --sort=-%mem | awk 'NR==1 || $4>0 {print $0}'



сколько свободно
free -h


отключить своп
sudo swapoff -a


диск, кто читает

pidstat -d 1 10

iostat -x 1 10

скорость диска
sudo hdparm -Tt /dev/sda 

Тестирование HTTP API

Hypert — это библиотека Go с открытым исходным кодом, которая упрощает тестирование клиентов HTTP API.

Она предоставляет удобный способ создания и воспроизведения HTTP запросов, и значительно упрощает создание надежных тестов для ваших клиентов API.

▪Запись и воспроизведение тестов

▪Автоматическое удаления конфиденциальной информации

▪Проверка запросов для обеспечения их целостности

▪Полная интеграция с GO протоколом http.Client

▪Легко расширяемые и настраиваемые опции

go get github.com/areknoster/hypert

Проблема XY (Ошибка молотка)

Проблема XY — это проблема, возникающая при обращении в службу поддержки и в других похожих ситуациях, когда обратившийся за помощью человек ставит не проблему X напрямую, а спрашивает решение проблемы Y, которая по его мнению позволит решить проблему X. Тем не менее, решение проблемы Y часто не решает проблему X, или является не самым удачным для неё решением. При этом человек, пытающийся помочь, может испытывать проблемы коммуникации и/или предлагать не самые оптимальные решения.

Проблема XY обычно встречается в среде технической поддержки или обслуживания клиентов, где конечный пользователь пытается решить проблему самостоятельно и неправильно понимает реальную природу проблемы, полагая, что их реальная проблема X уже решена, за исключением некоторых мелких деталей Y в их решении. Неспособность обслуживающего персонала решить реальную проблему или понять природу запроса может привести к разочарованию конечного пользователя. Ситуация может проясниться, если конечный пользователь спросит о какой-то «бессмысленной» детали, которая не связана с полезной конечной целью. Решение для обслуживающего персонала состоит в том, чтобы задавать наводящие вопросы: зачем нужна эта информация, чтобы выявить корень проблемы и перенаправить конечного пользователя с непродуктивного пути исследования.

Log Requests and Responses in Gin!



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
}