Hatred's Log Place

DON'T PANIC!

Nov 13, 2019 - 1 minute read -

Генератор таблиц для Markdown

Пост - мемориз.

Не всегда рисовать таблицы в Markdown разметке удобно, особенно добавлять/удалять колонки (со строками всё намного проще). Да и просто следить за соответствием вводимых данных конкретной колонке. И вот совершенно случайно набрёл на ресурс: Tables Generator

А конкретно: Markdown Tables Generator

В визуальной форме вводятся данные таблицы, потом нажимаем Generate и копируем полученный код в текст. Просто.

Для редактирования можно скопировать таблицу и импортировать её через “File → Paste table data…”, естественно при условии корректности данных. Кроме того, можно данные для таблицы импортировать из CSV (“File → Import CSV File…”), как работает эта функция я не проверял, скорее всего могут возникнуть проблемы с пробелами или разделителями.

Что ещё? Вообще там можно создавать таблицы не только в разметке Markdown, а в:

  • LaTeX
  • HTML
  • Text
  • MediaWiki (вот где абсолютный треш!)

Схожие ресурсы:

Nov 13, 2019 - 4 minute read - туризм

ГГЦ карты для QMapShack в виде TMS (Tile Map Service)

QMapShack умеет работать с сетевыми картами, которые представлены в виде тайлов с определённым соглашением о вызове. Что бы работать с подобными сервисами нужно создать файл-описание с расширением .tms. Описание формата можно почитать здесь.

До недавнего времени я обходился в основном картами OpenCycleMap, TMS файл для которых идёт вместе с QMS. А для нужных районов уже искал/скачивал листы карт ГГЦ (в народе: “новый” генштаб) и делал им обвязку в виде .vrt файла (такие карты содержать описание нужных преобразований, не затрагивая самих исходников карты, тем самым можно делать “обрезку карт” и они понимаются всем, что использует GDAL).

Но это дело малость меня достало и захотелось быстро под рукой иметь и ГГЦ карты. Естественно, при условии наличия доступа к сети и доступности сервисов.

Jul 25, 2019 - 2 minute read - programming

IOCTL: ENOIOCTLCMD vs ENOTTY

Что возвращать из обработчика IOCTL в user-space если данный IOCTL не поддерживается? В нашем драйвере активно использовался ENOIOCTLCMD. Проблема в том, что он объявлен в linux/errno.h в заголовке которого написано (вольный перевод):

не использовать в пользовательском коде

В данном случае, под пользовательским кодом стоит понимать всё, что не собирается в дереве ядра. Кто-то может не согласить со мной в этом аспекте, но по соображениям переносимости - лучше этому следовать.

Кроме того:

  • этого кода нет в пользовательских errno.h/cerrno;
  • для этого когда strerror() вернёт что-то вроде: Unknown error 515 (номер может и отличаться);
  • константы для этого кода ошибки нет на других платформах (Windows, MacOSX, FreeBSD).

Что использовать-то? А использовать не совсем очевидный: ENOTTY.

Изначально, да и согласно комментариям в include/uapi/asm-generic/errno-base.h:

Not a typewriter

При этом утилита пользовательского пространства errno из комплекта moreutils говорит:

ENOTTY 25 Inappropriate ioctl for device

Дополнительными аргументами:

  • интернеты тоже подсказывают такую трактовку;
  • в ядре Linux оно используется по такому же назначению.

В чём же отличие? Нашёл отличное объяснение в block/ioctl.c:

 * Is it an unrecognized ioctl? The correct returns are either
 * ENOTTY (final) or ENOIOCTLCMD ("I don't know this one, try a
 * fallback"). ENOIOCTLCMD gets turned into ENOTTY by the ioctl
 * code before returning.

Не буду переводить, просто поясню: ENOIOCTLCMD используется во внутренних реализациях, когда есть предположение, что обработку можно выполнить в каком-то стандартном русле, выполнить т.н. fallback. В пользовательское пространство должен вернуться ENOTTY. Точка.

Jul 12, 2019 - 4 minute read - programming linux

QtC: ошибка при попытке сделать коммит в Git репозиторий

Буквально вчера столкнулся с таким вот поведением QtC:

С учётом того, что я собираю QtC из исходников master-ветки репозитория, первая мысль была: что-то поломали, нужно по быстрому разобраться и откатить. Но всё оказалось чуточку интереснее. Кому интересно - добро пожаловать под кат.

Jul 9, 2019 - 1 minute read - programming embedded

Embedded Artistry Blog

И снова из разряда рекомендаций для чтения и изучения, можно сказать, в продолжение Practical Guide to Bare Metal C++.

Очень много полезной информации в части применимости современного C++ для embedded разработки и не только.

К примеру, там очень интересный цикл статей “Exploring Startup Implementations”, который позволяет разобраться в C++ Runtime:

  1. A General Overview of What Happens Before main()
  2. Exploring Startup Implementations: Newlib (ARM)
  3. Exploring Startup Implementations: OS X

Или серии:

PS там же наткнулся на рекламу книжки “Real Time C++”, добавил в свой список.

Jun 25, 2019 - 7 minute read - programming

Удалённое развёртывание драйвера/модуля ядра в Qt Creator

Для Windows драйвер писать в QtC никто в здравом уме и трезвой памяти не будет. Поэтому речь дальше по процессу разработки драйвера для Linux. Я не буду касаться вопросов использования отладчика (KGDB), в основном посмотрим на вопросы запуска модуля ядра на удалённой системе.

Jun 11, 2019 - 1 minute read - programming

CMake: Object Library и target_link_libraries()

В современном мире рекомендуется не использовать include_directories() и target_include_directories(), а экспортировать таргет в стиле пространства имён: Target::Target, например так:

add_library(avcpp avcpp.cpp ...)
...
add_library(AvCpp::AvCpp ALIAS avcpp)

и задавать интерфейсные опции для таргета, например так:

target_include_directories(avcpp
  INTERFACE
    $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>
    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)

После чего задавать параметры как линковки, так и компиляции одной командой:

add_executable(foo main.cpp)
...
target_link_libraries(foo PUBLIC AvCpp::AvCpp)

Так вот, если вы используете CMake версии до 3.12, то такой подход не сработает для OBJECT_LIBRARY.

Иными словами, если вы решите пробросить параметры компиляции (не линковки) таким образом:

add_library(foo_common OBJECT foo.cpp)
target_link_libraries(foo_common PUBLIC AvCpp::AvCpp)

То получите сообщение об ошибке, примерно такого вида:

CMake Error at tests/CMakeLists.txt:10 (target_link_libraries):
  Object library target "foo_common" may not link to anything.

В общем, читаем:

Решения:

  • Обновляем CMake, к сожалению, на travis.org для OSX пока это сделать трудно, там через brew ставится, на момент написания статьи, 3.11.4;
  • Используем target_include_directories();
  • Используем как и раньше include_directories(), но лучше не надо;
  • Не используем Object Library, что не всегда удобно.

Вопрос, а как можно из командной строки, установить DMG или tar.gz пакет CMake с cmake.org? Второй это просто тарбол, с определённой структурой, можно ли просто распаковать и установить PATH, указывающий на bin директорию внутри?

Apr 30, 2019 - 1 minute read - programming C++

C++-ниасилятор

Марк скинул ссылочку:

В голове уложилось пункта 3 от силы. Особенно доставляют пункты, где разные компиляторы ведут себя по-разному. Судя по всему у разработчиков тоже не всё укладывается в голове.

Apr 15, 2019 - 2 minute read - programming embedded

Строим GDB для MicroBlaze

Заметка - часть полёта мысли по написанию кода для MicroBlaze в среде Qt Creator и, возможно, Clion.

Сразу, чем не подошёл родной GDB - в нём нет поддержки Python. Для QtC это критично, поэтому нужно пересобрать, но с поддержкой оного.

Рецепт сборки ниже. Без подробностей, но там всё и так ясно.

Для начала необходимые зависимости. Их не нужно качать отдельно - всё находится в пакете исходников binutils. Порядок отстройки важен. Установку (make install) делать не нужно.

# bfd:
./configure --enable-targets=all && make -j8

# opcodes:
./configure --enable-targets=all && make -j8

# libiberty:
./configure && make -j8

# note: gdb-11.2+, иначе sim не соберётся
# gnulib
chmod +x ./configure && ./configure && make -j8

# sim:
./configure --target=microblaze-xilinx-elf && make -j8

# libdecnumber:
./configure && make -j8

Там где указан --target - это важно. Там где указано --enable-targets=all, вместо all можно указать нужный для MicroBlaze. Но я не вдавался в подробности, тем более, что собирается достаточно быстро. Если не указывать ничего - потом будут проблемы на линковке. А если ещё намешать, сначала собрать opcodes, потом bfd с разным набором целей, то ещё и в рантайме будет эпичный креш ;-)

Ну и собираем сам GDB:

./configure --host=x86_64-pc-linux-gnu --target=microblaze-xilinx-elf --prefix=${HOME}/bin/mb-gdb-python --disable-gdbserver --with-python=/usr/bin/python3 --with-system-readline --with-system-zlib
make -j8
make install

Устанавливаю в домашний каталог пользователя. Если нужно в системный - лучше опакетить или ставить в /opt/. Python можно, теоретически, указать и третий. Потом проверю.

  • UPD: На момент “Февраль 2022” нужно указывать Python 3.

При сборке у себя, проверьте, что использовать в качестве аргумента --host=. Для этого достаточно посмотреть, какой префикс у вашего системного компилятора:

$ gcc -dumpmachine  
x86_64-pc-linux-gnu

значит хост - x86_64-pc-linux-gnu.

Кстати, gdbproxy оказывается не совсем дружит с новыми GDB. Судя по всему причина схожая с этим. Пока вылечил при помощи небольшого хака. Кроме того, эмпирически выяснил, что, похоже, для thread-id используется int32_t, т.е. знаковый 32-битный тип. Просто сейчас базовые адреса оказались за пределами первой половины 32 битного пространства и, внезапно, появились знаки минуса в ID потоков =-)

Apr 11, 2019 - 10 minute read - programming embedded

MitM-like поддержка RTOS в GDB

Какое-то время назад я писал код прошивки для грабберов Epiphan линейки AV.io:

  • AV.io HD - наш пилот, на котором многое было отлажено и сформирована архитектура
  • AV.io SDI - закрепляем позиции
  • AV.io 4K - уже новое железо и новые подходы, теперь запускаемся практически мгновенно
  • KVM2USB 3.0 - глубокое переосмысление AV.io HD. По сути, благодаря заложенному потенциалу для модернизации в базовую модель, практически без модификации железа, чисто софтом смогли сделать новый продукт.

Там был задействован Cypress FX3, а SDK был построен поверх ThreadX. В качестве JTAG отладчика можно использовать Olimex ARM-USB-OCD-H в связке с OpenOCD. К сожалению, OpenOCD ничего не знает про треды в RTOS и, хотя, базовая поддержка присутствует в коде, конкретно для нашего процессора использовалась схема стекинга регистров, которая отличалась от того, что было уже реализовано. Пришлось разбираться и дорабатывать. Профиты от использования JTAG для разработки трудно переоценить, как минимум в случае распределённой работы.

Итак, время идёт. Теперь очередь за FPGA от Xilinx и его софтовым процессором MicroBlaze, где можно запустить портированый FreeRTOS версии 10.x. Но проблема ровно такая же: поддержки тредов в отладчике нет!

Mar 3, 2019 - 1 minute read - site

Миграция

В силу определённых причин пришлось перемещаться с платформы, где базировался блог. Пораскинув мозгами, решил, что статического сайта будет достаточно.

Выбирал между GitHub Pages и GitLab Pages. Вторые из коробки предлагают больше места и больше возможностей по использования и кастомизации генераторов сайта. Первые - более удобное использование Let’s Encrypt, сводящееся к “поставить налочку использовать TLS/SSL”.

Но больший объём артифактов и возможность выбора генератора (хочу иметь, на крайний случай, возможность зайти в репозиторий и добавить/отредактировать статью со всеми смежными изменениями) склонил к GitLab Pages. В качестве генератора был выбран Hugo, написанный на Golang.

Для миграции с DokuWiki был использован, с доработками для себя, dokuwiki-to-hugo. После чего была череда причёсываний наколенными скриптами (в частности, были восстановлены теги из BlogTNG). Тема пока оставлена неизменённая hugo-octopress. Много косяков в вёрстке, не все картинки лежат в правильных местах и могут не отображаться. Комментарии смигрировал тоже, поэтому, если находите где-то косяк - сообщайте.

Немного про лимиты. Размер репозитория на GitLab - 10G. Но сайт деплоится как артифакт CI, а для него лимит - 1G. Т.е. максимальный размер сайта - 1G.

Feb 5, 2019 - 1 minute read - linux

Дожились... Теперь и батарейки могут зависать...

Лаптоп рапортует, что батарея есть, заряд 54%, но… она не заряжается, ни разражается.

Выхлоп acpi -i:

Battery 0: Unknown, 53%
Battery 0: design capacity 8147 mAh, last full capacity 7264 mAh = 89%

Unknown - это статус заряда-разряда.

Вынимаю батарейку при включенном питании и вставляю обратно:

Battery 0: Charging, 56%, 00:58:42 until charged
Battery 0: design capacity 7770 mAh, last full capacity 6928 mAh = 89%

рукалицо.

PS если кто не знает, то батарейки в лаптопах содержат контроллер, с которым хост общается по SMBus (3v3 версия протокола I2C с официальной частотой до 100 kHz).

Jan 3, 2019 - 1 minute read -

Выключить глобально Heads-Up уведомления на Asus Zenfone Max 4 (ZC554KL) и Max M1 (ZB555KL)

Возможно и на всех Android 8.x, в случае, если вас как и меня они крайне раздражают:

  1. включить режим разработчика и отладку по USB
  2. на хосте поставить android-tools (например pacman -S android-tools)
  3. подключить USB кабелем и выполнить команду:```bash adb shell settings put global heads_up_notifications_enabled 0