Todas las entradas de: pruebas

Como escribir en un tarjeta SD con Arduino

Como escribir en un tarjeta SD con Arduino

como escribir en un tarjeta SD
Adaptador SD para arduino

En nuestros proyectos muchas veces necesitamos como escribir en un tarjeta SD con Arduino para almacenar la información que nos devuelve los sensores en algún lugar para después poderlos descargar y procesarlos en nuestro equipo.

 

Materiales usados

Arduino UNO Arduino UNO
 Arduino Shield SD Shield para SD
protoboard Protoboard
cables_union Cables de conexión

Escribir y leer en una tarjeta SD desde arduino

La mejor forma para realizar eso, es aprovechas la multitud de accesorios que hay para Arduino  que incorpora ranuras para tarjetas SD (Arduino Wireless SD Shield).

Para trabajar con tarjetas SD, Arduino (Arduino Uno R3) dispone de una librería que nos facilita el trabajo de como escribir en un tarjeta SD. La librería que tenemos que incluir en nuestros programas es

#include <SD.h>

Esta librería, aparte de incorporar las funciones básicas para escribir y leer fichero, también dispone de varias funciones para el manejo de la tarjeta, como puede ser espacio disponible, formato de la tarjeta, manejo de fichero (creación y eliminación de ficheros), lectura y escritura de ficheros, etc.

Conexión del lector de tarjetas SD con Arduino

Para la comunicación del lector de tarjeta SD (SD Card Reader Module Slot Socket For Arduino ARM MCU) y el microcontrolador se utilizan 4 puertos digitales, lo habitual, por lo menos en los accesorios que he podido manejar, los puertos que manejan son los siguientes:

  • En el pin digital 4: SD_CS.
  • Pin 11: SD_DI.
  • En el 12 conectar: SD_DO.
  • y en el pin 13: SD_CLK.

Se podrían usan otros y configurarlos, pero la mayoría de los accesorias que soportan tarjetas SD (Samsung Evo MB-MP16DA/EU – Tarjeta de memoria Micro SDHC de 16 GB (UHS-I Grade 1 Clase 10, con adaptador SD)), suelen ser shield, tarjetas que se conectan directamente en los pines del Arduino. No pudiendo modificar los pines que utilizan.

El formato de archivos que soporta el Arduino es FAT16 o FAT32, y el el tamaño máximo de la tarjeta SD que suele soportar es de hasta 16Gb (Samsung Evo MB-MP16DA/EU – Tarjeta de memoria Micro SDHC de 16 GB (UHS-I Grade 1 Clase 10, con adaptador SD)).

Leer un fichero en la tarjeta SD desde Arduino

Para como escribir en un tarjeta SD tendremos que crear un objeto que sera el que se encargue de realizar las operaciones de escritura y lectura.

Declaración del objeto para el maneje de fichero.

File miFichero;

Una vez que hemos declaro el objeto, le asignaremos el fichero con el que queremos trabajar y el modo de apertura, podemos indicar la apertura en modo “FILE_WRITE”, este modo nos permitirá abrir el fichero en modo lectura y escritura, si el fichero no existiera, Arduino lo crearía y lo abriría, si por el contrario, el fichero ya existiera, Arduino lo abriría y las escrituras que realicemos, las haría al final del archivo.

MiFichero = SD.open(“Nombre_Fichero.ext”, FILE_WRITE);

Leer un fichero desde la tarjeta SD desde Arduino

Si lo que queremos es solo abrirlo para lectura solo los tendremos que abrir de esta otra forma.

MiFichero = SD.open(“Nombre_Fichero.ext”);

Si el fichero no existe, esta operación provocara un error. Para comprobar que un fichero existe la librería de SD de Arduino nos proporciona la siguiente función.

SD.exists(“Nombre_Fichero.ext”)

Nos devolverá true, su el fichero existe, por lo contrario, si no existe, nos devolverá false. Una vez que hemos abierto el fichero, solo nos queda escribir o leer de el. Para leer solo tenemos que utilizar la función “println” de la siguiente forma.

MiFichero.println(“Información a guardar en el fichero”);

Pero si lo que queremos es leer del fichero, utilizaremos esta otra función.

MiFichero.read();

Esta función nos devolverá un byte leído desde el fichero.

Si lo que queremos es leer una linea, por ejemplo, los haríamos de la siguiente manera.

Byte byteLeido;
String Cadena = “”;
while (miFichero.available())
{
    byteLeido = miFichero.read();
    if (byteLeido == 13)
    {
        break;
    }
    else
    {
        Cadena = Cadena + char(byteLeido);
    }
}

Después de terminar nuestras operaciones con el fichero, solo nos queda nada mas que cerrarlo. Para ello utilizaciones la función “close”.

MiFichero.close();

Esto hará que cerremos todas operaciones con el fichero.

Estas son solo una pocas funciones disponibles para  la lectura/escritura de como escribir en un tarjeta SD con Arduino (Arduino Uno R3), pero muchas otras disponibles, para obtener más información sobre la librería SD de Arduino puede consultar este enlace. https://www.arduino.cc/en/Reference/SD

Hacer ping con visual C#

h-pingLa forma más fácil de comprobar que un equipo esta “vivo” en nuestra red es haciendo un ping. Lo que hace este comando es enviar un paquete ICMP al equipo que queremos verificar, el equipo al recibir este paquete devuelve una confirmación de recepción. Con esta acción ya hemos comprobado que el equipo esta funcionando y conectado.

Cuando nuestro programa en Visual C# tiene que conectarse a cualquier otro equipo, nos puede interesar antes de ejecutar las funciones de conexión es si ese equipo esta disponible o no. Podemos confirmarlo fácilmente haciéndole un ping.

Hacer ping con Visual C#

En la biblioteca de .Net “System.Net.NetworkInformation” tenemos disponible una función que nos hará ese trabajo. Para poder usarla tendremos que agregar a nuestro proyecto la siguiente referencia “System.Net”, podemos agregar tambien el namespace “System.Net.NetworkInformation” para facilitar el trabajo con las funciones.

Para hacer ping tendremos que crear dos objetos, un objeto “ping” como tal, este el que enviara el paquete ICMP. Y el objeto PingReply, este manejara la información devuelta.

Ejemplo de uso:

Ping HacerPing = new Ping();
int iTiempoEspera = 5000;
PingReply RespuestaPing;
string sDireccion;
sDireccion = txtIP.Text;
RespuestaPing = HacerPing.Send(sDireccion, iTiempoEspera);
if (RespuestaPing.Status == IPStatus.Success)
{
    txtLog.AppendText("Ping a " +
        sDireccion.ToString() +
        "[" +
        RespuestaPing.Address.ToString() +
        "]" +
        " Correcto" +
        " Tiempo de respuesta = " +
        RespuestaPing.RoundtripTime.ToString() +
        " ms" +
        "\n")
}
 else
{
    txtLog.AppendText("Error: Ping a " +
        sDireccion.ToString() +
        "\n");
}

Explicación:

Creamos el objeto Ping.

Creamos una variable de tipo “int” para almacenar el tiempo de espera, este valor esta en milisegundos.

Creamos el objeto PingReply para el manejo de la respuesta del ping.

Variable de tipo “string” donde guardaremos la dirección IP del equipo que queremos verificar.

Hacemos el Ping, le pasamos como parámetros los la dirección Ip que queremos comprobar y el valor de tiempo de espera en milisegundos, este ultimo parámetro es opcional, indicándole la dirección Ip o el nombre del equipo seria suficiente. La respuesta se la pasamos al objeto PingReply.

Para comprobar el estado comprobamos el valor que nos devuelve PingReply.Status, este valor es del tipo “IPStatus”. Para saber si ha sido satisfactorio solo tenemos que comprobar que el estado es “IPStatus.Success”. Si se ha producido un error podemos comprobar el tipo de estado devuelto del “IPStatus”. Más información sobre “IPStatus” en la librería de MSDN

Desde el objeto PingReply podemos obtener otras informaciones, como puede ser la dirección Ip de la maquina remota, el tiempo que se ha tardado en realizar, valor devuelto en milisegundos, opciones que se ha utilizado para el envio del paquete ICMP o el buffer de los datos recibidos por el ICMP.

Personalizar la serialización de tipos en XML

Serialización con XML
Serialización con XML

Cuando queremos guardar en fichero XML alguna estructura de datos podemos recurrir a la serialización.

Con las funciones actuales disponibles para el manejo de XML en C# la serialización de estructuras de datos es relativamente sencilla. Pero el problema nos surge cuando en la estructura de datos hay algún tipo de objeto que, o no nos interesa el modo en que hace la conversión, por la razón que sea, o por que la serialización de ese objeto no esta soportada.

Para solucionar este problema C# nos proporciona los atributos [XMLIgnore], para indicarle al proceso de serialización que ignore ese objeto, y [XmlElement], donde le indicamos como se va ha convertir ese objeto.

Para indicar al proceso de serialización del XML que ese objeto lo ignore, solo tendremos que anteponer el atributo [XMLIgnore] delante del objeto que queremos. Por ejemplo:

[XmlIgnore]
public Image Imagen { get; set; }

En este caso el tipo “Image” no soporta serialización, por lo que la conversión la tendremos que realizar nosotros mismos.

Una que le hemos dicho que ignore ese objeto le tenemos que indicar como vamos a convertirlo. Para ello tendremos que crear nuestra función de conversión he indicarle que la use en para ese elemento. Para indicarle que objeto vamos a utilizar solo tenemos que utilizar el atributo [XmlElement(“Nombre_del_objeto”], le indicamos el nombre que le hemos dado al objeto, no el tipo. Por ejemplo:

[XmlElement("Imagen")]
public byte[] ConvertImageToByte
{
    // Devolvemos una cadena de byte cuando nos pasan la imagen
    get
        {
            byte[] ImagenByte = null;
            // Si el valor pasado es distinto a null, pasamos la conversión, sino pasamos null
            if (Imagen != null)
            {
                // Convertimos la imagen en un array de byte[]
                ImageConverter ConvertirImagen = new ImageConverter();
                ImagenByte = (byte[])ConvertirImagen.ConvertTo(Imagen, typeof(byte[]));
            }
        return ImagenByte;
    }

    // Devolvemos una imagen cuando nos pasan una cadena de byte[]
    set
    {
        // Si el valor pasado es null
        if (value == null)
        {
            // Devolvemos otro null
            Imagen = null;
        }
        else
        {
            // Convertimos el array de bytes[] en una imagen
            ImageConverter ConvertirImagen = new ImageConverter();
            Imagen = (Image)ConvertirImagen.ConvertFrom(value);
        }
    }
}

En el ejemplo se utiliza el objeto “Imagen” del ejemplo anterior que es de tipo “Image”, que no esta soportado por la serialización de XML. Lo que hacemos es convertilo en un array de byte para poderlo guardar en el fichero.

La parte del “get” la serialización de XML la utilizara cuando va ha grabar los datos, leeremos desde el objeto “Imagen” la imagen que queremos y con ayuda de la función “ImageConverter” la convertimos en un array de byte, le indicamos el formato que vamos a utilizar en el segundo parámetro que le pasamos a la función en este caso “typeof(byte[]).

ImageConverter ConvertirImagen = new ImageConverter();

ImagenByte = (byte[])ConvertirImagen.ConvertTo(Imagen, typeof(byte[]));

La parte del “set” la serialización de XML la usa cuando lee los datos desde el fichero de XML. Le pasara la cadena de byte que tiene grabada y cargara en la variable “Imagen” la imagen es su formato correcto, tipo “Image”. Para la conversión volvemos a utilizar la función “ImageConverter”, en este caso nos devolverá un objeto, para pasárselo a la variable solo tenemos que indicar que ese objeto es de tipo “Image”

ImageConverter ConvertirImagen = new ImageConverter();
Imagen = (Image)ConvertirImagen.ConvertFrom(value);

Si lo aplicamos a un objeto que es de un tipo soportado por la serialización de XML, lo que hará, sera ignorar su método de serialización y utilizar el que le indiquemos.

Si tienes alguna sugerencia sera bienvenida, deja un comentario.

Ajustar color de la fuente según el color de fondo en Visual C#

En ocasiones podemos necesitar ajustar el color de la fuente según el color del fondo del control. Por ejemplo poner el color de la fuente a blanco, por que el color del fondo es negro, o de cualquier otro color oscuro.

Esto se puede hacer calculando en nivel del color. Para este calculo yo utilizo la siguiente formula.

double coefienteOscuridad = 0.2126 * color.R + 0.7152 * color.G + 0.0722 * color.B;

Lo que hacemos es crear un coeficiente multiplicando cada valor de los calores básico por un coeficiente, ya que según el color básico hará que el color final sea mas o menos oscuro. Y por ultimo sumamos los resultado.

Según el valor devuelto podemos jugar con el color que deseemos.

Por ejemplo, si el coeficiente “coefienteOscuridad” es superior a 100, el color de la fuente sera negro, y por el contrario si el coeficiente es inferior el color de la fuente lo pongo a blanco.

El valor 100 lo he sacado de probar diferentes colores y ver como se distingue el texto.

Podemos jugar con el para ajustar el color de la fuente al color que más se ajuste a nuestras necesidades.

Ejemplo completo, en este ejemplo ajusta el color de la fuente, ha blanco o negro, de una celda de un dataGridView según el color de fondo de la celda:

// Calculamos el color de fondo para ajustar el color de la fuente
Color color = e.CellStyle.BackColor;
double coefienteOscuridad = 0.2126 * color.R + 0.7152 * color.G + 0.0722 * color.B;
// Indice de oscuridad
if ( coefienteOscuridad > 100)
{
// si el color es claro, el texto lo ponemos de color negro
e.CellStyle.ForeColor = Color.Black;
}
else
{
// si el color es oscuro, el texto lo ponemos de color blanco
e.CellStyle.ForeColor = Color.White;
}

Y con esto ya tendríamos ajustado el color de nuestra fuente para que sea totalmente legible, independientemente del color del fondo.

Si tienes alguna sugerencia o duda, no tengas ningún reparo en escribir un comentario.

Ejecutar aplicaciones con permisos de administrador en Visual Studio c#

En algunas ocasiones necesitamos que nuestras aplicaciones se ejecuten con lo privilegios de administrador. Para hacer esto en una aplicación desarrollada con Visual C# tenemos que añadir a nuestro proyecto un fichero de “Archivo de manifiesto de aplicación”. Para agregar el fichero, accedemos “Proyecto” – “Agregar nuevo elemento”, y seleccionamos “Archivo de manifiesto de aplicación”.

Captura_Agregar_Nuevo_Elemento

Esto nos creara el fichero “app.manifest”.

Captura_Archivo_manifiesto_aplicacion
Este fichero contiene varias opciones de configuración, pero las opciones que nos interesan son:

<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">

<!-- Opciones del manifiesto de Control de cuentas de usuario

Si desea cambiar el nivel de Control de cuentas de usuario de Windows, reemplace el

nodo requestedExecutionLevel por alguno de los siguientes.
<requestedExecutionLevel level="asInvoker" uiAccess="false" />

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
La especificación del nodo requestedExecutionLevel deshabilitará la virtualización de archivos y del Registro.

Si desea usar la virtualización de archivos y del Registro para la compatibilidad

con versiones anteriores, elimine el nodo requestedExecutionLevel.

-->

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

</requestedPrivileges>

requestedPrivileges
En la parte comentada nos muestra los niveles disponibles:

asInvoke: Nivel de seguridad por defecto.

requireAdministrator: Nivel de seguridad como administrador.

highestAvailable: Nivel de seguridad el mayor posible.

Para indicar que nuestra aplicación va a trabajar con nivel de seguridad de administrador, solo tenemos que copiar la linea:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

requestedExecutionLevel_administrador
de la parte comentada, y sobre escribir:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

de la parte no comentada.

requestedExecutionLevel_administrador_sobreescrito
Después de guardar los cambios, si le damos al botón de “Inicar”, el Visual Studio se reiniciara para ejecutarse con permisos de administrado.

Si ejecutamos el ejecutable de la aplicación nos mostrar la típica ventana para aceptar los privilegios de administrador.

OPC el idioma de los sistemas industriales

La comunicación de los sistemas industriales siempre a sido un tema muy complicado. Cada fabricante de plc’s utilizaba un sistema de comunicación propio, sin ofreces ningún tipo de información a tercera partes para poder realizar productos que pudieran trabajar con el. Esto hacia que el montaje de un sistema fuera complicado, ya que te tenias que basar en los productos que el fabricante elegido te ofrecía.

PROBLEOPC

Pero esto, se terminó con la aparición del sistema OPC, (OLE for Process Control, por sus siglas en ingles) es un sistema creado en un principio por Microsoft para la comunicación de sistemas industriales. En la actualidad este estándar esta gestionado por la fundación OPC Foundation. La aparición de este protocolo ha permitido una comunicación mas fácil entre los sistemas de control, sistemas SCADA, HMI, etc. con los sistemas de control, PLC’s.

SOLUCIOPC

En un principio este estándar se basó en la tecnología de Microsoft, Este, se baso en la tecnologia OLE, que emplea el formato COM/DCOM, que Micorosft desarrolo para el intercambio de innfomarcion entre aplicaciones y sistemas, como es normal, pero con el traspaso de la gestión a la fundación, esta ha impulsado un sistema libre, sin basarse en ninguna tecnología propietaria.

Por eso en la actualidad, con la versión UA, se puede encontrar desarrollos de sistemas OPC para cualquier sistema, ya se Windows, Linux, OsX, etc. Aunque el sistema principal, y el que dispone de un mayor catalogo de productos para el desarrollo sigue siendo Windows. Esto es debido en parte utilización de este sistema por parte de la industria de equipos industriales.

RTEmagicC_oemgatewayproxy_08.png

En la actualidad podemos encontrar librerías para el desarrollo para cualquier sistema, .Net, Python, Java, etc.

 

 

Leer coordenadas de un gps en python

gps-iconLos gps, no los navegados que son otra cosa, suelen devolver la información obtenida mediante el protocolo NMEA. Este protocolo define la información que podemos obtener del gps y como esta sera trasmitida.

Para obtener las coordenadas del gps tenemos que esperar a recibir una la sentencia $–GGA, esta tiene el siguiente formato:

$–GGA,hhmmss.ss,llll.ll,a,yyyyy.yy,a,x,xx,x.x,x.x,M,x.x,M,x.x,xxxx*hh

Formato:

  • $–GGA: Indica que la información es la posición, hora, e información relacionada con el gps. Los dos guiones (–), pueden ser cualquier cosa, pero normalmente suele ser «GP», es raro encontrar un gps que cambie esta definición.
  • hhmmss.ss: Hora a la que fue tomada esas coordenadas.
  • 1111.1111: latitud, en formato ggmm.ssss, los segundos en formato decimal. Esta es una de la información que me interesa.
  • a: Esto indica en que hemisferio se ha tomado las coordenadas si en el norte (N) o en el sur (S).
  • yyyyy.yyyy: Longitud, lo mismo que la latitud, pero nos da las coordenadas de la longitud. Tiene el mismo formato.
  • a: Lo mismo que para el hemisferio norte y sur, pero en esta caso indicando «E» para el este y «W» para el oeste.

Los demás campos están relacionados con el numero de satélites, calidad de la señal del GPS, altitud a la que nos encontramos, etc.

El gps que estoy utilizando, es un gps bluetooth, que una vez que lo he enlazado con el ordenador me crea un puerto serie, en mi caso con linux «/dev/rfcomm0». Una vez que lo tenemos conectado solo tenemos que conectarnos en python utilizando la librería pyserial.

Para pasar el formato de las coordenadas devuelto por el gps, a unas coordenadas normales en el formato ggº mm’ ss.ss» lo he hecho del siguiente modo.

Para separar cada unos de los campos utilizo en comando «split», pasándole como parámetro «,». Este nos devuelve cada campo en una posición de una tabla, utilizando la coma como separador.

vCampos = vSentenciaNMEA.split(',')

Los campos que nos interesan, para la conversión de las coordenadas están en la posición 2, latitud y en la 4, longitud. Y los campos 3, para saber si estamos en el norte o en el sur, y el campo 5, para el este o el oeste.

Con esto ya podemos tratar las coordenadas como más nos interés.

Si tienes algún consejo, recomendación o alguna duda utiliza los comentarios.

Nuevo Raspberry Pi 2, nuevas novedades

Nuevo Raspberry Pi 2
Raspberry Pi 2

Hace poco salio a la venta la nueva versión de este pequeño ordenador, el  nuevo Raspberry Pi 2, que nos ha dado muchas alegrías, y aun más dolores de cabeza.

Nuevo Raspberry Pi 2

La versión de este nuevo Raspberry Pi 2 (Raspberry Pi 2 Quad Core Starter Bundle) entre sus nuevas características, trae como procesador un nuevo RM11 ARMv7 ARM Cortex-A7 de 4 núcleos a una velocidad de 900 MHz, y de memoria disponemos de 1Gb de tipo LPDDR2 SDRAM a 450 MHz.

El el tema de los gráficos el procesador que incorpora es el Broadcom VideoCore IV 250 MHz. OpenGL ES 2.0 .

La tarjeta de red sigue siendo la misma que en versiones anteriores, En este aspecto se puede echar un poco de menos no poder contar con un puerto de red a 1 Gigabit.

Pero la ampliación de del procesador y de la memoria le abren nuevas posibilidades.

Nuevo Raspberry Pi 2
Raspberry Pi 2

Raspberry contara con una versión de Windows 10

Aunque no soy muy forofo de los sistemas de Microsft, sobre todos de estos últimos (Vista, Windows 8 o 8.1), creo que Microsoft se ha centrado mucho en copiar los iPad y intentar ser los primeros en tener un sistema como el de las tables en el pc, Pero como funcionamos en una tablet es muy distinta a como trabajamos en un pc, la verdad, no veo a ninguna secretaria sobando la pantalla y dejando las huellas en ellas.

Pero buena al caso, Microsoft esta desarrollando un versión de su ultimo sistema para el nuevo Raspberry Pi 2.

Me imagino que los de Microsoft se han dado cuenta que los protagonistas de los próximos sistemas sera el tan de moda últimamente «Internet de las cosas». Y por ello no querrán perderse este  nuevo mercado.

Casi todos los sistemas que montan en la actualidad los equipos de control de estos dispositivos suelen venir con Linux, no estoy hablando de sistemas industriales, que estos suelen seguir trabajando con Windows, aunque las nuevas versiones ya suelen montar bastantes sistemas Linux, muchos de los coches, por ejemplo, que actualmente equipan sistemas inteligentes de control, en su interior tienen un Android, que no deja de ser un Linux.

También me imagino que desechara el interface de usuario que utilizan en la actualidad, por otro más practico. Pero de eso no estoy seguro, son Microsoft y son los amos del mercado.

Conclusión

Debido ha esta ultimas mejoras, en potencia y velocidad, los de Raspberry Pi dan un puñetazo en la mesa a los últimos intentos de otros fabricantes, como puede ser a Intel, que ofrecían mayor potencia pero a un coste mayor. Los de Raspberry Pi demuestran, de nuevo, que se puede tener más con menos, ya que el precio de los nuevos no varia con respecto a los de las versiones anteriores. Hay que recordar que de la primera versión se ha llegado ha vender más de 5,5 millones de unidades.

Relacionado

Pagina oficial de Raspberry Pi 2

Como obtenerlo Raspberry Pi 2 Quad Core Starter Bundle

Como devolver una imagen al «SRC» de un IMG con PHP

GD-Graphics-LibraryEn algunas ocasiones se necesita personalizar algún fichero de imágenes en nuestra web dependiendo de cualquier cosa, cambiar la foto del usuario, cambiar un logotipo, etc.

Lo fácil es poner en el propio «src» de la etiqueta «IMG» el código de php que cargue el nombre de la imagen que queremos cargar.

Algo parecido a esto:

<img src="<?php echo $nombre_de_la_imagen; ?>" width="256" height="200" />

Pero esto si tenemos muchas imagen a procesar seria un poco engorroso, sobre todo a la hora de actualizar.

Para evitar tener que duplicar código hay varios métodos, el más común seria crearnos una función en nuestro fichero de funciones globales,  pero rebuscando por google encontré otra solución que me pareció a lo menos curiosa.

Y esta es hacer que el propio fichero de php nos devuelva la imagen, no la ruta al fichero que contiene la imagen, sino la propia imagen. Una cosa como esto.

<img src="http://www.todavianose.com/imagen.php?fichero=4c86b5285ef7ca3bab" width="256" height="256" alt="Texto alternativo" longdesc="Descripcion larga" />

Una de las funciones que nos permite esto, es crear nuestro propio sistema de captcha, o crear una imagen de algún texto que no queramos que los robots que pululan por la red lo puedan indexar.

Para hacer esto lo que tenemos que hacer lo primero, es indicar que los datos que vamos ha devolver desde el fichero de php son una imagen, esto en php se hace con las siguientes funciones.

header("Content-type: tipo de mime");

Donde «tipo de mime» le indica el formato en el que le vamos ha enviar los datos, para imágenes lo tenemos que cambiar por:

  • image/jpeg: le indicamos que los datos que va ha recibir están en formato de iamgen jpeg.
  • image/png: los datos que le vamos ha enviar están en formato png.
  • image/gif: lo mismos pero en formato gif.

No solo podemos indicarle que lo que vamos ha enviar es una imagen, también podemos decirle que es otro tipo de archivo como por ejemplo un fichero pdf (application/pdf), un fichero de audio en formato mp3 (audio/x-mpeg-3), en esta pagina hay una lista con todos los tipo de mimes que podemos utilizar.

Y ya podemos enviar al «scr» el fichero de la imagen con el siguiente comando de php

readfile("ruta-al-archivo");

Utilizando la libreria GD, podemos crear nuestras propias imágenes, si quieres saber algo mas sobre estas funciones solo tienes que ver los comandos que hay disponibles.

Un ejemplo completo quedaría de la siguiente forma.

<?php
// Cargamos la imagen a mostrar
$archivo='usuario.png';
header("Content-type: image/png");
header("Content-length: ".filesize($archivo));
header("Content-Disposition: inline; filename=$archivo");
readfile($archivo);
// Fin crear imagen
?>

Y con esto estaría, si tienes alguna duda o sugerencia puedes dejar un comentario.

¿Por que las empresas están dispuestas a perder todos sus datos?

Peligro WiFi publicas
Peligro WiFi publicas

Me gusta ver o asistir a todos los congresos de seguridad que puedo, pero cada vez que salgo de uno o termino de ver cualquier vídeo de alguna charla, me acojono cada vez.

En muchos de ellos siempre termina saliendo el mismo tema, «Como se puede concienciar a la gente sobre la seguridad en la red«. Cuando lo hablo con gente que no es de ese mundo, la contestación es la misma, «y a mi que mas me da, yo no tengo nada valioso en el ordenador«, o algo como «Eso es cosa de cuatro friquis» o «Eso es cosa de las empresas de antivirus«. Pero luego cuando pasa cosas como la que explica Chema Alonso en su blog ( «¡Me han cifrado los archivos y me piden dinero para descifrarlos!». 5 Consejos para evitar un «Cryptolocker» ). Las cosas cambian.

«¡Me han cifrado los archivos y me piden dinero para descifrarlos!». 5 Consejos para evitar un «Cryptolocker»

Entonces resulta que en el ordenador si teníamos cosas valiosas, y rápido te llaman para que se lo arregles. Cuando te lo traen, si nos es que tienes que ir tu a su casa por que no sabe como desconectarlo o por que pesa mucho, y le preguntas si tiene copias de seguridad «ehhhh que es eso», «pufff es que no tengo tiempo«. Luego viene la otra pregunta, ¿No tienes instalado un antivirus?, la respuesta: «Para que, me vuelve muy lento el ordenador«, o otra típica, «Es que no me dejaba entrar en la pagina «www.velospartidosgratis.com» ( no se si existe, pero ya sabéis a que paginas me refiero) , que siempre te falta algo para poder ver los vídeos.

En un equipo particular no «pasa nada«, pierdes las fotos de las vacaciones, los correos con los amigos, los trabajos de la universidad, etc. Pero lo mas preocupante es cuando esto ocurre en una empresa.

La mayoría de empresas que tienen más de 20 equipos, solo tiene asistencia esporádica de un servicio técnico cuando le falla algo, y la mayoría de ellas, lo tiene segmentado, es decir, tiene una empresa que le lleva el software de gestión, otra que le lleva el mantenimiento de los ordenadores, otra de las comunicaciones, otra del telefonillo de la puerta, etc.

Y que pasa cuando falla algo:

  • Empresa del software de gestión: ah eso no es cosa nuestra, eso es cosa del ordenador.
  • Empresa del ordenador: A no eso es cosas del de sistema operativo, ellos solo llevan el hardware.
  • Empresa de comunicaciones: Eso no es cosa nuestra, nosotros no controlamos por donde navegan nuestro clientes, solo damos el acceso.
  • Etc, etc, etc.

Y así una detrás de otra, si se junta la cantidad que una empresa paga por esos servicios cubre con creces el disponer de un técnico en plantilla.

Una de las preguntas que surgió en el ultimo congreso que estuve fue,  «¿Como calculo lo que la empresa tardara en recuperar esa inversión?». Y la respuesta del ponente me gusto mucho, no se quien fue le pido disculpas por ello, «El asunto no es cuando se recuperara la inversión, que posiblemente sera nunca, el asunto es: Se esta dispuestos asumir el riesgo de perder todo la información del negocio».

Y esa es la clave de todo el asunto, las empresas no ven como una amenaza la posibilidad de que alguien o algo, les pueda hacer perder todos los datos de su organización. Los temas de seguridad informática los siguen viendo como una cosa de ciencia ficción, de cuatro pirados. Y la verdad es que cada vez el tema se esta poniendo más complicado.

Y es que, la perdida de los datos de una empresa puede ocasionar grandes perdidas, tanto económicas, como de reputación, etc. Cuanto tiempo le llevaría recuperarse de la perdida de simplemente la base de datos de clientes, y ya no digamos de la facturación, y otras de ese tipo. Pero esta posibilidad no esta contemplada en las empresas actuales. Pero a la vez incorporamos más sistemas a la organización que aumentan las posibles amenazas, instalamos un red wifi, para que cuando vengan los clientes pueden conectarse a la red para que puedan wasapear, twitear, etc, pero no pensamos que igual que se conectan a internet, también se pueden tener acceso a todos nuestros equipos. Abrimos puertos en nuestro routers para que los comerciales se puedan conectar a la red desde cualquier sitio, sin valorar la posibilidad de que igual que acceden los comerciales, pueden acceder otras personas con no muy buenas intenciones.

Valorar la posibilidad de incorporar un informático a la plantilla de la empresa, solo se mide si va ha ser rentable en el sentido económico. Y esto es una equivocación, en la actualidad con la cantidad de amenazas que existen, no solo para los ordenadores, sin no para los smartphones, las tablets, las redes de comunicaciones, etc. Una perdida de información en cualquiera de esos dispositivos puede provocar grandes perdidas a la empresa. Y hay es cuando se tiene que empezar a reflexionar si es rentable una persona que evite esas perdidas o no.