Программирование

Linux и Large Files

А вот представим, что у меня есть библиотека, собранная с -D_FILE_OFFSET_BITS=64
Все fopen/fseek/fread/fclose там делаются внутри, снаружи только имена файлов прилетают.

А потом я к ней линкую приложение, компилированное без этого флага, просто gcc -c

Вопрос: оно будет работать? Или возможны моментики?

Нет, я не ленивый и конечно попробую, но у меня этих линуксов под рукой штуки две и с новыми ядрами, а что будет со старыми ядрами/glibc/whatever?

P.S. Назначение LARGEFILE_SOURCE/LARGEFILE64_SOURCE так и не понял, вроде бы для позиционирования за 2 гигабайта и чтения мелкими кусками достаточно _FILE_OFFSET_BITS

P.P.S. Единственная система, где вообще не надо париться - FreeBSD :) Какой, оказывается, кусок жизни с этой LFS прошел мимо меня...

Drupal + PostgreSQL (опять, да)

Передайте разработчикам <программы такой-то>, что лучше бы они ее больше не разрабатывали

Похоже, что тестировать варез становится просто немодно, чем дальше, тем больше огорчаюсь.

Про моральных индусов я уже плакался, но там речь шла о 3rd-party модуле, а сейчас удивляюсь прямо таки на Drupal core. Удивляюсь, соответственно, сильнее, ибо для core поддержка PostgreSQL заявлено, а вот с тестированием... впрочем я повторяюсь.

Угадал, блин

Довелось оказаться пророком.

В комментариях к записи про анонс NVidia работающего OpenCL я предположил, что

Конечно, сейчас начнется, они вполне могут начать с драйверов для Линукса (или для 32-битной XP, что от меня столь же далеко)
И угадал, блин. Именно XP-32 и Linux-32. XP-шные бинарники на Висте не работают, несмотря на драйвер нужной версии, ругаются что не могут создать OpenCL context

А у меня Vista (32/64) и MacOS. Ну в Маке, ладно, обещали в заснеженном леопарде, а с вистой что? Руки же чешутся....

На закуску: согласно спекам OpenCL, его можно/нужно кормить исходником прямо на этом самом OpenCL (а это практически C). То бишь компилятор этого самого C сидит прямо в драйвере....

Интересно, насколько успешно это пойдет в индустрию, ведь получается что computing kernel засекретить не выйдет, можно же подсунуть приложению драйвер похожий на настоящий и почитать им исходника. Видятся мне OpenCL-обфускаторы.

LibRaw Lite

почти копия анонса с сайта

По многочисленным заявкам нелюбителей GPL выпущена LibRaw-Lite

Как следует из названия, это облегченная версия LibRaw, основные отличия которой от полной версии таковы:

  • Лицензия LGPL, что позволяет использовать (немодифицированную) библиотеку в не-опенсорсных приложениях.
  • (увы) нет поддержки Foveon в силу лицензионных ограничений на этот кусок dcraw (откуда растут ноги у LibRaw). Мы работаем над этим и возможно предложим какую-то замену.
  • Нет целого ряда улучшений (сделанных нами относительно функциональности dcraw):
    • черная рамка (маскированные пикселы) не извлекается, эти пикселы приложению не доступны;
    • вычитание точки черного и прочая пред-интерполяционная обработка RAW-данных не отключается;
    • способ, которым получены цветовые данные (матрицы RGB-XYZ и т.п.) не запоминается;
    • нет поддержки OpenMP.

Другими словами, все то хорошее что мы сделали в расчете на разработчиков RAW-конверторов, анализаторов RAW и прочие программы, которым нужен доступ к исходным RAW-данным - в Lite-версии отсутствует.

Счастье виртуализации достижимо

У меня дофига работы происходит под VMWare и все полностью устраивало, кроме одного моментика: если засаспендить большую виртуальную машину (скажем с 4-мя гигами RAM), то хост-система (Vista x64) на довольно долгое время (минут 5) впадает в депрессию: реактивность понижается до нуля, на кнопки не реагирует, на мышь тоже, думает о чем-то своем.

Рабочей гипотезой было то, что саспенд пишет в файл, этот файл кэшируется в файловом кэше, а потом медленно и печально выливается на диск. Кэш при этом, естественно, тоже вымыт нафиг и любая мелочь (DLL-ки там) требует доставания с диска, что в свою очередь интерферирует с вышеуказанным выливанием на диск.

Помогли следующие настройки виртуальной машины (которые я ставил вовсе для другого):

MemTrimRate = "0"
sched.mem.pshare.enable = "FALSE"
mainMem.useNamedFile = "FALSE"

Саспенд теперь происходит долго (не единицы секунд, а десятки), но и в процессе саспенда и сразу после него другие программы работают

Vista x64 driver signing hell

Я сделал это!

Потеряно два вечера и еще полдня, система два раза поднималась с бэкапа, но я таки подписал драйвера для Висты-x64 и они таки работают.

История вопроса

Есть такой Argyll CMS, который я уже многократно хвалил за качество CMM-модуля. И вообще, похоже что это необычайно ценный мех варез, ибо качество строимых им профилей необычайно хвалят.

Помимо этого, Argyll умеет работать с i1 Pro в точном режиме: со спектральным разрешением 3.33 нанометра вместо стандартных 10нм, что тешит мою склонность к перфекционизму.

Кроме того, тамошний дисплейный профайлер очень хвалят, хотелось попробовать самому.

Мешало пользовать эту полезную зверушку следующее обстоятельство:

  • Argyll использует libusb, которая конечно есть для Windows, но тамошние драйвера неподписаны, а значит на 64-битной висте можно этим пользоваться, только если при загрузке нажать F8 и выбрать режим, отключающий проверку подписи.
  • Если ставить кроме libusb еще и тамошний модуль фильтра (чтобы можно было использовать тот же i1 и из стандартных приложений), то без загруженного драйвера вся система не работает, а входит в вечный цикл перезагрузки.
  • Но нажимать всякий раз F8 на загрузке - мучительно и противно.

Drupal Comment Notify (опять)

Drupal закричал мне, что у меня все устарело, нужно срочно апгредиться. Ну, как он любит. Поапгрейдил, в том числе и Comment Notify до версии 1.2, про натягивание которого на Postgresql я уже писал.

Поапгрейдив, имею вопрос: а что, в MySQL у поля написано NOT NULL, то там самостоятельно появится еще и DEFAULT ...? Потому что я не верю, что автор Comment Notify его совсем не тестирует, однако в нем:

  • В таблице заводится крайне полезное поле, позволяющее не слать повторные нотификации если комментарий редактировался. Но оно NOT NULL и без DEFAULT.
  • Вставка в эту таблицу делается без инициализации данного поля.

Патчить можно или сам модуль или процедуру инсталляции/апгрейда. Точнее, без правки .install никак не обойтись, поэтому вот минимальный патч, который превращает Comment Notify 1.2 в работающий под Postgresql (про MySQL ничего не знаю, не проверял):

comment-notify-1.2-install.diff.gz

Если вы переезжаете с Comment Subscribe, то нужно выполнить еще две SQL-команды (чтобы уже разосланные нотификации не рассылались повторно):

UPDATE comment_notify set notified=1;
UPDATE comment_notify set notify=1 where cid in (SELECT cid FROM z_com
mentsubscribe WHERE subscribe > 0);

LibRaw 0.7 Release

Вышла LibRaw 0.7. В том смысле, что "не бета".

Поскольку эта версия полностью совместима (на уровне исходных текстов) с версиями 0.5 и 0.6, поддержка старых версий прекращается вот прямо сегодня.

Что нового

По отношению к 0.7-BETA5:
RAW-данные с сенсоров Fuji SuperCCD раскладываются по правильным цветовым каналам на этапе распаковки RAW, а не на фазе постпроцесинга, как оно было ранее.

Это важно для тех приложений, которые самостоятельно делают дебайеризацию и вообще постпроцессинг. Кроме того, пример 4channels стал правильно работать с файлами с вышеупомянутых камер.

По отношению к ветке 0.6.x:
  • Извлекаются (и доступны в приложении) данные черной рамки
  • Приложению доступны "совсем необработанные" RAW-данные: без вычитания точки черного, замазывания нулевых пикселов и наложенной тоновой кривой.
  • Новая input framework. На ее основе поддержано чтение из файла и из буфера в памяти, реализовать собственное чтение совсем несложно.
  • Для камер Fuji доступны исходные (неповернутые) позиции пикселов.
  • Новые тестовые приложения unprocessed_raw и 4channels, позволяющие посмотреть на непроцессированные данные.

LibRaw 0.6.15 и 0.7-BETA5

Если вы используете LibRaw 0.6.14, то вам полезно было бы обновиться до 0.6.15. В предыдущей версии - обидная ошибка (переполнение) в генерации гамма-кривой.

Кроме того, в 0.6.15 и в 0.7-BETA5 инкорпорирована новая dcraw. Из существенного: улучшена и генерализована поддержка PEF-файлов Pentax.

качать отсюда

свежие версии LibRaw

Для читающих анонсы тут, а не на libraw.su/org

Вышли новые версии LibRaw. Все изменения довольно существенные:

  • Поддержан Pentax K2000/K-m
  • Поддержана правильная распаковка sRAW от Canon 5D Mark II с последней версией firmware
  • При использовании встроенного постпроцессинга можно задать свою gamma-curve (с опциональным линейным участком в начале)

Opera of the Phantom или сказание о канделябре

452_1.jpg Вся эта история с PhantomOS интересна тем, что будучи еще vapourware оно всколыхнуло в людях пласты и позволило заглянуть в многочисленные бездны. Ссылок на дискуссии не даю, кому интересно - уже все видели.

Вместе с тем, dz продолжает утверждать, что всякий JIT на виртуальной машине рулит примерно не хуже, чем макроассемблер, известный нам под именем C/C++.

К сожалению, у него там в комментариях каптча даже для авторизованных пользователей, я через себя переступить не могу, приходится писать у себя и отдельно.

Да, действительно, судя по этим бенчмаркам Java временами рулит. Но что мы можем сказать про эти бенчмарки:

  1. Они старые, 2003-й год, updated в 2004. Конечно, JIT за это время мог развиться на неимоверные высоты, однако и процессоростроители на месте не стояли, в i7, как я слышал, уже 3 SSE-юнита на ядро, а нормальное программирование SSE - это никакая не автовекторизация компилятором, а натурально фигурное выпиливание прямо на его ассемблере.
  2. Что это за бенчмарки - мне с первого взгляда ясно не стало. Если это обращение матрицы 100x100, которая влезает в кэш L1 - это одно. Если это относительно большие данные, то плохие (не cache-aware) алгоритмы будут одинаково плохи, ибо cache miss будет стоить гораздо дороже, чем эффективность или неэффективность JIT. И, соответственно, выигрыши-провалы на тех графиках - это косвенное указание на то, попали или не попали в кэш.

Вместе с тем, быстрое пользование гуглом навело на реальную имплементацию FFT и реальные бенчмарки в сравнении не с каким-то левым sample/микробенчмаркой, а с кодом, который действительно доводится годами и считается оптимальным или близким к этому.

Расщепи своих каналов

Выпустил LibRaw 0.7-BETA1.

Каких-либо изменений собственно библиотеки в сравнении с предыдущей Alpha6 нет, но зато добавлено новое тестовое приложение, которое мне кажется очень полезным в хозяйстве:

4channels - сохраняет RAW-файл в виде четырех отдельных TIFF-файлов, по одному на канал.

Movable Type 4.23

Решил по случаю воскресенья поапргейдить блоговый движок. C Movable Type 4.21 на 4.23.

Обнаружил неприятность: в поиске (включая поиск по тегу) пролюбили локализацию дат. То бишь, независимо от настроек блога, название месяцев пишутся английские, а формат даты тоже тамошний (Месяц, число год).

DNG, уровень черного и dcraw

В стандарте DNG 1.2 правильной поддержке уровня черного уделена масса внимания: можно задать базовый паттерн произвольного размера с разными уровнями (скажем, поканальными) и коррекцию этого паттерна для каждой конкретной строки и столбца. Для большинства практических применений этого достаточно, нормально описать таким способом нельзя, пожалуй, только неповернутый паттерн Fuji SuperCCD.

Надо сказать, что Adobe DNG Converter креативно пользуется этими возможностями. Скажем, для новых камер Canon (смотрел 50D и 5DmkII) считается только базовое значение, тогда как для старых (смотрел 400D) считается уровень черного для каждой строки. И это правильно, товарищи!

Но вот dcraw, а за ней и все приложения, использующие её код, начиная с LightZone и ACDSee, а заканчивая LibRaw, поступают с этими данными тупо и глупо: все что есть в DNG-файле усредняется и это среднее вычитается из всех значений.

Естественно, это все касается только тех форматов данных, где вычитание базового черного не делает сама камера. Из распространенных - это камеры Canon (все), ряд моделей Sony и многие P&S камеры.

Как следствие, если в DNG-файле и были данные для подавления бандинга и прочих подобных безобразий, на этапе обработки ими не пользуются и бандинг не подавляется.

Пользователи LibRaw будут со временем осчастливлены кодом получше, а вот пользователям других производных от dcraw я бы посоветовал форматом DNG без нужды не увлекаться.

LibRaw 0.7.0 Alpha5

Спешу анонсировать LibRaw 0.7.0-Alpha-5

Эта альфа завершает цикл крупных изменений, затеянных в версии 0.7. В последней версии новая схема чтения, реализованная поверх C++-враппера, коий враппер каждый может заточить под свои нужды (одна из высказанных пользователями нужд, например, это извлечение метаданных из начала файла, который качается по PTP).

Как обычно, я очень заинтересован в фидбеке, особенно от разработчиков использующих LibRaw, но и просто проблемные файлы (если у вас что-то упало или не так раскодировалось) весьма интересны.

Записки разработчика RAW-обработчика

bug3.jpg Поправил сегодня серьезную багу в LibRaw, что заставило меня призадуматься о жизни. Если в подробностях, то:

  • У некоторых мыльниц (ряд моделей Nikon, Pentax, Samsung, Casio) режим RAW включается через инженерное (скрытое) меню.
  • В этих RAW нет никаких метаданных, а только данные с сенсора, обычно просто дамп байтов в каком-то некомпрессированном формате.
  • Метаданные сохраняются в JPEG-файле с обычным снимком, который записывается рядом (с тем же именем файла и другим расширением или же с другим номером файла).
  • В dcraw, а оттуда и в LibRaw есть поддержка этого составного формата: вычисляется имя файла, открывается, загружается EXIF.

И вот эта вот поддержка - категорически не работала. Даже хуже: наличие JPEG с метаданными приводило к неправильной распаковке собственно RAW, а отсутствие этого файла - к падениям.

Эта ошибка была начиная с LibRaw 0.0 и до сегодняшнего дня. И ни одна зараза - не заметила. Несмотря на то, что LibRaw уже несколько месяцев используется в digiKam и Krita, а у этих программ должны быть десятки тысяч пользователей, если не больше.

Смерть Кащея

Смерть Кащея в игле, игла в яйце, яйцо в утке, утка в зайце, заяц в шоке!

Все-таки общедоступность работающих контейнеров в STL (и не только в STL) - это зло. И добро, конечно, тоже, ибо можно левой ногой делать действительно сложные структуры данных, но результат временами доставляет.

Не хочу (сначала хотел, потом передумал) разбирать конкретный код, просто замечу, что возможность сделать список указателей на "слово с атрибутами", причем "слово с атрибутами" - содержит список основ с флагами, а каждая основа - это std::string - это отличная возможность.

Я бы такую сложную структуру руками запрограммировать бы быстро не сумел (да и не стал бы), а несколько дней выпиливал бы какое-нибудь zero-copy решение, которое копий строк не содержит (или по-возможности не содержит).

Fuji SuperCCD: сложно о сложном

Расположение пикселов разной чувствительности и цвета на сенсоре SuperCCD, помимо того, что маркетинг Fuji изрядно запудрил всем уши, само по себе нетривиально. Я не уверен, что у меня получится легко про него рассказать (хотя это уже третий пост на данную тему), но буду пробовать.

Во-первых, диагональность. Диагонали на это сенсоре есть в том смысле, что классическое байеровское чередование G-R-G-R в одной строке и B-G-B-G в другой имеется именно по диагоналям. Если ходить по строкам и столбцам, то чередование более сложное (и не спрашивайте какое, тут стаканом не обойтись).

RAW еще сырее: LibRaw 0.7.0-A4

Отрываю ненужные куски от LibRaw (попавшие туда из dcraw) и никак не могу остановиться. В очередной версии сделал отключаемым пропускание RAW-данных через тоновую кривую.

Естественно, этот режим работы может быть интересен только тем, кто сам пишет RAW-конверторы или анализаторы RAW или подобные вещи. Ну и любопытствующим, ибо поставляемый в составе библиотеки пример unprocessed_raw (в версиях под Win32/Mac/Linux он лежит скомпилированным и готовым к использованию) способен эту опцию включить и показать ваши данные прямо как они из файла раскодированы.

Тоновая кривая есть не во всех камерах и форматах данных, среди распространенных это Nikon (compresssed NEF) и Sony A700/A900 (8-битный cRAW)

Достаточно очевидно, что от тоновой кривой нет вреда (или практически нет вреда) если выходное пространство шире чем входное, скажем из 8 бит делаем 12 (как оно у Sony). А вот если входное и выходное пространство имеют одинаковую битность, а кривая отлична от линейной, то мы обязательно потеряем градации. Такое должно случаться, насколько я понимаю, с 12-битными NEF-ами, было бы прикольно, если бы кто-то проверил.

Аналогично предыдущему анонсу просьба: если unprocessed_raw -N падает на каком-то файле, то я хочу этот файл пощупать.

LibRaw 0.7.0 Alpha-3: еще более RAW

Я точно знаю, что есть люди, читающие анонсы LibRaw именно здесь, остальным придется потерпеть.

В третьей альфе LibRaw 0.7.0 случились две группы существенных идеологических изменений и одна группа несущественных:

  1. Данные для камер FujiFilm распаковываются без поворота на 45 градусов. Это открывает путь к легкому получению 12-мегапиксельных картинок с Fuji S5Pro и прочим подобным радостям. При этом, горизонтальное разрешение должно быть заметно лучше, чем у 6-мегапиксельных, выдаваемых dcraw и всеми использующими этот код.
    Посмотреть на реальные RAW-данные Fuji можно с помощью примера unprocessed_raw, очень поучительно (чтобы извлечь второй кадр, используйте ключ -s 1).
  2. Не менее сильно поработали над PhaseOne:
    • Придуман и для PhaseOne реализован режим (не)фильтрации данных, отключающий тоновую кривую для RAW (более raw-данных вы еще не видели!). Идея мне настолько понравилась, что в следующих версиях тоновую кривую можно будет отключить для всех случаев, когда она есть (Nikon NEF, Adobe DNG, далее везде).
    • Рассчитанные камерой уровни черного доступны в метаданных
    • Исправлена ошибка расчета уровня черного, имеющаяся в dcraw (впрочем, на результат она влияет не очень сильно).
  3. Ну и по мелочи: баги, ключ -s у unprocessed_raw, импортирована свежа версия dcraw.

Более подробно и более формально в changelog, скачивать с той же страницы

Я очень заинтересован в фидбеке, прежде всего в примерах файлов, с которыми вышеописанное чудо не смогло справиться (упало, выдало не то и так далее).

Pages

Subscribe to Программирование