sábado, septiembre 29, 2007

Cosas que un desarrollador debe saber

Es habitual que cuando uno aprende a programar (ya sea educación formal o autodidacta) en lo que se pone énfasis es en el lenguaje, es decir, la controles de flujo, las iteraciones, etc. Luego cuando uno domina eso y comienza a desarrollar programas más grandes y comienzan a aparecer errores difíciles de encontrar lo que uno instintivamente hace es comenzar a poner print's (printf(), writeln, etc.) de la variables de interés, luego cuando son problemas más complejos y que hacen uso intensivo de cpu y uno busca mejorar el rendimiento (algoritmos golosos, dividir para conquistar, programación dinámica, etc.) nuevamente se echa mano a los print's y más o menos calcula en que parte se tarda más en pasar el flujo (los más avezados imprimen la hora y los aún más avezados hacen un difftime), PERO ¿por que mierda, los profesores, no nos dicen que existen herramientas para hacer lo mismo?. Yo en la universidad nunca le escuché a hablar a un profe del profiling, de usar un debugger, etc.

Pues bueno aquí va un pequeño esbozo de en que momento usar que cosas:

Si tu programa tiene errores y hace cálculos absurdos, lo que debes utilizar es un debugger, con eso puedes hacer lo mismo que con los print's (pero sin contaminar el código con print's) y muchas otras cosas más, como por ejemplo cuando tu aplicación se va de sgfault puedes imprimir el stack, puedes ver los valores que habian en las variables antes del segfault, puedes poner breakpoints (un breakpoint es un punto del código donde se queda en pausa el código y puedes comenzar a ejecutar step-by-step o hasta el siguiente break, etc.). Traten de hace eso con solamente print's XD. La primera vez que usen el debugger les quitará harto tiempo en aprender las cosas básicas (en especial si usas gdb como los machitos, aka sin-gui :P), pero a largo plazo el beneficio es enorme. (si usas python te puede interesar ver Introducing the pydb Debugger)

Si tu programa ha crecido y comenzó a ponerse un devorador de memoría y/o cpu, pues entonces haz profiling de tu aplicación :) y el profiling es aplicable también a la red (en caso de que tu software haga uso de ella), los datos obtenidos los podrás graficar y análizar los casos en que tu aplicación se pone lenta etc. (si les interesa el tema les recomiendo el video Linux.conf.au Profiling Desktop Apps)

Eso fue el consejo del día de hoy :P

PD: se dice que el profiling en linux es algo limitado debido a la falta de hooks en el kernel, pero eso no me consta empíricamente :P
PD2: más información en wikipedia: Performance analysis y Debugging

domingo, septiembre 23, 2007

Free Software rompiendo esquemas

Aún no dejo de sorprenderme cuando una gran empresa (aka como privativa, con el unico objetivo el de maximizar las ganancias) utiliza software libre (es una pena que en la gran mayoria de los casos nacionales no haya retribución directa), entiendo que probablemente se deba a empresas de software contratadas para desarrollar un portal y que utilizan un proyecto maduro para reducir costos, tiempo de desarrollo y finalmente ser más competitivos frente a sus clientes.

En este caso es redtv el que utiliza joomla.


una consulta, alguien sabe si el proyecto joomla 'obliga' a mantener en el footer (pie de página) los copyright?, porque al menos en el sitio de redtv no están, se esfumó cualquier mención al proyecto

update: no hay problema con remover el copytight del footer, siempre y cuando no se remueva de los archivos .php (source: http://forum.joomla.org/index.php?topic=49646.5;wap2)

viernes, septiembre 21, 2007

Haz tus documetos OpenDocument desde Python

Eso, mediante una libreria llamada odfpy es posible generar archivos ODF, la libreria está construida sobre el parseador XML clásico de Python y se encarga de validar el xml generado (para generar archivos odf válidos), es sumamente útil si necesitan generar reportes y cosas así.
El clásico helloworld con odfpy


from odf.opendocument import OpenDocumentText
from odf.text import P

textdoc = OpenDocumentText()
p = P(text="Hello World!")
textdoc.text.addElement(p)
textdoc.save("helloworld", True)

easy, no?.



PD: la libreria está _muy_ bien documentada, con buenos ejemplos, está en un archivo odt (no podia ser de otra forma :P)

miércoles, septiembre 19, 2007

Moviendo un cuadrado :P

Jugando con GooCanvas logre finalmente mover un elemento (item) sobre el canvas :)

video

Here is the code (python code, using pygoocanvas)


import goocanvas
import cairo
import gtk

def boton_presionado(item, target_item, event):
print "boton presionado"
fleur = gtk.gdk.Cursor(gtk.gdk.FLEUR)
canvas = item.get_canvas ()
canvas.pointer_grab(item,
gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.BUTTON_RELEASE_MASK,
fleur, event.time)
return True

def on_button_release(item, target, event):
canvas = item.get_canvas ()
canvas.pointer_ungrab(item, event.time)
return True

def on_enter_notify (item,target,event):
item.props.fill_color = "red"
return True

def on_leave_notify(item, target, event):
item.props.fill_color = "black"
return True

def on_motion(item, target, event):
canvas = item.get_canvas ()
change = False
if not event.state == gtk.gdk.BUTTON1_MASK:
return False

y = event.y
x = event.x
item.props.x = x - 5.0
item.props.y = y - 5.0

return True


def main():
window = gtk.Window();
window.set_title("titulo")
window.set_default_size(640,480)

window.connect("delete-event",gtk.main_quit)

scrolled_win = gtk.ScrolledWindow()
window.add(scrolled_win)

canvas = goocanvas.Canvas()
canvas.set_size_request(600,450)
canvas.set_bounds(0,0,1000,1000)

scrolled_win.add(canvas)

root = goocanvas.Group()

rect_item = goocanvas.Rect(parent=root,x=100, y=100,
width=200, height=100,
stroke_color="red", fill_color="blue",
line_width=5.0)

rect_item.connect("enter_notify_event", on_enter_notify)
rect_item.connect("leave_notify_event", on_leave_notify)
rect_item.connect("button_press_event", boton_presionado)
rect_item.connect("button_release_event", on_button_release)
rect_item.connect("motion_notify_event", on_motion)
#rect_item.connect("key_press_event",tecla_presionada)

text_item = goocanvas.Text(parent=root,text="Hello, World!",
x=250, y=150,
width=200, anchor=gtk.ANCHOR_SE,
fill_color="blue")

text_item.rotate(45, 300, 300)
canvas.set_root_item(root)

window.show_all()
gtk.main()

if __name__ == "__main__":
main()

nota: por desgracias los tabs se pierden en el blog, si alguien quiere el .py deje un comentario.

viernes, septiembre 14, 2007

Netbeans over Debian

Siempre dentro de las distribuciones de linux con una filosofia en la espalda ha estado Debian GNU/Linux, es por eso que hoy cuando me decidí a instalar netbeans (habia bajado el .bin hace unos días) se me ocurrió buscar si había algún como el clásico make-java (set de scripts que permitia crear un .deb a partir del .bin de JRE o JDL bajado de sun), así que apliqué la búsqueda y grande fue mi sorpresa al encontrar con lo siguiente:


freyes@yoda:~$ apt-cache search netbeans
libswing-layout-java - Extensions to Swing layout
libswing-layout-java-doc - Extensions to Swing layout - contains Javadoc API documentation
netbeans-ide - IDE for Java Development and More
netbeans-platform - IDE for Java Development and More (platform foundation)


así que le dí apt-get install y voilá, ya lo tenía en mi equipo up-n-running (está el repositorio contrib de debian)

martes, septiembre 11, 2007

OOXML debate in Miguel de Icaaza blog

El gran debate de las dos semanas pasadas ha sido OOXML, si debe o no adjudicarse el estado de 'estándar ISO' (estado que ya ostenta ODF).

Como noticia les paso el dato de que gracias a algunas personas que tienen contactos con gente del gobierno (para mayor detalle revisen el historial de la lista de mundoOS) lograron cambiar el voto de Chile, para que pasara de votar un 'Sí, acepto' a una 'abstención', lo cual es mejor seguir de novios con el diablo (aka microsoft).

Volviendo al tema central, Miguel de Icaza escribió un post en una lista de googlegroups dedicada a comentar los articulo de su blog, si les interesa pueden ver el thread, en el thread salen trapitos al sol relacionadas con Moonlight, como por ejemplo que si sacas moonlight de un lugar que no sea el server de novell podría caerte el fantasma de las patentes, además encontré un post de asbjornu en donde increpa a Miguel acerca de como puede catalogar de 'superb' el estándar de MS teniendo una tan pobre definición, teniendo un diseño tan malo, una falta de explicaciones para que sea implementarlo, además ni siquiera apegarse a estándares reconocidos y existentes hace mucho tiempo (como el relacionado con el calendario gregoriano). Les recomiendo leer el thread es bastante interesante como han comenzado a salir al sol el bullado acuerdo Novell-MS

Miguel de Icaza dijo:

OOXML is a superb standard and yet, it has been FUDed so badly by its competitors that serious people believe that there is something fundamentally wrong with it. This is at a time when OOXML as a spec is in much better shape than any other spec on that space.

Besides, it is always better to have two implementations and then standardize than trying to standardize a single implementation.




Escuchando: Freak on a leash

domingo, septiembre 02, 2007

Liberado a Win32 al 90%

Anoche acabo de finiquitar la muerte de la partición windos xp profesional de mi equipo :)

Ahora hago uso solamente de un windows virtualizado que contiene 1 programa solamente instalado que es uno que necesito para mi proyecto de título (more news coming soon about it).

A que se debió esta decisión radical?, la primera razón es que habia formateado hace como un mes la particion windows (posteriormente instalé windows) y no la volví a ocupar, ni siquiera me digné a instalar los drivers; segunda razón, yo manejaba mi colección de música en esa partición ntfs (para no desperdiciar el espacio) y anoche estaba editando unos tags de un par de mp3's y el ntfs-3g se volvió loco (ocupando en promedio 40% de cpu con peaks de 90%) y además el exaile en una oportunidad se colgó debido a esto me dieron los 5 minutos, agarré el hd externo, hice un backup con el siguiente comando:

# tar cf - | split -b 2000m - ruta/al/destino/particion.tar

Luego rehice las particiones y restaure mis archivos a la partición, edité el /etc/fstab para que apuntara correctamente las particiones, lo mismo se debe hacer con el menu.lst y reinstalar grub posteriormente (en caso de ser de la vieja escuela y aún usar lilo el procedimiento es el mismo)

El siguiente es mi esquema de particiones actual :)

yoda:/home/freyes# fdisk -l /dev/hda

Disco /dev/hda: 50.0 GB, 50018393088 bytes
255 heads, 63 sectors/track, 6081 cylinders
Units = cilindros of 16065 * 512 = 8225280 bytes
Disk identifier: 0x16121612

Disposit. Inicio Comienzo Fin Bloques Id Sistema
/dev/hda1 * 1 1460 11727418+ 83 Linux
/dev/hda2 1461 6081 37118182+ 5 Extendida
/dev/hda5 1461 1583 987966 82 Linux swap / Solaris
/dev/hda6 1584 6081 36130153+ 83 Linux