terça-feira, 30 de setembro de 2008
Sun Tech Days
Do mas assisti aos Key Notes do Jim Parkinson e do Bob Porras (QUE NOME) e deu para perceber algumas diferenças, os dois são Vice Presidentes da Sun e são programadores, pelo menos pelo que eles disseram, e são muito empolgados sobre tecnologia.
As demais sessões foram uma repassagem dos tutoriais e materiais que estão disponíveis na web e acabaram não agregando muito. Acredito que para os que não ficam googlando por ai deve ter havido alguma novidade.
A sessão mais interessante foi a "Plataforma Java O que há de novo?". Foi bom ouvir da Sun o que eles estão pensando em fazer com a linguagem. Algumas coisas, particularmente eu já sabia, mas outas como JAM (JavA Module) tenho que repensar mais um pouco.
terça-feira, 29 de julho de 2008
Mercurial
O mercurial é realmente ótimo. Como desenvolvemos para windows, estamos usando o TortoiseHG para como interface do Mercurial. Segue um screenshot de uma das telas do TortoiseHG.
Explicando melhor, cada bolinha é um commit. Todas as sequencias são locais, as uniões entre os caminhos marcam os pontos em que os fontes foram unidos e equalizados, apontando quem fez as uniões e quais foram os arquivos unidos. Uma coisa muito interessante é a representação do ponto em comum. No exemplo da imagem, houve um ponto em comun onde duas pessoas começaram desenvolvimentos diferentes e como tudo foi unido um pouco mas adiante.
Não consigo ver uma maneira mais fácil de rastrear as mudançãs que essa. Depois de alguns anos trabalhando e administrando repositórios CVSs e apanhar de suas limitações e dificuldades de traking de informações, branching work e etc, acho que estou usando uma das melhores ferramentas para controle de versão, o Mercurial (HG).
terça-feira, 22 de julho de 2008
Sistema de Controle de Versão (Mercurial)
Todos já ouviram falar do CVS, sistema de controle de versão. Tenho tido alguns problemas com ele ultimamente em um projeto com vários desenvolvedores trabalhando pararelo. O processo de merge e tracking das alterações é um bocado complicado. Tentando acabar com esses problemas fiz um estudo com algumas opções e no final das contas estamos usando o Mercurial.
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(?)
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
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
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.
sexta-feira, 4 de abril de 2008
Linguagem de Programação Scala
Essa linguagem nova, Scala, é uma mistura de muitas coisas. Ela trabalha orientada a objetos, suportando programação funcional e com pattern matiching. Para quem tem medo dessas linguagens novas, se vão pegar, se tem bastante frameworks não precisam se preocupar, o código que ela gera são classes java. Isso mesmo, ela é feita como uma layer sobre o java com sua própria sintaxe que, quando você complila um código, ele gera classes java mas você vai precisar do ambiente do Scala instalado para poder rodar essas classes.
Umas das coisas que me chamou a atenção nessa linguagem foi o seguinte. Imagine o seguinte código em java:
Trecho 1
public class NumeoSimple {
protected int valor;
public NumeoSimple(int valor){
this.valor = valor;
}
public NumeoSimple soma(int valor){
this.valor += valor;
}
public int getValor(){
return valor;
}
}
public class NumeoComposto extends
NumeroSimples {
public NumeoComposto (int valor){
super(valor);
}
public NumeoSimple subtrai(int valor){
this.valor -= valor;
}
}
....
NumeoComposto numero = new NumeroComposto(10);
int i = numero.soma(10).subtrai(5).getValor();
Parece estar estar tudo certo, mas observe que o retorno do método soma é um NumeoSimple que não tem o método subtrai. A linha do Trecho 2 não poderá ser compilada, para corrigir isso podemos fazer com no Trecho 3 mas já estamos colocando mais código em uma coisa simples.
Trecho 2
int i = numero.soma(10)
.subtrai(5).getValor();
Trecho 3
int i = ( (NumeroComposto) numero.soma(10) )
.subtrai(5).getValor();
O mesmo código em Scala é possível com muito mais facilidade. O Trecho 4 apresenta o mesmo programa que o Trecho 1
Trecho 4
Class NumeroSimples( int : valor){
protected var _valor = valor;
def soma(int valor) : self.type = {
_valor += valor;
this;
}
def valor() = _valor;
}
Class NumeroComposto extends NumeroSimples {
def subtrai(int valor) : self.type = {
_valor -= valor;
this;
}
}
NumeroComposto n = new NumeroComposto(10);
n.soma(5).subtrai(2).valor();
Essa é apenas uma das caracteristicas dessa nova linguagem. Ainda não estou defendendo isso, mas parece bem promissor. Assim que der vou colocar mais algumas coisas por aqui sobre essa nova linguagem.
quinta-feira, 3 de abril de 2008
Virando Paulista
Algumas pessoas ja devem saber, mas para quem não sabe, estou em processo de mudança para São Paulo. Para os amigos que estão no Rio fica um abraço e quando estiver lá vou tentar sempre marcar uma cerveja.
Depois de vários anos trabalhando na Averone, em Petrópolis, estou agora no IBOPE, em São Paulo. As coisas não mudaram muito, estou como Analista Senior aqui trabalhando com projetos OLAP, Sistemas Distribuídos, DSP, Java, Delphi, C#, bancos de dados, analise, etc. Ou seja, não mudou nada.
Estou perto da Avenida Paulista e essa foto mostra um dos prédios no caminho para o trabalho, que, diga-se de passagem, vou a pé, uns 900 metros.
Vou tentar fazer aqui o que fazia no Rio, o meu melhor, difundindo tecnologia. Quem quiser entrar em contato basta mandar um email para mim diego [at] diegooliveira . com.