Mostrando entradas con la etiqueta sombras chinescas de un programador. Mostrar todas las entradas
Mostrando entradas con la etiqueta sombras chinescas de un programador. Mostrar todas las entradas

lunes, 8 de abril de 2013

'TypeScript Revealed'

No lo había puesto en los despropósitos del año porque los orienté más hacia lo no-técnico, pero terminaba el año pasado con una espinita clavada en el corazón. Y este año quería poner remedio.

Sobre finales de junio un compañero me pidió que le echase una mano con un proyecto que tenía atascado. Era un proyecto personal suyo y ambos estábamos a tope de curro y debíamos «robar» horas para intentar sacarlo adelante. Por motivos que no vienen al caso la parte del servidor se había decidido hacer en Node.js. En cierta forma este compañero es como yo: Cada vez que se embarca en algo aprovecha para aprender en el proceso. En una ocasión normal hubiese agradecido la oportunidad de trabajar con algo tan nuevo como Node.js, pero no era una ocasión normal. Estaba pasando por una época realmente complicada. El cliente del proyecto en el que andaba inmerso estaba convencido de que le habíamos engañado —la empresa en la que trabajo— y nos estaba poniendo muchas, muchísimas, pegas en absolutamente todo. Y se había obstinado en creer que yo era parte del problema. Sobretodo porque yo estaba desplazado en cliente y me convertí, gracias a ello, en la cara visible. Todo el equipo hizo horas extra como burros para revertir esa situación. Ahora vamos a comer juntos y discutimos de lo humano, de lo divino y de lo mundano entre bromas y risas. El camino recorrido desde entonces hasta ahora ha sido complicado y, en él, tuve que dejar cosas atrás.

Como dije hace un momento, en una ocasión normal, hubiese agradecido la oportunidad de pelear con Node.js. Hasta la fecha no había pensado en JavaScript como un lenguaje relevante para nada serio. Más allá de hacer dos o tres cosillas en el navegador, todas adaptaciones de código encontrado en la red de redes, no me había planteado nada sustancialmente importante con él. Pero esa era la oportunidad de hacerme con el lenguaje; algo que a un programador supuestamente curtido como yo no le supondría mucho esfuerzo. Me equivoqué. No era lidiar solo con el lenguaje. Era también pelear con miles de línea de código ya escrito que sonaban a forma antigua y olvidada del Klingon. De repente retrocedí casi veinte años. Trazar el código a mano insertando escrituras en consola para descubrir en qué punto la aplicación podía estar fallando es de las cosas que menos disfruto a estas alturas. Debo haber envejecido mucho, pero trabajar con código ajeno, en un lenguaje que no termino de entender en profundidad, y sin las herramientas mínimas e indispensables para ello —entiéndase un depurador en condiciones— es de esas cosas que alimentan mi pereza hasta extremos insospechados. Me rendí rápidamente, huí cual comadreja del campo de batalla, dejando al compañero en la estacada, y me dediqué por entero a salvar la relación con el cliente. Terminaba el año pasado con buenas expectativas de colaboración para este último, pero sentía que un puñetero lenguaje de programación infernal me había vencido. A mí, que con quince años escribía opcodes de Z80 por pura diversión. En plan Escarlata O'hara levanté el puño y prometí que este año que venía aprendería —en el sentido de dominio— JavaScript y, de paso, algún lenguaje más.

El primer trimestre me centré en otras cosas, pero empezando ya el segundo, retomé el asunto. Sin embargo he aquí que, planeando el modo de aproximarme de la forma menos traumática, descubro un lenguaje llamado TypeScript [@ www.typescriptlang.org]. (Sí, lo sé, voy siempre con retraso; ¿y qué?) Es un superconjunto de JavaScript desarrollado por Microsoft con la colaboración de Anders Hejlsberg [@ Wikipedia] —el mismo que parió Delphi y C#—, un verdadero monstruo en esto del diseño de lenguajes de programación. Puedo levantar el puño y ponerme todo lo digno que quiera en un momento, pero a la hora de la verdad soy un veleta irredento. Así que volví a aparcar la intención de dominar JavaScript y me he puesto con TypeScript. Me lo tomo con un pequeño alto en el camino. Aunque tiene una cosa estupenda: TypeScript es también un traductor a JavaScript (lo que finalmente se ejecuta) y, en VisualStudio, ves cómo se forma el código JavaScript cada vez que guardas el archivo de TypeScript. Personalmente lo veo como una forma tangencial de aprender conceptos avanzados del lenguaje final. Eso sin contar que, siendo un defensor a ultranza del tipado fuerte, trabajar con orientación a objetos más en la línea de lenguajes como C# me ahorrará más de un quebradero de cabeza innecesario —de optar por ponerme con algo serio—.

Siempre que descubro algo nuevo en programación lo primero que hago es buscar algún libro sobre el tema. He tenido suerte y di con una pequeña introducción, 'TypeScript Revealed', que sobre la marcha adquirí y me puse a leer. Es un libro de apenas un centenar de páginas, publicado apenas hace dos meses, que va al grano y te explica exactamente lo que tienes que saber para empezar a disfrutar del nuevo lenguaje, suponiendo siempre unas nociones básicas del lenguaje que es superconjunto. Para mi gusto, cien páginas especialmente bien aprovechadas. Como lector de libros técnicos, especialmente de los dedicados a lenguajes de programación, estoy cansado de que continuamente dediquen cientos de páginas a explicarte una y otra vez lo mismo. Una forma de engordar los libros. Como si los vendieran al peso.

Mi encuentro e iniciación con TypeScript coincide con la presentación en sociedad de la versión 0.8.3.1 (hace apenas una semana) y, de lo visto y probado hasta ahora, tengo pocas críticas y muchas alabanzas. Cierto que aún he hecho poca cosa, pero me está resultado sumamente interesante. Y ya estoy deseando que publiquen la versión 0.9, que traerá una cuantas novedades interesantes.

Preveo un intenso y pasional romance con TypeScript. El que sea corto o largo es irrelevante. Lo importante es que será sincero en todo momento.

¡Ah, sí! Sobre el libro, merece mucho la pena. Se lee en un rato, cual novela. Por 9€ en Amazon (versión Kindle) ni merece la pena descargarlo de forma ilícita. Pero si aún así insisten en no pagar, seguro que lo encuentran fácilmente y resultará igualmente útil. Daño no les hará aprender algo nuevo, eso seguro. La única pega, por poner una, es que con una tecnología tan reciente y en evolución tan rápida, sospecho, se quedará obsoleto en apenas otros dos meses. Han liberado la versión 0.8.3.1 hace una semana, esperan liberar una versión alfa de la 0.9 este mes y el libro trabaja sobre la 0.8.1. Dicho lo cual, repetir que merece la pena igualmente.

sábado, 2 de febrero de 2013

A lo cobaya

En mis años de instituto se puso de moda citar las tres cosas que debía hacer todo hombre en la vida: escribir un libro, plantar un árbol y tener un hijo. En mi caso todo un pleno, pero desde el otro punto de vista. No se puede considerar que esta bitácora sea equiparable a escribir un libro; decir «voy a plantar un pino» cuando vas al baño tampoco creo que sea aceptable para el segundo gran triunfo de la vida; y lo de tener un hijo… pues bueno, me parece que va a ser que no.

Pero siempre he creído que en realidad hay más cosas que uno debería hacer en la vida, además de esas que nos propone el islam. En mi caso siempre había querido participar en algún experimento, así en plan cobaya. Y esta vez me he lanzado: Call for Beta Participants. Hace unos días rellené la solicitud que proponían los de Xamarin, ayer me confirmaron mi participación y hoy tengo acceso al gran tesoro que guardan tan celosamente. La cosa promete, aunque no podré contar nada para cumplir con el compromiso de confidencialidad. Menos mal que no soy de morderme las uñas. Andaría ya por los metacarpianos.

Eso sí, tendré que compatibilizarlo con el plan maestro de cosas que quería hacer este año. Y mudarme de piso. La tercera mudanza ya en los casi dos años que llevo en Madrid. Ahí es nada.

viernes, 21 de diciembre de 2012

Compras del fin del mundo, caprichos eternos

Mi jornada laboral empieza siempre sentándome en mi puesto de trabajo —hoy teletrabajo, en pijama además— y repasando los eventos más importantes del día. O sea, leyendo el correo. Habitualmente lo hago en tránsito al trabajo, pero es que hoy el tránsito me ha llevado menos de un minuto. Y leyendo por encima las últimas diez o quince noticias que me da ofrece el agregador de noticias. La primera era una de JavaHispano: «JetBrains ofrece un descuento del fin del mundo…»


Hace unos meses me vi medio involucrado en un proyecto, ya iniciado, con node.js [página oficial], que para quien no lo sepa es algo así como aplicar el antipatrón golden hammer («A un martillo todo son clavos»), pero esta vez usando JavaScript como lenguaje de programación en el servidor. Así hay un único lenguaje, el que se ejecuta en el cliente (navegador) y el que se ejecuta en el servidor. Mi acercamiento (sufrido) fue bastante penoso. Andar con código ajeno resulta siempre un juego complicado, y más si no puedes depurar. Y, entre tú y yo, node.js apesta. Pero parece ser la moda, así que uno tiene que hacer todo lo posible por estar a la moda. Después de mucho buscar en Internet sobre cómo depurar el código node.js —juro que era incapaz de descubrir dónde estaba fallando aquello— llegué a un producto que supuso una maravillosa ayuda. Era el IDE para programación Web que vende JetBrains [página oficial]. Y, para el tiempo que tenía que estar involucrado, me valía con la versión de 30 días. Aunque al final, pasando con más pena que gloria, no aporté gran cosa al proyecto.

Pero esta gente tiene el que algunos compañeros javeros consideran el mejor IDE del universo conocido, y parte del desconocido: IntelliJ IDEA. Y como parece que por más que intento que no se fijen en mí, los jefes malignos abducidos por el universo (tenebroso del) Java —y en algún momento también las desviaciones del Groovy— siguen tirando de mí, he decidido invertir los 56 napos a los que han puesto la edición personal para celebrar que todos nuestros sufrimientos marianos tocan a su fin y, VISA en mano, la he encargado. De los 200 € que cuesta habitualmente, parece un buen descuento.

Por cierto, estos tipos son también los padres de ReSharper (una verdadera joya que todo netero debería poseer; aunque los últimos VisualStudio integran muchas utilidades de refactorización parecidas) y otras herramientas C#. Así que ya puestos, a la saca. Madre mía cuando mi mujer lea esto. La que me espera.

Ahora queda que llegue el correo con el número de licencia o el DVD con el software, porque no me ha quedado muy claro cómo me harán participar de este mundo de las licencias legales. Pero el daño ya está hecho. No sé si finalmente será el final de todo, pero lo que es a mí, poco a poco me voy autoempujando al abismo de la morosidad impenitente… Tranquilos, que tengo un plan para hacerme rico. ¿Cuánto era el sorteo de Navidad? Seguro que algo me toca, seguro. Tan solo falta salir a comprar un décimo.

miércoles, 19 de diciembre de 2012

Tres de tres

Bueno, bueno, bueno. Acabo de terminar —y aprobar— el cuarto examen del tercer curso en el que me había matriculado de programación de videojuegos que ofrecía Eticom mediante su plataforma web. Mañana era el último día para examinarse y andaba un poco tenso porque no había tenido apenas tiempo para leerme la documentación de este último. En realidad para casi ninguno he ido bien de tiempo, la verdad. Sin embargo he aprobado los tres cursos, por lo que me siento ligero y satisfecho conmigo mismo.


Una de las cosas que me hacía gracia es que por cada examen que aprobaba me enviaban un SMS. Y cuando superaba el curso, otro. Pero por correo electrónico no te envían nada. Supongo que es más económico lo segundo que lo primero, pero ahí queda la anécdota. No sé si enviaban cuando suspendías, porque he aprobado todos a la primera. La mayoría con el 100% de aciertos. Tampoco es que fuesen especialmente complejas las pruebas: 10 preguntas sobre el tema. Cada tema unas 100 páginas con mucha captura, mucho código de ejemplo y tal y tal. De promedio he tardado 5 minutos en responder las 10 preguntas para los 11 exámenes (tres para el primer curso y cuatro para los otros dos). Y, también de promedio, habré dedicado unas 6 u 8 horas a leerme la documentación de cada curso. Para mi entender, demasiado fácil.

A este sitio llegué por mi primo Miguel, also known as «el barbas«, also known as «el pelú», also known as «el jeby», also known as «el bombilla»… no, espera, así me llamaban a mí… also known as… ya no recuerdo con qué más sobrenombres lo conocíamos cuando éramos niños, luego adolescentes y ahora adultos.

Aún reconociendo que algunas cosas útiles he aprendido (por ejemplo, en el último hay una explicación bastante detallada sobre cómo hacer un escenario de plataformas en 2D con Unity3D, algo que llevo tiempo buscando un rato para dedicarle, y que en el programación para iOS vi algunas APIs interesantes), en general tampoco creo que me sirva mucho profesionalmente. Máxime por el perfil profesional que tengo y presento, más orientado a jefatura y a proyectos de otro tipo. Aunque en el apartado personal, ya se sabe que la programación de videojuegos es mi debilidad y mi deseo fetiche. No, lo he hecho más con otros objetivos. El primero, más importante y trascendental para mí, ver si conseguía organizarme y buscar tiempo para enfrentarme a cosas más serias, como el de Coursera de Teoría de Juegos que empieza en tres semanas. (Teoría de Juegos no tiene nada que ver, absolutamente nada, con programación de videojuegos). No estoy demasiado satisfecho conmigo mismo en este apartado, aunque ahora lo que prima es que ya me los he quitado de encima.

Mañana me fustigaré por no haber desarrollado una conducta más metódica, ordenada y dedicada.

viernes, 16 de noviembre de 2012

El pseudo-dilema del prisionero, o cómo echarle toda la culpa a los servicios web con C#

El código de ejemplo se encuentra aquí. La solución .NET (Visual Studio 2012) contiene cuatro proyectos:
  • Nimio.Entidades - Definición de las entidades del «negocio».
  • Nimio.Frontal.Servicio.Pedidos - El servicio Web de ejemplo cuyos métodos devuelven tipos complejos
  • Nimio.Consolas.UsandoProxyCompleto - Aplicación de consola que usa el servicio web tal como Visual Studio genera el proxy incluyendo las estructuras de datos que devuelve.
  • Nimio.Consolas.ModificandoProxyManualmente - Versión de consola que, aunque tiene el mismo código básico, ha modificado el archivo Reference.cs para que deserialice el resultado de la llamada en las mismas estructuras de datos (clases) que devuelve el servicio web.

Desde abril tengo dedicación exclusiva a un proyecto y estoy desplazado en el cliente para el que lo estamos desarrollando, aunque mantengo el canal abierto con los compañeros del proyecto anterior por si hay algún asunto con el que yo pudiera echarles una mano. Hace unos días me llamaba uno de los compañeros para plantearme un problema. Contrarreloj, como no puede ser de otra forma en este negocio, tenían que aplicar una nueva directriz venida de ultramar y por la que, una aplicación Web que llevaba bastante tiempo funcionando, tenía que ser despedazada divida en dos partes, siguiendo el nuevo, novísimo, y ultradeterminante estándar de empresa: la parte cliente debe estar en una máquina y la lógica de negocio en otra. Tachá-a-a-a-a-a-an. Uno puede tomar dos caminos ante una situación así: a) discutir con el cliente, intentar hacerle entender que eso es poco menos que una tontería infinita y perder un tiempo precioso; o b) dedicarse a solucionar el nuevo problema en cuerpo y alma. Por suerte existen los repositorios de código y cuando entren en razón se podrá retroceder al punto previo a la última decisión inteligente.

Como decía al principio, mi dedicación es exclusiva para el cliente, por lo que no puedo dedicar mucho tiempo a otros temas, y menos aún desplazarme para ver el código del otro cliente. Pero había que echar una mano. El planteamiento era claro:

  1. La aplicación actual está dividida en capas.
  2. Hay cuatro capas (en realidad tres, porque la de acceso a datos está entremezclada con la definición de entidades y la de negocio).
  3. Las tres capas principales son Interfaz de usuario, Lógica de negocio + Acceso a datos, Entidades.
  4. Aunque la capa de interfaz no accede nunca a la capa de datos, depende de la capa de negocio y, al mismo tiempo, recibe las entidades.
  5. Las entidades ofrecen funcionalidad adicional más allá de ser continentes de datos. Por ejemplo funciones de validación, de cálculo de totales, de gestión de colecciones internas, etcétera. Estas operaciones son utilizadas también desde la capa de interfaz.
  6. Aunque a priori parece poco relevante, el proyecto está hecho en .NET con la versión 2.0 del Framework (y no se puede cambiar). ¡Tócate los…!

De forma visual, la arquitectura actual sería la que pongo en el siguiente esquema. Las flechas indican visibilidad y, por tanto, referencia a —o dependencia de— ensamblados:


Todo ello, recordemos, se ejecuta dentro de un mismo proceso: La aplicación Web original.

Lo que se quiere, mejor dicho lo que se está obligado a hacer, pasa por partir, lo más limpiamente posible, pero a la vez en el menor tiempo posible (para ayer), la aplicación llevando toda la lógica de negocio a un servicio web:


Sin embargo esto plantea un problema: ¿Qué pasa con el uso que se realiza desde la capa de interfaz de las funcionalidad adicional que tienen las entidades? ¿Cómo evito tener que reescribir la mitad del código de la interfaz?

Empecemos por los servicios web. En .NET, desde sus orígenes, se podía definir un proyecto de tipo Servicio Web ASP.NET y que los métodos web, más allá de devolver los tipos básicos del lenguaje, devolvieran tipos complejos (clases o estructuras). Internamente, lo que hacía el motor de ASP.NET era construir un serializador XML, pasar la instancia por él y devolver una estructura XML representando dicho objeto. El inconveniente es que en este proceso de conversión se pierde completamente cualquier funcionalidad adicional que tuviese la clase, de forma que el resultado es un cascarón de datos, vacío de cualquier otra funcionalidad. Otro de los inconvenientes es que se pierden las referencias. Si se serializa una colección en donde distintas posiciones referencian al mismo objeto, se devolvería tantas réplicas del objeto como referencias hubiera. Por lo demás, lo bueno que tiene la serialización XML de los Servicios Web ASP.NET es que hasta mi abuela entiende lo que devuelven.

Pero veámoslo mejor con un ejemplo. En el enlace que ya indiqué al principio de la entrada (ese cuadro tan bonito de fondo azul claro), se pueden descargar el código que utilizaré para la explicación. En esencia se trata de un ensamblado (proyecto) que contiene la definición de dos clases (nuestras entidades del caso de estudio), que son las siguientes:


Bastante simple, pero lo donde quiero poner el acento será en los métodos de la clase Pedido y en la colección de ítems, propiedad desglose. Por ejemplo, el código del método ValorPedido sería:

 
  public double ValorPedido()
  {
     double valor = 0.0;
     foreach (ItemPedido item in Desglose)
        valor += item.ValorAlmacen;

     return valor;
  }

(Recuerden: NET 2.0. No hay cosas como LinQ y tal y tal).

Teniendo ya definido el dominio de la solución, pasamos al servicio web. Todo el mundo sabe cómo se crea un servicio web en .Net con Visual Studio. Simplemente comentar que aprovechando la capacidad de estos de poder devolver casi cualquier cosa, la definición de un método será tal que:

 
  [WebMethod]
  public Pedido UltimoPedido()
  {
     List<pedido> pedidos = ListarPedidos();
     return pedidos[pedidos.Count - 1];
  }

Donde se puede apreciar que el método devuelve un tipo Pedido, clase que definimos en el ensamblado de entidades. Supongo también que sobra comprobar el resultado, pero estableciendo el proyecto del servicio web como proyecto de inicio, y la clase donde se define el servicio en sí, como el elemento de inicio, desde el propio Visual Studio podremos lanzar el navegador, que mostrará los métodos disponibles, la especificación de cada uno y, como último paso, invocarlo.


Queda consumir el servicio web. Una vez más Visual Studio nos lo pone fácil. Basta con decirle al proyecto donde nos interesa interrogar al servicio, que agregue una referencia a un servicio web. Al ser dentro de la misma solución, bastará con pedirle que sea uno de los definidos en la misma. Definir un espacio de nombres y chimpún. Esto es lo que se ha hecho en los dos proyectos de consola que se incluyen en la solución.


El código de aplicación de ambas consolas es casi idéntico. Al final del mismo se solicita que nos devuelva el tipo interno (el que asigna el compilador a la definición de la clase) tanto de Pedido como de ItemPedido. Tras ejecutar Nimio.Consolas.UsandoProxyCompleto obtenemos como resultado que los tipos no se parecen en nada a los que originalmente creamos, dentro del espacio de nombres Nimio.Entidades.


Realmente se trata de los tipos definidos para la creación del proxy al servicio web, generado automáticamente por Visual Studio cuando añadimos la referencia al servicio web. De ahí que el espacio de nombres incorpore el de la aplicación de consola seguido del asignado a la referencia al servicio web durante el proceso de añadido.

La otra diferencia está en el pedazo de código siguiente:

 
  double valor = 0.0;
  int cantidad = 0;
  foreach (ItemPedido item in pedido.Desglose)
  {
     valor += item.ValorAlmacen;
     cantidad += item.Cantidad;
  }

Hemos perdido los métodos de la clase Pedido, por lo que estamos obligados a repetir ese código nuevamente.

Si ahora revisamos el código de la segunda aplicación de consola, Nimio.Consolas.ModificandoProxyManualmente, veremos que se hace uso de los métodos de la clase pedido y que al principio del archivo se ha incorporado una cláusula using Nimio.Entidades; (lo que implica que también hemos añadido la referencia a dicho proyecto). Si, además, la ejecutamos, en la parte donde se solicita el tipo de compilador de cada una de las clases involucradas, se obtiene:


En esta ocasión parece que sí que sí es lo que queremos. ¿Dónde está el secreto? Pues lo que tenemos que hacer justo después de agregar la referencia al servicio web. Realmente Visual Studio invoca a una utilidad de línea de comando, WSDL.EXE, que genera una serie de archivos, entre ellos uno con código C# (o del lenguaje para el que se haya solicitado), pero que queda oculto. El archivo en cuestión es Reference.cs y la forma de acceder es solicitar en el Explorador de soluciones que nos muestre todos los archivos y navegar en el contenido, ahora visible, de la referencia al servicio web:


Una vez seleccionado editarlo realizando dos cambios:

  1. Incluir el uso del espacio de nombres de las entidades al comienzo, antes de la definición del espacio de nombres del proxy; y
  2. Comentar todas las definiciones de tipos internas, que suelen caer a mitad del archivo.


Con esto, y recompilando, ya podemos hacer uso del proxy del servicio web, que se encargará de invocar al propio servicio web, pero que a la hora de deserializar la respuesta, lo hará devolviendo las clases que nos interesa usar.

El único (y gran) inconveniente con este método es que si solicitamos actualizar la referencia, porque hayamos cambiado algo en la interfaz del servicio web, perderemos cualquier modificación que hubiéramos hecho manualmente. Sin embargo, con unos pocos cambios, podemos recuperar el uso de nuestras clases y, lo que es más importante, podemos satisfacer la demanda del cliente con muy poco esfuerzo, confiando en que el 99% del código actual podrá utilizarse sin cambios, reduciendo considerablemente el número de fallos a detectar en fases posteriores.

Otro cliente satisfecho.

martes, 23 de octubre de 2012

Mono 3.0

Estaba peleándome a altas horas con Jenkins, Subversion, Maven, Sonar, Java, C# y la madre que los parió cuando mi agregador RSS me informa que Miguel Icaza anuncia Mono 3.0. Estoy alucinando. Este hombre es un crac. Deseando que saquen ya la distribución para OS X que, entre otras cosas, esperan poder incluir F# 3.0.

De mayor quiero ser como este tío.

viernes, 14 de septiembre de 2012

Visual Studio 2012, fugaz toma de contacto

Aunque resulte un poco absurdo decirlo a estas edades, en que se supone que uno debe andar deseando codearse con la alta dirección y discutir sobre qué tipo de palo va mejor para el hoyo 7 del nuevo campo de golf, una de las cosas que más aprecié al empezar a trabajar en la empresa actual fue la oportunidad de volver a programar en un sentido serio del término, y como un currito vulgaris. En la anterior, desde junio de 2007 hasta octubre de 2010, y como soberano responsable de delegación, mi función era única y exclusivamente más bien administrativa, escuchando desde la lejanía, atrapado en mi rincón, los ecos de la maquinaria tecnológica, tan atractivos para un tecnófilo practicante.

En particular he podido retomar la tecnología .NET, aunque en los últimos meses no hacen más que tirar de mí para el grupo Java. Mi historia con .NET es un poco rara —al menos para mí—, se remonta a 2002, y no viene al caso. Pero es mi historia, le tengo cariño y no termina de convencerme dedicar el resto de mis días a esa bestia parda que la tecnología Java. Cosa que tampoco viene al caso. Lo que sí viene al caso es que tan pronto anunciaron la salida de Visual Studio 2012 llevo detrás de mis jefes/compañeros para que se descarguen nuestra copia desde el portal de asociados de Microsoft, en el que tenemos cuenta como desarrolladores (a mediados de abril aprobaba mi examen de certificación, recuerden, recuerden) y en virtud del cual tenemos acceso a este tipo de productos. Los cabroncetes han tardado, pero finalmente ayer pude instalarlo. En la máquina virtual, para hacer sufrir al Mac, todo sea dicho.

Estaría bien montar un artículo con captura de todas las versiones, pero en mi máquina virtual, y en mi equipo Windows de trabajo, únicamente mantengo desde la versión 2008, que es la primera que soporta Windows 7. Tampoco tiene mucho sentido mantener las anteriores (si no fuese porque aún hay código en .NET 1.1 que hay que mantener/desarrollar…).

Aquí van capturas de las páginas de inicio de las versiones de Visual Studio 2008, 2010 y 2012, esta última en aspecto claro y en aspecto oscuro, modo que de momento me gusta más. En orden cronológico, lo que resulta de rigor en estos casos.





El cambio estético es considerable. Diría que un salgo cuantitativa y cualitativamente mayor que el dado entre versiones anteriores, en el fondo bastante parecidas entre sí. Donde se nota mucho es en los iconos. Especialmente reseñable cuando se solicita la creación de un nuevo proyecto.





Aún tendré que acostumbrarme.

En cuanto a la parte realmente importante, la que se lleva el 99% del tiempo, o sea, la edición de código, lo encuentro maravillosamente más sobrio y funcional. Como decía antes, de momento me he decantado por el aspecto oscuro, que especialmente con luz de interior, molesta menos a la vista. A veces me sorprende qué rápido nos acostumbramos al agresivo brillo del blanco.





Ya en el apartado de carga y tiempos, la opinión no deja de ser meramente subjetiva y particular. Aún no lo he probado en la máquina de trabajo, que utilizaré para esto más bien los fines de semana, en casa. Ha sido bastante complicado arrancar un pequeño proyecto usando 2010 y Framework 4. El 95% del tiempo trabajamos con Visual Studio 2008 y Framework 3.5. Así que lo del último proyecto ha sido más por dejarme hacer que porque estuviesen realmente convencidos. Dicho esto, meter algo tan nuevo como 2012 va a resultar prácticamente imposible. Salvo porque tengo el portátil para mi uso y disfrute fuera del horario laboral, ni se me ocurriría instalar Visual Studio 2012 ahí. De momento las pruebas las estoy haciendo en la máquina virtual de mi viejo y sufrido MacBook Pro. Hasta la fecha se ha portado muy bien, notando que trabajar con 2010 en general le cuesta apenas un poco más que hacerlo con 2008, aunque no apreciaba el deterioro de eficacia como algo especialmente significativo. De todas formas es algo que entiendo como normal, bien mirado, teniendo en cuenta que de forma general trae algunas cosillas más y se nota que la asistencia en tiempo de edición del código es bastante más rica. Era de esperar que el 2012 siguiese con la tónica y costase aún más trabajar con el código. De momento los resultados son irregulares, aunque esperanzadores. Para algunas cosas no he notado cambios significativos en la respuesta, pero hay ocasiones que la fluidez se convierte en un sinsentido de trompicones esperando a la asistencia del editor. En esos instantes el editor sufre de microcongelaciones en serie de cinco o seis repeticiones y no parece restablecerse hasta pasado un minuto o algo más. Sin embargo, tras un par de horas, tampoco he notado una gran diferencia durante el arranque de la aplicación y, en general, durante la edición de código. Lo he notado, y de forma realmente significativa, al lanzar la ejecución del proyecto en modo depuración. ¿Recuerdan las viñetas de Mortadelo y Filemón donde les crecía la barba hasta el suelo y envejecían esperando? Pues igual. Y eso para un proyecto recién iniciado. No me quiero imaginar lo que podrá ser para un proyecto grande que dependa de unos cuantos ensamblados. Si resulta ser como me temo, la cosa se antoja un poco complicada de sostener. Sea como fuere, habrá que ir profundizando para reputar, si toca, o refutar, si corresponde, la apreciación anterior. Este fin de semana probaré a migrar uno de los proyectos grandes de Visual Studio 2008 a Visual Studio 2012.

Aunque lo realmente importante, y tras toda esta parrafada, es tener proyecto que justifique, en mi tiempo libre, dedicarme a ello. Ya veremos.

lunes, 13 de agosto de 2012

Una de IMAP

Toca hacer una pequeña aplicación para migrar desde un servicio IMAP a otro. No se puede usar alguna aplicación ya existente (que las hay a paladas), sino que hay que implementar una para soportar algunas particularidades del proceso. .NET, claro. Y no me voy a poner a implementar una de cero. Así que he hecho una pequeña búsqueda en Internet y estas son las que he encontrado:

  • ImapX 2 - Soporta GMail y tiene buena pinta. Parece bastante activo.
  • MailSystem.NET - Muy completo y tiene buenas críticas. Aunque desde el 2009 no se toca
  • InterIMAP - A medias, mucho «coming soon»
  • AE.Net.Mail - Me gusta mucho la sintaxis para definir los parámetros de búsquedas
  • xemail-net - Hace 20 meses que no se toca
  • Koolwired.Imap - Otro que parece estar a medias y que lleva año y medio sin tocarse
  • OpenPop.NET - Ups, sólo para leer POP
  • uno en Lumisoft - Hay hasta un servidor, pero me da pereza descargarme las partes para ver cómo funciona
  • Mail.dll - Una pinta realmente estupenda, pero es de pago. No muy cara, eso sí. Habiendo opciones gratuitas, queda de momento relegada a una segunda vuelta

Seguro que hay chopocientos más, pero tengo prisa y necesito empezar a probar los que ya he encontrado.

viernes, 6 de julio de 2012

Retomando XNA

Esta semana empezó el horario de verano. El último mes ha sido de locura. Pero de la verdadera. Hace dos fines de semana trabajé el equivalente a una semana normal. Los viernes la jornada laboral termina a las dos de la tarde y yo seguí trabajando hasta las cuatro de la madrugada. El sábado y el domingo lo mismo. Después del sobre esfuerzo parece que todo vuelve a la normalidad. Me he encontrado con las tardes libres y una vida bastante solitaria. Aquí en Madrid apenas conozco a nadie y casi todo el mundo anda muy liado. Sea como fuere, en algo hay que rellenar el tiempo y, como ver la televisión no es de mis actividades favoritas, he optado por retomar la idea de hacer una versión de Profanation para dispositivos móviles. Pero antes voy a darle con ganas al XNA hasta que lo tenga bastante controlado, para lo que he empezado con cosas más sencillas

Seguiremos informando.


jueves, 19 de abril de 2012

Casualidades de un cuarentón que jugó al Spectrum

Muchas son las veces que he dicho que me hubiese gustado programar algún juego. Envidiaba, con esa envidia sana, pero de verdad que sana, a todos aquellos que, con pocos años más que yo, incluso algunos con menos, dejaron su impronta en la historia de los videojuegos. Está claro que casi idolatraba a Víctor Ruíz por su Abu Simbel Profanation, que siempre quise portar a otros ordenadores (y que utilicé para un prototipo sencillo con MonoTouch y MonoGame, o XNATouch).

Hoy estaba en cliente. En realidad siempre estoy en cliente, ya que desde que estoy en Madrid aún no he pisado la oficina de la empresa que me paga, pero hoy estaba en cliente en nombre de mi cliente. Trabajando codo con codo con uno de los socios de la empresa para la que trabajo, no la del cliente, sino la que me paga, y no sé muy bien cómo salió el tema, pero el director del área de desarrollo del cliente y mi jefe se pusieron a hablar de máquinas viejas y de programación de videojuegos. Pues resulta que los dos hicieron «sus pinitos» en aquellos tiempos en que la historia de la informática de ocio se escribía con entusiasmo de cuarto oscuro sobre opcodes de procesadores de 8 bits amenizados con bandas sonoras de baudios y cargas desde cinta de cassette. El uno había publicado varios juegos, que no quería decir por la vergüenza que traen a los maduros los actos de juventud, pero que gracias a San Google del Gigabyte Bendito encontré dos: Los pájaros de Bangkok y Ke Rulen los Petas, dos aventuras conversacionales. El otro un algo más modesto Zampabolas.

Estaba encantado escuchándolos recordar viejos tiempos.

Lástima que nunca tuve el coraje suficiente, ni la tenacidad oportuna, para ponerme a ello. La excusa, y la justificación real, es que siempre me faltó grafista y alguien para el sonido. Una pena. Pero me ha entrado el gusanillo de hacer algo. Está claro que el Abu Simbel no puede ser, ya que el propio Víctor Ruiz, con su FX Interactive, ha sacado una versión para iPhone y te cobran por absolutamente todo, incluso las vidas infinitas.


Está mal que yo lo diga, pero mi versión, esa que dudo que llegue a terminar nunca, tiene bastante mejor pinta. De hecho la jugabilidad de la oficial deja mucho que desear. Si no lo crees, pásate por la página que hice para presentarlo en sociedad.

miércoles, 11 de abril de 2012

871/1000

Eso es lo que he sacado. Te piden mínimo 700/1000. Así que he aprobado. He aprobado el examen de desarrollo de aplicaciones Web con Microsoft .NET Framework 4. Ya soy un MCTS. O un MCP. O las dos cosas. No me termina de quedar claro. Tampoco tengo muy claro para qué sirve. Pensaba que podría descargarme la nueva versión de Visual Studio. Pero de eso nada. Habrá que hacer tres exámenes más para ascender a MCPD.

domingo, 4 de diciembre de 2011

Mejoras por accidente

Como decía en la entrada anterior, me he pasado el fin de semana «tocado». Sin muchas ganas de salir, he repartido el tiempo entre dormir, ver películas y probar cosas. La limpieza general de la casa, por otro lado altamente necesaria a día de hoy, me parece que lo dejaré para el martes o el jueves, festivos nacionales (qué grande es España por sus festivos, por mucho que le joda a la Merkel). Entre las cosas que quería probar estaba instalar el CMS Umbraco en el hosting que tengo contratado. Como resultado, desastroso por cierto, machaqué el directorio donde tenía la prueba de concepto de SilverSprite. Para colmo no tenía en el portátil (que reinstalé hace poco porque el Lion sobre el Snow Leopard iba realmente de pena). Así que, visto lo visto, y dado que cada vez le paso a más gente el enlace en cuestión, opté por mejorar el aspecto y, de paso, probar algunas cosillas en JavaScript (básico).



El resultado no me ha quedado demasiado mal. Tengo que corregir algunos problemillas (por ejemplo, el arrastrar el iPhone no termina de funcionar bien). Tampoco lo he probado en todos los navegadores, solamente en Chrome. Sin embargo, es bastante mejor a lo que tenía antes.

Al que le pueda interesar, el fondo elegido se corresponde con el artículo sobre el juego aparecido en aquella legendaria revista de nombre MicroHobby.

viernes, 25 de noviembre de 2011

¿Mala compra?

Desde principios de año me picaban las ganas. Aprovechando el viernes negro en Xamarin me lancé a hacerlo. 230€ —al cambio— menos y tengo la licencia de desarrollador de MonoTouch.



La economía doméstica no está pasando su mejor racha, pero tenía ganas de hacer «algo». Ahora queda que, efectivamente, lo haga. ¿Ideas?

Sea como fuera, ya tengo mi regalo de reyes.

lunes, 24 de octubre de 2011

Nullable<Me>

Pensé que no tocaría hacerlo, pero finalmente ha sucedido. Se mantienen dos ramas de código, del mismo código —mejor dicho, de código parecido— para que compile en Framework 1.1 (año 2003) y Framework 3.5 (año 2007) de .NET. Tanto a nivel sintáctico como semántico, la versión 3.5 es muchísimo mejor. Y no entiendo la obstinación por mantener las dos ramas, cuando la destinada al código 1.1 N-O S-E U-S-A y estamos a las puertas de que aparezca la versión 4.5 o la 5, directamente, y que traerá cosas tan chulas como el mecanismo async para definir métodos (algo que ya está en F#). Pero ha tocado y llevo todo el día peleándome con esto. He tenido que adaptar toda la semántica de tipos nulos, incorporada a partir de la versión 2.0 del Framework y de la que he hecho uso intensivo en el proyecto, posible y de uso grácil con el aporte de los genéricos y que permite escribir cosas tan sencillas como las del siguiente código (las dos formas son aceptables y significan lo mismo), sin recurrir al boxing y al unboxing:

 
Nullable<int> enteroConNulo = null;
int? enteroConNulo2 = null;
 

Para ello he tirado de la biblioteca NullableTypes. Descubrí esta biblioteca a finales del año 2002 o a principios del 2003, no recuerdo, y se convirtió en eje fundacional de la base de datos orientada a objetos que estábamos montando en la empresa como parte del proyecto en el que estábamos trabajando entonces. Hace tanto tiempo de eso que no terminaba de recordar el nombre y he tenido que andar rebuscando aquí y allá, hasta que di con ella. Lo que me sorprende es que aún exista la página, que no se toca desde 2004. Increíble esto de Internet, sí señor.

Aquí queda anotado por si dentro de otros ocho años me piden que adapte el código desarrollado para el Framework MIL a la versión 1.1. Visto lo visto, son capaces de mantenerlo para entonces.

jueves, 13 de octubre de 2011

Otro que se va

Abro el Facebook y lo primero que me encuentro es que otro de los grandes de la Informática, en este caso Dennis Ritchie, ha muerto recientemente. Lo triste es que la muerte de Steve Jobs eclipsó la noticia, porque hace ya unos cuantos días que falleció.

Descanse en paz.

Mierda de Facebook. Sólo sirve para enterarme de las malas noticias...

martes, 20 de septiembre de 2011

... soy el Neo del código fuente

Aún con los ojos rojos como si me los hubieran rociado con spray de pimienta, he currado programando como nunca (bueno, como no lo hago desde hace años). Tomando consciencia de que estamos enchufados en Matrix, y que ya no hay leyes naturales inmutables —y de que el universo se dobla sobre sí mismo—, me he puesto manos a la obra y he escrito más código fuente en los dos últimos días del que había escrito en los cuatro meses y medio de trabajo anteriores. Madre mía, veo código pasar delante de mis ojos cuando cierro los párpados. Y creo que tengo una sinusitis de elefante.

lunes, 28 de marzo de 2011

Profanation y SilverSprite

Me daba un poquito de pena dejar la cosa como estaba. Así que, antes de meterme con otro tema, me puse a juguetear con SilverSprite. Para el que no lo sepa —y le interese, claro— SilverSprite es una capa de adaptación que facilita ejecutar código XNA, en teoría con apenas cambios en el código, en Silverlight [@ Wikipedia] que a su vez es, para quien no lo sepa —y también esté interesado—, un framework pensado originalmente para desarrollar aplicaciones multimedia embebidas en páginas Web, a grosso modo. Viene a ser la respuesta de Microsoft a la plataforma Flash de Adobe y al malogradísio JavaFX de Sun/Oracle. A día de hoy, a la espera de su quinta revisión que incluye aceleración 3D y muchas cosas más, es otra filigrana tecnológica que permite también ejecutar aplicaciones en el escritorio, directamente. Sin entrar si es mejor o peor que las otras alternativas, ni tampoco si se usa más o menos en la actualidad para hacer cosas interesantes, o de que ya está HTML 5 para todo esto, lo cierto es que al ser (casi) multipltaforma [1] el que tengamos la posibilidad de ejecutar las aplicaciones hechas en XNA en la Web a modo de demostración de lo que se puede esperar en otras plataformas es algo que a mí, sinceramente, me parece cojonudo. Si cuajan MonoGame y/o ExEn, significaría que el mismo código sería ejecutable en dispositivos que van desde el iPhone hasta Xbox 360, pasando por Android, el Mac, el PC y el Windows Phone 7. Para empezar, no está nada mal. Por supuesto, en todo momento estamos hablando de juegos 2D, ya que toda la parte de 3D sigue estando en el aire en cualquiera de las alternativas existentes a día de hoy. ExEn es el que parece, dentro de su desarrollo actualmente privado, que dedicará más esfuerzo en breve a implementar parte de las API 3D de XNA 4. Ya veremos.

En mi caso el trabajo lo tuve que realizar en la máquina virtual Windows de que dispongo. Con MonoDevelop tuve muchos problemas para compilar el código Silverlight usando Moonlight SDK. Pero una vez decidido a ponerlo en marcha, y optar por hacerlo con Visual Studio, la cosa fue más o menos sencilla [2]. El esquema general a seguir es el que se encuentra en la página del proyecto SilverSprite. A partir de ahí se exigen algunos cambios menores. En mi caso, del código escrito directamente sobre MonoGame, tuve que cambiar la parte de detección de los toques en la pantalla, que directamente no existen en el API de SilverSprite, y que ahora se controlan con el ratón. También tuve que cambiar la llamada al método Begin que se realiza sobre la instancia SpriteBatch asociada a la clase del juego, ya que se exigen más parámetros. También tuve que convertir todos los sonidos a MP3 y, aprovechando, les bajé la calidad para que la descarga desde Internet no supusiera un trauma. A nivel de invocación del API de sonido también hay algunos cambios menores, pero nada significativo. Quitando el pequeño problemilla con el archivo XAML mencionado en la anotación al pie de artículo, calculo que todo el proceso me llevaría cosa de una hora, aproximadamente. A partir de ahí lo estuve probando en diferentes navegadores. En el que peor resultados obtuve fue
con Safari. El movimiento no terminaba de ser bueno, haciendo cosas raras después de cada salto. En el resto, Chrome, Firefox, Opera e Internet Explorer (en la máquina virtual), la reproducción era exactamente igual a como funciona en el simulador de iPhone.


En fin, una alternativa interesante; o una curiosidad inútil más. Ya veremos.

Al que quiera perder unos minutos con mi prueba de concepto, la podrá encontrar aquí. Si da la casualidad de que alguien tiene la última versión de Moonlight funcionando en su equipo Linux y quiere probar, que me diga qué tal le va.


[1] Ya es de sobra conocido el desprecio que siente Microsoft por la plataforma Linux. Pero también es conocido que ahí donde uno no quiere perder su tiempo, aparece gente dispuesta a ello. Para el mundo Linux existe Moonlight, proyecto auspiciado por el marco del proyecto Mono. Para todo aquel que esté interesado en probar lo de hoy en una máquina con Linux.
[2] La cosa incluso hubiese sido más sencilla si no me hubiese equivocado en una letra a la hora de referir el espacio de nombres en el que se encontraban las clases del juego. En el archivo XAML de la aplicación, ahí donde dice que se ponga «clr-namespace:» yo puse «cls-» y estuve como cosa de una hora intentando averiguar porqué demonios aquello no funcionaba ni a tiros.

sábado, 26 de marzo de 2011

Recocido de Profanation sobre cama afrutada de XNA y con relleno de MonoGame (o XNATouch)

Contaba en la entrada de ayer que tenía ganas de hacer un juego para el iPhone y que había estado buscando durante días algo con lo que desarrollarlo resultara bueno, bonito fácil y barato. También contaba que, finalmente y descartando los entornos integrados, había decidido hacer sendas pruebas de concepto con cuatro de las chopocientas mil alternativas basadas en los lenguajes que a día de hoy exiten para desarrollar para este dispositivo. Y que de las cuatro había decidido empezar con la que, sospechaba, me resultaría más fácil dado que con el lenguaje de programación C# es con el que más años de experiencia tengo y a estas alturas conozco bastantes truquillos de su sintaxis y buena parte de sus interioridades, amén de que me resultaría más comprensible el código que viese en los ejemplos sin tener que andar intentando averiguar para qué servían esos corchetes, a qué venían esos puntos y coma o por qué se metía ese bloque de código indentado en este sitio y no en uno más arriba. «¿¡Pero de dónde narices ha salido esta variable!?»

Las dificultades de hacer un (buen) juego y el objeto de la prueba de concepto.

Si me pidiesen a mí, absoluto lego en la materia, que hiciese una lista ordenada, de mayor a menor dificultad, con los elementos más difíciles para conseguir un buen juego, diría que en primer lugar estaría, sin lugar a dudas, lo que vendría a ser a modo abstracto el diseño, que incluiría cosas como el concepto, los elementos de jugabilidad, etc., etc. Lo pongo el primero porque una cosa es tener una idea como, por ejemplo, «voy a hacer un juego en el que el jugador tenga que mover unos bloques por un nivel para poder salir de él» y otra muy distinta hacerlo. Lo que vulgarmente se conoce en el refranero popular como «del dicho al hecho hay un gran trecho». Vale, lo del laberinto es fácil y la idea pinta bien, no lo voy a discutir. Ahora diseña veinte o treinta niveles, con el adecuado incremento de dificultad de uno a otro, para que el jugador no lo termine en cinco minutos, pero que además no sea tan difícil como para abandonarlo frustrado. Si alguno no me cree que se ponga a diseñar laberintos en donde el jugador tenga que ir pasando por una serie de puntos para activar puertas secretas y tal y tal y que, en resumen, resulte interesante.

Después de las tareas de diseño estaría la parte gráfica. Hay gente que dibuja muy bien y esto lo tienen ganado. Para mí no y es algo con lo que tengo que lidiar si finalmente quiero hacer algo que resulte interesante. En mi caso es un elemento limitante y no descarto que, llegado el caso, acuda a un freelance para encargarle los gráficos. Es asombrosa la cantidad de sitios en Internet que son infraestructuras de proyectos para contratar freelancers y hacer seguimiento del trabajo. Pero hete aquí que el Inglés se vuelve nuevamente imprescindible. En cualquier caso, en este punto quería evitar enfangarme con esto.

Ya en tercer lugar, y sin desmerecer otros muchos aspectos también complicados como por ejemplo el sonido, para mí estaría la programación en sí y, dado que esta es la que en primera instancia me preocupa a la hora de tomar una decisión, es sobre este término que planteé la prueba de concepto. Por ello, para poder concentrame en el código, tenía que salvar de alguna forma los dos apartados anteriores. Y no se me ocurrió mejor forma que hacer un remake de algo ya existente. Esto me quitaría el problema de los gráficos (copiar con un poco de trabajo los originales, si fuera menester) y del diseño del propio juego (copiar el original sí o sí). No se trataba de hacer el juego entero, ni siquiera toda su funcionalidad; simplemente buscaba concentrarme en cómo se podía hacer «aquello de entonces con esto de ahora» y llevar a la práctica dos o tres de las características del original. Además de que se podría incurrir en violación de derechos de propiedad.

Abu Simbel Profanation

Supongo que todos los que crecimos adorando un ordenador y siendo pioneros en esto del ocio electrónico basado en ordenadores personales, tendremos nuestros juegos favoritos. Esos que cuando en alguna conversación de cuarentones nostálgicos se empiezan a enumerar, revivimos con especial entusiasmo. Yo tengo muchos, en particular los de Ultimate Play the Game [@ Wikipedia] y los de Dinamic Software [@ Wikipedia], de mi época de Spectrum (de 12 a 15 años). Pero si hay uno en particular que encabeza la lista es el de Abu Simbel Profanation. Para mí este dificilísimo juego de 1985 (yo tenía 13 años), del que creo que no llegué a pasar de la pantalla dieciséis, supuso una revolución en los juegos de Spectrum en el género de plataformas y se trata de uno de los dos o tres que siempre quise versionar para otras plataformas. Cuando empecé a hacer mis pinitos con el código máquina (lenguaje ensamblador) para el Commodore, intenté implementar la impresión del mapeado de pantallas con superbloques [1]. Creo que durante una semana gané todos los premios al ratio de cuelgues de ordenador por hora causados por saltos condicionales fuera de código y por accesos a memoria fuera de rango. Vamos, que desistí frustrado.

Con esta prueba de concepto parecía que esta iba a ser la oportunidad de, si no todo, por lo menos programar las primeras pantallas de este genial juego. Tocaba «desempolvar» el emulador de Spectrum [Viejos tiempos para el jugador casual] y empezar a capturar las pantallas. Elegí Profanation para hacer la prueba de concepto del código con XNA. Ya tenía diseño y gráficos resueltos. Tan sólo había que recortar cada frame de la animación y ya estaba. En teoría.

Los gráficos, las escalas y primeros tropiezos

Aunque no viene mucho al caso, decir que es asombroso que cuando uno los necesita no funcionan. Justo un par de días antes de ponerme con la modernización actualicé tanto GIMP como Inkscape en mi equipo y dejaron de funcionar. Cada cierto tiempo lanzo el (ahora temido) comando de actualización de MacPorts. Sin saberlo, con la última descarga masiva de actualizaciones había conseguido dejar inservibles tanto uno como otro. Vaya mala suerte. Así que harto de andar para delante y para atrás intentando resolverlo abrí la App Store de MacOS X, busqué y me pillé dos de diseño vectorial y PixeImator. 60 euros más pobre pero me quité del golpe los problemas. De los primeros no estoy muy contento, pero el segundo es una gozada. El software en realidad es muy barato —me apunto que un día tengo que escribir sobre esto— y no me arrepiento del dinero gastado. La integración de GIMP en Mac era inexistente (se requiere X11), algo que le restaba feeling al usarlo. Vamos, me olvidé de él en diez minutos de usar el nuevo. Visto retrospectivamente está claro que no era amor lo que sentía por él.

Tras este inciso me puse a pensar en cómo sería el diseño en el iPhone, que tiene una pantalla de 320 x 480 y en el iPhone 4, en el mismo área, una resolución de 640 x 960, mientras que el juego original tenía 256 x 192. Además que había que meter botones en la pantalla para manejar al machango. Aquí me encontré que los puntos por pulgada de las pantallas de ordenador tienen una densidad bastante menor que la pantalla del terminal y que esto podía conducir a errores en las escalas. Después de hacer un boceto del diseño de la pantalla y exportarlo a la resolución del iPhone, basta con reajustar la densidad de puntos. El cálculo es tan sencillo como aplicar una relación de proporciones o una regla de tres donde comparamos el alto de la pantalla del iPhone con su densidad de puntos (163 ppp) a cómo debería verse en una pantalla normal (96 ppp) o la del portátil (112 ppp) [2]. Vamos, Altura = 320 x 96 / 163, lo que da unos 188 píxeles de alto. Reescalar la imagen y comprobar si el botón ha quedado de un tamaño adecuado para pulsar con el dedo gordo —yo lo tengo muy gordo— poniéndolo directamente sobre nuestra pantalla y si los gráficos originales quedan mínimamente distinguibles. Así es como queda el resultado a la escala de la pantalla del iPhone, dependiendo de la densidad de puntos de tu propio monitor, claro:


Hombre, yo no sé ustedes, pero si bien los botones quedan a un tamaño más o menos prudencial en la pantalla, el protagonista resulta prácticamente indistinguible. Iba a tocar reescalar todo y buscar la forma de que todo encajase en pantalla. En última instancia se trataba de una prueba de concepto y tampoco tenían que ser las mismas pantallas. Bastaba con que el personaje se pudiese mover por algunas plataformas y saltase, controlar las colisiones con algún enemigo tonto y poco más. Vamos, hacer un mix de Abu Simbel Profanation y Mario Bros. Visto lo cual, me puse a rehacer los gráficos. Tuve una especie de deja-vu porque esto mismo hice, de forma algo más cutre, en octavo de EGB pasando los sprites a hojas de cuadraditos para calcular los códigos binarios de cada uno de los bytes que componían el gráfico de 16x16 bits, pero ahora capturando pantalla y reescalando el bicho a 32x32. Vamos, un curro. Y se suponía que la intención era no perder tiempo con esto.

Entonces pensé que tal vez no tendría que hacerlo. Hace años tuve la oportunidad de jugar a un remake que tropecé por casualidad en la zona de ramakes de Computer Emuzone, en la de Remakes Zone o en alguna similar. Estaba hecho en Java y la verdad que era algo simplón en gráficos, pero resultón. Para mí más que suficiente. Busqué y enseguida lo encontré. Y no sólo ese. El autor ha hecho otra versión bastante mejor y que, además, también está para Mac. Aún mejor, se puede descargar el código fuente desde su página Web. Pero aún queda lo mejor de lo mejor: ¡¡¡Viene con los gráficos!!!

Si son nostálgicos de los juegos de 8 bits, en la página de M.A. Software podrán encontrar algunas cosas muy interesantes. Este hombre es un crac.

A base de rapiñar los gráficos de Miguel Ángel, ya tenía resuelto el segundo asunto en orden de complejidad. Aunque bueno, todo todo no lo he rapiñado. También quise aportar mi granito de arena en el apartado gráfico y añadí la secuencia de una muerte bastante truculenta.


Tocaba ponerse a aprender XNA.

¡Ya sé XNA! Al menos los cuatro conceptos básicos

En Internet hay muchísima documentación sobre XNA, suficiente para aprender, pero yo me fui directo a la bibliografía. En mi caso recurrí a un libro que me ha parecido muy entretenido y bien escrito: 'Beginning XNA 3.0 Game Programming' [3]. Tras una lectura rapidísima de los capítulos dedicados a la programación en 2D (de momento no me interesa la parte en 3D), puedo concluir que XNA es muy sencillo de aprender y que tiene cuatro conceptos básicos que comprender: la clase SpriteBatch, heredar de GameComponent —mejor aún de DrawableGameComponent— y los métodos Update ( GameTime gameTime ) y Draw ( GameTime gameTime ). Con estas tres ideas, y cargando las imágenes en clases Texture2D uno ya se puede meter a hacer algo que resulte interesante.

Aunque sea por el placer de escribir tres líneas de código, recomiendo a todo el que tenga curiosidad que intente mover un sprite por la pantalla. De ahí a conseguir un hit en Xbox 360 no hay nada. Y confieso que me ha sorprendido la facilidad con que se aprenden los antes mencionados conceptos básicos y lo fácil que es leer el código C# que hay de ejemplo por todas partes.

Yo tardé un día en leerme los cuatro primeros capítulos, los dedicados al 2D, y sentarme a escribir código con más o menos seguridad sobre lo que estaba haciendo.

Manos a la obra. ¡Qué divertido!

Como usuario de Mac, y sin querer recurrir para este caso a la máquina virtual que siempre tengo con Windows, mi intención era hacerlo todo con software que se ejecutase de forma nativa en mi máquina. Para ello basta con descargar Xcode con el SDK de iPhone [4], instalarse la última versión de Mono para Mac, hacerse con la versión demo de MonoTouch, instalar MonoDevelop y bajarse la última versión de MonoGame, antes conocido como XNATouch. En mi caso me lancé directamente a usar la versión del repositorio, la 1.6, ya que en ésta los espacios de nombre son los mismos que los del XNA original: Microsoft.XNA.Framework.

Repito que tras la experiencia con el apartado gráfico, la idea final era hacer una especie de Mario Bros usando los gráficos del remake Abu Simbel Profanation Deluxe. Pero al resultar tan relativamente sencillo hacer algo con XNA, te acabas enganchando y te dices, «bueno, voy a meterle ahora esto», y así una tras otra. Vamos, que lo que inicialmente había pensado me llevaría tres días, lo acabé convirtiendo en seis o siete días en los que me lo he pasado muy bien haciendo que el machango fuese de un sitio para otro. En dos días ya tenía bastantes cosas hechas, pero lo siguiente era meter sonidos, hacer un scroll de pantalla, meter distintos enemigos con animaciones diferentes, que el muñeco mirase en las diferentes direcciones como hacía el original, etcétera, etcétera.


Pero no era totalmente gratuito este sobre esfuerzo. MonoGame es un producto bastante verde, según lo que se lee en diferentes sitios. Confieso que tenía la creencia de que la cosa haría aguas por todos lados y que la mitad de lo que hiciera no funcionarían. Pero no. Cosa tras cosa que iba metiendo el juego seguía funcionando. Y muy bien, todo sea dicho. Sobre todo porque el código espagueti con el que lo hice dudo que sea el mejor para probar el rendimiento del juego. Si no hice más cosas es porque, precisamente, como no esperaba hacer mucho, la mayoría de las primeras cosas las hice en plan hard coded, como las cuatro pantallas que al final reproduje del juego original. Hay que ver la cantidad de horas que me he metido calculando las coordenadas de cada uno de los bloques que había que pintar en la pantalla.

Por cierto, en la captura aparecen unas áreas rectangulares de colores. Esto se debe a que, ya puestos a meter cosas, también podía superponer las áreas de colisiones para comprobar si todo funcionaba como debía cuando uno se aproxima a un enemigo.

Un pequeño apunte sobre música

Ya como último paso antes de dar por cerrada la prueba de concepto, se me ocurrió meter algo de banda sonora al juego. Los efectos de sonido también se los rapiñé a Abu Simbel Profanation Deluxe, pero me apetecía probar a meter una música de fondo mientras jugaba. Se me ocurrió recurrir a RKO, donde hay cientos de versionados de temas musicales de los juegos del Commodore. Hay algunos muy buenos. Ni corto ni perezoso escuché unos cuantos de los últimos que se habían publicado y me decanté por el tema 'Cauldron II (The Witch Who Stepped in Dub)', de Sound of Hazel (http://www.soundofhazel.com). Le da marchilla a la prueba de concepto. Y, lo mejor, es bastante sencillo dejarla sonando. Tanto como crear una instancia de efecto de sonido e indicarle que se reproduzca en bucle. Pongo algo de código.

public static void PlayMusica ()
{
   musicaInstance = musicaJuego.CreateInstance ();
   musicaInstance.Volume = 0.2f;
   musicaInstance.IsLooped = true;
   musicaInstance.Play ();
}

Reproducir el resto de efectos de sonido es exactamente igual de fácil.

El resultado

Está extendida la creencia de que una imagen vale más que mil palabras. Y que un vídeo más que mil imágenes. Pues por no llevar mucho la contraria, aquí va un pequeño vídeo sobre cómo ha quedado finalmente la prueba de concepto. La chicha tarda un poco en empezar, sean pacientes.



Pero… el simulador no es el dispositivo

Confieso que he quedado gratamente sorprendido por el trabajo de la gente de MonoGame. Me preocupaba el hecho de no conocer nada de XNA y tener que aprender con un producto que, tal vez, fallase más de la cuenta. De hecho, cuando uno descarga el código desde el repositorio del proyecto, la mayoría de las demos que lo acompañan no funcionan. Pese a ello, el proyecto empezándolo desde cero y aplicando las pautas aprendidas en el libro mencionado antes ha funcionado en todo momento.

Sin embargo hay algo que me sigue preocupando. En las pruebas con el simulador, todo funciona perfectamente. Rara vez los frames por segundo bajan de 58, sabiendo que el hardware gráfico del iPhone sólo alcanza los 60 fps. Pero el simulador no es el dispositivo, y algo que funciona perfectamente en el simulador puede ir fatal en el hardware final. Esto supone un riesgo enorme a la hora de adoptar esta tecnología. Pueden significar muchas horas de trabajo tiradas a la basura y/o 400 euros mal invertidos [5] si resulta que desde el principio descubrimos que la cosa no tira. Pero ya se sabe, quien no arriesga no gana. Y tal vez sea mejor perder ese dinero que echar 100 horas en algo que luego no va a funcionar y que seguimos con la incertidumbre hasta que decidamos gastarnos la pasta.

Siguiente paso

Mientras decido si invertir el dinero o no en MonoTouch, ya voy pensando en qué haré a continuación. En la lista el siguiente es Cocos2D. Aunque en teoría lo ideal sería repetir lo mismo que he hecho con MonoGame, la realidad es que no se me apetece —y no voy a repetir de nuevo— lo que he hecho. Supongo que tiraré por algún otro clásico del que haya también gráficos disponibles que poder buitrear. Aunque esta vez espero no dedicar tanto tiempo a pulir pijadas y llenar la prueba con detalles que a la postre son insignificantes en el valor de conjunto. Ya veré. Lo único que sé es que en las últimas dos semanas me lo he pasado genial haciendo esta prueba de concepto.



[1] Si mi memoria no me engaña, y no empiezo a inventarme ya las cosas, leí por primera vez esta idea del «superbloque» en un artículo sobre programación de videojuegos que se publicó en MicroHobby o en MicroManía. Aunque a estas alturas ni estoy seguro de que fuera ese el término ni de que fuera en una de esas revistas. El superbloque vendría a ser lo que hoy se denomina en todas partes como tile (mosaico).
[2] En http://members.ping.de/~sven/dpi.html hay una calculadora que te dice los dpi de tu pantalla en función de la resolución.
[3] Actualmente la versión 4 de XNA deja como obsoletas algunas de las cosas que estaban disponibles en la versión 3. Sin embargo, tanto el proyecto MonoGame como la alternativa ExEn, actualmente en desarrollo privado, no soportan completamente la última versión de XNA.
[4] Para poder probar el código realizado con MonoTouch hay que contar con el simulador que ofrece Apple con el SDK. Para ello es necesario darse de alta en el programa de desarrolladores de Apple (que es gratis) y ya se podrá descargar. Alternativamente, y desde hace poco, también se puede conseguir directamente en la App Store pagando 4€.
[5] En realidad algo menos teniendo en cuenta que sea cual sea la opción que finalmente se elija para hacer un juego (o cualquier otra aplicación de iPhone) será necesario contar con la licencia de programador iOS, que al cambio viene costando unos 80€.

viernes, 25 de marzo de 2011

El blues de los momentos perdidos

Esta es la predecible, y seguramente inevitable, continuación de 'El ABC de los tiempos perdidos'. Entonces no me preocupaba demasiado. Eran unas más que merecidas vacaciones. Pero tras cinco meses en las listas del paro, y con varios rechazos a mi «impecable» curriculum —al menos eso es lo que afirman las personas que llaman para entrevistarme— por cuestiones de idioma, confieso que empiezo a preocuparme ligeramente. Aunque no puedo decir que me angustie aún. Más bien todo lo contrario. En estas últimas tres semanas apenas he pensado en el asunto. El «truco» está en no amargarse demasiado con ello y, lo principal, andar ocupado siempre con algo. A poder ser algo que me llame la atención. Además de seguir siendo optimista. Pesimistas y amargados ya hay muchos en el mundo. Y aún tengo margen de sobre para maniobrar. De hecho hay varios indicadores que apuntan a que acabaré presentándome como freelance. Pero de eso ya hablaré en otro momento.

Dentro del abecedario de intenciones de diciembre, había alguna letra relativa a programación para el iPhone. El desarrollo para terminales móviles es cada vez más demandado. Pero que algo se demande nunca me ha empujado a seguirlo. Tiene que llamarme la atención. Y aquí es dónde debería decir que en los dos últimos años, con la aparición de dispositivos herederos del iPhone, además del propio iPhone, sin dejar de lado el iPad, la programación para terminales móviles se ha convertido en algo que me llama poderosamente la atención. Llevo tiempo queriendo hacer algo para iPhone y presentarlo en la App Store. Tan solo por el placer de hacerlo e intentarlo. Aunque también para ver si doy el pelotazo y me dedico a vivir con Curro en el Caribe. Y tal vez esta última intención ha eclipsado lo anterior y no me he puesto a ello antes. Se me ocurren cientos de ideas a lo largo del día, pero casi todas las voy descartando por parecerme, después de darle unas vueltas, que el esfuerzo no compensa o que ya hay cientos de cosas similares. Así que un día sí y otro también lo voy dejando aparcado en favor de cosas que, para ser franco, tal vez me atraigan menos. Hasta que al final me he dicho que lo interesante en sí no ha de ser el resultado —tal vez los restos incoscientes de la herencia defectuosa de haber trabajado los últimos tres años en una empresa de estricto y cuasidictatorial régimen orientado a resultados, aunque no siempre la calidad con que se consiguen sea la más adecuada—, sino disfrutar en el proceso —la idea original— y, para mí lo más importante siempre, aprender durante el camino. Así que, ni corto ni perezoso, hace unas semanas me levanté a las cuatro y media de la mañana y me senté delante del ordenador a buscar información.

En octubre del año pasado, a poco de haberme comunicado la dirección que tan pronto desmantelase la oficina engrosaría las listas del paro, tuve otro de esos momentos de ponerme a programar un videojuego [1]. Lo de crear un juego es una constante en mi vida. Desde que tengo uso de razón y tuve mi primera videoconsola conectada al televisor. Curiosamente, salvo por alguna cosilla en BASIC para el Spectrum-48-k-teclado-de-goma, de los que me encantaría recuperar las fuentes, y de el Super Kutre Invaders [2], nunca me lo he tomado muy en serio. Hasta ahora. ¿Si lo que me apetece es programar algo para el iPhone, y siempre he querido hacer un juego, porqué no hacer un juego para el iPhone? Totalmente de perogrullo.

A poco que uno se ponga a mirar en Internet los SDK's, API's y entornos de desarrollo para juegos que hay, le puede sobrevenir un colapso mental. De hecho eso es lo que casi me da a mí. Tras cuatro o cinco días intentando elegir qué sería mejor para llevar a cabo alguna de las varias ideas que había estado apuntando en las semanas anteriores, me di cuenta que estaba bloqueado en un claro caso de parálisis por análisis [@ Wikipedia]. Casi desde la mañana hasta la noche encontrando alternativas y revolcándome en el fango de Internet rebuscando información y opiniones sobre cada caso. Y, sobre todo, precios. Agotador.

A continuación un mini-mapa mental de lo que fui encontrando [3]:


Si me hubiese dedicado a investigar y probar cada caso, a estas alturas aún seguiría rompiéndome los cuernos contra la mesa de trabajo. Y estoy seguro que aún hay más por ahí que sería muy interesante. Así que fui tomando decisiones para podar el árbol. Tal vez erróneamente, pero después de mi (¿nula?) experiencia con Unity, opté por dejar en segundo plano los entornos integrados y dedicarme a las API's y SDK's basadas en lenguajes de programación. En última instancia mi intención no es meterme en nada 3D de momento, por lo que buscaba algo que me resultase cómodo para hacer un juego en 2D. Lo que vulgarmente vendría a ser un Indie Game.

Después de muchos quebraderos de cabeza me quedé con cuatro opciones para ir mirando en primera instancia y hacer pruebas de concepto:

  • Cocos2D (Objective-C)
  • Sparrow (Objective-C)
  • MonoGame / ExEn (C# --> MonoTouch)
  • Corona SDK (LUA)

Leyendo la documentación, opiniones, ejemplos y estado de desarrollo, los que me llamaron más la atención fueron Sparrow y Corona SDK, basado en el lenguaje de programación LUA. De hecho, a este último le tengo muchas ganas y encabeza la lista como «muy probable». Sin embargo, dada mi familiaridad con .NET y viendo la bastísima cantidad de documentación existente sobre XNA, he optado por empezar las pruebas de concepto con MonoGame (XNATouch) y, por tanto, con MonoTouch. Después intentaré hacer algo con Cocos2D y Sparrow y, en última instancia, me lanzaré con Corona SDK y el bastante sencillo lenguaje de programación LUA.

Podría resultar curioso que no empiece directamente con los que requieren Objective-C que, además, económicamente son los que menos inversión exigen para poner algo en la App Store. Únicamente se requiere la licencia de desarrollador para iOS; algo que el resto de opciones también requieren y que, además, exigen pago de otras licencias. Llevo un tiempo programando en este lenguaje y —estoy seguro que esto sonará casi blasfemo a los apóstoles del mismo— es que cada vez me gusta menos. Por mucho que me intenten vender su sintaxis revolucionaria, rompedora y todo lo que tú quieras, cada vez me parece más una amalgama de intenciones y modernizaciones a medias. De hecho no descarto saltar a C++. Pero, como todo, es una opinión y habrá quien me corrija en mis palabras. Pero como es mi opinión, y en ella baso mis decisiones, he optado empezar por MonoTouch y usar alguna de las dos alternativas para desarrollar con XNA; sabiendo además que este mismo SDK se usa para desarrollar en PC, XBOX 360 y Windows Phone 7, que con la decisión de Nokia [4] de basar todos sus futuros dispositivos en este sistema operativo, da un buen espaldarazo al parque de móviles que podrían ejecutar el mismo código. Sin olviar que tanto MonoGame como ExEn tiene los ojos puesos en Mono for Android, lo que, en un universo idílico, daría lugar a que lo programas una vez y se podría ejecutar en virtualmente —y vender a— casi todos los dispositivos móviles que hubiera en un futuro no muy lejano.

Hacer un juego es una de las cosas más difíciles que se me ocurre en las que se podría embarcar uno. No tanto por la programación que, además de tener que lidiar con circunstancias particulares (concurrencia, eventos, tiempo real, animaciones, particularidades del hardware, etc., etc), no deja de ser código y, por tanto, aprendible en un tiempo prudencialmente breve para alguien que ya tiene suficiente bagaje. Para mí lo peor de hacer un juego —y uno de los motivos por los que no me haya lanzado antes— está en la componente gráfica. Soy nulísimo en el dibujo y un juego, al menos de forma más o menos generalizada, necesita una muy buena presentación. Por ello, de cara a las pruebas de concepto, me puse a buscar alternativas que no me exigiesen dibujar, al menos no demasiado. Pero eso, mejor, ya lo cuento mañana.

Sin olvidar, entre tanto, que el abecedario de las intenciones tiene más letras y que, visto que es imprescindible el Inglés, he de retomar su estudio lo antes posible. A ver si en unos meses puedo optar a puestos en EEUU (JobCraver). ¿Alguien tiene curiosidad por ver los rangos salariales que se ofrecen al otro lado del Atlántico? Ahora busquen en InfoJobs algún puesto equivalente y, si hay suerte, lo que ofrecen.


[1] La entrada en cuestión es 'Pues sí que está siendo un año de juegos, y algo más (y 2)'. Entonces andaba toqueteando nuevamente Unity 3D (http://unity3d.com/), pero acabé dejándolo (de nuevo) porque el diseño 3D es bastante complicado. Se tarda muchísimo en conseguir una animación interesante. De hecho yo no lo conseguí. Y eso resulta frustrante. Si ya soy rematadamente malo dibujando en 2D, no se pueden ni imaginar en 3D.
[2] En la entrada 'Tesoros perdidos reencontrados (II)' hay un vídeo del Super Kutre Invaders. Por cierto, he vuelto a perder de vista el código fuente. Suerte que se lo pasé a Moisés antes.
[3] A ver si no me equivoco o me dejo alguno fuera.
[4] Uno de tantos artículos que se publicaron en esas fechas, en concreto el 11 de febrero de 2011, en el País: 'Nokia se alía con Microsoft para combatir a Apple y Android'.