.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, который вот-вот взорвётся почти полностью исчез | 4 440 |
| 7 | 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 млрд нельзя купить бамбл в московской кофейне | 4 439 |
| 18 | Вступите в чат с комментариями
Сейчас на чат канала происходят постоянные набеги ботов. Телеграм позволяет включить антиспам только в чатах с более 200 участниками. Сейчас увы только 150 | 4 695 |
| 19 | Враждебный к юзеру софт
Чтобы софт стал успешным, он должен ненавидеть пользователя. Считать его дурачком и регулярно ему об этом напоминать.
И вот два примера, хотя подобные дизайн-паттерны стали повсеместными
App Store — юзеру разрешено ставить только одобренные версии софта, и только последние версии. Значит можно выпустить хороший продукт, а затем нафаршировать его рекламой. Иногда приложения удаляют просто так, чтобы напомнить юзеру его место в этой жизни. Или можно объявить, а теперь поддерживается только iOS 27, все вперёд за айфоном 18 про мах
Скриншоты — да, в 2025 году смогли убить скриншоты. Если раньше на скриншоте было тоже самое, что на экране у пользователя, то сейчас там обязательно будет что-нибудь другое. Приложения понимают, когда юзер нажимает кнопку скриншота и рисуют поверх вотермарку 𝕏.com
Или скриншотишь пост на реддите, и сразу вылетает уведомление А ССЫЛКОЙ ТО УДОБНЕЕ. Хотя скриншот имеет смысл чтобы сохранить пост до его удаления модераторами этой социальной сети.
Скриншотишь код выдачи заказа — вылетает уведомление А ДЕЛИТЬСЯ КОДОМ СТАЛО УДОБНЕЕ ПО ССЫЛКЕ. Но причина делать скришнот в этом случае — доступность без интернета, если показывать код надо в подвале
Что отберут у нас разработчики iOS и Android в следующем году?
@epeshkblog | 4 678 |
| 20 | В комментариях выяснили причину ложных воспоминаний | 3 051 |
