{"id":21024699,"url":"https://github.com/dmitrii-artuhov/chartographer","last_synced_at":"2025-06-25T13:06:31.830Z","repository":{"id":156136288,"uuid":"471753745","full_name":"dmitrii-artuhov/chartographer","owner":"dmitrii-artuhov","description":"Test project for Kontur internship summer 2022","archived":false,"fork":false,"pushed_at":"2022-03-20T18:38:58.000Z","size":34,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-13T18:23:53.519Z","etag":null,"topics":["cmake","cpp","http-server","image-processing"],"latest_commit_sha":null,"homepage":"","language":"C++","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/dmitrii-artuhov.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-03-19T16:40:06.000Z","updated_at":"2022-03-20T17:19:35.000Z","dependencies_parsed_at":null,"dependency_job_id":"ba0ddc4a-99f0-47d3-ae43-9575078da006","html_url":"https://github.com/dmitrii-artuhov/chartographer","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/dmitrii-artuhov/chartographer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmitrii-artuhov%2Fchartographer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmitrii-artuhov%2Fchartographer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmitrii-artuhov%2Fchartographer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmitrii-artuhov%2Fchartographer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dmitrii-artuhov","download_url":"https://codeload.github.com/dmitrii-artuhov/chartographer/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmitrii-artuhov%2Fchartographer/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261879316,"owners_count":23223739,"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","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":["cmake","cpp","http-server","image-processing"],"created_at":"2024-11-19T11:28:12.131Z","updated_at":"2025-06-25T13:06:31.805Z","avatar_url":"https://github.com/dmitrii-artuhov.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Chartographer\n\nОт **charta** (*лат.*) или **харта** — одно из названий [папируса](https://ru.wikipedia.org/wiki/Папирус).\n\nНеобходимо написать сервис **Chartographer** — сервис для восстановления изображений древних свитков и папирусов.\nИзображения растровые и создаются поэтапно, отдельными фрагментами.\nВосстановленное изображение можно получать фрагментами, даже если оно лишь частично восстановленное.\n\n## HTTP API\n\n### Методы\n\n#### `POST /chartas/?width={width}\u0026height={height}`\n\nСоздать новое изображение папируса заданного размера (в пикселях),\nгде `{width}` и `{height}` — положительные целые числа, не превосходящие `20 000` и `50 000`, соответственно.\nТело запроса пустое.\nВ теле ответа возвращается `{id}` — идентификатор изображения, например: `876b8335-3279-4f59-9718-570f37f076ea`.\nКод ответа: `201 Created`.\n\n#### `POST /chartas/{id}/?x={x}\u0026y={y}\u0026width={width}\u0026height={height}`\n\nСохранить восстановленный фрагмент изображения размера `{width} x {height}` с координатами `({x}; {y})`.\nПод координатами подразумевается положение левого верхнего угла фрагмента относительно левого верхнего угла всего изображения.\nДругими словами, левый верхний угол изображения является началом координат, т.е. эта точка имеет координаты `(0; 0)`.\nТело запроса: изображение в формате BMP (цвет в RGB, 24 бита на 1 пиксель, без сжатия).\nТело ответа пустое.\nКод ответа: `200 OK`.\n\n#### `GET /chartas/{id}/?x={x}\u0026y={y}\u0026width={width}\u0026height={height}`\n\nПолучить восстановленную часть изображения размера `{width} x {height}` с координатами `({x}; {y})`.\nПод координатами подразумевается положение левого верхнего угла фрагмента относительно левого верхнего угла всего изображения.\nДругими словами, левый верхний угол изображения является началом координат, т.е. эта точка имеет координаты `(0; 0)`.\nТело ответа: изображение в формате BMP (цвет в RGB, 24 бита на 1 пиксель, без сжатия).\nКод ответа: `200 OK`.\n\n#### `DELETE /chartas/{id}/`\n\nУдалить изображение с идентификатором `{id}`.\nТело запроса и ответа пустое.\nКод ответа: `200 OK`.\n\n### Обработка ошибок\n\n1. Запросы по `{id}` изображения, которого не существует, должны завершаться с кодом ответа `404 Not Found`.\n1. Запросы с некорректными параметрами `{width}` или `{height}` должны завершаться с кодом ответа `400 Bad Request`.\n1. Запросы с фрагментами, которые не пересекаются по координатам с изображением, должны завершаться с кодом ответа `400 Bad Request`.\nПри этом фрагменты могут *частично* находиться вне границ изображения (см. примечания) — такие запросы считаются корректными.\n\n### Примечания\n\n1. Размер изображений не превосходит `20 000 x 50 000`.\n1. Некоторые изображения гарантировано не смогут поместиться целиком в памяти.\nНеобходимо предусмотреть возможность хранения данных на диске.\n1. Формат изображения — [Microsoft/Windows BMP](https://en.wikipedia.org/wiki/BMP_file_format), RGB, 8 бит на компоненту без сжатия.\n1. В случае, если загружаемый восстановленный фрагмент перекрывает восстановленную ранее часть, то в любом случае применяется новый фрагмент.\n1. Если запрашивается фрагмент, часть которого ещё не восстановлена, то не восстановленные области закрашиваются чёрным цветом.\nАналогично, чёрным цветом закрашивается та часть фрагмента, которая оказывается вне границ изображения (см. пример ниже).\n1. Если восстанавливаемый фрагмент перекрывает границы изображения, то часть фрагмента вне изображения игнорируется.\nПример: размер изображения — `50 x 100`, фрагмент с размером `50 x 50` и координатами верхнего левого угла `(25;25)`.\nПравая половина фрагмента игнорируется. Схематически изображено ниже.\n\n```\n╔═════════╗\n║         ║\n║    ┌────╫────┐\n║    │    ║    │\n║    │    ║    │\n║    │    ║    │\n║    └────╫────┘\n║         ║\n╚═════════╝\n```\n\nОжидается, что решение будет в первую очередь корректно работать и успешно обрабатывать ошибки. В качестве усложнения задачи предлагается:\n1. Гарантировать корректную работу с изображениями, которые не смогут поместиться целиком в оперативной памяти. Необходимо предусмотреть возможность хранения данных на диске.\n1. Гарантировать стабильную работу сервиса в нагруженной среде на многоядерной машине.\n\nЛучше предоставить *более простую, но корректно работающую* реализацию, чем пытаться сделать самый сложный вариант, но в итоге не отправить решение.\n\nНастоятельно рекомендуется покрыть основную функциональность unit-тестами.\n\n## Начальный проект\n\nДля сборки начального проекта необходимо установить:\n\n- [cmake](https://cmake.org/)\n- [conan](https://conan.io/)\n- компилятор с поддержкой C++17\n\nСобрать проект можно через консоль:\n\n```sh\ncmake -S . -B /path/to/build/dir\ncmake --build /path/to/build/dir --config Release\n```\n\nгде `/path/to/build/dir` — директория, содержащая сконфигурированный проект и артефакты сборки.\nБинарный файлы после сборки сохраняются в поддиректории `build/bin/\u003cconfig\u003e/`.\n\nДля удобства разработки проект был разделён на три компоненты:\n\n- `core` — статическая библиотека, хранящая основную логику программы.\n- `server` — веб-сервер.\n- `tests` — модульные тесты.\n\nС этой структурой легко автоматизировать проверку корректности программы\nили её отдельных частей — достаточно выделить проверяемую логику в компоненту\n`core` и написать на неё тесты в `tests`. ;)\n\nВ проект включены следующие библиотеки:\n\n- POCO: [оф. сайт](https://pocoproject.org/), [документация](https://pocoproject.org/documentation.html).\n- stb: [репозиторий](https://github.com/nothings/stb), [пост о загрузке/сохранении изображений](https://solarianprogrammer.com/2019/06/10/c-programming-reading-writing-images-stb_image-libraries/).\n- Catch2: [документация](https://github.com/catchorg/Catch2/blob/v2.13.4/docs/Readme.md).\n- Microsoft GSL: [документация](http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#S-gsl), [репозиторий](https://github.com/Microsoft/GSL)\n\nТ.к. POCO — крупный фреймворк, поэтому ниже приведены ссылки на ознакомление с модулями, необходимыми для выполнения задания:\n\n- [Applications](https://pocoproject.org/slides/190-Applications.pdf).\n- [Network programming](https://pocoproject.org/slides/200-Network.pdf).\n- [URI and UUID](https://pocoproject.org/slides/160-URIandUUID.pdf).\n\n## Требования к оформлению решения\n\n- Компиляция кода и его исполнение c использованием C++17.\n- Код должен быть кросс-платформенным, т.е. нельзя использовать компиляторо-зависимые расширения языка и стандартной библиотеки.\n- Использование только тех библиотек, что добавлены в начальный проект.\n- Сборка сервиса при помощи cmake.\n- Запуск сервиса осуществляется командой `server -f /path/to/content/folder`, где `/path/to/content/folder` – путь до каталога, в котором сервис может хранить данные.\n- В архиве должны находиться только исходные коды.\n- Сервис должен принимать HTTP-запросы на стандартном порту (`8080`).\n\n\u003e В качестве исключения допустимо использовать иные библиотеки, но в таком случае проект должен собираться\n\u003e на ОС Windows с Visual Studio 2019 (16.11.9) и на ОС Linux с GCC 10 без дополнительной настройки окружения.\n\n## Информация по тестированию\n\nСервис будет запускаться в Docker. Контейнеру будет предоставлено не менее 2 Гбайт оперативной памяти и не менее 20 Гбайт места на диске.\n\n## Возможные проблемы\n\n### После добавления исходных файлов, они не появляются в проекте / не участвуют в сборке.\n\nПосле создания исходных файлов нужно переконфигурировать проект.\nДля этого нужно ввести команду `cmake /path/to/build/dir`.\nЕсли рабочая директория является директорией проекта, то достаточно — `cmake .`\n\n### Конфигурация CMake завершается ошибкой `HTTPSConnectionPool(host='conan.bintray.com', port=443): Max retries exceeded with url: /v1/ping`\n\n`conan.bintray.com` — устаревший репозиторий пакетов Conan. Добавьте новый репозиторий командой:\n\n```sh\nconan remote add -i 0 conancenter https://center.conan.io\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdmitrii-artuhov%2Fchartographer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdmitrii-artuhov%2Fchartographer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdmitrii-artuhov%2Fchartographer/lists"}