• Как постить посты в вк каруселью?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    1. Загрузи несколько фотографий напрямую в сообщество - получи их id (фотографий)
    2. После вызови метод wall.post и в поле attachments укажи id этих фотографий - https://dev.vk.com/ru/method/wall.post
    Ответ написан
    Комментировать
  • Какой хост внутри контейнера?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Попробуй указать имя хоста контейнера напрямую через hostname

    db:
        ports:
          - 5432:5432
        hostname: 'db'
        restart: always
        build:
          context: docker
          dockerfile: db.Dockerfile
        env_file:
          - configuration/db.env
        volumes:
          - .:/docker-entrypoint-initdb.d
          - ./dump:/var/www/dump
          - dbdata:/var/lib/postgresql/data
    Ответ написан
    Комментировать
  • Как отследить то, что самопроизвольно закрывает приложения NET в Ununtu?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Автономные приложения под линуксом надо запускать как сервисы через systemd.
    Как это сделать можно почитать тут - https://habr.com/ru/companies/timeweb/articles/759966/

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

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

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

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Первое - если файл отсортирован, то поможет бинарный поиск. Самое "в лоб", но возможно не подойдет.

    В качестве индекса можно использовать бинарное дерево. Но здесь, я бы сделал так:
    - В узлах храним записи фиксированного размера, чтобы не бегать постоянно и дополнительно высчитывать смещения (все 16 байт для хранения использовать можно)
    - Само дерево будет содержать отрезки, т.е. не полный готовый ответ. В противном случае, будет нарушено ограничение на размер (10Гб ты никак не перепрыгнешь)

    В итоге, путь будет такой:
    1. Идешь в индекс ("дерево отрезков") и находишь левую и правую границу
    2. Идешь в целевой файл и запускаешь бинарный поиск по нему

    Если хранить индекс в памяти, то будет гораздо быстрее. Но высоту дерева надо найти импирически из-за ограничения в 100Мб в памяти
    Ответ написан
    Комментировать
  • Как выделить элемент не останавливая воспроизведение видео (OPENCV)?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Никак, просто делаешь это быстро.
    Либо выделяешь не каждый кадр, а с определенным шагом. Например, выделяешь каждую секунду
    Ответ написан
  • Почему контейнер успешно создается локально, но не создаётся из регистра?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    В докерфайле не вижу слоя с рантаймом - только sdk.
    Посмотри шаблон тут - https://learn.microsoft.com/ru-ru/dotnet/core/dock...
    Ответ написан
    1 комментарий
  • Безопасен ли OpenAPI в FastApi?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    OpenAPI надо использовать только во время разработки, для удобства.
    В проде надо отключать
    Ответ написан
  • Python ModuleNotFoundError - как исправить ошибку на Ubuntu?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Если нужно использовать папку как модуль - то добавляй точку в начало названия.
    Т.е. не konstabot , а .konstabot
    Ответ написан
    5 комментариев
  • Как выявлять показатели (логи, метрику, дейтсвия пользователя) в приложении?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Это называется метрики приложения.
    Реализовать можно несколькими способами, в зависимости от требования:
    - Для онлайн показателей (количество ошибок приложения, кол-во активных пользователей) можно реализовать через счетчики - грубо говоря, приходит пользователь -> увечиличиваем счетчик
    - Для статичтических данных - нужно делать запросы в БД, т.к. онлайн такое вряд-ли реализуется (приложение может рестартануть и метрики потеряются) - это SQL (если данные в реялционке) или язык для своего хранилища

    Чаще всего вижу такое решение:
    - Приложение отслеживает внутрениие метрики и отдает их в Prometheus формате
    - Prometheus приложение собирает эти метрики
    - Grafana получает метрики из Prometheus и строит по ним дашборды
    - Grafana делает запрос в БД для получения статистики и строит по ним дашборды

    В общем, смотри пару Prometheus/Grafana

    P.S. анализ логов для получения метрик - плохая затея, не надо так
    P.P.S. метрики, логирование, действия пользователя и т.д. - в общем случае называется observability - возможность понимать что происходит в приложении/системе и т.д.
    Ответ написан
    Комментировать
  • Объясните модификаторы доступа?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    В спецификаци C# ECMA-334 это описывается в терминах доменов доступности - Accessibility domain.
    Каждый модификатор доступа выставляет определенные ограничения на эту доступность. В результате, у тебя будут следующие "области" - A -> Method.
    Главное правило - ты не можешь получить доступ к member, которые не в твоем домене.
    Пример оттуда:
    Example: In the following code
    public class A
    {
     public static int X;
     internal static int Y;
     private static int Z;
    }
    internal class B
    {
     public static int X;
     internal static int Y;
     private static int Z;
     public class C
     {
     public static int X;
     internal static int Y;
     private static int Z;
     }
     private class D
     {
     public static int X;
     internal static int Y;
     private static int Z;
     }
    }

    the classes and members have the following accessibility domains:
    • The accessibility domain of A and A.X is unlimited.
    • The accessibility domain of A.Y, B, B.X, B.Y, B.C, B.C.X, and B.C.Y is the program text of the
    containing program.
    • The accessibility domain of A.Z is the program text of A.
    • The accessibility domain of B.Z and B.D is the program text of B, including the program text of
    B.C and B.D.
    • The accessibility domain of B.C.Z is the program text of B.C.
    • The accessibility domain of B.D.X and B.D.Y is the program text of B, including the program
    text of B.C and B.D.
    • The accessibility domain of B.D.Z is the program text of B.D. As the example illustrates, the
    accessibility domain of a member is never larger than that of a containing type. For example,
    even though all X members have public declared accessibility, all but A.X have accessibility
    domains that are constrained by a containing type.
    end example

    Для твоего примера - домены доступности для этих методов одни и те же (неявно возвращается глобальный System.Void), поэтому корректная конструкция.
    А вот если из публичного метода возвращать боле ограниченный тип, то будет нарушение. Т.к. возвращаешь более ограниченный из глобального.
    Ответ написан
    2 комментария
  • Как уменьшить размер PDF на сервере?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Можно вот таким скриптом на bash
    find . -name '*.pdf' | xargs -I % sh -c 'gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=%.tmp %; mv %.tmp %'

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

    Но необходимо установить ghostscript - sudo apt install ghostscript
    Ответ написан
    1 комментарий
  • Как передаются регистры в трансляторах? Как происходит переход, от виртуальных регистров к машинным?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Как перестать поддерживать ее, при выполнении клиентского кода в ходе динамической трансляции.

    Просто иметь оптимизации, которые знают, какой регистр какое название имеет.

    Раз уж ты поставил тег .NET, то у платформы есть свой JIT компилятор, который пишется под каждую платформу (CPU) и имеет знание о ее регистрах.
    Вот пример того, как это делается в исходном коде:
    1. Каждая платформа регистрирует свои регистры и информацию о них.
    #if defined(TARGET_XARCH)
    
    #if defined(TARGET_X86)
    /*
    REGDEF(name, rnum,   mask, sname) */
    REGDEF(EAX,     0,   0x01, "eax"   )
    REGDEF(ECX,     1,   0x02, "ecx"   )
    REGDEF(EDX,     2,   0x04, "edx"   )
    REGDEF(EBX,     3,   0x08, "ebx"   )
    REGDEF(ESP,     4,   0x10, "esp"   )
    REGDEF(EBP,     5,   0x20, "ebp"   )
    REGDEF(ESI,     6,   0x40, "esi"   )
    REGDEF(EDI,     7,   0x80, "edi"   )
    REGALIAS(RAX, EAX)
    REGALIAS(RCX, ECX)
    REGALIAS(RDX, EDX)
    REGALIAS(RBX, EBX)
    REGALIAS(RSP, ESP)
    REGALIAS(RBP, EBP)
    REGALIAS(RSI, ESI)
    REGALIAS(RDI, EDI)
    
    #else // !defined(TARGET_X86)
    
    /*
    REGDEF(name, rnum,   mask, sname) */
    REGDEF(RAX,     0, 0x0001, "rax"   )
    REGDEF(RCX,     1, 0x0002, "rcx"   )
    REGDEF(RDX,     2, 0x0004, "rdx"   )
    REGDEF(RBX,     3, 0x0008, "rbx"   )
    REGDEF(RSP,     4, 0x0010, "rsp"   )
    REGDEF(RBP,     5, 0x0020, "rbp"   )
    REGDEF(RSI,     6, 0x0040, "rsi"   )
    REGDEF(RDI,     7, 0x0080, "rdi"   )
    REGDEF(R8,      8, 0x0100, "r8"    )
    REGDEF(R9,      9, 0x0200, "r9"    )
    REGDEF(R10,    10, 0x0400, "r10"   )
    REGDEF(R11,    11, 0x0800, "r11"   )
    REGDEF(R12,    12, 0x1000, "r12"   )
    REGDEF(R13,    13, 0x2000, "r13"   )
    REGDEF(R14,    14, 0x4000, "r14"   )
    REGDEF(R15,    15, 0x8000, "r15"   )
    
    REGALIAS(EAX, RAX)
    REGALIAS(ECX, RCX)
    REGALIAS(EDX, RDX)
    REGALIAS(EBX, RBX)
    REGALIAS(ESP, RSP)
    REGALIAS(EBP, RBP)
    REGALIAS(ESI, RSI)
    REGALIAS(EDI, RDI)
    
    #endif // !defined(TARGET_X86)

    2. Для каждой платформы реализуются своя пара кодогенератор/эмиттер

    // Кодогенератор
    void CodeGen::genCodeForBinary(GenTreeOp* treeNode)
    {
        GenTree* op1 = treeNode->gtGetOp1();
        GenTree* op2 = treeNode->gtGetOp2();
    
        instruction ins = genGetInsForOper(treeNode->OperGet(), targetType);
    
        regNumber op1reg = op1->isUsedFromReg() ? op1->GetRegNum() : REG_NA;
        regNumber op2reg = op2->isUsedFromReg() ? op2->GetRegNum() : REG_NA;
    
        GenTree* dst;
        GenTree* src;
    
        // This is the case of reg1 = reg1 op reg2
        // We're ready to emit the instruction without any moves
        if (op1reg == targetReg)
        {
            dst = op1;
            src = op2;
        }
        // We have reg1 = reg2 op reg1
        // In order for this operation to be correct
        // we need that op is a commutative operation so
        // we can convert it into reg1 = reg1 op reg2 and emit
        // the same code as above
        else if (op2reg == targetReg)
        {
            dst = op2;
            src = op1;
        }
        // dest, op1 and op2 registers are different:
        // reg3 = reg1 op reg2
        // We can implement this by issuing a mov:
        // reg3 = reg1
        // reg3 = reg3 op reg2
        else
        {
            var_types op1Type = op1->TypeGet();
            inst_Mov(op1Type, targetReg, op1reg, /* canSkip */ false);
            regSet.verifyRegUsed(targetReg);
            gcInfo.gcMarkRegPtrVal(targetReg, op1Type);
            dst = treeNode;
            src = op2;
        }
        // try to use an inc or dec
        if (oper == GT_ADD && !varTypeIsFloating(treeNode) && src->isContainedIntOrIImmed() && !treeNode->gtOverflowEx())
        {
            if (src->IsIntegralConst(1))
            {
                emit->emitIns_R(INS_inc, emitTypeSize(treeNode), targetReg);
                genProduceReg(treeNode);
                return;
            }
            else if (src->IsIntegralConst(-1))
            {
                emit->emitIns_R(INS_dec, emitTypeSize(treeNode), targetReg);
                genProduceReg(treeNode);
                return;
            }
        }
        regNumber r = emit->emitInsBinary(ins, emitTypeSize(treeNode), dst, src);
    }
    
    // Эммитер
    /*****************************************************************************
     *
     *  Add an instruction with two register operands.
     */
    
    void emitter::emitIns_R_R(instruction ins, emitAttr attr, regNumber reg1, regNumber reg2, insOpts instOptions)
    {
        if (IsMovInstruction(ins))
        {
            assert(!"Please use emitIns_Mov() to correctly handle move elision");
            emitIns_Mov(ins, attr, reg1, reg2, /* canSkip */ false);
        }
    
        emitAttr size = EA_SIZE(attr);
    
        assert(size <= EA_64BYTE);
        noway_assert(emitVerifyEncodable(ins, size, reg1, reg2));
    
        /* Special case: "XCHG" uses a different format */
        insFormat fmt = (ins == INS_xchg) ? IF_RRW_RRW : emitInsModeFormat(ins, IF_RRD_RRD);
    
        instrDesc* id = emitNewInstrSmall(attr);
        id->idIns(ins);
        id->idInsFmt(fmt);
        id->idReg1(reg1);
        id->idReg2(reg2);
    
        if ((instOptions & INS_OPTS_EVEX_b_MASK) != INS_OPTS_NONE)
        {
            // if EVEX.b needs to be set in this path, then it should be embedded rounding.
            assert(UseEvexEncoding());
            id->idSetEvexbContext(instOptions);
        }
    
        UNATIVE_OFFSET sz = emitInsSizeRR(id);
        id->idCodeSize(sz);
    
        dispIns(id);
        emitCurIGsize += sz;
    }


    Дальше нам остается просто получить название регистра по его числу - это мы сделали на 1 шаге при их регистрации.

    Здесь применяется условная компиляция. Но в рантайме (динамически) это тоже можно реализовать - просто кидаешь везде простые массивы и индексы.
    Ответ написан
    2 комментария
  • Как передать экземпляр объекта в другой класс?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Ты передаешь object, а не HttpClient

    class Class1 (HttpClient client)
        {
            public async Task StartVkAsync()
            {            
                using (HttpResponseMessage response = await client.GetAsync("https://ya.ru/"))
                {
                    var JsonString = await response.Content.ReadAsStringAsync();
                    await Console.Out.WriteLineAsync(JsonString);
                }
            }
        }
    Ответ написан
    1 комментарий
  • Как можно сделать один SSD для игр, чтобы использовать его на Windows и Linux?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Думаю здесь несколько проблем, которые надо учитывать:
    - Кроссплатформенность - бинари на Windows не запускаются на Linux и наоборот - значит надо хранить либо оба формата, либо использовать эмулятор (wine, vb, ...), но у последнего производительность будет ниже
    - Какую фс будешь использовать - доказательств нет, но чувство что Windows не любит не NT фс, а Linux плохо работает с NTFS
    - Сами игры зачастую только на винду ориентированы, поэтому этот SSD будет скорее пуст
    Ответ написан
    Комментировать
  • Контринтуитивный синтаксис объявления нескольких переменных одного типа?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Объясните, что я недопонимаю?

    Все правильно понимаешь. Привыкай.

    P.S. вот поэтому и рекомендуют * писать рядом с переменной, а не у типа - const char *var , а не const char* var
    Ответ написан
    1 комментарий
  • Какой метод надо использовать в Unity, что бы при нахождении в Trigger происходило событие?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Скорее всего, когда ты умираешь в области триггера, то выходишь из него. В этом случае, тебе нужен Collider.OnTriggerExit()
    Ответ написан
  • Нормально ли писать на C# на Linux Manjaro?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Устанавливай .NET Core и разрабатывай на здоровье.
    Разница с Windows разве что в отсутствии оконных приложений, а остальные типы проектов есть.

    P.S. Visual Studio придется забросить и перейти либо на VS Code либо на Rider
    Ответ написан
    Комментировать
  • Эффективный long polling запрос Telegram API каа правильно сделать?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Для чего нужен "timeout" в строке запроса?

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

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

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Как уже было сказано - это называется IPC
    Если нужно обмениваться данными, то можно использовать техники:
    - Сокеты: TCP/IP можно практически везде, Unix-domain - только в unix системах, но будет быстрее
    - Сигналы: можно передавать данные вместе с сигналом, но только int/указатель, т.е. вариантов не много
    - stdout/stdin: при создании дочернего процесса получить его stdout/stdin потоки и работать с ними
    - Каналы: можно создать канал (анонимный или именованный) и общаться через него
    - Внешний сервис для общения: какой нибудь RabbitMQ, но это чересчур
    - Общая память (Shared Memory): но может не работать во некоторых ЯП
    - Общение через файлы: один процесс пишет в файл и по окончании шлет сигнал другому процессу, который этот файл читает
    - Memory Mapped File : тот же вариант, что и с файлами, но быстрее и при больших данных можешь словить OOM и большое потребление памяти
    - ZeroMQ - это очередь сообщений, которая работает в user-space

    Дополнительно надо помнить, что есть ограничения различных платформ, ОС, ЯП и некоторые варианты там работать не будут
    Ответ написан
    Комментировать