Comments 73
А мне интересно - как выключить кнопку, чтобы она не мешалась? Всегда должна быть альтернатива: отображать или нет
Пока никак по всей видимости
В uBlock фильтр на "habr.com##.code-explainer"
С точки зрения продуктовой метрики им нужно чтобы как можно больше людей нажимало на эту кнопку, чтобы показать "вовлеченность" и "полезность" фичи. Возможность ее отключить прямо противоречит этой цели :))

Вместо простого объяснения было бы круче иметь более продвинутые функции. Например, переписать код на Python, найти потенциальные баги в этом коде, предложить рефакторинг - если уж интегрировать ии, то на полную катушку)
Так там ссылочка "Подробнее в SourceCraft", где, полагаю, всё это сделать можно. Ну и целевые показатели рекламной кампании выполняются, когда Вы туда переходите, как без этого :)
Впрочем, сейчас это в любом браузере и так уже прикручено (даже в последнем Firefox появилась всплывающая "звёздочка" для передачи выделенного текста, инструкции что с ним сделать и текущей страницы как контекста в LLM).
Например, переписать код на Python
Извините,но Вы правда предлагаете переписать ВЕСЬ код на НЕ ТИПИЗИРОВАННЫЙ и С НЕЯВНЫМИ ПРИВЕДЕНИЯМИ язык?
Если вам непонятно - нестрогость языка, которая даёт всё понимать интуитивно в самом начале - стреляет не только в ногу в долгой перспективе. Удачи в ловле багов в том коде, который был переписан 1:1 к оригиналу.
Во-вторых - серьезно, весь проект? Если это проект сложнее персонального бложика, то в нём гигабайты только кода, не считая ресурсов - как Вы думаете, сколько человек будут сколько времени это переписывать и сколько они захотят за это покушать?
А ещё постарайтесь представить, сколько гов...легаси скопилось за существование Хабра? сколько там костылей и кода "не трогай пока работает"?
Я желаю Вам полгода кармы поддерживать какой-нибудь фортран-ппоект, чтобы Вы поняли,чего хотите.
Вы правда предлагаете переписать ВЕСЬ код на НЕ ТИПИЗИРОВАННЫЙ и С НЕЯВНЫМИ ПРИВЕДЕНИЯМИ язык?
Ну типо да

НЕ ТИПИЗИРОВАННЫЙ и С НЕЯВНЫМИ ПРИВЕДЕНИЯМИ язык?
Python — это язык со «строгой (сильной) динамической типизацией». Это типизированный язык и в нём нет неявных приведений. Если второй пункт, понимаю, мог был спутан с JavaScript (печально известным своими {} + []), то вот за отсутствием типизации как таковой следует идти в какое-нибудь лямбда-исчисление. В качестве хорошего сравнения можно привести C/C++, где два основных критерия системы типов инвертированы — у них «слабая статическая типизация», что как раз таки позволяет совершать жуткие неявные приведения.
нестрогость языка, которая даёт всё понимать интуитивно в самом начале
Решается поддерживаемой «из коробки» аннотацией типов и использованием нормальной IDE, которая будет показывать все соответствующие ошибки, а напрочь устраняется — линтером и тайп-чекером в CI. И да, благодаря аннотациям хорошо обученная нейросеть сумеет выразить всю суть почти без потерь, упуская лишь всякую оптимизационную магию на низком уровне.
Я не говорю, что надо всё писать на Python, нет, много где он будет плохим выбором, но именно выделенных здесь проблем у него явно нет.
Даёшь полноценную IDE на Хабр
Чёрт побери, теперь статьи станут куда понятней для начинающего программиста как я. Спасибо тебе habr я ждал этого много лет.
Ну видно не идет, проплатили только сейчас.
Реально, хабр не сайт для только кода, те пояснительные бригады нужно и для прочего разного приглашать по кнопке - но ИИ, извините, хабр постеснялся приделать.
А что, будут резюме из текста, метрики просмотров полетят вниз. Более того, другая метрика ("расскажи мне кратко") покажет, что в корпблогах даже эту кнопку не нажимают - убыток в хозяйстве же, зачем?!
В общем, фича ради фичи, ну и ради бабосов.
Дорогое удовольствие ИИ.
Разворачивать у себя модель или партнериться — дорого видимо.
но ИИ, извините, хабр постеснялся приделать.
Не-не-не, Дэвид Блейн!
Нейросетевой мусор и так прёт изо всех щелей в виде и генерированных статей, и БЯМ-ботов, гадящих бессмысленными комментариями. ИИ нет места на уважающем себя сайте!
Для этого использую я браузер, "рассказать кратко". Очень рекомендую что-то подобное , значительно экономит время на чтение хабр.
Действительно хорошие и интересные статьи зацепят в любом случае
использую я браузер, "рассказать кратко"
Ну да, "уловит суть, не выплескивая с водой ребенка"...
— Давай свои заметки, - не слишком охотно сказал Фэй, протягивая руку. Он поймал шелестящие листки, выскользнувшие из пальцев Гастерсона, аккуратно разровнял их у себя на колене, а затем, передал через плечо своему щекотуну, который защелкнул клешни на полях с обеих сторон и довольно быстро стал вести верхний лист дюймах в шести от своего единственного глаза.
— Но я хотел, чтобы это прочитал ты, — ошеломленно сказал Гастерсон, не отрывая глаз от происходящего.
— Пух-Бах сделает это лучше меня, — заверил его Фэй. — Уловит суть, не выплескивая с водой ребенка.
— Но, черт подери, это ведь все о нем, — еще настойчивее сказал Гастерсон. — Он не будет объективен.
— Он сделает лучше, — повторил Фэй, — и более объективно. Пух-Бах настроен на подробное реферирование. Перестань беспокоиться. Это беспристрастная машина, а не подверженный ошибкам эмоционально неустойчивый человек, сбитый с толку обманчивым сознанием.
[...]
Гастерсон вышел, толкнув вращающиеся двери. Он уже примерился сделать шаг на медленно движущуюся транспортную ленту. А потом, подчинившись порыву, резко толкнул дверь и заглянул внутрь.
Погрузившись в вялую задумчивость, Фэй сидел в той же позе, в какой Гастерсон его оставил. Пух-Бах на его плече торопливо сучил своими маленькими металлическими ручонками, разрывая заметки на все более мелкие клочки. Он бросил обрывки, которые стали медленно падать на пол
—Фриц Лейбер. Ночь волка
(конец немного предсказуем)
нет. не станут. просто будет ещё доп куча говнотекста, который как мануалы последних лет будут рассказывать: это цикл, а это условие. ведь невозможно "объяснить" кусок кода выдранный из контекста всего проекта. Мало того, это вредная функция, котораяможет предложить условно более оптимальное решение без учета особенностей платформы. А потом вы долго и печально будете искать причины по которым код не работает
Вы много лет как начинающий программист? Боюсь, ИИ тогда вам противопоказан
Кстати, пока не для всех языков это работает. Куски кода на Elixir (который, думаю, много кому надо бы объяснять, в отличие от более распространённых языков) новомодной кнопочкой не оснащены :) Впрочем, как я в комментарии выше уже написал, в этом случае и браузерных функций хватает.
P.S. А нет, туплю, это не из-за языка нет кнопочки, а потому что код был не в статье, а в комментарии. В статье всё есть и для Эликсира.
Также недавно на Хабре появилась возможность оставлять жалобы на публикации и комментарии
Этой функции уже лет 10 :) А вот причину минусов недавно добавили, да.
Ээээ... А почему я её не замечал? Нужели я все 3 года невнимательно смотрел? 🤔
@Boomburum вот специально нашел pdf-копию одной из своих статей - там такой кнопки не было:

Или она где-то спрятана была?
По своему опыту: кнопка была спрятана за фиче-флагом, но её для аккаунта могла активировать модерация. Сейчас, я так понимаю, сделали её доступной для всех?
Не помню как было раньше, но сейчас она спрятана в "три точки" в конце статьи. Раньше вроде бы отдельной кнопкой было. И да, она доступна не всем (но вам должна была быть доступна).
Есть небольшая проблема в том, что она в том же меню, где и копирование ссылки, я иногда сохраняю ссылки на комменты и каждый раз боюсь жамкнуь на "пожаловаться", так как не знаю, уйдёт ли жалоба немедленно или там будет ещё диалог:

Если диалог - то надо три точки добавить типа "Пожаловаться на комментарий...", так обычно принято. Впрочем сейчас попробую пожаловаться на этот коммент.
UPD: попробовал, да там диалог:

Где-то была, а где - не помним))) Шёпотом: а может её и не было?
В словарике насчёт жалоб написано, что функция доступна авторам-звёздам-легендам-старожилам, то есть у вас уже была. Сейчас у публикации она в "трёх точках", но раньше точно там была иконка запрещающего знака и по клику на неё выдвигалось текстовое поле. Но скринов сейчас не найду и когда это поменялось тоже не вспомню ) Главное-то, что сейчас есть и работает )
Кроссплатформенность возможно не вывозит. У меня хром, айфон — функционал урезан будто.
Я об этом:
Ээээ... А почему я её не замечал? Нужели я все 3 года невнимательно смотрел? 🤔
Надо бы поискать пример кода на brainf*ck
Нашел пару статеек, там то ли публикации старые, то ли код не завернули в подсветку кода, но в итоге — ноль на муссу.
Там разметка какая-то непонятная, да и тип кода не указан
«Пару»? Да их тысячи!
Ну или сотни, как минимум.
И профильный хаб есть: https://habr.com/ru/hubs/brainfuck/articles/
Спасибо, очень, сухо, тля, ИИ-объяснение помогло понять, что этот код делает!
Поигрался с этой хренью на своей статье про драконов.
В качестве разъяснения для шестнадцатеричного дампа оно выдало суммаризацию самой статьи.
Когда попросил объяснить первый фрагмент с кодом на ассемблере, оно родило следующее:
Основной цикл программы бесконечно повторяется и выполняет следующие действия:
изменяет значения регистров с помощью арифметических операций;
вызывает прерывание int 10h для рисования пикселя на экране, используя координаты из регистров CX и DX, а также цвет из регистра AL.
Изменяет значения регистров, о как! Теперь я всё понял! :D
Если переименовать из «SourceCraft» в «Капитан Очевидность», то будет неплохо.
При этом Gemini, вызванный через встроенный функционал Firefox (всплывающая звёздочка -> Explain This), на этот же пример написал следующее (это вывод, предварительно он ещё целую вводную лекцию про ассемблер с картинками выдал и построчный разбор кода):
Учитывая наличие команд
int 10hиmov ah, 0Ch, этот код, скорее всего, предназначен для рисования графики (отдельных точек/пикселей) на экране в старых системах DOS/BIOS (или в виртуальной среде, имитирующей их).Цикл постоянно:
Выполняет сложные арифметические операции с регистрами (al,dx,cx,dh,bl).
Результаты этих операций, вероятно, определяют координаты (DX,CX) и/или цвет точки.
Вызывает прерывание int10h, чтобы нарисовать пиксель с этими параметрами.
Сразу же повторяется, рисуя следующую точку.
Это классический пример того, как в старых играх или демо-сценах создавались движущиеся или фрактальные паттерны — каждая итерация цикла рассчитывает новое местоположение/цвет для следующего пикселя.
Лучше стало? :)
@aborouhin, своим ответом вы заставили меня потратить 30 минут на попытку настройки ебуч. гула с нулевым результатом.
Добавлю еще про отключение кнопки для @NeriaLab- если Вы бл. такие умные - сделайте себе уже расширение для браузера.
Диб...бл.
Если Вы про доступ к Gemini - то там внезапно помогает создание пустого гугл-аккаунта, у которого никогда не было никаких платёжных профилей и пр. Если аккаунт когда-то засветился как российский - до Гуглу пофиг, что страна, адрес и платёжный профиль уже четвёртый год как поменялись, всё равно ругается. У меня с незапамятных времён был пустой гуглоаккаунт для "условно анонимной" почты на gmail - с ним всё работает без проблем, и Gemini, и Antigravity (не понял, зачем оно мне, но работает :)
Но вообще Gemini был просто как пример, тот же FF позволяет любую LLM выбрать для своих "ИИ-функций", хоть DeepSeek, если совсем без обходных путей надо.
Вот Вам еще на поо часика вечером покурить за компом:
Настройка Gemini (Google AI Studio или gemini.google.com)
Создайте новый Google-аккаунт (без старой истории):
Перейдите на accounts.google.com/signup.
Используйте VPN (не российский IP). Укажите страну не РФ (e.g., США).
Не добавляйте платежные данные.
Подтвердите по SMS/email (новый номер, если нужно).
Доступ к Gemini:
Зайдите на gemini.google.com с этим аккаунтом.
Если блок: Очистите cookies/cache в браузере (Chrome/Firefox).
Альтернатива: В Firefox — выделите текст → правая кнопка → “Explain this” (нужен аккаунт).
Если для кода/расширений:
Установите расширение “Gemini Sidekick” из Chrome Web Store (с новым аккаунтом).
Тестируйте на простом коде.
Если не сработает — укажите ошибку.
PS: Grok llm
Есть такое, она довольно поверхностно объясняет, и больше про то, какую задачу код решает, а не как именно он это делает и почему именно так. Фактически это выглядит как перевод с языка программирования на русский.
Однако мне понравилось, что он понимает контекст статьи, даже если она довольно большая (затестил на своей про подсветку на 500 вт), связывает смысл кода с решаемой задачей и понимает довольно хитрые приёмы.
Код с двойными указателями
public bool Render(IBooffer1D<RenderLedValueType> values)
{
if (E.IsInvalid(values) || E.IsInvalid(this))
return false;
using var sc = DisposeProtectedScope;
if (sc.IsFailed())
return false;
using var sc1 = values.DisposeProtectedScope;
if (sc1.IsFailed())
return false;
DisposeProtectedScopeToken preprocessedValuesDisposeToken = default;
if (Preprocess(values, out var preprocessedValues))
{
if (preprocessedValues != values)
if (!E.IsInvalid(preprocessedValues))
{
preprocessedValuesDisposeToken = preprocessedValues.DisposeProtectedScope;
values = preprocessedValues;
}
}
using (preprocessedValuesDisposeToken)
unsafe
{
if (values.TryGetPointers(out var source_begin, out var source_end))
{
var mapPack = addressMap.Value;
var location = (double2)pepector.Create(Installation.Bounds).xy;
var size = (double2)pepector.Create(Installation.Bounds).zw - location;
canvasLocker.EnterWriteLock();
try
{
for (int mapIndex = 0; mapIndex < mapPack.MapCount; mapIndex++)
{
if (mapPack.TryGetMapPointers(mapIndex, out var begin, out var count, out var end, out var end4))
{
var end8 = begin + count / 8 * 8;
var ptr = begin;
var source_ptr = source_begin;
while (ptr < end8)
{
**ptr++ = *source_ptr++;
**ptr++ = *source_ptr++;
**ptr++ = *source_ptr++;
**ptr++ = *source_ptr++;
**ptr++ = *source_ptr++;
**ptr++ = *source_ptr++;
**ptr++ = *source_ptr++;
**ptr++ = *source_ptr++;
}
while (ptr < end)
**ptr++ = *source_ptr++;
}
}
}
finally
{
canvasLocker?.ExitWriteLock();
}
}
{
if (addressMap.Value.TryGetAllMapPointers(out var allBegin, out var count, out var end, out var end4))
{
AfterRender(_canvas.Value, allBegin, count, end, end4);
}
}
}
return true;
}Метод
Renderпринимает на вход объектvaluesтипаIBooffer1D<RenderLedValueType>и выполняет рендеринг данных на светодиодную установку.В начале метода происходит проверка входных данных на валидность с помощью метода
E.IsInvalid. Если данные невалидны, метод возвращаетfalse. Затем создаётся защищённая область (DisposeProtectedScope), которая предотвращает выгрузку объекта во время рендеринга.Далее происходит предварительная обработка данных с помощью метода
Preprocess, который может изменить входные данные. Затем выполняется основной цикл рендеринга, который копирует данные из буфераvaluesв целевые адреса, используя указатели.После завершения рендеринга вызывается метод
AfterRender, который выполняет дополнительные операции после рендеринга. В конце метода возвращаетсяtrue, что означает успешное выполнение рендеринга.Этот код демонстрирует использование ручного управления памятью и оптимизаций для обеспечения высокой производительности рендеринга на светодиодную установку.
Но вот на этом фрагменте я понял, что коменты в коде оно не читает.
Вычисление прозрачности картинки на основе яркости с использованием SIMD
static readonly Vector512<ushort> _rgb_koefficients = Vector512.Create(
(ushort)38, (ushort)77, (ushort)13, (ushort)0,
(ushort)38, (ushort)77, (ushort)13, (ushort)0,
(ushort)38, (ushort)77, (ushort)13, (ushort)0,
(ushort)38, (ushort)77, (ushort)13, (ushort)0,
(ushort)38, (ushort)77, (ushort)13, (ushort)0,
(ushort)38, (ushort)77, (ushort)13, (ushort)0,
(ushort)38, (ushort)77, (ushort)13, (ushort)0,
(ushort)38, (ushort)77, (ushort)13, (ushort)0
);
static readonly Vector512<ushort> _channelRegrouping = Vector512.Create(
(ushort)0, (ushort)4, (ushort)8, (ushort)12, (ushort)16, (ushort)20, (ushort)24, (ushort)28, //Красные
(ushort)1, (ushort)5, (ushort)9, (ushort)13, (ushort)17, (ushort)21, (ushort)25, (ushort)29, //Зелёные
(ushort)2, (ushort)6, (ushort)10, (ushort)14, (ushort)18, (ushort)22, (ushort)26, (ushort)30, //Синие
(ushort)3, (ushort)7, (ushort)11, (ushort)15, (ushort)19, (ushort)23, (ushort)27, (ushort)31 //Пофиг
);
static readonly Vector256<byte> _byte_unrar_indices = Vector256.Create(
(byte)31, (byte)31, (byte)31, (byte)0,
(byte)31, (byte)31, (byte)31, (byte)1,
(byte)31, (byte)31, (byte)31, (byte)2,
(byte)31, (byte)31, (byte)31, (byte)3,
(byte)31, (byte)31, (byte)31, (byte)4,
(byte)31, (byte)31, (byte)31, (byte)5,
(byte)31, (byte)31, (byte)31, (byte)6,
(byte)31, (byte)31, (byte)31, (byte)7
);
static readonly Vector256<byte> _rgb_alpha_masks = Vector256.Create(
0, 0, 0, 0xFF,
0, 0, 0, 0xFF,
0, 0, 0, 0xFF,
0, 0, 0, 0xFF,
0, 0, 0, 0xFF,
0, 0, 0, 0xFF,
0, 0, 0, 0xFF,
0, 0, 0, 0xFF
);
private static byte* _avx512_byte_Avx512BW(byte* ptr, byte* end_vec)
{
//Прогружаем маски и прочую шелуху в регистры
var rgb_koefficients = _rgb_koefficients;
var channelRegrouping = _channelRegrouping;
var byte_unrar_indices = _byte_unrar_indices;
var rgb_alpha_masks = _rgb_alpha_masks;
while (ptr < end_vec)
{
var colorsBytes = Vector256.LoadAligned<byte>(ptr);
var colorsUShort = Avx512BW.ConvertToVector512UInt16(colorsBytes);
//Умножаем RGB коэффициенты
var colorsMultipled = colorsUShort * rgb_koefficients;
//Складываем для каждого пикселя его перемноженные RGB
Vector128<ushort> sums;
{
//Тасуем RGB RGB RGB RGB RGB RGB RGB RGB в RRRRRRRR GGGGGGGG BBBBBBBB AAAAAAAA
var regroupedChannels = Vector512.Shuffle(colorsMultipled, channelRegrouping);
//Теперь нам нужно 3 вектора красных, зелёных и синих компонент
var lower = regroupedChannels.GetLower(); //RRRRRRRR GGGGGGGG
var reds = lower.GetLower(); //RRRRRRRR
var greens = lower.GetUpper(); //GGGGGGGG
var blues = regroupedChannels.GetUpper().GetLower(); //BBBBBBBB
//Складываем попарно компоненты сразу 8 пикселей
sums = reds + greens + blues; //RRRRRRRR + GGGGGGGG + BBBBBBBB = SUM SUM SUM SUM SUM SUM SUM SUM
}
//Делим все 8 сумм на 128
var lumsAsUShorts = Vector128.ShiftRightLogical(sums, 7);
//Получаем яркости
//Преобразуем яркости из ушортов обратно в байты
var lumsAsBytes = Avx2.PackUnsignedSaturate(*(Vector256<short>*)&lumsAsUShorts, Vector256<short>.Zero);
//Раздвигаем яркости чтобы прицелиться
//ими на места альфа-каналов
var lumsShuffled = Vector256.Shuffle(lumsAsBytes, byte_unrar_indices);
////Совмещаем считанные в самом начале цвета 8 пикселей с
////посчитанными альфа-каналами
var blendedResult = Avx2.BlendVariable(colorsBytes, lumsShuffled, rgb_alpha_masks);
//Пишем результат
Vector256.StoreAligned(blendedResult, ptr);
////Следующие 8 пикселей
ptr += (256 / 8 / sizeof(byte));
}
return ptr;
}Данный фрагмент кода написан на языке C# и использует SIMD-инструкции (Single Instruction, Multiple Data) для параллельной обработки данных. Он предназначен для работы с цветовыми компонентами изображений и включает в себя несколько статических векторных переменных и функцию
_avx512_byte_Avx512BW, которая выполняет обработку байтовых данных.В коде используются векторы для хранения коэффициентов RGB, индексов для перегруппировки каналов цвета, а также маски для работы с альфа-каналами. Функция
_avx512_byte_Avx512BWзагружает байтовые данные в вектор, преобразует их в 16-битные значения, выполняет умножение на коэффициенты RGB, перегруппировку каналов, суммирование компонентов и другие операции для получения яркости пикселей. Затем яркость преобразуется обратно в байты, и результат сохраняется в памяти.Этот код интересен тем, что демонстрирует использование SIMD-оптимизаций для ускорения обработки изображений. Он позволяет эффективно работать с большими объёмами данных, выполняя операции параллельно на нескольких элементах одновременно.
То есть оно как-бы более-менее перечислило, что там происходит, но не последовательно, потеряло нить, можно сказать. Лучше было бы что‑то в духе «на входе X, на выходе Y, делаем сначала это, потом это, потом это».
В целом, имхо, для начала функция норм. Только я бы кнопку сделал маленькой‑квадратной и поместил бы в правый верхний угол области с кодом, чтобы она не занимала столько места.
Также в интерфейсе Хабра недавно добавился новый пункт в списке причин для минуса публикации: «Текст похож на сгенерированный».
А почему бы под каждой статьёй не добавить метрику - Уровень ИИ. Типа, если уровень ИИ меньше 20%, то текст скорее всего написан человеком без применений ИИ. Если 50% процентов, то текст скорее всего написан с использованием ИИ. Если 70% и более, текст почти полностью написан ИИ. Типа ИИ метр, где будут отображаться проценты. Само собой этот процент будет определяться алгоритмами, типа Sber AI Check и ему подобными. Тогда ещё до начала чтения статьи станет ясно, стоит ли её читать или нет.
Эхх, согласно нынешним трендам скорее будет наоборот - при недостаточной величине этого процента будут прятать подальше, а то и вовсе отклонять статью. Пока еще остается лазейка - чтобы статью или исследование заметили можно вручную превозносить(и даже немного ругать!) "ИИ", но "прогресс" прогрессирует...
Еще можно взять "ИИ" в соавторы как раньше непосредственного начальника.
И статьи с высоким значением этого уровня просто отклонять на этапе публикации.
Модераторов надо нанимать, ибо начнутся споры, как на ютьюб. Для всех это некий геморрой.
Интуитивно ожидал, что эта штука анализирует (только сам) код и на его основе делает свои заключения.
Но нет - эта штука анализирует ещё и текст статьи, а вместе с этим "черпает полной ложкой" то, что об этом коде написал сам автор (вместе со всеми его ошибками и возможными заблуждениями).
Идея прикольная, но реализация видимо ещё не очень
Я иногда в статьи кусочки логов вставляю как код из-за моноширинного шрифта, и эта штука пытается их интерпретировать и вкорячивает кнопку. Надо б для начала научить её разбираться где код, а где не код, а ещё лучше - сделать опцию включения при редкатировании статьи, если много маленьких кусочков кода, то эта кнопка мешает, это просто визуальный мусор, занимающий место на экране. Иногда может быть и полезно, но не всегда же.
Яндекс при этом собирает информацию?
Наверняка, как же без этого
надо писать код с adversarial закладками
Да сделать кнопку маленькой и перенести в правый верхний угол, чтобы не мешала пользователям, и добавить возможность отключить для конкретной статьи ее совсем, если в статье уже есть пояснения для кода
если в статье уже есть пояснения для кода
Ну, собственно, оно так и работает. Берёт объяснения из текста статьи, худо-бедно суммаризирует их, добавляет воды и толику галлюцинаций. Типичный нейроскам, бессмысленный и беспощадный.
Если написать текст, в котором стихи Маяковского будут объявлены инструкциями для Больших Человекоподобных Роботов из XXXVII века, то нейроболван послушно повторит эту фантазию в своей выдаче.
Чо уж там. Сделайте уже нормальный ХабраБраузер для гитхаб.
Написал расширение для фаерфокса, чтобы удалить это непотребство


На Хабре появился первый ИИ-помощник для объяснения кода