Задать вопрос
  • Как я могу увидить те же папки на своем пк что и на android смартфоне?

    igolets
    @igolets
    Программист C#, MSSQL
    Я бы попробовал ещё команду adb shell.

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

    Если вдруг какое-то из них будет допускать отладку, то этой командой можно будет выполнять дальнейшие команды от имени приложения, тот же ls. И посмотреть структуру скрытых данных.
    Ответ написан
    Комментировать
  • Как можно получать или ссылаться на переменные с двойным подчеркиванием при помощи sub classov?

    igolets
    @igolets
    Программист C#, MSSQL
    Вот статья по теме: https://learn.microsoft.com/en-us/aspnet/core/fund... Раздел "Environment variables".
    Там есть пример, ссылка на код (на GitHub) и вызов
    set MyKey="My key from Environment"
    set Position__Title=Environment_Editor
    set Position__Name=Environment_Rick
    dotnet run


    Собственно, под капотом следующее (тут сборная солянка, из разных классов):
    // из public class Startup
            public void ConfigureServices(IServiceCollection services)
            {
                services. Configure<PositionOptions>(Configuration.GetSection(
                                                    PositionOptions.Position));
                services.AddRazorPages();
            }
    
    // из кода, который обращается к настройкам
        public class PositionOptions
        {
            public const string Position = "Position";
    
            public string Title { get; set; }
            public string Name { get; set; }
        }
    
            public Test2Model(IOptions<PositionOptions> options)
            {
                _options = options.Value;
            }
    
            public ContentResult OnGet()
            {
                return Content($"Title: {_options.Title} \n" +
                               $"Name: {_options. Name}");
            }

    Т.е. в Вашем случае нужно:
    1. сделать класс ApiConfig (по образцу PositionOptions из примера выше)
    2. в Startup вызвать services. Configure, передав данные класса ApiConfig
    3. в коде, который дожен работать с ApiConfig запросить в конструкторе IOptions<ApiConfig>


    Второй вариант доступа такой:
    var title = Configuration["Position:Title"];
                var name = Configuration["Position:Name"];
    Ответ написан
    1 комментарий
  • Выбор архитектуры: web или desktop?

    igolets
    @igolets
    Программист C#, MSSQL
    Я бы тут ещё попробовал ответить на следующие вопросы:
    1. Какие требования к срокам выпуска приложения?
    2. Как часто будет меняться приложение?
    3. Какой перечень клиентского оборудования и операционных систем? Будут ли это планшеты на iOs, например. Если только ноуты с одинаковой операционкой — то почему?
    4. Какая интеграция с десктопом потребуется? Например, запуск в режиме киоска (без элементов операционной системы), горячие клавиши, локальная БД, интенсивные вычисления, лимиты памяти, нестандартные элементы управления (джойстики и т.п.), внешние динамики/мигалки/дисплеи, контроль активности пользователя.
    5. Много ли экранных форм и насколько они разнообразны?
    6. Какой опыт у разработчи(ка/ков)


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

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

    Удачи!
    Ответ написан
    Комментировать
  • Как реализовать подписку юзеров на других?

    igolets
    @igolets
    Программист C#, MSSQL
    Это нужно погуглить по ключевым словам "entity framework many to many fluent".

    // к User добавить 
            // Subscribers
            public ICollection<UserSubscriptions> Subscribers { get; set; }
    
    // при конфигурировании датаконтекста использовать следующий fluent синтаксис
    modelBuilder.Entity<User>()
       .HasMany(u => u.Subscriptions)
       .WithMany(u => u.Subscribers)
       .Map(cs =>
       {
           cs.MapLeftKey("UserId");
           cs.MapRightKey("SubsUserId");
           cs.ToTable("UserSubscriptions");
       });
    Ответ написан
    Комментировать
  • Как ораганизовать репозиторий для команды?

    igolets
    @igolets
    Программист C#, MSSQL
    Тут важный вопрос. Общие части системы можно редактировать, или нет?

    Если нет — можно вынести их в отдельные репы, собирать из них nuget модули и публиковать в частном nuget репозитории.

    Если нужно редактировать и хочется заморочиться, то можно сделать следующее:

    1. Сделать репозитории для небольших подсистем
    2. Для каждого проекта сделать по репозиторию, составить список подсистем, которые в нём используются и
    3. В репозиторий проекта добавить подсистемы через https://git-scm.com/book/en/v2/Git-Tools-Submodules
    4. Добавить код, уникальный для проекта в виде отдельных папок в репозитории проекта.
    5. Постараться не запутаться во всём этом великолепии и не сломать друг другу работу.


    Ещё есть вариант отказаться от монолита, удариться в микросервисы. Тогда каждый кусок проекта будет независимым и можно будет его вынести в отдельную репу. Но тут может быть много работы по распилу монолита.
    Ответ написан
    1 комментарий
  • Как идентифицировать пользователя при подключении к умному дому для запуска сценариев?

    igolets
    @igolets
    Программист C#, MSSQL
    1. Да, в iOs есть такая функция, но её можно отключить для своей сети WiFi. В свойствах сети можно снять галочку "Частный адрес WiFi".
    2. У меня как минимум на двух маршрутизаторах после подключения макадрес не меняется и whitelist прекрасно работает и без отключения этой галки.
    3. Из обходных решений — на iOs есть "Команды", там можно настроить автоматический макрос, который будет срабатывать при подключении к домашней WiFi сети, можно создать автоматизацию, которая будет что-то дергать в системе умного дома. Логика получится немного размазанной, но с высокой гарантией.

    Полагаю, что на Андроид тоже должно что-то похожее быть.
    Ответ написан
    1 комментарий
  • Как запустить задачу меньше чем за 1 мс?

    igolets
    @igolets
    Программист C#, MSSQL
    Если есть задача запуска чего-то на настольном компе, то можно попробовать извернуться следующим образом:
    1. На C# написать прикладное ПО, которое взаимодействует с пользователем/БД/(нужное дописать)
    2. Через (например) USB/Serial port подключить плату с микроконтроллером
    3. На микроконтроллере (у него частота известна) запустить программу, которая, манипулируя NOPами, обеспечивает необходимые задержки. Точность, очевидно, будет очень высокая — половина такта процессора микроконтроллера (с учетом погрешности тактового генератора)
    4. Приложение на C# в нужные моменты посылает сигнал плате с микроконтроллером.


    В этом случае будут неизбежные задержки отправки сигнала плате из приложения на C# (по причинам, указанным выше), но сама плата будет выдавать гарантированную частоту. Человек задержки на стороне C# не заметит, а оборудование, которому шлёт сигналы микроконтроллер, будет получать комфортную частоту сигнала.

    Плату с микроконтроллером можно заменить на что-то, на чём запущена Realtime OS. Суть не сильно поменяется.
    Ответ написан
    Комментировать
  • Можете рекомендовать бесплатные ресурсы для изучение C#?

    igolets
    @igolets
    Программист C#, MSSQL
    1. Хорошо бы иметь базовое образование — знать, что такое алгоритмы и структуры данных. Знание другого языка программирования подойдет.
    2. На счёт книг — они по определению не бесплатны, кто-то вложил в них труд. Бесплатно — это либо читать документацию на сайте Microsoft, либо брать книгу у друзей/работодателя, или скачать украденное. Тут я рекламировать не буду, в принципе, для знакомства подойдет любая книга. Ещё есть ресурс https://docs.microsoft.com/ru-ru/learn/ (подробнее на https://habr.com/ru/company/microsoft/blog/426919/)
    3. Дальше нужно определиться с направлением работы (для чего нужен C#). Это может быть десктоп программирование, или веб, Azure и т.д. Тут могут потребоваться более специфичная литература. Я бы порекомендовал зайти на сайт https://docs.microsoft.com/en-us/certifications/browse/, выбрать интересующие направления и поискать (хотя бы и украденные) книжки по выбранным экзаменам, или MS Learn. Я как-то через сертификацию проходил, её преимущество в том, что дается довольно целостный и полный объем знаний. В том числе придется освоить темы, которые обычно пропускаешь, но которые могут быть важны для профессиональной разработки. Например, вопросы безопасности.
    Ответ написан
    Комментировать
  • Это оптимальный способ фильтрации записей из таблицы с помощью Entity Framework?

    igolets
    @igolets
    Программист C#, MSSQL
    Я как-то обычно пишу код чуть проще:
    var query = _dbContext.Products.AsQueryable();
                if (request.ProductGroups?.Length > 0)
                {
                    query = query.Where(x => request.ProductGroups.Any(y => y == x.ProductGroup));
                }
                if (request.SupplierIds?.Length > 0)
                {
                    query = query.Where(x => request.SupplierIds.Any(y => y == x.SupplierId));
                }
                if (request.Categories?.Length > 0)
                {
                    query = query.Where(x => request.Categories.Any( y => y == x.Category));
                }
    
    
                return Task.FromResult(_mapper.ProjectTo<ProductDto>(query));


    Общие замечания к коду:
    1. Есть ограничения по размеру запроса, если ProductGroups и Categories будут иметь длинные названия, могут быть исключения в рантайме
    2. Надо внимательно подумать на счёт ProductGroups и Categories и используемого движка БД — на предмет CaseSensitive и CaseInsensitive сравнений. Могут тоже быть приколы — когда запись из БД вернулась (там CaseInsensitive), а какой-то код на стороне C# не принял эту запись и упал (CaseSensitive).
    3. Соответственно, как предложение на подумать — нормализовать ProductGroups и Categories в отдельные таблицы ;)
    Ответ написан
    Комментировать
  • Как правильно спроектировать коммуникацию между серверами?

    igolets
    @igolets
    Программист C#, MSSQL
    На счёт «как эта область называется, и в какую сторону копать» — наиболее близкие по смыслу — это «Service oriented architecture» и «Event driven architecture». Подробно раскрывать не буду, почитайте на досуге.

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

    Касательно масштабирования — не очень понятно, какую часть вы пытаетесь масштабировать. Мое предположение — скорее скрытые сервера, которые, как я понял, делают какую-то нагруженную обработку. При наличии очереди сообщений вы можете делать произвольное количество серверов, которые вынимают задачу из очереди, обрабатывают и помечают задание как выполненное. Более того, если разворачивать решение на облачной платформе (любой), можно создать метрику, которая анализирует длину этой очереди и при её росте автоматически запускает новые инстансы (сервера) в «скрытой» зоне. А при уменьшении очереди так же автоматически их тушит, чтобы не тратить деньги.

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

    А если говорить о том, как делаются «промышленные» (не самопальные) системы такого рода, то тут будут следующие слои начиная от пользователя:
    1. Балансировщик нагрузки
    2. Веб-приложения (их может быть несколько, чтобы можно было, например, по одному отключать и обслуживать)
    3. Очередь сообщений
    4. База данных
    5. Сервера фоновой обработки


    Веб-приложения могут добавляться в пул по метрикам загрузки процессора и времени ответа.
    Сервера фоновой обработки могут добавляться в пул по метрикам длины очереди.
    Ответ написан
    Комментировать
  • Запросы HTTPS между ASP.NET Core 6 и React?

    igolets
    @igolets
    Программист C#, MSSQL
    Если приложение для широкой аудитории, то нет, нельзя. Браузер клиента будет видеть этот сертификат как не доверенный и будет блокировать запросы. В зависимости от того, где размещается приложение, нужно смотреть, какие есть возможности по покупке своего https сертификата. Для собственного хостинга можно использовать letsencrypt, для разных облаков нужно смотреть в их документации. Вот, например, на Яндекс Облаке.

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

    igolets
    @igolets
    Программист C#, MSSQL
    1. Deel
    2. Тут, вроде, точка недавно опубликовала инфу, что они сделали промокашку для UpWork
    Ответ написан
    6 комментариев
  • Как изменить дочерние значения в GroupBox?

    igolets
    @igolets
    Программист C#, MSSQL
    Label label1 — локальная переменная метода. Нужно её сделать полем класса и не создавать заново, если уже значение задано.

    void change(string first, string second, string third)
            {
                if(label1 == null)
                {
                    label1 = new Label();
                    groupBox1.Controls.Add(label1);
                }
                label1.Text = questions[current];
            }
    private Label label1 = null;
    Ответ написан
    Комментировать
  • Как пропарсить XML документ C#?

    igolets
    @igolets
    Программист C#, MSSQL
    Как я обычно с таким борюсь.

    1. Сделать (или взять у поставщика XML данных) файл со схемой XSD

    2. Из XSD сделать файл C# командами:
    xsd SourceFormat.xsd /c /n:NameSpace /o:tmp
    cd tmp
    ren SourceFormat.cs     SourceFormat.designer.cs
    move /y SourceFormat.designer.cs ..
    cd ..
    rd /s/q tmp


    (кратко что тут происходит — создается .cs файл в каталоге tmp, чтобы при ошибках не затереть исходник, потом .cs переименовываем в .designer.cs и помещаем в основной каталог)

    3. Оба файла (xsd и .designer.cs) можно добавить в проект, красиво отобразить второй как вложенный в первый

    4. Использовать упомянутый XmlSerializer для записи
    var serializer = new XmlSerializer ( typeof ( nmaprun ) );
                    using ( var writer = new StreamWriter ( xmlFileName ) ) )
                    {
                        serializer.Serialize ( writer, item );
                        writer.Close ();
                    }


    и для чтения

    using ( var temp = new StringReader ( xmlText ) )
                        {
                            var tmp = serializer.Deserialize ( temp );
                            return ( nmaprun ) tmp;
                        }
    Ответ написан
  • Как использовать в одном проекте разные версии nuget пакетов?

    igolets
    @igolets
    Программист C#, MSSQL
    Привет. По-хорошему, лучше сделать два проекта, запустить их в параллели и каким-то образом (через модный MessageBus, или каким-нибудь RESTful запросом) дергать второй процесс из первого.

    Но если очень хочется влоб, то могу посоветовать разве что покопать вот эту штуку: https://docs.microsoft.com/ru-ru/dotnet/api/system...
    Ещё важно будет учесть, что тут загружаемая ассембли грузится в домен приложения. Если в этом домене уже загружена та же ассембли другой версии могут быть накладки. Поэтому хорошо бы ещё поизучать тему доменов, вот тут, например https://docs.microsoft.com/ru-ru/dotnet/framework/...
    Я сам тему предметно не копал, изучал только в ходе подготовки к экзамену, но как я это понял, суть будет почти та же, что и первый вариант — по сути, из основного кода запускается второй поток в другом домене. Разница только в том, что можно попробовать сделать одно приложение, которое в себе содержит второе и умеет его запускать.
    Ответ написан
  • Как обновлять не создавая связанные данные добавляемой сущности при соединении ManyToMany (EF CORE 5)?

    igolets
    @igolets
    Программист C#, MSSQL
    Боюсь, придется сбегать в БД и получить объекты БД для тех тэгов, которые уже есть в базе. Либо сохранять через хранимку и в ней уже проверять, есть такой тэг в базе, или нет.
    Ответ написан
    Комментировать
  • Обработать поток байт от USB CDC C#?

    igolets
    @igolets
    Программист C#, MSSQL
    1. Хорошо бы код, который работает с оборудованием (читает данные) вынести в отдельный класс и сделать под него интерфейс. Для чего нужно — если нужно будет разделить работу "железячника" и программиста интерфейса, второму можно будет дать возможность запускать программу с "заглушкой", чтобы он пилил интерфейс без доступа к железу. Ну, или для демонстрации программы запустить без доступа к железу.
    2. Соответственно, По событию на форме (старт/стоп) вызываются некие методы класса работы с железом и происходит получение/накопление данных. В зависимости от логики этого класса вызываются события (по получении байта, или полного пакета)
    3. По событию (код формы навесил обработчики событий при инициализации кода, работающего с железом) форма уже обращается к экземпляру класса, который работает с железом и получает от него данные (скорее всего, в сыром бинарном виде) и что-то с ними делает. Например, преобразует в класс-модельку, которая добавляется в биндингсорс (List), который используется как DataSource для ListView
    4. Код трансляции бинарных данных в модельку лучше тоже в отдельный класс вынести. Могу предположить, что могут быть разные формы представления данных.


    Вкратце так.

    Ну, а код класса имитации будет имитировать работу настоящего класса, вызывать нужные события и отдавать заранее записанные данные, или генерить по какому-то алгоритму. Переключение между заглушкой и настоящим классом реализуется, например, при помощи Dependency Injection, для C# можно использовать что-то типа https://habr.com/ru/post/50845/. В конфиг-файле прописывается, какой класс используется и всё, один и тот же код в рантайме использует разные классы. Лично я, например, так реализую работу с Фискальными аппаратами и терминалами оплаты пластиковыми картами.
    Ответ написан
    Комментировать
  • Какие есть качественные голосовые читалки?

    igolets
    @igolets
    Программист C#, MSSQL
    Недавно Яндекс выкатил интересное демо своей технологии TTS (https://yandex.ru/promo/browser/video_translation/m/03), мне озвучка очень понравилась. Планирую в отпуске поиграться, попробовать озвучивать книги.
    Ответ написан
  • Как сделать личный кабинет для user?

    igolets
    @igolets
    Программист C#, MSSQL
    Учитывая, что нет указания на язык разработки, попробую уточнить предыдущий ответ в максимально абстрактных терминах.

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

    Чуть менее "в лоб", но более правильно делать так:
    В коде определяются разделы сайта, которые доступны разным ролям, например, выделяется админский раздел, куда можно только админам. Как в неуказанном языке это делается не знаю, в C# — контроллерами и атрибутами доступа. Дальше средствами языка/среды выполнения проверяется, есть ли у юсера указанная роль и выдается/не выдается доступ. А дальше в админском разделе находится набор админской логики. Например, можно всё видеть, удалять и т.п.
    Ответ написан
    Комментировать