C#razy
59 subscribers
176 photos
45 videos
2 files
301 links
C# и не только 😉 — блог о языках программирования, книгах, полезных дайджестах и лайфхаках для разработчиков.

https://linktr.ee/aleksandrdotnet
Download Telegram
Docker, ты как жив?!

Открываю утром Docker Desktop на Mac, а он мне с порога:
"Malware Blocked and Moved to Bin" 🫠

я тут задумался - Docker теперь считается вирусом? Может, это знак, что пора завязывать с IT

Полез гуглить, заглянул в GitHub issue #7527 - оказалось, дело в просроченном сертификате. macOS подумал, что Docker теперь что-то подозрительное и просто выкинул его в мусорку. Буквально удалил прямо сразу -_-

Вынесим пользу из ситуации:
Если твой инструмент перестал работать это Ок, глушим панику, смотрим в GitHub
Лучший способ заставить разработчика проснуться утром - просто сообщите ему, что эта штука не работает на вашем ноуте
macOS серьезно относится к безопасности это прямо второй плюсик

Docker уже исправляет баг, но они стали знаменитыми) это видимо тенденция 2025

#news
#docker

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
Этот 2025 не простой год.
Простыми будут 2027 и 2029 потому что они делятся только на себя и на единицу.

#math
#dev
#humour

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Как я отпраздновал 03.14

Современный мир требуют современное искусство.

Да-да это python. Я даже проникся как местами просто. НО pip и pip3 и какая то не совместимость с brew. Количество приседаний было утроено чтобы сделать рендеринг

#python
#ascii
#rendering
#pi

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
Оптимизация, которая реально нужна

Тут наткнулся на отличное видео про оптимизацию работы с файлами и S3.
Если у вас в коде есть обработка больших файлов, то это прям мастхэв к просмотру и вдохновению

тут будет
- stackalloc – чтобы не гонять GC лишний раз.
- ArrayPool – арендуем массивы вместо создания новых.
- Stream
- работа с S3

Вместо типичного «ну, GC пусть сам разберётся», тут идёт грамотный контроль аллокаций и потоков данных. Реальный пример того, где оптимизация не просто «чтоб быстрее», а потому что надо

Советую посмотреть и вдохновиться
Ссылка: YouTube

#dotnet

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
Outbox Pattern как НЕ терять события

Вышла очередная конфа и тут озвучили Outbox с реальной подачей без преувеличения и быстрые структурные ответы на частые вопросы

Когда сервис записывает данные в БД и отправляет событие (Kafka, RabbitMQ, вебхуки), возможны проблемы:
Данные записались, но событие потерялось
Событие ушло, а данные не сохранились

Что решает этот ваш Outbox , по сути он записывает события в ту же БД откуда оно пришло😅, а потом фоновый сервис выгребает их и отправляет дальше. Вроде просто, но не просто когда есть монолит/распределённая система да и вообще это зависит от проекта)
Плюсы:
Всё согласовано и не теряется
Можно повторно обработать потерянные события

Но готовых решений по сути нет, все пишут свои велосипеды:
кто-то крутит cron, кто-то делает фоновые сервисы, кто-то ухитряется на триггерах сделать пока не видит это dba

Ссылка: YouTube

#outbox

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
В пятницу вечером 💀

#humour

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
1299. Replace Elements with Greatest Element on Right Side

➡️ Задача
1299. Replace Elements with Greatest Element on Right Side

➡️ Условие
Дано arr[], надо заменить каждый элемент на максимальный из элементов справа. Последний элемент становится -1.


➡️ Пример
Input: arr = [17,18,5,4,6,1]
Output: [18,6,6,6,1,-1]
Explanation:
- index 0 --> the greatest element to the right of index 0 is index 1 (18).
- index 1 --> the greatest element to the right of index 1 is index 4 (6).
- index 2 --> the greatest element to the right of index 2 is index 4 (6).
- index 3 --> the greatest element to the right of index 3 is index 4 (6).
- index 4 --> the greatest element to the right of index 4 is index 5 (1).
- index 5 --> there are no elements to the right of index 5, so we put -1.


➡️ Суть
Наивный способ - для каждого элемента искать максимум справа O(n²). Это медленно для больших массивов.
Оптимальное решение - идём с конца массива и запоминаем максимум, обновляя его по ходу элементами.


➡️ Решение
public int[] ReplaceElements(int[] arr)
{
if (arr.Length == 1) return [-1];
if (arr.Length == 2) return [arr[1], -1];

var last = -1;
for (int i = arr.Length - 1; i >= 0; i--)
{
if (arr[i] > last)
(arr[i], last) = (last, arr[i]);
else
arr[i] = last;
}

return arr;
}


➡️ HW?
1⃣ Начинаем с last = -1
2⃣ Двигаемся с конца массива к началу
3⃣ Для каждого элемента сохраняем его значение во временной переменной
5⃣ Заменяем текущий элемент arr[i] на last
5⃣ Обновляем last, если найден новый максимум

#leetcode
#easy
#algorithm
#two_pointers

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
Grok ≈ ChatGPT

Хочу поделиться с вами новостью @GrokAI теперь в Telegram

Grok - это AI, который помогает людям программистам (ответ от Grok: ускорения научных открытий человечества)

Что может:
Отвчечает быстро на технические вопросы
Помнит предысторию
Если у вас Telegram Premium, премиум-фичи Grok БЕСПЛАТНО, КАРЛ!
Всё теперь можно делать прямо в Telegram (раньше можно было найти бота, но тут всё лучше и проще)
Не умеет в рисовать, графики и всё такое, но может сделать код который сможет нарисовать [У тебя есть карта? Лучше! У меня рисунок карты!]
Прекрасно распознаёт изображения

Минутка от GrokAI
ВОПРОС: какое сегодня число?
ОТВЕТ: Сегодня 20 октября 2023 года.


Бот: @GrokAI

#AI
#grok

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
3. Longest Substring Without Repeating Characters

Задача
3. Longest Substring Without Repeating Characters

Условие
Given a string s, find the length of the longest substring without duplicate characters.


Пример
Input: s = "abcabcbb"
Output: 3
Explanation: The answer is "abc", with the length of 3.


Суть
Наивный способ - перебирать все подстроки O(n²). Это медленно для больших массивов.
Оптимальное решение - использовать Sliding Windows и HashSet


Решение
public int LengthOfLongestSubstring(string s)
{
if(s.Length <= 1)
return s.Length;

var left = 0;
var max = 0;

var dict = new Dictionary<char, int>();
for (var right = 0; right < s.Length; right++)
{
if (dict.TryGetValue(s[right], out var index))
{
left = Math.Max(left, index + 1);
}

dict[s[right]] = right;

max = Math.Max(max, right - left + 1);
}

return max;
}


HW?
1⃣ Обработка простых случаев
2⃣ Проход по строке с использованием правого указателя. Мы двигаем right (правый указатель), проходя по строке s.
3⃣ Проверка на повтор символа
Если s[right] уже есть в dict, значит символ повторяется. Берем сохраненный индекс index из dict[s[right]. Сдвигаем left, чтобы не было повторов: left = Math.Max(left, index + 1). Это предотвращает сдвиг left назад, если left уже ушел дальше повторного символа.
5⃣ Обновление словаря. Записываем в dict[s[right]] текущий индекс right — теперь этот символ встречается в позиции right.
5⃣ Обновление максимальной длины. Выбираем максимум между max и текущей длиной окна.

#leetcode
#medium
#algorithm
#sliding_window

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
Пятница и leetcode 🕵️‍♂️

#humour

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Sort vs. Rearrangement

Решал задачу "Sort Array by Parity"
Сначала подумал:
“Разделить, отсортировать, объединить” - звучит логично? Да.
Но... Памяти потребляется много.

А потом осенило:
Используй два указателя.
Один дополнительный индекс
Без списков
Без сортировки
Без лишней памяти

Было: O(n²) Стало: O(n)

Иногда перестановка лучше, чем сортировка 🥹

#leetcode
#sorting
#algorithm
#easy
#developer

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
EF Core единым: как LINQ to DB спасает, когда EF уже не тянет

Есть отличное видео о ORM от Алексей Фадеев рассказал, как LINQ to DB (linq2db) может быть настоящим спасением, когда Entity Framework Core начинает тормозить — Привет от BULK операций и сложных условий обновления.

➡️ В чём EF Core не хорош?
Иногда страдает от медленной инициализации
Нет удобной поддержки bulk insert/update
Ограниченные возможности при сложных SQL-операциях

➡️ В чём linq2db хорош?
Так же не нужно создавать объект если хотите сделать просто update
просто SQL уровня UPDATE ... SET ... FROM ... WHERE ....
await db.Companies
.Where(c => c.Name == null)
.Set(c => c.Name, c => c.Director + "'s company")
.UpdateAsync();


Вставка сотен тысяч строк в linq2db: PostgreSQL и метод COPY
Если у вас PostgreSQL и вы вставляете кучу строк — забудьте про AddRange и SaveChanges 🥹
await db.BulkCopyAsync(new BulkCopyOptions
{
TableName = "Passengers",
KeepIdentity = true
}, passengersList);


Insert from select, merge и временные таблицы
LINQ to DB позволяет делать вещи, которые в EF либо невозможно, либо надо "танцевать с бубном"


Так же для MERGE можно использовать специальный DSL или выполнять кастомный SQL напрямую — и всё это в транзакции EF.
await db.Into(db.NewTable)
.Insert(
from o in db.OldTable
where o.IsActive
select new NewTable { Id = o.Id, Name = o.Name });


var sql = @"select * from tickets where departure_time > now()";
var result = await db.FromSql(sql).ToListAsync();


➡️ Что ещё интересного в linq2db?
- Использование разных isolation levels для тонкой настройки транзакций
- Обходить блокировки строк с помощью "skip locked"
- Почему EF тормозит из-за инициализации, а LINQ to DB — нет 🫠
- Как расширить LINQ to DB для PostgreSQL-специфичных фич (full-text search, @> и т.п.)

📝Итого
У меня был опыт с linq2db, но довольно печальный. Во-первых небыло ещё chatgpt)) и практически нет документации. Тем не менее, если вы работаете с большими объемами данных, сложной бизнес-логикой и хотите контролировать SQL на выходе — присмотритесь к LINQ to DB. Это не просто "альтернатива", это — швейцарский нож для разработчика, уставшего от "магии" ORM.

Ссылка: YouTube

#EFCore
#LINQtoDB
#PostgreSQL
#dotnet
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
🪓 50 дней подряд решаю задачи на LeetCode

50-дневный стрик на LeetCode для меня было не просто. Это по сути значит, что я каждый день решал хотя бы одну задачу по алгоритмам и структурам данных. Иногда это было легко, иногда - совсем нет. Иногда — ночью, перед сном, иногда в 23:57 я пушил ответ. Но каждый день - стабильно.

➡️ Зачем это всё?
1. Набрать форму 😅.
Когда пишешь бэкенд или работаешь с продакшеном - алгоритмы быстро уходят из головы. Последний раз я решал задачи года полтора назад. И естественно ничего этого я уже и не помню). А они тренируют мышление, умение оптимизировать и видеть код на уровень глубже, не всегда конечно, но увеличивают кругозор и экспертизу.

2. Дисциплина.
Можно сранвить как спорт: это как быть в прайме своей формы или готовиться к соревнованиям, даже 20 минут в день дают мощный эффект, если делать стабильно.

3. Challenge самому себе.
Не ради рейтинга, ради алгоритмов. А ради внутреннего ощущения, что ты не стоишь на месте. И оттачиваешь своё ремесло 🤓

4. Прокачка английского.
Понять что имеется ввиду тоже ещё тот челендж


Если давно хотел прокачаться в алгоритмах, начать легко: по одной задаче в день. Главное - регулярность, это сложно.

И да, даже если день жёсткий - можно найти 10 40 минут и сделать хотя бы задачу.

Хотя бы одну задачу, Карл!

📝Итого:
Делайте себе вызовы.
Пафосно: Пусть будет не LeetCode, а что-то своё. Но что-то, что будет каждый день приближать вас к цели.

➡️ Правило от меня: Не тратить на задачу больше 1 часа. Забить и отложить. Это помогло мне пару раз

#leetcode
#codingchallenge
#developer
#dotnet

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
Пятничный пользователь 👨🏻‍💻

#humour

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
Звучит как правда 🧐

#humour

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
Архитектура своего пет проекта 🫣

#humour

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Курсы ИИ от Microsoft

Microsoft выкатил подборку бесплатных курсов по искусственному интеллекту на своей платформе Microsoft Learn. Всё бесплатно, легально, удобно, без смс но с регистрацией ☺️

Курсы на русском есть, но можно свитчутся на английский, изложение понятное можно осилить даже без C2

Темы есть на любой вкус:
– основы машинного обучения
– работа с Azure AI
– нейросети
– использование Copilot в повседневной разработке
– и что то на современном: как этично применять ИИ

Если давно хотел(а) прокачаться в этой теме, но не знал(а) с чего начать это отличный старт.

#AI
#microsoft
#cources

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Моё наивное решение VS. нечеловеческого?

➡️Есть задача
В массиве чисел каждый элемент - это голос за кандидата. Найдите кандидата, который получил больше половины голосов.

1. Моё решение Оказалось наивным =(
O(n) по времени, O(n) по памяти

public int MajorityElement(int[] nums)
{
var limit = nums.Length / 2;
var dict = new Dictionary<int, int>();

foreach (var number in nums)
if (dict.TryGetValue(number, out var count))
{
if (count + 1 > limit)
return number;

dict[number] = count + 1;
}
else
{
dict[number] = 1;
}

return dict[0];
}


➡️ Как работает
Мы храним количество вхождений каждого элемента в словаре.

Для каждого числа проверяем, не встречается ли оно больше половины массива.

Если встречается - сразу возвращаем его.
Да всё ок - я доволен и задача решена.

💡 НО Проблема:
Это решение работает за O(n) по времени, но требует O(n) памяти из-за использования словаря. Это неплохо, но есть более эффективные способы.

Есть нечеловеческое умное решение
2. Boyer-Moore Majority Vote Algorithm: O(n) по времени, O(1) по памяти

public int MajorityElement(int[] nums)
{
int candidate = 0, count = 0;

foreach (var num in nums)
{
if (count == 0)
candidate = num;

count += (num == candidate) ? 1 : -1;
}

return candidate;
}

➡️ Как работает
Алгоритм выбирает кандидата и отслеживает его "счёт".

Если счёт равен нулю, мы меняем кандидата на текущий элемент.

Алгоритм работает за O(n) по времени, но не требует дополнительных структур данных и O(1) по памяти 🤓

#leetcode
#dotnet
#algorithm

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
Минус одна нерешённая проблема

Вот одна из причин почему стоит учить C#

Пока философы спорят - разработчики пишут код. C# не стал спорить, а мы тут ещё 100 лет спорили, а тут всё же просто, ну 😅

#developer
#dotnet

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM