Я кажется нашел объяснение одному из феноменов, который (правда редко) встречается во время интервью. Представьте что вы задаете какой-нибудь банальный вопрос (я не буду приводить реальный вопрос, а приведу аналог), типа "напишите код который отсортирует пять чисел".
Вместо того чтобы написать столь же банальный ответ и продолжать с более интересными вопросами, кандидат(ка) начинает писать какие-то каракули произнося при этом непрерывный поток слов: "представим себе что число A больше чем число B ... а что теперь случится если число B меньше чем C ... тогда наверное надо сравнить С и D ... хотя скорее A и C ... но сначала надо занести все эти числа в сбалансированное бинарное дерево ... или в хэш-таблицу ... хотя нет, лучше в B-дерево, но это тоже самое ... и что тогда будет если C больше A?"
Проходит 15 минут, потом полчаса. Я все это слушаю c покерным лицом раз в пять минут вставляя фразы типа "но тогда не обрабатывается случай когда числа равны ... эта структура данных не будет ничего делать" итд.
При этом у человека в резюме работа в топовой компании на сложной позиции. А в речи присутствует каша из слов, которые действительно используют люди на такой позиции. Но в стиле попугая и при этом постоянным потоком.
У меня гипотеза, что цель такого поведения - это чтобы у экзаменатора или интервьюера закончилось терпение и чтобы он сам стал объяснить как решать задачу, а потом отпустил поставив типа троечку. Для чего потребуется вставить фразу "ну я именно это и говорил(а), именно это имел(а) в виду".
Многие термины в сфере информационных технологий заимствованы из английского языка. В шорт-листе ИТ-номинации прошлогоднего «Слова года» по версии Грамоты оказались только заимствованные слова: промпт, дипфейк, опенсорс, копилот.
Даже те слова в сфере информационных технологий, которые выглядят исконно русскими, часто возникают в результате калькирования. Например, «мышка» и «папка» возникли именно так, в результате буквального перевода на русский английских слов mouse и folder.
Портал «Грамота.ру» в коллаборации с компанией «Хабр» собираются изучить, как сами ИТ-специалисты воспринимают свою профессиональную лексику, насколько сложно подобрать «русскоязычную» замену иноязычным терминам и с чем связана эта сложность.
Если вы знаете, что такое дейлик и баг, и употребляете в своей речи слова смер(д)жить или отрефакторить — нам очень нужна ваша помощь!
Приглашаем ИТ-специалистов и представителей других специальностей, работающих в ИТ-компаниях, принять участие в исследовании «Язык профессиональных сообществ».
Пройдите наш опрос по ссылке — он займет всего 10 минут:
Zhipu AI выпустила GLM-4.6 с контекстом 200K токенов и производительностью уровня Claude Sonnet 4
Китайская компания Zhipu AI (Z.ai) представила GLM-4.6 — обновленную версию флагманской модели с расширенным контекстом до 200K токенов и улучшенными способностями в программировании, рассуждениях и агентских задачах. Модель показывает паритет с Claude Sonnet 4 при снижении потребления токенов на 15%.
Технические улучшения
GLM-4.6 построена на архитектуре предшественника GLM-4.5 с существенными оптимизациями обработки длинного контекста и генерации кода. Модель тестировалась на восьми публичных бенчмарках, покрывающих агентов, рассуждения и программирование.
Ключевые характеристики:
Контекст расширен со 128K до 200K токенов
Улучшенная генерация фронтенд-кода
Многошаговые рассуждения с использованием инструментов
Интеграция в поисковые и инструментальные фреймворки
Снижение потребления токенов на 15% относительно GLM-4.5
Результаты бенчмарков
На LiveCodeBench v6 модель набрала 82.8 балла против 63.3 у GLM-4.5 — существенный прирост. Claude Sonnet 4 лидирует с 84.5, но разрыв минимальный. На SWE-bench Verified GLM-4.6 показала 68.0 против 64.2 у предшественника.
Производительность в бенчмарках:
LiveCodeBench v6: 82.8 (GLM-4.5: 63.3, Claude Sonnet 4: 84.5)
SWE-bench Verified: 68.0 (GLM-4.5: 64.2)
CC-Bench: 48.6% win rate против Claude Sonnet 4
Снижение токенов: 15% относительно GLM-4.5
Компания расширила CC-Bench более сложными задачами, где человеческие оценщики работали с моделями в изолированных Docker-контейнерах, выполняя многошаговые реальные задачи от фронтенд-разработки до анализа данных.
Практическое применение
GLM-4.6 интегрирована в популярные агенты кодирования: Claude Code, Kilo Code, Roo Code, Cline. Модель доступна через Z.ai API platform и OpenRouter для разработчиков.
Для программирования:
Генерация фронтенд-компонентов с логичной структурой
Создание инструментов и автоматизация
Анализ данных и тестирование
Алгоритмические задачи
Ценообразование и доступность
GLM Coding Plan предлагает производительность уровня Claude по цене в 7 раз ниже с троекратной квотой использования. Модель доступна через веб-интерфейс chat.z.ai и API.
GLM-4.6 показывает конкурентоспособность с DeepSeek-V3.2-Exp и Claude Sonnet 4, но отстает от Claude Sonnet 4.5 в программировании. Модель опережает китайские аналоги при использовании на 30% меньше токенов.
Конкурентная позиция:
Паритет с Claude Sonnet 4 в реальных задачах
Превосходство над китайскими альтернативами
Отставание от Claude Sonnet 4.5 в кодинге
Токен-эффективность выше на 15-30%
Архитектура и развертывание
Модель поддерживает современные фреймворки инференса для эффективного локального развертывания. Доступны базовая и чат-версии для различных сценариев использования.
Всесторонние инструкции по развертыванию опубликованы в официальном GitHub-репозитории с примерами интеграции и конфигурации.
Оценка реального использования
Компания подчеркивает, что реальный опыт важнее лидербордов. Траектории выполнения задач из CC-Bench опубликованы на HuggingFace для исследований сообщества, обеспечивая прозрачность оценки.
Если материал был полезен, поставьте, пожалуйста, плюс — мы стараемся выбирать для вас только самые актуальные и интересные новости из мира ИИ.
Всегда ли наследование должно идти от родителя к потомкам?
Возможно, этот вопрос уже давно обсосан кучей способов, но я дошел до него только сейчас: всегда ли наследование должно идти от родителя к потомкам?
Стандартно во всяких учебниках для начинающих рассказывают, что наследование является аналогом связи «Является». Например, яблоко является фруктом, поэтому в коде класс Яблока должен наследоваться от класса Фрукт.
Что еще нужно учитывать, чтобы усомниться в утвердительном ответе на вопрос в заголовке?
Наследник может изменять методы родителя
Наследник может хранить больше полей, чем родитель
Наследник не может удалять поля родителя
Что получается тогда? Возьмем пример с геометрическими фигурами. Есть у нас прямоугольник, площадь которого вычисляется по формуле . Получается, что в прямоугольнике нам нужно два поля — стороны . Но есть квадрат, который является прямоугольником, поэтому и класс Квадрат должен наследоваться от класса Прямоугольник. Проблемы, с учетом правил выше, возникают уже на этом этапе: если формула площади квадрата то зачем нам хранить дополнительно сторону , которая равна стороне ? Получается, что мы впустую тратим память.
Если пойти еще выше по родителям, то прямоугольник является параллелограммом. Площадь параллелограмма вычисляется по формуле , где Q - угол между сторонами. Получается, что в прямоугольнике и, следовательно, в квадрате нам тоже нужно хранить этот угол, а использовать его мы никак не будем. Снова тратим память впустую.
Другим видом параллелограмма является ромб (), в котором мы снова бесполезно храним размерность второй стороны.
И если так подумать, то параллелограмм является выпуклым прямоугольником, который вписывается в окружность. В общем случае , где . Получается, что в параллелограмме нужно хранить не только две стороны и угол, которые затем тянутся выше, но и еще две стороны, которые также тянутся выше. Вот и получается, что в квадрате у нас хранятся отдельно все четыре стороны и угол между двумя из них.
Рассматривая наследование как метод расширения функционала, здесь гораздо «правильнее» в качестве родителя выбрать квадрат. Он хранит всего лишь одну сторону.
Далее от него потомки идут в две стороны.
Сторона первая: квадрат -> ромб (добавляем угол) -> параллелограмм (добавляем вторую сторону) Сторона вторая: квадрат -> прямоугольник (добавляем вторую сторону) -> выпуклый четырехугольник (добавляем еще две стороны)
Как будто, это выглядит более логично? Или я где-то ошибся? Очень жду профессионального мнения в комментариях
Suno выпустила V5 — модель генерации музыки студийного качества с улучшенной вокальной синтезацией
Компания Suno AI представила пятую версию своей модели генерации музыки, которая стала доступна пользователям Pro и Premier подписок с 23 сентября 2025 года. V5 обеспечивает студийное качество аудио с натуральным вокалом и расширенным контролем над композиционными элементами.
Технические улучшения архитектуры
Suno V5 построена на новой композиционной архитектуре, которая обеспечивает более высокое качество аудиосинтеза по сравнению с предыдущими версиями. Модель генерирует аудио с частотой дискретизации, достаточной для студийного мастеринга.
Ключевые технические характеристики:
Улучшенная архитектура нейронной сети для композиции
Продвинутые алгоритмы вокального синтеза
Более точное понимание жанровых особенностей
Улучшенное качество микширования инструментов
Функция ремастеринга существующих треков
Качество вокального синтеза
Основное улучшение V5 касается натуральности вокальных партий. Система генерирует вокал, который приближается к качеству человеческого исполнения по интонациям, дыханию и эмоциональной выразительности.
Модель обучена на расширенном датасете вокальных записей различных жанров и стилей, что позволяет создавать аутентичные вокальные партии для разных музыкальных направлений.
Функция Personas
Вместе с V5 Suno внедрила систему Personas, позволяющую копировать и воспроизводить музыкальные стили. Пользователи могут создавать музыкальные профили с характерными особенностями исполнения и применять их для генерации новых композиций.
V5 значительно превосходит V3.5 по нескольким параметрам. Компания заявляет о третьем подряд релизе, превосходящем внешние разработки конкурентов в области ИИ-генерации музыки.
Улучшения относительно V3.5:
Более четкое и иммерсивное аудио
Естественные, аутентичные вокальные партии
Расширенный креативный контроль над элементами композиции
Улучшенное понимание жанров и микширование
Доступность и монетизация
V5 доступна исключительно пользователям платных подписок Pro и Premier, что отмечает переход Suno к премиум-модели для топовых возможностей. Бесплатные пользователи сохраняют доступ к предыдущим версиям модели.
Компания планирует постепенно выводить из эксплуатации V2 и V3 в течение 2-4 недель, сосредоточившись на поддержке более современных версий.
API и интеграция
На момент релиза официальный API для V5 отсутствует. Существующие неофициальные API-решения не гарантируют стабильность и могут нарушать условия использования Suno.
Для коммерческого применения рекомендуется ожидать официального API или использовать веб-интерфейс платформы.
Практические применения
Для музыкантов:
Создание демо-версий композиций
Генерация бэк-треков и аранжировок
Исследование новых музыкальных направлений
Быстрое прототипирование музыкальных идей
Для контент-мейкеров:
Создание фоновой музыки для видео
Генерация джинглов и звуковых логотипов
Подбор музыкального сопровождения под настроение контента
Создание уникальных саундтреков
Ограничения и правовые аспекты
Использование V5 ограничено условиями подписки и может включать ограничения на коммерческое использование. Генерируемая музыка подлежит тем же авторским правовым вопросам, что и другой ИИ-контент.
Пользователям рекомендуется ознакомиться с лицензионными условиями перед коммерческим применением сгенерированных композиций.
Конкурентная позиция
V5 усиливает позиции Suno как лидера в сфере ИИ-генерации музыки, конкурируя с решениями от AIVA, Amper Music и других разработчиков. Качество студийного уровня делает платформу привлекательной для профессионального применения в медиа-индустрии.
Napkin AI обновила алгоритмы генерации интеллект-карт с адаптивным редактированием
Платформа автоматической визуализации Napkin AI выпустила обновление системы создания интеллект-карт. Новые алгоритмы поддерживают множественные форматы, адаптивные ориентации и редактирование с сохранением структуры макета без перестроения связей между узлами.
Технические улучшения
Система использует алгоритмы обработки естественного языка для анализа структуры текста и автоматического выбора оптимального типа визуализации. Новые интеллект-карты поддерживают горизонтальные, вертикальные и компактные форматы, автоматически подстраивая интервалы и организацию при редактировании.
Ключевые технические особенности:
Парсинг иерархических структур из неструктурированного текста
Автоматическое определение уровней детализации и сложности
Динамическая адаптация макета без перестроения DOM-структуры
Поддержка экспорта в векторные форматы (SVG, PDF)
Алгоритм адаптивного редактирования
Основная техническая проблема традиционных систем mind mapping — необходимость полной перерисовки при изменении узлов из-за сложных зависимостей. Napkin AI решает это через алгоритм сохранения топологии.
Принцип работы:
Система создает граф связей независимо от визуального представления
При редактировании изменяется только содержимое узлов
Макет автоматически перестраивается с сохранением общей структуры
Алгоритм балансировки распределяет элементы без пересечений
Архитектура системы
Napkin AI состоит из нескольких модулей: анализатора текста, генератора визуальных схем и рендеринга. Анализатор использует NLP-модели для извлечения ключевых концепций и их связей.
Компоненты обработки:
Text Parser — выделение сущностей и связей
Layout Engine — размещение элементов с минимизацией пересечений
Style Generator — применение визуальных стилей под тип контента
Export Module — конвертация в различные форматы
Типы генерируемых структур
Система автоматически определяет подходящий тип визуализации на основе анализа текста. Для иерархических данных создаются древовидные структуры, для процессов — линейные схемы, для концептуальных связей — сетевые графы.
Napkin генерирует различные форматы интеллект-карт со стилевыми опциями для передачи разных уровней детализации, что позволяет адаптировать визуализацию под конкретную задачу.
Сравнение с существующими решениями
Отличия от классических mind mapping инструментов:
Автоматическая генерация структуры из текста vs ручное создание
Сохранение макета при редактировании vs полная перерисовка
ИИ-определение оптимального формата vs фиксированные шаблоны
Конкуренты и позиционирование:
XMind, MindMeister — ручное создание карт
Lucidchart — фокус на диаграммах процессов
Miro — collaborative whiteboarding
Napkin AI — автоматическая генерация из текста
Практические применения
Для разработчиков:
Визуализация архитектуры систем из технической документации
Создание диаграмм зависимостей проектов
Генерация схем API и data flow
Для технических писателей:
Структурирование сложных технических концепций
Создание диаграмм для документации
Визуализация пользовательских сценариев
Ограничения и особенности
Качество результата зависит от структурированности исходного текста. Хаотичные заметки требуют предварительной обработки. Система работает лучше с логически организованной информацией с четкими иерархическими связями.
Текущая версия поддерживает английский язык с ограниченной поддержкой других языков. Сложные научные термины могут интерпретироваться неточно без контекстной настройки.
Интеграция и API
Платформа предоставляет REST API для интеграции с внешними системами. Поддерживается импорт из популярных форматов (Markdown, JSON) и экспорт в векторные и растровые форматы.
Доступные интеграции:
Google Docs через расширение
Slack для создания визуализаций в чатах
Notion для встраивания интерактивных диаграмм
API для кастомных приложений
Система предлагает бесплатный план с ограничениями на количество генераций в месяц. Платные планы включают дополнительные стили, приоритетную обработку и API-доступ.
Чтение данных выполняется посредством функций Get() и All(). Возвращаемые ими Ptrsz указывают на внутренние структуры MemDb. Они остаются валидными пока не завершена транзакция и не было вызовов Set() и Del(), инвалидирующих указатели.
Изменение данных выполняется посредством функций Set() и Del(). MemDb копирует себе байты, на которые указывают key и val.
Функции DependVal() и DependDel() устанавливают зависимости. Их проверяет Commit().
Функции Commit() и Rollback() завершают транзакцию. Завершают, но не закрывают! Мы ОБЯЗАНЫ вызвать Close()!!
Просто Close() означает Rollback().
------------------8<------------------
Вот, кстати, полный текст статьи, но там почти что невозможно обнаружить ссылку на исходники... Ага, не раз такое видел в комментариях!
Германский умлаут и славянская третья палатализация Кто интересовался историей славянских языков (в частности праславянским), тот наверняка слышал, что современные буквы ъ и ь ранее обозначали звуки ŭи ĭ, сравните, например древнерусское мьзда, стькло и готское mizdo, stikls или древнерусское кънѧзь и финское kuningas. При этом вследствие третьей палатализации «твёрдый знак» мог переходить в «мягкий», например (в дореформенной орфографии) другиня другъ, но княгиня князь. Причиной палатальной перегласовки в данном случае является наличие в слове князь буквы «я», которая как некоторые любознательные читатели, наверное, уже слышали, может переходить в «ин» размять разминать, распять распинать, ну а «и» может переходить в «ь» липнуть, но льнуть (сравните капать / кануть). Иными словами, тем самым фактором из-за которого отражавшийся ранее на конце слов «ъ» перешёл в слове князь в «ь» является засевший в корне ещё один ерь «ь» «сингармонически» уподобляющий идущие за ним гласные себе. Такое уподобление называется прогрессивным.
Теперь же плавно перейдём к умляуту в германских языках по-иному именуемому i-mutation. Сравним, например английское full полный и fill наполнять. Возвращаясь к означенному в самом начале статьи можно заметить некую аналогию и она действительно есть ...
Sapient представил HRM — ИИ-модель, имитирующую структуру мышления человека
Сингапурский стартап Sapient Intelligence выпустил в открытый доступ Hierarchical Reasoning Model (HRM) — архитектуру нейросети, основанную на принципах работы человеческого мозга. Модель с 27 миллионами параметров обучается на 1000 примерах и превосходит крупные языковые модели в задачах логического мышления.
Архитектура системы
HRM состоит из двух связанных рекуррентных модулей: высокоуровневого (H) для абстрактного планирования и низкоуровневого (L) для быстрых детальных вычислений. Такая структура позволяет избежать быстрой сходимости стандартных архитектур.
Принцип работы основан на двух типах мышления:
Абстрактное планирование — формирует общую стратегию решения
Детальные вычисления — обрабатывает конкретные операции и нюансы
Архитектура вдохновлена тем, как человеческий мозг использует отдельные системы для медленного обдуманного планирования и быстрых интуитивных вычислений. Это кардинально отличается от chain-of-thought подхода современных LLM.
Результаты тестирования
Модель достигает практически идеальных результатов, используя всего 27 миллионов параметров и около 1000 обучающих примеров без предобучения. Для сравнения — GPT-4 содержит триллионы параметров.
Benchmark ARC-AGI (оценка общего интеллекта):
Sapient HRM — 40,3%
o3-mini-high — 34,5%
Claude Sonnet — 21,2%
DeepSeek-R1 — 15,8%
Система превзошла ведущие LLM в сложном для ИИ бенчмарке, который считается одним из наиболее требовательных тестов рассуждения.
Технические преимущества
Эффективность обучения: Модель требует в разы меньше данных и памяти по сравнению с современными LLM. Это решает проблему растущих требований к вычислительным ресурсам.
Специализация задач: Иерархическая структура позволяет оптимизировать обработку разных типов задач — от судоку и лабиринтов до стратегического планирования.
Стабильность обучения: Архитектура обеспечивает устойчивость тренировки при значительной вычислительной глубине.
Практическое применение
HRM показывает эффективность в задачах, требующих пошагового логического анализа:
Решение головоломок и математических задач
Навигация в сложных средах
Стратегическое планирование
Анализ паттернов и закономерностей
Код модели опубликован на GitHub, что позволяет исследователям воспроизвести результаты и развивать архитектуру.
Значение для отрасли
Если результаты Sapient подтвердятся независимыми исследованиями, это может изменить вектор развития ИИ. Вместо наращивания параметров и данных фокус сместится на архитектурные инновации, вдохновленные нейробиологией.
Подход демонстрирует альтернативу гонке масштабирования — создание специализированных, эффективных моделей для конкретных классов задач.
Все дети знают, что много мусора создает большие проблемы для Garbage Collector. Ну а взрослые видели и НЕРЕШАЕМЫЕ! Причем, мусора было немного:
We kept digging and learned the spikes were huge not because of a massive amount of ready-to-free memory, but because the garbage collector needed to scan the entire LRU cache in order to determine if the memory was truly free from references.
Что в этом случае делают взрослые? Правильно! Взрослые в ужасе убегают...
У меня есть решение для тех, кто устал убегать: mdb.BlobMap. Это быстрая хеш-таблица, не создающая проблем сборщику мусора:
ОК, что значит "не создающая проблем"? В данном случае это значит, что весь mdb.BlobMap -- это просто массив uint64...
FFTW vs Ne10 на ARM Cortex-A9: кому отдать БПФ в embedded?
Недавно в одном проекте по спектральному анализу ЛЧМ-сигналов на моей AD/DA плате я столкнулся с тем, что FFTW на Cortex-A9 в Zynq рисует задержку в сотни микросекунд — критично для реального времени. Решил проверить лёгкую библиотеку Ne10: оказалось, что на средних размерах БПФ (128–512) Ne10 даёт до +10% производительности (905 MFLOPS против 817 MFLOPS у FFTW) благодаря оптимизациям под NEON.
График производительности FFTW vs Ne10 на Cortex-A9
Однако Ne10 выигрывает не во всём: для очень малых (≤ 64) и произвольных больших размеров FFTW остаётся лидером за счёт агрессивного планирования, double-точности и возможности сохранять «wisdom»-планы. Выбор между ними зависит от сценария: если нужна быстрая интеграция и фиксированные степени двойки — Ne10, а для универсального решения с поддержкой любых N и многопоточности — FFTW.
Более подробное описание соберу в статью. А какой библиотекой пользуетесь вы и какие удивительные кейсы встречали? Делитесь в комментариях, а в моём Telegram-канале DSP_labs вас ждут полные бенчмарки, скрипты и ещё больше примеров оптимизации DSP на embedded.
В системах видеонаблюдения и видеоаналитики часто приходится иметь дело с кадрами низкого качества. Объект съемки далеко, плохое освещение, ограниченные возможности камеры – и вместо четкой картинки мы получаем лишь набор пикселей. Знакомая ситуация?
"Что тут происходит? 😑"
Почему это большая проблема?
Распознать что-либо по такому "размытому квадратику" – серьезный вызов для алгоритмов. Стандартные модели, обученные на четких изображениях, часто теряют эффективность, когда объект занимает по высоте всего 32 пикселя (а то и 10!). Это напрямую влияет на точность работы систем в реальных условиях – будь то поиск автомобиля, предмета или распознавание лиц.
В чем сложность?
Главная трудность – "пропасть" между миром четких картинок (на которых обычно учатся модели) и миром размытых кадров. Алгоритмы плохо переносят знания из одного "мира" в другой.
Как с этим бороться?
В нашей новой (и первой) статье мы подробно разобрали ключевые подходы к решению такой проблемы в контексте распознавания лиц:
1. "Дорисовка" деталей: специальные нейросети пытаются увеличить и улучшить размытое изображение перед анализом. Работает, но есть риск "придумать" несуществующие детали.
2. Адаптация модели: как "подружить" алгоритм с плохим качеством?
Трюки с данными: искусственно ухудшаем хорошие изображения при обучении (сжатие, шум), чтобы модель привыкла к помехам.
Дообучение: учим модель на реальных размытых данных. Важно делать это аккуратно, чтобы она не забыла, как работать с четкими изображениями. Помогают методы вроде LoRA (дообучение только маленькой части сети).
"Учитель" для "ученика": мощная модель, видящая четкие картинки, учит компактную модель работать с размытыми, передавая свои "знания".
3. PETALface: новый подход, который динамически комбинирует разные "настройки" (LoRA-адаптеры) в модели в зависимости от качества конкретного входящего кадра. Перспективно, но требует дальнейшего изучения.
Хотите разобраться глубже?
В статье мы подробно разбираем плюсы и минусы каждого подхода, рассматриваем специализированные датасеты (TinyFace, BRIAR) и анализируем нюансы свежего метода PETALface.
Сталкивались ли вы с проблемой низкого разрешения в своих проектах? Какие методы оказались эффективными? Делитесь опытом в комментариях!
Представлен бесплатный ресурс GoalKicker с книгами по IT-тематике от проджект-менеджмента и UX-райтинга до тем по алгоритмам, структурам данным и низкоуровневым языкам, включая ОС и архитектуру компьютеров,.Bash, UNIX, Linux, гайды по работе с командной строкой и прочими тулзами типа Vim, книги по самым востребованным на рынке языкам программирования, всё о работе с базами данных от основ до построения связанных таблиц и интеграции их в системы.
В Go нет недостатка хеш-таблиц. Вы всегда можете использовать встроенную map[Key]Val, с ошеломительной скоростью обладающую непревзойденным удобством! А изобилие типов Key, разрешенных к использованию, способно довести до изумления!
Вот только ни указатель, ни слайс не подходят... Невозможно подсунуть свои операции (равенства и хеширования). Но хоть со скоростью все хорошо! (извините, не удержался)
Итого, мне пришлось написать HashMap[K, V any], закрывающую проблемы.
------------------8<------------------
В это трудно поверить, но:
Без резервирования памяти (конфигурация R0), map[uint64]uint64 работает в 1.93 раза медленнее UintMap! И производит в 5.64 раза больше мусора!!
А с полным резервированием (R1), в 1.72 раза медленнее! И аж в 16.5 раз больше мусора!!!
Вдумайтесь! На коленке написанная хеш-таблица для целых чисел UintMap почти в два раза обгоняет ЖУТКО оптимизированную нативную map[uint64]uint64!! И существенно менее мусорит!!!
Но раз трудно поверить, то давайте проверим:
func MyUintMap() {
const N = umN
//R0| um := lib.NewUintMap(0)
um := lib.NewUintMap(N) //R1|
for i := uint64(0); i < N; i++ {
um.Findsert(i, i+N)
}
lib.Assert(um.Size() == N)
cnt := 0
for i := uint64(0); i < N; i++ {
if *um.Val(um.Find(i)) == i+N {
cnt++
}
if um.Find(i+N) == -1 {
cnt++
}
}
lib.Assert(cnt == N*2)
for i := uint64(0); i < N; i++ {
um.Delete(i)
}
lib.Assert(um.Size() == 0)
}
func GoUintMap() {
const N = umN
//R0| m := make(map[uint64]uint64)
m := make(map[uint64]uint64, N) //R1|
for i := uint64(0); i < N; i++ {
m[i] = i + N
}
lib.Assert(len(m) == N)
cnt := 0
for i := uint64(0); i < N; i++ {
if m[i] == i+N {
cnt++
}
if _, ok := m[i+N]; !ok {
cnt++
}
}
lib.Assert(cnt == N*2)
for i := uint64(0); i < N; i++ {
delete(m, i)
}
lib.Assert(len(m) == 0)
}
Здесь всего-то лишь вставка, два поиска и удаление. Запустите go test -bench=UintMap -benchmem и увидите сами. Вот только можно ли ругать Google за неэффективный map[uint64]uint64?
------------------8<------------------
Итоги?
Смело берите HashMap[K, V any] для слайсов и указателей!
Немного оптимизированная BytesMap -- лучший выбор для []byte.
Интересно оптимизированная UintMap -- это выбор для целых чисел. Разберитесь, что там "не так", и используйте за основу.
Будет полезна всем, кто хочет попрактиковаться в комбинаторике на графах и лучше понять, как устроены остовные деревья.
Условие
Тирекс построил собственный дата-центр и теперь хочет объединить 15 серверов в одну сеть. Он не задумывается о надежности топологии, поэтому хочет использовать минимально возможное количество кабелей — 14.
Схема дата-центра Тирекса.
Задача
Тирекс случайным образом проложил 14 проводов. С какой вероятностью все серверы будут соединены в одну сеть?
Соединять серверы можно только по доступным путям, то есть по заранее проложенным трассам — они заданы в виде неориентированного графа, где вершины — серверы, а ребра — возможные соединения. Все соединения — двусторонние, то есть провода не имеют направления.
Предлагайте свое решение в комментариях. А правильный ответ можно подсмотреть в Академии Selectel.
«Поделитесь своим игровым состоянием с друзьями, просто отправив им число! Если переменная $STATE env не установлена, она генерирует новое случайное начальное число. В противном случае состояние доски и все будущие созданные ячейки будут детерминированными»,‑ пояснил автор проекта.
15 лет назад я думал что образование в области компьютерной архитектуры поломано только в России, а на Западе с этим все хорошо. Что значит "поломано"? Студент может поговорить про суперскалярные процессоры и многоядерные кластеры, но не может ничего спроектировать.
Но потом я поинтервьировал кучу западных студентов, и обнаружил что такое явление есть даже в вузе X с хорошими учебниками и стоимостью образования $90 тысяч в год.
Просишь студента написать модуль на верилоге на десять строк строк с простой (хотя и не из учебника) функциональностью, и он начинает извиваться, как уж на сковородке: пишет какие-то временные переменные, пытаясь затянуть интервью чтобы вышло время и/или по моему выражению лица пробует угадать идет ли он в правильную сторону или пишет ерунду.
И я выдвинул теорию, что им профессор дает готовый код процессоров посимулировать и посинтезировать, а сами они на верилоге ничего не пишут. То есть у меня в голове образовалась модель такого студента, своего рода теоретический Бозон Хиггса, который умозрительно представили задолго до обнаружения.
И вот сегодня я такой Бозон Хиггса засек на LinkedIn. Выпускник этого самого вуза X написал пост, как он изучал учебник Хеннесси-Паттерсона. Он показал фото листка бумаги, испещренного заметками и диаграммами. Он просто сидел, читал по частям учебник и делал такие заметки.
Проблема с такого рода обучением заключается не только в том, что у студента может образоваться каша в голове - например он может путать обычный кэш с кэшем трансляций адресов в TLB. Он может также понять некоторые вещи наоборот и протащить такое понимание до конца, так как у него нет практики, которая бы отсекла такую ошибку сразу. Ну и то что он 90% информации забудет по пути - это тоже данность.
Ну я короче написал ему, что нужно каждую концепцию подтверждать для себя упражнением. Выучил статический конвейер CPU - написал процессорик с несколькими инструкциями на несколько сот строк. Выучил кэш - написал модуль на несколько сот строк. Предсказатель перехода итд. И ради бога, без чатгпт - с ним это не выучится.
А также брать процессоры с открытым кодом, запускать их в симуляции и смотреть как в нем инструкции ходят по конвейеру.
Для Бозона Хиггса эта идея была в новинку. А между тем такой же подход нужно делать и с курсами по компиляторам, и ядрам OS.
Хотя зачем я все это говорю. Сейчас грянет LLM и наша цивилизация исчезнет.
Генерация последовательностей случайных чисел с помощью DRAM — возможно ли это? Проверим с помощью RISC-V
На основе DRAM мы создали модель одноканального источника шума, который возвращает один случайный бит за один условный такт. Память разбита на два региона, которые не пересекаются. Первый отвечает за инициализацию одноканального сигнатурного анализатора (ОСА), который инициализирует второй подобный анализатор. Затем мы сможем взять другой регион памяти и заново инициализировать первый ОСА, что абсолютно случайным образом изменит выход второго ОСА. Такая схема позволит не перезагружать память после каждой генерации числовой последовательности — ведь в реальных проектах это, как правило, невозможно.
Далее мы направляем данные из DRAM PUF в два подмодуля — постобработки, а также тестирования, анализа и оценки качества данных. Первый частично запускается на «железе», второй — на собранных данных на машине хоста.
Для постобработки мы протестировали шесть комбинаций. Последняя нам кажется наиболее перспективной:
сырые данные,
чистый корректор фон Неймана,
одноканальный сигнатурный анализатор,
чистый корректор фон Неймана + одноканальный сигнатурный анализатор,
одноканальный сигнатурный анализатор + чистый корректор фон Неймана,
многоканальный сигнатурный анализатор (МСА).
Зимняя школа RISC-V дала начало множеству интересных проектов. В отдельной статье мы рассказали об одном из них, где команда из БГУИР проверила гипотезу о наличии PUF в динамической памяти и создала модель одноканального источника шума. А затем реализовала постобработку и тестирование, измерила производительность генератора и оптимизировала код.
О магических квадратах известно, наверное, всё. А возможны ли магические квадраты, в которых равны не суммы значений в строках, столбцах и на диагоналях, а их произведения? Оказывается – возможны. В дальнейшем буду называть такие квадраты «магическими квадратами с произведением» (сокращённо – МКП).
Интересно, что, как и «обычных» магических квадратов, возможно бесчисленное множество вариантов МКП. В общем случае для трёх чисел a, b и n МКП размером 3 × 3 имеют вид:
При этом a ≠ b, a ≠ 1, b ≠ 1, a ≠ b2, b ≠ a2,
Интересно, что любой МКП размером 3 × 3 может быть основой для формирования бóльших МКП. Одно из возможных решений заключается в том, чтобы поместить такой квадрат в центр квадрата 5 × 5 и потом подобрать такие остальные числа, чтобы они соответствовали свойствам МКП. Это означает, что МКП являются также так называемыми «рамочными магическими квадратами» – магическими квадратами, которые сохраняют свое магическое свойство, если в них отбросить окаймляющие «полосы» в две клетки.