🤔 Очередной #дайджест материалов по C++
♦️ Shared, TO, PLOT: друзья или враги — тестирование вызовов функций, вызовов указателей на функции и производительность виртуальных вызовов
♦️ «Есть вопросы, на которые не ответит даже наниматель»: три истории о собеседованиях разработчиков на С++ — как проводить технические интервью, говорить про алгоритмы без синтетических задач и оценить знания кандидата
♦️ Great .NET 8 Hack — узнаете, как создавать облачные нативные приложения, ИИ-приложения или приложения .NET MAUI с использованием последней версии .NET.
♦️ Хранение данных в Entity Component Systems — как ECS упорядочивает ваши данные для оптимизации скорости выполнения итераций
♦️ Как подключиться к Flutter приложению в режиме нативного debug на ОС Аврора — подключение к нативной части ОС Авроры для тестирования нативной части Flutter-приложения
♦️ Shared, TO, PLOT: друзья или враги — тестирование вызовов функций, вызовов указателей на функции и производительность виртуальных вызовов
♦️ «Есть вопросы, на которые не ответит даже наниматель»: три истории о собеседованиях разработчиков на С++ — как проводить технические интервью, говорить про алгоритмы без синтетических задач и оценить знания кандидата
♦️ Great .NET 8 Hack — узнаете, как создавать облачные нативные приложения, ИИ-приложения или приложения .NET MAUI с использованием последней версии .NET.
♦️ Хранение данных в Entity Component Systems — как ECS упорядочивает ваши данные для оптимизации скорости выполнения итераций
♦️ Как подключиться к Flutter приложению в режиме нативного debug на ОС Аврора — подключение к нативной части ОС Авроры для тестирования нативной части Flutter-приложения
🧑💻🪜 6 карьерных советов программисту
Советы, которые подойдут джуниорам, мидлам и сеньорам.
#туториал
Читать статью
Советы, которые подойдут джуниорам, мидлам и сеньорам.
#туториал
Читать статью
Паттерн Strategy
Паттерн Strategy — это паттерн проектирования, который позволяет определять семейства связанных алгоритмов и делать их взаимозаменяемыми.
Это дает возможность выбирать конкретный алгоритм во время выполнения программы.
Основная идея паттерна Strategy заключается в том, чтобы вынести алгоритмы в отдельные классы-стратегии и передавать нужную стратегию в клиентский код.
Это паттерн используется, когда:
— Нужно использовать разные варианты одного и того же алгоритма в разных ситуациях.
— Нужно легко добавлять новые стратегии, не меняя существующий клиентский код.
— Нужно избавиться от условных операторов, выбирающих алгоритм.
#код
Паттерн Strategy — это паттерн проектирования, который позволяет определять семейства связанных алгоритмов и делать их взаимозаменяемыми.
Это дает возможность выбирать конкретный алгоритм во время выполнения программы.
Основная идея паттерна Strategy заключается в том, чтобы вынести алгоритмы в отдельные классы-стратегии и передавать нужную стратегию в клиентский код.
Это паттерн используется, когда:
— Нужно использовать разные варианты одного и того же алгоритма в разных ситуациях.
— Нужно легко добавлять новые стратегии, не меняя существующий клиентский код.
— Нужно избавиться от условных операторов, выбирающих алгоритм.
#код
🚩 Итог одной валютной удаленки: проработал месяц бесплатно и ушел с долгами
Изумительная история фронтендера, который целый месяц работал без зарплаты и даже остался должен своему работодателю $1609
#почитать
Читать статью
Изумительная история фронтендера, который целый месяц работал без зарплаты и даже остался должен своему работодателю $1609
#почитать
Читать статью
🏃🏃♂️ Библиотека libopencm3. Работа с USART, прерываниями, I2C и таймерами
В заключительной части (это и это — предыдущие части, в которых происходит вся подготовительная кухня) рассматривается взаимодействие микроконтроллера с окружающим миром с помощью USART — интерфейса, позволяющего организовать взаимодействие с человеком при помощи текста.
Цель: отправить в USART строчку «Hello from LibOpenCM3!» Параметры подключения должны быть: скорость 9600, 8 бит данных, один стоп-бит, проверка четности выключена.
Изучить материал
#туториал
В заключительной части (это и это — предыдущие части, в которых происходит вся подготовительная кухня) рассматривается взаимодействие микроконтроллера с окружающим миром с помощью USART — интерфейса, позволяющего организовать взаимодействие с человеком при помощи текста.
Цель: отправить в USART строчку «Hello from LibOpenCM3!» Параметры подключения должны быть: скорость 9600, 8 бит данных, один стоп-бит, проверка четности выключена.
Изучить материал
#туториал
Подборка лучших статей «Библиотеки C/C++ разработчика» за октябрь: сохраняй в заметки, чтобы не пропустить #самыйсок
💪 6 сервисов для подготовки к техническим собеседованиям
🛡️ 8 способов защиты от манипуляций на работе
👩💻 Женщины в ИТ: проблемы и преимущества сложной профессии
👨💻 9 трендов в найме айтишников в 2023 году
🧠 Как научиться критически мыслить: 6 эффективных способов
💪 6 сервисов для подготовки к техническим собеседованиям
🛡️ 8 способов защиты от манипуляций на работе
👩💻 Женщины в ИТ: проблемы и преимущества сложной профессии
👨💻 9 трендов в найме айтишников в 2023 году
🧠 Как научиться критически мыслить: 6 эффективных способов
Принцип YAGNI
Принцип YAGNI (You Ain't Gonna Need It), который также известен как «Не добавляйте функциональность, пока она не понадобится».
В контексте С++ это означает, что при проектировании и разработке программы вы должны избегать лишней сложности, излишних функций и структур данных, которые не требуются на текущем этапе разработки. Вместо этого фокусируйтесь на решении актуальных задач и добавлении только тех функций, которые необходимы для выполнения текущих требований.
Этот принцип помогает избежать излишней сложности кода, упростить его поддержку и обеспечить более гибкую архитектуру, которая может легко адаптироваться к будущим изменениям и требованиям.
#код
Принцип YAGNI (You Ain't Gonna Need It), который также известен как «Не добавляйте функциональность, пока она не понадобится».
В контексте С++ это означает, что при проектировании и разработке программы вы должны избегать лишней сложности, излишних функций и структур данных, которые не требуются на текущем этапе разработки. Вместо этого фокусируйтесь на решении актуальных задач и добавлении только тех функций, которые необходимы для выполнения текущих требований.
Этот принцип помогает избежать излишней сложности кода, упростить его поддержку и обеспечить более гибкую архитектуру, которая может легко адаптироваться к будущим изменениям и требованиям.
#код
🤔 Очередной #дайджест по С++
✅ Использование переменных шаблонов для решения крошечной задачи — как шаблоны переменных могут быть использованы для улучшения читаемости
✅ Создавайте надежные и защищенные программы на C++ — как и какие инструменты использовать для создания
✅ Язык Janet для смертных — раскрываются различные аспекты работы с языком, объяснение синтаксиса и некоторых приемов программирования
✅ Структурированная диагностика в новом окне — рассказ о безумно полезном инструменте, о котором не все знают
✅ Приключения ржавого — как выдрать экранчик из принтера и соорудить поделку😂
✅ Использование переменных шаблонов для решения крошечной задачи — как шаблоны переменных могут быть использованы для улучшения читаемости
✅ Создавайте надежные и защищенные программы на C++ — как и какие инструменты использовать для создания
✅ Язык Janet для смертных — раскрываются различные аспекты работы с языком, объяснение синтаксиса и некоторых приемов программирования
✅ Структурированная диагностика в новом окне — рассказ о безумно полезном инструменте, о котором не все знают
✅ Приключения ржавого — как выдрать экранчик из принтера и соорудить поделку😂
#вопросы_с_собеседования
Перед вами два примера кода для печати вектора. Есть ли преимущества использования одного или другого?
Пример 1:
Пример 2:
Хотя оба кода будут генерировать одинаковые выходные данные, пример 2 является более производительным вариантом. Это связано с тем, что оператор после инкремента itr++ обходится дороже, чем оператор перед инкрементом ++itr.
Оператор пост-инкремента генерирует копию элемента, прежде чем приступить к увеличению элемента и возврату копии. Более того, большинство компиляторов автоматически оптимизируют пример 1, неявно преобразуя его в пример 2.
Перед вами два примера кода для печати вектора. Есть ли преимущества использования одного или другого?
Пример 1:
c++
vector vec;
/* ... .. ... */
for (auto itr = vec.begin(); itr != vec.end(); itr++) {
itr->print();
}
Пример 2:
c++
vector vec;
/* ... .. ... */
for (auto itr = vec.begin(); itr != vec.end(); ++itr) {
itr->print();
}
🚶👣 На пути из Web к Native
Рассказ о трудностях, которые могут ожидать неопытного человека, который соблазнится нативным программированием.
Имея небольшой опыт в веб-программировании, автору казалось, что все не так плохо. И так по началу и было. За вопрос он взялся основательно: без задачи — нет учебы.
Он решил поставить перед собой большую цель: давным-давно, играя в ммо, наткнулся на бот-программу, так называемый пакетный кликер. Она отправляла запросы на сервер и заставляла персонажа выполнять в автоматическом режиме невообразимые вещи, что очень впечатлило. По заявлениям автора, он ее сделал всего за 3 часа. И вот, уже не маленький автор решил, что должен сделать так же.
Бота выбрал по ряду причин:
➖ Работа с ассемблером.
➖ Какой-никакой GUI.
➖ Сборка и импорт библиотеки.
➖ Мечта детства.
Начал с реверсинга, попал на форум Tuts4You и прошел челлендж, состоящий из 40ка reverse_me.
Продолжение истории тут
#почитать
Рассказ о трудностях, которые могут ожидать неопытного человека, который соблазнится нативным программированием.
Имея небольшой опыт в веб-программировании, автору казалось, что все не так плохо. И так по началу и было. За вопрос он взялся основательно: без задачи — нет учебы.
Он решил поставить перед собой большую цель: давным-давно, играя в ммо, наткнулся на бот-программу, так называемый пакетный кликер. Она отправляла запросы на сервер и заставляла персонажа выполнять в автоматическом режиме невообразимые вещи, что очень впечатлило. По заявлениям автора, он ее сделал всего за 3 часа. И вот, уже не маленький автор решил, что должен сделать так же.
Бота выбрал по ряду причин:
➖ Работа с ассемблером.
➖ Какой-никакой GUI.
➖ Сборка и импорт библиотеки.
➖ Мечта детства.
Начал с реверсинга, попал на форум Tuts4You и прошел челлендж, состоящий из 40ка reverse_me.
Продолжение истории тут
#почитать
🤓🧑🎓 Синтаксический разбор CSV строчек
В программировании микроконтроллеров часто надо производить синтаксический разбор (парсинг) CSV строчек. CSV это просто последовательность символов, которые разделены запятой (или любым другим одиночным символом: ; | /).
1️⃣ CSV строчки можно, например, повстречать в NMEA протоколе от навигационных GNSS приемников. Вот пример NMEA протокола:
2️⃣ Потом, любой URL (например https://proglib.io/) это, в сущности, та же самая пресловутая CSV строчка, где разделитель это /.
3️⃣ Также компонент CSV позволит одной строчкой в UART-CLI консоли прошивки распознавать и запускать на исполнение последовательно сразу несколько shell команд.
4️⃣ Прошивка может запросто логировать на SD карту по SPI данные в CSV формате как в файл на FatFS. Потом этот текстовый *.csv файлик можно будет открыть на LapTop(е) любым процессором электронных таблиц.
Продолжение здесь
В программировании микроконтроллеров часто надо производить синтаксический разбор (парсинг) CSV строчек. CSV это просто последовательность символов, которые разделены запятой (или любым другим одиночным символом: ; | /).
1️⃣ CSV строчки можно, например, повстречать в NMEA протоколе от навигационных GNSS приемников. Вот пример NMEA протокола:
$GNGGA,102030.000,5546.95900,N,03740.69200,E,1,08,2.0,142.0,M,0.0,M,,*
$GNGLL,5546.95900,N,03740.69200,E,102030.000,A,A*
$GNGSA,A,3,10,16,18,20,26,27,,,,,,,4.8,2.0,4.3,1*
$GNGSA,A,3,19, , , , , ,,,,,,,4.8,2.0,4.3,4*
$GNGSA,A,3,82, , , , , ,,,,,,,4.8,2.0,4.3,2*
2️⃣ Потом, любой URL (например https://proglib.io/) это, в сущности, та же самая пресловутая CSV строчка, где разделитель это /.
3️⃣ Также компонент CSV позволит одной строчкой в UART-CLI консоли прошивки распознавать и запускать на исполнение последовательно сразу несколько shell команд.
4️⃣ Прошивка может запросто логировать на SD карту по SPI данные в CSV формате как в файл на FatFS. Потом этот текстовый *.csv файлик можно будет открыть на LapTop(е) любым процессором электронных таблиц.
Продолжение здесь
💹⚖️ Измерение частоты на STM32
Рассказ о различных методах измерения частоты прямоугольного сигнала с помощью микроконтроллера STM32.
В процессе работы над одной из железок у автора возникла необходимость организовать несколько выводов, которые бы измеряли частоту входного сигнала. Опробовав несколько разных вариантов, он решил, что негоже примерам пылиться на задворках диска D и стоит ими поделиться с сообществом.
Начальные условия: частота входного сигнала от 0 до 10 кГц. Микроконтроллер STM32F103C8T6, всем известная плата bluepill. Библиотека HAL. Источником сигнала, частота которого будет измеряться, для проверки работоспособности будет служить двухканальный генератор частоты JDS6600. Будет использовать модуль CH340G (Преобразователь USB — UART) для передачи данных в терминал (terminal v1.9b) для наглядности. В него будет посылаться полученное после обработки значение.
Читайте дальше тут
#туториал
Рассказ о различных методах измерения частоты прямоугольного сигнала с помощью микроконтроллера STM32.
В процессе работы над одной из железок у автора возникла необходимость организовать несколько выводов, которые бы измеряли частоту входного сигнала. Опробовав несколько разных вариантов, он решил, что негоже примерам пылиться на задворках диска D и стоит ими поделиться с сообществом.
Начальные условия: частота входного сигнала от 0 до 10 кГц. Микроконтроллер STM32F103C8T6, всем известная плата bluepill. Библиотека HAL. Источником сигнала, частота которого будет измеряться, для проверки работоспособности будет служить двухканальный генератор частоты JDS6600. Будет использовать модуль CH340G (Преобразователь USB — UART) для передачи данных в терминал (terminal v1.9b) для наглядности. В него будет посылаться полученное после обработки значение.
Читайте дальше тут
#туториал
std::array и std::vector
std::array — это обёртка вокруг обычного массива, фиксированного размера, а std::vector — это динамически расширяемый массив. std::array хранит свои данные в стековой памяти, а vector выделяет память в куче (динамическая память). У std::array в параметрах шаблона указывается тип хранимых элементов и размер массива. А у std::vector - тип элементов и ещё возможно указать аллокатор, который нужно использовать при выделении памяти (с помощью new). std::array чуть лучше по производительности в случае небольшого массива, чем std::vector, который содержит в себе несколько указателей, указывающих на выделенный в куче кусок памяти.
std::array — это обёртка вокруг обычного массива, фиксированного размера, а std::vector — это динамически расширяемый массив. std::array хранит свои данные в стековой памяти, а vector выделяет память в куче (динамическая память). У std::array в параметрах шаблона указывается тип хранимых элементов и размер массива. А у std::vector - тип элементов и ещё возможно указать аллокатор, который нужно использовать при выделении памяти (с помощью new). std::array чуть лучше по производительности в случае небольшого массива, чем std::vector, который содержит в себе несколько указателей, указывающих на выделенный в куче кусок памяти.
Что используется для ручного написания таблицы подстановки?
Anonymous Quiz
5%
std:find
49%
std:map
21%
std:lookup
21%
Ничего из вышеперечисленного
4%
Свой вариант
🤔 очередной #дайджест по С++
🟢 С++ производительность и щепотка безопасности — обсуждение того, за что программисты любят C++
🟢 Как сравнить целые числа со знаком и без знака — cравнивать два числа должно быть легко, не так ли? Возможно, так и должно быть, но не в C++
🟢 Устранение расхождений в истории git commit после операций переименования с учетом регистра — мучения с изменением значений git config core.ignorecase
🟢 Простая в реализации arena-friendly hash map — в статье демонстрируется методика создания хэш-мапов в сочетании с arena allocation
🟢 О хранении изображений в памяти с выравниванием — будет немножко кода на Си и ассемблере, пара LabVIEW скриншотов, а также базовые знания OpenCV
🟢 С++ производительность и щепотка безопасности — обсуждение того, за что программисты любят C++
🟢 Как сравнить целые числа со знаком и без знака — cравнивать два числа должно быть легко, не так ли? Возможно, так и должно быть, но не в C++
🟢 Устранение расхождений в истории git commit после операций переименования с учетом регистра — мучения с изменением значений git config core.ignorecase
🟢 Простая в реализации arena-friendly hash map — в статье демонстрируется методика создания хэш-мапов в сочетании с arena allocation
🟢 О хранении изображений в памяти с выравниванием — будет немножко кода на Си и ассемблере, пара LabVIEW скриншотов, а также базовые знания OpenCV
forward_list::splice_after()
Это встроенная функция в CPP STL, которая переносит элементы в диапазоне от first+1 до last из данного forward_list в другой forward_list. Элементы вставляются после элемента, на который указывает позиция в параметре.
Синтаксис:
Параметры: функция принимает четыре параметра:
position – позиция в forward_list, после которой должны быть вставлены новые элементы.
forwardlist2_name – список, из которого должны быть вставлены элементы.
first – итератор, после которого должна быть выполнена вставка.
last – итератор, до которого должна быть выполнена вставка.
Это встроенная функция в CPP STL, которая переносит элементы в диапазоне от first+1 до last из данного forward_list в другой forward_list. Элементы вставляются после элемента, на который указывает позиция в параметре.
Синтаксис:
forwardlist1_name.splice_after(position iterator, forwardlist2_name,first iterator, last iterator)
Параметры: функция принимает четыре параметра:
position – позиция в forward_list, после которой должны быть вставлены новые элементы.
forwardlist2_name – список, из которого должны быть вставлены элементы.
first – итератор, после которого должна быть выполнена вставка.
last – итератор, до которого должна быть выполнена вставка.
🎢🚀 Диспетчер задач для микроконтроллера
В программировании микроконтроллеров часто нужно написать простые тестировочные прошивки. При этом надо некоторые функции вызывать чаще, а некоторые реже.
Для этого конечно можно запустить FreeRTOS, однако тогда код не будет переносим на другие RTOS, например Zephyr RTOS/TI-RTOS/RTEMS/Keil RTX/Azure RTOS или SafeRTOS. Потом прошивку как код часто приходится частично отлаживать на PC а там никакой RTOS в помине нет.
Поэтому надо держать наготове какой-нибудь простенький универсальный переносимый кооперативный NoRTOS планировщик с минимальной диагностикой и возможностью в run-time отключать какие-то отдельные задачи для отладки оставшихся.
Проще говоря нужен диспетчер задач для микроконтроллера.
Углубленный разбор ожидает тут
В программировании микроконтроллеров часто нужно написать простые тестировочные прошивки. При этом надо некоторые функции вызывать чаще, а некоторые реже.
Для этого конечно можно запустить FreeRTOS, однако тогда код не будет переносим на другие RTOS, например Zephyr RTOS/TI-RTOS/RTEMS/Keil RTX/Azure RTOS или SafeRTOS. Потом прошивку как код часто приходится частично отлаживать на PC а там никакой RTOS в помине нет.
Поэтому надо держать наготове какой-нибудь простенький универсальный переносимый кооперативный NoRTOS планировщик с минимальной диагностикой и возможностью в run-time отключать какие-то отдельные задачи для отладки оставшихся.
Проще говоря нужен диспетчер задач для микроконтроллера.
Углубленный разбор ожидает тут