miércoles, 27 de febrero de 2013

Primera prueba pública

Aunque no haya publicado nada aquí durante los últimos meses, no quiere decir que el proyecto esté parado:
  • Ya está automatizada la actualización de precios.
  • Está creado el servicio web - JSON (¡gracias Juan!) y XML.
  • Existe una pequeña demo para Android - la liberaré, palabrita de niño Jesús.
  • Un formulario de consulta WEB, utilizando PHP y Ajax. Una vez más, ¡gracias Juan!
El objetivo de esta corta entrada es invitarte a usarlo. Si permites a tu navegador que te geolocalice, devolverá las gasolineras en un radio determinado - no pruebes más de 25km. que quien mucho abarca... -. Si no se lo permites, te mostrará los de la capital del reino... O si te sabes las coordenadas de tu casa de memoria... pues puedes introducirlas. Por último, en ningún momento se almacenan ni se almacenarán los datos que introduzcas en el formulario.

Cualquier comentario, irregularidad, reflexión, ... será bienvenido.

Aquí tienes el enlace http://gas.x10.bz/preciosGas.php

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.