Blog de Abelardo Jara Berrocal: Ubuntu, electronica y software libre

Noviembre 25, 2007

Desarrollando con Mono y SharpDevelop en Windows

Archivado en: Programacion en C Sharp con Mono — Abelardo Jara @ 8:07 pm

Antes de seguir esta guia, recomendaria leer:

http://pintucoperu.wordpress.com/2007/11/26/la-licencia-gpl-de-java-vs-mono-y-net/ Si definitivamente necesitamos programar en Mono y C#, tenemos dos opciones: Usar el IDE para Linux llamado MonoDevelop o su version para Windows llamado SharpDevelop.

No aconsejo MonoDevelop ya que es lentisimo, y esta bastante inmaduro. Su editor de formularios esta en la version 0.1.

Personalmente recomendaria usar la version de Windows llamada SharpDevelop (tambien open-source). Si desarrollan sus programas en SharpDevelop con el compilador de Mono para Windows, muy seguro el programa correra sin problemas usando Mono Runtime en Linux.

Sharpdevelop permite además usar la API Windows Forms de .NET 2.0 para crear nuestros formularios. Sin embargo el compilador multiplataforma Mono aún no tiene implementada la API de Windows Forms completamente, por lo que se aconseja desarrollar nuestros GUIs usando un framework libre llamado Gtk# que está basado en Gtk+. Gtk# viene como parte del compilador Mono para Windows, ademas de un editor visual de formularios llamado Glade (version 3).

Aquí adjunto las instrucciones para instalar Mono y Sharpdevelop las cuales las he tomado del siguiente blog:

http://johansoft.blogspot.com/2007/04/mono-y-sharpdevelop-en-windows.html

Para desarrollar aplicaciones con Mono en Windows utiliza SharpDevelop y Mono, aqui explicare como hacerlo y que problemas resultan asi como tambien la solucion.

INSTALACION

1) Instalar el Mono y SharpDevelop:

Instalar .NET Framework 2.0, 22.4 MB: SharpDevelop 2 utiliza .NET 2.0.

Instalar SharpDevelop 2, 8.63 MB: Al instalar SharpDevelop no se instala automaticamente Mono, la instalacion de Mono sigue siendo obligatoria.

Instalar Mono, 48.9 MB: El link lleva a la pagina de todas las descargas de mono, deben elejir en la seccion “Windows Installer Windows 2000 and above” y el instalador para la version Stable, para el momento que se escribio este blog era la version Mono 1.2.3.1_0 Setup (Stable). El instalador de mono les preguntara el puerto donde se instalar XSP, el hecho de que tenga un puerto predeterminado no quiere decir que se iniciara automaticamente, el uso de XSP en Windows es Manual.

PROBLEMAS DESPUES DE LA INSTALACION Y COMO RESOLVERLOS

Al crear un proyecto de GTK# o libreria mono se encontraran con un problema, el error es el siguiente de acuerdo al tipo de proyecto que crearon:

Proyectos en Mono 1.1:

“Mcs.exe” exited with code -1.

Proyectos en Mono 1.2:

“Gmcs.exe” exited with code -1.

La solución es agregar una variable de entorno (de sistema) a Windows llamada “MONO_EXTERNAL_ENCODINGS” y con el valor “default_locale” (sin comillas).

Para establecer la variable de entorno no utilice el comando SET, en vez de eso, realice la operacion usando la interfaz grafica haciendo click derecho en el icono de Mi PC->Propiedades.

Ejemplo:

Lo siguiente es anexar a la variable PATH la ruta de instalacion de los binarios de Mono Runtime. Recuerden colocarle un punto -y- coma(;) al final del valor actual de la variable si antes no lo tenia y anexen la ruta a la carpeta “bin” de la instalacion de mono, para mi caso es “C:\Archivos de programa\Mono-1.2.3.1\bin”.

Ejemplo:

Le damos click al boton Aceptar para establecer los nuevos valores.

Reinicien SharpDevelop e intenten compilar el proyecto y veran como todo funciona :)

Establecer claves foraneas e integridad referencial en SQLite

Archivado en: Bases de datos — Abelardo Jara @ 3:37 pm

SQLite es un excelente motor de bases de datos unipersonales, parecido a Access. Tiene versiones para Windows y Linux y tiene interfaces para muchos lenguajes de programacion como Java, C++, Perl, PHP, ADO .NET

La gran ventaja es que nuestra aplicacion se puede distribuir con el motor SQLite instalado dentro de ella (embebido) asi que el cliente no tiene que configurar nada en su maquina (ODBC, instalar y configurar Postgres, MySQL, SQL Server etc), solo correr nuestra aplicacion.

SQLite parsea claves foraneas e integridad referencial en la definicion del esquema, pero no hace nada con ellas ni las incluye en la metadata.

La solucion mas usada es usar triggers. En este post de otro blog encontre la solucion al problema:

Tomado de: http://www.justatheory.com/computers/databases/sqlite/

Aqui empieza:

After some some Googling and experimentation, I’ve figured out how to enforce foreign key constraints in SQLite. I got most of the code from Cody Pisto’s sqlite_fk utility. I couldn’t get it to work, but the essential code for the triggers was in its fk.c file, so I just borrowed from that (public domain) code to figure it out.

Since I couldn’t find documentation for this elsewhere on the Net (though I’m sure it exists somewhere), I decided to just put an example here. Interested? Read on!

Say you have these two table declarations:

create table foo (

  id INTEGER NOT NULL PRIMARY KEY

);CREATE TABLE bar (

  id INTEGER NOT NULL PRIMARY KEY,

  foo_id INTEGER NOT NULL

         CONSTRAINT fk_foo_id REFERENCES a(id) ON DELETE CASCADE

);

Table bar has a foreign key reference to the primary key column in the foo table. Although SQLite supports this syntax (as well as named foreign key constraints), it ignores them. So if you want the references enforced, you need to create triggers to do the job. Triggers were added to SQLite version 2.5, so most users can take advantage of this feature. Each constraint must have three triggers: one for INSERTs, one for UPDATESs, and one for DELETESs. The INSERT trigger looks like this:

CREATE TRIGGER fki_bar_foo_id

BEFORE INSERT ON bar

FOR EACH ROW BEGIN

  SELECT CASE

     WHEN ((SELECT id FROM foo WHERE id = NEW.foo_id) IS NULL)

     THEN RAISE(ABORT, ‘insert on table "bar" violates foreign key ‘

                || ‘constraint "fk_foo_id"’)

  END;

END;

(You can put the RAISE error string all on one line; I’ve concatenated two lines to keep line lengths reasonable here.) If your foreign key column is not NOT NULL, the trigger’s SELECT CASE clause needs to an extra case:

CREATE TRIGGER fki_bar_foo_id

BEFORE INSERT ON bar

FOR EACH ROW BEGIN

   SELECT CASE

     WHEN ((new.foo_id IS NOT NULL)

           AND ((SELECT id FROM foo WHERE id = new.foo_id) IS NULL))

     THEN RAISE(ABORT, ‘insert on table "bar" violates foreign key ‘

                || ‘constraint "fk_foo_id"’)

  END;

END;

The UPDATE statements are almost identical; if your foreign key column is NOT NULL, then do this:

CREATE TRIGGER fku_bar_foo_id

BEFORE UPDATE ON bar

FOR EACH ROW BEGIN

   SELECT CASE

     WHEN ((SELECT id FROM foo WHERE id = new.foo_id) IS NULL))

     THEN RAISE(ABORT, ‘update on table "bar" violates foreign key ‘

                || ‘constraint "fk_foo_id"’)

  END;

END;

And if NULLs are allowed, do this:

CREATE TRIGGER fku_bar_foo_id

BEFORE UPDATE ON bar

FOR EACH ROW BEGIN

   SELECT CASE

     WHEN ((new.foo_id IS NOT NULL)

           AND ((SELECT id FROM foo WHERE id = new.foo_id) IS NULL))

     THEN RAISE(ABORT, ‘update on table "bar" violates foreign key ‘

                || ‘constraint "fk_foo_id"’)

  END;

END;

The DELETE trigger is, of course, the reverse of the INSERT and UPDATE triggers, in that it applies to the primary key table, rather than the foreign key table. To whit, in our example, it watches for DELETEs on the foo table:

CREATE TRIGGER fkd_bar_foo_id

BEFORE DELETE ON foo

FOR EACH ROW BEGIN

  SELECT CASE

    WHEN ((SELECT foo_id FROM bar WHERE foo_id = OLD.id) IS NOT NULL)

    THEN RAISE(ABORT, ‘delete on table "foo" violates foreign key ‘

               || ‘ constraint "fk_foo_id"’)

  END;

END;

This trigger will prevent DELETEs on the foo table when there are existing foreign key references in the bar table. This is generally the default behavior in databases with referential integrity enforcement, sometimes specified explicitly as ON DELETE RESTRICT. But sometimes you want the deletes in the primary key table to cascade to the foreign key tables. Such is what our example declaration above specifies, and this is the trigger to to the job:

CREATE TRIGGER fkd_bar_foo_id

BEFORE DELETE ON foo

FOR EACH ROW BEGIN

    DELETE from bar WHERE foo_id = OLD.id;

END;

Pretty simple, eh? The trigger support in SQLite is great for building your own referential integrity checks. Hopefully, these examples will get you started down the path of creating your own.

Cual usar? Java o C# Mono .NET o C++ con wxWidgets para desarrollo multiplataforma.

Archivado en: Reflexiones — Abelardo Jara @ 2:24 pm

Java y .NET tienen aspectos similares y cosas diferentes. Java es un lenguaje que se compila para correr en una maquina virtual JVM. Esta maquina virtual corre en casi cualquier sistema operativo: Windows, Linux, UNIX, Solaris, hasta en dispositivos mobiles. Es realmente fantastico ya que el mismo proyecto ya compilado como archivo .class o mejor .jar correra en cualquier otro sistema operativo sin ningun tipo de recompilacion. Basta con que des el archivo .jar y ya tienes una aplicacion completamente distribuitble. Incluso ademas si la combinas con las librerias SQLite puedes tienes en un tiro una aplicacion con base de datos totalmente portable y que se ejecutara en cualquier sistema operativo.

.NET no es multiplataforma y eso es algo que es importante resaltar. Hay un proyecto llamado Mono que hace los programas compilados con .NET corran sobre Linux y UNIX pero te sere sincero, todavia hay muchos cuelgues (te lo digo por experiencia propia). Este proyecto Mono incluye un compilador (2 versiones: mcs para net 1.1 y gmcs para net 2.0) y una maquina virtual (llamada mono) y es organizado por Miguel de Icaza. Mono es una maquina virtual que emula al .NET y trata de emular a Java en ser multiplataforma. Pero el estado de Mono es a verdad incompleto sobre todo en el paquete Windows Forms que no esta completamente portado y es inestable. Recuerda que aqui hay mucho trabajo de ingenieria inversa y eso siempre sera muy lento.

.NET aporta funcionalidad en que es posible ejecutar e interoperar diversos fragmentos de código escritos en distintos lenguajes, esto es, si codigas en C# o VisualBasic o J# todos estos lenguajes serán convertidos al lenguaje intermediario MSIL(“Microsoft Intermediate Language”) a través de un compilador determinado, este lenguaje intermediario es el que ejecuta el .Net Framework, de esta manera su código escrito en más de 20 lenguajes podrá interoperar. El codigo compilado desde cualquier lenguaje es compilado para correr sobre una maquina virtual que es el .NET Framework.
Mono trata de implementar este .NET framework.

Entonces aunque ambas son maquinas virtuales, la JVM y la .NET Framework son diferentes tambien, una es multiplataforma y la otra es solo para Windows. Una diferencia mas es que JVM es desde hace poco open-source desde que Sun la libero, asi que ahora es controlada ahora en su desarrollo por la comunidad y .NET si es controlada completamente por Microsoft.

Personalmente te aconsejaria ir por Java, dado que .NET es una plataforma privativa y siempre en el fondo estaras amarrado a Microsoft. Para Java tienes entornos de desarrollo muy bueno como Netbeans y Eclipse (ambos corren en Windows, Linux, etc). Ademas paquetes con clases en Java hay a montones, que te permiten hacer casi cualquier cosa, incluso un compilador para tu propio lenguaje (clases JLex y Java CUP). Conexion para base de datos las tienes con JDBC que te permite conectarte a casi cualquier gestor de base de datos: Postgres (la mejor base de datos libre), MySQL (tiene defectos en respecto a relaciones por sus tablas de tipo ISAM), SQLite (la mejor opcion si quieres hacer una base de datos de un solo usuario igualito que Microsoft Access y gratis), Oracle (que tiene una edicion libre personal para Linux y Windows)

Yo he comparado la performance actual en Linux Ubuntu de una aplicacion de ordenamiento de burbuja midiendo tiempo promedio y usando en cada medida un vector de 100 elementos con datos al azar, usando para compilarla el compilador C++ libre GNU, el compilador Intel C++ para Linux (libre tambien y se puede descargar de Internet), el compilador Java 1.6 y finalmente el compilador de Mono gmcs (para .NET 2.0) y los resultados son con respecto a performance:
de mejor a mas lento
1. Intel C++ Compiler y GNU g++ (empate, promedio de 0.24s para el algoritmo, ambos compilan a codigo maquina, puse nivel de optimizacion -O2)
2. Java 1.6 (promedio 0.34s)
3. Mono (usando gmcs para compilar y mono para correr: promedio 0.43s)

Algo interesante, he probado los tiempos tambien en Windows y los tiempos en Linux y son practicamente iguales, lo que indica que la JVM es superior a Mono en ambos sistemas. No he podido probar con Visual C++ 2005 asi que no podria decir si en codigo nativo en Windows es superior o igual o inferior a Linux. (bueno estoy añadiendo esto, la performance del compilador de Visual C++ usando tambien optimizacion -O2 me dio resultados superiores al compilador GNU GCC en Windows, pero la version en Windows del GCC es la 3.4 mientras que en Linux estan por la 4.2).

Algo interesante es que los archivos ejecutables en Linux en todos los casos fueron bastante más pequeños que en Windows. Asimismo el compilador de Intel me produjo un ejecutable bastante mas grande que el generado por el GCC, pero esto se debe sobre todo a técnicas de optimización agresivas del compilador de Intel como “loop unrolling” (recuerden que estas técnicas parecen sensacionales pero algunas como “speculation” hacen que el programa consuma mas wattios).

Si quieres aplicaciones que compilen a codigo nativo tanto en windows como en Linux hay ademas un framework para C++ que se llama wxWidgets. Se programan con un IDE para C++ que trabaja tanto en Windows como Linux que se llama Code::Blocks. Es muy bueno y puedes construir aplicaciones graficas en minutos. Personalmente lo uso cuando quiero que mis aplicaciones sean muy rapidas ya que no compila a ninguna maquina virtual. Las clases provistas por la wxWidgets se parecen muchisimo a las MFC (Microsoft Foundation Classes) del Visual C++ asi que aprenderlas es muy directo. Las librerias wxWidgets tambien son libres y el Code::Blocks tambien. Para aplicaciones multiplataforma que quieres que sean de alta velocidad te las recomendaria sobre las librerias GTK y sobre las Qt (Qt no son gratuitas en Windows)

Finalmente mi recomendacion para aplicaciones con rapido tiempo de desarrollo, multiplataforma pero de verdad (no como con Mono), y que no estaras dominado a la larga por las decisiones de Microsoft, entonces usa Java + Netbeans + Swing + (Postgres o SQLite). No tendras que pagar a nadie por las herramientas de desarrollo y correra en cualquier plataforma: Windows, Linux (Ubuntu) o UNIX (PC-BSD). No aconsejo MySQL al menos por ahora (ya que la tabla por defecto ISAM no hacepta llaves foraneas e integridad referencial, el nuevo tipo de tabla InnoDB si).

Ahora si quieren hacer una aplicacion con alta performance compilado a codigo nativo, recomendaria usar Code::Blocks Nightly Build + GNU Compiler + WxWidgets 2.8

Visiten mi blog www.pintucoperu.wordpress.com
Muchos saludos,
Abelardo

Compilar Latex directamente desde editor VI

Archivado en: EMACS y edicion de documentos con Latex — Abelardo Jara @ 4:53 am

Este es un truco que no sabia para compilar directamente desde el editor de consola Vi de Linux:

Para compilar dentro del vi mandamos el comando

:!latex archivo

Incluso podemos visualizar dentro del vi
:!xdvi archivo &

Realmente muy buen truco para programadores.

Blog de WordPress.com.