Latest Posts

Разработка HomeKit аксессуара на Golang

Разработка HomeKit аксессуара на Golang

https://github.com/brutella/hc — прекрасная библиотека для написания обработчиков своих аксессуаров по протоколу HomeKit.

Что предоставляет библиотека? Удобный интерфейс для объявления своего аксессуара и обработка сигналов с пульта управления Home App в ios. Давайте попробуем написать новый обработчик аксессуара и добавить его внутри домашней сети.

Простейшая реализация будет выглядеть как-то так:

Read more

2D игры на Golang c Ebiten. Введение

2D игры на Golang c Ebiten. Введение

Решил попробовать пописать простые 2D игры на Golang. Основная цель — развлечение и более углубленное понимание того как можно писать простые любительские 2D игры на Go.

В начале пути

Скорее всего это будет цикл небольших, но полезных статей для всех интересующихся 2D играми и Golang. Первое, что нам необходимо решить — каким инструментом мы будем пользоваться для разработки игры. Я остановился на довольно простом игровом фреймворке — Ebiten. Основная идея библиотеки — все что есть это просто изображение. Порядок, позиция, угол наклона и масштаб зависит от вашей игровой логики.

Read more

Скрипт проверки GitHub rate limit

Скрипт проверки GitHub rate limit

GitHub API имеет лимиты на запросы в час — 12 500 максимум и 5000 на одного пользователя. В некоторых случаях количество лимитов недостаточно и вам необходимо знать текущий баланс кредитов.

Для проверки таких «кредитов» на API запросы напишем небольшой bash скрипт:

#!/usr/bin/env bash

while true
do
  remain=$(curl -s -H "Authorization: token $GITHUB_TOKEN" -X GET https://api.github.com/rate_limit | jq -r '.rate.remaining')
  date=$(date -u +"%Y-%m-%dT%H:%M:%S%Z")
  echo "$date $remain"
  sleep 3
done

Получаем такой вывод:

Read more

Подсветка текста в Bash скриптах

Подсветка текста в Bash скриптах

Удобный сниппет для подсвечивания текста разными цветами в bash скриптах, рассмотрим пример:

Создадим файл t.sh:

#!/usr/bin/env bash

red=$'\e[1;31m'
grn=$'\e[1;32m'
yellow=$'\e[1;33m'
white=$'\e[0m'

echo "$yellow [WARN] Hello world! $white";
echo "$red [ERR] Hello world! $white";
echo "$grn [INFO] Hello world! $white";

Итого при запуске скрипта мы можем видеть текст разного цвета:

Read more

Мониторинг Nginx при помощи stub_status и Prometheus Exporter. Часть 2

Мониторинг Nginx при помощи stub_status и Prometheus Exporter. Часть 2

Для получения данных с Nginx status монитора в Prometheus необходим запуск Prometheus exporter в Kubernetes кластере. Напишем deployment манифест для запуска экспортера в Prometheus.

Создадим файл exporter.yaml:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: nginx-prometheus-exporter
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app:nginx-prometheus-exporter
    spec:
      containers:
        - name:nginx-prometheus-exporter
          image: "nginx/nginx-prometheus-exporter:0.8.0"
          imagePullPolicy: Always
          args: ["-nginx.scrape-uri", "https://mywebsite/basic_status"]
          ports:
            - containerPort: 9113
              name: http

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-prometheus-exporter
  annotations:
    prometheus.io/scrape: 'true'
    prometheus.io/port:   '9113'
spec:
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: 9113
  selector:
    app: nginx-prometheus-exporter
  type: ClusterIP

Для того, чтобы Prometheus мог забирать данные с pod-ов очень важно добавить соответствующую аннотацию в Service манифест:

Read more

Мониторинг Nginx при помощи stub_status и Prometheus Exporter

Мониторинг Nginx при помощи stub_status и Prometheus Exporter

Не так давно возникла задача мониторинга проекта, который не бежит внутри Kubernetes и простые настройки Prometheus не совсем подходят. Знать нагрузки на сервис интересно, но не хочется много накручивать и писать дополнительный код (к тому же проекты работают весьма успешно на PHP). Посмотрев что может отдать стандартный nginx понял, что в принципе базовую нагрузку вытащить будет довольно легко. Приступаем:

Read more

Golang — использование rate limiter в коде

Golang — использование rate limiter в коде

Rate limiting — ограничение скорости запросов в определенной системе. К примеру вы можете поставить ограничения на ваш веб сервер — не более 10 запросов в секунду. Возможно создание ограничения только для определенного клиента или типа машины.

В Golang добавление rate limit довольно просто, достаточно использовать готовую библиотеку golang.org/x/time/rate

Read more

Golang — функция вывода user IP

Golang — функция вывода user IP

В случае использования вашего приложения через load balancer или через различные прокси вида Cloudflare задача вывода клиентского IP адреса заключается в правильной выборке header. От X-Real-Ip до CF_CONNECTING_IP или же X-Original-Forwarded-For.

Для этого я написал простую функцию по выборке IP адреса:

func readUserIP(r *http.Request) string {
 address := r.Header.Get("X-Original-Forwarded-For")
 if address == "" {
  address = r.Header.Get("X-Forwarded-For")
 }
 if address == "" {
  address = r.Header.Get("X-Real-Ip")
 }
 if address == "" {
  address = r.RemoteAddr
 }
 return address
}

Алгоритм прост — мы смотрим на входящие HTTP хедеры и вытаскиваем возможный IP адрес по очереди:

Read more

Golang — Вывод POST response в fmt.Println

Golang — Вывод POST response в fmt.Println

Сниппет для вывода запроса при отладке:

...
// Save a copy of this request for debugging.
requestDump, err := httputil.DumpRequest(r, true)

if err != nil {
  fmt.Println(err)
  // handle errors
}

fmt.Println(string(requestDump))
...

 

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Read more

Конфигурация и настройка rippled кошелька

Конфигурация и настройка rippled кошелька

Шаг 1. Установка

Требования к установке: минимум 16 GB памяти и от 100 GB свободного места.

Пример установки на Ubuntu 20.04:

sudo apt -y update && \
sudo apt -y install apt-transport-https ca-certificates wget gnupg && \
wget -q -O - "https://repos.ripple.com/repos/api/gpg/key/public" | \ sudo apt-key add - && \
echo "deb https://repos.ripple.com/repos/rippled-deb bionic stable" | \ sudo tee -a /etc/apt/sources.list.d/ripple.list && \
sudo apt -y update && \
sudo apt -y install rippled && \
systemctl status rippled.service

Шаг 2. Настройка конфигурации

Read more