Найти в Дзене
Указатели на функции в C++ - от котов к стратегиям
Представь, что ты шеф-повар. У тебя есть поваренная книга, и вместо того чтобы переписывать рецепт «Пасты Карбонара» каждый раз, когда приходит гость, ты просто кладешь в книгу закладку с номером страницы. Указатели на функции — это и есть такие закладки в коде. Они хранят не сами данные, а адрес действия, которое нужно выполнить. Звучит страшновато? На самом деле это просто суперсила, которая делает твой код гибким, как йог. Погнали разбираться! 1. Самые простые: Закладки на рецепты Допустим, у тебя есть простая функция — «позвать кота по имени»: #include <iostream> void callCatByName(int fishCount)...
1 неделю назад
Идиома CRTP в C++ для тех, кто хочет кода на шаблонах со скоростью света
Привет, подписчик! Если ты читаешь это, значит, ты уже перешагнул рубеж «Hello, World» и начал задумываться о том, как писать не просто рабочий, а быстрый и элегантный код на C++ . Сегодня мы разберем одну из самых хитрых, но невероятно полезных идиом языка. Называется она CRTP - это секретный ингредиент в рецептах высокопроизводительных библиотек и игровых движков. Представь, что ты проектируешь иерархию классов. У тебя есть базовый класс Животное с методом податьГолос() . А от него наследуюются Кошка и Собака . В классическом объектно-ориентированном программировании (ООП) мы бы сделали...
2 недели назад
Магия Pimpl в C++: Как спрятать скелеты в шкафу и ускорить компиляцию
Представь, что ты строишь дом. Ты показываешь друзьям красивый фасад и входную дверь (это твой интерфейс), но никто не видит, какие трубы торчат у тебя в коридоре или насколько криво висят розетки на кухне (это твоя реализация ). В идеальном мире код должен работать так же: пользователь класса видит только то, что ему нужно, а все внутренности надежно спрятаны. В C++ для этого есть крутой трюк под названием Pimpl (читается как "пимпл", от английского "Pointer to Implementation" — указатель на реализацию). Это как суперспособность, которая делает твой код чище, а компиляцию — быстрее. Давай разберемся, как это работает, на понятных примерах...
2 недели назад
Идиома Tag Dispatching в C++: Компилятор как диспетчер задач
Представьте, что вам нужно написать универсальную функцию, которая должна работать по-разному для разных типов данных, но при этом не тратить время на проверки во время выполнения. Именно эту проблему решает идиома Tag Dispatching (диспетчеризация по тегам). Tag Dispatching — это идиома, использующая пустые типы-теги (dummy tags) и перегрузку функций для выбора оптимальной реализации алгоритма на этапе компиляции. Вместо проверок if constexpr или RTTI, мы передаем функции "пустышку" — объект типа, который несет исключительно смысловую нагрузку. Компилятор видит разные типы и автоматически вызывает нужную перегрузку...
2 недели назад
Идиома Copy-and-Swap в C++: Пишем безопасный оператор присваивания правильно
Поговорим об одной из интересных идиом в C++ — Copy-and-Swap. Если вы когда-нибудь писали класс, который управляет ресурсами (памятью, файлами или сокетами), вы наверняка сталкивались с головной болью под названием «перегрузка оператора присваивания». Хочется сделать его надежным, безопасным и не облажаться с исключениями. Copy-and-Swap — это элегантный способ решить эти проблемы раз и навсегда. Copy-and-Swap (или «копируй и обменяй») — это не просто трюк, а настоящий джентльменский набор для оператора operator=. Идея до безобразия проста: 1. Копируем — создаем временную копию объекта, который присваиваем...
3 недели назад
Идиома NVI в C++: Объяснение для начинающих
Сегодня разберем полезный прием в C++ — NVI (Non-Virtual Interface). Звучит сложно, но на самом деле все просто. Эта штука поможет писать более аккуратный и удобный код. Представь, что ты — начальник, который дает задания сотрудникам. Ты говоришь: "Сделай отчет", но не вдаешься в детали — кто-то делает в Excel, кто-то в Word. Главное — результат. NVI работает похоже: есть общий интерфейс (публичный метод), который вызывают все, а детали реализации (виртуальные методы) скрыты внутри классов. Основная идея NVI: публичные методы делаем обычными (не виртуальными), а виртуальные методы прячем в protected или private...
3 недели назад
Идиома Empty Base Optimization в C++: Как пустые классы помогают экономить память
Когда мы пишем программы на C++, мы хотим, чтобы они работали быстро и использовали поменьше памяти. Оказывается, даже пустые классы могут помочь нам в этом! В этой статье разберем, что такое Empty Base Optimization (EBO) — оптимизация пустых базовых классов — и как она делает программы эффективнее. Для начала разберемся с главным понятием. Пустой класс — это класс, у которого нет никаких данных внутри. Например: struct Empty { // Здесь нет переменных-членов }; Казалось бы, раз класс пустой, он не должен занимать память. Но в C++ есть важное правило: каждый объект должен иметь уникальный адрес...
3 недели назад
Установка учебной демо-версии Битрикс на Arch Linux
Скачиваем демоверсию https://www.1c-bitrix.ru/download/cms.php#tab-subsection-3 Распаковываем и меняем владельца и группу на daemon:daemon командой sudo chown daemon:daemon /путь/к/распакованному/архиву -R Создаем каталог для виртуального хоста по пути /путь/vhosts/test.local На выбранном разделе должно быть 1.6 Гб свободного места Аналогично меняем владельца и группу у /путь/vhosts Перемещаем распакованные файлы из /путь/к/распакованному/архиву внутрь /путь/vhosts Делаем правку в /etc/hosts - добавляем в начало 127.0.0.1 test.localhost 127.0.0.1 www.test.localhost Устанавливаем xammp командой yay -S xampp Делаем правки в /opt/lampp/etc/extra/httpd-vhosts...
1 месяц назад
Как создать статический сайт без базы данных: простой и элегантный подход с Lua и GTK
Хотите запустить собственный сайт, но не хотите возиться с WordPress, базами данных или хостингом? Есть отличное решение — статический генератор сайтов, который работает только с XML-файлами и HTML-шаблонами. В этой статье расскажу, как легко создавать и управлять контентом сайта с помощью двух бесплатных инструментов: luassg (генератор на Lua) и entity_xml_crud_app (графический редактор на Python + GTK). Видео запуска программы entity_xml_crud_app Что такое статический сайт? Статический сайт — это набор обычных HTML-файлов, которые отдаются браузеру «как есть»...
2 месяца назад
Выполняем запрос к нейросети в Интернете по локальной базе знаний с помощью OpenRouter
Подготовительными мероприятиями для данной цели являются установка ollama и модели mxbai-embed-large, а также тестового набора данных в виде текстовых файлов для создания векторной базы знаний согласно заметке Затем создаем в каталоге ~/myrag файл openroutereq.py c исходным кодом: import chromadb import requests import json import os # === 🔐 Вставьте ваш OpenRouter API ключ === OPENROUTER_API_KEY = "sk-..." # 👈 ЗАМЕНИТЕ НА СВОЙ КЛЮЧ # === 🧠 Выберите бесплатную модель === MODEL = "deepseek/deepseek-chat-v3...
6 месяцев назад
Использование своего набора данных для локальной нейросети
Цель: взять базу знаний в виде текстовых файлов и векторизовать ее для нахождения подходящего контекста по пользовательскому запросу и синтеза ответа нейросетью. Алгоритм действий: Устанавливаем ollama для запросов к локальной нейросети yay -S ollama sudo systemctl start ollama.service Скачиваем модели для ollama: ollama pull mxbai-embed-large ollama pull llama3:8b Создаем каталог, в котором будет хранится векторная база chromadb mkdir /home/username/persistent/store -p Создаем каталог, в котором...
6 месяцев назад
Фильтрация и агрегирование данных в n8n с использованием Python, C++ и JS
Вместо пространного предисловия: Настоящее программирование начинается там, где появляются большие данные. Задача: - Сформировать файл numbers.txt из большого числа случайных чисел от нуля до девяти, считать число чисел равным N=500 000. Числа должны быть записаны построчно, по одному на одной строке, каждая строка заканчивается переводом каретки. - Выбрать из файла все числа меньше двух и больше 7 - Посчитать сумму выбранных чисел - Записать ответ в файл output.txt Решение: Примечание: Опускаем для краткости создание каталога /EX/n_input для данной задачи...
6 месяцев назад