Как стать автором
Обновить
40
0
Антон Соболев @antonsobolev

Разработчик C++.

Отправить сообщение

C++: чем CRTP лучше Шаблонного Метода?

Время на прочтение 4 мин
Количество просмотров 5.7K

Паттерн Шаблонный Метод (Template Method), описанный в книге по паттернам проектирования за авторством “банды четырех” (GoF), не связан с шаблонами (templates) C++ и является поведенческим шаблоном. Curiously Recurring Template Pattern (CRTP или “странно повторяющийся шаблон”) является усовершенствованием паттерна Шаблонный Метод и представляет собой идиому C++, в которой класс X наследуется от реализации шаблонного класса, используя сам X в качестве шаблонного аргумента. Название этой идиоме было дано Джимом Коплиеном (Jim Coplien), который наблюдал ее в самых первых образцах шаблонного кода C++. Эта методика позволяет достигнуть эффекта, аналогичного использованию виртуальных функций, без накладных расходов (и некоторой гибкости) динамического полиморфизма. CRTP можно использовать вместо Шаблонного Метода при условии, что вам не нужен динамический полиморфизм во время выполнения. Этот паттерн широко используется в библиотеках Windows ATL и WTL.

Читать далее
Всего голосов 9: ↑6 и ↓3 +3
Комментарии 9

КЛЕТКА II, теории возникновения жизни

Уровень сложности Средний
Время на прочтение 20 мин
Количество просмотров 4.1K

В предыдущих публикациях «Мыслящая материя» и «Клетка I, как возникает живая материя» автор не касался деталей и условий научных теорий о возникновении жизни. В рамках таких теорий считается, что для читателя должны быть раскрыты необходимые и достаточные условия существования живой материи. Здесь эти теории, законы, задачи и методы решения будут кратко рассмотрены. 

Необходимое условие существования живой материи – она должна быть обособленной некими границами от остальной материи и в их пределах обладать свойствами живого, часть которых названа в «клетка I». а достаточными условиями – примем потенциальные возможности поддерживать состояние жизни, распространять его в допустимых для живого в окрестностях                                            

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

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

Читать далее
Всего голосов 11: ↑10 и ↓1 +9
Комментарии 5

Как работает альфа-композитинг

Время на прочтение 23 мин
Количество просмотров 22K
image

Возможно, прозрачность не кажется какой-то интересной темой. Формат GIF, позволявший некоторым пикселям просвечивать сквозь фон, опубликован более 30 лет назад. Почти в каждом приложении для графического дизайна, выпущенном за последние два десятка лет, поддерживается создание полупрозрачного контента. Эти понятия давно перестали быть чем-то новым.

В своей статье я хочу показать, что на самом деле прозрачность в цифровых изображениях намного интереснее, чем кажется — в том, что мы воспринимаем как нечто само собой разумеющееся, есть невидимая глубина и красота.
Читать дальше →
Всего голосов 53: ↑53 и ↓0 +53
Комментарии 15

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

Время на прочтение 6 мин
Количество просмотров 6.7K

Представляю вашему вниманию, первую бесплатную offline модель по переводу с русского языка на китайский и обратно.

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

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

Читать далее
Всего голосов 17: ↑16 и ↓1 +15
Комментарии 2

Пишем простой классификатор текста на Python

Время на прочтение 4 мин
Количество просмотров 22K

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

Читать далее
Всего голосов 19: ↑10 и ↓9 +1
Комментарии 19

Как привлечь инвестиции в стартап: гид по инструментам

Время на прочтение 5 мин
Количество просмотров 6.8K

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

Читать далее
Всего голосов 6: ↑4 и ↓2 +2
Комментарии 1

Отладка в C++ геометрии и топологии

Время на прочтение 5 мин
Количество просмотров 5.9K

Генерация 3д объекта - как правило, многоэтапный процесс (например в булевых операциях сначала поиск графа пересечений, нахождение геометрии кривых пересечения и построение топологии результирующего тела). Закономерно возникает сложность с его отладкой. Положим при генерации что-то пошло не так и имеем наполовину готовый объект, который не может быть визуализирован разрабатываемой CAD системой. Что делать? Как локализовать место и момент ошибки? Анализировать глазами тысячи xyz координат промежуточных результатов и вспомогательных объектов на момент выдачи исключения? Или хуже, если отклонения желаемого результата от фактического незначительные, тогда и все числа внешне будут корректны. Работая С++ программистом в области 3Д моделирования и построения различных CAD/САПР систем, я регулярно сталкивался с проблемой визуализации вспомогательных/промежуточных сущностей.               

Сформировал себе универсальный инструментарий DumpSTL, позволяющий с минимальными усилиями, в любом C++ проекте дампить в .stl файлы любые внутренние объекты в проекте.
Почему именно .stl? Так уж исторически сложилось. Много использовал чпу фрезера и 3д принтера, где основным и простейшим форматом моделей является .stl.

Суть использования сводится к однократной адаптации инструмента под структуры данных конкретного проекта, затем:
1) подключить один DumpSTL.h
2) вызвать к необходимым данным метод DUMP::save(...)
3) получить на выходе множество файлов с 3д моделями, которые можно открыть в любом 3д редакторе

Читать далее
Всего голосов 18: ↑18 и ↓0 +18
Комментарии 7

Решение задачи транспортной логистики с помощью IBM CPLEX Solver

Время на прочтение 7 мин
Количество просмотров 3.7K

Всем привет! Однажды меня попросили решить такую задачку в области транспортной логистики:

Есть грузовые машины, которые изначально готовы стартовать в разное время из разных географических точек.

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

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

Поскольку я работала на тот момент с IBM Cplex Solver, то его и взяла в качестве ядра решателя. А как я решала эту задачу – всё под катом.

Читать далее
Всего голосов 13: ↑12 и ↓1 +11
Комментарии 3

Исправляем опечатки с учётом контекста

Время на прочтение 10 мин
Количество просмотров 25K

Недавно мне понадобилась библиотека для исправления опечаток. Большинство открытых спелл-чекеров (к примеру hunspell) не учитывают контекст, а без него сложно получить хорошую точность. Я взял за основу спеллчекер Питера Норвига, прикрутил к нему языковую модель (на базе N-грамм), ускорил его (используя подход SymSpell), поборол сильное потребление памяти (через bloom filter и perfect hash) а затем оформил всё это в виде библиотеки на C++ со swig биндингами для других языков.

Читать дальше →
Всего голосов 23: ↑21 и ↓2 +19
Комментарии 2

Как внедрить что-то своё в CoordinatorLayout и не умереть: путь Android-самурая

Время на прочтение 17 мин
Количество просмотров 6.3K

Привет! Меня зовут Андрей Шоколов, я Android-разработчик KODE.

К нам обратилась компания Forward Leasing с запросом разработать мобильное приложение по готовому дизайну. Прототип содержал дугу, которая по задумке должна была сжиматься в одну линию при скролле. За основу решили взять CoordinatorLayout: у нас уже был положительный опыт работы с ним на другом проекте. Ещё в нашей команде часто любили соревноваться, какой же Layout лучше — CoordinatorLayout или MotionLayout, и именно сейчас настало время узнать.

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

Читать далее
Всего голосов 9: ↑9 и ↓0 +9
Комментарии 0

Первый truly stateless оптимальный алгоритм модел-чекера и его проверка на Coq

Время на прочтение 12 мин
Количество просмотров 3.4K

Надоели нестабильные баги в многопоточном коде? Попробуй воспользоваться модел-чекерами! Ведь больше не надо бояться неверифицированных модел-чекеров,  работающих либо за экспоненциальное время, либо неоптимально. Все это в прошлом: в Max Planck Institute for Software Systems разработали новый алгоритм под названием TruSt, который решает эти проблемы и, кроме того, верифицирован на Coq.

Меня зовут Владимир Гладштейн. Этим летом я проходил стажировку в MPI-SWS в группе, которая придумала алгоритм нового модел-чекера для поиска багов в многопоточных программах. Этот алгоритм является оптимальным и truly stateless (вследствие чего работает с линейными затратами по памяти). В этом посте я расскажу, как работают модел-чекеры, в каких случаях их можно использовать, и что за алгоритм придумали мои коллеги. А еще как я проверял доказательства его корректности на Coq.

Читать далее
Всего голосов 26: ↑26 и ↓0 +26
Комментарии 40

Нейросети для Natural Language Inference (NLI): логические умозаключения на русском языке

Время на прочтение 9 мин
Количество просмотров 17K

NLI (natural language inference) – это задача автоматического определения логической связи между текстами. Обычно она формулируется так: для двух утверждений A и B надо выяснить, следует ли B из A. Эта задача сложная, потому что она требует хорошо понимать смысл текстов. Эта задача полезная, потому что "понимательную" способность модели можно эксплуатировать для прикладных задач типа классификации текстов. Иногда такая классификация неплохо работает даже без обучающей выборки!

До сих пор в открытом доступе не было нейросетей, специализированных на задаче NLI для русского языка, но теперь я обучил целых три: tiny, twoway и threeway. Зачем эти модели нужны, как они обучались, и в чём между ними разница – под катом.

Читать далее
Всего голосов 24: ↑24 и ↓0 +24
Комментарии 3

Скучные числа

Время на прочтение 51 мин
Количество просмотров 20K

1 / 0


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

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

Соревнование между нулём и единицей может быть описано более детально.

Заметка длинная, разделена на главы
1 / 0
Зря-зря
Спуск
Простые числа
Золотая середина
Предыдущее и следующее
Уровни
Что было до нуля
Вообще без нуля

Часть вторая:
Двойные функции
Двойные числа
Биномиальная свёртка
Происхождение чисел Бернулли
Откатная функция
Пи

Функция состоит не только из нулей
Суммируя
Умножая
Симметрия Дзеты
Ось
Откуда там вообще нули?

Исторически счёт принято начинать с единицы, и это оправдано, так как отводит нулю его место — то что было в самом начале, до начала счёта. И этим указывает, что такое сам счёт. Это нахождение элемента между предыдущим и предстоящим. «Предыдущий» в начале счёта ноль, «предстоящий» элемент тоже вполне определён. Основное действие — то что понимается под «предыдущим» меняется на то что получено, и счёт можно продолжать.
Читать дальше →
Всего голосов 81: ↑78 и ↓3 +75
Комментарии 32

Схема Шнорра и её роль в Биткоине

Время на прочтение 6 мин
Количество просмотров 9.4K

Схема Шнорра была изобретена в 1980 гг. Клаусом-Петером Шнорром. Клаус Шнорр - немецкий криптограф, академик, на тот момент профессор и исследователь Франкфуртского университета. Перед публикацией самой схемы Клаус Шнорр заморочился с патентами, из-за чего вплоть до 2008 года прямое её использование было затруднительно.

В 2008 году, в том же году, когда Сатоши Накамото представил миру Биткойн, срок действия патента Клауса Шнорра истёк. Даже несмотря на то что подписи Шнорра уже можно было использовать, Сатоши Накамото выбрал для Биткоина ECDSA. Это связано с тем, что схема Шнорра ещё не являлась стандартизированной и широко используемой.

Хоть криптографы зачастую и считают ECDSA неудачным, он до сих пор используется. К слову, DSA, предшественник ECDSA, представлял собой гибрид схем Эль-Гамаля и Шнорра, созданный исключительно для обхода патентов Клауса Шнорра Национальным институтом стандартов и технологий США (NIST). После его появления в рассылке Coderpunks начался, что называется, интеллигентный срач, а Клаус Шнорр стал ещё активнее защищать свои патенты.

Читать далее
Всего голосов 18: ↑18 и ↓0 +18
Комментарии 2

Динамическая JIT компиляция С/С++ в LLVM с помощью Clang

Время на прочтение 10 мин
Количество просмотров 8.6K


При создании компилятора для собственного языка программирования я сделал его как транспайлер в исходный код на С++, вот только реализация сильно подкачала. Сначала приходится генерировать динамическую библиотеку с помощью вызова gcc, который и сам по себе не очень быстрый, так еще его может и не быть на целевой машине, особенно на другой платформе (например Windows). Конечно, для первых экспериментов и такой реализации было достаточно, но сейчас, когда я начал готовить код компилятора к публикации, стало понятно, что текущий вариант с фоновым запуском gcc никуда не годится.

Из-за этого, я решил не откладывать перевод компилятора на использование LLVM, который планировался когда нибудь в будущем, а решил сделать это уже сейчас. И для этого нужно было научиться запускать компиляцию C++ кода с помощью библиотек Clang, но тут вылезло сразу несколько проблем.

Оказывается, интерфейс Clang меняется от версии к версии и все найденные мной примеры были старыми и не запускались в актуальной версии (Сlang 12), а стабильный C-style интерфейс предназначен для парсинга и анализа исходников и с помощью которого сгенерировать исполняемые файлы не получится*.

Дополнительная проблемой оказалось, что Clang не может анализировать файл из памяти, даже если для этого есть соответствующие классы. Из объяснений выходило, что в экземпляре компилятора проверяется, является ли ввод файлом**.

А теперь публикую результат своих изысканий в виде рабочего примера динамической компиляции С++ кода с последующей его загрузкой и выполнением скомпилированных функций. Исходники адаптированны под актуальную версию Clang 12. Пояснения к коду я перевел и дополнил перед публикацией, а ссылки на исходные материалы приведены в конце статьи.

  • *) Кажется в 14 версии планируется реализовать C интерфейс для генерации исполняемых файлов.
  • **) На самом деле, Clang может (или теперь может) компилировать файлы из оперативной памяти, поэтому в исходники я добавил и эту возможность.
Читать дальше →
Всего голосов 16: ↑15 и ↓1 +14
Комментарии 12

Применение машинного обучения для определения содержимого колонки в таблице

Время на прочтение 11 мин
Количество просмотров 3K

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

Существуют специализированные системы подготовки и анализа данных. Большинство из них отлично справляются с определением атомарного типа колонки, такого как string, integer, boolean. Однако, с задачей определения семантического типа — собственно, того, что лежит в колонке (имя человека, название организации, город и пр.), не всё так хорошо. При этом, успешное определение семантического типа может дать гораздо больше, чем простое знание атомарного типа. Имея на руках семантические типы колонок можно скорее разобраться в незнакомой базе данных, и, например, быстро выделить все колонки, относящиеся к одной сущности реального мира.

Читать далее
Всего голосов 3: ↑3 и ↓0 +3
Комментарии 3

Протокол закрытой вечеринки: как различать своих и чужих с помощью инструментов криптографии

Время на прочтение 17 мин
Количество просмотров 5.7K


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

Закройте глаза и представьте себе Ниццу, роскошное поместье, владелец которого каждые выходные устраивает грандиозные вечеринки с джазом и фейерверком.
Читать дальше →
Всего голосов 10: ↑9 и ↓1 +8
Комментарии 83

Mina Protocol — особенности самого легкого блокчейна

Время на прочтение 5 мин
Количество просмотров 19K

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

Читать далее
Всего голосов 24: ↑20 и ↓4 +16
Комментарии 27

Прогнозирование временных рядов методом рядов Фурье

Время на прочтение 10 мин
Количество просмотров 23K
image
Привет, Хабр.

Эта статья посвящена методу долгосрочного прогнозирования временных рядов с помощью рядов Фурье [1-2]. Особенность подхода в том, что в отличие от классических методов прогнозирования и машинного обучения прогнозируется не сама неизвестная функция, а ее коэффициенты разложения в ряд Фурье. Далее по спрогнозированным коэффициентам Фурье восстанавливается неизвестная функция и делается прогноз ее значений на следующий период.

Внимание! Статья содержит множество формул.

Читать дальше →
Всего голосов 8: ↑8 и ↓0 +8
Комментарии 10

Почему мы трансформируем трёхмерные векторы матрицами 4х4?

Время на прочтение 3 мин
Количество просмотров 14K

Почему не матрица 3х3? Почему в матрице 4х4 всё уложено именно так? Зачем там последняя строка, заполненная нулями и одной единицей в конце? Этими вопросами я задался накануне, решил поисследовать вопрос и рассказываю что выяснил.

Читать далее
Всего голосов 19: ↑17 и ↓2 +15
Комментарии 14

Информация

В рейтинге
Не участвует
Откуда
Петрозаводск, Карелия, Россия
Дата рождения
Зарегистрирован
Активность