Hatred's Log Place

DON'T PANIC!

Nov 13, 2014 - 4 minute read - Comments - linux

Linux, ThinkPad T530 и miniDP (displayport)

На Thinkpad T530 есть два порта для подключения внешних мониторов: VGA и miniDP (Display Port). Если ноутбук с дискретной графикой, то DP разведён на дискретную карту nVidia, соответственно без шаманства графику туда не выведешь.

Используйте данную ссылку только для ознакомительных целей! Подробности под катом. Полное и законченное описание подключения и вывода по ссылке:

http://www.unixreich.com/blog/2013/linux-nvidia-optimus-on-thinkpad-w520w530-with-external-monitor-finally-solved/









Sep 29, 2014 - 2 minute read - Comments -

git-svn: новый git репозиторий в существующий svn

Так сложилось, что в нашей компании используется SVN для внутренних нужд. Но делать локальные эксперименты, или вообще проверки, бранчевания и т.п. значительно удобнее используя git. Естественно и логично для индивидуальной работы использовать git-svn. В статье подробно рассмотрен вопрос экспорта своего нового проекта из git в svn с сохранением истории. Это случай, когда вы делаете локальный проект, отлаживаете его и, по результату, выкладываете в центральный SVN репозиторий.

Подкатом вольный пересказ при использовании стандартного размещения каталогов: ProjectName/{trunk,tags,branches}, для нестандартного - в статье.

Sep 24, 2014 - 2 minute read - Comments -

x264 low latency

Очень хорошая статья на тему: http://x264dev.multimedia.cx/archives/249

UPD, ссылка недоступна, через веб-архив: http://web.archive.org/web/20150421033553/http://x264dev.multimedia.cx/archives/249

Цитата оттуда: > The total latency of x264, including encoder/decoder-side buffering, is: > > B-frame latency (in frames) + Threading latency (in frames) + RC-lookahead (in frames) + Sync-lookahead (in frames) + VBV buffer size (in seconds) + Time to encode one frame (in milliseconds)

Собственно отсюда видно какие ручки крутить у того же FFmpeg что бы сделать задержку на стриминг как можно меньше:

-rc-lookahead #
-bf #
-threads #
-refs #
-x264-params sync-lookahead=#

и всякие буффера.

Эти же опции применительно к AVCodecContext:

AVCodecContext *ctx = ...;
...
av_opt_set(ctx, "rc-lookahead", "#", AV_OPT_SEARCH_CHILDREN);
av_opt_set(ctx, "threads",      "#", AV_OPT_SEARCH_CHILDREN);
av_opt_set(ctx, "bf",           "#", AV_OPT_SEARCH_CHILDREN);
av_opt_set(ctx, "refs",         "#", AV_OPT_SEARCH_CHILDREN);

GOP size (-g/“g”) будет влиять на объём траффика и как быстро картинка сможет восстановиться, если ключевой кадр был потерян.

Ну из опций видно, что загоняя эти параметры в минимальные значения, получим максимальную скорость. Уменьшать количество потоков (threads) имеет смысл когда у вас несколько подобных процессингов.

Есть ещё опция -tune (“tune”) со значением “zerolatency” - вундервафля, которая почти сгоняет задержку в ноль, но и качество картинки примерно туда же. Про то, что включает в себя различные опции тюнинга можно посмотреть в выводе:

x264 --fullhelp

Дополнительные материалы: * X264 Settings - детальное описание параметров x264, может быть не самым актуальным. * ссылка через веб-архив: http://web.archive.org/web/20150203203142/http://mewiki.project357.com/wiki/X264_Settings * Encoding presets for x264 - какие пресеты какие параметры включают, может быть не самым актуальным. * ссылка через веб-архив: http://web.archive.org/web/20150802090458/http://dev.beandog.org/x264_preset_reference.html

UPD: что-то странно, что все ссылки стали недоступны. Особенно рекомендации Ясона.

Sep 5, 2014 - 1 minute read - Comments - linux

Пакетирование отладочной информации в deb

Всё достаточно просто. В control добавляем описание нового пакета, вроде:

Package: ffmpeg-real-dbg
Section: libdevel
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: debug symbols for ffmpeg libraries
 This package contains the debug symbols for FFmpeg lubraries.
 .
 This is the real ffmpeg. The libraries are installed to the /opt/ffmpeg/lib.

А в rules что-то вроде:

override_dh_strip:
       dh_strip --dbg-package=ffmpeg-real-dbg

Главное, что бы имя пакета соответствовало. Естественно, при сборке нужно обеспечить что бы при компиляции отладочная информация вообще создавась. В случае real-ffmpeg от samrog131 нужно добавить

--enable-debug=3

к ./configure

Подробнее: http://askubuntu.com/questions/182703/how-and-why-to-create-dbg-dev-doc-packages

Sep 4, 2014 - 2 minute read - Comments -

Проблема с внутренними зависимостями при отстройке deb пакетов

Не знал как лучше сформулировать тему.

Суть: есть source-пакет из которого строится несколько бинарных deb-пакетов.

Допустим: * Библиотека: libfoo * Бинарник, зависящий от этой библиотеки: foo * Пакет для разработчика: libfoo-dev

При отстройке имеем примерно такую проблему:

dpkg-shlibdeps: error: couldn't find library libopencv_core.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_traincascade (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_ml.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_traincascade (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_imgproc.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_traincascade (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_highgui.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_traincascade (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_objdetect.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_haartraining (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_calib3d.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_haartraining (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_highgui.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_haartraining (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_imgproc.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_haartraining (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_core.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_haartraining (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_core.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_performance (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_highgui.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_performance (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_objdetect.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_performance (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_objdetect.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_createsamples (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_calib3d.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_createsamples (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_highgui.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_createsamples (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_imgproc.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_createsamples (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_core.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_createsamples (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: cannot continue due to the errors listed above
Note: libraries are not searched in other binary packages that do not have any shlibs or symbols file.
To help dpkg-shlibdeps find private libraries, you might need to set LD_LIBRARY_PATH.

При этом библиотеки отстроены и с ними всё в порядке.

Лечится добавлением в debian/rules примерно такого:

override_dh_shlibdeps:
        LD_LIBRARY_PATH=$(LD_LIBRARY_PATH):debian/tmp/PATH_TO_LIB_DIR dh_shlibdeps

Главное, замените PATH_TO_LIB_DIR на своё, обычно это PREFIX/lib или PREFIX/lib/$(DEB_HOST_MULTIARCH)

Aug 29, 2014 - 1 minute read - Comments - programming c++

MinGW и локали

Если коротко, то всё, что связано с std::locale в MinGW не работает. Точка.

Зато вполне себе работает функционал из Си:

std::locale::global(std::locale("")); // не установит текущую локаль
setlocale(LC_ALL, ""); // установит текущую локаль, у меня это Russian_Russia.Cp1251

Aug 29, 2014 - 1 minute read - Comments - programming c++

Пополняем шпаргалки по C++: неявно-генерируемые перемещающий конструктор и оператор присваивания

Статью изначально публиковал на хабре: http://habrahabr.ru/post/232775/. Здесь - для единства мыслей :)

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

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

Под катом я решил опубликовать пару шпаргалок для определения условия когда будет создан компилятором неявно-генерируемый перемещающий конструктор и перемещающий оператор присваивания.

Шпаргалки представлены в виде PDF файлов для печати на принтере A4, в виде картинки PNG, а также исходников в SVG.

Aug 19, 2014 - 1 minute read - Comments - programming c++

C++14: Done

Стандарт отправился в печать: https://isocpp.org/blog/2014/08/we-have-cpp14

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

May 30, 2014 - 2 minute read - Comments - programming c++ туризм maps

erase_if

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

May 28, 2014 - 1 minute read - Comments - programming c++

Const correctness

Ничего нового, просто ссылки: 1. http://www.parashift.com/c++-faq/const-correctness.html - разные аспекты 2. http://www.cprogramming.com/tutorial/const_correctness.html - для чего нужно и почему, а так же логическая и побитовая константность.

Если коротко, то что даёт применение ключевого слова const везде, где это уместно: 1. Уберегает вас от некоторых ошибок, связанных с внезапным изменением данных в каких-то вызовых. Т.е. добавляет безопасности. 2. Автодокументирование кода: вы выдите const => вы знаете, что данные не меняются ни в этом вызове, ни далее по иерархии.

Побитовая константность - когда при вызове ни один бит структуры или класса не меняется.

Логическая константность - когда при вызове какие-то поля могут меняться, но данные, отвечающие за логику класса не изменяются.

Обычно последнее связано с полями, которые имеют спецификатор mutable. Для чего они нужны? Самый простой пример: экземпляр класса может использоваться из разных потоков. Писать может один поток, а читать другой. Логично, что метод для чтения будет константным. Так же логично, что чтение и запись следует защитить мьютексом. Но если мы попробуем заблокировать мьютекс в константном методе, получис ошибку компиляции. Понятно, что изменение мьютекса никак не влияет на логическую константность класса, поэтому его можно объявить mutable и спокойно защищать им данные.

Из примера выше можно сделать такое неформальное заключение: Побитовая константностью - неиболее сильная. Логическая - более слабая.

May 22, 2014 - 2 minute read - Comments - programming c++

Qt Creator и C++11

Небольшая заметка о том, как форсировать поддержку C++11 в парсере для различных билд-систем. Заметки касаются master-снапшота QTC (брать тут: http://download.qt-project.org/snapshots/qtcreator/master/latest/ или собирать из исходников).

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

May 22, 2014 - 1 minute read - Comments - programming c++

std::begin() и std::end()

С приходом нового стандарта эти две свободные функции появились в STL, в библиотеке итераторов (#include <iterator>). Кроме того, в примерах кода часто можно увидеть, что они используются на STL контейнерах вместо собственных методов .begin() и .end():

#include <iostream>
#include <vector>
#include <iterators>

using namespace std;

int main()
{
  vector<int> v{1, 2, 3, 4, 5};
  
  for (auto it = begin(v); it != end(v); ++it)
  {
    cout << "Number: " << *it << endl;
  }
  
  return 0;
}

Мне хорошо понятно, что эти функции отлично подходят для RAW-массивов, т.е. если в примере выше заменить:

vector<int> v{1, 2, 3, 4, 5};

на

int v[] = {1, 2, 3, 4, 5};

или даже

int v[]{1, 2, 3, 4, 5};

То весь остальной код менять не нужно. Удобно, причём мы защищены от подсовывания указателя вместо массива. Но почему они применяются для STL контейнеров?

Поиск по интернету дал только один ответ: для унификации. И только.

Т.е. ни по “кошерности” ни по скорости два этих подхода не отличаются. Чисто для единства вида.

Если у кого есть другие предположения - милости просим в дискуссию.

Ссылки

  1. std::begin()
  2. std::end()
  3. std::next()
  4. std::prev()