• Как устроено окто дерево? Как происходит отсечение видимых грайней?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Вернуть все данные в узле. это же самое что дальше продолжать обходить все внутренние рекурсией или стеком узлы, и составить список. В чем профит то тогда? Как можно вернуть все данные по щелчку.


    Да, именно так, надо обойти все узлы дальне.
    Но при этом уже не надо проверять на видимость и код там попроще.

    А профит тут в том, что вы вот так вот обходите не все дерево. а только маленькую его часть.

    Окто дерево используется, чтобы отсечь те объекты, которые сзади или сбоку от камеры и точно не видны. Оно не помогает отсекать объекты, закрытые стеной. Тут, действительно, используется z-buffer.
    Ответ написан
    4 комментария
  • Безопасность выбора чисел для генерации RSA?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    e выбирается из условий 1 < e < φ(n) и НОД(e, φ(n)) = 1. Самый тривиальный вариант для удовлетворения этих условий - взять для e простое число, меньшее φ(n). При этом берут значение e, содержащее минимум единиц в двоичном представлении, чтобы ускорить вычисления.

    k искать не надо, надо искать d, такое, что de ≡ 1 (mod φ(n)). Обычно используется расширенный алгоритм Евклида.
    de + kφ(n) = НОД(e, φ(n)) = 1
    При известных e и φ(n) алгоритм позволяет вычислить d и k как коэффициенты Безу.

    К p и q требования только по длине. Чем длиннее число, тем более криптостойкое будет шифрование. Используют числа длиной 1024, 2048 или 4096 бит.
    Ответ написан
    6 комментариев
  • Можно ли запускать на серверах c ARM процессорами, виртуальные машины на х86, amd64?

    @res2001
    Developer, ex-admin
    Это уже не виртуализация, а эмуляция. Как писали выше qemu это умеет, но из-за эмуляции большая потеря производительности. Это можно использовать где-то в тестовой среде или в разработке, но явно не в продакшене.
    Ответ написан
    Комментировать
  • Можно ли запускать на серверах c ARM процессорами, виртуальные машины на х86, amd64?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Да, можно: qemu умеет, но потери производительности ~90%. Для мака есть https://getutm.app/ - вот оно через qemu и работает.
    Ответ написан
    Комментировать
  • Как понять что APK битый без конрольных хэш сумм?

    axifive
    @axifive
    Software Engineer
    В apk (zip архиве) все файлы имеют crc32 хэш суммы, но так же он еще и подписывается.
    Любое изменение как раз повреждает подпись, что и не даст установить. Но изменения в байтах архива в большинстве случаев, все равно позволят его распаковать.
    Если незначительно поврежденный архив переподписать, то установить получится.
    Ответ написан
    Комментировать
  • Как найти количество помеченных связных графов?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Формула включения-исключения. Берете все графы, где хотя бы одна вершина соединена со всеми (их n*2^(n-2)*(n-1)), вычитаете все графы, где хотя бы две вершины соеденины со всеми (2 раза, ведь они 2 раза подсчитались), прибавляете графы, где хотя бы 3 вершины соеденины со всеми (3 раза)... И т.д.

    Графов, где хотя бы k вершин имеют степень n-1 - C(n, k)*2^{(n-k-1)(n-k)/2}: тут можно выбрать k вершин и для каждого ребра из оставшихся n-k вершин есть 2 варианта - оно или есть, или нет.

    Это будет за O(n log n) решение, если пердподсчитать все факториалы и обратные к им по модулю в задаче. Ну, или O(n^2), если считать сочетания через треугольник паскаля.

    Ражеванное объяснение:

    Сложно подсчитать количество графов где ровно 1 вершина такая полная. Но легко подсчитать те, где k или более таких. Мы их такие зафиксируем и нарисуем от них все ребра. А все оставшиеся ребра в графе могут быть любыми. Во-первых, можно выбрать эти k вершин - поэтому у нас есть множитель C[n,k]. Оставшиеся, незафиксированные ребра идут между любыми двумя оставшимся n-k вершин. Их (n-k)(n-k-1)/2. И каждое может быть или проведено или нет.

    Поэтому всего таких графов, с не менее k вершин: F(k)=C[n,k]*2^{(n-k)(n-k-1)/2}.

    Теперь, как подсчитать графы ровно с 1 вершиной? Можно взять F(1). Но мы насчитали много лишнего, Графы с 2мя такими вершинами мы в F(1) подсчитали 2 раза. Поэтому вычтем 2F(2). Теперь графы ровно с 3 вершинами мы подсчитали 3 раза в F(1) и 3 раза в каждом F(2). Поэтому пока мы их насчитали 3-2*3 = -3 раза. Поэтому прибавим 3F(3). И далее, получится, что графы ровно с 4-мя вершинами мы подсчитали 4 раза (4-2*6+3*4). И т.д.
    Ответ написан
    6 комментариев
  • Возврат собственного типа ошибки из main с печатью сообщения об ошибке?

    bingo347
    @bingo347
    Crazy on performance...
    fn main() -> MainResultWrapper {
        MainResultWrapper(main_inner())
    }
    
    #[inline(always)]
    fn main_inner() -> Result<(), GlobalError> {
        let config = read_config_from_file()?;
        Ok(())
    }
    Ответ написан
    Комментировать
  • Какая будет единая формула для ячейки?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Разница по горизонтали всегда +2. Значит число из строки 2 будет входить с коэффициентом 2.
    По вертикали разница на -1. Значит число из столбца B будет с коэффициентом -1.

    Итак, формула -1*$B3+2*C$2 - 1 . -1 в конце подбираем так, чтобы в самой первой ячейке оказался 0.
    Ответ написан
    Комментировать
  • Возможно ли создать универсальное решение для процесса синхронизации данных от разных поставщиков?

    Slavik_Kenny
    @Slavik_Kenny
    3Д моделлер, и немного всего остального :)
    Такая-же боль на работе имеется: куча приборов химического анализа от кучи разных производителей - практически у каждого свой формат вывода.
    И таки да - под каждый прибор свой метод разбора результатов: у одного можно напрямую к БД подключиться, у другого разбирать файлы с сетевой папки куда несколько однотипных приборов скидывают результаты, у третьего экселевские таблицы ковырять и т.д.
    Итого у меня все это происходит в два этапа-
    1 - получить в промежуточную таблицу данные с прибора (часть уникальная для каждого прибора, или каждого производителя), эта таблица содержит все возможные поля для данных, которые могу вообще поспать с любых приборов.
    2 - универсальная часть, которая уже из промежуточной таблицы, по имеющимся данным раскидает их в рабочую базу ЛИМСа.

    Как и сказал mayton2019 практически написался свой язык для парсинга результатов с приборов, так как никогда не угадаешь, какой прибор купят завтра и какие извраты с экспортом результатов в нем будут использоваться :)
    Ответ написан
    1 комментарий
  • Как "склеить" два файла?

    Vapaamies
    @Vapaamies
    Психанул и снес свои ответы козлам, не отмечающим…
    Речь про инъекцию? Гуглить про инъекцию. Дописывание байтов в конец не поможет, обязательно нужно учитывать структуру ELF или PE, что у вас там? В PE в конце файла будут перемещаемые символы («релоки») или ресурсы. Для правильной склейки файл еще придется перебазировать.
    Ответ написан
    2 комментария
  • Как "склеить" два файла?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Большой и сложный бинарник вы так не встроите. Максимум, отдельные функции.

    Для винды можно ваш второй файл сделать в виде dll и выпоннять код во время ее загрузки. Чуть подправить исполняемый файл или вообще просто положить dll-ку рядом с exe-шником - и библиотека загрузится.

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

    В этом случае, надо изучить устройство PE файла, понимать немного ассемблера.
    Ответ написан
    Комментировать
  • Где умные указатели размещают полученные данные?

    vabka
    @vabka Куратор тега Rust
    Токсичный шарпист
    Cell<T> has the same memory layout and caveats as UnsafeCell<T>. In particular, this means that Cell<T>has the same in-memory representation as its inner type T.


    У остальных нет никаких обязательств о memory representation, но они тоже ничего в куче не выделяют.

    Ну и всегда можно посмотреть на исходники)
    https://doc.rust-lang.org/src/core/cell.rs.html#293
    https://doc.rust-lang.org/src/core/cell.rs.html#2034
    https://doc.rust-lang.org/src/core/cell.rs.html#700
    https://doc.rust-lang.org/src/core/cell/once.rs.html#33
    Ответ написан
    Комментировать
  • Как отправлять почту Python без использования сторонних SMTP?

    saboteur_kiev
    @saboteur_kiev Куратор тега Python
    software engineer
    Таким образом можно отправлять письма только на свой корпоративный почтовый сервер.
    Любой публичный почтовый сервер получателей сейчас использует дефолтные почтовые фильтры, которые сразу отвергнут ваше письмо. Разве что на сервере получателя договариваться о настройке исключения.

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

    Поэтому следует уточнить задачу - если вы отправляете письмо сами себе для мониторинга, то библиотек полно. Протокол smtp очень простой, хоть напрямую телнетом шли. Главное чтобы ваше письмо там не зарежектили.
    Ответ написан
    1 комментарий
  • MySQL ошибка InnoDB: Attempted to open a previously opened tablespace. Куда копать?

    martin74ua
    @martin74ua Куратор тега MySQL
    Linux administrator
    Что такое "база расшарена по сети" ?
    У вас есть один сервер mysql и к нему коннектится приложение с нескольких компов? Так же, правда?
    Ответ написан
    Комментировать
  • Где можно найти курс по разработке 3д игры на c++ и vulkan?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Низкий порог вхождения для C++ и Vulkan означает продвинутый уровень владения инструментом C++, экспертные навыки обработки графики, работы с шейдерами и управления памятью GPU (да, там все иначе). Для входа в работу с Vulkan нужно быть, как минимум, Middle Graphics Engineer и уже уметь уверенно работать с DirectX11 или OpenGL4.5. Без этих знаний вулкан будет очень сложно понять, а правильно работать с ним получится только через десятки и сотни полностью неудачных итераций написать одно и то же.

    Vulkan является очень низкоуровневым GAPI и требует от пользователя изначально серьезной подготовки. У этого GAPI много точек привязки к системной памяти, содержимое которой трактуется как на GPU, так и на CPU. Поэтому работать с памятью в C++ правильно нужно уметь с самого начала. Поэтому, еще до начала работы с вулканом от пользователя требуются экспертные знания языка. В противном случае вместо обучения работе с довольно сложным GAPI получится блуждание по полю граблей, где ничего не понятно.

    При этом, курсов, статей и книг для обучения вулкану очень много и их очень легко найти.
    Есть очень хороший цикл статей для самостоятельного обучения, есть даже перевод на наш язык.
    Есть множество книг, по которым люди учатся работать с вулканом. Learning Vulkan считается самой лучшей.
    Поисковиком легко ищутся разные мелкие примеры работа с вулканом.
    Есть даже онлайн курсы для обучения под наблюдением инструктора.

    И тем не менее, вулкан легко не дастся. Для его понимания нужна база, нужно знать устройство GPU, принципы коммуникации с ним, принципы его работы и всю теорию обработки графики. Нужно уже уметь быстро писать много стабильного и сложного кода на C++, нужно уметь безошибочно писать на GLSL или SPIR-V. Нужно уметь пользоваться графическими отладчиками, профилировщиками, разбираться в диагностике проблем при работе с графикой.
    Все это приобрести можно в процессе практики с DirectX11 и OpenGL4.5.
    Ответ написан
    6 комментариев
  • Существует ли практика выставления приоритета запросу в очереди сообщений?

    @asmelnik
    Похожая проблема для сетевого трафика решена путем "раскладки" пакетов по нескольким очередям разного приоритета (вроде чаще всего 3 шт).
    Пример алгоритма
    есть 3 очереди: высокий приоритет, средний, низкий.
    Данные из очередей извлекаются в таком порядке:
    Из высокоприоритетной за проход при наличии данных - 4 сообщения, из среднеприоритетной - 2, из низкоприоритетной -1..
    И так и бегаем по кругу - 4, 2, 1, 4, 2, 1....

    Распределение сообщений по очередям -- это уже на вашей совести будет :)
    Ответ написан
    Комментировать
  • Какой подход лучше использовать для копирования крупного файла по сети, исп python script?

    @pfg21
    ex-турист
    ftp-proxy и подобные https://github.com/3proxy/3proxy

    опять же ты написал что машине доступен выход в интернет ?? так отправляй напрямую через passive mode ftp - он не формирует обратный канал для передачи данных и значит отлично работает как чисто клиентское приложение.

    но я б отказался от древнего фтп в сторону хотя бы rsync.
    Ответ написан
    8 комментариев
  • Из чего собрать домашний мини-сервер?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Прежде всего ликвидировать кашу в голове. Серверу - серверово, медиастанции - свое. Валить все это в одну кучу, да еще на ProxMox - Ну, наверное, можно, если хочется потом просиживать за чтением манов на тему "как пробросить то и это куда-то" или еще каким.

    Начинаем со списка "Какие я хочу сервисы"
    Потом их группируем по возможности выполнения на одной платформе (потому что TV, NAS, VPN в одной коробке будут смотреться примерно как автомобиль с лыжами и крыльями)
    И потом уже начинаем подбирать платформы - а их тут как минимум две
    Ответ написан
    1 комментарий
  • Получение з/п в крипте. Какие минусы?

    vabka
    @vabka
    Токсичный шарпист
    Минусы:
    1. Вам самим придётся все свои доходы декларировать, чтобы потом не жаловаться, что вам заблокировали счета и начислили пени за неуплаченный налог в лучшем случае
    2. Закон тебя никак не защищает (могут уволить одним днём, например, и вполне законно могут недоплатить, списав на волатильность курса)
    3. Работодатель, который такое предлагает - в 99% случаев занимается чем-то серым, а то и незаконным => тебя ещё могут как соучастника накрыть, если очень сильно не повезёт.
    4. Курс волатильный и могут быть проблемы при попытке перевода в фиат (начиная с комиссий и невыгодного курса, заканчивая обвалом курса и отсутствием покупателей. Про возможность объявления крипты вне закона или блокировки счёта на бирже или в банке я молчу)

    Законно ли это(живу в России)?

    То что ты делаешь уже не законно, даже без привлечения крипты, тк в России запрещено иметь трудовые отношения (регулярные работы на полный рабочий день с фиксированной ежемесячной оплатой) между самозанятым (исполнителем в статусе самозанятого) и заказчиком, ибо это очевидное уклонение от налогов (со стороны исполнителя, ибо так ты уклоняешься от НФДЛ) и нарушение трудового кодекса (со стороны заказчика, тк он уклоняется от уплаты взносов в ФСС и ПФР, и не обеспечивает тебя-работника социальными гарантиями)

    Законно ли это(живу в России)?

    Крипта в России не является законным средством платежей. Так что если не хочется проблем с законом - нужно оформлять две операции:
    1. Оказание услуг (с ценой рублях).
    2. Продажа/покупка крипты на эту сумму.
    Причём по времени сначала ты должен оказать услугу, а уже потом "купить" крипту, после чего её продать, и уже тогда деньги с продажи крипты должны поступить на твой счёт в банке. Иначе рискуешь словить блокировку (в лучшем случае - временную, пока не объяснишь банку, что это вообще произошло)

    Иначе потом будут вопросы "а откуда крипта" и "а где деньги, которые ты должен был получить за оказание услуг".

    Много ли уходит на комиссиях?

    Это уже зависит от того, как будешь выводить и как тебе будет твой "работодатель" деньги присылать.
    Ответ написан
    4 комментария
  • Лучшие источники для изучения CPP?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    В самую первую очередь - это будет документация языка. Ее очень удобно использовать как справочник. Это - твой самый первый источник информации по любому вопросу.
    isocpp поддерживается создателем языка и содержит море полезной информации.
    C++ Core Guidelines является манифестом пользователя C++. Его знать обязательно. Документ регулярно дополняется.

    More C++ Idioms. Шаблоны проектирования имеют свою собственную многомерную классификацию. Идиомы - это функциональные шаблоны проектирования, применимые, как правило, или для конкретного языка, или для некоторого семейства языков. Эта открытая книга помогает ориентироваться в некотором начальном наборе идиом конкретно для языка C++.
    C++ Patterns - еще один полезный ресурс для изучения применимых к C++ шаблонов проектирования.
    С Fluent C++ ты уже знаком.
    Безусловно, блог создателей PVS-Studio.
    Habr, конечно же.
    Блогов очень много, их можно просто найти по релевантной фразе "C++ blog".

    Помимо этого есть большое количество каналов от разных конференций, доклады на которых всегда помогают понять язык лучше.
    С++Russia,
    C++Now,
    Pacific C++,
    CppCon,
    code::dive,
    Meeting C++.

    Так же будет полезно изучить книги авторов:
    Андрея Александреску,
    Герба Саттера,
    Девида Вандервуда,
    Скотта Мейерса,
    Роберта Мартина.
    Есть и другие очень полезные авторы. Тут у меня, пожалуй, только самый основной список.

    Последим, и самым важным, источником будет текущая рабочая версия стандарта языка, а так же пара лабораторий для практики: Compiler Explorer и C++ Insights.
    Ответ написан
    Комментировать