• Как пропускать через ShadowSocks также FTP, P2P и в целом все протоколы?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Во времена оны были программы-"соксификаторы", которые перехватывали трафик, идущий через socket API (т.е. - практически любой TCP/UDP) и заворачивали на socks-прокси. Я судьбой тех программ давно не интересовался, но беглый поиск дал мне наводку на то, что такой функциональностью из современных обладает некая ProxiFire (статья про нее на Хабре).
    Личные рекомендации дать не могу: используйте на свой страх и риск. Или ищите альтернативы, ключивое слово для поиска - "socksify": именно так называлось в упомянутые времена заворачивание трафика сокетов на SOCKS proxi на уровне системных библиотек или ниже.
    Ответ написан
    Комментировать
  • Полезность моделей памяти которые отличный от linear?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Идея, которая вам пришла в голову, известна давно, ее общепринятое название: "сегментная адресация памяти"
    Про такую схему адресации и ее использование в ОС для защиты памяти я, к примеру, читал в книге по ОС ранних 80-х годов.
    Во времена 16-битных микропроцессоров семейства x86 (8086-80286) и 16-битного ПО для них сегментная адресация памяти примнялась очень широко, сначала - потому что одного 16-битного адреса для адреса не хватало для адресации типичного объема памяти ПК, затем - и для разграничения доступа к памяти ОС и разных задач. Самое, наверное, известное ПО, использовавшее сегментную адресацию - это семейство Windows 3.x.
    С появлением микропроцессоров этого семейства с 32-битной адресацией (80386 и далее), сегментная адресация была почти вытеснена линейной (т.к. разрядности адреса стало хватать для адресации всей памяти). Почти - но не совсем: в частности инфраструтура структурной обработки исключений (SEH) Windows NT использовала, а нынешних версий Windows, как ее потомков, и сейчас использует сегментный регистр FS. В частности, поэтому аппаратная поддержка этого регистра сохранилась в каком-то виде и в архитектуре x86-64, которая в целом от сегментной адресации отказалась.
    Ответ написан
    Комментировать
  • Как должен быть путь для контроллера?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Если вы, как у вас написано, передаете название страны и города через путь в URL, то параметры метода Action для URL второго формата должен привязываться к переменной маршрутизации, примерно так:
    [HttpGet("{country}/{city}")]
    public IActionResult ActionMethod([FromRoute] String country, [FromRoute] String city) 
    {
      //... method code
    }

    [FromRoute] можно и не писать, если параметров запроса (то, что после '?' в URL) нет: привязка по умолчанию выберет следующим источником переменные маршрутизации.
    PS Можно обойтись одним методом действия (Action), если указать что city - параметр необязательный
    [HttpGet("{country}/{city?}")]
    public IActionResult ActionMethod([FromRoute] String country, [FromRoute] String? city) 
    {
     if(city==null) {
      //... method 1 code 
     }
     else {
      //... method 2 code 
     }
    }
    Ответ написан
    Комментировать
  • Как получить логи открытия папок/файлов в WinServer 2019/Win10?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Во-первых, включите в политике аудит доступа к файлам и папкам (в разделе аудита доступа к объектам). Во вторых, в свойстах папки (в окне по кнопке Дополнительно, на вкладке Аудит) добавьте пользователей и группы, чью активность вы собираетесь отслеживать. После этого записи аудита доступа (создание и открытие файлов и папок) будут писаться в журнал событий Безопасность.
    А вот как дальше обрабатывать их на python - это я вам не скажу.
    Ответ написан
    5 комментариев
  • Как вызвать поток дважды поочерёдно?

    @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 внутрь цикла. Кстати запомните этот прием: он обязательно пригодится вам при дальнейшей разработке костылей (правда следите при этом, чтобы цикл все-таки закончился, а то конфуз будет).
    Если же вы почему-то решили исправить ошибку, используйте, руководствуясь намеками из предыдущего ответа, правильные имена переменных.

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