Francisco Malbrán: Estado previo

Aunque me sumara todos los años que me hicieran falta para validar socialmente mi sorpresa ante las situacionaes mediáticas actuales, una vez sentado en el deslumbramiento objetivizado por la experiencia, supongo que querría decir lo mismo que ahora. Capaz un poco distinto. Capaz igual.

Me encuentro a menudo con una sensación de oraculezco tinte, en la que me repito que todo, todo esto, es simplemente una ansiedad del futuro respecto de la evolución humana. Me refiero particularmente a la necesidad del ser de saber. Saber todo (o dicho de otro modo: controlar). Y por transitividad, me refiero también a las herramientas que se inventan en pro de eliminar todo obstáculo que acompañe a la distancia.

En repetidas ocasiones ha arribado a los futuros literarios la consciencia que va más allá del límite del individuo, y le permite saber qué está pasando en otro lugar, qué está pensando otro ser (sin necesidad de externalizar las cosas a través de un lenguaje), qué siente una sociedad, etc.

Me da la impresión de que las tecnologías que inventamos están buscando fervorosamente llegar a ese estado de consciencia universal y unir todos los tentáculos del mundo con los pelos de tu cabeza, para que ya nunca te pierdas de nada, para que ya nunca nada quede a tu margen, para que no estés "aislado" (solo en tu isla), para... qué?

La cuestión es que no me resulta para nada extraño pensar en que eventualmente, la evolución que ahora estamos apurando con nuestros esfuerzos científicos se dará como sin querer con el correr del tiempo y seremos finalmente independientes de toda cosa, pero ya no independientes de nosotros mismos, que seremos un solo ente, todo interconectado, todo gestáltico como estamos tratando de ser ahora.

Sin embargo, en el estado previo en que estamos aprendiendo a convivir con el mundo a través de la información masiva, las herramientas de las que nos valemos se convierten de repente en irónicas alejadoras de las cercanías: estamos al tanto de todo lo que está lejos, pero ajenados de todo lo que nos rodea. Estamos más pendientes de los estímulos virtuales que de aquellos que chocan contra la piel nos abraza la carne.

Supongo que esto se debe casi por completo a la novedad que supone la posibilidad, y por ende al aprendizaje que deriva de la nueva experiencia. Pero espero que vayamos, por lo menos, vislumbrando la situación. Como para ir revivificando al "mundo que nos rodea", capaz ya sin dejar atrás el nuevo y por ahora más concurrido "mundo virtual".

Pablo Alejandro Costesich: Game of Life (Reprise)

Sólo por el placer de probarme, (re)escribí una versión de Conway's Game of Life en Ansi C con un par de particularidades. El algoritmo usa bit shifting, por lo que es relativamente difícil de leer. ¿Por qué hacer esto, entonces? Puro ejercicio mental.

En el algoritmo entran en juego dos conceptos básicos: máquinas de estado y operaciones de bit-a-bit. Hay mucho material dando vueltas por ahí como para explicarlo, pero son dos herramientas que encajan perfecto con este problema.

El código tiene menos de 70 líneas en total, y si bien no es "edgeless" como el ejemplo del Game of Life anterior, cumple a la perfección su cometido. El tiempo de ejecución es tan corto que ni siquiera puedo medirlo con time. El código en assembler (gcc archivo.c -s) tiene 391 líneas invariablemente del flag de optimización. Supongo que eso ocurre por el uso de instrucciones de comparación bit-a-bit.

Un posible cambio para eliminar la suma es realizar un mapa de todas las combinaciones de celdas de 3x3, con lo que el input y el estado serían lo mismo. El mapa devolvería el estado de la célula, exactamente igual que en el ejemplo. No lo considero una optimización, más bien lo contrario.

El código está en codepad (UPDATE: acá) y a continuación:

#include <stdio.h>
#include <stdlib.h>

#define COUNT_ALIVE(a, b, c, offset) (((a >> (offset - 1)) & 1) + \
((a >> offset) & 1) + \
((a >> (offset + 1)) & 1) + \
((b >> (offset - 1)) & 1) + \
((b >> (offset + 1)) & 1) + \
((c >> (offset - 1)) & 1) + \
((c >> offset) & 1) + \
((c >> (offset + 1)) & 1))

#define IS_ALIVE(a, b) ((a >> b) & 1)

char status[2][9] = {
/* 0, 1, 2, 3, 4, 5, 6, 7, 8*/
{0, 0, 0, 1, 0, 0, 0, 0, 0}, /* Dead cell */
{0, 0, 1, 1, 0, 0, 0, 0, 0} /* alive cell */
};

void print(unsigned long int [], int, int);
void evolve(unsigned long int [], int, int);

int
main(int argc, char** argv)
{
unsigned long int m[20];
int i;
for (i = 0; i < 20; i++)
m[i] = 0;
m[3] = 1 << 8;
m[4] = 1 << 7;
m[5] = 7 << 7;
for (i = 0; i < 32; i++)
{
printf("= GENERATION %d =\n", i + 1);
print(m, 20, 20);
evolve(m, 20, 20);
}
return EXIT_SUCCESS;
}

void
print(unsigned long int m[], int x, int y)
{
int i, j;
for(i = 0; i < y; i++)
{
for(j = 1; j <= x; j++)
printf("%c", (m[i] >> (x - j)) & 1 ? '#' : ' ' );
printf("\n");
}
}

void evolve(unsigned long int m[], int x, int y)
{
unsigned long int *m2 = calloc(y, sizeof(unsigned long int));
int itrX, itrY;
for (itrY = 1; itrY < y - 1; itrY++)
for (itrX = 1; itrX < x - 1; itrX++)
m2[itrY] |= (status[IS_ALIVE(m[itrY], itrX)][COUNT_ALIVE(\
m[itrY - 1], m[itrY], m[itrY + 1], itrX)] << itrX);
for (itrY = 0; itrY < y; itrY++)
m[itrY] = m2[itrY];
free(m2);
}




EDIT: Me olvidé hacer la respectiva llamada a free, y calloc inicializa a cero.

Joaquin Sorianello: Volando por la Mañana...

Mi vuelo sale a las 7:55, estoy en aeroparque en este momento. La verdad que el año pasado me diverti mucho riendome de mi pobre cuñada que perdió el micro en retiro, pero a mi, esta vez me paso algo mucho peor, pero por suerte sali bien parado (aunque un poco despeinado)...

¡¡¡¡Me quede dormido!!!!!!!!!

Si señor, si señora, a las 5:50 me pasaba a buscar un taxi, que reserve ayer a las 12 de la noche.
Mientras estaba tranquilo, soñando un sueño hiperrealista, breeeeeep, la chicharra del portero tuneado de casa me quito el sueño. En dos segundos, pense que era algun borracho confundido, que venia a buscar a algun amigo y le habia pifiado al departamento.....

Pero no.

Era el taxi.
Así, que en un tris, guarde la laptop, y las cosas que faltaban en la mochila y salí.
Llegué bien (excesivamente temprano, como a mi me gusta) y ahora estoy todo despeinado en el aeropuerto.
De esta experiencia aprendi dos cosas:

- Si vas a salir en un vuelo matutino y vas a ir en taxi, reservalo de antemano en una empresa seria (En mi caso, Radiotaxi Del Plata), ya que esta precaución me salvo el vuelo.
- Dejar seteado mas de un reloj. En mi caso la falla fue que me olvide de eliminar la opcion de que no suene los sábados.
- Por las dudas.... Bañate la noche anterior.... mas vale estar excesivamente limpio que tener que bancarte un dia entero todo mugroso.

Como frutilla de la torta, justo anteayer estaba realizando un plan de reorganización de los metodos de auto-encendido (Lease, "La forma en que uno se despierta"). Me quede hasta las 2 de la mañana armando un crontab (Que no tenia idea de como se usaba) para que a la mañana me despierte arrancando el totem con una playlist. Si lo hubiese seteado para hoy, esto no pasaba....



 Ahora estoy embolado en el aeropuerto, jugando con nmap contra la wifi paga... en 1 hora despego :P
--
El amanecer en el Río de la Plata

UPDATE: Estoy sano y salvo en Córdoba

Mariano Reingart: Abierta la inscripción a FLISOL 2010 en González Catán

FLISOL, el Festival de Instalación de Software Libre que reúne a toda Latinoamérica, estará presente en González Catán el sábado 24/04/2010
Podés traer tu computadora y te ayudamos a instalar programas libres, que podés copiar, estudiar, corregir, modificar, compartir y seguir copiando.
Además: charlas informativas y demos para que conozcas más y disfrutes mejor las ventajas del Software Libre.
La entrada es libre y gratuita, sólo necesitamos que te inscribas previamente por nuestra web:

http://www.institutopascal.edu.ar/flisol2010

Participan integrantes de las siguientes comunidades locales, quienes estarán a cargo de las instalaciones, charlas y demostraciones:

Francisco Malbrán: Lo que quede después

Quizás quede la arrogancia del que todo lo sabe o cree que todo lo sabe. Esa (in)evitable bataola que tiende a sufrir (aunque no se da cuenta, la sufre) aquél que es reconocido como "el mejor" en algo, y además pisa el palito y se lo cree.

Quizás quede el sinsabor de la resignación ante la ausencia de las ilusiones vanas, a veces tan necesarias como infructuosas. A veces tan inspiradoras como ingenuas.

Quizás quede la pesadez de no creer en nada excepto en que nada es cierto, y en que cualquier intento lleva atada a sus espaldas una mochila utópica.

Quizás quede una indiferencia espesa que nos deje vivir sin ninguna preocupación pero también sin ningún entusiasmo, mínima chispa, tenue fantasía.

Lo cierto es que me cuesta infinitamente imaginar que lo que quede será algo positivo o esperanzador o digno. Digo... ¿qué se puede esperar que quede después de perder toda, toda, pero absolutamente toda la inocencia?

Pablo Alejandro Costesich: Quick Pastebin

Hoy necesitaba pasar unos archivos de una máquina que corre Linux a otra con el mismo sistema operativo. El problema: rsync y scp no funcionan, y no sé el motivo. Tampoco tenía tiempo para andar averiguando, así que en menos de 10 minutos codeé esto:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# pastebin.py
#
# Copyright 2010 Pablo Alejandro Costesich


import urllib2
import urllib
import sys

def paste(text, **kwargs):
urlapi ='http://pastebin.com/api_public.php'
values = {'paste_code': text}
values.update(kwargs)
data = urllib.urlencode(values)
req = urllib2.Request(urlapi, data)
response = urllib2.urlopen(req)
return response.read()


def main(*args):
if len(args) == 1:
print paste(''.join(sys.stdin.readlines()))
else:
for filename in args[1:]:
f = open(filename)
print paste(''.join(f.readlines()))
return 0

if __name__ == '__main__':
main(*sys.argv)

Joaquin Sorianello: Buenas Nuevas

Hace rato que no posteo algo por acá, pero tengo buenas noticias, y las buenas noticias son para compartirlas.

Cambio de Trabajo! 


Un poco de background:
Hace 3 años (y un poco mas) que me viene a estudiar  (aunque no solo a estudiar) a Buenos Aires, desde ese momento vengo laburando en la empresa de mi tío. Donde comenzé siendo un tablerista, y termine siendo proyectista eléctrico, programador de PLC, SysAdmin, Tablerista, Encargado de Postventa, Desarrollador de Scadas.... (y la lista sigue). Todo esto, amparado en la confianza de ser familia.

Pero.... siempre hay un pero: No está tan bueno. Ser un empleado multifuncional, con muchas cosas diferentes que abarcar logró que mi estrés y mi panza crezca, que mi capacidad de resolver problemas específicos disminuya y algo muy importante:
La sensación de soledad, de no tener un par con el que discutir como encarar un proyecto, alguien con quien repartir las responsabilidades cuando la cosa no funciona y finalmente, alguien con quien aprender en conjunto.

Ademas.... quería programar, Python de ser posible...


Empecé a mirar un poco la oferta laboral, pero el panorama era mas que deprimente (desde mi punto de vista): Muchas búsquedas de desarrolladores junior, con sueldos malos.
Yo, siendo un (proto)programador autodidacta, no tenia ningún papel, ninguna experiencia laboral en el desarrollo de sistemas, no tenia la cara para presentarme a un laburo mejor.
Mi forma de vida (la autosuficiencia en pareja) y el nivel de gastos (depto, gastos de facultad, alimentos, transporte) me hacia imposible pensar en entrar a una empresa donde me paguen 2,50$ la hora.

Pero las cosas fueron cambiando:

En marzo participe en el pycamp, un campamento en el que programadores de python de argentina, desde newbies como yo, hasta tipos con trayectoria internacional. Fue increíble: muchos geeks, mucha buena onda, mucha humildad.
Aprendí mucho, muchísimo, mas que en mucho tiempo.
Ahí mismo me di cuenta (nuevamente) que estaba cansado de trabajar tan solo y que realmente quería trabajar con gente así y que realmente mi codigo no apestaba (tanto...).

En la reunión de PyAR (en el marco del PyCamp), Alecu planteo que existen un montón de programadores de Python, que no trabajan en Python, y que estaría bueno, revertir esa situación.

De vuelta en casa decidá tirarme a la pileta: Mande un curriculum a GCoop, una cooperativa de desarrollo de software libre, y... me eligieron!!!!, así que, fines de abril, estaré estrenando nuevo trabajo.

La verdad que agradezco a la gente de la comunidad de Python Argentina, que confiaron en mi, como colaborador en los eventos que se organizaron y me ayudaron (sin darse cuenta) a dar este paso.

Juan Pedro Fisanotti: El más juego más grande del más mundo!

Para quienes siempre quisieron participar en el desarrollo de un juego, esta es su oportunidad, y ni siquiera necesitan saber programar! :)
Gente de PyAr (Python Argentina) va a participar de la PyWeek, una semana de competencia en la que el objetivo es desarrollar un juego. Pero lo interesante es que van a permitir que cualquier persona pueda aportar contenido al juego, diseñando tus propios mini-juegos dentro de él.
Para enterarse de más y participar, entren a: