lunes, 24 de setiembre de 2007

/a bien tôt









domingo, 23 de setiembre de 2007

/eclipse y cygwin - problemas para compilar



La facilidad para gestionar proyectos en Java, lo personalizable y lo extensible que es mediante plugins, hace que Eclipse sea uno de mis entornos de desarrollo preferidos. Decidí cambiar la versión anterior a la nueva, Eclipse Europa para Windows XP. Quiero probarlo mas con C++, y para eso descagué la última versión del proyecto CDT (versión 4.0), que permite crear aplicaciones en C/C++.
CDT no viene con compilador, por lo tanto corre por nuestra cuenta descargarlo e instalarlo, y posteriormente configurarlo en Eclipse.



CDT tiene características interesantes
sin ser aun un producto maduro, dentro de lo destacable está el autocompletado de código, una plantilla para generar clases, elegir el tipo de constructores y atributos, depurar y ver el contenido de las variables durante el proceso.
Por defecto con el que trabaja bajo Windows es
MinGW. Como ya tenía instalado Cygwin y algo había hecho con CDT en la versión anterior de Eclipse, me puse a trabajar como siempre. Pero no fue así, después de compilar el código, y sin tener errores aparentes, cuando intenté ejecutarlo salió una ventana con el siguiente mensaje de error: "Launch failed no binaries".




Además en la consola tenía una cantidad de líneas con mensaje: "xx: makefile error" (xx es el número de línea). Lo primero que pensé fue que no tenía bien configurado el make y me propuse a hacerlo. Esto puede hacerse desde: Proyecto ->Propiedades->C/C++ builds



Ningun tipo de variación a las configuración surtió efecto, Google tampoco, decidí entrar al newsgroup correspondiente: news.eclipse.org -> eclipse.tools.cdt.
Ahí estaba la respuesta: es un bug que fue arreglado para la próxima versión de CDT, la 4.01 segun Doug Schaefer uno de sus desarrolladores.
El problema es que Eclipse se fija lo que tiene instalado cygwin en el archivo
c:\cygwin\etc\setup\installed.db (puede ser editado con WordPad), y busca por {"gcc ", "binutils ", "make "} si no encuentra nada de eso, cygwin no funciona. La comparación debería ser por gcc-core, ya que no hay gcc en el archivo installed.db.

Conlusión y solución: para usar Eclipse con C++ en Windows, con la versión actual de CDT (4.0) instalar el compilador MinGW o trabajar con Code::Blocks.
En un post previo, había comentado de las diferencias entre MinGW y Cygwin.






/desarrollo rápido para web



Hace un tiempo baje de internet GeneXus, en parte por la insistencia de un familiar cuya empresa está montada en función de productos realizados con esta herramienta.
El me hablaba de las facilidades y la (innegable) rapidez de desarrollo que se logra usando Genexus
.

Lamentablemente, y a su pedido, tengo que caer en esa costumbre uruguaya de decir, sin mencionar nombres. Y no me gusta, pero hago una excepción porque tiene que ver con el contenido de este post.

Sinceramente y al margen de reconocer las bondades del producto, una especie de metalenguaje que a partir de la modelización de una realidad genera el código de la aplicación, no logró entusiasmarme demasiado.
Principalmente porque no me gusta ver que todo se arma sin saber cómo, un sistemas de cajas negras que no comprendo (porque no es necesario), porque además si quería modificar el código generado era una tarea engorrosa, y porque me gusta ver el proceso desde la cocina.
Prefiero invertir un tiempo en aprender paradigmas de desarrollo que me permitan generar mis bibliotecas, que después usaré como un puzzle de acuerdo a las circunstancias, pero que yo conozco porque yo las generé, a que me den algo armado por otro. Y donde además, el conocimiento para realizar la aplicación no pasa tanto por la lógica de los algoritmos, ni de la ingeniería de software, sino que está restringido a la lógica de negocios.
(El me decía que yo podría trabajar generando componentes para GeneXus más que desarrollando aplicaciones con esa herramienta).

Es una herramienta ideal para software de gestión (escritorio o web) que es a lo que la empresa de mi familiar se dedica, pero cuando intentamos salir de esa trinchera, desarrollar con GeneXus es bastante más complicado, o directamente imposible.
No lo considero viable para realizar procesamiento de imagenes o juegos, y actualmente estoy interesada en esas áreas.

Tampoco me convenció demasiado que el diseño de la base de datos dependiera completamente de la aplicación. Y cuando modificamos el modelo automáticamente altera las tablas, si es necesario, dificultando su re utilización en otras aplicaciones.

Pueden generarse productos competentes en GeneXus, de hecho la empresa de este familiar, tiene éxito a nivel nacional y creciente en el exterior.
Pero es GeneXus dependiente, el mismo me dijo que apenas conocía la tecnología .NET (no lo necesita), o java, o los diferentes tipos de arquitectura. Y es porque esta herramienta se lo da digerido. Concluyendo que si un día no existía GeneXus debería contratar programadores porque el no sabe hacer casi nada. El es un gran experto en modelar problemas, asi que larga vida a GeneXus.
GeneXus es ideal cuando son pocos empleados, y se necesita sacar algo rápido al mercado, y como en su caso que comenzó solo, le vino al pelo.

En informática todo va rápido, pero por ahora soy de la idea que mas vale conocer paradigmas de desarrollo, y ver qué lenguajes o herramientas se adaptan mejor a uno u otro de acuerdo a las circunstancias o a un problema dado. Pero sí me interesa que esos lenguajes sean flexibles dentro de sus características, que me permitan controlar lo que hago porque puedo ver cómo lo hacen, y para mi GeneXus en ese aspecto, entre otros, no es flexible.
Y ademas porque no quiero depender de un lenguaje en particular, si bien entiendo que por perfiles personales y de trabajo llegamos a preferir uno mas que otro.

La forma que elegimos para trabajar, cuando podemos elegir, es la filosofía de vida que elegimos también, otra manera de interactuar. Esto no pretende ser una crítica a quienes usen GeneXus, porque como dije pueden generarse productos muy comptetentes.
Prefiero lo menos pragmático quizás, para algunos, pero que siento me da un conocimiento mas integrado a nivel de desarrollo y análisis, y de control en otras áreas. Y con GeneXus me sentí restringida.
Además, por experiencia se, que cuando contamos con un conjunto de bibliotecas en el lenguaje que sea, creadas por nosotros, cualquier aplicación será de desarrollo rápido. Me pasa en mi trabajo para ORT.

dos interesantes herramientas
Vi dos herramientas
gratuitas para desarrollo rápido web xpotronix y SIUToba que me 'recordaron' a Genexus, pero me gustaron más por la libertad que permiten. A diferencia de Genexus, la base de datos se centra en su organización y no en la aplicación.
Aun las estoy probando, y no puedo decir mucho más, pero lo dicho recién le juega a favor.









sábado, 22 de setiembre de 2007

/publicidad antitabaco




La misma apareció el 11 de setiembre de este año en el Khaleej Times, un diario de Dubai.
"5.4 millones de personas mueren por año por causas relacionadas al tabaco, esto es 2000 veces 11/9".

Claro, no es la única causa de muerte, ni lo único que conspira contra los habitantes de este planeta, sobre todo considerando algunas obras contra natura existentes en Dubai, como la isla flotante Palm Jumeirah (cosa de nuevo rico, plata + mal gusto, me recuerda al Conrad)






/arte(rapia) grupal




No se si es la sobre abusada Web 2.0 o qué es, pero la idea está buena, algo asi como, "a ver que sale entre todos". Eso es drawball, un proyecto colaborativo donde cualquiera puede dibujar en un lienzo virtual.
La participación diaria del usuario está limitada a aproximadamente 1/10,000 de la superficie, esto es porque el mayor espacio está reservado a los anunciantes y otras comunidades online.
Pueden hacer zoom sobre un área específica de la obra para ver con mas detalles los diferentes dibujos entramados.

Este video con aceleración de imagenes para sintetizar las diferentes etapas del proyecto de manera mas didáctica, condensa las transformaciones de este mural participativo durante un año.

(Demora la carga, puede ser lento, mi velocidad de conexión es 10024/128kb)


vía haha.nu





/identificando memory leaks



Por cuestiones de performance, me vi obligada a chequear los memory leaks de una aplicación desarrollada en Visual C++. Esto es, identificar aquella memoria que fue pedida a demanda (mediante new) y el programa ya no usa, y no se ha liberado (no se realizó el delete correspondiente). O sea algo asi como 'crear' nuestro garbage collector.

Las consecuencias de este consumo indebido de memoria pueden ser varias, desde enlentecer el rendimiento de la aplicación, hasta provocar comportamientos erráticos en otras aplicaciones abiertas o en la propia aplicación.

Buscando info en la web, vi que esto no solo se aplica a C/C++, sino que además puede darse en C# lenguaje con su propio garbage collector.
El administrador de memoria puede recuperar la memoria que quedó fuera del alcance del sistema o fuera de uso, pero no puede liberar aquella memoria que aun permanece al alcance o potencialmente en uso (y no lo está).
El alcance de la memoria se define cuando hay referencias directas o indirectas a ella. Y mientras las haya el administrador de memoria las ignora.
Ejemplo: agregar items a una lista, y olvidar quitarlas (borrarla de memoria) cuando terminamos el procedimiento. El administrador no podrá saber si esa entrada será referenciada nuevamente a menos que algo en el código del programa lo indique.

Este artículo de msdn
explica en mas detalle los memory leaks en memoria no administrada bajo C# (viene con código).

Remitiéndome a mi problema en C++, y particularmente Visual C++, encontré una función que indica en una ventana si tenemos 'memoria colgada' o no liberada.

Para habilitar las funciones de heap al debug, hay que agregar al programa, y en este orden:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>


crtdbg.h, mapea las funciones malloc y free con las versiones de las mismas en el depurador, _malloc_dbg y _free_dbg respectivamente, las cuales registran la memoria pedida y liberada. (Este mapeo sucede al depurar)

#define mapea la versión de las funciones del heap (CRT) correspondientes con las versiones de las mismas en el depurador. (No es necesaria, pero si la omitimos la información obtenida será menos descriptiva)

Agregadas las sentencias previas, en el programa hay que incluir la siguiente sentencia:


Cuando el programa se corre desde el debugger _CrtDumpMemoryLeaks muestra información sobre la memory leak en la ventana de salida.

Me basé en la siguientes referencias
codeguru (con ejemplos), msdn2.microsoft


Para
Delphi, existen las siguientes opciones (no probé ninguna) :
  • memCheck (freeware con código) la versión actual 2.75 es para Delphi 5.1, Delphi 6, Delphi 7, Delphi 2005 y Delphi 2006 (aunque no ha sido probada en las dos últimas). Ofrece una unidad (unit, simil de header para los que usan C/C++/C#) con funciones para el chequeo de memoria.
  • euroekalog, componente que se integra al ide (versión de prueba)


Aplicaciones independientes de cualquier compilador/IDE
Hay entornos de desarrollo o compiladores que no ofrecen esta facilidad, por lo tanto debemos recurrir a aplicaciones que nos dan esa información.
Esta es una lista de aplicaciones razonablemente completa y descriptiva sobre alguna de ellas.

De las mas conocidas (y probadas por mi) está IBM Rational Purify (solo para Windows) que puede descargarse en versión de prueba, (o bueno, está eMule o algun cliente torrent).
Realiza un análisis en tiempo de ejecución sobre los siguientes características de un programa: corrupción de memoria, memory leaks, rendimiento de la aplicación, cheque del registro de windows.

Para Linux existe una aplicación gratuita con similares características a la anterior, Valgrind.







/"error" con el debugger de Visual C++ (aplicación de consola)



Aunque el título es bastante descriptivo, entro en detalles.

Caso: crear una proyecto vacío
para consola con Visual C++ (Visual Studio 2005), por vacío me refiero a: proyecto sin main, ni bibliotecas incluidas por defecto.

Lo que yo hacía: crear un .cpp .h, salvarlos, Build solution (compilar, linkeditar archivos ) me daba 0 error, 0 warning. El "proyecto" compila los archivo
s pero al intentar depurarlos (Debug F5) me salía el siguiente error:


Mi error: consistía en asumir que esa compilación se hacía para los archivos del proyecto, y no era así, porque éstos no habían sido incluidos en el mismo.

Solucción: Agregar los archivos al proyecto, hay dos formas:

1) Project -> Add New Item (seleccionar el tipo de archivo a crear)




2) Project->Add Existing Item (agregar archivos ya existentes, que fue lo que yo hice)


La solución me averguenza por lo trivial, pero ese Build Project, me confundió bastante, ya que compila archivos "de proyecto" que aun no han sido incluidos.

Dejo la solución, porque una vez más la encontré en foros de MSDN en inglés y no en foros en español..(los yanquis - y yo- seremos mas nabos). De todos modos vi en diversos foros posts mencionando ese error, y muchas veces se apuntaba a un error de instalación de Visual Studio, o del debugger, o de tocar claves del registro, o bien registrar la siguiente dll: mscordbi.dll.
En mi caso, no estaba registrada, y sin embargo pude depurar el código sin problemas
bajo Windows en C++ o C#. Y eso me hacía pensar que habría una solución mas simple.
Antes de comenzar a tocar nada, verifiquen si el compilador funciona en otras circunstancias. La solución evidentemente era mas fácil.








sábado, 15 de setiembre de 2007

/taller de Programación y Arte



Hoy recibí de Aldo un mail con información sobre este taller de próximo comienzo en la Facultad de Ingeniería (2da semana de octubre). El mismo está orientado a alumnos de Bellas Artes, Arquitectura e Ingeniería.

Este taller fue armado por Etienne Delacroix, un docente francés proveniente del cyber punk que anda por el mundo ofreciendo su taller a las facultades interesadas.
Segun decía en el mail, Ingeniería fue la única facultad que aceptó su propuesta después de haber sido rechazada por Bellas Artes (no se mencionan motivos).
Actualmente se lleva a cabo en unos 'laboratorios' armados en los entrepisos del sector
de "sala de máquinas", al fondo de la facultad.

El cupo del taller es limitado, y el criterio de selección no parece ser tanto el orden de inscripción, sino mas bien las inquietudes que motivan a los interesados a realizarlo.
Uno de los requisitos es enviarle una carta al docente encargado señalandole las motivaciones que nos hacen querer tomar ese taller. El grupo parece estar formado en función de los perfiles de los 'postulantes' que mejor se adecuen a los objetivos del taller.
(
Para estudiantes de Ingeniería no tiene materias previas, y otorga 3 créditos ).

Actualmente el TAP no está bajo la dirección de Delacroix, sino de otros docentes, segun se citaba, con sus ventajas y desventajas.

" .....la idea del taller es que el alumno aprenda a re-utilizar porciones de harware y software para construir otros implementos. se aprende a reutilizar parches de java y html para construir páginas web y pequeños programas gráficos, o a usar elementos electrónicos básicos para construir desde instalaciones interactivas a instrumentos musicales. cuando fui vi muchas cosas interesantes: pequeños teclados, pequeños robots que se movian siguiendo reglas básicas, videos hechos con fotos y programación java, programitas de dibujo muy sencillos pero efectivos y pasibles de ser "colgados" en la web... html es el lenguaje de progrmación de páginas web, y java es un lenguaje orientado a objetos que permite dibujar y hacer animaciones, muy similar a actionscript (de hecho es su base). El grupo de estudiantes es heterogéneo. Se trabaja en conjunto con estudiantes de ingeniería capacitados para realizar cosas complejas para las que probablemente se necesite mucho más información que la que el TAP proporciona, por lo que a veces para un lego puede ser frustrante, pero si se va con ganas de adquirir elementos básicos de programación y trabajo en equipo interdisciplinal, es una muy buena oportunidad."

Quedé entusiasmada por participar de un taller donde se redefinen conceptos, y se experimenta con ellos extapolándolos a otra áreas. Y sin duda, que interactuar en esta experiencia con gente proveniente de otras orientaciones condimenta mis motivos. Me encuentro evaluando horarios de facultad y trabajo para ver si puedo formar parte...veremos.

En la web del Taller encontrarán mas información, aqui les dejo el programa, y particularmente destaco, aunque también está en la web, este texto imperdible de Pierre Lévy acerca de "La inteligencia colectiva".