TGViewer
Channel Public Channel
.NET epeshk blog

.NET epeshk blog

@epeshkblog

Канал с заметками о C# и .NET

Поддержать канал: https://t.me/blog_donate/2
Обратная связь: https://forms.gle/3uRz7FmzUA26Kw4y5
Subscribers
2.68K
Photos
48
Videos
1
Links
176
Recent Posts 20 shown
Post #277 1.34K
DotNext — конференция для .NET‑разработчиков #видеозаписи До нового DotNext осталось совсем немного, а по дороге на конференцию — можно пересмотреть любимые доклады прошлого года. Сегодня мы открыли полный плейлист DotNext 2025. 😉 YouTube | 📺 VK Видео
В этом году не выступаю, надо отдохнуть, и переосмыслить разработку после всеобщего успеха AI. Но надеюсь, что доберусь до дотнекста без приключений, и тоже буду на конференции.

Не терпится узнать, как в Контуре делали свою IDE для дотнета. Доклад о ней как раз там будет. Безумцы ёбаные, в хорошем смысле

Приходите на дотнекст вобщем, буду рад увидеться и пообщаться
  • 🔥 31
  • 👍 9
  • 🤡 1
Post #275 2.56K
.NET и Владимир: отличный повод совместить митап и выходные в городе с историей

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

В программе доклады от разработчиков Altenar и Рови Тех (часть Т-Банка):
— Async/await — асинхронность, которую можно читать.
— Как не терять данные при асинхронной интеграции программных систем.
— EF Core + PostgreSQL: за рамками CRUD.


Кстати, ещё на митапе запланированы активности для программистов: адаптации известных игр ("Сапер", "Крестики-нолики", "Гонки"), где для победы понадобится понимание математики и вероятностей.

Участие бесплатное, а ещё можно сэкономить на проезде — организаторы разыграют несколько билетов на "Ласточку" среди участников.

Для участия в розыгрыше:
1. Зарегистрируйтесь на митап.
2. Напишите «Хочу на .NET-митап на Ласточке» на почту aleksei.korneev@altenar.com с почты, указанной при регистрации.

Итоги розыгрыша подведём 14 сентября.


Регистрируйтесь, планируйте поездку и до встречи во Владимире!
  • 🤯 8
  • 🔥 5
  • 🤩 5
  • 🤡 1
  • 🍓 1
Post #274 3.31K
LLM оказались упорнее людей

2 недели назад LLM впервые справилась с математической задачей, которая казалась безнадёжной — опровергла гипотезу о якобиане, приведя явный контрпример.

Задача не поддавалась людям 87 лет, и представляет собой классический пример гипотезы, доказательство которой (если она верна) займёт сотни страниц, а для опровержения достаточно лишь привести пример, когда условия не выполняются. Аналогичное свойство есть у Великой теоремы Ферма и Теореме о четырех красках, которые, в отличие от гипотезы о якобиане, оказались верны и были доказаны.

Здесь можно сказать что человеческий вклад в опровержение гипотезы тоже был, но он был минимальным — результат сразу воспроизвели простыми вопросами к другим LLM. Нейросети также самостоятельно обобщили результат для построения бесконечного множества контрпримеров. Т.е. нейросеть действительно создала новое знание, которого раньше не было ни в обучающей выборке, ни вообще где либо среди человеческих достижений.

Гипотеза о якобиане не такая и важная, не входит в проблемы тысячелетия, за неё не назначена награда, и максимум выгоды, который можно из неё извлечь это строчка с именем в википедии. Но в пятницу ИИ смог решить другую задачу с огромной наградой в $100млн, которая годами ускользала от людей

Как LLM добыла $100млн

Оказалось, что один известный холодный криптокошелек 5 лет содержал баг, приводящий к использованию софтверного псевдорандома вместо рандома с security chip. Этот кошелек рекламировался как ultra-secure, with verifiable open-source firmware, и на нём написано: "Don't trust. Verify." Кошелёк был призван удовлетворить потребности самых параноидальных пользователей: коммуникация с компьютером происходила через сканирование QR-кодов, а для питания использовалась батарейка Крона, чтобы исключить side-channel атаку по флуктуациям потребления тока

В коде содержалась строка
#define MICROPY_HW_ENABLE_RNG (0)
отключающая честный рандом

Рядом был и assert:

#ifndef MICROPY_HW_ENABLE_RNG
#error "get a HW TRNG plz"
#endif


Но он некорректный: #ifndef проверяет, что константа не определена, но она определена — в 0. В итоге ассерт не срабатывал, а код компилировался с низкокачественным рандомом, который снижал секретность приватных ключей с 2^128 до 2^40 (по некоторым оценкам и до 2^32)

В итоге кто-то добыл крипты на $100млн, оставив пользователей этих кошельков ни с чем. Баг оставался незамеченным 5 лет. Кошельки были опустошены максимально заметно, без попыток хоть как-то замести следы и скрыть украденный баланс, из чего можно сделать вывод, что код для массового перевода написала нейросеть, не вникая в смысл происходящего (здесь отмечу, мы не знаем точно, нашла ли баг нейросеть, но глупая реализация атаки явно намекает на это)

Казалось бы, баг элементарный, награда гигантская. Почему же не нашли раньше без нейронок? Скорее всего, т.к. баг выглядит слишком глупо. Подобные были в первых реализациях кошельков, и все считали, что так облажаться больше невозможно, вообще никак, в итоге никто и не искал

И у гипотезы о якобиане, и у этого кошелька есть общая черта — там побывали тысячи немотивированных исследователей, и рассказали всем, что задача сложная, они попробовали всё что могли, и искать там больше нечего.

Человеческая сущность боится зря потраченного времени, боится потерпеть поражение, и предпочитает верить предыдущим исследователям вместо собственных попыток. А у нейронок нет ни подобных комплексов, ни сожаления о зря потраченном времени и токенах (за них нейронкам все равно заплатят, даже если получится слоп, в отличие от мясных)

Интересно, что баг в кошельке появился из человеческого желания навредить конкурентам. Автор кошелька изначально начинал проект как форк, но затем решил переписать GPL код на кастомную криптографию, чтобы никто не форкнул его версию

@epeshkblog
X (formerly Twitter) levent (@__alpoge__) on X hello there the jacobian conjecture is false thanx to my close friend akhil for asking about it and my other close friend fable for working during the world cup final ((1+xy)^3 z + y^2 (1+xy) (4+…
  • 👍 30
  • 🔥 13
  • 😁 9
Post #273 3.66K
Расскажите кто каким антикапча решением пользуется? Надоело прокликивать велосипеды, пешеходные переходы, собирать паззлы. Нужен плагин для браузера с ИИ, в который можно закинуть $10 и забыть о капчах как о страшном сне
  • 😁 40
  • 🔥 4
  • 👎 2
  • 😈 2
Post #272 3.63K
💬 Комментарии в коде

Мне никогда не нравился откомментированный код.

Комментирование каждой строки сразу выдаёт начинающего программиста. А те комментарии, которые при написании были уместными все равно устаревают — код изменяется, комментарии обновить забывают, человеческий фактор. Лучший вариант, для компилируемых языков, self-explanatory код

Однажды не смог сделать оптимизацию в РеШарпере из-за комментария. Исправление предполагало переписывание логики к которой был написан очень длинный и основателеный комментарий. С одной стороны его стыдно удалить, а с другой — лень переписывать.

С переходом на AI программирование комментарии стали бесить вдвойне! Первые LLM комментировали каждую строку, словно только вчера начали программировать (так оно впрочем и было). Самые тупые и маленькие LLM стали уклоняться от написания кода через комментарии. Писали // TODO вместо реализации. Комменты стали признаком низкокачественного слопа

Приходилось говорить в промпте не писать комментарии, и упорно вычищать всё же написанные.

И оказалось зря. Если поддерживать код будет тоже агент — пусть пишет комменты. Для LLM куда меньше разницы между кодом и текстом комментариев, т.к. она видит токены. И комменты становятся дополнительным контекстом, с помощью которого нейронка сможет вспомнить бизнес-логику проекта, без полного повторного погружения в код. Вопрос с актуализацией комментариев тоже отпадает — нейросети подходят к этому ответственнее (они следуют алгоритму — поменял код, пройдись по референсам и актуализируй их, человек же — поменял код, скорей на прод)

Нейрокомментированный код конечно же неэстетичный. Но предназначен ли нейрокод для чтения и редактирования людьми?

@epeshkblog
  • 👎 40
  • 👍 30
  • 🔥 3
  • 🤔 2
Post #271 3.9K
.NET epeshk blog Claude Fable 5 написал GC для .NET на C# Если точнее, модель довела до ума проект по написанию managed GC от Kevin Gosse. На некоторых бенчмарках, AI сгенерированный нейронкой GC не уступает в производительности оригинальному neuecc с помощью Fable 5 ускорил…
Бежать со всех ног, чтобы только оставаться на месте

Именно это придётся делать дотнету для выживания в мире Mythos-level моделей, которые могут всё переписать

В этом посте разберём, что нейронки могут улучшить в .NET.

Критерии отбора задач:
- очевидна полезность
- гарантированно существует решение
- требует больших трудозатрат для реализации

1. Сделать кросскомпиляцию для NativeAOT. Сейчас фактически нужно компилировать код под каждую платформу отдельно. Хочу на Windows x64 компилировать под Macbook M5 Max, а на макбуке — под легаси Windows x64

2. Pauseless GC. Сейчас GC в .NET имеет неустранимые stop-the-world паузы, которые могут длиться неограниченное время. Нейронки могут вдохновиться Java и реализовать алгоритмы сборки мусора с гарантированным временем паузы

3. JIT-оптимизации по анроллингу циклов. Вот пример, где Java в 2 раза быстрее за счёт анроллинга

4. Const generics. Возможность использовать константу как generic-параметр. Array<int, 3> arrayOfThreeInts. Прототип фичи уже реализован, но заброшен с аргументацией, что нужны ресурсы

5. Green Threads. Уже были реализованы вручную, в итоге реализация оказалась неудачной, и была отвергнута в пользу Runtime Async. Имеет смысл сделать второй заход

6. Улучшение дебаг инструментов. Например, миграция PerfView на AvaloniaUI/Blazor. Должна быть возможность анализировать dotnet trace без использования Windows и без конвертации в флеймграфы для браузера

7. Нативная поддержка int128/int256 констант в языке C# (сейчас тип есть, а константу задать нельзя, только через Int128.Parse("..."))

8. llvm backend для NativeAOT, включающийся одним параметром --llvm

9. Переписать dotnet runtime с C++ на Rust

10. Оптимизировать все методы ToString / TryFormat. Например, DateTime имеет оптимизированный путь для форматов O/R/S и неэффективный для форматной строки

@epeshkblog
GitHub .NET is twice slower than Java (in the nested loops benchmark) · Issue #93725 · dotnet/runtime Description C# code: https://github.com/OttoBotCode/CountingTriples/blob/b7c71f9742383b46ede650cdb79d0b5835bfd218/TriplesCS.cs Java code: https://github.com/OttoBotCode/CountingTriples/blob/main/Tr...
  • 👍 41
  • 🤡 23
  • 🤔 3
  • 🎃 1
Post #270 6.86K
Claude Fable 5 написал GC для .NET на C#

Если точнее, модель довела до ума проект по написанию managed GC от Kevin Gosse. На некоторых бенчмарках, AI сгенерированный нейронкой GC не уступает в производительности оригинальному

neuecc с помощью Fable 5 ускорил WriteInt в MessagePack. Вместо того, чтобы просить AI ускорить код и make no mistakes применили итеративный подход. В промпт загружались C# исходник и его disassembly после JIT-компиляции + результаты бенчмарков. Модель анализировала ассемблерные инструкции и шаг за шагом подгоняла исходный C# код. Результат — ускорение в 4 раза

Anthropic купили bun — Javascript рантайм, на котором работает Claude Code. Сразу после покупки Fable 5 переписал bun с Zig на Rust за 11 дней, потратив на это $165K токенов

====

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

Языку Zig не повезло. ИИ просто исключил его из цепочки, отдав предпочтение более надежному Rust. Похожая участь досталась C# NativeAOT, когда порт компилятора TypeScript сделали на Go.

Можно считать, что ценность стека технологий == ценности проектов, которые на нём написаны. И теперь технологии без прочной экосистемы популярных продуктов будут быстро вытесняться нейросетями в пользу мейнстрима

@epeshkblog
X (formerly Twitter) Kevin Gosse (@KooKiz) on X My ".NET GC written in C#" project is coded by hand, bit by bit, as an educational project. But I couldn't resist the temptation of having Fable "speedrun" the project and show me a glimpse of wha…
  • 👍 25
  • 🔥 13
  • 🤔 5
  • 😁 2
  • 🤩 2
Post #269 5.16K
Главное, не списывать точь-в-точь, чтоб не спалили
  • 😁 65
  • 🔥 8
  • 👍 5
  • 🤩 3
Post #267 5.14K
Post #266 6.48K
Возвращаемся к теме многопоточности
  • 😁 43
  • 👾 9
  • 🔥 5
  • 🤡 4
Post #265 7.54K
.NET epeshk blog Нарратив про AI bubble, который вот-вот взорвётся почти полностью исчез
banger
  • 😁 36
  • 🤩 8
  • 🔥 3
  • 👾 3
Post #264 7.13K
.NET epeshk blog 2025 год: $10 трлн — AI Bubble, капитализация всего финансового рынка 2050 год: на $10 трлн нельзя купить бамбл в московской кофейне
Нарратив про AI bubble, который вот-вот взорвётся почти полностью исчез
  • 🤡 26
  • 🤔 6
  • 🌚 5
  • 👍 4
  • 🤯 1
Post #263 6.54K
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
  • 👍 23
  • 😁 7
  • 🍓 4
  • 🔥 2
Post #261 4.75K
Снова про 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 МБ!!!
  • 👍 34
  • 🤯 22
  • 🌚 9
  • 😁 6
  • 👾 3
Post #260 4.55K
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 (await nextTask) {
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(). При этом нужно учесть, что ValueTask можно await-ить только один раз:

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; // предотвращаем повторный await ValueTask
if (!nextTaskResult)
yield break;

var current = enumerator.Current;
nextTask = enumerator.MoveNextAsync();

yield return current;
}
}
finally {
if (nextTask != default)
await nextTask;
}
}


Такое исправление решает эту проблему — теперь MoveNextAsync и DisposeAsync вызываются последовательно, и ошибки не возникает.

@epeshkblog
  • 👍 42
  • 😁 1
Post #259 5.32K
🙈 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-ую винду
  • 👍 28
  • 🤡 13
  • 🤔 11
  • 🔥 2
  • 😁 2
Post #258 6.5K
Перегрузка операторов

С новыми 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();
}
}


Выглядит синтаксис с extension<T>(TypeName<T>) максимально странно, зато extension-ы наконец-то избавились от странных ограничений старого синтаксиса с this

@epeshkblog
  • 👍 40
  • 🤯 10
  • 🤡 6
  • 🔥 3
  • 🤩 3
Post #256 6.02K
ВЫШЕЛ ВЫШЕЛ ВЫШЕЛ
  • 🔥 69
  • 😁 23
  • 🤡 8
  • 👍 2
Older posts →

About this channel

How can I read @epeshkblog without a Telegram account?
TGViewer shows the public web preview Telegram publishes for .NET epeshk blog: recent posts, photos, videos and the subscriber count, with no app, login or account.
How many subscribers does .NET epeshk blog have?
.NET epeshk blog (@epeshkblog) has 2.68K subscribers on Telegram, refreshed roughly every 30 minutes.
Does .NET epeshk blog know I viewed it here?
No. Public channel previews carry no viewer identity, and TGViewer has no accounts or tracking of what you look up.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →