Ответы пользователя по тегу C#
  • Как реализовать хранение файлов в памяти, используя репозиторий?

    @rPman
    DIP из SOLID
    не уверен, на сколько глубоко ты готов залезать в проблему, так как в зависимости от этого будет и подход к разработке. Выбор - поддержка или нет практически любого из этих пунктов будут менять структуру и алгоритм чуть ли не полностью.

    1. имена файлов и пути, а кодировки?
    в разных ос разные правила, разные символы разделители, значимость больших/маленьких букв в именах
    2. symbolic и hardlink свихнуться можно
    это огромная головная боль для любых кто занимается копированием данных, поведение разнится к примеру, попадает ли путь в пределах каталогов, входящих в копию или нет
    3. фичи типа sparce files или reflink (этакий hardlink но не для файла а на его сектора)
    существуют задачи, в которых не сохранение и учет этих вещей могут невероятно усложнить восстановление данных (например если данные хранятся в дырявых файлах, логически петабайтового размера, в реальности же занимающие на порядки меньше, восстановить да и скопировать без учета этого будет практически нереально)
    4. extended attributes
    этим мало кто пользуется (но если пользуются то на столько глубоко, что не сделать резервную копию будет фатально), но помнить об этом надо, особенно когда нужно абстрагироваться от их реализации в ОС
    5. права доступа
    очень мало кто заморачивается с резервированием этой информации, а она зачастую не менее важна чем сами данные, так как иначе, при восстановлении данных со сложной структурой прав и большим количеством пользователей может превратиться в ад, и даже нести опасность утечки важных данных
    6. инкрементальное хранение бакапов
    это конечно не обязательно, но системы хранения резервных копий без этой фичи неудобны либо слишком дороги
    7. работа с сетевыми nas, инструменты выборочного восстановления, поиск данных
    Хранить бакапы локально - это фатальная ошибка, значит доступ к хранилищу должен быть удаленный
    А еще, вероятность что понадобится восстановить весь бакап на столько низкая, по сравнению с другими сценариями, и заставлять человека извлекать петабайтовые архивы ради мегабайтового файлика, который удалили по ошибки и решили восстановить из бакапа...

    p.s. не придумывай сам, спроси своего руководителя, на сколько глубока кроличья нора, так как к примеру все правильно сделать может тянуть на диплом или еще круче.

    p.p.s. совет, не изобретай форматы хранения данных, храни все в файлах, пусть контейнером будет сама файловая система (не вздумай файлы хранить к примеру в БД), но вот за имена файлов придется чтобы отвечал кто то другой (вот тут БД), причем не рекомендуется полностью исключать имена файлов и каталогов из архива, достаточно составить список разрешенных символов (общих для большинства ос и основной кодировки) но это может наложить лимит на структуру данных (например в разных ос разный лимит глубины вложенности или длины символов в пути к файлу), тут же храни extended attributes (так же в виде файлов со своими именами)
    Все остальное (настройки, структуру инкрементальных бакапов, права доступа, наличие дыр, symlink/hardlik, reflink и т.п.) так же храни в базе данных, может не так удобно как кажется с первого взгляда, но будет легче восстанавливать.
    Ответ написан
  • Можно ли в WebView2 для winforms отключить загрузку изображений?

    @rPman
    webview.getSettings().setLoadsImagesAutomatically(false);
    webview.getSettings().setBlockNetworkImage(true);

    это для android а в вопросе .net
    Ответ написан
  • Как хранить большие строки красиво?

    @rPman
    А чем плохо? пользоваться не удобно? строковые константы почти одинаковые, отличаются по чуть чуть?
    Лично я не вижу в простом нагромождении switch case ничего зазорного, если это простое описание логики если то... многоуровневая логика уже сложнее (если внутри тоже есть условия) такое читать сильно неудобно и легко пропустить ошибку.

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

    @rPman
    Рональд Макдональд все верно написал, дополню:

    Страницы, а точнее данные можно передавать по другим протоколам, например ftp, а в локальной сети можно даже открывать по протоколу smb (только windows) или даже локальные файлы (file:///путь_к_html)), но на сколько я знаю для вопросов безопасности, по умолчанию миксить разные режимы, включая https и http запрещается (если стартовая страница http то наверное можно, но скоро все браузеры начнут громко предупреждать что это плохо, пока только сверху намекают)

    Данные можно передавать не только штатным http но и с помощью его расширения websocket, в этом случае можно так же слать сообщения наоборот, от клиента к серверу.

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

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

    p.s. еще есть интересный стандарт data uri, позволяет размещать контент элемента прямо в адресной строке
    data:text/html;charset=utf-8;base64,SGVsbG8gPHNjcmlwdD5hbGVydCgnd29ybGQnKTs8L3NjcmlwdD4=

    так же это работает для любых элементов на странице, можно даже картинки так вставлять, только не эффективно

    p.p.s. совсем добавлю, еще есть протокол chrome:// или moz-extension:// для доступа к элементам расширений браузера, но тут нет стандарта
    Ответ написан
    2 комментария
  • Как передать данные через точку доступа?

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

    В редких случаях это не сработает, если стоит к примеру 'ускоритель интернета' на основе балансировки нагрузки между двумя и более провайдерами, так же если в момент отправки сообщения ip адрес поменяется (да должно сильно не повезти но то возможно)

    Правильно - реализовать широковещательную рассылку в пределах локальной сети, сервер не понадобится но на android это сделать проблематично

    Зато там есть network service discover (работает на основе DNS-SD механизма) первый же пример кода из гугла
    Ответ написан
    Комментировать
  • Как получить доступ к файлу?

    @rPman
    Либо закрывай файл после создания, либо файл нужно создавать с указанием режима прав доступа ReadWrite
    Для этого подойдет собственно конструктор FileStream
    в доке какраз ниже пример:
    FileStream fWrite = new FileStream("test.txt", FileMode.Create, FileAccess.ReadWrite, FileShare.None, 8, FileOptions.None);


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

    @rPman
    вызывать штатную утилиту netsh, это будет наиболее простой способ решить почти любую задачу связанную с сетью, которую в принципе можно решить, даже те которые не решаемы в официальном gui
    Ответ написан
    3 комментария
  • Что важней видюха или проц, для разработки в C#?

    @rPman
    ответ Василий Банников верный

    Но есть нюанс, я видел как работает wfp приложение на очень старом (2005-2008 год) железе, на машине с не установленными драйверами на видео (что то встроенное ну совсем слабое) и как на такой машине видно процесс рисования окон, я даже помню на winform писал тестовое приложение, даже doublebuffer на поверку оказывался не таким уж и двойным, притом что какой-нибудь браузер работал более чем приемлемо (да тормозил скроллинг но не в пример все работало шустрее .net и конечно же тогдашние win32 приложения просто летали на той же машине)

    установка драйверов ситуацию исправляет, т.е. как минимум приложениям требуется поддержка 2d ускорения, т.е. какая-то видеокарта нужна, просто минимальная.

    Осторожно, и сейчас существует железо (что-нибудь на основе arm), где поддержки видеоускорителя нет или она проблематична.

    p.s. еще про оперативную память забыли, и про быстрый ssd диск. Для разработчика эти параметры под час даже важнее процессора, хотя его тоже рекомендуется максимизировать.
    Ответ написан
    1 комментарий
  • Как отправить http запрос на https://translate.google.ru на c# без использования api?

    @rPman
    Наиболее 'верный' и простой с точки зрения поддержки (так как гугл будет менять и обфусифицировать взаимодействие веб клиента с сервером) - это встроить внутри своего приложения браузер (например устаревшая WebBrowser, на основе ie или компоненты на основе webkit, в общем их там много), открыть внутри нужную ссылку (переводимый текст там можно вставлять в сам запрос) и прочитать ответ, распарсив итоговую страницу.

    Частые запросы переведут ваш ip адрес в режим - введите капчу
    Ответ написан
    Комментировать
  • ASP.NET Core 3.1 + IIS + Powershell SDK. Как запустить стороннее приложение через PowerShell на виртуальной машине?

    @rPman
    На сколько мне известно, единственный способ запустить процесс от пользователя, отличного от залогиненного, без запроса логина и пароля - это использование службы task scheduler (планировщик).

    Создаешь задачу без условий запуска, в свойствах указываешь что у тебя другой пользователь, вводишь логин пароль - все. Теперь чтобы запустить эту задачу нужно написать schtask /run ...

    p.s. тут обсуждалось как это сделать из power shell, но прав iis не хватит

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

    p.p.p.s. Когда то очень давно была сторонняя утилита srvany, которая поднимала службу, позволяющую запускать указанную утилиту под правами службы, а сами эти права настраивались в реестре.
    upd. во
    Ответ написан
    Комментировать
  • Как лучше спроектировать базу данных, MySQL?

    @rPman
    Названия кошмар, даже не с русским делом, вот почему у тебя в одном месте лайк/дизлайк это 'статус', а в другом - 'лайк'?

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

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

    Справочник категория жалобы не понятно зачем там два поля название и описание, когда в самой жалобе есть примечание, но это мелочи

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

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

    Если 'нет' - то причина скорее в интернет провайдере или на отдающей стороне (могут ограничивать скорость или просто перегружен провайдер)

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

    @rPman
    да, в юнити для стрима уже есть технологии.
    https://docs.unity3d.com/Packages/com.unity.render...

    да смартфон может выступать простым шлемом виртуальной реальности, гуглить - cardboard vr
    Ответ написан
    Комментировать
  • Как сделать добычу дерева в 2D игре?

    @rPman
    В общем два подхода (сначала игровые реши для себя)
    когда берешь в руки топор у тебя появляется/активируется скил (действие, такое же как ходить прыгать и т.п.) рубить
    - скил должен требовать чтобы в радиусе действия скила было дерево и даже к примеру должно быть выбрано (то с чем скил будет взаимодействовать) иначе он не может быть активирован (бывает когда при нажатии скила персонаж автоматически бежит к ближайшему объекту, который ему нужен, удобно когда надо бить по врагам мечом)
    - скил ничего не требует а просто активируется, воздействуя на объекты в радиусе действия скила
    а там, если что попало - рубит

    Во втором случае возможны выверты типа топор рубит сразу кучу деревьев, но тут вместо радиуса можно подобрать свою область активации, в т.ч. просто отрезок, так же можно прекращать обработку активации скила как только будет обнаружен хоть один нужный объект.

    Вот от сюда и начинай искать способы реализации.

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

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

    @rPman
    нужно открывать файл на запись с указанием прав на чтение, пример с FileStream
    Ответ написан
    Комментировать
  • Можно ли сделать неполную инициализацию массива в C#?

    @rPman
    arr[0] = new int[10]
    arr[0][1]=1;
    arr[0][8]=2;
    Ответ написан
    Комментировать
  • Как сделать графический интерфейс на Java, а логику на C#?

    @rPman
    Не нравится WFP, попробуй WinForms вдруг будет по душе?
    Java не лучшее место для создания UI, удобным я бы это не назвал

    Моста не будет, точнее любые средства создадут еще больше неудобств

    p.s. попробуй java mono
    Ответ написан
    Комментировать
  • Какие программы можно написать на C#?

    @rPman
    Мое мнение, написать можно но пользы как разработчику так и пользователям это не принесет.

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

    Скорость выполнения программ у .net сравнима с java, поэтому можете сравнить visual studio (написано похоже на си и c#) и к примеру eclipse (полностью на java), на последний я одно время слышал жалобы, типа кушает память, кушает проц как не в себя (я то как раз считаю eclipse лучшим проектом для подражания).

    Я к тому что рано или поздно придется критичные и важные вещи оптимизировать и уходить от managed кода в быстрый c/c++/компилируемый в нативный бинарник код
    Ответ написан
    2 комментария
  • Есть код для работы с браузером (использую Selenium), могу ли я открывать этот браузер внутри окна WinForms?

    @rPman
    Просто вариант, вдруг поможет: если что есть контрол WebBrowser (старый движок iexplorer11 trident) и теперь есть WebView2 для нового браузера на основе хромиум

    Да это не совсем то что нужно, но очень странно вместо того чтобы с браузером работать напрямую, дергать вызовы через прослойку
    Ответ написан