domingo, 3 de octubre de 2010

Puertos Serie Virtuales en Gnu/Linux

Hoy estaba preparando mi charla para la PyCon2010 y me vi con la necesidad de crear puertos serie virtuales, para unos ejemplos que quiero dar...

La solución fue utilizar socat:

"Socat  is a command line based utility that establishes two bidirectional byte streams and transfers data between them. Because the streams can be constructed from
       a large set of different types of data sinks and sources (see address types), and because lots of address options may be applied to the streams, socat can be  used
       for many different purposes."


La linea en cuestión:

joac@pepino ~ $ socat PTY,link=vserial1 PTY,link=vserial2


Despues, desde pyserial, por ejemplo nos conectamos con:

import serial

ser = serial.Serial("/home/joac/vserial1")

jueves, 23 de septiembre de 2010

Grupos vs Individuos


Ahora que empezó la primavera, y el sol pega directo en la ventana de mi pieza, ayudándome notablemente a despertar, voy a tratar de resucitar mi blog.

Grupos vs Individuos

Me gusta programar, me gustan los desafíos, y me gusta aprender cosas nuevas. Tengo una especie de lema que dice "Si lo hizo un ser humano entonces puedo entender como esta echo", quizás demasiado abarcativo (notar que dije puedo entender). Esto es un arma de doble filo, por un lado, porque aprendo cosas nuevas, pero por el otro, desvaloriza los conocimientos de los demás.

Desde que trabajo en gcoop (ver posts anteriores) no trabajo mas solo, trabajo con un grupo. Este es un fuerte cambio en el paradigma que traigo desde (el autor no logra recordar, quizás se remonte a estados fetales pre-parto), y me hizo reflexionar bastante sobre esta forma de encarar los problemas.

Cuando uno trabaja solo, la comunicación sobre las tareas es básicamente con uno mismo. Pero cuando uno trabaja en grupo, la comunicación es distinta (Pensaba hacer una analogía con una Red pero es muy de ñoño), la toma de decisiones tiene mas posturas, y es ahí donde esta la verdadera riqueza.

Creo, que no existen dos personas que piensen parecido, todos tenemos nuestras propias estructuras mentales, y reaccionamos de distintas formas, a veces muy sutiles, frente a los estímulos externos. Es común que se encuentren diferentes formas de resolver un mismo problema.

Pero no todo es color de rosa...

Creo que uno de los principales problemas mundiales, después de los realmente importantes (como que miles de niños muren de hambre día a día), es la falta de comunicación.

Y en los grupos pequeños también pasa.

Quizás la cuestión importante es que desarrollar software no es solamente uno con las manos sobre el teclado, sino, que requiere de comunicación en su mayor parte.

(Este post va a ser editado, es un boceto)

sábado, 17 de julio de 2010

Jueguito v2

Ayer empecé el proyecto de un minijuego, clón de uno de blackberry.
Me di cuenta que sin colores era injugable, así que me puse a investigar como agregar colores a los prints de python, y me encontré con [1] en Stack Overflow, que explica como hacerlo.

Es muy fácil, con la salvedad que yo aproveche y cambié el color de fondo, en lugar del color del texto.

Ahora es mas cómodo de jugar.

La ultima versión (Provisoria) la encuentran en [2]

[1] http://stackoverflow.com/questions/287871/print-in-terminal-with-colors-using-python

[2] http://github.com/joac/joac-python/blob/master/minigame/minigame.py

Dejo unas capturas que hice:

 El inicio del juego


Un par de jugadas despues

Ganamos!

Si no alcanzan los movimientos... Nos espera la derrota

viernes, 16 de julio de 2010

Jueguito

El otro día, me prestaron un blackberry que tenia un jueguito que me gusto, asi que hice una versión, para la consola, del juego, he aquí el código:

import random
import os

class Square:
    """This is the abstraction of one Square"""
    def __init__(self, x, y, attrib, root):
        self.x = x
        self.y = y
        self.attrib = attrib
        self.root = root
        self.rep = attrib

class Screen:
    """The Screen Array of the game"""
    def __init__(self, x_size, y_size, tokens):
        self.x_size = x_size
        self.y_size = y_size
        self.tokens = tokens
        self.childs = []
        self.squares = []
        self.populate()
        self.childs.append(self.squares[0][0])
        self.childs[0].rep = '#'

    def get_near_to(self, child):
        vecinos = []
        if child.x - 1 >= 0:
            vecinos.append(self.get_square(child.x - 1, child.y))
        if child.y - 1 >= 0:
            vecinos.append(self.get_square(child.x, child.y - 1))
        if child.x + 1 < self.x_size:
            vecinos.append(self.get_square(child.x +1, child.y))
        if child.y + 1 < self.y_size:
            vecinos.append(self.get_square(child.x, child.y + 1))
        
        return [vecino for vecino in vecinos if(not vecino in self.childs)]


    def get_square(self, x, y):
        return self.squares[y][x]

    def populate(self):
        for y in xrange(0, self.y_size):
            self.squares.append([self.random_square(x, y) for x in xrange(0, self.x_size)])

    def random_square(self, x, y):
        
        attrib = random.choice(self.tokens)
        square = Square(x, y, attrib, self)
        
        return square
    
    def check_arround(self, child):
        """We check the attrib of the near squares"""
        vecinos = self.get_near_to(child)
        if vecinos:
            for vecino in vecinos:
                if (vecino.attrib == child.attrib):
                    vecino.rep = '#'
                    self.childs.append(vecino)

    def __repr__(self):
        output = ''
        for row in self.squares:
            output += ''.join(['%s ' % str(a.rep) for a in row])
            output += '\n'
        return output
    
    def update(self, attrib):
        for child in self.childs:
            child.attrib = attrib[0]
            self.check_arround(child)
            

if __name__ == '__main__':
    screen = Screen(10, 10, ['1', '2', '3', '4', '5'])
    print screen
    screen.update(screen.childs[0].attrib) #dirty Hack
    limit = 18 
    win = False
    for b in xrange(1, limit):
        a = raw_input('_ ')
        screen.update(a)
        os.system('clear')
        print screen
        print "%4d moves of %4d" % (b, limit)
        if len(screen.childs) == screen.x_size*screen.y_size:
            win = True
            break
    if win:
        print "You Win"
    else:
        print "You loose"

sábado, 17 de abril de 2010

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

miércoles, 31 de marzo de 2010

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.

jueves, 11 de febrero de 2010

Recalculando

Haciendole un apt-get dist-upgrade a mi cerebro.

Ultimamente estoy consumiendo demasiada información y produciendo poca. Ni bien logre cambiar la tendencia, escribo algo interesante.