Выбор идеи для пет-проекта на Go
Я как раз в новостях прочитал про очередное OSINT-расследование по GPS-координатам из фоток. Любопытно. Почему бы не анализировать EXIF и прочие метаданные?
К тому же это не накладывало на меня никаких обязательств, так как это хоть и не создание 100500-й версии ToDo-списков или домашних финансов, но различных бесплатных EXIF-сервисов в интернете просто море, практически в каждом графическом редакторе есть просмотр и изменение мета-тегов, уже не говоря про мегапопулярную опенсурсную утилиту ExifTool.
Собрал для реализации короткий список типов изображений, которые поддерживают именно EXIF мета-теги: JPEG, TIFF, PNG и WebP. Небольшой список. Ведь некоторые популярные форматы (такие как BMP) вообще не содержат встроенных метаданных. А другие же (как GIF) могут содержать лишь метки XMP, но их можно засунуть почти всюду и я решил не распыляться.
Хотя именно для GIF я хотел сделать исключение и даже добавил его в детектирование типов файлов для извлечения меток, но потом о нем позорно забыл. Это к слову, о необходимости иметь проигнорированный мною PRD (концепция, требования и поведение) даже на микро-уровнях пет-проектов.
Поскольку я все равно "вскрывал" бинарники картинок и вытаскивал EXIF, то решил заодно вытащить другие популярные (благодаря Photoshop) форматы: IPTC и XMP.
Библиотечные функции анализа файлов сами по себе не интересны и потому к ним нужен интерфейс. Я выбрал все возможные варианты: работа в консоли с аргументами командной строки, работа в консоли в режиме каналов (Piping), работа как web-сервер и работа в привычном оконном графическом интерфейсе.
Я старался максимально опираться на стандартную библиотеку, но там не предусмотрели работу с GUI и пришлось выбирать среди ряда популярных вариантов:
- Wails, что-то типа Electron - нужно описать HTML-интерфейс, который будет работать поверх встроенных WebView2/WebKit;
- Gio, который использует нативные графические элементы из DirectX, Metal и Vulkan/OpenGL, что полнофункционально, но каждая из платформ требует отдельную разработку;
- Fyne, требующий декларативное описание интерфейсов, которые будут выглядеть плюс-минус похожи на всех платформах, но требуют определенный компилятор C для сборки под нужную архитектуру.
Поскольку десктопные вебаппы меня всегда бесили, а с почти нативной разработкой интерфейса связываться не хотелось, то я выбрал последний вариант - Fyne.
Но полностью от веб-интерфейса не отказался. Для демонстрации работы в режиме веб-сервиса добавил демо-страницу, которая демонстрировала работу с API на примере анализа предложенного изображения.
#AI #ИИ #эксперимент #обучение