uk
Feedback
.NET epeshk blog

.NET epeshk blog

Відкрити в Telegram

Канал с заметками о C# и .NET Поддержать канал: https://t.me/blog_donate/2 Обратная связь: https://forms.gle/3uRz7FmzUA26Kw4y5

Показати більше
2 689
Підписники
Немає даних24 години
-27 днів
-1730 днів

Триває завантаження даних...

Залучення підписників
червень '26
червень '26
+3
в 0 каналах
травень '26
+22
в 0 каналах
Get PRO
квітень '26
+26
в 0 каналах
Get PRO
березень '26
+13
в 0 каналах
Get PRO
лютий '26
+25
в 1 каналах
Get PRO
січень '26
+32
в 1 каналах
Get PRO
грудень '25
+27
в 0 каналах
Get PRO
листопад '25
+35
в 0 каналах
Get PRO
жовтень '25
+53
в 0 каналах
Get PRO
вересень '25
+54
в 0 каналах
Get PRO
серпень '25
+52
в 0 каналах
Get PRO
липень '25
+40
в 0 каналах
Get PRO
червень '25
+44
в 1 каналах
Get PRO
травень '25
+72
в 0 каналах
Get PRO
квітень '25
+26
в 0 каналах
Get PRO
березень '25
+50
в 1 каналах
Get PRO
лютий '25
+50
в 0 каналах
Get PRO
січень '25
+94
в 1 каналах
Get PRO
грудень '24
+45
в 0 каналах
Get PRO
листопад '24
+131
в 0 каналах
Get PRO
жовтень '24
+104
в 1 каналах
Get PRO
вересень '24
+111
в 2 каналах
Get PRO
серпень '24
+76
в 0 каналах
Get PRO
липень '24
+85
в 1 каналах
Get PRO
червень '24
+201
в 1 каналах
Get PRO
травень '24
+63
в 2 каналах
Get PRO
квітень '24
+424
в 3 каналах
Get PRO
березень '24
+182
в 0 каналах
Get PRO
лютий '24
+72
в 0 каналах
Get PRO
січень '24
+35
в 0 каналах
Get PRO
грудень '23
+34
в 0 каналах
Get PRO
листопад '23
+46
в 0 каналах
Get PRO
жовтень '23
+113
в 0 каналах
Get PRO
вересень '23
+107
в 0 каналах
Get PRO
серпень '23
+95
в 0 каналах
Get PRO
липень '23
+36
в 0 каналах
Get PRO
червень '23
+18
в 0 каналах
Get PRO
травень '23
+56
в 0 каналах
Get PRO
квітень '23
+439
в 0 каналах
Дата
Залучення підписників
Згадування
Канали
20 червня+1
19 червня+1
18 червня0
17 червня0
16 червня0
15 червня0
14 червня0
13 червня0
12 червня0
11 червня0
10 червня0
09 червня0
08 червня0
07 червня+1
06 червня0
05 червня0
04 червня0
03 червня0
02 червня0
01 червня0
Дописи каналу
Главное, не списывать точь-в-точь, чтоб не спалили
Главное, не списывать точь-в-точь, чтоб не спалили

2
Главное, не списывать точь-в-точь, чтоб не спалили
2
3
goodbye, gc.cpp! Ушла эпоха. В .NET 11 Garbage Collector разделили по файлам. Больше нет легендарного gc.cpp с более 50к строк кода https://github.com/dotnet/runtime/pull/125703
2 702
4
Возвращаемся к теме многопоточности
Возвращаемся к теме многопоточности
2 183
5
Немає тексту...
3 773
6
Нарратив про AI bubble, который вот-вот взорвётся почти полностью исчез
Нарратив про AI bubble, который вот-вот взорвётся почти полностью исчез
4 440
7
C# показал рекордный рост популярности (+2.39%) в индексе TIOBE а Go за год опустился с 7 позиции до 16 Реальность: - C# в ин
C# показал рекордный рост популярности (+2.39%) в индексе TIOBE а Go за год опустился с 7 позиции до 16 Реальность: - C# в индексе восстановился до уровня 2024 года в 7.4 после просадки до 4.2 в прошлом году - индекс TIOBE основан на статистике поисковых запросов, и показывает что шарписты до сих пор пользуются гуглом, а гошники сразу спрашивают чат гпт Методология TIOBE абсурдная изначально, т.к. показывает социальный интерес к языкам, а не то, на чём реально программируют после появления LLM полностью некорректна. Другие рейтинги языков программирования тоже необъективны, но всё же лучше, они в отличие от TIOBE хотя бы видят TypeScript Рейтинг от GitHub, с bias в опенсорсный код Рейтинг от Jetbrains, с bias к пользователям Jetbrains IDE Рейтинг от StackOverflow, с bias к пользователям StackOverflow (который тоже заменяют LLM) @epeshkblog
4 459
8
Есть попытки запуска веб-приложений на shared-webview2 который уже входит в ОС, например tauri. Но shared-библиотеки уже пробовали, и в 2010-х от них начали массово отказываться, даже дотнет приложения теперь таскают за собой весь рантайм. Скорее всего, после первой же проблемы с tauri для экономии времени на разработку будут снова таскать с собой весь браузер, это выгодно всем, в том числе производителям дисков и RAM @epeshkblog
2
9
Снова про Windows 11 Вчера наконец-то поставил Windows 10 вместо Windows 11. Недавно вышел пост про планы Microsoft переписать Windows на Rust с помощью AI-агентов в концепции 1 человек, 1 месяц, 1 миллион строк кода. Microsoft выпустили опровержение: переписывания на Rust не будет. Windows перепишут на TypeScript. Медленная прорисовка webview2-элементов и стала последней каплей. Когда нажимаешь на иконку вайфай, появляется пустое всплывающее окно и только через секунду отрисовываются элементы внутри. Так происходит из-за того, что каждое подобное окно — по сути отдельная вкладка браузера. Ещё по неизвестной причине перестал работать WSL, т.е. система уже требовала переустановки. Откатить оказалось проще, чем казалось: - лицензия при откате сохраняется - файлы 11 винды бэкапятся в Windows.old. Форматирование диска не обязательно - большинство программ подхватывают подложенные в AppData\Local, AppData\Roaming настройки - внезапно, Edge в Windows 10 хоть и основан на Chromium, но работает с дичайшими лагами. Не более 10фпс. В других браузерах проблем нет. Майки смогли сделать то, с чем не справились сотни браузероклепателей-любителей Почему откатил, а не остался на StartAllBack, OpenShell, ExplorerPatcher: - Баги. В сторонних утилитах UI-элементы Windows 10 воссозданы с нуля, не всегда работают, отличаются по дизайну и поведению от оригинала. выглядит глупо, когда меню громкости из семёрки, wi-fi из десятки, а батареи — из 11 - Сторонние шеллы исправляют только визуальную часть. webview2 компоненты остаются в системе и продолжают потреблять память зря - AI-агенты майкрософт продолжают ломать windows 11 в обновлениях, например мгновенно открывающееся Win+R окно заменили на webview2-компонент ==== https://www.youtube.com/watch?v=7VZJO-hOT4c https://habr.com/ru/news/982546/ На ютубе появился реалистичный тест различных версий винды в одинаковых условиях Время загрузки: - Windows XP и 10 загружаются за одинаковое время - Windows 11 на 20-40 секунд медленнее. Из-за того, что интерфейс системы AI-сгенерирован, при тесте выстрелил баг с долгой прорисовкой таскбара, что и добавило 20 секунд В Windows 8.1 явно провели работу над оптимизацией потребления места на диске и в RAM. 11-ая версия прибавила гигабайт в RAM относительно 10 Количество вкладок в Chromium браузере: - Windows 11 оказалась хуже Windows XP, не справившись с открытием 50 вкладок. Полностью соотносится с тем, что я наблюдал на 11 винде вживую - Windows 8.1 выдерживает 250 вкладок, а 10 — 150. Что все равно гораздо лучше 11 Тесты по скорости загрузки программ — Windows 11 снова оказалась медленнее всех ==== Имхо, использование Windows 11 это расчеловечивающая пытка, и надо откатываться на 10, и ждать 12 или переходить на мак. Скорее всего webslop это будущее всех ОС. Живых людей с компетенциями в разработке нативного UI почти не осталось, рыночек порешал, и подобную работу найти невозможно в отличие от веба, да и платят на ней меньше. Хоть навык и уникальный, сотрудника можно пугать сложностями поиска работы, и дешевизной переписывания на web. LLM отлично справляются с React, Typescript, и Python, что эти языки вытесняют остальные. Когда только вышел ChatGPT я ожидал, что статическая типизация будет помогать валидировать результаты AI-генерации. Так вот, ни-хре-на. Для типизированного кода нужна умная LLM, которая может удерживать в контексте одновременно бизнес-логику и типы, а не подписка за $20 в месяц Web проник даже в консольные утилиты. Claude Code написан с использованием ink — либы, позволяющей рендерить реакт компоненты прямо в терминале. В итоге бинарник тонкого клиента, отправляющего запросы в LLM на сервер весит 208 МБ!!!
3 493
10
IAsyncEnumerator<T> и его использование вручную Енумераторы в дотнете можно использовать двумя способами: через foreach, и вручную, через MoveNext/Dispose. Второй способ часто приводит к багам. В этом методе разработчик пытался реализовать обёртку для IAsyncEnumerable<T>, которая распараллеливает обработку текущего элемента последовательности и получение следующего: public static async IAsyncEnumerable<T> Prefetch<T>( this IAsyncEnumerable<T> source) { await using var enumerator = source.GetAsyncEnumerator(); var nextTask = enumerator.MoveNextAsync(); while (true) { if (!await nextTask) yield break; var current = enumerator.Current; nextTask = enumerator.MoveNextAsync(); // запускаем MoveNext перед возвратом управления в вызывающий код yield return current; } } // USAGE // var sw = Stopwatch.StartNew(); await foreach (var x in En()) await Task.Delay(100); Console.WriteLine("Without prefetch: " + sw.ElapsedMilliseconds); // 700 sw.Restart(); await foreach (var x in En().Prefetch()) await Task.Delay(100); Console.WriteLine("With prefetch: " + sw.ElapsedMilliseconds); // 400 async IAsyncEnumerable<int> En() { await Task.Delay(100); yield return 1; await Task.Delay(100); yield return 2; await Task.Delay(100); yield return 3; await Task.Delay(100); } Однако, такой код сломается, если внутри await foreach сделать break: await foreach (var x in En().Prefetch()) break; Unhandled exception. System.NotSupportedException: Specified method is not supported. at Program.<<Main>$>g__En|0_0()+System.IAsyncDisposable.DisposeAsync() at Extensions.Prefetch[T](IAsyncEnumerable`1 source)+MoveNext() Ошибка возникает потому что у `IAsyncEnumerator<T>` нельзя одновременно вызывать `MoveNextAsync` и `DisposeAsync`. А в реализации Prefetch так и происходит — после break сразу вызывается DisposeAsync (из-за await using) для переменной enumerator, при наличии незавершенного nextTask В зависимости от реализации IAsyncEnumerator<T> возможны и другие симптомы неправильного взаимодействия MoveNext и Dispose, например утечки памяти Исправить можно явно дожидаясь nextTask перед enumerator.DisposeAsync(): public static async IAsyncEnumerable<T> Prefetch<T>(this IAsyncEnumerable<T> source) { await using var enumerator = source.GetAsyncEnumerator(); var nextTask = enumerator.MoveNextAsync(); try { while (true) { var nextTaskResult = await nextTask; nextTask = default; if (!nextTaskResult) yield break; var current = enumerator.Current; nextTask = enumerator.MoveNextAsync(); yield return current; } } finally { if (nextTask != default) await nextTask; } } Такое исправление решает эту проблему — теперь MoveNextAsync и DisposeAsync вызываются последовательно, и ошибки не возникает. @epeshkblog @epeshkblog
3 476
11
🙈 Goodbye, Windows 11! Наконец-то я смог открыть ноут и установить в него второй SSD. Мучения с Windows 11 скоро закончатся. Пользоваться Windows 11 стало невозможно. Постоянные утечки памяти, фризы, чёрные экраны. Куча бесполезных жрущих память процессов: Antimalware (MsMpEng), StartMenuExperienceHost, PhoneExperienceHost (я вообще не подключаю телефон к ноуту, какой phone experience, a), msedgewebview2 (они переписали интерфейс системы на TypeScript) Помогите выбрать, что установить. Windows 10 LTSC, Ubuntu, Mint, CachyOS? Или какой-то другой дистрибутив? Как вариант наверное поставить линукс на второй SSD, перенести данные на него, дальше на первый диск переустановить на 10-ую винду
3 866
12
Перегрузка операторов С новыми extension-методами наконец-то появилась перегрузка операторов для сторонних типов: static class Extensions { extension<T>(IEnumerable<T>) { public static IEnumerable<T> operator +(IEnumerable<T> a, IEnumerable<T> b) => a.Concat(b); } extension<T>(T[]) { public static T[] operator +(T[] a, T[] b) => a.Concat(b).ToArray(); } } Выглядит синтаксис с extensions<T>(TypeName<T>) максимально странно, зато extension-ы наконец-то избавились от странных ограничений старого синтаксиса с this @epeshkblog
3 498
13
Перегрузка операторов С новыми extension-методами наконец-то появилась перегрузка операторов для сторонних типов: ```csharp
2
14
ВЫШЕЛ ВЫШЕЛ ВЫШЕЛ
3 326
15
Немає тексту...
3 848
16
CCCР_Фитиль_1987_Средь_бела_дня_pa8DvuhC_qA.mp4
1
17
2025 год: $10 млрд — AI Bubble, капитализация всего финансового рынка 2050 год: на $10 млрд нельзя купить бамбл в московской
2025 год: $10 млрд — AI Bubble, капитализация всего финансового рынка 2050 год: на $10 млрд нельзя купить бамбл в московской кофейне
4 439
18
Вступите в чат с комментариями Сейчас на чат канала происходят постоянные набеги ботов. Телеграм позволяет включить антиспам только в чатах с более 200 участниками. Сейчас увы только 150
4 695
19
Враждебный к юзеру софт Чтобы софт стал успешным, он должен ненавидеть пользователя. Считать его дурачком и регулярно ему об этом напоминать. И вот два примера, хотя подобные дизайн-паттерны стали повсеместными App Store — юзеру разрешено ставить только одобренные версии софта, и только последние версии. Значит можно выпустить хороший продукт, а затем нафаршировать его рекламой. Иногда приложения удаляют просто так, чтобы напомнить юзеру его место в этой жизни. Или можно объявить, а теперь поддерживается только iOS 27, все вперёд за айфоном 18 про мах Скриншоты — да, в 2025 году смогли убить скриншоты. Если раньше на скриншоте было тоже самое, что на экране у пользователя, то сейчас там обязательно будет что-нибудь другое. Приложения понимают, когда юзер нажимает кнопку скриншота и рисуют поверх вотермарку 𝕏.com Или скриншотишь пост на реддите, и сразу вылетает уведомление А ССЫЛКОЙ ТО УДОБНЕЕ. Хотя скриншот имеет смысл чтобы сохранить пост до его удаления модераторами этой социальной сети. Скриншотишь код выдачи заказа — вылетает уведомление А ДЕЛИТЬСЯ КОДОМ СТАЛО УДОБНЕЕ ПО ССЫЛКЕ. Но причина делать скришнот в этом случае — доступность без интернета, если показывать код надо в подвале Что отберут у нас разработчики iOS и Android в следующем году? @epeshkblog
4 678
20
В комментариях выяснили причину ложных воспоминаний
В комментариях выяснили причину ложных воспоминаний
3 051