quinta-feira, abril 19, 2007

A mágica do DetachedCriteria

NHibernate é bom mesmo.

Eu tinha o seguinte código hoje pra otimizar (extraído de um Controller do projeto que estou trabalhando):

[Layout("popup")]
public void Observacoes([ARFetch] Pedido pedido, [ARFetch] Fornecedor fornecedor)
{
SimpleQuery consulta;

if (fornecedor == null) {
consulta = new SimpleQuery(@"
from ObservacaoPedido obs
where obs.Pedido = ?
order by obs.CriacaoData
", pedido);
}
else {
consulta = new SimpleQuery(@"
from ObservacaoPedido obs
where obs.Pedido = ? and obs.Fornecedor = ?
order by obs.CriacaoData
", pedido, fornecedor);
}

IEnumerable observacoes = consulta.Execute();

PropertyBag.Add("pedido", pedido);
PropertyBag.Add("fornecedor", fornecedor);
PropertyBag.Add("observacoes", observacoes);
}


Qual era o problema dele? A princípio, nenhum... Mas o NHibernate tem uma certa particularidade: quando o carregamento de objetos veio de uma consulta HQL, ele não cria proxies para os objetos (ou seja, sem lazy-loading para relacionamentos muitos-para-um), e só carrega exatamente o que diz minha consulta. O resultado é um turbilhão de consultas sendo enviadas ao banco, para carregar os dados que "faltaram"... Mesmo que eu não use eles.

Introduzindo, então, o DetachedCriteria:

public void Observacoes([ARFetch] Pedido pedido, [ARFetch] Fornecedor fornecedor) {
QueryBuilder q =
Where.ObservacaoPedido.Pedido == pedido;

DetachedCriteria crit = q;
crit.SetResultTransformer(new DistinctRootEntityResultTransformer());
crit.SetFetchMode("Anexos", FetchMode.Eager);
crit.SetFetchMode("Anexos.Arquivo", FetchMode.Eager);

IEnumerable observacoes =
ObservacaoPedido.List(crit, OrderBy.ObservacaoPedido.CriacaoData);

PropertyBag.Add("pedido", pedido);
PropertyBag.Add("fornecedor", fornecedor);
PropertyBag.Add("observacoes", observacoes);
}


O código, menor, ficou até um pouco mais claro, apesar de ter ficado mais arcano, expondo mais o NHibernate. Teria ficado mais ainda, se eu não tivesse utilizado o NHQG do Ayende para gerar o DetachedCriteria.

O resultado? Apenas uma consulta sendo enviada ao banco, e o tempo de carregamento de uma tela baixou de 3s pra 0,4s.

segunda-feira, abril 09, 2007

Google MyMaps

O Google acaba de lançar a interface MyMaps, onde qualquer um pode criar seu próprio mapa, sem precisar conhecer a API de mapas.

Parece interessante. Ainda não vi como usar, mas vi um mapa bem legal:

The World of Hello World: um mapa contendo as principais linguagens de programação, a indicação de onde foram inventadas, e um exemplo de código. É sempre legal rever aquele código COBOL ou Fortran e ficar aliviado, de como já passamos daquela fase.

sexta-feira, janeiro 19, 2007

Corrigindo dead-pixels em monitor LCD

Hoje estava respondendo um email, e, na bagunça da minha mesa, acabei jogando pra cima do meu monitor LCD uma coisinha de metal, talvez magnetizado (não tenho certeza).

Resultado: um borrão preto na tela, na parte onde o metal encostou (entendi esse borrão como uma série de "dead pixels"). Fiquei desesperado: desliguei o monitor, liguei de novo, mexi em tudo o que é tipo de configuração, procurei o tal Degauss (não encontrei)...

Enfim, fui ao Google tentando encontrar uma forma de solucionar o problema. Pra mim, o problema era de hardware, e eu já estava pronto pra encontrar uma solução do tipo, "abra o monitor", ou "jogue fora e compre um novo", etc, etc.

Daí encontrei esse site aqui:

JScreenFix - Free software to fix stuck pixels and burn-in

A princípio não acreditei: como um software pode corrigir um problema de hardware? Mas, eu já estava desesperado, e resolvi arriscar.

E não é que funcionou? Nem precisei instalar nada: o site abriu uma janela Java, e eu arrastei ela pra cima do borrão. Quando tirei, o bottão tinha sumido, e o monitor estava de volta ao normal!!

domingo, janeiro 07, 2007

Vídeo-clipes com letras

Achei hoje, bem por acaso.

MuVids.com - Music Videos With Lyrics On Demand

Vale a pena... Pena as letras não serem sincronizadas com a música... Mas já é mais do que eu esperava... Estava procurando apenas pela letra de uma música, é legal ver o clipe junto :)