От charta (лат.) или харта — одно из названий папируса.
Необходимо написать сервис Chartographer — сервис для восстановления изображений древних свитков и папирусов. Изображения растровые и создаются поэтапно (отдельными фрагментами). Восстановленное изображение можно получать фрагментами (даже если оно лишь частично восстановленное).
Предполагается, что этим сервисом будет одновременно пользоваться множество учёных.
Необходимо реализовать 4 HTTP-метода:
POST /chartas/?width={width}&height={height}
Создать новое изображение папируса заданного размера (в пикселях),
где {width}
и {height}
— положительные целые числа, не превосходящие 20 000
и 50 000
, соответственно.
Тело запроса пустое.
В теле ответа возвращается {id}
— уникальный идентификатор изображения в строковом представлении.
Код ответа: 201 Created
.
POST /chartas/{id}/?x={x}&y={y}&width={width}&height={height}
Сохранить восстановленный фрагмент изображения размера {width} x {height}
с координатами ({x};{y})
.
Под координатами подразумевается положение левого верхнего угла фрагмента относительно левого верхнего угла всего изображения.
Другими словами, левый верхний угол изображения является началом координат, т.е. эта точка имеет координаты (0;0)
.
Тело запроса: изображение в формате BMP
(цвет в RGB, 24 бита на 1 пиксель).
Тело ответа пустое.
Код ответа: 200 OK
.
Отправлять фрагмент изображения в бинарном формате
GET /chartas/{id}/?x={x}&y={y}&width={width}&height={height}
Получить восстановленную часть изображения размера {width} x {height}
с координатами ({x};{y})
,
где {width}
и {height}
— положительные целые числа, не превосходящие 5 000.
Под координатами подразумевается положение левого верхнего угла фрагмента относительно левого верхнего угла всего изображения.
Другими словами, левый верхний угол изображения является началом координат, т.е. эта точка имеет координаты (0;0)
.
Тело ответа: изображение в формате BMP
(цвет в RGB, 24 бита на 1 пиксель).
Код ответа: 200 OK
.
DELETE /chartas/{id}/
Удалить изображение с идентификатором {id}
.
Тело запроса и ответа пустое.
Код ответа: 200 OK
.
- Запросы по
{id}
изображения, которого не существует, должны завершаться с кодом ответа404 Not Found
. - Запросы с некорректными параметрами
{width}
или{height}
должны завершаться с кодом ответа400 Bad Request
. - Запросы с фрагментами, которые не пересекаются по координатам с изображением, должны завершаться с кодом ответа
400 Bad Request
. При этом фрагменты могут частично находиться вне границ изображения (см. примечания) — такие запросы считаются корректными.
- Размер изображений не превосходит
20 000 x 50 000
. - Некоторые изображения гарантировано не смогут поместиться целиком в памяти. Необходимо предусмотреть возможность хранения данных на диске.
- Формат изображений — BMP. Цветность в RGB (без альфа-канала), 24 бита на пиксель.
- В случае, если загружаемый восстановленный фрагмент перекрывает восстановленную ранее часть, то в любом случае применяется новый фрагмент.
- Если запрашивается фрагмент, часть которого ещё не восстановлена, то не восстановленные области закрашиваются чёрным цветом. Аналогично, чёрным цветом закрашивается та часть фрагмента, которая оказывается вне границ изображения (см. пример ниже).
- Если восстанавливаемый фрагмент перекрывает границы изображения, то часть фрагмента вне изображения игнорируется.
Пример: размер изображения —
50 x 100
, фрагмент с размером50 x 50
и координатами верхнего левого угла(25;25)
. Правая половина фрагмента игнорируется. Схематически изображено ниже.
╔═════════╗
║ ║
║ ┌────╫────┐
║ │ ║ │
║ │ ║ │
║ │ ║ │
║ └────╫────┘
║ ║
╚═════════╝
Ожидается, что решение будет корректно работать в граничных случаях и успешно обрабатывать ошибки. Настоятельно рекомендуется покрыть основную функциональность Unit-тестами.
Сервис будет запускаться в Docker на многоядерной машине.
Контейнеру будет предоставлено не менее 2 Гбайт
оперативной памяти и не менее 20 Гбайт
места на диске.
Некоторые изображения гарантировано не смогут поместиться целиком в памяти. Необходимо предусмотреть возможность хранения данных на диске.
Для того, чтобы провести все проверки и запустить приложение на исполнение одной командой, введите просто команду make ARGS=/path/to/content/folder
, где /path/to/content/folder
— путь до каталога, в котором сервис может хранить данные.