Pull to refresh
4
0

Пользователь

Send message

Как линейная алгебра помогла мне в разработке интерактивного редактора диаграмм

Level of difficultyEasy
Reading time9 min
Views12K

Ах, матрицы — одна из тех базовых концепций линейной алгебры, с которыми мы встречались в школе. Несмотря на их важность, мне за мою карьеру ни разу не доводилось с ними работать, и из-за этого я забыл, насколько они мощны и универсальны. Подходящий момент, чтобы вспомнить их, настал, когда я работал над моим интерактивным редактором диаграмм Schemio. В этой статье я расскажу, как использовал матрицы для решения сложных задач.

Читать далее

Оптимизация кольцевого буфера для повышения пропускной способности

Level of difficultyMedium
Reading time6 min
Views9.8K

В этой статье мы рассмотрим классический конкурентный кольцевой буфер и обсудим, как его можно оптимизировать для повышения производительности. Я покажу вам, как существенно улучшить этот показатель от 5,5 миллионов элементов в секунду до 112 миллионов элементов в секунду — и эти показатели выше, чем в реализациях Boost и Folly. Если вам требуется готовая реализация со всеми этими оптимизациями, посмотрите мою библиотеку SPSCQueue.h.

Кольцевой буфер также называется очередью «один производитель — один потребитель» (SPSC). В ней не бывает ожидания (и, соответственно, не бывает блокировок), это конкурентный примитив. Такая структура данных находит множество вариантов применения, и здесь я рассмотрю передачу сетевых пакетов между сетевым контроллером и драйверами операционной системы. Основная задача, решаемая при этом — выполнение событий ввода/вывода в относительно новом асинхронном API io_uring.

Читать далее

Паттерны английского языка

Level of difficultyEasy
Reading time9 min
Views20K

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

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

Постепенно совершенствуя свой уровень английского языка, расширяя словарный запас, всё чаще начинаешь замечать ранее скрытые общие закономерности в различных группах слов, объединенных по некоторым признакам. В данной статье я бы хотел рассмотреть некоторые интересные, не самые очевидные паттерны лексики английского языка.

Читать далее

Программа, которая падала на первой команде

Reading time9 min
Views13K

Нашего клиента донимали отчёты о вылетах, показывавшие, что его программа ломается на самой первой команде.

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

Читать далее

Металл и алгоритм отжига

Level of difficultyMedium
Reading time3 min
Views2.6K

Вступление

Тема искусственного интеллекта стремительно набирала популярность, но реализация алгоритмов используемых в ИИ часто бывает сложной и запутанной. В этой статье я продемонстрирую реализацию алгоритма Брайна Люка "Отжиг"применив современные практики и технологии для сокращения исходного кода.

Понимание Алгоритма Отжига

В области алгоритмов оптимизации выделяется Алгоритм Отжига (Симулированный Анализ) - мощная техника, вдохновленная физическим процессом в металлургии, позволяющая улучшить кристаллическую структуру материалов.Идея заключается в том, чтобы начать с высокотемпературной системы с постепенным охлаждением и переходом к минимальной энергии.Разработанный Брайаном Луком в конце 1980-х алгоритм нашел широкое применение в различных областяхот инженерии и информатики до финансов и биологии, благодаря способности эффективно искать оптимальные решения в сложных пространствах.

Реализация

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

Рассмотрим фазы алгоритма:

Читать далее

Внедрение зависимостей в C++

Reading time7 min
Views32K
MagicClass::getInstance().getFooFactory().createFoo().killMePlease();

«Внедрение зависимостей» и «Статическую типизацию» трудно назвать лучшими друзьями на все времена. Некоторые наработки в этом направлении существуют и легко гуглятся, однако интересно, насколько реально создать собственную простую реализацию баз хаков, ловких ухищрений и подключения внешних библиотек. Без особой гибкости, вот чтобы буквально два действия — настройка и внедрение. Вопросы многопоточности затрагиваться не будут, чтобы не отвлекаться от основной идеи. Итак, что же лично я хочу от внедрения зависимостей.

Постановка

Управление временем жизни объектов. Нюансы, касающиеся времени жизни, не должны разбавлять основную логику приложения. Чаще всего мне не нужно знать, что требуемый объект является экземпляром класса-одиночки или создается с помощью какого-то фабричного метода. Просто нужен пригодный для использования экземпляр. Совсем хорошо, если существует возможность изменять правила управления временем жизни объекта, не затрагивая основную логику приложения.

Тестирование. Одна из первоочередных целей внедрения зависимостей. Подразумевает возможность в подменять определенные объекты тестовыми заглушками, опять же, не затрагивая основную реализацию.

Упрощенный доступ к объектам. Информация, какой объект откуда можно получить чаще всего совершенно неинтересна. Более того, она отвлекает от базовой функциональности и способствует более сильному связыванию подсистем проекта, чем того хочется. Также нежелание программиста продумывать адекватные точки доступа к добавляемым сервисам может негативно сказаться на общей архитектуре системы. «В последние дни я получал почти все нужные мне объекты из модуля номер N, закину и эти туда же...».

Рабочий вариант с тестовым примером можно взять отсюда.
Читать дальше →

Поговорим об оптимизирующих компиляторах. Сказ восьмой: размотка циклов

Level of difficultyMedium
Reading time12 min
Views9.9K

Есть оптимизации, польза от которых очевидна всегда или почти всегда. Например, не делать лишнюю проверку лучше, чем делать. Не считать два раза одно и то же обычно лучше, чем считать (если только мы не упёрлись в нехватку регистров или имеем другие подобные проблемы на нижнем уровне). Вычислять выражения вне цикла выгоднее, чем в цикле. И так далее.

Но есть оптимизации, применение которых имеет как плюсы, так и минусы. Выиграв в одном месте, мы можем получить отрицательные эффекты в другом. Например, сэкономив на количестве проверок, мы можем раздуть общий объём кода и поломать микрооптимизации. Каноничным примером такой оптимизации, решение вопроса об использовании которой больше похоже на искусство, чем на науку, является размотка циклов (Loop Unrolling), о которой мы сегодня поговорим. В статье я попробую осветить как можно больше (хотя, наверное, и не все) соображения о том, почему эту оптимизацию может быть нужно или не нужно применять.

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

Читать далее

Оптимизация компилятора на пальцах

Reading time15 min
Views5.8K

Почему я это написал, и как читать статью

Недавно получил от друга такое сообщение:

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

Я сразу же подумал: «Ну конечно, я знаю тысячу статей и видеороликов на эту тему», но вскоре осознал, что практически во всех таких источниках от читателя требуется знать компьютерный жаргон, внутреннее устройство, промежуточные представления, т.д. Вот какая проблема здесь возникает: те, кто пользуется компиляторами (как, например, мой друг), всем этим не заморачиваются. Их не волнует, каково именно промежуточное представление LLVM, или что такое φ-узел, или какой проход и почему называется «ротацией циклов». Нет, их интересуют (в порядке убывания приоритета) ответы на вопросы: (1) что, (2) почему, (3) как.

Читать далее

Размышление о двух подходах к C++

Reading time8 min
Views15K

Будущее C++ уже не первый год служит поводом для огромного количества разногласий.

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

Читать далее

Немного об отладке. Часть 1

Level of difficultyMedium
Reading time127 min
Views7.5K

Приветствую.

Вы когда нибудь отлаживали программы? Не врите, что нет. Благодаря отладчикам наши программы работают корректно (или хотя бы близко к этому).

Но вот знаете ли вы как отладка устроена: точки останова, шаги, бэктрейс, чтение переменных?

Нет или да - ответ не важен. Эта статья даст ответы на многие вопросы об отладке, которые вы, возможно, и не задавали себе.

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

Путешествие на 20 минут

Математическая продлёнка. Про НОД, НОК и суперсилу

Level of difficultyEasy
Reading time10 min
Views7.8K

Продолжаю делиться с вами своими заметками для занятий математического кружка. Эта статья носит пятничный характер, и представляет опыт лёгкой болтовни на глубокие математические темы. Именно такие беседы с моим папой, а потом с учителями в новосибирской ФМШ когда-то привели меня в науку, и именно они оставляют у учеников ощущение прикосновения к чему-то большому и стройному, что популярные ныне стоики называли словом Логос.

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

Читать далее

Загадка потерянного инкремента

Level of difficultyMedium
Reading time15 min
Views6.5K

Всё вроде должно быть просто

Сцена этого конкретного преступления может показаться неправдоподобной: аномалия производительности, возникающая в простейшем машинном коде. На самом деле, его даже можно назвать чрезмерно упрощённым, ведь он не выполняет никакой полезной работы. Он нужен лишь для того, чтобы продемонстрировать поведение оборудования в образовательных целях.

Но по моему опыту, чрезвычайно простой машинный код — это, на самом деле, один из самых частых источников чего-то странного. Так как мы передаём CPU ограниченное количество крайне специфичных команд без остальной части когда, то упираемся в границы того, что проектировщики оборудования ожидали встретить в реальном мире. В этой ситуации вы с большей вероятностью сможете пощупать границы микроархитектуры, чем в более стандартном сценарии.

Читать далее

Странные числа странной вселенной

Level of difficultyEasy
Reading time14 min
Views17K

В основе этой статьи лежит материал статьи математика Джима Проппа.

Если бы новые виды чисел были как новые потребительские товары, математики имели бы полное право уволить маркетолога, который придумал названия для «комплексных» и «мнимых» чисел. Как бы звучал слоган для этих брендов? «Хотите купить число? Без проблем, хотя оно действительно трудно для понимания, и, что самое лучшее, его даже не существует!»

Математикам некого винить, кроме самих себя, поскольку один из них (Рене Декарт) наделил такие числа, как sqrt(−1), термином «мнимые», а другой (Карл-Фридрих Гаусс) — окрестил числа вроде 2+sqrt(−1), «комплексными». Сейчас эти названия кажутся немного не соответствующими смыслу понятий, скрывающихся за ними, но уже несколько столетий поздно просить всех использовать другие слова, хотя эти столетия дали нам более чёткое понимание того, для чего нужны эти относительно новые виды чисел.

В принципе, понятно, почему sqrt(−1) назвали «мнимым». Корень из -1 обозначает число x со свойством x2 = −1, но ни одно приличное число так себя не ведёт. Число может быть положительным, отрицательным или нулевым. Если x положительно, x2 тоже будет положительным. Если x отрицательно, x2 всё равно будет положительным, поскольку отрицательное число, умноженное на отрицательное число, является положительным числом. А если x равен нулю, x2 также будет равен нулю. Ни в одном из трёх допустимых случаев x2 не является отрицательным, поэтому x2 не может быть равным −1. Это в некотором роде невыполнимое уравнение. И можно было бы подумать, что это положит конец вопросу…

Читать далее

5 наиболее красивых задач с экзамена в Школу Анализа Данных от Яндекса

Level of difficultyMedium
Reading time3 min
Views11K

Школа Анализа Данных бесплатный проект дополнительного образования в области Data Science и Big Data, можно сказать в РФ остается лидером по качеству курсов и преподавателей. Такой же уровень ШАД требует и от студентов: абитуриентам нужно пройти 3 этапа вступительных испытаний, где спрашивают математику и алгоритмы. Сам же я занимаюсь подготовкой к ШАД ни один год, поэтому в этой статье хотел бы поделиться своими любимыми задачами со вступительных испытаний разных лет, которые мне кажутся наиболее красивыми.

Задача 1

Найти f^{(319)}(0), если f(x)=\frac{x^2+17}{x^4-5x^2+4}.

Пояснение: то есть просят найти производную 319-го порядка в нуле.

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

Читать далее

Реализация шифра «Магма» на языке RUST

Level of difficultyEasy
Reading time9 min
Views4.7K

Привет! Сегодня мы продолжаем реализовывать шифрование. В этой статье мы рассмотрим алгоритм шифра "Магма", который был разработан и использовался в СССР.

Читать далее

Стилистический-Анализатор: Проверка Наличия Комментария в Конце Фигурной Скобки

Level of difficultyEasy
Reading time9 min
Views2K

Настал тот первый день, когда в программировании микроконтроллеров наконец пригодилась такая абстрактная структура данных как стек LIFO.

У нас в организации существует обязательное внутреннее требование к оформлению исходных кодов на языке программирования Си для микроконтроллеров, которое звучит так:

В конце каждого блока if(...) {...} ; switch(...) {...} ; for(...) {...} и т.п. необходимо пиcать комментарий // end of if(...). end of switch(...) end of for(...) соответственно.

Я написал утилиту-локатор, которая автоматически находит аномалии в коде согласно этому странному правилу.

Читать далее

Головоломки с балансом. Поиск фальшивой монеты (часть 2)

Level of difficultyMedium
Reading time5 min
Views2.2K

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

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

Читать далее

Управление вёрсткой в PlantUML

Level of difficultyHard
Reading time14 min
Views12K

Каждый, кто пользовался PlantUML, знает, что этот инструмент хорош тем, что позволяет создавать разнообразные диаграммы без необходимости ручного позиционирования их элементов: написал код — получил рендеринг. Но, как известно, у медали две стороны. В данном случае вторая сторона медали это не всегда понятные правила, которыми руководствуется логика, лежащая в основе движка PlantUML.

Как следствие, иногда получаются не самые эстетически привлекательные диаграммы, а поиск ответа на вопрос, как повлиять на автоматическую расстановку элементов, заводит в тупик. Это происходит из-за того, что доступной информации об управлении вёрсткой в PlantUML практически нет.

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

Поехали

Мозг. Удивительные возможности. Часть II

Level of difficultyMedium
Reading time15 min
Views2.6K

Основным объектом нейробиологии человека является нервная система, состоящая из двух больших частей:

а) центральной нервной системы (ЦНС), включающей и управляющий ею головной мозг;
б) периферической нервной системы, состоящей из периферических нервов, а также двух других подсистем — вегетативной нервной системы (делится на симпатический и парасимпатический отделы) и диффузной (соматической) нервной системы.
Работает принцип передачи сигнала (возбуждение/торможение), а также структурный иерархический принцип (стимул - реакция).

Удивительные факты заставляют думать, что роль мозга в жизни человека весьма преувеличена

Люди рождаются иногда без мозга (живут, правда, недолго), теряют целые полушария или даже более того, но это практически мало проявляется. Для окружающих они выглядят как самые обыкновенные люди, а сами они порой даже не подозревают о своей исключительности. Только случай после медицинского освидетельствования помогает раскрыть особенности таких людей.

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

Читать далее

Синтаксис, синглтон и смертельный ромб в С++: взгляд опытного разработчика на C

Level of difficultyMedium
Reading time15 min
Views11K

Давайте знакомиться: меня зовут Анатолий Семятнёв, я и моя команда разрабатываем ПО для опорных сетей 5G в YADRO. В IT-сфере работаю давно, и мой опыт в основном связан с языком С: занимался Board Support Package (BSP) и драйверами, много работал с операционной системой QNX. 

До того, как начал полноценно работать на С++, сталкивался с языком в нулевые, писал на С++98. Тем не менее все это время я краем глаза поглядывал, что происходит в С++, и хотел вернуться к программированию на этом языке. Читал книги, делал пет-проекты, смотрел записи конференций и митапов по С++. А когда пришел в YADRO, стал писать на С++.

Мне с ходу дали большую фичу для имплементации, я писал много кода, и получал комментарии от коллег. В этом материале собрал все, что изучил или вспомнил по итогам код-ревью. Что рассмотрим в статье:

• Ключевые концепции — explicit, final, default, string — и как их использовать.

• Инициализацию мемберов с помощью пустого брейс-листа.

• Синглтон Майерса в корутинах.

• «Смертельный ромб» и все, что связано с виртуальным наследованием.

Читать далее

Information

Rating
7,222-nd
Registered
Activity