C# Short Posts 🔞
306 subscribers
206 photos
7 videos
211 links
Здесь я, Дима Афонченко @Undermove1, публикую короткие заметки о разработке (и около). Я не претендую на правильность высказываний и открыт к дискуссиям, исправлениям и конструктивной критике. С любыми деструктивными вещами можно приходить в комменты)
Download Telegram
😂 Помните Semantic Kernel? Можете выкинуть. Тащите Agent Framework 1.0

Помните я писал про Semantic Kernel? Про то как можно за пару строчек кода собрать мини-агента с тулами, который сам решает что вызывать? Так вот — можете его выкинуть. 3 апреля Microsoft выкатили Agent Framework 1.0. Это не очередной превью — это стаблильнейший релиз от тех же людей, что делали SK. Фактически они взяли всё хорошее из SK, выкинули всё что бесило, и в итог переписали все с нуля.

Как говорится, устранили фатальный недостаток.

Главная боль SK была в том, что для всего нужен был объект Kernel. Хочешь тул зарегать — оберни в KernelPlugin, навесь [KernelFunction], добавь в Kernel.Plugins. Хочешь другого провайдера — отдельный класс агента (ChatCompletionAgent, OpenAIAssistantAgent, AzureAIAgent). Много обвязки.

В Agent Framework всё это выкинули. Вот что поменялось:

1️⃣ Один тип агента на всех провайдеров. ChatClientAgent работает с любым IChatClient — OpenAI, Azure, Anthropic, Ollama. Никаких отдельных классов.

2️⃣ Тулы без атрибутов. Не нужен [KernelFunction]. Берёшь любой C# метод, оборачиваешь в AIFunctionFactory.Create() — и готово. Description по-прежнему важен (как я и говорил — мусор на входе, мусор на выходе), но обвязки стало меньше.

3️⃣ Сессии из коробки. Не надо руками таскать ChatHistory. Вызвал agent.CreateSessionAsync() — и агент сам хранит историю переписки между вызовами.

4️⃣ Middleware pipeline. Вместо фильтров SK — полноценный пайплайн как в ASP.NET. Три уровня: перехват на уровне агента, на уровне вызова функций, на уровне IChatClient.

Покажу на примере. На пояснительном дикпике 1 — агент с тулами для работы с GitHub. Обратите внимание: никакого [KernelFunction], никакого Kernel.Plugins. Просто метод с [Description] и AIFunctionFactory.Create(). Минус целый один атрибут! 😳

А на дикпике 2 — сравнение старого SK и нового Agent Framework бок о бок. Тот же функционал, вдвое меньше кода.

А ещё там есть мультиагентные воркфлоу. На дикпике 3 — цепочка из трёх агентов: один исследует, второй пишет, третий редактирует. И всё это собирается в одного workflowAgent. Я вот тут чуток попробовал. Мне понраивлось в целом

А что с Semantic Kernel, кстати где он?

Ну вот тут кек. ☺️ Мы буквально только-только затащили SK в проект. 😀 Написали плагины, настроили агентный цикл, я даже посты про это написал!!! — и тут Microsoft такие: "а мы тут новый фреймворк сделали, старый в maintenance mode". Классика AI. А помните как мы угорали над фронтентдными фреймворками? Я вот сейчас плчу по тем временам. 😭

SK официально переходит в maintenance mode. Это значит: баг-фиксы и секьюрити патчи будут, но новых фич не будет — всё новое только в Agent Framework. Microsoft рекомендует мигрировать в течение 6–12 месяцев.
Гайд по миграции. 🫠

🅰️ Итого: Agent Framework — это то, чем SK хотел быть, но не мог из-за легаси. Выбрасывайте SK и срочно переходите на Agent Framework! Ладно, это шутка. Если уже используете SK — не паника, он ещё поддерживается, но мигрировать стоит. Если только начинаете — начинайте сразу с Agent Framework.

#csharp #dotnet #ai #agents #microsoft
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥43❤‍🔥1😈1
👽 Как защититься от космических лучей? Часть 1

В 2003 году в городе Схарбек один из кандидатов на местных выборах внезапно получил на 4096 голосов больше, чем было физически возможно.

Конечно, нас таким не удивить. Но вот в Бельгии, где и проходило голосование, очень даже удивились и провели расследование. По результатам которого во всем обвинили космические лучи. ☄️

Интерес тут в том, что все это оказалось правдой. Дело в том, что космические лучи постоянно бороздят не только просторы нашей вселенной, но и наши микрочипы. И в обычной жизни до недавнего времени вы вполне себе могли списать часть ваших багов именно на воздействие вселенной. Но в последнее время вам это будет делать все сложнее.

Не потому что космических лучей стало меньше, а потому что мы научились от них защищаться. И я хочу рассказать тут, как!

👿 Проблема
Давайте представим, что вы храните на диске или в памяти какую-то последовательность. К примеру 1011. И от этой последовательности зависит сломается ваша система или нет. Но в какой-то момент происходит вспышка на Солнце и ваша последовательность становится 1001. И вас будит алерт.

Вас просят предотвратить подобное в будущем. Как же это сделать?

🔢 Самое тупое решение — бит чётности

Идея: вы после каждых 4 бит добавляете пятый — контрольный. Его вы подбираете так, чтобы общее количество бит было в сумме чётным.

К примеру, для вашего числа:

1011 → 10111 (три единицы + одна контрольная = четыре, чётно)

Когда вы считываете это число, то просто суммируете все биты и если их сумма нечетная, как к примеру вот тут:

10011 ❌

То вы делаете вывод, что космический луч сломал вашу программу и вы тут ни при чем. Или вот тут число четное, значит можно ехать дальше.

10111 ✅

Это довольно хороший подход. Но как найти куда конкретно попал космический луч?

Самый простой вариант это хранить резервную копию, с которой бы мы сверялись в случае чего. Но КПД у такого решения конечно низкий, в районе 50%. А если быть точным, то именно 50%

Что означает, что на поддержание инфрастуктуры по защите от космических лучей вы будете тратить 50% оперативной памяти. Что конечно никто из менеджмента не одобрит. Проще закупиться шапочками из фольги. 🥈

Однако способ все же есть. И я попробую его в следующем посте объяснить. Оно того правда стоит!

#инженерныештучки #кодхэмминга #помехоустойчивость
Please open Telegram to view this post
VIEW IN TELEGRAM
4👾2👻1
Ффух, наконец вышла моя статья про то, как работают тестовые фреймворки. За эти три месяца, что статья готовилась, я уже раза три успел получить профиты от знаний который наросли при подготовке. 🐸
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Dodo Engineering
Разбираемся в работе тестовых фреймворков в .NET! 🤓

Cитуация: написали вы функцию, кликнули в IDE на треугольник, а потом так раз и получили пачку зелёных галочек. Было? Было! А знаете ли вы, как устроен этот процесс? Ну вот как эти галочки получаются?

Вот и мы не знали, пока не прочитали новую статью нашего техлида Димы Афонченко. Однажды ему стало интересно, как работают тестовые фреймворки, а потому он разобрался в теме и рассказал нам о том, что узнал.

Спойлер: в тексте нет никакого заковыристого кейса, из-за которого Дима полез разбираться в dotnet test, зато есть много любопытных деталей и даже магии. В общем, переходите по ссылке ниже и изучайте вопрос вместе с Димой!

👉 Читать статью на Хабре
🎉7❤1👍11
👽 Как защититься от космических лучей? Часть 2

Итак, как нам дешево защититься от космических лучей? Возьмём 11 бит данных:

1️⃣ 1️⃣ 0️⃣ 0️⃣ 1️⃣ 0️⃣ 1️⃣ 1️⃣ 0️⃣ 1️⃣ 1️⃣

Космический луч может испортить один бит. Как найти и исправить конкретный бит?

Первое что приходит в голову — разбить на группы и проверить чётность каждой. Но тогда мы знаем только в какой группе сбой, а не какой бит флипнулся. КПД те же 50%.

Идея которую я изложу дальше была предложена Ричардом Хэммингом ажно в 1950 году. И была она настолько универсальна и крута, что используется до сих пор!

🟢 Решение — сетка 4×4

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

Но как это сделать? Во первых нашу линейку битов мы расположим в виде матрицы:


❓ ❓ ❓ 1️⃣

❓ 1️⃣ 0️⃣ 0️⃣

❓ 1️⃣ 0️⃣ 1️⃣

1️⃣ 0️⃣ 1️⃣ 1️⃣

Вопросики — контрольные биты на позициях-степенях двойки. Работают так же они будут позволять проверять четность. Но алгоритм тут чуть хитрее. Ибо каждыйц проверочный бит будет отвечать не за один столбец или одну строку, а сразу за две! Как это показано на пояснительном дикпике 1.

Теперь вычислим значения вопросиков:

К1: 1+1+0+1+0+1+1 = 5, нечётное → К1 = 1
К2: 1+0+0+1+1+1 = 4, чётное → К2 = 0
К4: 1+0+0+1+0+1+1 = 4, чётное → К4 = 0
К8: 1+0+1+1+0+1+1 = 5, нечётное → К8 = 1

Получилось что нам нужно хранить 16 бит вместо 11. КПД — 69%. Но на самом деле, чем больше бит нам нужно проверить, тем эффективнее будет этот алгоритм!

Готово! Защищённая последовательность:

1️⃣ 1️⃣ 0️⃣ 1️⃣

0️⃣ 1️⃣ 0️⃣ 0️⃣

1️⃣ 1️⃣ 0️⃣ 1️⃣

1️⃣ 0️⃣ 1️⃣ 1️⃣

☄️ Космический луч бьёт в позицию 3

Бит в правом верхнем углу переворачивается:
1 → 0.

1️⃣ 1️⃣ 0️⃣ 0️⃣

0️⃣ 1️⃣ 0️⃣ 0️⃣

1️⃣ 1️⃣ 0️⃣ 1️⃣

1️⃣ 0️⃣ 1️⃣ 1️⃣

Как найти нужный бит?

Прогоняем 4 проверки:

🟨 К1 (столбцы 1,3): сумма 5, нечётное → сбой!
🟦 К2 (столбцы 2,3): сумма 3, нечётное → тоже сбой!

Обе группы указывают на столбец 3. Ошибка одна — значит она там. Столбцы 1 и 2 чистые ✓

🟩 К4 (строки 1,3): сумма 4, чётное → ок ✓
🟧 К8 (строки 2,3): сумма 6, чётное → ок ✓

Строка 0, столбец 3 → позиция 3! Переворачиваем бит. Починено.

💡 Можно ещё проще: складываем номера сбойных групп. 1 + 2 = 3. Номер битого бита.

⁉️ Интерактивная визуализация:

Короче, на мощностях тележного редактора такие визуальные штуки объяснять довольно сложно. Но я заморочился и потратил вечерок на вайбкодинг визуализации. Поглядите ее. Там это все прям по шажочкам разложено и можно потыкать в разные биты и поиграться с космическими лучами. ГДЕ ЕЩЕ ВАМ ДАДУТ ПОИГРАТЬСЯ С КОСМИЧЕСКИМИ ЛУЧАМИ???

➡️ОТКРОЙ МЕНЯ ⬅️

Ну а в следующем посте, расскажу, как это работает применительно к нам и почему именно до 2021 года мы могли с уверенностью все валить на космические лучи. А сейчас уже не с такой уверенностью

#инженерныештучки #кодхэмминга #помехоустойчивость
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
3❤‍🔥2👾2❤1
👽 Как защититься от космических лучей? Часть 3

Две части теории — теперь практика. Если не разобрались с прошлым постом, то я сделал интерактивную симуляцию кода Хэмминга, где можно пощупать всё руками:

🍔 HAMMING 🍔

🎓 А теперь к тому кто вообще это придумал?

А придумал Ричард Хэмминг аж в 1940-е годы. На фото как раз его компьютер Bell Model V — релейный монстр из 9000 реле. Ну как его. Он был одним из многих так сказать.

Реле — это такая катушка, которая притягивает контакт магнитом. Ток есть — замкнут (1). Нет — разомкнут (0). Из таких вот штук была построена вся память и логика. 9000 реле = компьютер. Типа 9000 тумблеров.

Так вот эти все реле залипали, окислялись, пружины в них уставали. В общем вся эта байда и без космических лучей ломалась 2-3 раза в день.

Если попадался хотя бы один битый бит, то машина хотя и обнаруживала сбой, но не знала где. И единственный вариант — начать заново.

В будни за всей этой адской машиной следил оператор саппорта — чинил и перезапускал.

Но Хэмминг был любителем запустить на выходных и пойти расчиливаться. В выходные саппорт спал и не работал. В итоге когда случалась поломка программы Хэмминга тоже переставали работать;

В какой-то момент он ушел с работы на выходные, предварительно поставив рассчет. А когда пришел в понедельник, то увидел, что машина сломалась в самом начал ерасчетов и все выходные ничего не делалала.

Достоверно неизвестно, что точно сказал тогда Хэмминг, но до нам дошла явно очищенная от американского фольклора фраза:

"Damn it, if the machine can detect an error, why can't it locate the position of the error and correct it?"

«Чёрт возьми, если машина может обнаружить ошибку, почему она не может найти её позицию и исправить?»

Уверен, что так он все и сказал. После чего в 1950 году вышла его статья "Error Detecting and Error Correcting Codes". Где и был представлен разобранный нами алгоритм. С тех пор прошло 76 лет.

🖥 Как это работает сейчас?

До недавнего времени проблема космических лучей не сильно всех волновала. Да и на самом деле биты могут флипнуться не только из-за них. Простого электромагнитного воздействия или банально сбоя в работе хардвера будет достаточно.

⚡ Инциденты

Amazon S3 (2008) — один перевёрнутый бит во внутреннем сообщении (без контрольной суммы) распространился по всем серверам. S3 лежал 8 часов.

Super Mario 64 (2013) — на стриме Марио телепортировался от бит-флипа. Значение высоты изменилось на один бит. Награда $1000 за воспроизведение не востребована.

😮 А как сегодня относятся к битым битам?

В 2009 Google опубликовала статью "DRAM Errors in the Wild”. В которой сообщила, что ошибки в памяти встречаются в 10-30x чаще чем думали. ~4000 исправлений на планку в год 😱 8% планок ловили ошибку за год.

В 2021 году плотность чипов так сильно увеличилась, что на DDR5 стали применять уже технологию Error Correction Codes (ECC)

То есть в 2021 году ECC стала де-факто стандартом в оперативке и основана как раз на кодах Хэмминга. Ибо они очень экономичные как по памяти так и по вычислениям. Алгоритм там немного модифицирован и позволяет исправить одну ошибку и отловить если их больше двух.

🅰️ Итого: Какую практическую пользу можно из этого извлечь? Ну помимо отмазки, что в вашей серверной стоит DDR4 и поэтому все так лагает под напором космической энергии.

Думаю, что тут можно извлечь красоту инженерной мысли! Идея Хэмминга безумно элегантная. На таких решениях можно учиться смиряться с несовершенством мира. Да, твои реле могут постоянно переключаться, припаиваться, космические лучи будут уничтожать твои бульки. Но ты всегда можешь сам отследить и восстановить то что поломалось. Это чем-то похоже на способность человека восстанавливаться после порезов.

Короче, вот такая серия постов. Я иногда пишу просто про такие вот инженерные штучки. Надеюсь, что они тут вам не мешаются и вы тоже от них кайфуете 🐈

#инженерныештучки #кодхэмминга #помехоустойчивость
Please open Telegram to view this post
VIEW IN TELEGRAM
❤33🔥2
Надоело писать про AI

Но не писать про него сейчас сложно! Потому что выходит очень много всего интересного!

В этом канале я изначально хотел писать про веб-разработку и все что с ней связано – как писать грамотный код, какая инфра крутится вокруг и этого кода и как она работает. Еще мне было интересно одно время писать про организацию процессов.

В общем, тут я и планирую этим заниматься, а вот все посты про AI и всю эту мишуру думаю теперь вести в отдельном канале. На котором как раз вышел пост и для которого я накидал статью на Хабр.

А еще там уже есть довольно неплохие разборы:

🟢Что влияет на цену токенов?
🟢Почему нейронки могут в будущем сильно подешеветь?
🟢С какого момента начинается контекст-рот?

В общем, заходите, гости дорогие, читайте, буду рад всех вас там видеть)

А еще канальчик это мы ведем с @sagos95 который является заядлым ИИнтузиастом. Так что там точно будет много гиканутого 🔥
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥33
В жизни каждого шарписта наступает момент, когда надо разобраться, наконец, как работает СУБД, которой он каждый день пользуется.
Прежде чем написать этот короткий пост, я погрузился в тему баз данных и в какой-то степени они стали для меня открытой книгой, буквально, потому что в них слишком много аналогий с книгами. Оказывается, что концепция, на которой стоит вообще всё хранение данных, одна и та же что в PostgreSQL, в MySQL, и даже в MongoDB — страницы 📄

📖 Что такое страница и зачем она
Когда ты делаешь INSERT INTO users (...), в голове картина обычно простая: «строчка просто легла куда-то в таблицу». Физически — нет. Ни одна нормальная СУБД (что реляционная, что документная) не пишет каждую строку или документ отдельно. Вместо этого данные складываются в страницы (pages) — блоки фиксированного размера.
У PostgreSQL и SQL Server страница — 8 KB, у MySQL/InnoDB — 16 KB, у MongoDB через WiredTiger — настраивается, но того же порядка. Любая операция чтения или записи — это работа с целой страницей, а не с одной строкой.
Почему так? Потому что диск и RAM физически работают блоками, а не байтами. Один поход на диск всё равно вытаскивает целый блок килобайт на восемь — хочешь ты того или нет. СУБД этим пользуется: складывает в одну страницу столько строк или документов, сколько влезет. Берёшь одну строку — получаешь рядом «соседей» бесплатно 💋

🔬 Давай потрогаем руками
Самое классное — это всё можно пощупать, если поднять, например, PostgreSQL в Docker. Полный список команд для последовательного выполнения сможешь найти 👉вот здесь👈 (а то пост получится уже не таким коротким) 🥖

На пояснительном дикпике 1 можно увидеть, где физически лежит созданная таблица и сколько весит: файл занимает ровно 409600 байт = 50 × 8192, то есть страницы ровно по 8 KB. И таких страниц в одном файле подряд — 50 штук, это и есть вся таблица.

На дикпике 2 можно увидеть, как заглянуть внутрь файла прямо из контейнера и что записи лежат сырыми байтами в одной из 50 страниц.

📍 Где какая строка лежит
В Postgres у каждой строки есть служебный «адрес» — ctid, пара (номер страницы, номер слота на странице).

На дикпике 3 запрос, который покажет адреса выбранных строк, и там же видно, что в нулевую страницу 8 KB у нас влезла 121 строка, в первую — следующие 120, и так далее. На 6000 строк ушло 50 страниц — ровно то, что мы видели по размеру файла. Когда СУБД хочет прочитать запись с id = 5999, она не «ищет в таблице» — она поднимает с диска страницу №49 и достаёт из неё нужный слот.

🧑‍💻 Что с этим знанием делать в работе
1. Чтение одной строки = чтение целой страницы. Запросом за одной строчкой ты всё равно поднимаешь с диска 8 (или 16) KB. Если в WHERE id IN (...) много значений и они физически рядом — это почти бесплатно. Если разбросаны по таблице — каждое чтение отдельная страница.
2. Узкие таблицы — это не только про место. Чем шире строка, тем меньше их влезает в страницу. Большое поле text на килобайт-другой может уронить плотность в 20 раз — и для того же количества строк понадобится в 20 раз больше страниц.
3. shared_buffers / buffer pool — это кэш страниц, не строк. Когда тюнят память под СУБД, имеют в виду «сколько страниц влезет в RAM». И именно поэтому случайные чтения по большой таблице болят: каждая страница приходит с диска заново.
4. В Postgres UPDATE — это DELETE + INSERT. Старая версия строки помечается мёртвой и продолжает лежать на той же странице, новая дописывается рядом. Поэтому после массовых апдейтов файл таблицы пухнет, пока не пройдёт VACUUM. Та же логика — ctid после UPDATE меняется, потому что физически это уже другая запись на другом слоте.

А если в таблице миллионы записей, как БД так быстро находит нужную? Для этого нужны индексы, но о них — в другом посте👉

🧑‍💻dp 🥁
#бд #postgresql #инженерныештучки #heavywednesday
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
7❤2
👈 В прошлый раз мы выяснили, что обычно данные в СУБД лежат в страницах фиксированного размера. А как по этим страницам что-то быстро найти?

🔍 Если искать в лоб
Представь, что ты хочешь найти в толстой книге по базам данных упоминание слова «дерево». Если в конце нет предметного указателя — придётся листать страницу за страницей и глазами выискивать нужное слово.
СУБД без индекса делает ровно то же самое: она прочитает все страницы таблицы подряд, проверит на каждой, есть ли подходящая строка, и оставит то, что нашла. Этот режим работы называется Sequential Scan, или просто Seq Scan — последовательное чтение.
Увидеть, что СУБД делает именно так, можно через EXPLAIN — команду, которая покажет, как планируется выполнить запрос. Видишь в плане Seq Scan — значит СУБД проходит таблицу целиком.
На таблице в 10 млн строк это будет довольно долго, потому что на каждый запрос будут выполняться сотни тысяч чтений страниц с диска ради одной нужной строки 💽

📖 Предметный указатель
В книге это решается просто: там есть предметный указатель — отсортированный по алфавиту список слов с номерами страниц. Открываешь, ищешь слово, прыгаешь на нужную страницу.
В СУБД роль такого указателя играет индекс. Это отдельная структура на диске, в которой ключи (например, значения id) лежат отсортированно, а рядом с каждым — указатель на конкретную страницу таблицы 🧿
Чаще всего первый индекс появляется в таблице автоматически: когда ты добавляешь, например, в свою таблицу users PRIMARY KEY на колонку id, Postgres под капотом создаёт уникальный индекс по этой колонке — users_pkey; в psql его видно через метакоманду \d users как btree (id).

🌳 Что такое btree
В большинстве СУБД (PostgreSQL, MySQL/InnoDB, SQL Server, MongoDB через WiredTiger) индекс по умолчанию — не просто отсортированный список, а B-дерево (точнее, его вариант B+tree).
Почему не список? Главное — число чтений с диска. Бинарный поиск по отсортированному списку из миллиона страниц — это около 20 чтений. И если ключ не монотонный (email, uuid, имя автора), любая вставка в середину означает переписать целый хвост.
B-дерево — это обычное дерево из корня сверху, внутренних узлов в середине и листьев снизу. Оно устроено так:

🟢 В каждом узле много ключей — не один-два, а сотни.
🟢 Все листья на одной глубине. Любой путь от корня до листа одинаковой длины.
🟢 За счёт большого ветвления глубина дерева смешная. Для индекса по сотне миллионов записей это 3–4 уровня. Найти строку = 3–4 чтения. Не миллионы, не тысячи. Три-четыре 🎉
🟢 Листья связаны в список. Поэтому Range-запросы (>, <, BETWEEN) тоже летают: спустился до начала диапазона и пробежал листья подряд.
Аналогия — толстая энциклопедия: тома → главы → разделы. Три шага, и ты на месте 👍

📦 Как это лежит в Postgres (см. дикпик 3)
Структура B-tree один в один ложится на структуру страниц из прошлого поста:
⚪️ Один узел дерева = одна страница 8 KB.
⚪️ Внутренние узлы хранят пары (ключ, ссылка на дочернюю страницу). В одну страницу таких пар влезают сотни.
⚪️ Листья хранят пары (ключ, ctid). Помнишь ctid из прошлого поста? Это указатель «страница такая-то, позиция такая-то» — он ведёт прямо на нужную строку в куче.
⚪️ Индекс лежит отдельным файлом со своим pg_relation_filepath — это не часть таблицы, это самостоятельная сущность.

🔬 Пощупаем (см. дикпики 1 и 2)
Берём таблицу users из прошлого поста (6000 строк, без PRIMARY KEY) и ищем по id. Seq Scan ... Rows Removed by Filter: 5999: прочитали всё, отбросили 5999, оставили одну.

Добавляем первичный ключ. Тот же запрос — план сменился на Index Scan using users_pkey. Сначала Postgres прошёл по B-дереву от корня до листа, там нашёл ctid, по нему сходил в нужную страницу таблицы и достал строку.

🅰️ Что с этим знанием делать
Индекс — это отдельные страницы на диске. Каждый INSERT/UPDATE/DELETE правит и таблицу, и все её индексы. Поэтому вешать их «на всякий случай» на каждое поле — плохая идея: платишь местом на диске, замедлением записи, обслуживанием дерева. При хорошо выбранном индексе взамен этих накладных расходов получаешь быстрый поиск⚡️
dp
#бд #postgresql #инженерныештучки #heavywednesday
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
5🤝2⚡1
🗞 Что было за последний месяц для ASP.NETёра

Решил ввести для себя новую механику в самообучении. Сажусь раз в месяц и делаю себе типа дайджест, что было полезного в дотнете для меня на почитать и узнать нового. Буду иногда такое и сюда выкладывать, если будет что-то интересное на мой личный взгляд.

1️⃣ HybridCache + Postgres вместо Redis

В .NET 10 HybridCache наконец релизнулась. Главная фишка — встроенный stampede-protection (про который есть отличная серия постов и статья на моем любимом шарповом канальчике) и L1-memory (в процессе) + L2-distributed (в базе или редисе) одним API.

В этой статье MS показывает связку HybridCache с пакетом Microsoft.Extensions.Caching.Postgres — то есть L2 живёт в Postgres-таблице с UNLOGGED-флагом для скорости записи. Сейчас стало хайпово заменять все на постгресс. Ну по крайней мере в моем инфопузыре эта тема встречается регулярно. И вот и в майрософтовый блог просочилось.

Кажется скоро мы в постгрессе и рилсы с тиктоками сможем посмотреть, и даже катку в доту скатать.

2️⃣ Union types в C# 15

Про эту фичу много было хайпа. И уже давно. Я даже писал про тот функционал который по сути заменял эту функцию. Но теперь можно будте писать код, как на пояснительном дикпике.

Главный профит — если завтра в union добавится Refunded, все switch-выражения посыпятся в Build Output с ошибкой про неполноту, и ты гарантированно эти места найдёшь. Сегодня без помощи компилятора такие тихие «_ => throw» живут месяцами и ловят тебя за жопу в неподходящий момент. Хотя в целом можно тестами такое покрывать раньше было. Но теперь можно будет на компилятор положиться.

3️⃣ Node.js addons на C# через Native AOT

История: У команды C# Dev Kit был нативный Node.js аддон на C++

Что их бесило:

node-gyp требует Python — каждый разработчик в команде должен был ставить Python 3.x на свою машину, хотя в коде Python нет ни строчки.

Онбординг новых разработчиков — нужно настроить кучу тулзов, которые ты в работе никогда не трогаешь напрямую: C++ компилятор (MSVC / clang / gcc — у каждой ОС свой), node-gyp, Python, плюс ещё CMake местами.

CI/CD — пайплайны вынуждены провижнить и поддерживать в свежем состоянии тот же зоопарк: Python, C++ тулчейн, node-gyp.

Билды медленные — C++ компиляция аддона тормозила пайплайн, плюс надо ещё дёрнуть Python скрипты для генерации проектов.

Чуваки все переписали никогда не угадаете на Rust Go C# Native AOT!

В итоге:
- ❌ Питон — выпилили
- ❌ node-gyp — выпилили
- ❌ C++ тулчейн — выпилили
- ✅ Осталось dotnet publish → готовый .node файл

Статья из серии для общего развития. Мне оно не надо. Но где-то на подкорке мне хочется знать, что такая возможность у меня есть.

Такие вот у нас пироги. 🥧 В июне постараюсь продолжить эту серию.

#dotnet #aspnet #performance
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤72
👁👁 Пятничный вечерний пост.

Замечали что пока работаете, все время хочется спать? При этом ваши умные часы показывают заветные 8 часов сна сегодня.

Так вот у меня было так же. И я не понимал в чем дело. Пока однажды коллега не поделился лайфхаком – он просто переехал на светлую тему и сонливость полностью прошла.

Сначала чуток непривычно, зато полностью снимает сонливость в рабочее время! Ну а для вечера можно настроить чтобы тема сама сменялась на темную и клонила в сон вместо того чтобы будоражить сетчатку и нервишки.

Вот уже 4 года живу в таком режиме – полет отличный!

Так что расщепериваем глазки и переходим на светлую сторону 💡

#лайфхаки #продуктивность
Please open Telegram to view this post
VIEW IN TELEGRAM
🌚63👍2😎2✍1