Archivo: March, 2009

Esconder la barra de tareas en Windows CE .NET

[ Blog: ethernet - psé - blog de javi santana ]
2009:03:31 22:03:00
En los dispositivos tipo PNA (PDA con GPS incorporado) que no tienen windows mobile es muy común poder hacer algún hack para poder acceder al sistema que hay por debajo. En ese windows ce se pueden ejecutar aplicaciones normalmente sin ningún tipo de limitación, aunque algunos limitan el acceso al GPS o bluetooth.

Si quieres crear una aplicación a pantalla completa (para, por ejemplo, una applicación 3D) queda muy mal la minúscula barra de tareas de windows ce .net, lo ideal es quitarla, para ello el siguiente código:

void HideTaskbar()
{
TCHAR* window_names[] = { _T("menu_worker"), _T("HHTaskBar"), _T("Shell_TrayWnd"), _T("Tray") };
for(int i = 0; i < sizeof(window_names)/sizeof(window_names[0]); ++i)
{
HWND hwndCB = ::FindWindow( window_names[i] , _T("") );
if(hwndCB)
::ShowWindow( hwndCB, SW_HIDE );
}
}


Se basa en buscar la ventana de la barra de tareas y ocultarla, así de simple. Realmente es una tontería, pero me costó un rato dar con ello y así lo tengo localizado :). Hay 4 nombres porque me he encontrado diferentes nombres en diferentes tipos de PNA, así que así me aseguramo.

NOTA: El formateo de código no es mi fuerte como podeis comprobar, alguna herramienta para blogger?

Árboles de Expresiones

[ Blog: Vicente - Jad Engine Blog ]
2009:03:31 21:00:00

Ahora que ya hemos visto que es una expresión lambda podemos ver otra nueva característica mucho más “rara” de C# 3.0: los árboles de expresiones. En algunos lenguajes, como Lisp, se permite manejar el código como si fueran datos y los datos como si fueran código (hace un par de días leyendo el blog del gran Eric Lippert descubrí que a esto se le llama homoiconic). Los árboles de expresión son la forma que tiene C# de implementar esta funcionalidad (de forma algo limitada).

Por ejemplo, en el artículo anterior teníamos la expresión lambda:

num => num < 5

Que devolvía si un número era menor que cinco o no. Expresado en forma de un delegado del tipo Func, el código sería:

Func<int, bool> f = num => num < 5;

Y la forma de poner lo mismo usando un árbol de expresiones es:

System.Linq.Expressions.Expression<Func<int, bool>> e = num => num < 5;

La diferencia entre Func y Expression es que f es una función que se puede ejecutar:

bool result = f(10);

Pero para ejecutar e tenemos que hacer lo siguiente:

bool result = e.Compile()(10);

Es decir: para ejecutar un árbol de expresiones primero tenemos que compilarlo (porque son datos que representan código, no código en sí) y una vez compilado ya podemos utilizar el resultado como si fuera un método normal.

De forma gráfica, e internamente está representado por el siguiente árbol:

treePero lo interesante de los árboles de expresiones es que en vez de dejar que el compilador los genere automáticamente, podemos construirlos nosotros a mano. Una vez tenemos una idea de como se representan internamente generarlos por código es bastante fácil (aunque algo tedioso):

ParameterExpression param = Expression.Parameter(typeof(int), "num");
ConstantExpression five = Expression.Constant(5, typeof(int));
BinaryExpression lessThan = Expression.LessThan(param, five);
Expression<Func<int, bool>> e = Expression.Lambda<Func<int, bool>> (lessThan, new ParameterExpression[] { param });

Si hacemos un poco de memoria, en el mini motor de RPGs una parte bastante importante del código se encargaba de trabajar con las expresiones matemáticas que definen los valores de las variables de los objetos (los puntos de vida, el bonificador de ataque,…). Lo que hacíamos era definir el modificador en algún sitio (un fichero, una BD, …) como una expresión infijo, es decir, como esto:

(a) Attack = 3 * Level + 4 / 7 ^ 34 - 345

Se aplicaba el algoritmo de Shunting-Yard para transformarla en una expresión postfijo:

(b) Attack = 3 Level * 4 7 34 ^ / + 345 -

Y una vez teníamos (b) en forma postfijo se utilizaba un algoritmo para evaluar la expresión que lo que hace es construir un árbol con la siguiente pinta:

postfixevalY sinceramente, este árbol se parece un montón al árbol del ejemplo anterior :) Así que el cambio realizado en la librería de RPGs va a utilizar árboles de expresiones para permitirnos pasar de esto:

string strExp = "3 * Level + 4 / 7 ^ 34 - 345";

A esto:

Func<Evaluator, double> func = (evaluator) => 3 * evaluator.Chain(Level) + 4 / 7 ^ 34 - 345;

¡Hemos transformado una cadena de texto en una función en C#! Esta función recibe un objeto del tipo Evaluator (que se utiliza para calcular el valor de las variables como Level, Dexterity,… de forma recursiva) y devuelve un double (el valor de la fórmula).

El código que realiza esto es bastante sencillo (es una modificación del algoritmo de evaluación):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SLE = System.Linq.Expressions;
 
namespace GravityAge.Rpg
{
    public static class Experiments
    {
        #region Methods
 
        public static SLE.Expression<Func<Evaluator, double>> ToExpressionTree(this Expression expression)
        {
            Stack<SLE.Expression> operands;
            SLE.Expression op1, op2;
 
            SLE.ParameterExpression parameter = SLE.Expression.Parameter(typeof(Evaluator), "evaluator");
 
            operands = new Stack<SLE.Expression>();
 
            for (int i = 0; i < expression.Terms.Count; i++)
            {
                switch (expression.Terms[i].TermType)
                {
                    case TermType.Number:
                        {
                            operands.Push(SLE.Expression.Constant(expression.Terms[i].Value, typeof(double)));
                            break;
                        }
 
                    case TermType.Variable:
                        {
                            operands.Push(SLE.Expression.Call(parameter, "Chain", new Type[] { }, SLE.Expression.Constant(expression.Terms[i].Text)));
                            break;
                        }
 
                    case TermType.Operator:
                        {
                            op2 = operands.Pop();
                            op1 = operands.Pop();
 
                            switch (expression.Terms[i].TermOperator)
                            {
                                case TermOperator.Add:
                                    {
                                        operands.Push(SLE.Expression.Add(op1, op2));
                                        break;
                                    }
 
                                case TermOperator.Subtract:
                                    {
                                        operands.Push(SLE.Expression.Subtract(op1, op2));
                                        break;
                                    }
 
                                case TermOperator.Multiply:
                                    {
                                        operands.Push(SLE.Expression.Multiply(op1, op2));
                                        break;
                                    }
 
                                case TermOperator.Divide:
                                    {
                                        operands.Push(SLE.Expression.Divide(op1, op2));
                                        break;
                                    }
 
                                case TermOperator.Power:
                                    {
                                        operands.Push(SLE.Expression.Power(op1, op2));
                                        break;
                                    }
                            }
 
                            break;
                        }
 
                    default:
                        {
                            throw new ArgumentException("An undefined token (" + expression.Terms[i].Text + ") appeared while calculating an expression.");
                        }
                }
            }
 
            if (operands.Count == 1)
            {
                return SLE.Expression.Lambda<Func<Evaluator, double>>(operands.Pop(), parameter);
            }
            else
            {
                return null;
            }
        }
 
        #endregion
    }
}

Como podréis ver el código se encuentra dentro de una clase llamada Experiments, ya que no tenía muy claro si iba a ser capaz de hacer esto o no cuando empecé :p Así que estos días me dedicaré a refactorizar y pulir algunas cosas y en breve subiré una nueva versión de la librería a Kartones por si a alguien le interesa.

Es un error elegir tu camino basándote en los pecados que llevas contigo

[ Blog: RobiHm - Indómita ]
2009:03:31 15:44:50

Es un error elegir tu camino basándote en los pecados que llevas contigo.
No elegimos nuestro camino dependiendo de los pecados que cargamos, sino que debemos de cargar nuestros pecados por el camino que escojamos.

Kara no Kyoukai OVA 1

Ilustraciones para Mad Skills Motocross

[ Blog: zwiTTeR - dfrriz - Ilustración, arte y videojuegos... ]
2009:03:31 14:02:00

Little tiny bits

[ Blog: Kr0n - vi.sualize.us: official blog ]
2009:03:31 11:11:46

I’ve been working in the shade in some tiny bits that have been running in the site for a while, but, although tiny, I think they also deserve their five minutes of fame!

  • Deep linking from Flickr and author attribution

    Every image bookmarked from Flickr get automatically the proper author recognition, and also no matter what image you bookmarked (from the “All Sizes” section, from any pool, from the author Flickr page…) it will always point back to the author Flickr page. Also, as a bonus, proper license display is provided in the Flickr pictures. That’s all thanks to their wonderful API!

  • Source of the image in all RSS feeds

    Now all images in feeds included a “via” link, so you can easily go to the original source where the image was found from your RSS reader.

  • Real time feeds

    Maybe at some point you noticed that the feed for your account wasn’t completely fresh. That was a normal issue, because feeds got updated twice per hour to avoid huge load on the server. But hey, we’re in the Happy Hour here, so forget about the “twice per hour” thing, from now on your user feed will always be as fresh as it gets!

  • Permalinks to images meets duplicate hunting

    Remember the duplicate hunting? As an image got bookmarked in visualizeus, usually it got spread around blogs, tumblrs, twitters, friendfeed streams… Ugly things happened when this image got suddenly merged with its older and more popular sister because of the duplicate hunting. You can imagine: Not Found links, broken images and so on. That’s why the permalinks are truly permalinks in visualizeus! No matter what duplicates are merged or when, you will always been able to get back to the image. It’s kind of a “behind the curtain” thing, but without it, the mess would be horrible ;)

  • Difference between “liked” and “found”

    Now there’s a small and sutile difference if you found the image around internet, or whether you like it from another visualizeus user. It’s a small difference, but hey, some times the small differences make the change. Probably I will add more things based on this feature, like browsing only your liked pictures, and so on.

Primeras (y no muy positivas) cifras de venta de XBOX Live Community Games [Actualizado]

[ Blog: Beyond - Evolution Dreams Studio ]
2009:03:31 10:10:31

Vamos a abrir la entrada con una afirmación demoledora: hoy por hoy no hay mercado ni existe negocio en XBOX Live Community Games.

No obstante al ser una plataforma muy joven y con mucho margen en cuanto a mejora de exposición, todavía hay lugar para la esperanza.

Aun nos encontramos en la fase de recopilación de datos, pero después de ver las cifras de un par de docenas de juegos, algunos top 10 incluidos, la realidad es bastante dura más allá de las bajas ventas de nuestro juego, Planet Delta.

Vamos a esperar a tener un poco más de información para escribir una entrada en formato análisis de la situación actual de la plataforma de Microsoft e intentar hacer un esbozo de lo que nos podemos encontrar a corto y medio plazo.

Las cifras no invitan al optimismo, pero la situación podría dar un vuelco si Microsoft decide hacer un pequeño esfuerzo en dar a conocer su plataforma de distribución B, Community Games.

En algunas publicaciones on-line han comenzado la recopilación, publicación y análisis de las cifras (gracias Ager por el aviso, os dejo las más interesantes:

Introduciendo la suspensión de la incredulidad II

[ Blog: Isilion - Ludosofía ]
2009:03:31 02:02:00

El fenómeno de la suspensión de la incredulidad se produce cuando el autor de una obra presenta al espectador unas premisas que éste debe aceptar para poder obtener la experiencia que el autor pretende transmitir a través de su historia.

En el primer post sobre la suspensión de la incredulidad se introdujo la materia. En este, tratamos de identificar algunas formas de presentación de premisas y así como su impacto en la experiencia final del espectador.

Presentación de premisas

Si las premisas - las situaciones y elementos frente a los cuales tenemos que suspender nuestra incredulidad - se presentan inadecuadamente, el espectador podría experimentar una sensación de falsedad. Por ejemplo, imaginemos que al final de una película el protagonista, cercado por sus enemigos sin posible escapatoria, echa a volar y escapa, solucionando así sus problemas. Si no nos han explicado antes por qué este personaje puede volar, posiblemente el espectador quede decepcionado ante lo que parece una solución tristemente fácil.

Sin embargo, si anteriormente en la historia nos han explicado que sólo los nativos del planeta X, extraterrestres que se mezclan con los humanos, pueden volar, de repente este final se convierte en una interesante revelación: ¡el protagonista no es humano, sino un extraterrestre del planeta X! Ahora lo que era una solución poco elegante ha pasado a ser un giro de guión que da paso a múltiples posibilidades (¿una segunda parte de la película?) y demuestra que aún desconocemos parte de la historia que ya creíamos conocer por completo.

Las premisas se pueden presentar antes, durante o después de que sucedan los hechos frente a los cuales debemos suspender nuestra incredulidad. A continuación se sugieren algunas formas de presentación y se tratan de identificar sus ventajas y desventajas. Estas sugerencias se exponen a modo de reflexión y no deben ser interpretadas como un análisis en caso alguno.

“Así son las cosas, y punto”

Este método consiste en presentar las premisas sin justificarlas a medida que van apareciendo en la historia. Por ejemplo: “Entonces apareció un kender. Los kender eran una raza de semihumanos de corta estatura conocidos por su notable inclinación al latrocinio”.

Es la manera más sencilla y directa de presentar las premisas, porque no requiere justificación, al contrario que las que se describen más adelante. Resulta especialmente útil cuando la trama se desarrolla en una realidad paralela, desconocida para el receptor, donde justificar cada explicación podría parecer forzado y costaría mucho esfuerzo por parte del autor.

Sin embargo, abusar de este método puede suscitar una sensación de imposición en el espectador, como si el autor le dijera “Las cosas son así y punto”. También puede ser percibido como una solución fácil, en la que el autor busca evitar esforzarse. Además, al no provenir la información de ningún lugar concreto, se puede romper la sensación de inmersión y coherencia del escenario de la historia.

“Echa un vistazo a tu alrededor”

En Half life 2 no se nos pone en situación al principio de la historia. Aparecemos en un tren y vamos entendiendo que estamos en una especie de ciudad-prisión en un futuro indeterminado. Asumimos que al menos un parte de la sociedad vive bajo la opresión de un mando militar y que se ha descubierto vida extraterrestre.

Como este método exige que el espectador esté más atento, al acaparar su atención consigue sumergirle mejor en la historia. Sin embargo, hay que usarlo con mesura, porque si el espectador no desea hacer ese esfuerzo podría cansarse y abandonar la historia.

“Escucha, novato”

Al usar esta técnica, al principio de la historia se introduce a un personaje que, como el espectador, desconoce las particularidades del entorno donde se desarrolla la historia. Paulatinamente, un personaje más experimentado va explicando sobre la marcha estas particularidades al novato, con lo cual se las comunica al espectador de una forma justificada. El novato puede ser representado de numerosas maneras: un personaje inexperto en un área concreta, alguien muy joven, una persona que sufra amnesia, etc.

Alternativamente, es factible omitir el novato haciendo que los personajes se recuerden los hechos entre ellos. Por ejemplo: “Escucha, ya sabemos que los furianos sois capaces de aguantar días corriendo sin parar ni descansar, pero ni siquiera tú podrías aguantar ese viaje”.

La ventaja de este método es que se gana en inmersión, ya que la información proviene de un lugar coherente, pero el flujo de información que se puede transmitir a través de ella es limitado.

“Ya te lo dije”

La aproximación “Ya te lo dije” o Foreshadowing, como formalmente se denomina, trata de dejar pistas que no sean evidentes a lo largo de la historia. Cuando se resuelve el elemento de la trama que el autor ha tratado de ocultar, el espectador se sorprende, pero una vez recuerda las pistas, encuentra que la resolución es lógica. El objetivo es producir sorpresa en el espectador mediante una sensación de “La solución ha estado todo el tiempo delante de mi, pero no me he dado cuenta hasta el final”.

Esta técnica es de las más difíciles de usar, pero también es de las que suelen producir mayor satisfacción en el espectador.

¿Y a ti cómo te gusta?

Como decía al principio, la intención general de esta reflexión no es proveer un dogma o método, sino animar al autor de la historia a intentar discernir de qué modo podría presentar las premisas para apoyar en el proceso a la coherencia y a la accesibilidad de su historia, de modo que el resultado sea más sólido, más atractivo y más sencilla de entender.

Estas son algunas de las aproximaciones que uso al escribir una historia, pero no son en absoluto casos formales ni tampoco los únicos que existen.

¿Qué técnicas utilizas tú?

Posted in Narrativa Tagged: espectador, Incredulidad, Inmersión, Suspensión, técnicas narrativas

Kukoo Kitchen a la venta en IWIN.com

[ Blog: Josepho - Blog personal de Josepho ]
2009:03:31 00:14:00

Los videosjuegos ya son considerados industria cultural en España

[ Blog: RobiHm - Indómita ]
2009:03:30 14:46:28

Cito textualmente:

Los videojuegos ya son considerados una industria cultural en España.

De esta forma, la industria del videojuego deja de estar infravalorada con respecto a otras como el cine, la música o la literatura, y las empresas y nuevos emprendedores podrán beneficiarse de las ayudas a este sector, que tendrán como principal objetivo la promoción, ayudas en financiación e internacionalización de los desarrollos españoles.

Fuente : www.noticiasjuegos.com

Grandes noticias sin duda alguna, ahora solamente falta que las palabras y el reconocimiento no se lo lleve el aire.

Taaaxi

[ Blog: Likuid - www.likuids.com ]
2009:03:30 11:59:00
Actualmente esta foto expresa fielmente mi nuevo día a día con el cambio de trabajo... 
Los días pasan rápido...

De mi viaje a New York del año pasado.