2022/04/29

Buscando capacitación introductoria de SQL

En el marco de las cosas que estoy haciendo de IOT, andaba necesitando hallar capacitación gratuita de SQL para recomendar y lo primero que se me ocurrió fue buscar en Oracle, ya que tiene OracleDB y también MySQL. De paso busqué en Udemy filtrando con free, esta es mi experiencia. Aclaro que mi visión de todos estos cursos es un tanto limitada pues yo ya sé SQL, como que sólo puedo decir más o menos que tan completos o comprensibles son, destacando cuando hay algo interesante.

 

Oracle

El curso que hallé es https://devgym.oracle.com/pls/apex/dg/class/databases-for-developers-foundations.html dice que se puede hacer en unas 6 horas. Al comienzo me agarró una sensación de que aunque simpático era medio inusable, recién en el tercer bloque entré en sintonía. y empecé a considerarlo útil.

Tenés que darte de alta en:

  • https://www.oracle.com/index.html
  • view accounts
  • Oracle account
  • Create account

no hace falta cloud account, se puede usar gmail.

 

Tuve algunas dificultades con el SSO pero creo que fué más de capa ocho. Utilicé el método de preparar el mejor mensaje de consulta posible, esto es revisar a conciencia cada paso imaginándo qué me iban a preguntar y llegué a que tenía mal puesta la dirección en el keepass, lo cual me daba un comportamiento errático porque a veces copiaba esta dirección y a veces la llenaba a mano, muy confuso y difícil de diagnosticar.

Seguramente el comportamiento errático fue 100% por lo mío, pero como quedé medio traumatizado,  hago el login en oracle.com y luego voy a cada subsistema.

Cada módulo tiene varias secciones:
 

El video

 
Es muy simpático y aparentemente superficial, pero si prestás antención son muy didácticos.
 

Take live sql tutorial

 
Para los ejercicios tenés tres opciones, copio y pego:
 
 
 
Sólo probé la última. Cuando entrás en la sección  arriba a la derecha te ofrece login al laboraratorio
 
login
login

 
 
Luego a la derecha te replica los enunciados que tenías, asi no tenés que estar yendo y viniendo de tab.
 
enunciados
enunciados


 
Algunos tiene un botón de prerequistos. Todas las instrucciones las podés copiar y pegar o enviar directamente al editor, yo te recomiendo que las transcribas, es una manera de ir memorizando.
 

Further study

 
Respecto a esta sección, si estuviera corto de tiempo y tuviera que priorizar, les prestaría atencion a estos:
 

https://blog.jooq.org/say-no-to-venn-diagrams-when-explaining-joins/
https://blog.jooq.org/a-beginners-guide-to-the-true-order-of-sql-operations

 
En general, cuando te referencia a From Oracle Database 11g Release 2 Documentation Library y From Oracle-BASE son algo heavy, es el manual.
 

No relacionales

 
Menciona modelos no relacionales como Document Storage pero medio para apalearlos, obviamente son los amigos relaciones.
 

Si tu objetivo es el mismo que yo exploré, que es tener una idea de cómo operar sin meterte en detalles finos como los distintos tipos de bases de datos, o sea, si con
  • create table
  • insert
  • select
  • update
  • delete
  • una idea básica de cómo modelar y normalizar
te contenta y no partís completamente de cero, te puede servir. No le prestaría mucha atención al módulo de multi insert. Si lo tomás por favor dejame un comentario.

Cursos de Udemy


Udemy no es gratis, pero hay algunos cursos en algunos momentos que lo son, paso a detallar mi experiencia.

A beginner's guide to MySQL


https://www.udemy.com/course/mysql-basics

Media hora, inglés no nativo, mediocre.

Me hizo notar un detalle, que si no estás en embebidos ni se te pasa por la cabeza:

Para ejecutar MySQL necesitás un sistema operativo, al igual que con Erlang. Resultaría interesante saber que opciones hay para un sistema embebido baremetal o con FreeRTOS. Es difícil de buscar pues "database server bare metal" te lleva a la definión en el contexto de bases de datos que es tener el sistema operativo y nada más que el servidor de base de datos.
 
Otra dificultad es que al buscar "embedded database" ser refiere a un servidor que se puede incluir en la aplicación, por ejemplo para un servidor web en java existe  Jetty, https://github.com/cpantel/boxControl.

Busquemos entonces con "sqlite freertos" y tras varios saltos llegamos a https://sqlite.org/custombuild.html, mmh, podría... hacerlo otra persona, olvidemos el asunto pero sin olvidar que existe una opción comercial https://www.ittia.com/products/ittia-db-iot que parece interesante.

Volviendo al curso, empieza horrible, leyendo las presentación, luego mejora, va mostrando ejemplos de operaciones sin entrar en mucho detalle conceptual.


Lo que más me sirvió de toda esta experiencia es que repasé que para comparar con NULL es no es valor = NULL sino isnull valor, que de algún modo asocié en clase de Testing de Sistemas IoT que alguien había puesto en javascript:

if (value != NaN)

y cuando falló le pude sugerir que era

if ( isNaN(value) )



Me quedaron pendientes para otra vida:


2022/03/21

ESP32 con BMP280

En el marco del mínimo sistema IoT que he preparado para la futura materia Implementación de IoT, mientras se confeccionaba la lista de materiales para la carrera completa, hubo discusión acerca de si usar DHT11 o BMP280, ambos sensores de temperatura.


  • El DHT11 es más barato, usa un solo pin, pero es menos preciso.
  • El BMP280 usa I2C, dos pines y se deduce de la frase anterior que es más caro y preciso.

 

Lo que no se deduce es que el primero mide temperatura y humedad y el segundo además presión, salvo el modelo que he conseguido que no mide humedad.

Al DHT11, dependiendo de la presentación hace falta agregarle un resistencia de entre 5 a 10 K, le he puesto unas SMD rescatadas de unas viejas placas de una central telefónica hallada en un volquete en el centro cerca del trabajo.

 

DHT11 con resistencia SMD en los pines
DHT11 con resistencia SMD en los pines

 

Había implementado todo para DHT11 pero entre que las otras materias no lo iban a usar y que para ESP32c3 no funcionó, incorporé el BMP280 al ESP32c3 y luego al ESP32, llegando al punto de poder retirar al DHT11 de la lista de materiales, discusión resuelta. De todos modos quedó en el repo disponible.


Para la adaptación no hay ningún sufrimiento, hay que tomar la implementación con DHT11, borrar lo específico y reemplazarlo con el código de ejemplo de UncleRus, que es básicamente un include, elegir los pines, armar una estructura, inicializar y leer.

 

Respecto a los pines, a diferencia de DHT11 que usa un protocolo serial OneWire por software y se puede implementar en cualquier pin GPIO, BMP280 usa I2C por hardware, supuse que debía ser un subconjunto bastante menor.


Busqué en esp32-wroom-32_datasheet_en.pdf y nada. Por suerte luego hallé un tutorial https://randomnerdtutorials.com/esp32-i2c-communication-arduino-ide/ que decía que:

 

the SDA line may also be labeled as SDI and the SCL line as SCK.

 

y luego que se podían mapear a casi cualquier pin, supuse mal.

 

Alguna líneas interesantes del código, en estas se determina que chip es: 


bool bme280p = dev.id == BME280_CHIP_ID;
ESP_LOGI(TAG, \
    "BMP280: found %s\n", bme280p ? "BME280" : "BMP280");

 

Luego se manifiesta en los valores que se pueden completar:


if (bmp280_read_float( \
          &dev, \
          &temperature, \
          &pressure, \
          &humidity) != ESP_OK) {
  ESP_LOGI(TAG, "Temp./press. reading failed\n");
} else {
  ESP_LOGI(TAG, \
    "Press: %.2f Pa, Temp: %.2f C", pressure, temperature);
 

//if (bme280p) {
    sprintf(send_buf, REQUEST_POST, temperature , humidity );
//} else {
//    sprintf(send_buf, REQUEST_POST, temperature , 0);
//}
} 

 

Lo dejé comantado pues la verdad es que me dá lo mismo mandar un cero hardcodeado que uno proveniente de la lectura, pero es incorrecto, debería no enviar el valor y/o agregar un campo con el tipo de sensor, para diferenciar el cero de cero humedad del cero de cero lectura.

Este sistema está todo hecho así, una reducción muy básica con múltiples oportunidades de completar y mejorar. Si te viene interesando, podés implementarlo siguiendo las instrucciones y luego:

  • Agregar campos para reportar errores.
  • Agregar timestamp, pensá donde...
  • Enviar JSON en lugar de x-www-form-urlencoded.
  • Implementar algún DNS para usar nombres en lugar de IPs. 
  • Usar https en lugar de http.
  • Envíar vía MQTT en lugar de HTTP-POST.

Truquito, en el router fijá la MAC address del servidor a una IP y te va a facilitar la vida.

Se supone que quizás viste todo esto antes de llegar hasta acá:


https://seguridad-agile.blogspot.com/2022/03/ejemplo-de-esp8266-con-lectura-de-dht11planB.html


https://seguridad-agile.blogspot.com/2022/02/ejemplo-de-esp32-con-lectura-de-dht11.html


https://seguridad-agile.blogspot.com/2022/02/primer-contacto-con-esp32.html