Задать вопрос
  • Можно объединить electron.js приложение с низкоуровневым кодом?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    У электрон под капотом node.js, а значит под него можно писать нативные аддоны так же как к node.

    В плане Rust для этого есть 2 фреймворка:
    https://neon-bindings.com/
    https://napi.rs/

    Из личного опыта, неон я пробовал, показывает он себя очень хорошо, но под капотом он не полностью использует napi, а так же задействует низкоуровневое api ноды для C++, что требует пересборки проекта под разные версии ноды, с электроном тут проще, так как мы тащим конкретную версию ноды с собой. Но с электроном есть другая особенность в плане нативных аддонов - кроссплатформенность. По сути нативные аддоны ноды - это просто динамически подгружаемая библиотека (.dll на винде, .so на линуксе и .dylib на маке), соответственно нужно будет делать билд под все платформы, под которые мы делаем наше приложение.
    До napi.rs у меня руки пока не дошли, но выглядит очень хорошо. И на сколько я понял оно полностью сделано поверх napi - высокоуровневым C-abi совместимым апи, не требующем пересборки под разные версии ноды.

    Насчет OpenGL/Vulkan/Metal - помимо node.js у электрон под капотом хромиум, в котором есть WebGL, который в свою очередь JS биндинг к OpenGL. Это по сути и есть OpenGL в чистом виде, просто прокинутый в JS. Но апи OpenGL весьма низкоуровневое, в отличии от DirectX/Vulkan/Metal
    Ответ написан
    1 комментарий
  • Как понять блокчейн?

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

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

    Уже начиная от сюда - создана криптовалюта (и не одна, но имеет смысл только биткоин, почему - ниже), в которой с помощью блокчейна и надежного PoW консенсуса, создана 'амбарная книга' где записываются транзакции буквально 'кто кому сколько перевел монет' и все могут доверять этим записям при условии ограничений консенсуса (в случае с PoW это атака 50%+1 и возможность подобрать такое количество подтверждений от циркулирующих сумм, при котором этой атакой можно пренебречь)

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

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

    Сначала создавались криптовалюты, как копирующие bitcoin так и реализация с нуля с необычным функционалом и концепцией, эксперименты с альтернативными консенсусами и прочим,.. которые показали что самого по себе консенсуса недостаточно для обеспечения надежного функционирования системы, нужны еще такие вещи как качественное первоначальное распределение ценности (монет блокчейна, если грубо) и наличие независимых разработчиков, более чем одна команда, грамотное управление и воля участников к поддержанию системы на плаву. Требование про разработчиков очень философское и есть куча примеров когда вне зависимости от консенсуса, главные разработчики, владельцы основного объема ценностей были связаны/созависимы, и были способны уничтожить полезный проект (например что произошло с bitshares, если что это показало на сколько PoS консенсус уязвим).

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

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

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

    p.s. почему только bitcoin? потому что только в нем распределение богатств заметно равномерный (индекс джини), только его консенсус подкреплен огромными финансовыми вливаниями в оборудование для майнинга (очень дорогая атака) и огромное комьюнити независимых разработчиков (правда тут есть куча мест для слабости проекта, но по сравнению с другими - bitcoin выглядит как самый защищенный).
    Остальные проекты создаются не с целью привнести что либо полезное миру, а с целью собрать денег, либо как сбор средств на разработку (ICO или комиссия в блокчейне), а когда консенсус основывается буквально на объеме денег (чистый PoS), то сам факт того что основные деньги проекта сосредоточены у кого то одного (создателя или олигополии инвесторов как это сделано в EOS, точнее dPoS проектах) полностью обнуляет любую защиту.

    p.p.s. меня заинтересовал единственный альтернативный консенсус - proof of identity (сейчас это idena.io - примерно 2к-3к нод, 7к..14к 'майнеров' и количество растет ~10% в месяц , для молодого слабого проекта это чудо в криптоэкономике), основная беда большинства не PoW - возможность атаки количеством нод или деньгами, но тут одна идентити = один человек (ну ок, две - это норма), это гарантирует консенсус, а опасность сбора фермы рабов для атаки на проект усложняется низкой стоимостью монеты, т.е. как это не парадоксально, пока доходы майнеров тут будут низкими - консенсус будет надежным

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

    хех, надо бы это оформить в виде статьи на хабр и отправлять народ туда
    Ответ написан
    3 комментария
  • Есть ли аналог std::string в драйвере уровня ядра windows?

    @res2001
    Developer, ex-admin
    В WinAPI даже в user space нет аналога std::string.
    Что уж говорить о kernel space - там вообще все очень скудно.
    Перепишите функцию на использование Си строк и буфера фиксированного размера. Кроме того, загонять в драйвер функционал std::string видится избыточным - слишком много в stringе используется динамической памяти, что снижает производительность кода, обычно в драйверах это противопоказано.
    Ответ написан
    Комментировать
  • В разных IDE код выдаёт разный ответ, как так?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Это тот самый случай, когда с виду простой код заставляет разобраться во множестве тонкостей языка.
    Для лучшего понимания проходящих в коде процессов сперва требуется внимательно присмотреться к стандарту языка.

    Что стандарт говорит нам о перегрузке операторов?
    A declaration whose declarator-id is an operator-function-id shall declare a function or function template or an explicit instantiation or specialization of a function template. A function so declared is an operator function.

    cout << a.get() << b.get();
    Данный код маскирует два вызова одной функции - std::ostream& operator << ( std::ostream&, int ).

    Тут очень важно уточнить форму перегрузки оператора, т.к. результат поведения этого кода сильно зависит от применяемой формы перегрузки.
    Относительно стандартной формы перегрузки operator << () стандарт говорит что это перегрузка в форме внешней функции.

    Значит приведенный код можно записать как:
    operator<<( operator<<( cout, a.get() ), b.get() );


    И именно с этого момента начинается самое интересное.

    Что стандарт говорит нам о вызове функций? А говорит он совсем разные вещи.
    C++14 [expr.call#5.2.2.8] заявляет, что:
    The evaluations of the postfix expression and of the arguments are all unsequenced relative to one another. All side effects of argument evaluations are sequenced before the function is entered (see 1.9).

    C++17 [expr.call#8.2.2.5] утверждает, что:
    If an operator function is invoked using operator notation, argument evaluation is sequenced as specified for the built-in operator; see 16.3.1.2.

    В результате, если транслировать данный код как код 14-го (или старших) стандарта, поведение у этого кода будет одно. Если же код транслировать как код 17-го (и моложе) стандарта, его поведение будет будет уже другим.

    А что же там с вероятным неопределенным поведением? Ведь неупорядоченная модификация состояния является UB. И, вроде как, cout << a.get() << b.get(); можно упростить до cout << ++i << ++i;, что уже более явно должно показывать наличие UB.
    UB в этом коде нет. И вот почему.

    Для определения порядка вычисления участков выражения следует руководствоваться правилами упорядочивания выражений.
    Среди прочих правил там записаны важные для нас сейчас. Я приведу цитаты.
    2) The value computations (but not the side-effects) of the operands to any operator are sequenced before the value computation of the result of the operator (but not its side-effects).

    3) When calling a function (whether or not the function is inline, and whether or not explicit function call syntax is used), every value computation and side effect associated with any argument expression, or with the postfix expression designating the called function, is sequenced before execution of every expression or statement in the body of the called function.

    5) The side effect of the built-in pre-increment and pre-decrement operators is sequenced before its value computation (implicit rule due to definition as compound assignment)


    16) Every overloaded operator obeys the sequencing rules of the built-in operator it overloads when called using operator notation. (since C++17)

    19) In a shift operator expression E1<<E2 and E1>>E2, every value computation and side-effect of E1 is sequenced before every value computation and side effect of E2. (since C++17)


    До C++17 порядок вычисления операндов cout << a.get() << b.get(); не определен, но поведение этого кода определено. Поэтому при трансляции по стандарту C++14 этот код может выдать или 12, или 21. Но не 11.
    Начиная с C++17 порядок вычисления операндов строго определен и является интуитивным, а результат выполнения cout << a.get() << b.get(); всегда однозначен. При трансляции этого кода по стандарту C++17 (и дальше) в консоль будет выведено всегда и только 12.
    До C++11 поведение кода cout << a.get() << b.get(); не определено.

    Сегодня мы уже не задумываемся о жизни до стандарта C++11, поэтому я не скажу что в общем смысле в этом коде присутствует UB. Я скажу что UB тут нет. Но тем не менее, я бы рекомендовал избегать присутствия подобного кода в проектах даже если используется стандарт C++17 и дальше.
    Ответ написан
    Комментировать
  • Как работают алгоритмы выбора лидера в распределенных системах?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Можно же просто сделать так - какой-нибудь узел заметил, что текущий лидер отвалился, и он сразу же отправляет всем остальным узлам напрямую, либо на какую-то шину, что теперь он - лидер.

    Если текущий лидер отваливается, почему вы думаете, что все остальные узлы узнают об этом по очереди?
    Узнают одновременно. И одновременно пошлют всем узлам, что они новые лидеры, и получится бардак.
    Именно поэтому и проводится выбор - либо генерируется случайное число каждым узлом, и выбирается среди всех тот, у кого число самое большое. Либо есть заранее заданные приоритеты выбора лидеров, основанные или на конфигах, или на мощностях, как уж создателю программы показалось нужным.
    Опять же, в алгоритм можно добавить настройки, чтобы администратор мог указать какие машины не должны участвовать в выборе.
    Ответ написан
    2 комментария
  • Нужна ли математика .net разработчику?

    Большинство .net вакансий - это Энтерпрайз.
    Математика нужна на уровне арифметики начальной школы.
    В геймдеве - наверно на уровне тригонометрии из старшей школы, если говорить о разработке под готовым движком
    Ответ написан
    Комментировать
  • Книги для разработки операционных систем?

    32bit_me
    @32bit_me
    Программист, встраиваемые системы
    Таненбаум "Современные операционные системы".
    А вообще совет - читайте исходники опенсорсных систем.
    Ответ написан
    Комментировать
  • Как отправить изображение использую HTTP?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    >шифрование в base64
    Не шифрование, а кодирование. Бессмысленное причем, так как сначала картинку сжали (джпегом, вестимо), а потом раздули (в 4 раза).

    Сменить технологию решения или разработчика. Самое простое - на POST запрос
    Ответ написан
    Комментировать
  • Почему не работает счетчик?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Потому что автор сей поделки не в состоянии даже грамотно назвать переменные. А о декомпозиции и не слышал.
    Тут переписывать надо минимум половину кода. Условия составлены неверно, в конце цикла путаница с присвоением переменных.
    А по уму надо написать функцию, которая будет проверять одно число и возвращать true/false - подходит число под условие или нет. Потом просто в цикле эту функцию вызывать и считать количество подходящих чисел.
    Ответ написан
    Комментировать
  • Установка модуля Wifi linux. В чем проблема?

    Zoominger
    @Zoominger
    System Integrator
    1. Посмотрите марку и модель беспроводного модуля;
    2. Гуглите "model wifi linux";
    3. Дальше два варианта: либо найти драйвер и установить по инструкции, либо убедиться, что его поддержки в Linux нет и не будет и перейти на нормальную десктопную ОС, а Linux крутить на виртуалке.
    Ответ написан
    Комментировать
  • Как сделать компилятор СИ на джаве?

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

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

    Если же вам надо просто прикрутить компиляцию к вашему редактору, то, как многие другие IDE, вам надо будет лишь запускать сторонний компилятор (будь то gcc, clang, visual studio или что-то другое).

    У всех них есть консольное приложение которому можно передать файлы в качестве аргументов в коммандной строке. Вам остается лишь разобраться, как запускать приложения на Java.
    Ответ написан
    3 комментария
  • Ошибка компиллятора CS1022,CS0841,CS118?

    freeExec
    @freeExec
    Участник OpenStreetMap
    Даже отсюда видно кривизна форматирования кода и лишняя скобка в конце.
    Ответ написан
    Комментировать
  • Как на Astra Linux Smolensk 1.6 обновить ядро до 5.10?

    ValdikSS
    @ValdikSS
    Обратитесь в техническую поддержку дистрибутива.
    Ответ написан
    Комментировать
  • Жёсткий диск мешает работает компьютера?

    @Voland69
    Мешать может, винда иногда грешит блокирующим IO даже не на системном диске. А бэды и IO ошибки резко увеличивают latency, что визуально ощущается как тормоза.
    Для начала посмотреть SMART диска. Если бэды, то менять диск, если ошибки IO, то для начала можно кабель поменять.

    P.S. ЕМНИП это далеко не первый вопрос от Вас на эту тему, везде в ответах говорилось про проверку SMART но от Вас я реакции не видел. Скачайте прогу по ссылке и приложите скрин.
    Без диагностики харда все остальное - гадание на кофейной гуще.
    Ответ написан
    1 комментарий
  • Как авторизоваться в git с помощью токена?

    @lagudal
    можно и с токеном, если хочется
    git remote set-url origin https://your_token@github.com/your_username/your_repo
    Ответ написан
    2 комментария
  • С++: Ошибка потоков как исправить?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Client arr_all[numeric_limits<int>::max()];

    Это сильно, статический массив на 2 млрд индексов...

    main.cpp:(.text+0x527): перемещение обрезано по месту: R_X86_64_32 у неопределённого символа «.bss»
    main.cpp:(.text+0x536): перемещение обрезано по месту: R_X86_64_32 у неопределённого символа «.bss»

    ...а это -- последствия. В принципе сборку этого можно побороть опцией -mcmodel=large, но там будут дальнейшие проблемы во время выполнения и это точно не нужно.

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

    GavriKos
    @GavriKos
    Скопировать в новый массив исключая пятое число. Вручную. Фором.
    Ответ написан
    1 комментарий
  • Как вернуть значение из двумерного массива в методе ReturnValue?

    @koka2
    1. Синтаксис получения элемента по индексу некорректен, фактически, комбинация "*&" перед указателем ничего не делает, ее лучше удалить.
    2. Переменные в методе ReturnValue не являются говорящими, желательно переименовать их в row, col (без множественного окончания). Т. к. вы пытаетесь получить единственное значение по строке и колонке, а не строкам и колонкам.
    3. В методе используется Matrix::cols, это также некорректно, в вашем случае необходимо использовать просто cols. Если же вам необходимо было использовать именно заданную внутри класса переменную, а не пришедшую в параметрах метода, то корректно было бы написать this->cols.
    Резюмируя вышесказанное, корректный код мог бы выглядеть так:
    int ReturnValue(int row, int col) {
    return arr[row][col];
    }
    Ответ написан
    Комментировать
  • Как сегодня создают красивые Win-интерфейсы?

    HemulGM
    @HemulGM Куратор тега Delphi
    Delphi Developer, сис. админ
    Красивый интерфейс в Delphi делается на кроссплатформенном фреймворке FMX. Погугли, всё поймёшь.
    Возможности не уступают CSS с рендерингом на GPU.

    Примеры можешь посмотреть у меня в небольшом блоге https://vk.com/delphilive

    P.S. Хотя, на VCL тоже можно сделать красиво, но придётся больше сил приложить
    Ответ написан
    Комментировать