Задать вопрос
  • Код завершается с кодом 0, без выполнения самого кода?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Код ноль - это успешное выполнение.

    Если значение отличается от нуля, значит программа завершила работу с ошибкой.
    Ответ написан
    6 комментариев
  • Нужно ли Frontend разработчику мониторить обновления?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    За обновлениями периодически нужно следить, просто, чтобы знать, что меняется, появляется или удаляется из новых версий. Нужно ли обновлять - это уже вопрос потребностей проекта, клиента, команды.

    Я обычно просматриваю изменения ключевых пакетов/библиотек раз в 1-3 месяца.

    В большом проекте ключевые пакеты/библиотеки может быть сложно обновить, особенно если меняется номер старшей (major) версии (например, Bootstrap v4 => v5). Несущественные изменения (minor), в некоторых случаях могут иметь ощутимые последствия, что-то может сломаться или изменится поведение.

    Я бы не стал просто так обновлять такой пакет, как Bootstrap. Если обновление ключевого пакета происходит, то это неизбежно увеличит нагрузку на QA команду (quality assurance - обеспечение качества, тестирование). В случае с Bootstrap, вероятно придется весь проект перетестировать. Без автоматического тестирования будет особенно тяжко.

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

    Если вы используете менеджер пакетов, например npm, то скорее всего он вам будет показывать предупреждения об обнаруженных уязвимостях в пакетах и варианты их устранения. За этим лучше следить, чтобы потом не было неприятных сюрпризов. Как правило, с менеджером пакетов это делать проще, достаточно будет проверить отдельные предупреждения, а не все пакеты.

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

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Прочитать из аргументов командной строки, примерно так:
    static class Program
    {    
      [STAThread]
      static void Main(string[] args) // <---
      {
        // args - будет содержать параметры запуска программы
      }
    }

    либо:

    string[] args = Environment.GetCommandLineArgs();
    Ответ написан
    1 комментарий
  • C# - Как удалить символ из строки при посимвольной обработке строки в цикле?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Проще всего использовать регулярные выражения, если это допустимо:
    string value = "ab+0.1973-1.1";
    string result = Regex.Replace(value, @"(\.\d{2})\d+", "$1");

    Если использовать цикл, то нужно создавать новую строку, но вместо string лучше использовать StringBuilder, т.к. при добавлении данных к string строка постоянно будет пересоздаваться, что в конечном итоге может негативно отразиться на производительности:

    string inputString = "ab+0.1973-1.1";
    var result = new StringBuilder();
    bool hasDot = false;
    int digits = 0;
    
    foreach(char ch in inputString)
    {
      if (char.IsDigit(ch) && hasDot)
      {
        digits++;
      }
      else
      {
        digits = 0;
        hasDot = (ch == '.');
      }
    
      if (digits <= 2)
      {
        result.Append(ch);
      }
    }
    
    Console.WriteLine(result.ToString());

    Если хорошо подумать и если это допустимо, то задачу можно решить с одним только StringBuilder (одним экземпляром), в котором изначально будет строка для обработки, используя метод Remove для удаления ненужных данных. При такой реализации, будет использоваться цикл for.
    Ответ написан
    Комментировать
  • Нужен ли установленный .NET для запуска программы?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Для Windows XP нужен .NET Framework 4, выше уже не подойдет.
    Со старшими версиями систем проблем возникнуть не должно.

    https://docs.microsoft.com/ru-ru/dotnet/framework/...

    Как вариант, можно сделать мультиплатформенное приложение, для новых платформ использовать новые версии .NET, а для XP писать вставки под .NET 4.0. Код может быть не очень удобно поддерживать:

    #if NET40
    // код для .NET 4.0
    #else
    // код для остальных версий
    #enif

    Если делать так, то при наличии возможности, лучше всего использовать .NET Core.
    Ответ написан
    4 комментария
  • Как на основе исходного кода сделать консольное приложение?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    1. Создаем консольное приложение.
    2. Добавляем пакет.
    3. Пользуемся.
    Ответ написан
    2 комментария
  • Как отключить encode в WebClient UploadValues?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Если параметр в Url, то можно сделать экземпляр Uri и отключить кодирование:
    var url = new Uri("http://site.com/index.php?199|&param=1", true);
    // ...
    var response = wb.UploadValues(url, "POST", data);

    Без кодирования параметров с помощью HttpClient
    using (var client = new HttpClient())
    {
      var url = new Uri("http://site.com/index.php?199|&param=1", true);
      var data = new StringBuilder();
      data.AppendLine("abc=199|");
    
      using (var content = new StringContent(data.ToString(), Encoding.UTF8, "application/x-www-form-urlencoded"))
      {
        using (var request = new HttpRequestMessage(HttpMethod.Post, url))
        {
          request.Content = content;
    
          using (var response = client.SendAsync(request).Result)
          {
            response.EnsureSuccessStatusCode();
    
            // var result = await response.Content.ReadAsStringAsync();
            var result = response.Content.ReadAsStringAsync().Result;
          }
        }
      }
    }

    Ответ написан
    3 комментария
  • Почему не получается вычесть время?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Еще DateTime.Subtract можно использовать:

    WorkTimeLabel.Content = $"Рабочее время: {DateTime.Now.Subtract(timeStart).ToString(@"hh\:mm")}";

    Разделители и прочие «непонятные» символы лучше экранировать (слешем, как показано в примере).

    Если timeStart будет раньше на 24 часа, то в формате hh:mm эта информация не отразится. Можно использовать такой вариант:

    WorkTimeLabel.Content = "Рабочее время: " + 
      (DateTime.Now - timeStart).ToString(@"d\д\ hh\:mm").TrimStart('0', 'д').Trim();

    См. также: Stopwatch
    Ответ написан
    Комментировать
  • Для чего нужны спецификаторы доступа в C#/Java и др. подобных языках?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Модификаторы помогают организовать работу с кодом. Избавить от потенциальных проблем неправильного использования кода, особенно малоопытными программистами. Иногда работаю с PHP, модификаторов типа internal очень сильно не хватает, приходится извращаться, чтобы другим работать с кодом было удобно; чтобы не было возможность залезть туда, куда не нужно и нарушить логику работы; чтобы на поверхности все выглядело проще, чем есть на самом деле.

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

    В тоже время, если неправильно использовать модификаторы и излишне ограничить доступ, то это может стать проблемой. Нужно хорошенько продумывать архитектуру, чтобы минимизировать возникновение подобных ситуаций.
    Ответ написан
    Комментировать
  • Ошибка в при получении маркера доступа к странице Graph API Explorer?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Чтобы иметь право запрашивать manage_pages нужно пройти проверку. Для этого нужно будет доказать Facebook, что это разрешение действительно нужно и показать, каким образом оно используется (сделать screencast). Практика показывает, что англоязычные запросы на проверку обрабатываются быстрее.

    См. раздел Проверка приложения.

    5b3b8d472cb04328696971.png
    Ответ написан
    Комментировать
  • Как повторить последнее действие в приложении?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Действие выполнять в отдельном методе, а потом просто вызвать этот метод повторно. Примерно так:
    static Action lastAction = null;
    
    static void AnyAction()
    {
      Console.WriteLine("Выполняю какое-то действие. Не отключайтесь...");
      Thread.Sleep(3000);
    }
    
    static void Repeat()
    {
      Console.WriteLine("Хотите повторить? [Д/н]");
    
      if (char.ToUpper(Console.ReadKey().KeyChar) == 'Д')
      {
        Console.WriteLine();
        lastAction();
        Repeat();
      }
    }
    
    static void Main(string[] args)
    {
      lastAction = AnyAction;
      lastAction();
      Repeat();
    }

    Или использовать очереди и добавлять действие в очередь при необходимости выполнить повтор:

    static Queue<Action> actions = new Queue<Action>();
    
    static void AnyAction()
    {
      Console.WriteLine("Выполняю какое-то действие. Не отключайтесь...");
      Thread.Sleep(3000);
    }
    
    static void Main(string[] args)
    {
      actions.Enqueue(AnyAction);
    
      while (actions.Count > 0)
      {
        actions.Dequeue()();
    
        Console.WriteLine("Хотите повторить? [Д/н]");
    
        if (char.ToUpper(Console.ReadKey().KeyChar) == 'Д')
        {
          Console.WriteLine();
          actions.Enqueue(AnyAction);
        }
      }
    }
    Ответ написан
    1 комментарий
  • Как сделать solution explorer в С#?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Какие нужны классы - зависит от задачи. Чтобы вывести список каталогов и файлов, дополнительные классы не нужны. Код может быть примерно таким:

    treeView1.Items.Clear();
    GetFiles("C:/Windows/Microsoft.NET", null);

    private void GetFiles(string path, TreeViewItem parent)
    {
      var node = new TreeViewItem() { Header = System.IO.Path.GetFileName(path) };
          
      if (parent == null)
      {
        treeView1.Items.Add(node);
      }
      else
      {
        parent.Items.Add(node);
      }
    
      var attr = System.IO.File.GetAttributes(path);
    
      if (attr.HasFlag(System.IO.FileAttributes.Directory))
      {
        var directories = System.IO.Directory.GetDirectories(path);
    
        foreach (var dir in directories)
        {
          GetFiles(dir, node);
        }
    
        var files = System.IO.Directory.GetFiles(path);
    
        foreach (var file in files)
        {
          node.Items.Add(System.IO.Path.GetFileName(file));
        }
      }
    }
    Ответ написан
    2 комментария
  • Почему с view на контроллер не идет модель?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Скорее всего имена HTML-элементов получаются неправильные (одинаковые). Попробуйте через обычный for, тогда на выходе должны будут получаться имена с указанием индекса (типа: [0].Html, [1].Html и т.п.):
    @for (int i = 0, count = Model.Count; i < count; ++i)
    {
      @Html.TextAreaFor(m => m[i].Html, new { @class = "Width500", @style = "height:130px;" })
    }
    Ответ написан
    1 комментарий
  • Почему не срабатывает insert into через php?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    $db_table = "articles"; // Имя Таблицы БД

    Нет, не имя таблицы, а имя базы данных ($dbname).

    if (!$mysqli->query($query)) {
        printf("Errormessage: %s\n", $mysqli->error);
    }

    См. также: SQL Injection
    Ответ написан
    2 комментария
  • C# Xml Как занести в массив соответствующие элементы дерева?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Взять head и перебирать дочерние узлы, которые можно найти в свойстве ChildNodes:
    var xml = @"<head>
    <block1>
     <block_header></block_header>
     <block_picture></block_picture>
     <block_text></block_text>
    </block1>
    <block2></block2>
    <block3>
     <block_header></block_header>
     <block_picture></block_picture>
     <block_text></block_text>
    </block3>
    </head>";
    
    var doc = new XmlDocument();
    doc.LoadXml(xml);
    
    var head = doc.SelectSingleNode("/head");
    
    var list = new List<string>();
    
    foreach (XmlNode node in head.ChildNodes)
    {
      list.Add(node.Name);
      // node.InnerXml - содержимое узла
      Console.WriteLine("{0}={1}", node.Name, node.InnerXml);
    }
    
    // в коллекции list будет список имен дочерних узлов корневого узла

    Всех детей, при необходимости, можно перебрать рекурсией, или с помощью стека:

    var doc = new XmlDocument();
    // определение переменной xml см. в предыдущем коде
    doc.LoadXml(xml);
    
    // создаем стек
    var stack = new Stack<XmlNode>();
    
    // добавляем в стек корневой элемент
    stack.Push(doc.SelectSingleNode("/head"));
    
    // var list = new List<string>();
    
    // перебираем все элементы стека
    while(stack.Count > 0)
    {
      // берем верхний элемент и удаляем его и стека
      var node = stack.Pop();
    
      // выводим
      // если требуется, можно добавить в коллекцию
      // list.Add(node.Name);
      Console.WriteLine("Node: {0}, childs: {1}", node.Name, node.ChildNodes.Count);
    
      Console.WriteLine(node.InnerXml);
    
      // если есть дети, добавляем их в стек
      if (node.ChildNodes.Count > 0)
      {
        // берем с конца, чтобы сохранить порядок
        for (int i = node.ChildNodes.Count - 1; i >= 0; --i)
        {
          stack.Push(node.ChildNodes[i]);
        }
      }
    }
    Ответ написан
  • C# XML Как проверить существование узла?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    using System.Xml;
    var xml = @"<head>
     <block1></block1>
     <block2></block2>
     <block3></block3>
    </head>";
    
    var doc = new XmlDocument();  
    doc.LoadXml(xml);
    
    var node = doc.SelectSingleNode("/head/block3");
    
    if (node != null)
    {
      Console.WriteLine("Узел существует!");
    }
    else
    {
      Console.WriteLine("Узел не найден...");
    }
    Ответ написан
    1 комментарий
  • Как создать платежный агрегатор?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    1. Составить бизнес-план, чтобы было понятно, сколько это будет примерно стоить и как быстро окупится.
    2. Изучить правила интеграции с платежными системами, технические возможности и требования.
    3. Если планируется работа с банковскими картами напрямую, то пройти сертификацию. Процесс сложный, длительный и дорогостоящий.
    4. По стоимости, очень грубо, если на интеграцию с одним сервисом уйдет порядка 30 часов (разработка, тестирование). Если сервисов будет, скажем, с 20, то 20 * 30 = 600 часов. Дальше зависит от ставки, возьмем маленькую - 500 рублей в час, на выходе получим 300 000 рублей. Но эту сумму можно смело умножать на два или даже на три. Чтобы на выходе с большой долей вероятности получить что-то работающие, придется обращаться к компании, специализирующейся на подобных разработках, ставка будет выше, скорее всего от 1 500 рублей в час, или еще выше. В общем, пару миллионов выйдет, но скорее всего больше :-)
    5. Искать инвесторов и убеждать их в целесообразности реализации этого проекта :-)
    Ответ написан
    1 комментарий
  • Как задать значение по умолчанию текстовому полю в React final form?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    initialValues
    (
      <Form
        onSubmit={onSubmit}
        subscription={{ dirty: true }}
        initialValues={{ foo: 'bar' }}
      >
        {({ handleSubmit }) => (
          <form onSubmit={handleSubmit}>
            <Field name="foo" component="input" />
            <button type="submit">Submit</button>
          </form>
        )}
      </Form>
    )
    Ответ написан
  • Каким сниппетом можно отправить следующий POST запрос на C#?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    using System.Net.Http;
    using System.Text;

    using (var client = new HttpClient())
    {
      var url = "https://dns.api.gandi.net/api/v5/zones/93cc9312-a214-408b-a75b-9d4172984746/records";
    
      // можно просто строку (string) сделать, как будет удобно
      var data = new StringBuilder();
      data.AppendLine("www IN A 192.168.0.1");
      data.AppendLine("    IN A 192.168.0.2");
      data.AppendLine("    IN A 192.168.0.2");
      data.AppendLine("@   IN MX 10 spool.mail.gandi.net.");
    
      using (var content = new StringContent(data.ToString(), Encoding.UTF8, "text/plain"))
      {
        // HttpMethod.Post, если нужен POST
        using (var request = new HttpRequestMessage(HttpMethod.Put, url))
        {
          // request.Headers.Authorization = new AuthenticationHeaderValue("", "");
          request.Headers.Add("X-Api-Key", "$APIKEY");
    
          request.Content = content;
    
          // using (var response = await client.SendAsync(request)
          using (var response = client.SendAsync(request).Result)
          {
            // выбросить исключение, если сервер вернул ошибку
            response.EnsureSuccessStatusCode();
    
            // var result = await response.Content.ReadAsStringAsync();
            var result = response.Content.ReadAsStringAsync().Result;
            // в result будет ответ сервера
          }
        }
      }
    }
    Ответ написан
    2 комментария