Недавно наткнулся на эту книжку на GitBook:
http://arobenko.gitbooks.io/bare_metal_cpp/
Доступна для онлайн-чтения, в виде форматов ePUB, MOBI и PDF. Рассматриваются вопросы уменьшения размера приложений, написания своих реализаций ABI функций, что позволяет более детально понимать, а что там вообще внутри происходит, что бывает полезно и обычных приложениях. Вместе с ней обязательно ознакомиться с
post/2013/03/28/scott_meyers._effective_c_in_an_embedded_environment.
Книга больше ориентирована на ARM, в частности Raspberry PI, но идеи адаптировать к другим платформам труда не составит.
На Thinkpad T530 есть два порта для подключения внешних мониторов: VGA и miniDP (Display Port). Если ноутбук с дискретной графикой, то DP разведён на дискретную карту nVidia, соответственно без шаманства графику туда не выведешь.
Используйте данную ссылку только для ознакомительных целей! Подробности под катом.
А если вопросы производительности не стоят остро, то рекомендую посмотреть в сторону Nouveau драйвера. В случае его использования и DRI3 не придётся настраивать
ничего.
Подробности.
Полное и законченное описание подключения и вывода по ссылке:
http://www.unixreich.com/blog/2013/linux-nvidia-optimus-on-thinkpad-w520w530-with-external-monitor-finally-solved/
Так сложилось, что в нашей компании используется SVN для внутренних нужд. Но делать локальные эксперименты, или вообще проверки, бранчевания и т.п. значительно удобнее используя git. Естественно и логично для индивидуальной работы использовать git-svn
. В
статье подробно рассмотрен вопрос экспорта своего нового проекта из git в svn с сохранением истории. Это случай, когда вы делаете локальный проект, отлаживаете его и, по результату, выкладываете в центральный SVN репозиторий.
Подкатом вольный пересказ при использовании стандартного размещения каталогов: ProjectName/{trunk,tags,branches}, для нестандартного - в статье.
Очень хорошая статья на тему:
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” - вундервафля, которая почти сгоняет задержку в ноль, но и качество картинки примерно туда же. Про то, что включает в себя различные опции тюнинга можно посмотреть в выводе:
Дополнительные материалы:
UPD: что-то странно, что все ссылки стали недоступны. Особенно рекомендации Ясона.
Всё достаточно просто. В 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 нужно добавить
к ./configure
Подробнее:
http://askubuntu.com/questions/182703/how-and-why-to-create-dbg-dev-doc-packages
Не знал как лучше сформулировать тему.
Суть: есть 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)
Да, дважды подумайте перед тем как смешивать их:
http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them
Если коротко, то всё, что связано с std::locale
в MinGW не работает. Точка.
Зато вполне себе работает функционал из Си:
std::locale::global(std::locale("")); // не установит текущую локаль
setlocale(LC_ALL, ""); // установит текущую локаль, у меня это Russian_Russia.Cp1251
Статью изначально публиковал на хабре:
http://habrahabr.ru/post/232775/. Здесь - для единства мыслей :)
Когда не так часто, как хотелось бы, приходится работать с языком, некоторые аспекты забываются. А некоторые никогда и не откладываются в голове. Поэтому, когда возникают вопросы, приходится отвлекаться и лезть в документацию.
Чтобы сэкономить время в последующем, а также, чтобы лучше понять в ходе обучения, крайне помогает вести конспекты и делать наглядные шпаргалки. Шпаргалку можно повесить рядом на стену. Хороши шпаргалки в виде блок-схем, по которым можно легко, по шагам, получить нужный результат (например
выбрать правильный контейнер).
Под катом я решил опубликовать пару шпаргалок для определения условия когда будет создан компилятором неявно-генерируемый перемещающий конструктор и перемещающий оператор присваивания.
Шпаргалки представлены в виде PDF файлов для печати на принтере A4, в виде картинки PNG, а также исходников в SVG.
Однажды писал про двоичные литералы в GCC:
/post/2009-10-02_13.44_0b00100100, новый стандарт C++14 закрепил их в C++.
Но тут я хотел бы рассмотреть лёгкий способ перехода в уме между hex и bin представлениями.
Стандарт отправился в печать:
https://isocpp.org/blog/2014/08/we-have-cpp14
Сильно быстро меняется, компиляторы не поспевают, не то что головы программистов и промышленность. Надеюсь они притормозят коней, да займутся больше багофиксами.
Удобный сервис для анализа последовательностей и поиска зависимостей и вывода формулы:
http://oeis.org/
Удобно использовать для различных видов анализа, обратной разработки и т.п.
Условное удаление по значению из всяких там map и иже с ними. А так же, бонусом, наиболее оптимальный вариант условного удаления для вектора.
Ничего нового, просто ссылки:
-
http://www.parashift.com/c++-faq/const-correctness.html - разные аспекты
-
http://www.cprogramming.com/tutorial/const_correctness.html - для чего нужно и почему, а так же логическая и побитовая константность.
Если коротко, то что даёт применение ключевого слова const
везде, где это уместно:
<WRAP center round tip 60%>
- Уберегает вас от некоторых ошибок, связанных с внезапным изменением данных в каких-то вызовых. Т.е. добавляет безопасности.
- Автодокументирование кода: вы выдите const => вы знаете, что данные не меняются ни в этом вызове, ни далее по иерархии.
Побитовая константность - когда при вызове ни один бит структуры или класса не меняется.
Логическая константность - когда при вызове какие-то поля могут меняться, но данные, отвечающие за логику класса не изменяются.
Обычно последнее связано с полями, которые имеют спецификатор mutable
. Для чего они нужны? Самый простой пример: экземпляр класса может использоваться из разных потоков. Писать может один поток, а читать другой. Логично, что метод для чтения будет константным. Так же логично, что чтение и запись следует защитить мьютексом. Но если мы попробуем заблокировать мьютекс в константном методе, получис ошибку компиляции. Понятно, что изменение мьютекса никак не влияет на логическую константность класса, поэтому его можно объявить mutable
и спокойно защищать им данные.
Из примера выше можно сделать такое неформальное заключение:
<WRAP center round tip 60%>
Побитовая константностью - неиболее сильная. Логическая - более слабая.
Небольшая заметка о том, как форсировать поддержку C++11 в парсере для различных билд-систем. Заметки касаются master-снапшота QTC (брать тут:
http://download.qt-project.org/snapshots/qtcreator/master/latest/ или собирать из исходников).
Нужно отметить, что синтаксис нового стандарта поддерживается сейчас по-умолчанию. Проблемы касаются правильного определения констант компилятора, подключения частей стандартной библиотеки и т.п.