coge la información y corre

API de Valenbisi (Servicio de JCDeacaux)

19 de Julio del 2010 Escrito por Alex Barros

Pulsa para ver las estaciones de Valenbisi »

Valenbisi es un servicio que ofrece el ayuntamiento de Valencia de bicicletas públicas, mediante una red de “estaciones” donde coger o dejar una bici.

La web que tienen ( http://www.valenbisi.es ) me parece muy deficiente, por lo que me quiero aventurar a hacer una aplicación simplificada, más 2.0, con la API de Google Maps.

La web de Valenbisi (la empresa encargada es la francesa JCDecaux) no ofrece una API pública, pero no es muy difícil averiguar el sistema que usan para cargar los datos en su web (que es lo que voy a detallar a continuación). Sólo esperemos que no modifiquen esta funcionalidad, que resulta verdaderamente accesible.

Se trata de dos archivos clave, que contienen toda la información en el formato XML:

1: Las estaciones

El primer archivo nos va a dar información de todas las estaciones existentes, junto con información relativa a la localización.

http://www.valenbisi.es/service/carto

Devuelve un archivo similar a este fragmento:

  1. <carto>
  2.   <markers>
  3.     <marker name="063_AVDA. DEL PUERTO I" number="63" address="AVDA. DEL PUERTO I – Esq. C/Antonio Suarez" fullAddress="AVDA. DEL PUERTO I – Esq. C/Antonio Suarez  " lat="39.46755709145644" lng="-0.357891042655049" open="1" bonus="0"/>
  4.     <marker name="064_AVDA. DEL PUERTO II" number="64" address="AVDA. DEL PUERTO II – Frente a los numeros 61 y 63" fullAddress="AVDA. DEL PUERTO II – Frente a los numeros 61 y 63  " lat="39.46638708872079" lng="-0.353943030206345" open="1" bonus="0"/>
  5.     <marker name="065_AVDA. DEL PUERTO III" number="65" address="AVDA. DEL PUERTO III – Esquina con Calle Doctor Manuela" fullAddress="AVDA. DEL PUERTO III – Esquina con Calle Doctor Manuela  " lat="39.46549608664973" lng="-0.351062021089717" open="1" bonus="0"/>
  6.     <marker name="066_GUILLEN DE ANGLESOLA" number="66" address="GUILLEN DE ANGLESOLA – Esquina con Avenida del Puerto" fullAddress="GUILLEN DE ANGLESOLA – Esquina con Avenida del Puerto  " lat="39.46414708365747" lng="-0.34636900630001" open="1" bonus="0"/>
  7.     <marker name="067_JUAN VERDEGUER" number="67" address="JUAN VERDEGUER – Esquina con Calle Boters" fullAddress="JUAN VERDEGUER – Esquina con Calle Boters  " lat="39.458805068652005" lng="-0.337036975447925" open="0" bonus="1"/>
  8. </carto>

Cada marker contiene toda la información de una estación, que son el nombre, el número (este dato es fundamental para el siguiente paso), la dirección, datos cartográficos y si está operativa (la propiedad bonus no he comprendido todavía qué significa)

2: Detalles de la estación

Cuando quieres centrarte en los datos de una estación concreta, debes acudir al siguiente archivo. Se trata de una dirección base a la que debes añadir al final el número de estación que deseas obtener.

http://www.valenbisi.es/service/stationdetails/num_estacion
(donde num_estacion es un número entero correspondiente a una estación.)

Devuelve un archivo como este:

  1. <station>
  2.   <available>14</available>
  3.   <free>2</free>
  4.   <total>19</total>
  5.   <ticket>0</ticket>
  6. </station>

Es decir, el número de bicicletas disponibles (avaliable), el número de bornetas disponibles para aparcar (free) el número total de bornetas con que cuenta la estación (total) y si admite la opción de alquiler con tarjeta bancaria (ticket).

A partir de aquí lo único que hace falta es un parser de XML para el lenguaje que estés utilizando, y una conexión a internet, el resto lo pone la imaginación del programador.

Que vivan las APIs!

(Editado: podéis ver mi experimento: bicis disponibles de Valenbisi en http://bicivalencia.com y una versión móvil en http://bicivalencia.com/m)

Categorias: Boozox | 5 comentarios »

Múltiples join y solución al encadenar LEFT JOINS

5 de Noviembre del 2009 Escrito por Alex Barros

Desde que publiqué el artículo de Inner Join para unir tablas y más especialmente el de Explicación visual de los SQL Join – Unir tablas con SQL me han consultado en muchos comentarios cómo hacer múltiples JOIN en una sóla consulta.

Hasta hoy no lo había necesitado, y nunca supe contestar. Hasta hoy.

Encadenar Joins es tan simple como ponerlos uno a continuación de otro.
ejemplo:

  1. SELECT A.*, B.*, C.id FROM tabla_a A
  2. INNER JOIN tabla_b B ON A.id = B.foo
  3. LEFT JOIN tabla_c C ON A.id = C.bar

Y así sucesivamente. Puedes tener tantos joins como necesites, y si es necesario jugar con los paréntesis para cambiar la preferencia (por defecto MySQL lee de izquierda a derecha).

Pero una vez esto aclarado, me he encontrado con un problema. Lo que yo quería hacer es una serie de LEFT JOINs para consultar en una serie de tablas la cantidad (COUNT()) de registros de otras tablas que estaban asociados a la clave primaria de una tabla principal.

En mi caso concreto, tengo una serie de Rutas de bicicleta en una tabla, y en otras tablas satélite tengo almacenados los comentarios asociados a la ruta, las votaciones, los archivos adjuntos, etc… de modo que haciendo un COUNT en estas tablas para cada una de las claves primarias de la principal (Rutas) me saldría la cantidad asociada.

Así que hice algo como esto:

  1. SELECT R.*, COUNT(C.id) comments, COUNT(S.id) saved, COUNT(V.id) votes, COUNT(P.id) photos, U.name owner, U.mail, U.about, U.image avatar, U.authority
  2.  
  3. FROM geo_routes R
  4. LEFT JOIN geo_comments_routes C ON R.id = C.cid
  5. LEFT JOIN geo_saved S ON R.id = S.route
  6. LEFT JOIN geo_votes V ON R.id = V.route
  7. LEFT JOIN geo_photos P ON R.id = P.route
  8. LEFT JOIN geo_users U ON U.id = R.property
  9.  
  10. GROUP BY R.id

Pero esta consulta no daba valores correctos, sinó que en estos campos COUNT aparecía generalmente el mismo número replicado.

La solución es usar la cláusula DISTINCT en los COUNT, ya que en cada uno de los LEFT JOIN se están asociando muchos campos a cada registro de la tabla principal, y si no especificas el que te interesa cuántos DISTINTOS hay (y no sólo cuántos hay) te hincha la cifra o simplemente te la altera.

De modo que mi consulta ha quedado así:

  1. SELECT R.*, COUNT(DISTINCT C.id) comments, COUNT(DISTINCT S.id) saved, COUNT(DISTINCT V.id) votes, COUNT(DISTINCT P.id) photos, U.name owner, U.mail, U.about, U.image avatar, U.authority
  2.  
  3. FROM geo_routes R
  4. LEFT JOIN geo_comments_routes C ON R.id = C.cid
  5. LEFT JOIN geo_saved S ON R.id = S.route
  6. LEFT JOIN geo_votes V ON R.id = V.route
  7. LEFT JOIN geo_photos P ON R.id = P.route
  8. LEFT JOIN geo_users U ON U.id = R.property
  9.  
  10. GROUP BY R.id

Después he asociado a esta consulta una Vista, para poder tratarla como si fuera una tabla con esos campos ya incluidos.

Espero que estos consejos os puedan servir de mucho! A mi me ha costado mucho dar con las respuestas.

Categorias: Boozox | 13 comentarios »

¿Por qué cambio el código por la cámara de vídeo?

26 de Agosto del 2009 Escrito por Alex Barros

La decisión está tomada, voy a cambiar el rumbo de mi vida: cambiaré la creación de webs y aplicaciones online por la creación de productos audiovisuales de mano de mi productora Zumbe.

¿Pero por qué?

Porque haga lo que haga, me gusta entregarme al 100% dando el máximo de mi. En internet esto significa pasar horas y horas y más horas tecleando frente al ordenador, alejándote de las relaciones humanas. En el cine esto significa socializar con todo tu equipo, conocer gente y lugares increibles, caminar de un lado a otro…

Porque cuando haces páginas web todo el mundo quiere que le ayudes desinteresadamente, cosa que no me desagrada, pero sin duda absorve. Por no hablar de la cantidad de ofertas de empleo “basura” por parte de amigos, amigos de amigos y familiares, remunerados pero muy mal remunerados, porque total “es lo que haces todo el día en casa sólo que encima te llevas algo a la buxaca

Porque amo la parte técnica y la parte artística por igual. En el cine puedes controlar el 50% de ambas fácilmente, pero en la creación de webs la parte artística es muy limitada y terriblemente compleja (hablo de buenos diseños de webs)

Porque quiero. Y me parece una aventura que va a merecer mucho la pena.

No me atrevo a sentenciar la muerte de este blog de temática informática, pero muy probablemente continúe mucho tiempo en coma. Nop he resistido a la tentación

Gracias a todos por comprenderlo, y espero que veáis mis producciones con las mismas ganas que veíais mis tutoriales. Porque la informática le gusta a mucha gente, pero el entretenimiento… ¿a quién no le gusta?

Categorias: Boozox | 12 comentarios »

Proyectos on progress

2 de Junio del 2009 Escrito por Alex Barros

Rodaje de “Tu Muerte Está Cerca”

35%

Se han rodado el capítulo 2 casi completo, y los capítulos 3 y 4 parcialmente. Faltan el 5 y 6. Estreno en Septiembre de 2009

Gpsia 3.0

55%

Falta mucho diseño artístico y de interfaz manejable. Gran parte del núcleo ya está listo.

Motriz 1.0

5%

Proyecto en desarrollo, similar a un framework web.

Categorias: Boozox | 8 comentarios »

Iré a la Valencia Pillow Fight

28 de Mayo del 2009 Escrito por Alex Barros

Yo voy… nos veremos allí?
13 de Junio en la pza. de la Virgen. Si estás de exámenes, no veo mejor manera de desahogarse! :D

Categorias: Boozox | 3 comentarios »

Script PHP para explorar archivos y directorios recursivamente

2 de Mayo del 2009 Escrito por Alex Barros

No es la primera vez que necesito construirme un script como éste, así que voy a publicarlo tanto para mí en el futuro como para todo aquél que pueda servirle.

Este script de PHP sencillamente recorre todos los archivos y directorios (y archivos dentro de directorios) a partir de cierta dirección que le proporciones, para realizar la tarea que tu quieras.

En mi caso, necesitaba encontrar todos los archivos PHP, y buscar en su interior el primer parámetro de todas las apariciones de la función t()

Para ello hice un ereg (expresión regular) al nombre de cada archivo, y a los que fueran php, hice otra expresión regular más compleja, que extrajera el primer parámetro de todas las funciones t() ejecutadas en el archivo, y lo almacenase en un array.

  1. <?php
  2. $contenido = array();
  3. function inspecRec($dir) {
  4.         global $contenido;
  5.         if ($gd = opendir($dir)) { //Abro directorio
  6.                 while (($ar = readdir($gd)) !== false) { //recorro su interior
  7.                         if(eregi(".*\.php",$ar)) { //compruebo extension
  8.                                 $co = file_get_contents($dir.‘/’.$ar); //extraigo su contenido
  9.                                 preg_match_all("/[^a-zA-Z]t\(‘(.*)’(,.+)?\)/Ui",$co,$re); //compruebo funcion t()
  10.                                
  11.                                 if(count($re[1])) { //si ha encontrado contenido…
  12.                                         echo "<br><strong>$dir/$ar</strong>"; flush(); //imprimo el nombre de archivo
  13.                                         foreach($re[1] as $r){ //introduzco frases
  14.                                                 if(!isset($contenido[$r]))
  15.                                                         $contenido[$r] = $r;
  16.                                         }
  17.                                 } else {
  18.                                         echo "<br>$dir/$ar"; flush(); //imprimo nombre de archivo
  19.                                 }
  20.                         } elseif(is_dir($ar) && $ar != ‘.’  && $ar != ‘..’) { //si es un directorio..
  21.                                 inspecRec($ar); //recursivamente lo inspecciono tambien
  22.                         }
  23.                 }
  24.                 closedir($gd); //cierro el recurso
  25.         } else {
  26.                 echo "<hr>Error: $dir<br>";
  27.         }
  28. }
  29.  
  30. inspecRec(‘./’); //Ejecuto desde el directorio actual
  31. ?>

[Descargar código]

El uso que le he dado esta vez, más concretamente, era recorrer todos los archivos del programa Gpsia, para buscar la función t() que es la encargada de traducir. Quiero pasar del sistema actual hecho por mí, al sistema estándar de traducción que es gettext(), soportado por PHP (como Wordpress). (Hablaré de esto próximamente)

Estas traducciones se hacen a partir de archivos .po, y mi script genera automáticamente un archivo .po preparado para ser traducido a cualquier idioma. El código específico es éste:

  1. msgid ""
  2. msgstr ""
  3. "Project-Id-Version: Gpsia 3.0\n"
  4. "POT-Creation-Date: \n"
  5. "PO-Revision-Date: \n"
  6. "Last-Translator: Alex Barros <zumbenet@gmail.com>\n"
  7. "Language-Team: \n"
  8. "MIME-Version: 1.0\n"
  9. "Content-Type: text/plain; charset=utf-8\n"
  10. "Content-Transfer-Encoding: 8bit\n"
  11. "X-Poedit-Language: Spanish\n"
  12. "X-Poedit-Country: SPAIN\n"
  13. "X-Poedit-SourceCharset: utf-8\n"
  14. <?php
  15. $frases = array();
  16.  
  17. function inspecRec($dir) {
  18.         global $frases;
  19.         if ($gd = opendir($dir)) {
  20.                 while (($ar = readdir($gd)) !== false) {
  21.                         if(eregi(".*\.php",$ar)) {
  22.                                 $co = file_get_contents($dir.‘/’.$ar);
  23.                                 preg_match_all("/[^a-zA-Z]t\(‘(.*)’(,.+)?\)/Ui",$co,$re);
  24.                                
  25.                                 if(count($re[1])) {
  26.                                         #echo "<br><strong>$dir/$ar</strong>"; flush();
  27.                                         foreach($re[1] as $r){
  28.                                                 if(!isset($frases[$r]))
  29.                                                         $frases[$r] = $r;
  30.                                         }
  31.                                 } else {
  32.                                         #echo "<br>$dir/$ar"; flush();
  33.                                 }
  34.                         } elseif(is_dir($ar) && $ar != ‘.’  && $ar != ‘..’) {
  35.                                 inspecRec($ar);
  36.                         }
  37.                 }
  38.                 closedir($gd);
  39.         } else {
  40.                 #echo "<hr>Error: $dir<br>";
  41.         }
  42. }
  43. inspecRec(‘./’);
  44. sort($frases);
  45. foreach($frases as $f) {
  46.         echo "msgid \"".str_replace(array(‘"’,"\n"),array(\”,""),stripslashes($f))."\"\nmsgstr \"\"\n\n";
  47. }
  48. ?>

[Descargar código]

Categorias: Boozox | 2 comentarios »

Retomando Gpsia con fuerza

28 de Abril del 2009 Escrito por Alex Barros

Gpsia es una aplicación que desarrollo en mi tiempo libre, que consiste en subir y compartir rutas grabadas con GPS, con muchas características muy interesantes.

Nokia Sports Tracker foto de nightoEs una aplicación con mucho potencial, porque el de “usuarios de GPS con ganas de copartir rutas”, es un público que está ahí, que está esperando que le ofrezcas una buena solución. Además me encanta porque es una aplicación que realmente ayuda a la gente a conseguir lo que quiere, no es una banalidad 2.0 (que abundan mucho por la red).

Pues bien, de vez en cuando me dan venazos y retomo mis proyectos de golpe, y anoche fue uno de esos días. Tengo miles de hojas con bocetos de lo que quiero construir, tanto en diseño como en funcionalidad, y en corrección de bugs y optimización.

No recordaba cuánto me gusta desarrollar aplicaciones! Estos días voy a intentar dedicarle tiempo a desarrollar todo lo que tengo en mente. Entre otras cosas, aprenderé a sincronizar programas en C y programas en PHP.

¡Qué nervios! ¿Alguien tiene idea?

[Fotografía de Nighto]

Categorias: Boozox | 2 comentarios »

Creación musical

20 de Abril del 2009 Escrito por Alex Barros

Hell's music Resulta que últimamente ando muy susceptible por el tema de creación musical.

Y esque estamos creando la banda sonora de la serie Tu Muerte Está Cerca. Estubimos barajando Jamendo mucho tiempo, y de hecho usaremos alguna canción libre por enmedio, pero la Banda Sonora Original será creada íntegramente por nosotros.

Estamos aún produciéndola, al igual que la serie. Aquí podéis descargaros un pequeño mp3 de un día que estubimos experimentando al piano con los mágicos dedos de Laura Abarca. Auguro una Banda Sonora excepcional. (La liberaremos bajo Creative Commons, cómo no!)

Y todo esto viene a cuento de que acabo de toparme con la web de un audiocreador, que se dedica a recoger vídeos caseros de youtube y componer música con sus fragmentos, y el resultado es asombroso, una vez te adentras en la creación de audio aprecias lo verdaderamente complicado que resulta.

Visto en Cortos & Trailers

P.D.: Como novedad, en la barra lateral he empezado a colgar la música que oigo para compartirla con todos, porque es legal, y porque a través de Boozox me gustaría inspirar, y la música es fundamental.

Categorias: Boozox | 1 comentario »

Nuevos horizontes en Boozox

20 de Abril del 2009 Escrito por Alex Barros

sad song Va, esto no es serio! Me estoy desparramando demasiado, y la excusa de que “me falta tiempo” ha dejado de ser viable. Para quien no lo sepa, me he tomado un cuatrimestre sabático de universidad.

Pero ya habrá tiempo para mi vida privada en otra ocasión. Me gustaría retomar el ritmo de Boozox, como Blog personal, dándole otra perspectiva. ¿Habrá programación web? Sí, por supuesto, pero en dosis mucho menores. Mi vida ha cambiado, y en consecuencia mi blog lo hará también.

Ashout En esta nueva etapa además de informática y creación web se tocará mucho más terreno artístico, de videocreación, inspiración, y otros temas más personales.

Si estabas suscrito al RSS, te sugiero que des una nueva oportunidad a Boozox, espero que su nueva cara te guste igual o más que la anterior!

Nos vemos muy pronto aquí mismo. Qué ganas tenía de regresar!!

Categorias: Boozox | 3 comentarios »

Las 10 leyes de Jorge y archivos MO

13 de Febrero del 2009 Escrito por Alex Barros

Hoy que he conseguido un pequeño respiro, os quiero comentar dos cosas que me han interesado especialmente.

Lo primero es un artículo de CSSLab, que explica las 10 leyes de Jorge para el diseño Web.

No se a ciencia cierta quién es Jorge (el redactor?) pero parece que tiene bien claras las prioridades en el diseño Web. Comparto al 100% todas sus leyes, y las secundo. De hecho, deberían formar parte de la Constitución, o más aún, ser una ampliación de los Diez Mandamientos.

Y lo segundo, es que me ha picado la curiosidad para aprender hacer programas multiidioma con archivos .mo y .po en PHP.

Ha sido a raíz de este post en Tierra0, un blog que acabo de descubrir y parece muy interesante, en los artículos y en el planteamiento (Lee el Acerca de)

Y eso es todo. Si os ha sabido a poco, sabed que ya ha empezado la producción del segundo capítulo de Tu Muerte Está Cerca, que tendrá unos medios mucho más profesionales, y en términos técnicos: “Se va a salir por tos laos”

Hasta otra!

Categorias: Boozox | 1 comentario »

« Entradas Anteriores

del.icio.us meneame.net RSS

Buscar:

Bicivalencia Localiza las estaciones de Valenbisi, servicio público de bicicletas en Valencia, España. Ver más Gpsia Descubre y comparte rutas por todo el mundo, tomadas con GPS. Ver más Imaset Edita tus imágenes de Wordpress con este sencillo plugin. Ver más

¡Mi música es tuya!

Digo yo que...

Mis fotos de Flickr

Entradas Recientes

Meta:

Respeta el copyleft

,