• Как связать Apple pay и сбербанк?

    PankovAlxndr
    @PankovAlxndr Автор вопроса
    Fullstack web developer
    Решено, проблема в сбербанке: у них есть старая версия ЛК, просите поддержку открыть вам доступ к старому интерфейсу, в нем создаете все ключи и настраивайте согласно инструкции все заново и тогда начинает работать, после этого просите перевести вас обратно на новую (текущую) версия личного кабинета (ЛК).

    из нового ЛК ключи выгружаются "криво" как сказал сбербанк.
    Ответ написан
    2 комментария
  • Как сделать цикл на основе ответа на Web запрос в C#?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Данный пример хорош тем, что ты можешь очень быстро создать ещё хоть 10 разных методов для обращения к API сервера. Часть кода была взята со справки майкрософта, частично модифицирована (где XML комментарии на английском).

    HttpClientExample.csproj
    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp3.1</TargetFramework>
      </PropertyGroup>
    
      <ItemGroup>
        <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
      </ItemGroup>
    
    </Project>


    Точка входа в приложение и основной алгоритм по получению данных в цикле.
    Program.cs
    using System;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace HttpClientExample
    {
        class Program
        {
            // В качестве исключения я расположил в самом верху класса метод Main, 
            // обычно здесь должны быть поля класса, а все методы ниже.
            #region Entry point
    
            static async Task Main(string[] args)
            {
                var program = new Program();
                await program.Run(args);
            }
    
            #endregion
    
            private readonly SomeClient _client;
    
            public Program()
            {
                _client = new SomeClient("http://localhost:5000");
            }
    
            private async Task Run(string[] args)
            {
                bool success = false;
                do
                {
                    try
                    {
                        // CancellationToken пригодится в приложениях с UI, где нужно, например, 
                        // закрыть окно или уйти со страницы не дожидаясь, пока запрос отработает. 
                        // Здесь заранее это заложено, можно и не использовать, если приложение консольное.
                        string data = await _client.GetData(CancellationToken.None);
                        success = true;
    
                        Console.WriteLine(data);
                    }
                    catch (ApiException ex)
                    {
                        // Одна реакция
                        Console.WriteLine(ex);
                        Console.WriteLine();
                    }
                    catch (Exception ex)
                    {
                        // Другая реакция
                        Console.WriteLine(ex);
                        Console.WriteLine();
                    }
    
                    await Task.Delay(150);
                } while (!success);
    
                _client.Dispose();
            }
        }
    }


    SomeClient.cs
    using System;
    using System.Collections.Generic;
    using System.Net;
    using System.Net.Http;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using Newtonsoft.Json;
    
    namespace HttpClientExample
    {
        public class SomeClient : IDisposable
        {
            private const string GET_TEXT_PART = "/api/system/get-text";
            private const string GET_USER_PART = "/api/system/get-user";
    
            private HttpClient _httpClient;
    
            public Dictionary<string, string> DefaultHeaders { get; }
    
            public SomeClient(string baseAddress)
            {
                var httpHandler = new HttpClientHandler
                {
                    AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip
                };
    
                _httpClient = new HttpClient(httpHandler)
                {
                    BaseAddress = new Uri(baseAddress)
                };
    
                DefaultHeaders = new Dictionary<string, string>
                {
                    ["Accept"] = "*/*",
                    ["Accept-Encoding"] = "gzip, deflate",
                    ["Cache-Control"] = "no-cache",
                    ["Connection"] = "keep-alive",
                };
            }
    
            public void Dispose()
            {
                if (_httpClient != null)
                {
                    _httpClient.Dispose();
                    _httpClient = null;
                    GC.SuppressFinalize(this);
                }
            }
    
            public async Task<string> GetData(CancellationToken cancellationToken)
            {
                string text = await InvokeText(HttpMethod.Get, GET_TEXT_PART, cancellationToken);
                // Возможно, что-то залогировал.
                return text;
            }
    
            public async Task<User> GetUser(CancellationToken cancellationToken)
            {
                var user = await InvokeJson<User>(HttpMethod.Get, GET_USER_PART, cancellationToken);
                // Возможно, что-то залогировал.
                return user;
            }
    
            /// <summary>
            /// Sets the request.
            /// </summary>
            /// <param name="request">The request.</param>
            /// <param name="requestContent">Content of the request.</param>
            private void SetRequest(HttpRequestMessage request, object requestContent)
            {
                foreach (var header in DefaultHeaders)
                {
                    request.Headers.Add(header.Key, header.Value);
                }
    
                if (requestContent != null)
                {
                    request.Content = new StringContent(JsonConvert.SerializeObject(requestContent),
                        Encoding.UTF8,
                        Constants.HttpMimeTypes.JsonContentType);
                }
            }
    
            /// <summary>
            /// Invokes the specified HTTP method.
            /// </summary>
            /// <param name="httpMethod">The HTTP method.</param>
            /// <param name="relativeUrl">The relative URL.</param>
            /// <param name="cancellationToken">Cancellation token.</param>
            /// <param name="requestContent">Content of the request.</param>
            /// <returns>instance of the type T</returns>
            /// <exception cref="ApiException"></exception>
            private async Task<string> InvokeText(HttpMethod httpMethod, string relativeUrl, CancellationToken cancellationToken, object requestContent = null)
            {
                using (var request = new HttpRequestMessage(httpMethod, relativeUrl))
                {
                    SetRequest(request, requestContent);
    
                    using (HttpResponseMessage response = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseContentRead, cancellationToken))
                    {
                        string responseText = await response.Content.ReadAsStringAsync();
                        if (response.IsSuccessStatusCode)
                        {
                            return responseText;
                        }
    
                        throw new ApiException(response.StatusCode, responseText);
                    }
                }
            }
    
            /// <summary>
            /// Invokes the specified HTTP method.
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="httpMethod">The HTTP method.</param>
            /// <param name="relativeUrl">The relative URL.</param>
            /// <param name="cancellationToken">Cancellation token.</param>
            /// <param name="requestContent">Content of the request.</param>
            /// <returns>instance of the type T</returns>
            /// <exception cref="ApiException"></exception>
            private async Task<T> InvokeJson<T>(HttpMethod httpMethod, string relativeUrl, CancellationToken cancellationToken, object requestContent = null)
            {
                using (var request = new HttpRequestMessage(httpMethod, relativeUrl))
                {
                    SetRequest(request, requestContent);
    
                    using (HttpResponseMessage response = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseContentRead, cancellationToken))
                    {
                        string responseText = await response.Content.ReadAsStringAsync();
                        if (response.IsSuccessStatusCode)
                        {
                            var resource = JsonConvert.DeserializeObject<T>(responseText);
                            return resource;
                        }
    
                        throw new ApiException(response.StatusCode, responseText);
                    }
                }
            }
    
            private static class Constants
            {
                public static class HttpMimeTypes
                {
                    /// <summary>
                    /// The json content type
                    /// </summary>
                    public const string JsonContentType = "application/json";
                }
            }
        }
    }


    Этот класс используется просто для примера, как преобразовать JSON, полученный от сервера в экземпляр класса
    User.cs
    using Newtonsoft.Json;
    
    namespace HttpClientExample
    {
        public class User
        {
            [JsonProperty("id", Required = Required.Always)]
            public long Id { get; set; }
    
            [JsonProperty("name", Required = Required.Always)]
            public string Name { get; set; }
        }
    }


    async await, чтобы было примепрное понимание, что происходит.
    Скриншот сделан с видео: https://youtu.be/lh8cT6qI-nA?t=1123
    5fb13cbe569ab013358287.jpeg
    Ответ написан
    Комментировать
  • Как работает .NET?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Когда вы нажимаете "зелёную кнопку" происходит следующее:
    1. Visual studio вызывает .NET SDK
    2. .NET SDK вызывает msbuild
    3. msbuild в определённый момент вызывает csc.exe (C# Compiler)
    4. csc.exe генерирует IL (aka MSIL, aka CIL) и заталкивает его в DLL-ки
    5. ^---- Это происходит при сборке проекта
    6. <-- В этот момент на .net framework можно было натравить Ngen и пропустить чать JIT-компиляции
    7. V---- А это при каждом запуске
    8. Затем .NET Runtime берёт эти сборки и передаёт IL-код JIT-компилятору
    9. Пока JIT в фоне компилирует IL в машинный код - рантайм интерпретирует IL
    10. Когда IL скомпилировался - рантайм берёт сгенерированный машинный код
    11. При этом в фоне JIT может собирать информацию о том, какие методы чаще вызываются, чтобы ещё их оптимизировать.


    Ещё во время сборки проекта можно предварительно натравить JIT на код.
    При запуске это позволит пропустить этап с интерпретацией и сразу запустить исполняемый код.
    Эта фича называется ReadyToRun Compilation

    Тут в одном из ответов посоветовали CLR via C# - я считаю, что это уже не самая актуальная книга, тк в .NET Core многое поменялось / дополнилось и могут отличаться нюансы.

    Если хотите подробнее узнать про JIT - начните с этого доклада:
    https://www.youtube.com/watch?v=H1ksFnLjLoY
    Ответ написан
    Комментировать
  • Что не так с UC?

    mscrack
    @mscrack Автор вопроса
    В общем добавил в UC <?xml version="1.0" encoding="windows-1251"?> и все заработало. Странно, если кто сталкивался и решил эту проблему по другому напишите
    Ответ написан
    Комментировать
  • Как правильно реализовать информирование ViewModel'и по MVVM?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Читай комментарии в коде, в том числе зачем там lock. Вдруг ты будешь использовать такой поиск с отменой не в UI потоке (не именно этот код, а саму логику).

    Models/SearchAlgorithm.cs
    using System;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace EventsInModel.Models
    {
        public class SearchAlgorithm
        {
            public string CurrentFolder { get; private set; }
    
            public event EventHandler ProgressChanged;
    
            public async Task Search(CancellationToken cancellationToken)
            {
                for (int i = 0; i < 5; i++)
                {
                    await Task.Delay(1200, cancellationToken);
    
                    cancellationToken.ThrowIfCancellationRequested();
    
                    // Можно прогресс передавать и в качестве аргумента события,
                    // но в данном случае, вряд ли это оправдано. Обработав событие можно получить
                    // доступ к отправителю события и прочитать его свойства.
                    CurrentFolder = i.ToString();
                    ProgressChanged?.Invoke(this, EventArgs.Empty);
                }
            }
        }
    }


    ViewModels/MainViewModel.cs
    using System;
    using System.Threading;
    using System.Windows.Input;
    using EventsInModel.Models;
    using GalaSoft.MvvmLight;
    using GalaSoft.MvvmLight.Command;
    
    namespace EventsInModel.ViewModels
    {
        // ViewModelBase из библиотеки MvvmLight
        public class MainViewModel : ViewModelBase
        {
            //private readonly object _sync = new object();
            private readonly SearchAlgorithm _search;
    
            private string _currentFolder;
            // Логику с отменой можно вынести в отдельный класс, чтобы не писать простыню
            // с отменой в каждом таком месте с операцией, которая может быть отменена, а 
            // в UI приложениях такое сплошь и рядом.
            private volatile CancellationTokenSource _lastCancellationTokenSource;
    
            public string CurrentFolder
            {
                get { return _currentFolder; }
                private set { Set(ref _currentFolder, value); }
            }
    
            public ICommand SearchCommand { get; }
    
            public MainViewModel(SearchAlgorithm search)
            {
                _search = search;
                _search.ProgressChanged += OnSearchProgressChanged;
                SearchCommand = new RelayCommand(Search);
            }
    
            public override void Cleanup()
            {
                //lock (_sync)
                {
                    _lastCancellationTokenSource?.Cancel();
                }
    
                _search.ProgressChanged -= OnSearchProgressChanged;
                base.Cleanup();
            }
    
            /// <summary>
            /// Прерывает прошлый поиск и запускает новый.
            /// </summary>
            private async void Search()
            {
                CancellationTokenSource currentTokenSource;
                // В случае, если такой метод вызывать не из UI потока, то lock здесь нужен
                // Если использовать только из UI потока как здесь, то lock можно удалить.
                // Ещё бы я вынес логику в отдельный класс и использовал в других проектах в том числе.
                //lock (_sync)
                {
                    _lastCancellationTokenSource?.Cancel();
                    currentTokenSource = new CancellationTokenSource();
                    _lastCancellationTokenSource = currentTokenSource;
                }
    
                try
                {
                    await _search.Search(currentTokenSource.Token);
                }
                catch (OperationCanceledException)
                {
                    // Ignored.
                }
                finally
                {
                    //lock (_sync)
                    {
                        currentTokenSource.Dispose();
                        if (ReferenceEquals(_lastCancellationTokenSource, currentTokenSource))
                        {
                            _lastCancellationTokenSource = null;
                        }
                    }
                }
            }
    
            private void OnSearchProgressChanged(object sender, EventArgs e)
            {
                var search = (SearchAlgorithm)sender;
                CurrentFolder = search.CurrentFolder;
            }
        }
    }


    Затестил я по быстрому так. Это тебе не особо нужно:

    MainWindow.xaml.cs
    using System.Windows;
    using EventsInModel.Models;
    using EventsInModel.ViewModels;
    
    namespace EventsInModel
    {
        public partial class MainWindow : Window
        {
            private readonly MainViewModel _viewModel;
    
            public MainWindow()
            {
                InitializeComponent();
                _viewModel = new MainViewModel(new SearchAlgorithm());
                DataContext = _viewModel;
    
                Loaded += OnLoaded;
                Closing += OnClosing;
            }
    
            private void OnLoaded(object sender, RoutedEventArgs e)
            {
                _viewModel.SearchCommand.Execute(null);
                _viewModel.SearchCommand.Execute(null);
            }
    
            private void OnClosing(object sender, System.ComponentModel.CancelEventArgs e)
            {
                _viewModel.Cleanup();
            }
        }
    }


    Проект с зависимостями
    <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
    
      <PropertyGroup>
        <OutputType>WinExe</OutputType>
        <TargetFramework>netcoreapp3.1</TargetFramework>
        <UseWPF>true</UseWPF>
      </PropertyGroup>
    
      <ItemGroup>
        <PackageReference Include="MvvmLightLibsStd10" Version="5.4.1.1" />
      </ItemGroup>
    
    </Project>
    Ответ написан
    1 комментарий
  • Как сделать чтобы при нажатии кнопки появлялась новая панель?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Может для начала стоит почитать что-нибудь или пройти видеокурсы?
    Понимаете, какая пропасть между "мультиплеерный шутер" и "хочу чтоб появлялась панелька"?
    Ответ написан
    Комментировать
  • Как посчитать эффективность разработки?

    Adamos
    @Adamos
    Эффективность бизнеса в целом можно увеличить, уволив на хрен менеджера, который высасывает из пальца KPI для программистов.
    Ответ написан
    1 комментарий
  • Нужно ли умножать сложности?

    @deliro
    Нет. Вот если бы у тебя было два вложенных цикла по string, то да. А тут сложность "складывается", потому что сначала O(n) — реверс, потом O(n) — создание цикла, потом O(n) — join. Но т.к. константы в сложности никому не нужны — это только O(n)

    Но ты, конечно, не поверишь, поэтому вот тебе доказательство. Время линейно растёт вместе с N
    5c6f07ce35b63943246212.png
    Ответ написан
    Комментировать
  • Можно ли прокинуть сетевой кабель в 1 гбит между двух ноутов?

    sashkets
    @sashkets
    Прекратил отвечать после 24.02.2022
    так а в чем проблема то?
    берем кабель не ниже cat5, если сетевые умеют автосогласование, то обжим может быть прямой, если нет, то придется делать перекресный обжим кабеля, ну и на интерфейсах даем адреса из одной подсети, компы должны входить в одну рабочую группу

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

    п.с.
    ясно, что Вам там виднее
    Ответ написан
    Комментировать
  • Из 2 ноутов один?

    @kalapanga
    Да, возможно.
    5b571c891dd07600040147.jpeg
    Ответ написан
    Комментировать
  • В чем суть интерфейсов в программировании?

    @ZzZero
    Я делаю систему контроля яркости.
    Я хочу настраивать яркость всего (гирлянды, люстры, фонарика, экрана телефона).
    В коде выглядит примерно так
    class BrightControl
       public void setDefaultBright(Object obj){
             obj.setBright(10);
       }
    }

    Метод setDefaultBright принимает любой объект. Ведь мне всё равно яркость чего настраивать.
    Мой код используют другие разработчики, я не могу контролировать их.
    Как мне убедиться, что у объекта, который мне пришел в качестве аргумента, есть метод setBright?
    Я пишу интерфейс, и говорю, что метод setDefaultBright принимает только объекты, которые реализуют этот интерфейс.

    Если кроме меня самого никто не будет использовать эту систему контроля яркости. То я просто буду держать у себя в голове, что в метод setDefaultBright можно отправлять только объекты, у которых есть метод setBright, но поддержка кода усложняется, через год и не вспомнишь...
    Ответ написан
    3 комментария
  • Работа с Dictionary в c# - как получить данные в массиве?

    @AlexP11223
    Использовали бы лучше SQLite провайдера для стандартного ADO.NET, например https://system.data.sqlite.org

    Как мне в цикле получить все данные из DataTable?

    У Dictionary можно получить массив значений через Values. Или массив KeyValuePair через ToArray(), ToList() или просто цикл foreach.

    То есть видимо например как-то так:
    for (int i = 0; i < dt.Rows.Count; i++)
    {
        foreach (var value in dt.Rows[i].Values)
        {
            //Console.WriteLine(value);
        }
    }


    Порядок значений в Values не гарантирован (но такой же как и у ключей Keys), то есть может отличаться от того, как у вас было в таблице БД.
    Так что вероятно больше смысла делать что-то типа такого:
    for (int i = 0; i < dt.Rows.Count; i++)
    {
        foreach (var kv in dt.Rows[i])
        {
            //Console.WriteLine("Column: " + kv.Key + ", value: " + kv.Value);
        }
    }
    Ответ написан
    1 комментарий
  • Как проверить, что ip находится в заданном диапазоне?

    BuriK666
    @BuriK666
    Компьютерный псих
    https://stackoverflow.com/questions/19913694/how-c...
    Сеть:
    Address:   91.108.56.0          01011011.01101100.001110 00.00000000
    Netmask:   255.255.252.0 = 22   11111111.11111111.111111 00.00000000
    Wildcard:  0.0.3.255            00000000.00000000.000000 11.11111111
    =>
    Network:   91.108.56.0/22       01011011.01101100.001110 00.00000000


    Адрес:
    Address:   91.108.57.58         01011011.01101100.001110 01.00111010
    Netmask:   255.255.252.0 = 22   11111111.11111111.111111 00.00000000
    Wildcard:  0.0.3.255            00000000.00000000.000000 11.11111111
    =>
    Network:   91.108.56.0/22       01011011.01101100.001110 00.00000000
    Network - совпадает, значит они в одной подсети.

    Address:   91.108.51.1          01011011.01101100.001100 11.00000001
    Netmask:   255.255.252.0 = 22   11111111.11111111.111111 00.00000000
    Wildcard:  0.0.3.255            00000000.00000000.000000 11.11111111
    =>
    Network:   91.108.48.0/22       01011011.01101100.001100 00.00000000
    Тут сеть отличается.
    Ответ написан
    Комментировать
  • Как узнать порядковый номер строки в столбце(Entity Framework С#)?

    @kttotto
    пофиг на чем писать
    В бд строки могут лежать в любом непредсказуемом для Вас порядке. И какая строка на каком месте находится, Вас интересовать не должно. То, что Вы видите строки в каком то порядке, это сортировка по дефолту. Если Вы хотите взять порядковый номер строки, то нужно указать порядковый номер относительно какого то поля, т.е. таблицу прежде надо отсортировать по нужному полю (Id, DateTime, Name и т.д.), а потом можете брать запись отсчитывая с любого конца. Поэтому это примерно будет выглядеть так
    bd.User.OrderBy(x => x.Id).ElementAt(5);
    Если надо именно порядковый номер узнать определенной записи, то можно так
    bd.User.OrderBy(x => x.Id).ToList().FindIndex(x => x.Name == "Vasya");
    Ответ написан
    1 комментарий
  • Как запустить много одинаковых программ с разными ип без виртуалбокс?

    @zlo1
    Proxifier в помощь

    в проксификаторе можно настроить индивидуальный прокси для уникального имени запускаемого процесса
    т.е. для каждого экземпляра программы потребуется уникальное имя запускаемого процесса - (переименуй запускаемый процесс proga.exe -> proga1.exe -> proga2.exe ... progaN.exe)
    Ответ написан
    1 комментарий
  • Причина ошибки при подключении к Mysql C#?

    Добрый день.
    Вам ошибка вполне по англиски написала:
    Unrecognized configuration section (/Users/habcerga1/Desktop/Projects/Demo6/Demo6/bin/Debug/Demo6.exe.config line 11)
    Так что проверяйте 11 строку в /Users/habcerga1/Desktop/Projects/Demo6/Demo6/bin/Debug/Demo6.exe.config
    файле
    Инициализатор клиента MySql когда парсит Ваш конфиг файл непонимает что там написано
    Ответ написан
    Комментировать
  • Не перезапускается сервис ssh, в чем причина?

    leahch
    @leahch
    3Д специалист. Долго, Дорого, Дерьмово.
    Ну так оно же вам пишет, что проблем а конфиге
    /etc/ssh/sshd_config line 96: Directive 'UsePAM' is not allowed within a Match block

    Директива UsePAM стоит не в том месте, ошибка в строчке 96.
    Ответ написан
    Комментировать
  • Организация VOIP-SIP оповещения?

    Ну есть ведь SIP-домофоны. В принципе и в Вашем случае можно найти решение. Cyberdata 011098 один из них. Вы как-то искаженно топологию изобразили, по крайней мере с моей получайниковской точки зрения. Я думаю, что свитч, это физический компонент, а Asterisk - логический. По сути схема такая - доступность по IP из сервера Asterisk всех динамиков. А уже свитчи это обеспечивают.
    Ответ написан
    Комментировать
  • Организация VOIP-SIP оповещения?

    gbg
    @gbg
    Любые ответы на любые вопросы
    1) Судя по тексту, динамики годные. Однако, может оказаться дешевле поставить трансляционный усилитель, который соединить с астериском через звуковую карту и chan_alsa.
    2) Схема вами предложена верная, однако, рассмотрите вариант с трансляционным усилителем.
    3) У астериска открытый API и привязки к разным языками и фреймворкам. По факту, если речь идет исключительно об оповещении, астериск не нужен.
    Ответ написан
    3 комментария