ar
Feedback
Библиотека шарписта | C#, F#, .NET, ASP.NET

Библиотека шарписта | C#, F#, .NET, ASP.NET

الذهاب إلى القناة على Telegram

Все самое полезное для C#-разработчика в одном канале. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/b60af5a4 Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead

إظهار المزيد
2025 عام في الأرقامsnowflakes fon
card fon
22 356
المشتركون
-624 ساعات
-327 أيام
-14630 أيام
أرشيف المشاركات
❓ Лучший пост неделиAnonymous voting
  • 100 RPS Rate Limiting
  • Закон Брукса в разработке
  • Антиспам в .NET
  • FluentValidation в API
  • StackTraceHiddenAttribute
0 votes
🥱 8🥰 3
📊 Рейтинг постов Вы всю неделю ставили нам лайки, а мы выбрали топ по реакциям: • 100 RPS Rate LimitingЗакон Брукса в разработкеАнтиспам в .NETFluentValidation в APIStackTraceHiddenAttribute Давайте выберем самый лучший пост в голосовании. Что добавить в следующий спринт? Пишите! 👇 🐸Библиотека шарписта #entry_point
إظهار الكل...
🥰 5🔥 1
Photo unavailableShow in Telegram
🔄 WSL 2.7.0: обновление с новым ядром Windows Subsystem for Linux это встроенный слой совместимости, который позволяет запускать Linux и его приложения напрямую без виртуальной машины. В WSL 2.7.0 ядро обновили до ветки Linux 6.6.114. Параллельно подтянули новые версии WSLg .NET и связанных NuGet пакетов. Список поддерживаемых дистрибутивов пополнился свежими релизами: Debian 13, Ubuntu 25.10, Fedora 43, а также Kali 2025.3 и декабрьская сборка Arch Linux. ➡️ Релиз на GitHub 🐸Библиотека шарписта #async_news
إظهار الكل...
star reaction 1 13🔥 4
👨‍💻 Чистые стектрейсы в .NET с помощью StackTraceHiddenAttribute В .NET есть простой способ скрыть внутреннюю кухню и оставить только то, что важно потребителю API. Атрибут StackTraceHiddenAttribute помечает методы, которые не должны попадать в публичный стектрейс, при этом логика выполнения не меняется. Пример:
public static class UserService
{
    [StackTraceHidden]
    private static void ValidateName(string name)
    {
        if (string.IsNullOrWhiteSpace(name))
            throw new ArgumentException("Name cannot be empty");
    }

    public static void CreateUser(string name)
    {
        ValidateName(name);
        Console.WriteLine("Created user " + name);
    }
}
В этом примере при исключении из ValidateName в стектрейсе вы увидите только вызов UserService.CreateUser. Валидационный хелпер скрыт атрибутом, поэтому внешний разработчик не видит внутренний слой проверки. 🐸Библиотека шарписта #sharp_view
إظهار الكل...
👍 25🥰 3 1
💼 Карьерная «страховка» для IT‑шника Собрали для вас в карточках пункты, которые необходимо знать, чтобы вас не смогли выпнуть с работы. Знайте свои права и читайте полную статью. 🐸Библиотека шарписта
إظهار الكل...
🥰 7👍 3 1
🌐 Контроллеры без мусора Пишете API, и в каждом контроллере приходится проверять if (!ModelState.IsValid) return BadRequest(). Скучно копипастить одно и то же. А если контроллеры станут реально чистыми — только маршрутизация и вызов сервиса? [ApiController] автоматически подключает механизм валидации. Он ищет в DI IValidator<T> для ваших DTO/команд и запускает их до входа в метод контроллера. FluentValidation делает так, что все ваши AbstractValidator<T> автоматически регистрируются как IValidator<T>. Настройка за 5 секунд:
// Program.cs
builder.Services.AddControllers()
    .AddJsonOptions(o => o.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase);

builder.Services.AddValidatorsFromAssembly(typeof(CreateUserValidator).Assembly);
Теперь все ваши AbstractValidator<T> автоматически работают. Вот так пишется валидатор:
public class CreateUserValidator : AbstractValidator<CreateUserCommand>
{
    public CreateUserValidator()
    {
        RuleFor(x => x.Email).NotEmpty().EmailAddress().MaximumLength(256);
        RuleFor(x => x.DisplayName).NotEmpty().MaximumLength(100);
        RuleFor(x => x.Password).NotEmpty().MinimumLength(8);
    }
}
Итоговый эндпоинт:
[ApiController]
[Route("users")]
public class UsersController : ControllerBase
{
    [HttpPost]
    public async Task<IActionResult> Create(CreateUserCommand cmd)
    {
        var user = await _mediator.Send(cmd);
        return CreatedAtAction(nameof(Get), new { id = user.Id }, user);
    }
}
Один раз настроили — наслаждаетесь чистотой контроллеров и валидацией. 🐸Библиотека шарписта #il_люминатор
إظهار الكل...
👍 19🥰 3 2
Photo unavailableShow in Telegram
⚡️ Fleet В С Ё JetBrains убивает Fleet как продукт, но не как технологию: с 22 декабря 2025 его перестанут распространять и команда переезжает в новый инструмент для «агентной разработки» — среды, где код пишут в основном AI‑агенты, а разработчик управляет задачами и ревьюит патчи. Fleet создавали как эксперимент: лёгкая архитектура, современный UI, свобода от легаси IntelliJ-платформы, и технически он реально удался — его компоненты и UX‑решения уже раскатаны по другим IDE от JetBrains. ➡️ Оригинальный анонс 🐸Библиотека шарписта #async_news
إظهار الكل...
😁 13👍 4 1
Photo unavailableShow in Telegram
🧑‍💻 IDE для .NET, написанная на .NET У нас тут интересный эксперимент из мира .NET‑инструментов — SharpIDE. Это кроссплатформенная IDE для .NET, которую делают не на Java и не на Electron, а на самом .NET + движок Godot для UI. Автор позиционирует её как полностью open source‑альтернативу классическим IDE с упором на расширяемость и игровой UI ➡️ Репозиторий проекта 🐸Библиотека шарписта #sharp_view
إظهار الكل...
😁 25👍 10🤩 6🥰 1🌚 1
Photo unavailableShow in Telegram
🎮 Портфолио, в которое хочется играть Наткнулись на резюме разраба, которое явно не пройдёт роботизированную проверку, потому что робот ничего не поймёт. Резюме сделано в виде 3D игры, где нужно кататься на машинке по точкам интереса: проекты, места работы, соц. сети. У обычного HR'а на такое точно не хватит времени. Челлендж от админа — попробуйте выбить страйк в левой части карты. Скидывайте скрины в комменты 👇 ➡️ Выбить страйк 🐸Библиотека шарписта #GoTalk
إظهار الكل...
6🥰 3🤩 1
Photo unavailableShow in Telegram
🔄 Первое сервисное обновление .NET 10 Вышло сервисное обновление для десятой версии платформы, в котором правят баги и стабильность без новых фич. Обновление помечено как non security: оно не закрывает уязвимости, а дорабатывает поведение рантайма, BCL и SDK после выхода 10.0.0. ➡️ Release notes 🐸Библиотека шарписта #async_news
إظهار الكل...
🥰 9👍 3
Photo unavailableShow in Telegram
🧑‍💻 Готовые LINQ-скрипты Шарписты, которые активно пользуются LINQPad редко хранят полезные скрипты. Нашли личный набор рабочих скриптов для LINQPad, который автор вынес в общий GitHub репозиторий. В репозитории лежат .linq скрипты которые помогают решать рутину в .NET проектах через LINQPad вместо отдельных утилит. Это могут быть быстрые запросы к БД, небольшие проверки, конвертеры данных и прочие «разовые» задачи которые регулярно повторяются. ➡️ Репозиторий 🔹 Специалист по ИИ 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🐸Библиотека шарписта #sharp_view
إظهار الكل...
🥰 4🥱 3
⚙️ Останавливаем некрасивый код Использовать dotnet format в CI удобно как «стоп кран» по стилю кода. В пайплайн достаточно добавить один шаг:
- name: Format
  run: dotnet tool restore && dotnet format --verify-no-changes
Зачем так делать dotnet format читает правила из .editorconfig и проверяет что код им соответствует. Ключ --verify-no-changes сообщает утилите работать в режиме проверки без правок файлов и выйти с ненулевым кодом если что то нужно переформатировать. В результате билд в CI падает если кто то закоммитил неотформатированный код. 🔹 Математика для разработки AI-моделей 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🐸Библиотека шарписта #sharp_view
إظهار الكل...
🤔 3❤‍🔥 2🥰 1
Photo unavailableShow in Telegram
🧑‍🎓 Как вуз влияет на карьеру В экосистеме шарпа традиционно много продуктовых компаний банков и корпораций. Для них формальное образование по прежнему важнее чем в типичном веб фрилансе. Но и здесь со временем решающим фактором становятся не корочки а опыт и стек. ➡️ Сколько стоит джун с дипломом и без 🔹 AI-агенты для DS-специалистов 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🐸Библиотека шарписта
إظهار الكل...
🥰 2
Photo unavailableShow in Telegram
إظهار الكل...
😁 61🌚 2 1
Летим зимовать ✈️ Когда холодает, айтишники пакуют чемоданы, а мы разыгрываем ваучер на 50 000 рублей в Островке. Поехать к морю или остаться среди снежных пейзажей — выбирайте сами! Чтобы участвовать, нужно оставить любую реакцию под этим постом и подписаться на каналы ниже: 😎 Типичный программист 🐸 Библиотека программиста 🟢 Ostrovok! Tech Теперь осталось нажать на кнопку участия под этим постом и вы в игре! Итоги подведём 12 декабря. Победителя выберем с помощью бота. Подробнее с правилами можно ознакомиться здесь. Всем удачи! Участников: 111 Призовых мест: 1 Дата розыгрыша: 19:00, 12.12.2025 MSK (3 дня)
إظهار الكل...
🔥 1🥰 1
Участвовать
📩 Быстрый антиспам Для .NET есть готовый клиент Cloudmersive Spam Detection API который умеет проверять текстовые поля. Вместо того чтобы вручную обучать модель для спама можно отдать эту задачу готовому облачному сервису. Для работы с API нужно поставить NuGet пакет Cloudmersive.APIClient.NET.Spam. После установки достаточно прописать ключ API и создать экземпляр клиента:
using Cloudmersive.APIClient.NET.Spam.Client;
using Cloudmersive.APIClient.NET.Spam.Api;
using Cloudmersive.APIClient.NET.Spam.Model;

public class SpamChecker
{
    private readonly SpamDetectionApi _api;

    public SpamChecker(string apiKey)
    {
        // глобальная конфигурация
        Configuration.Default.AddApiKey("Apikey", apiKey);
        _api = new SpamDetectionApi();
    }
}
Базовый сценарий — проверить строку и понять спам это или нет. API предоставляет метод для AI проверки текста и возвращает набор флагов:
public async Task<bool> IsSpamAsync(string text)
{
    var request = new SpamDetectionAdvancedRequest
    {
        InputString = text,
        Model = "Advanced",
        // политика  что считаем допустимым
        AllowUnsolicitedSales = false,
        AllowPromotionalContent = false,
        AllowPhishing = false
    };

    SpamDetectionAdvancedResponse resp =
        await _api.SpamDetectionAdvancedAsync(request);

    // если сервис считает текст спамом  реагируем
    return resp.ContainsSpam ||
           resp.ContainsUnsolicitedSales ||
           resp.ContainsPhishingAttempt;
}
Ответ модели позволяет различать продажные сообщения промо контент и фишинг а не только спам не спам. ➡️ Документация 🔹 Практический интенсив «Архитектуры и шаблоны проектирования» 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🐸Библиотека шарписта #sharp_view
إظهار الكل...
3🔥 3🥰 3🤔 1
⭐️ Золотой стандарт для рефакторинга Golden Master — это простой приём для безопасного рефакторинга, когда страшно ломать легаси и непонятно, как правильно должно «по идее» работать. Идея такая: берём старую реализацию, гоняем через неё достаточно входных данных и сериализуем результат — это и есть золотой стандарт. Потом пишем тест, который запускает старую и новую версию и сравнивает их вывод. Если совпадает — поведение не изменилось, можно смело продолжать рефакторить; если нет — либо нашли баг, либо сознательно меняем старый код. В C# это можно сделать вообще минималистично:
// serialize output before change, compare after change
var before = JsonSerializer.Serialize(await RunOld());
var after  = JsonSerializer.Serialize(await RunNew());
Assert.Equal(before, after);
Главное — позаботиться о детерминизме: вычистить случайные поля: время или GUID’ы, иначе стандарт будет шуметь и тест станет бесполезным. 🔹 Математика для Data Science 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🐸Библиотека шарписта #il_люминатор
إظهار الكل...
👍 10 2🥰 1
⚡️ 100 RPS на всё приложение Rate limit — это простой способ защитить API от всплесков нагрузки, случайных «шторма» с клиента и банального DDoS по честным endpoint’ам. В примере ниже на всё приложение вешается глобальный лимитер:
builder.Services.AddRateLimiter(o =>
{
    o.GlobalLimiter = PartitionedRateLimiter.Create<HttpContext, string>(ctx =>
        RateLimitPartition.GetFixedWindowLimiter("global", _ =>
            new FixedWindowRateLimiterOptions
            {
                PermitLimit = 100,
                Window = TimeSpan.FromSeconds(1)
            }));
});

app.UseRateLimiter();
Если за текущую секунду лимит исчерпан, новые запросы начнут получать ответ об ограничении, пока не откроется следующее окно. Дальше от этого базового варианта легко прийти к более тонким настройкам: отдельные лимиты на публичные и внутренние маршруты, разделение по API-ключу, IP или пользователю, своя политика ответа и логирование с метриками. 🔹 Алгоритмы и структуры данных 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🐸Библиотека шарписта #sharp_view
إظهار الكل...
👍 23 4🔥 4
Photo unavailableShow in Telegram
👨‍💻 База про менеджмент в разработке Закон Брукса — это принцип управления разработкой ПО, который говорит: если проект уже опаздывает, добавление людей чаще всего только ещё больше задерживает его. Закон сформулировал Фредерик Брукс в книге «Мифический человеко‑месяц». Новичков нужно онбордить: рассказывать контекст, архитектуру, правила команды. Опытные ребята вместо того чтобы закрывать задачи, превращаются в живую документацию и менторов. Параллельно растут коммуникации: больше созвонов, больше согласований, больше мест, где можно неправильно понять требования. В какой‑то момент команда тратит больше времени на разговоры и объяснения, чем на фактическую разработку. Практический вывод простой: «давайте накинем ещё разработчиков» — плохой универсальный ответ на проблему сроков. Гораздо полезнее заранее резать систему на независимые модули, упрощать архитектуру, улучшать документацию и процессы. А если проект уже горит, то честный пересмотр объёма, приоритизация и выкидывание лишнего часто работают лучше, чем срочный найм. 🔹 Основы IT для непрограммистов 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🐸Библиотека шарписта #il_люминатор
إظهار الكل...
👍 14 5🥰 1