terça-feira, 24 de junho de 2008

XCode, OpenGL e OpenCV


Estou estudando ultimamente sobre Inteligência artificial, não um assunto muito fácil, mas é muito gratificante quando se consegue ler uma série de páginas em inglês sobre o assunto e entender tudo, pode ser que esteja na parte fácil.

Uma das bibliotecas que é muito utilizadas é a OpenCV. Como estou no mac resolvi tentar juntar essa biblioteca, com OpenGL desenvolvendo em Object-C. A coisa realmente não é tão fácil, mas depois de algum tempo sai.... :-).

Bem, ainda estou no começo, brincando de desenhar uma imagem adquirida pela OpenCV. O projeto ainda está bem simples, mas vamos ver até onde conseguimos ir. O xcode é bem diferente para quem está acostumando com java, gasta-se um tempo para entender onde estão as coisa e como conectar a interface com a camada de controle.

terça-feira, 27 de maio de 2008

Java, .Net, Ruby.... Delphi(?)

Tive uma conversa muito boa com um amigo, Victor Benjamin. A atual troca de emprego o deixou motivado, o que serviu de combustível para a convera, parabens pela nova estapa Victor.

Bem, na conversa falamos sobre o que o Java tem de bom, de ruim e o que não queremos nem falar. Como somos pessoas curiosas, temos visto algumas outras linguagens e ambientes, mas acredito particularmente que não exista a linguagem certa para todo o tipo de caso. Como dito em outros blogs, o importante é código funcionando.

Estou com um trabalho pessoal em curso, usando Java, separado em camadas implementando o máximo possível de DDD e uma coisa é certa: escrevemos muito. Para cada camada deve-se ter uma interface que define os métodos, a implementação, os testes unitários, as fabricas, os DTOs, etc. Não estou dizedo que é ruim, estou dizendo que codificamos muito. Apenas contando, um sisteminha de cadastro bem separado para Cliente, Produto e Compras precisa de pelo menos 3 Interfaces de definição para cada serviço, suas respectivas implementações, 3 Repositórios, um para cada classe, e separando a camada física, 3 DAOS, mais as classes de domínio e os DTOS. Somado isso estamos falando de uns 20 arquivo diferentes para 3 cadastros, parece um número um pouco auto.

Outro projeto pessoal que está na pauta, devo voltar a colocar a mão nele tão logo sobre tempo ou o dia passe a ter 36hs, está sendo feito em Ruby on Rails. Não da para comparar pedra com laranja, por isso não vou tentar comparar os dois universos, mas o tempo de codificação é muito pequeno. Praticamente, em um dia todo o cadastro estava pronto, foi ai que parei. A linguagem é ótima, fácil de usar e clara, o Rails tem suas peculiaridades, mas não é de todo mau.

Na empresa estou num projeto em Delphi, não é o ceu, na verdade é perto do purgatório. A linguagem é antiga e não tem muito dos facilitadores que as novas possuem mas, ainda assim, da para se fazer muita coisa legal. Uma das coisa que há em Object Pascal (iach) é o conceito de property, um modificador que permite um nível de get/set. O trecho de código abaixo exemplifica o property, basicamente ele esconde o get e o set que poderá ser definido no futuro, se necessário, sem alterar o código que o chama.


Cliente = class()
private
_nome : String;

_idade : integer;
function getIdade() : Integer;
procedure setIdade(idade : integer);
public
property nome : String read _nome write _nome;
property idade : Integer read getIdade write setIdade;
end;


O objetivo dessa discursão é mostrar que cada linguagem tem o seu "sintax sugar", que um ou outro programador irá gostar, mas o que importa não é isso, o que importa é código funcionando. Uma das premissas do manifesto ágil é essa. Se você está trabahando em um sistema de cadastro para uma campanha publicitária qualquer, não irá precisa se preocupar em fazer o sistema de tal modo que rode até em um palm (modularizando, usando WebServices e EJBS, etc..). A questão é o foco, o que você precisa, em quanto tempo e o que você sabe.

sexta-feira, 16 de maio de 2008

Meu Macbook


A uns 4 meses comprei um MAC, Macboook Intel 2.0Ghz e 1 Gb de memória, e gostaria de compartilhar o que tenho achado do Sistema Leopard.

A aparência é uma coisa fenomenal, todo branco é um contraste em qualquer lugar. O unico problema com a cor é que pode amarelar com facilidade, especialmente na área do teclado que é um pouco poroso. Para evitar que ele passe de branco para encardido é bom limpar de vez em quando, eu uso álcool gel para limpar, não agride e fica tudo branco de novo.

Quanto ao sistema operacional é fácil de usar e o sistema de busca é fantástico, depois que se acostumar não vai mais conseguir parar de usar. Uma das coisas que percebi é que rodar aplicativos mais pesados deixa a maquina um pouco lenta. Alguns colegas compraram mais memória e pela conversa a máquina ficou outra. Eu uso o meu para trabalho e coisas pessoais, como sou um cara de informática, tenho programado muito nele. O ambiente java é bem integrado mas come memória. Rodando o Netbeans com o Glassfish e uma aplicação desktop ao mesmo tempo a máquina simplesmente senta.

A uns 2 meses atrás estava com o Ubuntu instalado como segundo SO, mas tive que trocar pelo Windows por causa de um trabalho que precisei fazer. Os sistemas rodaram muito bem, os drivers para o windows estão todos no cd de instalação do Leopard já o Ubuntu reconhece sozinho quase tudo, só tem que fazer um ou dois truques para a câmera funcionar.

É uma ótima compra e o preço já está compatível com o outros aparelhos com o mesmo hardware no mercado. A fenac e o fastshop são ótimas lojas para comprar. Acho que não vale mais apenas trazer de fora, a diferença não compensa e comprando aqui mesmo ainda tem nota fiscal e garantia.

Se você já tem um e está querendo trocar a memória, da uma olhada nessa no mercado livre e as dicas de troca podem ser vistas no próprio site da apple

quarta-feira, 14 de maio de 2008

Homem de ferro - Iron Man


Quem viu o filme Homem de Ferro deve ter ficado fascinado pela armadura que o Stark construiu. Andei pesquisando o que seria possível ou não daquela armadura hoje em dia e compilei um material.

O maior problema para o funcionamento da armadura é a quantidade de energia necessária para funcionar. Seria necessário um reator nuclear para gerar a energia necessária par levantar vôo. O fato dela ser a prova de balas é outro problema, o peso de materiais desse tipo costuma ser alto devido a grande densidade do material necessária para parar uma bala, ou seja, o próprio peso da armadura exige mais energia para voar e até mesmo para um simples passo. A não ser que ele tenha descoberto como fazer fusão a frio, fica difícil acreditar que a curto prazo tenhamos algo do tipo.

Uma coisa clara é que metais são ótimos condutores de calor, e todos sabemos que não devemos colocar a ponta da colher no fogo e segurar na outra ponta senão queimamos a mão. Esse efeito acontece também nas botas do Homem de Ferro. No final da bota há um propulsor que o lança em vôo, como a bota é feita de metal o calor gerado pelo porpulsor iria simplesmente cozinhar a perna de quem a usar.

O capacete dele é uma coisa fenomenal, acho que a única que conseguimos algo parecido hoje em dia. O sistema de mira que é utilizado em uma das cenas para matar os bandidos é muito legal, se baseia em 3 tecnologias que conhecemos bem hoje em dia, detecção de rostos, calculo de distância baseado em imagens e triangulação. O telefone celular acoplado a armadura é demais, provavelmente usa alguma tecnologia VOIP ou se conecta via Bluetooth. Uma das coisas que mais gostei foi o sistema inteligente que o Stark conversa a todo tempo, reconhecimento de comandos de voz e iteratividade dessa forma é demais, estou estudando algumas coisas desse tipo para colocar na minha armad... ops, no meu computador pessoal(rsrsrs).

terça-feira, 6 de maio de 2008

Sistemas distribuídos

Uma das coisa que está muito comum hoje em dia é a utilização de aplicações distribuídas. Esse tipo de aplicação se caracteriza pela distribuição das tarefas mais de um equipamento. Em Java a utilização de EJBs, WebServices, RMI e JMS tornaram isso ainda mais fácil.

Iniciativas como o World Community Grid é um dos projetos que torna cada vez mais acessível ao usuário domestico a participação no processamento problemas como a cura do câncer ou o projeto genoma. Com o aumento da colaboratividade causado pelas redes de computadores o assunto está em pauta. Alguns softwares de pesquisa para o computador pessoal estão colocando essa idéia em pratica e já é possível em uma pesquisa por um arquivo qualquer ver se ele existe não só no computador pessoal, mas em qual computador da rede ou empresa.

Hoje há ainda softwares como o Wuala que permite a utilização de um sistema de arquivos distribuído. Quando você salva um arquivo nesse ambiente ele é copiado para uma série de computadores na internet. Quando você precisar do arquivo ele simplesmente baixa o arquivo de um desses computadores e o interessante é que a pessoa que etá guardando o arquivo tem acesso a ele.

No próximo blog vou tentar colocar aqui um trabalho de pesquisa que estou fazendo com o Lucene para ambientes distribuídos para ilustrar melhor a situação.

quinta-feira, 24 de abril de 2008

Troque as telhas da sua varanda.


Não sou muito de escrever sobre filosofia ou coisas do gênero. Como trabalho com informática acabo sempre escrevendo com um cunho mais técnico mas estou me sentindo a vontade para entrar nesse tema.

A algum tempo estava chovendo na minha varanda e eu não conseguia ficar com as portas abertas, desfrutar o visual de um belo dia de chuva ou mesmo deixar os chinelos de fora. Com a mudança para São Paulo percebi que as coisas simples da vida são o que fazem a verdadeira diferença. Uma pequena mudança e vuala, tudo vira novo de novo, você se dedica e acha satisfação.

Se estiver chovendo na sua varanda também não deixe isso atrapalhar o seu dia. Tome uma atitude e troque as suas telhas. E se no processo você achar um ninho de pássaros no meio do telhado antigo fique feliz porque é uma prova que a vida está em todos os lugares.

-----

Change the roof of your balcony

I'm not a kind of writing about philosophy or
things like this. I almost always write with a technical approach because my work with technology but now I'm felling nice to go into this field.

There is a while it is raining in my balcony and I couldn't stay with the doors open neither enjoys the beauty of a raining day nor let my footwear outside. The moving to São Paulo makes me realize that the simplest things are the true real difference. A little changing and vuala, everything became new again, you find dedication and satisfaction.

If it is raining in your balcony too don't let it interfere in your day. Take an action and change your roof. And if you find a bird's nest in the old roof stay happy it proves the life is everywhere.


quarta-feira, 9 de abril de 2008

Interfaces com Swing - Estilo MAC

A algum tempo comprei um Macbook e, acho que como a maioria dos Mac's users, a interface do sistema é simplesmente perfeita. Estou trabalhando em um projeto pequeno e estou brincando um pouco para conseguir algo parecido. A tela esta ficando assim:



Essa é a cara do iPhoto:



Você deve ter percebido que tirei esse screenshot no windows, ou seja, em qualquer plataforma ele vai parecer o mesmo. Tive que fazer alguns truques para conseguir essa cara, o principal dele foi a utilização de ButtonUI e PanelUI.

A arquitetura do Swing é algo muito interessante que pretendo falar mais no futuro. Basicamente o que temos que fazer para alterar a "cara" de um botão é desenvolvermos novos BottonUI ou implementar um novo JButton com a cara que você deseja.

O trecho de código abaixo é para a criação do botão metalizado.


public class BotaoAcaoTela extends JButton {

private static final long serialVersionUID = 1L;
private static final cor1 =
new Color(254, 254, 254);
private static final cor2 =
new Color(204, 204, 204);

public BotaoAcaoTela(Action acao) {
super(acao);
}

@Override
public void paint(Graphics g) {

Graphics2D g2 = (Graphics2D) g;

g2.setColor(new Color(235, 235, 235));
g2.drawRoundRect(0, 0, getWidth() - 1,
getHeight() - 1, 5, 5);

Paint p = g2.getPaint();
GradientPaint rgPaint =
new GradientPaint(0, 0,
cor1, 0, getHeight(), cor1);
g2.setColor(Color.WHITE);
g2.setPaint(rgPaint);
g2.fillRoundRect(0, 0, getWidth() - 1,
getHeight() - 2, 5, 5);
g2.setPaint(p);

g2.setColor(new Color(115, 115, 115));
g2.drawRoundRect(0, 0, getWidth() - 1,
getHeight() - 2, 5, 5);

String nome = getText();
Rectangle2D rec = g2.getFontMetrics().
getStringBounds(nome, g2);
float x = (float)
(getWidth() - rec.getWidth()) / 2f;
float y = (float) (getHeight() /2) + 5 ;

g2.setColor(Color.BLACK);
g2.drawString(nome, x, y);

//Verificando se o botão esta pressionado para
if (getModel().isArmed()
&& getModel().isPressed()){
AlphaComposite alpha = AlphaComposite.
getInstance(AlphaComposite.SRC_OVER, 0.4f);
g2.setComposite(alpha);
g2.setColor(Color.BLACK);
g2.fillRoundRect(0, 0, getWidth() - 1,
getHeight() - 2, 5, 5);
}

}


}



Logo logo eu publico aqui o macete para o fundo da barra dos botões e o botão lateral.