Slides de mis charlas de CNEISI 2011
2011/10/01 Deja un comentario
Hacking, food and wiskey
2011/08/29 2 comentarios

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.
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/
2011/08/07 Deja un comentario
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

Las premisas eran:
Bueno a los bifes:
$ pip install django-hateconf
o
$ easy_install django-hateconf
o bajarlo de aca: https://bitbucket.org/leliel12/django-hateconf/
$ django-admin start-project myproject
INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', "django_hateconf", )
SETTINGS_BIND = {
"file":
"archivo.yaml",
"bind":
("DATABASES", "DEBUG"),
"header":
"Este es un archivo de configuracion del proyecto myproject"
}
Esta diccionario tiene las siguientes llaves:
- “.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.
- 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.
import django_hateconf django_hateconf.patch(locals())
$ 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
2011/07/10 Deja un comentario

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 | |
|---|---|---|
| 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 | |
|---|---|---|
| cosme | fulanito | cosme@fulanito.com |
| tito | puente | tito@puente.com |
Ademas de eso tambien tiene los sigientes features viejos:
Instalar:
2011/07/09 Deja un comentario

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 | |
|---|---|---|
| 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 | |
|---|---|---|
| cosme | fulanito | cosme@fulanito.com |
| tito | puente | tito@puente.com |
Ademas de eso tambien tiene los sigientes features viejos:
Instalar:
2011/06/28 1 comentario
El evento django day que va a realizarse en Córdoba el 2/07/2011 ya tiene confirmada su agenda:
2011/06/08 Deja un comentario
2011/05/31 Deja un comentario
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 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.