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

RawDigger + RawSpeed, вторая попытка

Если репортить об ошибках, то они будут исправлены. Качаем-тестируем RawDigger+RawSpeed, вторую попытку:

Исправлена "ошибка строчной развертки" для форматов, где использовался RawSpeed, а длина строки RAW была некратна 8. Таких, на удивление, немного.

Пишу новым сообщением для тех, кто через RSS читает.

Mac: RawDigger+RawSpeed

Граждане фотографы-маководы!

Помимо виндовой версии, RawDigger с встроенным RawSpeed теперь доступен и для Mac:

Качаем: по ссылке из этого поста

Это альфа-версия: тестировано на нескольких маках, теперь хочется на живых тестерах.

Что изменилось:

  • Открытие файлов .CR2, .NEF, compressed-.DNG - должно стать заметно быстрее. Файлов .ARW, .PEF, .SRW, .ORF, .RW2 - несколько быстрее (незаметно).
  • Для файлов с камер Sony (не всех) - значения пикселов и уровня черного умножатся на 4.
Других видимых изменений быть не должно, все остальное должно быть как в версии 0.9.12. Если у вас изменилось что-то еще, особенно в худшую сторону - пишите.

Второе невидимое (я надеюсь) изменение - это переход с Qt 4.8.1 на Qt 4.8.3.

Update: достоверно известно о глюках со старыми .CR2 (30D, 5D), репортить уже не надо.

RawDigger + RawSpeed = RawDigger

Можно попробовать: качаем по ссылкам из этого поста.

В чем фишка:

Большие файлы CR2, NEF, жатые DNG - открываются на 300-500мс быстрее на быстрой машине (i7-2600k@4.5Ghz), на медленных разница должна быть еще заметнее. На других поддерживаемых RawSpeed форматах (Sony, Panasonic, Olympus, Pentax, Samsung) - разница тоже есть, но не такая большая. Все неподдерживаемые форматы открываются, как и ранее, LibRaw.

Больше (кроме файлов Sony о которых ниже) - фишки не должно быть (еще чуть больше памяти используется). Собственно, это и хочется проверить.

Сравнить можно открыв закладку Preferences, менять положение галки и жать Apply. Если при этом не меняются статистики, гистограммы и т.п. - то все отлично.

Что мне интересно:

  • Есть ли какие-то форматы кроме Sony, где данные и/или результаты рендеринга заметно отличаются. Тестовые файлы пока не нужны, достаточно марки камеры.
  • Может оно вообще глючит и не работает, тоже интересно.
Про Sony:

RawSpeed возвращает значения пикселов для Sony в 4 раза бОльшие, чем LibRaw. Это ни на что не влияет в реальной жизни. При этом, конечно, на такое плавание уровня черного машинка не рассчитана и при нажатии Apply и стоящей галке 'Reset Black Level on file load' - ничего не поресетится в диалоге.

Это нормально и надо забить т.к. в следующих версиях поддержка Sony RawSpeed-ом будет отключена: разница в скорости для этого формата копеечная (не сотни миллисекунд как для CR2, а десятки), изменение значений в 4 раза рвет башню, а всякие полезные вещи вроде 'ARW2 Hack' и отключения тоновой кривой - не работают т.к. RawSpeed ничего такого не умеет.

Update: достоверно известно о глюках со старыми .CR2 (30D, 5D), репортить уже не надо.

Печально я гляжу

Есть такая libjpeg-turbo - тот же LibJPEG, только там часть внутря переписана на SIMD-ассемблере для большей скорости и лучшести.

Линкуюсь я значит с ней, а линкер (виндовый) мне и говорит, у тебя в DEFAULTLIB не того, один хочет одного (MSCVRT), а другой - вовсе другого (LIBCPMT), ЕВПОЧЯ.

Начинаю разбираться, вроде все библиотеки сам собирал, сам им всем /MD у компилятора говорил. Разобрался.

В CMakeLists.txt у этого самого libjpeg-turbo написано:

if(MSVC)
  # Use the static C library for all build types
  foreach(var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
    CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
    if(${var} MATCHES "/MD")
      string(REGEX REPLACE "/MD" "/MT" ${var} "${${var}}")
    endif()
  endforeach()
endif()
Если простыми словами: для самых умных, которые пишут /MD (threaded DLL library), мы втихаря заменим на /MT (другая библиотека, threaded static).

Риторический Нериторический вопрос: что они там курят то? Ну вот какая может быть идея в том, чтобы явно заданные ключи компилятора втихую переписать на свои?

Нет, я правда не понимаю. Ну вот допустим у меня все другие части проекта - с другим рантаймом и я точно это знаю. Ну и зачем мне эта самодеятельность?

LibRaw+RawSpeed=LibRaw :)

RawSpeed - это такая библиотека раскодирования RAW, которая:
  1. Очень быстрая (к примеру, 21-мегапиксельный файл от Canon 5D2 распаковывается на моей машине за 230мс, а код на основе dcraw делает это за 750мс. Притом, это сильно улучшенный мной код, до улучшений было больше секунды, насколько я помню).
  2. Поддерживает мало форматов, правда все они популярные (свежие камеры Canon, Nikon, Olympus, Panasonic, Pentax, Samsung и DNG-файлы).
Авторы darktable давно просекли эту фишку и используют LibRaw как fallback на неизвестных камерах, а как основную библиотеку для открытия RAW - используют RawSpeed.

В то же время, RawSpeed распаковывает данные в буфер с очень похожим (но немного разным) форматом, поэтому использовать RawSpeed в качестве читалки файлов изнутри LibRaw (но иметь при этом единый API, единый постпроцессинг и т.п.) - было делом техники. И эта техника - применена в LibRaw 0.15-Alpha4.

Что получилось

  • LibRaw::open_file()+LibRaw::unpack() /т.е. распаковка/ - в ~3 раза быстрее на CR2, в ~2-2.5 раза быстрее на NEF, в 1.5-2 раза быстрее на прочих поддерживаемых форматах. Реально это заметно на больших NEF и CR2 (выигрыш в 400-500 миллисекунд на моей i7-2600K @4.5Ghz), соньки и раньше распаковывались быстро, а у остальных форматов редко бывают совсем уж большие файлы.
  • dcraw_emu -h ..список из 182 файлов.. - без RawSpeed было 150 секунд, стало 100 секунд. Разница "не в 2-3 раза" потому что постпроцессинг не изменился (хотя с -h он и так быстрый)

RawDigger 0.9.12 (technical preview 1)

Граждане фотографы и примкнувшие к ним!

Я последние четыре месяца пинал балду и забыл где у программирования хвост, а где - педали. Поэтому мне немножко страшно выпускать очередной RawDigger сразу на широкую публику, хочется потестировать на добровольцах.

Вот он:

Мне интересны глюки, мешающие выпуску на широкую публику: падения, полностью неправильное поведение и т.п. Всякая мелочь, вроде разрешенного "Average green" для черно-белых RAW - не является шоу стоппером (в частности, по той причине, что монохромных камер у людей - примерно ноль).

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

Отдельная просьба: не надо эту версию более нигде анонсировать. Если она работает, то буквально завтра я ей поменяю название и номер билда - и выпущу. А если нет, то надо же доделывать. На неприслушавшихся к этой просьбе - затаю.

Что новенького

A: OpenGL book Q: OpenGL compatibility

Отвечаю сам себе, вдруг кому-то еще интересно.

  1. Из всех просмотренных книжек больше всего показалась Learning Modern 3D Graphics Programming, потому что она от fixed pipeline полностью отвязана. Только OpenGL 3+, только хардкор (хотя CoreProfile в Qt и не работает нормально, текстуры не аплоадятся).

    PDF-ная версия и примеры берутся отсюда.

    Буду теперь ея читать.

  2. Вообще, оно (OpenGL) отвратительное. Вот, например:
    glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
    И теперь надо запомнить, что glVertexAttribPointer() работает с тем буфером, которому сделали Bind() последнему. Как-то это не так, неправильно.

    Отчего в glVertexAttribPointer не передается идентфикатор буфера?

  3. Отвратительно оно и в частности. Более всего меня потрясло, когда Qt-шный пример с крутящимися кубиками (и текстурами с цифрами 1-6 на гранях) я запустил на WinXP под VMWare. Кубики крутились, но грань у кубиков была одна, последняя (с шестеркой), предыдущие пять текстур куда-то подевались. Это не OpenGL3 (на VMWare только 2.1). На Win7 в той же VMWare - у кубиков по 6 граней, но отображается на всех - только одна текстура, первая. Смеялсо.
Отсюда вопросы:
  • Оно вообще с совместимостью как? Можно ли рассчитывать, что OpenGL-приложение вообще работает (на случайно отобранной системе), или это сильно как повезет?
  • Сужая предыдущий вопрос: если требовать OpenGL 3+, то не будет ли с совместимостью лучше (на тех системах, естественно, где этот самый 3+ есть)?
  • Ну и чего я лишаюсь, требуя 3+ (т.е. оборудование класса DX10, как я понимаю)? Ну вот я сам накопал: Mac OS 10.6 и старше, интеловская встроенная графика старше SandyBridge, а еще что?

Q: OpenGL book

Вот смотрю я на профили исполнения RawDigger и вижу, что на отрисовку пиксельного буфера там уходит заметное время. Особенно заметное, если картинка здоровая, а кроме перерисовки - ничего не происходит (скажем, каналы RAW переключаются).

Решение, казалось бы, очевидное: загнать это самое RAW в виде текстуры в видеокарту и рисовать дальше уже средствами видеокарты же. Пиксельные шейдеры и все такое. Короче, OpenGL.

Разглядывание (несколько дней на даче сидел и разглядывал) всяких простых OpenGL-ных примеров навело меня на очевидную мысль - я нихрена в этом не понимаю совсем. А пора бы уже.

Отсюда вопрос: какую книжку "OpenGL для чайников за 21 день" вы бы мне посоветовали? На басурманском бегло читаю, наверное надежнее читать исходник, а не перевод.

От OpenGL мне, по большому счету, нужно банальное 2D: показ двумерной картинки, с зумированием (и показ участка), может быть наложение в 2D нескольких слоев с регулируемой прозрачностью. Идеальным был бы tutorial именно в этом вот духе.

О новых технологиях

Было (это результат профайлера, разложенный по тредам):

Через два дня работы и ~800 строк кода стало (естественно, на тех же параметрах и входных данных):

Реально постобработка маленьких картинок ускорилась в 6 раз, больших - в 4. Почему маленькие быстрее - Х.З. Может быть кэши рулят. Это без учета распаковки, которая в профиль включена (и, увы, она для LJPEG не параллелится, если оный LJPEG не порезан на кусочки, как в DNG).

Имею сказать:

Q: rtdsc clock

Я извиняюсь, а как совместимым образом узнать, на какой частоте TSC clock работает?

Ну то есть на винде я вовсе QueryPerformanceCounter/QueryPerformanceFrequency использую, а как быть на Linux/Mac?

Про Look and Feel

Пользователи мак-версии RawDigger вероятно заметили уже, что окошко гистограмм очень широкое.

А широкое оно оттого, что контролов много. Окну же сказано уменьшаться только до тех пор, пока все контролы видны.

А вот как это отрисовывает Qt под разными ОС (окно завернуто в минимальную ширину):

По клику откроется полный размер.

Сверху вниз:
  • Mac Native (и такой spacing так и задуман) - ширина окна 1088 пикселов и меньше не делается.
  • Результат применения setStyle(QStyleFactory::create("windows")); - 908 пикселов, на 20% меньше.
  • Win7 Native (без каких-то настроек spacing) - 821 пиксел, еще на 10% меньше.
Эксперимент не полностью чистый: маковский десктоп 1920x1200 и никаких настроек шрифтов не делалось, на винде шрифты увеличены (115%), а разрешение монитора 2560x1600. В полностью одинаковых условиях винды, скорее всего, будут еще компактнее (пробовать страшно, потрогав размер шрифта у винды есть риск обратно не вернуться).

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

Update: Добрые люди подсказали про Qt::WA_MacMiniSize. Результат - 859 пикселов ширины. Чуть хуже винды, но непринципиально. Хотя, конечно, спинбоксы по мне выглядят чуть мелковато.

Qt+Xcode = !

По следам вот этой записи:

Changes 4.8.1 (Qt):

.....
Qt for Mac OS X
....
- Add support for XCode 4 into qmake [QTBUG-17247]
...

Похоже, мой блог читают :)

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

Картинка дня

Кто не понял про что это - смотрите теги :)

Qt - рулит. Ну то есть я не разобрался (пока?) с динамическими библиотеками, Frameworks и прочими страшными словами, поэтому с LibRaw слинковался статикой.

Ну, естественно, повылезало всякого, но умеренно:

С++: invalid initialization of non-const reference of type 'foo&' from an rvalue of type 'foo'

Вот представим себе такой вот зачин:

class foo
{
public:
 foo(int aa, int bb) : a(aa),b(bb){}
 int A() { return a;}
 int B() { return b;}
private:
 int a,b;
};

int func(foo& f) { return f.A()*f.B();}
Почему передача по reference? Ну это, типа, дешевле. Для структуры из двух полей вероятно плевать, а если там std::string содержащий "Войну и Мир"? При передаче по значению оно же должно скопироваться?

А теперь пытаемся это использовать:

int main()
{
    return func(foo(1,2));
}
g++ (4.6, если важно) ругается и говорит:
error: invalid initialization of non-const reference of type 'foo&' from an rvalue of type 'foo'
А Visual Studio 2010 жрет нормально.

Qt+Xcode = ?

Делаем так:

qmake -spec macx-xcode somefile.pro
Дальше напускаем туда (на получившийся pbproj) Xcode 4.2, Xcode с грохотом падает. Ну то есть известная проблема, как выясняется, но ведь ей минимум полгода?

Качаю Xcode 3.2 (4гига однако, еще где-то час).

Чтобы два раза не вставать. Я правильно понимаю, что если я соберу некий варез как 64-битный, то он не будет работать на Intel Macs с Core Solo (т.е. на очень старых Mac Mini) ну и естественно на PPC. А на всех остальных - будет, независимо от битности ОС, верно?

Разгадки Code Signing (окончательные)

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

Первая гипотеза была в том что UAC oчень умный и о чем-то таком догадывается. Похоже, это не мой случай - в моем тестовом окружении подписанная программа без слова Setup (Install, Update) в имени файла (и в детальной информации о файле - тоже) - все одно ругается лишним предупреждением.

А вот вторая - оказавшаяся правильной - идея была про манифест файла. И действительно, у моего инсталлятора в манифесте написано:

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
        <requestedPrivileges>
            <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
        </requestedPrivileges>
    </security>
</trustInfo>
А у "хорошего" ACDSee (равно как у Orfo, других не смотрел) прямо в манифесте требуются права администратора:

Разгадки Code Signing (пока - только гипотеза)

Задал вопрос в Информатик, отчего ваша Орфо не выдает мне Secutity Warning в моем тестовом окружении, а много других программ (включая и наш RawDigger) - выдают.

Получил ответ: ничего такого не делали, никакой уличной магии, просто подписываем, еще вот Win7 Logo получили.

Тогда попроверял всякий пробованный варез (штук 20 разных инсталляторов) на выдачу Security Warning и на нахождение в Windows 7 Compatibility List. Получается вот что:

  • Подавляющее количество инсталляторов программ из этого списка запускаются без Security Warning.
  • Подавляющее количество того что не в списке - запускается с таким предупреждением.
  • Исключения, коих единицы, но есть:
    • Evernote 4.5 - запускается с Warning. В списке есть версия 4 (м.б. 4.5 и 4 - считаются разными).
    • Coretemp - взлетает мухой, без Warning, хотя в списке ее нет. Правда инсталлятор представляется как IntelliQ (это такая платформа монетизации бесплатных приложений), может быть его сертифицировали под каким-то еще соусом.

      Webmoney - нет в списке, но все работает.

Есть еще такие наблюдения:

Загадки Code Signing

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

Освоил SignTool и все что к нему прилагается, на девелоперской машине все работает как хочется, ура.

Начинаю проверять, запускаю виртуальную машину, где никаких моих сертификатов вроде как нет. Собранный мной дистрибутив доступен через VMWare Shared Folders.

Жмякаю на сваренный мной инсталлятор и вижу такое вот:

Не, ну это лучше, конечно, чем 'Software from unknown published хочет нагадить вам на компьютер', но счастья недостаточно.

О Code Signing

Хочу сказать, что процедура выдачи Verisign Code Signing сертификатов, если пользоваться вот прямо их средствами, какая-то ужасающая:

  • Приватный ключ (сгенерированный Verisign) приезжает в формате .p12
  • Сертификат - в формате PEM
  • Signtool хочет все вместе в формате .PFX (он же, похоже, .p12)
При этом - никаких инструкций "как с этой фигней взлететь" (для сертификатов сайтов - хоть есть "как это все поставить в Apache"), только строгое предупреждение в E-mail, по смыслу такое:
  • Вам обязательно нужны два intermediate-сертификата, возьмите их отсюда.
  • А на странице где эти сертификаты - две textarea с сертификатами, дескать Select All и сохраните в текстовый файл.

Кроме того, в E-mail инструкции строго написано, что скачивать сертификат можно строго на том компьютере, который делал запрос. Что делать, если за прошедшее время машинка дала дуба (а нам рисовали сертификат 2 недели, не верьте что в Штатах все быстро) - неизвестно.

На этом фоне рождаются душераздирающие инструкции вроде всосите все в MSIE и им экспортируйте, но они годятся только если private key уже импортирован в систему (например, сделан MS-овской тулзой, которая сразу инсталлирует сделанный ключ в систему), скачаный с Verisign приватный ключ - не импортируется.

Под катом - инструкция, как все починить с помощью OpenSSL (записки для себя):

Друпальское: аккуратно разложенные грабли в pager

Для памяти, чтобы не забыть.

Со всей дури налетел на эту вот особенность: Pager missing if views is installed.

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

Только вот в одном случае строится список комментариев с pager, а в другом - нет.

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

  • Блок Views с pager у меня таки был.
  • А в тех дизайнах, где pager под комментариями появлялся - просто не выводился этот блок из Views.
Штатное лечение - каждому pager во views - задать уникальный (по сайту) Pager ID, благо средства для этого есть. Риторический вопрос только один, а почему этот Pager ID сразу не формируется уникальным, ну там из ID view и номера блока в нем.....

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

Pages

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