Иногда дома готовлю и фоткаю, если красиво и вкусно получилось. Подумал, что можно и в телегу постить.
В общем если интересна вкусная еда от инженера, то вот 😁
😀
https://t.me/cdefood
Разрешается критиковать, советовать, в общем чувствовать себя как дома.
Это всего лишь эксперименты, все блюда выдуманы, чистый экспромт у плиты из того что приглянулось в холодильнике или магазине.
По мере стедания и приготовления новых блюд буду пополнять копился.
В общем если интересна вкусная еда от инженера, то вот 😁
https://t.me/cdefood
Разрешается критиковать, советовать, в общем чувствовать себя как дома.
Это всего лишь эксперименты, все блюда выдуманы, чистый экспромт у плиты из того что приглянулось в холодильнике или магазине.
По мере стедания и приготовления новых блюд буду пополнять копился.
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
CDEfood - Рецепты айтишника
Заметки о рецептах от айтишника.
Большинство блюд всего лишь эксперименты и выдуманы, чистый экспромт у плиты из того что приглянулось в магазине или завалялось в холодильнике.
@cdeblog - здесь про Айтишку
@devprodest - это я
Большинство блюд всего лишь эксперименты и выдуманы, чистый экспромт у плиты из того что приглянулось в магазине или завалялось в холодильнике.
@cdeblog - здесь про Айтишку
@devprodest - это я
👍1
Все же читают хабр?
Люблю изучать какие-нибудь нетиповые схемные и программные решения.
Наткнулся на статью про оптроны:
https://habr.com/p/830188/
Довольно неплохо и коротко 😊
Люблю изучать какие-нибудь нетиповые схемные и программные решения.
Наткнулся на статью про оптроны:
https://habr.com/p/830188/
Довольно неплохо и коротко 😊
👌3👍1
Просто интересно почитать в дороге:
https://pvs-studio.ru/ru/blog/posts/1143/
https://pvs-studio.ru/ru/blog/posts/1143/
PVS-Studio
Про́клятый огонь, или магия препроцессора C
Задавались ли вы когда-нибудь вопросом, можно ли полноценно программировать при помощи директивы #define в языке C? Полнота по Тьюрингу шаблонов C++ известна весьма широко, например, люди...
Интересная статья с описанием нескольких подводных камней, которые могут возникнуть при разработке электронного устройства.
https://interrupt.memfault.com/blog/schematic-review-checklist
https://interrupt.memfault.com/blog/schematic-review-checklist
Interrupt
A Schematic Review Checklist for Firmware Engineers
A checklist with supporting stories for firmware engineers to review when doing a schematic review.
А давайте в честь дня программиста пройдем ИТ-Диктант?
https://dictation.72to.ru/home/events/b2cecef4-98c6-48f7-9b19-7409e73e1eff
Только честно и не подглядывая в поисковые системы
https://dictation.72to.ru/home/events/b2cecef4-98c6-48f7-9b19-7409e73e1eff
Только честно и не подглядывая в поисковые системы
Не говорите, что писали нечто вроде:
uint8_t * a = malloc(100);
*(a + 2*10 + 4) = 42; // a[2][4]=42
На самом деле можно сделать нормальный указатель и пользоваться выделенной памятью как массивом:
uint8_t (* a)[10][10] = malloc(100);
(*a)[2][4] = 42
Особенно классно, что можно объявлять массивы переменной длины
uint8_t (* a)[x][y][z] = malloc(sizeof(*a));
#c #cpp
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
https://habr.com/ru/companies/cloud_ru/articles/860764/
#typescript
Please open Telegram to view this post
VIEW IN TELEGRAM
Хабр
Рецепты TypeScript: подстановка параметров в путь
Хабр, привет! Это Костя Логиновских — ведущий разработчик в Cloud.ru . Этой статьей я начинаю цикл коротких материалов, посвященный рецептам TypeScript. Что такое рецепты? Это готовый код, который...
👍1 1
Жирная точка в спорах о var let и const
https://www.youtube.com/live/8G0qxh4HabA?si=oTP1hchDFctuG0Zg
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Жирная точка в спорах о var let и const
В этом видео, я не буду ничего доказывать показывая код, бенчмарки,
вместо этого я приведу ссылки на:
1. Обсуждается изменения в TypeScript compiler, которые предполагают downgrade к var в связи с performance issue
https://github.com/microsoft/TypeSc…
вместо этого я приведу ссылки на:
1. Обсуждается изменения в TypeScript compiler, которые предполагают downgrade к var в связи с performance issue
https://github.com/microsoft/TypeSc…
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Антология полезностей в TypeScript / Андрей Тараненко
Это Андрей Тараненко, главный разработчик в ИТ-холдинге Т1, и его выступление на «Я 💛 Фронтенд 2025». В докладе Андрей на нескольких примерах из реальной жизни показал практики, которые позволят точнее работать с типами и повысить типобезопасность всего кода.…
👍1
Не могу не поделиться штукой над которой тружусь на работе.
Моя часть программная, как раз тот самый сдк и типовые демопроекты... и немного внутренней программной кухни.
https://t.me/iiotandembedded/557
Моя часть программная, как раз тот самый сдк и типовые демопроекты... и немного внутренней программной кухни.
https://t.me/iiotandembedded/557
Telegram
Встраиваемые системы
Видеопроцессор R5. Цифровые решения.
Компания Цифровые решения анонсировала двух ядерный RISC-V процессор R5 по обработки видео для применения в биспектральных модулях, тепловизионных камерах, ip-видеокамеры. Наличие встроенного нейросетевого ускорителя…
Компания Цифровые решения анонсировала двух ядерный RISC-V процессор R5 по обработки видео для применения в биспектральных модулях, тепловизионных камерах, ip-видеокамеры. Наличие встроенного нейросетевого ускорителя…
🔥4
Мне сейчас старый знакомый написал такое сообщение, с просьбой проголосовать. Не поверил, решил проанализировать. Ссылка совсем другая.
‼️ Это фишинговое сообщение. Обманом через QR код подключают своё устройства к вашему аккаунту.
‼️ Будьте аккуратны. Не переходите по левым ссылкам, даже очень похожим на настоящие.
Please open Telegram to view this post
VIEW IN TELEGRAM
✍4
Media is too big
VIEW IN TELEGRAM
В общем, что бы не страдать решил сделать себе маленькое дополнение для редактора.
Функционал пока скудный, но мои потребности закрывает.
Пользоваться просто: выбираем места где нужно вставить, запускаем команду и по всем курсорам вставляем значение с нужным начальным ззначением и шагом. Можно в хексе, можно в десятичном формате.
https://marketplace.visualstudio.com/items?itemName=ZaikinDenis.vscode-enumerator
#vscode #extension
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Ниже ссылка, куда нужно вставить необходимые значения.
https://marketplace.visualstudio.com/_apis/public/gallery/publishers/<autor>/vsextensions/<extension>/<version>/vspackageПользуйтесь
#vscode #extension
Please open Telegram to view this post
VIEW IN TELEGRAM
Плагин позволяет осуществить базовую аналитику ELF файлов:
https://marketplace.visualstudio.com/items?itemName=ZaikinDenis.devprodest-elf-analyzer
По сути это надстройка над утилитами вроде llvm-nm и парсер их вывода
#vscode #extension
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
CDEblog
Обновил версию до 0.0.2
Заменил бубликовые диаграммы на стековую, теперь меньше места тратится впустую.
Отключать ненужные куски на диаграмме нельзя, зато при нажатии сразу фильтруется до нужного символа.
Добавил нормальные тултипы для диаграм
Заменил бубликовые диаграммы на стековую, теперь меньше места тратится впустую.
Отключать ненужные куски на диаграмме нельзя, зато при нажатии сразу фильтруется до нужного символа.
Добавил нормальные тултипы для диаграм
Представим, что мы пишем некую обобщенную инициализацию с использованием макроса generic.
void mod1_init(inst1_t*, cfg_t*);
void mod2_init(inst2_t*, cfg_t*);
#define mod_init(x,c) _Generic((x),\
inst1_t*: mod1_init, \
inst2_t*: mod2_init)(x, c)
Далее когда будем пользоваться просто вызываем наш макрос с нужными параметрами и всё само подставляется.
cfg_t cfg = {
.f=1,
.d=3,
};
mod_init(&inst, &cfg);Ровно до тех пор, пока мы не захотим передать указатель на составной литерал.
mod_init(&inst, &(cfg_t){
.f=1,
.d=3,
});Код собираться не будет, а ведь это могла быть вполне валидная конструкция, будь здесь не макрос, а простая функция.
Что бы исправить ситуацию введём в макрос вариадик аргумент, но без всяких "
__VA_ARGS__"#define mod_init(x,c...) _Generic((x),\
inst1_t*: mod1_init,\
inst2_t*: mod2_init)(x, c)
Заметили три точки после параметра "
c"?Есть только одно НО: это не стандарт, а лишь расширение GNU 🤷♂️
https://cdeblog.ru/variadic-macro-with-generic
#c #cpp
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🤔1🤩1👌1
Хотелось бы озвучить свое мнение о данном вопросе.
Речь пойдет о передачи каких-либо параметров в функцию и возврате указателей различных типов.
Например такие:
// Пример (1)
uint32_t * p = (uint32_t *) malloc(1245);
// Пример (2)
uint32_t (* arr)[32] = malloc(sizeof(* arr));
void * init_fq(void* init_arr);
typedef struct data_t {
void * f1;
data_item_t * f2;
volatile void * f3;
} data_t;
data_t var_s = {
.f1 = (void *)init_fq((void *)(*arr)),
.f2 = (data_item_t *)malloc(sizeof(data_item_t)),
.f3 = &volatile_array,
};
// Пример (3) с потерей квалификаторов
uint32_t * p1 = (void *)var_s.f3; // теряем volatile
С одной стороны кажется, что ни чего плохого в данном коде нет, возможно кроме некоторых специфичных конструкций, ок которых писал ранее.
При возврате из аллокатора нет смысла кастовать, так как зачастую все аллокаторы возвращают именно
void*, а все дополнительные махинации лишь добавляют в код грязи (Пример 1)Случай 2 уже не так безобиден. Пока у нас поле
f1 структуры имеет тип void* всё хорошо и работает так же как предыдущий случай. Но может настать момент когда тип поля структуры изменится, а возвращаемое значение изменится на что-то иное, например перестанет быть указателем, или станет указателем совсем другого типа, в таком случае не исключается вариант конфликта типов, который не будет подсвечен из-за принудительного каста.Другим нехорошим обстоятельством (Пример 3) может быть потеря квалификаторов
volatile и const, а вот это уже может быть большой проблемой. Начиная от неопределенного поведения и заканчивая падениями в рантайме, не понятно что хуже.Перепишем код и избавимся от лишних вещей:
uint32_t * p = malloc(1245);
data_t var_s = {
.f1 = init_fq(*arr),
.f2 = malloc(sizeof(data_item_t)),
.f3 = &volatile_array,
};
volatile uint32_t * p1 = var_s.f3; // теряем volatile
Стоит сказать, что кастование одних типов к другим весьма нехорошая практика, которая потенциально приносит проблемы и грязь в код.
Есть еще одна мысль на счет универсальных функций вроде аллокаторов или функций вида
send() возвращаемые значения и типы входных аргументов оформлять как void*. Таким образом и код будет чище и сопровождать его проще.// Пример с приемом и возвратом uint8_t*
size_t sent_data_u8(uint8_t * data, size_t size);
size_t sent_data_pv(void * data, size_t size);
data_t data_s = { ... };
uint8_t data_arr[32] = { ... };
uint32_t data_32 = 42;
sent_data_u8((uint8_t *)&data_s, sizeof(data_s));
sent_data_u8((uint8_t *)data_arr, sizeof(data_arr));
sent_data_u8((uint8_t *)&data_32, sizeof(data_32));
sent_data_pv(&data_s, sizeof(data_s));
sent_data_pv(data_arr, sizeof(data_arr));
sent_data_pv(&data_32, sizeof(data_32));
Мне кажется выводы сделать просто.
https://cdeblog.ru/void-pointers-casts
Если у вас другое мнение, готов обсудить и даже принять
#c #cpp
Please open Telegram to view this post
VIEW IN TELEGRAM
Иногда вместе со списком элементов необходимо иметь их количество и значение последнего элемента.
Подобное часто применяется для перечисления допустимых индексов каких-либо аппаратных блоков или каких-то статусов.
Не редно видел конструкции вида:
enum dma_instance_e
{
DMA_INST_0,
DMA_INST_1,
DMA_INST_2,
DMA_INST_LAST = DMA_INST_2,
DMA_INST_QTY = DMA_INST_LAST + 1,
};
На этапе разработки постоянно требуется меняеть количество этих элементов.
Но в коде выше есть проблема: решили добавить дма - необходимо изменить ещё и ласт. Одна правка, а изменяет две строчки, что не только не красиво, но и потенциальная ошибка из-за невнимательности.
Намного проще поменять порядок элементов и возложить эту задачу на компилятор:
enum dma_instance_e
{
DMA_INST_0, // 0
DMA_INST_1, // 1
DMA_INST_2, // 2
// <== добавлять тут
DMA_INST_QTY, // 3
DMA_INST_LAST=DMA_INST_QTY-1, // 2
};
#си #перечисление #enum
Please open Telegram to view this post
VIEW IN TELEGRAM