now() — это не «сейчас», а скорее «когда-то было сейчас».На самом деле
now() возвращает время начала текущей транзакции. Реальные часы продолжают идти, но каждый последующий вызов now(), CURRENT_TIMESTAMP, CURRENT_TIME и CURRENT_DATE внутри этой же транзакции всё равно возвращает одно и то же время.В Postgres это называется transaction-frozen timestamp.
То есть
INSERT на 10 000 строк с created_at DEFAULT now() получит один и тот же timestamp для всех строк, а не 10 000 слегка отличающихся значений.Три варианта времени:
•
now() — традиционный для Postgres вариант, хотя он есть и в других СУБД, но это не стандарт SQL. В стандарте SQL используется CURRENT_TIMESTAMP. В Postgres также есть transaction_timestamp(), который работает так же, как now(), но хотя бы честно говорит об этом своим названием.•
statement_timestamp() обновляется один раз на каждый SQL-запрос. Это полезно внутри длинной транзакции, когда вам нужно фиксировать время выполнения отдельных команд, но не переходить к реальному системному времени.•
clock_timestamp() — единственный timestamptz, который меняется даже во время выполнения одного SQL-запроса.Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🍾2👏1
Похоже, для создания презентаций появился настоящий чит-код: загружаете документ и получаете готовый PPTX, где каждую страницу можно нормально редактировать.
На GitHub проект уже набрал 50 тысяч звёзд.
Раньше больше всего бесило, что ИИ для презентаций часто выдавал набор картинок или статичный шаблон. Захотели передвинуть блок или поменять размер шрифта — приходится переделывать вручную.
PPT Master создаёт нативные объекты PowerPoint. Фигуры, соединительные линии, диаграммы, таблицы, мастер-слайды и макеты остаются настоящими редактируемыми элементами.
Диаграммы и таблицы по умолчанию экспортируются в редактируемом DrawingML, а формулы — в OMML, который можно редактировать начиная с PowerPoint 2010. Если клиент попросил поменять данные, всю презентацию заново генерировать не придётся.
Работает примерно так.
Берёте исследовательский отчёт в PDF или DOCX, загружаете его, а система читает документ целиком и собирает из него PPTX. Можно добавить переходы между слайдами, анимации объектов, заметки докладчика и даже озвучку в заметках.
Если у компании уже есть фирменный шаблон, PPT Master может взять оформление из существующего PPTX. Можно и не переделывать всю презентацию, а перегенерировать только отдельные страницы.
Есть два режима. Полная генерация занимает больше времени, а быстрая генерация одной страницы необратима и подходит, когда нужно сделать всё максимально быстро.
Кроме взаимодействия с ИИ-моделью, всё остальное работает локально.
Потому что на самом деле при подготовке отчётов больше всего времени обычно уходит не на придумывание содержания, а на то, чтобы нормально разложить его по слайдам.
GitHub:
https://github.com/hugohe3/ppt-master
👉 @KodBlog
На GitHub проект уже набрал 50 тысяч звёзд.
Раньше больше всего бесило, что ИИ для презентаций часто выдавал набор картинок или статичный шаблон. Захотели передвинуть блок или поменять размер шрифта — приходится переделывать вручную.
PPT Master создаёт нативные объекты PowerPoint. Фигуры, соединительные линии, диаграммы, таблицы, мастер-слайды и макеты остаются настоящими редактируемыми элементами.
Диаграммы и таблицы по умолчанию экспортируются в редактируемом DrawingML, а формулы — в OMML, который можно редактировать начиная с PowerPoint 2010. Если клиент попросил поменять данные, всю презентацию заново генерировать не придётся.
Работает примерно так.
Берёте исследовательский отчёт в PDF или DOCX, загружаете его, а система читает документ целиком и собирает из него PPTX. Можно добавить переходы между слайдами, анимации объектов, заметки докладчика и даже озвучку в заметках.
Если у компании уже есть фирменный шаблон, PPT Master может взять оформление из существующего PPTX. Можно и не переделывать всю презентацию, а перегенерировать только отдельные страницы.
Есть два режима. Полная генерация занимает больше времени, а быстрая генерация одной страницы необратима и подходит, когда нужно сделать всё максимально быстро.
Кроме взаимодействия с ИИ-моделью, всё остальное работает локально.
Потому что на самом деле при подготовке отчётов больше всего времени обычно уходит не на придумывание содержания, а на то, чтобы нормально разложить его по слайдам.
GitHub:
https://github.com/hugohe3/ppt-master
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - hugohe3/ppt-master: AI turns documents or topics into real, native PowerPoint decks—with native shapes, transitions and…
AI turns documents or topics into real, native PowerPoint decks—with native shapes, transitions and animations, data-backed charts and tables on demand, audio narration from speaker notes, and supp...
👍3🔥1🌭1🍾1
Добавляем Fixed Window Rate Limiter в ASP.NET Core
Можно настроить:
Нужно ли ставить входящие запросы в очередь
Rate limiting работает только in-memory.
Если нужен distributed rate limiter, часто используют что-то вроде Redis.
А для долгоживущих и персистентных лимитов можно использовать даже Postgres с locking, чтобы гарантировать соблюдение ограничений.
👉 @KodBlog
Можно настроить:
PermitLimit — количество разрешённых запросовWindow — размер временного окна в секундах (TimeSpan)Нужно ли ставить входящие запросы в очередь
Rate limiting работает только in-memory.
Если нужен distributed rate limiter, часто используют что-то вроде Redis.
А для долгоживущих и персистентных лимитов можно использовать даже Postgres с locking, чтобы гарантировать соблюдение ограничений.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🔥1🍾1
Что такое Domain Event в DDD?
Aggregates выступают в роли границы согласованности (consistency boundary) в домене. И в какой-то момент неизбежно возникает необходимость организовать взаимодействие между двумя aggregates.
Сделать это можно с использованием eventual consistency и domain events. Один aggregate создаёт domain event, а другие aggregates могут подписаться на это событие и соответствующим образом его обработать.
Вот как это можно реализовать с помощью EF Core:
https://milanjovanovic.tech/blog/how-to-use-domain-events-to-build-loosely-coupled-systems
👉 @KodBlog
Aggregates выступают в роли границы согласованности (consistency boundary) в домене. И в какой-то момент неизбежно возникает необходимость организовать взаимодействие между двумя aggregates.
Сделать это можно с использованием eventual consistency и domain events. Один aggregate создаёт domain event, а другие aggregates могут подписаться на это событие и соответствующим образом его обработать.
Вот как это можно реализовать с помощью EF Core:
https://milanjovanovic.tech/blog/how-to-use-domain-events-to-build-loosely-coupled-systems
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🍾1
от как можно реализовать tenant-based query filter с помощью EF Core.
Понадобится сервис, который будет предоставлять
Получить это значение можно из request header или из JWT (cookie) claim.
Побочный эффект такого подхода: использовать
👉 @KodBlog
Понадобится сервис, который будет предоставлять
TenantId для текущего tenant.Получить это значение можно из request header или из JWT (cookie) claim.
Побочный эффект такого подхода: использовать
DbContext получится только в рамках HTTP request.Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🍾1
Моя любимая фича в C# 12 — Collection Expressions.
Она упрощает создание распространённых типов коллекций. С помощью spread-оператора
Collection Expressions дают единый способ создания новых коллекций. Небольшое изменение, но теперь именно этот вариант используется по умолчанию практически во всём C#-коде.
👉 @KodBlog
Она упрощает создание распространённых типов коллекций. С помощью spread-оператора
.. можно даже встроить существующие коллекции прямо в новую.Collection Expressions дают единый способ создания новых коллекций. Небольшое изменение, но теперь именно этот вариант используется по умолчанию практически во всём C#-коде.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8🥴2🍾1
This media is not supported in your browser
VIEW IN TELEGRAM
Браузерная игрушка обучает C#
RPG, где прогресс зависит не от кликов, а от того, насколько хорошо ты пишешь код на C#
Что внутри:
Отличный способ учиться C# в формате приключения. Игра затягивает, а навыки прокачиваются сами собой
https://rpg.dijix.com.ua/
👉 @KodBlog
RPG, где прогресс зависит не от кликов, а от того, насколько хорошо ты пишешь код на C#
Что внутри:
🔄 Вы становитесь героем фантастического мира рыцари, монстры, нелегкие испытания🔄 Но вместо обычных “нажми кнопку, чтобы победить” вам нужно писать код на C#, чтобы решать задачи и прокачивать персонажа🔄 Стратегия, логика и программирование объединены развиваете не только персонажа, но и себя как разработчика
Отличный способ учиться C# в формате приключения. Игра затягивает, а навыки прокачиваются сами собой
https://rpg.dijix.com.ua/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2🥴2🍾1
Вот как можно реализовать tenant-based query filter с помощью EF Core.
Понадобится сервис, который будет предоставлять
Побочный эффект такого подхода:
👉 @KodBlog
Понадобится сервис, который будет предоставлять
TenantId для текущего tenant. Получить это значение можно из request header или JWT (cookie) claim.Побочный эффект такого подхода:
DbContext можно будет использовать только в рамках HTTP request.Please open Telegram to view this post
VIEW IN TELEGRAM
🤔4❤2🍾1
Как лучше всего получать значения конфигурации в .NET?
Для этого можно использовать Options pattern, и вот почему о нём стоит знать.
Конфигурация приложения может храниться в environment variables, JSON-файлах, user secrets или других configuration providers. Отдельные значения можно получать через интерфейс
Вместо этого можно использовать Options pattern:
• Создать класс, представляющий настройки
• Привязать свойства класса к настройкам приложения (JSON)
• Использовать Options pattern в коде через
Также в класс настроек можно добавить Data Annotations для простой валидации.
👉 @KodBlog
Для этого можно использовать Options pattern, и вот почему о нём стоит знать.
Конфигурация приложения может храниться в environment variables, JSON-файлах, user secrets или других configuration providers. Отдельные значения можно получать через интерфейс
IConfiguration, но такой подход подвержен ошибкам и довольно неудобен, поэтому использовать его не рекомендуется.Вместо этого можно использовать Options pattern:
• Создать класс, представляющий настройки
• Привязать свойства класса к настройкам приложения (JSON)
• Использовать Options pattern в коде через
IOptionsТакже в класс настроек можно добавить Data Annotations для простой валидации.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🤯2🍾1
Братья мои во Христе, которые работают с .NET 6+, ради всего святого — используйте эту фичу по полной. Она реально помогает сократить количество кода в классе.
Иногда попадаются такие классы, что хочется спросить: ну серьёзно, это же ничего не стоит использовать.
👉 @KodBlog
Иногда попадаются такие классы, что хочется спросить: ну серьёзно, это же ничего не стоит использовать.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥴14❤7👍1🍾1
Забираем полезный репозиторий для C#/.NET-разработчиков — готовый шаблон Clean Architecture для ASP.NET Core.
Внутри можно подсмотреть правильную структуру проекта, разделение слоёв, DDD, Dependency Injection, тестирование и другие практики для разработки поддерживаемых .NET-приложений.
Хорошая база как для изучения архитектуры на живом коде, так и для старта собственного проекта.
GitHub: ardalis/CleanArchitecture
👉 @KodBlog
Внутри можно подсмотреть правильную структуру проекта, разделение слоёв, DDD, Dependency Injection, тестирование и другие практики для разработки поддерживаемых .NET-приложений.
Хорошая база как для изучения архитектуры на живом коде, так и для старта собственного проекта.
GitHub: ardalis/CleanArchitecture
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9🍾2
Почему Redis может оказаться не таким эффективным, как кажется — большой практический разбор кэширования в .NET.
Автор начинает с реального
Полезный материал для C#/.NET-разработчиков, которые хотят не просто «прикрутить Redis», а понимать, где и какой уровень кэширования действительно стоит использовать.
https://habr.com/ru/articles/1068772/
👉 @KodBlog
Автор начинает с реального
OutOfMemory в проде, а затем на нагрузочных тестах сравнивает Redis/Valkey, ASP.NET Output Cache и MemoryCache. Разбирает влияние кэша на аллокации и GC, cache stampede, инвалидацию, ETag, conditional GET и клиентское кэширование.Полезный материал для C#/.NET-разработчиков, которые хотят не просто «прикрутить Redis», а понимать, где и какой уровень кэширования действительно стоит использовать.
https://habr.com/ru/articles/1068772/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🍾1
.NET и Владимир: отличный повод совместить митап и выходные в городе с историей
Офлайн-мероприятий для .NET-разработчиков сейчас не так много, а тут получается приятное комбо: встреча с другими разработчиками вечером в пятницу и возможность остаться на выходные в городе с историей.
В программе доклады от разработчиков Altenar и Рови Тех (часть Т-Банка):
— Async/await — асинхронность, которую можно читать.
— Как не терять данные при асинхронной интеграции программных систем.
— EF Core + PostgreSQL: за рамками CRUD.
Кстати, ещё на митапе запланированы активности для программистов: адаптации известных игр ("Сапер", "Крестики-нолики", "Гонки"), где для победы понадобится понимание математики и вероятностей.
Участие бесплатное, а ещё можно сэкономить на проезде — организаторы разыграют несколько билетов на "Ласточку" среди участников.
Для участия в розыгрыше:
1. Зарегистрируйтесь на митап.
2. Напишите «Хочу на .NET-митап на Ласточке» на почту aleksei.korneev@altenar.com с почты, указанной при регистрации.
Итоги розыгрыша подведём 14 сентября.
Регистрируйтесь, планируйте поездку и до встречи во Владимире!
Офлайн-мероприятий для .NET-разработчиков сейчас не так много, а тут получается приятное комбо: встреча с другими разработчиками вечером в пятницу и возможность остаться на выходные в городе с историей.
В программе доклады от разработчиков Altenar и Рови Тех (часть Т-Банка):
— Async/await — асинхронность, которую можно читать.
— Как не терять данные при асинхронной интеграции программных систем.
— EF Core + PostgreSQL: за рамками CRUD.
Кстати, ещё на митапе запланированы активности для программистов: адаптации известных игр ("Сапер", "Крестики-нолики", "Гонки"), где для победы понадобится понимание математики и вероятностей.
Участие бесплатное, а ещё можно сэкономить на проезде — организаторы разыграют несколько билетов на "Ласточку" среди участников.
Для участия в розыгрыше:
1. Зарегистрируйтесь на митап.
2. Напишите «Хочу на .NET-митап на Ласточке» на почту aleksei.korneev@altenar.com с почты, указанной при регистрации.
Итоги розыгрыша подведём 14 сентября.
Регистрируйтесь, планируйте поездку и до встречи во Владимире!
😁3🍾1
Как я подхожу к тестированию приложений
Многие проекты сталкиваются с проблемами из-за неправильного подхода к тестированию. Codebase растёт, внесение изменений становится всё более рискованным, а разработчики теряют уверенность в своих deployments.
Особенно это актуально для проектов на Clean Architecture, где важно убедиться, что use cases работают корректно.
Мой подход к Unit Testing:
• NSubstitute для mock зависимостей
• Тестирование всех happy paths
• Тестирование всех failure paths
• Проверка обработки exceptions
Unit Testing помогает убедиться, что логика работает правильно. Пошаговый разбор этого подхода к тестированию:
https://milanjovanovic.tech/blog/unit-testing-clean-architecture-use-cases
👉 @KodBlog
Многие проекты сталкиваются с проблемами из-за неправильного подхода к тестированию. Codebase растёт, внесение изменений становится всё более рискованным, а разработчики теряют уверенность в своих deployments.
Особенно это актуально для проектов на Clean Architecture, где важно убедиться, что use cases работают корректно.
Мой подход к Unit Testing:
• NSubstitute для mock зависимостей
• Тестирование всех happy paths
• Тестирование всех failure paths
• Проверка обработки exceptions
Unit Testing помогает убедиться, что логика работает правильно. Пошаговый разбор этого подхода к тестированию:
https://milanjovanovic.tech/blog/unit-testing-clean-architecture-use-cases
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4🍾2
.NET tip: перестаньте прятать
Вместо этого используйте TimeProvider. В рабочем коде приложение получает реальное время, а в тестах можно использовать fake clock и самостоятельно перемещать время вперёд.
Небольшая абстракция, которая делает тесты гораздо удобнее.
👉 @KodBlog
DateTime.UtcNow внутри кода.Вместо этого используйте TimeProvider. В рабочем коде приложение получает реальное время, а в тестах можно использовать fake clock и самостоятельно перемещать время вперёд.
Небольшая абстракция, которая делает тесты гораздо удобнее.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🤯1🍾1
Какой самый быстрый способ выполнить SQL bulk insert?
Я протестировал все популярные подходы... Победитель — SqlBulkCopy. Это самый быстрый способ вставить большой объём данных в SQL Server. В PostgreSQL есть команда
Вот ещё 5 решений, которые сравнивались: https://milanjovanovic.tech/blog/fast-sql-bulk-inserts-with-csharp-and-ef-core
👉 @KodBlog
Я протестировал все популярные подходы... Победитель — SqlBulkCopy. Это самый быстрый способ вставить большой объём данных в SQL Server. В PostgreSQL есть команда
COPY, которая работает похожим образом.Вот ещё 5 решений, которые сравнивались: https://milanjovanovic.tech/blog/fast-sql-bulk-inserts-with-csharp-and-ef-core
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🍾1
Лучший урок по C#, который вы получите сегодня:
(чтобы сократить количество багов на 50%)
Не возвращайте
ПЕРЕСТАНЬТЕ:
• Заставлять вызывающий код проверять результат на
• Засорять код лишними условиями
• Рисковать получить runtime exceptions, которые сложно отследить
НАЧНИТЕ:
• Возвращать
• Возвращать
• Возвращать
Так код становится безопаснее, чище и понятнее. А остальные пусть продолжают тонуть в
👉 @KodBlog
(чтобы сократить количество багов на 50%)
Не возвращайте
null-коллекции из своих методов. Возвращайте пустые коллекции.ПЕРЕСТАНЬТЕ:
• Заставлять вызывающий код проверять результат на
null• Засорять код лишними условиями
• Рисковать получить runtime exceptions, которые сложно отследить
НАЧНИТЕ:
• Возвращать
new List<T>()• Возвращать
Enumerable.Empty<T>()• Возвращать
[] — collection expression из C# 12Так код становится безопаснее, чище и понятнее. А остальные пусть продолжают тонуть в
null-проверках.Please open Telegram to view this post
VIEW IN TELEGRAM
👍12👎4❤2🍾2❤🔥1
Создавайте автономных AI-агентов на C#!
Соберите свой первый multi-agent workflow на .NET с помощью Microsoft AutoGen: agent loops, использование tools и выполнение кода.
Гайд Autonomous AI Agents in C# with AutoGen
#AgenticAI #CSharp #DotNet #AutoGen #AI
👉 @KodBlog
Соберите свой первый multi-agent workflow на .NET с помощью Microsoft AutoGen: agent loops, использование tools и выполнение кода.
Гайд Autonomous AI Agents in C# with AutoGen
#AgenticAI #CSharp #DotNet #AutoGen #AI
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5🔥3🤔2🍾1