Eclipse Europa - Uma melhor “primeira impressão”

Bom, eu ja havia comentado sobre o Eclipse 3.3 aqui e aqui, mas devido a esta noticia, e a mania “nerd” de utilizar este tipo de camisetas, eu resolvi escrever este review …

Se você programa em Java e não vive em algum outro planeta ou no fundo do oceano, a esta atura ja deve ter ouvido falar do Europa, ou pelo menos do Eclipse.

O Eclipse Europa, é o maior “release train” até o momento (o primeiro foi o Calisto em 2006), e que eu saiba, se não “o”, com certeza, um dos maiores releases coordenados de projetos Open Source diferentes …
E considerando que foram 21 projetos, é que o release final não atrasou, é um feito de fazer inveja em muita empresa grande por ai :D
Uma das coisas mais legais desta nova release do Eclipse, são os bundles prontos para download, coisa que o Netbeans tem desde sempre, mas o eclipse ainda não tinha …
Agora na página de Downloads do Eclipse, existem pacotes prontos para:

Eclipse IDE for Java Developers
Ferramentas essenciais para todo desenvolvedor Java, como o Editor de código do Eclipse, cliente CVS e o Myln. Mais detalhes…

Windows
Linux
MacOSX


Eclipse IDE for Java EE Developers
Ferramenta para desenvolvedores Java criando aplicações Java EE, inclui uma IDE Java, ferramentas para Java EE e JSF, Mylyn e muiros outros. Mais detalhes…

Windows
Linux
MacOSX

Eclipse IDE for C/C++ Developers
Uma IDE para desenvolvedores C/C++. Mais Detalhes…

Windows
Linux
MacOSX

Eclipse for RCP/Plug-in Developers
Uma ferramenta completa para a criação de plugins ou aplicações baseadas no Eclipse RCP. Inclui o SDK completo, algumas ferramentas e o código fonte. Find out more…

Windows
Linux
MacOSX


Eclipse Classic
Este é o Download tradicional, que inclui o Eclipse SDK que todos ja conhecem. Find out more…

Windows
Linux
MacOSX

(ja com os links para download pra facilitar a vida de vocês)

Vamos então para o que eu não achei legal no Europa:

  • Quando se instala o pacote para desenvolvedores Java EE, por exemplo não é possível (ou pelo menos não é fácil) instalar oturos componentes via Update Site do Europa, aparece um erro dizendo que faltam algumas bibliotecas
  • É dificil de conseguir adivinhar o por que do Profiling não funcionar direto assim que se instala o eclipse e abre um projeto ja existente que utiliza o Java 6

Bom, acho que é só isto, a lista do que não gostei é pequena mesmo …

O que eu Gostei no Europa

  • Os pacotes prontos para download, pois facilitam muito para os iniciantes, mas eu ainda prefiro baixar o SDK e costumizar o que eu quiser
  • A inclusão do AspectJ no release train facilitou bastante
  • O DLTK (Dynamic Language Toolkit) ficou excelente, eu não conhecia antes do Europa
  • O projeto Dash (Eclipse Monkey) adicionou uma feature que eu queria a bastante tempo, a possibilidade de automatizar tarefas no eclipse utilizando Scripting
  • O Myln (antigamente conhecido como Mylar) melhora muito a produtividade, o único problema é que meio viciante, fica difícil trabalhar sem ele depois
  • O Web Tools Platform esta cada vez melhor, o suporte para JSF melhorou muito, e o editor visual para JSF também esta bem agradável

O que esta incluído no Europa

Eclipse Europa Projects
Project Name Homepage Version New And Noteworthy Download
AspectJ Development Tools (AJDT) 1.5 New Download
Business Intelligence and Reporting Tools (BIRT) 2.2.0 New Download
Buckminster 0.1.0 Download
C/C++ Development Tools (CDT) 4.0 New Download
Data Tools Platform (DTP) 1.5 New Download
Device Software Development Platform - Device Debugging (DSDP.DD) 0.9 New Download
Device Software Development Platform - Target Management (DSDP.TM) 2.0 New Download
Dynamic Languages Toolkit (DLTK) 1.0 Download
Dash (Eclipse Monkey) 1.0 New Download
Eclipse Communication Framework (ECF) 1.0.0 New Download
Eclipse Platform, JDT, PDE and Equinox. 3.3 New Download
Eclipse Modeling Framework (EMF) 2.3 New Download
Eclipse Modeling Framework - Query, Transaction, Validation (MQ, MT, VF) 1.1 New Download
Graphical Editing Framework (GEF) 3.3 - Download
Graphical Modeling Framework (GMF) 2.0 New Download
Model Development Tools (MDT) 1.0 New Download
Model to Text (M2T) - JET 0.8 New Download
Mylyn 2.0 New Download
SOA Tools Platform (STP) 0.6 Download
Test and Performance Tools Platform (TPTP) 4.4 New Download
Web Tools Platform (WTP) 2.0 New Download

Web Tools Platform (WTP)

Bom, eu ja falei bastante do WTP por aqui, mas eles estão cada vez melhores.
Uma coisa que eu percebi de cara nesta nova versão é que a performance melhorou muito …
Tem muitas novidades, uma das que mais fez diferença para mim pelo menos, é o suporte ao Tomcat 6 (que infelizmente não esta funcionando direito no IntelliJ IDEA).
Ele finalmente inclui suporte a Tag Files que é uma coisa que me irritava muito nas versões anteriores.
Uma coisa que eu achei espetacular, é o auto completar para URIs das Tag Libraries, ou seja, você digita <@ taglib prefix=”c” uri=”
aperta CTRL+SPACE e pronto, ele lista a URI de todas as tag libraries que estiverem no classpath da aplicação …
Alem do CTRL+Click funcionar agora também para as Taglibs ou seja, ele leva para o TLD ou Tag File onde a tag clicada foi declarada, isto facilita bastante a vida :D
O Suporte a JPA do WTP também melhorou bastante, mas eu ainda acho irritante ele ficar marcando como erro no projeto uma tabela não existir mesmo quando a implementação de JPA esta configurada para criar as tabelas automagicamente …

Dynamic Languages Toolkit (DLTK)

O DLTK foi uma agradavel surpresa …
Ainda mais agora que estou tomeçando a programar em Ruby também …
O Code Complete do DLTK é perfeito para Ruby pelo menos, des de que sejam adicionadas todas as bibliotecas ao “classpath” do interpretador configurado …
Um problema que encontrei é que pelo menos no windows, ele impede a utilização de um “.bat” como interpretador, ou seja, é impossivel utilizar o JRuby com o DLTK pelo menos por enquanto, mas isto não chega a ser um problema para quem utiliza algum *nix (como o Ubuntu no meu caso).
Uma coisa que ainda esta faltando no DLTK é o suporte a edição de arquivos rhtml, claro, eu posso configurar eles como HTML no eclipse para trabalhar com Rails, mas não funciona tão bem assim por que o eclipse começa a marcar como erros os locais onde existe código Ruby no meio do HTML.

Alem de Ruby o DLTK vem de fabrica com suporte a Tcl/TK, Javascript e tem um tutorial do tipo “faça você mesmo”, para que você crie uma IDE para Python usando o DLTK …

Business Intelligence and Reporting Tools (BIRT)

O BIRT é o “gerador de relatórios” para o Eclipse, eu testei ele, fiz algumas palestras sobre ele, utilizei em clientes e achei espetacular …
Nesta nova versão, para mim, a melhor novidade foi o suporte a crosstables, mas a performance melhorou muito também …


Bom, eu não sou o maior expert em Eclipse do planeta, mas ja uso a ferramenta a algum tempo, e o Eclipse é o culpado por eu não conseguir aproveitar a licensa do IntelliJ IDEA que eu ganhei de gratis …
Mesmo eu sabendo de coisas que o IDEA faz que o eclipse não faz, e que facilitam muito a vida, eu não consigo me acostumar com outra IDE sem um esforço consideravel …
Então, recomendo que vocês pelo menos testem esta nova versão do Eclipse, esta muito bom mesmo …

PS.: acho que este review vale uma das camisetas, pena que acho pouco provável ganhar a jaqueta hehehe :D

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Duvidas sobre funcionalidade do blog

Vocês ja chegaram a utilizar a pesquisa do blog?
preferem esta busca do wordpress ou a busca do google?

Eu cheguei a colocar a busca do google um tempo aqui no blog, mas achei que esta do wordpress funcionava melhor para o blog (pelo menos nos testes que eu fix), mas como quem usa (pelo menos de vez em quando :D ) são vocês, queria saber o que vocês preferem …

Valeus …
PS.: a do wordpress é a que fica no alto a direita …
a do google é esta a baixo …

Google



Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Dicas rapidas de Ruby para quem estiver iniciando como eu

Apenas algumas dicas rápidas de Ruby para quem estiver iniciando como eu …
Para quem ja conhece isto pode parecer básico demais, mas para mim foram algumas horas perdidas …

Primeiro, a biblioteca nativa do ruby resolv.rb esta quebrada, ela serve para consultar DNS, mas a única coisa que funciona é busca por registros do tipo “A” mas eu precisava buscar registros do tipo MX.

Perdi algum tempo tentando descobrir o que estava errado, mas os meus conhecimentos de ruby ainda não me permitem corrigir a biblioteca padrão …
o código

require 'resolv'
r = Resolv::DNS.new
puts r.getaddress("www.google.com")
r.each_resource("urubatan.com.br", Resolv::DNS::Resource::IN::A) { |mx|
puts mx
}

funciona perfeitamente, mas se você tentar mudar o tipo de registro para Resolv::DNS::Resource::MX vai receber um erro muito feio, parecido com isto:

/usr/lib/ruby/1.8/resolv.rb:1171:in `pack': can't convert nil into Integer (TypeError)
        from /usr/lib/ruby/1.8/resolv.rb:1171:in `put_pack'
        from /usr/lib/ruby/1.8/resolv.rb:1142:in `encode'
        from /usr/lib/ruby/1.8/resolv.rb:1139:in `each'
        from /usr/lib/ruby/1.8/resolv.rb:1139:in `encode'
        from /usr/lib/ruby/1.8/resolv.rb:1159:in `initialize'
        from /usr/lib/ruby/1.8/resolv.rb:1125:in `new'
        from /usr/lib/ruby/1.8/resolv.rb:1125:in `encode'
        from /usr/lib/ruby/1.8/resolv.rb:652:in `sender'
         ... 6 levels...
        from /usr/lib/ruby/1.8/resolv.rb:868:in `each'
        from /usr/lib/ruby/1.8/resolv.rb:868:in `resolv'
        from /usr/lib/ruby/1.8/resolv.rb:470:in `each_resource'
        from teste.rb:4

Não consegui solucionar isto com esta biblioteca, mas encontrei uma implementação da biblioteca Net::DNS do perl para Rby que funciona muito bem …
para instalar a mesma, basta digitar:
gem install net-dns

Ai, se você esta também começando com ruby, e tentar executar o código:

require 'net/dns/resolver'
res = Net::DNS::Resolver.new(:defname => false, :retry => 2)
["urubatan.com.br","usiinformatica.com.br","google.com","hp.com"].each {|domain|
ns_req = res.query(domain, Net::DNS::MX);
ns_req.each_mx { |pref,exc|
puts "#{pref} #{exc} - for #{domain}"
}
}

Vai ter mais um problema, o interpretador vai dizer que não encontra o arquivo net/dns/resolver
Eu pesquisei um pouco e descobri que poderia setar a variável de ambiente RUBYLIB para o diretório da biblioteca assim:
export RUBYLIB=/var/lib/gems/1.8/gems/net-dns-0.4/lib
Passou a funcionar, mas isto não é nada prático ja que seria necessário para cada gem instalada …
Encontrei duas possíveis soluções …
a primeira é com outra variável de ambiente:
export RUBYOPT=rubygems
que faz o ruby incluir todas as gems no path de bibliotecas automagicamente …
Mas e se isto não for possível por qualquer motivo?
Ou então se você quiser tornar mais fácil a instalação do seu sistema?
Como incluir isto no próprio sistema?

Bom alguem vai dizer que bastaria adicionar no próprio programa a linha:

ENV['RUBYLIB']='/var/lib/gems/1.8/gems/net-dns-0.4/lib'

Mas isto também não é pratico, pois o seu programa ficaria preso ao caminho das bibliotecas no sistema operacional …
Ou então poderia tentar a solução:

ENV['RUBYOPT']='rubygems'

O que ja seria uma boa solução, mas não tão boa, pelo menos na minha opinião …
Quanto apenas, adicionar na primeira linha do seu programa:
require ‘rubygems’
que ja resolve o problema, de uma forma muito mais elegante :D


por tanto, a versão final do meu “consultador de registros MX para DNS” ficou assim:

require 'rubygems'
require 'net/dns/resolver'
res = Net::DNS::Resolver.new(:defname => false, :retry => 2)
["urubatan.com.br","usiinformatica.com.br","google.com","hp.com"].each {|domain|
ns_req = res.query(domain, Net::DNS::MX);
ns_req.each_mx { |pref,exc|
puts "#{pref} #{exc} - for #{domain}"
}
}

No final, eu não arrumei a biblioteca padrão, pode ser que eu faça isto em algum momento, o que é bem provável, ja que a performance dela é muito superior a Net::DNS, mas isto ja faz tudo funcionar por enquanto :D
Agora, uma perguntinha para se alguém quiser ajudar este que vos escreve a não perder muito tempo :D Existe em ruby algo parecido com um LRUMap?
O que eu quero é um mapa para guardar os domínios consultados em cache, para contornar o probleminha de performance desta biblioteca Net::DNS :D Mas quero que o mapa tenha um tamanho máximo, e que fiquem no mapa os últimos X itens utilizados …

Valeus galera, e espero que este post poupe algumas horas de alguns de vocês pelo menos …

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Me ajuda a usar um framework? qual? qualquer um! (One Framework to Rule Them All)

Parece brincadeira, mas não é …
E não foi uma vez só que vi alguem perguntando, se não exatamente com estas palavras, coisa bem próxima, ou então escolhendo todos os frameworks que serão utilizados, antes de ter noção de qual vai ser a aplicação a ser desenvolvida …
Mas deem uma olhadinha nesta pergunta no GUJ que é o motivo principal deste post …

A não ser que eu esteja muito errado, tanto Frameworks quanto Design Patterns (não, Framework != Design Pattern) são criados para solucionar algum tipo de problema (normalmente 1 Design Pattern para 1 problema, ou um framework para uma gama de problemas, ja que normalmente um framework utiliza diversos Patterns).

Acho que uma boa analogia sobre isto seria o seguinte:
Alguem que quer aprender a caçar (não interessa o que), vai numa loja e resolve que quer comprar uma arma.
Chega para o vendedor e diz:
- O senhor pode me vender uma arma por favor?
- Claro, que arma o senhor quer?
- Qualquer uma … é que eu vou aprender a caçar …
- Ahh, ok, mas o senhor vai caçar o que?
- Eu ainda não sei, só quero aprender a caçar alguma coisa que voe …
Neste ponto se o vendedor for uma pessoa bem intencionada, ele pode dizer que o cara tem que se decidir primeiro, ou então o vendedor pode pensar apenas na comissão, e vender uma 12 cano duplo, e uma caixa de munição, mas balas, e não cartuchos) pro cliente.
Imaginem a segunda opção, o cara comprou uma 12 cano duplo, e foi tentar caçar, mas no lugar onde ele foi caçar, só tinha pombos …
Cada tiro que o cara dava em um pombo, e conseguia acertar, ele simplesmente desmanchava o pombo …

ou outra situação, o vendedor vendeu uma espingarda de chumbinho, por que achou que o cliente era burro demais para usar uma arma de verdade …
Ai o cara vai caçar, e resolve que quer caçar gansos …
Ele até consegue acertar alguns tiros, mas a arma dele não mata os gansos, apenas machuca os mesmos que continuam voando …

é a mesma coisa com java, imagina se respondem pro maluco que queria aprender a usar qualquer framework, que ele deve aprender a utilizar o JBoss Rules, que é um excelente framework para interpretação e execução de regras …
Ai uma semana depois, o cara achando que ja sabe usar o JBoss Rules, resolve que quer fazer uma aplicação web …
não vai funcionar … o framework que ele aprendeu não serve para o que ele quer …
E neste caso não se encaixa nem aquela famosa frase: Para quem só conhece martelo, parafuso parece prego.

E o pior de tudo isto, é que não é apenas um cara que esta começando agora que faz algo do tipo “Quero usar um framework, qualquer um!”.
Quantas empresas que vocês ja ouviram falar que possuem o framework da empresa, e que utilizam aquele framework para toda e qualquer cosia …
Quantos projetos vocês ja viram que nem acesso a banco de dados usa, e mesmo assim tem o jar do hibernate junto? (Este exemplo se não me engano o Philip Calçado usou em um topico do GUJ esta semana).

E pior que isto, normalmente quando se define este “framework da empresa” tentando resolver todos os possíveis problemas da humanidade (mesmo os que ainda não existem), os funcionários recebem um treinamento básico nas bibliotecas e frameworks que fazem parte daquele mega framework da empresa.
Começam a utilizar, e normalmente não sabem exatamente como funciona nenhuma das partes daquele elefante branco.

não seria mais produtivo e mais barato para a empresa, e principalmente para quem esta aprendendo por conta, decidir:
ahh, eu quero fazer X, como é que eu faço X?

Sim, mas neste caso a empresa precisaria ter sempre alguem que conhecesse muito bem a tecnologia a disposição, não poderia ter uma solução padrão …

Eu acho que a próxima vez que eu ouvir a desculpa da linha de cima, eu vou perguntar se a pessoa consegue jogar “Ping-Pong” com uma raquete de tênis …

O pior na minha opinião, é que as mesmas empresas que procuram a abordagem “One framework to rule them all”, são as que procuram montar a tal da fabrica de software, dizendo que trabalham com RUP, ou algum processo proprio derivado do RUP, mas que na verdade é um Waterfall com “nome bonitinho terminado em UP” …


E o que faz com que seja mais difícil para mim entender, o por que de acharem que podem usar um martelo para colocar um parafuso na parede, é que desde o começo, quando eu iniciei em desenvolvimento, que eu disse que programava em Delphi, Quando me disseram para criar uma biblioteca de componentes, eu ja sabia que não era igual a arrastar componentes prontos no formulário, então eu fui no livro procurar “Como é que eu faço componentes?”

Ou seja, para mim ja parecia óbvio que seria uma solução para cada tipo de problema …
Então, alguem pode por favor, quando estiver sem nada melhor para fazer, tentar me explicar, por que alguem que se diz trabalhar com informática, ou que quer trabalhar com informática, acha que existe uma solução para todos os problemas do mundo?

Valeus …


PS.: isto me lembrou do senhor dos anéis …

        Three Frameworks for the MVC under the web,
        Seven for the ORM in their data bases,
        Nine for AOP doomed to die,
        One for the JCP on his comunity process …

Mas o que as empresas realmente querem é ter:

        One Framework to rule them all,
        One Framework to find them,
        One Framework to bring them into the darkness and bind them

(ahh, fala sério, até que este post não terminou tão mal :D )

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Uma verdade Inconveniente


Acabei de assistir o documentário do Al Gore: Uma verdade Inconveniente
Recomendo a todos que assistam, ele é ao mesmo tempo impressionante e assustador …
Se não começarmos agora a fazer alguma coisa para impedir, ou pelo menos minimizar o aquecimento global, pode ser tarde demais, e diferente do que muitos pensam, não serão os nossos netos que irão sofrer as consequências, elas ja estão aparecendo e vão ficar muito piores enquanto nos ainda estamos vivos …

Mesmo que fossem apenas os nossos netos, não justificaria nós não fazermos nada …

Então, por favor, cada um comece a fazer a sua parte … Read the rest of this entry »

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Faça uma boa ação e libera um pouco de espaço em casa (Doação de computadores)

Bom, qual o Nerd que não tem um computador em casa mais velho? aquele que vocês nem usam mais …
Se você é um dos que não sabia mais o que fazer com aquele monte de tranqueira, tenho uma dica …
Libere espaço em casa e ajude a quem precisa.
O computador que “não serve para nada” na mão de um Nerd, Geek, Programador, Usuário Avançado, ou o nome que você preferir, pode ajudar bastante alguma entidade.

A fundação Pensamento Digital com o apois de diversas empresas, aceita doações de computadores usados (Pentium 100+), monitores, teclados, mouses e cabos diversos, arruma o que precisar, e doa para entidades sem fins lucrativos, focadas na inclusão digital de comunidades de baixa renda.

Doando seu computador velho, cabos, teclados, mouses, …
Você ainda ganha um recibo para tentar abater isto do imposto de renda :D
Por tanto, ajude a quem precisa, faça uma boa ação, e de quebra, descubra que a sua casa/quarto/garagem/… tem muito mais espaço do que você lembrava :D
E se possível, ajude a divulgar o projeto.

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Cancelamento das minhas palestras no Just Java 2007

Como eu falei aqui, a data do Just Java 2007 foi alterada …
Para não causar confusão na empresa em que estou trabalhando, que ja havia me liberado para a primeira data do evento, eu achei melhor não pedir novamente liberação para a segunda data …
Então, infelizmente este ano, eu não irei mais palestrar no JustJava 2007.

Peço desculpas a quem queria assistir as minhas palestras.

Mas eu ainda estarei palestrando no Web Mobile Tech Week 2007, então espero ver alguns de vocês por la …

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Feliz dia do amigo!

Bom, pelo que diz a minha caixa de e-mail, e o radio pela manha, hoje é dia do amigo.
Então, a todos os que passam por aqui de vez em quando, e principalmente os que passam aqui mais que uma vez por ano :D

Feliz dia do amigo!

Abraço galera, e muito obrigado a todos os que tem paciência para ler o que eu escrevo por aqui, e principalmente aos que comentam alguma coisa de vez em quando :D

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Quase Off: Quem quer trabalhar em Porto Alegre?

Bom, a empresa em que eu trabalho esta contratando (quase sempre :D ), e com uma grande diferença da maior parte do pessoal desesperado por ai, que precisa desesperadamente de pessoas altamente experientes com conhecimento em todos os frameworks da face da terra …
O que precisamos é de Juniors:

  • Precisa conhecer java
  • Ter uma boa noção de Java EE
  • Muita vontade
  • Precisa no minimo ler em ingles sem problemas
  • É desejável algum tempo de experiência, mas quem tiver muito tempo de experiência não vai se interessar, pois procuramos Juniors, por salário de Junior :D

As vagas são para Porto Alegre.

Interessados, deixar um comentário aqui neste post que eu entro em contato.
Não esqueça de preencher o campo e-mail com um e-mail válido.

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Mundo Java no 24

É eu sei que a noticia esta um pouco atrasada, mas a revista MundoJava no 24 já esta nas bancas …

E nesta edição, tem um artigo na sessão “Made In Brazil”, chamado: Produtividade com o Spring-Annotation
Escrito por este que vos escreve :D Então, passem na banca mais próxima e comprem a revista :D Dúvidas e sugestões sobre o artigo, por e-mail ou comentário aqui neste post mesmo …

Além do: Produtividade com Spring-Annotation tem mais um monte de artigos bastante interessantes na revista …

Jogos 3D em Java na Prática
Desenvolva uma corrida off-road completa, com física realista
e gráficos detalhados, usando
JMonkeyEngine.
JavaFX
Aprenda sobre a tecnologia que a Sun diz ser a solução
definitiva para interfaces gráficas em Java para desktop e
dispositivos móveis.
Invertendo os Valores ? O Servidor Chamando seus
Clientes
Aprenda como um servidor de
aplicações pode notificar seus clientes utilizando JMS e RMI
Callback.
Testes de Unidade para Camadas de Persistência no
Mundo Real

Aprenda como criar testes de
unidade para a camada de persistência de suas aplicações utilizando
o framework DbUnit.
Mineração de Dados em Java: Weka
Aprenda como embutir algoritmos de mineração de dados em suas
aplicações em Java.
Jogo Rápido
Acentuação em
AJAX, a classe Example do Hibernate e como descobrir quem está
chamando o seu método.
Made in Brazil: Produtividade com o
Spring-Annotation

Como ser produtivo
desenvolvendo aplicações Java EE diminuindo a quantidade de
configurações necessárias, e colocando-as no lugar
correto.
Professor J: Expressões Regulares em
Java

Aprenda a utilizar expressões
regulares e como elas podem facilitar bastante a sua vida em uma
aplicação Java.
Tendências em Foco: Correndo em direção ao mundo
SOA

Sua empresa está preparada para SOA?
Veja o que é necessário para entrar nesse mundo que cresce a cada
dia.

PS.: só não se assustem com a minha foto :D

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

JSF 1.2 - Mais uma Implementação disponível - MyFaces 1.2.0

Acabou de ser liberada mais uma versão do Apache MyFaces, desta vez uma versão compatível com JSF 1.2.
Sim eu sei que todo mundo já noticiou isto em algum lugar, mas por favor, sigam lendo que tem algumas observações inéditas neste post também …

Quem quiser baixar os binários ou o código fonte, esta tudo disponível neste link.

Quem usa Maven os jars e os fontes estão disponíveis no repositório central sob o grupo: org.apache.myfaces.core

O Release Note esta disponível neste link.

Complementando a noticia do TSS:
O Tomahawk, Tobago, Trinidad e Orchestra funcionam sem problemas nesta nova versão, assim como ja funcionavam com a JSF-RI 1.2.x …
Lógico que muita coisa que era obrigatória do Tomahawk antes, agora é dispensável, como o t:updateActionListener não é mais necessário, pois a mesma funcionalidade esta incluída no core da JSF 1.2.

Agora o MyFaces 1.2 já nasceu com alguns problemas, como por exemplo, o que comentei no post sobre JSF + DI, funciona meia boca no MyFaces …
Ja que o MyFaces só possui um adaptador de injeção de dependências para o Tomcat, ou seja, a única coisa que funciona é @Resource com o name especificado.
Mesmo se a aplicação estiver rodando em um container Java EE full, o adaptador até suporta as anotações @Ejb, @PersistenceContext, … mas sempre faz uma busca JNDI pelo atributo name, ou seja, é praticamente inútil, ja que não é assim que as coisas funcionam …

um @EJB por exemplo, deveria considerar o nome da classe do EJB, ou seja, o tipo do atributo e não o parametro name do @EJB apenas …
o @PersistenceContext deveria considerar o unitName caso especificado, …

não, eu não vou ficar só falando, ja estou abrindo uma issue, e caso tenha tempo envio um patch …

E isto foi o que eu encontrei de problemas até o momento apenas, se alguem encontrar mais, avise por aqui ou abra uma issue no JIRA do MyFaces

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Orkut do Open Source :D

Acabei de ver este post do Jeveaux, sobre o Ohloh, o nome é bastante extranho e não diz muita coisa, mas eu achei a idéia bastante interessante …
Ele é praticamente um Orkut de projetos de software, não obrigatoriamente apenas Open SOurce, ja que você pode também cadastrar projetos fechados, mas praticamente todos os projetos la são open source …
O Ohloh procura as suas contribuições aos projetos automaticamente buscando nos commits de CVS ou SVN do projeto (não lembro se suporta outros sistemas de controle de versão), e caso você tenha contribuido de outra forma ao projeto é só avisar ao Ohloh :D Eu gostei da idéia, e eles ainda ajudam a poluir mais um pouquinho o seu blog ou site pessoal, com este badge ai em baixo :D

ohloh profile for urubatan

Achei a idéia espetacular, mas eles aparentemente tem pouca divulgação, então, tire uns 5 minutos e cadastre os seus projetos por la :D

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Data do Just Java 2007 alterada (seguindo o exemplo do ano passado)

Apenas propagando a noticia, o Just Java 2007 não ocorrera mais nos dias 2, 3 e 4 de agosto como estava programado.
PS.: Vicente, da próxima vez eu presto mais atenção quando tu falar que um negócio que aconteceu ano passado vai se repetir novamente.

Eu sei que é complicado organizar um evento, principalmente do tamanho do Just Java …
Em eventos menores como os que realizamos no RSJUG as coisas complicam, da trabalho, …
O problema de ficar mudando de datas assim, principalmente pelo segundo ano consecutivo é que acaba queimando o nome do evento …
No ano passado o evento ja alterou a data pelo menos 2 vezes, se não me engano foram 3. Agora este ano começando a fazer a mesma coisa …

E fica pior ainda para o JustJava, pois boa parte dos participantes não é de São Paulo, como é o meu caso, é um evento que ocorre durante a semana, pro tanto tem que pedir liberação no trabalho, para isto a empresa tem que se agendar …
Eu ja tinha até conseguido patrocínio para as passagens de avião que seriam o meu maior custo, e eu não achei legal a idéia de pagar para ir fazer uma palestra, agora vou ter que chegar com cara de bobo, para a empresa que pagou as passagens (Agradeço muito a Conecta IT pelo patrocínio), para dizer que mudou a data do evento e que temos que remarcar as passagens …

Acho que antes de marcar/divulgar a data de um evento deste porte, as coisas ja tem que estar tudo confirmadas.

Bom, desculpem o desabafo, mas sinceramente, fiquei bastante desapontado com a alteração de datas, principalmente no segundo ano consecutivo.

Segue a cópia do e-mail que recebi avisando da alteração de datas.

Prezado Sr. CONFERENCISTA,

A SUCESU-SP – Sociedade de Usuários de Informática e
Telecomunicações de São Paulo e a Comissão Organizadora
SOU JAVA, do Congresso JUSTJAVA 2007, comunica a V. Sa.
que a data prevista para realização do Evento em questão, foi
alterada, com a finalidade de melhorar o evento para congressistas,
palestrantes e patrocinadores.

Pedimos considerar os dias 03, 04 e 05 de OUTUBRO de 2007
que certamente nos trará melhores frutos para o evento.

De forma que ainda assim, gostaríamos muito de contar com
sua valiosa participação.

Desde já agradecemos sua compreensão e colaboração.

A disposição para quaisquer esclarecimentos que se façam
necessários.

PS.: vou falar com o pessoal da Conecta IT para ver o que eles acham, mas estou pensando em cancelar as minhas palestras para o evento.

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Quatro dias de Ruby On Rails - Quarto e último dia

Quatro dias de Ruby On Rails - Primeiro dia, Quatro dias de Ruby On Rails - Segundo dia,

Quatro dias de Ruby On Rails - Terceiro Dia

Vamos começar agora o quarto e último dia de nosso tutorial …

A tela de Notas

Claro que o Scaffold daentidade Notes, ja cria uma estrutura completa CRUD para as notas, mas não queremos que o usuário acesse isto diretamente.

Queremos poder linkar uma nota a uma tarefa ja existente.

E caso ja exista uma nota para esta tarefa, precisamos poder editar ou remove-la.

Primeiro, vamos dar uma olhada novamente na tela de edição de tarefas. Atualmente ela ja ajusta os botões caso exista ou não uma nota para esta tarefa.

<% @heading = "Edit To Do" %>
<%= error_messages_for 'item' %>
<%= start_form_tag :action => 'update', :id => @item %>
<table>
<%= render_partial "form" %>
<tr>
<td><b>Notes: </b></td>
<% if @item.note_id.nil? %>
<td>None</td>
<td><%= link_to_image "note", :controller => "notes", :action => "new", :id => @item.id %></td>
<% else %>
<td><%=h @item.note.more_notes %></td>
<td><%= link_to_image "edit_button", :controller => "notes", :action => "edit", :id => @item.note_id %></td>
<td><%= link_to_image "delete_button", {:controller => "notes", :action => "destroy", :id => @item.note_id }, :confirm => "Are you sure you want to delete this note?" %></td>
<% end %>
</tr>
</table>
<hr />
<%= submit_tag "Save" %>
<%= submit_tag "Cancel", {:type => 'button', :onClick=>"parent.location='" + url_for( :action => 'list' ) + "'" } %>
<%= end_form_tag %>

A tela de edição de notas.

Editar uma nota é bastante fácil, segue o template:

<% @heading = "Edit Note" %>
<%= start_form_tag :action => 'update', :id => @note %>
<%= render_partial "form" %>
<%= submit_tag "Save" %>
<%= submit_tag "Cancel", {:type => 'button', :onClick=>"parent.location='" + url_for( :controller => 'items', :action => 'list' ) + "'" } %>
<%= end_form_tag %>

E o Partial Correspondente:

<table>
<tr>
<td><label for="note_more_notes">More notes</label></td>
<td><%= text_area 'note', 'more_notes' %></td>
</tr>
</table>

Assim que o update ou destroy de uma nota é completado, precisamos voltar a tela de listagem de tarefas.

def update
@note = Note.find(params[:id])
if @note.update_attributes(params[:note])
flash[:notice] = 'Note was successfully updated.'
redirect_to :controller => 'items', :action => 'list'
else
render :action => 'edit'
end
end
def destroy
Note.find(params[:id]).destroy
redirect_to :controller => 'items', :action => 'list'
end

Lembrem-se que as regras de integridade referencial, ja definidas no model e estas vão garantir que caso removamos uma nota, as referencias para a mesma serão removidas automaticamente.

A tela de criação de Notas.

Criar uma nova nota é um pouco mais complicado. O que queremos fazer é:

  • Armazenar a nota na tabela notes.
  • Localizar o ID da nota recem criada.
  • Armazenar o ID da nota recem criada no campo note_id da tarefa associada.

Variáveis de sessão são uma ótima forma de armazenar valores entre telas, vamos utilizar esta abordagem para armazenar o ID da tarefa associada a nova nota.

Documentação: ActionController::Base

Primeiro, quando clicamos no link para criar uma nova nota, nos passamos o ID da tarefa associada:

app\views\items\edit.rhtml (excerpt)

<td><%= link_to_image "note", :controller => "notes", :action => "new", :id => @item.id %></td>

O método “new” no controller de notas armazena este ID na sessão:

app\controllers\notes_controller.rb (excerpt)

def new
@session[:item_id] = @params[:id]
@note = Note.new
end

O template de “New Notes” não tem nenhuma novidade:

<% @heading = "New Note" %>
<%= start_form_tag :action => 'create' %>
<%= render_partial "form" %>
<%= submit_tag "Save" %>
<%= submit_tag "Cancel", {:type => 'button', :onClick=>"parent.location='" + url_for(:controller => 'items', :action => 'list' ) + "'" } %>
<%= end_form_tag %>

O método “create” pega o ID novamente da sessão, utiliza o mesmo para buscar a tarefa do banco e atualizar o campo “note_id” na tabela items, e novamente redireciona a tela para a listagem de tarefas.

app\controllers\notes_controller.rb (excerpt)

def create
@note = Note.new(@params[:note])
if @note.save
flash['notice'] = 'Note was successfully created.'
@item = Item.find(@session[:item_id])
@item.update_attribute(:note_id, @note.id)
redirect_to :controller => 'items', :action => 'list'
else
render_action 'new'
end
end

Algumas alterações na tela de categorias.

Não sobrou muita coisa para fazer no sistema agora, alem de pequenos ajustes nas telas criadas no primeiro dia para que tenham o mesmo esquema de navegação por botões.

app\views\categories\list.rhtml

<% @heading = "Categories" %>
<form action="/categories/new" method="post">
<table>
<tr>
<th>Category</th>
<th>Created</th>
<th>Updated</th>
</tr>
<% for category in @categories %>
<tr>
<td><%=h category["category"] %></td>
<td><%= category["created_on"].strftime("%I:%M %p %d-%b-%y") %></td>
<td><%= category["updated_on"].strftime("%I:%M %p %d-%b-%y") %></td>
<td><%= link_to_image 'edit', { :action => 'edit', :id => category.id } %></td>
<td><%= link_to_image 'delete', { :action => 'destroy', :id => category.id },:confirm => 'Are you sure you want to delete this category?' %></td>
</tr>
<% end %>
</table>
<hr />
<input type="submit" value="New Category..." />
<input type="button" value="To Dos" onClick="parent.location='<%= url_for(:controller => 'items', :action => 'list' ) %>'">
</form>

app\views\categories\new.rhtml

<% @heading = "Add new Category" %>
<%= error_messages_for 'category' %>
<%= start_form_tag :action => 'create' %>
<%= render_partial "form" %>
<hr />
<input type="submit" value="Save" />
<input type="button" value="Cancel" onClick="parent.location='<%= url_for( :action=> 'list' ) %>'">
<%= end_form_tag %>

app\views\categories\edit.rhtml

<% @heading = "Rename Category" %>
<%= error_messages_for 'category' %>
<%= start_form_tag :action => 'update', :id => @category %>
<%= render_partial "form" %>
<hr />
<input type="submit" value="Update" />
<input type="button" value="Cancel" onClick="parent.location='<%= url_for( :action=> 'list' ) %>'">
<%= end_form_tag %>

Navegação pelo sistema

O grafo final de navegação pelo sistema é mostrado na imagem a baixo. Qualquer código redundante gerado pelo scaffold pode ser removido sem problemas (por exemplo show.rhtml). Esta é a beleza do scaffold, ele não te custa nada, então pode ser simplesmente excluido quando não for necessário.

Configurando a página inicial da aplicação.

Primeiro renomeie o arquivo pub.ic/index.html para public/index.html.orig

E edite o arquivo:

config\routes.rb (excerpt)

map.connect '', :controller => 'items'

Pronto, agora a tela inicial da aplicação é a listagem de tarefas.


Então era isto, fica faltando apenas o último post com os apendices.
Se tiverem duvidas é só entrar em contato :D

PS.: agradeço se os leitores que estão gostando do tutorial colocarem links em seus blogs para o tutorial, indicando para seus amigos.

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Code Contest - Valendo uma cortesia para o Just Java 2007

Code Contest

Bom, a culpa deste code contest é do bruno que deu a idéia neste post.
- As regras são as seguintes, você pode escrever o código em qualquer linguagem
- Pode utilizar as bibliotecas que quiser
- Ganha o programa que resolver o problema mais rápido
- Em caso de empate, ganha a primeira submissão
- O programa precisa ter definidas como constantes as dicas que serão a entrada para o algoritmo para resolução do problema.
- A saída do programa precisa ser a lista com todas as características de todas as 5 casas

E qual o problema?
Resolver o Teste de QI do Einstein via programação :D Read the rest of this entry »

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!