• Как вызвать поток дважды поочерёдно?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Поток повторно запустить нельзя. После th1.join() (этот вызов дожидается завершения потока) cоздайте новый поток, присвойте его нужной переменой - да хоть той же th1 - и запустите его: будет функциональный аналог Task.ContinueWith(). Или же запустите th2, который у вас уже создан, но не запущен.
    Если вы хотите сделать два вызова Print в одном потоке - сделайте. Если между первым и вторым вызовом надо выполнить какой-нибудь код в основном потоке, то придется использовать объекты синхронизации, в данном случае - события, и ждать на них. Про это курите тему ManualResetEvent/AutoResetEvent, в двух словах в ответе всю эту тему не объяснить
    Ответ написан
    Комментировать
  • Не пингуется домен?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    1. Изменения в зону .ru на серверах RIPN (он за зону .ru отвечает) вносятся с задержкой, так что, возможно, придется подождать (сколько это сейчас - не знаю)
    2. Когда ждать надоест - займитесь диагностикой, с помощью команды nslookup. Полезны два ее варианта
    nslookup имя_DNS имя_DNS_сервера - чтобы получить адрес IP для имя_DNS или ссылку на сервер, который вам его должен вернуть и nslookup type=NS имя_DNS _зоны имя_DNS_сервера - чтобы посмотреть список имен серверов, ответсвенных за зону имя_DNS _зоны (зона DNS - это старшая, т.е. правая, часть имени DNS). Вот и смотрите, что там у вас по дороге от серверов RIPN, отвечающих за зону ru (a.dns.ripn.net - f.dns.ripn.net) до имени вашего сервера делается.
    3. Если не терпится работать с сервером и сайтом прямо немедленно - добавьте соответствие IP и имени DNS сайта в файл hosts на копьютере, откуда будете работать. Только потом, когда с DNS всё устаканится, стоит его оттуда убрать - чтобы через пару лет не гадать, чего это вдруг на этом компьютере сайт по новому IP недоступен.
    Ответ написан
    1 комментарий
  • Где ошибка, как из рекурсии цикл сделать?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    //...declarations and initializations omitted
               do
               {
                   //...some code omitted
                   if (j != i)
                   {
                       swap(i, j);
                       i = j; 
                   }
               } while (j != i);

    Не работает, потому что вы сначала присваете j значение i, если они не равны, а потом, в условии продолжения цикла, сравниваете их значения. Естественно, они будут равны и выход их цикла получится на первой же итерации. Проверять i==j как условие выхода из цикла надо чуть раньше, например, так:
    //...declarations and initializations omitted
               do
               {
                   //...some code omitted
                   if (j != i)
                   {
                       swap(i, j);
                       i = j; 
                   }
                   else break;
               } while (true);


    Ну, а что до второго вопроса, то в .NET, начиная с 6.0 есть класс System.Collections.Generic.PriorityQueue<TElement,...
    Ответ написан
    6 комментариев
  • Какой должна быть архитектура веб-сервиса работающего одновременно с мобильным приложением и с браузером?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    1. Сразу насчет микросервисов: оно, конечно, стильно-модно-модожежно, но для начала ознакомьтесь со свежим переводом недавней статьи на Хабре "Смерть от тысячи микросервисов" и задумайтесь: а у вас там точно требуется такой уровень гибкости, масштабирования и т.п., что без микросервисов никак. Задуматься стоит IMHO - выбор неоднозначный, и за вас его никто не сделает.
    2. Если вы знакомы с MVC и кго контроллерами, то вам будет несложно писать контролеры API на ASP.NET Core в старом добром стиле: традиционно они тоже базируются на инфраструктуре MVC. Там почти та же логика привязки параметров: ну, разве что, там стало автоматическим преобразование объектов на JSON из тела запроса в параметр-объект, но, вроде бы, можно использовать и старый стиль с несколькими параметрами с привязкой их одноименным свойствам объекта. Там используется та же самая маршрутизация по атрибутам - она должна быть вам знакома, если только вы не застряли в legacy времен MVC Framework 4, где была только центральная маршрутизация. Ну а возвращаемые объекты ASP.NET Core сам автоматически преобразует в JSON.
    Правда, начиная с ASP.NET 6 появился (а начиная с ASP.NET 7 стал нормально документированым) альтернативный вариант создания API - Minimal API, но раз у вас есть опыт работы с MVC, то наверное, вам лучше остаться с этим старым добрым вариантом.
    Насчет формата обмена - вызовов и результатов API - у вас полная свобода, но имейте в виду, что при использовании REST вы получите автоматизированню поддержку описания этих форматов через OpenAPI/Swagger: фронтовики с мобильщиками это оценят.
    Делать ли генерацию HTML для браузера на веб-сервере через View по шаблонам Razor или же поручить эту работу фронтовикам, снабжая их данными через API - это предмет выбора, это зависит: как там у вас с квалификацией фронтовых разработчиков, как с требованиями к интерактивности страницы в браузере (MVC этому не способствует, костыли для подключения фронтовых фреймворков у MS, вроде как, есть, но я за них ничего не скажу - не пользовался), не придется ли по соображениям производительности переходить к Server Side Rendering (View - они как раз про это, а если изначально HTML генирился на фронте то перенести его в ASP.NET будет сложно) и т.п.
    Авторизацация в ASP.NET Core есть из коробки, самых разных видов: часть уже встроена, для части придется подключать сторонние NuGet-пакеты, но подробности я вам тут не опишу.
    А в общем совет у меня такой: собирайте информацию и думайте сами, а попытки копировать "как у других" - они могут привести к совершенно неожиданным результатам: каждая задача в чем-то уникальна.
    Ответ написан
    Комментировать
  • Как пройтись циклом по результирующим данным функции?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Естественно не можете, потому что ServiceResult у вас IEnumerable не реализует (про это написано в сообщении об ошибке). А IEnumerable, по которому можно пройтись - это параметр-тип для ServiceResult, и до значения этого типа еще надо добраться.
    Разберитесь, что это у вас за обобщенный тип - ServiceResult (похоже, это из какой-то сторонней библиотеки), найдите в нем свойство типа T (или метод, возвращающий T) - который тип T в вашем случае - это IEnumerable - и пройдитесь циклом foreach по значению этого свойства (или результату, возвращенному методом).
    PS Если не найдете - дайте больше информации по используемым библиотекам (пакетам NuGet и т.п.), иначе придется вам ждать телепатов или ясновидящих, чтобы они эту информацию нам передали.
    Ответ написан
    Комментировать
  • Есть ли смысл завершать задачи генерируя ошибку(token.ThrowIfCancellationRequested()) если есть спобос получше?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Во-первых, ваш заголовок вводит в заплуждение: в нем - про завершение процесса, а справшиваете вы про завешение задачи.
    Во-вторых, задача может завершаться переходом в разные конечные состояния (они фиксируются в поле Task.Status). По оператору Return задача переходит в состояние RanToCompletion, по ThrowIfCancelationRequested - Canceled. Это - два логически разных состояния завершения (есть еще и третье - завершение по необработанному исключению, Faulted). Если коду, создаывшему задачу, совсем без разницы, как именно завершилась задача и вообще, завершилась ли она, то можете делать как угодно.
    Но, очень часто код, связанной с задачей,к примеру, операция await для задачи, ведет себя по-разному, в зависимости от состояния завершения задачи, получение результата задачи - тоже. А для задачи продолжения можно задать условия, при каком состоянии завершения предыдущей задачи эта задача продолжения будет запущена. То есть, состояние завершения задачи обычно имеет значение.
    Ответ написан
    Комментировать
  • Как кликнуть по ID элемнета?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    1. Элемент с нужным id ищется через document.getElementById(id)
    2. Затем внутри этого элемента ищите элемент с нужным классом (через querySelector, к примеру, есть и другие варианты) и кликаете на него.
    Короче, если безо всяких проверок, как-то так:
    document.getElementById('send-present-friend-593199183122')
       .querySelector('.async-gift-sending_send-button.friend-card_send-present-button')
       .click();
    Ответ написан
  • Почему прекращается работа BackgroundService?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Работа фонового сервиса у вас прекращается потому что у его метод ExecuteAsync дожидается инициализации статической переменной WebView (она содержит ChromiumWebBrowser, открытый на странице https://web.watsapp.com) а потом ничего не ждет, а просто завершается. А что там у вас происходит с браузером, код вашего фонового сервиса не контролирует.
    PS Я не вижу ваш остальной код, но могу предположить, что вам для работы программы этот фоновый сервис не нужен, т.к. вся работа с экземпляром CefSharp идет через упомянутую статическую переменную.
    Ответ написан
    3 комментария
  • Как удалить папку перемещаемого профиля?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Помимо разрешений на папку:
    1. Убедитесь, что папка и файлы внутри нее не открыты по сети (в узле "Общие папки\Открытые файлы"в консоли управления компьютером, например).
    2. Убедитесь, что у вас есть разрешения на удаление всех подпапкох и файлов на все подпапки внутри этой папки (имейте в виду, что наследуемые разрешения могут и не примениться, т.к. разрешения хранятся для кажого файла или папки отдельно).
    Ответ написан
    Комментировать
  • Почему DHCP offer не генерируется на сервере?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Чтобы понять причину, смотрите в Wireshark, что за IP адрес содержится в пересланном пакете DHCPDISCOVER в поле "Relay agent IP Address" (giaddr, если нужно название по спецификации, находится прямо перед MAC клиента). Чтобы все работало, этот адрес должен попадать в одну из областей (scope), определенных на сервере по адресу/маске обласьт - тогда адрес клиенту будет предложен (DHCPOFFER) из этой области.
    Вот и смотрите, что за адрес приходит, есть ли у вас область с адресом/маской, под которые этот адрес попадает, активирована ли эта область и т.д.
    О результате пишите в комментарии.
    Ответ написан
    Комментировать
  • Слетела авторизация всех сетевых ресурсов. Что делать?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Скорее всего, у вас что-то не так с разрешением имен в IP. Проверяйте (ping в помощь)
    Ответ написан
    2 комментария
  • Название реального сайта организации и название домена active directory совпадает и сайт не открывается в домене?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Отключить регистрацию записи A для имени домена на всех КД и добавить вручную запись, указывающую на ве-сайт. Для этого В политике, применяемой к контроллерам домена (Default Domain Controller Policy) в разделе Administrative Templates/Netlogon/DC Locator DNS Records включите политику "Specify DC Locator DNS records not registered by ... и добавьте в нее мнемонику LdapIpAddress.

    Есть альтернатива: установить на всех КД обратный прокси для имени домена, проксирующий запросы на веб-сайт: например IIS+ARR (Application Request Routing).

    Переименовывать домен AD, как тут советуют вsыше, из-за такой мелочи не стоит IMHO
    Ответ написан
    2 комментария
  • Как сменить сервер времени через GP у доменного пользователя?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Начать надо с того, что сервер времени - это часть конфигурации компьютера, а не пользователя (кстати, это видно на картинке по вашей ссылке). Поэтому посмотрите результат применения политик (RSOP) к компьютеру, для этого результат лучше всего вывести в файл: gpresult /scope computer /h файл.htm
    Ответ написан
    Комментировать
  • Как разбить URL на сегменты и найти его соответсвующее имя?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    В .NET есть стандартный класс System.Uri
    Посмотрите, может вам хватит его возможностей?
    Ответ написан
    Комментировать
  • Как по другому сделать?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Вынесите описания переменных наверх, над swicth.
    int PlayerDamage ;
    int PlayerHealth;
    int PlayerResist ;
    
     switch(characterChoose)
     {
         case 0:
             PlayerDamage = 50;
             PlayerHealth = 150;
             PlayerResist = 25;
             break;
         case 1:
             PlayerDamage = 75;
             PlayerHealth = 125;
             PlayerResist = 15;
             break;
    
     }

    PS Согласен с предыдущим комментатором - инциализация через оператор switch выглядит тяжеловесно. В нынешнем C# можно записать то же самое сильно короче, через деконструкцию, например.
    PPS Держите пример с вашеми данными, как это должно выгдядеть стильно-модно-молодежно:
    int characterChoose = Convert.ToInt32(Console.ReadLine());
    (int PlayerDamage, int PlayerHealth , int PlayerResist)=characterChoose switch
    {
        0 => (50, 150, 25),
        1 => (75, 125, 15),
       //... дописать все остальные варианты
    } ;
    Ответ написан
    Комментировать
  • Как правильно сделать асинхронный генератор с неявным кол-вом выполнения?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Я долго думал над предыдущем ответом и понял почему вы его не пометили - при том, что он таки является ответом (и это очевидно: в нем кристалльно прозрачно (если конечно как следует подумать) сказано, что вы пытаетесь использовать неинициализованные переменные в операции деления внутри опреатора console.log, который у вас следует после yield).
    А подумав, я все же решил удовлетворить свою страсть к графомансву и разъяснить вам, почему смысл предыдущего ответа ответ столь очевиден - если хорошо и долго думать, естественно. Но если вам это и так явно, или вы уже все поправили, или для вас в этом разъяснении сликом много букв, то не читайте далше, а просто отметьте предыущий.

    Но раз уж вы до сюда читать дошли, продолжу. Как уже сказано в предыдущем ответе, имена этих неопределенных переменных - _page и _pages. И да, для JS это(внезапно) - уже другие переменные, нежели page и pages, которым вы что-то там присваиваете: в JS встроен слишком слабый AI, чтобы понять, что это - одно и то же, а символы подчеркивания надо игнорировать.
    Это переменным page и pages (без подчеркивания), а не _page и _pages вы таки присваиваете значения, хоть и немного поздновато: данные рассчитанные из этих значений, если бы у JS хватило ума догадаться, как должно быть, были бы выведены на консоль при следующем проходе цикла - что обязательно сбило бы вас с толку, если бы вы когда-нибудь обратили бы внимание на вывод в консоли - потому что данные относились бы не к тому циклу. Но так или иначе, если бы AI JS был получше (или вы бы использовали правильные имена переменных), то код бы в целом работал столько раз, сколько надо(хоть и вывел бы на консоль нечто страннное, впрочем, это уже фигня, да?).
    А так, из-за слабости AI JS, один-то раз у вас yield выполняется, потому что он все же до console.log. Но вот дальше из-за использования неинициализованных переменных будет выброшена ошибка. Да, эту ошибку ваш код успешно перехватывает и давит, но - уже вне цикла. И все - цикл завершен, и генератор с чистой совестью завершает свою работу.
    Ошибка же, в рамках моего скромного понимания, там должна там быть какой-то на тему работы с NaN (значение неинециализованной переменной - undefined - при преобразовании в число дает именно NaN). Мне это проверять лень (и вообще я программист ненастоящий), но вы, если вам это было бы любопытно, могли бы даже увидеть и тип, и сообщение об ошибке, если бы вместо того, чтобы давить ошибку с выводом неинформативного текста, вывели бы свойства name и message объекта ошибки (error.name и error.message в вашем случае). Этот совет - он, конечно, на случай, что вы желаете понимать, что там за ошибка. Но, может, вам надо просто убрать ее от юзера с глаз долой, чтобы не мозолила глаза -тогда указанные свойства выводить, конечно, незачем.
    Как это имеющееся положение поправить - это я вам не решусь советовать, не зная точно ваших намерений. Если вы хотите, как часто это делается в реальной разработке, замести ошибку под ковер, чтобы не оствечивала (что логично, если вам надо это заставить код работать хоть как-то) чтобы выполнить yield должное количество раз - просто перенесите оператор try/catch внутрь цикла. Кстати запомните этот прием: он обязательно пригодится вам при дальнейшей разработке костылей (правда следите при этом, чтобы цикл все-таки закончился, а то конфуз будет).
    Если же вы почему-то решили исправить ошибку, используйте, руководствуясь намеками из предыдущего ответа, правильные имена переменных.

    И обязательно пометьте предыдущий ответ: его автор нашел ошибку, о которой он аккуратно вам намекнул, раньше чем я даже просто прочитал ваш вопрос.
    Ответ написан
    Комментировать
  • Как применить настройки прокси-сервера через реестр в С#?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Браузеру надо сообщить, что настройки изменились парой вызовов процедуры InternetSetOption из WinInet.dll. Вызывать надо через P/Invoke На stackoverflow нашел пример, как это делать в Powershell.
    function Refresh-System
    {
      $signature = @'
    [DllImport("wininet.dll", SetLastError = true, CharSet=CharSet.Auto)]
    public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength);
    '@
    
    $INTERNET_OPTION_SETTINGS_CHANGED   = 39
    $INTERNET_OPTION_REFRESH            = 37
    $type = Add-Type -MemberDefinition $signature -Name wininet -Namespace pinvoke -PassThru
    $a = $type::InternetSetOption(0, $INTERNET_OPTION_SETTINGS_CHANGED, 0, 0)
    $b = $type::InternetSetOption(0, $INTERNET_OPTION_REFRESH, 0, 0)
    return $a -and $b
    }

    Адаптируйте этот код к C# (пояснение: Add-Type в PS служит для загрузки сборки или неуправляемой DLL ). Или поищите по имени этой процедуры код на C#.
    Ответ написан
    5 комментариев
  • Почему импортированные функции не видят других импортированных функций?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Потому что у кажого импортированного модуля - своя область видимости переменных.
    Импортируйте getPageTitle в getHeader . А если же getPageTitle отдельно не используется, можете его реэкспортировать из getHeader, а в основном скрипте не импортировать вообще.
    Ответ написан
    Комментировать
  • Как в NTFS дать права на запись без права чтение и отображение?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    В разрешениях на папку (вкладка Security свойств, кнопка Advanced) установить разрешение "создать папку" для Authenticated users с областью действия только для этой папки и разрешение Full control (или Write, если не хотите, чтобы они там сами права раздавали) для CREATOR OWNER.
    Чтобы папки не могли видеть те, кому тутда доступа нет - включить Access based enumeration на вкладе Share ее свойств.
    Ответ написан
    Комментировать
  • Как определить принадлежность точки к плоскости?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    У вас нет проверки условий для диагональных границ области: y<=x при x<=1 и abs(y)<=x-1 при x>=1. Добавляйте, проверяйте и сдавайте решение.
    Ответ написан
    1 комментарий