🚀 Анализ изменений с
Команда
Просмотр истории:
История коммитов построчно:
Граф веток + метки (ветки, теги) для всех веток:
Показать diff последних двух коммитов:
Коммиты за последние 2 недели от указанного автора:
Настраиваемый формат: короткий хеш, дата, сообщение, автор:
💬 Вы смотрите историю
🐸 Библиотека шарписта #буст
git log
Команда
git log
позволяет понять, как эволюционировал код — просмотреть последовательность коммитов и метаданные.Просмотр истории:
git log
История коммитов построчно:
git log --oneline
Граф веток + метки (ветки, теги) для всех веток:
git log --graph --decorate --all
Показать diff последних двух коммитов:
git log -p -2
Коммиты за последние 2 недели от указанного автора:
git log --since="2 weeks ago" --author="ProgLib"
Настраиваемый формат: короткий хеш, дата, сообщение, автор:
git log --pretty=format:"%h %ad | %s%d [%an]" --date=short
💬 Вы смотрите историю
log
'ом или используете сторонние инструменты?Please open Telegram to view this post
VIEW IN TELEGRAM
🥰7❤2❤🔥1
В условиях жесткой конкуренции выделиться непросто, но возможно. В статье собрали 9 проверенных способов, которые помогут вам грамотно оформить резюме и выделить свои сильные стороны.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👾3
Асинхронные потоки
IAsyncEnumerable
позволяют эффективно обрабатывать последовательности данных, поступающих с задержками. В целом это положительно влияет на пользовательский опыт и скорость работы приложения1. Базовый синтаксис:
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
static async IAsyncEnumerable<int> GenerateSequenceAsync(int count, [EnumeratorCancellation] CancellationToken token = default)
{
for (int i = 0; i < count; i++)
{
// Симулируем асинхронную задержку
await Task.Delay(100, token);
yield return i;
}
}
static async Task ConsumeAsync()
{
await foreach (var item in GenerateSequenceAsync(5))
{
Console.WriteLine($"Получено значение: {item}");
}
}
• Ключевое слово
async
перед IAsyncEnumerable<T>
.•
yield return
внутри асинхронного метода.•
await foreach
для потребления.2. Обработка отмены и ошибок:
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(1));
try
{
await foreach (var item in GenerateSequenceAsync(10, cts.Token).WithCancellation(cts.Token))
{
Console.WriteLine(item);
}
}
catch (OperationCanceledException)
{
Console.WriteLine("Операция была отменена.");
}
• Передаём
CancellationToken
через атрибут [EnumeratorCancellation]
.• Используем метод расширения
.WithCancellation(token)
для явной поддержки отмены в await foreach
.3. Советы по применению
• Всегда учитывайте семантику отмены: пробрасывайте
CancellationToken
до источника потока.• Избегайте долгих синхронных операций внутри цикла генерации — это сведёт на нет преимущества асинхронности.
• При больших объёмах данных комбинируйте с буферизацией через
Channel<T>
для сглаживания пиковой нагрузки.💬 Нужны более продвинутые сценарии по использованию асинхронности? Пишите свои хотелки в комментариях, а мы их обязательно исполним 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤4🔥2😁1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍33😁11💯8🥱1👾1
✏️ Промпт для пет-проектов
Мы составили для вас промпт, который поможет выбрать идею для вашего следующего пет-проекта. Никаких долгих раздумий, используете промпт и к разработке.
Промпт:
Это отличный способ не только генерировать идеи, но и подойти к созданию чего-то нового нестандартным способом.
Занимаетесь пет проектами? Поставьте 👍, если да и 👾, если нет.
🐸 Библиотека шарписта #буст
Мы составили для вас промпт, который поможет выбрать идею для вашего следующего пет-проекта. Никаких долгих раздумий, используете промпт и к разработке.
Промпт:
You are a fun-loving and creative C# developer, brimming with enthusiasm for coding and always eager to explore new and exciting projects. Your goal is to brainstorm a list of engaging and manageable pet-project ideas that leverage your C# skills. These projects should be fun to build, relatively self-contained, and offer opportunities for learning and experimentation. Finally, you will choose the most appealing project and outline the initial steps for getting started.
Это отличный способ не только генерировать идеи, но и подойти к созданию чего-то нового нестандартным способом.
Занимаетесь пет проектами? Поставьте 👍, если да и 👾, если нет.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21👾11❤3😁2🌚1
Не все аспекты программирования идут на пользу при реальной работе. Часто избыточные знания только мешают трезво оценить и написать фичу.
Вот что думает наш админ:
Когда я начинал, мне рассказали, что многозадачность — это ключ к быстродействующим приложениям, и я потратил кучу времени, изучая все тонкости асинхронности. В итоге понял, что в реальных проектах асинхронность скорее игрушка, чем нужный инструмент.
💬 Есть ли у вас знания, которые так и не пригодились в работе? Делитесь в комментариях 👇
P.S. Если хотите задать вопрос сообществу или поделиться историей, заполните нашу гугл-форму.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🤔5🌚5🥱3😢1
Иногда нам нужно на примере узнать как отработает LINQ запрос, к примеру.
Можно пойти старым путём и создать отдельный файл в проекте с названием «Test123», но Rider предлагает иной вариант.
Если Rider у вас настроен под хоткеи от Intellij, то достаточно одновременно нажать:
Ctrl + Alt + Shift + Insert
И IDE создаст вам временный файл, который не будет добавлен в контекст проекта.
Просто, быстро и без боли.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🤔5❤2🔥2
📁 Файл с инструкциями вместо тысячи запросов
Представьте: один файлик — и все последующие автодополнения подстраиваются под ваш корпоративный стандарт.
В блоге .NET показали, как создать такой файл и навсегда забыть о рутине при работе с GitHub Copilot.
Создаёте в корне репозитория папку
В шапке указываете, к каким файлам применить правила, а дальше описываете свои стандарты
➡️ Dev блог Microsoft
🐸 Библиотека шарписта #буст
Представьте: один файлик — и все последующие автодополнения подстраиваются под ваш корпоративный стандарт.
В блоге .NET показали, как создать такой файл и навсегда забыть о рутине при работе с GitHub Copilot.
Создаёте в корне репозитория папку
.github/
и внутри неё — copilot-instructions.md
.В шапке указываете, к каким файлам применить правила, а дальше описываете свои стандарты
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🌚3❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁54💯12
Отвлечёмся от работы, но не совсем. Сегодня будем отгадывать термины из разработки.
1. Специальный оператор, возвращающий имя переменной, метода или типа как строку.
2. Модификатор метода, обозначающий его асинхронное выполнение в сочетании с await.
3. Специальный член класса, позволяющий обращаться к экземпляру как к массиву: obj[i].
4. Модификатор, позволяющий объявить один класс/метод/структуру в нескольких файлах.
5. Ключевое слово, позволяющее из метода-итератора возвращать значения по одному.
6. Модификатор поля, гарантирующий свежесть данных при многопоточном доступе.
7. Контекст или модификатор, разрешающий небезопасный (низкоуровневый) код с указателями.
Пишите под спойлер свои варианты в комментариях 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👾2🌚1
То, что вы могли пропустить в потоке будней.
— Июльские обновления .NET
Вышли новые сервисные релизы .NET 8.0.18 и 9.0.7 с исправлениями багов и улучшениями для рантайма и ASP.NET.
— Куда движется Critter Stack
Запуск коммерческой консоли мониторинга Critter Watch для управления Wolverine и Marten, новые рецепты по работе с конкуренцией и параллелизмом, расширение декларативного доступа к данным и ряд небольших, но важных улучшений в экосистеме.
— Роадмапы AutoMapper и MediatR
AutoMapper нацеливается на внедрение source-генераторов для раннего обнаружения ошибок маппинга и улучшенной отладки, сохраняя при этом поддержку IQueryable и расширяемости.
MediatR планирует ослабить привязку к DI-контейнеру ASP .NET Core, добавить новые «behaviors» для расширения поведения, встроенную поддержку паттерна Result и расширить сценарии использования
— Как поднять резюме в топ
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
☝️ Последний шанс купить курсы Proglib Academy с доступом навсегда!
Это не просто летняя распродажа, это финал эпохи. Мы дарим скидку 40% на все курсы, включая полностью обновлённый курс по Python (предложение НЕ ДЕЙСТВУЕТ только на курс по AI-агентам для DS-специалистов).
Но главное: с 1 августа доступ ко всем новым курсам станет ограниченным. Успейте инвестировать в свои знания на самых выгодных условиях!
👉 Выбрать курс
Это не просто летняя распродажа, это финал эпохи. Мы дарим скидку 40% на все курсы, включая полностью обновлённый курс по Python (предложение НЕ ДЕЙСТВУЕТ только на курс по AI-агентам для DS-специалистов).
Но главное: с 1 августа доступ ко всем новым курсам станет ограниченным. Успейте инвестировать в свои знания на самых выгодных условиях!
👉 Выбрать курс
C#/.NET-разработчик — удалёнка.
C# and MS SQL Developer — до 4 000 $, удалёнка.
.Net Core Разработчик Junior — от 3 000, удалёнка.
Backend-разработчик C# — удалёнка.
C# разработчик — до 420 000 ₽, удалёнка.
Бустер — Удалённо (в любом городе мира).
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ Параллельная асинхронная обработка
В высоконагруженных приложениях часто требуется запустить несколько независимых операций параллельно и дождаться их завершения полностью или частично.
🛠 Дождаться всех задач —
Когда нужно запустить сразу несколько независимых операций и обработать результаты только после того, как все они завершатся.
1. Запускаем задачи параллельно:
2. Ждём завершения всех
3. Получаем результаты
Для задач с возвращаемым значением WhenAll вернёт массив результатов в том же порядке.
Если нужно ограничить количество одновременных операций — обёрните запуск через
Передавайте
Когда важно получить результат как можно скорее и дальше обработать только первый ответ.
1. Запускаем конкурирующие задачи
2. Ждём первую завершившуюся
3. Получаем и обрабатываем результат
Передавайте единый CancellationToken через CancellationTokenSource, чтобы отменять все задачи разом.
Назначайте разумный таймаут через
Для большого числа конкурирующих операций рассматривайте использование
🐸 Библиотека шарписта #буст
В высоконагруженных приложениях часто требуется запустить несколько независимых операций параллельно и дождаться их завершения полностью или частично.
🛠 Дождаться всех задач —
Task.WhenAll
Когда нужно запустить сразу несколько независимых операций и обработать результаты только после того, как все они завершатся.
1. Запускаем задачи параллельно:
var loadUsers = LoadUsersAsync(); // загрузка списка пользователей
var loadOrders = LoadOrdersAsync(); // загрузка списка заказов
var loadCatalog = LoadCatalogAsync(); // загрузка каталога товаров
2. Ждём завершения всех
await Task.WhenAll(loadUsers, loadOrders, loadCatalog);
3. Получаем результаты
var users = await loadUsers; // List<User>
var orders = await loadOrders; // List<Order>
var catalog = await loadCatalog; // List<Product>
Console.WriteLine($"Пользователей: {users.Count}, заказов: {orders.Count}, позиций: {catalog.Count}");
Для задач с возвращаемым значением WhenAll вернёт массив результатов в том же порядке.
Если нужно ограничить количество одновременных операций — обёрните запуск через
SemaphoreSlim
.Передавайте
CancellationToken
во все методы, чтобы можно было прервать все сразу.🛠
Дождаться первой завершившейся задачи — Task.WhenAny
Когда важно получить результат как можно скорее и дальше обработать только первый ответ.
1. Запускаем конкурирующие задачи
var t1 = GetFromCacheAsync(userId, ct);
var t2 = GetFromDatabaseAsync(userId, ct);
var t3 = GetFromApiAsync(userId, ct);
2. Ждём первую завершившуюся
Task<Task<User?>> first = Task.WhenAny(t1, t2, t3);
Task<User?> winner = await first;
3. Получаем и обрабатываем результат
User? user = await winner;
if (user != null)
Console.WriteLine($"Данные получены от {GetSourceName(winner)}");
else
Console.WriteLine("Пустой ответ от первого источника");
Передавайте единый CancellationToken через CancellationTokenSource, чтобы отменять все задачи разом.
Назначайте разумный таймаут через
Task.WhenAny
с Task.Delay
, чтобы не ждать вечно:var timeoutTask = Task.Delay(TimeSpan.FromSeconds(5), ct);
var winner = await Task.WhenAny(t1, t2, t3, timeoutTask);
if (winner == timeoutTask) throw new TimeoutException();
Для большого числа конкурирующих операций рассматривайте использование
Channel
или Dataflow
вместо запуска сотен Task
.Please open Telegram to view this post
VIEW IN TELEGRAM
👍17😁2❤1👾1
В условиях высокой конкуренции важно не только иметь качественное резюме, но и знать, как сделать его заметным для рекрутеров.
Существуют простые, но эффективные способы, которые помогут вам выделиться среди множества кандидатов и привлечь внимание работодателей.
В карточках делимся проверенными методами, а в статье раскрываем всю суть.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱3❤2