Este tio es un hacha, mensaje recibido esta manana en el trabajo. (sic)
"Un cierto numero de personas hackean las maquinas de cafe para evitar pagar. Independientemente del precio del cafe en si mismo, esto provoca intervenciones tecnicas que son facturadas a tocateja. Ya se que concierne a un grupo reducidisimo de gente, pero si los pillo, la sancion sera dura.
JC"
Este tipejo es el mismo gilipollas que:
1. se compra un porsche el mismo dia que echa a 20 tios a la puta calle.
2. nos hace venir a buscar los ordenadores y cuadernos a su despacho cada vez que nos los olvidamos sin bloquear para echarnos la bronca.
3. nos envia mensajes diciendo que los rumores de desmembramiento son falsos minutos despues de que el CTO lo confirme.
4. quiso ponerme un parte de comportamiento por que decia que los espanoles hablabamos muy fuerte en la cafeteria y que molestaba a los clientes.
En lugar de desperdiciar su tiempo, y el dinero de la empresa, en tocar activamente los cojones del personal, podria tratar de hacer su trabajo y organizar el ciclo de desarrollo para evitar los problemas que han hecho que la empresa pierda un 50% de su parte de mercado, curisamente desde que el se ocupa de la division.
miércoles, 20 de febrero de 2008
Pregunta de teoría de volumenes
Cuanta mierda puede acumular un apartamento después de 6 meses cerrado?
Respuesta:
Mucha, MUCHISIMA.
joder, me cago en la madre que parió a las mudanzas.
jueves, 14 de febrero de 2008
lunes, 11 de febrero de 2008
Despedida
Metodo nipon para despedir a un espanol?
Llevarle a restaurante espanol.... pero vaya restaurante.

Nipones con patillas postizas enoooooormes en playback al ritmo de ketama.
Impagable.
Cagondios... :P Si en el fondo los quiero ^^
Llevarle a restaurante espanol.... pero vaya restaurante.
Nipones con patillas postizas enoooooormes en playback al ritmo de ketama.
Impagable.
Cagondios... :P Si en el fondo los quiero ^^
viernes, 8 de febrero de 2008
Just In Time Compilation (JIT)
Hoy voy a hacer un pequeno comentario sobre una tecnica de programacion muy interesante para entornos de alto rendimiento embebidos y es lo que se llama JIT, o como podria decirse en espanol "Compilacion en tiempo real".
EXPLICACION:
El rendimiento de un procesador puede ser calculado por el flujo maximo de datos que genera por ciclo de reloj, sin embargo, cuando se pasa a la implementacion de un determinado algoritmo nos podemos encontrar que generamos un flujo bastante inferior al teorico. Esto puede ocurrir por:
1) Uso sub-optimo de la vectorizacion (Ejemplo): Un procesador de 64 bits puede hacer 8 sumas de 8 bits en paralelo, si queremos aplicar un filtro sobre una componente de un pixel definido como:

La inicializacion es un poco mas compleja, pero basicamente hace lo mismo pero con 3 operaciones cada 8 pixels contra 16 por 8 pixels.
2) Por stalls en la pipeline (Ejemplo): Debidos a cache miss (Instrucciones o Datos), o la concatenacion de instrucciones que utilizan las mismas unidades aritmeticas.
3) Por ruptura de la pipeline debido a un salto (Ejemplo): Un if (...) no bien predicho.
En concreto, la programacion de tipo JIT, tiene como objetivo eliminar (o reducir considerablemente) los stalls en la pipeline debidos a instruction miss, y las rupturas de pipeline debidas a salto.
COMO:
La programacion consiste a crear un pequeno buffer de instrucciones en tiempo real, para ello tenemos que crearnos un minicompilador interno y segun los datos de entrada generamos unas instrucciones en codigo maquina (bytecode) adaptadas a nuestro algoritmo.
Imaginemos la interpolacion lineal:
El algoritmo de base es:

Para general el codigo git equivalente supongamos:
a) el tamano de la linea de la data cache es de 32 bytes.
b) y las siguientes funciones
void generate_ldrb_r_r_off(uint32_t * jitcmdbuf, int rd, int ra, int off);
genera el codigo fuente de una instruccion que guarda en el registro rd el byte contenido en la direccion guardada
en [ra] + offset y lo anade a jitcmdbuf
void generate_pld_r_off(uint32_t * jitcmdbuf, int ra, int off);
este genera un preload en cache de los 32 bytes a partir de la direccion calculada en [ra] + off
void generate_strb_r_r_off(uint32_t * jitcmdbuf, int rd, int ra);
idem a ldrb pero guardando
void generate_save(uint32_t *);void generate_rest(uint32_t *);
salvan y recuperan el estado de los registros y el program counter.
void generate_addb_r_r_r_asr(uint32_t * jitcmdbuf, int rd, int rm, int rs, int asr);
suma los datos de rm y rs en rd, y le aplica un shift de asr a la derecha al resultado.
Pues en jit primero preparariamos el codebufer.

Ahora "func" es un puntero a funcion de tipo void interpolate(uint8_t * in, uint8_t *out) que tiene las siguiente ventajas:
1) No hay rupturas de pipeline (los ifs son precalculados)
2) No hay calculos internos de los offsets
3) No hay data miss (los preloads son predichos)
Aun se podria mejorar, pero como proof of concept esta bien.
LIMITACIONES:
Pues esto es una pequena introduccion, algun dia metere esquemitas.
Para otros dias me dejo otras perlitas como:
A) Vectorizacion (introducida hoy)
B) Gestion buffer de salida de datos y de entrada.
C) Reordenacion de instrucciones.
CURIOSIDAD:
La compilacion JIT es muy similar a la técnica de injección de codigo de los buffer-overflow.
EXPLICACION:
El rendimiento de un procesador puede ser calculado por el flujo maximo de datos que genera por ciclo de reloj, sin embargo, cuando se pasa a la implementacion de un determinado algoritmo nos podemos encontrar que generamos un flujo bastante inferior al teorico. Esto puede ocurrir por:
1) Uso sub-optimo de la vectorizacion (Ejemplo): Un procesador de 64 bits puede hacer 8 sumas de 8 bits en paralelo, si queremos aplicar un filtro sobre una componente de un pixel definido como:
La inicializacion es un poco mas compleja, pero basicamente hace lo mismo pero con 3 operaciones cada 8 pixels contra 16 por 8 pixels.
2) Por stalls en la pipeline (Ejemplo): Debidos a cache miss (Instrucciones o Datos), o la concatenacion de instrucciones que utilizan las mismas unidades aritmeticas.
3) Por ruptura de la pipeline debido a un salto (Ejemplo): Un if (...) no bien predicho.
En concreto, la programacion de tipo JIT, tiene como objetivo eliminar (o reducir considerablemente) los stalls en la pipeline debidos a instruction miss, y las rupturas de pipeline debidas a salto.
COMO:
La programacion consiste a crear un pequeno buffer de instrucciones en tiempo real, para ello tenemos que crearnos un minicompilador interno y segun los datos de entrada generamos unas instrucciones en codigo maquina (bytecode) adaptadas a nuestro algoritmo.
Imaginemos la interpolacion lineal:
El algoritmo de base es:
Para general el codigo git equivalente supongamos:
a) el tamano de la linea de la data cache es de 32 bytes.
b) y las siguientes funciones
void generate_ldrb_r_r_off(uint32_t * jitcmdbuf, int rd, int ra, int off);
genera el codigo fuente de una instruccion que guarda en el registro rd el byte contenido en la direccion guardada
en [ra] + offset y lo anade a jitcmdbuf
void generate_pld_r_off(uint32_t * jitcmdbuf, int ra, int off);
este genera un preload en cache de los 32 bytes a partir de la direccion calculada en [ra] + off
void generate_strb_r_r_off(uint32_t * jitcmdbuf, int rd, int ra);
idem a ldrb pero guardando
void generate_save(uint32_t *);void generate_rest(uint32_t *);
salvan y recuperan el estado de los registros y el program counter.
void generate_addb_r_r_r_asr(uint32_t * jitcmdbuf, int rd, int rm, int rs, int asr);
suma los datos de rm y rs en rd, y le aplica un shift de asr a la derecha al resultado.
Pues en jit primero preparariamos el codebufer.
Ahora "func" es un puntero a funcion de tipo void interpolate(uint8_t * in, uint8_t *out) que tiene las siguiente ventajas:
1) No hay rupturas de pipeline (los ifs son precalculados)
2) No hay calculos internos de los offsets
3) No hay data miss (los preloads son predichos)
Aun se podria mejorar, pero como proof of concept esta bien.
LIMITACIONES:
- Generar las funciones toma tiempo, mejor utilizarlas en cosas repetitivas.
- Las funciones generan un numero grande de instrucciones, hay que tener cuidado que cada uno de nuestros monstruitos no supere el tamano de la cache de instrucciones.
- En arquitecturas conbit NX (No execute) hay que tener cuidado para que nuestra funcion sea ejecutable.
- Hay que comentar y documentar bien, si no es ilegible
Pues esto es una pequena introduccion, algun dia metere esquemitas.
Para otros dias me dejo otras perlitas como:
A) Vectorizacion (introducida hoy)
B) Gestion buffer de salida de datos y de entrada.
C) Reordenacion de instrucciones.
CURIOSIDAD:
La compilacion JIT es muy similar a la técnica de injección de codigo de los buffer-overflow.
jueves, 7 de febrero de 2008
Tetris!!!
A compilar con cualquier compilador C. Funciona sobre targets GNU o sobre win32 si anadis cygwin.
Controles:
"j" => izquierda
"l" => derecha
"k" => girar
"espacio" => abajo
"q" => salir
long h[4];t(){h[3]-=h[3]/3000;setitimer(0,h,0);}c,d,l,v[]={(int)t,0,2},w,s,I,K
=0,i=276,j,k,q[276],Q[276],*n=q,*m,x=17,f[]={7,-13,-12,1,8,-11,-12,-1,9,-1,1,
12,3,-13,-12,-1,12,-1,11,1,15,-1,13,1,18,-1,1,2,0,-12,-1,11,1,-12,1,13,10,-12,
1,12,11,-12,-1,1,2,-12,-1,12,13,-12,12,13,14,-11,-1,1,4,-13,-12,12,16,-11,-12,
12,17,-13,1,-1,5,-12,12,11,6,-12,12,24};u(){for(i=11;++i<264;)if((k=q[i])-Q[i]
){Q[i]=k;if(i-++I||i%12<1)printf("\033[%d;%dH",(I=i)/12,i%12*2+28);printf(
"\033[%dm "+(K-k?0:5),k);K=k;}Q[263]=c=getchar();}G(b){for(i=4;i--;)if(q[i?b+
n[i]:b])return 0;return 1;}g(b){for(i=4;i--;q[i?x+n[i]:x]=b);}main(C,V,a)char*
*V,*a;{h[3]=1000000/(l=C>1?atoi(V[1]):2);for(a=C>2?V[2]:"jkl pq";i;i--)*n++=i<
25||i%12<2?7:0;srand(getpid());system("stty cbreak -echo stop u");sigvec(14,v,
0);t();puts("\033[H\033[J");for(n=f+rand()%7*4;;g(7),u(),g(0)){if(c<0){if(G(x+
12))x+=12;else{g(7);++w;for(j=0;j<252;j=12*(j/12+1))for(;q[++j];)if(j%12==10){
for(;j%12;q[j--]=0);u();for(;--j;q[j+12]=q[j]);u();}n=f+rand()%7*4;G(x=17)||(c
=a[5]);}}if(c==*a)G(--x)||++x;if(c==a[1])n=f+4**(m=n),G(x)||(n=m);if(c==a[2])G
(++x)||--x;if(c==a[3])for(;G(x+12);++w)x+=12;if(c==a[4]||c==a[5]){s=sigblock(
8192);printf("\033[H\033[J\033[0m%d\n",w);if(c==a[5])break;for(j=264;j--;Q[j]=
0);while(getchar()-a[4]);puts("\033[H\033[J\033[7m");sigsetmask(s);}}d=popen(
"stty -cbreak echo stop \023;sort -mnr -o HI - HI;cat HI","w");fprintf(d,
"%4d from level %1d by %s\n",w,l,getlogin());pclose(d);}
Controles:
"j" => izquierda
"l" => derecha
"k" => girar
"espacio" => abajo
"q" => salir
long h[4];t(){h[3]-=h[3]/3000;setitimer(0,h,0);}c,d,l,v[]={(int)t,0,2},w,s,I,K
=0,i=276,j,k,q[276],Q[276],*n=q,*m,x=17,f[]={7,-13,-12,1,8,-11,-12,-1,9,-1,1,
12,3,-13,-12,-1,12,-1,11,1,15,-1,13,1,18,-1,1,2,0,-12,-1,11,1,-12,1,13,10,-12,
1,12,11,-12,-1,1,2,-12,-1,12,13,-12,12,13,14,-11,-1,1,4,-13,-12,12,16,-11,-12,
12,17,-13,1,-1,5,-12,12,11,6,-12,12,24};u(){for(i=11;++i<264;)if((k=q[i])-Q[i]
){Q[i]=k;if(i-++I||i%12<1)printf("\033[%d;%dH",(I=i)/12,i%12*2+28);printf(
"\033[%dm "+(K-k?0:5),k);K=k;}Q[263]=c=getchar();}G(b){for(i=4;i--;)if(q[i?b+
n[i]:b])return 0;return 1;}g(b){for(i=4;i--;q[i?x+n[i]:x]=b);}main(C,V,a)char*
*V,*a;{h[3]=1000000/(l=C>1?atoi(V[1]):2);for(a=C>2?V[2]:"jkl pq";i;i--)*n++=i<
25||i%12<2?7:0;srand(getpid());system("stty cbreak -echo stop u");sigvec(14,v,
0);t();puts("\033[H\033[J");for(n=f+rand()%7*4;;g(7),u(),g(0)){if(c<0){if(G(x+
12))x+=12;else{g(7);++w;for(j=0;j<252;j=12*(j/12+1))for(;q[++j];)if(j%12==10){
for(;j%12;q[j--]=0);u();for(;--j;q[j+12]=q[j]);u();}n=f+rand()%7*4;G(x=17)||(c
=a[5]);}}if(c==*a)G(--x)||++x;if(c==a[1])n=f+4**(m=n),G(x)||(n=m);if(c==a[2])G
(++x)||--x;if(c==a[3])for(;G(x+12);++w)x+=12;if(c==a[4]||c==a[5]){s=sigblock(
8192);printf("\033[H\033[J\033[0m%d\n",w);if(c==a[5])break;for(j=264;j--;Q[j]=
0);while(getchar()-a[4]);puts("\033[H\033[J\033[7m");sigsetmask(s);}}d=popen(
"stty -cbreak echo stop \023;sort -mnr -o HI - HI;cat HI","w");fprintf(d,
"%4d from level %1d by %s\n",w,l,getlogin());pclose(d);}
lunes, 4 de febrero de 2008
Tesbah 'Ala Kheir Ya Habet Eini
Un pequeño mensaje personal para cierta persona que, aunque ahora sea imposible, nunca abandonara mis recuerdos...
estah'te lek... ranita
Suscribirse a:
Entradas (Atom)