Так себе программист
98 subscribers
185 photos
7 videos
1 file
183 links
Меня зовут Александр Троценко. Разработчик, преподаватель, к.т.н. Пишу о программировании и профессии.

10 лет в разработке desktop на C/С++

Контент: https://taplink.cc/atrotsenko
Download Telegram
Логирование в космосе

В 1965 году Алексей Леонов совершил первый выход в открытый космос. На последнем инструктаже главный конструктор Сергей Королев сказал Леонову:
- Прошу быть предельно внимательным и обо всем, что делаешь, докладывай, как минёр, - мы должны знать, где оборвется песня... Если она оборвется.

🔽🔽🔽

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

📍 Алексей Леонов "Время первых. Судьба моя - я сам..."

#КнижнаяПолка
❤3🔥1🤔1
Атрибуты в C++

В C++ есть стандартные атрибуты, с помощью которых мы можем управлять предупреждениями компилятора и добавлять ясности в код.

Например:

[[deprecated]] - говорит компилятору, что эта сущность устарела и лучше ее не использовать. В случае использования компилятор сгенерирует предупреждение.
Атрибут может применяться с классами, функциями, переменными и др.

[[fallthrough]] - говорит компилятору, что в этом месте конструкции switch case оператор break пропущен намеренно. При наличии этого атрибута компилятор не выдаст предупреждение об отсутствии break.

[[maybe_unused]] - говорит компилятору, что указанная сущность действительно может быть не использована, поэтому ругаться не нужно.
Может применяться с классами, функциями, аргументами функций, переменными и др.

[[nodiscard]] - говорит компилятору, что никто не может игнорировать возвращаемое значение указанной функции. То есть если мы вызвали функцию и никак не обработали ее возврат, то компилятор выдаст предупреждение.
Может применяться с классами, функциями и перечислениями.

[[noreturn]] - говорит компилятору, что указанная функция никогда ничего не вернет вызывающей функции, то есть она завершает программу, бросает исключение или висит в бесконечном цикле. А если мы вдруг напишем в такой функции return, то компилятор выдаст предупреждение.

И все бы хорошо, но я, честно говоря, забываю про существование этих атрибутов 😵‍💫
Дремучий стал, что ли.

🔤🔤🔤 Плюсовики, а вы используете у себя атрибуты? Как широко? Какие используете, а какие вам и даром не нужны?
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Ну и не отходя от кассы, вспомним switch case и проверим себя.

(не надо искать подвох, все прозрачно)

#include <iostream>

int main()
{
switch(1)
{
case 1:
std::cout << "1";
[[fallthrough]];
case 2:
std::cout << "2";
break;
default:
std::cout << "0";
}
return 0;
}


Тест 🔽
Выше дан код на C++. Какой вывод будет у программы?
Anonymous Quiz
48%
12
15%
10
15%
1
21%
Никакой
🤯2
255 + 1

Интернеты говорят, что в Швейцарии запрещены поезда с 256-ю колесными осями 🫸 🚂

Дело в датчиках, установленных на путях. Датчики считают проходящие колеса вагонов. В качестве счётчика используется 8-битная переменная, обращающаяся в 0 на 256-ом инкременте. То есть происходит целочисленное переполнение переменной через верхнюю границу.

Получается, что состав на 256-ти "катках" будет невидимым для системы управления!

Жуть, да? Можно наворотить "пункт назначения" IRL 😨

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

Ну или как обычно: программист уволился и унёс с собой секрет рецепта "спагетти" 😁
😁5🤔2
Лог медленных запросов в MySQL

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

Запросов много, какой именно тормозит не понятно. Хотя опытному глазу может быть и понятно, но у нас - неопытный глаз.

Чтобы найти корень зла, мы включим лог медленных запросов и просто посмотрим, какой запрос туда попадёт. В MySQL такой лог включается в файле конфига my.cnf:

slow-query-log      = 1
slow-query-log-file = /var/log/mysql/mysql-slow.log
long_query_time = 3


Здесь long_query_time равен 3-м секундам. То есть в лог попадут запросы, выполняющиеся более 3-х секунд.

После изменения файла конфига перезапускаем myslq:
/etc/init.d/mysql restart


Теперь "тормознутый" запрос зафиксируется в логах. Записи будут иметь примерно такой вид:
# Time: 250203  15:30:10
# User@Host: dbuser[dbname] @ hostname [] Id: 7
# Query_time: 13.987460 Lock_time: 0.013977 Rows_sent: 1 Rows_examined: 19604512
SET timestamp=1738585810;
SELECT count(*) FROM MY_SLOW_TABLE;


Отсюда мы узнаём: время выполнения запроса Query_time, количество обработанных строк Rows_examined и сам SQL-запрос. Остается дело за малым: оптимизировать 😈

В лог медленных запросов умеет не только MySQL. В других СУБД тоже есть подобное. Используйте.

О том как подобным образом измерить время выполнения функций в C++, читайте мою инструкцию Профилирование C++ кода в Visual Studio без инструментирования.
👍4🔥1
Как создать 3D модель OpenCASCADE на C++ в среде QtCreator

В новом видео мы рассмотрим создание нашего первого приложения на OpenCASCADE в C++. Мы построим 3D модель тора и выведем её в файлы 2-х форматов: STEP и STL.

OpenCASCADE - это ядро геометрического моделирования в области систем автоматизированного проектирования (САПР). Например, с использованием библиотек OpenCASCADE создан свободный САПР FreeCAD.

Вывод созданной модели в файл позволит нам не делать самостоятельно визуализацию модели. Визуализируем с помощью внешних приложений. Формат STEP используется в САПР для хранения параметрических моделей. Для его просмотра будем использовать FreeCAD. Формат STL хранит полигональную модель, которую мы откроем в Blender.

✍️ Статья | 📱 YouTube | 📱 ВКонтакте
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
#include <iostream>

double a = 2;

int main()
{
int a = 1;
std::cout << a / ::a << std::endl;
return 0;
}
Выше дан код на C++. Какой вывод будет у программы?
Anonymous Quiz
38%
Никакой. Ошибка сборки
7%
2
45%
0.5
10%
"1 / 2"
XY-проблема

Представим себе вопрос в интернетах:
Привет! У меня треснул микроскоп. Как его держать в следующий раз, чтобы он не треснул?


🤷‍♂️ Даже и не найдешься сразу, что ответить. Действительно, как держать?

Но после некоторых выяснений вопрос становится таким:
Я пытался забить гвоздь микроскопом и он треснул. Как его держать, чтобы он не треснул? Или что использовать вместо него?


Вуаля! Теперь и дошкольник сообразит с ответом.

Это - типичная "Ошибка молотка" или XY-проблема. XY-проблема возникает, когда мы задаем неправильный вопрос по своей проблеме.

Обычно путь к XY-проблеме выглядит так:
1️⃣ Пусть нам надо решить проблему X.
2️⃣ Мы думаем, что для решения проблемы X подойдет метод Y.
3️⃣ У нас что-то не получается с методом Y.
4️⃣❌ Мы начинаем задавать вопрос по методу Y.

Хотя на самом деле надо задавать вопрос по проблеме X.

У меня недавно был кейс с похожей ситуацией. Нужно было ответить, как повысить производительность пагинации таблицы (постраничный просмотр). Однако в результате выяснилось, что дело не в пагинации, а в работе фильтров. То есть тормоза таблицы (проблема X) не были связаны с механизмом пагинации (метод Y), по которому был задан вопрос.

Помните об XY-проблеме всегда: и когда задаете вопрос, и когда на вопрос отвечаете.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🤔2❤1🎉1🕊1
#include <iostream>

int main()
{
int a = 1;
int& b = a;

++a;
++b;

std::cout << a << b << std::endl;
return 0;
}
Выше дан код на C++. Какой вывод будет у программы?
Anonymous Quiz
17%
12
30%
22
27%
23
27%
33
Путаница в интерфейсах (часть 4)

➕1️⃣в копилочку.

Все в диалоге хорошо, кроме отступа между кнопками.

Дело усугубляется тем, что это мобильный интерфейс. Легко промазать, когда палец накрывает обе кнопки сразу.
Еще и одна из кнопок красная 🔴😬
Усиливает ответственность момента)

P.S. Конкретно в этом случае я сомневаюсь, что так сделано нарочно. Скорее всего просто поплыли стили.

—

Читать "Путаница в интерфейсах (часть 3)"
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Улучшение процессов на примере C3D Labs

👨‍💻 Много лет вы вели монолитную кодовую базу на SVN. Всё налажено, работает, все привыкли. Но вы понимаете, что процесс не вывозит возросшую сложность проекта. Надо развиваться, переходить на современные инструменты. Надо, но страшно. Работает же, привыкли.

Знакомо?

Если да, то посмотрите на опыт команды C3D Labs. У них в 2022 году была та же история: монолит на SVN, линейная работа в одну ветку, долгий процесс доставки... Но команда была намерена (или вынуждена 🙂) развиваться и пошла следующим путем:

1️⃣ Перешли с SVN на Git на базе GitLab, принципиально не меняя схему работы (2022 год).

2️⃣ Начали использовать фича-ветки, постепенно уходя от линейности.

3️⃣ Внедрили работу с ветками через Merge Request.

4️⃣ Освоили встроенный процесс Code Review.

5️⃣ Внедрили менеджер управления зависимостями Conan (2023 год).

6️⃣ Модернизировали систему тестирования.

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

И уже не так страшно, правда?

📍 Читайте всю статью здесь: Об изменениях в процессе доставки геометрического ядра C3D
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
#include <iostream>

class Data
{
char* text;
public:
void init(const Data& other)
{
std::cout << "1";
text = other.text;
}

void init(Data&& other)
{
std::cout << "2";
text = other.text;
}
};

Data createData()
{
return Data();
}

int main()
{
Data a, b, c, d;
b.init(a);
c.init(Data());
d.init(createData());
return 0;
}


Если тяжело ответить на тест, жмите подсказку ⤵️
Надо вспомнить про rvalue-ссылки и временные объекты в C++.
Выше дан код на C++. Какой вывод будет у программы?
Anonymous Quiz
36%
112
0%
211
14%
221
50%
122
Завандалил

Глядя на разрисованный лифт, я вспомнил случай с моими студентами.

На картинке выше фрагмент гугло-дока, куда ребята должны были самостоятельно вписать выбранные темы курсовых работ. Они это и сделали, все большие молодцы)

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

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

Почему, зачем? Да кто его знает. Потому что может. Потому что анонимно. Человек сам же там написал: "анонимочка так что по..."

🤦‍♂️

Анонимность и безнаказанность воистину срывают тормоза.
Please open Telegram to view this post
VIEW IN TELEGRAM
😁2
Как создать оконное приложение на Qt в среде QtCreator

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

Библиотека Qt - это набор классов C++ для создания кросс-платформенных приложений с графическим интерфейсом. С помощью этой библиотеки созданы, например, среда разработки QtCreator и инструмент для записи видео OBS Studio.

✍️ Статья | 📱 YouTube | 📱 ВКонтакте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
namespace std
{
struct A
{
int _array[256];
bool _filled;
};
}

bool is_filled(std::A obj)
{
return obj._filled;
}

int main()
{
std::A a;
return is_filled(a);
}


🎉 У нас новый формат интерактива: код-ревью!

Выше дан код на C++. Проведите код-ревью и напишите в комментариях свои замечания. Если ваши замечания уже кто-то написал, ставьте палец 👍 комментатору)

Лично мне здесь принципиально не нравятся 4 момента 🧐
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4