jueves, 15 de noviembre de 2012

Un día cualquiera

    Unas pequeñas zapatillas se movían en la penumbra de la casa. Se dirigían con soltura al lugar donde su padre - cada vez con más frecuencia - tecleaba sin parar. Allí estaba, una vez más, hablando con el ordenador grande. A sus tres años asumía con toda naturalidad que se pudiera hablar con el ordenador grande, y con el pequeño, y con el mediano... y hasta con Josefa, que además sabía llevarte a todos los lados. Aunque el ordenador grande tenía algo especial.
- Aita, ¿puedo jugar al come-cocos?
- En un rato, mi niño. Ahora estoy trabajando. - El pequeño miró con los ojos muy abiertos a la pantalla. Aquello estaba lleno de letras de distintos colores. Sentía curiosidad. Le gustaban los colores.
 - ¿Estás pintando?
- No cariño, le estoy enseñando a Josefa a hacer una cosa. - El niño observó con detenimiento el móvil que estaba sobre la mesa conectado con un cable al ordenador. A continuación contempló el monitor.
- ¿A dibujar?
- No, mi amor. ¿te acuerdas que el otro día el coche tenía sed y tuvimos que parar a echar gasolina?
- Sí - dijo asintiendo con la cabeza.
- Pues estoy enseñando a Josefa dónde están todas las gasolineras. ¿Quieres saber cómo se hace? - El hijo nuevamente accedió con la cabeza. Confiaba en que, con un poco de suerte, le dejara jugar.
- Hay unos señores que todos los días ponen papeles en una caja en Internet.
- ¿De qué color es la caja?
- Verde.
- ¡Qué bien! ¡Tu preferido!
- Sí, lo es. Y ¿sabes lo que escriben en esos papeles?
- No.
- Escriben los nombres de todas las gasolineras. Y también los precios de la gasolina. Lo que he hecho ha sido abrir una cajita azul para guardar esos papeles.
- ¿Por qué has abierto una caja nueva?
- Porque a veces hay mucha gente a la vez leyendo los papeles de la caja verde, y nosotros no queremos molestarles. Además, dejaremos nuestra caja abierta, para que todo el mundo pueda leer lo que hay dentro.
- ¿Y esas letras? - dijo señalando al monitor.
- Éstas le explican a nuestra cajita azul cómo copiar todos los papeles de la caja verde a la nuestra. - El niño observaba de soslayo el teléfono. Intentaba adivinar qué tenía que ver todo aquel galimatías de cajas con el móvil. Su padre continuó.
- Más tarde, cuando le digamos a Josefa que queremos gasolina, abrirá nuestra cajita azul, cogerá los papeles de las gasolineras que están más cerca de nosotros, y nos dirá cómo llegar a cada una. ¿Lo has entendido?
- Sí, aita... ¿ya puedo jugar al come-cocos?
- Claro, mi niño. Ven aquí. - Dijo el padre mientras le sentaba en su regazo.

martes, 6 de noviembre de 2012

Mellizos: cuando te dicen que son dos

    Hace ya un par de meses que tomé la decisión de convertir el proyecto en un sistema cliente-servidor. Y eso es exactamente lo que he ido haciendo todo este tiempo.

    En primer lugar, monté una infraestructura LAMP casera, y la publiqué  en internet. Para ello abrí y redirigí los puertos correspondientes en mi router, y me di de alta en DynDNS. Ya de paso estuve enredando un poco con SSH. Añado al ToDo hacerme unos túneles, que tiene pinta de ser entretenido.

    En segundo lugar, programé un script en Python que descarga, descomprime e inserta en base de datos todos los registros de los archivos actualizados de la web del Ministerio. Y hasta guarda un histórico de precios pasados, y hace un log de todo lo que pasa entre bambalinas. Sólo le faltaba el lacito: tras un sencillo crontab -e, se ejecuta cada dos horas.

    En tercer lugar, desarrollé para el servidor web unas páginas en PHP que recibiendo unos parámetros, devuelven un XML con las gasolineras, sus precios, geolocalización, horario, ...

    En cuarto lugar, implementé el lado del cliente. De hecho Josefa tiene instalada una versión pre-Alpha. Pese a ser una prueba de concepto, estar llena de bichos y tener una apariencia horrible, hace dignamente su trabajo: me da los precios del combustible, los rótulos de las estaciones y distancia a las mismas en el radio de kilómetros que yo le indique. Y lo hace bien.

    Hace unas tres semanas, como no me atrae la idea de tener un ordenador 24x7 en casa, me dediqué a buscar un alojamiento gratuito que me permitiera externalizar la parte de servidor ya desarrollada. Me decanté por x10hosting: PHP5, dos bases de datos MySQL, disco de espacio ilimitado, transferencia ilimitada... todo ello para crear tu página web. ¡Oh wait! ¿Ha dicho página web? ¡No contaba con su astucia! Bueno, hay que saber aprovechar las oportunidades, así que me he liado la manta a la cabeza, y para cuando me he dado cuenta he construido una web y he aprendido un montón de cosas: a utilizar PHP como plantilla, a cargar contenido dinámico, a crear formularios, a confeccionar hojas de estilo, un poquito de AJAX, qué es un mapa web, cómo indexan los buscadores las páginas, y alguna cosilla más.

    En cuanto al contenido, estoy publicando pequeños conceptos de código. Si le sirvieran a alguien, mejor. Y en adelante haré la versión web del programa, así que ¡habemus mellizo!

    Respecto a la forma, es una web más: 
  • juego de colores similar a este sitio, para mantener cierta congruencia.
  • un logotipo hecho en dos minutos con el Gimp.
  • Un menú de navegación construido al vuelo desde base de datos.
  • Un área donde se muestran el contenido que carga asíncronamente mientras muestra un gif made in Josu.

     Como chascarrillo: hoy se me ha ocurrido pasar el validador del World Wide Web Consortium, y me ha dicho que "This document was successfully checked as HTML5!" y que "¡Este documento es CSS versión 3 válido!" y aunque no valga para nada, me llena de orgullo y satisfacción.

    ¡Ah! La web es ésta.

lunes, 17 de septiembre de 2012

Concretando: diseño general

    Después de un largo parón estival, llega el momento de ponerse manos a la obra otra vez. Respecto al programa, cabe decir que no he hecho tanto como planeé, aunque como contrapartida he vuelto con las pilas cargadas. Y también con las ideas mucho más claras respecto a cómo va a funcionar todo de manera global.

    Hasta ahora he ido desarrollando pequeños snippets de código a medida que iba aprendiendo la tecnología. La idea fundamental era seguir una especie de aprendizaje "reutilizable", y no el típico HolaMundo(). Pero todo está siendo muy intangible hasta ahora. Centremos el asunto y busquemos un punto de apoyo para mover el mundo. Y quizá la mejor manera sea enfocar al origen:
 
¿De qué datos se va a nutrir?
    Es una decisión fundamental, que va a condicionar todo el desarrollo de la aplicación. Lo voy a hacer desde la web el Ministerio de Industria, Energía y Turismo, que es donde están publicados los datos actualizados de los precios de los carburantes. Esta decisión tiene una serie de ventajas:
Asimismo existen una serie de inconvenientes:
  • Si bien existe una herramienta para consultar todas las gasolineras (por ejemplo: Gasolina 95), ésta devuelve un listado sesgado en cuanto a número de resultados. Además no incluye los campos de posicionamiento GPS de cada una. Es una información que necesito, ya que pretendo mostrar sólo puntos de suministro cercanos a una posición dada.
  • Para mantener actualizados los precios, lo haré mediante los enlaces publicados en la propia web. En este caso sí que vienen especificadas las coordenadas GPS de cada punto. El problema es que la descripción en cuanto a cada uno es demasiado críptica y difícil de cruzar con el fruto de la consulta anterior. Sería difícil hacer una búsqueda por dirección, si así lo deseara.
     Lo ideal sería poder unificar y consultar el resultado de ambos informes en paralelo, para disponer - potencialmente - de consultas más potentes que las de la web oficial.


¿Cómo reunir, tratar y mostrar la información?
    En otras palabras, ¿cuál va a ser funcionamiento general interno? Sinceramente, creo que es mala idea dejar todo el tratamiento de información proveniente de los datos oficiales únicamente en manos de terminales móviles:
  • El uso de almacenamiento interno va a ser alto con toda seguridad. Y más si habilitaramos consultas de precios históricos.
  • El consumo de tráfico de red para mantener la base de datos actualizada sería intolerable en los casos de uso continuado del sistema. Los usuarios se quejarían - y con razón - de que su tarifa de datos mengua excesivamente.
  • El rendimiento general del programa estaría penalizado por la descarga, tratamiento y clasificación de la información.
  • La percepción general de sería de falta de fluidez, con lo que la experiencia de los potenciales usuarios no sería agradable.

     Siguiendo la máxima "divide y vencerás", la respuesta pasa por dejar ese trabajo "a otros". Es decir, crear un servicio web que se encargue de:
  • Mantener actualizada una base de datos.
  • Que ofrezca información "bajo demanda".
    Consecuentemente, esto conlleva una complicación extra - relativa - en cuanto a infraestructura, pero simplifica mucho el desarrollo del programa, ya que los móviles pasarían a ser meros clientes.

    Respecto a la  tecnología a usar:
  • PHP+MySQL para crear el servicio web
  • Python para el proceso de actualización automática de la base de datos.
  • Para lanzar el script en Python de forma periódica, me serviré de cron.
    La razón principal para usar estas herramientas es que puedo publicar un servicio web casero de forma trivial. Además, si en un momento determinado necesitara externalizarlo, no tendría muchos problemas en encontrar un proveedor en internet que me ofreciese dicha logística.

jueves, 28 de junio de 2012

Algunos bocetos

    Una parte fundamental en cualquier programa es que la interfaz sea
  • Funcional: que haga lo que debe lo más dignamente posible. En este apartado los programadores nos solemos defender bastante bien.
  • Agradable: o cómo percibe el usuario la interacción con el programa. Aquí entran en juego diversos aspectos como la sencillez de uso, el diseño visual, ergonomía, ... Por norma general, en este apartado los programadores no estamos muy especializados, lo descuidamos, o directamente hacemos agua. Desde el punto de vista de usuario, éste quizá sea el punto que más peso tiene. Esa percepción es la que hace que use, descarte, o recomiende un programa.

    Por esta razón, desde El Primer Post tenía claro que quería un diseñador en el proyecto. Así que, sin más preámbulos... Del creador de grandes éxitos como Rajoy Hood o El Grinch. Del ganador del concurso de carteles de fiestas Baraka-town 2012 (redoble de tambores), les presento a mi amigo y compañero Josu y unos bocetillos que ha propuesto para la ocasión.


lunes, 18 de junio de 2012

Eppur si muove

    Durante estas semanas he estado leyendo mucho y haciendo mis primeros pinitos con esto del Android. También me he leido un buen libro sobre Java del que ya hablaré - o no -. Incluso he estado jugando con C# sobre Mono. El asunto es que algo se ha movido. He de reconocer que tras diez años como programador en VB6, me encuentro inquieto. Junto a la pequeña satisfacción de ir avanzando, siento vértigo ante lo que intuyo que tengo por delante. Y más que miedo, es ansiedad por avanzar. Estoy maravillado con conceptos como el de interfaz, por poner un ejemplo. Supongo que cada cosa tiene un momento, y éste es el mio para apreciar las nociones de la programación orientada a objetos. Y de evolucionar como profesional. Estas semanas he recordado cuánto he disfrutado programando. Y vuelve a divertirme. Lo estoy notando en mi curva de aprendizaje, y en mi día a día en el trabajo.

    Y como el movimiento se demuestra andando, y el cariño cocinando, allá va un snippet de código que ya forma parte del esqueleto de la aplicación de los precios del combustible.



------------------------------------------------------------ Doblar por aquí ------------------------------------------------------------

package zoom.preciogasolina;

import android.util.Log;

public class Util {
    private final static String TAG="Util";
   
    public static Double getDistance(float lat1, float lon1, float lat2, float lon2) {
        /** Calcula distancia entre dos puntos de la superficie de una esfera */
        /* Fuente: http://www.tutiempo.net/p/distancias/calcular_distancias.html */
        Log.d(TAG,
                "getDistance: lat1=" + lat1 +  
                "; lon1=" + lon1 +
                "; lat2=" + lat2 +
                "; lon2=" + lon2);

        final double degtorad = 0.01745329;
        final double radtodeg = 57.29577951;
        double dlong = (lon1 - lon2);
        double dvalue = (Math.sin(lat1 * degtorad)
                * Math.sin(lat2 * degtorad))
                + (Math.cos(lat1 * degtorad)
                * Math.cos(lat2 * degtorad)
                * Math.cos(dlong * degtorad));
        double d = Math.acos(dvalue) * radtodeg;
        return d * 111.302;
    }

    public static float toFloat(CharSequence c) {
        try {
            float f = Float.valueOf(c.toString()).floatValue();
            Log.d(TAG, "toFloat = " +f);
            return f;
        } catch(NumberFormatException e) {
            Log.e(TAG, "toFloat:" + e.getMessage());
            return 0;
        }
    }
}

------------------------------------------------------------ Doblar por aquí ------------------------------------------------------------

domingo, 3 de junio de 2012

Documentación incial: libros (I)

    Parafraseando a Paco Umbral hoy he venido ha hablar de mi libro. Y éste es uno bueno. Iba a esperar a que sacaran la película, pero al final me lo he leido. No es otro que "Hello, Android. Introducing Google's Movile Development Platform, 2nd Edition".

Unos datos técnicos
  • Autor: Ed Burnette.
  • Año: 2009. 
  • Editorial: The Pragmatic Programmers.
  • Idioma: Inglés

Breve sinopsis
    Tras una breve introducción en la que explica quién debería leer el libro, cómo leerlo y algún apunte extra, está dividido en tres grandes partes:

  1. Introducción:
    • Cómo instalar las herramientas de trabajo, crear y ejecutar un programa.
    • Cómo está construido el sistema (ojo, spoilers):
      • En el nivel inferior hay un nucleo de Linux.
      • Sobre éste hay una serie de bibliotecas nativas compiladas para cada dispositivo ("surface manager", "Media Framework", "SQLite", "OpenGL", "FreeType", "WebKit", "SGL", "SSL" y "libc"). Existe la posibilidad de crear bibliotecas nativas utilizando el "Native Development Toolkit" (NDK). A este nivel se encuentra también el runtime de Android que incluye la máquina virtual Dalvik - una máquina virtual de Java optimizada para dispositivos móviles -, y el conjunto de bibliotecas de Java - que son distintas a las de la Standard Edition y a las de Movile Edition -.
      • Sobre las bibliotecas nativas y el runtime se encuentra una capa con un framework de aplicaciones. Viene preinstalado y es extensible con componentes propios si fuera necesario. Es con este nivel con el que se comunicarán nuestras...
      • ... aplicaciones y widgets, que forman la capa superior del sistema.
       
  2. Conceptos básicos de las aplicaciones. A través de la creación de un Sudoku, el autor nos introduce los siguientes conceptos:
    • Diseñar la interfaz de usuario (y depurar el programa a través usando logs y el debugger)
    • Gráficos 2D
    • Multimedia
    • Almacenar datos en local.
     
  3. Conceptos avanzados
    • Conexión a internet.
    • Uso de los distintos sensores de los dispositivos. En este caso nos muestra un ejemplo con el GPS.
    • Utilización de bases de datos: SQLite.
    • Gráficos con OpenGL.

Valoración
    El libro no se mete a fondo en los conceptos explicados, pero deja un cuadro lo suficientemente completo como para comprender el sistema en su conjunto. Como ya he dicho es un buen libro: fácil de seguir, bien explicado, con buenos ejemplos y dificultad creciente. En resumen: sin llegar a una profundidad excesiva, asegura los conceptos básicos, y es tan fácil de leer que hubo un momento en que me olvidé que era en Inglés. Altamente recomendable como toma de contacto con Android.

sábado, 12 de mayo de 2012

Poniendo a punto las herramientas

    ¿Qué necesito para comenzar el programa? necesito documentación técnica y un entorno de desarrollo. Mi intención inicial respecto al entorno de desarrollo era la de no hacer ninguna mención. Después de todo hay muchos buenos tutoriales por toda la red, y no creo que fuera a aportar nada. El caso es que me ha resultado tan fácil obtener las herramientas, que creo que debo hacer un comentario sobre el proceso, como pequeño homenaje particular al buen trabajo de toda la gente que esté detrás.

Instalando Eclipse en Ubuntu 12.04 TLS.
    Abrimos un terminal y escribimos:
sudo apt-get install eclipse
    Y ya. En serio. Tenemos el entorno de desarrollo. En este caso la versión Indigo. Y si no tuvieramos el SDK de Java, ello solito se encargaría de descargarlo, instalarlo y ponerlo a punto.

Adecuando Eclipse para Android (ADT Plugin)
    En el Eclipse, añadimos el repositorio para el plugin (https://dl-ssl.google.com/android/eclipse/), seleccionamos "Developer Tools" y le dejamos hacer. Ello sólo resolverá las dependencias que falten. Es un punto importante, ya que hace no demasiado tiempo, había que instalarlas manualmente para que el entorno funcionara. Mi sorpresa - grata - llegó en este momento. Tras la instalación y volver a abrir el Eclipse, él solo se encargó de descargar el SDK y configurarlo. Es decir, en un sólo paso extra queda el IDE preparado para su uso. Curiosamente, y según las indicaciones de la página oficial, lo primero que se debería hacer es descargar e instalar el "SDK starter package", y posteriormente instalar el "ADT Plugin" para Eclipse. Por último sólo nos quedaría añadir versiones extra del SDK si lo estimamos oportuno, y algún dispositivo virtual para poder ir probando código de forma cómoda sin movernos de nuestro equipo.

domingo, 29 de abril de 2012

La idea


    "Mira nena, aquí hay una cuestión: el concepto es el concepto". Y éste es sencillo: un comparador de precios de combustible. Decía un buen amigo que "todo lo que sube, baja. O se encaja". Bueno, pues el precio del petroleo ni baja, ni se encaja. El asunto es cuán rápido va a subir: cuando no es tensión en una zona de tránsito de crudo, es guerra en otra, o conflicto diplomático con productores, o alguna subida de impuestos más o menos encubierta, o que el perro de un jefazo tiene moquillo...


¿Cuáles son objetivos?
    Soy perfectamente consciente de que existen otros programas en el mercado que ya hacen lo que voy a desarrollar. No me preocupa. Como ya dije en El primer post, el objetivo no es la aplicación en sí, ni buscarme un hueco en el mercado con esto. Aclarado este punto, empecemos a tomar decisiones.


¿Qué tipo de aplicación quiero desarrollar?
    He valorado tres grandes grupos: de escritorio, web o móvil. Partiendo de las premisas planteadas en la entrada precedente, la respuesta es casi trivial:
  • no quiero aprender a programar web - de momento - con lo que una página web queda descartada.
  • quiero que sea útil: el escenario que me he imaginado es buscar gasolineras en zonas que no se conocen muy bien. Todos sabemos más o menos cuáles son las gasolineras más caras cerca de casa. Para este caso me parece que puede ser mucho más apropiado una aplicación móvil que una de escritorio. Después de todo, es más común tener a mano un teléfono cuando estás en el coche, que un portátil con conexión a internet.

¿Qué plataforma usar?
    Opciones: Symbian, Android, iOs, Windows Phone y Meego. Todas estas plantaformas cumplen la premisa de utilizar lenguajes y herramientas desconocidas para mi. Aunque viendo los ojitos que me está poniendo Josefa (mi Nexus One), no me puedo resistir: Android. Ya decidiré de qué versión partir.


¿Lenguajes y herramientas?
    Poco hay que decir sobre este punto: Java y Eclipse con el plugin de Android. El punto a favor es que las herramientas de desarrollo son multiplataforma:
  • en casa yo uso linux. Me hubiera supuesto un conflicto decantarme por otro sistema móvil.
  • si en un futuro se sumara más gente al proyecto no habría dificultades al respecto.


¿Primeros pasos?
    Comenzaré por el principio: documentarme. Pero eso es carne para otro post.

sábado, 21 de abril de 2012

El primer post


    Antes de empezar a dar contenido a este blog, creo que debo escribir una entrada explicando qué me ha impulsado a crearlo.

¿Qué me motiva?
    En el fondo de todo esto hay un reto. Me divierten los retos. Y ahora quiero - necesito - uno que tenga algo más que el carácter lúdico de un pasatiempo. Por eso he creado uno. El reto consiste en desarrollar una aplicación, que sea útil, con herramientas y lenguajes desconocidos para mi.

¿Por qué un blog?
    Porque quiero registrar la evolución de la aplicación de principio a fin. Un blog me ha parecido una buena alternativa. De paso aprendo lo que implica mantener uno, y en un futuro podré analizar la línea de desarrollo para buscar errores y puntos de mejora.

¿Dónde?
    Blogger. ¿Y por qué Blogger y no una web construida por mi?
  • es una plataforma ya asentada
  • con una curva de aprendizaje nula
  • es gratuita
  • me puedo despreocupar del mantenenimiento
  • me olvido de las políticas de backup
  • puedo editar desde cualquier lugar 
  • es - aparentemente - confiable y segura.
    Por otro lado no busco aprender a programar una web (ése es otro objetivo futuro). Además no quiero caer en el error de centrarme en las herramientas desatendiendo el objetivo.

¿Cuándo lo voy a hacer?
    El tiempo que voy a dedicar al desarrollo del proyecto será de unas pocas horas semanales en mi tiempo libre. Esto no quiere decir que vaya a publicar una entrada todas las semanas. Actualizaré cuando crea que tengo algo significativo que contar. Tampoco quiere decir que infravalore el proyecto: mi tiempo libre es muy valioso para mi.

¿Cuánto tiempo va a durar?
    No me he planteado un plazo de ejecución determinado. En tanto en cuanto siga aprendiendo cosas nuevas, seguiré el desarrollo. Cualquiera que haya fabricado software, sabe que un proyecto es siempre mejorable. No quiero hacer una línea en el suelo antes de empezar a caminar. Me voy a plantear retos cortos y alcanzables.


¿Quién?
    Yo. Estoy dispuesto a asumir todo el desarrollo. Si bien es cierto que me gustaría que llegase a ser un proyecto en equipo, valoro que tengo que madurar la idea un poco más. Ahora mismo tengo en mente tres buenos amigos que me gustaría que se involucraran: un ingeniero informático, un programador y un diseñador. Como he dicho, todo llegará en su momento.

    Respecto a mi, digamos que soy un informático en una empresa de tamaño medio, que toca muchos palos de la informática: analista, programador, helpdesk, mantenimiento de hardware, administrador de red, responsable de protección de datos, de Calidad, ... ¡un chollo oiga!


¿Cómo?
    Pues de eso va este blog... del cómo. Veremos como capeamos el temporal xD

    Y con este primer post, queda inaugurado este pantano.