Задать вопрос
  • Как виртуальные машины исполняют код и как правильно это реализовать?

    WNeZRoS
    @WNeZRoS
    Если вопрос при виртуальные машины по типу тех что используется для исполнения Java или C# кода, то инструкции в них гораздо проще. В CIL например, у большинства инструкций нет параметров, они просто берут нужные данные с конца стека. А когда параметры есть - он один: значение или токен переменной/функции.

    Можно посмотреть как C# преобразуется в инструкции виртуальной машины на sharplab.io, сопоставить и понять как оно выполняется.

    Например
    IL_0000: ldarg 1 // кладёт в стек первый аргумент
    IL_0001: ldarg 2 // кладёт в стек второй аргумент
    IL_0002: sub     // достаёт из стека два последних значения и отнимает последний от пред последнего (т.е. будет arg.2 - arg.1), результат складывается в стек
    IL_0003: brtrue.s IL_0011 // достаёт из стека значение, если оно не 0, переходит к инструкции IL_0011, если 0 исполнения идёт дальше на I_0005
    
    IL_0005: ldstr "zero" // загружает в стек строку "zero"
    IL_000a: call void System.Console::WriteLine(string) // вызывает вывод в консоль, из стека достаются N нужных значений для параметров (в данном случае 1), void функция ничего в стек не добавляет
    IL_000f: br.s IL_001b // переход (jump) к IL_001b
    
    IL_0011: ldstr "not zero" // загружает в стек строку "not zero"
    IL_0016: call void System.Console::WriteLine(string) // вызывает вывод в консоль, из стека достаётся 1 значения для параметра 
    
    IL_001b: ldstr "done" // загружает в стек строку ...
    IL_0020: call void System.Console::WriteLine(string) // ...


    Пример реализации простой виртуальной машины на основе примера выше

    (Код написан так чтобы работал, правильнее писать более безопасно и читабельнее)

    #include <stdio.h>
    
    enum Opcode {
        OP_LOAD_ARGUMENT,
        OP_LOAD_STRING,
        OP_SUBTRACT,
        OP_GOTO,
        OP_GOTO_IF_TRUE,
        OP_CALL,
        OP_RETURN
    };
    
    union Argument {
        int value;
        const void* pointer;
    };
    
    struct Instruction { 
        Opcode opcode; 
        Argument arg; 
    };
    
    void run_vm(const Instruction* instructions, const Argument* args) {
        Argument stack[16];
        
        Argument* stack_pointer = &stack[0];
        int address = 0;
    
        while(true) {
            const Instruction instruction = instructions[address];
            address++;
    
            switch(instruction.opcode) {
                case OP_RETURN:
                    return;
                
                case OP_LOAD_ARGUMENT:
                    *stack_pointer = args[instruction.arg.value];
                    stack_pointer++;
                    break;
    
                case OP_LOAD_STRING:
                    *stack_pointer = instruction.arg;
                    stack_pointer++;
                    break;
    
                case OP_SUBTRACT:
                {
                    stack_pointer--;
                    int b = stack_pointer->value;
                    
                    stack_pointer--;
                    int a = stack_pointer->value;
    
                    stack_pointer->value = a - b;
                    stack_pointer++;
                    break;
                }
    
                case OP_GOTO:
                    address = instruction.arg.value;
                    break;
    
                case OP_GOTO_IF_TRUE:
                    stack_pointer--;
                    if(stack_pointer->value != 0)
                        address = instruction.arg.value;
                    break;
    
                case OP_CALL:
                    void (* fn)(const void*) = (void (*)(const void*))instruction.arg.pointer;
                    stack_pointer--;
                    fn(stack_pointer->pointer);
                    break;
            }
        }
    }
    
    void print(const char* text) { printf("%s\n", text); }
    
    int main(int argc, char** argv) {
        const Instruction instructions[] = {
            /* 0 */ { OP_LOAD_ARGUMENT, { 0 } },
            /* 1 */ { OP_LOAD_ARGUMENT, { 1 } },
            /* 2 */ { OP_SUBTRACT, {} },
            /* 3 */ { OP_GOTO_IF_TRUE, { 0x7 } },
            /* 4 */ { OP_LOAD_STRING, { .pointer = "zero" } },
            /* 5 */ { OP_CALL, { .pointer = (void*)&print } }, // функции надо где-то регистрировать, чтобы знать сколько у них параметров и какого они типа
            /* 6 */ { OP_GOTO, { 0x9 } },
            /* 7 */ { OP_LOAD_STRING, { .pointer = "not zero" } },
            /* 8 */ { OP_CALL, { .pointer = (void*)&print } },
            /* 9 */ { OP_LOAD_STRING, { .pointer = "done" } },
            /* A */ { OP_CALL, { .pointer = (void*)&print } },
            /* B */ { OP_RETURN, {} }
        };
    
        const Argument args[] = { 
            { 100500 },
            { 777 }
         };
    
        run_vm(instructions, args);
        return 0;
    }



    Виртуальные машины для процессоров можно делать по такому же принципу, но они будут медленные и структура инструкций ограничена архитектурой процессора.
    Ответ написан
    Комментировать
  • Почему НЕ vim? Vim для серьезной разработки?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это не вопрос, а размазывание соплей. "Ой мне сказали то, ой мне сказали сё, а скажите ещё чего-нибудь". Ну и закономерно получаете полную панамку ответов от специалистов, которые vim в глаза не видели, но спешат поделиться своим экспертным мнением.

    Это было бы вопросом, если бы было задано в форме "можно ли из вима сделать полноценную IDE?".
    Ответ - можно.
    Любых плагинов как грязи. Руководств масса, на том же Хабре. Пользователей - ну, не столько сколько IDE intellJ - но тоже прилично. Есть сообщества, где всегда можно спросить. Вот там и надо задавать вопросы. Причем конкретные, а не вида "ой мне пацаны сказали что круто, а теперь другие пацаны сказали что отстой". Ну правда английский может понадобиться.
    Ответ написан
    Комментировать
  • Почему ConcurrentCollections в C# не могут полностью предотвратить race conditions?

    @Kano
    В статье же написано что предотвращение возникновения состояния гонок обеспечивает только потокобезопасное api и то с некоторыми побочными эффектами навроде многократного вызова делегата обновления.
    Относительно потонебезопасного api реализуемого этими коллекциями вообще своя история в которой их поведение весьма специфичное.
    Ответ написан
    Комментировать
  • Что делать, если много условностей? ?? :: :, и как правильно его читать? Можно ли ссылку на статью какую нибудь?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Ответ написан
    Комментировать
  • HTTP-трафик шифруется! Но как? И как вынюхать что там?

    mayton2019
    @mayton2019
    Bigdata Engineer
    HTTP ответы не обязаны являться текстом. Смотри в заголовки ContentType в ответах.
    Если там к примеру стоит application/octet-stream - то это просто поток байтов. Может
    быть бинарным кодом.
    Ответ написан
    4 комментария
  • Как подключить базу данных Access к PHP?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    https://www.php.net/manual/ru/odbc.installation.php

    Пользователи Windows должны включить php_odbc.dll, чтобы использовать этот модуль.
    Ответ написан
    Комментировать
  • Почему опасно в php выставлять неограниченное время жизни сессии?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Что сказать, если юзеры - склерозники, это их проблемы. Вечные сессии плохи тем, что, будучи единожды спёртыми злоумышленниками, они дают вечный доступ к аккаунту жертвы.
    Ответ написан
    Комментировать
  • Где посмотреть MAC адрес в образе Windows?

    @Drno
    mac обычно считывается с сетевой карты, соответственно пока её нет, и не установлен драйвер - и mac тоже нет
    Ответ написан
    Комментировать
  • Для чего реально можно использовать AWS Lamda функции на реальном проекте?

    Viji
    @Viji
    DevOps Engineer
    1. 80% - это api запросы (через api gateway), получил, сходил в базу, изменил/прочитал, ответил. Вкл relational и dynamodb. На мой взгляд гораздо меньше хлопот, чем с кубером и в основном дешевле. Особенно, если писать на Golang или хотя бы на node.js

    2. 5-10% для передачи сообщений из/в event bus, sns, sqs... в общем, в составе event driven architecture. Супер вещь. Только желательно редчайшие случаи недоставки предусматривать

    3. 5-10% Сервисные функции... например работа по cron, каждую ночь перемещает сообщения из cloudwatch на s3, или trigger какого-то backup и множество других. Я иногда сохранял предыдущее состояние, если время работы более 15 мин и вызывал лямбду еще раз.

    4. Остальное - например получение данных из kinesis stream - если с big data работаешь, но тут уже надо по цене смотреть.
    Ответ написан
    2 комментария
  • Нейросеть для получения информации из документа?

    Maksim_64
    @Maksim_64
    Data Analyst
    Нейронная сети, актуальны для задач где присутствует ВАРИАТИВНОСТЬ. Вы имеете входные данные обозначим их Х вы имеете функцию которая сопоставляет эти данные с выходными данными (извлечь ИНН и другие пункты договора) обозначим их y. Так вот если вариативность отсутствует то данная задача f(X) = y, решается парсингом документа, а не нейронными сетями. Если задача имеет вид f(X) = y + E, где E это случайная ошибка, то нейронная сеть это один из возможных алгоритмов МИНИМИЗАЦИИ этой ошибки, но НЕ полного ее исключения. Так что надо иметь ввиду что 100 процентной точности не добиться. И ответить себе а допустимо ли это.

    Что касается твоих вопросов, ну например пункт номер два это целый раздел в машинном обучении. Который содержит в себе несколько подпунктов. И дело это инженерное - а не вот какой то метод решит все мои проблемы. Пункт номер три обе могут быть использованы. Пункт четвертый, а потянешь с нуля. А готовые модели они решат частный кейс твоей проблемы? Откуда нам знать, с какой точностью готовые модели будут извлекать данные. Ну а первый вопрос, это всего лишь api для моделей и выбирать надо ту с которой имеешь опыт работы, какой то лучшей нет.
    Ответ написан
    1 комментарий
  • Сайт с рингтонами, авторские права на рингтон?

    CityCat4
    @CityCat4
    Дома с переломом ноги
    Это зависит от того, что предусмотрено законодательством Молдовы за нарушение авторских и смежных прав.
    Ответ написан
    Комментировать
  • Как можно перехватывать и изменять пакеты(http,ws) в приложении?

    drygdryg
    @drygdryg
    Python-разработчик
    Установите отладочный прокси-сервер (HTTP debugging proxy) вроде Mitmproxy на компьютер и настройте пропуск трафика вашего приложения через этот прокси. В его интерфейсе можно просматривать HTTP-запросы, а также сообщения WebSocket и некоторые другие протоколы. Также можно останавливать и модифицировать запросы/ответы на лету и писать скрипты для этого.
    Ещё один инструмент, который также позволяет перехватывать и модифицировать запросы/ответы на лету: https://github.com/projectdiscovery/proxify. Он вдобавок поддерживает модификацию трафика по правилам, описанным на специальном DSL (языке).
    Настроить прокси на Android можно в параметрах Wi-Fi сети (для всех соединений в системе), либо с помощью приложения ProxyDroid (только для соединений вашего приложения, но нужен root).
    Ответ написан
    3 комментария
  • Почему флешка заразится вирусом если подключить к чему то?

    paran0id
    @paran0id
    Умный, но ленивый
    Да, такое возможно. Знаменитый kido, попивший моей крови лет 12 назад, успешно путешествовал с компьютера на компьютер через флешки. Сейчас, когда в windows встроен более-менее приличный антивирус, и отключен автозапуск со съемных носителей, с этим должно быть получше. Были ещё флешки с защитой от записи, с переключателем, как на дискетах - можно было втыкать в режиме только для чтения и не бояться, что на неё запишется что-нибудь.
    Ответ написан
    1 комментарий
  • Gitlab runner может один раннер деплоить на несколько серверов в зависимости от ветки?

    @d-stream
    Готовые решения - не подаю, но...
    Как угодно. Он просто выполняет инструкции прописанные в .gitlab-ci.yml а инструкции могут включать и например цикл по списку хоть 100500 серверов
    Ответ написан
    Комментировать
  • Какой выбрать движок для карточной онлайн игры?

    @rdn-s
    Я фронтенд программист самоучка.
    Бери Unity.

    Eсли C# не знаешь, то делай на Godot.
    Ответ написан
    1 комментарий
  • Почему русские буквы не выводятся в C++?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Кажется проблема имеет отношение только к Windows консоли. Надо проверить. Автор сделай так

    C:\>chcp
    Active code page: 437
    
    C:\>chcp 866
    Active code page: 866


    И запусти свой екзешник именно в ней. И потом еще попробуй вот так

    C:\>chcp  65001
    Active code page: 65001

    и тоже запусти
    Ответ написан
    1 комментарий
  • Почему русские буквы не выводятся в C++?

    @dima20155
    you don't choose c++. It chooses you
    Потому что кириллица кодируется минимум 2 байтами.
    Вам нужна длинная строка, которая основана на wchar.

    https://stackoverflow.com/questions/402283/stdwstr...
    Ответ написан
    Комментировать
  • Хочу сделать регистрацию по лицу, правильно ли я создал алгоритм решения?

    @rPman
    Как нарисовать сову - рисуем два кружочка, затем дорисовываем сову... это в двух словах то что ты описал.

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

    Кстати сами алгоритмы обработки фото там делятся на собственно детектирование лица и удаление шумов (чтобы работать только с лицом размером на все изображение) и алгоритм вычисления параметров по лицу.

    вот почитай к примеру

    p.s. распознавание по лицу это худшая форма авторизации, потому что это биометрия, а по просто фото она еще и легко подделывается (просто показав фото на смартфоне/планшетнике/листке бумаги)

    Если дополнить ее распознаванием речи и заставить к примеру пользователя делать какое то движение (на его выбор), то это просто увеличит стоимость атаки на этот способ авторизации, но не на столько значительно, как простое увеличение количества символов в простой парольной авторизации или введением двух факторной авторизации на основе аппаратного токена в виде карты например (или того же смартфона, но там безопасность просто перекладывается на него)
    Ответ написан
    3 комментария
  • Обьсяните пожайлуста разницу между REST API и SQL-запросами?

    @oleg_ods
    Если совсем просто.

    SQL - язык запросов. Можно отправить любой запрос. Включая DROP, CREATE, ALTER и прочую мерзость(неприятно когда структуру базы меняют без Вашего ведома).

    REST API - можно сделать обертку только(!) над нужными SQL-запросами и дать к ним доступ с помощью HTTP эндпоинтов.
    Ответ написан
    1 комментарий
  • Чем webpack лучше gulp/grunt?

    miraage
    @miraage
    Старый прогер
    Холиварная тема.
    Кому-то зайдет.
    Лично мне не нравится работа со стилями.
    Я уж лучше по старинке через gulp всё сделаю.

    // EDIT July 2016

    webpack восхитителен
    Ответ написан
    4 комментария