Archive for March, 2009
Navegadores multiprocesos
Osea, que si una pestañatiene problemas no todo el navegador se cierra….
Con la reciente salida de Internet Explorer 8 hemos asistido al nacimiento del segundo gran navegador multiproceso después de Chrome. ¿Qué significa esto? ¿Este tipo de navegadores son el futuro? ¿Qué ventajas e inconvenientes tienen respecto a los navegadores con un único proceso? Y lo más importante: ¿nos beneficia o nos perjudica a los usuarios este cambio de paradigma? Estas preguntas y algunas más las intentaré contestar en esta entrada.
¿Qué son los navegadores multiproceso?
Normalmente, cada aplicación ejecuta un único proceso, desde el cuál controlará todas las acciones que tenga que realizar. Si necesita hacer varias cosas a la vez, creará varios hilos, que no son más que subprocesos ligeros que comparten casi todos los datos o casi todas las instrucciones. De esta manera los recursos se utilizan de manera más eficiente, sobre todo la memoria, ya que al compartirla se evita tener que guardar varias veces lo mismo.
Comenzando una analogía que no sé si me va a gustar, un navegador monoproceso sería una empresa convencional, y los hilos serían sus trabajadores, que efectivamente pueden trabajar en paralelo y tienen aproximadamente la misma información, la que les provee la empresa. Este modelo es el que tradicionalmente han seguido las empresas pequeñas, y no les ha ido mal.
En contraposición, los navegadores multiproceso, como su propio nombre indica, crean varios procesos para realizar esas mismas tareas. En este caso suelen crear un proceso por cada página o pestaña que abramos (luego lo matizaré). En principio esto no tendría demasiado sentido, ya que un montón de memoria se repetirá, como por ejemplo las instrucciones que procesan el HTML o el motor de Javascript. Sin embargo, se obtienen mejores resultados al tratarse de un programa que tiene que estar preparado para ejecutarse durante horas o días seguidos.
Siguiendo y terminando con la analogía anterior, un navegador multiproceso es una gran empresa que trabaja en diferentes regiones. Aunque se dedica a hacer lo mismo en una región que en otra, una rama ciertamente no necesita saber nada sobre los clientes de otra rama. De esta manera necesitamos dirigentes o ingenieros “repetidos” para llevar cada una de las ramas, coste que nos ahorraríamos si solo tuviéramos una gran fábrica. A pesar de todo este modelo funciona bastante bien, y entre otros aspectos resalta uno interesante: si una rama tiene problemas no afecta a las demás.
¿Qué ventajas/desventajas tienen?
Lo más obvio es que se necesitan más recursos para ejecutar lo mismo que en navegadores monoproceso, ya que como he comentado antes muchos datos se guardan varias veces en memoria. Esto es algo malo de por sí, pero no creo que sea algo excesivamente notable con la cantidad de memoria que tenemos hoy en día.
De hecho, tras un tiempo usando el navegador abriendo y cerrando pestañas, el uso de memoria será incluso más eficiente que un navegador convencional. Esto es debido a que, cuando cerramos una pestaña, automáticamente se destruirá el proceso y los huecos que se liberan se administrarán desde rutinas específicas de nuestro Sistema Operativo. En un navegador monoproceso será el propio navegador el que tenga que ver qué hace con esa memoria, y no el SO. Por muy bueno que sea un navegador, el SO siempre será más eficiente, simplemente porque dispone de más herramientas. Esta es una de la razones por la que por ejemplo Firefox al cabo de un tiempo use más memoria que al principio aunque cerremos todas las pestañas, lo que lo hace bastante degradable.
Dejando de lado la eficiencia, la mayor ventaja de estos navegadores es la seguridad que ofrecen. Al aislar cada web en su propio proceso, es casi imposible que pueda afectar a las demás webs que están visualizando. En realidad incluso están aisladas respecto al navegador. Esto supone una funcionalidad interesantísima: si una de estas webs causa un fallo crítico que obliga a cerrarla, el navegador y las demás pestañas seguirán intactos. Es decir, si una web se cuelga, el navegador puede seguir adelante. Tradicionalmente, si una de las pestañas causa un fallo, todo el navegador se cierra inesperadamente.
Pero evitar que el navegador se rompa solo es un pequeño avance comparado con la seguridad que esta arquitectura puede ofrecer. Que dos webs estén completamente aisladas respecto a sí mismas y respecto al SO significa que es mucho más difícil infectarse con software malicioso. Y no solo en teoría, también se está probando en la práctica: Chrome ha sido el único navegador sobre el que no se ha encontrado ningún exploit en PWN2OWN, un concurso con expertos en seguridad celebrado esta semana. De acuerdo, IE8 ha sucumbido, pero eso es otro tema.
¿Cuántos procesos se crean?
Aunque las arquitecturas de Chrome e IE8 tienen algunas diferencias, las dos crean un proceso inicial que será el que se ocupe de la interfaz (las ventanas, las barras, etc), de todas las comunicaciones con el sistema (entrada/salida de ficheros, de internet, etc) y con el usuario (teclado, ratón, pantalla). Este es el proceso padre, y si se cierra se cerrarán todos los demás.
A partir de entonces se crean procesos adicionales por una o más webs que abramos. Cada proceso contendrá los motores de renderizado de HTML, CSS, Javascript, imágenes, etc necesarios para leer una página web. Esta es la información que se repetirá tantas veces como procesos tengamos abiertos. Estos procesos están aislados del resto del sistema, y solo se comunican con el proceso padre: si quieren acceso a disco lo tienen que hacer a través del padre, si quieren acceso a la red o a la pantalla también.
Aquí está la diferencia entre IE8 y Chrome, ya que los dos crean procesos de manera distinta. IE8 calculará cuántos procesos debe abrir dependiendo del número de sitios web que abras: si tienes cinco sitios abre 3 procesos, si tienes 15 abre 6, los que sean. Cada proceso se ocupará de varios sitios webs por defecto, y si uno de esos sitios web causa un fallo, los demás sitios que maneje ese proceso se cerrarán también. En cierto modo es como si balanceara la carga de varios sitios web entre varios procesos, tal y como se hace en un servidor web. Una manera rápida de ver los sitios que comparten un mismo proceso es ver qué pestañas comparten el mismo color (aunque si tienen distinto color también pueden compartir proceso).
Chrome sigue una arquitectura que me parece que tiene algo más sentido. En principio crea un proceso por cada sitio web que abras. Si abres otra pestaña con el mismo sitio web (por ejemplo, dos artículos de Genbeta) será lo suficientemente inteligente para reutilizar ese proceso. Este algoritmo seguirá repitiéndose hasta llegar a un tope que actualmente se acerca a los 20 procesos, a partir de este punto varias webs compartirán procesos de manera similar a IE8.
Otro punto fundamental de Chrome es que también aísla en su propio proceso a los plugins, cosa que IE8 no parece hacer. Estos componentes externos a los navegadores son probablemente la parte más inestable y la parte menos segura, así que es una buena idea aislarla también.
¿Es este el futuro?
Sí. Los navegadores tradicionales tienen sentido en la web tradicional, con sitios simples y recursos muy limitados. Hoy en día tenemos varios factores que nos llevan a preferir una arquitectura multiproceso: las aplicaciones web son tan complejas como las de escritorio (piensa en Gmail, Google Docs, etc), los navegadores se utilizan durante mucho tiempo, gracias a las pestañas cada vez abrimos más webs a la vez y la cantidad de memoria RAM es bastante grande. Y ni siquiera he hablado de los procesadores multinúcleo: un navegador multiproceso puede aprovecharlos más que los actuales multihilo, y si cada vez tenemos más núcleos habrá que explotarlos más.
Por estos motivos creo, espero y quiero que Firefox, Opera y Safari implementen esta arquitectura cuanto antes. Cualquiera que haya probado Chrome (en menor medida IE8) habrá comprobado que la experiencia de usuario es mucho mejor a lo que estamos acostumbrados, y que la estabilidad general del navegador es muy alta aunque visitemos sitios pesados. En general, todo se reduce a que los navegadores multiproceso no se degradan con la misma facilidad que los tradicionales.
AsgReport, ya se hace algo con el…
Saludos, como les habia dicho en el post anterior de AsgReport, Aqui esta la primera version visible de este programa. Como les habia dicho he utilizado en ocaciones la clase Fpdf para generar pDFs ,pero para ser sincero de verdad hay que estar de animos para hace algo con ella. Asi que he decidido en mi tiempo libre realizar un gui para hacer PDFs con esta clase. Claro que ahora estoy un poco lejos de lo que quiero (Manejo de datos, saltos automaticos, etc), pero ya esta la plataforma hecha, ahora es solo añadir opciones. Puedes ver un beta del recien nacido en http://adamix.net/asgReport/. En lo proximo publico un roadmap y la lista de feactures que tendra el producto final.
Por ahora solo tiene dos controles rudimentarios que son el label y la imagen, y el resize hay que hacerlo por la ventana de propiedades, pero genera pdf mas facil que con fpdf. En lo pronto le pongo campos dinamicos para que genere una clase que se pueda usar en algun proyecto. No doy opcion a descargar la clase ya que hasta ahora es un PDF sin muchas opciones, pero le gano a cualquiera que venga a hacer los mismo con fpdf pelado a codigo limpio. Al añadir una imagen por defecto se coloca el src a una imagen local, pero puedes poner cualquier imagen si sabes la ruta de internet. Nada, pruebalo y me cuentan que tal lo ven. http://adamix.net/asgReport/
Recursividad basica en c#
El concepto de recursividad es uno de los más complejos y díficiles de entender en la programación orientada a objetos. Lo trataré de explicar con algunas ideas y algún ejemplo.
En la vida hay muchos conceptos que se utilizan a si mismos para explicarse. Una rama de un árbol a su vez tiene ramas, que a su vez puede tener ramas y así sucesivamente hasta que aparecen ramas que solo tienen hojas.
Al igual que en este ejemplo, muchos algoritmos se explican en términos de sí mismos. Los algoritmos que poseen esta particularidad se denominan recursivos.
Al igual que la mayoría de los lenguajes de programación, C# permite definir métodos recursivos. O sea, métodos que se llaman directa o indirectamente a si mismos. Y ahora la gran pregunta que se hacen todos….
Cuando y como termina entonces el método recursivo?
Ya se que puede parecer un proceso infinito, pero la clave está en que en cada llamada el problema se “simplifica” de tal modo que llegará el momento en que no hará falta llamar nuevamente al método recursivo. Recuerda que la rama tiene ramas, que a su vez tiene ramas… pero llega el momento en que se llega a una rama que solo tiene hojas.
Cabe resaltar que la recursividad es una herramienta muy importante en la programación que en muchos casos permite expresar algoritmos de forma simple y legible. Veremos ahora un caso muy simple en que la recursividad hace nuestro trabajo mucho más fácil.
Factorial de un número
Los mátemáticos suelen decir que n! = n * (n – 1)! Sin embargo, en programación, dicho de esta manera la solución sería infinita, ya que siempre podemos restar 1 hasta el infinito negativo. Por tanto debemos definir el factorial de un número para los números mayores o iguales que cero. Por tanto, la función factorial es muy fácil de expresar en C# mediante la recursividad. Este sería el código:
static long Factorial (long n)
{
if (n>=0)
{
// caso base
if (n == 0)
{ return 1; }
else
{return n * Factorial (n - 1); }
}
else
{
throw new Exception(“Factorial de un negativo”);
}
}
Otra solución al cálculo de un factorial se puede expresar de manera muy simple utilizando un ciclo for.
//Factorial iterativo
static long Factorial (long n)
{
if(n<0)
throw new Exception(“Factorial de un número negativo”);
else if(n==0) return 1;
else
{
long result= 1;
//Seria multiplicar n * n-1 hasta que n = 0
for (int k = n; i >= 1; i –)
result = result * k;
return result;
}
}
Este ejemplo nos ilustra las principales reglas y pasos que debe seguir un método recursivo.
Ahora las 4 reglas de oro de la recursividad
1 – Caso base. Siempre tiene que haber al menos un caso base en que no se necesite la recursividad para resolver un problema.
2 – Toda llamada recursiva debe regresar hacia el caso base.
3 – Credibilidad. Asuma siempre que la llamada recursiva funcionará correctamente. Esto se fundamenta en la hipótesis de inducción, lo que quiere decir que no debemos preocuparnos por hacer el trozo de todos los largos caminos de llamadas recursivas, una labor que a veces ni uno mismo entiende.
4 – Nunca duplique el trabajo. No resuelva con una llamada recursiva por separado lo que ya ha sido resuelto en otra llamada.
Ahora ya tienes una idea de lo que significa que un método sea recursivo y como resolver algunos ejemplos sencillos con esta potente herramienta. Puedes practicar con algunos ejercicios sencillos como la sucesión de fibonacci, la suma de n números pares y otros ejemplos que se les ocurra. Trata de darle solución recursiva a problemas sencillos que hayas resuelto antes de modo iterativo.
Recuerda que en la programación, no se trata de leer muchos tutoriales y cursos, se trata de leer y escribir código.
En la segunda parte de este pequeño tutorial les comentaré sobre algunas técnicas y estrategias del ámbito recursivo como son “Divide y Vencerás” y “Backtracking” (Vuelta atrás) para resolver problemas un poco más complejos en los que la solución no se ve tan simple, así como algunos otros ejemplos y ejercicios resueltos.
Si tienen alguna duda o pregunta dejen un comentario.
Conoces el Pencil de Firefox…
A muchos de nostrostros que estamos en el mundo de la informatica y a lo que no estan tambien, nos surge muchas veces la necesidad de describir una interfaz, ya sea para un programa que estamos desarrollando una idea en mente ETC. Anteriormente cuando me solicitaban el diseño de una apliacion en la universidad, realizaba la pantallas en Visual Basic 6, lo cual tenia que estar haciendo print screen en cada pantalla para guardarla con imagenes. En repuesta a esto existe una extension de firefox… si del navegador web, que nos permite diseñar interfaces tipo win32 y guardarla directamente a imagen o en su formato para luego hacer alguna modificacion. No que instalar nada adicional solo activar este plugin en firefox y lo veras en herramientas. Algunas caracteristicas son:
- Multi Documento, puedes trabajar varias pantallas a la vez.
- Sorta deshacer, algo muy util si cometemos un errorcito.
- Funciones basicas con los controles, z-index, rotacion, alineacion….
- Multi plataforma.
- Puedes añadir objetos externos.
- y mucho mas.