Até onde o acaso me leva? Ao concerto do Reginaldo Pinheiro!

Há dias monótonos, que não trazem nenhuma novidade. Mas também existem dias cheios de acasos. Foi o que aconteceu na minha última terça-feira. Acompanhe só.

Terça-feira. Vou à UFG. Um dia como outro qualquer, se não fossem alguns “acasos”. Entrei na sala do mestrado e deixei meu notebook no armário como sempre faço. Por acaso, não haveria aula de Seminários, logo fiquei sabendo. Como tinha que resolver um pequeno problema no Banco do Brasil, lá fui.

Quando voltei, por outro acaso descobri: trocaram o cadeado da sala do mestrado! Lá estava eu sem meu “passatempo” até a hora da próxima aula.

Resolvi então ir a biblioteca, procurar novidades. Só pra ficar olhando as prateleiras, sem rumo certo. Fico a procura dos livros que estão com as folhas mais brancas e capas mais conservadas. Estão neles as novidades! Encontrei Refactoring to Patters, agora na seção “O que estou lendo?”. Nem é tão novo assim, mas só foi emprestado uma vez, está branquinho ainda!

Eis que ocorre outro acaso! O sistema da biblioteca estava fora do ar. Encostei no balcão um pouco distante dos computadores dos funcionários à espera. Não haveria chance alguma de encostar ali se não fosse o sistema. Olha só o que encontrei: Um convite para o Concertos na Cidade. O último que estava sobre o balcão. Peguei-o meio desconfiado, pensando que tivesse dono.

Era neste convite que estava minha diversão de quarta. É de lá que acabo de chegar. Um recital de canto e piano. Foi muito bom! Um espetáculo. Conheci um Villa Lobos que não havia ouvido antes com a “Iara”. A interpretação do Reginaldo Pinheiro e da Guida Borghoff foi excepcional.

Desde a primeira vez que ouvi o Reginaldo num programa da Rádio Cultura FM de São Paulo, há uns dois ou três anos atrás fiquei a imaginar que exemplo de Brasileiro de sucesso. Pois hoje tive a oportunidade de confirmar o quanto ele canta bem, logo alí, à minha frente.

Parabéns a professora Ana Flávia Frazão e ao SESC, além dos demais da organização. Estão fazendo um trabalho de primeira qualidade! Continuem nos proporcionando estes bons momentos de boa música.

Ao demais, continuem trocando os cadeados das salas e “derrubando” os sistemas da biblioteca! Façam o necessário para me fazer ficar sabendo destes eventos, ou, simplesmente, deixem o acaso agir por si próprio!

A Cabeça de Steve Jobs, de Quem Não Vive no Mundo Mac

Acabo de ler o livro A Cabeça de Steve Jobs e para não perder os mais interessantes achados no livro estou aqui registrando-os. Primeiro, o que não gostei.

Não gostei muito da organização do livro. A tentativa do autor, Leander Kahney, de dividir em capítulos por tema resultou em uma certa bagunça. Sabe aquele tipo de escrita que tem muito: “Daqui a pouco falaremos mais disso”? Quase que o único capítulo que segue seu título é o último, o oitavo: “Controle Total – A obra toda”. Aliás, o melhor dos capítulos na minha opnião. O mais esclarecedor do porquê das decisões do Steve.

Ilustrações! Faltou. Durante a leitura senti extrema falta de figuras. É como se o livro fosse escrito somente para quem acompanhou toda a trajetória dos Macs. Pra quem sabe que o Mac tinha o botão de desligar na parte de trás. Para quem acompanhou todas as propagandas “Pense Diferente (Think Different)”. Às vezes tive que recorrer ao YouTube e a figuras na web.

E por falar das propagandas, não parecem tão boas assim. Claro, tem muito a ver com a cultura em que estou inserido. Mas na minha opnião existem propagandas infinitamente melhores aqui no Brasil. Essa parte foi a que mais achei fanatismo dos “Mac-maníacos” juntamente com o ovacionismo nas Macworld”s quando Steve diz: “E tem mais…”.

Inventividade? Nada! Steve, de acordo com o livro, é um “escolhedor”. O que ele faz de melhor é escolher e rejeitar as melhores e piores idéias dos seus colaboradores, para logo depois achá-las uma ótima idéia, com a mínima ou sequer nenhuma alteração. O grande detalhe está no processo de simplificação. Steve rejeitou o nome iPod antes de aceitá-lo.

Steve também “rouba” idéias, como foi o caso da GUI que copiou da Xerox. Não estou condenando. O livro te aconselha a fazer o mesmo! A Xerox não saberia o que fazer com aquilo na época. Ela vendia máquinas de copiar.

Além de escolhedor, é um caçador de talentos. Sempre contrata e mantém os melhores a sua volta. Essa é uma cultura que grande parte dos brasileiros empreendedores não possuem. Talvez seja essa história do jeitinho brasileiro, sempre tentando tapar buraco. Não é possível ser o melhor sem os melhores, nisso eu acredito.

Para manter estes talentos na Apple ele distribui opções de compra de ações, por valores baixos. Quando o funcionário resolve comprar ou vender as ações elas valem mais do que eles pagaram por elas. Isso mantém qualquer um motivado, e inventivo. Não tenho notícias dessa cultura na área de TI aqui no Brasil, mesmo que seja na forma de PLR.

Steve também é um aficcionado por perfeição. Não há como negar que iPod e iPhone são perfeitos demais para a maioria dos usuários. O acabamento é muito bem feito. Duvida? Então vejamos. Responda a seguinte pergunta: “Quantas vezes comprou um produto e abriu a caixa observando cada efeito desde a luminosidade, efeitos, o porquê das fontes na embalagem, dobras das abas até, enfim, visualizar o produto?” É, isso mesmo, até a embalagem do equipamento é pensada neste nível de detalhes. Veja a cerimônia desta “unboxing” neste vídeo (como é chamado a abertura da embalagem). O mais interessante é que ao chegar ao iPhone, ele coloca-o de lado. Algum brasileiro faz isso?

Aliás, tudo que roda o mundo Mac parece ter uma certa diferença. Só de curiosidade, passe em uma banca de revista e veja a capa da Mac+ número 38. Acredite, esta foto aqui ao lado não tem nada a ver com olhá-la em suas mãos.

Confesso que discordei de grande parte do livro até ler o último capítulo. Nele, muita coisa fez sentido para um usuário de Linux e Windows. Há uma explicação interessante dos modelos vertical e horizontal de distribuição de equipamentos. Steve, desde que fundou a Apple, segue o modelo vertical.

No modelo vertical a distribuição contempla o conjunto: hardware, software e serviços, ou seja, a solução completa. O iPod por exemplo não é somente o aparelho. É o conjunto: aparelho, software e loja iTunes. E isso vai contra o que aconteceu nos últimos 30 anos. Buscou-se uma comoditização/generalização do hardware, e algumas empresas focaram em hardware (Intel, AMD), outras em software (Microsoft) e outros ainda em serviços para as plataformas.

Ser o dono de tudo facilita muito a distribuição e reduz drasticamente a quantidade de erros de integração. A Microsoft demorou mais copiou isso, com o Zune e o XBox. E aparentemente o mundo está girando a favor da Apple neste sentido. O autor se refere a isso como se Steve estivesse à frente do seu tempo, cerca de trinta anos. Não estou certo disso.

Mas isto está virando resumo do livro! Vou deixar a idéia solta, para sobrar vontade de ler o livro! Há muito mais do que o escrito aqui! Hummm, nem falei da obsessão pelo segredo até o lançamento, o formato das lojas de varejo, …

Hadoop, Núvens, Banco de Dados distribuído, Delphi é útil neste ambiente?

Serviços nas nuvens estão na moda. Todo dia chega alguma mensagem na minha caixa a respeito. Talvez porque o tema de minha dissertação esbarra no assunto, mas acredito que não.

Então veio a pergunta hoje, depois de receber um anúncio a respeito do HadoopDb. Alguma pessoa que programa em Delphi trabalha com um projeto que precisa escalar ao ponto de rodar a aplicação em um cluster de 50, 100 nós?

Ou estes “monstros” são pilotados sempre com Java/C++?

Seria por conta de não ter como acessar diretamente no Delphi, já que não fazem binding para Delphi? Mas e aí, serviços na nuvem vieram para ficar, na minha opnião. Se houvesse um driver DBX, por exemplo, que mapeasse a API para chamar este tipo de serviço, alguém em Delphi usaria?

Enfim, muitas questões. Será que Delphi cabe neste mundo?

FieldByName é O(n), que tal melhorá-lo para O(Lg n)?

Há muitas formas de acessar os campos dos DataSets no Delphi, conforme a relação a seguir (observe a relação linha x item enumerado):

DataSet.Fields[0].AsString
cdsClienteNOMECLIENTE.AsString
DataSet.FieldByName(''NOMECLIENTE'').AsString
DataSet[''NOMECLIENTE'']
  1. Pelo índice do campo: É uma causa frequente de erros, afinal, mudando a ordem dos campos (na SQL ou no DataSet) altera totalmente o comportamento do código.
  2. Diretamente pelo objeto que representa o campo: Evita os erros da primeira e ainda garante que você acesse somente campos que existem no dataset, avisando durante a compilação caso contrário. Só pode ser usada quando os campos são adicionados em tempo de projeto. Quando se trabalha com multi-bancos existem problemas de mapeamento de tipos de campos e classes de representação.
  3. Por FieldByName: Evita os problemas da primeira abordagem. Mas não há aviso a respeito de campos não existentes no dataset em tempo de compilação.
  4. Pegando o valor diretamente: Usa FieldByName internamente.
  5. Alguma outra?

Para o objetivo deste artigo, irei considerar o uso de FieldByName (3).

Não uso FieldByName, portanto vou parar de ler o artigo!

Calma! Há um detalhe que passa despercebido. Mesmo você não usando, a própria VCL e componentes de terceiros estão cheios de chamadas a este método! Por exemplo, um simples TDBEdit chama este método. O DBGrid, o seu gerador de relatórios e muitos outros.

Hummm, mesmo atribuindo o DataField em tempo de projeto ao TDBEdit?

Sim! A propriedade DataField é uma string. Para fazer o primeiro vínculo é chamado o método FieldByName. Observe este trecho de código, retirado da unit DBCtrls.pas:

procedure TFieldDataLink.UpdateField;
begin
  if Active and (FFieldName <> '''') then
  begin
    FField := nil;
    if Assigned(FControl) then
      SetField(GetFieldProperty(DataSource.DataSet, FControl, FFieldName)) else
      SetField(DataSource.DataSet.FieldByName(FFieldName));
  end else
    SetField(nil);
end;

Abra a unit DBGrids.pas e procure por FieldByName. Você irá encontrar referência em muitas linhas.

Chegamos então a questão do título. O algoritmo que procura um campo no dataset é linear em relação a quantidade de campos, ou seja, sua complexidade é:

  • Ω(1). No melhor caso, o campo procurado é o primeiro da lista.
  • Θ(n/2). No caso médio, você encontra o campo mais ou menos na metade e para.
  • O(n). No pior caso, o campo procurado é o último. O nome do campo foi comparado com todos os outros.

Veja o algorítmo, retirado da unit DB.pas. Note que o TDataSet.FieldByName chama TFields.FindField:

function TFields.FindField(const FieldName: string): TField;
var
  I: Integer;
begin
  for I := 0 to FList.Count - 1 do
  begin
    Result := FList.Items[I];
    if WideCompareText(Result.FFieldName, FieldName) = 0 then Exit;
  end;
  Result := nil;
end;

Repare a simplicidade. Na linha 5 é realizado um for na lista de campos (FList). Atribui o i-ésimo item à variável de retorno Result na linha 7. Na linha 8, caso o FFieldName seja igual ao campo procurado o algoritmo é interrompido. Se o campo procurado for o último da lista, o for será executado completamente.

Isso é conhecido como o algoritmo do pintor burro. Suponha que você contrate um pintor para pintar aquelas linhas do meio da rodovia. Mas o pintor não move a lata de tinta. Então todas as vezes ele molha o pincel, pinta a rodovia e volta para molhar o pincel novamente. No começo é rápido, mas quanto mais ele se distancia da lata de tinta, mais demorado fica. (Veja mais sobre isso neste ótimo post no Blog do Joel)

Puxa, isso é muito ruim. Como melhorar isso?

De fato existem alguns algoritmos melhores para fazer isso. Pode-se implementar um hash que distribua os nomes dos campos de acordo com os índices. Mas isso parece um pouco complicado. Além do mais, não existe este tipo de estrutura pronta no Delphi, e então seria necessário incluir uma outra dependência no DB.pas.

Outra forma de melhorar é usar uma lista ordenada. Sabe-se que procurar um item numa lista ordenada é O(lg n). Inclusive, este algoritmo é implementado no tão conhecido TStringList. Só é necessário ordenar ele, com a propriedade sorted := true.

Ótimo então, vamos alterar o arquivo DB.pas e incluir uma lista ordenada!

Realizar uma alteração em um arquivo da VCL é mais complicado que só alterar o código. O ideal seria:

  1. Adicionar uma variável privada na classe TFields do tipo TStringList.
  2. Ao adicionar os Fields no dataset, adicioná-lo também nesta outra lista ordenada.
  3. Ao procurar por um campo, utilizar a lista ordenada.

Porém, alterar a definição de um objeto implica em recompilar todas as units dependentes. Isso inclui tudo que usa TDataSet, inclusive partes da própria VCL. Já recebeu à famosa mensagem Unit x was compiled with a different version of y?

Como é melhor causar o menor impacto possível, a saída é declarar uma variável global na unit DB.pas. Porém, sendo global, não temos uma instância própria para cada instância de dataset. Isso implica em termos uma lista de datasets antes. Cada item desta lista tem uma outra lista com os campos, ou seja, uma lista de listas. (Uma lista de datasets onde cada item é uma outra lista de campos)

Desta forma, realizar a alteração é feito na seguinte ordem:

  1. Declarar uma variável global do tipo TStringList. Iniciar na seção initialization e destruir na finalization;
  2. Alterar o método FindField da classe TDataSet. (O melhor seria FindField de TFields, mas o código não ficaria tão simples, já que precisaria preocupar com a leitura de campos do dfm)
  3. Na primeira chamada de FieldByName, construir a lista ordenada de campos
  4. Destruir a lista ao fechar o dataset

“Há, mas qual é o overhead introduzido com estas alterações?”

Bom, não tem como não ter nenhum. Então o overhead introduzido com esta alteração é o seguinte:

  • Uma lista é instanciada no início da aplicação. Esta lista será preenchida com dataset”s que invocaram o método FieldByName pelo menos uma vez. O dataset é removido da lista quando for fechado. Isso só é preocupante quando se tem muitos dataset”s ativos na aplicação. Deixá-los abertos também é uma má prática, ok?
  • Uma outra lista é instanciada para cada dataset, e contém os campos do mesmo, de forma ordenada. É executado o algoritmo quicksort Θ(lg n) para ordenar a lista. Isto é feito uma vez a cada abertura do dataset.
  • O quicksort tem pior caso O(n²), quando os itens já estão ordenados. Mas em geral isso raramente irá acontecer, certo?

Não seria melhor remover o dataset da lista somente no evento Destroy do TDataSet?

Seria. Mas há o caso de dataset”s temporários, onde os campos são criados em tempo de execução. E se o desenvolvedor fechar o dataset e modificar os campos?

Para ser mais breve, vou anexar um diff do arquivo DB.pas no final. Por hora, uma análise da alteração no método TDataSet.FindField:

function TDataSet.FindField(const FieldName: string): TField;
var
  List: TStringList;
  i, di: Integer;
begin
  di := DataSetsListOrderFields.IndexOf(GetObjectUniqueName(Self));
  if di < 0 then
  begin
    List := TStringList.Create;
    List.Capacity := FFields.Count;
    for i := 0 to FFields.Count - 1 do
      List.AddObject(FFields[i].FieldName, Fields[i]);
    List.Sorted := True;
    DataSetsListOrderFields.AddObject(GetObjectUniqueName(Self), List);
  end
  else
    List := TStringList(DataSetsListOrderFields.Objects[di]);

  Result := nil;
  if List.Find(FieldName, i) then
    Result := TField(List.Objects[i]);
  if (Result = nil) and ObjectView then
    Result := FieldList.Find(FieldName);
  if Result = nil then
    Result := FAggFields.FindField(FieldName);
end;

Seja m a quantidade de dataset”s abertos e n a quantidade de campos:

  • Ao iniciar o método (linha 6), procuramos pelo dataset na lista. Essa operação leva O(lg m), já que esta lista também é ordenada.
  • Se ele não é encontrado (primeira chamada a FieldByName), o dataset é então adicionado a lista (linhas 9 a 14). Esta operação leva O(n + lg m). O lg m é para buscar a posição onde inserir o dataset.
  • Na linha 20 o campo é então procurado, isso leva O(lg n).

Resumindo, a complexidade total na primeira chamada seria O(2 lg m + lg n) e nas demais O(lg m + lg n). Poderia remover o O(lg m) se fosse declarado uma nova variável a classe TDataSet. Mas esta complexidade já garantirá um bom desempenho. Vamos aos testes?

Os testes executados consistem em criar um ClientDataset com cem (100) campos inteiros, preenchê-lo com 10, 20 e 30 mil registros usando FieldByName e consultar os valores do melhor caso (1º campo), caso médio (50º campo) e pior caso (último campo). Veja a figura com os resultados:

Comparação de FieldByName O(n) e O(lg n)
Tempos da comparação de FieldByName O(n) e O(lg n)

Os testes foram executados em uma máquina virtual VMWare com Windows XP e Delphi 2009. O aplicativo foi executado fora do Delphi, para não haver interferência do debugger. Talvez os tempos mudem em uma máquina real, mas acredito que a proporção entre eles se mantenha. Segue uma breve discussão dos resultados:

  • Append: Na adição de registros todos os campos são chamados uma vez para cada registro. O novo método FieldByName mostra-se até 73% mais rápido que o antigo (de 9,78 para 2,59 segundos).
  • No melhor caso: Como era esperado, o novo método é alguns centésimos de segundos (0,14 para 0,17) pior. Isso ocorre porque o novo algoritmo é Ω (lg n), ao contrário do antigo, que é Ω (1).
  • No caso médio: O novo FieldByName chega a ser 63% mais rápido que o antigo.
  • No pior caso: O novo FieldByName é até 80% mais rápido.
  • Constante: Observe também que tempo entre o melhor, médio e pior caso se mantém constante entre os registros, mostrando que sua complexidade é sempre lg n (na tabela, destacado em laranja).

Aqui está o arquivo diff com as modificações no arquivo DB.pas e o código dos testes. Elas foram feitas para o Delphi 2009. Aplicarei elas ao Delphi 2006 e 2007. Caso haja alguma diferença, postarei as outras versões.

Para você que resistiu firme até aqui, se tiver algum comentário ou observação, sinta-se a vontade!

Desde o último post

Muita coisa aconteceu desde o dia do último post: 23/03/2006. A graduação acabou! Agora sou casado, a mais de ano! Veja só como isso também passou rápido.

Profissionalmente ainda trabalho na mesma empresa, Siagri. Mas agora estou em Goiânia, também a mais de ano.

Neste meio tempo sem publicações por aqui, andei publicando na revista Active Delphi, uma série de artigos sobre DBX4. Também criei dois driver DBX4 para Firebird e PostgreSQL.

Já cursei a metade do mestrado! Já passei por todas as disciplinas obrigatórias. A pesquisa está bem avançada. É em sistemas distribuídos, mais especificamente R-Trees distribuídas e como fazer Joins nessas estruturas com Hadoop.

Vem comigo nesta nova fase? Publicarei sobre assuntos do mestrado e novidades em geral. Meus interesses continuam os mesmos, exceto por ter expandido bastante eles.

Agora não são mais duas linguagens, são várias como C++, C#, Delphi, Java, Python. Em banco de dados, estive estudando Oracle este tempo todo, e não é por nada, mas já consegui aprender alguma coisa.

Recital de violão

Como é do conhecimento de alguns, a Siagri está promovendo um Recital de Violão Clássico no auditório do SENAC neste sábado, às 20:00. A entrada é franca. Serão abordados compositores estrangeiros e nacionais como Bach, Tárrega, João Pernambuco, dentre outros.

Convido a todos para prestigiarem o evento com sua presença. Os “recitantes” serão funcionários da Siagri. Wisley e eu no violão e Cristiane como contralto.

Veja um fragmento de apresentação do programa:

“E sempre notável a aparição de música clássica nas mais variadas situações. Aquela reportagem de arte, arquitetura ou culinária sempre tem fundo clássico. E o uso na educação? Alunos de renomados colégios aumentam sua capacidade de concentração e aprendizado estudando ao som de gênios.

De fato, desde os mais remotos tempos, música clássica é uma forma de expressão da inteligência humana. Ao violão, instrumento romântico, dos mais variados sons, soa com extremo dinamismo e beleza.

Mas de onde surgiu? Como se instalou em tal instrumento musical? O que cada compositor pretende mostrar com determinado andamento e combinação de tons? O que o nosso povo conseguiu e consegue produzir a este respeito?

Pretendemos apresentar a você nosso convidado, talvez não acostumado a este tipo de evento, um outro leque de música. A música dita por erudita, clássica, que é transmitida através de notação musical ao som do instrumento mais tocado no mundo.”

Conto com sua presença!

A viagem viva e os fantasmas

É do senso comum que viagem é algo abstrato, sem vida. Pois bem, a minha nâo foi. Estava viva e tinha vontade própria! Acredita?

Manhã de Terça-feira, tudo planejado e agendado. Passagens, hotel, sistema pra homologar. Iria ser tudo feito de terça à sexta, inclusive o retorno. Iria!

A viagem de ida a São Paulo foi um sucesso, exceto por um desvio de mau tempo. Porém quando chegamos no hotel a primeira decepção não tardou em se precipitar. Se algum dia você for se hospedar na rede Ibis, desita! São hotéis padrão norte-americano. Nem suas malas são levadas para o quarto! O frigobar nâo tem nada. Se quiser, você mesmo compra e leva pra lá. Passar roupa? Leve! É tem mais, somente das sete às dez da manhã! Resumindo, tudo o que quiser, faça você mesmo! A internet também não funcionou no primeiro dia.

Na manhã seguinte (Quarta) seguimos pra homologação das bandeiras Visa e Amex. Nenhum problema no software além de um pequeno bloqueio de teclado. Foi tudo tranquilo e no fim de uma bateria de mais de sessenta teste conseguimos terminar o roteiro. Fiquei até animado pois o homologador era bastante gente boa e pouco “cri-cri”.

A noite fomos (o chefe e eu) à melhor casa de massas da cidade (de acordo com a revista veja) por nome Esperanza. Foi impecável, desde o atendimento até a comida. Acredite, não é nem parecido com a pizza que se costuma comer por aqui. São receitas tradicionalíssimas vindas da Itália. O lugar é um casarão do início do século passado não muito grande.

O que mais chamou a atenção é que eles não primam pelo tamanho. Poderiam fazer a maior pizzaria da cidade já que possuem o título de melhor, mas primam pela qualidade. Tem funcionado assim a mais de cinquenta anos. Talvez seja este o segredo.

Estava tudo bem demais, até que pela manhã (Quinta) apareceu o primeiro fantasma da viagem! Era baixo, cabelos arrupiados, enjoado, cri-cri, aparentemente carioca e inexperiente! Me fez mudar quase todo o software. Sem dúvida um dos piores dias de minha pequena vida. Enquanto não começei a “dar o bolo” nele o processo não foi pra frente. Pelo menos, no fim da tarde terminamos o Redecard.

Os planos já tinham furado neste momento. Final do segundo dia e ainda faltava a última bandeira (Tecban). Não daria tempo se a sorte não tivesse do nosso lado. Conseguimos prorrogar a homologação para o dia seguinte e isso implicou em remarcar as passagens de volta para o sábado. Este foi o primeiro sintoma de vida da viagem.

Por um lado foi bom. Consegui ir pela primeira vez a um teatro. Mas não qualquer teatro, foi no Teatro Abril. Quando chegamos lá o segundo fantasma apareceu!

O Fantasma da Ópera! Uma das melhores coisas que já apareceram para mim! Que espetáculo! Emocionante, vibrante, de cortar o fôlego. O único detalhe foi o preço (R$ 180), mas para plateia VIP, na terceira fila, bem embaixo do lustre (peça que flutuou durante o espetáculo). Apesar do preço valeu a pena. Acredito que de longe não teria a mesma emoção de ver a expressão na face dos atores, a garganta dos tenores, o cenário se modificando impressionantemente rápido à nossa frente, os dezoito músicos logo abaixo do palco, etc.

Não dá pra explicar com palavras. Não poderia ser mais perfeito. Pra quem assistiu “Amadeus” – a apresentação das óperas – pode ter uma idéia. Mas não é o mesmo que estar ao vivo, nem de longe. Pra quem canta em coral então, nem se fala. A dinâmica das vozes é perfeita. Aquelas sopraninas chegando até as “grimpas”, longe do alcançe de nós, pobres mortais. Junto com os tenores conseguiam fazer o som parecer que estava sendo emitido atrás de uma parede, ecoando num rio, e por aí vai. Gente com talento nato, diria. Resumindo, assista quando puder. A peça está em cartaz a mais de cinco anos em Londres e sendo exibida em apenas cinco cidades do mundo. Se não gostar me cobre que pago sua entrada. Até demorei dormir quando cheguei no hotel, estava “ligadão”!

Manhã de sexta, homologação da bandeira Tecban. O primeiro fantasma foi embora, mandaram outra pessoa em seu lugar. Era uma moça muito experiente que até me falou qual era o problema do dia anterior. Depois que ajustei foi extremamente rápido. Os teste restantes foram feitos e antes do fim da tarde estava tudo concluído. Terminamos até que enfim e ainda sobrara uma noite!

Imagine só o que estava rolando? A Bienal do livro! Se fui? Mas é claro! Pegamos o metrô e após algumas estações uma vam (gratuíta) que levava pro Anhembi, onde acontecia a feira.

A entrada em comparação ao teatro foi bem mais barata (R$ 10) e o preço foi convertido em descontos na compra de livros. Um real de desconto para cada dez em livros. A loja Americanas estava massacrando todo mundo. Quase tudo com preço mais baixo. Não deixei de comprar um: O badalado “Freakonomics”. A predominância é de livros literários. Informática é tema pouco abordado, só os principais mesmo na loja da Pearson, Siciliano e da livraria Érica. Pra ter idéia, não encontrei um livro sobre DB2 que precisava. Andamos até cansar. A feira é enorme!

Hoje, sábado, levantei de manhã, tomei café e desci pra Santa Efigênia. As lojas abrem tarde, enrolei pra comprar, mas de tanto pexinchar consegui um bom preço.

Quando terminei de comprar é que a correria começou. Corre até achar a entrada do metrô. Sobe umas dez estações até chegar perto de Congonhas, pega um táxi e… dez minutos de atrazo! Perdi o vôo! Este foi o segundo sintoma de vida da viagem. Meu companheiro se foi e agora estou aqui, esperando chegar dezesseis horas para embarcar. Sorte que achei vaga no mesmo dia, porém tive que esperar sentado por cinco looongas horas.

Aconteceu algo interessante durante este tempo. Uma moça me parou dentro da livraria (onde comprei a caneta que escreve neste momento no manual de uma placa mãe de computador aproveitando o espaço em branco) e sem perguntar nada disse: “Você precisa tomar vitamina E para que não apareça mais terçol no olho!”. Fiquei sem saber o que dizer. Nem o médico que fui disse isso e alí estava alguém que nem me conhece querendo ajudar. Agradeci bastante ela, prometendo cumprir a dica.

Tudo aqui onde ficamos é caro. Cada lanche não fica menos de oito reais. Cada táxi não menos que quinze e por aí vai. Mas em síntese foi uma ótima viagem, apesar dos imprevistos. Consegui aproveitar bastante.

Bom, agora vou indo embarcar, porque senão perco o vôo novamente! Se você leu até aqui é um grande sinal de persistencia, então veja aqui as mais de cento e trinta fotos que tirei de toda a viagem!