Publicado en 2011

¿Americanización?

Vivimos en un mundo made in America. Tan americano que nos olvidamos que en America existen tres subcontinentes, con 35 países en total. Pero el mundo se empeña en definir a los EEUU como América. Celebramos Halloween, comemos en McDonald’s, vemos películas de Hollywood (en las que aprendemos que si hay una invasión extraterrestre, es mejor no vivir allí) y casi todas las series de éxito son americanas. Aquí es donde llega la pregunta, ¿americanización o simple globalización?

Es decir, nos están invadiendo los aspectos americanos o simplemente adoptamos lo que nos parece más interesante de toda la cantidad de información que va recogiendo nuestro pequeño amigo rosado, también llamado cerebro. Si es ese segundo caso, ¿por qué no captamos tanto costumbres de otros países?

Por tanto, ¿convergemos hacia una cultura americana o una cultura global? Yo más bien pienso lo segundo. Aunque es cierto que la cultura americana juega un papel bastante grande, basicamente por ser la potencia mundial en este momento, el momento de la explosión de la información. Pero podría haber sido otro país si hubiera sucedido en otra época.

Ahora, que podemos saber hasta que ha desayunado alguien en la otra punta del mundo gracias a cosas como Twitter, ¿vamos hacia un planeta con una misma cultura en común? Esperemos que no, sería demasiado aburrido y monótono. Lo que sí espero es un lenguaje mundial (el inglés ya lo está consiguiendo) que entendamos todos, pero que no se hable sólo ese, y un planeta sin fronteras. En este último punto seguimos anclados en el medievo (tenía que soltar esta frase, es genial) y es preocupante..

Para analizarlo mejor, he hecho un gráfico con el país de origen de los grupos de música que escucho. Vamos a ver la presencia de las barras y estrellas.

Clic para ampliar

Como veis, EEUU está en el primer puesto, pero la población de Finlandia y Suecia (segundo y tercer puesto) se queda en 5 y 9 millones de personas, respectivamente. Si lo comparamos con los 300 millones de EEUU, entonces no queda tan arriba.

También te puede interesar...

Tags , , ,

Muere Steve Jobs

Se lo lleva el cancer de páncreas a los 56 años. Descanse en paz.

El recordar que estaré muerto pronto es la herramienta más importante que he encontrado para ayudarme a tomar las grandes decisiones en la vida. Recordar que uno va a morir es la mejor manera que conozco para evitar la trampa de pensar que hay algo por perder. Ya se está indefenso. No hay razón alguna para no seguir los consejos del corazón

Steve Jobs, 1955 – 2011

También te puede interesar...

Tags , , , ,

El reto de la rana

Kaeru Jump, del japonés kaeru (蛙, rana), es un pequeño juego en flash de inteligencia (o también de probar, probar y probar). El objetivo del juego es que la rana protagonista llegue a cada una de las piedras del escenario. A cada salto, la piedra anterior se hunde en el agua. Los saltos son sólo en ángulos rectos y no se puede saltar hacia atrás.

El reto son diez niveles generados aleatoriamente, a cada cual más difícil. Os reto a ver cuánto tiempo tardáis en acabarlos todos, sin hacer trampas claro.

Solución

Si no consiguieseis acabar todos los niveles, no os desesperéis ni lancéis el teclado por la ventana. Existe un método para resolver este tipo de problemas. En programación se le llama backtracking. Aunque por el nombre parezca algo guapo, no es más que ir probando combinaciones hasta encontrar las que resuelvan el problema (en nuestro caso paramos al encontrar la primera que lo resuelva). Son muchas combinaciones, pero mientras las haga el ordenador a nosotros nos da igual, ¿no?

Para hacerlo funcionar, sólo tenéis que decir la posición inicial, la dirección a la que mira la rana y marcar los checkbox del mapa del nivel, si está marcado es que en el mapa hay una piedra en esa posición. ¡Si leéis desde el lector RSS es probable que no veáis nada!

Fila inicial: Columna inicial: Dirección inicial:

El código

Os pongo la función para calcular la solución en javascript. Se puede comprimir más el código, pero así se entiende mejor. Para llamarla, necesitáis la fila y la columna inicial(f y c), una matriz de booleanos para el tablero donde un true indica que hay una piedra en esa posición, un Array vacío para guardar el camino en la recursividad y un string direccion para la dirección inicial, que puede ser “arriba”, “derecha”, “abajo” o “izquierda”. El resultado es un Array con dos posiciones: la primera indica si hay solución y la segunda indica el camino.

function resolver(f, c, tablero, restantes, camino, direccion) {
    if(restantes == 1) return new Array(true, camino);
    var resuelto = false;
   
    // Miro todas las direcciones desde la posición actual
    // Arriba
    if(direccion != "abajo") {
        var hay = false;
        for(fila = f - 1; !hay && fila >= 0; --fila) {
            if(tablero[fila][c]) {
                hay = true;
                tablero[f][c] = false;
                --restantes;
                camino.push("Arriba");
                resultado = resolver(fila, c, tablero, restantes, camino, "arriba");
                if(resultado[0]) return new Array(true, camino);
                else {
                    ++restantes;
                    tablero[f][c] = true;
                    camino.pop();
                }
            }
        }
    }
   
    // Derecha
    if(direccion != "izquierda") {
        var hay = false;
        for(columna= c + 1; !hay && columna < columnas; ++columna) {
            if(tablero[f][columna]) {
                hay = true;
                tablero[f][c] = false;
                --restantes;
                camino.push("Derecha");
                resultado = resolver(f, columna, tablero, restantes, camino, "derecha");
                if(resultado[0]) return new Array(true, camino);
                else {
                    ++restantes;
                    tablero[f][c] = true;
                    camino.pop();
                }
            }
        }
    }
   
    // Abajo
    if(direccion != "arriba") {
        var hay = false;;
        for(fila = f + 1; !hay && fila < filas; ++fila) {
            if(tablero[fila][c]) {
                hay = true;
                tablero[f][c] = false;
                --restantes;
                camino.push("Abajo");
                resultado = resolver(fila, c, tablero, restantes, camino, "abajo");
                if(resultado[0]) return new Array(true, camino);
                else {
                    ++restantes;
                    tablero[f][c] = true;
                    camino.pop();
                }
            }
        }
    }
   
    // Izquierda
    if(direccion != "derecha") {
        var hay = false;;
        for(columna= c - 1; !hay && columna >= 0; --columna) {
            if(tablero[f][columna]) {
                hay = true;
                tablero[f][c] = false;
                --restantes;
                camino.push("Izquierda");
                resultado = resolver(f, columna, tablero, restantes, camino, "izquierda");
                if(resultado[0]) return new Array(true, camino);
                else {
                    ++restantes;
                    tablero[f][c] = true;
                    camino.pop();
                }
            }
        }
    }
    return new Array(false);
}

También te puede interesar...

Tags , , , ,

El conjunto de Mandelbrot

Un fractal, como muchos sabréis, es una estructura que se repite a diferentes escalas. El fractal más conocido es el de Mandelbrot, estudiado por el matemático polaco, ya fallecido, Benoît Mandelbrot, recientemente fallecido, en la década de los 70 del siglo pasado. Mandelbrot pensaba que lo que él estaba estudiando no interesaba a nadie, ya que todos los demás matemáticos se centraban en estructuras “suaves y regulares”. Para definir estas nuevas estructuras acudió a un diccionario de latín, hasta encontrar un adjetivo que describía las piezas irregulares de una piedra que ha sido lanzada: «fractus, fracta, fractum».

Los fractales no son sólo cosa de las matemáticas, sino que aparecen en muchos lugares de la naturaleza, como en las hojas de los helechos, en las ramas de los árboles, en el brécol, etc. Un caso extraordinario de fractal lo podemos encontrar en el Romanescu, una mezcla de brécol y coliflor.

Romanescu, un fractal en la naturaleza Matemáticamente, el conjunto de Mandelbrot se define como:
  • Tenemos c, un número complejo cualquiera.
  • Tenemos la sucesión por inducción siguiente \left \{  \begin{matrix}  z_0 & = & 0 \qquad \ & \qquad \\  z_{n+1} & = & z_n^2 + c &  \end{matrix} \right.

Si la sucesión queda acotada, podemos decir que el punto c es parte del conjunto.

Pero dejemos las matemáticas y vamos a ver como se ve el conjunto gráficamente. Lo he generado utilizando jQuery y HTML5. Podéis aumentarlo para ver la autosimilitud haciendo clic encima. Es probable que no lo podáis leer desde el lector RSS o utilizando un navegador antiguo.

Tu navegador no es compatible con Canvas, deberías utilizar uno más moderno.

Para acabar, la entrevista de Benoît en el programa Redes

Como siempre, dejo el código para los programadores curiosos

// Clase timer para contar el tiempo de ejecucion
var timer = {
   time: 0,
   now: function(){ return (new Date()).getTime(); },
   start: function(){ this.time = this.now(); },
   since: function(){ return this.now()-this.time; }
}

// Variables globales
// Variables del tamaño de Canvas
var width = 500;
var height = 500;
// Precisión de los pixels (1 es lo más preciso)
var pixels = 1;

// Coordenadas iniciales
var xmin = -2;
var xmax = 1;
var ymin = -1.5;
var ymax = 1.5;

// Stride
var stridex = ((xmax - xmin) / height) * pixels;
var stridey = ((ymax - ymin) / width) * pixels;

// Aumentos
var zoom = 4;
var aumentos = 0;

// Iteraciones
var maxIt = 200;

function render() {
   
    timer.start();
   
    // Cargamos canvas
    // Obtenemos el objeto Canvas
    var canvas = document.getElementById('canvas');
    var context = false;
    // Obtenemos el contexto 2d
    if(canvas && canvas.getContext('2d')) {
        context = canvas.getContext('2d');
    }
    if(context){
        // Si existe empezamos a dibujar
        // Cambiamos el tamaño, por si este ha cambiado
        canvas.width = width;
        canvas.height = height;

        for(var x0 = xmin, i = 0; i < height; i += pixels, x0 += stridex){
            for(var y0 = ymin, j = 0; j < width; j += pixels, y0 += stridey) {
                var x = 0;
                var y = 0;
                var it;
                for(it = 0; x*x + y*y < 4 && it < maxIt; ++it) {
                    var xtemp = x*x - y*y + x0;
                    y = 2*x*y + y0;
                    x = xtemp;
                }
                if(it >= maxIt) {
                    context.fillStyle = "rgba(0,0,0,1)";
                    context.fillRect(i,j,pixels,pixels);
                }
                else {                 
                    context.fillStyle = "rgba(0,0,0," + it / maxIt + ")";
                    context.fillRect(i,j,pixels,pixels);
                }
            }
        }
    }

    return timer.since();
}

$(document).ready(function() {
   
    var since = render();
    $("#mandInfo").append("Renderizado en " + since + " ms</br>");
   
    $("#canvas").click(function(e){
        // Obtengo las coordenadas del clic dentro de canvas
        var x = Math.floor((e.pageX-$("#canvas").offset().left));
        var y = Math.floor((e.pageY-$("#canvas").offset().top));
        // Las transformo a las coordenadas actuales
        var realx = xmin + x * stridex;
        var realy = ymin + y * stridey;
       
        // Pongo los nuevos límites de las coordenadas
        var temp_xmin = xmin;
        var temp_xmax = xmax;
        var temp_ymin = ymin;
        var temp_ymax = ymax;
        xmin = realx - (temp_xmax - temp_xmin) / zoom;
        xmax = realx + (temp_xmax - temp_xmin) / zoom;
        ymin = realy - (temp_ymax - temp_ymin) / zoom;
        ymax = realy + (temp_ymax - temp_ymin) / zoom;
       
        // Recalculo los Strides
        stridex = ((xmax - xmin) / height) * pixels;
        stridey = ((ymax - ymin) / width) * pixels;
        ++aumentos;
        since = render();
        $("#mandInfo").append("Aumentado en " + since + " ms</br>");
    });
});
Para que funcione, en el HTML hay que importar la librería jQuery. Después necesitamos el canvas de HTML5: <canvas id="canvas" width="500" height="500"></canvas> (tiene que tener identificador canvas). Por último y opcionalmente, un div donde se muestra el tiempo de renderizado: <div id = "mandInfo"></div>.

También te puede interesar...

Tags , , , , ,

Las montañas de la Luna

Aunque desde aquí abajo parezca que la Luna es una pelotita redonda con algún que otro cráter, su superficie es muy irregular y tiene diferencias de altura muy grandes. Como es lógico, no conocemos tan bien su superficie comparado con la Tierra, pero la sonda LRO identificó hace unos meses el punto más elevado de la Luna. Este punto está a, nada más y nada menos, 10786 metros por encima del radio medio de la Luna. Esto es, 1938 metros más alto que el Everest (8848 metros por encima del mar).

El punto más alto de la Luna

Ahí está. Visto desde arriba sigue pareciendo una gran llanura “a nivel del mar”. Los que tengáis telescopio, no os esforcéis en buscarlo, ya que se encuentrafuera del 59% de la Luna que podemos ver desde la Tierra, en la cara oculta.

De regalo: Un vídeo donde se ve la Luna desde la Tierra en un time lapse de un año entero. Podéis ver como hace algunos pequeños giros (libraciones) pero no llega a girar del todo, por eso sólo vemos ese 59%. También vemos como algunas veces aumenta de tamaño, por acercarse más a la Tierra.

Vía y más información en Eureka

También te puede interesar...

Tags , ,