Notebook.GetMem().Add(512);
Agora as coisas andam do jeito que deveriam andar.
Acabou de chegar o novo módulo de memória do meu notebook: 512mb Kingston DDR333 PC2700. Tá certo que ele já está meio ultrapassado, mas por enquanto serve.

Se alguém precisar de algumas dicas sobre como trocar e/ou adicionar memória RAM ao notebook, no Clube do Hardware tem um ótimo artigo.
T+!
Delphi: Exemplo utilizando CreateProcess
Já comentei há alguns dias que existem três formas para rodar uma aplicação externa em um programa escrito em Delphi. São elas: ShellExecute, WinExec e CreateProcess.
Ontem precisei executar o MySQL Dump para gerar um backup de uma base de dados. Até aqui nenhum segredo, pois o WinExec faz isso facilmente. No entanto, eu precisava manter a aplicação esperando até que o comando terminasse de executar.
A única forma de fazer isto é utilizando o CreateProcess. Veja a rotina que utilizei:
Para realizar o dump, usei o seguinte comando:
cmd.exe /c “c:\executavel\Utils\mysqldump.exe -hHOST -uUSUARIO -pSENHA -c –add-drop-table teste > C:\teste.sql”
Algumas informações importantes sobre esta rotina:
- O CreateProcess requer vários parâmetros. No entanto, veja que a rotina acima pede um só, portanto ela assume um comportamento padrão;
- Enquanto a aplicação externa está em execução, o programa que criou ela fica esperando (graças ao WaitForSingleObject);
- Como utilizei o cmd.exe para rodar o MySQL Dump, precisei passar o nome do executável e seus parâmetros dentro de ” ” (até descobrir isso passaram-se algumas horas);
- A aplicação criada é executada em modo SW_HIDE, ou seja, escondida.
Fonte: Dicas de Delphi
Não deixe de conferir as sugestões de livros sobre Delphi que eu elaborei. Lá você encontrará informações sobre este e outros comandos.
É isso aí! T+
Delphi: WinExec, ShellExecute ou CreateProcess?
Quando preciso executar uma aplicação externa através de um executável, posso escolher entre esses três recursos (comandos): WinExec, ShellExecute ou CreateProcess.
Qual a diferença entre eles? O Fundão responde.
Resumidamente:
- WinExec: simples, porém não recomendado pela própria Microsoft, pois pode ser que futuramente não estará mais disponível;
- ShellExecute: utilizado quando existe a necessidade de abrir um arquivo conforme sua extensão. Também pode ser usado para rodar um executável qualquer;
- CreateProcess: o substituto do WinExec e, certamente, a melhor opção. Possui uma lista gigante de parâmetros, mas muitos deles não são utilizados e podem ser passados como nil ou 0 (zero). Veja um exemplo deste comando aqui.
Para saber mais sobre este e outros comandos, não deixe de conferir as sugestões de livros sobre Delphi que eu elaborei.
É isso aí. Até +!
NHibernate: gerenciamento de sessão
Faz um bom tempo que estou utilizando o NHibernate (NH) nas minhas aplicações .NET. Na empresa onde trabalho, também já estamos construindo alguma coisa utilizando esse excelente framework.
Nesse post vou falar sobre uma das principais dúvidas que os usuários têm ao trabalhar com o NH: como gerenciar as sessões (lembrando que cada sessão é semelhante a uma conexão com o banco de dados).
Existe um “padrão” muito utilizado nesta situação que se chama Session per Request. Como o próprio nome diz, uma única sessão estará aberta e disponível durante o Request.
Tendo em vista essa definição, fui atrás de alguma coisa que implementasse esse conceito. Encontrei um ótimo exemplo no site do Simon Green.
Esta implementação utiliza um IHttpModule para garantir que ao final do Request a sessão seja fechada. Além disso, existe uma classe chamada Db que possui vários métodos estáticos que implementam as funcionalidades CRUD (Create, Read, Update e Delete).
Um ponto muito interessante deste exemplo é a propriedade Session da classe Db. Ao acessá-la, se ainda não existe uma sessão aberta, então se abre uma e armazena-se ela no HttpContext.Current.Items. Se um novo acesso for feito no mesmo Request, a mesma sessão será utilizada evitando todo o overhead que existe para criar, configurar e estabelecer uma sessão.
É isso aí! T+
Walkman Sony NW-E003F
Chegou!
Há alguns dias recebi meu mp3 player (ou walkman, conforme a Sony) modelo NW-003F.

Saiba mais ou compre este e outros modelos da Sony
O modelo é este da foto e as especificações são as seguintes:
- Capacidade: 1Gb;
- Rádio FM;
- Duração da bateria: até 28 horas;
- Tempo de recarga total: 1 hora via USB;
- Funciona como Pendrive.
Saiu por R$ 339,00 + Frete. Comprei no site Meu Player e não houve problema algum durante a negociação. Só fiquei meio preocupado porque não responderam a nenhum e-mail enviado. Sinistro!
É uma pena ter que utilizar um software específico para transferir os arquivos para o player. Acho que deveria ser tudo integrado ao sistema operacional. Coisa do tipo Windows: Next-Next-Finish. Apesar disso, o software da Sony é muito simples e rápido.
Se quiser saber um pouco mais sobre outros modelos da Sony, veja aqui.
Até+
JMS - Java Message Service
Hoje passei a tarde estudando JMS para elaborar um trabalho que será apresentado amanhã na disciplina de Sistemas Distribuídos.
JMS é uma das especificações criadas pela Sun e outras empresas que fazem parte da JCP. Seu propósito é padronizar o envio e recebimento de mensagens entre aplicações. Duas características destacam-se nesta especificação:
- Todas as operações podem ser feitas de forma assíncrona, ou seja, as aplicações participantes não precisam ficar bloqueadas esperando por algum resultado (estilo RPC ou RMI);
- Apresenta baixo acoplamento, pois as aplicações são independentes de interfaces.
Passei algumas horas tentando entender exatamente como isso funciona. Procurei algumas implementações desta especificação e a mais simples que encontrei (e testei) foi a OpenJMS, disponível em http://openjms.sourceforge.net.
O funcionamento da OpenJMS (definido pela especificação JSR 914) ocorre de duas maneiras:
- Utilizando Fila (modelo Point-to-Point): as mensagens enviadas são armazenadas em uma fila e somente um consumidor registrado receberá determinada mensagem. Esta fila mantém todas as mensagens recebidas até que sejam consumidas ou até que expirem;
- Utilizando Tópico (Publish-and-Subscribe): as mensagens são produzidas por alguém e armazenadas em um lugar denominado tópico. Todos os consumidores registrados neste tópico recebem a mensagem que foi enviada. Caso o tópico não tenha nenhum consumidor registrado, então as mensagens são descartadas.
Existem alguns exemplos disponíveis junto com o download da biblioteca. Todos eles são bem simples e demonstram as duas maneiras de funcionamento descritas acima.
É isso ai! Até +.
Nova categoria: Team Coherence
Criei uma nova categoria chamada Team Coherence, pois publiquei quatro posts sobre este software e acho interessante separá-los para facilitar a procura pelo conteúdo.
É isso ae. Até +.
Team Coherence: utilizando a TC Tracker API
Para quem ainda não conhece, o TC Tracker é um dos módulos do Team Coherence (veja mais sobre o TC neste post). Ele é responsável pela gerência de requisições e bugs.
O próprio cliente do TC já oferece uma interface muito agradável e prática para trabalhar com o Tracker. No entanto, também está disponível uma API que implementa (ou melhor, disponibiliza, pois faz chamas às rotinas nativas) todas as funcionalidades que existem no servidor do TC. Desta forma, é possível criar um sistema de controle de requisições e bugs de acordo com as necessidades do usuário.
Esta API é escrita em Delphi e, como dito anteriormente, faz chamadas às rotinas nativas utilizando stdcall. O download é gratuito e pode ser feito aqui.
Para utilizá-la, basta fazer o download, descompactar e copiar os .pas para o diretório com os fontes do projeto. Abaixo segue um exemplo bem simples que mostra como conectar no servidor do TC e listar os projetos cadastrados:
1 procedure TfrmPrincipal.btnGoClick(Sender: TObject); 2 var 3 conn, 4 user: string; 5 connected: boolean; 6 result: integer; 7 begin 8 try 9 result := TrkConnect('Local', 'Marcos', 'xxxxx'); 10 if (result <> Err_OK) then 11 ShowMessage('Erro ao conectar: ' + IntToStr(result)); 12 13 cdsProjetos.EmptyDataSet; 14 result := TrkEnumProjects(AdicionaProjeto, cdsProjetos); 15 if (result <> Err_OK) then 16 ShowMessage('Erro ao listar os projetos: ' + 17 IntToStr(result)) 18 finally 19 TrkCurrentConnection(conn, user, connected); 20 if (connected) then 21 begin 22 result := TrkDisconnect; 23 if (result <> Err_OK) then 24 ShowMessage('Erro ao desconectar: ' + IntToStr(result)); 25 end; 26 end; 27 end;
Na linha 9, faço uma chamada à função TrkConnect passando o nome da conexão, usuário e senha.
Na linha 14, chamo a função TrkEnumProjects para retornar todos os projetos cadastrados. Ela recebe dois parâmetros: uma função que trata o que será feito com cada projeto retornado e um ponteiro para alguma informação extra, neste caso, um DataSet. A rotina que passei como parâmetro deve seguir a seguinte assinatura:
1 function (data: Pointer; name: string; id: Cardinal): boolean;
Sua implementação simplesmente adiciona o projeto em questão ao DataSet e retorna true para continuar o processo:
1 function AdicionaProjeto(data: Pointer; name: 2 string; id: Cardinal): boolean; 3 begin 4 TClientDataSet(data).Append; 5 TClientDataSet(data).FieldByName('id').AsInteger := id; 6 TClientDataSet(data).FieldByName('name').AsString := name; 7 TClientDataSet(data).Post; 8 9 Result := true; 10 end;
O resultado final é apresentado abaixo:
Existem várias outras rotinas disponíveis para acessar o TC Tracker. Todas elas bem documentadas e de fácil uso. Além disso, também está disponível uma API para acessar o controle de versão (Version Manager). O download desta pode ser feito aqui.
É isso ai. T+
Team Coherence: Removendo o log dos fontes
Este post é uma continuação da série sobre o Team Coherence (TC). Os outros estão aqui:
Por padrão, o TC armazena o log das alterações no próprio código fonte, como apresentado na imagem abaixo:
Isso causa um grande problema aos desenvolvedores: após um longo tempo de uso, praticamente 50% do que está escrito no arquivo é referente ao log do TC. Desta forma, ao abrir um determinado fonte, é necessário utilizar a tecla Page Down até o fim do log, o que às vezes torna-se muito chato, pois isso normalmente é realizado várias vezes durante o dia.
No próprio cliente do TC é possível configurar para que este log não apareça mais nos arquivos. Para fazer isso, no menu Tools existe a opção File Groups (vide imagem abaixo).
Como exemplo, utilizarei o item Delphi Unit Files. Basta clicar sobre ele e escolher a opção Modify. Na tela que aparecerá, o campo Expand keywords in files with the following extensions deve ficar em branco, tal como apresentado na imagem abaixo:
Desta forma, sempre que um Check In for feito o comentário não aparecerá no código fonte, mas continuará disponível no TC.
Além desta opção, também é possível personalizar o Header que é incluído no primeiro Check In de cada arquivo. Para isto, clique sobre o botão Header e personalize da forma que desejar. Além do texto “fixo”, também estão disponíveis algumas Keywords que durante o Check In terão seu valor alterado de acordo com a situação. São elas:
- $Log: será substituída pela revisão e versão do arquivo;
- $Revision: número da revisão;
- $Version: número da versão;
- $Author: autor que fez o Check In;
- $RevDate: data da revisão;
- $RevComments: comentário da revisão;
- $ModDate: data de modificação do arquivo;
- $ProjectName: nome do projeto em questão;
- $NoExpand: nenhuma keyword será substituída a partir deste ponto.
A palavra chave deve ser utilizada com os dois pontos (:). Exemplo:
É isso aí! T+
Vou ficar rico!
Hoje aderi a um novo serviço online: aposta nas loterias da Caixa.
Através do site do Terra, utilizando um serviço conhecido como Intersena, fiz algumas apostas na Quina e na LotoFácil. O sistema é muito simples e todo o pagamento foi feito em minutos através do site do Banco do Brasil.
As apostas são feitas através de bolões/cotas. Resumidamente, o Terra define alguns números conforme o sorteio (Quina, Mega Sena, LotoFácil, etc.) e agrupa eles com um limite de cotas. Cada cota custa X reais e o usuário pode escolher quantas deseja comprar. Normalmente o limite é 10, então se a compra for de uma cota, o comprador tem direito a 10% do prêmio.
É isso aí. Amanhã já sai o primeiro resultado, vamos ver :D.
T+




