Hoy en el trabajo he tenido un problema con una instalación de .NET Framework 2.0. Ni dejaba instalar el SQL Server 2005 ni se dejaba desinstalar así misma.
Así que buscando por Internet he encontrado el .NET Framework Cleanup que me ha funcionado a las mil maravillas.
La verdad es que me ha entrado un poco de nostalgia. No en vano fue mi primer sitio de hosting allá por 1996 (me dí de alta en hotmail y geocities con un equipo que estaba en el SIMO conectado a Internet).
Aún recuerdo cuando me compré un libro de bolsillo de HTML de Anaya y pocos días después fuí con un disquete de 720 kbytes al primer cybercafé que hubo en Madrid (no recuerdo su nombre) en los bajos de Azca y subí todos los ficheros de lo que fué mi primera página web. Por aquél entonces tenías que elegir tu vecindario donde clasificar tu web, yo usé SiliconValley.
Ha llovido mucho desde entonces, pero es bueno saber que yo, como muchos, fuimos testigos de la revolución que Internet estaba a punto de ser.
Antes de Internet mi conexión era por modem a BBS y hasta fuí punto de Fidonet, de Subnet y de Darknet. Era otro mundo: frontdoor, fmail, golded…
Es una lástima cómo van cayendo los veteranos de Internet al igual que fue una lástima ver como Fidonet y las BBS fueron desapareciendo y perdiendo importancia.
Uno de los problemas que veo con la cámara IP Zaapa que me compré es que sólo se puede manejar desde un navegador Internet Explorer, y la verdad es que eso le quita mucho potencial a una cámara tan completa y barata como esta. Por eso me he puesto manos a la obra para desengranar un poco el funcionamiento y poder crear una aplicación de escritorio para poder manejarla.
Todo el trabajo de investigación ha estado centrado en ver cómo funciona el código fuente javascript de la página web que ofrece la cámara zaapa, ya que buscando por internet no he encontrado nada sobre cómo manejarla.
Lo primero que nos encontramos es que instancia un objeto llamado DVM_IPCam2.ocx. Buscando por internet he encontrado muy poca información sobre ese fichero en cuestión y mucho menos de la API OLE que encierra.
Por suerte el Visual Studio .NET puede incorporar ocx y ver de una tacada todos los métodos, propiedades y eventos que maneja el control ocx. Para ello dentro del Cuadro de herramientas, se pulsa con el botón derecho en Componentes y se selecciona Elegir Elementos… Después se pulsa sobre la pestaña Componentes COM y se selecciona DVM_IPCam2 Control.
Si no existiese es que no está registrado en Windows. Entonces habría que descargar el ocx desde la dirección http://<ip de la camara>/codebase/DVM_IPCam2.ocx, guardarlo en c:\windows\system32 y desde una consola de ms-dos ejecutar regsvr32 c:\windows\system32\DVM_IPCam2.ocx y después volver a repetir el proceso de Visual Studio.
Con esto ya tendremos el componente ocx para insertarlo en el formulario. Ahora para acceder a la cámara hay que seguir los siguientes pasos:
Conectar con la cámara usando el método MonitorConnect, pasándole como parámetros la dirección host o ip de la cámara, el puerto por el que escucha (normalmente el 80), el usuario y la contraseña.
Capturar el evento OnMonitorConnectResult y si la conexión ha sido satisfactoria pasar al siguiente punto
Empezar a recibir las imágenes dentro del control ocx usando el método PlayVideo.
Esperar a recibir las imágenes con el evento OnPlayVideoResult.
Hacer el resto de operaciones: mover la cámara con el método DecoderControl, hacer fotografías con el método Photo2, grabar un video con el método StartRecord2, reiniciar la cámara con el método RebootCamera, etc.
Cuando se termine de trabajar con la cámara llamar a los métodos StopVideo, StopRecord y MonitorDisconnect.
He desarrollado una pequeña aplicación que muestra estos conceptos. No hace comprobaciones de errores para simplificar el código:
Podeis descargar el código fuente en c# y un ejecutable desde aquí.
El siguiente paso sería tratar de hacer que funcionase el firefox para windows y en un futuro conocer el protocolo para manejarlo desde linux, desde un iphone o desde cualquier otro entorno.
En el trabajo los usuarios nos envían incidencias de las aplicaciones, pero en muy pocas ocasiones adjuntan un “pantallazo” del error. Entiendo que el proceso de pulsar Impr Pant, irse al paint, pegar la imágen, guardarla en JPG y adjuntarla a la incidencia es algo que no saben muchos usuarios.
Por eso se me ocurrió crear una aplicación sencilla en c# que gestionase todo ese proceso (excepto adjuntar la imágen a la incidencia). Tomando como base este artículo he desarrollado la aplicación CapturaVentana (ciertamente no me he escornado buscando el nombre) debido a que el escritorio o una ventana son lo mismo para windows.
Su uso es muy sencillo. Elegimos si queremos copiar el resultado al portapapeles o a un fichero jpg y pulsamos sobre el botón correspondiente de lo que queremos capturar (escritorio entero o una ventana individual). En el caso de capturar el escritorio la aplicación se esconde momentaneamente para que no aparezca en la “foto”. Si se trata de capturar una ventana hay que pulsar con el ratón sobre la ventana que queremos fotografiar después de haber pulsado el botón.
Hacía tiempo que no desarrollaba un proyecto con la fonera. En esta ocasión voy a hacer un sistema de alarma, la cual se activa cuando se pulsa un botón. Para ello me he hecho con lo siguientes materiales:
Cuando alguien pulse el mando emisor, el receptor (alimentado por la fonera) recibirá la señal e informará a la fonera que se ha activado. Después la fonera se conectará a una página web para mandar un mensaje sms a un número de teléfono. Esto es útil por ejemplo para ancianos que desean solicitar asistencia, con sólo llevar el emisor colgado ya pueden enviar la alarma. Otra aplicación es una tienda donde se solicite ayuda en caso de robo, guardando el emisor debajo del mostrador o en el suelo.
Para ello, lo primero que se debe tener es la fonera con el firmware openwrt. Los pasos se pueden seguir aquí.
Después hay que instalar el módulo gpio. Los pasos se pueden seguir aquí.
A continuación hay que hacer que la fonera sea independiente del cable de red y se conecte como cliente al router wireless. Primero editamos el fichero /etc/config/wireless y ponemos lo siguiente:
Donde SSID es el nombre de la red wireless y CLAVE HEX la clave wep en hexadecimal (Para otras configuraciones mirar el documento de configuración aquí)
Segundo editamos el fichero /etc/config/network y ponemos lo siguiente:
# Copyright (C) 2006 OpenWrt.org
config interface loopback
option ifname lo
option proto static
option ipaddr 127.0.0.1
option netmask 255.0.0.0
config interface lan
option ifname eth0
option proto static
option ipaddr 192.168.1.200
option netmask 255.255.255.0
config interface wifi0
option ifname ath0
option proto dhcp
Con estas configuraciones hacemos que el router de la fonera se conecte al punto de acceso como cliente y coja una ip mediante dhcp, sin la necesidad de tener un cable de red, por lo que podemos ponerla en cualquier lado. Por si acaso se deja una ip 192.168.1.200 en el puerto ethernet por si hubiera que conectarse a ella y no funcionase el wifi.
El siguiente paso es crear el script que recibirá por el gpio la señal del receptor. Creamos el fichero /usr/bin/alarma.sh con este contenido (poniendo el usuario, contraseña, numero de móvil y el mensaje a enviar):
Lo que hace el script es comprobar la salida del receptor cada segundo, si está activada enciende el led wlan de la fonera y accede a una página web php que envía mensajes sms con la API de envío de SMS del open movil forum, este es el código fuente:
El fichero SMSSenderAPI.php lo podeis descargar aquí. Los campos LOGIN y PASSWORD son para la api de open movilforum, el campo DESTINO es el número de móvil del destinatario y el campo MENSAJE el texto que se le enviará.
Después se edita el fichero /etc/firewall.user y se añade al final la siguiente linea sh /usr/bin/programa.sh &.
En la parte hardware he sacado los cables de GPIO de la fonera y alimentación y masa al exterior:
Igualmente he quitado en el receptor el integrado 7805 para alimentar el circuito directamente desde la fonera con dos cables (alimentación y masa):
Y soldado al pin 1 (el que se pone a 5 voltios si el circuito ha recibido una señal) del chip HEF4013BP un cable que irá directamente conectado al gpio 1 de la fonera:
Y como colofón un video demostrativo:
En el vídeo se puede ver como pulso el botón del emisor, después el led de la fonera se pone en verde y finalmente se recibe un mensaje de texto indicando Alarma activada.
El otro día me surgió la necesidad de matar un proceso desde mi programa en .NET. Este proceso debía estar mal programado y se quedaba cargado en memoria constantemente si daba un error, pero necesitaba cargarlo cada vez que el usuario necesitaba interactuar con él desde mi programa.
Por ello tuve que desarollar una función que hiciese esa labor:
1
2
3
4
5
6
7
8
9
10
11
12
13
privatebool MataProceso(String sNombre){foreach(Process clsProcess in Process.GetProcesses()){if(clsProcess.ProcessName.StartsWith(sNombre)){
clsProcess.Kill();
clsProcess.WaitForExit();returntrue;}}returnfalse;}
Se le pasa como parámetro el nombre del proceso o los primeros carácteres y devuelve true si lo ha matado o false en caso contrario. Este internamente recorre toda la lista de procesos comprobando el nombre de cada uno de ellos y cuando coincida procede a matarlo. Se debe incluir el espacio de nombres System.Diagnostics.
He estado un tiempo sin escribir en el blog porque me han operado en Febrero y he estado de baja por más de un mes.
Ahora que ya me estoy recuperando e incluso ya estoy trabajando desde principios de este mes empiezo a retomar mi vida normal, entre otras cosas mi blog.
Para empezar, unos trucos para el juego del buscaminas y para el pinball que vienen en cualquier windows por defecto.
Buscaminas:
Si arrancas el buscaminas, pulsas X Y Z Z Y y luego shift + Intro podrás poner el cursor del ratón encima de cualquier cuadrado y en la esquina superior izquierda de la pantalla verás un pixel blanco que te indica que no hay mina debajo o negro si la hay.
Pinball:
Para conseguir bolas extras escribe 1max
Para activar el pozo gravitatorio teclea gmax
Para ascender de rango escribe rmax
Para tener un número de bolas infinito escribe bmax
Para mover la bola con el ratón escribe hidden test (con espacio incluido).
Navegando por Internet me topé con un artículo de Kriptopolis en el cual hablan maravillas del proceso de las GPUs en comparación con las CPUs. Acto seguido me puse a buscar en Internet como usar la GPU de mi tarjeta NVDIA Geforce 8800 GTS y encontré el entorno CUDA (Compute Unified Device Architecture) de NVIDIA.
Este entorno está orientado a las tarjetas gráficas de la serie NVIDIA GeForce 8, 9, y 200; NVIDIA Tesla y muchos de los productos NVIDIA Quadro y está disponible para Windows, Linux y Mac. Tiene librerías específicas para transformadas rápidas de Fourier (FFT) y algebra lineal (BLAS) entre otras cosas. Existen plugins para MatLab y para Photoshop que usan CUDA para agilizar los cálculos que realizan. Existe otro entorno llamado BrookGPU aunque no lo he tratado a fondo parace algo más genérico.
Con una tarjeta de las mencionadas anteriormente se pueden ejecutar miles de hilos (threads) en cada uno de los nucleos que contiene la GPU a una velocidad superior que con una CPU actual.
Diferencias de GigaFlops entre CPUs y GPUs (Imágen de NVIDIA)
Para trabajar con CUDA lo primero que hay que hacer es instalarse el último driver de la tarjeta NVIDIA (que ya posee soporte CUDA). Después hay que instalar el toolkit de Cuda y finalmente hay que instalarse el SDK de Cuda. Todo esto se puede bajar en http://www.nvidia.es/object/cuda_get_es.html, pero el driver recomiendo instalarlo desde la sección de drivers para obtener el más actualizado.
En el siguiente artículo explicaré como usar la potencia de cálculo de la GPU con CUDA y Visual Studio 2005, haciendo un pequeño ejemplo.
Lo estúve pensando el otro día y creo que para repartir los premios deberían haber seguido una fórmula de proporciones. Si el premio a repartir son 10000 € y son 3 ganadores, la formula que propondría sería 3x + 2x +x = 10000. Eso sería 6x = 10000, con lo que x ≈ 1667. Finalmente el ganador tendría la proporción 3x, por lo que se llevaría 5001 €, el segundo 3334 € (2x) y el tercero 1667 € (x).
Espero que en siguientes concursos lo hagan de esa manera para premiar al 1, 2 y 3 equitativamente.