{"id":20531802,"url":"https://github.com/binakot/it_one-cup-java-2022","last_synced_at":"2025-10-10T06:18:17.542Z","repository":{"id":134568688,"uuid":"557186983","full_name":"binakot/IT_ONE-Cup-Java-2022","owner":"binakot","description":"IT_ONE Cup. Чемпионат по Java для middle и senior разработчиков. https://itonecup.sk.ru","archived":false,"fork":false,"pushed_at":"2022-10-25T08:40:30.000Z","size":941,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-06T02:46:32.627Z","etag":null,"topics":["championship","hackathon"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/binakot.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-10-25T08:26:51.000Z","updated_at":"2023-10-13T10:29:08.000Z","dependencies_parsed_at":"2023-06-19T01:40:13.749Z","dependency_job_id":null,"html_url":"https://github.com/binakot/IT_ONE-Cup-Java-2022","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/binakot/IT_ONE-Cup-Java-2022","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/binakot%2FIT_ONE-Cup-Java-2022","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/binakot%2FIT_ONE-Cup-Java-2022/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/binakot%2FIT_ONE-Cup-Java-2022/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/binakot%2FIT_ONE-Cup-Java-2022/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/binakot","download_url":"https://codeload.github.com/binakot/IT_ONE-Cup-Java-2022/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/binakot%2FIT_ONE-Cup-Java-2022/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279002971,"owners_count":26083488,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-10T02:00:06.843Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["championship","hackathon"],"created_at":"2024-11-16T00:09:53.457Z","updated_at":"2025-10-10T06:18:17.514Z","avatar_url":"https://github.com/binakot.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# IT_ONE Cup. Java\n\nОнлайн чемпионат по направлению Java [https://cups.online/ru/contests/itonecup_java](https://cups.online/ru/contests/itonecup_java).\n\nПоборись с другими профессионалами за призовой фонд в размере 740 тысяч рублей и получи предложение о работе в крутой технологической компании!\n\nПроводится на платформе [https://cups.online](https://cups.online).\n\n## Загрузка решения\n\nДля решения задачи Вам нужно отправить в тест-систему собранный Docker-контейнер.\nЧтобы это сделать, необходимо выполнить все действия указанные ниже.\n\n1. Создать решение\n\nРешение задачи состоит из двух частей: реализация Клиента и запуске его на проверочном сервере.\n\nПроцесс разработки Клиента производится у вас локально.\nДля получения результата вам необходимо будет запустить его на нашем проверочном сервере.\n\n2. Собрать контейнер\n\nНеобходимо подготовить Docker-контейнер для тестирования Вашего Клиента и получения результата у нас на сервере.\n\nДля этого создайте Dockerfile.\nОпишите в нем команды, которые нужно выполнить для запуска решения.\nЕсли нужно — используйте дополнительные команды для установки библиотек или создания папок.\nПрисвойте контейнеру тег, который будет использоваться для локального запуска с помощью команды:\n\n```bash\n$ docker build -t my_solution .\n```\n\n3. Авторизоваться в хранилище\n\nПеред отправкой решения в хранилище необходимо авторизоваться.\nДля авторизации используйте следующие данные:\n\n```bash\n$ docker login stor.highloadcup.ru\n\u003e Username: binakot@gmail.com\n\u003e Password: 8d701f4c454f\n```\n\n4. Загрузите контейнер в репозиторий\n\nКвалификация:\n\n```bash\n$ docker build -f builder.Dockerfile -t builder .\n$ docker tag builder stor.highloadcup.ru/it_one_j22_qual/brave_koala\n$ docker push stor.highloadcup.ru/it_one_j22_qual/brave_koala\n```\n\nФинал:\n\nА: \n\n```bash\n$ docker build -f checker.Dockerfile -t checker .\n$ docker tag checker stor.highloadcup.ru/it_one_j22_final/exotic_koala\n$ docker push stor.highloadcup.ru/it_one_j22_final/exotic_koala\n```\n\nB:\n\n```bash\n$ docker build -f checker.Dockerfile -t checker .\n$ docker tag checker stor.highloadcup.ru/it_one_j22_final/elastic_indri\n$ docker push stor.highloadcup.ru/it_one_j22_final/elastic_indri\n```\n\n5. Ожидание результата\n\nОтправленный на проверку контейнер отобразится в интерфейсе рабочего пространства с небольшой задержкой по времени.\nПо каждому загруженному контейнеру Вам отображается его текущий статус.\nПо итогу тестирования решения будет опубликован его результат.\n\n---\n\n## Квалификация\n\nЗадача Квалификационного раунда - проверить базовые знания участников чемпионата и предоставить им возможность лучше подготовиться к финальному заданию.\nУчастниками квалификационного раунда автоматически становятся все зарегистрированные на чемпионат участники.\n\nВам будет дана 1 задача, которую нужно решить за отведенное время. Проверка решений осуществляется полностью автоматически. Задания выполняется каждым участником индивидуально.\nЗа каждую корректную попытку загрузки решения по задаче автоматически рассчитывается балл по методике, которая будет опубликована одновременно с условием задачи.\n\nДля перехода в основной раунд необходимо загрузить хотя бы одно решение, прошедшее автоматическую проверку и набравшее не нулевой балл.\n\n### Раунд 1. Построитель отчетов.\n\nУсловия\nНеобходимо написать Spring-boot приложение, которое сможет управлять in-memory базой данных с помощью REST API.\nОписание API доступно в приложенном файле API.pdf\n\nВаше приложение должно уметь обрабатывать запросы, позволяющие последовательно сформировать “отчет” по базе данных.\nПри этом сама база данных тоже будет наполняться через API.\n\nТаким образом, на входе вашей системы будут запросы с исходными данными и со структурой желаемого отчета,\nа на выходе - агрегированные в соответствии со структурой отчета данные.\n\nПроверка решения будет проводиться внутренними тестами-сценариями.\nТо есть в общем случае, отдельный сценарий тестирования будет заключаться в следующего набора действий:\n\n* формирование структуры БД (добавление таблиц, полей)\n* наполнение БД данными (вставка записей в таблицы)\n* формирование структуры желаемого отчета (конструирование запросов к БД)\n* модификация данных (обновление и/или удаление записей в таблицах БД)\n* получение сформированного отчета\n\nСтрогое соблюдение указанной выше последовательности действий не гарантируется - ваше приложение должно корректно обрабатывать входящие запросы в любой последовательности.\nИ в случаях некорректных или не имеющих смысла запросов приложение должно отвечать соответствующими кодами ошибок (см. описание api).\n\nОбратите внимание!\n\nВ проверяющих тестах задачи квалификационного раунда предусмотрены далеко не все возможные комбинации корректных и ошибочных действий.\nОднако для того, чтобы успешно решить задачу финального раунда, вам необходимо продумать и реализовать уже на этом этапе максимально отказоустойчивое приложение.\nРекомендуется проверять свое решение на собственных тестах - чем больше, тем лучше, вне зависимости от того, какой балл вы уже набрали в рамках квалификации.\n\nКроме того, важно учесть, что финальная версия решения квалификационной задачи будет “зафиксирована” на момент окончания раунда,\nто есть на протяжении финала вы уже не сможете внести в нее изменения.\n\nПример решения\nВо вложенном архиве sample_solution.zip вы можете найти пример минимального решения, иллюстрирующий базовые требования к приложению.\n\nОбновление от 12.08.22 18:30\n\nДля быстрого старта нужно проделать следующее:\n\nустановить Docker, если он еще не установлен\nскачать архив sample_solution.zip, распаковать его\nперейти в появившуюся после распаковки папку sample_solution (в ее корне должен лежать Dockerfile):\ncd sample_solution\nсобрать локальный docker-образ своего решения:\ndocker build -t my_local_quickstart .\nдалее следовать инструкции, размещенной в Рабочем пространстве AllCups (вкладка \"Загрузка решения\") - там будут указаны уникальные для участника параметры (логин, пароль и теги).\n\nОграничения\nМаксимальное время работы приложения: 10 сек.\nМаксимальный объем использованной памяти: 1 Гб\nКоличество попыток в сутки: 20 (счетчик истраченных попыток сбрасывается в 00:00 МСК)\n\nПрочее\nПосле окончания тестирования ваше приложение будет завершено принудительно.\n\n---\n\n## Финал\n\nВ финальном раунде окончательно определяются победители чемпионата.\nВам будут предложена комплексная задача, на решение которой будет отведено 7 дней.\nПроверка решений осуществляется полностью автоматически.\nПодробное описание этапов решения задачи, методики расчета баллов и критериев ручной оценки станет доступно в момент старта Финального раунда.\nЗадания выполняется каждым участником индивидуально.\nВ процессе решения задачи вы будете набирать баллы, рассчитанные автоматически (аналогично Квалификационному раунду).\nЛучшие ваши попытки будут попадать в предварительный лидерборд.\nОднако финальный лидерборд будет опубликован после расчета дополнительных баллов, которые могут быть рассчитаны только после загрузки всех решений от всех участников.\n\n### Раунд 2. Чекер\n\nУсловия\nЗадача финального раунда является продолжением задачи квалификации.\nА именно, теперь вам предстоит разработать собственную тестирующую систему, которая сможет выявить как можно больше уязвимостей в квалификационных решениях других участников (включая свое собственное).\n\nПроверка решений\nAPI задачи остается неизменным, но ваше приложение теперь будет частично выполнять роль \"чекера\" - то есть обращаться к endpoint-ам решений оппонентов через проксирующий сервис основной тестирующей системы. Процесс проверки будет строиться из следующих шагов:\n* Ваше приложение (далее - Чекер) передает прокси-сервису ожидаемый ответ на следующий запрос\n* Чекер формирует непосредственно запрос в соответствии с API и отправляет его прокси-сервису\n* Прокси-сервис тестирует полученный запрос на эталонном решении (далее - Эталон)\n* Если Эталон вернул ответ, совпадающий с ответом, ожидаемым Чекером - тест признается корректным\n* Если тест признан некорректным, работа чекера прекращается, за решение начисляется 0 баллов, а всем квалификационным решениям засчитывается 100 баллов за эту попытку\n* Перед проверкой очередного квалификационного решения прокси-сервис отправляет Чекеру запрос на endpoint /api/start (то есть при корректной работе он вызовется столько раз, сколько будет проверено  квалификационных решений).\n\nСистема начисления баллов\nБалл за финальную задачу будет складываться из двух оценок (по шкале от 0 до 100):\n\n1. Насколько много Чекер участника нашел уязвимостей в квалификационных решениях оппонентов\n\n2. Насколько хорошо квалификационное решение участника противостояло Чекерам оппонентов.\n\nПервая часть будет считаться после каждой отправки попытки и, соответственно, отображаться в рейтинге.\nВторая часть рассчитается после окончания финала и будет скрыта до официальной церемонии оглашения результатов.\nКроме того, к общему итогу будет добавлен балл, набранный в квалификационном раунде.\n\nКак оцениваются тесты\n* Тесты разбиваются на \"группы\" аналогично группам из квалификации:\ntable tests\ntable query tests\nsingle query tests\nreport tests\n* Количество тестов (единичных обращений к endpoint-у) ограничено лимитом по каждой группе. Лимиты также соответствуют баллам из квалификационного раунда:\n30: table tests\n20: table query tests\n20: single query tests\n30: report tests\n* Все тесты равнозначны по «стоимости» - за каждый тест начисляется (точнее - снимается с квалификационного решения) ровно 1 балл.\n* Тестирование квалификационных решений осуществляет прокси.\n* При тестировании квалификационного решения его балл уменьшается со 100 до 0 с каждым непройденным тестом. Ниже нуля балл опуститься не может.\n* Если квалификационное решение не запустилось (недоступно для прокси) или упало в процессе - ему засчитывается 0 бал\n\n* Параметры соединений\nЧекер должен держать открытым порт 9081 (требуется реализовать единственный ендпоинт: /api/start\nПрокси-сервис доступен по базовому URL, который нужно получить из переменной окружения rs.endpoint. Содержимое этой переменной будет состоять из назначенного динамически имени хоста и фиксированного порта:\nhttp://some-host-name:9080\n\nПримечание\nЗагрузка решений в задачу открыта, однако обновления API и проверяющей системы еще возможны.\n\n---\n\n# Итоги\n\n5 призовое место из 144 участников.\n\n![](docs/top5.png)\n\nВидео-трансляция с награждением: [https://www.youtube.com/watch?v=o2HN4JtcR4Q](https://www.youtube.com/watch?v=o2HN4JtcR4Q)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbinakot%2Fit_one-cup-java-2022","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbinakot%2Fit_one-cup-java-2022","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbinakot%2Fit_one-cup-java-2022/lists"}