Please open Telegram to view this post
VIEW IN TELEGRAM
Генерация случайных чисел окружает нас везде. Любой шаг, дыхание, дуновение ветра, шум куллера, частота мяуканья кошки и т.п. уже может рассматриваться как некая генерация случайности.
Так например, насколько вы контролируете вашу ходьбу? Можете ли вы с точностью до нанометра определить точку опоры? Если не можете, то сама погрешность в неопределённости расстояния начинает становиться для вас генератором случайности.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Библиотека для простого управления битами и байтами на go. Работает в два раза быстрее, чем стандартный пакет bytes.Buffer✨🍪
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Структуры — это коллекции разнородных данных, определенные программистами для организации информации. Структуры позволяют аккуратно инкапсулировать все данные, относящиеся к одному объекту, в одно определение типа, поведение которого затем может быть реализовано путём определения функций для типа struct.
Большинство программ работают с огромными объемами данных, а без создания структур будет трудно вспомнить, какие переменные
string
или int
принадлежали друг другу, а какие были разными.В этой статье описано, как можно эффективно определить структуру с точки зрения использования памяти процессора.
▪Читать
▪Зеркало
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Микросервис баланса пользователей.
Приложение хранит в себе идентификаторы пользователей и их баланс. Взаимодействие с ним осуществляется исключительно с помощью брокера очередей.
По требованию внешней системы, микросервис может выполнить одну из следующих операций со счетом пользователя:
▪Списание
▪Зачисление
▪Перевод от пользователя к пользователю (будет плюсом, но не обязательно)
Блокирование с последующим списанием или разблокированием. Заблокированные средства недоступны для использования. Блокировка означает что некая операция находится на авторизации и ждет какого-то внешнего подтверждения, ее можно впоследствии подтвердить или отклонить
После проведения любой из этих операций генерируется событие-ответ в одну из очередей.
Основные требования к воркерам:
▪Код воркеров должен безопасно выполняться параллельно в разных процессах
▪Воркеры могут запускаться одновременно в любом числе экземпляров и выполняться произвольное время
▪Все операции должны обрабатываться корректно, без двойных списаний, отрицательный баланс не допускается
В пояснительной записке к выполненному заданию необходимо указать перечень используемых инструментов и технологий, способ развертки приложения, общий механизм работы (интерфейсы ввода/вывода)
Будет плюсом покрытие кода юнит-тестами.
Требования к окружению: Язык программирования: Go Можно использовать: любые фреймворки, реляционные БД для хранения баланса, брокеры очередей, key-value хранилища.
Особенности
▪Сервис поддерживает обработку паники.
▪Сервис поддерживает создание и хранение журнала выполненных операций.
▪Сервис поддерживает полную консистентность данных
▪Сервис поддерживает graceful shutdown.
▪Сервис НЕ поддерживает Heartbeat для базы данных.
На момент старта сервиса, должен быть уже запущен NATS.
Используемые компоненты
▪MySQL - для хранения данных
▪NATS - брокер сообщений
API
Ответ на каждый запрос включает статус его выполнения: 0. Операция прошла успешно
1.Неизвестная ошибка
2.Операция устарела
3.Для выполнения операции недостаточно средств
4.Аккаунт не найден
Credit
Списание средств со счета.
Subject/Queue - bank.credit
Request: {"uid":1,"account":1,"amount":10}
Response: {"status":1}
Debit
Зачисление средств на счет.
Subject/Queue - bank.debit
Request: {"uid":1,"account":1,"amount":10}
Response: {"status":1}
Transfer
Перевод средст с одного счета на другой.
Subject/Queue - bank.transfer
Request: {"uid":1,"src":1,"dst":2,"amount":10}
Response: {"status":1}
Acquire
Блокировка средств.
Subject/Queue - bank.acquire
Request: {"uid":1,"account":1,"amount":10}
Response: {"status":1}
Commit
Подтверждение блокированных средств.
Subject/Queue - bank.commit
Request: {"uid":1,"account":1}
Response: {"status":1}
Rollback
Возврат блокированных средств.
Subject/Queue - bank.rollback
Request: {"uid":1,"account":1}
Response: {"status":1}
Принцип работы
Для достижения идемпотентности, в каждой операции должен присутствовать ее уникальный номер uid. Каждая операция, при записи в базу данных, регистрирует действие в таблице истории. При существовании одинакового ключа (work_index) происходит ошибка базы данных, которую мы трактуем, как устаревание операции (идемпотентный случай). Аналогчно работает и таблица активов.
В сервисе используется пакет доступа к базе данных github.com/adverax/echo/database/sql, который позволяет эмулировать вложенные транзакции, а также хранить область видимости в контексте. Это позволяет нам осуществлять декомпозицию функционала работы с базой на отдельные функции, не заботясь о контексте выполнения запросов.
Для каждой таблицы используется собственный менеджер.
▪Полное описание
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Patron — это фреймворк для создания микросервисов на Go.
▪поддерживает асинхронную обработку сообщений (RabbitMQ, Kafka, AWS SQS)
▪фреймворк, который помогает удобно организовать все компоненты микросервиса.
▪поддерживает синхронную обработка (HTTP)
▪поддержка gRPC
▪встроенный журнал логгирования
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Опыт использования KrakenD от разработчиков МТС Travel
KrakenD — это готовое решение, которое используется в МТС Travel для реализации API-шлюза, важной штуки для продуктов с микросервисной архитектурой.
Туристический сервис появился у МТС в прошлом году, сейчас с помощью него можно забронировать отели по всей России, а также за рубежом. В базе уже более 16000 предложений различных отелей, хостелов и апартаментов.
Опыт МТС Travel может может пригодиться разработчикам из других сервисов. Подробнее о нем читайте в статье на Хабре.
KrakenD — это готовое решение, которое используется в МТС Travel для реализации API-шлюза, важной штуки для продуктов с микросервисной архитектурой.
Туристический сервис появился у МТС в прошлом году, сейчас с помощью него можно забронировать отели по всей России, а также за рубежом. В базе уже более 16000 предложений различных отелей, хостелов и апартаментов.
Опыт МТС Travel может может пригодиться разработчикам из других сервисов. Подробнее о нем читайте в статье на Хабре.
Хабр
Выпускайте Кракена: опыт использования KrakenD
Привет, Хабр! Меня зовут Владимир Калугин, я руковожу бэкенд-разработкой в МТС Travel . Этот сервис появился у МТС в прошлом году, сейчас у нас можно забронировать отели по всей России, а также за...
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
package main
func main() {
for i := 0; i < 3; i++ {
defer func() { print(i) }()
}
for i := range [3]int{} {
defer func() { print(i) }()
}
}
Ответ
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
В репозитории содержатся переписанные скрипты по хакингу на Go из следующих книг:
– Violent Python
– Black Hat Python
– Security with Go
– Python Web Penetration Testing Cookbook
– asecuritysite
– Криптография с Python
– Black Hat Go
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
LURE (Linux User REpository)
LURE – инструмент на GO для внедрения AUR во все дистрибутивы, отличные от Arch Linux
Он может загрузить репозиторий, собрать в нем пакеты с помощью bash-скрипта, похожего на PKGBUILD, а затем установить их с помощью системного менеджера пакетов.
LURE написан на чистом Go и не имеет никаких зависимостей.
В настоящее время LURE поддерживает
🖥 Github
@Golang_google
LURE – инструмент на GO для внедрения AUR во все дистрибутивы, отличные от Arch Linux
Он может загрузить репозиторий, собрать в нем пакеты с помощью bash-скрипта, похожего на PKGBUILD, а затем установить их с помощью системного менеджера пакетов.
LURE написан на чистом Go и не имеет никаких зависимостей.
В настоящее время LURE поддерживает
apt
,
pacman
,
apk
,
dnf
,
yum и zypper
.
curl https://www.arsenm.dev/lure.sh | bash
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Польская запись — это форма записи арифметических, логических и алгебраических выражений, в которой операция располагается слева от операндов. Выражения в польской записи могут обходиться без скобок, однако мы оставим скобки для наглядности.
Например, выражение в польской записи выглядит как
(* 5 (+ 3 4))
Пусть выражения в польской записи состоят из имён переменных (от a до z), круглых скобок и трёх знаков операций: #, $ и @ (смысл операций мы определять не будем).
Выражения могут содержать повторяющиеся подвыражения. Экономное вычисление таких выражений подразумевает, что повторяющиеся подвыражения вычисляются только один раз.
Требуется составить программу econom.go, вычисляющую количество операций, которые нужно выполнить для экономного вычисления выражения. Примеры работы программы приведены в таблице:
Набор тестов для программы экономного вычисления выражений в польской записи
Выражение Количество операций
x 0
($xy) 1
($(@ab)c) 2
(#i($jk)) 2
(#($ab)($ab)) 2
(@(#ab)($ab)) 3
(#($a($b($cd)))(@($b($cd))($a($b($cd))))) 5
(#($(#xy)($(#ab)(#ab)))(@z($(#ab)(#ab)))) 6
Решение
package main
func main() {
println(opCount("(#($(#xy)($(#ab)(#ab)))(@z($(#ab)(#ab))))"))
println(opCount("($xy)"))
println(opCount("x"))
}
func opCount(expr string) int {
expressions := map[string]bool{}
var openBraces []int
for i, c := range expr {
switch c {
case '(':
openBraces = append(openBraces, i)
case ')':
lastOpenBrace := len(openBraces) - 1
subExprStart := openBraces[lastOpenBrace]
subExpr := expr[subExprStart:i]
expressions[subExpr] = true
openBraces = openBraces[:lastOpenBrace]
}
}
return len(expressions)
}
Скобки очень сильно упрощают задачу, при этом в настоящей польской нотации скобки не нужны.
Приведем вариант кода без скобок.
const oper = node_t("oper")
const expr = node_t("expr")
type node struct {
t node_t
v string
}
func opCount(input string) int {
expressions := map[string]bool{}
var stack []node
for _, c := range input {
switch c {
case '$', '#', '@':
stack = append(stack, node{t: oper, v: fmt.Sprintf("%s", c)})
default:
stack = append(stack, node{t: expr, v: fmt.Sprintf("%s", c)})
}
for canFold(stack) {
lastIdx := len(stack) - 1
operIdx := lastIdx - 2
folded := node{t: expr, v: stack[operIdx].v + stack[operIdx+1].v + stack[operIdx+2].v}
expressions[folded.v] = true
stack[operIdx] = folded
stack = stack[:operIdx+1]
}
}
return len(expressions)
}
func canFold(stack []node) bool {
stackLen := len(stack)
return stackLen >= 3 && stack[stackLen-3].t == oper && stack[stackLen-2].t == expr && stack[stackLen-1].t == expr
}
Пишите свое решение в комментариях👇 и ставьте 👍, если интересен такой формат.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
# Очередь на go с REST интерфейсом
## ТЗ
Реализовать брокер очередей в виде веб сервиса. Сервис должен обрабатывать 2 метода:
1. PUT /queue?v=message
Положить сообщение message в очередь с именем queue (имя очереди может
быть любое), пример:
curl -XPUT http://127.0.0.1/pet?v=cat
curl -XPUT http://127.0.0.1/pet?v=dog
curl -XPUT http://127.0.0.1/role?v=manager
curl -XPUT http://127.0.0.1/role?v=executive
в ответ {пустое тело + статус 200 (ok)}
в случае отсутствия параметра v - пустое тело + статус 400 (bad request)
2. GET /queue
Забрать (по принципу FIFO) из очереди с названием queue сообщение и вернуть в теле http запроса, пример (результат, который должен быть при выполненных put’ах выше):
curl http://127.0.0.1/pet => cat
curl http://127.0.0.1/pet => dog
curl http://127.0.0.1/pet => {пустое тело + статус 404 (not found)}
curl http://127.0.0.1/pet => {пустое тело + статус 404 (not found)}
curl http://127.0.0.1/role => manager
curl http://127.0.0.1/role => executive
curl http://127.0.0.1/role => {пустое тело + статус 404 (not found)}
при GET-запросах сделать возможность задавать аргумент timeout
curl http://127.0.0.1/pet?timeout=N
если в очереди нет готового сообщения получатель должен ждать либо до момента прихода сообщения либо до истечения таймаута (N - кол-во секунд). В случае, если сообщение так и не появилось - возвращать код 404. Получатели должны получать сообщения в том же порядке как от них поступал запрос, если 2 получателя ждут сообщения (используют таймаут), то первое сообщение должен получить тот, кто первый запросил.
Порт, на котором будет слушать сервис, должен задаваться в аргументах командной строки.
Запрещается пользоваться какими либо сторонними пакетами кроме стандартных библиотек. (задача в написании кода, а не в использовании чужого)
Желательно (но не обязательно) весь код расположить в одном go-файле (предполагается, что решение будет не больше 500 строк кода) для удобства проверки, никаких дополнительных файлов readme и т.п. не требуется, создание классической структуры каталогов (cmd/internal/...) не требуется.
Комментарии приветствуются и помогут нам понять ход Ваших мыслей при разработке.
Лаконичность кода будет восприниматься крайне положительно, не нужна "гибкость" больше, чем требуется для решения именно этой задачи, не нужны логи процесса работы программы (только обработка ошибок), никакого дебага и т.д... чем меньше кода - тем лучше!
Оцениваться корректность реализации (заданные условия выполняются),архитектурная составляющая (нет лишних действий в программе, только
решающие задачи программы), лаконичность и понятность кода (субъективно, конечно, но думайте о том, насколько будет понятен ваш. код для других, это куда более важно в командной разработке, чем сложный "крутой" код).
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Пусть идентификатор — это последовательность латинских букв и цифр, начинающаяся с буквы.
Известно, что в некоторой строке записаны идентификаторы, разделённые произвольным количеством пробелов. При этом строка может начинаться и заканчиваться произвольным количеством пробелов. Назовём такую строку предложением.
Лексический анализ предложения заключается в выделении из него последовательности записанных в нём идентификаторов. В результате лексического анализа получается массив целых чисел, каждое из которых соответствует одному из идентификаторов. Целые числа назначаются идентификаторам произвольно, но так, чтобы разным идентификаторам соответствовали разные числа, а равным идентификаторам — одинаковые числа.
Пример. Пусть дано предложение
alpha x1 beta alpha x1 y
Тогда на выходе лексического анализатора может получиться последовательность чисел
1 2 3 1 2 4
Здесь число 1 соответствует идентификатору alpha, число 2 — идентификатору x1, число 3 — идентификатору beta, а число 4 — идентификатору y.
Необходимо разработать функцию lex, выполняющую лексический анализ предложения:
func lex(sentence string, array AssocArray) []int {
...
}
В качестве первого параметра функция lex принимает предложение, а второй параметр задаёт ассоциативный массив, который должен быть использован внутри функции для хранения соответствия идентификаторов и целых чисел.
Ассоциативный массив, который можно передавать в функцию lex, должен реализовывать интерфейс AssocArray:
type AssocArray interface {
Assign(s string, x int)
Lookup(s string) (x int, exists bool)
}
Метод Assign добавляет в ассоциативный массив словарную пару.Метод Lookup выполняет поиск словарной пары по ключу и возвращает два значения: x и exists. Если словарной пары с указанным ключом в массиве нет, то exists принимает значение false. В противном случае exists равен true, а x — связанное с ключом значение.
Составьте программу lex.go, демонстрирующую работоспособность функции lex. В качестве ассоциативных массивов для тестирования функции lex нужно использовать список с пропусками и АВЛ-дерево.
Пишите свой ответ в комментариях👇
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Если вы любите игры и язык Go так, как мы, то предлагаем вам скачать и попробовать данный движок для разработки 3D игр.
⚙️ Project
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Gopeed – высокоскоростной загрузчик, с открытым исходным кодом
Поддерживает:
▪HTTP
▪BitTorrent
▪Magnet
Работает почти на всех девайсах и системах.
#Go #downloader
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Пусть имеется некоторый набор формул, задающих зависимости между переменными. Например, объём пирамиды, в основании которой лежит прямоугольник со сторонами и , а высота равна полусумме сторон основания, определяется следующим набором формул:
V = S*h / 3
S = a * b
a, b = 10, 15
h = (a + b) / 2
Обратите внимание на то, что каждая формула состоит из левой и правой частей, разделённых знаком «=». Левая часть является списком переменных, а правая часть — списком соответствующих этим переменным выражений. Переменные в левой части и выражения в правой части разделяются запятыми.
Формулы могут быть записаны в любом порядке, но, если в них нет циклических зависимостей, их можно расположить в порядке, в котором нужно выполнять вычисления.
Составьте программу, осуществляющую топологическую сортировку формул.
Для решения задачи нужно построить орграф, вершинами которого являются формулы, а дуги задают зависимости между ними. То есть, если формула зависит от формулы , то в графе существует дуга . Затем следует выполнить топологическую сортировку вершин этого орграфа, то есть расположить вершины в таком порядке, чтобы дуги вели от бо́льших вершин к меньшим. Этот порядок, как не трудно догадаться, совпадает с порядком превращения «серых» вершин в «чёрные» в процессе обхода графа в глубину.
Формулы подаются в программу через стандартный потока ввода. Они отделяются друг от друга символом перевода строки. Выражения в составе формул содержат знаки четырёх арифметических операций, круглые скобки, десятичные числа и имена переменных. Имя переменной — это последовательность латинских букв и десятичных цифр, начинающаяся с буквы.
Программа должна выводить сообщение «syntax error», если какая-нибудь формула содержит синтаксическую ошибку, или если некоторая переменная присутствует в левой части нескольких формул, или если не существует формулы для вычисления какой-нибудь переменной.
Программа должна выводить сообщение «cycle» в случае обнаружения циклической зависимости формул. Для обнаружения циклической зависимости следует проверять наличие обратных дуг при обходе графа в глубину. Напомним, что обратная дуга ведёт в «серую» вершину.
Если ошибки в формулах не обнаружены, то программа должна выводить в стандартный поток вывода отсортированный набор формул. В случае существования нескольких вариантов взаимного расположения формул, требуется вывести любой из них.
Пишите свой ответ в комментариях👇
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM