lunes, 30 de junio de 2014

Embellece tu juego 2D - Normal Mapping

Muchos de los juegos 2D que muestran iluminación dinámica se basan en una técnica llamada Color Blending. Con esta técnica se puede simular la iluminación de una textura como se ve en la imagen del enlace anterior.

Para mejorar los gráficos 2D se pueden emplear técnicas de iluminación 3D que embellecen enormemente el resultado final.

La primera técnica que podemos aplicar es NormalMapping. Esta técnica define la dirección hacia la que está orientado cada pixel en la textura por lo que podemos calcular como incide la luz en él.

viernes, 30 de mayo de 2014

Map/Reduce o como aprendí a dejar de preocuparme y amar Hadoop.

En esencia, Map/Reduce se basa en repartir el trabajo para calcular (Map) y juntar los resultados (Reduce).

En un trabajo repartido entre varios, el resultado de los cálculos de cada trabajador (Map) es parcial, por lo que luego es necesario juntar los resultados de todos los trabajadores (Reduce) para obtener el resultado final.

miércoles, 21 de mayo de 2014

martes, 20 de mayo de 2014

Game Programming Patterns aplicado a aplicaciones de negocio.

Después de leerme el estupendo libro Game Programming Patterns, el cual recomendé encarecidamente a todo programador que se precie, voy a trasladar la aplicación de muchos de los patrones que se tocan en el libro a casos de aplicaciones de negocio.


jueves, 15 de mayo de 2014

Conservar la posición del scroll de página tras un Postback

Recientemente he tenido que montar un formulario web en ASP.NET cuya extensión vertical  se me ha ido un poco de madre. Cuando estuve probándolo me di cuenta de que al hacer los postback el scroll me devolvía al principio de la página. Esto obviamente es un engorro para el usuario, que en páginas un poco densas -por ejemplo rellenando datos en un formulario grande- puede llegar a verse un poco desorientado. Además el efecto queda feo y resta navegabilidad. Como de costumbre es algo que probablemente voy a necesitar más adelante, así que tras dar con la solución -Google gratia- lo dejo aquí referido.

martes, 29 de abril de 2014

Game Programming Patterns

No puedo explicar con palabras lo maravillosamente brillante que es este libro. Bob Nystrom consigue explicar con perfecta concisión conceptos que a mi me cuesta una barbaridad sacar de mi cerebro de lagarto y poner en palabras.

Cualquier programador debería leerse este libro independientemente de que se dedique al desarrollo de videojuegos o no. 

Game Programming Patterns

viernes, 21 de marzo de 2014

Roles para autorizaciones en el sistema.

Cuando un servicio comprueba la autorización de un usuario para ejecutar una acción utilizando roles suelo encontrarme con la siguiente implementación:

Public Enum Rol

ConsultorModulo1

ConsultorModulo2

OperadorModulo1

OperadorModulo2

Administrador

End Enum



function DoAction()

{

Rol allowedRoles[] = [OperadorModulo1, Administrador];

if (user.hasAnyRoleIn(allowedRoles))

{

DoAction();

}

else

{

throw new SecurityException("Permisos insuficientes");

}

}
  • ConsultorModuloX es un rol que permite consultar información pero no modificarla para un módulo del sistema en concreto.
  • OperadorModuloX es un rol que permite la modificación de información para un módulo del sistema en concreto.
  • Administrador es un rol que permite la totalidad de las acciones en el sistema.

No me gusta porque tenemos que encontrar coincidencias de items entre 2 conjuntos (roles que tiene el usuario y roles permitidos para la acción pertinente). Quedaría más eficiente y bonito si encontramos la manera de poder combinar varios roles en una sola variable y comprobar rápidamente si el usuario tiene asignado alguno (o varios o todos) de los roles necesarios.

martes, 11 de marzo de 2014

Resolver funcionalidades transversales sin Programación Orientada a Aspectos.

A mi me encanta la Programación Orientada a Aspectos (AOP). De hecho, la he aplicado exitósamente para gestionar la seguridad y el registro de trazas en varias aplicaciones utilizando mi librería AOP favorita en su version gratuita: PostSharp. Esta librería se encarga de inyectar el código de los aspectos en los ensamblados (Compile-Time Weaving) por lo que, al no funcionar sobre objetos virtuales, clases proxy y cosas por el estilo, no sufre de la problemática de otros frameworks AOP que obligan a limitar las formas de declarar las clases.

AOP es la mejor manera de gestionar y estructurar las funcionalidades transversales (cross-cutting concerns) de una aplicación; desgraciadamente está muy poco extendido y se está haciendo difícil adoptar estas tecnologías por parte del 'mainstream' del desarrollo de software (al menos en esta España garbancera).

Cuando un jefazo ignorante no me permite utilizar AOP para las funcionalidades transversales tengo un plan B que funciona a las mil maravillas: Usar un patrón decorador y construir una cadena de responsabilidades con la inyección de dependencias.


lunes, 10 de marzo de 2014

Arquitecturas débilmente acopladas.

Conseguir una arquitectura cuyos módulos tienen un acoplamiento débil no consiste sólo en crear una interfaz por cada clase existente y consumirla. Voy a intentar reproducir el proceso mental que yo sigo para llegar a este objetivo. Espero que esto sirva, a futuros lectores, para ayudarles a "cambiar el chip" a la hora de diseñar los módulos de un sistema de información.

miércoles, 26 de febrero de 2014

Did you just tell me to go #$@% myself?

Últimamente estoy trabajando para fines educacionales con temas de Big Data o procesamiento masivo de datos. Esto implica aprender Hadoop, Cassandra, RavenDB, Redis, Kafka y más...