Usar subconsultas (subqueries) con mysqldump

23rd
ene. × ’12

Para estudiar una porción de los datos de Bisicalc, necesitaba poner en un fichero .sql el resultado de una consulta:

SELECT *
FROM `statuses`
WHERE update_id in (
   select id
   from updates
   where timestamp >='2011-12-01' and timestamp < '2012-01-01'
)

El problema es que al usar mysqldump me daba un error: Table ‘updates’ was not locked with LOCK TABLES (1100)

La solución: llamar a mysqldump con el parámetro “–lock-all-tables”

mysqldump -t -u root --lock-all-tables -p bisicalcdb_prod statuses --where="update_id in (select id from updates where timestamp >='2011-12-01' and timestamp < '2012-01-01')" > 201112_december_statuses.sql

10 nuevas estaciones de Valenbisi

10th
ene. × ’12

Desde Diciembre han aparecido 10 estaciones nuevas de Valenbisi, que ya podéis ver en el mapa de Bisicalc. Se amplía la cobertura en zonas como Tres Forques y el Barri de la Llum y se añaden estaciones a el centro. También se amplia hacia el norte y sur con nuevas estaciones en El Cabanyal y Nazaret.

Estación 86: Gaspar Aguilar – Vicente Parra, 20 bornetas

Estación 258: Pintor Rafael Solves – Jose Soto Mico, 15 bornetas

Estación 262: Tres forques – Colonia Española de México, 19 bornetas

Estación 263: Padre Esteban Pernet – Casa Misericordia, 17 bornetas

Estación 264: Av. del Cid – Marconi, 19 bornetas

Estación 266: Canal de Navarrés – Maestro Rodrigo, 17 bornetas

Estación 40: Barcas 11, 25 bornetas

Estación 70: Colón 27, 17 bornetas

Estación 272: Vicente la Roda – Doctor Alvaro López, 16 bornetas

Estación 275: Moreras – Rona de Nazaret, 13 bornetas

Cuatro estaciones añadidas pero aún no disponibles:

Estación 91: Grabador Jordan – Escultor Pastor
Estación 93: Blasco Ibañez – Poeta Durán Tortajada
Estación 273: Moraira – Alta del Mar
Estación 274: Castell de Pop – San Francisco de Paula

Local virtual hosts y lvh.me

3rd
ene. × ’12

Una de las cosas que aprendí con la maratón de código de bisicalc es un sencillo truco para acceder a localhost sin tener que cambiar el fichero hosts.

Dos situaciones en las que nos puede ser útil este truco:

1. Trabajando con una aplicación web en un host virtual de apache:

<VirtualHost *:80>
       ServerName bisicalc.local
       DocumentRoot /Users/cesar-mb/railsprojects/bisicalcdb/public
       <Directory /Users/cesar-mb/railsprojects/bisicalcdb/public>
           AllowOverride all
           Options -MultiViews
       </Directory>
</VirtualHost>

Cada nuevo host virtual sería una modificación del fichero hosts, y otra del fichero de virtual hosts de apache.

2. Trabajando con subdominios: barcelona.bisicalc.local, valencia.bisicalc.local, etc. Cada uno require una nueva entrada en el fichero hosts.

Yo tenía los dos problemas: virtual hosts y subdominios, uno por ciudad.

DNS al rescate. Una entrada wildcard apuntando a 127.0.0.1 y ya no hay que modificar más el fichero hosts. ¿No administras un dominio o DNS?, no hay problema. Tim Pope ha configurado *.smackaho.st para que apunte a 127.0.0.1. ¿Demasiado largo? *.lvh.me hace lo mismo.

Simplemente apunta tu browser a cualquier subdominio de lvh.me (es.lvh.me, en.lvh.me, etc.) y ambos se resolverán a localhost, sin necesidad de modificar el fichero hosts.

Saturday live code: ¡Está vivo!

17th
dic. × ’11

Bueno, justo a las doce de la noche y después de unos pequeños problemas de muerte prematura y fallos iniciales, he conseguido llegar a la meta que me había propuesto esta mañana: Sacar una versión de Bisicalc para todas las ciudades españolas que exponen los datos de las bicis de alquiler.

Esta semana pondré un par de artículos sobre las cosas que he aprendido, sobre todo de Rails routing y precompilación de assets (que no termina de convencerme).

Saturday live code: testing, testing, testing

17th
dic. × ’11

Ya casi estamos. Al final he pasado más tiempo haciendo testing de la aplicación y arreglando bugs que programando. Buena señal. Aquí un pantallazo de la fase de testing con el simulador de iOS, para ver que la home page era visible y usable desde dispositivos móviles:

La mayoría de los problemas han sido causados porque soy un novato en Ruby on Rails y he tenido que estudiarme a fondo el tema del routing en Rails 3 con subdominios. O lo que es lo mismo, que las peticiones a barcelona.bisicalc.com, valencia.bisicalc.com, etc… sean procesadas por la misma aplicación.

Y ahora, hacer check in en GIT y a subir la aplicación al servidor, es decir… a romperlo todo, porque estas cosas nunca funcionan bien a la primera.

Saturday code live: el segundo bug del infierno

17th
dic. × ’11

Debería haber subido ya la versión que os he estado enseñando a bisicalc.com… pero algo se ha interpuesto en mi camino: El bug del infierno de último minuto™.

Para resumir dos horas en dos minutos: El API de Citybik.es me devuelve la fecha y hora de actualización de cada estación en formato:

2011-12-17 00:16:51.335480

Pero Javascript en Firefox/Safari no tragaba, y en lugar de formatear la última fecha de actualización, me decía: NaN/NaN/Nan a las NaN:NaN (NaN = Not a Number). Por algún oscuro motivo en Chrome si que funciona.

La especificación de Javascript dice que el formato que viene de citybik.es no es ninguno de los dos aceptados. Lo que más se aproxima a lo que me pasan es un subconjunto de la norma ISO 8601:

2011-12-17T00:16:51.335480+01:00

Expresiones regulares al rescate:

var last_update_date = new Date(last_update[0].timestamp.replace(/(\S*) (\S*)/,"$1T$2+01:00"));

Queda por hacer:

  • Adaptar Bisicalc Valencia al nuevo formato, ahora no funciona
  • Añadir una página de bienvenida
  • Subir a servidores

Saturday live code: No os tengo olvidados

17th
dic. × ’11

Estoy en ello, ahora viene la parte peliaguda… actualizar servidores. De momento os dejo con una foto de Sevici:

Saturday live code: bizi Zaragoza funcionando en 5 minutos

17th
dic. × ’11

Al final aquello de divide y vencerás ha funcionado. Sólo cambiando el javascript con las coordenadas de Zaragoza… ¡tachán!

El javascript:

// THE GRID
var theGrid = new Object();
theGrid.latN = 41.69445;
theGrid.latS = 41.623399;
theGrid.lonW = -0.944138;
theGrid.lonE = -0.834618;
theGrid.SW = new google.maps.LatLng(theGrid.latS,theGrid.lonW);
theGrid.NE = new google.maps.LatLng(theGrid.latN,theGrid.lonE);

theGrid.bounds = new google.maps.LatLngBounds(theGrid.SW, theGrid.NE);
theGrid.cellSize = 250; // meters
theGrid.distance = 1; // number of cells square we use to calculate occupations
// END THE GRID

var city = new google.maps.LatLng("41.655553","-0.887806");

var APIurl = "http://api.citybik.es/bizi.json?callback=?";

Saturday live code: El efecto Baixing

17th
dic. × ’11

Me comentan que en el bicing de Barcelona tienen lo que se conoce como “el efecto Baixing”: todas las bicis acaban concentrándose cerca de la playa, en las zonas más bajas de la ciudad. Debe ser porque a la gente no le gusta pedalear hacia arriba.

No conozco mucho la geografía de Barcelona, pero se puede ver que efectivamente si que acaban cerca de la playa…

Saturday live code: El típico bug que te lleva una hora y se resuelve con una línea de código

17th
dic. × ’11

El API de Citybik.es en JSON usa UTF-8 para codificar los caracteres. En el primer intento de hacer los mapas térmicos de bicing, las etiquetas de las estaciones con nombres con acentos o cedillas salían con “un garabato”.

El parsing del JSON lo hago con jQuery y al inspeccionar las variables podía ver que el garabato venía directamente del API:

… ¿o no?, ¿qué me devuelve el API antes de llamar a $.getJSON ?

Es decir, jQuery se está haciendo la picha un lío con el encoding de los caracteres. El API me devuelve UTF-8, que es perfectamente válido para JSON, pero me da a mi que jQuery espera Unicode.

Por cierto, el Mínimo Minimorum Que Todo Desarrollador De Software Positiva Y Absolutamente Debe Saber Acerca De Unicode Y Conjuntos De Caracteres. (¡Sin Excusas!).

La solución tras una hora de búsqueda es, como casi siempre, una sola línea de código, antes de llamar a getJSON:

 $.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/json; charset=utf-8"});