Быстрая сборка установщика User guide

Создание файла установщика

Для сборки установщика на Windows будем использовать программу Inno setup

1

Pylos Game. Part N

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

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

3

Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля

Сам себе Linux смартфон: Как я выкинул Android и написал свою прошивку с нуля

К огромному сожалению, старые смартфоны всё чаще и чаще находят своё пристанище в мусорном баке. К прошлым, надежным «друзьям» действует исключительно потребительское отношение — чуть устарел и сразу выкинули, словно это ненужный мусор. И ведь люди даже не хотят попытаться придумать какое-либо применение гаджетам прошлых лет! Отчасти, это вина корп…

167

Мы сделали вам плату, а дальше вы сами: Доводим дешевый одноплатник до ума своими руками

Мы сделали вам плату, а дальше вы сами: Доводим дешевый одноплатник до ума своими руками

В прошлой статье, мы с вами рассмотрели на что способен одноплатный компьютер, который стоит всего 1.000 рублей. Как мы выяснили, перспективы у данного девайса весьма неплохие, однако по факту, Orange Pi продаёт практически голую железку, которую нужно дорабатывать самому. Да, тут есть Ubuntu/Fedora, да, тут выведена гребенка с I2C/SPI — однако из…

62

Сам себе игровая консоль: превращаем планшет с нерабочим тачскрином в игровой девайс из 8 кнопок и микроконтроллера

Сам себе игровая консоль: превращаем планшет с нерабочим тачскрином в игровой девайс из 8 кнопок и микроконтроллера

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

57

Бесплатный левел-дизайн, или как строить ландшафт в реальном времени на UE4

Как бесплатно и быстро создавать огромные игровые уровни и как в реальном времени строить ландшафт по информации из Интернета.

Бесплатный левел-дизайн, или как строить ландшафт в реальном времени на UE4
73

Descent

Я расскажу про Descent — компьютерную игру, трехмерный шутер (стрелялку) от первого лица, выпущенный в начале 1995 года. Я испытываю к нему сильные чувства как геймер и как программист, и хочу поделиться.

Любовь и нежность

122

C++ Идеальная статическая иерархия или как объединить объекты в структуру

Доброго времени суток. Представлюсь, для тех, кто меня еще не знает. Меня зовут Дима. Я работаю C++ разработчиком уже более 5-ти лет. На данный момент работаю в крупной Gamedev-студии. Помимо работы увлекаюсь созданием образовательного контента для YouTube и Twitch каналов.

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

70

рфайди

#include <MFRC522.h> #include <SPI.h> // В настройках можно указать пины, на которых находятся RC522 #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); // Создаем экземпляр объекта RC522 void setup() { Serial.begin(9600); SPI.begin(); // Инициализируем SPI mfrc522.PCD_Init(); // Инициализируем RC522 Serial.println("RFID ready!"); } void loop() { // Находимся в ожидании RFID-карты if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Cчитываем серийный номер карты if ( ! mfrc522.PICC_ReadCardSerial()) { return; } // Выводим серийный номер карты Serial.print(F("Card UID:")); String cardContent = ""; for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); cardContent.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ")); cardContent.concat(String(mfrc522.uid.uidByte[i], HEX)); } Serial.println(); // Перезаписываем значения метки byte newData[] = {11, 22, 33, 44}; // Новые данные для записи0xDE, 0xAD, 0xBE, 0xEF byte dataLen = sizeof(newData); if (mfrc522.MIFARE_Write(1, newData, dataLen)) { Serial.println(F("Data written successfully")); } else { Serial.println(F("Error writing data")); } // Для того, чтобы проверить, что значения метки были перезаписаны, можем считать данные с метки byte readData[dataLen]; if (mfrc522.MIFARE_Read(1, readData, &dataLen) && memcmp(newData, readData, dataLen) == 0) { Serial.println(F("готово")); } else { Serial.println(F("нет")); } mfrc522.PICC_HaltA(); // Завершаем работу с картой }

этот код на С++ меняет рфайди метки значение на раннее указанное через модуль RFID- RC522

2

ПОМОГИТЕ НАЙТИ ОШИБКУ

#include <fio_tmpfile.h> #include <fiobj_data.h> #include <fiobj_str.h> #include <assert.h> #include <errno.h> #include <fcntl.h> #include <string.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> #include <fio.h> /* ***************************************************************************** Numbers Type ***************************************************************************** */ typedef struct { fiobj_object_header_s head; uint8_t *buffer; /* reader buffer */ union { FIOBJ parent; void (*dealloc)(void *); /* buffer deallocation function */ size_t fpos; /* the file reader's position */ } source; size_t capa; /* total buffer capacity / slice offset */ size_t len; /* length of valid data in buffer */ size_t pos; /* position of reader */ int fd; /* file descriptor (-1 if invalid). */ } fiobj_data_s; #define obj2io(o) ((fiobj_data_s *)(o)) /* ***************************************************************************** Object required VTable and functions ***************************************************************************** */ #define REQUIRE_MEM(mem) \ do { \ if ((mem) == NULL) { \ perror("FATAL ERROR: fiobj IO couldn't allocate memory"); \ exit(errno); \ } \ } while (0) static void fiobj_data_copy_buffer(FIOBJ o) { obj2io(o)->capa = (((obj2io(o)->len) >> 12) + 1) << 12; void *tmp = fio_malloc(obj2io(o)->capa); REQUIRE_MEM(tmp); memcpy(tmp, obj2io(o)->buffer, obj2io(o)->len); if (obj2io(o)->source.dealloc) obj2io(o)->source.dealloc(obj2io(o)->buffer); obj2io(o)->source.dealloc = fio_free; obj2io(o)->buffer = tmp; } static void fiobj_data_copy_parent(FIOBJ o) { switch (obj2io(obj2io(o)->source.parent)->fd) { case -1: obj2io(o)->buffer = fio_malloc(obj2io(o)->len + 1); memcpy(obj2io(o)->buffer, obj2io(obj2io(o)->source.parent)->buffer + obj2io(o)->capa, obj2io(o)->len); obj2io(o)->buffer[obj2io(o)->len] = 0; obj2io(o)->capa = obj2io(o)->len; obj2io(o)->fd = -1; fiobj_free(obj2io(o)->source.parent); obj2io(o)->source.dealloc = fio_free; return; default: obj2io(o)->fd = fio_tmpfile(); if (obj2io(o)->fd < 0) { perror("FATAL ERROR: (fiobj_data) can't create temporary file"); exit(errno); } fio_str_info_s data; size_t pos = 0; do { ssize_t written; data = fiobj_data_pread(obj2io(o)->source.parent, pos + obj2io(o)->capa, 4096); if (data.len + pos > obj2io(o)->len) data.len = obj2io(o)->len - pos; retry_int: written = write(obj2io(o)->fd, data.data, data.len); if (written < 0) { if (errno == EINTR) goto retry_int; perror("FATAL ERROR: (fiobj_data) can't write to temporary file"); exit(errno); } pos += written; } while (data.len == 4096); fiobj_free(obj2io(o)->source.parent); obj2io(o)->capa = 0; obj2io(o)->len = pos; obj2io(o)->source.fpos = obj2io(o)->pos; obj2io(o)->pos = 0; obj2io(o)->buffer = NULL; break; } } static inline void fiobj_data_pre_write(FIOBJ o, uintptr_t length) { switch (obj2io(o)->fd) { case -1: if (obj2io(o)->source.dealloc != fio_free) { fiobj_data_copy_buffer(o); } break; case -2: fiobj_data_copy_parent(o); break; } if (obj2io(o)->capa >= obj2io(o)->len + length) return; /* add rounded pages (4096) to capacity */ obj2io(o)->capa = (((obj2io(o)->len + length) >> 12) + 1) << 12; obj2io(o)->buffer = fio_realloc(obj2io(o)->buffer, obj2io(o)->capa); REQUIRE_MEM(obj2io(o)->buffer); } static inline int64_t fiobj_data_get_fd_size(const FIOBJ o) { struct stat stat; retry: if (fstat(obj2io(o)->fd, &stat)) { if (errno == EINTR) goto retry; return -1; } return stat.st_size; } static FIOBJ fiobj_data_alloc(void *buffer, int fd) { fiobj_data_s *io = fio_malloc(sizeof(*io)); REQUIRE_MEM(io); *io = (fiobj_data_s){ .head = {.ref = 1, .type = FIOBJ_T_DATA}, .buffer = buffer, .fd = fd, }; return (FIOBJ)io; } static void fiobj_data_dealloc(FIOBJ o, void (*task)(FIOBJ, void *), void *arg) { switch (obj2io(o)->fd) { case -1: if (obj2io(o)->source.dealloc && obj2io(o)->buffer) obj2io(o)->source.dealloc(obj2io(o)->buffer); break; case -2: fiobj_free(obj2io(o)->source.parent); break; default: close(obj2io(o)->fd); fio_free(obj2io(o)->buffer); break; } fio_free((void *)o); (void)task; (void)arg; }
3