lunes, 15 de noviembre de 2010

Debugueo en Python

En python se puede debuguear usando la librería pdb

Al inicio del script en python, poner:
import pdb
Luego donde se quiera que empiece el debug, poner:
pdb.set_trace()
Si estás corriendo el script en consola, la consola se detendrá en el punto donde pusiste el comando de arriba. Si estás usando Django, y estás usando el servidor de prueba, en la consola donde corriste el servidor podrás hacer el debug.
Con los siguientes comandos podrás controlar el flujo de tu programa:
n: next: siguiente
ENTER: para repetir el último comando
q: quit: para salir (sale del programa)
p: print: para imprimir variables (se usa p )
c: continue: para continuar con el programa (dejando el debuguer)
l: list: para listar que linea del codigo se está ejecutando
s: step into: para entrar en la subrutina
r: return: para salir de la subrutina
En este link hay una buena guía detallada de cómo usar el debuguer:

viernes, 7 de mayo de 2010

Agregando un script que parta en el boteo para Ubuntu

Es re-palta, pero es de las cosas típicas que siempre se me olvidan, así que ahí va.

user@server:~$ cd /etc/init.d/
user@server:/etc/init.d$ sudo vim initscript

** Poner lo que va a hacer el script **


user@server:/etc/init.d$ sudo chmod 755 initscript
user@server:/etc/init.d$ sudo update-rc.d initscript defaults

Eso no más sería.

Aquí un Link con más información:

http://embraceubuntu.com/2005/09/07/adding-a-startup-script-to-be-run-at-bootup/


martes, 18 de agosto de 2009

psycopg2.ProgrammingError: there is no unique constraint

Al estar creando un modelo con 2 ForeignKeys, y hacer python manage.py syncdb
me ocurrió el siguiente error:
psycopg2.ProgrammingError: there is no unique constraint matching given keys for
referenced table "app_orderdetail"

Tuve un buen rato cabeceándome con esta cuestioncita, y el problema era el siguiente:
Me faltaba una clave primaria en la tabla a la cual estaba haciendo referencia con el ForeignKey (app_orderdetail). Y supongo que me pasó por ocupar bases de datos respaldadas desde sistemas que ya llevaban un tiempo corriendo.

La solución:
Agregar la clave primaria via SQL o bien borrar la tabla para que el syncdb vuelva a crearla nuevamente.
El SQL para agregar la clave primaria es:

ALTER TABLE app_orderdetail ADD PRIMARY KEY (id);

viernes, 24 de julio de 2009

SVN local obstruction, incoming add upon merge

Que es esto!!!!!!!!!!... tranquilo papa.
Si hiciste un merge con SVN desde un branche al trunk en y te ocurre algo como esto:

U code/proj/coredb/models.py
U code/proj/coredb/gateway.py
C code/proj/utils/win_keys.py
C code/proj/utils/keys.py

Y después haces un svn st, y dice

M trunk/code/proj/coredb/models.py
M trunk/code/proj/coredb/gateway.py
C trunk/code/proj/utils/win_keys.py
> local obstruction, incoming add upon merge
C trunk/code/proj/utils/keys.py
> local obstruction, incoming add upon merge

Probablemente pueda deberse a que tenías versiones idénticas en el trunk respecto del branche al momento de hacer el merge.
Como son versiones idénticas, la solución es simplemente resolver el conflicto, con:

svn resolved trunk/code/proj/utils/win_keys.py
svn resolved trunk/code/proj/utils/keys.py


Aqui hay un buen link con información, al respecto:
http://little418.com/2009/05/svn-local-obstruction-incoming-add-upon-merge.html


miércoles, 22 de abril de 2009

CSS y la co#$%%$^@!

Siempre me ha costado el diseño cuando hago sitios, supongo porque nunca me he dado el tiempo de estudiadiar CSS a fondo, bueno, mientras peleaba con unos formatos para IE, me pille con esto:
http://www.sitepoint.com/article/style-web-forms-css/

No es un estudio muy profundo, es más bien básico y bien específico. Pero me parecio bueno, cómo hacer Formularios estilizados con CSS.

jueves, 12 de marzo de 2009

PyCon 2009, Chicago

El 25 de marzo comienza esta nueva edición de la PyCon en Chicago.

Esta vez veo muchas conferencias muy interesantes, con temas como: Testing, Inteligencia Artificial, multiproceso, Google App Engine, Testing AJAX, patrones de diseño, Jython, PyOpenGL, Django, Python en las empresas, metaprograming y mucho más...

Que ganas de estar por ahí...

Aqui está el link oficial:
http://us.pycon.org/2009/about/

lunes, 29 de diciembre de 2008

Proxy CGI en Python

Usando OpenLayers, se me hizo necesario usar un script proxy para solicitar url's a través de AJAX que no están en el mismo dominio. En la documentación de OpenLayers ponen un ejemplo de un script en python para hacer el proxy, y está bien bueno para aplicaciones sencillas donde no se necesite mucha seguridad, acá está el link:

http://trac.openlayers.org/browser/trunk/openlayers/examples/proxy.cgi

jueves, 27 de noviembre de 2008

Cómo hacer una lista en orden inverso

Lo más fácil es ocupar reverse()

>>> a=range(5)
>>> a.reverse()
>>> a
[4, 3, 2, 1, 0]

Y si queremos ser un poco más rebuscados, podemos usar list comprehension

>>> a=range(5)
>>> a
[0, 1, 2, 3, 4]
>>> [a[i] for i in range(len(a)-1,-1,-1)]
[4, 3, 2, 1, 0]

martes, 18 de noviembre de 2008

Cómo inspeccionar objetos JavaScript

Estaba quebrandome la cabeza haciendo debugging de JavaScript, me puse a buscar cómo inspeccionar objetos y encontré esto:

http://www.codeproject.com/KB/miscctrl/JS_Inspect_Object.aspx

Es una función sencilla, que recorre el objeto recursivamente y devuelve un string con el objeto formateado a HTML.
Si usas firebug de firefox y pones la función en la consola, cuando la llamas inmediatamente abre la vista DOM, así que queda pulento como inspeccionador de objetos.

lunes, 20 de octubre de 2008

Encuentro Linux 2008, Universidad de Concepción

Este Año el tradicional Encuentro Linux se realizará en la Universidad de Concepción (que liiinda universidad :-) ) los días 23 y 24 de octubre, entre las conferencias habrá una de Django, que la dará Leo Soto, que presentó su trabajo Django on Jython, en la DjangoCon. Suerte Leo!

Página oficial del Encuentro: http://2008.encuentrolinux.cl/

lunes, 15 de septiembre de 2008

Número de linea para Excepciones

Para saber dónde se cayo nuestro programa cuando hay un tray except que abarca mucho código.

except Exception, error:
lineno = sys.exc_info()[2].tb_lineno
raise Excepction("Exception: %s at line " % (error,lineno))

Ojo que esto es sólo para el módulo actual, si la excepcion se arrastra desde otro módulo, hay que hacer lo mismo para el otro módulo.

miércoles, 3 de septiembre de 2008

DjangoCon... conferencia, se viene

Desde el 6 al 7 de septiembre en Montain View, California, USA. Se darán una serie de Conferencias Django, en el primer evento de este tipo organizado por la comunidad Django.
Incluso participa un chileno, Leonardo Soto, con una charla de Django on Jython. Muy bien!

Esperemos que los chicos de Django publiquen videos de las charlas y fotos del evento, para los que estamos más lejos.

La página oficial del evento es: http://djangocon.org

martes, 24 de junio de 2008

Malditas Fechas 2: Cómo pasar un string a datetime

En Python 2.5 basta con usar datetime.datetime.strptime, pero en Python 2.4 esa función no existe para datetime, por lo que hay que usar una combinación entre la librería time y datetime:

import datetime
import time
dt1=datetime.datetime(*time.strptime(date_in_string,'%Y-%m-%d %H:%M:%S')[0:6])


miércoles, 18 de junio de 2008

Pygments ... flores, azucar y muchos colores!


¿Algo más bonito y fácil de leer que el código convenientemente coloreado?. Bueno, eso mismo lo podemos hacer en Web y otras más...

Pygments es un resaltador de sintaxis de python (o python sintax highlighter), que nos permite embellecer el código de varios tipos de lenguaje u otro formato que definamos a gusto.
De hecho la página inicial tiene una sencilla interfaz para colocar código, definir en que formato quiero destacarlo y chan! chan! ejecutar el proceso de highlight!. El resultado es un HTML formateado con estilos CSS.

A ver si lo empiezo a usar para colorear el código que vaya poniendo aquí :-)

Gracias Masterfunk!

Cómo instalar Eggs

Puede que para muchos sea rematado de fácil, pero a mi me costó navegar por unas cuántas páginas para saberlo.... otra vez... ¿seré muy nerd?, bueno, justamente es re-fácil

$ sudo easy_install MODULE.egg

OJO, se necesita tener previamente instalado easy_install

miércoles, 11 de junio de 2008

¿Qué demora más al construir strings?

Siempre me he preguntado cuál es la forma más óptima de construir strings, ya que Python ofrece muchas maneras, bueno, para probar respecto al tiempo de generación hice unos pequeños scripts que iteran muuuchas veces sobre una construcción de string y el resultado fue el siguiente:

$ time python str_concatenate.py
real 0m10.959s
user 0m10.380s
sys 0m0.482s

$ time python str_onestring.py
real 0m15.336s
user 0m14.485s
sys 0m0.688s

$ time python str_join.py
real 0m12.853s
user 0m12.075s
sys 0m0.613s


Conclusión:
El uso de " "+str(algo1)+" "+str(algo2) es más rápido,
le sigue el uso de join (si es una lista de cosas) " ".join(str(algo1),str(algo2))
y por último "%s %s" % (algo1,algo2), que yo pensé que era el más rápido :-(

Como decía mi primo: "plop! Pepo"

viernes, 6 de junio de 2008

List Comprehension

(Material de un Taller que hicimos en la pega)

List Comprehension
==================
List comprehensions provide a concise way to create lists without resorting to use of map(), filter() and/or lambda. The resulting list definition tends often to be clearer than lists built using those constructs. Each list comprehension consists of an expression followed by a for clause, then zero or more for or if clauses. The result will be a list resulting from evaluating the expression in the context of the for and if clauses which follow it. If the expression would evaluate to a tuple, it must be parenthesized.

Simples
=======
>>> [x for x in [1,3,5,7,9]]
[1, 3, 5, 7, 9]

>>> [x for x in range(5)]
[0, 1, 2, 3, 4]

>>> [x for x in range(2,10,2)]
[2, 4, 6, 8]

También se pueden anidar varios ciclos for (Gracias Dorian!)

>>> [ (x,y) for x in [1,2,3] for y in [4,5,6]]
[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]

Strings funcionan como listas
=============================
>>> [x for x in "Hola compadre"]
['H', 'o', 'l', 'a', ' ', 'c', 'o', 'm', 'p', 'a', 'd', 'r', 'e']



Cálculos:
=========
>>> [x*x for x in range(5)]
[0, 1, 4, 9, 16]


Condiciones:
============
>>> [x*x for x in range(5) if x%2]
[1, 9]
>>> [x*x for x in range(6) if x>3]
[16, 25]


Parseo de archivos:
===================
>>> stream="""Nombre, calorias, cantidad
... perejil, 10, 5
... betarraga, 20, 2
... zanahoria, 30, 10
... chocolate, 1000, 1"""
>>> [line.split(',') for line in stream.split('\n')[1:]]
[['perejil', ' 10', ' 5'], ['betarraga', ' 20', ' 2'], ['zanahoria', ' 30', ' 10'], ['chocolate', ' 1000', ' 1']]

>>> [[e.strip() for e in line.split(',')] for line in stream.split('\n')[1:]]
[['perejil', '10', '5'], ['betarraga', '20', '2'], ['zanahoria', '30', '10'], ['chocolate', '1000', '1']]

>>> [ "Nombre: %s, calorias: %s, cantidad: %s" % tuple([e.strip() for e in line.split(',')]) for line in stream.split('\n')[1:]]
['Nombre: perejil, calorias: 10, cantidad: 5', 'Nombre: betarraga, calorias: 20, cantidad: 2', 'Nombre: zanahoria, calorias: 30, cantidad: 10', 'Nombre: chocolate, calorias: 1000, cantidad: 1']


Capturar solo los números
=========================
>>> values = [[e.strip() for e in line.split(',')] for line in stream.split('\n')[1:]]
>> [ [int(v) for v in line if v.isdigit()] for line in values]
[[10, 5], [20, 2], [30, 10], [1000, 1]]


Pasar los valores formateados
=============================
>>> values_formated = [ ( l[0],int(l[1]),int(l[2]) ) for l in values]
>>> [line for line in values_formated if line[2]>2]
[('perejil', 10, 5), ('zanahoria', 30, 10)]


Suma condicionada: Sumar calorias de todos los elementos con cantidad>2
============================================
>>> sum( [line[1] for line in values_formated if line[2]>2] )
40


Construir strings usando List comprehension
===========================================
Ejemplo para armar una SQL que haga union de varias tablas
>>> " UNION ".join(
... ['SELECT max(%s) as time FROM "%s".%s' % tuple(x[:1]+['SCHEMA_NAME']+x[1:])
... for x in [
... ['field1','table1'],
... ['field2','table2'],
... ['field3','table3'],
... ['field4','table4']
... ]
... ]
... )
'SELECT max(field1) as time FROM "SCHEMA_NAME".table1 UNION SELECT max(field2) as time FROM "SCHEMA_NAME".table2 UNION SELECT max(field3) as time FROM "SCHEMA_NAME".table3 UNION SELECT max(field4) as time FROM "SCHEMA_NAME".table4'



Creación de Dictionary
======================
Ejemplo:
========
Esto no es necesario hacerlo:
d={}
for row in rows:
if d.has_key(row[0]):
d[row[0]].append((row[1], row[2]))
else:
d[row[0]] = [(row[1], row[2])]

Basta con hacer:

>>> rows=[[1,2,3,4,5],[6,7,8,9,0],[11,12,13,14,15]]
>>> d={}
>>> d.update( [ (r[0],(r[1],r[2])) for r in rows] )
>>> d
{1: (2, 3), 11: (12, 13), 6: (7, 8)}



Interseccion, Union, Diferencia entre listas
============================================
>>> A=[1,2,3,4,5]
>>> B=[2,4,6,8]
# Intersecion
>>> [x for x in A if x in B]
[2, 4]
>>> [x for x in B if x in A]
[2, 4]
# Difference
>>> [x for x in B if x not in A]
[6, 8]
>>> [x for x in A if x not in B]
[1, 3, 5]
>>>

Otra forma usando Set
=====================
>>> set(A).intersection(B)
set([2, 4])
>>> list(set(A).intersection(B))
[2, 4]
>>> list(set(B).intersection(A))
[2, 4]
>>> list(set(B).difference(A))
[8, 6]
>>> list(set(A).difference(B))
[1, 3, 5]


Set:
====
A set object is an unordered collection of distinct hashable objects. Common uses include membership testing, removing duplicates from a sequence, and computing mathematical operations such as intersection, union, difference, and symmetric difference. New in version 2.4.


Desafío:
=========

¿Se puede hacer esto con list comprehension?
¿si? ¿no? ¿porqué? ¿cómo?
>>> l=[]
>>> for n in ['Francisco','Richard', 'Luis']:
... for c in ['Fruta','Carne','Verdura']:
... if not(n=='Luis' and c=='Carne'):
... l.append('%s come %s' % (n,c))
...
>>> l
['Francisco come Fruta', 'Francisco come Carne', 'Francisco come Verdura', 'Richard come Fruta', 'Richard come Carne', 'Richard come Verdura', 'Luis come Fruta', 'Luis come Verdura']

lunes, 2 de junio de 2008

Luego de Webprendededor Concepción 2008

Bien motivado me quedé luego de escuchar a todos estos "geaks" (como uno) hablando de emprendimiento, innovación, creatividad, etc...

Noticia en Diario El Sur

Concepción no es un Santiago chico
Webprendedor, con las pilas puestas en Concepción

viernes, 30 de mayo de 2008