Заметки ленивого .NET-чика
3 subscribers
40 photos
7 videos
44 links
Полезные советы и фишки программирования
Download Telegram
Автор «сломал» RSA-512 (одна из старых криптосистем) всего за 3,5 часа даже на одном ядре старого ноутбука.

Он переписал задачу факторизации (разложение большого числа на два простых множителя) в виде булевой формулы и отдал ее на решение специальным решателям (SAT-солверам), которые подбирают ответы. То есть вместо того, чтобы напрямую «гадать» множители, он превратил задачу в головоломку из логических уравнений, которую современные алгоритмы щелкают на раз-два.

Получается, что RSA-512 сегодня уже абсолютно небезопасен, его можно разложить за считанные часы без суперкомпьютеров. Если такие методы ускорить или улучшить, то в будущем под угрозой окажутся и более серьёзные ключи вроде RSA-2048, которые сейчас используются в интернете и банках: https://u.habr.com/uMpM0
Вкратце современный стек разработки ПО
Forwarded from Bash Советы
Иногда нужно быстро найти и подсветить все IPv4-адреса в логах или текстовых файлах. Для этого отлично подходит регулярное выражение + grep.


grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' access.log


🔎 Что здесь происходит:

-E — включает расширенные регулярки.
-o — выводит только совпадения, без остальной строки.
([0-9]{1,3}\.){3}[0-9]{1,3} — шаблон поиска IPv4-адреса.

📌 Чтобы сразу убрать дубликаты и отсортировать список IP:


grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' access.log | sort -u


Это удобно при анализе логов Nginx/Apache или при поиске подозрительных подключений.

👉@bash_srv
Кратко опишите жизненный цикл потока в C#.

✍🏻 Состояние Unstarted (New): новый экземпляр класса Thread инициализирован и не запущен.
✍🏻 Состояние Runnable: вызывается метод Start(), и поток готов к запуску.
✍🏻 Выполняется: поток был выбран планировщиком для запуска.
✍🏻 Не готов к запуску: иногда его называют WaitSleepJoin, поток переходит в это состояние, когда мы вызываем Wait() или Sleep(), а также когда он вызывает Join() в другом потоке.
✍🏻 Состояние Dead: поток завершил свою задачу или был вызван метод Abort(); это последний этап жизненного цикла потока.

Библиотека задач по C#
В .NET Core сервисе под высокой нагрузкой заметны задержки при обработке запросов. Профилирование показывает частые блокировки потоков на lock. Как вы будете искать и устранять проблему?

Проанализирую contention через профилировщики (PerfView, dotTrace), посмотрю, где именно используются lock. Для оптимизации — заменить критические секции на более лёгкие механизмы синхронизации (ReaderWriterLockSlim, SemaphoreSlim), уменьшить область блокировки или перейти на lock-free структуры (ConcurrentDictionary, ConcurrentQueue).

Библиотека собеса по С#
В .NET Core приложении под высокой нагрузкой вы замечаете, что ответы API начинают задерживаться. Профилирование показывает блокировки потоков в ThreadPool. Как будете искать и устранять проблему?

Проверю, нет ли синхронных вызовов внутри async-методов (.Result, .Wait()), проанализирую contention на lock и тяжёлые операции в основном потоке. Для оптимизации — вынесу CPU-bound задачи в Task.Run или ProcessPool, ограничу параллелизм через SemaphoreSlim, а для I/O оставлю async/await без блокировок.

Библиотека собеса по С#
Долгоживущий .NET-сервис постепенно “распухает” по памяти без явных LOH-пиков. В дампе видно множество делегатов/лямбд, Timer и CancellationTokenRegistration, висящих в Gen2. Как диагностировать и устранить утечки из-за событий/таймеров/регистраций?

Проанализировать пути до корней (dotMemory/PerfView/dotnet-dump gcroot) — проверить коллекции подписчиков и списки делегатов у источников событий. Убедиться, что:

✍🏻 все подписки снимаются в Dispose/IAsyncDisposable;
✍🏻 CancellationToken.Register хранит IDisposable и корректно Dispose();
✍🏻 Timer/PeriodicTimer/System.Threading.Channels закрываются/завершаются;
✍🏻 не удерживаются замыканиями большие объекты/this.

При необходимости — слабые события/WeakReference, паттерн “own the lifetime”, и тест “утечек” в CI с сравнением heap-снимков.


Библиотека собеса по С#
⏱️ Как ускорить асинхронный код в C#

Частая ошибка — писать асинхронные вызовы последовательно:
await GetUser();
await GetOrders();
await GetRecommendations();


Каждая операция ждёт предыдущую и если каждый запрос занимает по секунде, общее время = 3 секунды.

А можно иначе:
var userTask = GetUser();
var ordersTask = GetOrders();
var recsTask = GetRecommendations();

await Task.WhenAll(userTask, ordersTask, recsTask);


Все задачи стартуют сразу. Теперь общее время = 1 секунда (ожидание самой длинной операции).

Маленький приём — большая разница во времени выполнения.

🐸Библиотека шарписта

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM