Хреновые будни прикладника
Oct. 25th, 2010 10:07 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Под бодрящие звуки Steppennwolf с воодушевлением, обострённым близким дедлайном, ломаю первую, вылизанную и оттестированную версию своего кустарного кодогенератора.
В настоящий момент дикий мужчина делает полиморфизм и reflection на Plain C + AWK + С Preprocessor.
Да содрогнется любой заказчик от недо-функциональщика на бреющем полёте метапрограммирования.
Cрезающего сосны под корень. Потом верхний слой почвы. Следом гранит. Но в итоге выходящий на около-земную орбиту.
BORN TO BE WIILD! Пусть сдохнут все кто нас не любит.
Есть пространство переменных, имеющих имя и ID, могущих быть 5-ти типов (битовое поле, uint8, uint16, uint32, string и массивы из перечисленных). Их писать и читать. IPMI Config Variables, если кому-то что-то говорит.
Пространство переменных определено в ортодоксальном текстовом CSV-файле. Переменные физически могут быть дьявол знает где. Большая часть - 16KB двоичная область на NVRAM EEPROM, в упакованном двоичном формате. Остальное размазано по системе как джем по бутерброду пенсионера. Legacy формат, окаменевшее дерьмо бронтозавра , нечестивой своей киркой не трожь.
В CSV файле есть директивы препроцессора (ifdef, комментарии), дающие рудиментарное управление конфигурациями. Я заманчиво пообещал заказчику возможность редактировать раскладку переменных из Excel, но пока соскакиваю с темы. Пусть правят CSV руками.
По CSV скриптом на AWK генерятся развесистые данные, описывающие весь этот переменный бред в понятиях мест хранения и представления.
Библиотека на выходе даёт простейшее API вида set_variable_value(), get_variable_value(). И ей начхать на размер хранимых данных, место хранения, организацию и порядок.
А ещё наверху FUSE бантиком (опциональным). Чтобы показать красоту и благолепие. И была ночь, и был день шестой, и закачик сказал "это хорошо!". До того у него ехала крыша от устного и графического материала, сопровождавшего разработку, намечалась истерика от словосочетания "кодогенерация".
Наблюдательный персонаж скажет "ASN.1"! И будет почти теоретически прав. Самопальный, предметно ориентированный, ASN.1 PEP-подобный чугунный самокат с квадратными колёсами из массива ольхи.
Промышленное чугунное литьё самоката сопровождалось починянием примуса в NVRAM EEPROM драйвере. Авторы нашего Linux BSP как на подбор - резиновые изделия N2 размера XXXL. Гондоны и лицензия-суходрочеры, кто не понял.
Эмуляция ООП на структурах и указателях функций. Самодельное RTTI. Кустарный Reflection (пригодился в FUSE).
Насладитесь тестовой обвязкой, эмулирующей анально-ориентированный мир MTD в Linux.
EEPROM_IMAGE=eeprom.backup
ifeq ($(ARCH),i686)
$(MTD):
cp $(EEPROM_IMAGE) /tmp/$(EEPROM_IMAGE)
-sudo losetup $(LOOP_DEVICE) /tmp/$(EEPROM_IMAGE)
-sudo modprobe block2mtd block2mtd=$(LOOP_DEVICE)
endif
test: $(BINARY_TEST) $(MTD)
@rm -f *.gcda
./$(BINARY_TEST) $(MTD)
clean:
rm -fv $(OBJ) $(OBJ_TEST) $(DATA_FILE) $(BINARY) $(BINARY_TEST) *.gcda *.gcno core
ifeq ($(ARCH),i686)
-sudo rmmod block2mtd
-for i in /dev/loop*; do sudo losetup -d $$i; done
-rm -fv /tmp/$(EEPROM_IMAGE)
endif
Особенно хороши unit-тесты на Check + --coverage. Покрытие кода тестами предыдущей версии близко к 100%. В ggcov смотреть обожаю, радует глаз.
В настоящий момент дикий мужчина делает полиморфизм и reflection на Plain C + AWK + С Preprocessor.
Да содрогнется любой заказчик от недо-функциональщика на бреющем полёте метапрограммирования.
Cрезающего сосны под корень. Потом верхний слой почвы. Следом гранит. Но в итоге выходящий на около-земную орбиту.
BORN TO BE WIILD! Пусть сдохнут все кто нас не любит.
Гнусные подробности
Есть пространство переменных, имеющих имя и ID, могущих быть 5-ти типов (битовое поле, uint8, uint16, uint32, string и массивы из перечисленных). Их писать и читать. IPMI Config Variables, если кому-то что-то говорит.
Пространство переменных определено в ортодоксальном текстовом CSV-файле. Переменные физически могут быть дьявол знает где. Большая часть - 16KB двоичная область на NVRAM EEPROM, в упакованном двоичном формате. Остальное размазано по системе как джем по бутерброду пенсионера. Legacy формат, окаменевшее дерьмо бронтозавра , нечестивой своей киркой не трожь.
В CSV файле есть директивы препроцессора (ifdef, комментарии), дающие рудиментарное управление конфигурациями. Я заманчиво пообещал заказчику возможность редактировать раскладку переменных из Excel, но пока соскакиваю с темы. Пусть правят CSV руками.
По CSV скриптом на AWK генерятся развесистые данные, описывающие весь этот переменный бред в понятиях мест хранения и представления.
Библиотека на выходе даёт простейшее API вида set_variable_value(), get_variable_value(). И ей начхать на размер хранимых данных, место хранения, организацию и порядок.
А ещё наверху FUSE бантиком (опциональным). Чтобы показать красоту и благолепие. И была ночь, и был день шестой, и закачик сказал "это хорошо!". До того у него ехала крыша от устного и графического материала, сопровождавшего разработку, намечалась истерика от словосочетания "кодогенерация".
Наблюдательный персонаж скажет "ASN.1"! И будет почти теоретически прав. Самопальный, предметно ориентированный, ASN.1 PEP-подобный чугунный самокат с квадратными колёсами из массива ольхи.
Промышленное чугунное литьё самоката сопровождалось починянием примуса в NVRAM EEPROM драйвере. Авторы нашего Linux BSP как на подбор - резиновые изделия N2 размера XXXL. Гондоны и лицензия-суходрочеры, кто не понял.
Особо гнусные подробности
Эмуляция ООП на структурах и указателях функций. Самодельное RTTI. Кустарный Reflection (пригодился в FUSE).
Насладитесь тестовой обвязкой, эмулирующей анально-ориентированный мир MTD в Linux.
EEPROM_IMAGE=eeprom.backup
ifeq ($(ARCH),i686)
$(MTD):
cp $(EEPROM_IMAGE) /tmp/$(EEPROM_IMAGE)
-sudo losetup $(LOOP_DEVICE) /tmp/$(EEPROM_IMAGE)
-sudo modprobe block2mtd block2mtd=$(LOOP_DEVICE)
endif
test: $(BINARY_TEST) $(MTD)
@rm -f *.gcda
./$(BINARY_TEST) $(MTD)
clean:
rm -fv $(OBJ) $(OBJ_TEST) $(DATA_FILE) $(BINARY) $(BINARY_TEST) *.gcda *.gcno core
ifeq ($(ARCH),i686)
-sudo rmmod block2mtd
-for i in /dev/loop*; do sudo losetup -d $$i; done
-rm -fv /tmp/$(EEPROM_IMAGE)
endif
Особенно хороши unit-тесты на Check + --coverage. Покрытие кода тестами предыдущей версии близко к 100%. В ggcov смотреть обожаю, радует глаз.