Slides de mis charlas de PyconAr 2011

Pycante 0.1a

Hace un tiempo vi u proyecto interesante que se llamaba mu-dev. Me intereso la funcionalidad asi que me contacte con el desar

rollador para colaborar pero el desarrollador me dijo “la colaboración con parches va a estar disponible en un futuro”. Asi que me dije a mi mismo “Puedo hacer algo similar (o mejor)” asi que bueno… asi nació pycante.

Pycante

La idea del proyecto es utilizar de manera comoda los archivos “.ui” de QtDesigner de la siguiente manera:

import pycante

from PyQt import QtGui

# using path
class Window0(pycante.E("path/to/file/window0.ui")):

    def on_buttonBox_accepted(self):
        # buttonBox exist inside "window.ui"
        print "you push accept"

# using file
class Window1(pycante.E(open("path/to/file/window0.ui"))):

    def on_buttonBox_accepted(self):
        # buttonBox exist inside "window.ui"
        print "you push accept"

# using widget
class Window2(pycante.E(QtGui.QDialog)):

    def setupUi(self, Dialog):
        self.buttonBox = QtGui.QDialogButtonBox(Dialog)
        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
        self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
        self.buttonBox.setObjectName(_fromUtf8("buttonBox"))

        self.retranslateUi(Dialog)
        QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
        QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None,                QtGui.QApplication.UnicodeUTF8))

    def on_buttonBox_accepted(self):
        # buttonBox exist inside "window.ui"
        print "you push accept"

if __name__ == "__main__":
    w0 = Window0()
    w0.show()

    w1 = Window1()
    w1.show()

    w2 = Window2()
    w2.show()

    pycante.run()

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.

Django-hateconf 0.2.3

Odio configurar cosas, y mas odio olvidarme que mi settings.py de django esta versionado y subir algún password mio a un repo publico.

Así que probé varias soluciones de archivos de conf distribuidos pero todos metían conceptos nuevos que no me interesaba descular.

En fin… hice esto

django-hateconf

Las premisas eran:

  • el setttings.py original es suficiente información para utilizar de templates y de schema para los archivos externos.
  • Las conf pueden guardarse en varios formatos a gusto del usuario del proyecto.

Bueno a los bifes:

  • Paso 1:  Instalar

$ pip install django-hateconf

o

$ easy_install django-hateconf

o bajarlo de aca: https://bitbucket.org/leliel12/django-hateconf/

  • Paso 2: Crear proyecto django

$ django-admin start-project myproject

  • Paso 3: Editar el “settings.py” y agregar a la variable INSTALLED_APPS, django_hateconf.

INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',

"django_hateconf",
)

  • Paso 4: Editar al “settings.py” de myproject y agregar esta variable

SETTINGS_BIND = {
    "file":
        "archivo.yaml",
    "bind":
        ("DATABASES", "DEBUG"),
    "header":
        "Este es un archivo de configuracion del proyecto myproject"
}

Esta diccionario tiene las siguientes llaves:

  • file: El cual es un path a un archivo que va a contener la configuración que va  a utilizar nuestro proyecto. El formato del archivo se deduce desde su extensión (NO es case sensitive); las cuales pueden ser:
  • “.yml” o “.yaml”  para  formato yaml YAML (
  •  ”.json” para formato JSON (http://www.json.org/).
  •  ”.xml” para formato XML (http://www.w3.org/XML/).
  •  ”.cfg” o “.ini” pata formato que consiste en secciones que empiezan con la cabecera “[section]“y continua con combinaciones de “llave = valor” en el estilo
    de la RFC 822.
  • bind: Es una lista o tupla que contiene los nombres de las variables de settings.py que se deseamos que se configuren desde nuestro archivo. Con este campo, django-hateconf, busca por su nombre a las  variables en el settings.py y con su contenido genera un template en el formato especificado en el campo file. Las reglas para el contenido del campo bind son:
  • Las variables deben existir en el settings.py
  • No se puede “bindear” SETTINGS_BIND
  • Si en nuestro archivo declarado en file, por ejemplo, bindeamos la variable “TIME_ZONE” y esta no esta en el campo bind, django-hateconf  ignorará el bindeo y se utilizara el valor dentro del settings.py,
  • El valor que se asigne a las variables dentro de nuestro file, tiene que ser un valor “casteable” al que tenemos asignado a la misma variable dentro del settings.py. Para entender si decimos que la variable “A = 1″ en nuestro settings.py cualquier cosa que pueda convertirse automaticamente a un “int” puede existir dentro de nuestro archivo declarado en file. Un caso particular es el valor None el cual acepta cualquier objeto sin castearlo cuando se bindea.
  • Si el valor es una lista, tupla, diccionario o set; el casteo se hace recursivamente. Asi que los valores internos a estas colecciones también deben ser casteables.
  • header: Es el comentario que llevara en la cabecera el archivo declarado en file. Este campo es opcional.
  • Paso 5: Agregar al final de “settings.py” estas dos lineas:

import django_hateconf
django_hateconf.patch(locals())

  • Paso 6: Ejecutar…

$ python manage.py settings --sync

Con esto deberia haberse creado un nuevo archivo “archivo.yaml” en la misma carpeta del proyecto exactamente así:

# Este es un archivo de configuracion del proyecto myproject - DATABASES: default: ENGINE: django.db.backends.dummy HOST: '' NAME: '' OPTIONS: {} PASSWORD: '' PORT: '' TEST_CHARSET: null TEST_COLLATION: null TEST_MIRROR: null TEST_NAME: null TIME_ZONE: America/Chicago USER: '' - DEBUG: true

Bueno para configurar su database solo tiene que editar su archivo.yaml.

Las otras opciones que da django hateconf son:

python manage.py settings --path                 Dice donde esta el archivo de configuración
 python manage.py settings --show                 Muestra el settings ya mergeado.
 python manage.py settings --sync                 Sincroniza los archivos
 python manage.py settings --vars     Muestra los valores de las variables ya bindeados
 python manage.py settings --formats              Lista los formatos validos para los archivos de configuración
 python manage.py settings --validate             Busca errores en nuestro archivo de bindeo
 python manage.py settings -h, --help             Muestra una ayuda

Links al proyecto

Salió PET #3: Revista de la Comunidad Python de Argentina

Link

csvcool 0.1.2

Actualicé denuevo csvcool mi libreria para manejar archivos csv in a cool way!

Por un pedido le puse soporte para “key” en el metodo de ordenamiento:

Suponiendo que tenemos un csv como el siguiente:

nombre apellido mail
tito puente tito@puente.com
cosme fulanito cosme@fulanito.com

para ordenarlo por  la ultima letra del “nombre” deberiamos hacer

import csvcool
csvf = csvcool.read(open("/archivo.csv"))
csvf.sort(lambda r: r["nombre"][-1])
csvcool.write(csvf, open("/archivo.csv", "w"))

y el resultado seria:

nombre apellido mail
cosme fulanito cosme@fulanito.com
tito puente tito@puente.com

Ademas de eso tambien tiene los sigientes features viejos:

  • extraer una sola columna como una tupla.
  • recortar un csv dejando “algunas” columnas o “algunas filas”.
  • agregar filas y columnas.
  • remover filas y columnas.
  • guardar en un archivo.
  • y unas cosas mas.
Instalar:
PD: ahora si agregue los test al setup.py (para felicidad de nessita)

csvcool 0.1.1

Actualicé csvcool mi libreria para manejar archivos csv in a cool way!

Si bien @chipaca, me comento de una funcionalidad similar que viene en la std lib de python, me sigue pareciendo mucho mas comodo de manejar mi libreria (que esta exelentemente documentada (hagan un help(csvcool))

El changelog es simple… le agregue un metodo sort que recive como parametro el nombre de la columna por la cual ordenar.

Suponiendo que tenemos un csv como el siguiente:

nombre apellido mail
tito puente tito@puente.com
cosme fulanito cosme@fulanito.com

para ordenarlo por “nombre” deberiamos hacer

import csvcool
csvf = csvcool.read(open("/archivo.csv"))
csvf.sort("nombre")
csvcool.write(csvf, open("/archivo.csv", "w"))

y el resultado seria:

nombre apellido mail
cosme fulanito cosme@fulanito.com
tito puente tito@puente.com

Ademas de eso tambien tiene los sigientes features viejos:

  • extraer una sola columna como una tupla.
  • recortar un csv dejando “algunas” columnas o “algunas filas”.
  • agregar filas y columnas.
  • remover filas y columnas.
  • guardar en un archivo.
  • y unas cosas mas.
Instalar:
PD: ahora si agregue los test al setup.py (para felicidad de nessita)

Agenda de Django Day Córdoba 2011 lista

El evento django day que va a realizarse en Córdoba el 2/07/2011 ya tiene confirmada su agenda:

http://djangoday.wordpress.com/agenda-de-charlas/

Django-Day Córdoba 2011

El 2 de julio en la utn-frc hay un django day.

Mas info

Pycon Ar 2011 – Call for posters

Pycon Argentina en su edición 2011 se enorgullece en presentar su:

“Call for Posters”

Usted dirá: Que es un póster?

Un póster es un resumen breve de un trabajo en forma de lámina; el cual se
expone de manera permanente en un salón durante toda la Pycon Argentina
2011.

A quien esta dirigido:

  • - A los que quieran presentar trabajos muy breves como para una charla
  • - A los que hicieron charlas que quedaron afuera
  • - A los que tengan pánico escénico.

A Donde envío mi póster:

Deben ser ingresadas, previa registración en el sitio,
para su aprobación en :

http://ar.pycon.org/2011/conference/proposals/submit/

La fecha límite de envío de posters es el

VIERNES 1 DE JULIO DE 2011 inclusive.

En caso de que necesiten hacer consultas o plantear
inconvenientes, por favor contactarse a: *pyconar2011 gmail.com*
o a nuestra lista de correo

https://listas.usla.org.ar/cgi-bin/mailman/listinfo/pyconar2011

- Título

- SELECCIONAR TIPO = “POSTER” EN EL COMBO

- Autor(es): Nombre y apellido, breve descripción de cada uno, foto,
asociación, grupo de usuarios, y organismo o empresa a la que
pertenece, si corresponde.

- Descripción del poster: Uno o dos párrafos donde se explique el
contenido de la presentación.

- Tipo de publico: Desarrolladores avanzados, desarrolladores
principiantes, empresarios, docentes, público en general.

- Conocimientos previos: Especificar que conocimientos previos deberán
tener los asistentes.

- Track: stdlib, web, mobile, cloud, desktop.

- Tags: Académico, Caso de Estudio, Ciencia, Cli, Comunidad, Core,
Educación, Fomento, GUI, Herramientas, Juegos, Lenguaje, Móviles,
Py3k, Redes, Seguridad, Testing, Web.

- Teléfono del/los autor/es: Para poder comunicarnos.

- Ciudad de residencia del/los autor/es.

Consideraciones MUY BÁSICAS al hacer un póster:
- Que sea legible y lo mas “auto explicativo” posible.
- Buena diagramación (tiene que ser tan intuitivo de seguir como un comic)
- QUE TENGAN LOS DATOS DE EL/LOS AUTOR/ES

Muchas mas consideraciones en (hay fotos de pósters):

http://www.swarthmore.edu/NatSci/cpurrin1/posteradvice.htm

Formato:
No hay un lineamiento general por el tamaño, pero cualquier tamaño cercano
al 90 x 120 es bueno (A3 no sera rechazado pero es muy pequeño)

Costos de Impresión:
Una impresión cuesta entre 50 y 100 pesos depende el tipo de
papel y el tratamiento final.
Si bien se pueden hacer con “Fibra y Papel” es mucho mas útil para
que los visitantes se sientan interesados en el trabajo que este impreso en
un lindo formato y papel.
Este costo queda a cargo del presentador del póster. Solo en caso de que no
pueda costearlo la organización analizara el caso.

csvcool 0.1

Laburando en el pyday, tuve que lidiar con varios archivos csv. Los bichitos estos tenian en su primer fila el nombre del campo al cual hacia referencia la columna dada

porjemplo 2 personas con nombre apellido y email aparecia algo asi:

nombre apellido mail
tito puente tito@puente.com
cosme fulanito cosme@fulanito.com

Realmente usar el modulo csv de python me rompia un poco la paciencia, ya que se accedia siempre por indices  y habia que omitir la fila 0

ejemplito:

import csv
csvf = csv.reader(open("/archivo.csv"))
print csvf[1][0] # imprimiria "tito"

Mi solucion: csvcool

Que hace esta librería? bueno… omite la fila 0 y transforma  cada fila en un diccionario (entre otras cosas)

Ejemplito 3:

import csvcool
csvf = csvcool.read(open("/archivo.csv"))
print csvf[0]["nombre"] # imprimiria "tito"

Ademas de eso tambien tiene los sigientes features:

  • extraer una sola columna como una tupla.
  • recortar un csv dejando “algunas” columnas o “algunas filas”.
  • agregar filas y columnas.
  • remover filas y columnas.
  • guardar en un archivo.
  • y unas cosas mas.
Como ultimo ejemplo supongamos que solo queremos guardar un csv con los mails y el apellido de las personas:
import csvcool
csvf = csvcool.read(open("/archivo.csv"))
cortado = csvf.cut("apellido", "mail")
csvcool.write(cortado, open("/archivo_cortado.csv", "w"))

Instalar:
PD: hay test… y me olvide de incluirlos en el setup.py (moco)
Seguir

Get every new post delivered to your Inbox.

Únete a otros 89 seguidores