Archive for March, 2006

Extra, Extra! Livro de Ruby do TaQ!!!

Thursday, March 23rd, 2006

Acabo de receber um email do digníssimo Eustáquio Rangel (o TaQ) falando sobre o livro dele:

RubyTaQ

Uau! Enquanto o meu não chega, então não posso comentar mais, dêem uma olhada no que ele falou.

Grid+WebServices: Falar e Fazer

Monday, March 20th, 2006

Parece que após tantos e tantos anos de falatório em torno da computação distribuída o início de 2006 traz resultados práticos. A Amazon (é, a dos livros!) anunciou um serviço de armazenamento online e a Sun acaba de anunciar, pela voz do seu presidente, que estará inaugurando uma grid de computadores pública disponível sob demanda.

O Network.com ou Sun Grid ainda vai ser lançado mas pelo que deu para entender você faz o upload de uma aplicação e conecta-se a ela através de WebServices (SOAP, creio). O sistema aceita binários para Solaris x86 ou Java. Mais um dos motivos da Sun para liberar seu Solaris e para se decidir como empresa de hardware, mas hardware como serviço, não como produto.

Em breve creio que vamos ver a IBM e HP lançando serviços parecidos, além de versões baseadas em .Net, Linux, Windows e demais.

A maioria das aplicações que fazemos no dia-a-dia ainda não são o alvo deste tipo de arquitetura. A Sun visa atingir os grandes consumidores de CPU como softwares de simulação, renderização, cálculos e bioinformática. Estas áreas possuem projetos interessantes que ou constroem seu próprio grid e estouram seu orçamento ou não obtêm resultados esperados.

Ainda assim, boa parte das aplicações que eu construí acabaram indo para servidores dedicados em datacenters terceirizados. Se ao invés de alugamors ‘um servidor Pentium IV com Linux’ alugarmos ‘X horas de CPU/mês’, temos um cenário onde grids públicos são bem aplicáveis e, teoricamente, baratos.

Será que em breve fazer deployment de uma aplicação será fazer o upload pro network.com (ou concorrente) dos binários e criar o banco de dados no S3 da Amazon (ou concorrente)?

E a pergunta mais importante neste instante: será que isso salva a Sun?

E-Mails Perdidos…

Sunday, March 19th, 2006

Devido a uma besteira com filtros do GMail eu perdi alguns emails de semana passada e a anterior. Se você está esperando uma resposta minha e está demorando muito, mande o e-mail novamente :P

Google e Seu Marketing

Saturday, March 11th, 2006

O Signal vs. Noise discute porque o Google teria comprado o Writely e eu pergunto a você: quanto tempo por dia você passa usando produtos do Google (Orkut, GMail, GoogleTalk, Search, Maps, Froogle, Blogger, Analytics, Video, Picasa, AdWords…) e quanto passa usando produtos Microsoft (tirando o Windows)?

A Microsoft vence fácil, não é? Então pense quanto tampo você passava utilizando produtos de cada um destes há apenas um ano atrás.

Considerando este crescimento absurdo, o quanto do seu tempo o Google vai ter tirado da Microsoft em mais um ano?

É engraçado isso. Enquanto o Google distrai com coisas sobre um possível Google OS ou o tão aguardado GoogleCalendar ou ainda a suíte de Office inteiramente web a emrpesa está, na verdade, tomando a web aos poucos e quase que despercebidamente.

“Só de Sacanagem”

Saturday, March 11th, 2006

Interrompemos nossa programação normal para colar este excelente trecho de Elisa Lucinda que tomei conhecimento após ouvir o CD de Ana Carolina e Seu Jorge.

Além deste belo recado para todos os brasileiros na linda voz de Ana Carolina, o CD é excelente ;)

Meu coração está aos pulos! Quantas vezes minha esperança será posta à prova? Por quantas provas terá ela que passar? Tudo isso que está aí no ar, malas, cuecas que voam entupidas de dinheiro, do meu dinheiro, que reservo duramente para educar os meninos mais pobres que eu, para cuidar gratuitamente da saúde deles e dos seus pais, esse dinheiro viaja na bagagem da impunidade e eu não posso mais. Quantas vezes, meu amigo, meu rapaz, minha confiança vai ser posta à prova? Quantas vezes minha esperança vai esperar no cais? É certo que tempos difíceis existem para aperfeiçoar o aprendiz, mas não é certo que a mentira dos maus brasileiros venha quebrar no nosso nariz. Meu coração está no escuro, a luz é simples, regada ao conselho simples de meu pai, minha mãe, minha avó e dos justos que os precederam: “Não roubarás”, “Devolva o lápis do coleguinha”, ” Esse apontador não é seu, minha filhinha”. Ao invés disso, tanta coisa nojenta e torpe tenho tido que escutar. Até habeas corpus preventivo, coisa da qual nunca tinha visto falar e sobre a qual minha pobre lógica ainda insiste: esse é o tipo de benefício que só ao culpado interessará. Pois bem, se mexeram comigo, com a velha e fiel fé do meu povo sofrido, então agora eu vou sacanear: mais honesta ainda vou ficar. Só de sacanagem! Dirão: “Deixa de ser boba, desde Cabral que aqui todo o mundo rouba” e eu vou dizer: Não importa, será esse o meu carnaval, vou confiar mais e outra vez. Eu, meu irmão, meu filho e meus amigos, vamos pagar limpo a quem a gente deve e receber limpo do nosso freguês. Com o tempo a gente consegue ser livre, ético e o escambau. Dirão: “É inútil, todo o mundo aqui é corrupto, desde o primeiro homem que veio de Portugal”. Eu direi: Não admito, minha esperança é imortal. Eu repito, ouviram? IMORTAL! Sei que não dá para mudar o começo mas, se a gente quiser, vai dar para mudar o final!

Através do Cat, do Jornal O Globo, peguei um vídeo com ela recitando o texto. Imperdível!

Voltamos com nossa programação normal ;)

Novo Livro de Scott Ambler e Notícia Agradável

Saturday, March 11th, 2006

Dia 3 deste mês saiu o novo livro de Scott Ambler, Refactoring Databases : Evolutionary Database Design.

Para quem não conhece, Scott Ambler é criado do Agile Modeling, Agile Data Method, Agile Model Driven Development (AMDD), Enterprise Unified Process (EUP), e da metodologia Full Lifecycle Object-Oriented Testing (FLOOT), além de ser contribuidor do RUP. É autor de diversos (mesmo!) livros e artigossobre Java, UML, metodologias e Modelagem de sistemas.

Enquanto a Amazon não entrega o meu exemplar, eu convido a dar uma olahda na apresentação do Ambler para o JavaPolis.

E se você realmente gostar do trabalho do Ambler e quiser ouvir diretamente da boca dele sobre as novas tendências e tecnologias, tenho o prazer de lhe informar que Scott Ambler e mais personalidades do mundo Java e OO vão estar presentes no Rio de Janeiro em um evento que promete entrar para a história. Não perca mais detalhes neste blog ;)

Exceptions vs Tell Don’t Ask

Thursday, March 9th, 2006

Uma thread legal na lista de discussão do RioJUG sobre o princípio de Tell Don’t Ask

Considerando que o esquema de histórico do Yahoo! é horrível, vou colar aqui.

Bruno Iecker:

Oi galera,

tenho uma dúvida em relação a quando lançar uma Exception.

Vou tentar criar um exemplo, deve sair bem maluco, para exemplificar minha dúvida:

//forma 1
if(usuario.isMaior())
{
usuario.addFavorito(sexo);
}

//forma 2
try
{
usuario.addFavorito(sexo);
}
catch (ConteudoNaoPermitidoException e) {
e.printStackTrace();
}

Bem, da primeira forma, evito a Exception e entendi (provavelmente errado) que seria essa a recomendação do livro Effective Java (tem um resumo aqui). Mas assim, eu não estaria violando o príncipio Tell, don’t ask? Além de expor um método isMaior que poderia ser privado.

Abs,
Bruno.

Phillip Calçado

Olá,

On 3/7/06, Bruno Iecker wrote:
> Bem, da primeira forma, evito a Exception e entendi (provavelmente errado) que seria essa a recomendação do livro Effective Java (tem um resumo aqui). Mas assim, eu não estaria violando o príncipio Tell, don’t ask? Além de expor um método isMaior que poderia ser privado.

Sim, estaria. Você pode melhorar a separação de responsabilidades:

Segundo etnendi, a lógica de adicionar um favorito é a seguinte:

“Se o favorito for restrito para usuários maiores de idade, rejeite.”

E no exemplo essa lógica é responsabilidade do usuário. Nenhuma outra
classe deve implementá-la, então você não pode fazer

if(usuario.isMario())

O que fazer então?

Você pode fazer assim:

if(usuario.podeAdicionar(sexo))
{
usuario.addFavorito(sexo);
}

E seu usuario:

class usuario{

public boolean podeAdicionar(Favorito f){
if(f.isRestrito()) return (this.idade > 18);
else return true;
}

public void addFavorito(Favorito f){

if(podeAdicionar(f)){
favoritos.add(f);
}
else{
throw new FavoritoNaoEhValidoException();
}
}

}

Assim você mantêm as responsabilidades das classes no devido lugar.

[]s

Bruno Iecker

Oi Phillip,

fiquei mais confuso… É que acho que expressei mal a minha dúvida.

O meu exemplo é hipotético, mas vamos lá…

//Phillip escreveu

if(usuario.podeAdicionar(sexo))
{
usuario.addFavorito (sexo);
}

Neste caso, de qualquer forma, eu ainda não estaria perguntando ao usuario?

Utilizando o seu exemplo… por que não fazer apenas:

usuario.addFavorito(sexo);

e deixar o método podeAdicionar privado em Usuario?

Abs,
Bruno.

PS.: Sim, trocar o método isMaior por podeAdicionar melhorou bastante porque agora não exponho aos clientes a lógica de permissão, mas não era essa a minha dúvida. ;-)

Phillip Calçado

Oi,

On 3/7/06, Bruno Iecker wrote:
> Utilizando o seu exemplo… por que não fazer apenas: (…) e deixar o método podeAdicionar privado em Usuario?

Falando de “tell don’t ask” puramente acho que vai depender do nível
de encapsulamento que você quer no processo de adicionar. É bem
relativo ao problema enfrentado.

Sobre exceções em geral, caso fosse uma operação complicada onde você
não pode perguntar antes, algo do tipo do gato de Schrödinger (onde o
ato de observar/perguntar causa incerteza:
http://en.wikipedia.org/wiki/Schr%C3%B6dinger%27s_cat) você ia ter que
usar exceções ou se basear no retorno do método.

Para decidir entre um ou outro (retorno ou exceção) entra o que é
válido ou não para sua classe. Vamos tentar aplicar Design by Contract
(uma pequena introduçãozinha aqui:
http://fragmental.com.br/wiki/index.php?title=Contratos_Nulos).

Se sua classe assume (pré-condição) que o argumento é sempre válido, a
classe que chama deve enviar apenas argumentos válidos. Se os
argumentos não forem válidos essa é uma condição clara onde uma
exceção deve ser lançada (algo do tipo illegalArgumentException).

Nesse caso, sua classe cliente é “bem-intencionada” e quer enviar
apenas argumentos válidos ao usuário, mas ela não pode saber por si só
o que é válido ou não, tem que perguntar a alguém (no caso, ao
usuario).

Se sua classe Usuário não especifica no seu contrato que espera apenas
argumentos válidos, ela deve ser capaz de lidar com qualquer
argumento. Como isso vai ser implementado depende do problema mas
geralmente lançar uma exceção não é algo “justo” pois ninguém quebrou
nenhum contrato.

Worldwide Suicide Single para Download

Thursday, March 9th, 2006

Como quem lê isso tá cansado de saber eu sou fã do Pearl Jam e não posso deixar de recomendar o novo single que está disponível em MP3. (ps: valey Meyer!)

Houston… we have no CSS

Thursday, March 9th, 2006

Como dá pra perceber os problemas com o layout voltaram.

Vou atualizar o WordPress e ver que bicho dá… :(

Update: Atualizado, vamos ver…

Livros de LISP são engraçados…

Thursday, March 9th, 2006

Ou pelo menos o que eu estou lendo é.

O livro começa com um Hello World, até aí tudo bem… mas o primeiro exemplo mais concreto te ensina a criar uma base de dados simples, um mapa. Ok, nada demais apra um programador experiente. Um mapa com uma função que reproduz uma clásusula WHERE em SQL, com AND, OR e o escambau.

Detalhe que você implementa e entende razoavelmente isso antes de entender como assignalar valores a uma variável!!

Outro fato legal é que quase todo livro moderno traz um pouquinho sobre como utilizar o framework de Unit Test padrão na sua linguagem. Este livro, até odne eu vi, traz um capítulo sobre como implementar um framework de teste.

O exemplo principal do livro poderia ser uma simples biblioteca para catalogar MP3. Mas os caras fazem um servidor com streaming.

Mas não, não se assuste! O livro é totalmente claro e fácil de entender para um programador experiente. Não faz muito minha cabeça essa coisa de exemplo atrás de exemplo (prefiro livros tradicionais) mas o resutlado final é ótimo!