• Как оптимизировать сервер с большим количеством запросом?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Как понял схема данных следующая:
    - Есть замер времени - отедльный объект со своим ID
    - У каждого замера времени есть список штампов - конкретного времени
    - Эти штампы создают пользователи - отправляют запросы

    Для данного кейса мне видится такое решение:
    - Используем Redis в качестве БД
    - Для ID замеров используем snowflake
    - Тип данных Redis для замеров - list (список)
    - В каждом списке храним эти штампы - строка или unix timestamp (неважно)

    Таким образом, на каждый запрос просто добавляем новый элемент в этот список.

    Redis хорошо выдерживает высокую нагрузку + его можно масштабировать.
    Благодаря snowflake можно горизонтально мастшабировать свои сервисы.
    Также, ты указал websocket - здесь как хочешь. Но в .NET есть реализация Redis которая использует мультиплексирование - здесь он будет уместен.
    Ответ написан
    2 комментария
  • Как посмотреть изменения на сайте?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Зависит от того, что подразумевается в "изменения":
    - Если контент генерируется пользователями (маркетплейсы, блоги, соц.сети) - то каждое мгновение
    - Если если нужно проверять HTML разметку, то тут возникнут проблемы со всякого рода фреймворками генерации сайтов (с их CSS генераторами названий классов, например)
    - Если нужно визуально проверять, то надо уточнить, что является изменением - текст сместился вниз на 1 нанометр это изменение?

    Тут разве что костыли:
    - Заводи демона, который будет делать скриншоты каждый интервал и сверять с последним
    - Проверяй атрибут Last-Modified
    - Используй webarchive
    Ответ написан
    2 комментария
  • Почему у функций нет имени возвращаемого?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Откуда я должен узнать что возвращает printf()?


    man 3 printf
    Ответ написан
    2 комментария
  • Как поменять кодировку так что бы после сохранения файла оставались русские буквы?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Возможно проблема в используемой кодировке для самого файла - вывод-то в консоль:
    - Консоль распознает UTF-8/Unicode
    - Файл открыт в windows-1251

    Тут надо просто поиграться с кодировкой файла в VS. Начни с UTF-8/Unicode, а дальше тыкай, пока не заведется
    Ответ написан
  • Как сделать графический интерфейс для своей ОС на rust?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Начать можешь с этого туториала - https://os.phil-opp.com/vga-text-mode/
    В нем реализуется простой текстовый интерфейс, но как пример этого достаточно: объясняются основные концепции как буфер видео памяти, представление букв и т.д.
    Ответ написан
    Комментировать
  • Как на udp сервере подсчитать one-way latency и верменной offset клиента?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    То что причина в часах понятна. Я вижу тут несколько решений:
    1. Синхронизация часов клиента. Возможно какой-нибудь NTP поможет (не работал с ним). Но синхронизировать надо только клиента, т.к. если сервер затронет, то и других клиентов тоже
    2. Использовать глобальный синхронизатор (время по gps синхронизировать)
    3. Делать бенчмарки + вычисления

    Насчет 3 -
    1. Предполагаем, что в обе стороны время одинаковое
    2. Делаем несколько замеров (например, можно каждые 100 пакетов)
    3. Рассчитываем время как avg / 2 , где avg - это среднее время отправки в обе стороны
    Ответ написан
    Комментировать
  • Почему из-за cfgmgr32 exe стал больше на 32 мб?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Потому что .lib на винде - это статическая библиотека. Ты ее полностью к себе присоединил полностью, со всем ее кодом, функциями, переменными и т.д.
    За инфру винды не шарю, но может есть версия этой либы динамическая. Например, cfgmgr32.dll.

    P.S. я первый раз увидел, чтобы зависимости добавляли с помощью pragma. Это windows-specific ?
    Ответ написан
  • Между сборками и пространствами имён нет прямого соответствия. Что это значит?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Ты можешь создать сборку (грубо говоря, проект/.csproj), которая называется Service.Domain, но все классы там будут в неймспейсе (пр-ве имен) Another.Namespace
    Т.е. название проекта не накладывает ограничений на названия пр-в имен, которые в нем хранятся.
    Ответ написан
    Комментировать
  • С чем и как есть gRPC?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    1-2. Если говорить про микросервисы: каждый микросервис должен определять свою модель пользователя (только те поля/данные которые нужны конкретно ему) - да это будет копипаст

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

    3. Зависит
    4. Обычно, для популярных ЯП (ты не указал, но в тегах есть питон) есть официальные библиотеки с кодогенерацией - юзай их
    5. Какой архитектуры? Если про gRPC vs HTTP, то лучше копай в строну понимания синхронного (HTTP, TCP, gRPC) и асинхронного (очереди сообщений) взаимодействия
    Ответ написан
    2 комментария
  • Почему client gRPC не подключается к service gRPC?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Скорее всего проблема с версией HTTP. На сервере открой порт для gRPC и пропиши в нем HTTP/2 использование.

    appsettings.json

    "Kestrel": {
        "Endpoints": {
          "gRPC": {
            "Url": "http://localhost:5000"
            "Protocols": "Http2"
          }
        }
      }
    Ответ написан
  • Почему GCC не видит встроенную атомарную операцию?

    AshBlade
    @AshBlade Автор вопроса
    Просто хочу быть счастливым
    Разобрался.
    Есть 2 замечания:
    1. Поближе посмотрел на сигнатуру

    bool __atomic_compare_exchange (type *ptr, type *expected, type *desired, bool weak, int success_memorder, int failure_memorder)


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

    if (__atomic_compare_exchange(&l.head->next,  (struct entry**)NULL, &new_next, 1, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST))


    Но потом начал ловить SEGFAULT. И тут пришел к 2 замечанию

    2. Не заметил следующего в документации:

    This built-in function implements an atomic compare and exchange operation. This compares the contents of *ptr with the contents of *expected. If equal, the operation is a read-modify-write operation that writes desired into *ptr. If they are not equal, the operation is a read and the current contents of *ptr are written into *expected. weak is true for weak compare_exchange, which may fail spuriously, and false for the strong variation, which never fails spuriously. Many targets only offer the strong variation and ignore the parameter. When in doubt, use the strong variation.


    Т.е. если значение во 2 аргументе не равно значению из 1, то (!!!) по месту указателя 2 записывается полученное из указателя 1 значение. А у меня там был NULL (конец списка обозначается NULL). Заменил на корректно выделенный элемент списка и все заработало

    int main(int argc, char const *argv[])
    {
        struct list l;
    
        l.head = (struct entry *)malloc(sizeof(struct entry));
        l.head->next = NULL;
        l.head->value = 123;
        struct entry *old_next = (struct entry *)malloc(sizeof(struct entry));
        old_next->next = NULL;
        old_next->value = 555;
        l.head->next = old_next;
    
        struct entry *new_next = (struct entry *)malloc(sizeof(struct entry));
        new_next->value = 444;
        new_next->next = NULL;
        if (__atomic_compare_exchange(&l.head->next, &old_next, &new_next, 1, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST))
        {
            printf("ok\n");
            printf("success: next = %d\n", l.head->next->value);
        }
        else
        {
            printf("failed\n");
        }
    
        return 0;
    }


    Не хочу возиться со всякими dummy узлами, поэтому буду использовать __sync_bool_compare_and_swap. Вот такой код сработает:
    int main(int argc, char const *argv[])
    {
        struct list l;
    
        l.head = (struct entry *)malloc(sizeof(struct entry));
        l.head->next = NULL;
        l.head->value = 123;
    
        struct entry *new_next = (struct entry *)malloc(sizeof(struct entry));
        new_next->value = 444;
        new_next->next = NULL;
    
        if (__sync_bool_compare_and_swap(&l.head->next, (struct entry *)NULL, new_next))
        {
            printf("ok\n");
            printf("success: next = %d\n", l.head->next->value);
        }
        else
        {
            printf("failed\n");
        }
    
        return 0;
    }


    UPD: спасибо res2001, разобрался лучше. итоговый вариант

    #include <stdatomic.h>
    
    int main(int argc, char const *argv[])
    {
        struct list l;
    
        l.head = (struct entry *)malloc(sizeof(struct entry));
        l.head->next = NULL;
        l.head->value = 123;
    
        struct entry *new_next = (struct entry *)malloc(sizeof(struct entry));
        new_next->value = 444;
        new_next->next = NULL;
        struct entry *tmp = NULL;
        if (atomic_compare_exchange_strong(&l.head->next, &tmp, new_next))
        {
            printf("ok\n");
            printf("success: next = %d\n", l.head->next->value);
        }
        else
        {
            printf("failed\n");
        }
    
        return 0;
    }


    Просто надо создать переменную указатель, которой присвоить NULL. Также использовал atomic_compare_exchange_strong из stdatomic вместо расширения GCC - он под капотом использует __atomic_* вместо устаревшего __sync_*
    Ответ написан
    1 комментарий
  • Нужен ли первичный ключ в таблицах PostgreSQL?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Почему работает в Access - потому что это другая БД. Поведение может различаться.

    Что касается обязательности ключевого поля - странно. Таблицу можно создать и без него.

    Предполагаю, что эта таблица ссылается через references на столбец другой таблицы. В таком случае, на последнее должно стоять ограничение уникальности - иначе как понять на какую строку ссылаться.
    Ответ написан
  • Почему получается подключить Core в Dockerfile?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Проверь контекст из которого запускаешь docker build. Ошибка не связана с Libs - все падает еще на этапе копирования первого проекта

    P.S. это последний аргумент (обычно . ставят), например docker build -t sample-image:latest .или
    docker build -t sample-image:latest source-directory
    Ответ написан
    2 комментария
  • Как транслировать аудио в микрофон, py, c#, c++?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Не совсем понял, что ты хочешь. Возможно, создать виртуальный микрофон и дальше использовать именно его - https://codeease.net/programming/python/virtual-mi...
    Ответ написан
    1 комментарий
  • Как переобразовать string в const unsigned char* в C++?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    // str - строка типа std::string
    const unsigned char* str_ptr = (const unsigned char*) str.c_str();
    Ответ написан
    2 комментария
  • Как исправить ошибку sqlite3?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Ты создаешь таблицу со столбцами login и password, но потом зачем-то создаешь подготовленный select со столбцами q, w и name: во-первых их нет в таблице (ты их не создавал), во-вторых ты не проверяешь результат выполнения sqlite3_prepare_v2.
    Вот и получается, что во 2 sqlite3_exec (insert) ты получаешь ошибку не insert запроса, а prepare

    - Либо исправляй этот запрос + добавляй проверки на prepare
    - Либо удали этот prepare, т.к. нигде не используешь (в этом коде)
    Ответ написан
  • Для чего такие сайты?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Несколько вариантов:
    - Чистый энтузиазм
    - Привлечение аудитории для последующей монетизации - многие стартапы первое время живут либо на свои деньги, либо на деньги инвесторов. После начинается монетизация. В пример можно тг привести - реклама появлялась постепенно

    P.S. учитывая, что сайту даже 1 года нет, то скорее всего попадает под эти критерии
    Ответ написан
    4 комментария
  • Возможно ли сделать nested enum c/c++?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Если мы говорим про C, то так делать нельзя:
    1. Вложенные в enum определения делать нельзя - это ограничение самого синтаксиса (дока)
    2. Для использования перечислений не надо указывать само название перечисления. Т.е. не OBJ::SOMETHING, а просто SOMETHING. Т.е. видимость глобальная и нельзя дублировать названия, даже для разных enum

    В случае C++ аналогично. Есть хак - использование неймспейсов или структур для топ левела, но не в твоем случае - ты хочешь топ левел перечислениям значения задавать

    На мой взгляд тут решение:
    1. Разбить их на различные перечисления
    2. Добавить каждому префикс
    enum OBJ = 0 {
           Default = 0,
           Something_Something1 = 1,
           Something_Something1 = 2,
           Something = 7
    };
    Ответ написан
    Комментировать
  • Как замаскировать переменную внутри контейнера?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Нет. Это переменная окружения, ее нельзя просто взять и удалить.
    Если надо передавать секреты разные, то тут лучше маунтить секреты как файлы (docker secrets) - https://docs.docker.com/engine/swarm/secrets/
    Ответ написан