Tuesday, June 30, 2009

Firefox tarda mucho para correr despues de actualizar a 3.5

Firefox 3.5 (nombre clave Shirekoto) esta listo, todos a bajarlo!

Despues de actualizar y correrlo la primera vez, me salio esta pequeña ventana

Me tomo un rato para darme cuenta que esta ventanita estaba siquiera en mi pantalla, pense que simplemente estaba tardando mucho para correr la primera vez, pero luego ya me parecio demasiado tiempo, entonces di click en la barra de tareas, en el icono de firefox y fue cuando vi la ventanita esta, trate de redimensionarla para ver los contenidos, pero no me dejo, lo unico que pude hacer fue cerrarla y ya Firefox corrio normal

Asi que solo lo agregue aqui por si a alguien le pasa lo mismo, espero que sea de ayuda

sintomas: Firefox tarda mucho en correr la primera vez despues de actualizar a 3.5
solucion: click en la barra de tareas, en el icono de firefox y encuentra la ventanita esta, cierrala y Firefox correra normal

Tuesday, June 23, 2009

Como convertir DIB a Bitmap

El fin de semana pasado un amigo me pidio ayuda con un codigo para convertir DIB a Bitmap en .NET, habia encontrado un codigo que casi hacia todo lo que necesitaba, pero la imagen se cortaba en los lados, supusimos que el problema era con el codigo que obtenia un puntero al bitmap, asi que investigamos mas y encontramos un codigo que supuestamente arreglaba ese problema, solo tuvimos que hacer unos cambios y un par de arreglos para que funcionara correctamente. Como no encontramos una solucion completa por ningun lado decidi escribir este post ya que vi muchisima gente con este problema preguntando en muchos foros en Internet, asi que espero que pueda ser util, sin mas, aqui va la solucion:

Primero tienes que agregar una referencia a System.Drawing.dll en tu proyecto, luego agrega esto al uses

//Name spaces needed
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
El siguiente paso es declarar la estructura BITMAPINFOHEADER, esta puede estar declarada fuera de tu clase:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct BITMAPINFOHEADER
{
public uint biSize;
public int biWidth;
public int biHeight;
public ushort biPlanes;
public ushort biBitCount;
public uint biCompression;
public uint biSizeImage;
public int biXPelsPerMeter;
public int biYPelsPerMeter;
public uint biClrUsed;
public uint biClrImportant;

public void Init()
{
biSize = (uint)Marshal.SizeOf(this);
}
}

Luego necesitas agregar esto para importar una funcion de GdiPlus.dll
//GDI External method needed Place it within your class
[DllImport("GdiPlus.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
private static extern int GdipCreateBitmapFromGdiDib(IntPtr pBIH,
IntPtr pPix, out IntPtr pBitmap);
Y bien, ahora podemos irnos al codigo en si que nos servira para convertir el DIB a Bitmap, notese el uso de la funcion GetPixelInfo, aqui precisamente estaba la raiz de nuestros problemas; la funcion BitmapFromDIB que encuentras por todo internet no tiene este codigo asi que eso hace que no funcione en muchos casos. De hecho la funcion esta que anda rondando por internet, toma un parametro pPix pero nunca menciona como obtener este valor. Este codigo necesita estar declarado dentro de tu clase

//THIS METHOD SAVES THE CONTENTS OF THE DIB POINTER INTO A BITMAP OBJECT
private static Bitmap BitmapFromDIB(IntPtr pDIB)
{
//get pointer to bitmap header info
IntPtr pPix = GetPixelInfo(pDIB);

//Call external GDI method
MethodInfo mi = typeof(Bitmap).GetMethod("FromGDIplus", BindingFlags.Static | BindingFlags.NonPublic);
if (mi == null)
return null;

// Initialize memory pointer where Bitmap will be saved
IntPtr pBmp = IntPtr.Zero;

//Call external methosd that saves bitmap into pointer
int status = GdipCreateBitmapFromGdiDib(pDIB, pPix, out pBmp);

//If success return bitmap, if failed return null
if ((status == 0) && (pBmp != IntPtr.Zero))
return (Bitmap)mi.Invoke(null, new object[] { pBmp });
else
return null
;
}

//THIS METHOD GETS THE POINTER TO THE BITMAP HEADER INFO
private static IntPtr GetPixelInfo(IntPtr bmpPtr)
{
BITMAPINFOHEADER bmi = (BITMAPINFOHEADER)Marshal.PtrToStructure(bmpPtr, typeof(BITMAPINFOHEADER));

if (bmi.biSizeImage == 0)
bmi.biSizeImage = (uint)(((((bmi.biWidth * bmi.biBitCount) + 31) & ~31) >> 3) * bmi.biHeight);

int p = (int)bmi.biClrUsed;
if ((p == 0) && (bmi.biBitCount <= 8))
p = 1 << bmi.biBitCount;
p = (p * 4) + (int)bmi.biSize + (int)bmpPtr;
return (IntPtr)p;
}
Finalmente, como algo agregado, lo que mi amigo realmente necesitaba era convertir de DIB a TIFF (grupo 4), asi que escribio una funcion mas que usa la funcion previa de BitmapFromDIB function and allows you to set the image resolution

private void SavehDibToTiff(int hDIB, string fileName, int xRes, int yRes)
{
//Identify the memory pointer to the DIB Handler (hDIB)
IntPtr dibPtr = new IntPtr(hDIB);

//Save the contents of DIB pointer into bitmap object
Bitmap myBitmap = BitmapFromDIB(dibPtr);

//Set resolution if needed
if (xRes >0 && yRes>0)
myBitmap.SetResolution(xRes, yRes);

//Create an instance of the windows TIFF encoder
ImageCodecInfo ici = GetEncoderInfo("image/tiff");

//Define encoder parameters
EncoderParameters eps = new EncoderParameters(1); // only one parameter in this case (compression)

//Create an Encoder Value for TIFF compression Group 4
long ev = (long)EncoderValue.CompressionCCITT4;
eps.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, ev);

//Save file
myBitmap.Save(fileName, ici, eps);
}
//Helper to get Encoder from Windows for file type.
private static ImageCodecInfo GetEncoderInfo(String mimeType)
{
ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();
for (int j = 0; j < encoders.Length; ++j)
{
if (encoders[j].MimeType == mimeType)
return encoders[j];
}
return null;
}

Y eso es todo, espero les sea de utilidad, gracias a Danny por darme el codigo final y agregarle comentarios

Saturday, June 13, 2009

Porque las pestañas de IE tienen colores?

colored tabs

Esto es algo de lo que me gusto mucho en Internet Explorer 8, pero no todo mundo capta inmediatamente el significado de los colores. Los colores son para agrupar pestañas relacionadas entre si, osea que si tu sigues un link de una pagina y IE abre una pestaña, asignara el mismo color que la pestaña previa de donde se abrio esta nueva y de esta manera podras ver facilmente que una fue derivada de la otra, esto es muy util en estos dias que uno normalmente mantiene muchisimas pestañas abiertas al mismo tiempo, unas para cuestiones personales, otras para trabajo, busquedas, etc, el tenerlas agrupadas por colores nos permite ver cuales estan relacionadas entre si.

La motivacion a escribir este post fue precisamente porque alguien me pregunto que significaban los colores, asi que pense que seguramente habria mas gente que tendria la misma pregunta.

Saturday, May 02, 2009

Twitter para desarrolladores

Durante el #followfriday de hoy en Twitter se me ocurrio crear una lista de los desarrolladores de habla hispana que regularmente escriban cosas relacionadas con el desarrollo de software.

Es practicamente imposible (y creo que seria un desperdicio total) que alguien escriba 100% cosas relacionadas al desarrollo en twitter, pero esta gente son los que yo he notado que son mas regulares en mantenerse apegados al tema.

Espero sea de utilidad para los programadores que quieran entrar en contacto con otros programadores en Twitter, aun para los que no han entrado a twitter y les interese poder dialogar con gente de su mismo medio, este seria un buen medio para hacerlo.

Sin mas, aqui esta la lista, la cual estare actualizando constantemente:

@gabo
@fabianober
@fcastellanos
@ferglo
@Jersson
@jorgegamba
@HardBit
@mario_chavez
@mariohcornejo
@mmonterroca
@scasware
@SrBichi

Y por supuesto @ebersys

Esta es mi lista inicial, la ire actualizando como vaya identificando mas usuarios, si tienen algunos candidatos para mi lista por favor haganmelo saber aqui o en twitter, mis unicos requisitos son que escriban en español y que regularmente escriban algo relacionado con el desarrollo de software

Thursday, April 16, 2009

Unir cadenas con comas

Hace unos dias Eric publico un problema, al principio me dio flojera responderlo, pero al ver el numero de respuestas decidi hacerlo agregando el reto personal de ser la respuesta mas corta (con mi equipo anterior competiamos en ver quien podia refactorizar mas), asi que aqui esta:
El problema:
Escribir una funcion que tome un IEnumerable no nulo y regrese una cadena con las siguentes caracteristicas:

(1) Si la secuencia esta vacia, regresar "{}".
(2) Si la secuencia contiene un solo elemento "ABC" el resultado sera "{ABC}".
(3) Si la secuencia contiene 2 elementos "ABC", "DEF" El resultado sera "{ABC and DEF}".
(4) Si la secuencia contiene mas de 2 elementos "ABC", "DEF", "G", "H" el resultado sera "{ABC, DEF, G and H}". (Noten que los ultimos 2 elementos no estan unidos por coma)

Mi solucion:

static string JoinStrings(IEnumerable<string> strings) {

    int len = strings.Count();

    return "{"+(

        (len > 1) ?

            strings.Take(len - 1)

            .Aggregate((string head, string tail) => head+", "+tail)+

            " and " +strings.Last()

        : (len == 1) ?

            strings.First()

        : "")+

        "}";

}

Por cierto, si solo quisieramos unir las cadenas con comas (y regresar una cadena vacia cuando no hay elementos), pudieramos utilizar esto:

static string JoinStrings2(IEnumerable<string> strings) {

    return strings.Count() > 0 ?

        strings.Aggregate((string h, string t) => h+", "+t)

        :

        "";

}

Friday, April 10, 2009

El reto de crear un StackOverflow hispano

Ayer el dia de antier salio a la platica en twitter el tema de crear un sitio como StackOverflow para la comunidad hispana, Fabian inicio el tema y dio el seguimiento propio en su blog, Mario dio su punto de vista en su blog tambien.

Para los que no hallan escuchado de StackOverflow, la descripcion rapida que dan los mismos autores del sitio es "es como experts-exchange, pero sin la basura" (is like experts-exchange, but without the evil), el caso es que StackOverflow se ha convertido rapidamente en un referencial muy importante para encontrar soluciones rapidas a problemas de programacion, practicamente en cualquier lenguaje.

Pues bien, esta idea de crear un clon de este sitio en español ya me habia rondado por la cabeza pero tenia (tengo) muchas dudas sobre si podria llegar a funcionar, me encantaria poder hacer funcionar algo asi, este blog en particular es un intento por llevar recursos tecnicos al publico de habla hispana, pero desafortunadamente al mismo tiempo es muy facil ver la falta de interes en estos temas. A mi parecer hay algunas cuestiones que deberiamos responder para ver la viabilidad del proyecto. (si no quieres leer todos los puntos, saltate al #7)

  1. Identificar si el proyecto es realmente una nececidad, habria que averiguar el interes de la comunidad en este proyecto y los sitios de este tipo en la actualidad (talvez ya hay algo asi pero necesita apoyo?).
  2. Muchos de los desarrolladores hispanos con buen nivel participan en comunidades en ingles unicamente (sera que tambien nos ayudarian?).
  3. La mayoria (creo) de los desarrolladores recurren a sitios en ingles para encontrar soluciones a sus problemas (se debe esto a la falta de recursos en español? usarian recursos en español si existieran?).
  4. Que cantidad de desarrolladores no saben suficiente ingles de tal manera que su unica opcion es buscar contenido en español.
  5. Los problemas que encontramos y los terminos tecnicos generalmente estan expresados en ingles (errores del compilador, frameworks<==, etc), alguien comento que los motores de busqueda inclinarian los resultados a paginas en español, lo cual es cierto siempre y cuando hagan las busquedas desde la version localizada de Google o tengan configurado el idioma español en sus preferencias.
  6. El #5 me lleva a otro punto importante, al hacer la descripcion/solucion de un problema deberiamos hacerlo en ingles y español? dado que si hacemos la descripcion en español, no servira para muchos que buscan los terminos en ingles (y que se beneficiarian de encontrar una respuesta en español) y si solo la hacemos en ingles... pues entonces ya no es version en español, este punto en particular creo que es un problema complicado.
  7. La idea por supuesto ya se le ha ocurrido a muchos otros antes, y hay quienes han pedido incorporar el idioma español al sitio de alguna manera, la respuesta de los autores es positiva, aunque no a corto plazo (tambien en el podcast lo han mencionado), pero esa podria ser otra opcion, hay varias formas para lograrla, siendo la mas simple de ellas el traducir los articulos, la implementacion no debe ser muy dificil, podria haber una opcion para pedir traduccion (para dar prioridad a la traduccion), y si juntaramos suficiente gente podria ser mas factible que algo asi avanzara mas rapido. Cabe destacar que esta opcion no tendria el problema del punto #6 y de hecho yo me inclino por esta opcion y si lo que realmente importa es contar con esta herramienta, creo que es la primera opcion que deberiamos perseguir una vez que podamos manifestar suficiente interes por parte de la comunidad (se me ocurre que podria ser una entrada (pregunta) en stackoverflow y las respuestas serian el apoyo).
Creo que esos son los puntos mas importantes que habria que contemplar para poder hacer algo, este ejercicio me ha servido a mi para identificar lo que yo considero la mejor opcion, hasta ganas me dan de borrar los otros puntos, pero pase mucho tiempo escribiendolos, asi que los dejo.

Que piensan?

Tuesday, April 07, 2009

Como eliminar el dialogo sobre contenidos mixtos en Internet Explorer

keywords: IE8, mixto, contenido, dialogo, advertencia, seguridad.

La version en ingles de este articulo la encuentran aqui: How to: prevent the security dialog about unsecure items in IE

En el post previo sobre el nuevo dialogo en IE8 acerca de contenidos mixtos, alguien pregunto "Hay alguna manera de desactivar esa advertencia de seguridad? Lo pregunta 100 veces!!", ya habia planeado yo escribir un post separado para contestar esa pregunta, pero simplemente se me olvido, lo bueno es que me lo recordaron y aqui esta lo que necesitas hacer si ya no quieres que se muestre ese dialogo:

En la version en español:
Herramientas>Opciones de internet>seguridad>Nivel Personalizado>Mostrar contenido mixto: Habilitar
En la version en ingles:
tools>internet options>security>custom level>display mixed content: enable



Es importante resaltar que si el sitio que estas visitando no esta en la zona de internet, tendrias que hacer los cambios a la zona apropiada:

Para identificar la "zona" en la que estas solo tienes que mirar la parte inferior derecha del browser, donde veras algo asi:


Si le das doble click ahi, entonces podras hacer cambios a las otras zonas (Intranet Local, Sitios de confianza, Sitios restringidos)

Solo haz click en la zona deseada, luego click en el boton "Nivel Personalizado" y eso abrira el primer dialgo en este post donde podras hacer el cambio.

Este articulo aplica a IE8, IE7, IE6 (Y la verdad no se si aplica a versiones anteriores, aunque espero realmente que nadie este usando algo mas viejo que IE6)