Сообщения CYB3R
Makefile: пересобрать цель, если один из файлов изменился
Есть такой мейкфайл:
RES = resources.xml
${RES:.xml=.c}: ${RES}
glib-compile-resources ${RES} --target=$@ --generate-source
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
<gresource prefix="/my">
<file compressed="true" preprocess="xml-stripblanks">a.ui</file>
<file compressed="true" preprocess="xml-stripblanks">b.ui</file>
<file compressed="true" preprocess="xml-stripblanks">c.ui</file>
</gresource>
</gresources>
make, resources.c не пересобирается, так как изменений в resources.xml не было.
Хочу сделать так, чтобы resources.c генерировался заново при любых изменениях в a.ui, b.ui или c.ui.
Подошёл бы даже вариант типа такого (если бы он работал):
RES = resources.xml
UI = a.ui b.ui c.ui
${RES:.xml=.c}: ${RES} ${UI}
glib-compile-resources ${RES} --target=$@ --generate-source
Протокол для простого девайса
Есть девайс с простым GSM-модемом (настолько простым, что нет даже AT-команд на HTTP, только на TCP).
Есть сервер. На сервере крутится openresty (nginx+lua).
Задача — читать сенсоры с девайса, по команде из веб-интерфейса помигать светодиодом.
Как это разумнее всего сделать? Мне сейчас приходит в голову только очень простой метод: девайс постоянно совершает HTTP 1.0 запросы к серверу и отправляет данные с сенсоров. Сервер отвечает «OK». Если вдруг нужно помигать светодиодом, сервер отвечает не «OK», а «LED». На что в следующем запросе девайс отвечает, что успешно мигнул, на сервере флаг мигания светодиодом убирается и приходит обычное «OK».
Плохо придумал? Тупо? Нужно городить какие-нибудь веб-сокеты?
Let's Encrypt без Python
Сабж возможен? Кто-то уже делал?
Первый канал вещает в HLS
Cisco EPC3008
Привет, ЛОР!
Есть один DOCSIS-модем. На коробке написано, Cisco EPC3008, но прошивка у него явно кастрированная. Модем долго работал без нареканий, но сейчас эта падла взяла привычку терять линк (возможно, перезагружаться?) и нехорошо себя вести.
Снял крышку, понял, что радиатор на нём очень горячий. Подпаялся к UART, найти который оказалось несложно, подобрал baudrate, но в самом начале модем перестаёт слать на UART что либо и причину странного поведения я установить не могу. Как получить с него dmesg (или что у него там?).
Вот всё, что приходит на UART:
BCM338211 TP0
1
Sync:1
346890
MemSize: 64 M
SA BootLoader Version: 2.3.1_R3 Pre-release Gnu spiboot reduced DDR drive
Build Date: Nov 10 2010
Build Time: 17:41:25
Setting SPI device 0 to clock 0
Setting SPI device 0 to clock 7
SPI flash ID 0xef4016, size 4MB, block size 64KB, write buffer 256, flags 0x0
Signature/PID: a03a
Image 1 Program Header:
Signature: a03a
Control: 0005
Major Rev: 0003
Minor Rev: 0010
Build Time: 2013/6/10 07:13:35 Z
File Length: 1583713 bytes
Load Address: 80004000
Filename: e3000-v302r125573-130606c.bin
HCS: f303
CRC: fc47b239
Found image 1 at offset 20000
Enter '1', '2', or 'p' within 2 seconds or take default...
. .
Performing CRC on Image 1...
CRC time = 58392967
Detected LZMA compressed image... decompressing...
Target Address: 0x80004000
decompressSpace is 0x4000000
Elapsed time 1057692601
Decompressed length: 7524996
Executing Image 1...
eCos - hal_diag_init
Init device '/dev/BrcmTelnetIoDriver'
Init device '/dev/ttydiag'
Init tty channel: 80730cf8
Init device '/dev/tty0'
Init tty channel: 80730d18
Init device '/dev/haldiag'
HAL/diag SERIAL init
Init device '/dev/ser0'
BCM 33XX SERIAL init - dev: 0.2
Set output buffer - buf: 0x807b1870 len: 4096
Set input buffer - buf: 0x807b2870 len: 4096
BCM 33XX SERIAL config
Init device '/dev/ser1'
BCM 33XX SERIAL init - dev: 0.3
Set output buffer - buf: 0x807b3870 len: 4096
Set input buffer - buf: 0x807b4870 len: 4096
BCM 33XX SERIAL config
[00:00:00 01/01/1970] [tStartup] BcmBfcStdEmbeddedTarget::InitStorageDrivers: (BFC Target) Configuring/Loading Flash driver...
[00:00:00 01/01/1970] [tStartup] BcmSpiFlashDevice::DetectFlash: (SPI Flash Device Factory) WARNING - Detected SPI flash with JEDEC ID =0xef4016
[00:00:00 01/01/1970] [tStartup] FlashDeviceDriver::SpiFlashPlaceRegions: (Flash Driver C API) WARNING - Permanent NonVol would fit in the boot block of this flash device, but I found existing NonVol in the following block; using this location instead...
[00:00:00 01/01/1970] [tStartup] BcmBfcStdEmbeddedTarget::InitStorageDrivers: (BFC Target) Loading BootloaderStore driver...
[00:00:00 01/01/1970] [tStartup] BcmBfcStdEmbeddedTarget::InitStorageDrivers: (BFC Target) Loading ProgramStore driver...
ProgramStoreDeviceDriver::ProgramStoreDriverInit: INFO - Initializing...
[00:00:00 01/01/1970] [tStartup] BcmBfcStdEmbeddedTarget::InitStorageDrivers: (BFC Target) Loading NonVol driver...
[00:00:00 01/01/1970] [tStartup] BcmBfcStdEmbeddedTarget::InitStorageDrivers: (BFC Target) Storage drivers initialized successfully.
[00:00:00 01/01/1970] [tStartup] BcmBfcStdEmbeddedTarget::InitDeviceAbstractions: (BFC Target) Creating singletons for ProgramStore/BootloaderStore/NonVol devices...
Detecting the next image number that we will store to by default...
Bootloader indicates we are running image 1
By default, we will dload to image number 2!
[00:00:00 01/01/1970] [tStartup] BcmBfcStdEmbeddedTarget::InitDeviceAbstractions: (BFC Target) Device abstraction singletons created successfully.
SAHttpCacheVariables::GetSingletonInstance: WARNING - the singleton instance is NULL, and someone is accessing it!
Setting up the SAHttpCacheVariables singleton pointer.
CmSnmpNonVolSettings::GetSingletonInstance: WARNING - the singleton instance is NULL, and someone is accessing it!
BcmCmSANonVolSettings::GetSingletonInstance: WARNING - the singleton instance is NULL, and someone is accessing it!
Reading Permanent settings from non-vol...
Checksum for permanent settings: 0x32e49c9d
Settings were read and verified.
Reading Dynamic settings from non-vol...
Checksum for dynamic settings: 0x6d11a767
[00:00:00 01/01/1970] [tStartup] Bc
Секретный лагерь по подготовке фанатов Microsoft
Наткнулся на замечательную картинку. На ней представлены скриншоты из личного кабинета продавца-консультанта в крупной сети.
Это подозрительно напоминает нелегальные секты маркетологов (типа кофе Органо Голд и подобного).
Война с мелкомягкими за десктоп заранее проиграна.
Обновил ядро, корень не монтируется
GRUB2, initramfs нет.
[ 0.823767] VFS: Cannot open root device "PARTUUID=cf1ed5c5-02" or unknown-block(254,2): error -19
[ 0.824225] Please append a correct "root=" boot option; here are the available partitions:
[ 0.824827] fe00 53760 vda driver: virtio_blk
[ 0.825413] fe01 4096 vda1 cf1ed5c5-01
[ 0.825947] fe02 49152 vda2 cf1ed5c5-02
[ 0.826505] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(254,2)
[ 0.826956] Kernel Offset: disabled
[ 0.827306] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(254,2)
OpenWRT build system
Как собирают OpenWRT? У них ведь какая-то своя сборочная система?
Я много раз собирал (качал исходники, запускал make, тот мне открывал menuconfig, а потом сам всё компилил — хорошо!), но никогда не вникал в процесс.
Пакеты, насколько я знаю, там описываются мейкфайлами, потом сами выкачиваются, кросскомпилируются. Писал я один раз такой мейкфайл, ничего особо сложного.
Насколько сам процесс кастомизируемый? Можно как-то выкинуть из системы вообще всё и начать с нуля? Например, ну не нужен мне procd. Получится обойтись как-то без него? Или что не собирай, получится OpenWRT? А можно заюзать clang+musl вместо gcc+uClibc?
В идеале хочется кросс-компилять свою систему реально удобно реально под себя (читай Gentoo^W LFS) без особого геморроя. Билдрут не советовать.
CAD для GNU/Linux
Нужен простой CAD (желательно на GTK+). Цели: laser cutter и 3D printer. Для лазерной резки попробовал Inkscape: все координаты приходится вычислять относительно начала листа и относительно начала фигуры (так трудно было сделать нулевые координаты круга в центре этого круга?), чтобы нарисовать правильный пятиугольник сначала нужно пару листов бумаги исписать вычислениями координат его углов. Короче, очень сложно. Для 3D-печати хочу использовать Blender. Сойдёт?
Что посоветуете?
Установлен ли в вашей системе Flash Player?
Ещё один опрос об установленном на ваших компьютерах ПО. Сейчас почти всё в вебе работает без установки проприетарных плагинов, однако многие пользователи по привычке до сих пор устанавливают себе Adobe Flash Player
-
Да, установлен flash-plugin
621 (52%)
********************************************************************************************************************************************************************************************************************************************************************************************************************************
-
Нет, ничего для проигрывания флеш-роликов у меня не установлено
307 (26%)
**************************************************************************************************************************************************************
-
Да, установлен pepper-flash-plugin
252 (21%)
*********************************************************************************************************************************
-
Нет, но установлен свободный аналог (gnash, lightspark, etc)
20 (2%)
**********
Всего голосов: 1200
ARM Chromebook
Раз уж моё желание (относительно дешёвый, тонкий и лёгкий ноутбук с пассивным охлаждением и без HDD) сейчас почти несбыточное, решил посмотреть на армовые буки.
У кого ноуты на армах, делитесь годными моделями, рассказывайте о подводных камнях и проблемах с установкой любимого дистрибутива.
STM32 и прерывания
Ковыряю сейчас STM32 с libopencm3. Попытался расширить пример usart_irq (наверное, нужно было ещё посмотреть на usart_irq_printf, но его я пока не открывал). Теперь у меня есть буфер для отправки и для приёма строк.
Кода не очень много, потому, думаю, можно выложить весь.
#include <string.h>
#include <libopencm3/stm32/rcc.h>
#include <libopencm3/stm32/gpio.h>
#include <libopencm3/stm32/usart.h>
#include <libopencm3/cm3/nvic.h>
#define BS 16 // buffer size (number of strings)
char request[256]; // string to send to modem
char response[BS][256]; // last BS strings received from modem
int row, ch; // number of string and last character received from modem
uint8_t last = 'A'; // last character received from modem
int step = 0;
static void clock_setup(void) {
rcc_clock_setup_in_hse_8mhz_out_72mhz();
/* Enable clocks for GPIO port A (for GPIO_USART1_TX) and USART1. */
rcc_periph_clock_enable(RCC_GPIOA);
rcc_periph_clock_enable(RCC_AFIO);
rcc_periph_clock_enable(RCC_USART1);
}
static void usart_setup(void) {
/* Enable the USART1 interrupt. */
nvic_enable_irq(NVIC_USART1_IRQ);
/* Setup GPIO pin GPIO_USART1_RE_TX on GPIO port A for transmit. */
gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ,
GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO_USART1_TX);
/* Setup GPIO pin GPIO_USART1_RE_RX on GPIO port A for receive. */
gpio_set_mode(GPIOA, GPIO_MODE_INPUT,
GPIO_CNF_INPUT_FLOAT, GPIO_USART1_RX);
/* Setup UART parameters. */
usart_set_baudrate(USART1, 115200);
usart_set_databits(USART1, 8);
usart_set_stopbits(USART1, USART_STOPBITS_1);
usart_set_parity(USART1, USART_PARITY_NONE);
usart_set_flow_control(USART1, USART_FLOWCONTROL_NONE);
usart_set_mode(USART1, USART_MODE_TX_RX);
/* Enable USART1 Receive interrupt. */
USART_CR1(USART1) |= USART_CR1_RXNEIE;
/* Finally enable the USART. */
usart_enable(USART1);
}
static void gpio_setup(void) {
gpio_set(GPIOA, GPIO1);
/* Setup GPIO1 (in GPIO port A) for LED use. */
gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ,
GPIO_CNF_OUTPUT_PUSHPULL, GPIO1);
}
static void wait(void) {
int i;
for (i = 0; i < 800000; i++) /* Wait a bit. */
__asm__("nop");
}
static int row_num(int n) {
// use this function to get correct row offset
// row_num(0) - latest row, row_num(1) - second latest row, etc.
int r = row - n;
if (r < 0) {
return r + BS;
} else {
return r;
}
}
static void action_select(void) {
if (strcmp(response[row], "OK") == 0) {
gpio_toggle(GPIOA, GPIO1);
wait();
gpio_toggle(GPIOA, GPIO1);
wait();
gpio_toggle(GPIOA, GPIO1);
wait();
gpio_toggle(GPIOA, GPIO1);
} else if (strcmp(response[row], "ERROR") == 0) {
gpio_toggle(GPIOA, GPIO1);
wait();
gpio_toggle(GPIOA, GPIO1);
} else if (strcmp(response[row], "PRINT") == 0) {
int i;
strcpy(request, "\r\n");
for (i = 0; i < BS; i++) {
char num[5] = { '[', i < 10 ? '0' + i : 'A' + i - 10, ']', ':', ' ' };
strcat(request, num);
strcat(request, response[row_num(i)]);
strcat(request, "\r\n");
}
}
}
static void set_send(void) {
/* Enable transmit interrupt so it sends back the data. */
USART_CR1(USART1) |= USART_CR1_TXEIE;
}
static void unset_send(void) {
/* Disable the TXE interrupt as we don't need it anymore. */
USART_CR1(USART1) &= ~USART_CR1_TXEIE;
}
static void send(void) {
if (request[0] != 0) {
int i = 0;
uint8_t s = '0';
while (s = request[i++], s != 0) {
usart_wait_send_ready(USART1);
usart_send(USART1, s);
}
usart_wait_send_ready(USART1);
usart_send(USART1, '\r');
// new line here should be commented out in production
usart_wait_send_ready(USART1);
usart_send(USART1, '\n');
request[0] = 0;
} else {
// echo last char back (should also be commented out in production)
usart_wait_send_ready(USART1);
usart_send(USART1, last);
if (last == '\r') {
usart_wait_send_ready(USART1);
usart_send(USART1, '\n');
}
}
unset_send();
}
static void receive(void) {
/* Retrieve the data from the peripheral. */
last = usart_recv(USART1);
response[row][ch] = last;
if (response[row][ch] == '\r') {
response[row][ch] = '\0';
action_select();
if (ch > 1) row++;
ch = 0;
if (row == BS) row = 0;
} else if (response[row][ch] != '\n') {
ch++;
}
set_send();
}
void usart1_isr(void) {
/* Check if we were called because of RXNE. */
if (((USART_CR1(USART1) & USART_CR1_RXNEIE) != 0) &&
((USART_SR(USART1) & USART_SR_RXNE) != 0)) {
receive();
}
/* Check if we were called because of TXE. */
if (((USART_CR1(USART1) & USART_CR1_TXEIE) != 0) &&
((USART_SR(USART1) & USART_SR_TXE) != 0)) {
send();
}
}
static void send_request(char *str) {
strcpy(request, str);
send();
}
int main(void) {
clock_setup();
gpio_setup();
usart_setup();
gpio_set(GPIOA, GPIO1);
send_request("HELLO\r");
/* Wait forever and do nothing. */
while (1)
__asm__("nop");
return 0;
}
HELLO
OK
ERROR
PRINT
[0]: PRINT
[1]: ERROR
[2]: OK
[3]:
[4]:
[5]:
[6]:
[7]:
[8]:
[9]:
[A]:
[B]:
[C]:
[D]:
[E]:
[F]:
Я подумал, что достаточно после инициализации в main добавить следующее:
gpio_set(GPIOA, GPIO1);
send_request("HELLO\r");
while (strcmp(response[row_num(0)], "WORLD") != 0)
__asm__("nop");
gpio_clear(GPIOA, GPIO1);
send_request("TRUE\r");
HELLO
WORLD
PRINT
[0]:
PRINT
[1]:
WORLD
[2]:
[3]:
[4]:

ncrmnt,
KivApple,
RiseOfDeath. И подскажите форум, где такие вопросы не будут оффтопиком.PoWiFi
Использовал кто-нибудь? Буду признателен, если поделитесь схемой.
Алгоритмы
Посоветуйте список простых типовых алгоритмов (сортировка, поиск, сжатие, хеширование, шифрование, генерация лабиринтов/кроссвордов).
Firefox Hello not logging in
Объясните, где я налажал
Есть у меня «умные» RGB-светодиоды — WS2812. Сейчас тыкаю STM32 с libopencm3.
Проблема в том, что светодиоды светят только белым (255, 255, 255). Полагаю, что все нули, которые я им посылаю, интерпретируются как единицы. Вероятно, у меня какие-то проблемы с таймингами.
Светодиоды запитаны от блока питания 5V, микроконтроллер от 3.3V, земля общая.
Код:
#include <libopencm3/stm32/rcc.h>
#include <libopencm3/stm32/gpio.h>
int t0h = 3; // 0.375us (0.35±0.15us datasheet)
int t1h = 6; // 0.750us (0.70±0.15us datasheet)
int t0l = 7; // 0.875us (0.80±0.15us datasheet)
int t1l = 5; // 0.625us (0.60±0.15us datasheet)
void clock_setup() {
rcc_clock_setup_in_hse_8mhz_out_72mhz();
/* Enable GPIOA clock. */
rcc_periph_clock_enable(RCC_GPIOA);
}
void gpio_setup() {
/* Set GPIO3 (in GPIO port A) to 'output push-pull'. */
gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ,
GPIO_CNF_OUTPUT_PUSHPULL, GPIO3);
}
void sleep(int cycles) {
int i;
for (i = 0; i < cycles; i++)
__asm__("nop");
}
void send_h() {
gpio_set(GPIOA, GPIO3);
sleep(t1h);
gpio_clear(GPIOA, GPIO3);
sleep(t1l);
}
void send_l() {
gpio_set(GPIOA, GPIO3);
sleep(t0h);
gpio_clear(GPIOA, GPIO3);
sleep(t0l);
}
void main() {
clock_setup();
gpio_setup();
while (1) {
int led, bit;
for (led = 0; led < 5; led++) {
// green
for (bit = 0; bit < 8; bit++) {
send_l();
}
// red
for (bit = 0; bit < 8; bit++) {
send_h();
}
// blue
for (bit = 0; bit < 8; bit++) {
send_h();
}
}
sleep(400); // tres
}
}
ncrmnt, так как у него светодиоды из той же партииКлиент MSSQL (можно консольный)
Посоветуйте сабж. Не могу найти ничего вменяемого.
Дали мне какой-то connection string с логином и паролем. Порт 1433, я так понимаю, у них там MSSQL.
Какие тулкиты установлены у вас в системе?
Сейчас это особенно актуальный вопрос для всех тулкитофобов — GNOME в стандартной поставке всё ещё требует GTK+2, Firefox переходит на GTK+3, а GIMP как-то не спешит переходить, некоторые программы переносят с Qt4 на Qt5, но многие до сих пор остаются на Qt4.
Давайте узнаем статистику, какие версии каких популярных тулкитов установлены у пользователей LOR.
-
gtk2, gtk3, qt4, qt5
664 (49%)
********************************************************************************************************************************************************************************************************************************************************************************************************************************
-
gtk2, gtk3, qt4
197 (15%)
**********************************************************************************************
-
Только gtk2 и gtk3
108 (8%)
****************************************************
-
Только qt5
53 (4%)
*************************
-
gtk3, qt4, qt5
48 (4%)
***********************
-
gtk2, gtk3, qt5
46 (3%)
**********************
-
gtk2 и qt4
36 (3%)
*****************
-
gtk3 и qt5
36 (3%)
*****************
-
Только gtk2
33 (2%)
***************
-
Только gtk3
33 (2%)
***************
-
Только qt4 и qt5
32 (2%)
***************
-
gtk3 и qt4
26 (2%)
************
-
gtk2, qt4, qt5
23 (2%)
***********
-
Только qt4
13 (1%)
******
-
gtk2 и qt5
7 (1%)
***
Всего голосов: 1355
Вычисление местоположения модема
Как можно при помощи GSM/GPRS узнать, где физически находится устройство? Особая точность не нужна, достаточно только узнать, какой ближайший город.
Есть GPRS-модем, у него есть два IP-адреса: внешний и внутренний. Попробовал узнать местоположение при помощи geoip, используя внешний IP, показывает только страну.
Есть возможность какой-либо геолокации с таким раскладом? Может, есть какая-нибудь хитрая AT-команда для этого? Или USSD?
Или без GPS мне не обойтись?
| ← назад | следующие → |