Archive for March, 2007

Firefox e o problema de consumo de memória

Posted on March 28th, 2007 in Geral, Tecnologia | 2 Comments »

Embora o Firefox seja minha opção enquanto browser para navegar e desenvolver, tenho optado por usar outros mais leves para tarefas rápidas que não necessitem de um tempo de permanência muito grande com o browser aberto. O Seamonkey tem sido um quebra galho, já que ele é bem mais rápido e usa a mesma engine de renderização do Firefox, mas o visual a lá Netscape 4.0 não me agrada nenhum um pouco. Até mesmo o Internet Explorer tem sido uma mão na roda nestes momentos.

Ao ler o post do Élcio, vi que não estou sozinho nesta luta contra o consumo excessivo de memória do Firefox. Já havia tentado a algum tempo algumas possibilidades: reinstalá-lo, desinstalar temas e extensões, excluir e criar novos perfis, mas todas sem muito ou nenhum resultado. A única que chegou a dar um basta temporário no problema, que é conhecido como Memory Leak, foi desabilitar a extensões Firebug e Flashgot, usadas para desenvolvimento e downloads em massa, respectivamente. Neste processo, obtive uma economia em torno de 10 a 15MB de memória por aba aberta, o que já uma grande quantidade de memória considerando que eu constumo trabalhar com no mínimo 10 abas abertas. Calculando, meu gasto com memória está na casa dos 150MB. Até mesmo o Eclipse que é escrito em Java e é praticamente um elefante de peso no consumo de memória não chega a este índice.

O problema que faz o Firefox consumir esta quantidade de absurda de memória ainda é desconhecido, mas pesquisando observei que o mesmo já é bem antigo, dada pela quantidade de reclamações. Já nos primeiros resultados cheguei a página da Mozillazine que fala sobre o problema e relata as prováveis soluções, inclusive relacionando as extensões e temas problemáticos.

Alterando o Lumine Config para diferentes servidores

Posted on March 16th, 2007 in Php | 2 Comments »

Atualmente venho utilizando o Lumine, um framework usado para mapeamento objeto relacional para banco de dados, que foi desenvolvido pelo Hugo, meu amigo e ex-sócio na administração do MXSTUDIO. Não me aprofundarei falando sobre as características do framework, deixando para um próximo post mais elaborado que certamente valerá a pena.

Em minha opinião, o Lumine está entre as melhores ferramentas para gerar e trabalhar um camada de persistência usando o mapeamento objeto relacional de um banco, graças a sua simplicidade de implementação e velocidade na execução dos comandos de inserção e seleção de dados.

Como disse anteriormente, em outro post relatarei em detalhes a ferramenta, que segundo o autor, ainda necessita de uma documentação mais completa que ainda não pôde ser feita devido à falta de tempo do mesmo. Desta forma, quem tiver interesse em contribuir, fique a vontade.

No Lumine existe um arquivo de configuração que é utilizado para todas as operações entre a aplicação e o banco de dados, desde a conexão, carregamento das classes referentes aos objetos relacionais, engenharia reversa, criação deschemas, etc. Este arquivo pode ser gerado tanto em XML quanto em PHP. Particularmente, acredito que o formato PHP é mais interessante por ter as informações de configuração armazenadas em um array , impossibilitando desta forma que um usuário veja esses dados acessando o arquivo direto pela URL, caso o mesmo esteja visível na árvore de diretórios do site. Já comXML isso não acontece, a não ser que você configure os mime types permitidos para acesso externo, ou simplesmente altere a permissão do mesmo arquivo via FTP para que ele não seja lido pelo via browser.

Aqui vou falar apenas do arquivo PHP, uma vez que no XML o trabalho é manual mesmo, não há outra saída. No arquivo de configuração, há duas chaves importantes que são a base para o carregamento das classes de negócio:class-path e use-cache. Veja abaixo um exemplo deste arquivo:

$lumineConfig = array (
	’configuration’ => array (
		‘class-path’ => ‘C:\lumine’,
		‘host’ => ‘localhost’,
		‘database’ => ‘meudatabase’,
		‘dialect’ => ‘mysql’,
		‘port’ => ‘3306′,
		‘user’ => ‘usuario’,
		‘password’ => ‘*****’,
		‘package’ => ‘orm’,
		‘maps’ => ‘map’,
		‘use-cache’ => ‘C:\lumine\cache.txt’,
		‘remove_prefix’ => ”,
		‘acao’ => ‘Iniciar’,
		‘create-classes’ => ‘1′,
		‘create-maps’ => ‘1′,
		‘escape’ => ‘1′,
		‘empty-as-null’ => ‘1′,
		‘generate-accessors’ => ‘1′,
		‘fileDate’ => filemtime(__FILE__)
	),
	’maps’ => array (
	‘map.Pessoa’
	)
);

Repare que o valor do caminho do class-path é o padrão de diretório do Windows. Supondo que o seu servidor de produção seja Linux e que o servidor de testes seja Windows, então é provável que um erro no carregamento das classes aconteça em um dos sistemas por um não reconhecer a árvore de diretório do outro. A solução neste caso seria alterar então o caminho do diretório de forma que cada sistema leia o arquivo que contenha o diretório relativo ao seu sistema de diretório, ou seja, uma versão para o Windows e outro para o Linux. Mas isso não é muito saudável, uma vez que um erro de sincronização poderia fazer com que um arquivo sobrescrevesse o outro. Já passei por esta experiência e posso afirmar que alterar caminhos físicos de diretório manualmente é extremamente trabalhoso e chato.

Este arquivo de configuração pode ser gerado tanto manualmente quanto automaticamente pelo LumineReverse, uma classe utilizada para a construção das classes e mapeamentos xml do banco usando engenharia reversa. Neste processo, o Lumine gera o caminho para as classes, mapeamentos e o cache, de acordo com o sistema operacional em que ele estiver rodando. Por isso, é bom ficar atento a este detalhe.

Uma solução para não ter problemas quanto ao caminho correto, é usar a função dirname do php, que retorna o caminho completo do arquivo passado por parâmetro. Neste caso, o parâmetro é a constante global __FILE__, que indica o caminho do arquivo relativo aoscript que está executando o comando. Exemplo:

<?php
// Caminho original do arquivo: C:\aplicacao\lumine-config.php
echo dirname(__FILE__); // Retorna C:\aplicacao
?>

Mas atenção, isso só é válido se você tiver o lumine-config no mesmo diretório dos diretórios de mapeamento e pacote de classes. Exemplo da estrutura:

aplicacao
/mapeamentos
/pacote
lumine-config.php
cache.txt

Alterando então as diretivas use-cache e class-path para que ambas funcionem em qualquer servidor, com a necessidade apenas de alteração do usuário, host e senha do banco a qual o script irá se conectar, o arquivo ficará assim:

$lumineConfig = array (
	’configuration’ => array (
		‘class-path’ => dirname(__FILE__),
		‘host’ => ‘localhost’,
		‘database’ => ‘meudatabase’,
		‘dialect’ => ‘mysql’,
		‘port’ => ‘3306′,
		‘user’ => ‘usuario’,
		‘password’ => ‘*****’,
		‘package’ => ‘orm’,
		‘maps’ => ‘map’,
		‘use-cache’ => dirname(__FILE__) . ‘/cache.txt’,
		‘remove_prefix’ => ”,
		‘acao’ => ‘Iniciar’,
		‘create-classes’ => ‘1′,
		‘create-maps’ => ‘1′,
		‘escape’ => ‘1′,
		‘empty-as-null’ => ‘1′,
		‘generate-accessors’ => ‘1′,
		‘fileDate’ => filemtime(__FILE__)
	),
	’maps’ => array (
	‘map.Pessoa’
	)
);

Assim, o carregamento verificará o caminho para as classes e para o arquivo cache.txt, de acordo com o que retornar a função dirname, em tempo real, e com o sistema em que o script estiver rodando, eliminando a possibilidade de erros e leitura dos dados por estarem em caminhos diferentes.

Em um outro artigo, falarei sobre o Lumine e introduzirei alguns macetes para inserção e seleção de dados simples e complexos.

Mais um estranho no ninho

Posted on March 16th, 2007 in Cotidiano | 3 Comments »

Este é o meu primeiro post neste blog utilizando a plataforma do WordPress, que dispensa comentários pela sua competência como o melhor sistema de blog já projetado.

Pretendo escrever e discutir aqui assuntos pertinentes ao meu cotidiano e experiências com projetos de desenvolvimento web, principalmente os que envolvam as linguagens de programação server e client-side JAVASCRIPT, PHP, RUBY, PYTON, entre outras.

Não poderia esquecer também o CSS e XHTML que também devem entrar na pauta dos meus posts, com menor frequência, é claro.

Quem estiver acompanhando o post neste momento, novidades não faltarão.