quarta-feira, 24 de junho de 2009

Meus Softwares Prediletos

Existem alguns softwares que não vivemos sem eles. Eu uso vários, na grande maioria gratuitos, sendo vários software livres.
Comecei a usar recentemente o Dropbox, mais um serviço do que um software. Você o instala em todas as máquinas que você utiliza, e ele mantém sincronizada uma pasta comum entre essas máquinas. Além disso, uma cópia dessa pasta fica nos servidores do Dropbox, permitindo que você a acesse usando um navegador.
Além disso tudo, você pode compartilhar arquivos com outras pessoas. Você obtém uma URL para um arquivo na sua pasta. É muito útil quando você quer compartilhar um arquivo que ainda está em construção.
Acredito que ele seja semelhante ao Ubuntu One(atualmente em beta), só que multi-plataforma.

sexta-feira, 8 de maio de 2009

Meu Vista não consegue conectar-se ao PostgreSQL Instalado

Estava com dificuldade para conectar-se ao PostgreSQL instalado localmente no meu Windows Vista. Antes já tinha funcionado. Depois, ele passou a retornar a mensagem:

could not connect to server: Connection refused
(0x0000274D/10061)
Is the server running on host "127.0.0.1" and accepting
TCP/IP connections on port 5432?

Numa lista de discussão, descobri que o problema estava num patch da Microsoft, que alterou o arquivo C:\WINDOWS\System32\drivers\etc\hosts, adicionando a linha ::1 localhost.

Para corrigir, basta adicionar a linha
127.0.0.1 localhost.

segunda-feira, 29 de dezembro de 2008

Não lance exceções no destrutor

Existem boas práticas de programação que não são ensinadas nos manuais, sendo descobertas com a experiência. 
Uma boa prática, pelo menos em se tratando de Delphi, é o de não lançar exceções em destrutores. Isso evita termos que espalhar um tratamento para esse tipo de falha por todo o nosso código.

Vejamos um exemplo:

type
  TDoc = class
  ...
  end;

destructor TDoc.Destroy;
begin
  raise Exception.Create('Fail');
end;

type
  TSuperDoc = class
  private
    FDoc: TDoc;
    FList: TList;
  ...
  end;

destructor TSuperDoc.Destroy;
begin
  try
    FDoc.Free;
  except
  end;
  FList.Free;
end;

           
O fato de lançarmos exceções no destrutor de TDoc nos obriga a tratarmos esse tipo de problema no destrutor de TSuporDoc, para não termos nenhum memory leak

Em outro post, falarei sobre como economizar declarações try... finally.

quinta-feira, 29 de novembro de 2007

A regra dos noventa-noventa

Dizem que todo gerente de projeto deve estar bem consciente do significado da regra dos noventa-noventa:
90% do código primeiramente desenvolvido representa os primeiros 90% do tempo de desenvolvimento. Os restantes 10% do código são responsáveis por outros 90% do tempo desenvolvimento.

domingo, 11 de novembro de 2007

Restaurando o MBR do Vista

Após instalar o Fedora 8 no meu Laptop, resolvi remover-lo e usar-lo como máquina virtual dentro do Vista. Instalei o VistaBootPro para tentar remover o Grub, mas ele falhou, e eu não conseguia dar mais boot.
O que me salvou foi o Super Grub. Dei um boot por ele, e mandei restaurar o MBR do Windows, além de ativar a partição do Windows, de acordo com as instruções que encontrei num post.

sexta-feira, 27 de julho de 2007

Bug na Java Native Interface da JVM 1.6

Estava fazendo um protótipo de uma aplicação Delphi carregando a JVM e executando o Tomcat embedded, isso tudo num Windows XP. Utilizei a última versão do JRE, a 1.6.02. Ao carregar o Tomcat, o meu processo era derrubado, e examinando o console, encontrei a mensagem de erro EXCEPTION_FLT_STACK_CHECK.
Nesse momento, fiquei acreditando que eu estava fazendo algo de errado. Fiz uma pesquisa no Google, e encontrei apenas um tópico do fórum java com esse erro, aonde a pessoa menciona que o erro se apresentou quando ele migrou seu código da JVM 1.5 para a versão 1.6.
Fiz o caminho inverso, e voilá, tudo funcionou perfeitamente.



quinta-feira, 24 de maio de 2007

Tendências em Linguagens de Programação

É muito importante para uma linguagem de programação a existência de uma comunidade forte. Essa premissa vale não só para linguagens de programação, mas para qualquer tipo de linguagem. Quando o número de pessoas usando uma linguagem é pequeno, essa linguagem está ameaçada de extinção.

Utilizo diversos indicadores para tentar identificar essas tendências:
Este último está apresentando um forte crescimento do Ruby, e de D. Esse crescimento deve ter sido observado pela Codegear, que já anunciou uma IDE para o desenvolvimento com o Ruby on Rails.

Bug no Ubuntu: Falha no Power Off ao final do Shutdown

Ao fazer o upgrade do meu Ubuntu 6.06 lts para o novo Ubuntu 7.04, minha máquina parou de se desligar no shutdown. Após uma pesquisa encontrei a solução no fórum:
Adicionar a seguinte linha no /etc/modules.

apm power_off=1


sexta-feira, 20 de abril de 2007

Investigando o consumo de memória do Engine

Estou investigando o consumo de memória da nova versão do Engine 4(ainda em beta), que está demasiadamente alto em algumas situações. Estou utilizando o excelente AQTime, que felizmente possui um profiler específico de uso de memória.

No Engine 4, o JavaScript Runtime realiza alguns truques para aumentar a performance, como por exemplo não chamar o destrutor de objetos que não necessitem de um clean up. Entretanto esse comportamento confunde o profiler do AQTime, passando a ser desativado no momento do profile.

Com o profiler, eu posso observar num determinado momento a quantidade de objetos de uma determinada classe. É interessante essa visão, pois permite de uma maneira mais objetiva, observar objetos que com pequenas alterações permitiriam um grande consumo de memória, tendo um impacto na performance da aplicação.

quinta-feira, 19 de abril de 2007

Stack Trace no Delphi

Nesta semana, trabalhei na implementação do Stack Trace no Engine Runtime. Basicamente, usei a implementação do Jcl. Infelizmente o stack trace não é muito preciso, principalmente quando ele está fazendo o trace de rotinas do interpretador JavaScript, mesmo usando a opção RawTrace, que realiza toda a operação sem confiar na existência de Stack Frames. Acredito que o FastMM utilize a mesma rotina do Jcl.

Internamente, o JclDebug faz um patch no executável em tempo de execução, alterando o System.pas para possibilitar a captura do Stack trace no momento que uma exceção é gerada. Ainda não pude observar o custo de processamente dessa operação de captura.

Além do JclDebug, existem outros projetos, como o FastCode, que requerem o uso de patchs para realizarem otimizações no Delphi. Estive pensando se não seria interessante fazer o patch, em tempo de compilação, ao invés de em tempo de execução. Acredito que fazer o patch da aplicação em tempo de execução iniba um melhor uso da memória virtual por parte do sistema operacional.

quarta-feira, 15 de novembro de 2006

Boot do Ubuntu Falhando

Ontem liguei meu computador, e para surpresa minha o meu Ubuntu Dapper não queria iniciar. Ele apresentava a seguinte mensagem:
Uncompressing Linux... Ok Booting the kernel
mount: Mounting /dev/hda4 on /root failed: No such device
mount: Mounting /root/dev on /dev/.static/dev failed: No such file or directory
mount: Mounting /sys /root/sys failed: No such file or directory
mount: Mounting /pro /root/pro failed: No such file or directory
Target filesystem doesn't have /sbin/init
Acredito que alguma atualização tenha corrompido a minha instalação.
A solução para o problema foi reinstalar o udev: usando o cd de instalação fiz
um chroot para o meu disco e executei o comando apt-get install --reinstall udev

quinta-feira, 12 de outubro de 2006

Error trying to open /dev/hdc exclusively (Device or resource busy)

Estava recebendo esse erro do GnomeBaker ao tentar criar uma imagem de um DVD no meu Ubuntu Dapper. Pensei que fosse algum problema de permissões, do tipo a aplicação não possui permissão de SUID. Mas o problema era outro: O Ubuntu automaticamente montava o disco assim que ele era inserido, impedindo o seu acesso pelo GnomeBaker. Bastou desmontar o dispositivo para que o GnomeBaker funcionasse perfeitamente.
Configurando o modem DSL-500G.

Hoje eu configurei o meu modem ADSL D-Link DSL-500G, para permitir maiores velocidades com o aMule e o Bittorrent.
Ele possui uma interface de configuração web, mas compatível apenas com o Internet Explorer! Ao tentar incluir uma regra de NAT, utilizando qualquer outro browser, ele me retorna a mensagem 501 Method Not Implemented. Na minha tentativa de configurar usando o Ubuntu, utilizei os seguintes browsers sem sucesso:
  • Firefox 1.5
  • Epiphany
  • Galeon
  • Opera 9.