11.22.2007

Jugando con fractales

Hacía tiempo que tenía ganas de probar a renderizar un fractal y leyendo ayer en la wikipedia acerca de Mandelbrot vi que el código era muy simple. Después de todo es calcular si una función diverge tras una serie de iteraciones por cada pixel.

He hecho un pequeño código en python para hacer pruebecillas, la verdad que con muy poco código se obtienen imágenes bastante bonitas, de hecho estoy pensando en imprimir alguna y ponerla de poster. Se generan imágenes de este pelo:





El código, necesita PIL y python 2.4 y he dejado algunas funciones para generar animaciones (con un par de hilos para -intentar- aprovechar mi dual core) y 3 ó 4 test de resultados chulos. El código generado HTML a partir del .py usando, como no, vim, la putada es que blogger te mete saltos de linea y hay que quitar los tags br, con un simple replace basta.


import Image;
from threading import Thread;
SIZEX = 1024;
SIZEY = int(SIZEX*2.0/3.0);
NFRAMES = 50;
ZOOMSTEP = 1.0;

def get_color(xx,yy):
  x = x0 = xx;
  y = y0 = yy;
  colour = 0;
  iteration = 0
  maxiteration = 600

  while ( x*x + y*y < 4  and  iteration < maxiteration ):
    tx = x*x - y*y + x0;
    ty = 2*x*y + y0;
    x = tx;
    y = ty;
    iteration = iteration + 1;
  

  colour = float(iteration)/maxiteration;
 
  return colour;

class Palete:
    def __init__(self):
        self._colors = []
        pass;
    def addColor(self,color, t):
        self._colors.append((color,t));
    def getColor(self,t):
        #search for color
        i = 0;
        while(self._colors[i][1] < t):
            i+=1;
        if(i == 0):
            return self._colors[0][0];
        else:
            t0 = self._colors[i-1][1];
            t1 = self._colors[i][1]
            dist = t1-t0;
            d = (t-t0)/dist;
            c0 = self._colors[i-1][0];
            c1 = self._colors[i][0];
            #print d
            color = (c0[0] + d*(c1[0] - c0[0]),
                     c0[1] + d*(c1[1] - c0[1]),
                     c0[2] + d*(c1[2] - c0[2]));
            return color;

            

def get_img_fractal(zoom, px,py, palete):
    im = Image.new("RGB", (SIZEX,SIZEY))
    for x in range(SIZEX):
     for y in range(SIZEY):
        t = get_color(px + zoom*(-2.0 + 3.0*(float(x)/SIZEX)) ,py + zoom*(-1.0 + 2.0*(float(y)/SIZEY)));
        color = palete.getColor(t);        
        im.putpixel((x,y),(255*color[0],255*color[1],255*color[2]));
    return im;
    

class Fractal(Thread):
   def __init__ (self,fractals):
      Thread.__init__(self)
      self._fractals = fractals;
   def run(self):
       p = Palete();
       p.addColor((1.0,1.0,1.0),0.0);
       p.addColor((1.0,0.0,0.0),0.5);
       p.addColor((1.0,1.0,1.0),1.0);
       for x in self._fractals:
           print "generating %.3d.png" % x[3];
           get_img_fractal(x[0],x[1],x[2],p).save("%.3d.png" % x[3]);


    

def animation():

    zoom = 1.0;
    it = 0;
    fractals = [];
    for n in range(NFRAMES):  
        fractals.append((zoom,-0.77028065155993652446, -0.11144667326007166574,n));
        zoom = zoom/2.0;
        it+=1;

    #launch two threadç
    f1 = Fractal(fractals[:len(fractals)/2]);
    f2 = Fractal(fractals[len(fractals)/2:-1]);

    f1.start();    
    f2.start();

def testColoring():
    p = Palete();
    p.addColor((1.0,1.0,1.0),0.0);
    p.addColor((1.0,0.0,0.0),0.5);
    p.addColor((1.0,1.0,1.0),1.0);
    get_img_fractal(0.4,-0.77028065155993652446, -0.11144667326007166574,p).save("coloring.png");

def testColoring2():
    p = Palete();
    p.addColor((0.0,0.0,0.0),0.0);
    p.addColor((145.0/255.0,165.0/255.0,192.0/255.0),0.5);
    p.addColor((1.0,1.0,1.0),1.0);

    get_img_fractal(0.0001,-0.77028065155993652446, -0.11144667326007166574,p).save("coloring2.png");

def testColoring3():
    p = Palete();
    p.addColor((1.0,1.0,1.0),0.0);
    p.addColor((145.0/255.0,165.0/255.0,192.0/255.0),0.5);
    p.addColor((0.0,125.0/255.0,244.0/255.0),1.0);

    get_img_fractal(0.0001,-0.77028065155993652446, -0.11144667326007166574,p).save("coloring3.png");

def testColoring4():
    p = Palete();
    p.addColor((0.0,0.0,0.0),0.0);
    p.addColor((145.0/255.0,165.0/255.0,192.0/255.0),0.5);
    p.addColor((1.0,1.0,1.0),1.0);

    get_img_fractal(0.00001,-0.26605838294940658357,-0.65123057178473777796,p).save("coloring4.png");

#testColoring2();
#testColoring3();
testColoring4();
#animation();

11.19.2007

reunión del DOID 17/11/07

El pasado sábado estuve en una de las reuniones que DOID organiza para presentarse. Fue en Madrid, en la sede del medialab, un sitio muy cool, con puertas grandes, todos con mac y gafas de pasta.

En el sitio de congregan para realizar una serie de talleres sobre temas de visualización, la verdad es que los temas que tratan parecen interesantes, precisamente el sábado estaba el creador de processing y unos meses atrás estuvo el proyecto levelhead, sí, el del cubo con webcam.

Al grano, Nae empezó comentando qué era DOID que se había hecho hasta ahora, que empresas lo formaban (tirón de orejas por no incluir unkasoft) y cual eran las directrices.

La exposición pasó a ser un debate en el que cada uno pedía lo que le salía de las narices poco más o menos, unos se quejaban de lo mal que se trata a los empleados, otros de la fama de frikis, las empresas se defendían incluso, ojo al dato, diciendo que se pagaba bien y que se pagaban las horas extras, sí, habeis leído bien. Fue de lo mejor que escuché en ese rato, una empresa que se dedica a temas relacionados con ingeniería (no me gusta la palabra informática) que paga horas extras, eso me impactó realmente. En ese poco tiempo se pidió un servicio de servidores de trac y svn, formación, difusión, apoyo a amateurs... de todo un poco.. ah! y se presentaron dos juegos casuales con muy buena pinta.

Hubo cosas curiosas, como por ejemplo el momento en el que entra juan tamargo, jefe de proyectos de pyro, entonces Nae paró la exposición y le preguntó acerca de un tema interesante, la falta de diseñadores y gestores de proyecto... el fulano le dijo que no venía representando a pyro, respondió brevemente y se piró. Qué momentazo.

En conclusión, hay pocos profesionales, no hay dinero en esta nuestra industria, la gente se va a otros sitios donde se trabaja menos, con menos presión, pensando menos y cobrando más... todas las nuevas empresas que empiezan lo hacen programando para móvil y mucha gente parece que se pasa a nintendo DS.

Una foto del evento tomada de la cuenta de flickr de medialab, donde se pueden encontrar más fotos del sábado.



Enhorabuena a Nae por saber tirar del carro.

11.13.2007

visión de Android desde el punto de vista de desarrollador

Después de ver el SDk de Android puedo decir, desde mi punto de vista de desarrollador para móvil (o casi :P) es lo siguiente:

- google no se ha mojado nada: todo cerrado, ni código fuente de la VM, ni especificación del formato del bytecode ni API para C++. Ya solo esto es muy triste. Creo que hace unas horas era lo más preguntado en el grupo de android. Ahora está la fiebre de "Android programmer wanted!!". Por suerte ya ha gente haciendo hacks para correr aplicaciones compiladas en C.

- todo basado en java: entiendo que hayan tomado este lenguaje porque un mono puede hacerse 5 midlets en media hora, pero tratándose de google me resulta extraño. Seguramente por no hacer cambiar a los desarrolladores para móvil de lenguaje y herramientas. Sinceramente, esperaba C++ con bindings para python.

- Si funciona puede estar muy bien pero si no funciona se quedará en la misma mierda que J2ME pero encima no soportado por todos los fabricantes. Lo dicho, si tiene éxito lo bueno es que probablemente no caigan en los mismo errores que ya se han comentido con el tema de la fragmentación.

- No hay ningún móvil soportado... el emulador es muy bonito, pero ya sabemos que son como la noche y el día

- Por otro lado hay cosas buenas, muy al estilo google, como las diferentes librerías que incorpora, entre ellas OpenGLES (¿quien dijo que OpenGL estaba muerto?), Me alegra ver que han tirado por esta especificación, tengo ya ganas de ver lo que se puede hacer en dispositivos potentes como espero que sean los que corran Android.

PD: sí, la realidad es que java no me gusta nada, me parece un lenguaje que no tiene todo lo bueno de C++ ni todo lo bueno de lenguajes más modernos como python e incluso C#.

11.10.2007

Crónica (destructiva) del Motodev summit

Seguramente en los próximos días pondremos en el blog de Unkasoft una crónica un poco más suave de lo que pasó allí. Aquí empieza la mía:


Para empezar diré que motodev summit (lietaralment es cumbre) es una serie de charlas sobre la tecnología de Motorola sobre móviles y alrededores. Uno de los eventos era en londres, en un hotel bastante chulo (por fuera) en la zona de Barbican. La verdad que el evento estaba muy muy bien montado, muchas charlas, comida para todos, pantallas indicando lo que había, una zona donde empresas mostraban sus productos (comento más adelante el tema). Como digo, todo bien montado, salvo que en el lunch este de las narices no había mesas para todos (se comía de pie) y una vez terminabas no había sitio para dejar los platos...

Llegamos tarde gracias a british airways, total que nor perdimos las primeras charlas y la primera la pillamos empezada, una sobre un futuro API (JSR 293)para localización. La charla fue muy buena, comentó cosas muy interesantes.

Pero lo bueno empezó a terminar cuando entramos a la charla de optimización de Midlets para J2ME. No quiero poner a caldo al fulano que la impartío, un tal Gerard Palma, pero a los 3 minutos los que estaban viendo la conferencia se rieron de él en toda la cara, se suponía que este tío es experto en JVM... no tenía ni puta idea de optimizar ni de absolutamente nada. Hubo carcajadas en la sesión, sobretodo cuando uno le comentó algo acerca de por qué el motorola V3 (para el que no lo sepa es el peor móvil creado por la raza humana) iba tan como el culo. Patético.

Ya el colmo fue cuando entramos en la charla del sistema de desarrollo que plantea Motorola para sus móviles... una burda copia de EclipseME (un pluggin para eclipse para desarrollo en móvil de forma simple) nos hizo la presentación una tía que era el primer día que cogía eclipse, es que nos enseñó a que tenía autocompletion, lo que tiene uno que ver... no sabía luego lanzar la midlet, etc, lamentable.

Para poner la guinda casi perdemos el enlace en barcelona gracias, nuevamente a british airways, cuyas personas de seguridad me cachearon, por lo menos lo hicieron con cierta gracia, porque el fulano de 2 metros me dijo "ohhh, your lucky day!".

En resumen, si el tal palma este lleva 7 años y es consultor estratégico yo debería ser, como mínimo, director técnico de google. La conclusión es que, aunque no lo parezca, en españa estamos a un buen nivel técnico, sobretodo si nos medimos con la gente que había allí escuchando las charlas, que sabían rato más que los ponentes.

Estoy seguro que aquí podemos organizar unos talleres de optimización de midlets mucho más interesantes...

11.04.2007

La demoscene llega a pixar

Un grupo de sceners se han cogido las maletas y se han ido a enseñar algunas de las maravillas que se producen dentro del mundillo. Todos los sitios que visitan, entre ellos nvidia y pixar, quedan reflejados en el blog que han abierto.

Para no llegar con las manos vacías han versionado en 4k la típica escena del flexo de pixar.

Dejo el video de youtube, pero merece la pena bajarse el ejecutable y sobretodo el zip para leerse el "readme" y ver que el coder es un español.





Por youtube se pueden encontrar más versiones, algunas muy divertidas, pero seguro que ninguna en 4kb.