LINUX.ORG.RU

Сообщения AntonI

 

Вопрос по дизайну/архитекуте .hpp файлов (кого куда и как включать)

Форум — Development

Есть некая библиотека (моя), солянка из разных, местами слабо связанных фрагментов кода.

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

В библиотеке есть файл dump.hpp (условно) обеспечивающий запись разных объектов в бинарном формате, и он входит в ту часть которую нужно копировать. Этот файл определяет какие то служебные (шаблонные) методы а потом их как то специализует по необходимости для всего что есть в библиотеке. Понятно что он инклюдит кучу всего, в том числе кучу того что копировать не хочется. Вопрос - че с этим делать?

Я вижу два решения, оба кривые:

  1. перенести части dump.hpp работающие с конкретными объектами в .hpp файлы где эти объекты объявлены. Минусы - все же этот код лучше выглядит когда лежит кучно, кроме того все станет зависеть от dump.hpp (сейчас это не так и хотелось бы что бы оно так и осталось).

  2. понатыкать в dump.hpp директив условной компиляции, т.е. что бы соотве фрагмент кода для объекта A включался только если .hpp файл с этим объектом уже был включен. Это немного странно выглядит, dump.hpp всегда должен будет выключаться последним.

cast @pon4ik, @monk

 

AntonI
()

Как в плюсовой программе найти список файлов с именами отвечающими шаблону?

Форум — Development

Вроде

echo results/*.dat

Я всегда это на питоне делал:-(

 ,

AntonI
()

Как в питоновском скрипте получить из doxygen-а комментарии к избранным классам и методам?

Форум — Development

День сурка продолжается.

Итак есть толстый проект на плюсах, к которому я прикручиваю питоновский интерфейс через SWIG. В проекте есть комментарии для doxygen-а, хочется подабавлять их в питоновские докстринги.

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

Импортируются понятно не все классы и методы, кое каким классам при инстацировании шаблонов меняются имена.

Идея такая - распарсить (или еще что то с ним сделать) в питоне выхлоп doxygen-а и надергать оттуда нужных комментариев. Как это сделать Ъ? М.б. в doxygen есть возможность получить доступ к базе методов которую он наверняка создает?

Альтернатива - делать все руками - рабочая, но не улыбается ни разу (там правда много).

PS Регулярные выражения толком не знаю;-(

 , , ,

AntonI
()

Как из питона увидеть флаги -D (дефайны) с которыми была собрана импортируемая библиотека?

Форум — Development

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

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

Из хорошего - эти дефайны туда приходят из cmake. Из плохого - я cmake пока не знаю.

Вопрос, как мне в питоньем исполняемом файле после импорта модуля увидеть список дефайнов? М.б. есть какой то Ъ готовый метод, или нужно городить свой велосипед?

Проект кроссплаформенный, решение должно быть тоже.

 , , ,

AntonI
()

coredumpctl gdb - теперь отладчик из под рута запускать нужно O_O?!

Форум — Development
$ coredumpctl gdb
...
File "/var/lib/systemd/coredump/core.single-trace.503.b7591dc0b35b48408b1d92fb749a6950.4055.1593755782000000.lz4" is not readable: Отказано в доступе

Я могу конечно его извлечь и сменить владельца, но как то это выглядит криво. Делать

sudo coredumpctl gdb

не хочется, да и оно работает с ограничениями какими то

$ sudo coredumpctl gdb
...
(gdb) bt
#0  0x000055ac76aef60a in GreenTracer::init_r0 (this=0x7ffda4f8df50, ftracer=..., catcher=..., r0=<error reading variable: Cannot access memory at address 0x7ffda4f8d940>)
    at src/green_tracer.cpp:46
Backtrace stopped: Cannot access memory at address 0x7ffda4f8d7c8

Как это теперь вообще делают Ъ?

 , ,

AntonI
()

Как попросить cmake (или сгенеренный им Makefile) выводить исполняемые команды при сборке?

Форум — Development

Сабж. Всегда работал с gnu make, а тут приходится cmake осваивать - не пойму чего там вообще происходит.

Т.е. что бы при вызове make он печатал КАК ИМЕННО он собирает цель (команда со всеми опциями и пр)

 ,

AntonI
()

Помогите классифицировать древовидную структуру данных?

Форум — Development

Придумал тут структуру данных для своих извращенных целей (AMR), не могу понять как ее обозвать/классифицировать.

Вопрос не в том что бы ПРИДУМАТЬ название (с этим я как нить справлюсь), а с тем что бы понять - к какому УЖЕ ИЗВЕСТНОМУ виду деревьев это относится (или это что то абсолютно новое).

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

Это дерево, но больше похоже на всякие зонтичные растения.

  1. есть листья и узлы. Данные лежат в листьях.

  2. Узлы не содержат ссылок на родителей, поиск всегда идет от корня.

  3. Узлы могут быть трех разных типов:
    3.1. обычный узел - 2^D потомков (D - размерность пространства), потомками являются как листья так и узлы в перемешку
    3.2. толстый У-узел - 2^{RD} потомков-узлов, R>1 но неограничено сверху
    3.3. толстый Л-узел - 2^{RD} потомков-листьев, R>1 но неограничено сверху

R могут меняться от узла к узлу.

В толстых узлах данные конечно лежат по Z-кривой;-)

Ключем является целое число (ID листа) связанное с положением листа в пространстве и размером листа. Листья это D-мерные кубы кратных размеров в которых что то лежит (структура юзера типа T).

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

@peregrine

 , ,

AntonI
()

Аудиоплеер для андроид с поддержкой ftp/vebDAV или как это вообще делается?!

Форум — Mobile

Вот есть у меня дома NAS от tecus (подняты фтп и вебдав протоколы) а на ней куча музыки. Как бы мне ее с телефона/планшета слушать без скачиваний и пр, просто зашёл на nas и запустил?

Гуглил, лазил по маркету, ничего не нашел:-(

 

AntonI
()

Python Image Library и ее разработчики совсем все О_О?

Форум — Development

ОС mint XFCE 19.3

$ cat test-imaging.cpp

#include <Imaging.h>
#include <Imaging.h>

int main(){ return 0; }
$ g++ -I/usr/include/python2.7 test-imaging.cpp
In file included from test-imaging.cpp:2:0:
/usr/include/python2.7/Imaging.h:81:3: error: conflicting declaration ‘typedef struct ImagingMemoryBlock ImagingMemoryBlock’
 } ImagingMemoryBlock;
   ^~~~~~~~~~~~~~~~~~
In file included from test-imaging.cpp:1:0:
/usr/include/python2.7/Imaging.h:81:3: note: previous declaration as ‘typedef struct ImagingMemoryBlock ImagingMemoryBlock’
 } ImagingMemoryBlock;
   ^~~~~~~~~~~~~~~~~~
...

Начиная с 17 убунты оно уже не компилировалось из коробки, приходилось убирать из Imaging.h лишний typedef. Как оно попало в репозиторий в таком виде я ХЗ. Но что бы полениться воткнуть #pragma once - это я вообще не знаю кем надо быть… О_О

Вопрос - чем бы ее заменить? Хотя я чую придется вообще весь стек менять;-(

 

AntonI
()

Не работают модули rsync (режим сервера) на NAS под thecus

Форум — Admin

Так получилось что у меня NAS от thecus (N4350 версия 3.02.02.11.a388). Взял сдуру, хотелось готовое решение домой что бы все влет работало из коробки под онтопиком и офтопиком, что бы не маятся с настройкой (я в администрировании нуб) - в итоге оно нигде нормально не работает, но с настройкой и правда можно не маятся, оно практически не настраивается…

Единственно что удалось бол-мен завести на нем это ftp. Я хочу делать бэкапы, но по ssh на него можно зайти только рутом и только по паролю (открытые ключи не работают). Зато можно поднять сервер rsync. Поднял:

N4350:~# cat /etc/rsyncd.conf 
motd file = /root/rsyncd.motd
pid file = /root/rsyncd.pid
port = 7777
max connections = 2
exclude = lost+found/
dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 *.rar *.7z *.mp3 *.jpg = no
 
[backup]
uid = anton
gid = users
auth users = anton
secrets file = /root/rsyncd.passwd
path = /raid/HOME/anton/
comment = anton home directory
list = no
hosts allow = localhost 192.168.1.65
hosts deny = *

сделал rsyncd.motd и /root/rsyncd.passwd, запустил

# rsync --daemon

пытаюсь войти снаружи

$ rsync --port=7777  192.168.1.100::backup
antonNAS

Password: 
@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1653) [Receiver=3.1.1]

пароль правильный. ЧЯНТД?;-(

PS я попробовал lftp, мне не понравилось.

 , ,

AntonI
()

Задачка на подумать (диагональный сдвиг по Z-кривой Мортона)

Форум — Development

Есть такая замечательная штука как Z-кривая Мортона, очень удобна для всяких рекурсий и многомерных массивов с хорошей локальностью данных.

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

Я знаю только такое решение

const uint64_t zmasks[16]={
  0xffffffffffffffff, 0x5555555555555555, 0x9249249249249249, 0x1111111111111111,
  0x1084210842108421, 0x1041041041041041, 0x8102040810204081, 0x0101010101010101,
  0x8040201008040201, 0x1004010040100401, 0x0080100200400801, 0x1001001001001001,
  0x0010008004002001, 0x0100040010004001, 0x1000200040008001, 0x0001000100010001 
};

template <int D, typename T> T zoff_diag_shift(T offset){  
  for(int i=0; i<D; i++){
    T omask = zmasks[D-1]<<i, imask = ~omask, fix = offset&imask;
    offset = (((offset|imask)+1)&omask)|fix;
  }
  return offset;
}

т.е. берем и тупо двигаем последовательно на единичку по каждой из координат. Может кто то может предложить более эффективный вариант с меньшим числом операций, ситуация то выделенная?

 

AntonI
()

Сломал иксы на ноуте, нужно срочно починить:-(

Форум — General

Lubuntu 16.04

Пытался подключить вакомовский планшет (из коробки не завелся), поставил xserver-xorg-input-wacom и xorg-input-abi-22 (был в зависимостях). После ребута иксы взлетели но отвалились клава и мышь (вообще).

Ребутнулся, зашёл в рутовую консоль, снес эти два пакета - толку никакого, симптоматика та же. Че делать? Нужно срочно вернуть работоспособность машине, работы сеня дофига:-(

Пишу с телефона.

 , ,

AntonI
()

графический планшет от wacom и какие нить приличные наушники с микрофоном?

Форум — Talks

В общем в связи с со всей этой хтонической фигней я созрел до граф.планшета. Мы с коллегами активно общаемся через BBB и сейчас я туда вынужден логинится сразу с двух устройств - с ноута что бы расшаривать экран и показывать код и с планшета что бы рисовать.

Заодно и жене будет игрушка, она просто рисует/обрабатывает фото.

Понятно что ваком, но дальше я плыву

  1. какой размер?

  2. насколько линейка One хуже Intuos?

  3. насколько нужны/мешают кнопки на планшете?

  4. как оно заводится под линуксом, если планшет маленький есть ли мультитач?

  5. есть ли нормальные векторные рисовалки под линукс вменяемо поддерживающие планшет? Регулярно приходится рисовать всякие схемки.

Вообще я не исключаю варианта прицепить самсунговский планшет в качестве графического - просто еще так не делал. Деньги не оч. принципиальны, но платить овер 10 тыр я не готов (просто не очень понятно за что).


Ну и что бы два раза не вставать - для того же BBB хочу нормальные проводные (USB) накладные наушники с микрофоном. У меня в ноуте микрофон фиговый, коллеги жалуются, слышно плохо. Поскольку у меня никогда наушников (кроме дешевых вкладышей) не было, на что там вообще надо смотреть то? Hi-fi мне не нужен, но что бы удобно сидели, нормально звучали и прослужили лет дцать. За какие нить разумные деньги.

Пока вот такое глянулось Logitech Stereo Headset H650e (981-000519)

 ,

AntonI
()

Ссылка по *nullptr?

Форум — Development

У меня есть некая функция возвращающая ссылку. В некоторых случаях она должна вернуть заведомо невалидную ссылку и это должно легко проверятся тем кто ее вызывал, как то так

T& f(...){
   ...
   return *(T*)nullptr; 
   ...
};

Это немножко странно выглядит, но работает. Но на gcc8.3.0 уже не работает

T& ref = f(...);
if(&ref){...} //<== warning: nonnull argument ‘ref’ compared to NULL

насколько я понял он при оптимизации с -O3 эту проверку выкинул, а потом улетел с сегфолтом, дооптимизировался… gcc5.4.0 нормально работает.

В общем я готов поменять ссылку на указатель (хотя это слегка испоганит кое че дальше), но скажите - а с чего это вообще отвалилось то и насколько такая нулевая ссылка плоха? Ссылка же семантически ничем от указателя не отличается…

 ,

AntonI
()

Графическое представление структур данных (включая работу с ними)?

Форум — Development

Я всегда считал, что визуальное программирование (ВП) неудобно как система программирования общего назначения. Низкая скорость ввода, наглядность хуже чем у текста и т.д. Безусловный плюс - ВП снижает порог вхождения и стреляет в каких то специфических задачах, когда нужно дать неквалифицированному пользователю доп.возможности.

Но есть еще одна область, где визуальное представление востребовано - это структуры данных. Мы рисуем диаграмки из квадратиков и стрелочек на презентациях когда объясняем сложные структуры данных коллегам и студентам, смотрим на диаграмки в статьях про структуры данных и т.д. (спасибо @Siborgium - это он меня натолкнул на мысль;-)).

Есть два предельных случая.

  1. Программа минимум - хотелось бы иметь утилиту, способную построить в рантайм диаграмму отображающую существующую в программе структуру данных. Например для отладки. Наверное это должно быть что то вроде valgrind, но которая заданной точке трассы исполнения рисует объекты (квадратики) соединенные стрелочками (пойнтерами). Хотя возможна же косвенная адресация, когда используется не пойнтер а индекс в массиве… Но для отладки это было бы круто, мы делали такое для питона - выглядит феерично и местами очень наглядно. Соответственно вопрос - есть ли сейчаc такие утилиты? Я бы такую хотел (для плюсов).

  2. Программа максимум - именно программирование. То есть мы берем структуру данных (точнее ее фрагмент) и мышкой перебрасываем стрелочки. Что то подобное я делаю на доске когда объясняю студентам что такое список. Утилита в которой это делается запоминает историю переброса стрелочек и генерит на основе этой истории код какого то метода (например list::insert). Историю можно промотать туда/сюда и отредактировать. Наверное неплохо иметь возможность делать текстовые вставки в историю. Это чисто императивный стиль программирования. Не знаю кто как, а я когда велосипедю сложные структуры данных такую картинку в голове/на доске/на бумажке держу.

Пока что п.2 это чисто фантазии, в ближайшие полгода у меня до такого точно руки не дойдут, да и не очень пока понятно насколько оно вообще надо/удобно.

@hobbit, @abcq, @provaton зацените;-)

 

AntonI
()

разбивка толстого шаблонного класса на несколько хидеров?

Форум — Development

Сабж. Вот есть толстый шаблонный класс, у него внутри еще пяток классов (они нужны для деталей реализации), часть скрыта часть открыта. Все это сейчас занимает 800 строк, работать… неприятно.

Как бы это Ъ растащить по нескольким хидерам? Через #include?

@pon4ik, @hobbit.

 

AntonI
()

структура из массивов с минимумом накладных расходов

Форум — Development

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

Теперь самое сложное - в разных элементах некоторых полей может вообще не быть, может быть просто поле типа T, а может быть небольшой массив (одномерный или двумерный), и это будет меняться в runtime. При этом накладные расходы на хранение всего этого безобразия должны быть минимальны, то есть решение вида

struct E{
  std::vector<T> a;
  std::vector<T> b;
  std::vector<T> c;
  ...
};

заведомо не проходит, полей может быть много (десятки) и в большинстве элементов большей части может не быть. Кроме того желательна локальность данных.

Нужно:

  1. Понять как это вообще можно сделать.

  2. Хороший интерфейс для доступа ко всему этому.

  3. Хороший интерфейс для задания структуры пользователем.

  4. Желательно, но не необязательно - прикрутить к этому какую то интроспекцию, то есть что бы хранились типы полей и имена полей (как массив строк и sizeof-ов).


Пока что придумалось такое - в структуре заводится

std::vector<char> data; // тут лежат все данные
uint8_t sz[N][2];       // размеры полей как массивов
uint16_t off[N];        // смещения различных полей в data

где Т - число полей (в итоге расход 4 байта на поле - с этим как то можно жить) и для каждого поля name делаются функции

T& name(int i=0, j=0);
void resize_name(int szi, int szj, T defval=T());

и то и то делается макросами, то есть для юзера задание структуры выглядит как

struct E{
CELL_TABLE(10); // задаем N
ADD_FIELD(0, double, a); // номер поля, тип, имя
ADD_FIELD(1, float, b);
...
};

а доступ выглядит как

I->a() ... I->b(1) ... I->c(0,2) ...

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

Вопросы:

  1. какие тут подводные камни, что можно улучшить?

  2. как это вообще называется (лучше назвать)?

  3. как к этому малой кровью прикрутить интроспекцию? То есть я хочу иметь возможность в runtime снаружи узнать все типы полей, имена полей, размеры типов полей.

cast @KennyMinigun , @hobbit;-)

 , ,

AntonI
()

как не гасить второй монтор при закрытии крышки ноута?

Форум — Admin

Есть ноут с монитором FullHD, иногда когда дома цепляю к нему внешний монитор 4K. При этом ноут хочется закрыть и отложить (сейчас пришла внешняя клава и вот совсем хочется).

Есть скрипт для перехода на 4K монитор (он висит у дивана вверх ногами - так получилось)

xrandr --output DP-2-2 --auto  --rotate inverted  --output eDP-1 --off

и обратно

xrandr --output DP-2-2 --off --output eDP-1 --mode 1920x1080 --rate 60.05 --same-as DP-2-2

Теперь проблема - когда я закрываю крышку с подключенным 4К-монитором он гаснет.

Если убрать из первого скрипта «–output eDP-1 –off» 4К монитор не гаснет, но при этом мониторы дублируются (и это правильно) и я не могу растянуть окна на 4K.

Как бы сконфигурить xrandr так что бы и мониторы дублировались (монитор ноута при включенном внешнем не нужен, но хотелось бы что бы окна сами на внешний монитор переходили), и внешний при закрытой крышке не гас?

 , ,

AntonI
()

автоматическая генерация картинок из кружочков и палочек (визуализация графа)?

Форум — Development

Возникла необходимость автоматически отрисовывать граф вот в таком виде http://a-iv.ru/trash/Z4.png

У кружочков (узлов) известны координаты, палочки (связи) тоже известны - подскажите пожалуйста какую нить годную несложную утилиту/библиотеку? Выходной формат не очень важен - png, pdf, svg и пр.

Можно наверное в LaTeX, но сходу вышло как то муторно;-(

 , ,

AntonI
()

Обновил андроид на смартфоне - поперли глюки

Форум — Mobile

Смарт Нокиа 7 плюс. Обновился до андроид 10 и понеслась

  • эпизодически аццки лагает браузер (зависает секунд на 5-10)

  • несмотря на блокировка мобильного интернета в роуминге и даже вообще выключение мобильного интернета он все равно коннетиктся к 4G. Уже влетел на 500 руб и боюсь это не предел

Зато блин иконки стали квадратные, ну афигеть!

Как им закинуть багрепорт и компенсировать расходы?:-) Сумма мизерная, но если каждый с них ее снимет в следующий раз не будут совать в релиз сырой софт.

 ,

AntonI
()

RSS подписка на новые темы