• Где можно найти курс по разработке 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
    Внимание! Изменился адрес почты!
    Прежде всего ликвидировать кашу в голове. Серверу - серверово, медиастанции - свое. Валить все это в одну кучу, да еще на 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.
    Ответ написан
    Комментировать
  • Что не так с алгоритмом шифрования фотографий?

    @U235U235
    Никогда не используй сжатие с потерями jpeg для таких целей. Используй PNG.
    Ответ написан
    2 комментария
  • Парсинг по расписанию и аплоад в БД?

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

    Если удобного идентификатора нет, то обычно самое простое, - формировать из сравниваемых данных строку одинаковым способом, и получать из нее хеш сумму (md5 более чем подходит, если данных не 16-значное количество, т.е. не нужно заботиться о коллизиях), его и используй как идентификатор и храни где-то списком как предыдущие значения и сравнивай с ново загруженной, прямо во время анализа. Записи, хеш сумма которых, не была найдена в записях, помещай в базу данных (ну или обновляй значения, если речь идет о модификации а не добавлении новых).
    Ответ написан
    Комментировать
  • Знает ли кто-то системную DLL, которая не фиксирует себя в памяти при загрузке?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вряд ли тут какие-то хитрые методы остаться в памяти тут используются. Просто библиотека приложением итак используется. LoadLibrary лишь увеличивает счетчик использований, FreeLibrary просто уменьшает его, и ничего не загружается/выгружается. Попробуйте найти какую-то dll-ку, которая не выводится в списке в начале.
    Ответ написан
    1 комментарий
  • Как асинхронно использовать gui и несколько бесконечных циклов?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Асинхронный код запустить в отдельном потоке, а все взаимодействия с интерфейсом из этого кода делать сигналами. Есть ещё библиотеки, позволяющие использовать цикл событий asyncio в качестве цикла событий окна, что звучит здорово, но сам я их в бою не пробовал.

    UPDATE:
    Надо же, с 2019-го многое поменялось в интересную сторону. Для PyQt и PySide есть qasync, который активно развивается, а для Tk вообще не нужны сторонние библиотеки:
    import tkinter as tk
    from tkinter import ttk
    import asyncio
    
    
    class App:
        async def exec(self):
            self.window = Window(asyncio.get_event_loop())
            await self.window.show();
    
    
    class Window(tk.Tk):
        def __init__(self, loop):
            self.loop = loop
            self.root = tk.Tk()
            self.animation = "░▒▒▒▒▒"
            self.label = tk.Label(text="")
            self.label.grid(row=0, columnspan=2, padx=(8, 8), pady=(16, 0))
            self.progressbar = ttk.Progressbar(length=280)
            self.progressbar.grid(row=1, columnspan=2, padx=(8, 8), pady=(16, 0))
            button_block = tk.Button(text="Calculate Sync", width=10, command=self.calculate_sync)
            button_block.grid(row=2, column=0, sticky=tk.W, padx=8, pady=8)
            button_non_block = tk.Button(text="Calculate Async", width=10, command=lambda: self.loop.create_task(self.calculate_async()))
            button_non_block.grid(row=2, column=1, sticky=tk.W, padx=8, pady=8)
    
        async def show(self):
            while True:
                self.label["text"] = self.animation
                self.animation = self.animation[1:] + self.animation[0]
                self.root.update()
                await asyncio.sleep(.1)
    
        def calculate_sync(self):
            max = 3000000
            for i in range(1, max):
                self.progressbar["value"] = i / max * 100
    
        async def calculate_async(self):
            max = 3000000
            for i in range(1, max):
                self.progressbar["value"] = i / max * 100
                if i % 1000 == 0:
                    await asyncio.sleep(0)
    
    
    asyncio.run(App().exec())
    Ответ написан
    Комментировать
  • Насколько законно для крупной компании пробивать человека по почте?

    vabka
    @vabka
    Токсичный шарпист
    Во-первых это не форум психологической помощи, а при ограниченных данных - вас можно максимум что утешить.

    Чтобы определить что что-то законно или незаконно - нужно сначала определить, что вообще произошло без этих преамбул о плохом коде и эмоциях.

    Сейчас я по твоим словам вижу, что ты:
    1. Отправил разработчикам письмо с оскорблениями и угрозами - это уже как минимум некрасиво, а может даже и незаконно.
    2. Они взяли адрес электронной почты, с которой ты письмо отправил, загуглили, нашли твою личную страничку на каком-нибудь условном linkedin, где ты указал её как контактную, увидели там компанию, в которой ты сейчас работаешь.
    3. Отправили на неё письмо с требованием извинений от тебя как сотрудника этой компании.

    Гуглёж и отправка писем не является нарушением закона.

    PS: Что такое "пробив по почте"?
    Ответ написан
    1 комментарий
  • Несколько пользователей или контейнеризация?

    @rPman
    будет трудно найти того, кто будет это настраивать и поддерживать
    все ваши проблемы от сюда. Либо ищите готового специалиста, либо выращивайте своего

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

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

    Настоятельно рекомендую организовывать работу с пользователями linux, все инструменты настроены именно на это, а контейнеризация перенесет все под одну гребенку и усложнит.
    Ответ написан
    1 комментарий
  • Какая база данных подходит для частых UPDATE и сортировки?

    @Eugene-Usachev
    Если я правильно понял суть вопроса, вам подойдёт любая KV СУБД. Вынесите только эту таблицу в какой-нибудь Tarantool или Redis (я имею в виду использовать хранимые процедуры для вашей задачи). 1-3 млн записей - относительно немного. Даже если одна запись весит 4 КБ, все данные займут 4-12 ГБ ОЗУ, что не так уж и много. Если использовать батчинг, что Redis, что Tarantool дадут вам на 16 ядрах свыше 100к RPS на такие сложные запросы.

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

    UPD: AerospikeDB тоже позволяет сохранить готовые процедуры, так что его функционала хватит для вышеуказанной задачи.
    Ответ написан
    1 комментарий
  • Что делает эта функция?

    NeiroNx
    @NeiroNx
    Программист
    Считает хэш по определенному алгоритму. Проверка серийных номеров лицензий и т.д.
    Обычно дизассембер криво разворачивает их, поэтому надо проверять на реальных данных.

    То что вы делаете вероятно противозаконно, будьте внимательны, сейчас все записывается.
    Ответ написан
    5 комментариев
  • Как найти компоненты связности в графе в распределенной памяти?

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

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

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

    Более сложный вариант - когда у вас сразу запускаются все волны. Опять же, без лидера совсем сложно будет.
    Тут, наверно стоит сначала в каждом отдельном параграфе найти все компоненты связности отдельно. Это будут промежуточные варианты.

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

    Когда сервер получает сообщение о номере по призначному ребру, если этот номер меньше текущего у компоненты, она перекрашивается. И сообщение рассылается по всем остальным призрачным ребрам, торчащим из этой компоненты. Рано или поздно, все вершины одной компоненты по всем серверам будут помечены минимальным номером.

    Чтобы определить, что все закончилось, можно разбить процесс на фазы. В первой фазе все рассылают свои номера. Во второй фазе только те, у кого номера обновились. И т.д. Фаза на сервере начинается после сообщения от лидера. Каждый сервер отправляет на лидер сообщение, когда он закончил рассылать свои номера и были ли там вообще обновления. Сообщения надо делать по tcp с подтверждением. Когда лидер заметит, что никто никаких сообщений больше не рассылал в предыдущей фазе - все сошлось.
    Ответ написан
    1 комментарий
  • Как умножаются кубиты, как умножить на матрицу CNOT?

    @codecity
    Возможно вам или читающим тему поможет: https://quantum-computing.ibm.com/composer/files/new

    1696802981
    Ответ написан
    Комментировать
  • Как удалить скобки в математическом выражении?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Самое надежное - распарсить выражение, построить Абстрактное Синтаксическое Дерево (это бинарное дерево, где вершина - операция, а два ребенка - операнды, которые могут быть или числом, или выражением).

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

    Так, если вершина "+", то скобки ставить вообще не надо. Если вершина "*", то надо ставить скобки вокруг ребенка, если там операция "+" или "-". Если вершина "-", то надо ставить скобки справа, если там "+" или "-". Если вершина "/", то надо ставить скобки вокруг левого сына, если там "+" или "-". Вокруг правого сына скобки надо ставить если не число. Подумайте аккуратно, может я какие-то правила упустил.

    Это удобно реализовывать рекурсивной функцией. Она проверяет, надо ли ставить скобки вокруг левого сына и выводит его рекурсивно, потом операцию, потом также правого ребенка.

    Парсинг - очень заезженная тема. Гуглите. Самый простой алгоритм - квадртатичный - проходитесь по строке и ищите самую левую операцию с самым большим приоритетом вне скобок (ведя счетчик открытых скобок). Если такой нет, то можно опустить скобки по краям. Если их нет, то это число (или перменная). Если нашли операцию, то рекурсивно разбирайте две подстроки слева и справа.
    Ответ написан
    5 комментариев
  • Для чего нужен nodejs?

    @Alex_At_Net
    Обращайтесь, помогу - https://t.me/codecraft_phd
    самое простое объяснение: node.js - это exe-файл `node.exe`, который выполняет инструкции из .js файла. Запускать из коммандной строки:

    node.exe server.js

    Инструкцией в JS файле может быть: создать web-server, который на запрос /users возвращает HTML строку со списком пользователей.

    server.js файл может быть таким:

    require('http').createServer((req, res) => {
        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.end('Привет!');
    }).listen(3000, () => { });


    express - это набор функций (в примере выше require, createServer - вызовы функций), которые упрощают написание правил "запрос -> генерация ответа". Посмотрите на примеры: https://expressjs.com/en/starter/hello-world.html

    хост-провайдер, в данном случае, предоставляет машину, с windows или linux, на которой можно запустить node.exe с приведенным server.js. Хост провайдер, в отельной системе, настраивает так, что запросы www.mysite.com направляются на эту машину, на её 3000 порт.

    php - это, в большинстве случаев, модуль Web-server-а. В терминах этого примера, php - это функция, которой передается php файл, а на выходе - строка результата. Например:

    require('http').createServer((req, res) => {
        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.end(php('c:\\projects\\app\\main.php')); // вызов PHP
    }).listen(3000, () => { });
    Ответ написан
    7 комментариев
  • Как нарисовать кривую Серпинского (см. ниже), не используя графические библиотеки, а '*' или слешы?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Напрягает требование, что нельзя использовать контейнеры. Так-то ваш подход правильный: Заводим поле для вывода, рекурсивной функцией, которой передаются порядок кривой, и где ее рисовать (квадрат и его поворот). Функция рекурсивно вызывает 4 кусокчка в каждом из 4 квадратов и рисует 3 соединительных кусочка. Но поле для вывода это так или иначе массив. Можно и самому его завести, но почему нульзя использовать контейнеры - не понятно.

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

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

    edit: Да, еще есть трюк - считайте, что кривая не замкнута. Левый верхний угол - пустота. И надо отдельно в самом конце замкнуть ее в этом углу через "/".
    Ответ написан
    6 комментариев
  • Как исключить файл из Pull Request?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    Как я понял, вы хотите в одном и том же репозитории хранить два енвайрнмента, на одной и той же машине.
    Но это неверный подход. Ветки это не разные версии софта, ветки это разные состояния исходников.
    Сделайте ваш код, чтобы там был prod.config, dev.config и все
    Ответ написан
    2 комментария