Задача разработать сервис, через который продавцы смогут передавать нам свои товары пачками в формате excel (xlsx). UI делать не нужно, достаточно только API.
Сервис принимает на вход ссылку на файл и id продавца, к чьему аккаунту будут привязаны загружаемые товары. Сервис читает файл и сохраняет, либо обновляет товары в БД. Обновление будет происходить, если пара (id продавца, offer_id) уже есть у нас в базе. В ответ на запрос выдаёт краткую статистику: количество созданных товаров, обновлённых, удалённых и количество строк с ошибками (например цена отрицательная, либо вообще не число).
Для проверки работоспособности сервиса нужно так же реализовать метод, с помощью которого можно будет достать список товаров из базы. Метод должен принимать на вход id продавца, offer_id, подстрока названия товара (по тексту "теле" находились и "телефоны", и "телевизоры"). Ни один параметр не является обязательным, все указанные параметры применяются через логический оператор "AND".
В каждой строке скачанного файла будет содержаться отдельный товар. Колонки в файле и соответствующие значения полей товара следующие:
- offer_id уникальный идентификатор товара в системе продавца
- name название товара
- price цена в рублях
- quantity количество товара на складе продавца
- available true/false, в случае false продавец хочет удалить товар из нашей базы
Наши ожидания
- язык программирования Go
- предоставлена инструкция по запуску приложения. В идеале (но не обязательно) – использовать контейнеризацию с возможностью запустить проект командой docker run/docker-compose up
- в качестве БД использована Postgres
- код выложен на github
Усложнения
- написаны тесты
- проведено нагрузочное тестирование с целью понять, с какой скоростью сервис может переваривать файлы
- реализована асинхронная схема работы, т.е. сервис принимает запрос, сразу возвращает id задания и в отдельной горутине начинает его выполнять. Клиент может узнать статус задания отдельным запросом.
ставьте ❤️, если подобный контент вам полезен
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Необходимо создать HTTP-сервис, способный ограничивать количество запросов (rate limit) из одной подсети IPv4. Если ограничения отсутствуют, то нужно выдавать одинаковый статический контент.
Требования:
язык: Go
код должен быть выложен на GitHub
ответ должен соответствовать спецификации RFC 6585
IP должен извлекаться из заголовка X-Forwarded-For
подсеть: /24 (маска 255.255.255.0)
лимит: 100 запросов в минуту
время ожидания после ограничения: 2 минуты
Пример: после 20 запросов с IP 123.45.67.89 и 80 запросов с IP 123.45.67.1 сервис возвращает 429 ошибку на любой запрос с подсети 123.45.67.0/24 в течение двух последующих минут.
Усложнения:
- покрытие тестами
- контейнеризация, возможность запустить с помощью docker-compose up
- размер префикса подсети, лимит и время ожидания можно задавать при старте сервиса
- отдельный handler для сброса лимита по префиксу
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Airflow должен быть легким в работе и развитии.
Новый инструмент astro-cli от астрономов предназначен для помощи пользователям в работе с облаком и не охватывает все рабочие процессы разработки.
Это не очень хорошо работает с докером, потому что для докера недостаточно подготовки в докер-коммуникациях.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Go Инструмент для исправления опечаток.
go install github.com/sheepla/og@latest
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Задача
Необходимо создать сервис для хранения и подачи объявлений. Объявления должны храниться в базе данных. Сервис должен предоставлять API, работающее поверх HTTP в формате JSON.
Требования
- Язык программирования Go
- Финальную версию нужно выложить на github.com (просьба не делать форк этого репозитория, дабы не плодить плагиат);
- Простая инструкция для запуска (в идеале — с возможностью запустить через docker-compose up, но это необязательно);
- 3 метода: получение списка объявлений, получение одного объявления, создание объявления;
- Валидация полей: не больше 3 ссылок на фото, описание не больше 1000 символов, название не больше 200 символов;
Если есть сомнения по деталям — решение принять самостоятельно, но в своём README.md рекомендуем выписать вопросы и принятые решения по ним.
Детали
Метод получения списка объявлений
- Пагинация: на одной странице должно присутствовать 10 объявлений;
- Cортировки: по цене (возрастание/убывание) и по дате создания (возрастание/убывание);
- Поля в ответе: название объявления, ссылка на главное фото (первое в списке), цена.
Метод получения конкретного объявления
- Обязательные поля в ответе: название объявления, цена, ссылка на главное фото;
- Опциональные поля (можно запросить, передав параметр fields): описание, ссылки на все фото.
Метод создания объявления:
- Принимает все вышеперечисленные поля: название, описание, несколько ссылок на фотографии (сами фото загружать никуда не требуется), цена;
- Возвращает ID созданного объявления и код результата (ошибка или успех).
Усложнения
Не обязательно, но задание может быть выполнено с любым числом усложнений:
- Юнит тесты: постарайтесь достичь покрытия в 70% и больше;
- Контейнеризация: есть возможность поднять проект с помощью команды docker-compose up;
- Архитектура сервиса описана в виде текста и/или диаграмм
- Документация: есть структурированное описание методов сервиса.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Qrcp – инструмент для передачи файлов по Wi-Fi с компьютера на мобильное устройство, по QR-коду, не выходя из терминала
При вызове команды qrcp поднимается автоматически на случайном порте.
go get github.com/claudiodangelis/qrcp
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Эта статья содержит бесплатные онлайн-курсы по изучению Golang на таких сайтах, как freeCodecamp, YouTube, Udemy и Coursera, так же мы порекомендуем вам полезные телеграм каналы для изучения Go.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Пакет с Набором тривиальных функций, которые могут упростить жизнь при написание кода.
go get github.com/samber/lo@v1
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Начнем с простой задачи
Where my anagrams at?
Что такое анаграмма?
Aнаграмма – перестановка букв в слове или словосочетании, вследствие чего возникает другое слово или словосочетание. Два слова являются анаграммами друг друга, если они оба содержат одни и те же буквы.
Нппример:
'abba' & 'baab' == true
'abba' & 'bbaa' == true
'abba' & 'abbba' == false
'abba' & 'abca' == false
Напишите функцию, которая найдет все анаграммы слова из списка. Вам будет дано слово и массив со словами. Вы должны вернуть массив всех анаграмм для этого слова или пустой массив, если их нет. Например:
anagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada']) => ['aabb', 'bbaa']
anagrams('racer', ['crazer', 'carer', 'racar', 'caers', 'racer']) => ['carer', 'racer']
anagrams('laser', ['lazing', 'lazy', 'lacer']) => []
Решение:
package kata
import (
"sort"
)
type Word string
type Words []string
func Anagrams(word string, words []string) []string {
sorted := Word(word).Sorted()
areAnagrams := func(b Word) bool {
return sorted == b.Sorted()
}
return Words(words).Filter(areAnagrams)
}
func (ctx Word) Sorted() Word {
sorted := []rune(ctx)
sort.SliceStable(sorted, func(i, j int) bool {
a := sorted[i]
b := sorted[j]
return a < b
})
return Word(sorted)
}
func (ctx Words) Filter(predicate func(x Word) bool) Words {
var filtered Words
for _, x := range ctx {
if predicate(Word(x)) {
filtered = append(filtered, x)
}
}
return filtered
}
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Последняя цифра огромного числа
Для данного списка
{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
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
📚 Лучшие бесплатные книги Golang 2023.
Есть много доступных книг по GO, некоторые полезные, некоторые не очень. Я думаю, что если вы изучаете Go, вы должны стремиться читать как можно больше книг.
✔️ Смотреть список
@Golang_google
Есть много доступных книг по GO, некоторые полезные, некоторые не очень. Я думаю, что если вы изучаете Go, вы должны стремиться читать как можно больше книг.
✔️ Смотреть список
@Golang_google
— встроенной базы данных SQLite + realtime subscriptions,
— удобной панели администратора,
— встроенного управления файлами и пользователями,
— и удобного REST-API.
✔️ Документация
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Нужно реализовать 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
conc — это ваш набор инструментов для структурирования конкуренции в Go, который делает обычные задачи проще и безопаснее.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
git clone [email protected]:mikestefanello/pagoda.git
cd pagoda
make up
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from DevOps
Я помню свой третий demo-проект. После сборки и тестирования проекта всё работало. В тот момент я отправил его человеку, который должен был демонстрировать его вместо меня. И вот, не задача, во время запуска возникла ошибка...
Чтобы сохранить собственную репутацию, я начал производить отладку. Проект не запускался потому, что тому человеку нужно было обновить программное обеспечение, чтобы у него работали новые функции. Я помог ему в этом, и, о чудо, всё заработало!
А теперь представьте, если бы мне нужно было разослать данный проект не одному человеку, а десятерым. Тогда мне пришлось бы помогать каждому, перенастраивать их компьютеры, чтобы новые функции успешно работали. Думаю, я бы испытал огромный стресс…
Было бы отлично, если бы существовало такое ПО, с помощью которого можно было бы упаковать всё необходимое для работы приложения в одном месте, а потом поделиться этим файлов с коллегами. Они бы скачивали файл и запускали его, при этом не получая ошибку. Но ведь такая программа существует! И называется она Docker.
Docker помогает решать эти проблемы. В этой статье объясняются основные концепции Docker, а также показано то, как создавать контейнеры для ваших приложений.
➡️ Читать дальше
@DevOPSitsec
Please open Telegram to view this post
VIEW IN TELEGRAM
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
Какое чудесное платье! Стоит только поискать платья в веб-пространстве, как потом практически невозможно избежать интернет-рекламы с новыми моделями. Что же происходит при нажатии на такие коммерческие предложения? Мы попадаем на сайт магазина, где представлена подробная информация о товаре. Но вот вопрос: эти данные поступают из одного и того же сервиса или собираются из разных сервисов и отправляются пользователям? В статье мы рассмотрим второй вариант, а именно шлюз API.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Пример 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