martes, 23 de diciembre de 2014

Arquitecura de Android SOLID(A) I

Continua en la Parte II y Parte III

Como ya comenté en una diatriba en un post anterior, la segregación de responsabilidades en Android es un maldito infierno debido a que las infames Actividades establecen los eventos de la vista, reciben los mensajes del bucle de mensajes del contexto de la aplicación, controlan su ciclo de vida, etc.

Para poder cumplir el principio de responsabilidad única y un diseño SOLID hemos de segregar las responsabilidades y proporcionar los mecanismos adecuados para su intercomunicación.

Para ello he preparado un pequeño ejemplo que, aunque muy muy básico para usarse en el mundo real, puede representar un buen comienzo y/o un buen ejemplo para que se comprenda y se pueda empezar a crear una arquitectura en Android decente.

Este ejemplo se compondrá de:
  • Un Modelo que representa el estado y el comportamiento de nuestra entidad de negocio.
  • Un Modelo de Vista que representará el estado de la vista.
  • Un Controlador que recibe las llamadas de la vista, realiza las operaciones con las entidades de dominio y manda notificaciones a la vista.
  • Una vista que muestra el modelo y el modelo de vista, llama al controlador para aplicar reglas de dominio y ofrece el feedback al usuario con las notificaciones del controlador.

jueves, 30 de octubre de 2014

God Mode

No, que no se me exciten los más jugones. No voy a revelar el "Modo Dios" de ningún top del mundo de los videojuegos... De hecho es una información un poco antigua y probablemente no tan interesante, pero yo (y unos cuantos compañeros de mi entorno) no la conocíamos y se me antoja bastante útil. Navegando por la red me he encontrado con un interesante truco que se ha dado en llamar el God Mode de Windows 7. Si eres usuario de este Sistema Operativo, seguro que alguna vez has perdido algo de tiempo buceando por menús y carpetas en busca de alguna utilidad del sistema de esas que usamos con poca frecuencia... 

Pues bien, creando una simple carpeta (en cualquier sitio) y dándole un determinado nombre se obra la magia... Si creamos una carpeta y la llamamos "GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}" veremos como inmediatamente se cambia el icono y dentro tendremos accceso a una especie de "super panel de control" donde podremos acceder a un montón de opciones para modificar diferentes aspectos del sistema. Muchas son accesibles con más o menos facilidad de la forma tradicional, otras igual no tanto...

martes, 26 de agosto de 2014

Frase celebre del dia.

Como si tuviéramos una frase celebre cada dia....

La cantidad de energía necesaria para refutar gilipolleces es un orden de magnitud superior que para producirlas.
Y unos casos mas reales de lo que parece: 1, 2, 3, 4, 5 y

viernes, 25 de julio de 2014

Embellece tu juego 2D - Self-Shadowing

Existen varias técnicas para que una textura de 2 dimensiones proyecte sombras en tiempo real sobre sí misma. Las técnicas más rápidas hacen uso de mapas de horizonte pero es menos precisa y genera más artefactos que la implementación que voy a presentar aquí. Esta implementación es computacionalmente muy pesada pero, asumiendo que en un juego 2D tenemos una carga de GPU relativamente baja y que somos un poco putilla gráfica y tenemos hardware puntero, puede llegar a ser viable en una aplicación interactiva; sobretodo si nuestro motor gráfico trabaja con deferred rendering.

martes, 15 de julio de 2014

Embellece tu juego 2D - Bloom

El efecto bloom queda genial en escenas de alto contraste de colores; y nuestro juego seguro que tiene una preciosa paleta de colores a la que le quedaría de maravilla.

Ejemplo de bloom:


La técnica implica varios pasos a seguir:

1) Obtener en una textura únicamente los pixeles más luminosos de la imagen.
2) Aplicarle un desenfoque gausiano (vertical y horizontal)
3) Combinar el resultado de la imagen desenfocada con la imagen original usando additive blending.

Todo esto lo realizamos con una resolución pequeña para mejorar el rendimiento puesto que no nos hace falta tanta precisión.

Profundizando en CSS. Selectores

Llevo una temporada intentado retomar el diseño web para cubrir, por una parte, ciertas inquietudes profesionales, y por otra, una serie de trabajos, de esos sin remuneración, a los que "obligan" los consabidos lazos afectivos. En la parte más temprana de mi recorrido profesional hice algunas modestas webs, pero me quedé en la maquetación con frames y tablas. Lo de maquetar una página con etiquetas div es una chulada, pero me parece una temeridad sin una buenísima planificación de estilos, por eso las posibilidades que se me están revelando con CSS me llevan a pensar que un día podría llegar a ser el Harry Potter del diseño web (sic)... En fin, coñas a parte, hay por ahí auténticas virguerías hechas -sólo- con HTML y CSS, y merece la pena profundizar un poco más en sus posibilidades.

Hace ya algún tiempo publicamos en este blog una pequeña guía con algunos conceptos básicos de CSS. En ella se decía que la sintaxis general de CSS se componía de selectores y sus correspondientes declaraciones de estilos o bloques de estilo. Hoy vamos a profundizar en los selectores.

martes, 8 de julio de 2014

Embellece tu juego 2D - Specular Highlight

Specular Highlight es el brillo que aparecen en los objetos cuando la luz incidente es reflejada directamente hacia nuestros ojos.

La propuesta, a bote pronto, es sencilla: Calcular el vector de "rebote" de la luz y hacer el dot product con el vector de la vista; mientras menor sea el ángulo entre estos 2 vectores, más brillo vamos a apreciar.


L es el vector de dirección de la luz (invertido), N es el vector normal del pixel (sacado del normal map), V es la vista (o cámara), H es el Half Vectror que yo no voy a usar porque es más preciso utilizar el vector de la luz reflejado (R).

martes, 1 de julio de 2014

Embellece tu juego 2D - Point Light

La técnica de normal mapping del post anterior queda muy bien, pero nos falta mejorar un poco el punto de luz creado para iluminar la textura. De momento el punto de luz ilumina toda la textura al completo pero es probable que en nuestro motor gráfico necesitemos definir un punto de luz con un rango finito. Para ello, vamos a añadirle la atenuación.

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.

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...

viernes, 31 de enero de 2014

Como saltarse las restricciones del antivirus de GMAIL

Hoy me he encontrado con que GMAIL no me deja descargarme un fichero zip sin cifrar adjunto a un correo porque me dice que es o tiene un virus. Resulta que no hay ninguna opción para desactivar esta característica, por lo que ya daba el archivo por perdido puesto que ya no está en las fuentes de donde lo saque antaño y ese correo era mi "copia de seguridad".

lunes, 27 de enero de 2014

Un proyecto en NetBeans de principio a fin (VII). Gestión de sesiones

Todas las aplicaciones de comercio electrónico que ofrecen algún tipo de funcionalidad del estilo del carrito de la compra, necesitan ser capaces de recordar los datos específicos de un usuario y sus acciones en el sitio web. Desafortunadamente, el protocolo HTTP -base de las comunicaciones en Internet- es un protocolo stateless. Esto quiere decir que cada petición recibida por el servidor, es un fragmento independiente de información, que no tiene relación con peticiones recibidas previamente. Por lo tanto, si un cliente pulsa un botón y añade algún artículo a su carrito, nuestra aplicación debe tomar las medidas necesarias para asegurar que el estado del carrito del usuario se actualiza, y además, esa acción no debe afectar al carrito de otro usuario que eventualmente pueda estar navegando por el website al mismo tiempo.

miércoles, 22 de enero de 2014

Gadget de comentarios recientes para blogspot

Hace unos días me daba cuenta de que en mi blog de blogspot, de nuevo se volvía a 'estropear' el gadget de comentarios recientes. Como en ocasiones anteriores, el motivo de que se haya estropeado el plugin es que para funcionar necesitaba archivos externos y al retirar alguno de ellos el código que genera los comentarios recientes deja de funcionar, pero ya hay solución.

jueves, 16 de enero de 2014

Depurar código administrado en entorno de producción.

Tienes un programa que sólo falla (lanzando una fea excepción) en el entorno de producción y eso es una putada. Por fortuna podemos mirar que esta pasando gracias a depurador de windows WinDgb.exe y un programita muy chulo de microsft que se llama Debug Diagnostic Tool 2.0. (DebugDiag)

lunes, 13 de enero de 2014

Code Kata for fun and profit.

Code Kata es un término acuñado por Dave Thomas en analogía al concepto de kata en las artes marciales. Consiste en un ejercicio de programación para practicar que, en el mejor de los casos, puede ser resuelto de diferentes formas. Voy a proponer uno que me ha parecido muy interesante debido a la gran variedad de formas de resolverse que puede llegar a tener.