Plug in de NCL en Eclipse

|

Hace unos dias tuve la suerte de asistir a un curso de Ginga, donde vimos la potencialidad de la herramienta, y claro es muy interesante lo que se puede hacer, pero algo que no nos indicaron es como reproducir el ambiente de desarrollo en nuestras maquinas, cuando busque en Google como instalar el plugin de NCL en Eclipse pues no hubo tanta info, y la mayoria esta en portugues, asi es que quiero compartir la info que encontre y que hice yo para reproducir el ambiente de desarrollo en mi computadora:
1. Obtener Eclipse: me gusta el ultimo release (Helios), si no lo tienen vayan a http://www.eclipse.org y escojan el Eclipse de acuerdo a su plataforma.
2. Obtener el Plugin de NCL para Eclipse: la pagina que encontre en portugues es esta:
http://laws.deinf.ufma.br/~ncleclipse/installation.html
En resumen, debes agregar un repositorio de software en Eclipse que apunte al plugin de NCL, yo lo llame NCL Eclipse al repositorio, este es el repositorio: http://www.laws.deinf.ufma.br/ncleclipse/update
Despues de eso, tienes que en cuadro que sale cuando entras en el menu de Ayuda->Instalar nuevo software, buscar el repositorio que acabas de agregar y escoger el unico item que muestra, luego dar click en siguiente, aceptar la licencia, dar click en siguiente de nuevo y comienza la descarga e instalacion.
Luego es necesario tener las maquinas virtuales para poder crear tus ejemplos para Ginga, en esta pagina se encuentran las maquinas virtuales:
http://www.gingancl.org.br/ferramentas.html
Cuando ya tienes la maquina vitual necesitas VMware Player para usarlo, puedes encontrarla en http://www.vmware.com, es gratuito.
Con esto ya tienes tu ambiente de desarrollo Ginga, solo hace falta usar la imaginacion para comenzar a realizar muchas cosas con Ginga!
Eso es por lo pronto, seguire haciendo posts para preservar el conocimiento que algo voy adquiriendo.

Convertir Coordenadas DMS a Decimal

|

No se si a ustedes les ha pasado, pero he necesitado convertir coordenadas en grados, minutos y segundos a decimales, o lo que llaman UTM, especialmente esto suele estar almacenado en una base de datos, y claro convertirlo puede ser un problema y mas cuando son bases de datos de producción, la solución? Una función que haga esta conversion y esta incluirla en una vista, y bien aqui esta la función para SQL Server 2005 en adelante, si necesitan podría pasarla a Oracle tambien…

CREATE FUNCTION ConvertirDMS
(
    -- Add the parameters for the function here
    @strData varchar(500)
)
RETURNS decimal(10,8)
AS
BEGIN
    DECLARE @decResult decimal(10,8)
    declare @posD int
    declare @posDQ int
    declare @posM int
    declare @posS int
    declare @piece varchar(500)
    declare @decD decimal(10,8)
    declare @decM decimal(10,8)
    declare @decS decimal(10,8)
    declare @strSign varchar(2)
   
    --Ubica el signo de grados
    set @posD =  patindex('%°%' , @strData)
    --Ubica el signo de grados cuando esta mal puesto
    set @posDQ =  patindex('%?%' , @strData)   
    --Ubica el sigo de minutos
    set @posM =  patindex('%"%' , @strData)
    --Ubica el sigo de minutos
    set @posS =  patindex('%''%' , @strData)
   
    -- Saca los segundos y los convierte a decimal
    set @decS = CONVERT(decimal(10,8), substring(@strData, @posM + 1, @posS - @posM - 1))
    -- Saca los minutos y los convierte a decimal
    if(@posDQ = '0')   
        set @decM = CONVERT(decimal(10,8), substring(@strData, @posD + 1, @posM - @posD - 1))
    else
        set @decM = CONVERT(decimal(10,8), substring(@strData, @posDQ + 1, @posM - @posDQ - 1))
    -- Saca los minutos y los convierte a decimal
    if(@posDQ = '0')   
        set @decD = CONVERT(decimal(10,8), substring(@strData, 0, @posD))
    else
        set @decD = CONVERT(decimal(10,8), substring(@strData, 0, @posDQ))
    --Saca la orientacion para el signo
    set @strSign = SUBSTRING(@strData, @posS + 1, len(@strData) - @posS)   
    --Calcula los segundos a minutos
    set @decM = @decM + (@decS / 60.00)
    --Calcula los minutos a grados
    set @decResult = @decD + (@decM / 60.00)
    --Pone el signo
    if (upper(@strSign) <> 'N' and UPPER(@strSign) <> 'E')
        set @decResult = @decResult * -1
   

    RETURN @decResult;
END

Ejecutar multiples instancias de Apache como Servicio

|

Primero como verán, este blog ya no es mas de solo .NET, ahora sera agnóstico, pondré temas y temas de lo que vaya haciendo, que últimamente me ha resultado interesante, como por ejemplo la necesidad de correr dos instancias de Apache Tomcat 6 en Windows, pero las dos como servicios, para esto me encontré con un link que fue de mucha ayuda:

http://www.vicconsult.com/tips/apache-tomcat-load-balance-miltiple-instances-ha.html

Y basado en la información de ahí, logre generar este comando:

tomcat6 //IS//Tomcat6 --DisplayName="Apache Tomcat 6 Alter" --Install="d:\apache2\bin\tomcat6.exe" --Jvm=auto --StartMode=jvm --StopMode=jvm --StartClass=org.apache.catalina.startup.Bootstrap --StartParams=start --StopClass=org.apache.catalina.startup.Bootstrap --StopParams=stop

Pero que pasos se deben dar? Aqui una lista:

1. Instala Apache Tomcat 6, e incluye la opción de Servicio cuando escojas los componentes, recuerda que es mejor instalar en una carpeta con nombre sin espacios y de una longitud corta.
2. Instala la segunda instancia de Apache Tomcat 6, en una carpeta diferente claro, pero con la misma opción de instalar el servicio, esta vez dará un error, da click en omitir, el error indica que no puede instalar dos veces el mismo servicio, lo cual claro no es cierto, recuerda cambia de puerto esta segunda instancia!
3. Ejecuta en la carperta bin de la segunda instancia de apache el comando de arriba, cambiando el parametro Install por el nombre de la carpeta correcta para tu instalacion, y si quieres el Dysplayname por algo que te ayude a identificar el servicio.
5. En la administracion de servicios de Windows, revisa tu servicio, buscalo por el nombre que pusiste en Displayname, dale Iniciar o Start, y listo!

Con estos pasos he podido ejecutar mas de una instancia de Apache Tomcat 6 como servicio en una maquina Windows....

Espero que les sirva!

Ejemplo de pruebas Unitarias

|

El siguiente código es un ejemplo de como se pueden crear pruebas unitarias con un framework de pruebas para reflejar casos de pruebas en un proyecto de desarrollo de software:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

[TestMethod]

public void PruebaObtenerOpcionesMenuParaUsuarioAdministrador()

{

//Se fijan los parametros requeridos para las pruebas

string strUsuario = "Administrador";

string strPassword = "Password";

string strNombreOpcion = "ReporteAspirantesIdoneos";

//Se fijan los resultados esperados

var ResultadoAutenticarEsperado = true;

//Se obtiene el resultado de la primera operación

var ResultadoautenticarObtenido =

eRecruit.Logic.clsNegocio.Autenticar(strUsuario, strPassword);

//Se comparan los resultados, de no coincidir se notifica con un mensaje

Assert.AreEqual(

ResultadoautenticarObtenido,

ResultadoAutenticarEsperado,

"Ha fallado la autenticacion del Usuario");

//Se fijan los resultados esperados en la segunda operación

var ResultadoEsperadoOpciones = true;

//Se obtiene la lista que contiene los datos para buscar la opción esperada

var ListadoOpciones = eRecruit.Logic.clsNegocio.ObtenerOpcionesMenu(strUsuario);

//Se busca si existe la opción esperada

var ResultadoObtenidoOpciones =

ListadoOpciones.Any(lst => lst.Nombre == strNombreOpcion);

//Se compara el resultado de la búsqueda con el resultado esperado

//si falla se notifica con un mensaje de error

Assert.AreEqual(

ResultadoObtenidoOpciones,

ResultadoEsperadoOpciones,

"El usuario no tiene acceso a la opción de generación del reporte");

}

[TestMethod]

public void PruebaGenerarReporteAspirantesIdoneos()

{

//Se fijan los parametros

string strDescripcionProceso = "SISTEMAS01";

//Se obtiene un resultado intermedio

var ProcesoSeleccion =

eRecruit.Logic.clsNegocio.ObtenerProcesoSeleccion(strDescripcionProceso);

//Se obtiene el listado de aspirantes aprobados para el proceso seleccionado

var ListadoAprobado =

eRecruit.Logic.clsNegocio.ObtenerAspirantesIdoneos(ProcesoSeleccion.IdProceso);

//Se compara si el proceso devolvio al menos un aspirante aprobado

//si no existen aprobados se notifica con un mensaje de error

Assert.AreNotEqual(

ListadoAprobado.Any,

true,

"No existen aspirantes aprobado para el proceso");

//Se genera el reporte, el metodo devuelve el path del reporte generado

var PathReporte =

eRecruit.Logic.clsNegocio.GenerarReporteAspirantesAceptados(ListadoAprobado);

//Se verifica que el Path no sea vacio

// de lo contrario se notifica un error

Assert.IsFalse(

String.IsNullOrEmpty(PathReporte),

"No se ha devuelto un path correcto");

}

[TestMethod]

public void PruebaPublicarResultadosPruebas()

{

//Se fijan los parametros

string strPathReporte = "~/reportes/plantillaaceptados.pdf";

string strTituloReporte = "Reporte de Aspirantes Aprobados";

//Se fija el resultado esperado

bool ResultadoPublicacionEsperado = true;

//Se obtiene el resultado del proceso

bool ResultadoPublicacionObtenido =

eRecruit.Logic.clsNegocio.PublicarReporte(strTituloReporte, strPathReporte);

//Se comparan los resultados esperados y obtenido

//si no coincide se notifica con un error

Assert.AreEqual(

ResultadoPublicacionObtenido,

ResultadoPublicacionEsperado,

"No se ha ejecutado la publicación del reporte");

}

[TestMethod]

public void PruebaGenerarNotificacionesResultadosAspirantes()

{

//Se fijan los parametros

string strDescripcionProceso = "SISTEMAS01";

//Se obtiene un resultado intermedio

var ProcesoSeleccion =

eRecruit.Logic.clsNegocio.ObtenerProcesoSeleccion(strDescripcionProceso);

//Se obtiene el listado de aspirantes aprobados para el proceso seleccionado

var ListadoAprobado =

eRecruit.Logic.clsNegocio.ObtenerAspirantesIdoneos(ProcesoSeleccion.IdProceso);

//Se compara si el proceso devolvio al menos un aspirante aprobado

//si no existen aprobados se notifica con un mensaje de error

Assert.AreNotEqual(

ListadoAprobado.Any,

true,

"No existen aspirantes aprobado para el proceso");

//Se establece el resultado esperado

bool ResultadoNotificacionEsperado = true;

//Se obtiene el resultado del proceso

bool ResultadoNotificacionObtenido =

eRecruit.Logic.clsNegocio.GenerarNotificacionesAspirantes(

ListadoAprobado,

eRecruit.Logic.Enumeraciones.Aceptado);

//Se comparan los resultados obtenidos con los esperados

//si no coinciden se notifica con un error

Assert.AreEqual(

ResultadoNotificacionObtenido,

ResultadoNotificacionEsperado,

"No se han generado las notificaciones correctamente");

}

[TestMethod]

public void PruebaPublicacionRevisionResultados()

{

//Paso 1 del caso de prueba

PruebaObtenerOpcionesMenuParaUsuarioAdministrador();

//Paso 2 del caso de prueba

PruebaGenerarReporteAspirantesIdoneos();

//Paso 3 del caso de prueba

PruebaPublicarResultadosPruebas();

//Paso 4 del caso de prueba

PruebaGenerarNotificacionesResultadosAspirantes();

}

Nota: El código aquí expuesto funciona con la herramienta de pruebas de Visual Studio Team Tester y se desarrollo en lenguaje C#, se pueden usar otros frameworks para pruebas como NUnit u otros disponibles según la conveniencia de cada equipo de desarrollo para desarrollar las pruebas, además las líneas al lado del código tienen el propósito de ser referencia.

Como se puede ver en el ejemplo, en las líneas 2, 37, 68 y 89 se encuentran los métodos que representan a las pruebas funcionales, cada uno usa la técnica de pruebas unitarias para verificar los resultados, cada uno de los métodos representa un paso del caso de pruebas, además en la línea 124 está el método que representa a todo el caso de prueba, que ejecuta en el mismo orden los métodos que representan a los pasos del caso de uso. En caso de fallar uno de los métodos se entiende que el caso de prueba ha fallado, y debe ser enviado de nuevo a revisión al equipo de desarrollo.

Artificial Intelligence Framework Tercer Alpha Release

|

Pues si, a casi un año de iniciado el proyecto he decidido ponerle a caminar un poco más, por eso le agregue un control de Usuario Windows Presentation Foundation que te permite ver a la neurona y no solo imaginarla, esto ayuda con que sea más fácil de entender que está pasando.

Además le actualice la librería para que use .NET Framework 3.5, así también podemos usar las nuevas características que nos ofrece el Framework.

Espero también para en un Cuarto Release no muy lejano agregar algoritmos de aprendizaje y que se pueda escoger entre que algoritmo de aprendizaje se aplicara sobre la red de Hopfield de ejemplo.

Quieren ver más? entonces por favor hagan click aqui.

Migrando un sitio ASP .NET que funciona en IIS a Apache con MONO

|

Algunos se preguntaran? Y a este señor que le paso! Por que anda haicendo esos experimentos! Bueno, la verdad es que el mercado de mi país lo exige, tenemos un decreto del gobierno que indica que se debe propender a usar todo lo que sea Open Source sobre el software propietario en el sector público, y claro si no quieres morir pues tienes que adaptarte, entonces nosotros queremos seguir aprovechando la facilidad de desarrollo de las herramientas MS, y claro poder trabajar con infraestructura Open Source, por eso evaluando algunas alternativas la más viable la ofrece el proyecto Mono que es auspiciado por Novell, en definitiva es una implementación .NET para Linux/MacOs/Windows, algunas empresas como Linden (Second Live) han adoptado ya esta solución.

Me ha gustado además que a diferencia de muchos otros proyectos Open Source, este tiene un Road Map! Es decir si tienen un camino que intentan seguir, además Novell ha comenzado a dar soporte comercial si usas SUSE Linux en su versión Enterprise, claro esto tiene que se pagado, pero ya es algo mucho más serio que espera a que algún día se corrija un error que no te deja hacer algo o peor aún, adentrarse en un código que no tienes idea de como se hizo para intentar arreglarlo con todas sus posibles consecuencias.

Bueno después de la publicidad gratis, vamos un poco más a lo técnico, tengo un proyecto ASP .NET 2.0 que fue migrado desde ASP .NET 1.1, funcionando bien, y claro como todos necesitamos que esas cosas funcionen ya, simplemente comencé a investigar un poco del funcionamiento del famoso proyecto Mono, y encontré que hay una imagen en VMware de SUSE Linux (puedes encontrarla aqui), ya configurada para que uses tus proyectos .NET, de hecho es bastante fácil de usar, en las instrucciones dice que solo copies tu proyecto a un folder especifico, y voila! Puedes intentar abrirlo desde tu browser, y asi es funciona! Un momento salió un error, pero bueno ya corrió lo que quiere decir que si funciona, una parte, pero funciona, y que decía el error? Error: Failed to create shadow copy (CopyFile).
Y claro al más puro estilo de los servidores de aplicación o web open source, te da un stack que la verdad no te ayuda mucho, y de paso no cargaba y no cargaba y no cargaba y después de un tiempo de paso Apache empezaba a reusarse a funcionar por completo, y buscando si a alguien le había pasado lo mismo, pues encontré que sí, pero no había una luz de que sucedía, hablaban de un parche que no encontraba donde estaba ni nada, ya eran algunos días en los cuales cada vez se veía menos probable que este proyecto vaya bien por el camino Open Source, hasta ayer en la noche…

Yo estaba sospechando que por el error lanzado hacia falta algún assembly, y de hecho si era esa la razón del error, pero no era mi assembly, si no uno que por defecto referencia Visual Studio en sus proyectos, y de paso Mono aun no lo implementa, para mi buena suerte di a la primera, en el web.config quite la referencia al assembly System.Data.DataSetExtensions, busquen en su web.config esta línea específicamente:

<add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>

Si no están usando nada de ese assembly quítenlo y listo! Ahora si están usando algo de ese assembly (basicamente LinQ a DataSets) y necesitan hacerlo funcionar, la única solución es reemplazar esos métodos por métodos propios, y esperar y/o contribuir a que el proyecto Mono implemente esa parte de .NET, si no les funciona lo que les estoy sugiriendo, van a tener que seguir quitando referencias, de una en una a ver cuál es la que está molestando.
Se que se al parecer lo han reconocido como un Bug, y lo están arreglando, pero eso será hasta la versión 2.4.2, a veces uno no puede esperar tanto asi es que encuentra este tipo de soluciones.

Para mayor referencia el thread que leí es este:

http://www.nabble.com/Error%3A-Failed-to-create-shadow-copy-%28CopyFile%29.-td24091798ef1367.html

Ahí sugieren que puede ser la referencia al Entity Framework de MS, si tienen esa referencia y no la usan, entonces quítenla y a probar!

Bueno si tienen este tipo de problemas comenten por favor, así podemos intentar resolver estos problemas y de paso ayudar a madurar el proyecto Mono, es a mi forma de ver una muy buena alternativa para no perder los skills .NET y darle una opción a los clientes!

Ojala les sirva!

Error al usar TFS API en Vista x64


Hace tiempo que no escribia algo interesante, bueno por cosas de la vida ando haciendo unas herramientas extra para TFS, la computadora en la que trabajo tiene Windows Vista Business x64, y claro trato de tener todo en x64, pero Visual Studio 2k5 y 2k8 aun no son del todo x64, ademas de los APIs de TFS que tampoco son x64, estan compilados para x86, si no me creen vayan a su GAC y compruebenlo por ustedes mismo...
El punto es que via pruebas unitarias todo funcionaba perfecto, incluso hice unas formas que las ejecute con Team Tester para probar, todo de maravilla, pero cuando el Host de esas formas cambio a ser un compilado externo comenzo a arrojar el siguiente error:

No se puede cargar el archivo o ensamblado 'Microsoft.TeamFoundation.Client, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' ni una de sus dependencias. El sistema no puede encontrar el archivo especificado.

La verdad me di algunas vueltas, encontre que cuando unstalas SP1 de VS 2008 al parecer a veces no lo hace bien, por lo que te sugieren reinstalarlo, y lo hice, pero no se resolvio el problema, segui dando vueltas y me encontre con este post:

http://weblogs.asp.net/omarv/archive/2008/10/10/using-the-tfs-api-in-your-64-bit-development-environment.aspx?CommentPosted=true#commentmessage

Aqui en resumen te dice que la configuracion de tu programa host debe ser x86, asi funciona como arte de magia!

Solo con cambiar eso encontro el assembly que no encontraba, y es logico que en pruebas unitarias funcione, VS esta compilado para x86 entonces como hace de host para las pruebas encuentra facil el assembly.

Bueno si tienen problemas dejenme saber para ayudarles!

Estimación de Hardware Requerido por SQL Server 2005

|

Esta tarea normalmente se hace un tanto difícil, siempre es mejor usar laboratorios de pruebas para poder especificar exactamente las características de hardware que una solución que construyes requiere, lo que puedes tener una idea fácil es de cuantas transacciones al dia vas a tener, y cuanto tu base de datos va a crecer, ok y con eso que hago? Cuantos recursos consume SQL Server 2005? Cuanta redundancia necesito? Y muchas otras preguntas normalmente asaltan nuestro trabajo…

Afortunadamente la gente de HP ha hecho nuestra vida mas fácil, ellos hicieron los laboratorios de pruebas y nos pueden decir rápidamente que necesitamos, y claro de paso que servidor de ellos se ajusta, como? Con las herramientas que se encuentran en este link:

http://h71019.www7.hp.com/ActiveAnswers/cache/70729-0-0-225-121.html?jumpid=reg_R1002_USEN

La herramienta HP ProLiant Transaction Processing Sizer for Microsoft SQL Server 2005 (x64)  es la que mas recomiendo, definitivamente la mejor arma para estimar con confianza que hardware recomendar, además muy fácil de usar por que funciona en base a un cuestionario que respondes y de paso tiene un actualizador que te mantiene al día los parámetros requeridos por SQL Server 2005.

Espero que les ayude tanto como a mí!

WCF y Balanceadores de Carga F5 Big IP

|

Como ultimamente sucede ando haciendo servicios Web, y me encanta WCF para hacerlo por muchas razones, en especial la rapidez con la que uno puede hacer cosas complejas, y como era de esperarse en una de las implementaciones que hice por el crecimiento que tienen, cambiaron sus balanceadores de carga de software por "cajas" F5 Big IP estas definitivamente son muy buenas para distribuir la carga y bajar el procesamiento de los servidores, por que entre otras cosas mas que balancear carga, se pueden encargar del procesamiento SSL, y por su puesto esto es un alivio para los servidores! Pero no para los servicios WCF que usan credenciales en el mensaje...
Resulta que como el F5 se encarga del procesamiento SSL, cuando el trafico es pasado al servidor de turno este pasa plano, claro para apliaciones web es facil configurar para que se reciba el trafico plano, de hecho en ciertos casos no hay que hacer nada, pero si usas un servicio WCF con credenciales en el mensaje, por restricciones de seguridad TIENES QUE USAR SEGURIDAD EN EL TRANSPORTE, esto significa encriptar la comunicación con SSL, no hay otra forma, o incurrir en otras practicas no recomendadas como pasar las credenciales como parametros de los mensajes (no hagan esto nunca!) y demas...

Uno puede notar el problema cuando claro ya configurado el F5 y apuntas a tu servicio con Seguiridad en el Transporte y Credenciales en el Mensaje, el trafico pasa y en el servidor donde se ejecuta el servicio te dicen que no pueden validar los mensajes que llegan, y de vuelta tambien tienes el mismo resultado, Faults diciendo que la seguridad no puede ser verificada, ok si tienes estos mensajes tienes el problema...

Hay 2 soluciones, la primera implementar un canal Http que permite que se pasen las credenciales en el mensaje sin seguridad en el transporte, eso puedes encontrar como hacerlo aca: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/87a254c8-e9d1-4d4c-8f62-54eae497423f/, pero la verdad no les recomiendo esto, revise un poco profundamente y hay ciertos casos en que no funciona completamente, y ademas es un poco complicado, ademas una advertencia es que si haces esto los mensajes pasan planos por la red y pueden ser vistos facilmente con un sniffer bien ubicado en la red...

La otra opcion antes no era posible, pero ahora si, antes los F5 no podian pasar el trafico SSL al servidor, solo podian pasarlo plano, gracias al soporte de F5 se nos indico que hoy ya se puede hacerlo, les sugiero que para los pasos exactos contacten al soporte de F5, los pasos basicos y no detallados en resumen son estos:

1.- Crear un virtual server en el puerto 443 y a el asociar un Profile SSL Server
2.- Crear un pool en el puerto 443 y poner como member server el servidor
3.- Dividir el certificado a usar en 2, 1 es el certificado y otro es la clave, subirlo al F5 a las ubicaciones correspondientes para cada tipo
4.- Crear un SSL Proxy, usando el certificado y la clave que se subio anteriormente
5.- Configurar a que apunte a los servidores correctos

Estos son pasos con mucha falta de detalle, yo insisto en que consulten a su soporte F5 para los pasos detallados, la consulta es como hacer un Servidor SSL de Cliente, para que el servidor reciba el trafico SSL.

Espero les sirva!

Una caracteristica interesante de IE 8

|

Desde hace un tiempo estoy probando Internet Explorer 8, y definitivamente me agrada mucho, tiene muchas cosas que de verdad te ayudan con el dia a dia de la navegacion, ejemplo a quien no le ha pasado que se le cerro un tab que no queria cerrar? A mi me pasa y bastante! Pues con Internet Explorer 8 puedes recuperar ese tab perdido en accion! Como? Simple en cuanto se haya cerrado abre otro nuevo tab, En la parte superior izquierda te aparecera Reopen closed tabs, “Reabrir tabs cerrados” en español ahi justo abajo del titulo encontraras el tab que acabas de cerrar, o si quieres ver otros tabs que cerraste podras abrir tu historial de navegacion para encontrarlo!!

En lo personal me ayuda mucho, claro no es un punto de que definitivamente haga que cambies de browser, pero si otras cosas como que definitivamente es mas rapido, los WebSlices, los aceleradores y cosas como el In-Private browsing, bueno aun estan en Beta 2, hay que esperar un poco mas de trabajo de la gente de MS, esperemos un browser de verdad competitivo es este nuevo año!!