• Как докер контейнер выпустить в сеть через один из внешних IP адресов?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Укажи тип сети host - --network host и передай нужный IP
    Ответ написан
  • Какие есть сервисы/боты/сайты для дешевого использования midjourney?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Ответ написан
    Комментировать
  • Не запускается Windows 10 после обновления, происходит циклическая перезагрузка, как решить проблему?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Значит откат повредил систему. Тут только заново винду установить
    Ответ написан
    8 комментариев
  • Как сделать функционал выдачи релевантного результата на основе выбранных параметров?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    От языка это не зависит - это про алгоритмы.
    Я вижу 2 варианта:
    1. Обучить рекомендательную модель (вряд-ли подойдет в этом случае)
    2. Использовать БД:
    - Вначале делаешь фильтрацию по указанным полям: возраст, цена, бюджет и т.д.
    - После сортируешь по рейтингу/популярности

    Во 2 случае, рейтинг/популярность вначале могут быть выставлены самостоятельно, а дальше пользователи сами будут его обновлять
    Ответ написан
  • В чём принципиальное отличие Eager/Explicit Loading от прямого использования Join-ов через LINQ в контексте EF Core?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    То что ты описал - разные понятия.

    Например, у тебя есть one-to-many и это представляется списком (ICollection).
    class User
    {
         public string Name { get; set; }
         public ICollection<Subscription> Subscriptions { get; set; }
    }


    Eager/Explicit/Lazy Loading

    Это КОГДА ты данные будешь получать.

    Тогда действия будут следующими:
    - Eager - не важно нужны тебе эти данные или нет - они все равно будут загружены. Тут ты сразу получишь все подписки (Subscriptions) даже если тебе просто нужно узнать Name
    - Lazy - они будут загружены, только когда обратишься к этому полю, т.е. в момент обращения к полю Subscriptions
    - Explicit - это стратегия когда ты сначала подгружаешь объекты в DbContext, а потом (в будущем) когда понадобятся загрузить из памяти - без сетевых запросов. Это уже про метод Load() у DbContext.

    Select/SelectMany/GroupMany

    Это ЧТО ты хочешь получить

    Пример все тот же:
    - Select - например, тебе нужно получить только имена, тогда ты создаешь анонимные объекты:
    context.Users.Select(u => new { u.Name });
    - SelectMany - тебе нужен только список подписок всех пользователей из списка
    context.Users.Where(u => someIds.Contains(u.Id)).SelectMany(u => u.Subscriptions); // Не уверен что запрос корректный

    - GroupBy - это уже JOIN

    Смысл ты понял - это разные зоны ответственности: КОГДА получать данные и КАКИЕ данные получать
    Ответ написан
    3 комментария
  • Как правильно расшифровать данные из изображения в c#?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Нашел много недочетов, но главная ошибка здесь:
    char charToEncode = textToEncrypt[charIndex++];
    
                        byte[] colorBytes = new byte[] { originalColor.R, originalColor.G, originalColor.B };
                        for (int i = 0; i < 3; i++)
                        {
                            int bitIndex = (bitsPerChannel * i); 
                            if (bitIndex < 8)
                            {
                                colorBytes[i] = (byte)((colorBytes[i] & ~1) | ((charToEncode >> bitIndex) & 1));
                            }
                        }


    Я так полагаю, что символы сообщения кодируются в LSB, но проблема здесь в том, что кодируются только последние 3 бита - остальное (8 - 3 = 5 битов теряются). Т.е. сообщение восстановить никак

    + Сам цикл выглядит очень странно.
    Главный вопрос - зачем?
    Параметризовать алгоритм стеганографии подобным образом не очень оптимально, т.к. каждый создается с использованием тех или иных фич, который строго захардкожены и используют особенности конкретного формата. Цикл + проверка здесь только ухудшают понимание кода (ИМХО)
    Убери этот цикл, т.к. во-первых, станет понятнее, во-вторых, условие внутри при этой константе всегда выполняется.

    Теперь про декодирование:
    for (int i = 0; i < 3; i++)
                    {
                        int bitIndex = (bitsPerChannel * i);
                        if (bitIndex < 8)
                        {
                            charCode |= (byte)((encodedColor.ToArgb() >> bitIndex) & 1);
                            if (bitIndex <= 2)
                            {
                                charCode <<= bitsPerChannel;
                            }
                        }
                    }

    Вот этот участок тоже неправильно работает, т.к. ты кодируешь символы в LSB, а читаешь последние 3 бита - из них только 1 бит содержит данные.
    Ответ написан
    Комментировать
  • Как правильно работать с ветками?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Для пет проекта достаточно 2 веток - master и dev:
    - master - работающий код, красивый, причесаный
    - dev - в нем ведется вся работа

    Нет смысла упарываться во всякие git flow, github flow и еже с ними. Над проектом работаешь ТОЛЬКО ТЫ, а значит делать надо как тебе удобнее.
    Думать об этом надо только если над одним проектом работает больше 1 человека.

    P.S. можно и одной веткой обойтись, но так удобнее откатываться и точно знаешь, что рабочий код не затронется
    Ответ написан
    Комментировать
  • Какие есть инструменты и решения для экстремально быстрой online-аналитики потоковых данных?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Ответ: Для экстремально быстрой online-аналитики нужны экстремально быстрые инструменты

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

    Все что могу предложить:
    - Горизонтально масштабировать софт, который эти данные от источников читает
    - Использовать ClickHouse для хранения данных

    Почему ClickHouse:
    - Создан для OLAP задач
    - Имеет поддержку шардирования причем шарды независимы - не нужно тратиться на синхронизацию

    P.S. если это задача по трейдингу, то советую копать в сторону HFT
    Ответ написан
  • В каком файле хрянятся сессии Opera в Ubuntu?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    А ~/.opera директория есть? Возможно там в папке cache.
    Как минимум, на первой странице нашел - https://otvet.mail.ru/question/37334279
    Ответ написан
    Комментировать
  • Как перезагрузить контейнер в docker-compose с обновлением volumes?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Как перезапустить только один из сервисов с обновлением volumes?

    Добавляешь новый вольюм в docker-compose файл и запускаешь docker compose up -d service.
    сервис обновится и вольюм добавится
    И можно в контейнерах указать не отдельные файлы, а папку всего nginx сразу?

    Можно
    Ответ написан
    4 комментария
  • Какая библиотека для python больше подходит для автоматизации приложений на windows?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Тут подходит AutoIt - https://www.autoitscript.com/site/
    Но это не питон, там свой язык скриптов
    Ответ написан
    Комментировать
  • Как поменять значения во всех таблицах postgresql?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Нашел ответ тут - https://fraserclark.net/2023-10-06-rds-oids/
    Вот скрипт, который он предложил:
    #!/bin/bash
    
    # I found without setting this the script would fail
    export PGPASSWORD=xxxx
    
    # Define your query
    QUERY="SELECT current_database(),n.nspname ,c.relname, c.relkind from pg_class c, pg_attribute a, pg_namespace n where c.oid = a.attrelid and a.attname = 'oid' AND c.relnamespace = n.oid AND n.nspname NOT IN ('pg_catalog', 'information_schema') and c.relkind = 'r';"
    
    # Get a list of all databases in the RDS cluster
    DATABASES=$(psql -h hostname.eu-west-2.rds.amazonaws.com -p 5432 -U postgres -c "SELECT datname FROM pg_database WHERE datname NOT IN ('template0', 'template1');" -t)
    
    # Loop through each database and execute the query
    for DB in $DATABASES; do
        echo "Running query on database: $DB"
        psql -h qa-hostname.eu-west-2.rds.amazonaws.com -t -c "$QUERY" -U postgres -d $DB
    done
    Ответ написан
  • Как добавлять location в server из командной строки или генерировать конфиг динамически?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Это можно реализовать с помощью скрипта по типу такого питонвского скрипта:
    import os
    import signal
    import random
    
    
    def get_versions_with_addresses():
        # Надо уметь получать новые версии
        return [
            ('1.0.1', '0.0.0.0:6665'),
            ('1.1.0', '0.0.0.0:2222')
        ]
    
    
    def generate_config():
        config = '''
    server {
        server_name api.domain.com;
        listen 80;
        '''
        for version, address in get_versions_with_addresses():
            config += f'''
        location /project_name/{version} {{
            proxy_pass http://{address}
        }}
            '''
        config += '\n}'
        return config
    
    
    def notify_nginx():
        nginx_pid = ...  # Находим PID nginx
        os.kill(nginx_pid, signal.SIGHUP)
    
    
    def update_config(config):
        with open('/etc/nginx/nginx.conf', 'w') as file:
            file.write(config)
    
    
    def main():
        config = generate_config()
        update_config(config)
        notify_nginx()
    
        pass
    if __name__ == '__main__':
        main()


    Здесь осталось понять как находить PID nginx и как определять адреса редиректа для версий.

    ИМХО: я считаю что такие вещи должны обрабатываться самим приложением, т.к.
    1. Некоторые разницы в версиях должны обрабатываться на стороне приложения, например, при миграции нужно использовать новую таблицу, а создавать триггеры и поддерживать их до конца плохая затея, либо генерация событий в очередь сообщений
    2. Тебе придется запускать постоянно новые процессы или держать каждый инстанс на отдельной машине, что немного ресурсоемко
    3. На мой взгзляд, версионирование API должно быть по типу v1, v2, v3, а не такая гарнулярная как сематическое версионирование. Это не гит и новые версии, которые ты публикуешь надо поддерживать долго + в данном случае, список свободных адресов скоро закончится
    4. Тебе придется поддерживать дополнительную инфраструктуру по отслеживанию новых версий приложения
    Ответ написан
    Комментировать
  • Объясните мне на пальцах рекурсию Фибоначчи F(4, например). Это самый простой алгоритм, а я не могу понять. Что мне делать?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Сначала n=2, затем n=0, потом снова n=2

    Рекурсивные функции лучше визуализировать в виде дерева вызовов. В данном случае, это будет бинарное дерево, т.к. 1 функция (F(n)) может вызвать максимум 2 подфункции (F(n - 1) и F(n -2)).
    Теперь самое интересное - представление в отладчике.
    Вспомни, что функция заканчивается return F(n -1) + F(n - 2). Ответ на твой вопрос кроется здесь.
    На самом деле эта конструкция разворачивается в нечто подобное:
    int prev = F(n - 1);
    int prevPrev = F(n - 2);
    return prev + prevPrev;

    На словах:
    1. Ты вызываешь корневой F(2) - n = 2
    2. Дебагер заходит в функцию и опускается до return F(n - 1) + F(n - 2)
    3. Заходит в F(n - 1) - n = 1
    4. Эта функция возвращает 1 - ты снова в родительской функции n = 2
    5. Заходит в F(n - 2) - n = 0
    6. Эта функция возвращает 1 - ты снова в родительской функции n = 2
    7. Родительская (исходная) функция возвращает сумму - 1 + 1
    Ответ написан
    1 комментарий
  • Почему команда IN не меняет флаги процессора?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Во-первых, а что если там был 0? Тебе все равно придется писать свои костыли для проверки чтения. Разница будет в том, что больше процессорного времени будет затрачено
    Во-вторых, предположу, что это также для унификации чтения/записи. Легче работать, когда работа ведется по одному шаблону и не нужно постоянно помнить подобные детали.
    Ответ написан
    1 комментарий
  • Почему иногда не создаются автоматически свойства и команды mvc wpf?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Это называется IntelliSense - технология автодополнения кода.
    Иногда не срабатывает, потому что:
    - либо код неправильно написан и плагин его не понимает
    - либо индексация не закончилась
    - либо действительно нельзя ничего дополнить
    - либо ошибке в самом плагине

    По твоему вопросу возможно есть тут ответ - https://stackoverflow.com/questions/47595772/custo...
    Ответ: влияет расположение элементов в коде. по ответу все должно идти в таком порядке:
    1. Окно
    2. DataContext
    3. Твой код
    4. AttachedProperty
    Ответ написан
    Комментировать
  • Почему gpu вычисления ILGPU медленнее в 10 раз чем CPU?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Вот из-за этого:
    // Initialize ILGPU.
         Context context = Context.CreateDefault();
         Accelerator accelerator = context.CreateCLAccelerator(1);//context.GetPreferredDevice(preferCPU: false)  .CreateAccelerator(context);
    
         // Load the data.
         using  MemoryBuffer1D<float, Stride1D.Dense> deviceData = accelerator.Allocate1D(input);
         using MemoryBuffer1D<float, Stride1D.Dense> deviceOutput = accelerator.Allocate1D<float>(output);
    
         // load / precompile the kernel
         Action<Index1D, ArrayView<float>, ArrayView<float>> loadedKernel =
             accelerator.LoadAutoGroupedStreamKernel<Index1D, ArrayView<float>, ArrayView<float>>(Kernel);
    
    
         // finish compiling and tell the accelerator to start computing the kernel
             loadedKernel((int)deviceOutput.Length, deviceData.View, deviceOutput.View);
             accelerator.Synchronize();


    Объяснение: ты в каждом тесте постоянно создаешь новые объекты, которые необходимы для работы фреймворка. Это должно быть тяжелые объекты (много содержат, тяжело инициализируются).
    Вынеси их инициализацию из-вне метода в какой нибудь Setup метод. Раз уж ты пользуешься BenchmarkDotNet, то вот помощь с этим

    UPD: оптимизировал бенчмарк - теперь GPU быстрее
    public class SampleBenchmark
    {
        static void Kernel(Index1D i, ArrayView<float> data, ArrayView<float> output)
        {
            output[i] = data[i % data.Length];
        }
        public static IEnumerable<object[]> Arguments => new[] {new object[]{new float[1000000], new float[1000000]} };
        private float[] _outputBuffer = new float[1000000];
        private float[] _inputBuffer = new float[1000000];
        
        private Context? _context;
        private Accelerator? _accelerator;
        private Action<Index1D, ArrayView<float>, ArrayView<float>>? _loadedKernel;
        private MemoryBuffer1D<float, Stride1D.Dense>? _deviceData;
        private MemoryBuffer1D<float, Stride1D.Dense>? _deviceOutput;
        
        [GlobalSetup]
        public void Setup()
        {
            var random = new Random();
            for (var i = 0; i < _inputBuffer.Length; i++)
            {
                _inputBuffer[i] = random.NextSingle();
            }
            
            _context = Context.CreateDefault();
            _accelerator = _context.GetPreferredDevice(preferCPU: false).CreateAccelerator(_context);
            _loadedKernel = _accelerator!.LoadAutoGroupedStreamKernel<Index1D, ArrayView<float>, ArrayView<float>>(Kernel);
            _deviceData = _accelerator!.Allocate1D(_inputBuffer);
            _deviceOutput = _accelerator!.Allocate1D(_outputBuffer);
        }
    
        [GlobalCleanup]
        public void TearDown()
        {
            _context?.Dispose();
            _accelerator?.Dispose();
            _deviceData?.Dispose();
            _deviceOutput?.Dispose();
        }
        [ArgumentsSource(nameof(Arguments))]
        [Benchmark]
        public void GPUTest(float[] input, float[] output)
        {
            // finish compiling and tell the accelerator to start computing the kernel
            _loadedKernel!((int)_deviceOutput.Length, _deviceData.View, _deviceOutput.View);
            _accelerator!.Synchronize();
        }
    
        [Benchmark]
        [ArgumentsSource(nameof(Arguments))]
        public void CpuTest(float[] input, float[] output)
        {
            for (var i = 0; i < input.Length; i++)
            {
                output[i] = input[i];
            }
        } 
    }


    | Method  | input           | output          | Mean      | Error    | StdDev   |
    |-------- |---------------- |---------------- |----------:|---------:|---------:|
    | GPUTest | Single[1000000] | Single[1000000] |  61.18 us | 0.101 us | 0.095 us |
    | CpuTest | Single[1000000] | Single[1000000] | 243.54 us | 3.114 us | 2.600 us |
    Ответ написан
    2 комментария
  • Насколько разумно при композиции позволять компоненту управлять родителем?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    С точки зрения ЯП/Рантайма, это приведет к кольцевой зависимости, а это порождает различные баги (например, освобождение памяти), поэтому так лучше не делать.
    С точки зрения проектирования, Car не должен знать о Driver - это Driver должен знать о Car, т.к. он ей управляет. Здесь, по факту, водитель - это контроллер какого-то объекта.
    Ответ написан
    2 комментария
  • Как получить реальный ip в nginx, если он в docker?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Первый вариант - передаешь адрес вручную (например, через переменные окружения)
    Второй вариант - изменяешь тип сети контейнера

    При запуске контейнера необходимо указывать --network host
    Тогда контейнер не будет в изолированной сети и будет использовать сеть хоста - как будто не в докере запускается.
    Чтобы IP адрес получить можно ip route использовать. Например, так:
    /sbin/ip route|awk '/default/ { print $3 }'

    Замечание: этот скрипт находит IP помеченный путем по умолчанию, если у тебя несколько интерфейсов, то возможно придется указывать вручную.
    Ответ написан