Entradas etiquetadas como ‘programación’

Escrito por Iván Alonso el Jueves 28 de Enero de 2010

He estado resolviendo algunos problemas del Proyecto Euler y, tras conseguir los primeros veinticinco, me ha sorprendido con esto:

Parece que esté avanzando en un videojuego. Ya estoy dentro del veinte por ciento de usuarios que han hecho algo más que resolver los dos primeros (algo que hice hace un par de años). Ha costado volver a ponerme con el tema, pero estoy aprovechando que quería conseguir algo más de soltura con Python para, en vez de ponerme a hacer tutoriales insípidos, practicar con problemas de otro tipo.

Escrito por Iván Alonso el Lunes 21 de Diciembre de 2009

Vamos a por nuestro primer ejemplo con OpenGL. Tras las explicaciones del anterior post sobre OpenGL, la única puntualización necesaria sería sobre qué es eso de GLUT que pone en el título del post. GLUT es el acrónimo de openGL Utility Toolkit, y viene a ser poco más que un wrapper para facilitar las tareas más comunes, con llamadas algo más sencillas. A los desarrolladores de OpenGL debería decirles algo el hecho de que este tipo de productos existan y sean tan ampliamente utilizados. Como veremos, también incluye algunas facilidades para el uso del teclado y ratón.

Nosotros lo utilizaremos únicamente para este primer ejemplo, para afianzar conceptos básicos… porque con él estamos perdiendo una gran cantidad de productos potenciales en lo que ejecutar nuestro código (GLUT únicamente existe para los sistemas principales, pero no para consolas, específicamente para productos homebrew que no disponen de SDKs oficiales, ni para el iPhone). Además se dejó de trabajar en GLUT hace tiempo, ahora habría que utilizar freeglut y blablabla… conclusión: no lo vamos a utilizar en el futuro.

Lo primero que haremos será crear un nuevo proyecto, de tipo Command Line Tool, para C++, al que pondremos como nombre lo que más rabia nos dé (a mi se me ha ocurrido Demo01, en un arranque de originalidad):

Captura de pantalla 2009-11-17 a las 11.04.11.png

Se creará un proyecto con un único archivo de código (main.cpp). La siguiente tarea a realizar será añadir las referencias a los frameworks/librerías que vamos a utilizar, en este caso OpenGL. Esto lo haremos haciendo click derecho sobre el proyecto, Add, Existing Frameworks:

Captura de pantalla 2009-11-17 a las 11.07.48.png

Otra de las buenas cosas de los Mac es que todo está localizado donde debe. Así que todos los frameworks instalados en el sistema se mostrarán en una lista de la que tan sólo hemos de escoger OpenGL.framework y GLUT.framework (OpenGL Utility Toolkit) y añadirlos al proyecto.

(más…)

Escrito por Iván Alonso el Lunes 16 de Noviembre de 2009

Necesitamos instalar:

  1. Mono para OS X (incluye Mono, GTK# y Cocoa#)
  2. MonoDevelop para OS X

Con la primera ejecución de MonoDevelop nos buscará las últimas actualizaciones.

Para comprobar que todo está funcionando correctamente, crearemos una aplicación de prueba que muestre un Hola Mundo, pero la peculiaridad estará en que utilizaremos los mismos espacios de nombres que usamos cuando programamos bajo Windows. Es decir, no utilizaremos GTK#, Cocoa#, ni ningún otro subsistema, sino WinForms.

Creamos una nueva solución C# vacía, como la siguiente:

Captura de pantalla 2009-11-16 a las 13.49.15.png

Tras esta ventana, puede aparecer otra para activar determinadas opciones para personalizar el proyecto, pero no marcaremos ninguna (en caso de necesitarlas, puede hacerse posteriormente en las opciones del proyecto).

Se habrá creado la solución HolaMundo con el proyecto HolaMundo en su interior. Haciendo click derecho sobre el proyecto añadiremos un nuevo archivo C# (Añadir, Nuevo Archivo, Empty Class, y le ponemos como nombre -por ejemplo- CHolaMundo).

Captura de pantalla 2009-11-16 a las 13.53.28.png

Captura de pantalla 2009-11-16 a las 13.54.50.png

Incluiremos el siguiente código en el nuevo archivo creado:

using System;
using System.Windows.Forms;
 
namespace HolaMundo
{
   public class CHolaMundo : Form
   {
      static public void Main ()
      {
         Application.Run (new CHolaMundo ());
      }
 
      public CHolaMundo ()
      {
         Text = "Hello Mono World";
      }
   }
}

Si intentamos compilar en este momento, nos devolverá el error:

Error CS0234: The type or namespace name `Windows’ does not exist in the namespace `System’. Are you missing an assembly reference?

La razón es que, por defecto, el compilador de C# incluído con mono únicamente referencia los siguientes ensamblados: mscorlib.dll, System.dll y System.Xml.dll. Para que el proyecto sepa que debe referenciar System.Windows.Forms, podemos lanzar el compilador desde línea de comandos (con el parámetro -r:System.Windows.Forms.dll), o añadirlo permanentemente a las opciones del proyecto.

Bajo el nombre del proyecto, en los archivos de la solución, veremos la carpeta Referencias, sobre la que haremos doble click, y buscamos el ensamblado que queremos referenciar en nuestro proyecto:

Captura de pantalla 2009-11-16 a las 14.09.23.png

Tras incluirlo, la solución ya funcionará perfectamente, por lo que podemos hacer un Build (Command+K) y Ejecutar (Command+Alt+Enter), y podremos ver este resultado:

Captura de pantalla 2009-11-16 a las 14.17.19.png

Desde luego no es la aplicación de .Net más compleja que podíamos utilizar como ejemplo, pero ya es algo. Y tanto el código utilizado como el ejecutable resultante son 100% compatibles con sistemas Windows.

Escrito por Iván Alonso el Jueves 12 de Noviembre de 2009

200911121051.jpg

Gordon, la mascota de Go

Los pasos necesarios que hay que realizar para poder programar, compilar y enlazar código en Go sobre Mac OS X son los siguientes (que no son más que una explicación algo más extendida y específica para Mac de la página de información en golang, distribuida mediante una licencia cc-by-3.0). Si buscáis un manual sobre cómo hacer lo mismo pero sobre Ubuntu, os recomiendo este de MundoGeek.

Necesitamos incluir nuevas variables de entorno, que serán utilizadas por varios componentes posteriores. Para esto editamos nuestro archivo .bashrc, que está en nuestro directorio personal o home, y añadimos al final las siguientes líneas:

export GOROOT=$HOME/go
export GOOS=darwin
export GOARCH=amd64
export GOBIN=$HOME/bin
export PATH=$PATH:$GOBIN

Obviamente, debemos acordarnos de crear estos dos directorios dentro de nuestra home: go y bin.

GOOS especifica que estamos utilizando un Mac, y GOARCH que utilizaremos la arquitectura de 64 bits. Si tenemos un equipo de 32 bits utilizaremos GOARCH=386. Una vez editado este archivo comprobaremos que el funcionamiento es el correcto desde una nueva terminal, con el comando:

$ env | grep GO

Una vez establecidas las variables de entorno nos descargaremos el resto de herramientas del repositorio de Go, para lo que tendremos que utilizar la herramienta Mercurial para Mac.

200911121050.jpg

Desde la misma portada de la web de mercurial podremos descargarnos directamente la última versión de la aplicación (1.3.1 en el momento de escribir estas líneas), que será un paquete mpkg que debemos instalar. Una vez terminado este proceso ya dispondremos de todos los comandos necesarios desde la terminal, como el gestor de código distribuido hg (podéis probar a ejecutar hg sin ningún parámetro desde la terminal y podréis ver cómo ya está funcionando).

Tras esto nos descargaremos todo el código relacionado con el proyecto Go, utilizando el siguiente comando:

$ hg clone -r release https://go.googlecode.com/hg/ $GOROOT

El proceso será como sigue, y se realizará en apenas un par de minutos:

$ hg clone -r release https://go.googlecode.com/hg/ $GOROOT
requesting all changes
adding changesets
adding manifests
adding file changes
added 3976 changesets with 16799 changes to 2931 files
updating working directory
1640 files updated, 0 files merged, 0 files removed, 0 files unresolved
$

Tras habernos descargado todo el código necesario, podemos generar las herramientas finales que utilizaremos. Para esto es necesario disponer en nuestra máquina de gcc, bison, libc6-dev y el editor ed. Todas estas herramientas estarán ya instaladas en el sistema si tenéis instalado el IDE XCode, algo que, por otra parte, recomiendo.

Supongo que si os estáis dedicando a desarrollo de software sobre un Mac ya lo tendréis instalado, si no, aquí está disponible. Sólo necesitáis estar dados de alta como desarrolladores en developer.apple.com para poder realizar cualquier descarga.

Comenzamos la generación de las herramientas con:

$ cd $GOROOT/src
$ ./all.bash

Lo que podrá llevar un rato de intenso floodeo de información en la terminal, mientras se realizan todas las compilaciones, pruebas unitarias, etc., etc. Al terminar, tal y como especifica el manual de instalación de Go, el proceso mostrará algo similar a:

[...]
--- cd ../test
N known bugs; 0 unexpected bugs

Donde N es un número que varía dependiendo de la versión que hayamos descargado. En mi caso particular, utilizando Snow Leopard y las especificaciones que os he mostrado (darwin, amd64), no se encuentra ningún fallo.

[...]
--- cd ../test
0 known bugs; 0 unexpected bugs

Por último, ahora que ya se han generado todas las herramientas necesarias, utilizaremos el clásico ejemplo del Hola Mundo para comprobar que todo funciona como debe. Cremos el archivo hello.go (si nuestras variables de entorno son correctas, podemos hacer esto en cualquier lugar, por ejemplo en una carpeta en el escritorio), con el siguiente contenido:

package main
import "fmt"
 
func main() 
{
   fmt.Printf("hello, world\n")
}

Lo compilamos con el comando 6g. Este es el compilador que hemos generado para amd64, si estuvieramos utilizando 386 el comando sería 8g. Esta será además la nomenclatura utilizada para todos los comandos y extensiones de archivo resultantes, utilizando siempre un 6 para amd64, un 8 para 386 y un 5 para arquitecturas arm.

6g hello.go

Se ha generado con esto el archivo hello.6, que enlazamos con el comando 6l:

6l hello.6

Y por último se habrá creado un archivo ejecutable de nombre 6.out, que podemos lanzar como cualquier otro ejecutable Unix:

$ ./6.out
hello, world
$

Y con esto y un bizcocho ya podemos empezar a programar en Go, echándole un vistazo a toda la información que se puede encontrar en su página web, golang.org.

Escrito por Iván Alonso el Martes 20 de Octubre de 2009

Este año el iPhone blablabla, el tour mundial de ferias orientadas a desarrolladores de iPhone, no pasa por Madrid… ni por muchos otros lugares del mundo por los que sí pasó el año pasado, en su primera edición. En Europa únicamente pasará por Londres, París y Hamburgo, y creo recordar que el año pasado pasó por una decena de ciudades distintas.

Aquí la página de información sobre el iPhone Tech Talk World Tour.

Escrito por Iván Alonso el Domingo 28 de Junio de 2009

He estado probando la nueva versión de Eclipse (de nombre Galileo) y el tutorial que escribí para la anterior versión (Ganímedes) sigue siendo válido, aunque dejo aquí algunos posibles apuntes para quien quiera probarlo.

A tener en cuenta:

  • Ahora al crear un nuevo proyecto podéis seleccionar directamente el toolchain a utilizar (y detecta que tenemos disponible Cygwin Gcc al tener ya instalado Cygwin con los paquetes necesarios).
  • Sin embargo, obviamente,  sigue siendo necesario añadir el directorio de los binarios de Cygwin en el Path del sistema (Paso 2 de la sección “Gcc para Windows” del anterior tutorial).

Algunos posibles errores del entorno:

  • Unresolved inclusion: <stdio.h> Si las utilidades os funcionan (gdb, Mmke, etc) pero tenéis en el entorno mensajes de este estilo, es posible que la detección de los directorios donde residen las librerías de Cygwin no haya sido correcta. En las propiedades del proyecto,  C/C++ Build, Settings, pestaña Tool Settings. En Cygwin C++ Compiler/Directories y en Cygwin C Compiler/Directories, añadimos las siguientes carpetas (Lógicamente, cambiando el comienzo del path por aquél donde reside vuestra instalación de Cygwin):
    "C:\Archivos de programa\Cygwin\lib\gcc\i686-pc-cygwin\3.4.4\include"
    "C:\Archivos de programa\Cygwin\lib\gcc\i686-pc-cygwin\3.4.4\include\c++"
  • Error launching external scanner info generator. Si tenéis este tipo de warnings, probad a abrir una ventana de línea de comandos de Windows (no la de Cygwin) y escribir g++ y gcc. Si no os los reconoce pero sí encuentra el comando g++-3, es porque tiene un problema con los enlaces simbólicos del sistema Cygwin, que seguro que se puede resolver de algún otro modo más profesional, pero este también lo soluciona: Propiedades del proyecto, C/C++ Build, Discovery Options. En Discovery Profiles Scope cambiamos de Per-Language a Configuration Wide, y así nos aparecerá más abajo un menú para escribir el Compiler invocation command (será g++, lo cambiamos a g++-3). Con eso sabrá encontrar siempre el comando correcto.
  • make: warning:  Clock skew detected.  Your build may be incomplete. Puede estar debido a que tengáis el proyecto almacenado en una partición FAT, dejadlo en una NTFS. Yo tengo una FAT para contenido común entre varios sistemas operativos (incluyendo OS-X) y no imaginé que pudiera ser por eso. Este error viene por un error de fechas en los archivos, y el sistema detecta posibles inconsistencias (que en este caso pueden estar debidas a que un sistema de ficheros FAT no almacena mucha información sobre los archivos que guarda).
Error launching external scanner info generator
Escrito por Iván Alonso el Lunes 16 de Febrero de 2009

Vamos a escribir una pequeña guía de lo que hace falta para acceder (alta/baja/modificar, la pesadilla de todo consultor) a los datos en una base de datos local en una aplicación iPhone.

Primeramente hemos de crear el archivo al que accederemos, algo que podremos hacer mediante línea de comandos o utilizando un GUI.

  1. Utilizando la línea de comandos, abriremos una sesión de terminal y utilizaremos el comando sqlite3, que estará instalado por defecto con la instalación del iPhone SDK. Utilizaremos los comandos típicos de SQL (para más información, hay que consultar la documentación de SQLite para así entender las diferencias con otros SQL).Recordad que las instrucciones han de terminar en punto y coma y que la instrucción para salir del intérprete de SQLite es ‘.quit‘.
  2. Otra opción es utilizar un interfaz gráfico, que será mucho más cómodo. Para Mac lo mejor que he encontrado es el plugin de Firefox SQLite Manager, que parece dar buen resultado.

(más…)

Escrito por Iván Alonso el Jueves 2 de Octubre de 2008

Trasteando en mi primer día con el entorno Xcode (extraño, muy extraño), he aprendido a hacer el típico Hola Mundo para el iPhone (o al menos para su emulador).

Es necesario descargar el entorno de desarrollo Xcode con el iPhone SDK (disponibles aquí), juntos en una única descarga de 1.39GB. Hay que darse de alta como desarrollador en la página de Apple, aunque vale cualquier cuenta que ya utilicéis, como por ejemplo la de iTunes y el AppStore.

Una vez instalado abrimos /Developer/Applications/Xcode. Ignoramos la típica ventana de primera ejecución y tendremos que abrir un nuevo proyecto de tipo iPhone OS, Application, Window-Based Application. Llamaremos a nuestro proyecto HelloWorld (originalidad 100%).

(más…)

Escrito por Iván Alonso el Lunes 8 de Septiembre de 2008

Ya sabemos más o menos que es eso de Mono. Intuimos que, como todos los grandes proyectos Open Source, tiene un roadmap de funcionalidades a incluir, por lo que nos preguntamos ¿En qué estado se encuentra ahora mismo el proyecto?

A lo largo de este Septiembre de 2008, aparecerán varias versiones release candidate, como preludio a la aparición de la versión 2.0 de Mono a final de mes. Este es un resumen de cómo quedará el proyecto tras esta nueva versión:

API: Terminadas las Base Class Libraries con lo que le faltaba (Windows.Forms) hasta .Net 2.0. Añadido ADO.NET 2.0 y ASP.Net 2.0 (WebForms y Web Services, faltan WebParts y ciertas partes de Mobile).

Compiladores: C# 3.0 (incluyendo LINQ to Objects y LINQ to XML, aunque aún sin LINQ to SQL u otras bases de datos) y Visual Basic .Net con generics.

Máquina Virtual: Ahora incluye también DLR (Dynamic Language Runtime), que en .Net se utiliza para IronRuby o IronPython, y en un futuro en otros lenguajes más asociados al scripting como el futuro Visual Basic .Net 10.0.

Otros:

  • MoMA (Mono Migration Analyzer), una herramienta para evaluar la complejidad previa de portar un proyecto de .Net a Mono.
  • Gendarme: una herramienta para analizar programas y librerías en código intermedio buscando problemas que los compiladores no suelen buscar.
  • Debugger: Que se está rehaciendo, dado que en la última versión de MonoDevelop no es posible realizar debug de la aplicación.

Otros proyectos con su propio roadmap:

  • Moonlight: implementación libre de Silverlight, con apoyo por parte de Microsoft. Actualmente soporta la versión 1.0 y se ha comenzado con la 2.0. El desarrollo puede hacerse con su propio IDE (Lunar Eclipse), y ya existe como plugin para Mozilla.
  • Proyecto Olive: trasladar nuevas librerías de .Net a Mono, entre las que se encuentran algunas de las más interesantes de .Net 3.0, como WF, WCF o WPF, aunque aún se encuentran en un estado muy alpha.
  • Proyectos Google Summer of Code: LINQ to DB (MySql, Oracle y PostgreSQL), MSBuild, etc.
  • Otras librerías: Al igual que se han reimplementado las Base Classes, también hay muchos proyectos relacionados con Mono o que incluyen wrappers/bindings a otros sistemas, como: GTK#/Glade# para utilizar las interfaces de usuario de GTK+ y/o desarrollar aplicaciones nativas para Gnome, Mozilla libraries (Gecko#), integración con Mac OS X (Cocoa#), bases de datos, seguridad, integración con Unix, y un largo etcétera [documentación].
Escrito por Iván Alonso el Lunes 8 de Septiembre de 2008

Básicamente es una versión libre de .Net, aunque definirlo así no es del todo acertado, ya que existen similitudes y algunas peculiaridades en partes de sus componentes. En la wikipedia encontramos una definición bastante acertada:

Es un conjunto de herramientas compatibles con .Net que siguen estándares ECMA.

.Net puede reducirse a tres componentes: un compilador, una máquina virtual y un conjunto de librerías. Como Java. En el caso de .Net existen decenas de compiladores que traducen distintos lenguajes al código intermedio de .Net (CLI, Common Language Infraestructure), aunque el proyecto Mono se ha centrado principalmente en C#, y posteriormente algunos otros.

La máquina virtual (el CLR), proporciona un entorno seguro de trabajo, control de memoria, hilos de ejecución, control de excepciones, un garbage collector

Las librerías (Base Class Library) encapsulan muchas de las funcionalidades que podemos necesitar en el día a día del programador, y son lo bastante amplias como para poder desarrollar aplicaciones complejas en su totalidad sin necesitar librerías externas.

¿Qué incluye Mono de todo esto? Pues vayamos por partes: dado que el código intermedio (CLI) es un estándar liberado por Microsoft (bajo el control del ECMA, estándar Ecma-335), cualquiera puede programar compiladores para esta tecnología. El compilador de C# de Mono sólo necesita basarse en las especificaciones del CLS (Common Language Specification) y del lenguaje C# (también estándar, Ecma-334). También existen documentos ISO definiéndolos [lista].

El CLR es una implementación concreta de Microsoft, pero Mono incluye su propia máquina virtual compatible con el CLI. Incluye un compilador Just-in-time, un compilador Ahead-of-time, cargador de clases y librerías, garbage collector, threads e interoperabilidad.

Y las librerías: Mono incluye una reescritura de prácticamente todo el API, aunque alguna cosa podría faltar. El principal caballo de batalla (de hecho en prácticamente cualquier sistema de código abierto) ha sido siempre el interfaz de usuario. El espacio de nombres Windows.Forms alcanzará compatibilidad con la versión 2.0 de .Net en la próxima aparición de Mono 2.0. Por otra parte, aquellas partes de las librerías de .Net que hayan sido incorporadas más tardíamente a Mono, tienen contrapartidas funcionales. Por ejemplo: Si no queremos usar la implementación Mono de Windows.Forms, podemos utilizar GTK#.

En resumen:

Por lo tanto, hemos visto qué es Mono y hemos comparado sus tres bloques principales con .Net, viendo que nos proporciona una implementación libre (y verdaderamente multiplataforma) de .Net, permitiendo incluso utilizar código (y binarios) desarrollados con Visual Studio en otras plataformas.

En el próximo post de esta serie veremos otras peculiaridades de este sistema.