terça-feira, 22 de dezembro de 2009

Sun Tech Days 2009-2010

Estive novamente no evento da sun esse ano e para falar a verdade as novidades são poucas, pelo menos para quem anda antenado no que está acontecendo la fora através de blogs, sites de noticias e outros.

Uma coisa interessante foi a vinda do James Gosling para promover uma palestra de abertura. O cara é uma lenda na comunidade java, sua apresentação foi muito boa.

Estava esperando para ver alguma novidade sobre a aquisição da Sun pela Oracle mas o único momento que alguém falou sobre isso foi para dizer que não falaria sobre isso(rsrs). A apresentação da Oracle foi feita por Pieter Humphrey, um dos diretores.

Achei interessante uma apresentação sobre o JRockit, uma camada de virtualização que roda sobre o virtualizador, ou seja, a máquina virtual não tem S.O. somente a maquina java para executar o AppServer. Sem problemas de segurança, porque não existe usuário, sistema de arquivo, etc, muito interessante.

sexta-feira, 30 de outubro de 2009

Código Coletivo

Uma das coisas que mais me preocupam nos ambientes de desenvolvimento de software é o aparecimento do "super" programador. Normalmente esse fenomeno se dá quando algum software ou rotina complicada se apresenta e não há, na melhor das palavras, disponibilidade de encarar a tarefa, quando se encara surge o "super" programador.

Várias metodologias modernas de desenvolvimento de software resa por praticas que visam difundir o conhecimento do código, auto documentação e testes. A programação em par é uma dessas técnicas.

Uma técnica também muito útil é a rotatividade de equipe. Um sistema não deve ficar eternamente na mão de um único desenvolvedor, mas a equipe tem que variar, disiminando o conhecimento do sistema pelos desenvolvedores.

Recentemente vi um apresentação do Google IO sobre o míto do programador gênio, bem interessante e faz refletir sobre alguns aspectos comuns nas equipes de desenvolvimento de software.

sexta-feira, 17 de julho de 2009

Segurança na hora de estacionar

Presenciei essa cena há algumas semanas, perceba os dispositívos de segurança adotados na cidade de São Paulo pelos proprietários de veículos zelosos.


Alta tecnologia, não identificou? Veja em detalhes abaixo.















Daqui há alguns dias essa tecnologia chegará também para os carros da cidade.

sábado, 27 de junho de 2009

Hadoop+HBase, i did

Consegui, rodando e funcionando, vamos aos detalhes.

Bem, aqui para a banda tupniquim o assunto ainda não está na moda, making a long history short, o hadoop é uma implementação em java do paper do Google sobre o sistema de arquivos distribuidos para aplicação do algoritmo Map/Reduce e o Bigtable.

Basicamente a ideia é a seguinte: Os arquivos de dados ficam espalhados em um cluster de computadores, cada arquivo é quebrado em n pedaços de tamanho definido, cada pedaço fica em n nós do cluster, para garantir disponibilidade caso um nó que guarda o dado falhe. O processamento dos dados é feito por um algoritmo que mapeia as informações e outro que reduz. Se um trabalho precisar ler algum arquivo, esse trabalho é executado no mesmo computador onde os pedaços dos arquivos estão, como os arquivos estão espalhados, ele é executado paralelamente. Os dados a serem processados podem ser armazenados em arquivos texto em um "banco de dados não relacional" (HBase), que está armazenado no cluster. A figura 1 exemplifica um pouco.


Figura 1


A configuração do ambiente é um pouco complicada de início e requer um ambiente unix, eu instalei no Ubuntu e no Mac sem maiores problemas. Irei falar do processo de configuração em outro post, o sistema é composto de vários componentes, são eles: namenode, datanode, jobtracker, tasktracker, hbase-master e hbase-region-server.

O namenode é responsável pelo sistema de arquivos distribuídos. Ele guarda uma tabela que armazena informações sobre os pedaços dos arquivos e os datanodes onde eles estão armazenados. Quando uma requisição de abertura de arquivo chega ele informa para o cliente quais datanodes tem o arquivo e o cliente pede diretamente ao datanode. Se um datanode falha ele manda os outros datanodes que contem cópia dos pedações dos arquivos que estavam no que falhou se redistribuirem, ele mantém a proporção de disponibilidade do arquivo. Ele é o único ponto de falha do sistema, pos ele é que contem a imagem do sistema de arquivos distribuído.

O datanode é o lugar onde o dado está realmente armazenado. Quando um datanode entra no ar ele se conecta no namenode e aguarda novos pedaços de arquivos para armazenar e cuidar.

O jobtracker e o responsável por tratar os novos trabalhos de Mapreduce que chegaram no sistema. Quando um novo trabalho chega o jobtracker conversa com o namenode para descobrir em quais datanodes estão os pedaços dos arquivos o novo trabalho precisa e copia o trabalho para os tasktrackers que estão rodando no mesmo servidor do datanode.

O tasktracker é o responsável pela execução dos trabalhos em si, ele executa a operação de Map, mapeando os valores que deverão ser reduzidos em algum outro tasktracker ou localmente.

O hbase-master controla as tabelas do sistema e alocação dos dados.

O hbase-region-server controla uma região de dados.

Uma coisa que confunde as vezes, mesmo lendo os papers e wikis na net, é o algoritmo MapReduce. Vou tentar dar uma pequena revisão, mas para maiores detalhes é melhor o paper. Basicamente a função Map deve mapear os valores, relacionando-os a uma chave e passando para o Reduce enquanto esse reduz os valores e cria a saída final ou intermediária. Vamos ao

Exemplo:
Você deseja saber a média de salário e idades, por bairro, de toda a população do Brasil, que está armazenada, habitante por habitante, em uma tabela de alguns teras.


HABITANTES
Nome Bairro Sexo Salário Idade
nome1 bairro1 M 1000 18
nome2 bairro1 F 700 24
nome3 bairro2 M 230 19


A função Map irá gerar a informação:

Chave Valor
bairro1 => 1000, 18
bairro1 => 700, 24
bairro2 => 230, 19

Parece estranho a informação bairro1 estar duplicada, mas é assim mesmo, ela vai ser reduzida pela parte de reduce. Todos os valores para a mesma chave são passadas para o mesma instância, ou seja, a redução será executada também em paralelo. Se desejar alguma informação composta, basta gerar uma chave composta, exemplo bairro1-M para se você deseja saber por bairro/sexo.

Na verdade o processamento de dados complexos tem mais detalhes que ficam complicados somente com o MapReuce, muitas das vezes é necessário fazer pré-processamento ou junções com os dados é fazer tudo isso na mão da um bocado de trabalho, mas para isso existe o Cascade, mas esse é outro assunto que estou testando, assim que terminar os testes farei um novo post. No próximo post sobre o Hadoop irei colocar alguns exemplos de código e documenta-los, essa explicação inicial servirá como base para os póximos, nos vemos lá.







segunda-feira, 22 de junho de 2009

.Net, as coisas estranhas

Bem, tenho desenvolvido ultimamente em .Net, não vou negar, e a cada dia eu me deparo com uma coisa pior que a outra. Resolvi escreve-las aqui, não para icitar brigas, mas para documenta-las. Vamos as coisas mais estranhas do .Net.


1) Serialização de Objetos: Existe uma classe chamada XmlSerializer, muito útil, mas quando você vai serializar um objeto que se relaciona com outros você precisa criar uma instancia do XmlSerializer informando todas as classes que o seu objeto depende, ele não consegue inferir via reflexão.

é mais iu menios assim:


XmlSerializer ser = new XmlSerializer(
typeof(AClasseQueVaiSerializar), new Type[] {
typeof(todas), typeof(as), typeof(classes),
typeof(que), typeof(depende), });


Se houver outra forma e alguem souber, por favor, me avise.

2) Falta de comportamento padrão: Precisei criar um controle para exibir algumas informações para o usuário, para deixar a coisa mais bonita coloquei as bordas arredondas seguindo algumas dicas que achei na internet. Como a caria da coisa ficou legal, gerei a partir do controle uma imagem e salvei, para fazer um estilo de live preview quando o usuário selecionasse o arquivo depois de salvo. Ai é que veio a surpresa, cade os cantos arredondados????

Só para clarear, segue o trecho de código:

// Função do windows que deixa com os cantos arredondados.
[DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")]
private static extern IntPtr CreateRoundRectRgn(
int nLeftRect, // x-coordinate of upper-left corner
int nTopRect, // y-coordinate of upper-left corner
int nRightRect, // x-coordinate of lower-right corner
int nBottomRect, // y-coordinate of lower-right corner
int nWidthEllipse, // height of ellipse
int nHeightEllipse // width of ellipse
);
...
Region = System.Drawing.Region.FromHrgn(
CreateRoundRectRgn(0, 0, Width, Height, 20, 20));


E para salvar a imagem, simplesmente...


Bitmap bitmap = new Bitmap(Width_controle, Height_controle);
panel2.DrawToBitmap(bitmap, new Rectangle(0,0,
Width_controle, Height_controle) );


3) Emuns: Bem, são realmente simples enumerações numéricas, bem diferente do Java.

quarta-feira, 20 de maio de 2009

Minha CG 77

Esses dias bateu a nostalgia, começei a procurar fotos das motos que tive. Foi muito difícil achar a foto da primeirona, não foi bem da minha, mas é o modelo.

Minha CG 77, a primeira. Segue a maior viagem feita com essa motoca.

CG125_1

CG125_5

quarta-feira, 1 de abril de 2009

Pequeno Review: Design Emocional


Estou lendo vários livros que estavam enfileirados na minha lista. Dentre eles estão dois livros que trata de alguns termos que a maioria dos desenvolvedores e arquitetos de software só sabem que existe por causa da reclamação que fazem, os usuários. Os livros são Design Emocional e Abou Face 3.

Acabei semana passada de ler o Design Emocional e posso dizer que é um livro muito bom. No final o autor começa a falar um pouco sobre robotica e foge da realidade da maioria de nos, mas é muito interessante.

Resumindo o livro, o autor fala de três níveis de percepção emocional das coisas e como ela interferem na usabilidade e "desejabilidade" do software. Os níveis são o viceral, que trata das coisas que gostamos a primeira vista, o comportamental, que fala sobre como a usuabilidade interfere na iteração do software, e o reflexivo, que trata coisas como conhecimento passado e como ele afeta nas coisas do hoje.

Se você quer entender o usuário e como melhorar sua iteração para conseguir que o seu produto se encaixe melhor no seguimento que atua você deve ler esse livro. Eu já estou colocando em prática algumas coisas aprendidas nesse livro e é interessante ver a cara do seu usuário, um verdadeiro 8-).