Ответы пользователя по тегу C#
  • Как реализовать отображение чертежей в 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)
    Ответ написан
    Комментировать
  • Как правильно пропарсить лабиринт в граф?

    @rPman
    Лабиринт в форме - ячейка это либо стена либо проход (0/1)?

    Заводим класс - 'Вершина графа', ребра которого - его параметры ссылок на Смежные вершины, для каждой стороны вверх, вниз, налево и направо. Если нужно выявление замкнутых подмножеств, то добавляем параметр - номер подмножества (значение 0 - неизвестно)

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

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

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

    @rPman
    Подумай хорошенько, где ты собираешься кешировать и как инвалидировать кеш (проверять что данные в кеше устарели), получишь ответ на этот вопрос почти сразу

    Второй вопрос очень важный, как запускается код бота, в режиме получил запрос (реакция от пользователя) и завершил процесс либо процесс запускается как сервис и работает в единственном экземпляре (тоже важно, так как бывает что то типа кластера, но явно не твой случай)?

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

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

    Вот от сюда и думай, что хранить, где хранить надо ли делать запрос в базу или можно из памяти и т.п.
    Ответ написан
    2 комментария
  • Как реализовать парсер сайта скриптами JS из приложения c#?

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

    Подключаешь к проекту какой-нибудь браузер, открываешь требуемую ссылку там, мониторишь итог на предмет окончания загрузки (отдельная проблема)...
    например штатный компонент .net WebBrowser это древний internetexplorer11 на windows, но при запуске проекта на mono - это будет что то основанное на firefox

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