martes, 10 de febrero de 2009

MSYS

Una de las herramientas más útiles que he encontrado para el desarrollo en windows es sin duda MSYS.

Extraido de su página:

MSYS es una colección de utilidades GNU como bash, make, gawk y grep que permiten construir aplicaciones y programas que dependen tradicionalmente de la presencia de herramientas UNIX. Esta especialmente pensado para suplementar a MinGW y las deficiencias de la shell cmd (de windows).

Un ejemplo sería construir una libreria que hace uso de autotools build system. Los usuarios normalmente ejecutarían "./configure" y luego "make" para compilarlo. El script de configuración requiere un interprete que no está presente en sistemas Windows, pero incluido en MSYS.

No hay que confundir a MSYS como "UNIX en Windows", MSYS no incluye ningúna libreria ni compilador para C, por lo que no da la habilidad de portar magicamente programas UNIX a Windows ni proporciona ningúna funcionalidad especifica de UNIX como los nombres de ficheros sensibles a mayúscula.

Resumiendo: Con MSYS puedes compilar facilmente software multiplataforma con herramientas como make o configure (entre otras).

Un ejemplo es lo sencillo que resulta compilar SQLite para windows:
  1. Descarga el paquete sqlite-amalgamation-X.X.X.tar.gz de SQLite. Este incluye el código fuente tanto de la libreria como de la shell, además de los scripts de configuración.
  2. Dentro del directorio donde tengamos instalado MSYS existe un directorio llamado home. Este directorio es el destinado a colocar los ficheros provenientes de windows, asi que creamos un directorio nuevo dentro de home y lo llamamos "sqlite".
    Dentro descomprimimos el paquete descargado.
Hecho esto ya podemos ejecutar MSYS: Directorio de instalacion/msys.bat
Nos aparece una shell, parecida a cmd.exe de windows (pero mejor!). Aquí lo importante es recordar que los comandos que funcionan son los de UNIX/Linux; así que dir no funciona, habrá que utilizar ls.
Bien, cuando MSYS se abre el directorio de inicio es home, así que desde este lugar podemos acceder facilmente al directorio anteriormente creado sqlite:
cd sqlite
Lo siguiente es ejecutar configure para que prepare el sistema para la compilación:
configure
Por ultimo ejecuta:
make
Lo cual empezará el proceso de compilación.
Una vez terminado, en el mismo directorio se habrá creado un nuevo directorio ".libs", dentro del cual encontraremos la dll para windows necesaria para la distribución de nuestros programas, libsqlite3.a para linkar con codeblocks y sqlite3.exe, la linea de comandos de sqlite.

jueves, 5 de febrero de 2009

Qt 4.5, LGPL 2.1 y templates C++

Traducido de: obsenthryl's

La noticia ya ha llegado a los titulares de un montón de sitios web. Pero esta entrada no trata sobre eso, empecemos leyendo el anuncio oficial:
Nokia se enorgullece de anunciar que con la salida de Qt 4.5 vas a poder usar Qt bajo la Lesser General Public License (LGPL) version 2.1. Cuando sea distribuida en Marzo del 2009, Qt estará disponible bajo tres licencias: Comercial, LGPL y GPL
Estamos hablando de un modelo tri-licencia, mencionando explicitamente que LGPL 2.1 no tendrá ninguna modificacion (lo mismo indica en otras secciones del mismo FAQ). En la FAQ relacionada encontramos:
Cual es la diferencia entre LGPL y GPL?

Ambas licencias son documentos complejos que requieren una cuidadosa lectura para apreciar las diferencias significantes entre ambas. Sin embargo, una explicación "por lo alto" es que la GPL requiere que cualquier trabajo derivado (ej: aplicaciones desarrolladas usando Qt) deben licenciarse bajo los terminos de la GPL. La LGPL es menos restrictiva y permite el desarrollo de aplicacions de código cerrado. Distribuiremos Qt bajo la version 2.1 de la licencia LGPL, además de continuar ofreciendo Qt bajo la version 3.0 de GPL.

Sí, requieren extremado cuidado en su lectura. Y también, en otra sección del anuncio:

Porque querría comprar una licencia comercial? Cual es la diferencia?

La licencia comercial de Qt incluye soporte por email, acceso a actualizaciones y te permite desarrollar software de código cerrado. La LGPL conlleva algunas restricciones relacionadas con la capacidad de los usuarios para relinkar librerias y otras restricciones que pueden imponer requerimientos de arquitectura con la que algunas organizaciones pueden no estar de acuerdo.
De acuerdo, buenas noticias para los que quieran usar la LGPLv2.1 con Qt4.5.
Pero lo que no he visto en la FAQ, son una seria de temas relacionados con la licencia LGPL 2.1 sin modificaciones propuesta. Uno de los temas tiene que ver con las templates de C++.
Aunque es cierto que Qt 4.4 por ahora, no usa templates para los signals y los slots, las usa para las clases contenedoras. Tiene una licencia LGPL v2.1 sin modificar -Asumo que es su intención, como puede entreverse en su FAQ y republicado en otros websites - en consideración el uso de templates C++ y de técnicas de "template metaprogramming" por código de terceros, cuando se instancian esas templates LGPL v2.1 en un modelo de licencia no LGPLv2.1?
Se sabe que la instanciación de templates en realidad anida el código dentro del código final del usuario de formas que trascienden lo especificado en una licencia LGPLv2.1 no modificada.

La experiencia de otros desarrolladores presentan una solución sencilla: LGPLv3 soluciona este tema.

La LGPL requiere que los usuarios sean capaces de reemplazar el código LGPL con una versión modificada; esto es trivial si la libreria en cuestión es una librería compartida escrita en C. Pero no hay forma de hacer eso con C++, donde la mayor parte de la librería consiste en funciones inline y templates, que se expanden dentro del código que usa la librería. Así que para permitir a la gente reemplazar el código de la librería, alguien que la use debería distribuir su propio código fuente, resultando la LGPL equivalente a la GPL.

El artículo original continua ahondando en los problemas de las "novedades" que ofrece C++ y el atraso de la LGPL v2.1 en este aspecto.

Sin embargo, parece que Nokia leyó el muy buen artículo y ha hecho saber que están trabajando en añadir una excepción a la LGPLv2.1 que solvente este asunto con las templates y funciones inline de C++.

Por ultimo aprovecho para decir que ya ha salido la Release Candidate de Qt4.5 para las diferentes plataformas:

martes, 27 de enero de 2009

Vuelta a la escena

Bueno ha pasado bastante tiempo desde la ultima entrada (desde septiembre), desde luego no era mi idea tener esto tan parado... espero ser mas constante ;)

Retomando el tema de librerías de desarrollo, debo admitir que hace poco descubrí que mi anterior entrada sobre como configurar QT ya no sirve, pues (ignoro si siempre ha sido así) resulta que trolltech ofrece una versión ya compilada de su libreria para windows:
Aquí su ultima version (ahora mismo 4.4.3):
http://www.qtsoftware.com/downloads/opensource/appdev/windows-cpp
ftp://ftp.trolltech.com/qt/source/qt-win-opensource-4.4.3-mingw.exe

Así que para los más perezosos y aquellos que no quieran pasarse dos horas (o más) compilando os recomiendo descargar este paquete.
Nota: Yo he descargado el paquete que incluye mingw, no se si los demás paquetes también vienen precompilados.

Nuevas sobre Qt
/kju:t/
Una reciente noticia muy importante es el cambio de licencia que trolltech va a aplicar sobre la nueva versión de Qt 4.5, la cual pasará a ser LGPL.
Hasta ahora, si el desarrollador no quería pagar una licencia comercial estaba obligado a distribuir su software con licencia GPL, debiendo liberar el código fuente de su aplicación. Esto no es necesario bajo la LGPL, cosa que en mi opinión hará que veamos un aumento de nuevo software usando Qt.

Por otro lado detrás de este movimiento se encuentra una empresa que se juega su parte del pastel en el mercado de dispositivos mobiles: Nokia.
Nokia compró a finales del año pasado a trolltech para pasar a usar el potente toolkit y no quedarse atrás en la nueva generación de dispositivos móbiles que inauguró Apple con su Iphone. Con esta acción Nokia pone a disposición del desarrollador el primer set de librerias con más libertad del mercado para dispositivos mobiles.

domingo, 21 de septiembre de 2008

Sqlite con Code::Blocks

Otra de instalaciones!
Esta vez se trata de SQLite, una librería que nos permite manejar datos desde una BBDD dentro de nuestra propia aplicación de una forma muy sencilla.

Con SQLite podemos almacenar y recuperar datos usando sentencias SQL, olvidándonos completamente de las funciones de manejo de archivos y de realizar rutinas de búsqueda de datos (esto último se agradece bastante).

En esta entrada describiré el proceso que seguí para usar SQLite desde Code::Blocks (bajo Windows XP).
He usado Code::Blocks 8.02 para el proceso, y mientras escribo este articulo la versión actual de SQLite es la 3.6.2.

Descargamos los siguientes ficheros desde la página de SQLite:
http://www.sqlite.org/
Precompiled Binaries for Windows
  • sqlite-3_6_2.zip : Esto no nos servirá para usar SQLite con Code::Blocks pero nos será muy útil para debugar, pues con esta aplicación podremos consultar y modificar nuestras bases de datos.
  • sqlitedll-3_6_2.zip : La DLL para windows, sin ella la aplicación compilada no se ejecutará. También fabricaremos la libreria .a para Mingw (el compilador que usa Code::Blocks).
Source Code
  • sqlite-amalgamation-3_6_2.zip: Aqui se encuentra el fichero sqlite3.h que deberemos incluir en nuestra aplicación.

Una vez todo descargado, el primer paso es obtener la libreria en formato .a para poder linkar con nuestro programa.
Descomprimimos el fichero sqlitedll-3_6_2.zip en un directorio y abrimos una línea de comandos.
Nos dirigimos al directorio donde descomprimimos sqlitedll-3_6_2.zip y ejecutamos:

dlltool -D sqlite3.dll -d sqlite3.def -l libsqlite3dll.a

Ahora, crea dentro de tu directorio favorito donde almacenes tus librerias llamado SQLite, y dentro suyo los directorios include y lib.
Yo tengo un directorio donde almaceno todas las librerias que uso habitualmente (C:\libs\), pero puedes omitir este paso y colocar los ficheros en los directorios de Code::Blocks:
X:\{DIRECTORIO_INSTALACION_CODEBLOCKS}\MinGW\include
X:\{DIRECTORIO_INSTALACION_CODEBLOCKS}\MinGW\lib

Bien, descomprime el fichero sqlite-amalgamation-3_6_2.zip dentro del directorio include.
El fichero libsqlite3dll.a colocalo dentro del directorio lib.

Ahora solo nos queda crear el proyecto con Code::Blocks.
Crea un nuevo proyecto,
-"Console application"
-Marca C++ como lenguaje de programación
-Indica el directorio donde guardar el proyecto.

Si NO guardaste los ficheros dentro del directorio de Code::Blocks sigue estos pasos:
-Project/Build options: En el panel de la izquierda marca el nombre del proyecto (no debe estar marcado "debug" ni "release").
-En la pestaña "Linker settings", haz click sobre el botón "Add" y busca el fichero "libsqlite3dll.a" que generamos anteriormente. Con esto Code::Blocks linkara la libreria con nuestro programa.
-En la Pestaña "Search Directories", dentro de la pestaña "Compiler" haz click sobre "Add" y selecciona el directorio "include" donde se descomprimió el fichero sqlite-amalgamation-3_6_2.zip. Así el compilador encontrará el fichero "sqlite3.h"


Si guardaste los ficheros dentro del directorio Code::Blocks:
-Project/Build options: En el panel de la izquierda marca el nombre del proyecto (no debe estar marcado "debug" ni "release").
-En la pestaña "Linker settings", en el cuadro de texto "Other linker options" escribe:
-libsqlite3dll

Bien, para probar que todo funciona correctamente copia el siguiente código y trata de compilarlo:


#include
#include
using namespace std;

int main()
{
sqlite3 *db;
char *zErrMsg = 0;
int rc;

rc = sqlite3_open("test.db", &db);
if( rc==SQLITE_OK )
{
cout << "Yeah!";
}
sqlite3_close( db );
}

Y eso es todo, mucho más sencillo que con QT y GTK!! Así da gusto.

miércoles, 25 de junio de 2008

Instalar QT con Code::Blocks

Ahora es el turno de jugar con QT /Cute/ (previamente lo hicimos con GTK y su dichosa instalación) y empezamos con lo más tedioso y es su instalación, que aunque no es tan complicada como la de GTK, tiene su miga.
QT
, para quienes no lo sepan es una librería con una interfaz en C++ que orientada a la creación de aplicaciones de ventana multiplataforma.

Recientemente (17 de junio 2008) Nokia ha comprado a Trolltech para potenciar aún más su faceta multi-sistema y continuar con QTopia (imagino para usarlo en sus nuevos teléfonos mobiles.

Remarco que este tutorial esta orientado para su instalación bajo windows, aunque en linux debería ser exactamente lo mismo.

La primera diferencia respecto a GTK la vemos al descargar la librería: nos viene toda en un mismo paquete; pues si bien GTK se apoya sobre otras librerías de terceros, QT es principalmente todo un bloque, por lo que a la hora de descargarlo suma un punto en facilidad (haz sitio para 120MB). Otra diferencia es la licencia de uso, no podemos usar QT para desarrollar aplicaciones comerciales (sin antes pasar por caja claro), aunque siempre podemos usar su librería. para proyectos opensource.

El link para la versión opensource lo tenéis aquí (v4.4):
http://trolltech.com/downloads/opensource

Una vez descargado el tocho de librería, lo descomprimimos alli donde queramos dejarla instalada.

Atención!: Recomiendo acortar el nombre del directorio a qt4.4, pues el nombre por defecto es demasiado largo y puede dificultar los siguientes pasos (bueno vale, no me gustan los nombres de directorios largos).

Para ejecutar el siguiente paso debemos tener instalado MinGW (Si usáis Code::Blocks, seguramente tengáis un directorio llamado MinGW dentro de su directorio de instalación).

Añadimos el directorio MINGW/bin a la variable de entorno PATH.
Por seguridad, crea también la variable QMAKESPEC con valor "win32-g++" (sin las comillas).
De esta manera forzamos a usar el compilador g++ en caso de tener más de uno instalado.

Abrid una consola y os dirigís al directorio donde hayáis descomprimido QT y ejecutáis:
configure

Esto empieza a compilar la aplicación qmake. Un poco de paciencia porque puede llegar a tardar un poquillo (5min-30min, mas incluso...).

Una vez compilado qmake, faltará ejecutar:
make
quién por fin empezará a compilar las librerías.
Si qmake tardó, agárrate porque esto puede llevar toda una tarde. Así que tranquilamente puedes salir a pasear al perro porque a menos que tengas un pc ninja te vas a aburrir mirando el proceso.

Ya compiló? Pues te recomiendo un ultimo comando:
make clean
esto eliminará archivos temporales creados durante el proceso (muuuuuchos MB).

Bien, ahora abre Code::Blocks y crea una nueva variable global:
Settings/Global variables

Llámala "qt".
  • Rellena el campo base con la ruta en donde se encuentra la libreria
  • Rellena los campos "include" y "lib" con la ruta a "include" y "lib" respectivamente.
  • En User-defined fields usa una nueva fila y rellénalo de esta forma:

    • Campo izquierdo: mkspecs

    • Campo derecho:$(#qt)/mkspecs

Con esto hemos creado una variable llamada "qt" que podemos usar a lo largo de las opciones de configuración de Code::Blocks para apuntar fácilmente a los directorios "include" y "libs".

Lo ultimo es crear un nuevo proyecto (consola o ventana, como mas guste, pero que sea C++).

Para compilar aplicaciones QT hay que usar el Makefile creado por qmake.
Para indicarlo:
Project/Properties/Project Settings
Marcamos la casilla "This is a custom Makefile".

Vamos a especificar los directorios donde se encuentra la librería:
Project/Build Options

Con el nombre del proyecto seleccionado en la parte izquierda de la ventana, entramos en la pestaña Search Directories:
En la subpestaña Compiler escribimos:
$(#qt.include)
Y en la subpestaña Linker:
$(#qt.lib)

Y ya tenemos todo el tinglado montado.
Hay que tener una cosa en cuenta, y es que antes de compilar hay que crear un archivo make con qmake. Qmake hace uso de los archivos de proyecto .pro. Estos archivos le indican a qmake que ficheros utiliza nuestro proyecto para poder compilar correctamente. Paradójicamente qmake puede crear nos uno automáticamente:
qmake -project
Siempre y cuando todo esté bien referenciado en el código fuente. Con el .pro creado, simplemente un:
qmake
creará el archivo makefile y ya podremos compilar sin problemas con Code::Blocks. Ten en cuenta que cada vez que añadas un nuevo fichero a tu proyecto (o quites uno) debes actualizar el archivo makefile. Ignoro si este proceso puede ejecutarse automáticamente desde Code::Blocks, pero seguiré investigando ;)

martes, 27 de mayo de 2008

Cinta adhesiva en el oceano

Debe de tratarse de cinta adhesiva especial: se pega incluso en el océano!!

http://maps.google.com/...

jueves, 22 de mayo de 2008

Herramientas de programador I: Control de versiones

Tener organizado las diferentes versiones de nuestro software es indispensable para todo programador mínimamente ordenado. Almacenar cada versión en un directorio compartido no es la mejor opción, y menos aún cuando varios desarrolladores meten mano al código y se pisan entre ellos.

Para evitar esto existen aplicaciones que nos permiten aplicar una trazabilidad al proceso de producción/mantenimiento del software. Una de ellas es Subversion un servidor open source con licencia Apache/BSD disponible tanto para Windows, Linux y Mac OSX.

Usar esta herramienta nos permite:

  • Ver todos los cambios realizados al código fuente

  • Conocer el autor de cualquier modificación

  • Revertir siempre que queramos a una versión anterior

  • Ramificar una versión estable para realizar pruebas sin tener que tocar el origen

  • Unir varias ramas

  • Bloquear el acceso al código hasta que hayamos terminado con él (evitamos que nadie pise nuestro trabajo)


Entre muchas otras características.

Instalar un servidor Subversión es muy sencillo. Describiré el proceso para Windows XP.

  1. Lo primero es descargarnos el programa servidor: Descarga Subversion


  2. Necesitaremos también el cliente, llamado Tortoise, el cual se integra con la shell de windows (explorador de archivos) mostrando un nuevo menú de opciones en el menú contextual: Descarga Tortoise

  3. Para poder ejecutar el servidor Subversion como servicio de windows necesitaremos el programa SrvAny distribuido con Windows Server 2003 Resource Kit Tools, aunque mejor descargar este paquete distribuido por Eugene Lazutkin en su blog: http://lazutkin.com/download/SrvAny.zip.



Bien una vez descargado todo lo necesario, procedemos a instalar el servidor Subversion. Como toda instalación de aplicaciones Windows no tiene ningún secreto... siguiente, siguiente y siguiente. Haz lo mismo con Tortoise. Después de instalar Tortoise se te pedirá que reinicies Windows.

Una vez reiniciado el sistema, escoge un lugar donde almacenar el repositorio (lugar donde se almacenarán todos los ficheros). Crea un directorio y dale un nombre (por ejemplo, "repositorio"). Entra dentro y pulsa el botón derecho del ratón, y dentro del menú TortoiseSVN selecciona la opción Create repository Here. Esto creará los archivos necesarios para empezar.

La parte más complicada es la de configurar Subversion como servicio de Windows, para iniciarlo automaticamente al iniciar el sistema.
Para ello utilizaremos la aplicación SrvAny pues se encarga de registrar aplicaciones como servicios. Si hemos descargado SrvAny de la pagina de Eugene, descomprimimos el fichero en el directorio de nuestra elección, y bajo la línea de comandos ejecutamos:

InstSrv svnserve C:\SrvAny\SrvAny.exe
Reemplaza "C:\SrvAny\" por el directorio donde hayas descomprimido el paquete
Con esto hemos registrado subversion como servicio, ahora falta decirle a Windows donde se encuentra Subversion instalado; para ello debemos modificar el registro de Windows.

Ejecuta RegEdit (Inicio/Ejecutar/Regedit.exe) y navega hacia:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\svnserve.

  1. Haz click derecho sobre la carpeta svnserve y selecciona Nueva»Clave, dale al nuevo directorio creado el nombre "Parameters"

  2. Dentro de este directorio crea dos Valores alfanúmericos:

    • Nombre: Application Valor: C:\Archivos de programa\Subversion\bin\svnserve.exe (Ruta al archivo svnserve.exe)

    • Nombre: AppParameters Valor: -d -r C:\repositorio (Ruta al directorio que creaste para usar como repositorio)




Por ultimo, configuraremos el servidor para dar acceso publico de escritura/lectura.
Dentro del directorio repositorio, existe una carpeta llamada conf, dentro hay varios archivos:

  • svnserve.conf: En este fichero especificamos los permisos generales de los usuarios anónimos y logueados.

    anon-access = read ##Damos permiso solamente de lectura a los usuarios anonimos
    auth-accesss = write ##Damos permiso de escritura y lectura a los usuarios autentificados

  • passwd: En este fichero se listan los usuarios junto con sus contraseñas. De esta manera cuando alguien intente conectarse a nuestro repositorio solo podrán acceder a él aquellos usuarios listados en el fichero (siempre y cuando bloqueemos el acceso a los usuarios anonimos en svnserve.conf

    [users]
    usuario = contraseña




Con esto ya tenemos listo el sistema para empezar a trastear con Subversion.
Para probarlo, abre una ventana del explorador de Windows y escribe en la barra de direcciones:

svn://IP_DEL_SERVIDOR



Tortoise hará acto de presencia mostrándote la estructura de directorios y su contenido del servidor SVN.

Por hoy lo dejamos aquí, si tienes mas hambre sobre el uso correcto de Subversion puedes revisar la documentación incluida con la instalación. Si te da pereza espera mi próxima entrada en la que explicaré como utilizar de forma estructurada esta fantástica herramienta.