Задать вопрос
  • Объясните мне на пальцах рекурсию Фибоначчи 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 комментарий
  • В чём принципиальное отличие 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 комментария
  • Почему потоки накапливаются и не уничтожаются?

    Griboks
    @Griboks Куратор тега C#
    Возможно, у вас не отрабатывает сборка (если отбросить ошибки в коде). Существует редкая ошибка утечки памяти, когда контекст переменной != контекст сборки мусора. Попробуйте избавиться от создания объектов внутри циклов и условий, а перенести всё это в отдельные функции.
    Ответ написан
    Комментировать
  • Почему потоки накапливаются и не уничтожаются?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Смотреть в сторону разницы: Process.GetCurrentProcess().Threads.Count и ThreadPool.ThreadCount
    Скорее всего какой-то сервис создает множество потоков (ручных) и держит ссылки на них, т.к. поток это объект ядра и он должен быть уничтожен когда на него перестают ссылаться, либо это просто поток, который не завершатся (while (true) какой-нибудь)
    Ответ написан
    2 комментария
  • Как реализовать функцию статистики просмотра страницы за некий период?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Тут подходит какая-нибудь аналитическая СУБД. Например, ClickHouse практически для этого и создавался (Click Stream + Ware House).
    Хранить можно следующим образом:
    1. Есть общая таблица по посещениям/визитами с примерно такой структурой [page_id, visit_date] (больше и не надо)
    2. Для хранения статистики создаешь материализованные представления для дня/недели/года

    У них есть тестовые данные для плейграунда сбора аналитики по посещениям/хитам - https://clickhouse-docs.vercel.app/docs/en/getting...
    Ответ написан
    3 комментария
  • Есть ли какой-нибудь способ конвертировать массив или коллекцию List в synchronizedCollection?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    SynchronizedCollection<T> - это легаси из .NET фреймворка, в современном рантмайме ты его не найдешь.
    Могу предложить использовать:
    - BlockingCollection<T>
    - Channel<T>

    Если есть возможность, то конвертируй задачу на Scatter/Gather манеру и необходимость в этих структурах данных отпадет.
    Ответ написан
    Комментировать
  • Можно ли упростить данный код (см. внутри), заменив ConcurrentBag list'ом и установив lock?

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


    1. Для каждого из файлов запусти по потоку (таске), каждый из которых пусть свой файл читает в поисках имеилов.
    2. Для записи в итоговый файл - заведи ещё 1 поток (таску).
    3. Коммуникацию между N читающими и 1 пишущим организуй через System.Threading.Channel

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

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

    UPD: тогда смотрим на количество данных.
    Если имеилов мало (по сравнению с количеством ОЗУ), то тогда можем прямо в памяти держать HashSet и проверять его в пишущем потоке.
    Если имеилов побольше - можем сделать HashSet не по самим и имеилам, а по их хешам.
    Если имеилов совсем много, то тогда можно записывать в отсортированную структуру данных на диск (двоичное дерево поиска например).

    UPD2:
    Для каждого из файлов запусти по потоку (таске), каждый из которых пусть свой файл читает в поисках имеилов.

    На самом деле можно попробовать запустить несколько потоков, разделив каждый файл ещё на N сегментов и назначив потокам эти сегменты. Плодить новые можно до тех пор, пока у тебя IO не кончится.
    Ответ написан
    1 комментарий
  • Не запускается Windows 10 после обновления, происходит циклическая перезагрузка, как решить проблему?

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

    yakovlev_13
    @yakovlev_13
    Шаманство, экзорцизм и некромантия.
    Загрузиться с LiveFlash и запустить установщик Винды через "Обновить", есть вероятность что отпустит.

    UPD: Винду скачать свежую и оф.сайта
    Ответ написан
  • Как можно установить программу на андроид которая только для iOS?

    CityCat4
    @CityCat4
    Жил да был черный кот за углом...
    Поставить на андроид эмулятор яббла. Если он есть конечно :)
    Ответ написан
    4 комментария
  • Как исправить ошибку 404 при доступе к серверу по белому IP?

    karabanov
    @karabanov Куратор тега Linux
    Системный администратор
    Ответ написан
    Комментировать
  • Почему 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 комментария
  • Какую программу/расширение_браузера использовать для автоматической выдачи интересующих статей с определенного сайта?

    @Vlad_hex Автор вопроса
    Всем привет!
    Вижу что вопрос оказался непраздным и некоторым людям интересно узнать какие инструменты я в итоге нашел для выполнения данной задачи.
    Собственно попробовав всякое разное я выделил для себя 2 основных сервиса. Это Google alerts и Distill.
    С Google alerts все более менее понятно. Идете по адресу https://www.google.ru/alerts и настраиваете сбор данных с поисковика на интересующие темы. Сервис крайне полезный, например с помощью него я оперативно узнал что японцы начали сброс зараженной воды с аварийного реактора в океан, хотя первые слухи об этом поползли еще в 2019 году и именно тогда я поставил запрос на сбор информации по теме.
    Но у гугл алертс есть на мой взгляд очень существенный недостаток в виде негибкой настройки времени поступления новостей на почту либо раз в неделю, либо раз в день, либо по мере поступления, ну и высылают ссылки только на почту, хотя кмк в 2024 году можно было добавить хотя бы Телеграм. Сервис выглядит полузаброшенным и не развивается, хотя со своей основной функцией в принципе справляется.
    Distill - сервис подсказал ChatGPT. Как следует из названия он поставляет "дистилированную" информацию с интересующих сайтов, можно выбрать конкретный блок сайта, и добавить условие текстовое.
    Писал сервис скорее всего тоже ChatGPT потому что при начальной хорошей задумке он имеет не очень внятную реализацию и запутанный внутренний интерфейс, видно что авторы старались как могли, но их познания в UX не продвинулись дальше интерфейса Norton Comander. Для того чтобы пользоваться этим сервисом крайне желательно иметь познания в области CSS и уметь ковырять консоль браузера, а так же иметь представление о синтаксисе регулярных выражений.
    В принципе имеет довольно гибкие настройки, наверняка отлично подойдет тому кто хочет отслеживать цены на Авито или какие-нибудь акции с бесплатными раздачами и ограниченным количеством.
    Для того чтобы им пользоваться установите расширение браузера из хромстор и зарегистрируйтесь на сайте Distill https://distill.io/ . Есть версия и для Android, но я не пользовался.
    Ответ написан
    Комментировать
  • Почему C# не кроссплатформенный?

    @Jhayphal
    Посмотрите Avalonia UI, Asp.net 8, Maui, etc. Ещё как кроссплатформенный. Более того, при этом высоко производительный. Особенно если юзать native aot.
    Ответ написан
    Комментировать
  • Как практиковаться в программировании?

    delphinpro
    @delphinpro
    frontend developer
    На мой взгляд лучший вариант изучения языка - писать то что именно тебе нужно, или хотя бы интересно.

    Я начал изучать программирование лет двадцать назад, поэтому мой опыт может показаться странным, но все же. В моем распоряжении был компьютер на 386 процессоре и монохромный монитор с 4 градациями цвета (белый, серый, темный и черный). Конечно я видел и цветные мониторы и 95 винду на них. Мне тоже хотелось окошечки, графический интерфейс и все такое прочее. Хочется - сделаем. Книжки в зубы (в библиотеке O_o), редкие походы в компьютерные клубы, за инфой из интернета (сколько поместится на дискету?) - и вперед, пилить оконный менеджер под ДОС на турбопаскале.
    Конечно, свою винду я не написал =) Но зато паскаль выучил, объектное программирование, детально разобрался как работает компьютер и операционная система, что такое резидентные программы в досе.
    А потом купил нормальный комп =)

    К чему я это всё? А к тому, что если у тебя есть желание научится программировать, ты возьмешь и научишься, даже на калькуляторе.
    Ответ написан
    1 комментарий
  • Как практиковаться в программировании?

    saboteur_kiev
    @saboteur_kiev Куратор тега Программирование
    software engineer
    Забей на программирование, это не твое.

    Если тебе не интересно работать в консоли, неинтересно с формочками, то может быть, сильно настучав себе на голове ты это и сможешь осилить, и может быть даже сможешь осилить интервью и трудоустройство. Но на работе все равно быстро перегоришь и будешь жить несчастную жизнь.

    Найди ту деятельность, где у тебя глаза горят.
    Ответ написан
    4 комментария
  • Как использовать webapp проект как библиотеку?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Во-первых, почти любое веб приложение - консольное. Т.е. не оконное, не служба.
    Во-вторых, если тебе нужен WebHook, то у Telegram.Bot есть пример, как это сделать (используется ASP.NET Core) - https://github.com/TelegramBots/Telegram.Bot.Examp...
    В-третьих, не стоит делать выполняемые приложения (консольные, веб, сервисы) зависимыми от других - это плохо.
    Ответ написан
    3 комментария
  • Откуда происходит затухание при моделировании падения частицы?

    Ocelot
    @Ocelot
    Не важно, где имненно находится точка отскока, шарик должен подниматься на одну и ту же высоту. Можно сделать так: как только заметили, что шарик зашёл под границу, инвертируем его скорость, не меняя координаты.
    if (p.Pos.Y >= maxH && p.Velocity.Y > 0)
    {
        p.Velocity.Y *= (-1);
    }
    Ответ написан
    1 комментарий