Pesquisar

terça-feira, 15 de setembro de 2009

Ajuda fútil com progress bar ou outro componente que registre o progresso

Suponha que você tenha um progress bar que vai de UM_VALOR_MIN até UM_VALOR_MAX em unidades inteiras. Agora suponha que você tenha uma LISTA_DE_ARQUIVOS e deseja fazer um processamento(com_cada_um_dos_arquivos). E também quer deixar visível ao usuário esse progresso.
Agora veja o algoritmo mais (f)útil pra isso.

ps: esse é mais um daqueles posts que você pode se arrepender, tanto de ler quanto de escrever no futuro.




LISTA_DE_ARQUIVOS = listFilesAt("/home/myuser/myfolder/movies/")
UM_VALOR_MAX = 100
TOTAL_DE_ITENS =
LISTA_DE_ARQUIVOS .tamanho
QTD_POR_ITEM = UM_VALOR_MAX / TOTAL_DE_ITENS
UM_VALOR_MIN = QTD_POR_ITEM

for (String item : LISTA_DE_ARQUIVOS) {
File file = new File(item)
processar(file)
marcarProgresso(round( UM_VALOR_MIN+ 0.059))
UM_VALOR_MIN+= QTD_POR_ITEM
}

quinta-feira, 3 de setembro de 2009

Cache encurtando viagens


Cache é importante?

Me lembro quando comprei meu processador Atlhon XP 2400, na época tinha o maior cache maior da categoria. Tinha um cache L1 para dados e instruções de 64KB (cada) e L2 com 256KB. Hoje um E8400 tem cache L1 de 32KB pra dados e 32KB para instruções e um L2 com 6MB (compartilhado entre os núcleos) indo além disso um Core i7 adiciona mais um nível (LEVEL) o L3. ( ele tem L1 = 32KB pra dados e 32KB pra instruções, L2 = 4 x 256KB e L3 = 8MB compartilhada com todos núcleos). Bem, se os projetistas de hardware já se preocuparam com isso pra que eu vou fazer cache?

O que é um Cache?

O processo de armazenamento temporário de informações recentemente acessadas em um subsistema de memória especial para acesso mais rápido. (Windows Vista Center Help)
É um dispositivo de acesso rápido, interno a um sistema, que serve de intermediário entre um operador de um processo e o dispositivo de armazenamento ao qual esse operador acede. A vantagem principal na utilização de uma cache consiste em evitar o acesso ao dispositivo de armazenamento - que pode ser demorado -, armazenando os dados em meios de acesso mais rápidos. (Wikipedia)

Exemplo (ridículo) do uso de Cache (sun.misc.Cache)

Cache cache = MCache.get(); //singleton, session, jndi, cache distributed server...
if (cache.get("homePageNews")==null){
//busco no banco
//quando busco no banco
//atualizo também o cache.
}else{
//salvei tempo
Set news = (Set)cache.get("homePageNews");
}
Senta que lá vem história, experiência quase-real

Numa consultoria 0800 à um amigo Php-Ense; ele me retratava que apesar de ser um servidor não tão parrudo o sistema estava apresentando lentidão (demora de 0,5 a 1,8 segundos), as telas estavam demorando muito a serem carregadas... Já cheguei pensando que seria uma batalha(tanto pelo pouco conhecimento em PHP, quanto pela descrição do problema). Se tratava de uma aplicação simples com poucos 'Gruds' (cerca de 30). Na demonstração percebi que algumas telas demoravam mais do que outras para carregar , e uma demorava quase 2 segundos (essa que encomodava-o) que era a gestão de clientes, nela havia três combos: países, estados e cidades. Uma outra era a página inicial que carregava : últimas notícias, o perfil de três clientes (randômicos), três serviços prestados (randômicos), um texto sobre a "empresa" e uma mensagem. Tudo isso era carregado do banco a cada requisição, se 100 pessoas abrissem o browser naquele site seriam enviados 100 equisições ao banco (que provavelmente por se tratar do mesmo dado os teria em cache, ôoo o banco também tem cache, todo mundo têm eu também quero... será? ) mesmo que o banco lhe salve um pouco de processamento, você continua enviando e recebendo dados pela rede e isso é danoso. Sugeri a ele usar um framework de Cache ou criar um simples e sincronizá-lo com a base de N minutos a N minutos. Depois que ele seguiu meus conselhos ele disse ter uma melhora bem melhor do que esperava. Isso, claro, não significa que todos os problemas de performance serão sanados com uso de cache, alias o uso indiscriminado de tal recurso pode também afetar a performance negativamente. Agora imagine que uma aplicação esteja distribuída em vários servidores em clustes um único sistema de Cache não irá ajudar muito, para tanto já existem sistemas de Cache distribuidos (acredite que isso é mais simples do que minha mente temerosa de computação distribuída possa imaginar).

terça-feira, 1 de setembro de 2009

Lista de bons programas open-source.

Soa como clichê mas vai ai minha lista:

Media Center - http://www.moovida.com/screenshots/
Playstation 2 - http://code.google.com/p/pcsx2/
Wii / Dolphin Emulator - http://code.google.com/p/dolphin-emu/
JDowloader - http://jdownloader.org/

ps: só citei os que estou usando e aproveitando (muito) ultimamente.

sexta-feira, 14 de agosto de 2009

Minhas::Commons::Lib::Utils > Apache::Commons

Por mais que existam frameworks como Jpa, Jsf, Ruby On Rails, Lucene, Spring e outros, provavelmente sempre existirá uma característica ou um pedaço de código que nós desenvolvedores iremos criar e guarda-los em um modulo (pacote...) de utils. Há alguns desenvolvedores que mesmo conscientes de que já existem frameworks de ORM, criam seus próprios produtos. Acredite ainda existem.

Se você é aquele que segue a idéia de não reinventar a roda tente sempre, antes de criar essas "libs", verificar se já há algum código criado pra tal problema.

Pensando nesses problemas a grande Apache criou vários projetos com um subnome de Commons. (tanto para plataforma Java quanto .NET) E são esses projetos (não todos, só alguns) que vou resumir aqui seus usos, a idéia não é dar um guideline de uso dos projetos mas apenas mostrar que para quase toda "vontade" de criar uma lib, já existe uma pronta. Então a use...

Tenho um problema de desempenho que acho que resolveria se mantivesse alguns objetos pesados no pool..

Primeiro tenha certeza de onde está o seu real problema de desempenho, isso você só consegue medindo... dá-lhe profiler. Às vezes não são os poucos objetos pesados, mas a grande quantidade de pequenos repetidos! Bem para esse problema a Apache já criou projeto :) Apache Commons Pool.

Trabalho numa empresa que desenvolveu um sistema para o TRE-XX e lá nos temos que validar títulos de eleitor, isso eu dúvido que apache tenha...

Realmente a apache (eu acho que não, vai saber?!...) parece não ter, mas a Caelum desenvolveu (e está evoluindo) um Framework chamado Stella (http://stella.caelum.com.br/core-formatters.html), justamente para prover soluções para problemas que nós desenvolvedores Brasileiros enfrentamos diariamente, tais como: validar cpf, boletos de bancos nacionais, formatar cnpj e etc.

Pô, uso a API padrão do Java (6) no que tange ao assunto de coleções mas não consigo encontrar várias operações que gostaria de fazer com essas coleções... e ai?

Aqui o conselho seria primeiro dar uma boa olhada nas classes Collections (não a Interface Collection) e a Arrays, elas já provem bastantes características mas se mesmo assim não se der por satisfeito pesquise e irá econtrar uma Collection-Commons (http://commons.apache.org/collections/userguide.html) da Apache.

Tô trabalhando num sistema legado e aqui, por questões de performance, uso o JDBC e tenho que criar, mapear e fazer n coisas de banco, tudo na "mão"...

Performance ... sempre deve ser medida pra ser confirmada. A Apache (novamente) tem um projeto DBUtils (http://commons.apache.org/dbutils/examples.html) que têm várias funcionalidades para manuseio de banco de dados.

Nem sempre as utils vem para só para resolver problemas, às vezes criamos utils para facilitar nosso código.

Pensando assim a Apache também criou uma outra Commons (http://commons.apache.org/io/description.html) para IO, o que torna uma tarefa entediante de ler os bytes de um InputStream numa simples tarefa.

Tarefas como mandar email, realizar operação matemáticas complexas, usar recursos e protocolos das redes de computadores, já estão implementadas, testadas e sendo usadas em produção por várias pessoas.

Por último, pare e pense: porque será que grandes projetos, tais como Hibernate Core ou Search, Spring e outros, tem dependências de grande parte dos projetos xyz-commons-kwq.zip da apache? será mesmo necessário criar aquela util ou mesmo criar uma exceção para dizer que o argumento passado à um método veio nulo?

quarta-feira, 12 de agosto de 2009

Tiny Types não são desperdícios

Tiny Types são importantes por diversos fatores dos quais me lembro de: enriquecimento do domínio, forçagem de tipagem, clientes das classes perdem o poder de errar no uso incorreto da ordem dos parâmetros de algum método.

O que é um tiny type?

Sabe aquelas propriedades que costumamos definir como simplesmente String (nome, sobrenome, cpf, cep) , alguns desses atributos podem acabar se transformando em um tipo próprio.... os tiny types.
Definição: São objetos pequeninos (dahhh) que normalmente são imutáveis e seguem o padrão VO (de Martin Fowler), podem parecer chatos no inícios para alguns mas se mostram poderosos com o passar do tempo.

E as vantagens??

Enriquecimento do domínio: new Pessoa(new Nome("Luiz"), new Sobrenome("Inacio"))
Diminuição de erros: tendo uma classe qualquer Pessoa com atributos nome e sobrenome como String poderia nos permitir fazer coisas como: new Pessoa("Inacio","Luiz")

E as desvantagens???

Claramente você terá mais trabalho para definir e até mesmo mapear (seja o @Embebbed do padrão JPA ou seu mapeador próprio ou seu framework predileto para mapeamento ORM) esses mini-tipos que serão incorporados a um objeto maior.

ps: inspirado (entre outros...) pelo post da caelum.

terça-feira, 11 de agosto de 2009

JRuby, Abobrinhas e DDD

Programação funcional, linguagem dinâmica, duck typing, closures, fluência, dsl, behavior, tipagem inferida... são assuntos recorrentes das rodas dos desenvolvedores mais cool. Em uma dessas rodas ouvi a seguinte afirmação sobre o JRuby:
"Eu não gosto do JRuby... gosto do Ruby puro, JRuby é apenas os problemas do Java no Ruby"
Isso foi numa roda de "experientes em Java"... claro que tentei explicar que a frase não fazia muito sentido e que deveriamos pensar em Plataforma... e que JRuby é uma implementação para o interpretador de Ruby e não uma linguagem, que era até mesmo mais rápido do que o MRI (ou CRuby para os mais intimos), dai que eles se renderam e entenderam o que era o JRuby e MRI. Eu ainda curioso, perguntei como tinham chegado aquela conclusão, e para minha surpresa um me disse que foi porque veio com NetBeans e por isso não deveria ser coisa boa... (pode? rsrsrsrsr)

Hoje também li um post (ótimo por sinal) do Rodrigo Yoshima (AsperCom) no qual ele discorre o já batido (mas nunca esgotado) assunto Repositories... ele escreveu uma frase ("Não é uma opção arquitetural, somente estou transparecendo o domínio.") que me fez lembrar mais uma vez da falta de cautela dos desenvolvedores ao se preocuparem muito mais em tecnologia do que com a realidade. Certa vez estava realizando um projeto (não UML, na definição das classes mesmo) no qual dividi uma entidade em dois conceitos mas que tinha somente uma tabela no banco, quase 100% das pessoas me criticaram por estar sendo muito purista, naquele momento não sabia exatamente o que dizer à eles mas lembro que o sentimento era que eu estava apenas transcrevendo o que houvi dos usuários.