segunda-feira, 30 de abril de 2012

Mapas de indicadores do RS

Na última terça-feira, dia 24/04, foram lançados os mapas de indicadores do TCE-RS. Eu trabalhei neles por um bom tempo e gostei de vê-los anunciados pela mídia do estado. Vou gostar ainda mais se meus compatriotas gaudérios os usarem para cobrar melhores resultados de seus prefeitos e suas câmaras municipais.

Os mapas foram escritos principalmente em Javascript (porque usam o Google Maps como base) e em PL/SQL (para gerar os dados). Não há muito no meio (deixei vários programadores Java sem emprego), exceto um script em Perl. O PL/SQL gera JSON, cujo resultado é armazenado em arquivos pelo script em Perl (porque algumas consultas são muito lentas e, de qualquer forma, porque eu não queria nenhuma carga extra desnecessária para o banco). O dia seguinte ao lançamento teve o maior número de acessos (6.487) e não teve nenhuma conseqüência sobre os servidores de aplicação e o banco justamente porque foram servidos apenas arquivos estáticos.



A principal dificuldade foi a de tirar um desempenho aceitável do Internet Explorer. O Javascript do IE é o pior por larga margem. Um Firefox 3 num Pentium Core Duo ainda é melhor que um IE9 num i7 de 4 núcleos. O garagalo principal está no código que desenha os 496 municípios; no IE ele demora tanto que o navegador acaba abrindo um alerta de que o script está demorando demais. A única forma de evitar esse problema foi dividir o trabalho no tempo com o setTimeout(). Os municípios são desenhados em grupos de 50 no IE e todos juntos nos outros navegadores.

As coordenadas foram comprimidas através de facilidades da própria API do Google Maps. A minha tentativa de comprimi-las tinha me levado de 1,5MB a 530KB, porque aproveitei o fato de que todas têm números negativos (exclui todos os sinais) e que as diferenças entre coordenadas consecutivas são pequenas (guardei apenas as diferenças sem o separador decimal). Mas a API do Google Maps é mais esperta e o arquivo final tem apenas 298KB.

Além da API do Google Maps, usei os plugins blockUI e Sparkline (para desenhar os gráficos) do jQuery. As consultas ganharam muito com o uso das funções analíticas do Oracle (que o Postgresql também oferece), já que com elas posso calcular médias e somas de vários anos distintos de uma só vez.

Em resumo, foi um excelente exercício de duas tecnologias muito diferentes: PL/SQL e Javascript. A primeira me permitiu escrever consultas muito mais legíveis e concisas; a segunda me permitiu jogar para o cliente toda a computação que restou fazer e assim aliviar a pressão dos servidores.

Nenhum comentário: