Latest Posts

Обновление Bitcoind сервера до 0.19

Обновление Bitcoind сервера до 0.19

Ниже приведены быстрые инструкции по обновлению bitcoind сервера:

$ wget https://bitcoincore.org/bin/bitcoin-core-0.19.1/bitcoin-0.19.1-x86_64-linux-gnu.tar.gz
$ tar -zxvf bitcoin-0.19.1-x86_64-linux-gnu.tar.gz
$ mv ~/bitcoin-0.19.1/bin/bitcoind /usr/bin/bitcoind
$ mv ~/bitcoin-0.19.1/bin/bitcoin-cli /usr/bin/bitcoin-cli

Останавливаем сервер:

 bitcoin-cli stop

Далее проверяем bitcoin.conf в ~/.bitcoin папке:

rpcuser=user
rpcbind=127.0.0.1
rpcpassword=pass
rpcport=8332
rpcallowip=127.0.0.1
server=1
shrinkdebuglog=1
prune=5500
keypool=100
addresstype=bech32

По сравнению с прошлыми версиями в конфигурационный файл был добавлен параметр rpcbind — устанавливает на какой адрес «повесить» bitcoind сервер.

Read more

Используем UFW firewall в Ubuntu

Используем UFW firewall в Ubuntu

UFW или uncomplicated firewall —  утилита для конфигурирования межсетевого экрана. Написана командой Canonical и встроена по-умолчанию в Ubuntu. При помощи своей простоты позволяет быстро настроить сервер для противодействия разным атакам. Установлен ufw обычно из коробки.

Чтобы проверить статус работы достаточно написать:

$ > ufw status
$ < Status: inactive

Добавим правила:

Read more

Форматирование даты во VueJS с MomentJS

Форматирование даты во VueJS с MomentJS

Волей судьбы начал работать плотно с фронтендом для проектов. Выбор пал на лёгкий в освоении VueJS.

В качестве одной из задач стоял вывод даты в определенном удобным человеку формате (вместо 2020-05-10T21:43:32.545448Z). Для этого используем Moment JS:

import moment from 'moment'
... ... ... ...
Vue.filter('formatDate', function (value) {
    if (value) {
        return moment(String(value)).format('MM/DD/YYYY hh:mm')
    }
})

И далее в шаблоне отображения можем выводить данные при помощи зарегистрированного фильтра:

Read more

GitHub API &#8212; полезные примеры curl запросов с releases API

GitHub API — полезные примеры curl запросов с releases API

Очередная подборка полезных curl запросов для работы с GitHub API:

  1. Получить объект release с выбранным tag_name:
    release="$(curl -s -X GET -H "Authorization:token ${GITHUB_TOKEN}" "https://api.github.com/repos/${GITHUB_REPO}/releases" | jq -r '.[] | select(.tag_name=='\""$TAG_NAME"\"')')"
  2. Получить uploadUrl для загрузки нового asset в данный release объект:
    uploadUrl="$(jq -r '.upload_url' <<< "${release}")"
  3. Удаление asset из release:
    existingAsset="$(curl -s -X GET -H "Authorization:token ${GITHUB_TOKEN}" "https://api.github.com/repos/${GITHUB_REPO}/releases/${releaseID}/assets" | jq -r '.[] | select(.name=='\""$ARTIFACT"\"')')"
    existingAssetID="$(jq -r '.id' <<< "${existingAsset}")"
    resp="$(curl -s -X DELETE -H "Authorization:token ${GITHUB_TOKEN}" -H "Content-Type:application/octet-stream"  "https://api.github.com/repos/${GITHUB_REPO}/releases/assets/${existingAssetID}")"
    echo "$resp"

    Для работы bash снипетов необходимо установить расширение jq, добавить GITHUB_TOKEN и GITHUB_REPO.

    Read more

Unit тесты для zap логгера в Golang

Unit тесты для zap логгера в Golang

Zap — популярная в Go лог система, написанная убером.

Задача, которая однажды встала передо мной — как проверить что все нужные сообщения логгера  были вызваны в коде?

Для этого я нашел решение как сам zap тестирует свою логику — при помощи zap observer:

obs, logs := observer.New(zap.InfoLevel)
logger := zap.New(obs)

Теперь нам нужно запустить наш код и потом проверить полученные сообщения логгера в observer:

Read more

Prometheus middleware для Chi

Prometheus middleware для Chi

Для вывода Prometheus метрик с роутера Chi нет официального Middleware. Поэтому установим расширение 766b/chi-prometheus:

// Init router
r := chi.NewRouter()
// Init middleware
...
r.Use(chiprometheus.NewMiddleware("my-api"))
...
// Init some routes
r.Get("/api", apiHandler)

Далее импортируем promhttp:

"github.com/prometheus/client_golang/prometheus/promhttp"

И регистрируем HTTP handler:

r.Handle("/metrics", promhttp.Handler())

И в принципе всё. Теперь все роуты будут проходить через chiprometheus и все данные роутера будут сохраняться для забора Prometheus.

Read more

Bitcoin alert &#8212; добавлена команда CURRENT

Bitcoin alert — добавлена команда CURRENT

При помощи Telegram бота Bitcoin-Alert можно получать актуальные изменения минимального-максимального курса криптовалют в течение определенного промежутка времени.

В Telegram бот была добавлена команда CURRENT для получения актуального курса:

> BTC CURRENT

 < Current ticker: 6775.246094

Бот поддерживает Bitcoin, Litecoin, Ethereum.

Leave a Comment

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

Read more

Golang: FileServer для go-chi

Golang: FileServer для go-chi

Пример работы файлового сервера для go-chi:

r := chi.NewRouter()
... ... ...
fileServer(r)
... ... ...
// fileServer is serving static files.
func fileServer(router *chi.Mux) {
	root := "./frontend"
	fs := http.FileServer(http.Dir(root))

	router.Get("/*", func(w http.ResponseWriter, r *http.Request) {
		if _, err := os.Stat(root + r.RequestURI); os.IsNotExist(err) {
			w.WriteHeader(http.StatusNotFound)
			return
		} else {
			fs.ServeHTTP(w, r)
		}
	})
}

До начала работы нужно задать root — корневую папку для работы файлового сервера.

Read more

Bitcoin alert &#8212; Telegram бот для получения уведомлений по изменению цен BTC, LTC, ETH

Bitcoin alert — Telegram бот для получения уведомлений по изменению цен BTC, LTC, ETH

bitcoin-alert.visla.dev — новый сервис для доставки уведомлений по изменению цен крупнейших по капитализации криптовалют: Bitcoin, Litecoin, Ethereum.

Для получения уведомлений достаточно просто установить бота на свой аккаунт и выбрать нужную команду:

2020-03-22-15-35-08

Например, хотим получать BTC сигналы:

2020-03-22-15-44-00

И все! Бот будет уведомлять о всех крупных изменениях цен:

Read more

Сниппет: Отправка POST json в Golang

Сниппет: Отправка POST json в Golang

Сниппет для POST отправки JSON string:

var jsonStr = []byte(`{"price":9899}`)

req, err := http.NewRequest(http.MethodPost, "https://example.com", bytes.NewBuffer(jsonStr))

if err != nil {
  ...
}

response, err := http.DefaultClient.Do(req)
if err != nil {
  ...
}
defer response.Body.Close()

_, err = ioutil.ReadAll(response.Body)
if err != nil {
 ...
}

 

Read more