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

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

Контент: https://taplink.cc/atrotsenko
Download Telegram
#include <iostream>

int main()
{
int a = 1, b = 3, c = 6, d = 8;
d += c = b += a;
std::cout << d << std::endl;
return 0;
}
Выше дан код на C++. Какой вывод будет у программы?
Anonymous Quiz
20%
4
7%
8
70%
12
3%
15
Сопротивление новому

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

1️⃣ - извозчики в Москве, которые недолюбливали водителей машин и искали возможность их подколоть на поломках техники. Машины тогда только появлялись и сновали по улицам вперемежку с гужевым транспортом.
Если же у автомобиля посередине улицы глох мотор или случалась какая-нибудь другая неприятность, шофёр подвергался издёвкам со стороны почтенных, бородатых извозчиков. Эти представители умирающего средства передвижения были очень рады, когда приключалась беда с передовым транспортом.
Если приходилось подливать воду в закипевший радиатор грузовика, они «сочувственно» подсказывали:
– Овса, овса теперь маленько подсыпь, она и пойдёт!… Без овса далеко не уедешь. Уж мы-то знаем…
И тут они поднимали хохот на всю улицу.
Теперь, когда я еду по блестящим магистралям столицы, мне кажется, что это совсем другой город, а тот, по которому я ездил более сорока лет назад, существует только в моих воспоминаниях.


2️⃣ пример - когда те же извозчики, но уже на востоке, не обрадовались появлению авиации. Водопьянов тогда перегонял самолет для работы на маршруте Хабаровск-Сахалин:
А вот в большом селе Мариинском, где была тоже предусмотрена посадка, нас встретили очень недружелюбно. Никто не позвал даже в дом погреться, выпить чаю. В чём дело? Оказывается, в селе жило много богатеев, которые хорошо зарабатывали на извозном промысле. Они держали по многу лошадей и кучеров и за большие деньги брались перевозить людей через Татарский пролив. Кулаки не без причин смотрели на лётчиков как на опасных конкурентов. Самолёт приходил на смену лошадям, напряжённым в розвальни. Встретились в селе на берегу Амура прошлое с будущим.


🔽🔽🔽

Как же мне всё это напоминает сегодняшнее сопротивление со стороны части разработчиков развивающимся чат-ботам ИИ. Чего стоит только битва на Хабре между авторами, поющими оды ИИ как вундервафле, и теми, кто смеется: "Все это пустая ерунда!"

Истина, наверное, где-то между. А если так, то игнорировать инструменты ИИ будет нерационально.

Поэтому можно и лошадку пока оставить, но и мотор завести 😉

📍 Водопьянов М.В. "Полярный летчик"

#КнижнаяПолка
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍2
Дорожная карта разработчика

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

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

На Developer Roadmaps собрано множество дорожных карт, разделенных по специализациям и технологиям:

🔜 Каждая карта содержит последовательность тем с обозначенным уровнем сложности.

🔜 Темы сопровождаются содержательными тезисами с практическими примерами.

🔜 Некоторые темы предлагают материалы для дополнительного изучения.

🔜 Есть возможность отслеживания прогресса обучения при регистрации на ресурсе.

Также вы можете создавать свои собственные карты и делиться ими с сообществом. Или не делиться 🤐🤫

Пользуйтесь)

📍 https://roadmap.sh
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👌1
#include <iostream>

struct A
{
uint32_t a:4;
uint32_t b:4;
uint32_t c:8;
uint32_t d:16;
};

struct B
{
uint32_t a:4;
uint32_t b:4;
};

int main()
{
A a;
B b;
std::cout << int(sizeof(a) == sizeof(b));
return 0;
}
Выше дан код на C++. Какой вывод будет у программы?
Anonymous Quiz
27%
0
32%
1
9%
4
32%
Никакой. Ошибка компиляции
🤬1
Путаница в интерфейсах (часть 3)

Спонтанное желание писать пост 😡

Я случайно одним махом удалил поля из более чем 700 своих заметок в Obsidian! Я не хотел, но интерфейс поспособствовал.

Смотрите скриншот. У таблицы есть поле "Изучить". Я могу его скрыть или удалить. Две кнопочки рядом. И одна из них фатальная. Не просто так она выделена красным.

Ну и конечно же я ПРОМАЗАЛ! Не нарочно. Я хотел скрыть столбец и просто не попал в "Hide field".

И началось! Столбец исчез и следом загудел комп. Стало понятно, что пошло удаление поля "Изучить" из всех файлов в хранилище! Мне оставалось сидеть и наблюдать. Отменить действие нельзя!

И хорошо, что это был столбец "Изучить". Жалко, но не катастрофа. А вот если бы я так удалил столбец "Ссылка"... ууух😨

Ладно.

Зато подвернулся повод напомнить всем разработчикам:

Если удаление чего-либо нельзя отменить, то мы обязаны запросить у пользователя подтверждение!

—-

Читать "Путаница в интерфейсах (часть 2)"
😱4😢2
Логирование в космосе

В 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