Curso: Spring Framework 2.5 | Conhecendo e utilizando – Quarta turma
Data: 26 de janeiro de 2008 | Duração: 08 horas
Instrutor: Mauro do Valle
Investimento: R$ 380,00 | consulte no link saiba mais opções de desconto e parcelamento
Apresentação: O curso objetiva capacitar o aluno a entender e utilizar as funcionalidades deste conjunto de componentes, buscando aumentar a produtividade e a qualidade no desenvolvimento de aplicações JavaEE. Os participantes terão contato com os recursos avançados, apresentados na última versão do framework. Saiba mais no site www.techoffice.com.br
Curso: Ruby on Rails – Segunda turma
Data: De 11 a 15 de fevereiro de 2008 | Noite Duração: 20 horas
Instrutor: Urubatan Jardim
Investimento: R$ 520,00 | consulte no link saiba mais opções de desconto e parcelamento
Apresentação: O curso objetiva habilitar o aluno a desenvolver aplicações WEB utilizando o Ruby On Rails, e orientar sobre onde procurar soluções para acelerar o desenvolvimento e adicionar recursos a aplicação desenvolvida. Durante o curso será desenvolvida uma loja de DVDs como exercício e exemplo para aplicações futuras. Saiba mais no site www.techoffice.com.br
Tags: rails, Ruby, spring, springframework, techoffice, Trabalho
A Tech Office esta com mais dois cursos abertos, um agora em dezembro e um em janeiro.
Spring Framework 2.0 | 4ª. edição
Atendendo a pedidos, a Tech Office It promove no dia 15 de dezembro, em Porto Alegre, a quarta edição do curso express Spring Framework 2.0, voltado a programadores Java. Esta edição, servirá como introdução a uma abordagem mais detalhada de como utilizar este conjunto de componentes para facilitar o desenvolvimento de aplicações JavaEE. Durante o curso, será desenvolvida uma livraria virtual que poderá ser utilizada posteriormente como exemplo ou como base para o desenvolvimento de uma nova aplicação. Com carga horária de 8 horas/aula, o treinamento será 100% prático e ministrado em laboratório pelo consultor Mauro do Valle.
Ruby On Rails | 2ª. Turma
E para entrar o ano de 2008 com todo o gás, a Tech Office It promove de 14 a 18 de janeiro, a segunda turma do curso Ruby on Rails com 20 horas/aula presenciais, voltado a desenvolvedores Ruby que desejam conhecer mais sobre Rails e desenvolvedores de outras linguagens que tenham interesse em ingressar no RoR. O curso objetiva auxiliar o aluno a entender o Ruby on Rails e possibilitar a criação de aplicações o utilizando, além de expor suas vantagens e limitações. Como todos os cursos presenciais da Tech Office It, com alunos desenvolverão exemplos que servirão como base para aplicações futuras.
Para informações e inscrições sobre os cursos, acesse www.techoffice.com.br ou envie um e-mail para cursos@techoffice.com.br, além do telefone 51.3012.8241.
Mas se vocês quiserem se inscrever para o curso de Spring Framework é bom correr, por que o curso vai ser em uma semana
English version here
Bom, integração contínua acho que todos concordam que é uma necessidade em qualquer projeto de software, mas a integração contínua assíncrona utilizada normalmente tem alguns problemas, como por exemplo:
Eu não estou dizendo que não é interessante existir um servidor de integração, é interessante para que todos os envolvidos no projeto tenham sempre acesso aos relatórios e a última versão do sistema compilado, mas não acho que deva ser dele a tarefa de integrar o sistema.
Ou seja, o que antigamente era o servidor de integração, agora passa a ser apenas um servidor de builds, e gerador de relatórios sobre o código fonte e progresso do projeto.
O ideal é que o desenvolvedor, durante o processo de commit, seja obrigado a executar todos os testes, e este commit só ser realmente executado se todos os testes passarem.
Claro que isto pode ser melhorado, adicionando ainda algumas restrições, por exemplo, exigir uma cobertura de testes mínima, mas no meu caso, eu desenvolvi esta task do Rake para um projeto em que estou trabalhando sozinho, e estou utilizando o GIT para controle de versões (escreverei um post sobre o GIT ainda esta semana se der tempo), e estou utilizando integração sincrona também em alguns projetos com Java, em outra oportunidade escrevo sobre o processo com Java.
Estou adotando esta prática de integração sincrona para todos os novos projetos da minha empresa e dos clientes que aceitam a idéia.
Mas voltando ao assunto, é bastante fácil implementar isto em um projeto Rails, basta seguir estes passos:
1 – criar um arquivo de nome ‘git.rake’ dentro do diretório lib/tasks com o seguinte conteúdo:
namespace :git do desc "Update every thing before the tests" task :update do puts "Lets update it all, but we are using GIT so we already have the latest source for this repo" end desc "Run all tests, if all are OK, then commit every thing to the git local repository" task :commit => [:update, :test] do puts "No test failures, now we can commit it all" exec 'git commit -a' end end
Como podem ver esta task do Rake é bem simples, e com certeza isto vai aumentar muito a qualidade do projeto!
2 – sempre ao final de uma tarefa, em vez de executar o comando “git commit -a”, executar o comando: “rake git:update”
Só isto, a partir de agora você esta utilizando integração continua sincrona
Claro que esta task do Rake pode ser melhorada ainda, pode ser configurado por exemplo um pull de um repositório central, ou um update de um subversion ou qualquer coisa do gênero, mas acho que ja serve como exemplo para quem quiser começar a utilizar integração sincrona.
Se todos os testes passarem, o GIT vai abrir o VIM para que o desenvolvedor edite a mensagem de commit, depois da mensagem editada o código alterado é comitado sem problemas e sem medo de quebrar o próximo build com tudo integrado.
E vocês, o qu acham deste processo de integração continua? preferem sincrona ou assincrona? por que?
Só para lembrar: Estão abertas as incrições para o curso de Java Server Faces da Tech Office
Tags: Java, produtividade, Ruby, Trabalho
Estão abertas as inscrições para mais uma turma aberta do excelente curso de Java Server Faces da Tech Office!
O curso vai acontecer dia 27/10/2007, ou seja daqui a duas semanas ![]()

Resumo do programa:
O material do curso foi totalmente reescrito e melhorado, isto considerando que o material do último curso já foi bastante elogiado e este esta ainda melhor.
O curso é 100% prático e vamos desenvolver uma loja de musicas durante o curso (exatamente em um curso de 8h), claro que não é um submarino da vida, mas serve como exemplo ou até mesmo como base para continuar o desenvolvimento depois …
Mais informações sobre o curso aqui.
Então o que você esta esperando? clique aqui para se inscrever
E se você procura um curso de Ruby On Rails, JPA + JSP/Servlets + EJB3 ou de Spring Framework, de uma olhada na agenda de treinamentos da Tech Office. (Sim isto mesmo, a data da próxima turma de Ruby On Rails já esta definida
)
Ou seja, quase tudo o que eu preciso em quase todos os lugares que eu estiver (nos outros ainda preciso do note mesmo
)
Se gostaram da dica, é só dar uma passada em PortableApps.com
A página de publicações ja foi atualizada com os exemplos, o passo a passo para fazer o exemplo do mini curso de EJB3 + JPA + JSF funcionar é o seguinte:
Se quiserem mais detalhes é só dar uma olhada no video a baixo …
Acho que era isto, nos próximos dias eu escrevo outros posts detalhando os exemplos …
Tags: Java, Java EE, Spring Framework, Trabalho
Como um bom brasileiro, vou começar reclamando para quem não pode fazer nada a respeito
(Se você também não gosta de lamentações clique aqui)


Eu errei feio e peço desculpas pelo “fiasco” do primeiro mini curso, o que aconteceu foi que eu testei antes de ir para o evento com o banco de dados padrão do netbeans/glassfish e tudo funcionou corretamente, no evento tentando utilizar o MySQL como faço em 99% dos outros projetos sofri com um bug na integração do NetBeans 6.0M10 com o glassfish 2.0 build 53 …
Possivelmente o BUG seja alguma alteração no formato dos arquivos de configuração/deployment do glassfish …
O NetBeans quando gera um jar de um projeto ejb, ele coloca dentro do jar um arquivo META-INF/sun-resources.xml que deveria criar os pools JDBC utilizados pelos EJBs daquele jar, mas a combinação de NetBeans 6.0M10 + esta versão de glassfish, isto não funciona de modo algum, e isto eu não tinha testado, pois fiz os testes com um pool que ja existia e desta forma o NetBeans não tentou criar novamente o pool …
Quando eu informo ao netbeans uma conexão nova, ele deveria criar ela automaticamente no servidor de aplicações, mas parece que a geração do arquivo de configurações do glassfish esta com problemas …
o que o netbeans esta gerando é o código a baixo …
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Resource Definitions //EN" "http://www.sun.com/software/appserver/dtds/sun-resources_1_3.dtd">
<resources>
<jdbc-resource enabled="true" jndi-name="devmedia" object-type="user" pool-name="mysqlPool"/>
<jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="mysqlPool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false">
<property name="databaseName" value="devmedia"/>
<property name="serverName" value=""/>
<property name="portNumber" value=""/>
<property name="User" value="root"/>
<property name="Password" value="admin"/>
</jdbc-connection-pool>
</resources>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Resource Definitions //EN" "http://www.sun.com/software/appserver/dtds/sun-resources_1_3.dtd">
<resources>
<jdbc-resource enabled="true" jndi-name="devmedia" object-type="user" pool-name="mysqlPool"/>
<jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="mysqlPool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false">
<property name="url" value="jdbc:mysql:///devmedia"/>
<property name="URL" value="jdbc:mysql:///devmedia"/>
<property name="User" value="root"/>
<property name="Password" value="admin"/>
</jdbc-connection-pool>
</resources>
com este código funciona tudo OK …
O que eu fiz em casa que funcionou corretamente?
Tentei rodar o projeto pelo netbeans diversas vezes e não funcionou, então criei o ear pelo netbeans, abri o ear, abri o jar dos EJBs removi o arquivo META-INF/sun-resources.xml, acessei o console de administração do glassfish, criei uma conexão JDBC com as configurações descritas no arquivo acima, criei um JDBC Resource apontando para a conexão criada e nome devmedia.
Fiz o deploy do ear gerado pelo netbeans sem o descritor sun-resources e tudo funcionou (quando tentei fazer o deploy com o descritor ainda no arquivo ele dava o mesmo erro que estava ocorrendo no evento).
Fazendo ainda alguns testes depois, removi a aplicação e os resources JDBC que havia criado no passo anterior, alterei o descritor ao invés de remover ele, e também funcionou.
Por tanto, esta declarado que o problema da aplicação não funcionar foi causado por um BUG no NetBeans que esta criando o descritor de deployment com dados errados.
E a partir de hoje eu vou começar a prestar mais atenção nos avisos que aparecem quando se vai baixar uma versão beta de algum software: Não Utilize em produção!
Ja na última palestra, sobre Desenvolvimento Web com Spring Framework, os problemas começaram com o projetor da sala que só aguentava 800×600 (o da outra sala suportou os 1280×800 do meu notebook, espetacular o projetor), quem é que consegue trabalhar com 800×600?
Depois disto, o eclipse Europa, que não é mais beta, não tinha nada beta instalado, resolveu que iria cair a cada 5 minutos, e considerando o fiasco que eu ja tinha feito na palestra anterior, em que o exemplo não funcionou, eu comecei a ficar desesperado, e agradeço a quem estava na platéia que deve ter visto a minha cara de pânico e disse, por que tu não usa o IDEA?
Abri o IDEA e o pânico aumentou, pois em 800×600 o layout dele não se ajeitava …
Lembrei de remover a barra inferior do KDE e tudo resolvido, IntelliJ IDEA funcionando, consegui fazer o mini curso de desenvolvimento web com spring framework sem maiores problemas …
Os erros que ocorreram eram mais ou menos previstos, pois a idéia era mostrar como fazer uma aplicação do zero, o que pode dar errado, e como procurar soluções …
No final tudo funcionando, clientes sendo cadastrados, layout podre (não sou nenhum designer
)
O único problema foi que devido aos problemas emocionais do Eclipse Europa, a palestra atrasou um pouco e não deu tempo de passar mais com mais detalhes sobre a escrita de testes unitários (tem alguns exemplos aqui para quem quiser se adiantar), mas vou colocar os testes no exemplo que sera disponibilizado hoje a noite aqui no blog.
Lições aprendidas:
Fora isto só posso pedir desculpas novamente a quem estava assistindo a palestra de EJB3 + JPA + JSF, e como prometi para todos hoje a noite os exemplos estarão na página de publicações aqui do blog com um passo a passo de como fazer para funcionarem, ainda vou adicionar alguns exemplos de código e um video provando que o netbeans me sabotou na primeira palestra
PS.: desculpem pelo texto gigantesco, mas eu tinha muita coisa para explicar …
Tags: Eclipse, idea, Java, Java EE, Spring Framework, Trabalho
A Tech Office IT (minha empresa
) estará promovendo o primeiro curso de Ruby On Rails de Porto Alegre no final do mês de setembro.
Serão 20 horas de Ruby On Rails, onde os alunos desenvolverão uma aplicação completa, a aplicação será uma loja de DVDs, todos os conceitos e utilitários serão desenvolvidos a partir desta aplicação.
A aplicação não será toda gerada pelo scaffold, na verdade o comando vai ser utilizado uma única vez para apresenta-lo aos alunos …
Serão desenvolvidos testes antes de cada funcionalidade do sistema, para que o aluno saiba como escrever testes unitários, funcionais e de integração no ambiente do RoR, alguns recursos avançados do rails serão utilizados, sempre focando em DRY e KISS …
Quem ja conhece outra linguagem de programação e não conhece ainda o Ruby não precisa se preocupar, durante o curso será feita também uma introdução a linguagem Ruby, claro que ninguem vai sair um expert em Ruby, mas vai ser o suficiente para sair programando, e sabendo onde procurar mais informações para se aprimorar mais tarde, só é necessário ter conhecimento de lógica de programação e orientação a objetos.
Acho que é uma ótima oportunidade para quem quer aprender RoR ou quer aprimorar os conhecimentos.
Mais detalhes sobre o curso de Ruby On Rails neste link.
Podem fazer perguntas por aqui mesmo, ou usando os dados de contato na release abaixo.
Segue o release oficial
A Tech Office It realiza no período de 24 a 28 de setembro de 2007 em Porto Alegre, o curso presencial Ruby on Rails, voltado a desenvolvedores Ruby que desejam conhecer mais sobre Rails e desenvolvedores de outras linguagens que tenham interesse em ingressar no RoR. O curso objetiva auxiliar o aluno a entender o Ruby on Rails e possibilitar a criação de aplicações o utilizando, além de expor suas vantagens e limitações.
Após o curso o aluno estará apto a desenvolver aplicações WEB utilizando o Ruby On Rails, saberá onde procurar mais recursos para acelerar o desenvolvimento e adicionar recursos na aplicação desenvolvida.
Com carga horária de 20 horas/aula, o treinamento será 100% prático e ministrado em laboratório. Durante o curso, os participantes desenvolverão uma loja de DVDs completa que poderá ser utilizada como exemplo ou como base para o desenvolvimento de uma aplicação mais complexa pós-curso.
Mais informações poderão ser obtidas através do site www.techoffice.com.br ou e-mail contato@techoffice.com.br, além do telefone 51.3012.8241.
Como eu falei aqui, no próximo sábado (01/09/2007) eu estarei ministrando alguns mini cursos no DevMedia TechWeek.
Ocorreram algumas alterações na grade (que ainda não se refletiram no site), alem do mini curso sobre Java EE (JPA e EJB3 + JSF) vou apresentar também o mini curso: Desenvolvendo aplicações Web com o Spring Framework, pois pelo que me avisaram, parece que o palestraste teve alguns problemas de saúde ou algo parecido.
Então, para quem quiser levar um notebook para acompanhar os mini cursos, o ambiente que vou utilizar será o seguinte:
Para ambos os mini cursos: My SQL (Se preferirem uma GUI podem instalar também o MySQL Administrator e o MySQL Query Browser), todos podem ser encontrados em http://www.mysql.org
Não esqueçam de baixar o driver JDBC para o MySQL
Para os mini cursos Java EE: NetBeans 6.0M10 + GlassFish (vocês podem baixar um bundle com a IDE e Servidor de aplicações aqui)
Para o mini curso de desenvolvimento Web com Spring Framework: um servidor Tomcat, ou até mesmo o próprio Glassfish se vocês já tiverem ele instalado e um Eclipse Europa instalado da seguinte forma:
Baixe o Eclipse Classic da página do eclipse (ou deste post), que é o mesmo Eclipse SDK que ja estamos acostumados.
Descompacte ele e abra a IDE, depois disto clique em Help, Software Updates, Find And Install, New Features.
Marcar os update sites do Europa e Eclipse Project, alem de adicionar os seguintes update sites:
Subversive: http://www.polarion.org/projects/subversive/download/1.1/update-site/ (que como eu comentei aqui, esta migrando para um sub projeto do eclipse)
Spring IDE: http://springide.org/updatesite/
Mylyn Extras: http://download.eclipse.org/tools/mylyn/update/e3.3
E marcar as seguintes opções (agrupadas por update site):
Next, Next, Finish …
Se quiserem ja deixar o servidor que vão utilizar configurado fica mais fácil
Fiz este passo a passo pois eu não tinha o Eclipse instalado na minha maquina, pois formatei ela semana passada e só tinha re-instalado o IntelliJ IDEA e achei que os mini cursos seriam mais interessantes em IDEs open source que todos pudessem utilizar ![]()
PS.: sim, eu sei que eu ja tinha um passo a passo para configuração do Eclipse, mas como a cada 2 ou 3 meses eu mudo completamente quais os plugins que eu utilizo, achei que ter o mesmo ambiente iria facilitar a vida de quem quiser acompanhar o desenvolvimento das aplicações no próprio notebook
Como o título já diz: O que você acha de gerar um executável da sua aplicação Ruby On Rails para fazer um demo ou apresentar para um cliente?
Pois é, acabei de descobrir que isto é possível
Para isto vamos precisar das seguintes ferramentas:
Para instalar ambos, basta executar os comandos:
$sudo gem install tar2rubyscript $sudo gem install rubyscript2exe
Para começar, vamos criar uma aplicação RoR, mas para poder carregar tudo junto com o executável, vamos utilizar o banco de dados SQLite.
$rails demo $cd demo $ruby script/server
Acesse com o browser o endereço: http://localhost:3000/ para garantir que esta tudo OK.
$irb
irb(main):005:0> require 'sqlite3'
irb(main):006:0> SQLite3::Database.new("demo_dev.db").execute(
irb(main):007:1* "create table books (id integer primary key, \
irb(main):008:1" title varchar(255), \
irb(main):009:1" author varchar(255));")
E copiaremos o banco criado para as bases de produção e testes:
$cp demo_dev.db demo_test.db $cp demo_dev.db demo_prod.db
$vi config/database.yml
Substituimos o conteúdo com algo parecido com isto:
development: adapter: sqlite3 database: demo_dev.db test: adapter: sqlite3 database: demo_tst.db production: adapter: sqlite3 database: demo_prd.db
Criamos o model e o controller:
$script/generate model Book $script/generate controller Book $vim app/controllers/book_controller.rb
E alteramos o código para algo parecido com isto:
class BookController < ApplicationController scaffold :book end
$script/server
Acesse com o browser o endereço http://localhost:3000/book para ver se esta tudo OK.
Agora a parte nova (fala sério, até o meu gato já sabe criar um CRUD com scaffold
)
O comando Tar2RubyScript cria um pacote para a aplicação, mas quando executado, ele descompacta tudo em um diretório temporário e no final da execução ele limpa o diretório, o que não é exatamente o comportamento esperado, então vamos mover os dados para um local seguro antes da execução …
$vi config.environment.rb
E vamos adicionar o seguinte código no inicio do arquivo:
module Rails
class Configuration
def database_configuration
conf = YAML::load(ERB.new(IO.read(database_configuration_file)).result)
if defined?(TAR2RUBYSCRIPT)
conf.each do |k, v|
if v["adapter"] =~ /^sqlite3/
v["database"] = oldlocation(v["database"]) if v.include?("database")
v["dbfile"] = oldlocation(v["dbfile"]) if v.include?("dbfile")
end
end
end
conf
end
end
end
Isto vai alterar a forma como o rails encontra o banco de dados, que originalmente estava definido assim:
module Rails
class Configuration
def database_configuration
YAML::load(ERB.new(IO.read(database_configuration_file)).result)
end
end
end
O que exatamente foi feito? quando executado um RBA precisa tratar dois diretórios diferentes: o diretório onde aplicação esta sendo executada, e o diretório onde a aplicação esta realmente ( referenciado como oldlocation), o código apresentado altera as configurações do database.yml colocando o caminho completo para o banco de dados e não apenas o nome do arquivo como seria utilizado em uma aplicação normal.
O Tar2RubScript precisa também de um arquivo chamado init.rb que sera o ponto de partida da aplicação, vamos cria-lo com o seguinte conteúdo:
$vi init.rb
at_exit do require "irb" require "drb/acl" require "sqlite3" end load "script/server"
Os ‘require’ adicionados são para facilitar a detecção de quais bibliotecas o programa utiliza, ja que o Rails carrega algumas delas apenas durante a execução do sistema, assim o Tar2RubyScript vai poder incluir estas bibliotecas também no executável gerado.
Agora vamos finalmente empacotar a aplicação:
$cd .. $tar2rubyscript demo $cp demo/demo_* .
Prontinho, ja podemos testar o nosso Ruby Archive
$ruby demo.rb
Pode acessar novamente a aplicação pela URL: http://localhost:3000/book
Criando um executável para levar para o cliente
Criar o executável não é nada complicado, basta executar o comando:
$rubyscript2exe demo.rb
Depois que o rails inicializar, precione CTRL+C e sera criado um executável de nome demo.exe, ou demo_linux no linux que é o meu caso.
Basta copiar o executável e os arquivos de banco de dados para o
Não será necessário chegar no cliente e instalar Ruby, RubyGems, Rails, outros Gems, …
Apenas um executável e alguns arquivos de bancos de dados no seu pendrive e esta tudo pronto para o demo
O que você quer melhor que isto?
Na verdade a única coisa que faltou para mim, foi a possibilidade de no linux gerar um executável windows para facilitar os demos, mas mesmo assim, ja esta mais do que bom
PS.: tirei este passo a passo desta URL, eu fiz alguns ajustes no código e traduzi o texto, o maior ajuste foi a utilização de sqlite3
O ContractJ é um conjunto de: anotações + aspectos + um plugin para o eclipse para facilitar o uso disto, mas pode ser utilizado em qualquer ambiente que tenha suporte ao AspectJ.
A idéia básica de Design By Contract é que seja possível documentar todas as pré condições e pós condições de um método, e a partir desta documentação, caso seja passado um parâmetro inválido, ou o estado posterior a execução seja inválido, deve ser gerada uma excessão.
O ContractJ possui algumas anotações para definição de pré condições e pós condições, e ja possui aspectos implementados para estas anotações, desta forma ele faz o trabalho sujo de cuidar das condições definidas e gerar excessões quando for necessário, e as próprias anotações ja servem como documentação pois estão exatamente no ponto que possui a pré ou pós condição, e podem caso seja necessário, ser processadas utilizando o APT por exemplo, para geração de algum documento mais formal.
Para ficar um pouco mais claro, vamos pegar um exemplo (o mesmo do site do projeto):
@NotNegative public int calculaExpectativaDeVida (@NotNull Pessoa pessoa);
Este método, precisa receber uma Pessoa existente, por tanto, o parâmetro pessoa, foi anotado com um @NotNull, e claro que a expectativa de vida de alguem não pode ser negativa, então o método foi anotado com um @NotNegative.
A partir deste ponto, todos os que lerem o código vão ficar sabendo que o parâmetro pessoa não pode ser nulo, e que o resultado do calculo não pode ser negativo, ou seja, as pré e pós condições estão corretamente documentadas.
Para prosseguir, o ideal é que o projeto esteja sendo compilado com o AspectJ, existem plugins para o Eclipse, NetBeans e IntelliJ IDEA para facilitar a compilação do código com o AspectJ, mas se você quiser muito, pode também utilizar Load-Time-Weaving para não interferir no processo de compilação do projeto.
Em runtime, utilizando qualquer uma das duas opções apresentadas, se o método calculaExpectativaDeVida receber um parâmetro null, uma InvalidArgumentException sera lançada, e caso por algum erro de programação, o método retorne um valor negativo, sera lançada uma IllegalStateException.
Pronto, temos a documentação, e a verificação em runtime implementadas, sem quase nenhum esforço.
Para melhorar só se isto estivesse integrado com uma ferramenta MDA e as definições de pré e pós condições fossem flexíveis o suficiente para serem lidas do código OCL definido no diagrama UML, mas já é um ótimo começo.
Quem quiser instalar ele para testar, ou até mesmo usar no próximo sistema que for desenvolver, é só usar este Update Site no eclipse: http://update.aspectbrains.org/
Ou então baixar da página do projeto no source forge.
Tags: Eclipse, Java, produtividade, Trabalho
Bom, esta é a mais nova ferramenta opensource MDA disponível por ai.
O nome da ferramenta é Groovy MDA, o desenvolvimento ainda esta bem no inicio, mas ja lançaram a versão 1.0, ou seja, ja da pra brincar um pouco.
Por enquanto o único template disponível é para gerar entidades JPA a partir de um modelo UML, a ferramenta ainda esta um pouco engessada, pois não tem como informar outros templates ainda, mas acho que o projeto tem futuro, pois eu achei muito fácil criar templates para ela (olhando o código do já existente), mesmo ainda não sendo possível utilizar os novos templates “out of the box”, mas com uma alteração rápida em um arquivo .groovy na raiz do jar, é fácil utilizar os novos templates também.
bom, um exemplo rápido:
Vamos partir do seguinte modelo (gerado pelo ArgoUML, ou qualquer outra ferramenta que gere um XMI válido).

Com o modelo pronto, basta executar o comando:
java -jar groovymda-1.0.jar 'jar:file:./addressbook.zargo!/addressbook.xmi'
E tudo pronto, as classes definidas no modelo vão gerar entidades JPA (mais sobre JPA aqui, aqui e aqui) válidas e com o código até que bem organizado, como no exemplo a baixo:
package com.acme.domain;
import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.Lob;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
/**
* User Domain Object
*/
@Entity
@Table(name = "t_user")
@NamedQueries({
@NamedQuery(name = "User.findAll", query = "from User")
})
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "pk_id")
private Long id;
@Column(name = "c_username")
private java.lang.String username;
@Column(name = "c_password")
private java.lang.String password;
@OneToMany(
mappedBy = "user",
cascade = {CascadeType.PERSIST, CascadeType.MERGE}
)
private java.util.Set<Address> addresss;
public java.lang.String getUsername() {
return username;
}
public void setUsername(java.lang.String username) {
this.username = username;
}
public java.lang.String getPassword() {
return password;
}
public void setPassword(java.lang.String password) {
this.password = password;
}
public java.util.Set<Address> getAddresss() {
return addresss;
}
public void setAddresss(java.util.Set<Address> addresss) {
Address[] tempAddresss = (Address[]) getAddresss().toArray(new Address[getAddresss().size()]);
for (Address address : tempAddresss) {
removeFromAddresss(address);
}
if (addresss != null) {
for (Address address : addresss) {
addToAddresss(address);
}
}
}
public void addToAddresss(Address address) {
if (address != null) {
address.setUser(this);
getAddresss().add(address);
}
}
public void removeFromAddresss(Address address) {
if (address != null) {
address.setUser(null);
getAddresss().remove(address);
}
}
public int hashCode() {
int hashCode;
if (id != null) {
hashCode = 29 * id.hashCode();
} else {
hashCode = super.hashCode();
}
return hashCode;
}
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof User)) {
return false;
}
final User otherUser = (User) o;
if (hashCode() != otherUser.hashCode()) {
return false;
}
return true;
}
}
Eu só não gostei do nome das tabelas e campos gerados nas anotações, mas isto é fácil de costumizar, se abrirmos o jar, e editarmos o arquivo templates/JpaEntity.gtl (imagino que a extensão GTL signifique Groovy Template Language).
O template é básicamente código groovy misturado com strings, sempre que se quiser escrever código groovy, se marca o inicio e o fim com <% e %> respectivamente (como em uma JSP, mas sem as taglibs, e o código dentro dos marcadores é groovy e não Java), e quando se desejar apenas imprimir parte do texto, pode-se utilizar o mesmo marcador da EL do JSP (${ para inicio e } para fim), para se colocar código groovy que vai imprimir o texto desejado.
Acho que eles se inspiraram bastante no JET do Eclipse, que utiliza praticamente uma JSP para gerar código, com algumas tags definidas por eles mesmos.
O que eu acho que eles pretender fazer de errado:
Mas fora isto, acho que vale a pena dar uma olhada no progresso do projeto
Eles pretendem ainda criar um plugin para o maven para executar a geração de código, e uma task para ant, e para um futuro próximo, eles pretendem também criar um template completo para gerar uma aplicação grails (mais sobre grails aqui, aqui e aqui) a partir de um modelo UML.
E por falar em MDA, vocês estão utilizando MDA ou MDD por ai? usam os modelos UML apenas para definição e documentação?
Tags: produtividade, Trabalho
Lembro de um Code Contest no blog do Diego Plentz a algum tempo, a idéia era mostrar a forma mais fácil em cada linguagem de fazer uma pesquisa no google e exibir o primeiro resultado encontrado …
Todas as linguagens utilizadas, entre elas na epoca o ruby também, utilizaram Expressões Regulares e outros recursos de ocultismo para mostrar como poderiam fazer isto.
Eu também postei um exemplo utilizando java na epoca, e tive que contornar uma coisa chata que o google estva bloqueando o user agent do Java …
O exemplo era mais ou menos este:
import java.net.URL;
import java.net.URLConnection;
import java.util.Scanner;
public class HTTPSample {
public static void main(String[] args) throws Exception {
URLConnection con = new URL("http://www.google.com/search?q=java").openConnection();
con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7");
Scanner sc = new Scanner(con.getInputStream());
System.out.println(sc.findWithinHorizon("<a>.*?</a>", 0).replaceAll("<a>(.*?)</a>", "$2=$1").replaceAll("", ""));
}
}
Este exemplo poderia ser modificado fácilmente para buscar todos os resultados da primeira página, mas precisaria de mais trabalho braçal para poder buscar por exemplo, os resultados das duas primeiras páginas.
Para resolver este problema de pegar os resultados das X primeiras páginas ou qualquer coisa parecida, eu encontrei hoje uma biblioteca para Ruby de nome scRUBYt! muito fácil de utilizar, e o código fica extremamente legível …
Deem uma olhada neste exemplo:
require ‘rubygems’ require ’scrubyt’ google_data = Scrubyt::Extractor.define do #Perform the action(s) fetch ‘http://www.google.com/ncr’ fill_textfield ‘q’, ‘ruby’ submit #Construct the wrapper link "Ruby Programming Language" do url "href", :type => :attribute end next_page "Next", :limit => 2 end puts google_data.to_xml
O que me chamou atenção foi que este é um dos exemplos de screen scrapping mais simples e legiveis que eu ja encontrei!
Claro que pode ser adaptado fácilmente para outros sites, com comandos simples como:
Bom, fica a dica, se precisarem implementar algum tipo de Screen Scrapping, esta biblioteca vale a pena pelo menos ser considerada
Bom, a última onda da Internet são as tão faladas, redes sociais, disto acho que todos ja sabem, e que aqui no Brasil, muita gente tem mania de participar de muitas destas redes também não é novidade.
Aqui também existem muitos clones do Digg, como ja comentei antes. Mas do que realmente estou falando neste post?
Bom, este post é sobre a Via 6, um site bastante interessante, ele mistura a idéia do Digg (que é cada usuário enviar o conteúdo que lhe apetece e os outros usuários pontuarem aquele conteúdo, promovendo-o ou não para a home do site), com a idéia do LinkedIn, que é uma rede de contatos profissionais.
Tah, beleza, mas por que mais um site destes? mais um agregador de conteúdo?
Bom, uma das maiores vantagens é com um único cadastro participar da Via6 (rede de contatos profissionais), Rec6 (Digg like) e Indica6 (um lugar para anunciar vagas de emprego, procurar parceiros, tudo via indicação de algum contato).
O Rec6 na minha opinião, hoje é um dos melhores “Diggs” brasileiros, e principalmente para a área de tecnologia, tem bastante visitantes o que ajuda bastante no “compartilhamento de conteúdo/noticias”.
Eu acabei me cadastrando no Via6 por conta do Rec6 que me cadastrei para promover um pouco o blog (normalmente depois de algum post que acho interessante mando o link para la), e acho que vocês podem achar principalmente o Via6 e o Rec6 bem interessantes.
Fazia tempo que eu pensava em fazer algo parecido com o LinkedIn nacional, mas eles se adiantaram e fizeram muito bem.
Então, se vocês acham interessante a idéia de manter um networking profissional, que pode em algum momento ajudar a alavancar algum negócio ou conseguir um emprego novo, sugiro que se cadastrem no Via6.
A idéia não é ter todos os contados do mundo, mas sim contatos de qualidade, que postam noticias de qualidade ou que possam ajudar em algum tipo de negócio.
Além de eles estarem com uma promoção de dar vale compras de até R$100 para indicação de novos usuários ![]()

Bom, eu sou um exemplo vivo, pelo menos eu acho que sim, de que nerds, geeks ou como preferirem ser chamados, tem problemas no trato com outras pessoas.
Sempre acham que eu sou direto demais, ou que sou grosso, ou qualquer coisa do gênero.
Na verdade, eu concordo que sou direto demais, não com a parte de ser grosso.
Eu acredito que se eu penso alguma coisa, eu posso dizer aquilo, e azar é de quem estiver ouvindo, mas isto ja me trouxe muitos problemas.
Mesmo, pelo menos na minha opinião, eu sendo um dos melhores na parte técnica do que eu faço, eu acabo sempre me prejudicando por falar o que eu penso e outras pessoas não gostarem de ouvir isto, o que prejudica inclusive o crescimento profissional …
Eu ja tentei ser gerente de projetos, e tenho a consciência de que pelo menos por enquanto não seria um bom gerente …
Em empresas que eu trabalhei, ja houveram casos em que mesmo sabendo que eu tinha a resposta, colegas de trabalho evitavam perguntar alguma coisa para mim.
Bom, eu ja melhorei muito neste ponto, acho que hoje sou razoavelmente conhecido na “comunidade java” aqui no Brasil, e cheguei a ouvir de um gerente: Bahh, legal, não sabia que tu era “O Urubatan”.
Mas melhorei isto com muito custo, e não foi muito fácil …
Mas voltando ao assunto deste post, eu encontrei um texto excelente que explica muito bem, na minha opinião, por que a maioria dos Nerds tem problemas no relacionamento com outras pessoas “Não Nerd”.
O texto original é este: “Tact Filters“.
A baixo segue uma tradução livre deste excelente texto.
Todas as pessoas possuem um “filtro de tato”, que aplica um filtro de “trato social” em uma direção há tudo que passa por ele. A maioria das “pessoas normais” tem este filtro posicionado para filtrar tudo o que elas falam ou fazem. Então toda e qualquer coisa que as “pessoas normais” dizem, tem a quantidade ideal de “filtro para trato social” aplicado, antes de elas realmente falarem. Isto normalmte acontece por que quando eles estavam crescendo, os seus pais continuamente diziam para eles coisas como: “Se você não pode dizer algo de bom, não diga nada!”, ou então “Não diga este tipo de coisa, vai fazer com que eles se sintam mal!”.
“Nerds”, por outro lado, tem este filtro, aplicado na posição contrária, ou seja, tudo o que eles ouvem é filtrado. Então, qualquer coisa que qualquer um diz para eles, tem a quantidade adequada de “filtro social” aplicado quando eles ouvem. Isto normalmente é por que quando eles estavam crescendo, as outras crianças ficavam incomodando e dizendo coisas desagradáveis, e os seus pais diziam o tempo todo: “Eles estão dizendo estas coisas só por que eles estão com ciúmes”.
Quando “pessoas normais” conversam entre si, elas normalmente aplicam a quantidade apropriada de “tato social” para tudo o que eles dizem, e ninguém sai com os sentimentos feridos. Quando “Nerds” conversam entre si, eles normalmente aplicam a quantidade adequada de “tato social” a tudo o que eles ouvem, e ninguém sai com os sentimentos feridos. Entretanto, quando pessoas normais, falam com “Nerds”, os “Nerds” ficam frustrados com freqüência, por que as “pessoas normais” parecem estar sempre evitando de dizer o que eles realmente querem. E pior ainda, quando “Nerds” falam com “pessoas normais”, estas com freqüência saem com os sentimentos feridos, por que os nerds não aplicam o filtro ao que eles estão falando, esperando que o ouvinte o faça.
Então, os “nerds” precisam entender que as “pessoas normais”, precisam aplicar este filtro para tudo o que eles dizem, eles ficam desconfortáveis se eles não puderem fazer isto. “Pessoas normais” precisam entender que fora o fato de os nerds normalmente não possuirem “tato”, as coisas que eles dizem quase nunca devem ser tomadas como pessoais. Ambos os tipos de pessoas precisam ter uma quantidade extra de paciência quando estiverem lidando com alguém que possua o “filtro de tato” na direção oposta a sua.
O texto original é de autoria de: Jeff Bigler.
Todos os outros comentários e tradução são de minha autoria