• Как сделать шаблонный метод для мат операций с числами и Типом Vector2?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Интерфейсов чисел он не реализует. Есть 2 костыля:
    1. Вести словарь функций сложения
    var typeToFunc = new Dictionary<Type, AddFunc>() {{typeof(int), IntAdd}, {typeof(Vector2), Vector2Add}};
    
    var left = 123;
    var right = 14455;
    var result = Add(left, right);
    Console.WriteLine($"Результат сложения {left} и {right} = {result}");
    
    var leftVector = new Vector2(123, 55);
    var rightVector = new Vector2(55, 111);
    var resultVector = Add(leftVector, rightVector);
    Console.WriteLine($"Результат сложения {leftVector} и {rightVector} = {resultVector}");
    
    T Add<T>(T left, T right)
    {
        return ( T ) typeToFunc[typeof(T)](left, right);
    }
    
    object Vector2Add(object left, object right)
    {
        return ( Vector2 ) left + ( Vector2 ) right;
    }
    
    object IntAdd(object left, object right)
    {
        return (int) left + (int) right;
    }
    
    delegate object AddFunc(object left, object right);

    2. Создай монаду с int и Vector2
    var number = NumberOrVector2<int>.FromNumber(123);
    var newNumber = number.Add(() => 23, () => throw new InvalidOperationException("хранится число"));
    if (newNumber.TryGetNumber(out var result))
    {
        Console.WriteLine($"Получился результат: {result}");
    }
    else
    {
        Console.WriteLine($"Ошибка - хранился вектор");
    }
    
    public readonly struct NumberOrVector2<TNumber> where TNumber: unmanaged, INumber<TNumber>
    {
        private readonly TNumber _number;
        private readonly Vector2? _vector;
    
        private NumberOrVector2(TNumber number, Vector2? vector)
        {
            _number = number;
            _vector = vector;
        }
    
        public bool TryGetNumber(out TNumber number)
        {
            number = _number;
            return !_vector.HasValue;
        }
    
        public bool TryGetVector(out Vector2 vector)
        {
            vector = _vector.GetValueOrDefault();
            return _vector.HasValue;
        }
    
        public NumberOrVector2<TNumber> Add(Func<TNumber> numberAdd, Func<Vector2> vectorAdd)
        {
            if (_vector is {} vector)
            {
                return new NumberOrVector2<TNumber>(_number, vector + vectorAdd());
            }
    
            return new NumberOrVector2<TNumber>(_number + numberAdd(), null);
        }
        
        public static NumberOrVector2<TNumber> FromNumber(TNumber number)
        {
            return new NumberOrVector2<TNumber>(number, null);
        }
        
        public static NumberOrVector2<TNumber> FromVector(Vector2 vector)
        {
            return new NumberOrVector2<TNumber>(default, vector);
        }
    }
    Ответ написан
    Комментировать
  • Как реализовать базовый класс для динамического создания подклассов без вызова рекурсии в Python?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Во-первых, этот паттерн называется абстрактная фабрика.
    Во-вторых, __new__ используется для выделения памяти, так что не надо его перегружать
    Ответ написан
  • Как сделать так, чтобы при регистрации пользователя в телеграмм боте его ID сохранялся в файле только один раз?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    использовать SQlite (поддержка которого встроена в питон) + индексы навесить на ID пользователя
    Ответ написан
    2 комментария
  • Как в пайтон вводя имя переменной вызвать её?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    print(eval(variable_name))
    Ответ написан
  • Что значит четырёхканальные комлекты ОЗУ?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Да, они одинаковы.
    Смысл в том, что вероятность их корректной работы в 4-х канальном режиме очень высокая (если вставишь вместе). Если покупать раздельно, даже одинаковые по характеристикам, дате выпуска и т.д., то они могут не подружиться.
    Ответ написан
  • API для аниме где и откуда его берут?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Не знаю кто это "все берут", но если ты имеешь ввиду сайты по типу jit.su, shikimori.one, animego.org и др., то у них свои собственные базы данных с API.
    Реверс инжиниринг в помощь
    Ответ написан
    Комментировать
  • Почему VSCode не создаёт блок Main при создании нового консольного приложения на C#?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Это называется Top Level Main - https://metanit.com/sharp/tutorial/1.4.php (начиная с C# 9)
    Кратко - нет смысла переделывать.
    Функциональность та же самая, разница только в том, что Main() генерируется компилятором, но преимущество - можно не заморачиваться над сигнатурой (например, можно влепить async/await и не менять void на async Task)
    Ответ написан
    Комментировать
  • Как отслеживать и выводить обновления базы данных?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    1. Здесь, скорее всего нужны триггеры. На SO есть похожий вопрос - https://stackoverflow.com/questions/26418412/how-t...
    2. В данном случае, тебе нужно использовать больше чем 1 СУБД. Предлагаю такой вариант:
    - MySQL - для хранения всех сообщений
    - Redis - для очереди событий

    Алгоритм такой:
    1. Кто-то отправляет сообщение
    2. Сохраняешь сообщение в БД
    3. Публикуешь событие "сообщение добавлено"
    4. Все подписавшиеся отправляют это сообщение своим клиентам

    Получение истории - при первом подключении (это уже SELECT)

    Т.е. тут без активного опроса.
    P.S. если сервер только 1, то и какая-нибудь inmemory очередь сообщений сойдет.

    3. SignalR твою проблему не решит - это просто фреймворк поверх вебсокета (рекомендую использовать его, т.к. облегчает многие задачи). Твоя проблема кроется скорее в слое хранения, т.к. mysql (как и любая другая реляционная СУБД) плохо заточена под event-driven архитектуру, скорее запрос-ответ.
    Ответ написан
    1 комментарий
  • Как добавить места к диску Ubuntu?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Нашел ответ здесь: https://askubuntu.com/questions/435655/gparted-mer...
    1. Размонтируй (unmout) фс, которую хочешь увеличить
    2. Расширь ее
    3. Смонтируй обратно
    Ответ написан
    Комментировать
  • Методы обработки информации?

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

    Учиться системно:
    - Разработать план обучения (roadmap'ов много в интернете);
    - После изучения темы закрепи на практике;
    - Для себя построй ментальную карту области знаний;
    - Помни про правило бойскаута: "после себя оставляй место чище, чем было до тебя" . В данном ключе - если тебе сказали про А, то узнай что идет дальше, почему А и т.д. (копай в глубь)
    Какие есть методы, что почитать? В первую очередь применительно к изучению IT-технологий.

    Их нет. Это опыт, насмотреность и большое количество граблей.
    Для IT - больше практики
    Ответ написан
    2 комментария
  • Как определить пропускную способность сервера?

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

    Лучше добавь метрики в приложение и отслеживай их. Например, Prometheus.
    Если хочешь узнать лимит - то тут уже нагрузочное тестирование
    Ответ написан
    8 комментариев
  • Python - OAuth2, какие есть методы кроме селениума?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Тебе нужно использовать их API, а не браузер напрямую.
    Ссылка на их API - https://github.com/eweitz/ideogram/blob/master/api.md

    P.S. дальше сам разберешься
    Ответ написан
  • Как вывести ссылку в переменную asp dot net core?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Метод расширения GetDisplayUrl() у Request объекта (если это MVC)

    [ApiController]
    [Route("[controller]")]
    public class SampleController : ControllerBase
    {
        [HttpGet("")]
        public IActionResult GetPath()
        {
            return Ok( Request.GetDisplayUrl() );
        }
    }
    Ответ написан
    Комментировать
  • Подходит ли Python для первого языка ребёнку?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Зависит от целей:
    - Если нужно просто познакомить с программированием - алгоритмы, логика, - то паскаль сойдет
    - Если хотите дать более фундаментальные знания - то тут уже C/C++ (щадящие версии)

    Я бы не начинал с питона:
    - Сложный переход на другие ЯП
    - Слабое понимание работы компьютеры (типы и т.д.)
    - Непонятные сообщения об ошибках
    Ответ написан
    1 комментарий
  • Access логи. Нужны ли на серверах с большой опсещаемостью?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Создают ли эти логи нагрузку на диск и сервер в целом?

    Создают
    нужно ли отключать access логин для nginx

    1. Для критичных путей оставь (логин, изменения данных).
    2. Для GET запросов и других не важных можешь использовать самплинг - записываешь только определенный процент логов, а не все (выборка)
    Ответ написан
    Комментировать
  • Как исправить ошибку ложного подключения на стороне TcpClient?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Для взаимодействия ты используешь TCP.
    Connect() возвращается, когда установлено соединение, но само соединение все еще может находиться в очереди - то, что здесь и происходит.
    Поэтому, лучше такое решение:

    const int maxPartySize = 2;
    var party = new List<TcpClient>();
    var locker = new object();
    
    var ip = IPAddress.Loopback;
    var port = 50000;
    var server = new TcpListener(ip, port);
    
    server.Start(128);
    Console.WriteLine("Сервер запущен..");
    
    while (true)
    {
        var client = await server.AcceptTcpClientAsync();
        _ = ProcessClientAsync(client);
        Console.WriteLine($"Клиент {client.Client.RemoteEndPoint} подключен. Текущий размер группы: {party.Count}");
    }
    
    async Task ProcessClientAsync(TcpClient client)
    {
        await Task.Yield();
        bool added;
        lock (locker)
        {
            if (added = party.Count < maxPartySize)
            {
                party.Add(client);
            }
        }
    
        if (added)
        {
            Console.WriteLine($"Клиент {client.Client.RemoteEndPoint} добавлен в группу");
        }
        else
        {
            Console.WriteLine($"Клиент {client.Client.RemoteEndPoint} НЕ добавлен в группу");
        }
        
        client.Close();
    }


    P.S. когда принимаешь клиента не нужно писать using TcpClient client = ... иначе клиент закроется до начала его обработки
    Ответ написан
    Комментировать
  • Как выполнить команду подхватывая окружения хоста и удалённого сервера?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Экранировать $?
    ssh $REMOTE_SERVER_ADDRESS "\$(docker stop \$(docker ps -q -f ancestor=\$CI_PROJECT_NAME)) && echo CONTAINER \$CI_PROJECT_NAME STOPPED || echo CONTAINER \$CI_PROJECT_NAME NOT FOUND"
    Ответ написан
  • Какой ЯП подходит для производственного ERP?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Какой хочешь.
    Равнозначно

    UPD:
    Лично я, как предприниматель, бы делал выбор между C# / Java
    Причины:
    1. Сформированное, "взрослое" (mature) сообщество, которое может помочь
    2. Существуют проверенные/документированные фремворки
    3. Для общих случаев (настройка БД, создание диаграмм, документирование кода, какие-нибудь паттерны) уже есть удобные инструменты/фреймворки
    4. Рынок разработчиков большой
    5. Эти ЯП позволяют абстрагироваться от инфраструктуры или упростить работу с ней (управление памятью, вопросы ABI, версионирование, сборка и т.д.)
    Ответ написан
    1 комментарий
  • Почему в semaphore методы acquaire() и tryAcquire() захватывают блокировку по разному?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    А что тут не понятно?
    1. Все потоки быстро запустились, вызвали tryAcquire и, т.к. он не блокирующий, тут же вызывается Thread.Sleep() на всех потоках - поэтому в первом случае в конце видны Thread-x-released (все потоки закончили работу). Время выполнения всего приложения -
    2. Все потоки постепенно захватывают семафор, т.е. ждут пока предыдущий его освободит и только потом засыпают. Уже тут время выполнения - 1с * (кол-во потоков / 2)

    P.S. Не забывай вызывать Thread.join после запуска!
    Ответ написан
    Комментировать
  • Полезность моделей памяти которые отличный от linear?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Во-первых, речь идет об Адресации памяти, а не Модели памяти - это совершенно разные вещи:
    - Адресация памяти - то, как мы к памяти обращаемся
    - Модель памяти - какие ограничения выставляются на рантайм. Например, реордеринг операций

    Не совсем понял, чем представленная модель отличается от обычной линейной. Если только тем, что указанный reference - любое число, а не просто смещение от базы, то:
    - Это только лишние расходы на определение реального адреса
    - Виртуальная память уже реализует такую концепцию, но более сложную - с несколькими уровнями адресации - https://www.kernel.org/doc/html/latest/mm/page_tab...

    Мне кажется что данная модель памяти подойдет для машины заточенной под ООП (привет java)

    Единственное преимущество - локальность (кэш хиты). Но его и самим можно добиться.
    В той же самой джаве это делается через паттерн Off Heap

    для машины с защитой памяти так как из reference выйти не получиться,то есть мы не сможем повредить память другого reference


    См. иерархию страниц памяти. Там это уже реализовано

    Собственно полезна ли данная модель памяти


    Полезна, но уже устарела. Сейчас используются более продвинутые стратегии - https://ru.wikipedia.org/wiki/Адресация_памяти

    если для операций над памятью буду использоваться load/store

    А как иначе?

    а алоцирование кусочков будет проводиться чем-то похожем на new

    Любой new под капотом использует системные вызовы, которые этот самый load/store вызывают
    Ответ написан
    Комментировать