This wiki is not enabled for mail processing. Contact the owner of the wiki, who can enable email.

Clear message

Журнал ошибок, проявившихся при разработке проекта Bombono DVD

Pазработка современного ПО построена по модульному принципу. Так, Bombono DVD использует такие проекты, как Boost, Gtk, SCons и другие (всего 10 явных зависимостей, есть и неявные). Однако помимо преимуществ наследуются недостатки и ошибки, включая будущие. С некотого момента я решил завести журнал заметок, в который записываю технические проблемы, проявившиеся в ходе разработки, которые зависели/зависят не от меня (но решать-то все равно пришлось).

Смысл в том, чтоб на основе полученных данных более объективно подходить к выбору с кем "дружить", а с кем не "дружить".1 Критерием попадания в список являются все случаи, когда ошибка/поведение/смена API/ABI/... проявилась или добавилась уже после того, когда соответствующий функционал уже прочно задействован в проекте.2

Список

 SCons: 
- с версии 2.0.1 стал вылетать при работе нелатинскими названиями файлов
- несколько раз менял свое поведение до версии 1.2.0; однако благодаря природе Python выходы находились.
- INSTALLSTR, начиная с версии 1.0 может принимать только строковые значения (не функции) - явная
  ошибка.
- расчет md5 путем чтения содержимого файла в строку; при гигабайтовом файле валился авторинг
 GraphicsMagick:
- отсутствие функции OpenCache() в новых версиях сильно попортило нервы; к тому сложности в узнавании
 какая версия GM используется бесит.
 Дистрибутивы:
- замена toolame -> twolame не дает возможности сделать одну версию для всех дистров.
- убрали /proc/scsi/devices из Debian Sid, пришлось изучать исходники ядра. (2 дня потратил).
 Gtk:
- диалог-помощник мой поломали (в Karmic, Sid) - 2 места
- синхронизацию ломали (в Hardy) между текущей вкладкой и текущим пунктом в меню Go.
- GtkButton - чего-то поменяли в стилях по умолчанию и значки на них перестали показываться
- GtkAssistant:
  - убрали возможность устанавливать страницу до show_all()
  - поменяли порядок OnApply и OnPrepare (делать что ли нечего!)
- GtkDialog - провозился целый день с открытием диалога, если в нем есть метка со ссылкой (бесконечный цикл)
- GtkFileChooser (c gtk >= 2.30.0):
  - выпадение из-за неправильного мониторинга
  - set_filename() не работает в паре c get_filename() для SELECT_FOLDER 
 GCC:
- ужесточили препроцессор так, что код Boost (1.33) перестал компилиться (починил)
 Winff:
- неправильно генерит видео для DVD (опция -target *-dvd должна быть всегда)
 Totem: 
- с версии 2.27.1 авторы перестали поддерживать xine backend.
 FFmpeg:
- c версии 0.6 опция -formats разбита на 2, -formats и -codecs
- c версии 0.6 поменяли принцип отображения потоков (спасает опция -map)
- в будущей 0.7 убрали -padX, а вместо нее — -vf pad=w:h:x:y:black ; само по себе не страшно, но
  учитывая, что в Packman/openSUSE, например, используют нестабильную версию, то так и хочется взять и ...
- в ffmpeg/libav >= 0.7 поменяли имена функций, включая dump_format->av_dump_format, av_open_input_file->avformat_open_input и т.д.,
  смысл ошибочных кодов (ушел AVERROR_NOFMT)
- в версиях libavcodec 53.4.x-53.9.x есть ошибка, портящая размеры для h.264, в процессе вызова avcodec_open() (попало в Ubuntu Oneiric);
  хочется взять и наказать автора патча
- прямой доступ, в частности, к ff_codec_bmp_tags закрыт => линковка не производится; узнать имя проблемного кодека стало сложнее
- сюрпризы libav 0.8:
  - качество кодирования сломали в libav 0.8 => сломали в ffmpeg 0.9, но в ffmpeg 0.10
    уже исправлено
  - libav завел свой конвертор, avconv (ffmpeg теперь там только для виду)
  - поменяли параметр -ab => -b:a
  - -newaudio убрали, теперь все делается через параметр -map
  - в ffmpeg заменили точку в выводе "Stream #0.1: Audio" на ":", теперь "Stream #0:1: Audio"
    (мелочь, а неприятно)
  - закрыли доступ к ffurl_register_protocol() (политика)

 MS Windows:
- GetStdHandle(STD_OUTPUT_HANDLE) возвращает мусор под XP и 2000, если процесс не присоединен к консоли
  (но практически всегда этим мусором оказывается "магическое" значение 0x00010001); в документации же 
  (http://msdn.microsoft.com/en-us/library/ms683231) утверждается, что будет возвращен нуль;
  в 7-ке поведение поправили (стало так, как описано в документации)
- в 7-ке системные вызовы kernel32.dll реализованы в kernelbase.dll, и вызов реально идет так:
  GetStdHandle()->kernel32.dll->api-ms-win-core-processenvironment-l1-1-0.dll(чистая прокся!)
  ->kernelbase.dll. Смысл усложнять все это - разве что для тех, кто реально хочет знать, 
  что происходит, но не имеет доступа к исходникам. Aх да, ставить "палки в колеса"
  программистам - любимое занятие Microsoft'а же!
- в одной весьма популярной операционке сигналы есть только для вида; пользоваться ими практически
  невозможно, и вот почему:
  - послать из одного процесса в другой можно только 2 сигнала, SIGINT(Ctrl-C) и SIGBREAK(Ctrl-Break),
    все остальные работают только внутри одного процесса
  - это будет работать, только если оба процесса присоединены к одной и той же (!) консоли
  - целенаправленная посылка сигнала работает только для SIGBREAK 
    (GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, pid)), и только если процесс, которому посылают
    сигнал, был создан с флагом CREATE_NEW_PROCESS_GROUP; в ином случае сигнал пошлется всем 
    процессам, присоединенных к консоли (включая того, кто посылал)
  Вывод: какую-либо инфу лучше передавать по-другому, например, с помощью именованных труб
  (CreateNamedPipe())
- почему стандартная библиотека C++ от MSVC не гут:
  - std::streamoff 32-битный, потому работать с файлами >= 2GB затруднительно (исправлено только
    в vs2010)
  - стандартная библиотека собрана без флага (компилятора) /vd2; последний нужен для полноценной
    поддержки С++ в компиляторе, и, если он используется (что, вроде как, естественно), то 
    линковать код с MSVC STL нельзя (теряется бинарная совместимость, будут неисправимые ошибки, 
    например, при использовании iostreams)
  Вывод: STLPort
- для паралелльной компиляции есть ключ /MP, но линковщик от MS можно запускать только один 
  (он требует эксклюзивный доступ к PDB); более того, и компилятор в это время не должен работать


  1. Получилось нечто вроде, кхм, компромата... :) (1)

  2. Пока качеством зависимостей доволен (за исключением ffmpeg/libav!), хотя, конечно же, хотелось вообще без сюрпризов. (2)