• Где можна подучить дизайн в Windows Form?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    FlowLayoutPanel и TableLayoutPanel - вот и весь дизайн :-)

    5b3601df55816684367353.png
    Ответ написан
    Комментировать
  • Как в WPF скрыть кнопки при нажатии?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Поместить кнопки в контейнер и менять статус видимости у контейнера:
    <Button Content="Ok" HorizontalAlignment="Left" VerticalAlignment="Top" 
      Width="75" Margin="0,75,0,0" 
      Click="Button_Click"
    />
    
    <WrapPanel Name="Buttons" Orientation="Horizontal">
      <Button Name="Button1" Content="Button" HorizontalAlignment="Left" 
        VerticalAlignment="Top" Width="75"
      />
      <Button Name="Button2" Content="Button" HorizontalAlignment="Left" 
        VerticalAlignment="Top" Width="75" 
      />
      <Button Name="Button3" Content="Button" HorizontalAlignment="Left" 
        VerticalAlignment="Top" Width="75" 
      />
      <Button Name="Button4" Content="Button" HorizontalAlignment="Left" 
        VerticalAlignment="Top" Width="75"
      />
    </WrapPanel>

    private void Button_Click(object sender, RoutedEventArgs e)
    {
      Buttons.Visibility = Visibility.Hidden; // Visibility.Visible
    
      /*
      if (Buttons.Visibility == Visibility.Hidden)
      {
        Buttons.Visibility = Visibility.Visible;
      }
      else
      {
        Buttons.Visibility = Visibility.Hidden;
      }
      */
    }
    Ответ написан
    2 комментария
  • Php как проверить строку?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    if (count(explode('.', $value)) == 3) {
      echo "ok";
    }

    Проверка строки в формате NN.NN.NNNN:

    if (preg_match('/\d{2}\.\d{2}\.\d{2,4}/', $value) === 1) {
      echo "ok";
    }

    Проверка на наличие трех точек с любым содержимым:

    if (preg_match('/.+\..+\..+/', $value) === 1) {
      echo "ok";
    }
    Ответ написан
    Комментировать
  • Работа с facebook webhook,как настроить?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    1. Открываем страницу https://developers.facebook.com/apps/ и создаем или используем существующее приложение.
    2. Открываем страницу настроек приложения.
    3. Добавляем Webhooks.
      5b34e1bfe7c8d794608343.png
    4. Переходим в раздел Webhooks, выбираем объект, например Page, и жмем на кнопку Subscribe to this object.

      5b34e2b9bf343559317616.png
    5. В появившемся окне указываем адрес страницы обратного вызова. Обязательно HTTPS. Вводим любой набор символов, который будет передан на страницу обратного вызова. Жмем на кнопку Подтвердить и сохранить.

      5b34e2f0606c0189701950.png
    6. В коде страницы обратного вызова обрабатываем GET-параметры hub.mode, hub.challenge и hub.verify_token. Проверяем, что значение hub.verify_token соответствует значению, указанному при добавлении адреса обратного вызова в настройках Webhooks на сайте Facebook и если значение правильное отдаем в ответ значение hub.challenge (HTTP200, text/plain), чтобы Facebook мог использовать этот адрес.

      if (isset($_GET['hub.verify_token']) && $_GET['hub.verify_token'] == '123') {
        header('Content-Type: text/plain');
        echo $_GET['hub.challenge'];
      }


    7. После успешного добавления адреса обратного вызова, добавляем нужные подписки в настройках Webhooks. Для комментариев, скорее всего feed.

      5b34e304368d8832126084.png
    8. На странице обратного вызова принимаем от сервера Facebook запросы POST.

      echo file_get_contents('php://input');

    Ответ написан
  • Как дополнить такой SQL запрос?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Вероятно, что-то типа этого:
    INSERT INTO db (name, f, link, time) VALUES ('%name%', '%price%', '%link%', '%date%') 
    ON DUPLICATE KEY UPDATE f = CONCAT_WS('|', f, '%price%'),  time = CONCAT_WS('|', time, '%date%')
    Ответ написан
    1 комментарий
  • Как одновременно вывести звук на два устройства?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Если все устройства подключены к одному гнезду, то видимо достаточно просто воспроизвести звук, любым удобным способом.

    new System.Media.SoundPlayer(@"c:\filename.wav").Play();

    Более сложные вещи можно сделать, например, с помощью NAudio.

    var searcher = new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_SoundDevice");
    var devices = searcher.Get();
    foreach (var device in devices) 
    {
      Console.WriteLine(device.GetPropertyValue("Caption").ToString());
    }
    
    // ...
    
    var waveReader = new NAudio.Wave.WaveFileReader(fileName);
    var waveOut = new NAudio.Wave.WaveOut();
    waveOut.DeviceNumber = deviceNumber;
    
    var output = new NAudio.Wave.DirectSoundOut();
    output = waveOut;
    output.Init(waveReader);
    output.Play();
    Ответ написан
    Комментировать
  • Скроллинг в оконном приложении C#?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Свойство AutoScroll = true у контейнера, в котором находятся элементы.
    Ответ написан
  • Спецификации именованного аргумента должны появляться во всех указанных фикс.аргументах. В чем ошибка?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    // добавить chest
    Combin2(n: 4, k: 2, chest: ref chest);
    // либо не указывать имена
    // Combin2(4, 2, ref chest);
    Ответ написан
    1 комментарий
  • Как обработать ответ telegram bot?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Бот должен записать куда-нибудь (например в базу), что ожидается от пользователя.

    В зависимости от реализации, можно сделать ожидание ответа в отдельном потоке. Т.е. бот отправляет клиенту вопрос и приостанавливает выполнение потока, ожидая ответ от клиента. Но в любом случае желательно сохранять информацию в базу данных.

    Также следует учитывать, что пользователь может не прислать ответ. В таком случае нужно ограничить срок ожидания ответа (учитывать дату начала ожидания и проверять дату ответа пользователя).

    Пример:
    Пользователь: Привет!
    Бот: Привет, %username%! Чем я могу помочь? 
    // предполагается, что следующий ответ пользователя будет на вопрос, "чем я могу помочь?"
    // записываем в базу отметку для текущего conversationId, например ставим next=1
    Пользователь: Как обработать ответ telegram bot? 
    // бот смотрит в базе, что поле next равно 1, значит нужно найти ответ на вопрос пользователя
    Бот:  Секундочку, сейчас поищу на Toster...
    Бот: Посмотри здесь: https://toster.ru/q/540828#answer_1235905
    Пользователь: Спасибо!
    Бот:  Без проблем, обращайся!
    Пользователь: Хочу купить билет в Испанию!
    Бот:  Отлично! В какой город?
    // next=2
    Пользователь: Мадрид
    // if (next == 2) { это имя города, проверить название города по базе, если город найден }
    Бот: На какую дату?
    // next=3
    Пользователь: 25.06.2018
    // if (next == 3) { это дата, проверить правильность указания даты, если все правильно }
    Бот: Отлично! Сейчас что-нибудь подберу...
    ...
    Ответ написан
    Комментировать
  • Linq to DataTable как получить строку с минимальным значением в столбце?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Значения NULL уровня базы данных нужно проверять с DBNull.Value.

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

    "Цена" в представленном коде является просто строкой, содержащей слово "Цена". Если это имя поля, то следует обращаться к нему через myRow.

    from myRow in dt.AsEnumerable()
    where myRow["Цена"] != DBNull.Value
    orderby double.Parse(myRow["Цена"])
    select myRow;
    Ответ написан
    3 комментария
  • Калькулятор на mvc с историей операций?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Если для веб и именно на ASP.NET, то можно:

    1. Реализовать структуру или класс для хранения элемента данных (истории) и использовать статический класс, свойство или поле (например, на уровне класса контроллера) для всей истории:

    public class HistoryItem 
    {
    
      public double X { get; set; }
    
      public double Y { get; set; }
    
      public string Operation { get; set; }
    
      // предполагается, что журнал подразумевает хранение истории вычислений,
      // и хотя можно повторно провести вычисления, в журнале такого по идее быть не должно,
      public double Result { get; set; }
    
    }
    
    // ...
    
    public static List<HistoryItem> History = new List<HistoryItem>();
    
    // ...
    
    History.Add(new HistoryItem { X = 123, Y = 456, Operation = "+", Result =  579 });
    History.Add(new HistoryItem { X = 5, Y = 5, Operation = "*", Result = 25 });

    или проще, без HistoryItem, записывать в виде строк:

    public static List<string> History = new List<string>();
    
    // ...
    
    History.Add("2 * 2 = 4");
    History.Add("3 + 4 = 7");

    Можно сделать поправку на многопоточность и использовать что-нибудь потокобезопасное:

    using System.Collections.Concurrent;
    
    // ...
    
    public static ConcurrentBag<string> History = new ConcurrentBag<string>();
    
    // ...
    
    History.Add("123 + 345 = 468");
    History.Add("7 * 7 = 49");

    Но при такой реализации, история будет доступна только в рамках жизненного цикла приложения.

    2. Записывать в текстовой файл:

    // добавить
    System.IO.File.AppendText("history.log", "5 * 5 = 25");
    // прочитать историю
    // System.IO.File.ReadAllText("history.log");

    При такой реализации, файл истории будет доступен в рамках жизненного цикла устройства хранения данных, пока последняя резервная копия не будет утрачена :-)

    3. Записывать в базу данных.

    Примерно такой же вариант, как и с записью в файл, но более сложный.

    ---

    Если условия задачи позволяют, я бы наверное сделал на стороне клиента (JavaScript) и использовал localStorage:

    var historyData = window.localStorage.getItem('history');
    var history = historyData ? JSON.parse(historyData) : [];
    
    history.push('1 + 1 = 2');
    history.push('2 + 2 = 4');
    history.push('4 + 4 = 8');
    
    window.localStorage.setItem('history', JSON.stringify(history));
    Ответ написан
    Комментировать
  • Многоуровневая вложенность БД?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Добавить ссылку на пользователя-родителя (parent_id).

    А чтобы иметь быстрый доступ ко всей цепочки и не извращаться, можно сделать дополнительное поле, в котором прописать эту самую цепочку. Для пользователя Максим ref_chain = Андрей/Дмитрий. В таблицу добавить триггеры для проверки обновления цепочки. При начислении бонусов, можно разбивать ref_chain и начислять каждому в зависимости от уровня (индекса). Если запросов будет много, то можно сделать отдельную таблицу, в которой будут прописаны связи, явным образом для каждого пользователя (чтобы избежать динамического построения связей):
    Андрей  | level 0 | null
    Дмитрий | level 1 | Андрей
    Максим  | level 1 | Дмитрий
    Максим  | level 2 | Андрей
    Ответ написан
    Комментировать
  • На чем верстать сайты?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Если нет сеток и лень делать, я использую Flexbox Grid.

    Много стилей и плохо для поисковой оптимизации - не вижу связи? :-) Разве что вопрос скорости загрузки страниц сайта может возникнуть, но это решается путем минимизации файлов, объединения или напротив, разбивки на мелкие части (если объединенные вариант будет слишком увесистым).
    Ответ написан
    4 комментария
  • Как удачно распарсить огромный файл .csv?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Если данных много и их нужно просто добавить (INSERT INTO), то забыть про Entity Framework и использовать SqlBulkCopy.

    Также следует подумать об уменьшении числа столбцов, 617 - это многовато :-)

    Типы придется руками делать, если в CSV не содержится никакой информации о типе данных (например, в заголовке таблицы). Как вариант, можно попробовать определить тип данных автоматически по первой строке данных. Например, если в поле только числа, то считать, что это int (\d+), если числа и есть разделитель, то float ([\d\,\.]+), если дата (\d{1,2}\.\d{1,2}\.\d{2,4}), то datetime (или date), если true или false (true|false), то bool (bit), а по умолчанию varchar. В скобках указан примерный вариант шаблонов регулярных выражения для проверки.
    Ответ написан
    Комментировать
  • При отправки файла с сайта вместо одного приходит сразу два в чём проблема?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Две части с Content-Disposition и каждая attachment (вложение).

    5b1e48689868e497681523.png
    Ответ написан
    Комментировать
  • Зачем нужен редирект при запросе Access token в авторизации Implicit flow?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    На этапе преобразования кода авторизации (authorization_code) в маркер доступа (access token), в случае успеха, сервер должен вернуть информацию о маркере доступа в ответ на POST-запрос.

    Content-Type: application/json
    {
      access_token: "ABC...XYZ",
      refresh_token: "ABC...XYZ",
      expires_in: 123,
      token_type: "Bearer",
      scope: "..."
    }


    Если это не так, значит, либо код авторизации не проходит, либо поставщик работает неправильно :-) Указывать redirect_uri в данном случае может быть необходимо в качестве дополнительной проверки подлинности запроса, адрес должен соответствовать адресу, который использовался при формировании ссылки входа. Вызова redirect_uri быть не должно. Вызов redirect_uri будет только один раз, когда пользователь пройдет проверку подлинности, выдаст разрешения вашему приложению и поставщик сформирует authorization_code.
    Ответ написан
    Комментировать
  • Как исправить ложную ошибку синтаксиса в webshtorm?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Написать в одну строку или добавить фигурные скобки?
    const Login = asyncComponent(() => import('...'));

    UPD: Если синтаксис верный и проблема в IDE, то следует либо обновить определения типов, либо переключить версию языка/стандартов, либо просто обновить ПО.


    WebStorm 2017.3 EAP, 173.2941
    • Better support for import() syntax in JavaScript and TypeScript
    Ответ написан
  • Где применяют ASP.net сегодня?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Мне интересно в какой сфере применяют ASP

    ASP - умер, да здравствует ASP.NET! А нет, да здравствует ASP.NET Core! ;-)

    1. Любые проекты. Как правильно большие и сложные. Делать что-то простое смысла нет, для этого можно использовать что-нибудь типа PHP.

    2. Работа есть. Но новичкам нынче придется не сладко. За последние семь лет все сильно усложнилось.

    3. Можно делать все :-) Блоги, формы, порталы, магазины, платежные сервисы, корпоративные сайты. В общем, все что угодно. Мои нынешние проекты являются сложными системами, которые я уже не способен охватывать целиком и они не ограничиваются использованием ASP.NET. Но .NET доминирует, поскольку это удобно и работать просто приятно, от процесса написания кода, до отладки и тестирования.
    Ответ написан
    Комментировать
  • Почему не хочет парсить string(Regex)?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    string pattern = "/(.*?)[\\/]([A-Z]*)(,.)(\".*?\")/gm";

    string pattern = "(.*?)/([A-Z]*)(,|.)(\".*?\")";
    var regex = new Regex(pattern, RegexOptions.Multiline);
    Ответ написан
    Комментировать