Implementación de un sistema de cómputo Map-Reduce sobre AMQP

Para el cierre de la materia de de “Aprendizaje automático sobre grandes volúmenes de datos“, se me ocurrio que seria interesante la creación de una infraestructura “a la hadoop” en puro Python y sobre AMQP. Bueno hice eso y el resultado lo pueden ver acá: http://poopy.jbcabral.org

Además del código presente un informe de como encare el proyecto que esta disponible acá: https://bytebucket.org/leliel12/bigdata_famaf/raw/tip/poopy/build/latex/poopy.pdf

Creo que el informe es bastante ideal para el que quiera entender AMQP o los conceptos muy básicos de Hadoop desde AMQP

Anuncios

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

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

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

Pycante 0.2.1c

Actualicé Pycante el proyecto que ayuda a utilizar de manera cómoda los archivos “.ui” de QtDesigner  los cambios principales son:

  • El proyecto ahora es BEER-WARE… osea es mas libre que antes
  • No esta mas disponible la función “run”, ahora hay que crear la aplicación desde Qt.
  • Ahora hay una función “EDir” que recibe por parámetro un path de un directorio y retorna una función “E” que apunta al mismo (por ejemplo si tenemos todos nuestros archivos “.ui” en /home/tito).
  • La operatoria con files y widgets no cambia con los EDir.

Ejemplos:

import sys

import pycante

from PyQt4 import QtGui

# CONSTANTS
UI = pycante.EDir("path/to/all/my/ui/files/")

# using path "path/to/all/my/ui/files/file.ui"
class Window(UI("file.ui")):

    def on_buttonBox_accepted(self):
        # buttonBox exist inside file.ui
        ...

app = QtGui.QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())

Para instalar:

$ pip install pycante

o

$ easy_install pycante

o bajarlo de aca: https://bitbucket.org/leliel12/pycante/

Disclaimers:

  • Lo hice por una necesidad muy puntual
  • El codigo de “W3” no lo probe aunque puede usarse asi pycante
  • Como notaran en ni un momento llame a SetupUi()… eso pycante lo hace solo.

Ninja-IDE Snippet Plugin (con screencast)

Acabo de terminar mi primer plugin  para Ninja-IDE 2.x, el cual consiste en un gestor de snippets.

Como funciona? 

  • Primero bajan el plugin y lanzan Ninja (estoy usando la 2.0b2)con una de estas intrucciones para que corra mi codigo.
  • En la ventana de settings “edit -> preferences -> plugin -> snippets” y van a ver algo asi

    • La lista de la izquierda enumera todos las exenciones disponibles para los snippets y la de la derecha los snippets, propiamente dicho, de
      dicha extensión. En la ventana de abajo se ve el texto de reemplazo de dicho snippet.
Los snippets deben crearse dentro de un lenguaje y una extensión (siendo un caso particular *General*) y poseen variables que se resuelven al momento de ser aplicados (la lista de todas las variables aparece si presionan el botón HELP)
  • Al momento de escribir un snippet en el editor de texto en el cual esta codificando y apretando la tecla <TAB> el plugin operara de la siguiente manera:
    1. Buscara la palabra justo anterior de apretar <TAB>  en la lista de plugins correspondiente a la extension del archivo que estamos editando.
    2. Si no encuentra un reemplazo en esa lista lo busca en *GENERAL*.
    3. Si no lo encuentra en general no hace nada
Screencast 😀 (los glitches son cosa de mi editor de video)
Descargenlo es Beerware