Interaccionar con FireBase desde Arduino


Como  podemos ver en este blog en numerosas  entradas que hablamos de dispositivos de IoT, es  relativamente sencillo construir nuestros  propios dispositivos de IoT con algunos sensores y microcontroladores  como Arduino, NodeMCU, Raspberry  Pi, etcétera , lo cual le permitirán automatizar su hogar apoyándose en estos dispositivos como por ejemplo usando el servicio de Cayenne .

De hecho ,como ejemplo de lo  sencillo  y económico  que puede ser  la construcción de dispositivos   IoT desde un punto de vista más empírico , lo ideal es usar un o NodeMCU ESP-12E para   acceder a Firebase  

 

Picture of Bill of Materials

 NodeMCU ESP-12E  es muy barato (unos 6€)   ,  y al tener  wifi incorporado para conectarse a internet,  ya tenemos los elementos suficientes  para conectarnos a  bases de datos avanzada  en l anube como puede ser Firevase y   gracias a un hardware tan eficiente  (y por supuesto los servicios cloud de Firebase).

Precisamente  FirebaseArduino (abstracción completa de la API REST de Firebase expuesta a través de las llamadas de C ++ de una manera amigable con el cableado.)   es una biblioteca muy útil usada   para simplificar la conexión a la base de datos Firebase desde cualquier cliente Arduino .Esta biblioteca  como podemos imaginar  se encarga de todo el análisis de Json y puede realizar transacciones en tipos C / Arduino puros.

En un post anterior «Primeros pasos con NodeMCU y Firebase»  ya vimos un sencillo ejemplo de como ambos componentes pueden funcionar, Veamos a  a continuación  que podemos hacer c muchas mas cosas con esta famosa librería

 

class FirebaseArduino

Esta es la clase principal para que los clientes de Arduino interactúen con Firebase. Como es habitual con arduino  para referenciarla  y poderla usar necesitamos  introducir  esta libreria con un include  al principio del programa , como por ejemplo

 #include <FirebaseArduino.h>»

Esta implementación está diseñada para seguir las mejores prácticas de Arduino y favorecer la simplicidad sobre todo lo demás. Para casos de uso más complicados y más control, podemos usar la clase Firebase en Firebase.h.

Esta libreria debe ser llamada primero con void begin ( const String y host , const String y auth = «» )  , lo cual inicializa el cliente con el host y las credenciales de base de fuego dados.

Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);  //intentamos conectarnos a la base de datos Firebase con nuestras credenciales

Los parámetros son :

  • host : es decir el  host de base de datos de base de datos de Fierbase , normalmente X.firebaseio.com.
  • auth : credenciales  para la db  que pueden ser  una palabra  secreta o token.

 

Lo más sencillo  precisamente para pasar las credenciales de Firebase   a esta clase es usando  variables que  definiremos al principio del programa:

  • #define FIREBASE_HOST “xxxxxxxxxxxxxxx.firebaseio.com”
  • #define FIREBASE_AUTH “xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”

 

Veamos algunas funciones que podemos usar con esta clase:  pushInt,pushFloat, pushBool,pushString,push,setInt, setFloat,setBool,setString,set ,getInt, getFloat,getBool,getString,get,   las relacionadas con Firebaseobject(get,readevent)  .   asi como remove,stream, available,read ,success, failed,error

 

 

String pushInt ( const String & path , int value )

Anexa el valor entero al nodo en la ruta.Equivalente al POST de la API REST. Debe comprobar  success()  después de llamar. Devuelve la clave única del nuevo nodo hijo.

Los parámetros que usa:

  • path : La ruta del nodo padre.
  • value : valor entero que desea agregar al nodo.

 

String pushFloat(const String &path, float value)

Esta función anexa el valor flotante al nodo en la ruta.  Es equivalente al POST de la API REST. Debe comprobar   success()   después de llamar. Devuelve la clave única del nuevo nodo hijo.

Los parámetros que usa:

  • path : La ruta del nodo padre.
  • value : valor flotante que desea agregar al nodo.

String pushBool(const String &path, bool value)

Esta función anexa el valor booleano al nodo en la ruta.  Es equivalente al POST de la API REST. Debe comprobar el resultado de salida con  success()  después de llamar a a funcion . Devuelve la clave única del nuevo nodo hijo.

Los parámetros que usa:

  • path : La ruta del nodo padre.
  • value : valor Booleano que desea agregar al nodo.

String pushString(const String &pathconst String &value)

Esta función anexa el valor de cadena al nodo en la ruta.Es equivalente al POST de la API REST. Debe comprobar el resultado de salida con  success()  después de llamar a a funcion. Devuelve la clave única del nuevo nodo hijo.

Los parámetros que usa:

  • path : La ruta del nodo padre.
  • value : valor de la  cadena que desea agregar al nodo.

 

String push(const String &pathconst JsonVariant &value)

Esta función anexa los datos JSON al nodo en la ruta.Equivalente al POST de la API REST.   Devuelve la clave única del nuevo nodo hijo.

Parámetros

  • path : La ruta del nodo padre.
  • value : los datos JSON que desea agregar al nodo.

 

void setInt(const String &path, int value)

Escribe el valor entero en el nodo ubicado en la ruta equivalente al PUT de la API REST. Debe comprobar el resultado de salida con  success()  después de llamar a a función

Parámetros que usa

  • path : la ruta dentro de su base de datos al nodo que desea actualizar.
  • value : valor entero que desea escribir.

void setFloat(const String &path, float value

Escribe un  valor en coma flotante en el nodo ubicado en la ruta equivalente al PUT de la API REST.Debe comprobar el resultado de salida con  success()  después de llamar a a función

Parámetros necesarios:

  • path : la ruta dentro de su base de datos al nodo que desea actualizar.
  • value : el valor flotante que desea escribir.

void setBool(const String &path, bool value)

Escribe el valor booleano  en el nodo ubicado en la ruta equivalente al PUT de la API REST.  Debe comprobar el resultado de salida con  success()  después de llamar a a función  

Parámetros que usa

  • path : la ruta dentro de su base de datos al nodo que desea actualizar.
  • value :  valor booleano  que desea escribir.

void setString(const String &pathconst String &value)

Escribe el valor de la cadena en el nodo ubicado en la ruta equivalente a la PUT de la API REST. Debe comprobar el resultado de salida con  success()  después de llamar a a función

Parámetros que requiere:

  • path : la ruta dentro de su base de datos al nodo que desea actualizar.
  • value : valor de la cadena que desea escribir.

 

void set(const String &pathconst JsonVariant &value)

Escribe los datos JSON en el nodo ubicado en la ruta.  Equivalente al PUT de la API REST.  Debe comprobar el resultado de salida con  success()  después de llamar a a función

Parámetros necesarios:

  • path : la ruta dentro de su base de datos al nodo que desea actualizar.
  • value : datos JSON que desea escribir.

 

int getInt(const String &path)

Obtiene el valor entero ubicado en la ruta. Debe comprobar el resultado de salida con  success()  después de llamar a a función   Devuelve el valor entero ubicado en esa ruta. Solo será poblado si  success()   es verdadero. Requiere un único  parámetro path : la ruta al nodo que desea recuperar.

 

float getFloat(const String &path)

Obtiene el valor flotante ubicado en la ruta. Debe comprobar el resultado de salida con  success()  después de llamar a a función. Devuelve  un valor flotante ubicado en ese camino. Solo será poblado si un success()  ) es verdadero.

Requiere un único  parámetropath : la ruta al nodo que desea recuperar.

 

String getString(const String &path)

Obtiene el valor de cadena ubicado en la ruta.Debe comprobar el resultado de salida con  success()  después de llamar a a función.   Devuelve el valor de cadena ubicado en esa ruta. Solo será poblado si el   success()   es verdadero.

Requiere un único  parámetropath : la ruta al nodo que desea recuperar.

 

bool getBool(const String &path)

Obtiene el valor booleano ubicado en la ruta.Debe comprobar el resultado de salida con  success()  después de llamar a a función. Devuelve el  valor booleano ubicado en esa ruta. Solo será poblado si el éxito () es verdadero. Requiere un único  parámetro  path : la ruta al nodo que desea recuperar.

Es muy usado para  activar o desactivar un  nivel  lógico  en los pines binarios  en la placa ,por ejemplo para activar una salida a nivel alto  o bajo 

Ejemplo

      bool isLedOn = Firebase.getBool(“led”); // recuperamos el valor del objeto led de la sesión firebase

 

 

FirebaseObjectget(const String &path)

Obtiene el valor del objeto json ubicado en la ruta.Debe comprobar el resultado de salida con  success()  después de llamar a a función. Devuelve el valor FirebaseObject ubicado en esa ruta. Solo será poblado si el éxito () es verdadero.Requiere un único  parámetro path : la ruta al nodo que desea recuperar.

FirebaseObjectreadEvent()

Lee el siguiente evento en una stream ( secuencia).Esto solo tiene sentido una vez que se ha llamado a  stream() 

A la salida FirebaseObject tendrá [«type»] que describe el tipo de evento, [«path»] que describe la ruta efectuada y [«data»] que se actualizaron.

 

 

 

void remove(const String &path)

Elimina el nodo, y posiblemente el árbol completo, ubicado en la ruta.Debe comprobar el resultado de salida con  success()  después de llamar a a funcion.Requiere un único  parámetro path : la ruta al nodo que desea eliminar, incluidos todos sus hijos.

void stream(const String &path)

Inicia la transmisión de los cambios realizados en el nodo ubicado en la ruta, incluido cualquiera de sus elementos secundarios.

Debe comprobar el resultado de salida con  success()  después de llamar a a funcion Esto cambia el estado de este objeto. Una vez que se llama a esto, puede comenzar a monitorear available () y llamar a readEvent () para obtener nuevos eventos.

Requiere un único  parámetro path : la ruta dentro de su db al nodo que desea monitorear.

bool available()

Comprueba si hay nuevos eventos disponibles.Esto solo tiene sentido una vez que se ha llamado a  stream()  .Devuelve si un nuevo evento está listo.

bool success ( ) 

Devuelve   si el último comando fue exitoso.

bool failed ( ) 

Devuelve si el último comando falló.

 

const String &error()

 Devuelve el  mensaje de error del último comando si  failed() es verdadero.

 

 

 

 

 

class FirebaseObject

 

Representa el valor almacenado en Firebase , puede ser un valor singular (nodo de tipo leaf) o una estructura de árbol.

Las  funciones publicas  definidas para esa clase son las siguientes:

 

FirebaseObject ( const char * data ) 

Construir a partir de json.  Requiere un único  parámetro data : cadena formateada JSON.

 

bool getBool ( const String & path = «» ) const

Devuelve el valor como un booleano. .Requiere un único  parámetro optional : ruta en el objeto JSON.

 

int getInt ( const String & path = «» ) const

 Devuelve el  resultado como un entero.Requiere un único  parámetro optional : ruta en el objeto JSON.

 

float getFloat ( const String & path = «» ) const

Devuelve el valor como un flotador..Requiere un único  parámetro optional : ruta en el objeto JSON.

 

String getString ( const String & path = «» ) const

Devuelve el valor como una cadena.Requiere un único  parámetro optional : ruta en el objeto JSON.

 

JsonVariant getJsonVariant ( const String & path = «» ) const

Devuelve el valor como JsonVariant.Requiere un único  parámetro optional : ruta en el objeto JSON.

bool success ( ) const

Devuelve si hubo un error en la descodificación o el acceso al objeto JSON.bool 

 

failed ( ) const

Devuelve si  hubo un error en la descodificación o el acceso al objeto JSON.const 

 

String & error ( ) const

 Devuelve un mensaje de error si  failed()  es verdadero.

 

 

Mas informacion en  https://firebase-arduino.readthedocs.io/en/latest/

Anuncio publicitario

Extracción de datos de un pdf desde Java


A veces  necesitamos  extraer información de texto procedente de  ficheros  en formato pdf   por ejemplo  para automatizar la extracción de determinada información  relevante que contengan o simplemente porque deseamos guardar la información editable  en  otro formato mas amigable. En realidad es realmente interesante    intentar   automatizar esta  tarea  pues así nos   evitamos  manipulaciones manuales   y tediosas lo cual seguramente nos hagan perder mucho tiempo  con la gran escasez de este elemento de la vida moderna del que  tampoco disponemos

Vamos  a ver dos métodos  para hacerlo  usando el IDE  de  Eclipse y el lenguaje Java

Método 1; mediante un paso intermedio con conversión previa de los ficheros pdf a ficheros de texto

PDF to TXT Converter es una aplicación de Windows para convertir archivos pdf a archivos de formato de texto sin formato en modo batch. Este programa también admite la conversión de rango de páginas específicas a archivos txt  de modo que después de la conversión, obtendrá el texto editable del documento PDF original

PDF to TXT Converter

Esta  utilidad la podemos descargar   desde  aqui

Hay una pequeña pega con este programa, pues dado que es shareware en la versión gratuita   tiene  bastantes limitaciones ,entre ellas que no se procesaran más de 200 documentos de un sola vez  ( si se intenta con más de esa cantidad   el programa pierde el control)

Un punto a su favor es que permite convertir automáticamente directorios enteros  con contenido de ficheros pdf y de este modo no necesitamos seleccionar  uno a uno cuál de ellos queremos convertir ( pero no olvide que, a no ser que compre la version completa, solo debería contener como máximo 200  ficheros)

Como vemos ,lo interesante de este programa  es que permite convertir los  ficheros pdf a texto  lo cual nos facilitara  procesar estos  muy fácilmente desde   java

Ahora    vamos a   ver un ejemplo    cómo extraer  los metadatos de un documento  de tipo texto obtenido usando el programa anterior

La idea es que a partir de los pdf convertidos previamente a txt , es que iremos  leyendo el contenidos de cada fichero txt e  interpretando las cadenas extraidas de los pdf para buscar  por ejemplo cuatro  meta-datos que necesitamos , haciendo  cuenta del orden en el que aparecen asi como las palabras justo anteriors:
-meta1,
-meta2
-meta3
-meta4:

En esta búsqueda tiene sentido el número de orden en el que aparecen las cadenas anteriores a  la busqueda  pues según el orden en que aparezca corresponderá a un meta-dato u otro.

En este caso meta2 hay que buscarlo dos veces , pero según este orden la cadena siguiente es meta2 o meta4

Veamos el ejemplo;

//*******************************************************
//BLOQUE PRINCIPAL PARA EXTRAER  4 METADATOS de un fichero
//*******************************************************

//abre el fichero
Scanner in =null;
DecimalFormat formateador = new DecimalFormat(«####################»);
Integer contador=0;

//solo procesaremos los ficheros con la extrension txt
if (sub.matches(tipofichero)) try{

in = new Scanner(new FileReader(nombreFichero));
in.useLocale(Locale.ENGLISH);

//lee el fichero palabra a palabra

while (in.hasNext())
{
//lee primera palabra
String palabra = in.next();
caa=palabra;

if (procesa==true)
{
//System.out.println(«Palabra:»+palabra+ «contador=»+contador);

if (contador==1)
{instalacion=palabra;
}
if (contador==5)
{nif=palabra;
}

procesa=false;
contador++;

}

if (caa.matches(«pedido:»))
{
// System.out.println(«<<<Palabra pedido: ENCONTRADA:>>>»);
procesan=true;
contador++;
}

if (caa.matches(«instalación:»))
{
//System.out.println(«<<<<Palabra instalación: ENCONTRADA:>>>>»);//fecha
procesa=true;
contador++;
}

if (caa.matches(«NIF/NIE/Pasaporte:»))
{
// System.out.println(«<<<<Palabra NIF/NIE/Pasaporte: ENCONTRADA>>>>»);
procesa=true;
contador++;
}

//lee números
while (in.hasNextDouble())
{
// lee un double

double d = in.nextDouble();

if (procesan==true)
{
//System.out.println(«Número:»+formateador.format(d)+»contador=»+contador);
if (contador==3)
{pedido=d;
}
if (contador==7)
{linea=d;
}
procesan=false;
contador++;
}

}

} // while (in.hasNext())

//resumen de datos capturados del pdf convertidos en txt y capturada en 4 campos que necesitamos

System.out.println(«Instalacion:»+instalacion); //fecha
System.out.println(«Pedido:»+formateador.format(pedido));
System.out.println(«NIF:»+nif);
System.out.println(«Telefono:»+formateador.format(linea));

….

 

Método 2  directo usando la Liberia ItextPDF

iText es una biblioteca Open Source para crear y manipular archivos PDFRTF, y HTML en Java. Fue escrita por Bruno LowagiePaulo Soares, y otros; está distribuida bajo la Affero General Public License.

El mismo documento puede ser exportado en múltiples formatos, o múltiples instancias del mismo formato. Los datos pueden ser escritos a un fichero o, por ejemplo, desde un servlet a un navegador web.

Más recientemente, ha sido extendida a una biblioteca PDF de propósito general, capaz de rellenar formularios, mover páginas de un PDF a otro, y otras cosas. Estas extensiones son a menudo mutuamente excluyentes. Una clase te permite rellenar en formularios, mientras una clase diferente e incompatible hace posible copiar páginas de un PDF a otro.

El soporte de PDF de iText es, sin embargo, bastante extensivo. Esto soporta firmas basadas en PKI de PDF, cifrado de 40-bit y 128-bit, corrección de colores, PDF/X, gestión de colores por perfiles ICC, y es anfitriona de otras característica

Podemos descargar el fichero itextpdf-5.1.0.jar  desde el respositorio de Maven   o de esta web  http://www.java2s.com/Code/Jar/i/Downloaditextpdf510jar.htm

No debemos olvidar importar el jar desde el Ide  del  Eclipse   en propiedades del proyecto-->Java Build Path–>libraries –>Add External   JARs

Este es un ejemplo  de captura sencilla   de como procesar un pdf directaeente

import java.io.IOException;

import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfTextExtractor;

public class prueba {

/**
* @param args
*/
public static void main(String[] args) {
try {

PdfReader reader = new PdfReader(«d:/ttttt.pdf»);

System.out.println(«This PDF has «+reader.getNumberOfPages()+» pages.»);
String page = PdfTextExtractor.getTextFromPage(reader, 1);
System.out.println(«Page Content:\n\n»+page+»\n\n»);
System.out.println(«Is this document tampered: «+reader.isTampered());
System.out.println(«Is this document encrypted: «+reader.isEncrypted());

reader.close();
} catch (IOException e) {
e.printStackTrace();
}

}

}

Es importante la sentencia String page = PdfTextExtractor.getTextFromPage(reader, 1);  porque si ponemos 0 o un valor superior daría error

Como   gracias  a la librería podemos capturar la informacion del   fichero pdf y aplicar la clase Sacanne para analizar las cadenas     para buscar determinada  informacion  que queremos catalogar vamos a  ver   el ejemplo anterior  usando los mismos campos  y con la misma casuitica:

Este seria el mismo ejemplo de la  primer parte  , pero usando directamente los fichero pdf sin convertir a pdf:

import java.awt.Rectangle;
import java.awt.print.PageFormat;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.text.DecimalFormat;
import java.util.List;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;

import java.io.IOException;

import java.io.FileReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Scanner;
import java.util.Locale;
import java.io.FileNotFoundException;
import java.nio.charset.StandardCharsets;
import java.text.DecimalFormat;

import java.io.StringReader;

import java.util.Locale;
import java.util.Scanner;

import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfTextExtractor;

public class Main {

/**
* @param args
*/

public static void main(final String[] args) throws IOException {

String instalacion=»»;
String nif=»»;
double pedido=0;
double linea=0;
boolean procesa=false;
boolean procesan=false;
String tipofichero=»pdf»; // solo tomaremos ficheros con esta extension
String caa = substring(20);

String ruta = «D:\temp\ficheros\»;
String ficherox=»28348758018_20181201000002.pdf»;
String fichero=ruta+ ficherox;
System.out.println(«Fichero a analizar =» +ficherox);

int numero=ficherox.length()-3; //calcula donde empieza la extension del fichero
// System.out.println(«numero=»+numero);
String sub =ficherox.substring( numero); //calcula la extension del fichero
System.out.println(«Extension del fichero :»+sub);

//abrimos el PDF
PdfReader reader = new PdfReader(fichero);
int pages = reader.getNumberOfPages();
System.out.println(«Este PDF tiene «+pages+» paginas.»);

//empezamos la coversion a pdf
String page = PdfTextExtractor.getTextFromPage(reader, 1); ////<———————————————–aqui da errror
System.out.println(«Contenido del documento de la pagina «+pages);
System.out.println(«\n\n»+page+»\n\n»);

/////////////////////////////////////////////////////////////////////
//solo procesaremos los ficheros con la extrension pdf
////////////////////////////////////////////////////////////////////

if (sub.matches(tipofichero))

/// try

{

//para procesar el texto lo copiamos a una cadena
String nombreFichero = page ; //Fichero;

System.out.println(«Convertido salida del conversor a un String «);

//borra el scanner
// Scanner in =null;

//formatos de numeros
DecimalFormat formateador = new DecimalFormat(«####################»);

//inicializa conatdor
int contador=0;

//in = new Scanner(new FileReader(nombreFichero));///AQUI ESTA EL PROBLEMA PUES SCANNER NO EST ACEPTADNO EL STRING

Scanner in = new Scanner(nombreFichero);

in.useLocale(Locale.ENGLISH);
System.out.println(«Es correcto el pdfl Convertido salida del conversor a un String «);
//lee el fichero palabra a palabra

while (in.hasNext()) //leemos toda la cadena
{
//lee primera palabra
String palabra = in.next();
caa=palabra;

if (procesa==true)
{
//System.out.println(«Palabra:»+palabra+ «contador=»+contador);

if (contador==1)
{instalacion=palabra;
}
if (contador==5)
{nif=palabra;
}

procesa=false;
contador++;

}

if (caa.matches(«pedido:»))
{
// System.out.println(«<<<Palabra pedido: ENCONTRADA:>>>»);
procesan=true;
contador++;
}

if (caa.matches(«instalación:»))
{
//System.out.println(«<<<<Palabra instalación: ENCONTRADA:>>>>»);//fecha
procesa=true;
contador++;
}

if (caa.matches(«NIF/NIE/Pasaporte:»))
{
// System.out.println(«<<<<Palabra NIF/NIE/Pasaporte: ENCONTRADA>>>>»);
procesa=true;
contador++;
}

//lee números
while (in.hasNextDouble())
{
// lee un double

double d = in.nextDouble();

if (procesan==true)
{
//System.out.println(«Número:»+formateador.format(d)+»contador=»+contador);
if (contador==3)
{pedido=d;
}
if (contador==7)
{linea=d;
}
procesan=false;
contador++;
}

}

} // while (in.hasNext())
in.close();

//resumen de datos capturados del pdf convertido en txt

System.out.println(«Instalacion:»+instalacion); //fecha
System.out.println(«Pedido:»+formateador.format(pedido));
System.out.println(«NIF:»+nif);
System.out.println(«Telefono:»+formateador.format(linea));

//fin de metatados de un documento INDIVIDUAL en el xml

}

}

private static String substring(int i) {
// TODO Auto-generated method stub
return null;
}//CLASS
}

 

 

Con esta librería como vemos  podemos procesar  de un modo relativamente sencilllo   cualquier contenido de un fichero  pdf    de un modo muy potente  como acabamos de ver .

Cómo enviar correos de forma masiva gratis y sin limite


Si alguna vez  se  ha preguntado cómo enviar correos electrónicos de forma masiva  y prácticamente  sin límite  sin caer en spam , o lo que es lo mismo,  mandar emails,  newsletter o boletines a  destinatarios que haya recopilado con el consentimiento de esas personas, así como  a listas de correos, sin necesidad de ir enviándolos uno a uno,   en  este post   vamos  a ver como gracias al veterano servicio de calidad de  Mailrelay con más de 15 años online, usado  tanto de forma personal como profesional ,  es en realidad una  tarea bastante sencilla  hacerlo y todo ello sin coste alguno   usando este servicio web    que además  cuenta   prácticamente  una capacidad ilimitada (es decir 75.000 emails al mes, y gestión de hasta 15.000 suscriptores).  

Quizás  lo más  interesante de destacar es que el servicio de Mailrelay al contrario de otros servicios , es   gratuito  sin publicidad en las newsletters  pues  otros servicios  similares   ponen muchas trabas, y se aprovechan insertando publicidad , incluso en cuentas de pago básicas en algunos casos,   y además no tiene  límite de envío diario, no tiene  limitaciones de funcionalidades y ofrecen  soporte gratuito  ¿Por qué gastar esfuerzos de marketing en publicitar o r anunciar otra empresa?

En efecto   gracias a Mailrelay es posible  crear newsletter, enviar mailings, gestionar listas de suscriptores y analizar  campañas de email de   una forma  gratuita  y más ahora  que    ha sido actualizada  y mejorada  en  nueva version 3 que como vamos    ver en este video  hace  que sea realmente sencillo lanzar este tipo de e-mails

 

Como vemos  en el video esta nueva version V3  de Mailrelay cuenta  nuevo dashboard principal con menú superior y resumen de las últimas campañas,nuevo y potente editor drag & drop (que facilita la creación de newsletters, con bloques para redes sociales, vídeo, texto, grupos de imágenes, columnas, etc)  ,estadísticas mejoradas con más información y en tiempo real,posibilidad de segmentación por grupos de forma tradicional o utilizando los nuevos segmentos dinámicos ,automatismos mejorados y ampliados en base a registros, click o apertura de boletín , etc

De hecho  más de 200.000 clientes en todo el mundo incluyendo grandes empresas   lo están usando como  puede apreciarse  en el gráfico de abajo

 

Veamos  a continuación cómo realizar una  sencilla campaña con  Mailrelay   ,donde como  vamos a ver,  no es demasiado  difícil  pues la operativa se  reduce a la importación de   los contactos, crear una newsletter, enviarlas   y `por supuesto realizar   un seguimiento estadístico de todo,

Bien  veamos  como hacerlo  usando esta  veterana herramienta.

 

 

1- Importación de  contactos y creación de  lista de suscriptores

Suponiendo que tengamos cuenta gratuita con  Mailrelay , lo primero que tenemos que hacer es crear la «ubicación» donde vamos a incluir » nuestros contactos.Tenemos dos opciones bien diferenciadas: Grupos  y Segmentos .( los segmentos se diferencia porque los contactos que hay en ellos deben cumplir una condición y son dinámicos, por lo que su número de suscriptores es variable.)  Nos  iremos al menú «suscriptores» -> «grupos» y en esta pantalla haremos clic en el botón «añadir», para crear un nuevo grupo.

Crear un grupo es muy sencillo pues solo tenemos dos valores posibles para darle: Nombre  y Descripción ( !ojo pues esta es  solo un valor interno,  para que podamos organizar nuestra lista de contactos») .Añadiremos  un nombre al grupo y haremos click en «crear grupo».

Una vez hemos hecho clic en crear grupo veremos esta pantalla:

mailrelay email marketing tutorial v3

Ahora realizaremos una nueva importación, haciendo click en el botón «nueva importación» que podemos ver a continuación:

mailrelay email marketing tutorial v3

En la siguiente pantalla, vamos a ver las opciones de importación de las que disponemos actualmente Veamos las opciones:

  1.  Copiar y pegar
  2.  Subir Archivos > importar de un txt o CSV esta es la que usaremos ahora
  3.  Importar desde Mailchimp >

Al  marcar la opción, aparece un recuadro donde podemos arrastrar el fichero a subir. Puede importar un fichero CSV o TXT (también ha de estar separado por comas).En realidad no importa demasiado cuántos valores tengamos, pero debemos respetar que solo tengamos un contacto por línea, y que los campos estén separados por comas.

Bien, una vez tengamos ese fichero, lo que haremos será arrastrarlo a la casilla donde pone «arrastra el archivo». Una vez se haya subido el fichero, vamos a ver una pantalla bastante similar a la siguiente:

Como vemos en la imagen hay tres  puntos clave:

  1.  Campos y columnas: iremos usando  los desplegables y nos ayudaremos de la vista previa de los datos. En los desplegables de campo  hay campos de tipo «incorporado», campos que existen por defecto en el sistema, como nombre, dirección, ciudad, etc. No es necesario que los cree, simplemente importe los datos en ellos.
  2.  Importar en los grupos. Aquí elegiremos el grupo al que queremos importar los contactos (, solo tenemos que hacer click y seleccionarlo) 
  3.  Opciones adicionales. Por último podemos elegir qué hacer con los contactos existentes, si bien ignorarlos (los saltamos y no hacemos nada) o los sobreescribimos

Ahora solo queda hacer click en «importar» y se realizará la importación  del contenido del fichero  csv a la bbdd del servicio de Mailrelay .Una vez finaliza la importación de contactos veremos un pequeño resumen,con  el listado de emails importados, y el resultado, por si hubiera habido algún error o problema con el email en cuestión..

 

2· Crear una newsletter con el editor drag & drop de Mailrelay

Esta  nueva versión de Mailrelay incluye varias opciones para crear nuestros boletines, opción que  podemos ver en el menú «Boletines» –>«Boletines».

Aquí, si hacemos click en el botón «Añadir» como en los menús anteriores, veremos una pantalla  con cuatro opciones de edición de boletines:

  1.  Crear boletín. Con esta opción haremos uso del editor drag & drop para crear nuestro diseño de newsletter de forma fácil y rápida
  2.  Pegar código. Si disponemos de un diseño de boletín en html, podemos importarlo pegándolo directamente en un editor clásico
  3.  Subir archivo zip. Funciona igual que la opción anterior, pero importando directamente
  4.  Importar desde una URL. Otra función similar, en esta ocasión importaremos desde una URL. Importante: las páginas web hacen uso de CSS, Javascript externos, menús, etc. Por lo que no se importarán bien, o no se enviarán bien como un email. No importes la URL de una web
Elegimos la opción «crear boletín», y lo primero que tendremos que hacer será rellenar    la típica información que enviaríamos en un e-mail:
  1.  Asunto. El asunto de nuestro email, el subject o título, es lo que verán los contactos al recibir en su cliente de correo.
  2.  Previsualizar texto. Es el texto de la precabecera, un pequeño texto que aparece después del asunto en algunos clientes de correo.
  3.  Remitente. Aquí pondremos el email de remitente que vamos a emplear, por defecto podemos elegir el email con el que hemos creado la cuenta.
  4.  Grupos. Y el grupo que hemos creado lo seleccionaremos aquí.

Cuando ya lo tenemos todo listo, haremos click en el botón «Siguiente» de la esquina inferior derecha y  pasaremos a una pantalla donde podremos seleccionar una plantilla de base . Podemos elegir la que queramos y haremos  click de nuevo en «siguiente».

► El editor drag & drop para crear newsletters

Este editor es muy sencillo de utilizar pues tenemos dos espacios bien diferenciados, a la izquierda la visualización de la plantilla.Lo  destacado es que si pasa sobre cualquier elemento verá que se superpone un menú flotante que nos permite: Mover el elemento, Editarlo,Duplicarlo o eliminarlo. Asimismo en las imágenes verá también la opción de «buscar imagen» para sustituir la imagen por defecto por una de las que tenga en su equipo.

Bien,  en la parte  derecha veremos esto:

opciones del editor de Mailrelay

Como vemos ,los elementos que tenemos disponibles son:

  1.  Texto. Para insertar un cuadro de texto, donde poder escribir, insertar enlaces, y en general darle el formato que queramos.Los bloques de texto funcionan igual que las imágenes, solo tiene que arrastrar el bloque en cuestión a la zona donde quieras ubicarlo.Recuerde, una vez arrastrado el bloque de texto, hacemos clic en «editar»:Tenemos tres opciones:
    1.  Contenido. Este será el contenido de texto del bloque
    2.  Diseño. Valores como tipo de fuente, tamaño, alineación, etc
    3.  Configuración. Número de columnas
  2.  Imagen. Nos permite insertar una imagen.Si ya tenemos un elemento de imagen solo tenemos que hacer click en el botón «buscar imagen», y si no, primero arrastraremos un elemento de tipo «imagen»a la zona de edición.Al hacer click en «buscar imagen» y en la caja donde pone «Drop files here to upload»?Aquí podremos pinchar y elegir la imagen de nuestro equipo, o arrastrar la imagen, con lo cual la veremos aparecer.Una vez hecho eso, solo tenemos que hacer click en la imagen que queremos utilizar, se situará en la parte izquierda, y podremos hacer click en el botón «usar archivo», lo que hará que la imagen aparezca en el editor de esta forma:
  3.  Imagen con leyenda. Si tenemos que poner una imagen que incluya una leyenda.Para empezar solo tenemos que arrastrar este bloque a donde queramos posicionarlo.Elegiremos
    1. Número de imágenes. Elegiremos  las imágenes que deseemos incorporar
    2.  Posición de las columnas. Podemos tenerlas una al lado de otra, o una encima de la otra
    3.  Posición de la leyenda. Esto hace referencia a la posición del texto, arriba de la imagen, o debajo
  4.  Grupo de imágenes. Para insertar más de una imagen en nuestra newsletter
  5.  Botones de redes sociales
  6.  Divisor
  7. Vídeo

Con estas opciones tendremos más que suficiente para crear un buen diseño para nuestro email.

Estos elementos los podemos arrastrar a la parte izquierda para crear elementos de forma fácil, como vemos en la siguiente imagen:

 

► Añadir el nombre del contacto

Antes hemos subido nuestra lista de contactos incluyendo el nombre, así que quizás  se pregunte ¿cómo incluimos el nombre en la newsletter? Pues editaremos el bloque de texto donde queremos incluir el nombre, posicionamos el cursor del ratón donde queremos añadir el nombre y utilizamos el desplegable «Variables» , En el mismo bajamos hasta encontrar la sección «Suscriptor» y elegimos la opción «Nombre» y ya cuando envíe la newsletter esta variable se sustituirá por el nombre del contacto en cuestión.

► Añadir  el enlace de baja

Al igual que en el caso anterior, vamos a utilizar el editor, pero en este caso, la variable que seleccionaremos será una de las opciones de «URLs de baja»:

editor de newsletter mailrelay enlace de baja

Tenemos varias opciones aquí:

  1.  URL de baja normal. Cuando el suscriptor hace click, se da de baja inmediatamente
  2.  URL de baja con confirmación por email. Cuando el suscriptor hace click recibe un email de baja en el que ha de hacer click para confirmar
  3.  URL de baja de grupo. Solo da de baja al suscriptor en el grupo en el que ha realizado el envío

Si hace click en esta opción, verá que inserta en el editor algo como esto:{{ unsubscribe_url }}

Y ya está. Ahora que tenemos la newsletter lista y preparada, la guardamos utilizando el botón de la esquina inferior derecha:

guardar plantilla de newsletter

 

3· Enviar una newsletter 

Vamos a entrar en la última parte  realizando el envío del boletín, así que lo  primero que tenemos que hacer es volver al menú «Boletines»– «Boletines», y ahi veremos un listado de los boletines ,.

Ahora miremos un poco más a la derecha:verás por cada línea, una serie de iconos como estos:

enviar newsletter gratis con Mailrelay

De izquierda a derecha esos enlaces  tienen esta  funcionalidad:

  1.  Enviar newsletter ( no esta por casualidad en primer lugar) ,Al hacer click en el mismo veremos una pantalla de errores posibles.Lo bueno, es que si hace click en los enlaces, puede ver cómo se deben realizar estas configuraciones.
  2.  Duplicar
  3.  Mostrar (visualizar el boletín)
  4.  Editar
  5.  Borrar

 

enviar newsletter gratis con mailrelay

 

Si seguimos un  poco más abajo tenemos otras dos opciones más:

  1.  Enviar boletín a un grupo o segmento. Opción con la que podríamos enviar el boletín al grupo donde hemos importado los suscriptores.
  2.  Enviar un boletín de prueba. De esta forma nos podemos enviar una prueba de boletín, para ver cómo queda la newsletter en nuestro cliente de correo
  3. Y para terminar  como tercer punto podemos ver que es posible programar el envío para una fecha determinada o enviar la newsletter en ese momento

Bueno, en todo caso  pulsando el primer botón de enviar newsletter , ya tendremos nuestro mailing enviado por lo que sólo nos queda comprobar que efectivamente ya se ha enviado  asi como lo datos estadisticos.

 

4- Las estadísticas del envío 

Es interesante cerciorarse que en efecto el envío de la newsletter se ja realizado con éxito , así que nos  iremos al menú «informes» – «boletines enviados». Aquí vemos una lista de los boletines enviados:

listado de mailings enviados

Es importante fijarse  que el estado indique  «completado», ya que en otro caso indicaría si está en proceso o cualquier posible error.

También en esta pantalla de boletines enviados podemos ver un pequeño resumen, de emails enviados, visualizaciones y clicks, aunque de todas formas si queremos ver el detalle del envío podemos hacer click en el asunto de la newsletter e iremos a una pantalla con más detalle:

estadísticas de mailing

Como  podemos ver en esta pantalla a modo de  resumen rápido y general podemos  ver información rápida de: Emails entregados, cantidad y porcentaje, Emails rebotados, Visualizaciones y porcentaje (es posible que un mismo suscriptor abra varias veces el email) y  Clicks y porcentaje

Pero ademas fíjese que tenemos más menús, al lado de la flecha: Emails enviados, Visualizaciones, Clicks, Baja y  Reenviado. En estos menús tenemos mucha más información, como los contactos que han abierto, los que han hecho click, el mapa de click,geolocalización, etc .

Si le interesa en su blog  puede ampliar mas información al respecto .

 

 

 

Creemos  que para una primera toma de contacto, ya hemos visto los aspectos más importantes de lo que se puede hacer con una nueva cuenta de Mailrelay en su nueva version  V3  ,  que como decíamos en la introducción, es uno de  las pocas servicios gratuitos ,·que no tiene límite diario de envío, y  que  como hemos visto , incluye  una ingente  número de funcionalidades  extra  .

Además  un aspecto que no debemos  desdeñar de la  funcionalidad de Mailrelay ,  es que  no incluyen publicidad en sus newsletters, pues la verdad suena un poco anacrónico que para  intentar informar de algún producto nuevo , una novedad  o lo  que sea que queramos enviar a nuestra  base de clientes  o usuarios   tengamos  que incluir publicidad  de terceros ¿a  que sonaría bastante raro verdad?  

 

Como eliminar la luz residual de las luminarias con leds


Puede  que al realizar una pequeña instalación en la que hacemos uso de luminaria basada en diodos  LED nos hayamos  topado con un curioso fenómeno  que al pagar esta   queda una levísima  iluminación que solo se  advierte claramente si nos quedamos a oscuras.

Este fenómeno que no ocurre no existe con las luminarias incandescentes se explica  porque los leds llegan a lucir (aunque muy débilmente) con corrientes del orden de pocos microAmp , lo cual ya es suficiente  de hecho para que a  podemos observar una débil luz( similar al efecto de ver carteles fluorescentes  que con la luz que destellan)

Con esta anomalía  podemos tener la sensación molesta de que estamos ante un relativamente molesto  gasto de suministro eléctrico ,si bien es mínimo   dado la mínima corriente que los atraviesa  y que por tanto consumimos

Es cierto que hay personas que no les molesta en absoluto este efecto pues por la noche gracias a «ese defecto» podemos ver lo justo para ir a cualquier parte de la casa sin encender la luz en plena oscuridad..¿pero y si deseamos   que no se encienda en absoluto? Pues veamos como solucionarlo

 

Cables y derivaciones en lamparas de sobremesa o de pie

Antes de conectar o desconectar elementos , en caso de lamparas de  sobremesa, de pie, de mesa ,flexo,etc si tiene conectadas luminarias de leds , podemos probar los siguientes recursos:

  • Invertir la forma de conectar el enchufe a la toma de corriente ( es decir invertir la fase por el neutro y viceversa)
  • Probar con otra luminaria de otra marca o modelo ( podría se defecto de la propia bombilla de led sobre todo si es de origen asiático de bajo coste)
  • Revisar el cableado  interior  pues si toca uno de los cables con el apantallado metálico ademas de ser peligroso podria hacer suficiente masa para que se encienda la luminaria levemente
  • Reemplazar el interruptor monopolar por bipolar , es decir que corte no solo uno de los cables ( fase o neutro ) sino ambos a la vez.

Interruptores con testigos de neón

Esta particular característica de los leds está creando un nuevo problema cuando estos se usan para iluminación porque las instalaciones eléctricas, muchas veces tienen diferencias de potencial a tierra que generan pequeñas fugas de corriente y que no dejan que las lámparas de leds se apaguen completamente.

Este  fenómeno es especialmente persistente  cuando se usan interruptores de encendido con luz de señalización con neón como podemos observar en el  esquema de abajo  donde el testigo de neón con la correspondiente resistencia va en paralelo con el propio interruptor:

.

 

Es evidente en el esquema  anterior que si abrimos el interruptor  , la lampara de neon  y la resistencia de 330k quedará en serie  con la luminaria de leds, lo cual en muchos caso sera suficiente para que este conjunto resistencia-neón  deje pasar la suficiente corriente  para que se ilumine levemente la luminaria.

Por  tanto si deseamos eliminar este efecto residual bastará eliminar el testigo de neón del interruptor ( suelen ir separados del interruptor  y enchufables para sustituirlo fácilmente en caso de que se fundan) 

Pero ¿Y si no desea eliminar el testigo del interruptor?  pues para eliminar la luminosidad residual en las lámparas a leds podemos aprovechar dos factores:

  • Que  la corriente que atraviesa el circuito es muy baja.
  • Que es necesario superar un umbral de tensión para que los leds se enciendan , umbral  que dependerá de como esten conectados en la luminaria (  más alto si los leds están conectados en serie).

¿Y como lo logramos ? pues  lo que tenemos que hacer es conectar en paralelo con   la luminaria una resistencia de  1Mohmio  para lograr que la caída de tensión sobre la lámpara, cuando esta se encuentra apagada, sea más baja de la tensión de umbral citada.

Naturalmente, debido a que existen numerosos tipos de lámparas, será necesario probar experimentalmente el valor justo.

Podemos empezar con un valor muy alto, por ejemplo 1Mohms , lo cual dará una corriente de I=V/R =220/1.000.000 =0,00022 ( es decir 2.2mA  ) ,   que en  potencia disipada seria =I^2 x R = 0,00022*0,00022*100000= 0.0484W , lo cual es asumible con una simple resistencia de 1/4W)

Si no logramos que los leds se apaguen puede ir bajando de forma  muy conservadora este valor pues a medida  que disminuya este valor la corriente y la potencia disipada por esta resistencia serán mayores

Como referencia , como tope de valores podemos estar en 1/4 de Watt con valores por encima de 330K con 220V y 100K con 110V. 

 

Por cierto,  hay personas  que precisamente buscan potenciar   el fenómeno de la luz residual de los leds   por ejemplo, conectando una resistencia de algunos K en paralelo con los interruptores de alimentación de 12V en modo tal que quede una débil luz en el ambiente para permitir de ver cuando todas las luces están apagadas. Es un sistema realmente cómodo. 

Solución con rele 

Tal y como hemos hablado con las lamparas de sobremesa , muchas veces el problema se debe a que los interruptores no cortan por completo los dos hilos ( fase  y neutro ) de la instalación ya que suelen ser monopolares . Ademas  para empeorar al situación en algunas y instalaciones esta conectado el neutro en lugar de la fase al interruptor (o incluso hay instalaciones con fase y fase en lugar de fase o neutro como debería  ser )

 

En este caso no podemos hacer casi nada sino buscar un sistema que haga que ese resto de corriente no llegue a la luminaria provocando ese resplandor residual, para lo cual podemos optar por «un cortador de luz.» , es decir un «relé«o contacto que actúe cortando eléctricamente los dos hilos que llegan a la lámpara   y de esta manera impidiendo la llegada de tensión por ambos hilos simultáneamente.

El proceso consiste en separar ligeramente la luminaria del techo y colocar el «relé» entre los cables que llegan a la luminaria . De esta forma y una vez colocado de nuevo, cuando accionamos el pulsador de la luz sólo oiremos un muy ligero chasquido (es imperceptible) que nos indica que la corriente ha sido totalmente cortada y por lo tanto no llega residuo alguno que provoque el pequeño resplandor.

 

 

 

 

Solución  dudosa con condensador

Por último hay personas que optan   por conectar  un condensador  de .47uf en paralelo con lo podriamos llamarlo polos de la lampara, asi este absorbe la corriente residual y antes de completar su carga se descarga por el cambio de ciclo,

Es  una solución interesante aunque podría  tener un problema: la reactancia del capacitor es Xc = 1 / (2 * Pi * f * C ) = 1 / (2 * 3,14 * 50 * 0,00000047) = 6772 ohms. Por lo tanto, la potencia disipada por el capacitor será P = V * V / R = 7,15 Watts. Es decir, tendríamos un consumo extra de 7 Watts que se pierde en el condensador

 

 

Por cierto este efecto  al igual que no les afecta a todas las instalaciones   tampoco les afecta por igual  a todos las luminarias  dependiendo muchas veces del fabricante y  modelo para manifestarse o no este efecto cuanto menos indeseado   

Como buscar ficheros o carpetas de forma recursiva desde linea de comandos


A  veces  desde el interfaz de comandos   de windows , accesible mediante la ejecución de la orden «cmd»  desde todas las versiones ( en w10 incluso  desde Cortana ) , puede ser necesario buscar  ficheros o nombres de directorios que respondan a un cierto  patrón  y que   además estén   partir de un determinado directorio o carpeta hacia el interior.

Ejemplos  de  estas búsquedas puede  ser   sacar un listado de todas las fotos  que tenemos en una determinada ruta o unidad , saber cuantas fotografías con  un determinado patrón  tenemos almacenadas, cuantas canciones en mp3 tenemos  de un determinado título (por  ejemplo  con la palabra love :  *love*)  , o cuantos documentos excel existen que tengan que ver con determinado asunto.

Ambas casuísticas de  buscar  ficheros o directorios que respondan a un  patrón  determinado,  y que   además estén  dentro de de un determinado directorio , usando exclusivamente por   línea de comandos las resolveremos :

  • Mediante los comodines asteriscos  «*»o interrogaciones «?»:    con esto  buscaremos  ficheros o nombres de directorios que respondan a un cierto  patrón  
  • Con el parámetro de recursividad , es decir «/s»       :buscaremos  ficheros o nombres de directorios a   partir de un determinado directorio o carpeta hacia el interior

 

Photo by panumas nikhomkhai on Pexels.com

 

En efecto se  puede encontrar cualquier archivo en su pc  usando línea de comandos  simplemente  siempre que sepa el nombre   o parte del nombre del archivo usando los comodines :

  • El signo asterisco (*) , el cual  reemplaza cadenas de caracteres de longitud indeterminada. 
  • El signo   ? , el cual remplaza pero solo un carácter. Podemos especificar mas signos de interrogación. Con lo que si ponemos dir s???*.* Esto nos listaría los directorios y archivos con un nombre que empiecen por s y otras 3 letras cualquier mas unos carácter cualquiera, a continuación él.* que hace que se listen archivos con cualquier extensión.

Si no está seguro de dónde puede estar el archivo en su pc , puede lanzar la búsqueda desde  el directorio raíz de su pc, lo que significa que deberá  estar en C: \>( o en D:\ , E:\  en caso de tener varias particiones o  discos ). Una vez en el directorio raíz o el directorio en el que cree que se encuentra el archivo, simplemente   escriba dir  seguido  de  la mascara  y terminando el comando con el indicador de recursividad (/s).

Si, por ejemplo, supiera que el archivo que busca contenía la cadena «pepe»en algún lugar del archivo, escribiría:

       dir *pepe*.*  /s 

Como  vemos en el ejemplo anterior se  utiliza comodines (los asteriscos ) y además usamos  el modificador de comando «/ s»   para indicar al comando dir que busque el directorio actual y todos sus subdirectorios  ( es decir  que haga la búsqueda recursiva) .

Por ejemplo si no puede recordar ninguno de los nombres de los archivos, pero recuerda que se crearon en Microsoft Excel , podría, por ejemplo, escribir:

   dir *.xls /s 

En el ejemplo anterior, sabiendo que los archivos de Excel a menudo terminan con la extensión de archivo .xls, usamos el carácter de comodín  le indicamos a su pc  que busque cualquier archivo que termine con la extensión .xls.

 

Extensiones más comunes de archivos

Si no sabe cuál es la extensión de su archivo, hay docenas de diferentes formatos de archivo de audio , estándares y extensiones de archivo que se utilizan en la actualidad. A continuación se muestra una lista de las extensiones de archivo de audio más comunes:

  • .aif – archivo de audio AIF
  • .cda – CD de pista de audio
  • .mid o .midi – archivo de audio MIDI .
  • .mp3 – archivo de audio MP3
  • .mpa – archivo de audio MPEG-2
  • .ogg – archivo de audio Ogg Vorbis
  • .wav – archivo WAV
  • .wma – archivo de audio WMA
  • .wpl – Playlist de Windows Media Player

Extensiones de archivos comprimidos

La mayoría de los usuarios están familiarizados con los archivos comprimidos .zip, pero hay otros tipos de archivos comprimidos . A continuación se muestra una lista de las extensiones de archivo comprimidas más comunes:

  • .7z – archivo comprimido 7-Zip
  • .arj – archivo comprimido ARJ
  • .deb – archivo de paquete de software de Debian
  • .pkg – archivo de paquete
  • .rar – archivo RAR
  • .rpm – Administrador de paquetes de Red Hat
  • .tar.gz – archivo comprimido de tarball
  • .z – archivo comprimido Z
  • .zip – archivo comprimido en zip

Extensiones de disco y archivos multimedia.

Al crear una imagen de un disco u otro medio , todos los archivos contenidos se guardan en un archivo de imagen. A continuación se muestran las extensiones de archivo de imagen de disco más comunes:

  • .bin – Imagen de disco binario
  • .dmg – imagen de disco de macOS X
  • .iso – imagen de disco ISO
  • .toast – Toast imagen de disco
  • .vcd – CD virtual

Extensiones de archivos de datos y bases de datos

Un archivo de datos puede ser cualquier archivo, pero para el propósito de esta lista, hemos enumerado los archivos de datos más comunes que se relacionan con los datos utilizados para una base de datos, errores, información, importación y exportación:

  • .csv – archivo de valores separados por comas
  • .dat – archivo de datos
  • .db o .dbf – archivo de base de datos
  • .log – Archivo de registro
  • .mdb – archivo de base de datos de Microsoft Access
  • .sav – Guardar archivo (por ejemplo, guardar archivo de juego)
  • .sql – archivo de base de datos SQL
  • .tar – Archivo de archivos tarball de Linux / Unix
  • .xml – archivo XML

Extensiones de archivo ejecutables

El archivo ejecutable más común son los archivos que terminan con la extensión de archivo .exe. Sin embargo, otros archivos también pueden ejecutarse solos o con la ayuda de un intérprete :

  • .apk – archivo de paquete de Android
  • .bat – archivo por lotes
  • .bin – archivo binario
  • .cgi o .pl – archivo de script Perl
  • .com – Archivo de comandos de MS-DOS
  • .exe – archivo ejecutable
  • .gadget – gadget de Windows
  • .jar – Archivo Java Archive
  • .py – archivo de Python
  • .wsf – Archivo de Windows Script

Extensiones de archivo de fuente

A continuación se muestran las extensiones de archivo más comunes utilizadas con las fuentes :

  • .fnt – archivo de fuente de Windows
  • .fon – archivo de fuente genérico
  • .otf – archivo de fuente de tipo abierto
  • .ttf – archivo de fuente TrueType

Formatos de archivo de imagen por extensión de archivo

Hay docenas de diferentes tipos de imágenes y extensiones de archivos de imágenes que se pueden usar al crear y guardar imágenes en la computadora. A continuación se muestra una lista de las extensiones de archivo de imagen más comunes:

  • .ai – archivo de Adobe Illustrator
  • .bmp – Imagen de mapa de bits
  • .gif – imagen GIF
  • .ico – Archivo de iconos
  • .jpeg o .jpg – imagen JPEG
  • .png – imagen PNG
  • .ps – archivo PostScript
  • .psd – Imagen PSD
  • .svg – Archivo de gráficos vectoriales escalables
  • .tif o .tiff – imagen TIFF

Extensiones de archivos relacionados con Internet

Internet es el recurso más utilizado en un ordenador y debido a que los servidores web usan otros ordenadores para servir los archivos, se utilizan muchísimas  extensiones de archivo diferentes. A continuación, encontrará una lista de las extensiones de archivo más comunes que encontrará al navegar por la web.

Las extensiones de archivo de imagen , las extensiones de archivo de video y otras extensiones enumeradas en esta página también podrían incluirse con estas extensiones de archivo que se mencionan a continuación:

  • .asp y .aspx – Archivo de página Active Server  de Microsoft
  • .cer – certificado de seguridad de internet
  • .cfm – ColdFusion Markup file
  • .cgi o .pl – archivo de script Perl
  • .css – archivo de hoja de estilo en cascada
  • .htm y .html – archivo HTML
  • .js – archivo JavaScript
  • .jsp – Archivo de la página del servidor Java
  • .part – Archivo parcialmente descargado
  • .php – archivo PHP
  • .py – archivo de Python
  • .rss – archivo RSS
  • .xhtml – archivo XHTML

Presentación de formatos de archivo por extensión de archivo.

Hoy en día, hay algunos programas que pueden crear una presentación.A continuación se muestra una lista de las extensiones de archivo más comunes asociadas con los programas de presentación:

  • .key – Presentación de Keynote
  • .odp – Archivo de presentación OpenOffice Impress
  • .pps – presentación de diapositivas de PowerPoint
  • .ppt – presentación de PowerPoint
  • .pptx – PowerPoint Open XML presentation

Programación de archivos por extensión de archivo.

Muchas extensiones de archivo se utilizan para programas antes de compilarse, así como secuencias de comandos de programación. A continuación se muestra una lista de las extensiones de archivo más comunes asociadas con la programación.

Muchas de las extensiones de archivo relacionadas con Internet también podrían incluirse con estas extensiones de archivo que se mencionan a continuación:

  • .c – archivo de código fuente C y C ++
  • .class – archivo de clase Java
  • .cpp – archivo de código fuente de C ++
  • .cs – Archivo de código fuente de Visual C #
  • .h : archivo de encabezado C, C ++ y Objective-C
  • .java – archivo de código fuente Java
  • .sh – Bash shell script
  • .swift – archivo de código fuente Swift
  • .vb – archivo de Visual Basic

Formatos de archivo de hoja de cálculo por extensión de archivo

A continuación se muestran las extensiones de archivo más comunes que se usan para guardar archivos de hojas de cálculo en un ordenador :

  • .ods – archivo de hoja de cálculo OpenOffice Calc
  • .xlr – archivo de hoja de cálculo de Microsoft Works
  • .xls – archivo de Microsoft Excel
  • .xlsx – Archivo de hoja de cálculo XML abierto de Microsoft Excel

Formatos de archivo y extensiones de archivo relacionados con el sistema

Como todos los demás programas, su sistema operativo usa archivos y tiene extensiones de archivo que son más comunes que otras. A continuación se muestra una lista de las extensiones de archivo más comunes utilizadas en los sistemas operativos.

Las extensiones de archivo ejecutables y todos los demás archivos también podrían incluirse en esta lista.

  • .bak – archivo de copia de seguridad
  • .cab – archivo de Windows Cabinet
  • .cfg – archivo de configuración
  • .cpl – archivo del panel de control de Windows
  • .cur – archivo de cursor de Windows
  • .dll – archivo de librería dinámica  de Microsoft DLL
  • .dmp – archivo de volcado
  • .drv – archivo de controlador de dispositivo
  • .icns – archivo de recursos del icono de macOS X
  • .ico – Archivo de iconos
  • .ini – archivo de inicialización
  • .lnk – archivo de acceso directo de Windows
  • .msi – paquete de instalación de Windows
  • .sys – archivo de sistema de Windows
  • .tmp – Archivo temporal

Formatos de archivo de vídeo por extensión de archivo

Hoy en día, hay docenas de tipos de archivos asociados con los archivos de video para agregar diferentes tipos de compresión , compatibilidad y DRM a los archivos de vídeo. A continuación se muestra una lista de las extensiones de archivo de vídeo más comunes:

  • .3g2 – archivo multimedia 3GPP2
  • .3gp – archivo multimedia 3GPP
  • .avi – archivo AVI
  • .flv – archivo de Adobe Flash
  • .h264 – archivo de video H.264
  • .m4v – archivo de video Apple MP4
  • .mkv – Contenedor Multimedia Matroska
  • .mov – archivo de película Apple QuickTime
  • .mp4 – archivo de video MPEG4
  • .mpg o .mpeg – archivo de video MPEG
  • .rm – archivo RealMedia
  • .swf – Shockwave flash file
  • .vob – DVD Video Object
  • .wmv – Archivo de Windows Media Video

Procesador de textos y formatos de archivo de texto por extensión de archivo.

Crear archivos de texto y usar un procesador de textos es una de las tareas más comunes en una computadora. A continuación se muestran las extensiones de archivo más comunes utilizadas con archivos de texto y documentos:

  • .doc y .docx – archivo de Microsoft Word
  • .odt – archivo de documento de OpenOffice Writer
  • .pdf – archivo PDF
  • .rtf – Formato de texto enriquecido
  • .tex – Un archivo de documento LaTeX
  • .txt – Archivo de texto plano
  • .wks y .wps – archivo de Microsoft Works
  • .wpd – documento de WordPerfect

 

 

Ejemplo  recopilatorio  final

Hemos visto que  una vez  tengamos  una pista del nombre  del fichero a buscar  y  sepamos el tipo de extensión del fichero , nos debería bastar  con usar los comodines   seguido del parámetro de recursividad /s  para  que el desde el intérprete de comandos podamos encontrar el o los archivos que lo cumplan teniendo en cuenta al mascar  así como el tipo de archivo de la  búsqueda

Además   podemos redirigir la salida estándar  por pantalla  por ejemplo a un fichero , lo cual haremos mediante el carácter de redirección  «>» seguida de la ruta del recurso en disco donde deseamos  salvar el resultado ( en el fichero  ejemplo.txt)  

A continuación se muestra un ejemplo de los resultados encontrados al buscar  de forma recursivos  de tipo log  (escribir dir  *. log  / S )   y ademas redirigiendo la salida a un fichero llamado ejemplo.txt en el disco d:

D:\temp>dir *.log /S > d:\ejemplo.txt


El volumen de la unidad D es DATOS
El número de serie del volumen es: 8256-F6F1

Directorio de D:\temp

30/04/2019 20:37 508 error.log
1 archivos 508 bytes

Directorio de D:\temp\_carga_xc_cc201903230706

23/03/2019 21:30 150 error.log
1 archivos 150 bytes

Directorio de D:\temp\_carga_ss_ccc201904112017

11/04/2019 21:34 100 error.log
1 archivos 100 bytes

Directorio de D:\temp\_carga_cce_ccde201904112017\carga_te_tde201904112017

12/04/2019 21:36 118.038 error.log
1 archivos 118.038 bytes

Directorio de D:\temp\_carga_xs_wer201904120910

26/04/2019 21:33 150 error.log
1 archivos 150 bytes

Directorio de D:\temp\_carga_qq_ddd201904231158_falta_matadatos

23/04/2019 20:33 100 error.log
1 archivos 100 bytes

Total de archivos en la lista:
6 archivos 119.046 bytes
0 dirs 262.141.583.360 bytes libres

D:\temp>

  El volumen en la unidad C no tiene etiqueta
 El número de serie del volumen es 214B-1DE8

Como se  puede ver en el ejemplo anterior, se encontraron varios archivos que contienen la extensión *log. Si recibe más de los resultados esperados, es posible si no redirige la salida a un fichero  ( es decir omita «> d:\ejemplo.txt»)  ,  que deba escribir / p después del comando pues usando / p mostrara  los resultados de una página a la vez. 

Primeros pasos con NodeMCU y Firebase


Hoy en día muchos dispositivos que usamos día a día se conectan a internet como la televisión, altavoces inteligentes, refrigeradores, Aires Acondicionados , etc …, dispositivos  que extienden sus funciones primarias  permitiéndoles  interactuar con otros dispositivos en internet siendo de  este modo  posible controlar estos  remotamente.

Como  podemos ver en este blog en numeras  entradas que hablamos de dispositivos de IoT, es  relativamente sencillo construir nuestros  propios dispositivos de IoT con algunos sensores y microcontroladores  como Arduino, NodeMCU, Raspberry  Pi, etcétera , lo cual le permitirán automatizar su hogar apoyándose en estos dispositivos como por ejemplo usando el servicio de Cayenne .

Como ejemplo de lo  sencillo  que puede ser  la construcción de dispositivos   IoT desde un punto de vista más empírico , vamos a ver como usando NodeMCU ESP-12E podemos  acceder a Firebase  para encender y apagar un  LED remoto. 

 

Picture of Bill of Materials

 NodeMCU ESP-12E  es muy barato (unos 6€)   ,  y al tener  wifi incorporado para conectarse a internet,  ya tenemos los elementos suficientes  para conectarnos a  bases de datos avanzadas  gracias a un hardware tan eficiente  y por supuesto los servicios de Firebase.

En esta ocasión aunque  NodeMCU ESP-12E cuenta con un puerto analogico  denominado A0 y 13 pines digitales numerados del D0 al D12, vamos a usar un puerto  interno al que  esta conectado el led interno denominado LED_BUILTIN y  de este modo no hace falta usar ningún componte externo

 

 

NodeMCU 

ESP12E   está basado en Arduino  pero cuenta   también conectividad wifi integrando la propia antena en la placa de circuito impreso en unas  dimensiones de  25.6mm x 34.2mm .  Además, por motivos de reducción de espacio . las  versiones más antiguas  de esta placa no integraban conexión usb  ( para lo cual necesitaremos un USB FTDI   para programarlo o un  controlador Setup CH340g).

Las características principales son las siguientes:

  • Incorpora una MCU de 32-bit de bajo consumo (Tensilica L106)
  • Módulo WiFi de 2.4 GHz
  • RAM de unos 50 kB
  • 1 entrada analógica de 10-bit (ADC)
  • 17 pines de entrada y salida GPIO (de propósito general)

Dentro de los diferentes módulos del ESP8266,(ESP01,ESP03,ESP04,ESP05,…ESP12)  destaca el ESP-12 o el ESP-12E, módulo que utiliza usando NodeMCU ESP-12E para procesar la información.

Básicamente estos módulos incorpora la memoria Flash para almacenar los programas o sketchs y la antena estando internamente los pines del ESP8266 cableados hasta los pines del módulo ESP-12 siendo así más fácil su acceso. 

En todo caso,  esta familia de placas todas cuentan con 11 pines digitales de entrada / salida, todos los pines tienen interruptor / pwm / I2C / 1-wire    siendo su chip principal el  ESP8266 CH340G , siendo una gran diferencia con una placa Arduino es que sólo cuenta  con 1 entrada analógica (entrada máxima de 3,3 V)

 

Respecto al firmware necesitará  subir el código a NodeMCU, pera el cual debería   programar el NodeMCU con el IDE de Arduino,

Veamos con mas detalles  como conseguimos configurar entorno de desarrollo tanto de Arduino como Firebase para que ambos puedan interaccionar entre si

 

Configuracion IDE de Arduino

1. Vamos a usar Arduino IDE para escribir el código . Si no lo tiene instalado  puede descargar la última versión del IDE aquí.

2. Puesto que estamos usando NodeMCU que no es oficialmente compatible con IDE de Arduino, tenemos que agregar el archivo JSON del dispositivo. En el IDE de Arduino añadir esta URL en  :

Archivo  > Preferencias >Gestor de URL’s Adicionales de Tarjetas : http://arduino.esp8266.com/stable/package_esp8266com_index.json

4. Seleccione la placa  pulsando en 

Herramientas > Placa >NodeMCU 1.0

4. Para utilizar la base de datos bases avanzadas en NodeMCU puede descargar la biblioteca de bases avanzadas-arduino que abstrae la API REST de las bases avanzadas  por los qeu necesitamos descargar la librería de Firebase desde github aquí.

5. Incluir el archivo zip descargado (firebase-arduino-master.zip)  en el IDE de Arduino.

Programa > Incluir Libreria  > Añadir .zip >  Seleccionar archivo  .zip descargado en el paso anterior

6. También necesitará instalar la biblioteca de ArduinoJson que puede descargarse desde el IDE de Arduino así mismo. Tenga en cuenta que la versión de la biblioteca no debe 6.x.x  por lo que debe utilizar la última 5.x.x

Programa > Incluir Libreria  > Añadir biblioteca .zip >Buscar  ArduinoJson  por Benoit Blanchon

 

Creación de una base de datos Firebase

7. Cree un nuevo proyecto de Firebase  desde la consola (necesitará   tener  cuenta de google   para crear proyecto de FireBase) y diríjase hacia la sección de base de datos. Seleccione la base de datos en tiempo real de bases avanzadas (firebase real-time database).

8. Necesitamos copiarnos   el código secreto de la base de datos para la autenticación desde el Panel de configuración > Cuentas de servicio.>Mostrar

 
 
 
Una vez copiado la clave secreta  ( que colocaremos en el código de arduino en #define FIREBASE_AUTH «XXXXXXXXXXX»),  nos iremos a la opción de DataBase, y  Realtime Database

9.Ahora debemos agregar un nodo asociado  a la base de datos de firebase. Tenemos que seleccionar Realtime Database  y  pulsar el botón de +  añadiendo el campo led . POsteriormente como veremos mas  adelante,  el  valor de  este campo decidirá si activar o desactivar el LED.

 


El tipo de dato  es booleano  ya  que según lo  pongamos a true o false esto accionará el led en el  NodeMCU ESP-12E  

 

Debemos actualizar la configuración de uso compartido de datos del proyecto NodeMCU.

 
Usar la configuración predeterminada para compartir datos de Google Analytics for Firebase , lo cual tendrá las siguientes consecuencias :
  • Compartir tus datos de Analytics con todas las funciones de Firebase
  • Comparte tus datos de Analytics con nosotros para ayudarnos a mejorar nuestros productos y servicios.
  • Comparte tus datos de Analytics con nosotros para habilitar el servicio de asistencia técnica.
  • Comparte tus datos de Analytics con nosotros para habilitar las comparativas.
  • Comparte tus datos de Analytics con los especialistas en cuentas de Google.
  • Aceptar las condiciones entre responsables del tratamiento de datos. Es obligatorio marcar esta casilla si vas a compartir tus datos de Analytics para mejorar los productos y servicios de Google. Más información


Asimismo  tenemos dos opciones de modo de uso de la BBDD:en modo bloqueo  o en  modo de prueba para el caso que nos corresponde para probar la  funcionalidad
Por último apuntaremos la  instancia de firebase  de acceso  que luego  insertamos en el código de Arduino  en  #define FIREBASE_HOST «xxxxxxxxxx.firebaseio.com/»
 
 
 
 

Configurar el IDE de Arduino y base de datos de Firebase a trabajar juntos

Ahora que hemos realizado todos los procedimientos de configuración,  vamos a comenzar la codificación  del código que ejecutaremos en  nuestro módulo NodeMCU

Para simplificar, vamos a escribir un código sencillo para encender y apagar  el LED interno  del NodeMCU    aunque realmente seria exactamente el mismo código si decidimos usar alguno de los 17 pines de entrada y salida GPIO (de propósito general), pues simplemente tendremos que conectar un led entre masa  y uno de los pines , cambiando la constante LED_BUILTIN  por un valor entero del 0 al 16  correspondiente al  número del puerto al  que hayamos conectado el led.

 

El código empleado es el siguiente:

 

         // By CRN   mayo-2019

#include <ArduinoJson.h>

#include <ESP8266WiFi.h>  

#include <FirebaseArduino.h>

// Firebase

#define FIREBASE_HOST «xxxxxxxxxxxxxxx.firebaseio.com»

#define FIREBASE_AUTH «xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx»

// Wifi

#define WIFI_SSID «wwwwwwwwwwwww»

#define WIFI_PASSWORD «pppppppppppppppppppp»


void setup()

{

Serial.begin(115200); //inicializa el puerto de salida a 115200

pinMode(LED_BUILTIN, OUTPUT);   //configurar el puerto interno como salida 
digitalWrite(LED_BUILTIN, HIGH);   //enciende el led interno

// conectando a la red wifi.

WiFi.begin(WIFI_SSID, WIFI_PASSWORD);  //conexión a la red wifi

delay(2000);   //espera la  conexión

Serial.println(«Conectando…»); 

while (WiFi.status() != WL_CONNECTED)  //bucle para esperar la conexión

{

Serial.println(«.»);  //mientras pintamos un puntito que sacamos por consola

delay(3000);

}

Serial.println(«Conectado»);   // ya hemos conseguido conectar por wifi

Serial.println(WiFi.localIP());   // pintamos la ip asignada 

 

// Configurando conexión a firebase

Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);  //intentamos conectarnos a la base de datos Firebase con nuestras credenciales

//fin configuración

}

 

void loop()  //bucle principal

{

//leer estado en Firebase el valor del registro led  y observar que el valor recuperado al ser booleano se asigna directamente a la variables es booleana

bool isLedOn = Firebase.getBool(«led»); // recuperamos el valor del objeto led de la sesión firebase

 

if (isLedOn)   // condicional  para decidir en función del valor recuperado de firebase si se enciende o no el led

{

digitalWrite(LED_BUILTIN, HIGH);  //encendemos el led 
Serial.println(«LED ON «); 
delay(2000);

}

else

{

digitalWrite(LED_BUILTIN, LOW);    //apagamos el  led 
Serial.println(«LED OFF»);
delay(2000);

}

 

}

 

 

En  el código anterior     en primer lugar se incluyen las librerías  necesarias  para hacer  toda gestión de conexión con Fireabase, así como las comunes de arduino para gestionar json  y las propias del ESP8266 

  • #include <ArduinoJson.h>
  • #include <ESP8266WiFi.h>  
  • #include <FirebaseArduino.h>

 

Después  se definen cuatro variables de tipo constante para almacenar: 

  • #define WIFI_SSID «Nombre de Router Wifi» Cambiaremos en esa a línea  la red del router WiFi al que nos vayamos a conectar
  • #define WIFI_PASSWORD «Contraseña del Router» Cambiaremos en esa  línea contraseña de su router WiFi 
  • #define FIREBASE_HOST «xxxxxxxxx.firebaseio.com» Insertaremos quie elnombre de la instancia de Firebase asociada a su usuario, para ello haremos clic en base de datos ahora se verá el nombre de host .Pulsamos Mostrar en imagen.Copiar el nombre sin el http en el código de Arduino 
  • #define FIREBASE_AUTH «xxxxxxxxxxxxxxxxxxxxxxxxxxx»Insertaremos la palabra secreta de Forebase ,para ello iremos  a Configuración > configuración del proyecto > cuentas de servicio > base de datos secreta .Copiar y pegar la palabra secreta  en el código 

Ahora   toca inicializa el puerto de salida a 115200,  ,configurar el puerto interno como salida  enciende el led interno

Asimismo es necesario  conectar la red wifi, que hacemos con un bucle para esperar la conexión  mientras pintamos un puntito que sacamos por consola

La última parte del bloque de configuración es la  conexión a firebase donde intentamos conectarnos a la base de datos Firebase con nuestras credenciales

LLegamos  ahora al cuerpo  principal (loop )    donde leeremos el  estado en Firebase el valor del objeto  led   y actuaremos   según su valor en el estado lógico de  un pin del GPIO   donde es  interesante  observar que el valor recuperado al ser booleano se asigna directamente a la variables que también es booleana.

La magia  se hace   justo con   esta línea «bool isLedOn = Firebase.getBool(«led»); «  donde  recuperamos el valor del objeto led de la sesión firebase

Finalmente mediante  condicional   decidiremos  en función del valor recuperado de firebase si se enciende o no el led

 

 
 

 

Este código ,  donde  incluiremos nuestras  credenciales del Firebase  y de nuestra red wifi,    lo subiremos   desde el IDE de Arduino  Programas > Subir y en seguida  deberíamos ver el led interno luciendo o apagado en función del estado del objeto led en su base de datos Febase

 

Ahora intente cambiar el valor del objeto led en  la base de datos a verdadero y falso. El led debería  encenderse  o apagarse en función del valor que hayamos seleccionado en el objeto led en Firebase .

Por supuesto   puede ampliar este proyecto si decidimos cualquiera de  los 17 pines de entrada y salida GPIO (de propósito general)  asi  como  manejar  estos    mediante la creación de una aplicación web   o móvil   que accionará los  puertos en lugar de cambiar manualmente el valor de la base de datos Firebase.

Además en este articulo hemos hablado de leer un objeto de Firebase desde  un  NodeMCU   pero también   es posible  enviar datos desde la placa para salvarlos en Firebase  y luego leer estos mediante una aplicación móvil o web, Sin duda el limite esta en nuestra imaginación …