alien9

August 16, 2011

Compartilhe a rua

Filed under: Uncategorized — tiago @ 7:35 pm

Olá, motorista!

Espero que você tenha um ótimo dia.

Estamos aqui para lembrá-lo de que é preciso respeitar as pessoas.

Todos os dias, milhões de pessoas se deslocam nesta cidade para realizar seus afazeres. Todas estas pessoas precisam chegar em segurança a seus destinos.

Atualmente, nossa cidade enfrenta congestionamentos diários. É chocante a quantidade de tempo que se pode gastar preso no trânsito que não transita.

Estamos aqui para pedir que tenha respeito pela vida e compartilhe a rua.

Pode parecer injusto ter de esperar para alguém atravessar à sua frente, porque seu tempo é precioso. Pode parecer injusto, diante da adversidade que você encontra agora na sua vida, ter de ceder espaço.

Pedimos que se lembre de que o seu carro é parte do problema. É por causa do excesso de carros nas ruas que as nossas cidades não transitam, porque não haverá nunca espaço suficiente para todos. Peço que atente para o fato de que outras pessoas estão esperando que você desocupe a rua para poder alcançar seus destinos.

Diminuir sua velocidade e dar espaço para ultrapassar são atitudes de respeito necessárias e exigidas por lei, nos termos dos artigos 201 e 220 do Código de Trânsito. Os veículos motorizados são responsáveis pela segurança dos não-motorizados, conforme o artigo 29 do CTB. E, ainda que não fosse assim, o desrespeito à vida não vai fazer você chegar mais cedo.

Nós também precisamos chegar em segurança e acreditamos que as ruas são de todos. Queremos uma cidade mais humana, com menos poluição e mais mobilidade, e esta é uma das razões para andar de bicicleta. Não queremos impor nosso estilo de vida a ninguém, mas gostaríamos que mais pessoas fossem encorajadas a deixar de lado a clausura de seus carros. Esta atitude é benéfica para todos. Menos carros, menos poluição e menos congestionamentos. Se você contribuir com uma atitude positiva vai tornar nossa cidade melhor. Se evitar ameaçar as pessoas utilizando seu carro como arma, vai contribuir para que as ruas sejam mais seguras.

January 17, 2011

WARNING

Filed under: Uncategorized — tiago @ 4:29 pm

attention-whores-ahead

they’re everywhere

September 18, 2010

me bonito, you… FAIL

Filed under: Uncategorized — tiago @ 3:08 pm

Tudo bem, não podemos tripudiar, eu sei.

Mas se existe uma parte importante nisso, é a amostra da maneira errada de tratar uma crise.

E tiraram meu acesso SSH agora, deve ser porque tenho cara de turco?

May 3, 2010

um script de automação para o SLONY1

Filed under: Uncategorized — tiago @ 6:24 pm

Às vezes fico assombrado pela quantidade de tabelas que temos no nosso banco de dados. E o pior de tudo é que a nomenclatura não ajuda. Temos um monte de sistemas legados operando.

Nosso sistema ‘master’ está rodando o postgres 8.3 em debian ‘lenny’.

Usamos o pgpool para prover o banco de dados, acessando duas bases que são replicadas com slony. E o problema eterno tem sido listar todas as tabelas para gerar o ‘set’ da replicação. os scripts alt_perl fazem a parte braçal, mas ainda não existe uma ferramenta que permita simplesmente comandar algo como ‘replicar este aqui naquele lá’.

Pensando nisso, resolvi criar uma ferramenta que automatize, em parte, esse processo. Criar o set contendo todas as tabelas e sequências e permitir a subida rápida disso tudo. Quero contar com a possibilidade de mudar rapidamente a configuração do sistema.

Meu set tem três itens: tabelas com chave primária, sequências e tabelas sem chave primária. Pensando na rapidez do processo criei um script que coloca todas as tabelas numa lista em PDL pronta para ser operada a partir do alt_perl:
-- Function: public.set_schema_pdl(character varying)

-- DROP FUNCTION public.set_schema_pdl(character varying);

CREATE OR REPLACE FUNCTION public.set_schema_pdl(s character varying)
RETURNS text AS
$BODY$
declare
t text;
ot integer; --origin
os integer; --origin
setid integer; -- id do set a ser gerado
sn varchar;
rn varchar;
r record;
begin
--ids atuais do set, tabela e sequencia
execute 'select max(set_id) from _'||s||'.sl_set' into setid;
if setid is null then
setid:=0;
end if;
setid:=setid+1;
execute 'select max(tab_id) from _'||s||'.sl_table' into ot;
if ot is null then
ot:=0;
end if;
ot:=ot+1;
execute 'select max(seq_id) from _'||s||'.sl_sequence' into os;
if os is null then
os:=0;
end if;
os:=os+1;

t:= '$SLONY_SETS = {
"set'||setid||'" =>{
"set_id"=>'||setid||',
"table_id"=>'||ot||',
"sequence_id"=>'||os||',
"pkeyedtables"=>[';
for r in execute 'select schemaname, relname from pg_catalog.pg_statio_user_tables where schemaname!~''^_''=''t'' and not exists (select * from _'||s||'.sl_table where tab_relname=relname and tab_nspname=schemaname) and exists(select * from pg_catalog.pg_index where indrelid=relid and indisprimary=''t'')' loop
t:=t||''''||r.schemaname||'.'||r.relname||''',
';
end loop;
t:=t||'],
"indexedtables"=>[';
for r in execute 'select schemaname, relname from pg_catalog.pg_statio_user_tables where schemaname!~''^_''=''t'' and not exists (select * from _'||s||'.sl_table where tab_relname=relname and tab_nspname=schemaname) and NOT exists(select * from pg_catalog.pg_index where indrelid=relid and indisprimary=''t'')' loop
t:=t||''''||r.schemaname||'.'||r.relname||''',
';
end loop;
t:=t||'],
"sequences"=>[';
for r in execute 'select schemaname, relname from pg_catalog.pg_statio_user_sequences where schemaname!~''^_''=''t'' and not exists (select * from _'||s||'.sl_sequence where seq_relname=relname and seq_nspname=schemaname)' loop
t:=t||''''||r.schemaname||'.'||r.relname||''',
';
end loop;
t:=t||'],
},};
';
return t;
end;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION public.set_schema_pdl(character varying) OWNER TO postgres;

Essa procedure essencialmente lista os objetos “interessantes” da base e escreve o PDL contendo as definições de replicação. Normalmente será alguma coisa assim:

tiago@urbanmap:~$ psql -U user -t -h localhost databasename -c "select set_schema_pdl('nome_do_cluster')" -o "slon_sets.conf"

…e pronto! você treá um arquivo contendo todos nomes de objetos replicáveis no banco. Ele se parece com isto:

$SLONY_SETS = {
"set1" =>{
"set_id"=>1,
"table_id"=>1,
"sequence_id"=>1,
"pkeyedtables"=>[minha_tabela,minha_outra_tabela,um_schema.outra_minha_tabela ...],
"sequences"=>[minha_sequencia, outra_sequencia,...,],
"indexedtables"=>[tabela_sem_chave, outra_tabela_sem_chave,...,],
],
},};

Fazer isso “manualmente” nas minhas bases, acredite, era terrível! esquecer uma tabela ou sequência compromete toda a replicação. Daí até descobrir onde estava o problema…

Agora, só falta colocar a replicação pra rodar!

December 25, 2009

Cidade Vazia

Filed under: Uncategorized — tiago @ 7:25 pm

Como não vai deixar de ser, aproveitei o dia para fazer fotografias. A qualidade da câmera é comparável à de meus olhos hoje, que ainda vejo tudo com um certo glow. Para  os próximos episódios de cidade vazia será bom usar uma câmera decente.

Rua Vergueiro com trânsito rápido

September 24, 2009

Somos Educativos Também

Filed under: Uncategorized — Tags: , , — tiago @ 8:51 pm

Hoje estreamos nosso sistema de e-learning, o Homembala Educativo. A plataforma é o Moodle. Estou maravilhado com as possibilidades dessa ferramenta.

Nosso objetivo é realizar trabalhos em SCORM para instituições educacionais. Para isso, nada melhor do que configurar nosso próprio sistema. Temos um curso sobre o pós-moderno para servir como demonstração.

September 16, 2009

canvas!

Filed under: Uncategorized — tiago @ 11:53 pm

minha primeiríssima experiência com canvas… simplório, não?

Para breve, algo decente nessa tecnologia.

September 14, 2009

Trilhas animadas de GPS

Filed under: Uncategorized — Tags: , — tiago @ 6:04 am

Atendendo a pedido especial da Vanessa La Luna, demonstro aqui uma forma de animar em google maps um conjunto de markers representando veículos rastreados.

Este tipo de renderização é muito interessante para mostrar a performance de uma frota durante um intervalo.

A animação se baseia em timeouts proporcionais ao tempo de cada posição.

Imagine uma query que retorne o conjunto de pontos de cada veículo num array onde o timestamp de cada ponto está incluído como uma terceira coordenada. O programa percorre esse array modificando a posição dos markers de forma proporcional no tempo. Nesse caso particular o timestamp está em minutos, e é convertido para hora local durante a animação.

Para esta demonstração o resultado da query hipotética está escrito no textarea. O hash deve conter x, y e t, para coordenadas e timestamp.

É claro que você pode acrescentar melhorias como ícones personalizados, interpolação entre os pontos e outras fancy features.
A vantagem do formato JSON é ser minimalista, evitando parse demorado e poupando a banda.

Powered by WordPress