Ответы пользователя по тегу C#
  • В 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 (второй сделай вложенный) и пока клиент хандлер не закроет, тупо шли в него картинки.

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

    @rPman
    Тебе нужно асинхронное чтение потоков процесса, это можно сделать, добавив на колбек свой метод process.OutputDataReceived и ErrorDataReceived соответственно, а после process.Start() сразу запускаешь чтение потоков process.BeginOutputReadLine и BeginErrorReadLine

    Вот дока с примером
    --------------upd---------------

    Для чтения не по строкам, пользуйся асинхронным методом у StreamReader - ReadBlockAsync

    Чтобы можно было брать потоки process.StandardOutput и process.StandardError, у process.SystemInfo нужно установить RedirectStandardOutput = true и RedirectStandardError = true соответственно.

    Осторожно, ReadBlockAsync может вернуть блок меньшего размера

    Пример кода
    using System;
    using System.Threading.Tasks;
    using System.IO;
    using System.Diagnostics;
    
    namespace ProcessStdoutTaskTest
    {
        class MainClass
        {
            static char[] bufOut = new char[5];
            static char[] bufErr = new char[5];
            async static void ReadAsyncStream(StreamReader sr, char[] buf)
            {
                int size;
                while ((size = await sr.ReadBlockAsync(buf, 0, buf.Length)) != 0)
                {
                    Console.WriteLine((buf==bufOut?"out":"err")+" '" + new string(buf, 0, size) + "'") ;
                }
            }
            public static void Main(string[] args)
            {
                using (Process process = new Process())
                {
                    process.StartInfo.FileName = "/bin/bash";
                    process.StartInfo.Arguments = "-c \"printf 'abc';printf 'def' 1>&2;printf 'ghi';printf 'j' 1>&2;\"";
                    process.StartInfo.UseShellExecute = false;
                    process.StartInfo.RedirectStandardOutput = true;
                    process.StartInfo.RedirectStandardError = true;
                    process.Start();
    
                    ReadAsyncStream(process.StandardOutput, bufOut);
                    ReadAsyncStream(process.StandardError, bufErr);
    
                    Console.Write("Wait to process exit ");
                    process.WaitForExit();
                    Console.WriteLine("ok");
                }
    
                Console.WriteLine("Press enter to exit.");
                Console.ReadLine();
            }
        }
    }

    Будет вывод:
    Wait to process exit ok
    Press enter to exit.
    out 'abcgh'
    out 'i'
    err 'defj'

    Кстати поведение объединения отдельных строк в потоках из разных кусочков не гарантируется, как я понимаю это зависит от того как использует flush на stdout запускаемый процесс, в моем примере это bash и он явно буферизирует вывод
    Ответ написан
  • Как проверить файлы и найти в них 3 наибольших числа c#?

    @rPman
    2 подхода

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

    по сложнее - подходит, когда количество максимальных чисел заметно большое или переменное, в этом случае заводишь массив искомых чисел длиной +1 (длинной 4 в твоем случае), заполнив любым гарантированно минимальным значением (отдельный разговор каким, например -2147483647 для 32-битных целых) и затем открываешь по очереди файлы, читаешь из них числа, по одному, и добавляешь число в конец массива (заменяя лежащее там число, оно не нужно так как 4-ое), затем для каждого числа начиная с предпоследнего к первому делаешь операцию замены их местами, если текущее число меньше стоящего справа. По окончанию первые 3 числа и будут искомыми.
    Заполнение массива гарантированно минимальным числом иногда не подходит, тогда необходимо первичное заполнение массива делать числами из файлов, заведя переменную - текущий размер искомого массива, начиная с 1 и увеличивать до требуемых (в твоем случае 4)
    Ответ написан
    Комментировать
  • Какой есть аналог Microsoft.Office.Interop.Word для .Net Core?

    @rPman
    Когда то с меньшими версиями студии и офиса) я просто добавлял dll файлы к проекту, в виде компонент, они так и назывались, необходимые зависимости студия пишет в ошибке при запуске или компиляции, уже не помню точно

    nuget пакет тут явно не поможет

    еще в интернетах пишут что нужно выбирать правильный тип проекта
    Ответ написан
  • Как записать образ операционой системы созданой через дополнение к visual studio Cosmos (язык C#)?

    @rPman
    У них свое ядро (не linux) и свой загрузчик!

    У тебя похоже только один вариант, побайтовая копия iso образа на флешку (и это может не сработать, ведь их загрузчик должен уметь это обрабатывать а uefi они не умеют, только на обсуждении), так же в Roadmap - Future у них записан USB

    В rufus есть "Запись образа в режиме DD" выбирай его, либо ищи альтернативы linux dd, какой-нибудь windd или Win32DiskImager и пиши прямо на диск (не раздел!) само собой все данные будут уничтожены

    p.s. qemu у них заявлен в поддержке, значит как вариант, ставишь минимальный linux, прямо в initramfs.img интегрируешь kvm/qemu и прописываешь в скрипт запуска запуск виртуальной машины на полный экран
    Ответ написан
  • Есть ли в c# ограничение длины строки компилятором?

    @rPman
    2Gb
    The maximum size of a String object in memory is 2-GB, or about 1 billion characters.
    Ответ написан
    3 комментария
  • Как тестировать сервер на сокетах?

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

    @rPman
    У криптовалют типа bitcoin (не etherum) именно так и реализовано - баланс на аккаунте пользователя это сумма не потраченных выходов, т.е. буквально каждый входящий перевод (сдачи от исходящих)

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

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

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

    @rPman
    Ты используешь Vector3.Lerp который считает расположение точки между двумя указанными позициями (у тебя это текущая позиция и та что пришла по сети), третий параметр должен быть при значении 0 и 1 соответственно первой позиции и второй, при значениях больше - позиция будет интерполирована дальше линейно, у тебя же там speed*Time.deltaTime что это значит я полагаю ты сам не понимаешь.

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

    Ты пробовал просто позицию полученную по сети подставлять без интерполяции?

    p.s. без относительно фреймворка, передавай не позицию объекта, а его управление (команды на изменение поведения, повтороты, изменения скорости и т.п., и соответственно считай его новые координаты на удаленном клиенте точно так же как на сервере, но жестко привязывая к тикам времени, кодить такое сложнее но зато скроет лаги очень хорошо (пока взаимодействие не начнется само собой)
    Ответ написан
    1 комментарий
  • Как я могу изменить название .exe и название процесса моей программы?

    @rPman
    Закрой проект, открой в текстовом редакторе файл проекта *.csproj (формат xml) и замени название в теге <AssemblyName>....</AssemblyName>

    после открытия на всякий случая очисти и пересобери проект (build -> clean)
    Ответ написан
    Комментировать