Перекрестная публикация из моего блога Анализируйте данные, а не бредни
Во время моей долгой и не очень известной карьеры в сфере информационных технологий я тайно избавлялся от
«раздражителей» с помощью языка программирования J. Раздражитель — это надоедливая проблема программного обеспечения, которая не заслуживает полномасштабного подхода в стиле проекта. Последнее, чего вы хотите, когда имеете дело с раздражителями, — это привлечь к решению проблемы бюрократов от ИТ. Вы знаете, о ком я говорю: о маленьких ворчливых существах, управляющих проектами, которые всегда превращают маленькие проблемы в большие. Помните ли вы «Agile», когда он действительно был Agile? Теперь, когда я, ориентировочно, на пенсии1 я больше не имею дела с бюрократами в сфере ИТ, но раздражителей по-прежнему много, и я все еще использую J для их устранения. В следующих трех постах я покажу J-решения для некоторых раздражителей, которые могут вас раздражать.
Сегодняшний раздражитель связан с моим увлечением фотографией. Я фотографирую с восьми лет. Чтобы вы поняли, насколько я дотошный человек, у меня до сих пор хранятся негативы пленок из детства, а мне уже почти семьдесят! С 2000 года я редактирую и загружаю цифровые снимки. Многие из них вы можете увидеть на моем сайте SmugMug. В процессе редактирования я использую настоящий программный зоопарк. В процессе работы над изображением я перехожу от одной программы к другой. Некоторые программы уважают и поддерживают метаданные изображения, другие — нет. В конце процесса я переименовываю файл изображения во что-то значимое.2 даже если переименование затрудняет последующее возвращение к исходному файлу.
Если вы редактируете изображения, вы знаете, что работа никогда не закончена. Вы всегда можете
«улучшить» изображение или представить его в новом свете. Я сопротивляюсь желанию переделывать старые визуализации, но иногда, возможно, спустя годы, я возвращаюсь к оригиналу, чтобы что-то «исправить». К сожалению, переименовывая файлы, не всегда легко найти оригинальное изображение.
Это распространенная проблема DAM (Digital Asset Management)!
Существуют десятки программ баз данных изображений, и можно подумать, что базы данных изображений генерируют стабильные ключи изображений. Большинство из них так и делают, но их ключи, как правило, полезны только в контексте базы данных. Вам нужен ключ, привязанный к уникальному битовому шаблону исходного файла изображения. Вам нужен правильный хэш.
Как только вы осознаете необходимость правильных хэшей, возникает вопрос: «Где их хранить?». Можно подумать, что метаданные EXIF или ITPC файла будут идеальным местом. Я попробовал этот подход. Используя превосходную программу exiftool, я вставлял хэши в изображения только для того, чтобы потом наблюдать, как различные редакторы удаляют или искажают их. Боковой элемент XMP (e*Xtensible **Metadata **P*latform)3 был создан для решения этой и других проблем. Файл XMP sidecar обеспечивает безопасный дом для метаданных изображения с дополнительным бонусом: вам никогда не придется трогать или изменять исходный файл изображения. Если вы не относитесь к своим оригинальным RAW-файлам как к священным байтам, с вами что-то не так.
Darktable, мой нынешний любимый разработчик RAW, создает и поддерживает XMP, когда вы добавляете изображения в его библиотеку или применяете неразрушающее редактирование. Правки Darktable хранятся в побочных XMP-файлах, оставляя оригиналы нетронутыми. При экспорте обработанного изображения Darktable создает копию оригинала, применяет все правки, сохраненные в файле sidecar, а затем вставляет элементы метаданных Dublin Core в метаданные IPTC копии. Большинство обработчиков изображений оставляют элементы Dublin Core в покое, поэтому они являются отличным домом для хэш-хаков.
Следующий J-глагол изменяет элемент title
побочного XMP-файла. Он вставляет оригинальное имя файла и хэш SHA256 связанного с ним файла изображения. Элемент title
обычно оставляется редакторами изображений нетронутым. Таким образом, по окончании редактирования вы сохраняете имя исходного файла и его стабильный уникальный хэш.
titbrandxmp=:3 : 0
NB.*titbrandxmp v-- brand xmp sidecar file with file name and
NB. hash of associated image.
NB.
NB. monad: clXmp =. titbrandxmp blImageXmpFiles
NB.
NB. xmp=. 'c:/pictures/2022/Idaho/07_jul/d7500/_DSC8496.NEF.xmp'
NB. ps=. xmp ;~ (-#'.xmp') }. xmp
NB. titbrandxmp ps
NB.
NB. ds=. sidecars 'c:/pictures/2022/North Rim Monument Valley/06_jun/d7500'
NB. xmps=. titbrandxmp&.> <"1 ds
xmp=. read xmp [ 'raw xmp'=. y
NB. single Dubin Core publisher and creator
NB. elements must exist to safely brand
dcp=. '</dc:publisher>';'</dc:creator>'
if. -.1 1 -: +/"1 dcp E.&> <xmp do. xmp return. end.
NB. file name and sha256 brand
tit=. dlf ('/[~(fhash)~]/',shabrand raw) changestr XMPTITLEFRAG-.CR
NB. replace or insert title element
'idx cxmp'=. (tags 'dc:title') cutnestidx xmp
if. #idx do. ;(<tit) idx} cxmp
else.
(pt ,~ pt beforestr xmp),LF,tit,pt afterstr xmp [ pt=. ;0{dcp
end.
)
Подробности использования titbrandxmp
смотрите в J-скрипте brandxmp.ijs
и связанном с ним документе brandxmp.pdf
. Оба этих файла доступны на GitHub. Наслаждайтесь!
Постскриптум: Если у вас уже установлена последняя версия J, вы можете напрямую установить этот скрипт в качестве addon
, введя следующую команду в сессии JQt или JHS.
install 'github:bakerjd99/jackshacks'
NB. load script
load '~addons/jacks/brandxmp.ijs'
-
Я надеюсь, что бешеная инфляция (2022) будет проверена, так что мне не
чтобы мне не пришлось снова выходить на пенсию! -
Каталоги, заполненные сотнями имен типа
_DSC8007.NEF
и -
Файлы Sidecar генерируются и поддерживаются многими программами обработки изображений
многие программы обработки изображений. Формат XMP представляет собой текстовый файл XML. Он может быть
легко разбирать и изменять.