Global Game Jam 2013

El ultimo fin de semana participe con un grupo de amigos en el Cordoba Game Jam 2013. Desarrollamos “Malondon”, un survivor en el cual tu objetivo es ser un viejo Mala Onda que debe disolver parejas estereotípicas plantando evidencias falsas.

Lo se desarrollamos con Pilas (rama develop) y el código preliminar esta disponible aquí.

En unas 2 semanas publicare la versión mas pulida con su respectivo exe, dmg y demases.

Caipyrinha 0.2

Y tan rapido como esto hice una version 0.2 (por necesidades laborales)

 

Diferencias fundamentales: ahora los exclude group se instancian con el parametro exclusive y no con group (ya implementare los grupos propiamente dichos)
Aca tienen como instalarlo: http://caipyrinha.readthedocs.org

si lo instalan con este código:

# ex.py

import caipyrinha

parser = caipyrinha.Caipyrinha(prog="Your Program")
parser.add_argument("--version", action='version', version="%(prog)s 0.1")

@parser.callback(exit=0, exclusive="group1")
def first(flags, returns):
    '''Execute this option and exit'''
    print "bye bye"

@parser.callback(action="store")
def second(flags, returns):
    '''set his own return value with his parameter'''
    return flags.second

@parser.callback("--third", exclusive="group1")
def no_used_name(flags, returns):
    '''you cant use this argument with first'''
    print returns.second

import sys
parser(sys.argv[1:])

Tienen este resultado

2013-01-23-030740_1056x346_scrot

Aca tienen un link donde lo estoy usando:  http://bitbucket.org/leliel12/yatel/src/tip/bin/yatel

Caipyrinha 0.1

Si hay algo desordenado que me queda siempre son los parsers de linea de comando. Así que se me ocurrió caipyrinha

Que hace caipyrinha? te da un decorador para hacer argumentos de linea de comando a mi criterio… mas facilmente

Aca tienen como instalarlo: http://caipyrinha.readthedocs.org

si lo instalan con este código:

# ex.py

import caipyrinha

parser = caipyrinha.Caipyrinha(prog="Your Program")
parser.add_argument("--version", action='version', version="%(prog)s 0.1")

@parser.callback(exit=0, group="group1")
def first(flags, returns):
    '''Execute this option and exit'''
    print "bye bye"

@parser.callback(action="store")
def second(flags, returns):
    '''set his own return value with his parameter'''
    return flags.second

@parser.callback("--third", group="group1")
def no_used_name(flags, returns):
    '''you cant use this argument with first'''
    print returns.second

import sys
parser(sys.argv[1:])

Tienen este resultado

2013-01-23-030740_1056x346_scrot

Aca tienen un link donde lo estoy usando:  http://bitbucket.org/leliel12/yatel/src/tip/bin/yatel

Hermoseando Ipython

Me gusta mucho Bash. Si bien no soy usuario de ohmyzsh, me parece un proyecto super interesante. Y pensando en mi ultimo post me dije “debería haber un OhMyIpython”.

Así que me puse unas hora de laburo y lectura de documentación sobre plugins de Ipython, adapte el script de multiple scm como extensión, arme un repo y… voilà.

Acá esta el repo:  https://bitbucket.org/leliel12/ohmyipython

si lo instalan tienen este resultado:

2013-01-16-015651_653x650_scrot

En definitiva:

  • Informa que tipo de versionador tienen (git, mercurial, bzr y svn)
  • Si están en git y mercurial les dice en que branch están.
  • Si modifican un archivo versionado les agrega un * al final.
  • Mapea todos los comandos git, hg, svn y bzr a ipython.

El que quiera colaborar sera bienvenido

Prompt para desarrolladores multi-scm (upgraded)

Encontre este post: http://gepatino.blogspot.com.ar/2013/01/prompt-para-desarrolladores-multi-scm.html (GRACIAS GABRIEL)

Y agregue el soporte para banchs de mercurial. UPDATE: separe svn y bazar para que funcione mejor

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w\[\033[01;33m\]$(get_repo_info) \[\033[01;34m\]\$ \[\033[00m\]'

function get_repo_info {
    INFO=""
    DIRTY=""

    if [ "$INFO" == "" ] && [ `svn info 2> /dev/null | wc -l` -gt 0 ]
    then
        [ `svn status 2> /dev/null | grep -v '?' | wc -l` -gt 0 ] && DIRTY='*'
        INFO="⚡svn$DIRTY"
    fi

    if [ "$INFO" == "" ] && [ `bzr info 2> /dev/null | wc -l` -gt 0 ]
    then
        [ `bzr status -S 2> /dev/null | grep -v '?' | wc -l` -gt 0 ] && DIRTY='*'
        INFO="⚡bzr$DIRTY"
    fi

    if [ "$INFO" == "" ] && [ `hg branch 2> /dev/null | wc -l` -gt 0 ]
    then
        BRANCH=`hg branch 2> /dev/null`
        [ `hg status 2> /dev/null | grep -v '?' | wc -l` -gt 0 ] && DIRTY='*'
        INFO="⚡hg:$BRANCH$DIRTY"
    fi

    if [ "$INFO" == "" ] && [ `git branch 2> /dev/null | wc -l` -gt 0 ]
    then
        BRANCH=`git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/\1/"`
        [ `git status --porcelain 2> /dev/null | wc -l` -gt 0 ] && DIRTY='*'
        INFO="⚡git:$BRANCH$DIRTY"
    fi

    echo $INFO
}

Agregan eso a su ~.bashrc y van a ver algo como esto:

2013-01-12-000458_660x177_scrot

PD: si alguien se anima a seguir por branch de bazar aca hay un codebase
http://blog.grahampoulter.com/2011/09/show-current-git-bazaar-or-mercurial.html

PyCon Argentina 2012 – Track Científico

Pueden ver aquí todo el track científico de PyConAr 2012 en orden.
Hay que recalcar que lamentablemente la charla de Matías Herranz y Joaquín Tita sobre “Imágenes Satelitales” tuvo un problema y el video esta medio irrecuperable y no esta disponible aun.
Por otro lado agregue una charla que originalmente pertenecía a este track y termino quedando en paralelo (por puros problemas logísticos):
Poniéndole Lógica Peirceana a la Programación” de Javyer Der Derian

Que es de las pocas charlas que existen sobre ing. de software y psicología.

Ninja-IDE: Public Paste Plugin

Actualice a la api 2 de Qt el único plugin de ninja-ide que habia hecho que no funcionaba aun. PlublicPaste

Sirve para compartir código en dpaste, paste.ubuntu, codepad y pastee (elimine pastebin y paste2 por su burocracia)

Se puede instalar por el manejador de plugins de Ninja o descargar el paquete desde acá: http://ninja-ide.org/plugins/3/

Con esto termino mis mini works de la semana

Ninja-IDE: Draft Plugin

Hice en 20 min un pequeño plugin de ninja que emula el draft-area de geany.

¿Cual es la idea?. Simplemente es un area de texto donde pones cosas por las dudas para usarlas en el futuro. Lo que escribas va a ser automáticamente persistido en un archivito de texto plano.

Se puede instalar por el manejador de plugins de Ninja o descargar el paquete desde acá: http://ninja-ide.org/plugins/15/

Yatel – Exploración de perfiles para Minería de datos – PyConAr2012

Presentamos con Alejandro Garcia el proyecto Yatel en PyConAr2012

Yatel permite crear redes basadas en distancias entre perfiles de individuos y analizarlas multidimensionalmente mediante un proceso de exploración.

Yatel se desarrolló para el análisis de variabilidad genética del Mal de Río Cuarto virus (MRCV), una de las enfermedades más importantes del maíz. El análisis de la red de haplotipos (genotipos haploides) o perfiles del MRCV resultó muy exitosa y permitió detectar que la variabilidad del virus disminuyó con el tiempo. La hipótesis de se planteó después de la exploración de la red, inspirada en la visualización de la existencia de haplotipos por ambiente.

Snippet para usar un unittest bottle.py con un proceso separado

Necsitaba probar un api rest y se me ocurrio levantar bottle en un proceso separado dentro de un testcase; y necesite hacer todos este chicle.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# "THE WISKEY-WARE LICENSE":
# <jbc.develop@gmail.com> wrote this file. As long as you retain this notice you
# can do whatever you want with this stuff. If we meet some day, and you think
# this stuff is worth it, you can buy me a WISKEY in return Juan BC

import multiprocessing
import urllib2
import unittest

import bottle

class BottleTest(unittest.TestCase):

    def setUp(self):
        self.process = multiprocessing.Process(
            target=bottle.run,
            kwargs={"port": "8081"}
        )
        self.process.start()

        # wait until bottle process full started
        # si no ponen esto el testcase se va a ejecutar antes
        # que bottle este listo para recibir peticiones
        started = False
        while not started:
            try:
                urllib2.urlopen("http://127.0.0.1:8081/")
            except urllib2.HTTPError:
                started = True
            except urllib2.URLError as err:
                if err.reason.args[0] == 111:
                    pass
                else:
                    raise err
            else:
                started = True

    def tearDown(self):
        self.process.terminate()

    def test_something(self):
        pass
Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 244 seguidores