yadro-project's Issues
Задание 8
Тестирование. Покрытие и проверка гонок.
Цель
Дополнить решение юнит тестами, добавить в Makefile команды запуска тестов и
определения test coverage. Добиться coverage > 80%
Критерии приемки
- make test запускает тесты с -race и -cover, строит html отчет о покрытии. Каждый go файл должен быть покрыт тестами не менее чем на 80%
- В Makefile есть команда “lint” проверки форматирования, линтинга и веттинга,
например, c golangci-lint - В Makefile есть команда “sec” проверки безопасности кода с помощью trivy и govulncheck
- Все проверки проходят без замечаний
- Есть один простой system тест (shell, curl, etc в помощь), запускается через make e2e:
- стартует сервер
- делает update DB
- ищет комиксы по словам “apple,doctor”
- Проверяет результаты - должен находиться комикс “apple a day”, https://xkcd.com/2161/
Материалы для ознакомления
Задание 2
Работа с REST API
Цель
Создать CLI приложение, которое скачивает с сайта http://xkcd.com описание всех комиксов, нормализуя слова. На выходе должен получиться json файл вида
{
“101”: {
“url”: “https://imgs.xkcd.com/comics/laser_scope.jpg”,
“keywords”: [“follow”, “question”]
},
“102”: {
…
}
То есть карта комиксов по ID, в качестве значения - URL картинки и список ключевых слов.
Используем стандартный http package, URL-путь до источника должен быть задан в конфигурационном файле.
Приложение должно поддерживать опциональный аргумент -o, при котором вывод программы отправляется на экран и -n для ограничения количества комиксов.
Каждый комикс идентифицируется целым числом, которому соответствуют страница комикса, например, https://xkcd.com/2651/, URL для описания https://xkcd.com/2651/info.0.json и URL картинки, спрятанной в JSON-e.
Рекомендуем при отладке ограничить ID комикса, например до 100.
Проект необходимо организовать по пакетам (папкам).
Критерии приемки
- Представить Го проект (@github.com), c Makefile. При запуске make без аргументов должен появиться скомпилированный xkcd.
- В корневой директории лежит config.yaml файл, в котором пользователь может задать параметры: source_url - по умолчанию https://xkcd.com, db_file - по умолчанию database.json
- Запуск xkcd создает database.json c описанной в задании структурой.
- Также xkcd может принимать опциональный флаг -o чтобы выводить на экран JSON структуру и -n для вывода максимум n записей о комиксах.
- Package based project layout, минимум три папки:
- cmd/xkcd (здесь лежит main.go)
- pkg/xkcd (клиент для xkcd.com)
- pkg/words (типы и функции для нормализации)
- pkg/database (типы и функции для работы с JSON DB, она же файл)
Материалы для ознакомления
HTTP & REST & JSON:
- https://www.practical-go-lessons.com/chap-35-build-an-http-client
- https://blog.logrocket.com/using-json-go-guide/
- https://www.digitalocean.com/community/tutorials/how-to-use-json-in-go
- https://cloud.yandex.ru/ru/docs/glossary/rest-api
Package based project layout
Задание 6
Основы работы с SQL. Схемы, миграции.
Цель
Перевести json базу на базу данных SQL.
Критерии приемки
- Спроектировать таблицу для базы данных и для индекса.
- Создание таблицы должно осуществляться автоматически с помощью
инструмента migrate, точнее с помощью вызова библиотеки golang migrate при
старте. Сделать up и down миграции для каждой таблицы. - В качестве сервера используем sqlite, config.yaml должен содержать строчку dsn
с адресом базы данных. - POST /update заполняет обе таблицы по необходимости.
- При GET /pics запросах xkcd-server запрашивает таблицу индексов и комиксов
для получения результата.
Материалы для ознакомления
- Go & SQL
- Sqlite & migrate
- Чистая архитектура (для ознакомления)
Задание 9
Web-UI. Шаблоны HTML, Cookies & Redirect.
Цель
Создать простой веб-сервер (html), который будет ходить в наш сервис комиксов и генерировать htmll страницы для поисковой строки и картинок-результатов.
Критерии оценки
- Команда make web строит веб сервер web-server, использующий стандартную библиотеку golang net/http.
- На запрос GET /login должна возвращаться html форма для ввода пользователя и пароля.
- Форма со страницы /login делает POST /login в веб-сервер. Веб-сервер делает POST /login в xkcd-server.
- При получении токена из xkcd-server веб-сервер отправляет редирект на страницу /comics и токен в виде cookie.
- Страница /comics предназначена для поискового запроса и содержит форму для запроса. Если GET /comics был выполнен из этой формы, веб-сервер возвращает страницу с формой запроса и картинки результатов (GET /comics?search=apple,doctor vs GET /comics).
Критерий приемки
Снять небольшой ролик (mp4, animated gif, etc) с демонстрацией пунктов 1-5 и приложить его к Заданию 9 в GitHub или в свой репозиторий (например, чтобы он показывался на главной странице, как в https://github.com/vlad-belogrudov/rational ).
Материалы для ознакомления
Задание 1
Нормализация поисковых запросов. Стемминг
Цель
Создать CLI приложение, которое нормализует перечисленные в виде аргументов слова (на английском). Приложение должно отсеивать часто употребляемые слова типа of/a/the/, местоимения и глагольные частицы (will), то есть при вводе:
./myapp follower brings bunch of questions
приложение должно вывести на консоль:
follow bring bunch question
Аргументы принимаются на вход из CLI. Для парсинга CLI аргументов необходимо использовать стандартную flag библиотеку.
В этом задании также необходимо начать знакомиться со структурой проектов в Go, на данном этапе все файлы должны находится в одной папке (flat layout)
Критерии приемки
- Представить Го проект (@github.com) c простеньким Makefile:
- при запуске make без аргументов должен появиться скомпилированный myapp.
- myapp -s "i'll follow you as long as you are following me" выводит на экран слова follow long в любом порядке
- Flat project layout
В Вашем проекте Github все задания будут во вкладке Issues. Как только Вы закончите работу, отметьте соответствующее Issue как сделанное, переведя его в Closed - Close with Comment.
Если мы решим, что чего-то не достает, мы это прокомментируем и вернем Issue в статус Open. Если нет - все равно прокомментируем.
Можно задавать в комментариях любые вопросы по ходу выполнения задания.
Альтернативно можно создать в своей main ветке pull request и добавить нас в него, вся дискуссия может происходить в этом PR.
Материалы для ознакомления
Задание 7
Ограничение доступа к сервису - authentication/authorization, rate/concurrency limiters.
Цель
Добавить ограничение одновременных запросов к сервису по времени, ограничение запросов от одного пользователя, ограничение доступа к /update.
Критерии приемки
- Добавить concurrency limiter в поисковый API, ограничение указывать через опцию конфига "concurrency_limit".
- Добавить rate limiter в поисковый API, который должен ограничивать количество запросов в секунду от конкретных пользователей, ограничение указывать через опцию конфига "rate_limit".
- Добавить аутентификацию пользователей. Пользователи должны получать JWT токен по своему логину и паролю через POST /login на конфигурируемое время (минуты), опция конфига “token_max_time”.
- Пользователей можно хранить в users.json или в DB. Добавить по крайней мере пользователя admin + 2х обычных пользователей.
- POST /update должен быть доступен только пользователю admin.
Материалы для ознакомления
- Rate limiters:
- Middleware:
- JWT:
Задание 5
Создание и тестирование веб-сервиса.
Цель
Создать веб-сервис, который по REST API выдает по поисковым словам url картинок, a также принимает команду на обновление базы.
Примеры запросов:
POST /update
GET /pics?search=xxx
Рекомендуем для тестирования изучить инструмент curl.
Использование сторонних библиотек при выполнении задания запрещено (только стандартный http pkg, никаких gin/echo/…).
Предусмотреть возможность срабатывания обновления всегда в заданное время суток
В этом задании попробуйте применить так называемую гексагональную архитектуру.
Критерии приемки
- make server компилирует приложение сервера xkcd-server
использует такой же конфиг, что и xkcd. Дополнительно необходимо указать порт флагом -p или опцией port в config.yaml - Сервер использует стандартную http библиотеку для сервиса запросов.
- POST /update возвращает нам HTTP code ОК после обновления, количество new/total comics в виде JSON.
- GET /pics?search="I'll follow your questions" возвращает урлы картинок в JSON формате
- В определенное время сервер сам (раз в сутки) проверяет наличие новых комиксов.
- Есть разделение проекта на независимую core часть и адаптеры
Материалы для ознакомления
- Старый способ сделать http server
- 1.22 http
- Гексагональная архитектура
Задание 3
Оптимизация производительности Go приложения: многопоточность, конкурентный доступ, кэширование.
Цель
Увеличить скорость работы приложения из задания 2 путем параллелизации запросов и кэширования. Приложение можно прерывать, при старте оно должно продолжить со следующего необработанного комикса. Какое оптимальное количество горутин необходимо? Какие способы “транзакционности” можно придумать?
Количество горутин считывается из конфигурационного файла.
Критерии приемки
-
Флаги -n и -o не нужны. -с флаг для нахождения конфига, единственный флаг приложения. make build создает xkcd приложение.
-
Прерывание приложения должно оставлять структуру в database.json в консистентном виде, то есть если успели прочитать 10 комиксов, они должны лежать в database.json в корректном json формате. Пользователь в любой момент может безопасно прервать программу.
-
Если уже существует database.json, программа должна продолжить с пропущенных комиксов (даже пропуски в середине), принимая во внимание уже считанные.
-
В конфигурационном файле parallel указывает на количество горутин параллельных запросов к сайту xkcd.com, с комментарием - почему именно такое число.
-
Имплементация нахождения последнего комикса, считаем, что несуществует страница xkcd.com/info.0.json
-
(со звездочкой) Корректно отрабатываем сценарий “отключения света/kill -9” (сохраняем обработанные комиксы в БД), а не только ctrl-c
Материалы для ознакомления
Задание 4
Индексация, поиск и ранжирование.
Цель
Создать поисковый индекс для картинок по результатам работы из задания 3. Новое приложение при старте заполняет базу, строит индекс типа keyword -> [id1, id2, id3], нормализует запрос из командной строки, находит соответствия и выдает список url картинок, до 10 штук. Предусмотреть возможные ограничения по времени при выполнении задания.
Критерии приемки
- xkcd при запуске проверяет заполнение базы, дозаполняет остатки.
- xkcd принимает запрос как в первом задании, с флагом -s:
xkcd -s "I'm following your questions”
Приложение должно найти слова после нормализации в database.json и вывести до 10и наиболее релевантных комиксов - urls
- хкcd строит индексный файл index.json c обозначенной в задании структурой, например
{
"question": [101, 202, 568],
"follow": [35, 68, 303, 234]
}
- Добавить флаг -i чтобы поиск шел по индексу.
- На сколько быстрее происходит поиск по индексу? Попробовать сделать бенчмарк (go bench tool)
- (со звездочкой) Подумать, как лучше ранжировать результаты, если придумали, реализовать.
Материалы для ознакомления
Benchmarks
- https://habr.com/ru/articles/268585/
- https://blog.logrocket.com/benchmarking-golang-improve-function-performance/
Поиск
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.