Pull to refresh
1
0
Калмыков Юрий @Videoman

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

Send message

Ищем Арнольда Шварценеггера среди мужчин, женщин и детей с помощью нейросети на С++

Level of difficultyMedium
Reading time24 min
Views7.8K

Привет, Хабр! Меня зовут Кирилл Колодяжный, я ведущий инженер-программист в YADRO. Помимо основных рабочих задач, включающих исследование проблем производительности СХД, я увлекаюсь машинным обучением. Участвовал в коммерческих проектах, связанных с техническим зрением, 3D-сканерами и обработкой фотографий. В задачах часто использовал С++, хотя машинное обучение традиционно ассоциируется с Python. Этот язык программирования буквально захватил сферу, его используют повсюду — от обучающих курсов до серьезных ML-проектов.

Однако Python — не единственный язык, на котором можно решать задачи машинного обучения. Так, альтернативой может стать С++. Если последний вам ближе, вам будет интересен и полезен этот текст.

Под катом разберемся:

как организовать работу с данными и загрузку обучающего датасета, 

как описать структуру нейронной сети, 

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

как организовать конвейер обучения сети, 

как использовать предобученные глубокие сети для решения задач. 

Читать далее
Total votes 22: ↑21 and ↓1+20
Comments15

Самое понятное объяснение Специальной теории относительности

Level of difficultyMedium
Reading time13 min
Views98K

Специальная теория относительности - удивительная теория, которая опровергла многие представления о мире, в которых человечество не сомневалось всю историю своего существования.

Многие слышали про волшебства вроде замедления времени, сокращения длины, относительности одновременности, парадокса близнецов и т.д., но мало кто понимает почему так происходит. 

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

Для иллюстраций я написал интерактивный визуализатор СТО, работающий в браузере. Ссылка на него и исходники проекта в конце статьи.

Читать далее
Total votes 386: ↑386 and ↓0+386
Comments388

Люди не понимают ООП

Level of difficultyMedium
Reading time15 min
Views113K

«ООП для меня означает лишь обмен сообщениями, локальные ограничения и защиту, сокрытие состояния процесса и крайне позднее привязывание», — Алан Кэй (человек, придумавший термин «объектно-ориентированное программирование»)1

Похоже, многим не нравится объектно-ориентированное программирование. Первое, что приходит в голову, когда слышишь эту трёхбуквенную аббревиатуру — это пример с автомобилем, наследование, геттеры, сеттеры и ObjectFactoryFactorySingleton.

Мне это всегда казалось довольно странным. Мне не только нравится ООП, я ещё и считаю, что часто это лучший/наиболее очевидный способ моделирования задачи. И ниже я расскажу, почему.
Читать дальше →
Total votes 154: ↑147 and ↓7+140
Comments457

Неожиданное взаимодействие предсказания ветвлений и подсистем памяти

Reading time10 min
Views6.6K

Это 15-я статья в серии, посвящённая оптимизации подсистем памяти. Остальные доступны здесь (англ.).

В ней мы изучим взаимодействие механизма предсказания ветвлений с подсистемой памяти. В повествовании мы будем исходить из предположения, что вам знаком принцип предсказания ветвлений и работы подсистем памяти в современных процессорах.
Читать дальше →
Total votes 45: ↑43 and ↓2+41
Comments6

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

Level of difficultyMedium
Reading time12 min
Views8.7K

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

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

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

Читать далее
Total votes 55: ↑55 and ↓0+55
Comments6

Почему программистам нужны кабинеты с закрывающимися дверями?

Reading time8 min
Views17K
Обычная ситуация: вы сидите за своим рабочим столом, погрузившись в размышления, и пытаетесь разрешить проблему, которая вот уже неделю не дает вам продвинуться в работе. В глубинах сознания вы выстраиваете структуру из мыслей и вероятностей, о которой ни один философ и не мечтал: выявляете концепты, прилаживаете их друг к другу, поворачиваете так и эдак, чтобы они состыковались. Что-то вроде арки, сложенной из камней: когда она будет закончена, то окажется достаточно прочной, чтобы пережить целые поколения – но пока не готова, может развалиться до основания, если слишком рано перестать удерживать части.



Триумфальная арка © Verity Cridland/flickr

Тут мимо проходит коллега и замечает, что вы просто сидите, возможно, со слегка приоткрытым ртом, не исключено, что голова у вас слегка склонена, глаз подергивается и общее выражение лица такое, будто вы проглотили муху (или это только у меня так?). В общем, очевидно, что вы ничем не заняты. Поэтому коллега трогает вас за плечо и говорит: «Эй, можно тебя на минутку? Я только хотел спросить…»

И вот, в эту самую секунду роскошная полуарка, которую вы с таким трудом удерживали, обрушивается к вашим ногам.
Читать дальше →
Total votes 33: ↑32 and ↓1+31
Comments23

Реализация консенсусного алгоритма Raft

Level of difficultyEasy
Reading time12 min
Views3.1K

Привет, Хабр!

Когда речь идет о распределенных системах и сетевых приложениях, консенсусный алгоритм становится must have. Эти алгоритмы играют ключевую роль в обеспечении надежности, согласованности и целостности данных в условиях, когда у нас есть несколько участников (узлов), работающих в сети. Например, множество современных распределенных баз данных, файловых систем и кластеров используют консенсусные алгоритмы для координации операций между разными узлами.

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

К примеру, у вас есть распределенный кластер серверов, которые отвечают за хранение критически важных данных. Если один из серверов хранит информацию о балансе банковского счета пользователя и другой сервер отвечает за транзакции, нам нужно обеспечить согласованность данных между ними. Консенсусный алгоритм помогает решить вопросы вроде "Что произойдет, если сервер с балансом откажет?"

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

Читать далее
Total votes 17: ↑15 and ↓2+13
Comments1

CRC — это просто (деление столбиком)

Level of difficultyEasy
Reading time9 min
Views12K

Целостность можно достичь различными способами. Например, чек-суммами. Вот как раз была такая задача - обеспечить целостность с помощью чек-сумм.

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

Но это простой путь слишком просто - так не интересно (да и лишних часов на таску надо тоже поставить). Поэтому решил усложнить себе жизнь разобраться в работе CRC!

Читать далее
Total votes 27: ↑26 and ↓1+25
Comments8

Реляционные системы управления базами данных становятся проблемой. Что с этим делать?

Reading time9 min
Views21K

С реляционными базами данных я знаком очень давно, с конца 90-х. Мои первые шаги в мире компьютеров и программирования связанны именно с ними. Реляционным БД было отведено особое место в моей образовательной программе и стажировке на инженера-программиста. Они преследовали меня на протяжении всей моей карьеры. Я буквально провалился на самое дно кроличьей норы реляционных систем управления базами данных (РСУБД) – и до сих пор люблю их.

За годы работы я испробовал практически все РСУБД, а их попадалось мне немало: MySQL, Postgres, Oracle, Microsoft SQL Server, DBase, Access, SQLite, DB2, MariaDB, AWS RDS, Azure SQL, Google Cloud SQL. Нельзя любить РСУБД, если не любишь SQL, а это отдельная вселенная. И не все SQL одинаковы. Есть MySQL со своим собственным жаргоном, есть T-SQL от Microsoft и всемирно известный PL/SQL от Oracle. Наверное, не стоит упоминать, что все они несовместимы друг с другом.

Читать далее
Total votes 34: ↑20 and ↓14+6
Comments56

Разбираем TLS по байтам. Кто такой этот HTTPS?

Level of difficultyMedium
Reading time32 min
Views23K


Подключение к сайту бывает защищённым, а бывает нет — это надо знать всем детям. Только мало детей знают, что это значит и как работает.

Я, изучая веб-разработку, узнал об HTTP. Разобраться в нём несложно: в каждой статье о протоколе множество наглядных примеров запросов и ответов. Затем узнал о схеме HTTPS, с которой всё не так наглядно. В ней используется то ли SSL, то ли TLS, и что-то где-то шифруется, и зачем-то нужны какие-то сертификаты. Короче, всё расплывалось в тумане: где пример ответа, запроса, сертификата, как его создать, зачем он нужен и почему гайд по созданию http-сервера уже написал каждый школьник, а https-сервер — недоступная для начинающих разработчиков роскошь?

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

Во второй обсудим, как это дело реализуется в протоколе TLS и разберём формат TLS-пакетов по байтам. Статьи рассчитаны в первую очередь на изучающих веб-разработку, знакомых с HTTP и жаждущих осознать, кто такое https. Но материал актуален для любых применений TLS, будь то веб или не веб.
Читать дальше →
Total votes 62: ↑61 and ↓1+60
Comments21

Актуальный гайд по написанию простого Windows-драйвера

Level of difficultyMedium
Reading time10 min
Views34K

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

Читать далее
Total votes 61: ↑61 and ↓0+61
Comments40

Поиск по регулярным выражениям может быть простым и быстрым

Level of difficultyMedium
Reading time28 min
Views9.1K

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

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

Как оказалось, с тех пор мало что поменялось, так что статья не потеряла своей актуальности.

Обо всех ошибках и опечатках большая просьба сообщать, чтобы я мог их поправить.

Заблудиться в тёмном лесу
Total votes 34: ↑33 and ↓1+32
Comments6

Сохранение древовидной структуры в Visual Studio с CMake или создание папок в проекте

Level of difficultyEasy
Reading time7 min
Views4.4K

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

Читать далее
Total votes 7: ↑7 and ↓0+7
Comments3

Тайная жизнь COM: как устроен Component Object Model в Windows и стратегии выбора объекта для атаки

Level of difficultyMedium
Reading time12 min
Views7.2K

Анализируя отчеты по разбору вредоносного ПО приходишь к выводу, что одним из популярных методов для закрепления в системе является COM Hijacking (T1546.015). Примером такого вредоносного ПО является Fancy Bear или Jumplump. Таким образом, становится очень важно команде Blue Team уметь детектировать данный вид атаки. Поэтому было принято решение выпустить серию статей, посвященных технологии Component Object Model, разбору атаки COM Hijacking и ее детектированию.

Читать далее
Total votes 15: ↑15 and ↓0+15
Comments3

Теорема Байеса для чайников

Level of difficultyEasy
Reading time5 min
Views52K

Теорема (формула) Байеса позволяет выяснить вероятность события при условии, что произошло связанное с ним другое событие.

Теорема позволяет рассчитать вероятность события, если причину и следствие поменять местами. Например, мы знаем распространенность симптома среди больных и здоровых. Значит, мы можем вычислить вероятность заболевания от наличия симптома.

Читать далее
Total votes 24: ↑23 and ↓1+22
Comments35

Что делает ChatGPT… и почему это работает?

Level of difficultyMedium
Reading time75 min
Views146K

То, что ChatGPT может автоматически генерировать что-то, что хотя бы на первый взгляд похоже на написанный человеком текст, удивительно и неожиданно. Но как он это делает? И почему это работает? Цель этой статьи - дать приблизительное описание того, что происходит внутри ChatGPT, а затем исследовать, почему он может так хорошо справляться с созданием более-менее осмысленного текста. С самого начала я должен сказать, что собираюсь сосредоточиться на общей картине происходящего, и хотя я упомяну некоторые инженерные детали, но не буду глубоко в них вникать. (Примеры в статье применимы как к другим современным "большим языковым моделям" (LLM), так и к ChatGPT).

Читать далее
Total votes 248: ↑248 and ↓0+248
Comments121

Гетерогенный поиск в ассоциативных контейнерах на C++

Reading time3 min
Views9.7K

Ассоциативные контейнеры в C++ работают с конкретным типом ключа. Для поиска в них по ключу подобного типа (std::string, std::string_view, const char*) мы можем нести существенные потери в производительности. В этой статье я расскажу как этого избежать с помощью относительно недавно добавленной возможности гетерогенного поиска.

Читать дальше →
Total votes 33: ↑33 and ↓0+33
Comments24

Улучшенная эвристика при квантовании цветовой палитры

Reading time11 min
Views1.4K

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

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

Вот в чём заключалось одно крупное изменение, которое я хотел внести: оценить расстояния между цветами, воспользовавшись при этом равномерно воспринимаемым цветовым пространством, а не наивное евклидово расстояние между RGB-тройками. 

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

Читать далее
Total votes 23: ↑23 and ↓0+23
Comments1

RSync на стероидах с поддержкой Windows

Level of difficultyMedium
Reading time5 min
Views28K


На Хабре периодически рассказывают о новых инструментах для синхронизации данных. Это интересная тема. Такие программы используются:

  • для синхронизации файлов на разных устройствах,
  • дедупликации,
  • резервного копирования,
  • сжатия.

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

Кроме того, инструменты синхронизации интересны с алгоритмической точки зрения. Любопытно, как люди умудряются оптимизировать базовые алгоритмы типа rsync, которые вроде бы работают идеально. Но нет, всегда можно придумать что-то получше.
Читать дальше →
Total votes 62: ↑62 and ↓0+62
Comments27

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity