• Descargas de archivos, y codigos CRC en vb.NET

    En los últimos días, tuve que implementar (como siempre, al apuro) una aplicación que visualice archivos PDF desde un repositorio central de archivos, utilizando Visual Basic .NET, con el limitante de que los archivos PDF que son visualizados no deben ser guardados directamente por el usuario en su computador.

    Para esto, del lado del cliente, se implementó una pequeña aplicación que descarga el archivo PDF mediante una solicitud a una URL, utilizando la siguiente función:

    Public Sub descargaArchivo(ByVal _urlOrigen As String, ByVal _archivoDestino As String)
            Try
                Dim _WebClient As New System.Net.WebClient()
                _WebClient.DownloadFile(_urlOrigen, _archivoDestino)
            Catch _Exception As Exception
                MessageBox.Show("Se ha Producido una excepción de descarga: {0}", _Exception.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
    End Sub
    

    El uso des esta funcion es sencillo: se ingresa como parámetros la url de descarga del archivo, y la ruta donde se desee guardar el mismo. Para ocultar un poco el acceso directo al archivo descargado, usamos la hora actual del sistema, y hacemos que guarde el archivo descargado en la carpeta temporal de windows, con los siguientes comandos:

    Dim timestamp As String = Date.Now.TimeOfDay.ToString
    timestamp = timestamp.Replace(":", "")
    timestamp = timestamp.Replace(".", "")
    Dim archivo As String = System.IO.Path.GetTempPath.ToString + timestamp + ".pdf"
    

    ….. facil, sencillo y transparente para el usuario

    Otra función que me resultó bastante útil, es la que realizamos para obtener un Código de Checksum SHA256 para comparar la huella de los archivos indexados en una base de datos contra los archivos descargados. La función es bastante sencilla, y es la siguiente:

    Private Function calculaChecksum(archivo) As String
            Using Stream As FileStream = File.OpenRead(archivo)
                Dim sha As SHA256Managed = New SHA256Managed
                Dim checksum As Byte() = sha.ComputeHash(Stream)
                Return BitConverter.ToString(checksum).Replace("-", String.Empty)
            End Using
    End Function
    

    Esta funcion requiere la ruta real de acceso al archivo del que se desea obtener el checksum, y devuelve el código hash como un string.

    Para eta función, es necesario importar las siguiente librerías:

    Imports System.IO
    Imports System.Security.Cryptography
    

    que proveen soporte para el manejo de archivos, y las funciones de criptografía.

  • Airplay con el Raspberry Pi

    Luego de que la cámara de video ha grabado sin problema muchas imágenes, utilizando Motion, con una webcam conectada al Raspberry Pi, y dado que mi esposa se ha vuelto fan del TuneIn Radio en su iPhone, se me ocurrió la brillante idea de instalar el paquete Shairport, para que el Raspi reproduzca el audio en nuestro minicomponente desde el teléfono, usando WiFi.

    La instalación es bastante sencilla. Primero es necesario actualizar todos los paquetes del Raspbian instalado, con los siguientes comandos.

    sudo su
    
    aptitude update
    
    aptitude upgrade
    
    

    Con esto garantizamos que todo se encuentre al día, para poder continuar. Luego de esto, instalamos los prerequisitos para el paquete Shairport, con el siguiente comando:

    aptitude install git libao-dev libssl-dev libcrypt-openssl-rsa-perl libio-socket-inet6-perl libwww-perl avahi-utils
    

    Además, es necesario (al menos en mi caso) instalar la librería SDP para Perl. Esto lo hacemos con los siguientes comandos:

    aptitude install libmodule-build-perl
    git clone https://github.com/njh/perl-net-sdp.git perl-net-sdp
    cd perl-net-sdp
    perl Build.PL
    ./Build
    ./Build test
    ./Build install
    

     

    Y con todo esto instalado, procedemos a descargar y compilar Shairport, con los siguientes comandos:

    cd
    git clone https://github.com/hendrikw82/shairport.git shairport
    make
    

    Si no tenemos ningún error, en la compilación, podremos probarlo, iniciando la aplicación desde la consola, con el comando

    ./shairport.pl -a ShairPi
    

    Ahora pueden tomar su equipo favorito de la marca de la manzana (iPhone, iPod, iPad) o cualquier equipo compatible con Airplay, y verificar el funcionamiento. En este caso, deberá mostrar un dispositivo Airport con nombre ShairPi el momento de redireccionar el audio.

    Si todo funciona correctamente, procedemos con Ctrl+C a cerrar la aplicación, e instalarla como servicio, para que se inicie automáticamente al arrancar nuestro Pi. Esto lo realizamos con los siguientes comandos:

    make install
    cp shairport.init.sample /etc/init.d/shairport
    cd /etc/init.d
    chmod a+x shairport
    update-rc.d shairport defaults
    

    Adicionalmente, es necesario editar el archivo DAEMON_ARGS, en la línea DAEMON_ARGS=”-w $PIDFILE para que quede de esta manera:

    DAEMON_ARGS=”-w $PIDFILE -a ShairPi
    

    donde ShairPi puede ser reemplazado por el nombre que quieran ponerle a su Airplay. Luego iniciamos el servicio con el comando:

    ./shairport start
    

    Y tendremos el servicio levantado cada vez que iniciemos nuestro RasPi.

    El Airplay funciona bastante bien. Simplemente existen momentos, especialmente cuando se pausa y reinicia muy seguido la reproducción desde el teléfono, que el módulo de WiFi instalado en el Raspberry se desconecta. Quizás con una conexión con cable no tengan ese inconveniente.

    Pruebenlo y me cuentan.

  • Video Vigilancia con el Raspberry Pi

    Dado que mi pequeño Raspberry Pi se encontraba algo desatendido, decidí darle una prueba al paquete Motion, que es utilizado para la captura y detección de movimiento para ambientes Linux.

    La instalación de Motion es bastante sencilla. Para esto, previamente debemos tener instalado Raspbian en nuestro Pi (es con lo que lo he venido probando desde hace algún tiempo), y bajo la consola de terminal, simplemente ejecutamos los siguientes comandos (asegurándonos de estar conectados al internet)

    sudo apt-get update
    
    sudo apt-get motion

    El primer comando se encargará de actualizar todos los paquetes nuevos de nuestro Linux, y luego descargará el paquete Motion, directamente.

    Para la captura de video, estoy usando la PS3 Eye Cam, que utilicé en la Plataforma Stewart presentada anteriormente. Esta cámara fué detectada por el Raspberry sin problema, y de lo que he leído por ahí, existe gran compatibilidad con distintas cámaras, así que la configuración de la misma sobre el Raspbian es algo trivial.

    Una vez instalado  Motion, hay que proceder a configurarlo. Para esto, es necesario editar el archivo motion.conf ubicado en /etc/motion.

    En este archivo, vamos a editar algunos parámetros que nos van a ayudar a cumplir nuestro objetivo, que será (al menos en mi caso) capturar una imágen cada minuto y almacenarla en Google Drive, y además, el momento que se detecte un movimiento, así mismo subir dicha imágen  a la nube, y enviar un email de aviso.

    Lo primero que debemos configurar es el tamaño de la captura. Como el Raspberry Pi no es lo suficientemente potente para procesar imágenes de alta resolución, vamos a cambiar el tamaño de la imágen a 320×240, editando estas líneas en el archivo motion.conf

    width 320
    height 240

    Otro parámetro con el que debemos jugar, es el threshold, que es el umbral de cambio de la imágen para que se pueda hacer una llamada a la detección de movimiento. El valor default es 1500, pero yo lo subí un poco, para evitar falsos disparos (sobre todo por la mascota nuestra, que siempre ronda la casa)

    threshold 3000

    Para nuestra aplicación, vamos a necesitar guardar una captura de imagen cada 60 segundos, esto lo logramos usando el parámetro snapshot_interval, que permite configurar el tiempo en segundos en el que se va a guardar una imágen de captura de video.

    snapshot_interval 60

    Ahora, a lo importante del asunto. Motion permite disparar comandos, dependiendo del evento que sea lanzado por la aplicación. Para nuestra aplicación, vamos a utilizar 2 eventos: on_picture_save  que se lanzará al guardar una imágen cada 60 segundos (configurados en el parámetro anterior), y on_motion_detected que nos lanzará el evento al detectarse movimiento en la cámara.

    Previo a esto, vamos a necesitar 3 archivos adicionales, que debemos crear (o descargar) para poder finalizar nuestra aplicación.

    El archivo uploader.py (creado por Jeremy Blythe), se encarga de conectarse con los servicios de google drive, y almacena las imágenes guardadas dentro de una carpeta de GDrive. Este archivo, necesita del archivo de configuración uploader.cfg, donde se incluirá todos los datos de conexión de la cuenta de gmail a usar.

    El archvo envia_email.py es una modificación realizada por mi, para que únicamente se envíe un email a una dirección determinada, lo que usaremos cuando se haya detectado movimiento frente a la cámara

    Con lo comentado anteriormente, deberemos editar los parámetros del archivo motion.conf, modificando las siguientes líneas (puede que los parámetros indicados a continuación estén comentados, así que será necesario quitar el # para que funcione correctamente)

    on_picture_save /etc/motion/uploader.py /etc/motion/uploader.cfg %f

    on_motion_detected /etc/motion/envia_email.py

    el %f en el primer parámetro, se refiere al nombre del archivo grabado ese instante.

    Con los archivos guardados correctamente, debemos darles los respectivos permisos de ejecución, así que debemos ejecutar el siguiente comando:

    sudo chmod +x /etc/motion/*.py

    y luego, podremos iniciar Motion ejecutando

    sudo motion

    De esta manera, se empezarán a cargar las imágenes en nuestro GDrive, y recibiremos notificaciones de detección de movimiento. Nada mal para un sistema de video seguridad por menos de $100.

    Captura

  • Hackeando al Raspberry Pi

    El famoso Raspberry Pi, que no ha tenido mayor uso desde que está en mis manos (más por falta de tiempo, que por falta de ganas), necesitaa un upgrade básico: un conexión WIFI.

    El tener un puerto ethernet en la microcomputadora, de hecho que es una ayuda gigantezca, pero resulta poco práctico si el único chance de obtener una conexión por cable a la red, es dejarlo conectado debajo de mi escritorio, al router de internet. Es por esto que se volvió justo y necesario, darle una conexión wireless, para poder seguir con las pruebas y los experimentitos.

    Por si no lo sabían, el Pi tiene 2 puertos USB, pero con un pequeño limitante. Estos tienen un fusible que limita a 140mA la corriente máxima de cada uno, y ciertos dispositivos USB no funcionan correctamente con ese límite (de hecho un teclado flexible que pensaba usarlo ahi no se enlaza 🙁 ), así que frente a esto quedan 2 opciones:

    • La primera, que es la más común entre los dueños de este bicho, es utilizar un hub usb energizado, que aunque no lo crean, resultó bastante escazo por acá (el único que encontre buscando un poco, pedían $40, así que negado). Por seguridad creo que voy a buscar un hub chinito en ebay, y esperar que llegue; pero…..
    • La segunda opción es meterle mano al Pi, con la pérdida de garantía que eso conlleva, y eliminar los límites de corriente.

    Para no perder la costumbre, me fuí por la segunda opción, pero a medias, ya le realicé un puente únicamente en el puerto usb superior, quedando el inferior con protección (ahí tengo conectado un mini hub usb para el teclado y el mouse), así que el wireless irá en el puerto de arriba.

    2012-08-29 20.34.07

    Como se puede ver en la foto (mirenla en flickr, para verla en detalle), pueden ver el cablecito de puente sobre el fusible que se encuentra a un costado del conector…… cero garantía contra daños y 100% conexión!

    Ahora, una vez que logramos alimentar correctamente el usb, tenemos que instalar el módulo en el sistema operativo del RPi.

    El módulo usado es un TP-Link 723n que para mi buena suerte, costó $18 y es compatible 100% con Debian Wheezy pero para facilitar aún más las cosas, encontré un script que se encarga de toda la instalación de drivers, y configuración de la red wireless. Este script lo pueden encontrar en esta url http://dl.dropbox.com/u/80256631/install-rtl8188cus-latest.sh y lo deben ejecutar con el siguiente comando, desde el terminal de su RPi:

    sudo ./install-rtl8188cus-latest.sh
    

    Es cuestión de seguir los pasos (ojo, no se debe conectar el módulo USB hasta que el script lo solicite), colocar el nombre de la SSID y la contraseña, y voilá! tenemos wifi en el Pi.

    Les dejo algunas imágenes del hack, y hasta ahora está funcionando sin problema. Además, me olvidaba. El Pi está overclockeado a 900Mhz (viene a 700Mhz de fabrica) y hasta ahora está super estable.

    Les dejo algunas fotitos adicionales.

     

    2012-08-29 20.43.43

    2012-08-29 20.42.24

    2012-08-29 20.34.07

  • Dios, el universo, y todo lo demás

    Si tienen una horita libre (un lujo bastante escaso en estos tiempos), les invito a ver este video, donde Carl Sagan,
    Stephen Hawking y Arthur C. Clarke, discuten los orígenes del universo, la creación, los agujeros negros, y la vida extraterrestre. Muy interesante discusión, y muy interesante el video.

    Se los recomiendo

    [HTML1]

  • Controlador para servomotores USB, con entradas y salidas digitales

    Para mi proyecto de tesis (recuerdan la Plataforma Stewart?), realizado con mi compañera Natalia Gonzalez, tuvimos la necesidad de diseñar una tarjeta controladora de servos, que nos permita controlar simultáneamente hasta 8 servos, con entradas y salidas digitales adicionales, y controlado por puerto USB. Para esto, hemos utilizado un microcontrolador PIC 18F4550, que tiene el hardware para conexión USB integrado dentro del microcontrolador, y dicho puerto USB puede ser configurado como un puerto serial emulado, lo que facilita muchísimo la interfaz con el PC, al no necesitar programar drivers específicos para nuestra tarjeta electrónica.

    Como conocemos, cada servomotor necesita un pulso, cuyo ancho debe variar entre 1.25 y 1.75ms (siendo 1.5ms el ancho de pulso necesario para llegar a la posición central), que debe ser refrescado cada 20ms para mantener su posición. Controlar un servo por medio de interrupciones no presenta mayor inconveniente, pero para controlar 8 simultáneos, hay que poner un poco a trabajar el cerebro.

    Usando una sola interrupción para controlar los 8 servomotores, lo que debemos hacer es multiplexar al timer 0, de tal manera, que aproximadamente cada 4ms, se dispara una nueva interrupción, que indicará que salida de servo se debe activar, y el tiempo que estará activa, de acuerdo a los valores de posición que asignemos a cada servo.

    Los datos de la posición de cada servo, se los enviará via comunicación serial por el puerto USB, para esto se ha definido un pequeño protocolo de comunicación con la tarjeta electrónica, que responde a los siguientes comandos:

    // comandos:
    // 's' muestra ok para verificar conexion
    // 'd'x escribe dato de 8 bits. espera dato de salida
    // 'q'x activa salida x (0-7)
    // 'w'x desactiva salida x (0-7)
    // 'r' devuelve un dato de 8 bits de entrada del puerto D
    // 'p'xy asigna al servo x (caracter entre 0 y 7) el valor y (caracter con un código ASCII entre 0 y 255)

    Con estos comandos, además de poder controlamos los servos, tenemos la posibilidad de usar las entradas y salidas digitales programadas para la tarjeta.

    El esquema del circuito es bastante sencillo, tal como lo mostramos a continuación:

    Algo a tomar en cuenta en el diseño de la tarjeta electrónica, es la alimentación del circuito. El microcontrolador, puede ser alimentado directamente con los +5V del puerto USB, pero los servos, dependiendo del tipo, pueden consumir mucha mas corriente de los 1000mA que puede entregar el puerto USB de un computador personal. Es por esto, que tenemos 2 lineas de alimentación: Vdd que alimenta el microcontrolador (y está enlazado a +5V del puerto USB) y V+ que es una alimentación externa para los servos (que incluso, para darles mayor torque, puede subir hasta 6V, o más, si usamos servos HV).

    Para el diseño del PCB, se utilizó una placa de doble lado, con un diseño bastante sencillo. El diseño como tal no es crítico, ya que se manejan señales de baja frecuencia.

    El software que corre en el microcontrolador, fué realizado en C, usando el compilador propio de Microchip. El código fuente, con todas sus librerías, puede ser descargado en este enlace y el link del driver para el puerto serie (en sí es un archivo inf, con las definiciones del puerto USB) puede ser descargado aquí.

    Podemos decir que se puede mejorar un poco el software (podrían agregarse entradas analógicas únicamente cambiando el código fuente, sin modificar el hardware), pero para nuestro proyecto, esta tarjeta electrónica funcionó perfectamente.

    Les dejo un video del robot, que utiliza servos 6 estandard, cuyo control es realizado por la tarjeta electrónica que presentamos acá.

    [HTML1]

    Y el video final de la plataforma (el que fué presentado en la sustentación final de la tesis)

    [HTML2]

  • La historia de los videojuegos (en video)

    [HTML1]

    Les dejo un remix de juegos clásicos. Este video fué realizado usando cortes y el audio de estos juegos

    • Zork
    • MULE
    • Dam Busters
    • Flight Simulator
    • Kings Quest: Quest For The Crown
    • DOS Ninja
    • Hard Hat Mack
    • Chess
    • Donkey
    • Lode Runner
    • Sid Meier’s Pirates
    • Burger Time
    • Galactix
    • Where In The World Is Carmen San Diego
    • Alley Cat
    • Pool of Radiance
    • Wizardry
    • Oregon Trail
    • Leisure Suit Larry in The Land of The Lounge Lizards
    • Space Quest: The Sarien Encounter
    • Defender of The Crown
    • Jeopardy!
    • Captain Power and The Soldier of The Future
    • Cannonball Blitz
    • Arctic Fox
    • California Raisins
    • High Rollers
    • Wavy Navy
    • Ultima
    • Sim City
    • Prince of Persia
    • Monkey Island 2
    • Lemmings
    • Wolfenstein 3D
    • Kings Quest VI
    • Dune II
    • Sam & Max Hit The Road
    • Command & Conquer: Red Alert
    • Supremacy
    • Civilization
    • Doom
    • Sim City 2000
    • Day of The Tentacle
    • Myst
    • Mech Warrior 2
    • Wing Commander 3
    • X-Com UFO Defense
    • Command & Conquer
    • Warcraft II: Tides of Darkness
    • Star Wars TIE Fighter
    • Elder Scrolls Arena
    • Warlords II
    • Duke Nukem 3D
    • Diablo
    • Elder Scrolls II
    • Starcraft
    • Heroes of Might and Magic III
    • Fallout
    • Blade Runner
    • Riven
    • Half-Life
    • Quake II
    • Counter Strike 1.6
    • Deus Ex
    • Star Wars: Knight of The Old Republic
    • Max Payne
    • Battlefield 1942
    • Medal of Honor: Allied Assault
    • Warcraft 3
    • Diablo II
    • Empire Earth
    • Unreal Tournament 2004
    • Splinter Cell
    • Half-Life 2
    • Hitman: Blood Money
    • Doom 3
    • Team Fortress 2
    • Left 4 Dead 2
    • Portal
    • Fallout 3
    • Dead Space 2
    • Gran Theft Auto 4
    • Borderlands
    • Amnesia
    • Civilization V
    • Starcraft 2
    • Limbo
    • Crysis 2
    • Deus Ex Machina
    • Minecraft
    • Portal 2
    • Dota 2
    • Diablo 3
  • Bajo Commodore 64

    Este hack si está buenísimo. La mezcla de un bajo eléctrico, y una commodore 64.

    Un bajo, parlantes piezoeléctricos como transductuctores, un FPGA para el procesamiento de señales, y el SID original de la C64 para generar el sonido, nos dá un instrumento que bien podría ser tocado en vivo por los Nine Inch Nails.

    Les dejo el video.

    [HTML1]

  • Raspberry Pi! Hands On

    Finalmente! El viernes, y luego de un mes de espera (realmente, más de 3 meses, desde que fué anunciada su fabricación), ha llegado a mis manos el Raspberry Pi, el pequeño microcomputador que ha dado muchisimo de que hablar en este último tiempo.

    Por qué tanta novelería? Pues revisemos sus características del hardware

    • CPU ARM a 800Mhz
    • GPU Broadcom VideoCoreIV, OpenGL ES 2.0, decodificador 1080p H.264
    • 256MB de memoria RAM
    • 2 puertos USB
    • 1 puertoLAN 100Mbps
    • 1 salida de audio
    • 1 salida de video RCA
    • 1 salida de video HDMI
    • 26 pines de entrada/salida digital GPIO
    • Ranura SD para almacenamiento

    En características como tal, no es nada revolucionario, y en procesamiento como tal, equivale más o menos a un computador con procesador Pentium III de 300Mhz, con una tarjeta de video «bastante poderosa» (se puede ejecutar juegos como Quake III Arena sin problema)

    Lo que realmente hace notable al raspberry, es primero su precio. Éste tiene un costo de $35 dolares, y DHL, por costos de desaduanización y manejo, cargaron un adicional de $12, entregandonos un computador por $47…. nada mal eh? Además, soporta Linux como sistema operativo, lo que abre muchísimas posibilidades en cuanto al software que se puede ejecutar… teóricamente, toda aplicación de linux para PC, se podría recompilar  y ejecutar sobre el raspberry, tomando en cuenta obviamente las limitaciones de RAM y velocidad.

    Como lo pienso usar? no se! jajaja, pero habrá que recordar un poco de Python, para empezar a programar aplicaciones, tomando en cuenta, que este bichito consume menos de 3W a plena potencia, y puede pasar encendido y conectado a la red todo el día sin aumentar la cuenta de energía eléctrica.  Inicialmente, la idea es conectarlo a mi TV, y armarlo como un Smart CRT-TV jejejeje. Mientras lo vaya probando, iré mostrando los avances.

    Les dejo algunas fotos del juguete (les recomiendo verlas en full size), para que observen el diseño de la misma. Ojo con el close up del procesador. En realidad es un SoC (System on Chip) que contiene dentro del mismo dado de silicio, el CPU, el GPU, los puertos de Entrada y Salida, y sobre este, en torre, el chip de memoria ram. Realmente un trabajo memorable realizado por la gente de esta fundación.
    R-PI

    R-PI

    R-PI

    R-PI

    R-PI

    Raspberry Pi Smart CRT-TV

  • Cómo la ciencia ficción ha adivinado el futuro

    Hace 60 años, el escritor de ciencia ficción Ray Bradbury, predijo muchos de los aparatos que ahora tenemos a disposición, y los consideramos «comunes». Sólo imaginen que tan raros se verían utilizando un teléfono celular, o un simple par de audífonos con un mp3 player, hace 50 o 60 años 😉

    Les dejo una interesante infografía sobre el tema.