viernes, 22 de marzo de 2013

Instalar SQL Server Management Studio 2008 Paso a Paso

Decidi escribir este blog ya que todas la veces que tuve que instalar SQL Server Management Studio 2008 (SSMS) me encontre con el mismo problema: como se instala!!?? 
Visual Studio 2010 instala SQL Server 2008 Express, pero no incluye el SSMS. Si bien se puede utilizar el Visual Studio para realizar operaciones sobre bases de datos, con SSMS se pueden realizar tareas mas avanzadas. 
La instalacion de Management Studio para SQL Server 2005 era facil y sencilla, ya que se podia hacer con un instalador y un simple click, pero la cosa es diferente con 2008.

Lo primero que hay que hacer es obtener la version correcta del SSMS, ya que vamos a encontrar la version 2008 y la version 2008 R2. Para el caso que se tenga instalado VS 2010, se necesita la version 2008 (no la R2).

PASO 1: dirigirse a  Microsoft SQL Server 2008 Management Studio Express , y descargar SQLManagementStudio_x64_ENU.exe o SQLManagementStudio_x86_ENU.exe segun si el sistema es de 64 o 32 bits. En mi caso tengo Windows 7 64 bits, pero es muy similar para los demas os.

PASO 2: click derecho sobre el instalador y seleccionar "Ejecutar como Administrador". En Windows 7 aparece una advertencia de compatibilidad, ignorarla por ahora. Probablemente necesitemos instalar luego SQL Service Pack 2.

PASO 3: la siguiente pantalla es el "SQL Server Installation Center", ingresar en Installation.

image

PASO 4: seleccionar la primera opcion "New SQL Server stand-alone installation or add features to an existing installation", va a realizar un chequeo de reglas y si no hay errores presionar ok.

image


PASO 5: seguir adelante haciendo click en Install.




PASO 6: se ejecutan otras comprobaciones, probablemente aparezca un warning del firewall como se muestra en la siguiente imagen. Si se necesita acceso remoto al SQL es necesario configurar el firewall luego. en este caso seleccionar "Next".

image


PASO 7: hasta ahora sencillo. Pero aca viene el paso en donde se presenta la confusion. En la ventana "Installation Type", aparecen dos opciones: Perform a new installation of SQL Server 2008" ó Add features to an existing instance of SQL Server 2008", todos estaran pensando en elegir la segunda....error!! es la primera, y es donde todos nos equivocamos (la descripcion de las opciones es un desastre). Luego click en Next.


image


PASO 8: la siguiente pantalla es sobre la clave del producto, como es la version Express no se debe ingresar nada, click en Next.

image


PASO 9: aceptar los terminos de la licencia y click en Next.

image


PASO 10: en la siguiente ventana aparece la opcion de seleccionar nuevas caracteristicas. Por supuesto elegir "Management tools - Basic" y click en Next.

image


PASO 11: verificacion de espacio en disco. Click Next.

image


PASO 12: seleccionar si se desea enviar reportes de error a Microsoft. Click Next.

image


PASO 13: otra comprobacion. Click Next.

image


PASO 14: por fin, click INSTALL.

image


PASO 15: cuando la instalacion termina click Next.

image


PASO 16: y por utlimo Close.

image


Listo!! Podemos verificar la instalacion en el menu inicio como se ve en la siguiente imagen




Saludos!!



jueves, 29 de marzo de 2012

Como realizar tratamientos de imagen de manera eficiente en C#

Introduccion

Seguramente alguna vez te habras preguntado, si la unica manera de realizar un tratamiento de imagen de manera eficiente, solo se puede programando en C++....y la respuesta es no!, tambien puede hacerse en C# sin mucha diferencia.

Cuando digo tratamiento de imagen, me refiero por ejemplo a binarizacion, escala de grises, normalizado, negativo, etc, etc. Estos se pueden aplicar sobre una imagen  o foto que se encuentre en la pc o directamente sobre la imagen que podamos obtener de una camara web conectada a la pc.

Desarrollo

Una imagen puede pensarse como una matriz de pixeles, que en difinitiva lo es! Cada uno de estos pixeles queda definido por sus componentes de color, por ejemplo RGB (red, green, blue). De esta manera cada elemento de la matriz (pixel) tiene su propio color y de esta manera forman la imagen.
Ahora bien, los tratamientos de imagen actuan sobre estos pixeles de diferente forma segun sea el tratamiento, pero tomemos como ejemplo pasar una imagen color a escala de grises. El procedimiento seria tomar cada uno de esos pixeles, realizar un promedio entre sus componentes R,G y B, y el resultado asignarlo de nuevo a sus componentes, osea:

promedio = Pixel.ComponenteR + Pixel.ComponenteG + Pixel.ComponenteB;
Pixel.ComponenteR = Pixel.ComponenteG = Pixel.ComponenteB = promedio;

Por lo tanto, es necesario recorrer toda la matriz (imagen), pixel x pixel, y para cada uno de estos ejecutar la cuenta anterior. Como se daran cuenta, para una imagen pequeña, por ejemplo de 320x240 pixeles...tendriamos un total de 76800px, por lo tanto el acceso a cada uno de los pixeles tiene que ser considerablemente rapido! (ni hablar si la intencion es realizar el tratamiento directamente sobre la imgen de una camara web!!). Y aca es donde viene la parte interesante...cualquier proramador de C++ diria que solo basta con utilizar un par de punteros para recorrer esa matriz y acceder a cada pixel mediante su direccion de memoria, lo cual es fantastico!, pero como hacemos esto en C#?..nunca nada mejor que un ejemplo:

/// <summary>
/// Pasa la imagen del pictureBox a escala de grises, utilizando
/// punteros para recorrer la imagen
/// </summary>
private void PasarAEscalaDeGrises()
{
           // Imagen que contiene ekl pictureBox
            Bitmap imgSource = (Bitmap)picImagen.Image;

            // Se fija la imagen en memoria (array) y se obtiene un objeto (imgSourceData) que describe
            // la posicion de los datos y el layout del array en memoria.
            System.Drawing.Imaging.BitmapData imgSourceData = imgSource.LockBits(new Rectangle(0, 0,  imgSource.Width, imgSource.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite,
                                                        System.Drawing.Imaging.PixelFormat.Format24bppRgb);

            int stride = imgSourceData.Stride;
            int imgWidth = imgSource.Width;
            int imgHeight = imgSource.Height;
            byte R, G, B;
            int promedio;
            int offset = stride - imgWidth * 3;
            // Address del primer pixel de la imagen
            System.IntPtr firstPixelAddress = imgSourceData.Scan0;
    
           // Bloque de codigo en el cual podemos declara punteros! OJO: el GarbageCollector no le
          // da bola, con lo cual tenemos que ocuparnos nosotros de la memoria!
            unsafe
            {
                // Puntero al primer pixel de la imagen. Con este puntero
                // vamos a recorrer la imagen.
                byte* punteroAPixel = (byte*)(void*)firstPixelAddress;

                for (int j = 0; j < imgHeight; j++)
                {
                    for (int i = 0; i < imgWidth; i++)
                    {
                        B = punteroAPixel[0];
                        G = punteroAPixel[1];
                        R = punteroAPixel[2];
                      
                        promedio = (R + B + G) / 3;
                        punteroAPixel[0] = punteroAPixel[1] = punteroAPixel[2] = (byte)promedio;
                      
                        // Como estamos recorriendo el ancho, en la proxima pasada tenemos
                        // que apuntar al siguiente pixel (recordar que cada posicion tiene 3 bytes, uno por cada
                        // componente RGB)
                        punteroAPixel += 3;
                    }
                    // Saltamos de fila!
                    punteroAPixel += offset;
                }
            }
           
            imgSource.UnlockBits(imgSourceData);
            picImagen.Image = imgSource;
        }

Bueno la idea no es comentar demasiado sobre el codigo, ya que es muy simple y ademas adjunto un zip con el ejemplo en C# 2010. Si investigan un poco se van a dar cuenta que la velocidad con la que se realiza el procesamiento, en este caso pasar a escal de grises, es muy rapida y totalmente comparable con el mismo programa realizado en C++.

Conclusion

Es importante decir, que el ejemplo visto es solo una aplicacion de como aplicar algun procesamiento a una imagen de forma eficiente, utilizando punteros mediante la instruccion unsafe, pero esto puede utilizarse para otras cosas, como por ejemplo el acceso a API de codigo no manejado.


Para la proxima voy a explicar como levantar la imagen de una webcam en C# utilizando DirectShow, que es una de las formas mas rapidas de acceder a la webcam. Esto sumado a lo visto en esta entrada, les puede permitir armar una aplicacion de vision artificial en C#, con una muy buena performance.

Descarga Source Code

Saludos!

lunes, 26 de marzo de 2012

Como incrementar la frecuencia con la que GMAIL revisa tus otras direcciones de correo

Introduccion

Esta entrada no tiene demasiado que ver con el proposito de mi blog, pero me parece algo util para los usuarios de Gmail y sobre todo los que disponen de un dispositivo movil con android.

Muchos de los usuarios de Gmail tienen otras cuentas de correo electronico como yahoo, hotmail, etc. Una practica habitual para no tener que estar chequeando todos los proveedores que disponemos, es utilizar la posibilidad que nos ofrece gmail de agregar cuentas de otros proveedores y de esta manera recibir en la bandeja de gmail todos los correos. Para hacer esto pueden encontrar en san Google varios links en donde esta bien explicado el procedimiento, de hecho es bastante sencillo. (aca dejo un link del tema en cuestion http://www.androidcentral.com/using-gmail-your-own-personal-push-mail-server

Problematica

Todo esto es fantastico hasta que nos damos cuenta que los mails de las otras cuentas no llegan inmediatamente a la bandeja de entrada de Gmail, ya que Gmail utiliza una tecnica de pull con un criterio bastante particular. El criterio esta basado en la frecuencia con que nos llegan mails a las demas cuentas, es decir cuanto menos mails por dia nos lleguen a la otra cuenta, mas baja sera la frecuencia con la que Gmail chequee esa cuenta. Esto suena logico, pero muchas veces estamos esperando un mail importante y queremos recibirlo en la bandeja de Gmail lo antes posible. 
Gmail basa la frecuencia de pulling en funcion de que tan seguido encuentre nuevos correos cada vez que chequea la/s cuenta/s de los otros proveedores.Por ejemplo si tengo una cuenta de yahoo y me llegan 2 mails por dia, puede ser que recien al cabo de algunas horas tengamos un nuevo correoen nuestra bandeja de entrada de Gmail.

Solucion

La solucion puede parecer un poco complicada, pero para los que tenemos varias cuentas y queremos tener todas integradas a Gmail de manera practica,  resulta muy util, sobre todo si disponemos de un dispositivo movil con Android y necesitamos tener los mails sincronizados y al instante. 
Recuerden que si utilizamos desde el dispositivo movil, cuentas de mail que no disponen del servicio push, tenemos que setear la frecuencia de lectura, y cuanto mas pequeña sea esta frecuencia, mas bateria consume el dispositivo. Por eso esta bueno tener todo integrado con Gmail, ya que el mismo si dispone del servicio push, esto significa que el servidor de internet notifica al dispositivo movil cada vez que llega un nuevo correo sin la necesidad de hacer pulling!!

La idea general es incrementar la cantidad de mails que nos llegan a las otras cuentas, como?, de forma automatica. Para este proposito es necesario crear una seguna cuenta de gmail y desde esta enviar e-mails de forma automatica, cada un cierto tiempo, a las otras cuentas. Porque hacer una seguna cuenta de gmail si ya disponemos de una?, aunque el metodo no es ilegal, podria pasar que gmail detecte demasiados mails enviados a las mismas direcciones y la suspenda por 24 hs, nunca me paso pero por las dudas es recomendable hacer esta segunda cuenta.

Una vez creada la seguna cuenta, lo que vamos hacer es un pequeño script con el editor de scripts, para esto ir a Tools Menu -> Scripts -> Script Editor.

Editar el script con el siguiente codigo:

function EnviarMailToYahoo() 
{
var fuente = "[NombreDeFacilFiltrado]"; 
var mensaje = "Email enviado el:  " + new Date(); 
var destino= "miEmailDeYahoo@yahoo.com"; 
MailApp.sendEmail(destino, fuente, mensaje );
}

Acordarese de reemplazar el mail de destino con la cuenta que deseen que gmail chequee con mas frecuencia.
Cuando les pregunte si deseamos guardar el script, poner que si y darle un nombre apropiado.
En el editor de scripts ir a Triggers Menu -> Current Script's Triggers. Crear un nuevo trigger, seleccionen el nombre del script creado anteriormente, y pongan las funciones "Time-Driven" "minutes timer" "every 30 minutes". En este caso se enviara un mail automaticamente a la direccion que pusieron en el script como "destino" cada 30 minutos, lo cual es suficiente para que gmail cheque esa cuenta cada unos 15 min.

Una vez que tenemos esto configurado y guardado, esta cuenta enviara mails automaticamente a la cuenta destino cada el tiempo que hayamos especificado en el trigger!!

Por ultimo y recomendable, es filtrar en su cuenta principal de Gmail estos mails, lo cual pueden hacerlo agregando un filtro al subject, en este caso el nombre que hayamos puesto en nuestro script, bajo la variable source. En este filtro, pueden indicarle a Gmail que cada vez que reciba un mail de este subject, lo etiquete y lo elimine, y asi pueden mantener su bandeja de entrada limpia y olvidarse de este problema.

Conclusion

Al cabo de unas horas, su cuenta principal de Gmail estara chequeando la/s otras cuentas de los otros proveedores que agregaron cada la mitad de tiempo que les llega un mail, para este ejemplo cada 15min!!, Aunque podrian aumentarlo y llevarlo a 5min!

Espero sea de utilidad!

Referencias:
* http://lifehacker.com/5580553/increase-the-frequency-gmail-checks-your-other-email-accounts-for-new-mail


viernes, 23 de marzo de 2012

Como fabricar poleas dentadas (sincronicas) de bajo costo

Introduccion

En este post les voy a contar como fabricar una polea dentada, tambien conocida como sincronica, a partir de una polea lisa. Cabe destacar, que este metodo no es valido para desarrollos que requieran demasiada precision, si no que esta orientado a proyectos caseros o para la universidad.

Muchas veces se habran encontrado con la necesidad de utilizar poleas dentadas en algun desarrollo que estaban haciendo, quizas de robotica o algun equipo o maquina. La primera opcion (y la mas sencilla!) es comprar una polea estandar y listo!, pero el problema reside en el precio :( , ya que en la mayoria de los proyectos caseros o para la facultad no se dispone de mucho presupuesto. Ese es el motivo de este post, fabricar poleas dentadas de bajo costo.

Que es una polea dentada?

Una polea dentada, como su nombre lo indica, es una polea que posee un dentado en toda su periferia, muy similar a un engranaje, pero los dientes tienen una forma diferente. La diferencia fundamental entre una polea de este tipo y una polea lisa, es que la dentada permite realizar un movimiento sincronico entre dos ejes, ya que no se produce resbalamiento entre la polea y la correa, por esto tambien se las suele llamar poleas sincronicas. Son ideales para la transmision de movimientos precisos, y muy utilizadas en el area de la robotica y los automatismos.


Materiales y elementos necesarios

Lo que vamos a necesitar es:
  • Una polea lisa a la cual queremos agregar el dentado. Un detalle no menor, es que la polea debe tener dos solapas para que se pueda utilizar este procedimiento. Como referencia se puede ver la imagen siguiente:

  • Una correa dentada con las siguientes caracteristicas:
    • Debe tener el ancho de la polea lisa que tenemos 
    • El paso de los dientes del dentado que le vamos a agregar a la polea lisa sera el mismo que el paso de la correa dentada.
    • La longitud del perimetro de la correa debe ser mayor al perimetro de la polea lisa.
  • Masilla epoxi de dos componentes
  • Tijera
  • Desmoldante, se puede usar algun lubricante en aerosol, por ejemplo del estilo de TriFlow
  • Paciencia!

 Procedimiento

Como ya se imaginaran, la idea es moldear los dientes sobre la polea lisa, utilizando como materia prima para los dientes la masilla epoxi y como "molde" la correa dentada.
  1. Medir el diametro de la polea lisa y calcular el perimetro (muy facil!! san google puede ayudarte con esto)
  2. Verificar que el perimetro de la correa es mayor que el que acaban de calcular, porque si no no les va a alcanzar el largo de la correa. No es necesario cortar la correa!!
  3. Preparar una cantidad de masilla suficiente para poder cubrir todo el diametro de la polea con un espesor de masilla que dependera  de la altura de los dientes de la correa. Siempre preparen bastante al principio para no quedarse cortos.
  4. Aplicar el desmoldante a la correa del lado de los dientes. Esto es lo que va a evitar que la misma se adhiera a la masilla!
  5. Aplicar la masilla en todo el perimetro de la polea, intentado generar un espesor lo mas parejo posible.
  6. Colocar la correa como se muestra en la imagen siguiente y presionar parejo para moldear los dientes.
  7. Eliminar los excedentes que sobresalgan por los costados de la correa, puede hacerse con un cutter .
  8. Dejar secar segun las instrucciones que indique la masilla que utilizaron.
  9. Desmontar la correa y voila!



Algunas consideraciones

Es posible que luego de desmontar la correa sea necesario retocar los dientes por algun excedente o imperfeccion, pero tengan cuidado ya que la masilla es un material fragil y puede romperse!
Cuando tengan el mecanismo funcionando, es posible que noten que la correa se monta sobre algun diente a medida que gira, esto es debido a que el espesor de la masilla no es constante en todo el perimetro de la polea. Aunque en muchas ocasiones este efecto es realmente imperceptible para la mayoria de los proyectos caseros o de facultad.
El diamtero maximo de polea en el cual he probado este procedimiento es de alrededor de 60-70mm y diamtros minimos de 15-20mm. El paso de correa que utilize es el XL. En este rango de diametros y con este paso de correa no he tenido problemas.

Referencias

Este procedimiento fue creado cuando fabrique el primer robot en 4to año de la carrera de ingenieria. Las otras personas que estuvieron en el prpyecto fueron Damian De Biase, Gaston Rojas y Cesar Foti.

Espero les sea de utilidad!

Nos vemos en la proxima entrada.