Archivo categoría Technologia

Fundamentos: Domicilios IP (v4)

El internet trabaja bajo el protocolo TCP/IP. Este mini tutorial explica que exactamente es un domicilio IP.

Los domicilios IP tradicionalmente se expresan en el formato de cuatro números del rango 0 a 255 separados por puntos, por ejemplo 85.14.0.250. Un número IP válido no puede comenzar o terminar con 0 (por ejemplo 0.1.1.1) pero si puede tener ceros en medio.

Este formato de los domicilios IP se usa por que es muy conveniente para segmentar y administrar redes y sub-redes. Tengo planeado explicar esos temas en otros tutoriales. El hecho de formatear los IPs de esta manera oculta un poco en realidad que es un numero IP, así que lo explico en este mini-tutorial.

En realidad, un domicilio IP no es nada más que un int de 32 bits, sin signo.  Por ejemplo, el IP que mencioné previamente, 85.14.0.250, en realidad es 1426981114.

¿Como hacemos esta conversión? Pues si nos fijamos, cada segmento del domicilio (por ejemplo el 85, el 14, el 0, y el 250) es un numero hexadecimal, por ejemplo en hexadecimal se podría explicar el IP mencionado como 55.0e.00.FA. Cada numero es de dos dígitos hexadecimales, y como podemos ver, un domicilio IP consiste de 8 digitos hexadecimales en total, y como cada digito hexadecimal requiere 4 bits para almacenarse, ahí vemos como un domicilio IP usa 32 bits.

Ahora, si en el ejemplo que llevamos tomamos el numero hexadecimal 0x550E00FA y lo convertimos a decimal, obtenemos 1426981114, el equivalente del int que mencioné al principio.

Ahora ¿como se hace la conversión de int a cadena y viceversa? Aparte de esta conversión intermedia a un número hexadecimal, hay una formula que nos permite hacer la conversión mas fácil.

De Cadena a Hexadecimal

Si tenemos un domicilio IP tradicionalmente expresado (por ejemplo 85.14.0.250), podemos aplicar esta formula:

250 + (256 x 0) + (256^2  x 14) + (256 ^3 x 85) = 1426981114

De Hexadecimal a Cadena

La conversión al revés es mas difícil hacerla a mano. Tenemos que dividir y sacar los enteros y dejar el restante para la siguiente operación. Continuando con nuestro ejemplo:

1426981114 / (256^3) = 85.0 Tomamos solo el integro, 85

(Vemos que resta 1426981114 – (85 x 256^3) = 917754)

917754 / (256^2) = 14.003; tomamos el integro, 14

(Vemos que resta 917754 – (14 x 256^2) = 250)

250 / 256 = 0.97; tomamos el integro, 0

(Vemos que resta 250 – (0 x 256) = 250)

250 / 1 = 250; tomamos el integro, 250

Por lo tanto, nuestro domicilio IP es el integro de cada operación: 85.14.0.250

¿Bueno, y por qué me importa esto?

Es muy importante entender esto por varias razones:

  • Se puede almacenar un IP en un solo int sin signo. En cambio si lo almacenas en una cadena, ¡puede usar hasta 15 caracteres! Guardar los IPs como int ahorra mucho espacio.
  • Sin convertir un IP a int es muy difícil saber si un IP esta en un rango de domicilios IP. (Ejercicio: Intenta programar una prueba de rango usando IPs en formato de cadena)
  • Es muy importante entender que un domicilio IP no es nada mas ni nada menos que un int de 32 bits. Esto es fundamental para entender el protocolo IP y el protocolo TCP.

Esto es tan solo uno de los fundamentos de entender el protocolo TCP/IP, pero es un fundamento super importante. Proximamente agregaré mas tuts del protocolo.

No hay Comentarios

Escribiendo en español en un teclado de inglés

¿Tienes un teclado en inglés y no puedes escribir letras como ñ ni acentos? ¿Estas apenado de tener que escribir “a&no”, “anio”, o algo similar en vez de “año”? ¿”guero” (o peór aun: “wero”) en vez de “güero”?

Tienes suerte, te voy a decir como configurar tu Windows para que puedas escribir bien en español.  ¡Se acabaron las excusas!

Teclado en inglés

Estoy hablando de este teclado...

Cuando hagas los cambios que describo en este artículo, vas a poder escribir la letra ñ, al presionar “~” seguido por “n”. Igual para hacer un acento es “‘” seguido por la letra deseada. ¿Listos? Voy a deascribir los pasos para Windows 7; Windows Vista y Windows XP son pasos muy similares. Voy a asumir que el Windows si esta en español; los pasos son los mismos para un Windows en inglés.  No está relacionado el lenguaje de Windows con el lenguaje del teclado (yo uso Windows en inglés y tengo mi teclado configurado para poder escribir en español).

Paso 1: Abrir el panel de control

Windows 7: Paso 1 - Abrir panel de control

Paso 2: Seleccionar cambiar métodos de entrada

 

Windows 7: Paso 2 - Cambiar métdos de entrada

Paso 3: Hacer clic en cambiar teclados

 

Windows 7: Paso 3 - Cambiar teclados

Paso 4: Clic en agregar teclado

 

Windows 7: Paso 4 - Agregar teclado

Paso 5: Seleccionar teclado “Estados Unidos – Internacional”

Windows 7: Paso 5 - Seleccionar "Estados Unidos - Internacional"

Paso 6: Poner nuevo teclado (“Estados Unidos – Internacional”) como predeterminado

Windows 7: Paso 6 - Poner el nuevo teclado como predeterminado

Paso 7: Quitar el teclado en inglés (o el que haya esta do configurado anteriormente) de los teclados disponibles

 

Windows 7: Paso 7 - Borrar el teclado anteriormente configurado

¡Terminado! Ahora puedes practicar escribir correctamente el tu computadora.  Primero escribes la decoración de la letra (‘ ” ~ `) y luego la letra afectada.  Este método sirve para varios idiomas, asi que puedes escribir Á asi como ç, ñ, è, Ü, etc. Experimenta y aprende a usarlo. ¡Yaq no tienes excusa para poner “ninio”, y “a&no” en vez de “niño” y “año”!

, ,

30 Comentarios

Como usar Hotmail desde Outlook (O cualquier otro cliente POP3/SMTP)

Si uno pudiera apuntar a un problema que muchísima gente ha tenido a través de loa años sin tener una solución clara, es el problema de usar algún cliente de email como Outlook para usar su cuenta de correo de Hotmail.

Hay plug-ins para Outlook, instrucciones no claras, y datos falsos o expirados (por ejemplo, de que se requiere una cuenta de Hotmail pagada para poder usarlo bajo Outlook).

Mi meta de es de disipar toda la incertidumbre :-).

En estos tiempos (septiembre 2009), uno puede accesar todas las cuentas Hotmail, inluyendo las que siempre han sido gratis.  La configuracion de puertos y servidores es la siguiente:

Servidor POP3:

  • Servidor: pop3.live.com
  • Port: 995
  • Encripción: SSL

Servidor SMTP:

  • Server: smtp.live.com
  • Port: 587
  • Encryption: TLS
  • Servidor requiere autentificacion

Para ambos servidores, el nombre de usuario es tu direccion email completa.

Configuración de Outlook

Estos son los pasos a seguir (perdonen las pantallas en inglés, no uso Outlook en español):

En la ventana principal de configuración:

Outlook Main Account Configuration Page

En esta ventana, dale entrada a los datos de servidor como esta mostrado, y también a tu nombre de usuario y contraseña.

Haz click en “Mas Configuraciones…” (O como diga en español)

Ventana de configuración de email

OutlookOutgoingServer

En esta ventana cambia a tab de servidor de envio, y cambia la configuracion como se muestra.

Ve al tab “Avanzado” en seguida…

OutlookAdvanced

…Y pon la configuración mostrada arriba.

Listo!  Ahor has prueba a tus cambios.  Presiona “OK” y vas a regresar a la ventana principal de configuracion de tu cuenta.

En esa ventana, presiona “Probar Configuración de Cuenta…” y Outlook va a hacer la prueba:

OutlookTestSuccess

Si pusiste todos los parámetros correctamente, vas a ver los valores de estatus como “Completado”.  Felicidades, ya tienes acceso completo a tu cuenta de Hotmail desde Outlook!

,

6 Comentarios

C#: Trabajando con Image y PictureBox

Una de las cosas más frustrantes de trabajar con imágenes y controles PictureBox es que cuando alguien instala tu aplicación, al tratar de modificar archivos de imágenes después de haberlos mostrado vía un PictureBox, algunos usuarios van a obtener errores de “fichero bajo uso por otro usuario” y “error GDI+ desconocido.” Estos errores solo pasan en algunas maquinas, y es muy inconsistente su aparición en general. Es difícil saber qué está pasando realmente.

Microsoft hace el problema peor, da mala información en sus páginas como esta: http://support.microsoft.com/kb/311754. Este artículo da una solución que no funciona, y aparte dice que lo que ocurre es “de acuerdo al diseño.” Ignorando la cuestión de cómo alguien podría poner este comportamiento intencionalmente en un sistema, el hecho de que el comportamiento no sea consistente constituye un error en la implementación.

Si hacemos una búsqueda para este problema, pueden ver varios arreglos propuestos:

  • Llamar .Dispose() a la imagen antes de grabar un archivo
  • Llamar .Dispose() a la imagen antes de grabar un archivo, y luego llamar al recolector de basura
  • Hacer una copia del objeto Image antes de asignarlo al control PictureBox (.NET es demasiado inteligente para esto, al pareces)
  • Usar Image.Clone() para hacer una copia del objeto Image antes de asignarlo al PictureBox
  • Usar FileStream para abrir el archivo

Hay muchísimas páginas y foros en el internet acerca de este problema, y los leí todos, créanme. Ninguno me dio una respuesta 100% efectiva, aunque me apuntaron en la dirección correcta: El problema es en asociar una imagen obtenida de un archivo con un PictureBox. La meta es de usar toda medida en hacer pensar al objeto Image que la imagen no vino de un archivo.

Ya basta de quejarnos… ¿Así que como lo arreglamos? Aparentemente este es un error en Windows desde los días de VB6, asi que no tiene caso esperar a que Microsoft lo arregle.

Después de muchos jalones de pelo e intentos fallidos, esto es lo que finalmente funcionó para mi: Abrir el archivo que contiene la imagen, y de la manera más indirecta posible, asignar los contenidos al objeto Image que vas a usar para mostrar la imagen en el PictureBox. Haz lo mismo cuando vas a salvar una imagen. Si no mezclas objetos Image con acceso a archivos todos van a estar felices y sin errores.

Estos son los pasos a seguir en general:

  • Para abrir un archivo:
    • Abre el archive, pero no como un objeto Image, lee el archive a un arreglo de byte
    • Convierte ese arreglo de byte a un objeto Image, la conversión detectara cual formato (JPG, PNG, etc…) usa el archivo
    • Usa ese objeto Image para asignarlo al PictureBox y desplegarlo
    • NO llames al método .Save() de Image para grabar un archivo, ve lo siguiente…
  • Para grabar un archivo:
    • Clona el objeto Image via el metodo .Clone()
    • Graba la imagen via a un MemoryStream, usando tu codificación preferida (JPG, PNG, etc…)
    • Convierte el MemopryStream a un arreglo de byte
    • Graba ese arreglo de byte al archivo destino

Aquí hay un poco de código que lo demuestra:

Para leer el archivo:

public static Image NonLockingOpen(string filename) {
	Image result;

	#region Save file to byte array

	long size = (new FileInfo(filename)).Length;
	FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
	byte[] data = new byte[size];
	try {
		fs.Read(data, 0, (int)size);
	} finally {
		fs.Close();
		fs.Dispose();
	}

	#endregion

	#region Convert bytes to image

	MemoryStream ms = new MemoryStream();
	ms.Write(data, 0, (int)size);
	result = new Bitmap(ms);
	ms.Close();

	#endregion

	return result;
}

Para escribir el archivo:

public static void NonLockingSave(Image img, string fn, ImageFormat format) {
	// Delete destination file if it already exists
	if (File.Exists(fn))
		File.Delete(fn);

	try {

		#region Convert image to destination format

		MemoryStream ms = new MemoryStream();
		Image img2 = (Image)img.Clone();
		img2.Save(ms, format);
		img2.Dispose();
		byte[] byteArray = ms.ToArray();
		ms.Close();
		ms.Dispose();

		#endregion

		#region Save byte array to file

		FileStream fs = new FileStream(fn, FileMode.CreateNew, FileAccess.Write);
		try {
			fs.Write(byteArray, 0, byteArray.Length);
		} finally {
			fs.Close();
			fs.Dispose();
		}

		#endregion

	} catch {
		// Delete file if it was created
		if (File.Exists(fn))
			File.Delete(fn);

		// Re-throw exception
		throw;
	}
}

Finalemente, aqui hay un método de extension que puede ayudarte:

public static void SaveViaStreams(this Image img, string fn, ImageFormat format) {
	NonLockingSave(img, fn, format);
}

Una vez que usé estos métodos para abriy y grabar mis archivos, todos mis errores de usar imagenes con PictureBox se fueron, en todas las computadoras quemis clientes usan. !Espero te ayuden a tí igual!

, ,

7 Comentarios

C#: Como obetener el directorio de ejecución

Soy un aficionado a la programación.  Asi que este es mi primer post de código fuente que hace cosas interesantes, resuelve problemas cuyas soluciones no son obvias, o simplemente es codigo interesante.

Este post tiene que ver con algo que aparenta ser simple:  Como pueda saber en cual directorio esta corriendo mi ejecutable?  La respuesta es sorprendentemente dificil de encontrar:

public static string GetExePath() {
	return (System.AppDomain.CurrentDomain.BaseDirectory);
}

La respuesta esta oculta, como ven, en System.AppDomain. Vale la pena explorar esa clase mas a fondo, hay muchas cosas interesantes ahí.

4 Comentarios