• Стотит ли менять asp.net mvc на asp.net web api + nextjs?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    нормально себя чувствует.

    Работает и не трогай
    Ответ написан
    3 комментария
  • Как ускорить поиск элементов из статичного string[] по подстроке?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Сначала объедините все ваши строки в одну через какой-то раздилитель, которого не может быть в искомой строке (можно и без него, но с ним код чуть проще будет). В конце поставьте этот же разделитель 2 раза. Вроде "строка1$строка2$строка3$...$строкаN$$".

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

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

    Другой вариант - через преобразование Барроуза — Уилера. Вот есть лекция. Этот алгоритм часто упоминается в курсах по биоинформатике. Реализацию может даже найдете где-то. Потом можно найти номера исходных строк из индексов вхождений через тот же бинпоиск по сортированному массиву индексов начал всех строк в тексте.

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

    Учтите, что построение структуры данных тут будет в несколько раз медленнее простого for+Contains. Выигрыш вы получите, если у вас текст действительно статичный и вы в нем много раз что-то ищите.
    Ответ написан
    7 комментариев
  • Используют ли Rabbitmq в внешней сети?

    @rPman
    Для упрощения администрирования и защиты сервисов в рабочей сети общепринятая практика - собирать их все в локальной сети (при необходимости объединенной по интернету с помощью vpn), потому как иначе либо каждый сервис должен уметь защищаться от атак (напоминаю, шифрование не спасет от ддоса) либо в каждом участке сети настраивать фаервол.
    Ответ написан
    Комментировать
  • Как описать коммит когда изменил структуру файлов проекта?

    delphinpro
    @delphinpro
    frontend developer
    refactor: Restructure directories/files
    Ответ написан
    Комментировать
  • Как происходит разработка по почте?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Единственный такой проект, о котором я слышал — это разработка ядра Linux. Там изначально велась разработка по почте. Да и сейчас кажется ничего не изменилось. На гитхабе мы видим лишь зеркало проекта. Гит изначально был придуман Торвальдсом специально так, чтобы он максимально прозрачно интегрировался в такой процесс. Даже коммиты при просмотре выглядят как электронные письма — там есть имя и мыло автора, тема, тело с подробным описанием изменений…

    А ответ на вопрос «как?» вы найдете в официальной книге Pro Git. Там этому посвящена целая глава. Учебник продолжает дополняться и переписываться сообществом, в том числе и на русском.
    Ответ написан
    1 комментарий
  • Как откатить результат если не комитил?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Неважно, что вы делали, гит перед каждым изменением записывает хэш указателя текущей ветки в специальный журнал — reflog. Соответственно вы можете этот журнал посмотреть командой git reflog
    А можно просто сослаться на порядковый номер в журнале и откатить текущую ветку на два шага назад:
    git reset --hard HEAD@{2}
    Как-то как.
    Ответ написан
    Комментировать
  • Нужно ли под каждую мелкую задачу создавать отдельную ветку?

    mayton2019
    @mayton2019
    Bigdata Engineer
    На текущем проекте требуют, что бы под каждое, даже небольшое изменение, баг (заменить цвет уведомления) создавать отдельную ветку

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

    И сложно себе представить что нужно откатить если ты ушел в отпуск и в 1 мердж реквест положил штук 5 своих задач.

    Вобщем не нужно боятся бюрократии. Нужно ее умело использовать и поворачивать эти техники так чтобы всей команде было комфорто и спокойно. И не нужно бояться за перформанс при выполеннии операций. Этот перформанс вообще не имеет значения с точки зрения ентерпрайза. Ты логаешь общее время разработки куда входит и работа с кодом и работа с репозитарием.
    Ответ написан
    Комментировать
  • Как закрыть доступ к старым commit для разработчиков на ветке master?

    GavriKos
    @GavriKos
    Надо не просто перенести данные в переменные окружения, надо еще и сменить их. И тогда пофиг что они там получат
    Ответ написан
    1 комментарий
  • Как исключить файл из Pull Request?

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Когда эмулятор собирает и компилирует код jit, то как он этот код в машинных инструкциях составляет.

    Если ты посмотришь на QEMU, то у него есть фронт-енды (https://github.com/qemu/qemu/tree/v8.1.0/target), каждый из которых транслирует инструкции эмулируемой машины в промежуточный код. И есть бэк-енды (https://github.com/qemu/qemu/tree/v8.1.0/tcg), каждый из которых транслирует инструкции промежуточного кода в инструкции хостовой машины. Каждая гостевая инструкция может превратиться во множество промежуточных, а каждая промежуточная -- во множество хостовых. У разработчиков есть правило, что если на гостевую инструкцию требуется больше 20 промежуточных, то вместо прямой трансляции такая инструкция реализуется как вызов функции на C. Инструкции транслируются базовыми блоками, с заданного адреса и до достижения одного из следующих условий: 1) встречена инструкция выполняющая переход (условный или безусловный, вызов функции, возврат из функции, сюда же относятся инструкции гарантированно вызывающие исключение), или 2) PC переходит через границу страницы виртуальной памяти, или 3) количество инструкций в базовом блоке превышает заданный предел. Вдобавок с каждым оттранслированным базовым блоком ассоциируется дополнительный набор флагов, определяемый фронт-ендом, который кодирует состояние, в котором была машина при трансляции этого кода. Это позволяет иметь несколько вариантов трансляции для кода начинающегося с одного и того же адреса, например для разных уровней привилегий. Оттранслированные базовые блоки помещаются в кеш с функцией поиска по комбинации адреса и дополнительного набора флагов. В цикле выполнения эмулятор ищет транслированный базовый блок кода в кеше (а если не находит его, то транслирует и помещает в кеш), запускает его и получает контроль после завершения его выполнения.

    надо к примеру Перед выполнением каждой инструкции проверять наличие прерывания

    Вовсе не каждой, даже в 100% точной эмуляции нужно проверять IRQ только когда прерывания разрешены. QEMU обычно проверяет запрос на прерывание только перед входом в оттранслированный базовый блок.

    Или же есть несколько блоков, где линейно выполняется весь блок, а последняя инструкция прыгнет в другой блок.

    Да, QEMU выполняет трансляцию базовыми блоками.

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

    В этом графе не обозначены безусловные переходы, если их нет, то QEMU мог бы выделить такие базовые блоки: 0-1-2-3, 4-5-6, 7-8-1-2-3, 9-10, 11-12-13, 14-15-16-2-3, 17, всего 7 блоков.
    Если безусловные переходы -- это все переходы от узлов с бОльшими номерами к узлам с меньшими, то картина была бы такой: 0-1-2-3, 4-5-6, 7-8, 1-2-3, 9-10, 11-12-13, 14-15-16, 2-3, 17. Да, фрагмент 2-3 оттранслирован три раза: сам по себе и в составе других блоков.
    Ответ написан
    2 комментария
  • (Теория) В каких случаях принято ставить L3 в центре?

    vesper-bot
    @vesper-bot
    Любитель файрволлов
    Фиолетово, при современном оборудовании. Если на файрволле много правил, или планируется/установлен программный, правильнее ставить L2 в центр коммутации, все равно трафик упрется во внешний канал, а при центральном L3 теоретически возможна деградация производительности, если упереться в правила фильтрации трафика. А так, логичнее ставить L2 в центр всегда, основная задача backbone - пересылка трафика, а всё остальное лучше делать вне его.
    Ответ написан
    5 комментариев
  • Почему выражение (-1ll) в ассемблерном коде MSVC равно ff ff ff ff?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Уловка в системе процессорных комманд: 48 c7 45 08 - позволяет загрузить в 64-битную ячейку памяти 32 битное число, автоматически расширяя его до 64 бит.

    Смотрите список кодов x64:
    0x48 - означает, что следующая комманда работает с 64-битами.
    0xC7 - mov immediate (данные в команде)
    Дальше идут флаги, указывающие как интерпретировать аргументы, что куда адресовывать и т.д.

    Но важно, что команда C7 работает с r/m16/32/64 данными, а аргумент у нее может быть только imm16/32 (третий столбец). Т.е. она принимает или 2 или 4 байта, в зависимости от обвеса, а записывать может до 64 бит. Сравните это с коммандой 0xB8 в той же таблице, она уже может принимать 64 бита.

    Если аргумент меньше ячейки памяти, то он расширяется (sign extended) до нужного размера (бит знака копируется влево до упора). Это позволяет записать числено равное значение в более битную ячейку. ведь 32-битное число 0xFFFFFFFF - это -1 в дополнительном бинарном коде, а 0xFFFFFFFFFFFFFFFF - это тоже -1 в дополнительном 64-битном коде.

    Компилятор использует вот эту команду, а не 0xB8, потому что сама команда короче, а исполняется так же быстро. Меньше кода, больше всего помещается в кеш и все работает быстрее, да и exe-шник меньше получается.
    Ответ написан
    2 комментария
  • Как восстановить файлы после reset --hard?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Восстановить очень легко, так как гит ничего не удаляет из репозитория, по крайней мере сразу.
    Команда reset лишь переместила указатель ветки. Полностью удалить что-то крайне сложно.
    Вы можете посмотреть через git reflog где был указатель до этого и вернуть его туда обратно.
    git reset --hard HEAD@{1}
    Данная команда вернёт ветку на состояние, помеченное на вашем скрине как HEAD@{1}
    Либо можно скопировать непосредственно sha-хэш места, куда хотите вернуться.

    Затем повторить отмену последнего коммита, но уже правильно:
    git reset HEAD~1
    Такая команда не будет изменять рабочий каталог, а значит ничего из него не удалит.
    Ответ написан
    1 комментарий
  • Как определить длину числа через регулярку?

    XanXanXan
    @XanXanXan
    Потому что внутри 12345678910111213 есть число от 1 до 12.

    /^\d{1,12}$/
    Ответ написан
    7 комментариев
  • Как в C# проекте импортировать стороннюю c++ библиотеку?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Вариант "идеоматичный":
    1. Эта библиотека должна экспортировать функции с сишным abi (extern "C")
    2. В коде на C# ты описываешь эти функции при помощи pinvoke
    3. Добавляешь в проект dll-ку с собранной сторонней либой.
    Профит

    Вариант "ситуативный и будет работать только на винде":
    1. Берёшь C++/CLI
    2. Делаешь на нём .Net библиотеку и делаешь нужное количество классов -обёрток над плюсовым кодом.
    Профит

    В случае с этой библиотекой можно ещё попробовать:
    1. Найти альтернативы
    2. Переписать на C#
    Ответ написан
    2 комментария
  • Почему нет ошибок, но ничего не выводит?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    struct message{
        int id;
        char* data;
    };
    …
    send(fds[i].fd, &msg, sizeof(msg), 0)

    Этот send отправляет клиенту не данные, а указатель. Указатель на данные, которых у клиента нет.

    // Add new socket to poll array
                fds[nfds].fd = new_socket;
                fds[nfds].events = POLLIN;
                nfds++;
            }
     
            // Check for data from clients
            for (int i = 1; i < nfds; i++) {
                if (fds[i].revents & POLLIN) {


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

    struct pollfd fds[1];
        fds[0].fd = sock;
        fds[0].events = POLLOUT;
        if (poll(fds, 1, -1) <= 0) {
            perror("poll failed");
            exit(EXIT_FAILURE);
        }
        if (!(fds[0].revents & POLLOUT)) {
            perror("connect failed");
            exit(EXIT_FAILURE);
        }
    
        // Receive message from server
        while ((valread = read(sock, &msg, sizeof(msg))) == -1 && errno == EAGAIN);


    Здесь ты ждёшь до POLLOUT, но после этого начинаешь читать. Это малость нелогично, потому что наличие данных для чтения показывается флагом POLLIN. POLLOUT же на свежеустановленном соединении есть сразу, поэтому чтение тупо вертится в цикле while пока не прийдут данные.

    как это можно попробовать подебажить понять что не так, что происходит

    Можно тупо повставлять печать в ключевые места, что да, соединение установлено, соединение принято, полл завершился успехом, данные отправлены, данные приняты.
    Ответ написан
    Комментировать
  • Как называется устройство для объединение нескольких модемов в одну сеть?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Такое устройство называется "роутер с воткнутыми в него модемами и настроенным MPTCP".

    https://www.openmptcprouter.com/
    Ответ написан
    2 комментария
  • Стоит ли переписывать старый проект на .NET6 (на голом энтузиазме)?

    @Drno
    нет
    Ответ написан
    Комментировать
  • Как скрыть Pull Request от других пользователей?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Вы наверное хотите скрыть не сам Pull Request, а код, который виден там.
    Но ведь этот код студенты отправляют из своих открытых проектов в ваш открытый проект. Значит код в любом случае виден всем в интернете, причем даже без создания PR.
    Единственный способ скрыть код — публиковать его в закрытые проекты.
    Пусть студенты создают приватные репозитории и дают вам доступ туда.
    Ответ написан
    Комментировать