miércoles, 30 de noviembre de 2011

Menús "diferentes" en CSS, Flash y JavaScript

Interesante colección de menús de navegación originales para inspirar la creación de nuestros propios proyectos.


30/11/2011 - Los menús de navegación son una parte relevante de cualquier página web ya que no solo forman parte del diseño de nuestra web sino que dirigen a nuestros usuarios hacia nuevos contenidos e informaciones dentro de nuestro site. Es por ello que la correcta selección de un menú influye de forma positiva en la interacción con el sitio web y por tanto en un posible incremento del números de acceso a aquello que ofrecemos.

De la mano de la plataforma web especializada en diseño 1stwebdesigner presentamos esta selección de Menús de navegación "diferentes" con los que servir de inspiración en nuestros proyectos web. En total se han reunido 61 variados menús basados en CSS, en JavaScript y diseños en Flash.

Cada uno de los recursos ofrecidos dispone de un enlace hasta su web donde podemos ver con todo detalle el menú de navegación en cuestión.

Interesados pueden acceder a Menús "diferentes" en CSS, Flash y JavaScript desde
http://www.1stwebdesigner.com/

Juegos en HTML5

HTML5 es extraordinario porque es versátil, no está orientado a un caso de uso específico. Lo más importante es que HTML5 es de uso universal. Está en el PC, en el teléfono, en las tabletas… y por lo que yo sé, un día podríamos tenerlo incluso en los electrodomésticos.
Juntando estas dos propiedades de HTML5 –su versatilidad y su universalidad- podemos ver claramente por qué muchos desarrolladores se sienten inspirados por esta tecnología. Y como dice el proverbio, "cuando los desarrolladores se sienten inspirados, normalmente se ponen a programa juegos" (bueno, sí, puede que lo haya cambiado un poco)

Por suerte, los artículos de HTML de la serie "deep-dive" sobre desarrollo de juegos para esta plataforma ahora ya están ampliamente disponibles. Pero en lugar de esto, prefiero ofrecer aquí una breve introducción a aquellas cosas que debemos tener en cuenta antes de ponernos a programa juegos con HTML5 y mientras estamos trabajando con ellos.

¿Qué puedes aprender en este artículo? Voy a hablar de los entornos de desarrollo de juegos para HTML5, cómo podemos llegar a mucha más gente dando soporte a smartphones y tabletas, cómo podemos avanzar en el control del estado del juego, cómo resolver los problemas de rendimiento y cómo sacar el máximo provecho a esta plataforma de juegos que es tu navegador.

Así que sin más preámbulo, aquí van las 5 buenas prácticas imprescindibles para hacer juegos con HTML5, ¡en acción! (esto de "en acción" es para añadirle algo más de dramatismo).

Buena práctica 1: utilizar un entorno
Escribir juegos sencillitos en HTML5 es fácil, pero si queremos avanzar un poco, tenemos que hacer ciertas cosas que nos aseguren que el juego funcionará correctamente.
Por ejemplo, cuando utilizamos muchas imágenes, efectos de sonido y otros recursos, el navegador puede estar un buen rato descargándolos desde el servidor web. Si no tienes en cuenta esto, te puedes llevar una sorpresa a la hora de programar el juego, porque los archivos de imagen y sonido se cargan de forma asíncrona, el código Javascript empieza a ejecutarse antes de que se hayan descargado todos los recursos. Esto suele dar como resultado un efecto "popping", (las imágenes aparecen como recuadros vacíos) y los efectos de sonido no funcionan como debieran. Una buena forma de resolver este efecto consiste en crear una rutina de precarga que retrase la ejecución del script hasta que todos los archivos ya estén descargados.

Otro problema que seguramente vas a tener es que en cada máquina, o incluso en cada navegador, el mismo juego funciona a una velocidad distinta. Aunque es cierto que aquí apenas podemos hacer nada, sin embargo podemos asegurarnos de que las animaciones y las velocidades de movimiento son independientes de la tasa de frames por segundo a la cual se ejecuta el propio juego.

Sin duda, existe UN MONTÓN de código de base que tenemos que meter dentro del juego para que funcione bien. Pero no te preocupes: no vas a tener que escribirlo tú mismo. Hay toda una familia de entornos que te permiten centrarte en la lógica del negocio sin tener que ocuparte de todas estas pequeñas (o grandes) cosas que se necesitan para que el juego funcione de manera fluida.

El único inconveniente que tiene utilizar un entorno es que hay muchos donde elegir. Algunos marcos de trabajo como ImpactJS por ejemplo, están pensados para ayudar a resolver prácticamente todos los aspectos del proceso de desarrollo de los juegos, mientras que otros como EaselJS se orientan sobre todo a la parte gráfica del desarrollo. Al final, es tu decisión el optar por aquel entorno con el que te sientas más cómodo. Puede que esto parezca una cosa sin importancia, pero en el mundo de Javascript, la elección de un entorno suele implicar a su vez tener que adaptarse a un estilo concreto de programación.

ig.module(
'monster'
)
.requires(
'impact.game',
)
.defines(function(){

Monster = ig.Entity.extend({
eyes: 42
});
});

Un buen ejemplo de esto que digo es ImpactJS, que no solo nos proporciona abstracciones para mostrar gráficos o reproducir efectos de sonido, sino que incorpora su propio modelo de objeto y herencia, tal y como se ve en el código anterior.



Ascended Arcade ha publicado tres juegos en tres meses utilizando el entorno ImpactJS.


Aunque actualmente hay muchos juegos en HTML5 que se basan en alguno de los marcos de trabajo, muchos desarrolladores siguen dándole vueltas a la posibilidad de hacerlo todo ellos mismos. Si bien puede considerarse como una excelente ocasión para aprender, si quieres terminar tus programas en un plazo razonable, sin duda la mejor manera de hacerlo es utilizando un entorno. Como ejemplo valga este excelente trabajo de Ascended Arcade que ha conseguido publicar tres excelentes (y reconocidos) juegos en solo tres meses, con la ayuda del marco ImpactJS.
Buena práctica 2: ten en cuenta los dispositivos de pantalla pequeña y táctiles
Posiblemente uno de los argumentos de venta más potentes de HTML5 es que funciona en PCs de sobremesa, portátiles, tabletas e incluso smartphones (si aún no has visto IE9 funcionando en un Windows Phone 7 Mango, echa un vistazo a este vídeo).
Esta capacidad multiplataforma (¡que piensen ya en esta palabra en el diccionario de la RAE, por favor!) tan exclusiva es intrínseca a HTML5 y por lo general requiere muy poco trabajo de adaptación por parte del desarrollador. No obstante, hay un par de cosas que tenemos que tener presentes…

Ante todo y sobre todo: los tamaños de pantalla varían enormemente entre los distintos tipos de dispositivos, igual que las resoluciones y los formatos de presentación. Si queremos que nuestros juegos en HTML5 funcionen bien también en dispositivos móviles, tenemos que asegurarnos de que soportan múltiples resoluciones o que no superan el tamaño de ventana de las pantallas WVGA (800x480 pixels).

Aparte, puesto que la mayoría de los dispositivos móviles tienen una pantalla demasiado pequeña para poder ver toda la página web a la vez, muchas veces ofrecen sistemas muy sofisticados de zoom y movimiento de la pantalla que pueden ser contraproducentes cuando se ejecutan juegos. Se pueden desactivar estas funciones por programa utilizando la etiqueta de metadatos "viewport". El siguiente bloque de código hace que el viewport de tus juegos ocupe toda la superficie horizontal disponible en pantalla. Configurando el parámetro "user-scaleable" con el valor "no", le decimos al navegador del móvil que desactive la opción de zoom, que suele dar muchos problemas con los controles de juego basados en el movimiento de los dedos por la pantalla.

meta name="Viewport" content="width=device-width; user-scaleable=no; initial-scale=1.0">

Cuando hayamos comprobado que el juego se visualiza bien en dispositivos de pantalla pequeña, pensemos un poco en la introducción de datos. La mayoría de los dispositivos de tipo táctil disponen de un teclado virtual, pero tienden a ocupar una superficie bastante grande de la pantalla, lo que hace que sea una alternativa poco útil a la hora de controlar los personajes y figuras de los juegos. Si una entrada basada estrictamente en la interfaz táctil es algo irrenunciable para tu juego, tendrás que desarrollar un teclado virtual reducido que contenga únicamente los botones necesarios para tu juego (por ejemplo las flechas de dirección). Sin embargo, lo mejor es ser algo más creativo y preparar otras alternativas para controlar el juego que no requieran añadir más elementos en pantalla. Un buen ejemplo de esto es el juego Spy Chase, donde se conduce un coche con un dedo (algo que no deberíamos intentar en la vida real).

Buena práctica 3: guardar automáticamente el avance del jugador
Con funcionalidades como el anclado de sitios web a la barra de tareas, los navegadores intentan dar a las aplicaciones web el mismo estatus que tienen ya las aplicaciones normales de escritorio. De todas formas, la idea de sitios web funcionando como aplicaciones es relativamente novedosa, como también lo es la noción de páginas web que guardan el estado del lado del cliente. Te lo piensas dos veces antes de cerrar una instancia de Microsoft Word, pero seguramente no tienes tantas precauciones cuando abres una página web. La mayoría de las veces esto no es un problema, ya que casi todas las páginas web o bien no tienen en cuenta el estado, o mantienen la información de registro en el servidor.

Los juegos para navegador web, no obstante, son un caso ligeramente distinto. Puesto que el código JavaScript se ejecuta en el lado del cliente, los juegos para HTML5 normalmente mantienen la información de estado dentro de una memoria temporal (o sea, la RAM). Cierras la ventana del navegador y esa puntuación que tanto sudor te ha costado ganarte se pierde para siempre.

Ahora podrás discutirme que una persona sensata tendrá cuidado de no cerrar el juego en el que ha estado jugando durante ocho horas, pero… los accidentes también ocurren, sobre todo cuando tienes en pantalla varias pestañas o cuando las baterías se vuelven locas.

En resumen: a la hora de programar juegos para HTML5, una buena práctica indispensable consiste en ir guardando el nivel de progreso del jugador cada cierto tiempo y dejar que los jugadores puedan recuperar el juego en el mismo lugar cuando vuelvan a abrir la página web que han cerrado anteriormente.

Ahora bien ¿dónde tenemos que guardar el estado del juego? En el pasado, el lugar obvio era una base de datos en el lado del servidor, o bien una cookie en el lado del cliente. Ninguna de estas opciones es demasiado atractiva. Si seguimos la alternativa del lado del servidor, deben ejecutarse peticiones HTTP siempre que se necesite guardar o recuperar la información almacenada. La estrategia de la cookie nos limita mucho el espacio de trabajo y la longevidad de la propia cookie depende en gran medida de la configuración del navegador.

Una solución mucho más práctica consiste en utilizar el almacenamiento DOM de HTML5. El almacenamiento DOM nos permite guardar varios megas de datos por sitio web mediante una interfaz que se asemeja mucho a las utilizadas para guardar pares de clave-valor (o al objeto expand de Javascript). Es muy cómoda, pero en el contexto de los juegos para HTML5, seguramente nos vendría muy bien poder guardar estructuras de datos complejas, algo que no soporta el almacenamiento DOM de forma nativa.

Por suerte en este caso, las actuales implementaciones de Javascript disponen de mecanismos integrados que nos permiten serializar objetos dentro de una notación compacta conocida JSON. Con esta técnica, el almacenamiento de DOM se puede utilizar también para guardar cualquier información que queramos. Las dos siguientes funciones muestran cómo se puede guardar el estado de un juego y recuperarlo después utilizando el almacenamiento de DOM y las funciones JSON integradas dentro de ECMAScript5:

function saveState(state) {
window.localStorage.setItem("gameState", JSON.stringify(state));
}

function restoreState() {
var state = window.localStorage.getItem("gameState");
if (state) {
return JSON.parse(state);
} else {
return null;
}
}

Buena práctica 4: Utiliza un perfilador
Uno de los retos más difíciles a la hora de desarrollar un juego es el poder mantener tasas de frames por segundo elevadas a medida que vamos añadiéndole más elementos y funciones.
La buena noticia es que los navegadores en general ahora son bastante más rápidos que hace un par de años, y los juegos preparados para HTML5 que operan a una tasa constante de 60 fps son ya una realidad.

No ha sido fácil. EN el caso de Internet Explorer 9, esto supone haber tenido que reescribir todo un nuevo motor de Javascript capaz de utilizar varios cores de la CPU y un pipeline de presentación totalmente acelerado por hardware basado en Direct2D. Dicho en otras palabras: si te has gastado un buen dinerito en tu equipo para jugar con él, Internet Explorer dará buena cuenta de ello.



El perfilador de Javascript integrado en Internet Explorer 9 nos ayuda a detector cuellos de botella en el rendimiento de un juego.
En el caso de los juegos más sencillos, esto supone que ya no tendremos que ocuparnos del tema del rendimiento. Pero dado que HTML5 es independiente de la plataforma, en teoría podemos desarrollar para toda una gama de dispositivos y navegadores muy variados, que puede que no sean tan rápidos como nos gustaría. Aunque estemos pensando en correr nuestro juego únicamente en PCs de gama alta (algo que habíamos quedado que no íbamos a hacer, ¿te acuerdas?), el rendimiento puede seguir siendo un aspecto problemático.

Si quieres que tu juego funcione a 60 frames por segundo, no dispones más que de 16 milisegundos para restituir cualquier frame individual. En el tiempo que tardamos en abrir y cerrar los ojos, tenemos que dibujar en pantalla un mínimo de 6 frames completos. Realmente parece una tarea agotadora… y para cualquier juego medianamente complicado, esto es así.

Pero por suerte tenemos herramientas que nos pueden ayudar. En Internet Explorer 9 (o 10 si es el caso), pulsando la tecla F12 se nos abren las herramientas de desarrollo. Selecciona la pestaña "Profiler" y pulsa luego "Start profiling" para empezar con el perfilado.

Ahora, muévete hasta el punto donde crees que se puede mejorar el rendimiento, déjale al perfilador un margen de unos 30 segundos para que obtenga sus datos, y luego pulsa en "Stop profiling." Te mostrará un resumen del tiempo de ejecución acumulada que han consumido cada una de las funciones del juego. La mayoría de las veces verás que hay unas cuantas funciones que se llevan la mayor parte del tiempo de ejecución general. Al optimizar esas funciones seguramente tendremos los mejores resultados y, cuando analices el código, aparecerán casi de inmediato las subrutinas que ralentizan la ejecución.

Pero no te fíes de tu instinto demasiado a ciegas: el código que parece lento puede que se ejecute mucho más rápidamente en los motores de Javascript actuales. La mejor estrategia para la optimización consiste en ejecutar el perfilador a menudo y medir en todos los casos el resultado de los cambios que hacemos, para detectar si esos cambios provocan el impacto positivo en el rendimiento que esperamos.




Juegos para redes sociales: Warimals se basa en HTML5 y nos permite jugar con nuestros amigos en Facebook.
Buena práctica 5: ¡se original!
Poder programar juegos que funcionen de manera nativa en tu ordenador es una pasada, pero aún lo es más el que HTML5 nos permite programar juegos que FUNCIONAN EN TU NAVEGADOR. HTML5 es interesante no solo desde el punto de vista tecnológico, sino que además el navegador web es una plataforma ideal para los juegos.
Piénsalo… los navegadores están en muchos dispositivos diferentes, están conectados (prácticamente) siempre y son el medio que utiliza todo el mundo para conectarse con los demás con el correo, el chat y las redes sociales. Como desarrollador de juegos para la web, puedes crear juegos divertidos y que hagan posible que jueguen juntos personas de todo el mundo.

Si eres nuevo en esto de desarrollar juegos para HTML5, seguramente te tentará la idea de escribir réplicas de juegos que ya disfrutas sin conexión. No hay nada de malo en esto. Pero si quieres que tu juego se pueda utilizar dentro de una "aplicación de comunicación", lo mejor es que te pongas a imaginar ideas nuevas y realmente originales para tus juegos. Un ejemplo interesante de esto es el juego Warimals, uno de los primeros juegos para Facebook preparado para HTML5. En Warimals podemos jugar a ser perros o gatos, y podemos invitar a nuestros amigos de Facebook a jugar con nosotros ¿a que mola?

En resumen…
Gracias al excelente trabajo de los creadores de entornos de trabajo y los pioneros en Javascript, HTML5 se ha convertido ya en una plataforma Madura para la programación de juegos. Es una gran noticia, porque la web es el entorno de ejecución más universal para aplicaciones de todo tipo. Con las herramientas adecuadas (muchas de las cuales ya vienen cómodamente integradas en Internet Explorer 9 y 10 o se pueden descargar de forma gratuita) y el marco de trabajo adecuado, la experiencia de desarrollo de juegos para HTML5 puede ser todo un placer y muy estimulante, sobre todo para crear experiencias conectadas y con ideas interesantes y originales.


Fuente de informacion: http://www.desarrolloweb.com/articulos/juegos-html5.html


Generics en C#

Los generics son el mecanismo de implementación de clases parametrizadas introducido en la versión 2.0 del lenguaje C#. Una clase parametrizada es exactamente igual a una clase de las habituales, salvo por un pequeño detalle: su definición contiene algún elemento que depende de un parámetro que debe ser especificado en el momento de la declaración de un objeto de dicha clase.

Esto puede resultar extremadamente útil a la hora de programar clases genéricas, capaces de implementar un tipado fuerte sin necesidad de conocer a priori los tipos para los que serán utilizadas. ¿Confuso? Mejor lo vemos con un ejemplo.

Sabemos que un ArrayList es un magnífico contenedor de elementos y que, por suerte o por desgracia, según se vea, trabaja con el tipo base object. Esto hace que sea posible almacenar en él referencias a cualquier tipo de objeto descendiente de este tipo (o sea, todos), aunque esta ventaja se torna inconveniente cuando se trata de controlar los tipos de objeto permitidos. En otras palabras, nada impide lo siguiente:

ArrayList al = new ArrayList();
al.Add("Siete caballos vienen de Bonanza...");
al.Add(7);
al.Add(new String('*', 25)); // 25 asteriscos
Esto puede provocar errores a la hora de recuperar los elementos de la lista, sobre todo si asumimos que los elementos deben ser de un determinado tipo. Y claro, el problema es que el error ocurriría en tiempo de ejecución, cuando muchas veces es demasiado tarde:
foreach (string s in al)
{
System.Console.WriteLine(s);
}

Efectivamente, se lanza una excepción indicando que "No se puede convertir un objeto de tipo 'System.Int32' al tipo 'System.String'". Lógico.

Obviamente eso se puede solucionar fácilmente, por ejemplo creando nuestra propia colección partiendo de CollectionBase (o similar) y mostrar métodos de acceso a los elementos con tipado fuerte, o bien, usando delegación, crear una clase de cero que implemente interfaces como IEnumerable en cuyo interior exista una colección que es la que realmente realiza el trabajo.

En cualquier caso, es un trabajazo, puesto que por cada clase que queramos contemplar deberíamos crear una clase específica, tal y como se describe en el párrafo anterior.

Y aquí es donde los generics entran en escena. El siguiente código declara una lista de elementos de tipo AlgoComplejo:

List lista = new List();
AlgoComplejo algo = new AlgoComplejo();
lista.Add(algo);
lista.Add(new AlgoComplejo());
lista.Add("blah"); // ¡Error en compilación!

Con esta declaración, no será posible añadir a la lista objetos que no sean de la clase indicada, ni tampoco será necesario realizar un cast al obtener los elementos, pues serán directamente de ese tipo.

Es interesante ver la gran cantidad de clases genéricas para el tratamiento de colecciones que se incorporaron con la versión 2.0 del framework en el espacio de nombres System.Collections.Generic, y su amplia utilización a lo largo del marco de trabajo.

Creación de clases genéricas
En los ejemplos anteriores hemos visto cómo utilizar las clases genéricas proporcionadas por el framework, pero, ¿y si queremos nosotros crear una clase genérica propia? Veremos que es muy sencillo.
Vamos a desarrollar un ejemplo completo donde podamos ver las particularidades sintácticas y detalles a tener en cuenta. Crearemos la clase CustodiadorDeObjetos, cuya misión es almacenar un objeto genérico y permitirnos recuperarlo en cualquier momento. Básicamente, construiremos una clase con una variable de instancia y un getter y setter para acceder a la misma, pero usaremos los generics para asegurar que valga para cualquier tipo de datos y que el objeto introducido sea siempre del mismo tipo que el que se extrae:

public class CustodiadorDeObjetos
{
private T objeto;
public T Objeto
{
get { return objeto; }
set { this.objeto = value; }
}
}

Como podemos ver, en la propia definición de la clase indicamos que ésta será una plantilla que recibirá como parámetro genérico un tipo al que hemos llamado T en el ejemplo anterior.

Se puede apreciar cómo hemos declarado un miembro privado llamado objeto, de tipo T, al que se puede acceder a través del correspondiente getter y setter. El tipo concreto sobre el que actuaremos se definirá en el momento de la instanciación de un objeto, puesto que habrá que indicarlo expresamente:

// Crea un custodiador de strings...
CustodiadorDeObjetos cs = new CustodiadorDeObjetos();
// Creamos un custodiador de ints
CustodiadorDeObjetos ci = new CustodiadorDeObjetos();
// Creamos un custodiador de Cosas
CustodiadorDeObjetos cp = new CustodiadorDeObjetos();

De esta forma, evitamos tener que crear clases específicas para cada tipo de datos con el que necesitemos trabajar, ahorrándonos muchísimo esfuerzo y manteniendo todas las ventajas que el tipado fuerte nos ofrece.

Y para que os hagáis una idea del potencial de esta técnica, pensad que si no existiera la genericidad (como ocurría en versiones anteriores del lenguaje), nos veríamos obligados a implementar clases específicas como las siguientes:

public class CustodiadorDeStrings
{
private string objeto;
public string Objeto
{
get { return objeto; }
set { this.objeto = value; }
}
}
public class CustodiadorDeCosas
{
private Cosa objeto;
public Cosa Objeto
{
get { return objeto; }
set { this.objeto = value; }
}
}
// ... etc.

El siguiente código muestra la utilización de la nueva clase genérica CustodiadorDeObjetos que definimos con anterioridad:

CustodiadorDeObjetos cs = new CustodiadorDeObjetos();
cs.Objeto = "Hola"; // Asignamos directamente
string s = cs.Objeto; // No hace falta un cast,
// puesto que Objeto es de tipo string

cs.Objeto = 12; // Error en compilación,
// Objeto es de tipo string
CustodiadorDeObjetos ci = new CustodiadorDeObjetos();
ci.Objeto = 12; // Asignamos directamente
int i = cs.Objeto; // No hace falta un cast, pues Objeto es int

cs.Objeto = "Hola"; // Error en compilación,
// Objeto es de tipo int

Restricción de tipos en generics
Una particularidad interesante en la declaración de los generics en C# es la posibilidad de establecer limitaciones en los tipos utilizados como parámetros de las plantillas. Aunque resulte paradójico, el propio lenguaje facilita la creación de clases genéricas que no lo sean tanto, lo cual puede resultar realmente útil en múltiples escenarios.
Y para verle el sentido a esto, utilicemos el siguiente ejemplo, aparentemente correcto:

public class Seleccionador
{
public T Mayor(T x, T y)
{
int result = ((IComparable)x).CompareTo(y);
if (result > 0)
return x;
else
return y;
}
}

Se trata de una clase genérica abierta, cuya única operación (Mayor(...)) permite obtener el objeto mayor de los dos que le pasemos como parámetros. El criterio comparativo lo pondrá la propia clase sobre la que se instancie la plantilla: los enteros serán según su valor, las cadenas según su orden alfabético, etc.

A continuación creamos dos instancias partiendo de la plantilla anterior, y concretando el generic a los tipos que nos hacen falta:

Seleccionador selInt = new Seleccionador();
Seleccionador selStr = new Seleccionador();

Estas dos instanciaciones son totalmente correctas, ¿verdad? Si después de ellas usamos el siguiente código:

Console.WriteLine(selInt.Mayor(3, 5));
Console.WriteLine(selStr.Mayor("X", "M"));

Obtendremos por consola un 5 y una X. Todo perfecto; aparece, para cada llamada, la conversión a cadena del objeto mayor de los dos que le hayamos enviado como parámetros.

El problema aparece cuando instanciamos la clase genérica para un tipo que no implementa IComparable, que se utiliza en el método Mayor() para determinar el objeto mayor de ambos. En este caso, se lanza una excepción en ejecución indicando que el cast hacia IComparable no puede ser realizado, abortando el proceso. Por ejemplo:

public class MiClase // No es comparable
{
}

[...]
Seleccionador sel = new Seleccionador();
MiClase x1 = new MiClase();
MiClase x2 = new MiClase();
Console.WriteLine(selString.Mayor(x1, x2)); // Excepción,
// no son
// comparables!

Una posible solución sería, antes del cast a IComparable en el método Mayor(), hacer una comprobación de tipos y realizar la conversión sólo si es posible, pero, ¿y qué hacemos en caso contrario? ¿devolver un nulo? La pregunta no creo que tenga una respuesta sencilla, puesto que en cualquier caso, se estarían intentado comparar dos objetos que no pueden ser comparados.

La solución óptima, como casi siempre, es controlar en tiempo de compilación lo que podría ser una fuente de problemas en tiempo de ejecución. La especificación de C# incluye la posibilidad de definir constraints o restricciones en la declaración de la clase genérica, limitando los tipos con los que el generic podrá ser instanciado. Y, además, de forma bastante simple, nada más que añadir en la declaración de la clase Seleccionador la siguiente cláusula where:

public class Seleccionador
where T: IComparable // !Sólo permitimos comparables!
{
public Tipo Mayor(Tipo x, Tipo y)
[...]

Existen varios tipos de restricciones que podemos utilizar para limitar los tipos permitidos para nuestros tipos genéricos:

•where T: struct, indica que el argumento debe ser un tipo valor.
•where T: class, indica que T debe ser un tipo referencia.
•where T: new(), fuerza a que el tipo T disponga de un constructor público sin parámetros; es útil cuando desde dentro de algún método de la clase se pretende instanciar un objeto del mismo.
•where T: nombredeclase, indica que el tipo T debe heredar o ser de dicha clase.
•where T: nombredeinterfaz, T deberá implementar el interfaz indicado.
•where T1: T2, indica que el argumento T1 debe ser igual o heredar del tipo, también parámetro genérico de la clase, T2.

Estas restricciones pueden combinarse, de forma que si queremos que un parámetro genérico se ciña a varias de ellas, simplemente las separamos por coma en la cláusula where:

public class Seleccionador
where T: IComparable, new () // Sólo permitimos comparables,
// instanciable sin parámetros


Fuente de informacion: http://www.desarrolloweb.com/articulos/metodos-genericos-c.html




miércoles, 16 de noviembre de 2011

5 aplicaciones para restaurar el sistema

¿Alguna vez hás sufrido problemas con tú sistema operativo y tratando de solucionarlo has visto la necesidad de querer volver atrás para dejar todo como estaba? ¿Tal has querido instalar cierto paquete de software pero no estás seguro de cómo afectará eso al sistema, y desearías tener la posibilidad de volver a dejar el mismo como estaba, sin ningún fichero basura que afecte a su rendimiento? De ser así, estás buscando una buena utilidad de backup.

Windows, por ejemplo, incluye una utilidad que viene activada por defecto y que nos permite restaurar el sistema a un punto anterior. Se trata de una buena idea, pero tal vez no dispongamos de una copia reciente o necesitemos más de lo que la aplicación puede ofrecernos. Por ello sería interesante ver qué alternativas tenemos para ser previsores y preparar un sistema de copias de seguridad de nuestro sistema con el fin de utilizarlas si nos llega a hacer falta.

Por cierto, aunque es obvio, todas las utilidades que listo necesitan de un punto de partida, algo que restaurar, aunque no os preocupéis ya que podéis hacerlo desde las mismas. Nunca está de más recordar lo importantes que son las copias de seguridad, el poder restaurar nuestros ficheros en caso de que suceda lo peor, algo que siempre es posible si hemos sido previsores y hemos puesto a buen recaudo nuestros ficheros.

Estas 5 utilidades para restaurar el sistema nos servirán, pese a estar enfocadas a restaurar el sistema operativo entero y no únicamente nuestros ficheros de contenidos.

Ghost (Windows)
Ghost es seguramente el programa más conocido de toda la lista. Lanzado a principios de 1997, se trata de una herramienta utilizada a nivel corporativo para restaurar imágenes en masa y no tener que estar instalando sistemas una y otra vez. Su fuerte, la precisión. Una copia idéntica realizada por una aplicación que ha ido creciendo y cambiando de nombre con el tiempo, la mayor parte de las veces entre Symantec Ghost y Norton Ghost, como se la vuelve a conocer.

Hoy en día es una suite muy completa que ha ampliado la lista de sistemas de archivos con los que trabaja y que ha mejorado su velocidad y rendimiento con sistemas modernos como Windows Vista o Windows 7, para el que soporta varios tipos de encriptación de sistemas de archivos. Es de pago, eso sí, aunque podemos probar una versión totalmente funcional durante 30 días.

Acronis True Image (Windows / Multiplataforma)
Es con diferencia mi programa favorito, y llevo usándolo desde hace bastante. Se trata de una suite que nos ofrece todas las características básicas que podríamos necesitar en un programa de copias de seguridad y añade algunas características avanzadas. Por ejemplo nos permite hacer un backup automático de la partición del sistema, sin que el usuario tenga que molestarse en añadir la misma manualmente. Una vez seleccionada, podemos incluir también el espacio libre o conservar las fechas de los archivos actuales, algo que básicamente copia toda la partición y la deja preparada en un fichero de imagen para que podamos restaurarla dejándola de una forma idéntica.

Puede ejecutarse desde un Live CD o una llave USB, tanto para realizar la copia como para restaurar la misma, ya que hay que tener en cuenta que si los ficheros del sistema están en uso no podrá hacerse el backup de forma correcta. ¿Las malas noticias? Se trata de una aplicación sólo para Windows (aunque la versión Live CD funcionará en cualquier equipo X86) y de pago, y costarando unos 50 dólares la licencia para un ordenador.

Paragon Drive Backup (Windows)
Paragon Drive Backup es una utilidad gratuita para Windows bastante popular, y de hecho está reconocida como una de las mejores a la hora de realizar copias de seguridad de particiones. ¿Por qué? Básicamente por su efectividad y sencillez de uso. Es la versión gratuita de una suite comercial de pago, pero nos salva el apuro perfectamente y es una muy buena opción si queremos iniciarnos (o decantarnos) con las aplicaciones de copia de seguridad.

Además soporta algunas características avanzadas como el backup en tiempo real –mediante los servicios de Microsoft Volume Shadows—o la copia de seguridad y restauración de múltiples particiones en una sola imagen, algo que nos permitirá no sólo restaurar nuestro sistema operativo sino varios en el caso de que tengamos más de uno alojado en nuestros discos. Se trata de una aplicación únicamente para Windows. Una pena, ya que su uso en forma de asistentes es realmente sencillo.

Clonezilla (Multiplataforma)
Gratuito y open source. Clonezilla es otra utilidad que nos ayudará a hacer imágenes de nuestra partición principal o de la que contenga nuestro sistema operativo. Pese a que su interfaz es bastante antigua y poco atractiva, es muy facil de utilizar ya que tan sólo hay que seguir los pasos que nos va mostrando el asistente en pantalla e ir eligiendo la opción que necesitemos.

Su punto fuerte es que es multiplataforma y funcionará en cualquier equipo ya que se sirve como un Live CD que podemos arrancar desde el arranque del ordenador. Arranca en cualquier equipo, ¿pero puede realizar los backups? Si. Clonezilla nos da la opción de copiar el disco o partición sector a sector, no importando el sistema de archivos que se esté utilizando. Esta opción tardará algo más pero no deja de ser recomendable, ya que hará una copia exacta –de ahí el nombre— de nuestro sistema y de nuestros ficheros.

PING (Linux)
Otro programa enfocado a ordenadores con sistema operativo Linux. PING tiene un nombre curioso, ya que es acrónimo de Partimage Is Not Ghost, una clara referencia a Ghost, del que os hablábamos al principio, y en el que se basa para otorgarnos un programa de código abierto y que funciona realmente bien. Se trata de una ISO arrancable basada en LFS mediante el cual podemos crear copias de seguridad avanzadas y restaurarlas de la manera más sencilla.

Hay opciones dedicadas a la restauración de tan sólo el sistema operativo, crear una restauración arrancable, y preparar nuestro ordenador para una nueva instalación de sistemas alternativos como por ejemplo Windows. Otra opción interesante es la deguardar datos de la BIOS, aunque desconozco como funciona realmente.

Su fuerte, a mi modo de ver, es que todos los que estén familiarizados con Ghost podrán utilizarlo, y que además soporta una amplia gama de sistemas de archivo. En resumidas cuentas, se trata de una herramienta todoterreno que les encantará.

Fuente : Bitelia

lunes, 14 de noviembre de 2011

Mi portátil Acer TravelMate tiene la pantalla con rayas de colores… ¿Cómo la reparamos?

Hace días, llegó un cliente a mi taller informático planteándome esta situación: De un día a otro, su portátil Acer TravelMate 6460 comenzó a mostrar imágenes dispersas en su pantalla poniéndolas con rayas de colores, y la verdad es que no sabía cómo solucionar ese problema. Lo cierto es que la había llevado a 4 diferentes lugares y todos decían lo mismo: Debes cambiar la pantalla amigo.

Casualmente, en mi taller tenía dos portátiles iguales (TravelMate) que se habían reparado y obvio sus pantallas estaban 100% perfectas. Se las instalé y el problema persistía. ¿Qué podía hacer en ese momento? Ya pensábamos que era la tarjeta madre, pero la portátil arranca, y si la conectaba al monitor (por VGA), andaba bien, pero con manchas en la imagen. Vean la portátil como estaba:

Para ver las imágenes con mejor resolución, hagan clic en ella y así se amplían
En ese momento, estábamos anonadados porque no sabíamos qué hacer. Se nos ocurrió hacerle reballing a la tarjeta madre de dicha portátil, luego, aplicar calor específicamente al chip de vídeo y se solucionó el problema. Vean ahora, cómo está la portátil luego de hacerle dicho procedimiento:

Esta era una simple experiencia que quería compartir con todos mis amigos de Blog Informático y sé que les servirá de mucho. Cuando tengan una portátil Acer TravelMate, HP Pavilion, o la que se atraviese por allí, y tenga rayas verticales de colores, es muy posible que necesiten aplicarle calor, para lo que recomiendo sean muy cuidadosos. En YouTube existen muchos vídeos para reballing.
Por favor, me disculpan la pésima calidad de las imágenes pero fueron tomadas con mi teléfono a lo rápido en mi taller antes de salir, no dio tiempo de tomar una foto con mayor calidad pero lo que importa es transmitirles el aprendizaje que se ha obtenido en este caso tan popular en las laptops.

Enlace Web : Blog Informatico
Enlace web: Rework (Reballing)

lunes, 17 de octubre de 2011

Backify: 512GB gratis para alojar archivos en la nube

Se han visto muchas aplicaciones web de alojamiento gratuito de archivos, pero nunca se habia visto uno con tanta capacidad y gratuito. Es ese el punto principal de backify y tanto asi que he notado que el servidor ha colapsado, por la exagerada demanda que ha tenido este. Tiene tres tipos de cuentas: la gratuita (con 512GB en espacio) y 2 de pagas (una de 3$/mes y otra de 5$/mes).
Evidentemente, la gratuita es la que estamos tratando acá. Las características destacadas son:


  1. 512GB de espacio en disco totalmente gratis.

  2. Completamente automático - cuenta de sincronizacion.

  3. Tiene clientes para windows y tambien para Mac OS X.

  4. Solo puede usarse en una computadora.

  5. Es necesario el registro gratuito para poderlo usar.

  6. Puedes acceder a tus archivos desde donde quieras.

  7. Desde el movil, puedes ver tus vídeos o escuchar música.

  8. Cuenta con métodos de seguridad que resguardan la privacidad del cliente

Gracias a : bloginformatico.com
Enlace web de : backify.com

lunes, 3 de octubre de 2011

Mi laptop no enciende (o arranca), queda pantalla en negro, sólo las luces encienden.

Un buen amigo (usuario desde siempre con el que mantengo contacto) llamado Armando Pereira, me escribe un correo pidiéndome ayuda pues tiene problemas con su portátil. El problema es que de un momento a otro la portátil enciende más no arranca, es decir, prenden los leds pero no le da vídeo, y en este post, quiero orientarlo por varias causas, y sus soluciones a las que puede acudir.

Mi laptop no enciende ni arranca

Es un poco complejo reparar portátiles, pero no imposible. Analicemos entonces, cada uno de los casos que podrían estar presentándosele a nuestro amigo Armando; hay que ser muy minuciosos.


    • Lo primero y principal – Suministro de energía

Medir voltaje batería de portátil y cargador

Me decía un amigo de confianza, técnico en electrónica, que su principal herramienta de trabajo, y que nunca podría faltarle, es un tester de corriente con el que verifica los voltajes de salida de todo componente o dispositivo que está arreglando. Y por ello primero comprobamos que el adaptador de corriente de nuestra portátil esté botando el voltaje indicado. E igualmente, es bueno probar sin la pila de la portátil, es decir, directamente con el cargador, a ver si termina de arrancar la portátil.

¿Por qué probar sin la batería? Claro está, después que hayamos probado que el adaptar está en buenas condiciones. Es muy raro, pero pasa, que la batería está en corto y por ello no permite que la laptop termine de arrancar. ¡Ah! Y en caso de que el adaptador de corriente de la laptop no esté arrojando los valores correctamente, entonces debemos pensar en reemplazarlo, probar la laptop.

    • Si la energía está bien, averigüemos la memoria RAM

Sacar memoria RAM a una laptop

Si verificamos el adaptador de corriente, el problema no está ahí, entonces, seguimos el camino a otro lugar. ¿Memoria RAM? ¿Te suena? Es ese componente indispensable de un equipo que nos permite arrancar cualquier PC. Si la memoria RAM está dañada / defectuosa, difícilmente arranca y es ese el problema entonces. ¿Qué podemos hacer? Primero, sacarla de la portátil, y limpiar los contactos con alcohol isopropíilico; probamos a ver qué tal, si arranca, pues solucionamos. Pero y si no arranca, entonces, lo que haremos es: buscar otra memoria RAM, para probar dicha portátil.

Si probamos con otra memoria RAM en buen estado y nuestra portátil no funciona, ni arranca, nos vamos al siguiente paso, pues acá no tenemos nada qué hacer. Solamente son pruebas a aplicar.

    • Si el problema persiste, verifiquemos los cables de vídeo

Flex de la laptop

Ya probamos lo esencial, que si el suministro de energía y la memoria RAM; vamos ahora con una parte mucho más compleja y delicada. Primero y principal, si nuestra portátil tiene puerto VGA y la podemos conectar a un monitor LCD, CRT o un proyector de vídeo, entonces probemos a hacerlo.

Quién quita y el problema está en nuestra pantalla. Si no da vídeo ni siquiera en ese dispositivo de salida de vídeo (llámese proyector, monitor LCD o CRT, etc.) entonces el problema no es ese, y lo que debemos hacer es verificar que el “flex” de la pantalla de la portátil está bien conectado, como también el cable que va hacia la tarjeta de la laptop. Si todo está bien conectado y aparentemente los cables no tienen partiduras, entonces el problema no viene por allí, y vayamos al próximo paso.

¡Ah! Se me olvidó decirles que si da vídeo con un dispositivo de vídeo adicional (repito: monitor, o proyector), entonces el problema es: nuestra pantalla. Podría ser que está defectuosa aunque está la posibilidad que el chip de vídeo de la tarjeta madre tiene conflictos (eso lo tratamos más abajo).

    • Verificar componentes por separados también es válido

Partes de una portátil

Ésta es la parte que más me gusta, porque me he encontrado con muchas sorpresas; lo que se va a hacer, básicamente, es verificar componente a componente, para saber si están bien. Y, a estas alturas, lo que nos importa es que: de vídeo, que termine de arrancar. Por ello, si una pieza interna tiene problemas, entonces no terminará de arrancar. Y en esta parte hay que ser más meticulosos.

¿Qué es lo que básicamente se hace? Simple: desconectamos cada componente mientras que le vamos dando encendido para ver si arranca la portátil. Lo principal, el disco duro, siguiendo por la unidad óptica, hasta pasar por la tarjeta Wi-Fi o Bluetooth (en caso de que sea ‘desconectable’), y seguimos con otros componentes como la webcam. Sé a algunos no les parecerá nada relevante.

En mi caso, me he encontrado con cada sorpresa. En una ocasión, una portátil no arranca porque, misteriosamente, la webcam estaba dañada. Recuerdo, era una Compaq F700. Luego de hacerle casi que todo, hasta reballing a la tarjeta de vídeo y mil cosas más, pensé en desconectarle dicha cámara web, el problema se solucionó. Es por eso que en este paso tenemos que ser detallistas.

    • Aplicar la pistola de calor a la tarjeta madre y chip de vídeo

Pistola de calor a portátil

En esta parte tenemos que ser más cuidados, e incluso si podemos buscar la ayuda de un técnico en electrónica, sería mucho mejor. Una vez que tengamos desarmada pro completo nuestra laptop y antes de enviarla al cementerio que normalmente tenemos en nuestro taller, apliquémosle pistola de calor a la tarjeta madre, repasémosle las soldaduras a los componentes y ‘microchips’ de ésta.

De igual manera, se podría aplicar reballing y pistola de calor. Es un procedimiento muy delicado, pero en muchas ocasiones funciona. En Internet se consiguen muchos vídeos y tutoriales de cómo hacerlo, porque para hablar con minuciosidad de cada aspecto, pasaría mucho tiempo en el post.

    • Si no encontramos solución – ¿Qué podemos hacer entonces?

Lo que se recomienda es probar con otra tarjeta madre, porque posiblemente está dañada la que, con tantos procedimientos, intentamos recuperar. Tarjetas madres para laptops se encuentran, de la marca que sea, HP, Acer, Toshiba, Sony Vaio, prácticamente todas, en páginas como Mercado Libre (si eres de Latino América, sabes de qué hablo) se consiguen estos repuestos específicos.


Y como siempre, es bueno saber las opiniones de los usuarios, que nos cuenten sus experiencias con estas portátiles, y quizá podamos llegar a solucionar problemas de muchos usuarios por acá.

Tomado de: bloginformatico.com