• Какой сторонний сервис посоветуете для отправки пользователям писем с кодом подтверждения входа на сайт?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Для этого тебе нужен SMTP сервер. Отправляешь на него запрос, а он отправляет почту пользователю.
    Можно самому не ставить его, многие провайдеры дают доступ к своим.

    Вот пример, как сделать это через php и яндекс - https://phpstack.ru/php/smtp-ot-yandex-kak-otpravi...
    Ответ написан
  • В чем разница между понятиями Anti-Corruption Layer и паттерном Adapter?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Anti-Corruption Layer - это понятие из DDD. Оно обозначает слой (это может быть отдельный сервис или функция валидации), который проверяет запрос на корректность.

    Адаптер - это больше паттерн проектирования, который, грубо говоря, трансформирует запрос из одного формата в другой. Например, из XML в JSON, или если стоит прокси, то превращает `X-Redirected-From` в `Redirected-From` в HTTP заголовках.

    Адаптер может выполнять роль Anti-Corruption Layer и наоборот
    Ответ написан
    Комментировать
  • Разработка ИИ для настольной карточной игры. Обучение?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Эта задача - обучение с подкреплением: на вход подается поток входных данных, а алгоритм сам подстраивается и обучается.

    Скорее всего здесь подойдет простой MiniMax алгоритм: после каждого шага ему присваивается вес - -1(плохой ход), 0 (просто ход), 1 (хороший ход). В начале это будут случайные ходы, но после обучения они станут более осмысленными.

    Проблема в том - как понять, что ход был хороший или плохой. Я видел пример для крестиков-ноликов. Но в Гвинт не играл, поэтому не знаю, какую модель построить.
    Ответ написан
    Комментировать
  • Как выдерживать паузу в цикле ровно в 1 мс?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    sleep очень вряд-ли будет спать ровно столько сколько запросил из-за накладных расходов.

    Из документации:
    - The suspension time may be longer than requested by an arbitrary amount, because of the scheduling of other activity in the system

    Ты написал итераций примерно 830. Собственно вот и результат - sleep ожидает больше чем нужно и кол-во итераций логики меньше.

    Можно сделать комбинированный вариант - заснуть на поменьше, а оставшееся время активно ожидать
    Ответ написан
    2 комментария
  • Как при сборки мусора и перемещении объекта, сохраняется корректность ссылок?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Управление памятью в .NET для профессионалов

    Как работает сборка мусора.
    В .NET используется 2 фазная сборка мусора: Mark & Sweep (Пометить и Убрать).

    Mark

    На этом этапе обходится весь граф объектов. И выявляются все недостижимые.

    Каким образом достижимость объектов определяется?

    Достижимые это:
    - Аллоцированные на стеке
    - В статических полях
    - Достижимые из достижимых (см. выше)

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

    Но на стеке лежат числа. могут быть как числами, так и адресами, как и числами?

    JIT копилятор достаточно умный, чтобы сгенерить код, который будет знать, что за объект/ссылка лежит на стеке. Так и получаются знания об объектах.

    Sweep

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

    Вот тут интереснее. Есть несколько хаков как достигается большая производительность.
    1. Линеризованное пространство памяти.
    Адреса 0, 1 и 2 поколения расположены не абы где, а последовательно, друг за другом. Т.е. если нужно сократить пространство 0 поколения, то это означает простое передвигание указателя влево.

    2. Переход в след. поколение происходит не всегда
    Из 0 в 1 - переход быстрый, но из 1 в 2 - не всегда.
    На этом этапе тоже может не затрачиваться много времени.

    3. Ссылки из недостижимых объектов не обновляются - эти объекты и так нигде не участвуют
    Обновление ссылок, к сожалению, - это ручное изменение и копирование. Ничего не поделаешь.

    Теперь где-то, сборщик мусора, начинает переносить arr в другое место.

    Ты слишком большой массив выделил, он аллоцируется в LOH. Оттуда не вытащишь.

    Я много о чем не упомянул. Например, очередь финализации, таблица дескрипторов (Handle), сегментирование памяти и т.д. но ответы на основные вопросы дал
    Ответ написан
    2 комментария
  • Есть код на питоне как можно ускорить его мультипроцессность не работает?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Здесь только 1 процесс по факту работает , параллелизации нет.

    Для оптимизации можешь распараллелить по первому индексу старта начала комбинации.
    Например, один процесс обрабатывает комбинации начиная с 0 по 4, другой с 5 по 9 и т.д.
    Ответ написан
    3 комментария
  • Как грамотно переопределить метод на Generic?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Сделай как Task: вместо интерфейсов - конкретные классы.

    Это должны быть различные классы - один Generic (с возвращаемым значением), другой без.
    Для совместимости можешь добавить оператор приведения один к другому.

    В C# нет перегрузки по возвращаемому значению. В случае наследования интерфейсов (первый пример) ты создаешь метод и идентичной сигнатурой, но при этом различными возвращаемыми значениями. Вот он и ругается.
    Ответ написан
  • Почему в данном случае возникает ошибка: CS1503 Аргумент 1: не удается преобразовать из "UnityEngine. Quaternion" в "UnityEngine.Vector3"?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Дополняя ответ Василий Банников.

    - Vector3 - это вектор из 3 координат
    - Quaternion - это вектор из 4 координат

    Невозможно преобразовать, т.к. откуда знать что за 4-ая координата
    Ответ написан
  • Почему ParameterizedThreadStart не обощенный?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    - На C, чтобы запустить поток, аргумент потоку передается как void*. Это то же самое, что и object. Зачем пилить больше?
    - Ну сделаешь ты дженерик и что дальше? Другому потоку аргумент передается все равно по ссылке, а не через стек/регистры (как функции). Учи как работают потоки
    Ответ написан
    Комментировать
  • Как пользователю сохранить созданный файл?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    На SO уже есть ответ (ссылка) - он в нижнем примере.

    Подробнее:
    1. Файл отправляется в теле HTTP. Обычно закодирован base64.
    2. В заголовке "Content-Disposition" может быть название файла (самого заголовка может не быть)
    3. Когда браузер принимает файл, то создает свою внутреннюю ссылку на него. Тебе нужно создать свою ссылку (URL.createObjectURL). Потом создаешь тег с полученным URL и "кликаешь" на него (либо п...
    Ответ написан
    Комментировать
  • Как обойти все исполнения программы?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Если хочешь упороться, то можно заюзать формальные верификаторы.
    Например, SPIN.

    Он использует свой язык, поэтому придется дублировать логику.
    На так можно удостовериться в корректности.
    Ответ написан
  • Почему не парсится JSON в Docker-контейнере?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    1) Может у вас прокси стоит, который заголовки удаляет?

    Логи говорят, что невозможно выполнить согласование контента (content negotiation).

    2) Попробуйте вручную зарегистировать Json форматтер для запросов первым с списке.

    В списке первым стоит `Microsoft.AspNetCore.Mvc.Formatters.HttpNoContentOutputFormatter`. Не работал с ним, но название говорит, что это какой-то Fallback класс, который просто скипает запрос
    Ответ написан
    Комментировать
  • Нужно ли при разработке библиотеки следовать принципу одной ответственности?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Это скорее проблема версионирования, чем SRP
    Я бы дал такой ответ: тяните что хотите.
    Почему:
    - Пользователи могут начать использовать вашу версию зависимости - просто откатиться от своей
    - Вы можете выложить новую версию своей библиотеки с обновленными зависимостями
    - Увеличение продуктивности разработки: скорость, удобство

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

    P.S. Как я понял, вы думаете, что увеличение уровня абстракции метода влечет за собой обязательное использование внешних зависимостей, то это не обязательно так - все пишут велосипеды. Например, я однажды написал минималистичный парсер JS, вместо использования сторонних библиотек. Сложность по факту одна и та же, но зависимостей нет.
    Ответ написан
    Комментировать
  • Как подключить сторонню библиотеку с dll-ками к проекту .net core?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    В Rider это можно сделать через тот же самый Add Reference.
    Правая кнопка по проекту -> Add -> Reference... -> Внизу нажимаешь "Add from..." -> Находишь свой dll
    Ответ написан
    Комментировать
  • Как запустить чужую программу в своей?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Если язык C#, то для запуска другого приложения нужен класс Process. С помощью него можно создавать другие процессы. Вот пример
    using System.Diagnostics;
    
    
    var process = Process.Start(new ProcessStartInfo("bash"));
    if (process == null)
    {
        Console.WriteLine($"Could not start");
    }
    else
    {
        Console.WriteLine($"Started. Waiting for exit");
        process.WaitForExit();
    }


    Для C/C++ на Linux есть семейство exec* функций. Например, execve
    Ответ написан
  • Какие есть ресурсы для изучения информатики?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Ответ написан
    Комментировать
  • Как исправить ошибку в PostgrSQL(asyncpg)?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Ошибка в том, что ты не await'ишь user_exists в if
    @dp.message_handler(commands=['start'])
    async def bot_start(message: types.Message):
        if message.chat.type == "private":
            # Вот здесь ты не вставил await
            if not new_ton.user_exists(message.from_user.id):
                await new_ton.add_user(message.from_user.id)
        await message.answer(' Добро пожаловать', reply_markup=client_kb.main_buttons)


    @dp.message_handler(commands=['start'])
    async def bot_start(message: types.Message):
        if message.chat.type == "private":
            # А вот здесь сделал
            user_exists = await new_ton.user_exists(message.from_user.id)
            if not user_exists:
                await new_ton.add_user(message.from_user.id)
        await message.answer(' Добро пожаловать', reply_markup=client_kb.main_buttons)


    Вот так сделай
    @dp.message_handler(commands=['start'])
    async def bot_start(message: types.Message):
        if message.chat.type == "private":
            if not await new_ton.user_exists(message.from_user.id):
                await new_ton.add_user(message.from_user.id)
        await message.answer(' Добро пожаловать', reply_markup=client_kb.main_buttons)
    Ответ написан
    Комментировать
  • Как запретить ввод русских букв в textBox C#?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    На SO уже есть решение через regex

    https://stackoverflow.com/questions/11414452/is-th...

    if (Regex.IsMatch(stringToCheck, @"\p{IsCyrillic}"))
    {
        // there is at least one cyrillic character in the string
    }
    Ответ написан
    1 комментарий
  • Как найти соответствие по generic типу?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Одно из решений
    public interface IParam
    {
    }
    
    public interface IProcessor
    { }
    
    public interface IProcessor<in T>: IProcessor 
        where T : IParam
    {
        public void Apply(T param);
    }
    
    public class ConcreteProcessorA : IProcessor<ConcreteParamA>
    {
        public void Apply(ConcreteParamA param)
        {
            Console.WriteLine("Hello from processor A");
        }
    }
    
    public class ConcreteParamA : IParam
    {
        
    }
    
    public class ConcreteProcessorB : IProcessor<ConcreteParamB>
    {
        public void Apply(ConcreteParamB param)
        {
            Console.WriteLine("hello form ProcessorB");
        }
    }
    
    public class ConcreteParamB : IParam
    {
        
    }
    
    public class Provider
    {
        public Provider(IEnumerable<IProcessor> processors)
        {
            _processors = processors.ToList();
        }
        private List<IProcessor> _processors;
         
        public void Apply<TParam>(TParam param) where TParam: IParam
        {
            foreach (var processor in _processors.Where(p => p
                                                            .GetType()
                                                            .GetInterfaces()
                                                            .Any(i => i.IsAssignableTo(typeof(IProcessor<TParam>))))
                                                 .Cast<IProcessor<TParam>>())
            {
                processor.Apply(param);
            }
            throw new InvalidOperationException("Для переданного типа нет обработчика");
        }
    }
    
    public class Program
    {
        static void Main(string[] args)
        {
            var provider = new Provider(new IProcessor[]
                                        {
                                            new ConcreteProcessorA()
                                        });
            
            provider.Apply(new ConcreteParamA());
            try
            {
                provider.Apply(new ConcreteParamB());
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
            
        }
    }

    Сначала выдает
    Hello from processor A
    затем пишет исключение, т.к. обработчика не нашлось
    Ответ написан
    Комментировать
  • Как удалить событие, добавленное в виде лямбда-выражения?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    В общем случае нельзя, так как объект лямбды создается каждый, поэтому нужно вынести функцию отдельно.
    Но если регистрация и удаление обработчика происходят в одной функции/блоке, то ответ joyrax-dev будет правильным.
    Но можно сделать такой костыль:
    public class MyEvent
    {
        public event EventHandler ActionHappened;
    
        public void FireEvent()
        {
            ActionHappened?.Invoke(this, EventArgs.Empty);
        }
    }
    
    public class SomeClass
    {
        public void RegisterInner(MyEvent @event)
        {
            EventHandler handler = null!;
            handler = (sender, args) =>
            {
                Console.WriteLine("Hello, world");
                @event.ActionHappened -= handler;
            };
    
            @event.ActionHappened += handler;
        }
    }
    public class Program
    {
        public static void Main()
        {
              var myEvent = new MyEvent();
              var someClass = new SomeClass();
              someClass.RegisterInner(myEvent);
              myEvent.FireEvent();
              myEvent.FireEvent();
              myEvent.FireEvent();
              myEvent.FireEvent();
              myEvent.FireEvent();
         }
    }

    Hello, world будет выведен только 1 раз
    Ответ написан
    1 комментарий