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

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

Контент: https://taplink.cc/atrotsenko
Download Telegram
Соискатели

В канун Нового года предлагаю поговорить о действительно важных вещах 🤨

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

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

Что же тогда совместно ищут соискатели, и, главное, совместно с кем? Диссертации то, по сути, авторские.

Наверное, все ищут научную истину. Только аспиранты делают это в стенах университета, а соискатели - дома за компом. Но тогда и аспиранты тоже должны называться соискателями 🤨!
Но не называются.

Короче, вопрос открыт 🤷‍♂️

---

А пока вы раздумываете над "соискателями", принимайте поздравление с наступающим Новым годом!
🧦🎁🌲
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉9🔥3
#include <iostream>

struct A
{
int a1;
int a2;
void afoo() {}
};

struct B
{
int b1;
int b2;
};

int main()
{
std::cout << (sizeof(A) == sizeof(B)) << std::endl;
return 0;
}
Выше дан код на C++. Какой вывод будет у программы?
Anonymous Quiz
59%
0
34%
1
7%
4
0%
8
CMake. Подключение внешних библиотек

По просьбе трудящихся учащихся записал видео-инструкцию по подключению внешних библиотек в проектах на CMake.

Рассмотрены 2 способа подключения:

1. С использованием функции find_package(). Способ самый простой и лаконичный.

2. Прямое подключение заголовочных файлов и библиотек с использованием функций target_include_directories(), target_link_directories().

Второй способ подойдет, если библиотека поставляется без конфигурационных файлов вида *Config.cmake. В остальных случаях лучше использовать первый способ.

В качестве примера подключается библиотека Qt.

В следующий раз рассмотрим организацию проекта на CMake с созданием и подключением собственных библиотек.

📱 YouTube | 📱 ВКонтакте
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5
Исключение или код ошибки

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

И главная проблема - решить, какой из этих способов использовать в своем проекте. А мнений тут не одно и не два 🤭

Я обычно использую и то, и другое, руководствуясь следующим:

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

Далее:

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

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

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

🔜 Исключения C++ не ABI-совместимые и это надо учитывать. Если отдельные компоненты программы собраны разными компиляторами, то исключение, брошенное из одного компонента, не может быть обработано другим компонентом. Тут - только коды ошибок.

И последнее:

🔜 Если на проекте определена стратегия обработки ошибок, то надо просто ей следовать.

А что используете вы?
👍 - исключения,
🔥 - коды ошибок,
🤓 - it depends
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2🤓1
int main()
{
char const* buf = "hello";
++buf; // 1
buf[0] = 'u'; // 2
return 0;
}
Выше дан код на C++. В каком месте будет ошибка компиляции?
Anonymous Quiz
31%
1
31%
2
9%
Ошибок нет
28%
Оба места с ошибкой
Павлов об уме

Прошлым летом я посетил дом Ивана Петровича Павлова в Рязани (на фото). Да, того самого Павлова, который на собаках что-то там исследовал.

По своему обыкновению я приобрел местной литературки со сборником лекций Ивана Петровича. Лекции, конечно, производят впечатление. Особенно зацепили выводы о нашем уме. Именно нашем, не собак. Потому что собаки собаками, а все таки они у Павлова были инструментом познания человека.
Уже 18 лет, как я занимаюсь изучением высшей нервной деятельности на одном близком и родном для нас животном, на нашем друге - собаке. И можно себе представить, что то, что в нас сложно, у собаки проще, легче выступает и оценивается.


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

По Павлову к сосредоточенности "мы не наклонны". Предпочитаем скорее беготню мысли.
Возьмем наши заседания. ... До чего заседания длинны, многоречивы и в большинстве случаев безрезультатны и противоречивы! Мы проводим многие часы в бесплодных, ни к чему не ведущих разговорах. Ставится на обсуждение тема, и сначала обыкновенно и благодаря тому, что задача сложная, охотников говорить нет. Но вот выступает один голос, и после этого уже все хотят говорить, говорить без всякого толку, не подумав хорошенько о теме, не уясняя себе, осложняется ли этим решение вопроса или ускоряется.


Ничего не напоминает? Совещание, митинг, статус, дейлик, ретро - как хотите назовите 😵‍💫
Согласитесь, что хотя бы раз, но вы ловили себя на мысли: "что мы здесь вообще делаем..."

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


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

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

Молодой ум - ум философский. ... Молодой ум восприимчивый, свободный, без предрассудков.


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


Думай головой, пока молодой 😉
Я бы сюда добавил еще один аргумент: свободное время. Чем мы моложе, тем его больше. Надо этим пользоваться.

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

#КнижнаяПолка
Please open Telegram to view this post
VIEW IN TELEGRAM
🤓5❤2
Red Team или Blue Team

Оба термина относятся к информационной безопасности.

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

Blue Team - это команда защиты информационной системы, призванная обнаруживать и предотвращать кибератаки.

#Словарь
👍3🤓2
#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;
}


Тест 🔽