GOOGLE ADS

viernes, 29 de abril de 2022

Cómo leer un sector usando una solicitud bio en el kernel de Linux

¿Cómo creo mi propia solicitud de biografía para leer un sector de la unidad de disco?

Estoy intentando lo siguiente pero congela el sistema.

static void read_bio()
{
struct bio *b;
struct page *p;
b = bio_alloc(GFP_KERNEL, 1);
if (!b) {
printk(KERN_INFO "bio allocation failed\n");
}
bio_init(b);
b->bi_sector = 10000;
b->bi_bdev = bd; /* "/dev/sda1" */
b->bi_end_io = bio_end_clone;
p = alloc_page(GFP_KERNEL);
if (!p) {
printk(KERN_INFO "page allocation failed\n");
}
bio_add_page(b, p, PAGE_SIZE, 0);
b->bi_private = p;
bio_get(b);
submit_bio(READ, b);
printk(KERN_DEBUG "submit read request\n");
}


Solución del problema

Es una vieja pregunta, pero de todos modos aquí está el código para leer, espero que ayude a alguien:

int readPage(struct block_device *device, sector_t sector, int size,
struct page *page)
{
int ret;
struct completion event;
struct bio *bio = bio_alloc(GFP_NOIO, 1);
bio->bi_bdev = device;
bio->bi_sector = sector;
bio_add_page(bio, page, size, 0);
init_completion(&event);
bio->bi_private = &event;
bio->bi_end_io = readComplete;
submit_bio(READ | REQ_SYNC, bio);
wait_for_completion(&event);
ret = test_bit(BIO_UPTODATE, &bio->bi_flags);
bio_put(bio);
return ret;
}

Y por escribir:

void writePage(struct block_device *device,
sector_t sector, int size, struct page *page)
{
struct bio *bio = bio_alloc(GFP_NOIO, 1);
bio->bi_bdev = device;
bio->bi_sector = sector;
bio_add_page(bio, page, size, 0);
bio->bi_end_io = writeComplete;
submit_bio(WRITE_FLUSH_FUA, bio);
}

pagese puede asignar con alloc_page (GFP_KERNEL). También para cambiar datos en pageuso page_address(page). Regresa void*para que puedas interpretar ese puntero como lo que quieras.

¿Cómo acceder a miembros estáticos de una clase?

Estoy empezando a aprender C++ y Qt, pero a veces el código más simple que pego de un libro da como resultado errores.

Estoy usando g++4.4.2Ubuntu 10.04 con QtCreator IDE. ¿Hay alguna diferencia entre la sintaxis del compilador g++ y otros compiladores? Por ejemplo, cuando trato de acceder a miembros estáticos, algo siempre sale mal.

#include <iostream>
using namespace std;
class A
{
public:
static int x;
static int getX() {return x;}
};
int main()
{
int A::x = 100; // error: invalid use of qualified-name 'A::x'
cout<<A::getX(); // error:: undefined reference to 'A::x'
return 0;
}

Creo que es exactamente lo mismo que se declara aquí y aquí (¿no es así?). Entonces, ¿qué tiene de malo el código anterior?


Solución del problema

Ha declarado que los miembros estáticos están bien, pero no los ha definido en ninguna parte.

Básicamente, lo que ha dicho "existe algún miembro estático", pero nunca reserve algo de memoria para ello, necesita:

int A::x = 100;

En algún lugar fuera de la clase y no dentro de main.

MQTT no puede conectarse al backend AWS IoT core

ACTUALIZADO: Estoy tratando de conectarme a un backend (AWS IoT Core) ya que estoy usando un wp77 pequeño con una imagen de busybox en ejecución. Cuando uso el puerto 8883, la conexión se agota, así que cambié al puerto 443 y puedo conectarme al backend, aún así, el socket se cierra después de tres intentos. Esta es la lectura del registro de mi aplicación:

14 de agosto 03:29:13 fx30s user.info Legato: INFORMACIÓN | mqttPrincipal[2717] | DSC conectado... iniciando conexión MQTT

14 de agosto 03:29:13 fx30s user.info Legato: INFORMACIÓN | mqttPrincipal[2717] |

14 de agosto 03:29:13 fx30s user.info Legato: INFORMACIÓN | mqttPrincipal[2717] |

14 de agosto 03:29:13 fx30s user.info Legato: INFORMACIÓN | mqttMain[2717]/mqttCliSvrComponent T=principal | mqttCliSvr.c DcsStateHandler() 317 | ¡rmnet_data0 conectado! Iniciando sesión MQTT

14 de agosto 03:29:13 fx30s user.info Legato: INFORMACIÓN | mqttClient[1120]/mqttClientApiComponent T=principal | mqttClientApi.c mqttClient_StartSession() 452 | Sesión de inicio llamada

14 de agosto 03:29:13 fx30s user.info Legato: INFORMACIÓN | mqttClient[1120]/mqttClientApiComponent T=principal | mqttClientApi.c mqttClient_StartSession() 455 | mqttClientPts NO NULO

14 de agosto 03:29:13 fx30s user.info Legato: INFORMACIÓN | mqttCliente[1120] | mqtt_StartSession... conectando...

14 de agosto 03:29:13 fx30s user.info Legato: INFORMACIÓN | mqttCliente[1120] |. Sembrando el generador de números aleatorios... ok

14 de agosto 03:29:13 fx30s user.info Legato: INFORMACIÓN | mqttCliente[1120] |. Cargando el certificado raíz de CA... cargar certificados desde certificados ok (0 omitido)

14 de agosto 03:29:13 fx30s user.info Legato: INFORMACIÓN | mqttCliente[1120] |. Cargando el certificado del cliente... /home/root/aws-iot/xxxxxx-certificate.pem.crt ok

14 de agosto 03:29:13 fx30s user.info Legato: INFORMACIÓN | mqttCliente[1120] |. Cargando la clave privada del cliente... /home/root/aws-iot/xxxxxx-private.pem.key ok

14 de agosto 03:29:13 fx30s user.info Legato: INFORMACIÓN | mqttCliente[1120] |. Conectándose a tcp/xxxxxx-ats.iot.ap-southeast-1.amazonaws.com/443...

14 de agosto 03:29:13 fx30s user.info Legato: INFORMACIÓN | mqttCliente[1120] | de acuerdo

14 de agosto 03:29:13 fx30s user.info Legato: INFORMACIÓN | mqttCliente[1120] |. Configurando la estructura TLS... ok

14 de agosto 03:29:15 fx30s user.info Legato: INFORMACIÓN | mqttCliente[1120] |. Realizando el protocolo de enlace TLS... ok

14 de agosto 03:29:15 fx30s user.info Legato: INFORMACIÓN | mqttCliente[1120] | [El protocolo es TLSv1.2]

14 de agosto 03:29:15 fx30s user.info Legato: INFORMACIÓN | mqttCliente[1120] | [El conjunto de cifrado es TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256]

14 de agosto 03:29:15 fx30s user.info Legato: INFORMACIÓN | mqttCliente[1120] |. Verificando certificado par X.509... ok

14 de agosto 03:29:15 fx30s user.info Legato: INFORMACIÓN | mqttCliente[1120] | ID de cliente: FX30S

14 de agosto 03:29:15 fx30s user.info Legato: INFORMACIÓN | mqttCliente[1120] | nombre de usuario:

14 de agosto 03:29:15 fx30s user.info Legato: INFORMACIÓN | mqttCliente[1120] | Intentando (1/3) conectarse a tcp://xxxxxx-ats.iot.ap-southeast-1.amazonaws.com:443...

14 de agosto 03:29:15 fx30s user.info Legato: INFORMACIÓN | mqttCliente[1120] | Consulta las opciones de conexión.

14 de agosto 03:29:15 fx30s user.info Legato: INFORMACIÓN | mqttCliente[1120] | MQTT serializa la conexión.

14 de agosto 03:29:15 fx30s user.info Legato: INFORMACIÓN | mqttCliente[1120] | Paquete de envío MQTT.

14 de agosto 03:29:15 fx30s user.info Legato: INFORMACIÓN | mqttCliente[1120] | bytes enviados: 31

14 de agosto 03:29:15 fx30s user.info Legato: INFORMACIÓN | mqttCliente[1120] | bytes totales enviados: 31 de 31

14 de agosto 03:29:15 fx30s user.info Legato: INFORMACIÓN | mqttCliente[1120] | MQTT esperando a CONNACK

14 de agosto 03:29:20 fx30s user.info Legato: INFORMACIÓN | mqttCliente[1120] | MQTT ahora está saliendo con -1

14 de agosto 03:29:20 fx30s user.info Legato: INFORMACIÓN | mqttCliente[1120] | Ha fallado

14 de agosto 03:29:20 fx30s user.info Legato: INFORMACIÓN | mqttCliente[1120] | tlsSocket_cerrar 1

Y este es el código, algo que tomé de github y que acabo de probar en mi dispositivo...

int MQTTConnect(Client* c, MQTTPacket_connectData* options)
{
Timer connect_timer;
int rc = FAILURE;
MQTTPacket_connectData default_options = MQTTPacket_connectData_initializer;
int len = 0;

InitTimer(&connect_timer);
countdown_ms(&connect_timer, c->command_timeout_ms);
if (c->isconnected) // don't send connect packet again if we are already connected
goto exit;
fprintf(stdout, "Check connection options.");
fflush(stdout);
if (options == 0)
{
fprintf(stdout, "MQTTConnect Set default options...");
fflush(stdout);
options = &default_options; // set default options if none were supplied
}

c->keepAliveInterval = options->keepAliveInterval;
countdown(&c->ping_timer, c->keepAliveInterval);
fprintf(stdout, "MQTT serialize connection.");
fflush(stdout);
if ((len = MQTTSerialize_connect(c->buf, c->buf_size, options)) <= )
goto exit;
#if 0
{
int i;
for (i=0; i<len; i++)
{
fprintf(stdout, "%.2x", c->buf[i]);
}
fprintf(stdout, "\n");
fflush(stdout);
fprintf(stdout, "\n%.*s\n", len, c->buf);
fflush(stdout);
}

Sinon: cómo crear un stub que resuelva múltiples llamadas

Parece sencillo crear un código auxiliar que devuelva diferentes valores en llamadas repetidas:
¿Es posible aplicar el método auxiliar dos veces dentro de una sola prueba para obtener resultados diferentes?

Pero, ¿cómo se hace esto con un método asíncrono que se resuelve en varias llamadas?

sinon(module, "myFunction")
.resolves('a')
.resolves('b')

Para ser claros, en el fragmento anterior, la segunda resolución sobrescribe la primera, por lo que siempre devuelve 'b'. Me gustaría el comportamiento donde 'myFunction' primero resuelve 'a' y luego resuelve 'b'.


Solución del problema

Aquí está la solución:

sinon(module, "myFunction")
.onFirstCall().resolves('a')
.onSecondCall().resolves('b')

Fórmula de consulta de rango de importación

ingrese la descripción de la imagen aquí

HOLA

No se puede acceder a Odoo Studio después de "desordenar" en propiedades/widget

En el estudio de Odoo, "jugué" en el widget donde hay una selección de tipo de datos como "flotante".

Cambié por error el tipo de "flotante" a otra cosa.

Que ahora no puedo acceder a Odoo Studio para volver a cambiar la configuración

quisiera saber como solucionar este error

¡Muchas gracias!

Odoo 14.0+e (Edición empresarial)

Error de la siguiente manera

Rastreo: TypeError: No se pueden leer las propiedades de undefined (leyendo 'dígitos') en Class._render ( https://mycompany.odoo.com/stock/static/src/js/forecast_widget.js:34:124 ) en https:/ /miempresa.odoo.com/web/static/src/js/fields/abstract_field.js:209:25


Solución del problema

Para volver a cambiarlo, puede abrir la vista que modificó en Studio, por ejemplo, si modificó el formulario de pedido de venta, abra cualquier pedido de venta en la vista y el enable developermodo de formulario y luego, desde debug iconseleccionar Edit view: Form, se mostrará la vista del formulario, vaya a la inherited viewspestaña y encontrará muchas vistas, pero encontrará que la vista con el nombre comienza con Odoo Studioun clic en él y luego se abrirá la vista heredada y desde Architecturela pestaña verá el código xml para que lo mire y comente el cambio del widget usándolo <!-- -->o eliminándolo.

Puedes revisar este video de YouTube

consulta mysql muestra varias tablas de una columna de ID

Estoy tratando de encontrar esta consulta donde quiero mostrar qué hosts usan qué plantilla de mi tabla Zabbix. El único problema es que los hosts y las plantillas están registrados en la misma tabla. Se mezclan en la tabla, por ejemplo, el ID 11813 es un host y el 11815 es una plantilla. Ahora encontré una tabla donde se define la relación entre estos 2: hosts_templates.

Esta tabla tiene 3 columnas: host_template id, hostid, templateid

La tabla hosts tiene muchas columnas, pero también contiene: hostid, nombre donde hostid contiene los hosts y las plantillas. los hosts de la tabla tienen una columna templateid pero NO SE UTILIZA.

En la tabla hosts_templates puedo ver qué hosts usan qué plantilla. El único problema es que veo las ID y quiero ver el nombre que coincide con esa ID. Lo que tengo hasta ahora:

salida de la tabla hosts_templates
salida de la tabla hosts_templates

salida del nombre, hostid de los hosts de la tabla
salida del nombre, hostid de los hosts de la tabla

lo que he intentado hasta ahora:

select name, name
from hosts_templates
inner join hosts on hosts_templates.hostid = hosts.hostid;
select name, name
from hosts_templates
inner join hosts on hosts_templates.templateid = hosts.hostid;

El resultado de estas consultas muestra la mitad de mi solución, pero duplicada.

el problema es que no puedo elegir un nombre diferente para la segunda columna, por lo que solo duplica la primera columna, que no es lo que quiero... Y como ya me he unido internamente al hostid, no puedo hacerlo por segunda vez. Así que necesito una combinación de las 2 consultas sql anteriores. Tengo la sensación de que estoy tan cerca, pero no puedo conseguirlo.

¡Cualquier ayuda sería muy apreciada!


Solución del problema

Tienes que unirte dos veces. Dale a la tabla diferentes alias para que puedas distinguirlos.

SELECT h1.name as host_name, h2.name AS template_name
FROM hosts_template AS t
JOIN hosts AS h1 ON t.hostid = h1.hostid
JOIN hosts AS h2 ON t.hosttemplateid = h2.hostid

Regla de Firestore para acceder a la generación de subcolección Permisos faltantes o insuficientes

Tengo problemas con las reglas de Firestore para permitir el acceso a algunos recursos en una subcolección. Tengo algunos requests document...