Последняя цифра огромного числа
Для данного списка
{x1, x2, x3, ..., xn}
вычислить последнюю (десятичную) цифруx1 ^ (x2 ^ (x3 ^ (... ^ xn)))
.Примеры
Пример 1
LastDigit([]int{3, 4, 2})
// должно вернуть 1потому что
3 ^ (4 ^ 2) = 3 ^ 16 = 43046721
Примечания
Прогрессия растет невероятно быстро. Например,
9 ^ (9 ^ 9)
имеет более 369 миллионов цифр. LastDigit должен эффективно обрабатывать такие числа.0 ^ 0 = 1
0 ^ (0 ^ 0) = 0 ^ 1 = 0
Пустой список следует рассматривать как равный 1
Решение
package src
func LastDigit(as []int) int {
if len(as) == 0 {
return 1
}
for key := len(as) - 1; key > 0; key-- {
if as[key] == 0 {
as[key-1] = 1
as = as[:key]
continue
} else if as[key] == 1 {
as = as[:key]
continue
}
if as[key-1]%10 == 2 || as[key-1]%10 == 3 || as[key-1]%10 == 7 || as[key-1]%10 == 8 {
switch as[key] % 4 {
case 0:
as[key-1] = pow(as[key-1], 4)
case 1:
as[key-1] = pow(as[key-1], 5)
case 2:
as[key-1] = pow(as[key-1], 6)
case 3:
as[key-1] = pow(as[key-1], 7)
}
} else if as[key-1]%10 == 4 || as[key-1]%10 == 9 || as[key-1]%10 == 1 {
switch as[key] % 2 {
case 0:
as[key-1] = pow(as[key-1], 2)
case 1:
as[key-1] = pow(as[key-1], 3)
}
} else if as[key-1]%10 == 5 {
as[key-1] = 25
} else if as[key-1]%10 == 6 {
as[key-1] = 36
} else if as[key-1]%10 == 0 {
as[key-1] *= as[key-1]
}
as = as[:key]
}
return as[0] % 10
}
func pow(a, b int) int {
result := getDigs(a)
for i := 1; i < b; i++ {
result = getDigs(result * a)
}
return result
}
func getDigs(a int) int {
if a > 1000 {
return a % 1000
}
return a
}
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍3❤2
DiscordGo — это пакет Go, который обеспечивает низкоуровневую привязку к API-интерфейсу клиента чата Discord. DiscordGo почти полностью поддерживает все методы API Discord, интерфейс веб-сокеты и голосовой интерфейс.
go get github.com/bwmarrin/discordgo
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍3❤1👏1
📚 Лучшие бесплатные книги Golang 2023.
Есть много доступных книг по GO, некоторые полезные, некоторые не очень. Я думаю, что если вы изучаете Go, вы должны стремиться читать как можно больше книг.
✔️ Смотреть список
@Golang_google
Есть много доступных книг по GO, некоторые полезные, некоторые не очень. Я думаю, что если вы изучаете Go, вы должны стремиться читать как можно больше книг.
✔️ Смотреть список
@Golang_google
🔥15👍6❤3👎1
— встроенной базы данных SQLite + realtime subscriptions,
— удобной панели администратора,
— встроенного управления файлами и пользователями,
— и удобного REST-API.
✔️ Документация
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍5❤4🤔1
Нужно реализовать HTTP сервис для голосования. Например, для выбора самого популярного покемона. UI не нужен, достаточно сделать JSON API сервис. Должна быть возможность:
Задача
Нужно реализовать HTTP сервис для голосования. Например, для выбора самого популярного покемона. UI не нужен, достаточно сделать JSON API сервис. Должна быть возможность:
▪ Создать новое голосование с разными вариантами ответов
▪ Отдать свой голос за какой-либо вариант
▪ Получить текущий результат голосования
Реализовать методы:
- POST /api/createPoll/ создать голосование c вариантами ответов
- POST /api/poll/ проголосовать за конкретный вариант: <poll_id, choice_id>
- POST /api/getResult/ получить результат по конкретному голосованию: <poll_id>
Структура и формат входных и выходных данных на ваше усмотрение.
Описание идеального решения
▪ Задание декомпозировано, составлен иерархический список работ. Каждый пункт из этого списка может быть реализован за небольшое время.
▪ Составлена схема архитектуры со всеми сущностями и их связями в Miro
▪ Код слабо связан, функции не имеют побочных эффектов
▪ История коммитов осмысленная. По ней видно, в каком порядке решалась задача.
▪ Покрытие тестами >70%
Требования
▪Язык: Go
▪Результаты голосования должны храниться в базе данных. Мы обычно используем PostgreSQL и MongoDB, но можно выбрать любую другую.
▪Код нужно выложить на github (просьба не делать форк этого репозитория, чтобы не плодить плагиат)
▪Предоставить инструкцию по запуску приложения. В идеале (но не обязательно) – использовать контейнеризацию с возможностью запустить проект командой docker-compose up
▪Сервис должен отвечать на 8000 порту
Усложнения
▪ Написаны тесты (постарайтесь достичь покрытия в 70% и больше)
▪ Опишите, как изменится архитектура, если мы ожидаем большую нагрузку (Реализация не требуется)
▪ Опишите, как можно защититься от накруток (Реализация не требуется)
▪ Попробуйте оценить, какую нагрузку в RPS сможет выдержать ваш сервис
Что будет оцениваться
▪ Декомпозиция задачи (например, в виде вложенного списка подзадач)
▪ Архитектура решения
▪ Корректность реализации
▪ Подход к тестированию
▪ Понятность инструкций и документации
▪ Codestyle
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🔥8❤2
conc — это ваш набор инструментов для структурирования конкуренции в Go, который делает обычные задачи проще и безопаснее.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥2❤1👎1
git clone git@github.com:mikestefanello/pagoda.git
cd pagoda
make up
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍6❤2
Forwarded from DevOps
Я помню свой третий demo-проект. После сборки и тестирования проекта всё работало. В тот момент я отправил его человеку, который должен был демонстрировать его вместо меня. И вот, не задача, во время запуска возникла ошибка...
Чтобы сохранить собственную репутацию, я начал производить отладку. Проект не запускался потому, что тому человеку нужно было обновить программное обеспечение, чтобы у него работали новые функции. Я помог ему в этом, и, о чудо, всё заработало!
А теперь представьте, если бы мне нужно было разослать данный проект не одному человеку, а десятерым. Тогда мне пришлось бы помогать каждому, перенастраивать их компьютеры, чтобы новые функции успешно работали. Думаю, я бы испытал огромный стресс…
Было бы отлично, если бы существовало такое ПО, с помощью которого можно было бы упаковать всё необходимое для работы приложения в одном месте, а потом поделиться этим файлов с коллегами. Они бы скачивали файл и запускали его, при этом не получая ошибку. Но ведь такая программа существует! И называется она Docker.
Docker помогает решать эти проблемы. В этой статье объясняются основные концепции Docker, а также показано то, как создавать контейнеры для ваших приложений.
➡️ Читать дальше
@DevOPSitsec
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥3❤1👎1
This media is not supported in your browser
VIEW IN TELEGRAM
Инструмент Go, который позволяет безопасно передавайть и отправлять что угодно между компьютерами с помощью TUI.
brew install abdfnx/tap/tran
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍2❤1
Какое чудесное платье! Стоит только поискать платья в веб-пространстве, как потом практически невозможно избежать интернет-рекламы с новыми моделями. Что же происходит при нажатии на такие коммерческие предложения? Мы попадаем на сайт магазина, где представлена подробная информация о товаре. Но вот вопрос: эти данные поступают из одного и того же сервиса или собираются из разных сервисов и отправляются пользователям? В статье мы рассмотрим второй вариант, а именно шлюз API.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍4❤1
Пример Go проекта с чистой архитектурой на базе Gin, mongo go driver, JWT viper, bcrypt, testify, mockery и других пакетов.
Вы можете использовать этот проект в качестве шаблона для создания вашего проекта на Go.
$ cd your-workspace
# Clone this project into your workspace
$ git clone https://github.com/amitshekhariitbhu/go-backend-clean-architecture.git
# Move to the project root directory
$ cd go-backend-clean-architecture
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18👎16❤2🔥2
https://groups.google.com/g/golang-announce/c/7SPnPbP2DTU?pli=1
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤2👍1
Библиотека планировщика заданий с поддержкой базы данных
go get github.com/deepaksinghvi/cdule
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2🥰2
This media is not supported in your browser
VIEW IN TELEGRAM
Расширение GitHub (gh) CLI для автоматизации повседневной работы с ветками, коммитами и запросами на GO.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥4❤1
🐳🚢 Docker-Kubernetes-101
Инструкция и подход к развертыванию проектов с использованием Docker и Kubernetes.
🖥 Github
@Golang_google
Инструкция и подход к развертыванию проектов с использованием Docker и Kubernetes.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥3❤1
WebPty - проект на Go, который позволяет запускать серверный терминал из браузера. Работает с любого Linux-сервера с любой программой.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤1🔥1
Текст задания:
Процессу на stdin приходят строки, содержащие интересующие нас URL. Каждый такой URL нужно дернуть и посчитать кол-во вхождений строки "Go". В конце работы приложение выводит на экран общее кол-во найденных строк "Go" во всех переданных URL, например:
$ echo -e 'https://golang.org\nhttps://golang.org\nhttps://golang.org' | go run 1.go
Count for https://golang.org: 9
Count for https://golang.org: 9
Count for https://golang.org: 9
Total: 27
Введенный URL должен начать обрабатываться сразу после вычитывания и параллельно с вычитыванием следующего. URL должны обрабатываться параллельно, но не более k=5 одновременно.
Обработчики url-ов не должны порождать лишних горутин, т.е. если k=1000 а обрабатываемых URL-ов нет, не должно создаваться 1000 горутин.
Нужно обойтись без глобальных переменных и использовать только стандартные библиотеки.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥5❤1
Описание задания
Необходимо разработать приложение, предоставляющее HTTP API для получения данных о парковках такси в г. Москва. Данные необходимо брать с этой страницы ("Актуальная версия").
Описание необходимого функционала
Приложение должно реализовывать:
▪Функционал загрузки данных из файла (локального и/или по ссылке) в хранилище данных (данные на источнике могут как удаляться, так и добавляться);
▪Обслуживание HTTP запросов к API-endpoints, которые реализуют поиск по хранимым данным;
Обслуживание HTTP запросов к роуту, возвращающему метрические данные (в формате prometheus) работы приложения.
▪Обновление данных в хранилище должно происходить без остановки обслуживания HTTP запросов к API с учетом того, что их объем может быть очень большим (и маппинг данных на источнике может изменяться).
Методы HTTP API должны возвращать ответ в формате json. Время обработки одного запроса к HTTP API (не загрузка данных в хранилище) - не более 2 мс. до первого байта HTTP ответа (TTFB). Проектирование самих методов API - на ваше усмотрение (минимально необходимый функционал - это поиск по global_id, id и mode).
Метрические данные должны включать в себя как минимум следующие метрики:
Общее количество обработанных запросов к API-endpoints;
Количество ошибок обработки HTTP запросов к API-endpoints (плюсом будет "разведение" по различным кодам ответов);
Данные по времени обработки HTTP запросов к API-endpoint;
Дополнительные метрики, на ваше усмотрение.
Требования к реализации
▪В качестве хранилища данных необходимо использовать Redis;
▪Все функции (экспортируемые и не экспортируемые) должны сопровождаться понятным комментарием (если возможно - на английском языке);
▪Не стоит излишне сокращать имена переменных и констант - код пишется для людей, и он должен быть максимально простым и понятным;
▪Можно использовать любые сторонние пакеты, но не использовать какой-либо фреймворк;
▪Весь ключевой функционал должен быть зафиксирован unit-тестами;
▪После завершения работы над заданием необходимо написать сопроводительную документацию по работе с приложением в файле README.md в корне репозитория;
▪Конфигурация параметров подключения к хранилищу данных должна иметь возможность управляться как флагами запуска, так и переменными окружения. Возможности конфигурирования должны быть описаны в файле README.md вашего репозитория.
Плюсами будут являться
▪Настройка CI (силами GitHub actions, TravisCI, etc) выполняющая запуск тестов и сборки на каждый коммит;
▪Автоматическая сборка Docker-образа с приложением;
▪Интуитивно-понятное разбитие коммитов - одной конкретной задаче - один коммит или PR (её правки - отдельный коммит или PR);
Написание всех текстов коммитов - на английском языке.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍3❤2🤯2😱1
📝 Документация
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤1🔥1
Общее описание
Сервис предназначен для борьбы с подбором паролей при авторизации в какой-либо системе.
Сервис вызывается перед авторизацией пользователя и может либо разрешить, либо заблокировать попытку.
Предполагается, что сервис используется только для
server-server,т.е
. скрыт от конечного пользователя.Алгоритм работы
Сервис ограничивает частоту попыток авторизации для различных комбинаций параметров, например:
▪не более N = 10 попыток в минуту для данного логина.
▪не более M = 100 попыток в минуту для данного пароля (защита от обратного brute-force).
▪не более K = 1000 попыток в минуту для данного IP (число большое, т.к. NAT).
Для подсчета и ограничения частоты запросов, можно использовать например алгоритм leaky bucket. Или иные аналогичные: https://en.wikipedia.org/wiki/Rate_limiting
Причем сервис будет поддерживать множество bucket-ов, по одному на каждый логин/пароль/ip.
Bucket-ы можно хранить:
▪в памяти (в таком случае нужно продумать удаление неактивных bucket-ов, чтобы избежать утечек памяти).
▪во внешнем хранилище (например redis или СУБД, в таком случае нужно продумать производительность).
White/black листы содержат списки адресов сетей, которые обрабатываются более простым способом:
▪Если входящий IP в whitelist, то сервис безусловно разрешает авторизацию (ok=true);
▪Если - в blacklist, то отклоняет (ok=false).
Архитектура
Микросервис состоит из API, базы данных для хранения настроек и black/white списков. Опционально - хранилище для bucket'ов. Сервис должен предоставлять GRPC или REST API.
Описание методов API
Попытка авторизации
Запрос:
▪login
▪password
▪ip
Ответ:
▪ok (true/false) - сервис должен возвращать ok=true, если считает что запрос нормальный и ok=false, если считает что происходит bruteforce.
Сброс bucket
Должен очистить bucket-ы соответствующие переданным login и ip.
▪login
▪ip
Добавление IP в blacklist
подсеть (IP + маска)
Удаление IP из blacklist
подсеть (IP + маска)
Добавление IP в whitelist
подсеть (IP + маска)
Удаление IP из whitelist
подсеть (IP + маска)
▪Достаточно IPv4
▪Пример подсети: 192.1.1.0/25 - представляет собой адрес 192.1.1.0 с маской 255.255.255.128
▪Во время работы сервиса при поступлении очередного IP мы проходимся по подсетям в черных и белых списках и вычисляем, принадлежит ли IP одной из них.
Конфигурация
Основные параметры конфигурации:
N, M, K
- лимиты по достижению которых, сервис считает попытку брутфорсом.Command-Line интерфейс
Необходимо так же разработать command-line интерфейс для ручного администрирования сервиса. Через CLI должна быть возможность вызвать сброс бакета и управлять whitelist/blacklist-ом. CLI может работать через GRPC/HTTP интерфейс.
Развертывание
Развертывание микросервиса должно осуществляться командой make run (внутри docker compose up) в директории с проектом.
Тестирование
Рекомендуется выделить модуль обработки одного bucket и протестировать его с помощью unit-тестов.
Так же необходимо написать интеграционные тесты, проверяющие все вызовы API.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🔥4❤1👎1
This media is not supported in your browser
VIEW IN TELEGRAM
Минималистичный инструмент командной строки на GO
для передачи файлов P2P.
📝 Инструкция
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍6❤1🤔1