Giter Site home page Giter Site logo

yadro-project's People

Contributors

v1lezz avatar

Watchers

 avatar

yadro-project's Issues

Задание 9

Web-UI. Шаблоны HTML, Cookies & Redirect.

Цель

Создать простой веб-сервер (html), который будет ходить в наш сервис комиксов и генерировать htmll страницы для поисковой строки и картинок-результатов.

Критерии оценки

  1. Команда make web строит веб сервер web-server, использующий стандартную библиотеку golang net/http.
  2. На запрос GET /login должна возвращаться html форма для ввода пользователя и пароля.
  3. Форма со страницы /login делает POST /login в веб-сервер. Веб-сервер делает POST /login в xkcd-server.
  4. При получении токена из xkcd-server веб-сервер отправляет редирект на страницу /comics и токен в виде cookie.
  5. Страница /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 ).

Материалы для ознакомления

Задание 8

Тестирование. Покрытие и проверка гонок.

Цель

Дополнить решение юнит тестами, добавить в Makefile команды запуска тестов и
определения test coverage. Добиться coverage > 80%

Критерии приемки

  1. make test запускает тесты с -race и -cover, строит html отчет о покрытии. Каждый go файл должен быть покрыт тестами не менее чем на 80%
  2. В Makefile есть команда “lint” проверки форматирования, линтинга и веттинга,
    например, c golangci-lint
  3. В Makefile есть команда “sec” проверки безопасности кода с помощью trivy и govulncheck
  4. Все проверки проходят без замечаний
  5. Есть один простой system тест (shell, curl, etc в помощь), запускается через make e2e:
  • стартует сервер
  • делает update DB
  • ищет комиксы по словам “apple,doctor”
  • Проверяет результаты - должен находиться комикс “apple a day”, https://xkcd.com/2161/

Материалы для ознакомления

Задание 3

Оптимизация производительности Go приложения: многопоточность, конкурентный доступ, кэширование.

Цель

Увеличить скорость работы приложения из задания 2 путем параллелизации запросов и кэширования. Приложение можно прерывать, при старте оно должно продолжить со следующего необработанного комикса. Какое оптимальное количество горутин необходимо? Какие способы “транзакционности” можно придумать?

Количество горутин считывается из конфигурационного файла.

Критерии приемки

  1. Флаги -n и -o не нужны. -с флаг для нахождения конфига, единственный флаг приложения. make build создает xkcd приложение.

  2. Прерывание приложения должно оставлять структуру в database.json в консистентном виде, то есть если успели прочитать 10 комиксов, они должны лежать в database.json в корректном json формате. Пользователь в любой момент может безопасно прервать программу.

  3. Если уже существует database.json, программа должна продолжить с пропущенных комиксов (даже пропуски в середине), принимая во внимание уже считанные.

  4. В конфигурационном файле parallel указывает на количество горутин параллельных запросов к сайту xkcd.com, с комментарием - почему именно такое число.

  5. Имплементация нахождения последнего комикса, считаем, что несуществует страница xkcd.com/info.0.json

  6. (со звездочкой) Корректно отрабатываем сценарий “отключения света/kill -9” (сохраняем обработанные комиксы в БД), а не только ctrl-c

Материалы для ознакомления

Задание 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:

Package based project layout

Задание 7

Ограничение доступа к сервису - authentication/authorization, rate/concurrency limiters.

Цель

Добавить ограничение одновременных запросов к сервису по времени, ограничение запросов от одного пользователя, ограничение доступа к /update.

Критерии приемки

  1. Добавить concurrency limiter в поисковый API, ограничение указывать через опцию конфига "concurrency_limit".
  2. Добавить rate limiter в поисковый API, который должен ограничивать количество запросов в секунду от конкретных пользователей, ограничение указывать через опцию конфига "rate_limit".
  3. Добавить аутентификацию пользователей. Пользователи должны получать JWT токен по своему логину и паролю через POST /login на конфигурируемое время (минуты), опция конфига “token_max_time”.
  4. Пользователей можно хранить в users.json или в DB. Добавить по крайней мере пользователя admin + 2х обычных пользователей.
  5. POST /update должен быть доступен только пользователю admin.

Материалы для ознакомления

Задание 6

Основы работы с SQL. Схемы, миграции.

Цель

Перевести json базу на базу данных SQL.

Критерии приемки

  1. Спроектировать таблицу для базы данных и для индекса.
  2. Создание таблицы должно осуществляться автоматически с помощью
    инструмента migrate, точнее с помощью вызова библиотеки golang migrate при
    старте. Сделать up и down миграции для каждой таблицы.
  3. В качестве сервера используем sqlite, config.yaml должен содержать строчку dsn
    с адресом базы данных.
  4. POST /update заполняет обе таблицы по необходимости.
  5. При GET /pics запросах xkcd-server запрашивает таблицу индексов и комиксов
    для получения результата.

Материалы для ознакомления

Задание 5

Создание и тестирование веб-сервиса.

Цель

Создать веб-сервис, который по REST API выдает по поисковым словам url картинок, a также принимает команду на обновление базы.
Примеры запросов:

POST /update
GET /pics?search=xxx

Рекомендуем для тестирования изучить инструмент curl.
Использование сторонних библиотек при выполнении задания запрещено (только стандартный http pkg, никаких gin/echo/…).
Предусмотреть возможность срабатывания обновления всегда в заданное время суток
В этом задании попробуйте применить так называемую гексагональную архитектуру.

Критерии приемки

  1. make server компилирует приложение сервера xkcd-server
    использует такой же конфиг, что и xkcd. Дополнительно необходимо указать порт флагом -p или опцией port в config.yaml
  2. Сервер использует стандартную http библиотеку для сервиса запросов.
  • POST /update возвращает нам HTTP code ОК после обновления, количество new/total comics в виде JSON.
  • GET /pics?search="I'll follow your questions" возвращает урлы картинок в JSON формате
  1. В определенное время сервер сам (раз в сутки) проверяет наличие новых комиксов.
  2. Есть разделение проекта на независимую core часть и адаптеры

Материалы для ознакомления

Задание 4

Индексация, поиск и ранжирование.

Цель

Создать поисковый индекс для картинок по результатам работы из задания 3. Новое приложение при старте заполняет базу, строит индекс типа keyword -> [id1, id2, id3], нормализует запрос из командной строки, находит соответствия и выдает список url картинок, до 10 штук. Предусмотреть возможные ограничения по времени при выполнении задания.

Критерии приемки

  1. xkcd при запуске проверяет заполнение базы, дозаполняет остатки.
  2. xkcd принимает запрос как в первом задании, с флагом -s:
xkcd -s "I'm following your questions”

Приложение должно найти слова после нормализации в database.json и вывести до 10и наиболее релевантных комиксов - urls

  1. хкcd строит индексный файл index.json c обозначенной в задании структурой, например
{ 
    "question": [101, 202, 568],
    "follow": [35, 68, 303, 234]
}
  1. Добавить флаг -i чтобы поиск шел по индексу.
  2. На сколько быстрее происходит поиск по индексу? Попробовать сделать бенчмарк (go bench tool)
  3. (со звездочкой) Подумать, как лучше ранжировать результаты, если придумали, реализовать.

Материалы для ознакомления

Benchmarks

Поиск

Задание 1

Нормализация поисковых запросов. Стемминг

Цель

Создать CLI приложение, которое нормализует перечисленные в виде аргументов слова (на английском). Приложение должно отсеивать часто употребляемые слова типа of/a/the/, местоимения и глагольные частицы (will), то есть при вводе:
./myapp follower brings bunch of questions
приложение должно вывести на консоль:
follow bring bunch question
Аргументы принимаются на вход из CLI. Для парсинга CLI аргументов необходимо использовать стандартную flag библиотеку.

В этом задании также необходимо начать знакомиться со структурой проектов в Go, на данном этапе все файлы должны находится в одной папке (flat layout)

Критерии приемки

  1. Представить Го проект (@github.com) c простеньким Makefile:
  2. при запуске make без аргументов должен появиться скомпилированный myapp.
  3. myapp -s "i'll follow you as long as you are following me" выводит на экран слова follow long в любом порядке
  4. Flat project layout

В Вашем проекте Github все задания будут во вкладке Issues. Как только Вы закончите работу, отметьте соответствующее Issue как сделанное, переведя его в Closed - Close with Comment.

Если мы решим, что чего-то не достает, мы это прокомментируем и вернем Issue в статус Open. Если нет - все равно прокомментируем.

Можно задавать в комментариях любые вопросы по ходу выполнения задания.

Альтернативно можно создать в своей main ветке pull request и добавить нас в него, вся дискуссия может происходить в этом PR.

Материалы для ознакомления

  1. https://proglib.io/p/git-for-half-an-hour
  2. https://selectel.ru/blog/git-github-review/
  3. https://tutorialedge.net/golang/makefiles-for-go-developers/
  4. https://go.dev/doc/tutorial/create-module
  5. github.com/kljensen/snowball
  6. https://www.calhoun.io/flat-application-structure/

Задание 1.pdf

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.