Задать вопрос
Ответы пользователя по тегу C#
  • Как десериализовать простой Json в массив?

    @rPman
    Вот так не работает?
    Newtonsoft.Json.JsonConvert.DeserializeObject<List<MyClassWithCode>>(строка_с_json)


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

    int[] собирай уже сам

    в этом случае ты сможешь обрабатывать огромный json файл массив последовательно
    тут пример как вручную не следить за объектом в процессе
    Ответ написан
    4 комментария
  • Как сделать так чтоб хвост змейки двигался по направлению головы winforms C#?

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

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

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

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

    @rPman
    Нет нужды создавать mutex или semaphore, исторически, хоть в windows хоть в linux для этого открывают файл (пустой, их называют .lock) в режиме SharedAccess NONE
    https://learn.microsoft.com/ru-ru/dotnet/api/syste...
    https://learn.microsoft.com/ru-ru/dotnet/api/syste...
    FileMode = Create тогда файл будет автоматически создан если отсутствует и не выдаст ошибки если уже есть
    FileAccess = Write чтобы файл можно было создать (если создать его заранее то хватит Read)
    SharedAccess = None запрет на повторное открытие хоть на чтение хоть на запись


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

    @rPman
    Где то должна лежать доступной для формы-источника ссылка на форму получателя.

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

    Иначе, оформлять сам процесс коммуникаций в виде отдельного класса (а там в зависимости от цели организации этого посредника, либо по классу на вид коммуникаций либо общий для всех сообщений и способов выбора от кого и кому)
    Ответ написан
  • Возможно ли запускать программы (.exe) на самописной OS Cosmos OS?

    @rPman
    Да, самый популярный инструмент - wine.

    С вас самый минимум (сарказм) - собрать (скомпилировать) этого монстра под вашу ОС и архитектуру железа, для этого она должна быть как минимум posix совместимой и на ней должен быть как минимум компилятор gcc (с его помощью можно будет собрать остальные инструменты, нужные для сборки wine)

    p.s. пример обратного механизма, запуск linux приложений в windows - wsl (его первая версия, так как вторая - это фактически виртуальная машина)

    p.p.s. когда то очень давно, во времена os/2 и появления winnt4, в windows был встроенный механизм поддержки и приложений из unix операционных систем но был старательно уничтожен майкрософтом во имя зла и монополии (в те времена к примеру win32 запускались в os/2 нативно)
    Ответ написан
  • Как ввести логин в окно входа в Steam?

    @rPman
    Потому что твой xpath явно неверный (ты не указал весь код)
    <input type="text" class="newlogindialog_TextInput_2eKVn" value="">
    ...
    <input type="password" class="newlogindialog_TextInput_2eKVn" value="">

    Правильно - ищешь все input без фильтра и каждый проверяешь на подстроку в названии класса и значение type, еще можно искать по координатам, запрашивая у каждого getBoundingClientRect, пропуская заодно с нулевым размером
    Ответ написан
  • Как сделать кликер на C#?

    @rPman
    Кажется я уже отвечал на этот вопрос
    c# - худший выбор для данной задачи, так как все придется делать через win32, лучшим выбором тут будет c++ или c

    И да, с некоторыми шансами это не поможет.

    p.s. с высокой вероятностью симуляция кликов через SendMessage с майкрософтовским файловым эксплорером не сработает, там такой п..ц наворочен, когда то давно давно я ковырялся в нем со spy++. С другой стороны, в win11 его полностью переписали, может стало легче?
    Ответ написан
    Комментировать
  • Как сделать клик без перемещения курсора в неактивном окне программы?

    @rPman
    Анализируешь окно приложения на состав win32 окон ( там может быть сложная иерархия, вплоть по контрола или одно основное, а интерфейс рисуется) с помощью штатной утилиты microsoft visual studio spy++, затем в программе ищешь по выявлненным свойствам окно FindWindow и шлёшь сообщение с помощью SendMessage. С помощью spy++ можно проанализировать какие именно сообщения приходят при клике.

    P.s. Для directx приложений это не сработает
    Ответ написан
    Комментировать
  • В windows form на c# медленно отправляет данные по serial Бод на 921600 даже в асинхронным Как сделать можно чтоб шустро?

    @rPman
    о какой скорости идет речь, если ты по одному символу туда пишешь? пиши сразу блоками по несколько килобайт
    Ответ написан
    Комментировать
  • Возможно ли на C# выполнить перевод криптовалюты и её трату?

    @rPman
    Мой тебе совет - найми знающего человека.
    Самоучиться на продакшене своими/чужими деньгами - плохая идея.

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

    p.s. куда ты переводить криптовалюту собрался, если ты ее принимаешь? продавать сразу как получил? - отдельная задача на миллион, завести на бирже аккаунт, держать там некоторый буфер, обменивать ту же сумму что получил от клиента и оперативно выводить излишки и пополнять недостаток. Все это отдельными скриптами, которые должны быть максимально далеко от игрового 'сервера'. На c# красивых универсальных библиотек мало, для других языков настоятельно рекомендую ccxt
    Ответ написан
    4 комментария
  • Как воспользоваться LLamaSharp?

    @rPman
    Оригинальные веса llama были выложены кажется на github
    magnet:?xt=urn:btih:ZXXDAUWYLRUXXBHUYEMS6Q5CE5WA3LVA&dn=LLaMA

    получаешь что то типа
    7B/checklist.chk
    7B/params.json
    7B/consolidated.00.pth
    13B/...
    ...
    tokenizer_checklist.chk
    tokenizer.model

    тебе нужны все tokenizer* файлы в корне и один из каталогов, соответствующий размеру модели (7B и 13B не знают русского и слабоваты)

    Этот c# проект - это биндинг к оригинальному проекту llama.cpp, там есть python скрипт convert.py (зависимости ставь сам, недостаточно requirements.txt нужен еще pytorch и еще что то, сам разберешься, в windows я не помогу) для конвертации из huggingface формата в суперэффективный ggml (этот формат постоянно меняется, где то раз в месяц, поэтому бессмысленно качать готовые, так как они будут привязаны к конкретной версии llama.cpp), его главная фича - mmap, веса не грузятся в память приложения а остаются в файловом кеше ОС, т.е. повторный запуск приложения моментальный.

    Будь готов к нескольким конвертациям, модели большие, особенно 65B, на диске тебе потребуется как минимум один раз хранить f16 версию (2 байта на вес, т.е. 130Gb для 65B модели) после его можно (но не обязательно) сконвертировать в формат с квантизацией (на вес будет требоваться к примеру 4 бита или 8), это значительно ускоряет работу ценой незначительного ухудшения качества.

    python convert.py --outtype f16 --outfile llama-7b-q4_0.ggml /torrents/LLaMA/7B
    вместо f16 можешь поставить f32, требования к памяти взлетят до 4 байт на вес но в теории это может быть тоже быстро (если критично, проведи бенчмарки), мои тесты показывают что f16 медленнее q4_0

    Опционально можешь провести квантизацию:
    ./quantize llama-7b-f16.ggml llama-7b-q4_0.ggml 2
    тут 2 это тип квантизации
    usage: ./quantize model-f32.bin [model-quant.bin] type [nthreads]
      type = "q4_0" or 2
      type = "q4_1" or 3
      type = "q5_0" or 8
      type = "q5_1" or 9
      type = "q8_0" or 7
    Очевидно что q4_... потребуют половину байта на вес (требования к 64b модели будут примерно 42+5GB ram), разница версий квантизации в скорости и качестве (q4_0 быстрее и чуть хуже q4_1 но я уверен что без синтетических тестов эту разницу на практике не заметишь даже между q16 и q4, она там единицы процентов, но вот скорость значительно отличается).

    Для работы llama.cpp нужен один файл .ggml (внутри и веса и токенизер) его и пиши в путь до модели.

    Поэкспериментируй с количеством threads в настройках, их нужно писать меньше чем позволяет процессор (тем более с гипертреадингом), так же я хз как у него с поддержкой gpu, она появилась относительно недавно, оптимизация по какому то одному конкретному тяжелому расчету.
    Ответ написан
    Комментировать
  • Как реализовать отображение чертежей в winForms?

    @rPman
    Вне зависимости от использования библиотек или фреймворка общая идея ускорения вывода большого количества примитивов или просто сложные объекты, есть разные подходы:
    * кешировать результат, в твоем случае можно в памяти создать битмап и отрисовывать в него, тогда при перемещении окна просмотра в него перерисовывать объекты не понадобится
    недостаток - при большом размере холста (в пикселах) будут повышенные требования к оперативной памяти
    * частично кешировать результат, чем то таким занимаются разработчики/движки игр, когда далекие сцены, внешний вид которых не меняется при локальных перемещениях игрока, заменяются на заранее отрендеренный битмап (текстуру) и рисуют простой спрайт
    В общем это перераспределение нагрузки между процессором и оперативной памятью, либо ты постоянно перерисовываешь все объекты на сцене либо ты это делаешь реже но хранишь все в памяти
    * воспользоваться видеоускорителем, красивого решения именно для c# у тебя не будет, это вообще не подходящий инструмент. Смысл в том что современные видеоускорители, даже если это оффисный, встроенный в процессор, способны отрисовывать миллионы примитивов, но разработка приложения будет похожа на разработку игры, и готовые фрейамворки либо ограничат тебя в возможностях либо из-за того что используешь неподходящий инструмент, ты будешь тратить время на переходы от managed разработки до нативной
    погугли .net using gpu acceleration
    если ты готов к вендорлоку nvidia посмотри на их движок
    Ответ написан
    Комментировать
  • Какая библиотека лучше всего использовать для голосового ассистента (бесплатно без регистрации) на C#?

    @rPman
    Хорошее и бесплатное не совместимы, можешь попробовать 'воровать' у Гугла, запилив веб приложение и запускай его в google chrome, на сколько я знаю оно использует облачное распознавание, тебе можно то же самое использовать от Яндекс браузера, у этих обоих лучший движок распознавания русской речи
    Ответ написан
  • Как зашифровать логин и пароль в проекте exe (windows form)?

    @rPman
    Ключевое слово для дальнейшего поиска решения - обфускация.

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

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

    P.s. подумай, такая борьба с ветреными мельницами может оказаться сложнее чем запилить сервис посредника
    Ответ написан
  • Как поставить точку в коде?

    @rPman
    везде одинаково:

    return - выход из функции/метода
    break - выход из switch для выбранных секций case
    goto - выход на метку (только в пределах метода), можно использовать как выход из многоуровневого цикла без определения переменных состояний, но вообще плохой тон
    Ответ написан
    2 комментария
  • Должны ли все асинхронные методы вызываться с ключом async?

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

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

    async/await это синитаксический сахар, позволяющий красиво использовать асинхронный код в обычном стиле программирования. Когда компилятор видит async он сохраняет состояние (стек) и передает выполнение к очереди для других кусков кода (помеченный async)
    Ответ написан
  • Как связать приложение по интернету(не на локальной машине)?

    @rPman
    Да будут, но при условии что между машинами нет фаервола, ограничивающего эту связь.

    Типовая конфигурация интернета в России подразумевает наличие роутера, который и выступает в роли этого фаервола.

    Если у машины, к которой подключаешься, интернет с выделенным ip адресом, то достаточно в настройках роутера настроить portmapping (раздел nat), если динамический, то нужно настраивать дополнительно dyndns
    Ответ написан
  • Почему некорректно получаются данные по сокету?

    @rPman
    кто тебе надоумил отсылать в сокет СТРОЧНОЕ представление размера?
    Encoding.ASCII.GetBytes(buffer.Length.ToString())
    ulong.Parse(Encoding.UTF8.GetString(size))а потом пытаться его отпарсить из UTF8! строки длиной 1024 байта, что там у тебя после твоих циферок будет лежать, одному богу известно, будет похоже на число - приплюсуется к размеру

    отправлять надо фиксированное колчичество байт (даже считать не надо, отправляешь int размером sizeof(int) и столько же читаешь прямо в int
    Ответ написан
  • Как сделать трансляцию экрана через сокеты в C#?

    @rPman
    ты хандлер сокета клиента закрыл сразу после отправки
    убери handler.Close();

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

    Еще момент, ты должен как то сообщить клиенту, сколько данных будешь передавать, например сначала шлешь размер буфера с изображением, а затем сам буфер. Само собой клиент точно так же должен это ожидать
    Ответ написан
    Комментировать