<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>blog.caelum.com.br</title>
	<atom:link href="http://blog.caelum.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.caelum.com.br</link>
	<description>blog dos desenvolvedores da Caelum</description>
	<pubDate>Thu, 14 Aug 2008 11:08:16 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
	<language>en</language>
			<item>
		<title>Novo Treinamento FJ-16: Laboratório Java com Swing, XML e Testes</title>
		<link>http://blog.caelum.com.br/2008/08/14/novo-treinamento-fj-16-laboratorio-java-swing-xml-testes/</link>
		<comments>http://blog.caelum.com.br/2008/08/14/novo-treinamento-fj-16-laboratorio-java-swing-xml-testes/#comments</comments>
		<pubDate>Thu, 14 Aug 2008 09:01:47 +0000</pubDate>
		<dc:creator>Sérgio Lopes</dc:creator>
		
		<category><![CDATA[caelum]]></category>

		<category><![CDATA[cursos]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[testes]]></category>

		<category><![CDATA[treinamento]]></category>

		<category><![CDATA[graficos]]></category>

		<category><![CDATA[jfreechart]]></category>

		<category><![CDATA[junit]]></category>

		<category><![CDATA[log4j]]></category>

		<category><![CDATA[refatoração]]></category>

		<category><![CDATA[reflection]]></category>

		<category><![CDATA[swing]]></category>

		<category><![CDATA[treinamentos]]></category>

		<category><![CDATA[unit test]]></category>

		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=254</guid>
		<description><![CDATA[Depois de aprender bem o Java, uma pergunta comum de alunos e de usuários do GUJ é: como adquirir experiência e boas práticas? Com esse intuito criamos um novo treinamento, onde desenvolvemos uma aplicação desktop com Swing, que faz análise técnica da bolsa de valores, através de gráficos, usando como fonte uma base XML. É [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.caelum.com.br/imagens/cursos/fj16-icon.jpg" alt="FJ-16 Laboratório Swing" align="left"/>Depois de aprender bem o Java, uma pergunta comum de alunos e de usuários do GUJ é: <strong>como adquirir experiência e boas práticas</strong>? Com esse intuito criamos um <a href="http://www.caelum.com.br/caelum/treinamento-fj-16-laboratorio-desenvolvimento-java-xml-swing-boas-praticas.jsp">novo treinamento</a>, onde desenvolvemos uma aplicação desktop com Swing, que faz análise técnica da bolsa de valores, através de gráficos, usando como fonte uma base XML. É o <a href="http://www.caelum.com.br/caelum/treinamento-fj-16-laboratorio-desenvolvimento-java-xml-swing-boas-praticas.jsp"><strong>FJ-16: Laboratório Java com Swing, XML e Testes</strong></a>.</p>
<p><center><img src="http://farm4.static.flickr.com/3206/2763062024_a9e5e695aa.jpg" width="420"  alt="FJ16" /></center></p>
<p>O mais interessante é que, durante o desenvolvimento da aplicação, aprendemos a aplicar diversos <strong>design patterns</strong> (como o Decorator entre indicadores), utilizamos <strong>testes</strong> unitários com JUnit, conhecemos as ferramentas <strong>Ant</strong> e <strong>Maven</strong>,  aplicamos <strong>reflection</strong> e <strong>anotações</strong>, além de sempre estar <strong>refatorando </strong>o código inúmeras vezes.</p>
<p>Nesse treinamento, são colocados em prática também diversos conceitos da linguagem que usamos no dia-a-dia, como manipulação de <strong>datas</strong>, de <strong>XML</strong>, classes anônimas, classes internas, uso do <strong>log4J</strong>, entre outros.</p>
<p>Veja a ementa completa na <a href="http://www.caelum.com.br/caelum/treinamento-fj-16-laboratorio-desenvolvimento-java-xml-swing-boas-praticas.jsp">página do treinamento</a>. Temos turmas agendadas para final de agosto e começo de setembro. Entre em <a href="http://www.caelum.com.br/caelum/contato.jsp">contato</a> conosco para mais informações.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/2008/08/14/novo-treinamento-fj-16-laboratorio-java-swing-xml-testes/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Effective Java: segunda edição</title>
		<link>http://blog.caelum.com.br/2008/07/25/effective-java-segunda-edicao/</link>
		<comments>http://blog.caelum.com.br/2008/07/25/effective-java-segunda-edicao/#comments</comments>
		<pubDate>Fri, 25 Jul 2008 11:56:29 +0000</pubDate>
		<dc:creator>Paulo Silveira</dc:creator>
		
		<category><![CDATA[arquitetura]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[livros]]></category>

		<category><![CDATA[oo]]></category>

		<category><![CDATA[clojure]]></category>

		<category><![CDATA[composição]]></category>

		<category><![CDATA[effective java]]></category>

		<category><![CDATA[erlang]]></category>

		<category><![CDATA[herança]]></category>

		<category><![CDATA[imutabilidade]]></category>

		<category><![CDATA[interfaces]]></category>

		<category><![CDATA[orientação a objetos]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/2008/07/25/effective-java-segunda-edicao/</guid>
		<description><![CDATA[ Como sabemos, a segunda edição do Effective Java foi publicada. O autor é Joshua Bloch, um dos principais responsáveis pelo generics do Java, e atualmente chief java architect no Google. Esse livro é dividido em 78 itens, cada um com cerca de 3 páginas, atacando um ponto específico do java e orientação a objetos, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://ecx.images-amazon.com/images/I/51Y6dxwLIGL._SL500_AA240_.jpg" alt="Effective Java" align="left" /> Como sabemos, a segunda edição do <a href="http://java.sun.com/docs/books/effective/">Effective Java</a> foi publicada. O autor é <a href="http://en.wikipedia.org/wiki/Joshua_Bloch">Joshua Bloch</a>, um dos principais responsáveis pelo generics do Java, e atualmente chief java architect no Google. Esse livro é dividido em 78 itens, cada um com cerca de 3 páginas, atacando um ponto específico do java e orientação a objetos, explicando uma boa ou má prática. Simplesmente incrível, durante a leitura você sempre reconhece muita coisa que já aprendeu durante sua experiência de desenvolvimento. </p>
<p>Essa nova edição está estendida e revista, para cobrir as grandes mudanças do Java 5. Esse, juntamente com <a href="http://blog.caelum.com.br/2006/09/22/livros-escolhendo-a-trindade-do-desenvolvedor-java/">outros dois livros</a> (e atualmente incluiríamos também o <a href="http://en.wikipedia.org/wiki/The_Mythical_Man-Month">The Mythical Man-month</a>), são de extrema importância para todo desenvolvedor na nossa opinião.</p>
<p>O <a href="http://www.boaglio.com/">Fernando Boaglio</a> tem <a href="http://www.boaglio.com/index.php/2007/10/01/effective-java-depois-de-6-anos/">um resumo</a> em seu blog, sobre todos os itens dessa nova versão. A <a href="http://www.java.blogger.com.br/">Vanessa Sabino</a> publicou anos atrás um resumo completo sobre a primeira edição, que você pode conferir na coluna da direita do seu blog. </p>
<p>O Fernando também <a href="http://www.guj.com.br/posts/list/90779.java">postou no GUJ</a> um link para <a href="http://www.infoq.com/articles/bloch-effective-java-2e">uma excelente entrevista do Joshua Bloch</a>, onde ele tenta resumir as más práticas, o java inefetivo: <strong>otimização prematura</strong>, e <strong>escrever o próprio código quando bibliotecas boas já existem</strong>. Além disso, Joshua Bloch é categório sobre a grande importância dos testes unitários: &#8220;<em>Unit testing is key. And writing your tests first is a great thing.</em>&#8221;</p>
<p>Lendo essa nova edição e relembrando muito da edição anterior, escolhi aqui quatro itens que considero vitais, e vou falar sucintamente sobre cada um deles. Curiosamente todos os selecionados aqui já existiam na edição anterior, e estão mais relacionados a design que a idiomismos da linguagem, mas isso não tira a  importância dos outros aqui não citados. Esses itens são muito debatidos no capítulo de Tópicos em Orientação a Objetos no nosso <a href="http://www.caelum.com.br/caelum/treinamento-fj-91-arquitetura-e-design-de-projetos-java.jsp">trienamento de Design e Arquitetura de projetos Java</a>. Vamos a eles:</p>
<p><strong>Item 15: Minimize mutabilidade</strong></p>
<p>Classes imutáveis possuem uma série de vantagens: fáceis de manter, não possuem efeitos colaterais e acima de tudo são thread safe. Uma classe deve ser imutável a não ser que você tenha muito bons motivos para isso. Mesmo se não for possível tornar sua classe imutável, minimize a quantidade de métodos que alteram o estado do objeto. Um objeto previsível é muito mais simples de manter. Joshua Bloch cita <code>String</code>, <code>BigInteger</code> e diz que <code>java.util.Date</code> e <code>java.awt.Point</code> deveriam ter sido criadas imutáveis! Muitas APIs novas abusam da imutabilidade, como a Joda Time, classes wrapper, Money and Time do Eric Evans, etc. Aliás, é com o slogan da imutabilidade que linguagens como <a href="http://clojure.org/">clojure</a> e <a href="http://www.erlang.org/">erlang</a> tem chamado tanta atenção. Leia também <a href="http://blog.lucindo.com.br/2008/05/22/state-youre-doing-it-wrong/">essa citação</a> no blog do Renato Lucindo.</p>
<p><strong>Item 16: Favoreça composição em vez de herança</strong></p>
<p>Esse é um tópico que já foi <a href="http://blog.caelum.com.br/2006/10/14/como-nao-aprender-orientacao-a-objetos-heranca/">discutido anteriormente nesse post</a>. O fato é o seguinte: é muito fácil usar herança de maneira errada, como é o caso de <code>Stack extends Vector</code> e <code>Properties extends Hashtable</code>. Mesmo quando usada corretamente, herança pode causar efeitos colaterais com muita facilidade, sendo que utilizar interfaces e composição pode substitui-la por completo, com o pequeno acréscimo de algumas linhas de delegação. Esse item também é citado no livro <em>Design Patterns</em> como um dos dois princípios básicos do bom design orientado a objetos.</p>
<p><strong>Item 47: Conheça e use as bibliotecas!</strong></p>
<p>Você conhece a <code>ArrayDeque</code> do java 6? Sabia que a <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/Scanner.html">java.util.Scanner</a> pode ler facilmente arquivos com formatos caseiros, e já trazer para você <code>double</code>s, <code>String</code>s e até mesmo <code>BigDecimal</code>s? Que JAXB e JAXWS podem agora ser usados apenas com Java SE? Sabia que a <code>Collections</code> possui hoje métodos para calcular a frequência de um elemento e inverter a ordem de um <code>Comparator</code>?. Conhecer bem a biblioteca padrão do Java pode te salvar de escrever muito código já existente, testado e de qualidade. <code>java.io</code>, <code>java.lang</code> e <code>java.util</code> são APIs que funcionam como base para todo desenvolvedor e merecem um estudo aprofundado.</p>
<p><strong>Item 52: Refira a objetos pelas suas interfaces</strong><br />
Sem dúvida uma boa prática mais que necessária. Através dela conseguimos diminuir muito o acoplamento entre classes, deixando apenas uma fina camada entre elas: as interfaces. Sempre usar <code>InputStream</code> em vez de se acoplar em <code>FileInputStream</code>, sempre usar <code>List</code> em vez de se acoplar a <code>ArrayList</code>. Muitas vezes podemos ir mais longe, nesse último caso <code>Collection</code> pode ser o suficiente, ou até mesmo <code>Iterable</code>! Algumas pessoas levam isso tão a sério que nunca criam uma única classe concreta que não implemente uma interface. Esse item também é citado no livro <em>Design Patterns</em>, e é o outro princípio básico do bom design orientado a objetos desta forma: &#8220;<em>Programe voltado a interface, e não a implementação</em>&#8220;.</p>
<p>Ainda existem itens fundamentais sobre Enums, Exceptions, Concorrência e Generics. Esse livro é realmente importante na sua cabeceira. Boa leitura!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/2008/07/25/effective-java-segunda-edicao/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Processo de build com o Maven</title>
		<link>http://blog.caelum.com.br/2008/07/07/processo-de-build-com-o-maven/</link>
		<comments>http://blog.caelum.com.br/2008/07/07/processo-de-build-com-o-maven/#comments</comments>
		<pubDate>Mon, 07 Jul 2008 21:26:39 +0000</pubDate>
		<dc:creator>Lucas Cavalcanti</dc:creator>
		
		<category><![CDATA[deployment]]></category>

		<category><![CDATA[infraestrutura]]></category>

		<category><![CDATA[integração]]></category>

		<category><![CDATA[open source]]></category>

		<category><![CDATA[tecnologia]]></category>

		<category><![CDATA[ant]]></category>

		<category><![CDATA[build]]></category>

		<category><![CDATA[dependências]]></category>

		<category><![CDATA[deploy]]></category>

		<category><![CDATA[gerenciamento]]></category>

		<category><![CDATA[integração contínua]]></category>

		<category><![CDATA[maven]]></category>

		<category><![CDATA[pom.xml]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/2008/07/07/processo-de-build-com-o-maven/</guid>
		<description><![CDATA[O Maven é uma ferramenta de gerenciamento, construção e implantação de projetos muito interessante, que te ajuda no processo de gerenciamento de dependências e no de build, geração de relatórios e de documentação. Na Caelum esta é a ferramenta usada em todos os projetos internos e nas consultorias.
Muitas pessoas migram seus projetos para o Maven, [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://maven.apache.org/">Maven</a> é uma ferramenta de gerenciamento, construção e implantação de projetos muito interessante, que te ajuda no processo de gerenciamento de dependências e no de build, geração de relatórios e de documentação. Na Caelum esta é a ferramenta usada em todos os projetos internos e nas consultorias.</p>
<p>Muitas pessoas migram seus projetos para o Maven, mas acabam arrumando mais problemas que soluções, pois não conseguem configurá-lo corretamente, e acabam desistindo e fazendo tudo na mão, ou voltando para o Ant. Mas se você conseguir ajustar as configurações, o Maven vai te ajudar muito e vai compensar todos os (poucos) problemas que ele eventualmente causa. No início do uso do Maven, espere formar com ele uma relação de amor e ódio.</p>
<p>Para começar a usar o Maven, tudo o que você precisa fazer é <a href="http://maven.apache.org/download.html">baixá-lo e configurar umas poucas variáveis de ambiente</a>. Depois de ter feito isso, é só digitar <code>mvn [target]</code> na linha de comando. Alguns sistemas operacionais já te oferecem essa instalação através do <code>macport</code> ou <code>apt-get</code>.</p>
<p>A unidade básica de configuração do Maven é um arquivo chamado <a href="http://maven.apache.org/guides/introduction/introduction-to-the-pom.html">pom.xml</a>, que deve ficar na raiz do seu projeto. Ele é um arquivo conhecido como <em>Project Object Model</em>: lá você declara a estrutura, dependências e características do seu projeto. A idéia é bem parecida com o build.xml do Ant: você deixa o pom.xml na raiz do seu projeto para poder chamar as targets de build do seu projeto. O <a href="http://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Minimal_POM">menor arquivo pom.xml</a> válido é o seguinte:<br />
<code><br />
&lt;project&gt;<br />
&nbsp;&nbsp;&lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;<br />
&nbsp;&nbsp;&lt;groupId&gt;br.com.caelum&lt;/groupId&gt;<br />
&nbsp;&nbsp;&lt;artifactId&gt;teste&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&lt;version&gt;1.0&lt;/version&gt;<br />
&lt;/project&gt;<br />
</code></p>
<p>Que contém apenas a identificação do projeto, e uma informação a mais: <code>modelVersion</code>, que é a identificação da versão do arquivo pom.xml e deve ser sempre 4.0.0. A identificação do projeto consiste em três informações:</p>
<ul>
<li><code>groupId</code>: um identificador da empresa/grupo ao qual o projeto pertence. Geralmente o nome do site da empresa/grupo ao contrário. Ex: <code>br.com.caelum</code>.</li>
<li><code>artifactId</code>: o nome do projeto. Ex: <code>teste</code>.</li>
<li><code>version</code>: a versão atual do projeto. Ex: <code>1.0-SNAPSHOT</code>.</li>
</ul>
<p>Essas informações são usadas em muitos lugares, ccomo o controle de dependências que é, na minha opinião, a funcionalidade mais útil do Maven. Por exemplo, para dizer que o log4j 1.2.15 é uma dependência da sua aplicação é só acrescentar no seu pom as linhas:<br />
<code><br />
&lt;project&gt;<br />
...<br />
&nbsp;&nbsp;&lt;dependencies&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;dependency&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;groupId&gt;log4j&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;artifactId&gt;log4j&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;version&gt;1.2.15&lt;/version&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/dependency&gt;<br />
&nbsp;&nbsp;&lt;/dependencies&gt;<br />
...<br />
&lt;/project&gt;<br />
</code><br />
Quando necessário, o Maven vai baixar pra você o jar do log4j 1.2.15, e todas as suas dependências, e vai colocá-las no classpath da sua aplicação durante os builds, testes, etc. Ou seja, você não precisa mais entrar no site do log4j, baixar um zip com vários jars e ter que procurar quais jars devem ser colocados no classpath! No <a href="http://mvnrepository.com">Repositório de Bibliotecas do Maven</a> você encontra os jars que você pode colocar como dependência do seu projeto, e o pedaço de xml que você deve copiar e colar dentro da tag dependencies do seu pom para incluir essas bibliotecas.</p>
<p>Todos os jars baixados pelo Maven são guardados na pasta <code>repository</code> dentro da <code>M2_HOME</code> que você configurou quando instalou o Maven. Assim, se mais de um projeto seu depende do mesmo jar, ele não é baixado de novo.</p>
<p>A <strong>grande</strong> diferença entre o <code>build.xml</code> do Ant e o <code>pom.xml</code> do Maven é o paradigma. No Ant usamos esse XML praticamente como uma linguagem de programação, onde você da comandos em relação ao build do projeto. No Maven usamos o XML para definir a estrutura do projeto, e a partir dessas declarações o Maven possui targets bem definidos que usam essas informações para saber como realizar aquela tarefa. Um exemplo: para compilar com o Ant criamos um target que chama o javac, mas para compilar com o Maven usamos um target já existente (não o criamos), e ele vai usar a informação que define onde está o código fonte e para onde ele deve ser compilado (sendo que muitas dessas informações possuem convenções e defaults, e nem precisam ser configuradas).</p>
<p>Além dos principais targets do Maven, você pode executar targets de plugins. Você só precisa digitar na linha de comando:</p>
<p><code>mvn [nomedoplugin]:[target]</code></p>
<p>e então o Maven baixa o plugin, se necessário, e executa a target pra você. Existe uma lista bem grande de <a href="http://maven.apache.org/plugins/index.html">plugins do Maven</a> e uma boa parte desses plugins podem ser usados sem nenhuma configuração adicional no seu <em>pom</em>.</p>
<p>Para dar um exemplo de plugin do Maven nada melhor do que o plugin que cria um protótipo de projeto do Maven: o <a href="http://maven.apache.org/plugins/maven-archetype-plugin/">Archetype</a>. É bem parecido com o scaffold do Ruby: ele cria um protótipo de projeto a partir de um modelo escolhido. O jeito mais fácil de usar esse plugin é digitando na linha de comando:</p>
<p><code>mvn archetype:create</code></p>
<p>E então o Archetype <a href="http://maven.apache.org/plugins/maven-archetype-plugin/usage.html">vai perguntar</a> qual é o tipo de projeto que você deseja, o groupID, artifactID, version e o pacote referentes ao seu projeto. Depois disso você terá uma estrutura de projeto pronta para ser usada.<br />
Por exemplo se você escolheu o tipo de projeto maven-archetype-quickstart, o Archetype vai criar uma estrutura de pastas parecidas com a seguinte:</p>
<pre><code>
teste
|-- pom.xml
`-- src
    |-- main
    |   `-- java
    |       `-- br
    |           `-- com
    |               `-- caelum
    |                   `-- teste
    |                       `-- App.java
    `-- test
        `-- java
            `-- br
                `-- com
                    `-- caelum
                        `-- teste
                            `-- AppTest.java
</code></pre>
<p>E então é só continuar o seu projeto a partir daí. O código de teste já vem separado do código principal, e o junit já vem como dependência da aplicação. Você também pode criar as pastas <code>src/main/resources</code> e <code>src/test/resources</code> para colocar os recursos (arquivos de configuração, de teste, e etc) do código principal e do de testes, respectivamente. Tudo que estiver dentro dessas pastas é copiado diretamente para o diretório onde as classes são compiladas, sem que seja necessário fazer nenhuma configuração adicional.</p>
<p>Se você, por algum motivo, não gostou da estrutura que o Maven criou, ou está querendo migrar um projeto para o Maven que não segue essa estrutura, você pode configurar os diretórios do projeto<br />
<a href="http://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Super_POM">acrescentando algumas linhas no pom</a>:</p>
<pre><code>&lt;project&gt;
...
&lt;build&gt;
    &lt;sourceDirectory&gt;
      ${project.basedir}/src/java/main
    &lt;/sourceDirectory&gt;
    &lt;testSourceDirectory&gt;
      ${project.basedir}/src/java/test
    &lt;/testSourceDirectory&gt;
    &lt;resources&gt;
          &lt;resource&gt;
                 &lt;directory&gt;
                   ${project.basedir}/src/resources/main
                 &lt;/directory&gt;
          &lt;/resource&gt;
    &lt;/resources&gt;
    &lt;testResources&gt;
          &lt;testResource&gt;
                 &lt;directory&gt;
                   ${project.basedir}/src/resources/test
                 &lt;/directory&gt;
          &lt;/testResource&gt;
    &lt;/testResources&gt;
&lt;/build&gt;

...
&lt;/project&gt;
</code></pre>
<p>Nesse exemplo o diretório principal de código e de recursos estarão em <code>src/java/main</code> e  <code>src/resources/main</code> respectivamente, e os diretorios de teste em <code>src/java/test</code> e <code>src/resources/test</code>.</p>
<p>Agora com um projeto Maven já preparado, vamos para a principal funcionalidade: o build. O build do Maven é baseado no conceito de <a href="http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html">ciclo de vida</a>: o processo de construção e distribuição da sua aplicação é dividido em partes bem definidas chamadas fases, seguindo um ciclo. O ciclo padrão é o seguinte:</p>
<ul>
<li><strong>compile</strong> - compila o código fonte do projeto</li>
<li><strong>test</strong> - executa os testes unitários do código compilado, usando uma ferramenta de testes unitários, como o junit.</li>
<li><strong>package</strong> - empacota o código compilado de acordo com o empacotamento escolhido, por exemplo, em JAR.</li>
<li><strong>integration-test</strong> - processa e faz o deploy do pacote em um ambiente onde os testes de integração podem ser rodados.</li>
<li><strong>install</strong> - instala o pacote no repositório local, para ser usado como dependência de outros projetos locais</li>
<li><strong>deploy</strong> - feito em ambiente de integração ou de release, copia o pacote final para um repositório remoto para ser compartilhado entre desenvolvedores e projetos</li>
</ul>
<p>Você pode invocar qualquer dessas fases na linha de comando, digitando:</p>
<p><code>mvn [fase]</code></p>
<p>Por exemplo se você digitar <code>mvn package</code> o Maven vai executar todas as fases anteriores do ciclo até a fase <code>package</code>. Uma lista completa das fases do ciclo de vida possíveis pode ser encontrada <a href="http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference">aqui</a>.</p>
<p>Algumas das fases do ciclo possuem plugins associadas a elas, e esses plugins são executados assim que a fase é chamada para ser executada. Você pode também registrar plugins para rodarem em qualquer fase do ciclo, conseguindo, assim, personalizar o build do seu projeto facilmente. Por exemplo, se você quiser criar um jar com o código fonte do projeto, e que esse jar seja gerado depois que o projeto foi empacotado, é só acrescentar no seu pom:</p>
<pre><code>&lt;project&gt;
  ...
  &lt;build&gt;
    &lt;plugins&gt;
      &lt;plugin&gt;
        &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
        &lt;artifactId&gt;maven-source-plugin&lt;/artifactId&gt;
        &lt;executions&gt;
          &lt;execution&gt;
            &lt;id&gt;attach-sources&lt;/id&gt;
            &lt;phase&gt;package&lt;/phase&gt;
            &lt;goals&gt;
              &lt;goal&gt;jar&lt;/goal&gt;
            &lt;/goals&gt;
          &lt;/execution&gt;
        &lt;/executions&gt;
      &lt;/plugin&gt;
    &lt;/plugins&gt;
  &lt;/build&gt;
  ...
&lt;/project&gt;
</code></pre>
<p>Assim, o plugin <a href="http://maven.apache.org/plugins/maven-source-plugin/">Source</a> vai executar seu goal <code>jar</code> na fase <code>package</code> do ciclo de vida. É como se fosse chamado <code>mvn source:jar</code> quando o build passa pela fase de package. A fase package já possui um plugin associado a ela: o <code>jar:jar</code> (supondo que é um projeto jar), então o plugin source só será executado depois do jar:jar. Em geral se você registrar mais de um plugin pra mesma fase, eles serão executados na ordem em que eles forem declarados. O jeito de configurar o plugin para colocá-lo dentro de uma fase do ciclo geralmente está no site principal do plugin, na seção <strong>Usage</strong>.</p>
<p>O Maven possui ainda outras funcionalidades interessantes, como geração de relatórios. Alguns plugins também merecem uma atenção especial, como o <a href="http://maven.apache.org/plugins/maven-eclipse-plugin/">Eclipse</a> que gera informações de projeto para o eclipse (<code>.classpath</code> e <code>.project</code>), o <a href="http://maven.apache.org/plugins/maven-antrun-plugin/">Antrun</a> que te permite executar código Ant dentro do Maven, o <a href="http://maven-plugins.sourceforge.net/maven-cobertura-plugin/">Cobertura</a> que gera um relatório mostrando a cobertura de testes no seu projeto, o <a href="http://mojo.codehaus.org/jetty-maven-plugin/usage.html">Jetty</a> que sobe uma instância do Jetty com sua aplicação deployed, o <a href="http://mojo.codehaus.org/selenium-maven-plugin/">Selenium</a> que sobe uma instância do servidor do Selenium para poder fazer os testes de aceitação do selenium, enfim, existem vários plugins interessantes e é relativamente fácil achar o plugin que faz o que você precisa. É igualmente fácil, também, fazer um plugin para o Maven, o chamado <a href="http://maven.apache.org/plugin-developers/index.html">Mojo</a>.</p>
<p>Aqui na Caelum, além do Maven e JUnit, usamos muito o <a href="http://selenium.openqa.org/">Selenium</a>, juntamente com o SeleniumDSL, para os testes de integração, e o <a href="http://cruisecontrol.sourceforge.net/">Cruise Control</a> para o controle da integração contínua. Esperamos colocar tutoriais e vídeos sobre essas ferramentas também.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/2008/07/07/processo-de-build-com-o-maven/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Melhorando o GUJ: Jetty, NIO e load balancing</title>
		<link>http://blog.caelum.com.br/2008/06/27/melhorando-o-guj-jetty-nio-e-load-balancing/</link>
		<comments>http://blog.caelum.com.br/2008/06/27/melhorando-o-guj-jetty-nio-e-load-balancing/#comments</comments>
		<pubDate>Fri, 27 Jun 2008 10:41:36 +0000</pubDate>
		<dc:creator>Fabio Kung</dc:creator>
		
		<category><![CDATA[arquitetura]]></category>

		<category><![CDATA[caelum]]></category>

		<category><![CDATA[guj]]></category>

		<category><![CDATA[linux]]></category>

		<category><![CDATA[servidores]]></category>

		<category><![CDATA[web]]></category>

		<category><![CDATA[guj.com.br]]></category>

		<category><![CDATA[httpd]]></category>

		<category><![CDATA[jetty]]></category>

		<category><![CDATA[load balancing]]></category>

		<category><![CDATA[nginx]]></category>

		<category><![CDATA[nio]]></category>

		<category><![CDATA[reverse proxy]]></category>

		<category><![CDATA[servlet container]]></category>

		<category><![CDATA[tomcat]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/2008/06/27/melhorando-o-guj-jetty-nio-e-load-balancing/</guid>
		<description><![CDATA[

Durante boa parte da vida do GUJ.com.br, na sua segunda versão (screeshot acima), o site sofreu diversas quedas e passou por muitos períodos de lentidão, mesmo depois de ter migrado para um servidor dedicado. A grande verdade é que por um bom tempo ficamos devendo a devida atenção ao deployment do GUJ. Sempre que um [...]]]></description>
			<content:encoded><![CDATA[<p><center><a href='http://blog.caelum.com.br/wp-content/uploads/2008/06/guj2.png' title='GUJ2'><img style="display:inline" src='http://blog.caelum.com.br/wp-content/uploads/2008/06/guj2.png' alt='GUJ2' width="500" height="132" border="none" /></a></center>
<p/>
<p>Durante boa parte da vida do <a href="http://www.guj.com.br">GUJ.com.br</a>, na sua segunda versão (screeshot acima), o site sofreu diversas quedas e passou por muitos períodos de lentidão, mesmo depois de ter migrado para um servidor dedicado. A grande verdade é que por um bom tempo ficamos devendo a devida atenção ao deployment do GUJ. Sempre que um problema acontecia alguém simplesmente reiniciava o servidor, sem investigar as causas reais do problema com profundidade.</p>
<p>Dada a relação próxima que a Caelum sempre teve com o site, já que dois dos fundadores do GUJ são também os fundadores da Caelum, resolvemos assumir de vez a posição de <strong>criadores</strong> do GUJ. A Caelum agora é a <strong>patrocinadora e mantenedora oficial</strong> do GUJ. Recentemente andamos gastando algum tempo, tentando acabar de vez com estes problemas que o GUJ a tanto tempo sofre. Felizmente, a melhora já é bem perceptível!</p>
<p>Há algum tempo atrás, o GUJ ficava esporadicamente muito lento. Para resolver estes problemas de lentidão, o primeiro passo foi conseguir um servidor dedicado, pago pelos anúncios espalhados pelo site. Já faz tempo que o GUJ roda neste servidor dedicado e desde então a performance se tornou quase sempre aceitável.</p>
<p>Porém, o servidor dedicado não resolveu todos os problemas, já que <code>java.lang.OutOfMemoryError</code> sempre foi o principal problema enfrentado pelo GUJ. Sempre desconfiamos que o culpado poderia ser o código do próprio GUJ, ou até do JFórum, que deveriam conter algum <a href="http://en.wikipedia.org/wiki/Memory_leak">vazamento de memória</a>.</p>
<p>Alguns desenvolvedores da Caelum já tiveram ótimas experiências passadas com o <a href="http://jetty.mortbay.org">Jetty</a>, que é um excelente servidor web e servlet contêiner. Foi, inclusive, um dos servidores Java pioneiros a usar conectores <a href="http://java.sun.com/javase/6/docs/api/java/nio/package-summary.html">NIO (java.nio)</a>. O Jetty foi desenhado para ser embutido em outras aplicações Java e portanto é extremamente leve. Consome bem menos memória que o Tomcat, seu concorrente mais conhecido, e não deixa nada a desejar nas outras características.</p>
<p>O servidor dedicado do GUJ tem 2GB de memória RAM e o Tomcat estava configurado inicialmente para ter um heap máximo de 768MB (<code>-Xmx768M</code>). A primeira tentativa foi aumentar o heap máximo (<code>-Xmx1024M</code>), mas mesmo assim o temível <code>OutOfMemoryError</code> insistia em aparecer.</p>
<p>Resolvemos então dar uma chance ao Jetty. Já que ele consome menos memória, acreditamos que os <code>OutOfMemoryError</code> demorariam mais a aparecer. Logo ao subir, o jetty ocupa 4% da memória do servidor. O impressionante é que em duas semanas no ar, o uso total de memória não passou de 12%. Na verdade, o uso de memória estabilizou em 9% do total, porém recentemente fizemos alguns testes de carga no servidor do guj, com mais do que o dobro do número de conexões que o guj recebe hoje nos períodos de pico. Isto fez com que o uso de memória do Jetty pulasse para 12%. Uma diferença <strong>enorme</strong> da quantidade usada pelo Tomcat, que chegava facilmente a 80%.</p>
<p><center><a href="http://blog.caelum.com.br/wp-content/uploads/2008/06/top-guj.png" title='uso de memória do Jetty'><img src='http://blog.caelum.com.br/wp-content/uploads/2008/06/top-guj.png' alt='uso de memória do Jetty' width="480" height="117" border="none" /></a></center>
<p/>
<p>Já temos algum tempo rodando, sem problemas de memória e com o jetty estável usando 9-12% do total da memória do servidor. Já estamos até pensando em descartar a possibilidade de existir um vazamento de memória no código do GUJ ou do JForum. Isto tornaria o Tomcat culpado pelos problemas de memória!</p>
<p>A possibilidade de vazamentos de memória no Tomcat (estávamos com a versão 6.0.14, sem o APR e com Linux Kernel 2.6.22) deste tamanho é um pouco assustadora. Com a base de usuários que o Tomcat tem, muito possivelmente alguém já teria pego este problema muito antes de nós. Provavelmente o problema é de alguma configuração mal feita no Tomcat do GUJ.</p>
<p>Fato é que o Jetty foi uma tentativa que deu certo e o problema está aparentemente resolvido. O Jetty mostrou um uso mais alto de CPU que o Tomcat, chegando a picos de 60% da capacidade total de processamento do servidor, que possui 2 processadores. Através dos testes de carga que fizemos, temos percebido que o Jetty usa bastante CPU para responder diversas requisições simultâneas. Isso não chega a ser um problema, já que os dois processadores que o servidor possui são mais do que suficientes para atender a quantidade de requisições por segundo que o GUJ recebe hoje.</p>
<p>Apesar de termos <a href="http://jira.codehaus.org/browse/JETTY-256">algumas suspeitas</a>, ainda não investigamos a razão do alto uso de CPU. Este é um ponto a ser abordado, caso o GUJ tenha problemas com disponibilidade de processamento algum dia.</p>
<p>Mesmo não representando um problema hoje, esta situação preocupa já que o MySQL rodando na mesma máquina também costuma usar bastante CPU. Isto pode se tornar um problema em algum dia que tenha um pouco mais de requisições por segundo do que o comum, já que o uso de CPU chegava as vezes perto do limite. Felizmente, grande parte das requisições ao servidor do GUJ são para conteúdo estático: imagens, JavaScripts, arquivos CSS, download de pdfs (dos artigos), entre outros. Todo esse conteúdo estático era servido pelo Jetty, contribuindo para o alto uso de CPU. Resolvemos então tentar um <a href="http://en.wikipedia.org/wiki/Reverse_proxy">proxy reverso</a> na frente do Jetty, especificamente para servir este conteúdo estático.</p>
<p><center><img src='http://blog.caelum.com.br/wp-content/uploads/2008/06/reverse_proxy.png' alt='proxy reverso servindo conteúdo estático' /></center>
<p/>
<p>Existem diversas alternativas de <a href="http://en.wikipedia.org/wiki/Reverse_proxy">proxy reverso</a> e a primeira a ser considerada quase sempre é o conhecido servidor web <a href="http://httpd.apache.org/">Apache Httpd</a>, com a adição do <a href="http://httpd.apache.org/docs/2.0/mod/mod_proxy.html">mod_proxy</a>. É uma excelente solução e existe bastante documentação para fazer tudo funcionar. No entanto, faz um tempo que eu já estava querendo testar o servidor <a href="http://nginx.net/">russo</a> <a href="http://wiki.codemongers.com/Main">Nginx</a>, tão falado pelo pessoal da <a href="http://engineyard.com/">Engine Yard</a>.</p>
<p>A desvantagem do Nginx para o Apache Httpd é a documentação não tão extensa. Esse é um grande problema para a comunidade do Nginx, que tem se esforçado em traduzir grande parte do que está escrito em russo. Apesar disso, o Nginx é impressionante e superou todas as nossas expectativas. Além de ser extremamente rápido, consome <strong>pouquíssimos</strong> recursos. Cada um dos processos (1 master + 5 workers) consome na maior parte do tempo apenas <strong>1%</strong> de CPU e <strong>0.2%</strong> da memória disponível do nosso servidor. Incrível!</p>
<p>O conteúdo estático do GUJ agora é todo servido pelo Nginx; as requisições nem chegam ao Jetty. Além disso, o Nginx, como um bom proxy reverso, oferece diversas otimizações. Uma essencial para o GUJ é o preenchimento automático dos cabeçalhos HTTP de cache, sugerindo aos browsers que façam cache do conteúdo estático. Agora o consumo de CPU diminuiu consideravalmente.</p>
<p><center><a href='http://blog.caelum.com.br/wp-content/uploads/2008/06/nginx.png' title='uso de recursos do nginx no GUJ'><img src='http://blog.caelum.com.br/wp-content/uploads/2008/06/nginx.png' alt='uso de recursos do nginx no GUJ' /></a></center>
<p/>
<p>Não fizemos nenhum comparativo científico de performance, mas a melhora dos tempos de resposta do GUJ está visível. Frequentemente tenho a sensação de que o site está <em>&#8220;voando&#8221;</em>.</p>
<p>Configuramos também no Nginx a <a href="http://www.nginx.eu/nginx-rrd.html">exibição de algumas estatísticas de acesso</a>; tão valiosas ao GUJ. É <strong>assustador</strong> como o padrão de acesso se repete a cada dia, e a cada semana. Repare como o gráfico de requisições por segundo é praticamente <strong>idêntico</strong> para cada dia (com exceção do sábado e domingo, que são parecidos entre si).</p>
<p><center><a href='http://blog.caelum.com.br/wp-content/uploads/2008/06/guj-requests-week.png' title='requisições por segundo no GUJ, em uma semana'><img src='http://blog.caelum.com.br/wp-content/uploads/2008/06/guj-requests-week.png' alt='requisições por segundo no GUJ, em uma semana' border="none" width="558" height="160"/></a></center>
<p/>
<p>Temos também o interesante gráfico de conexões por segundo, que mostra relação média aproximada de <strong>3 requisições por conexão</strong>.</p>
<p><center><a href='http://blog.caelum.com.br/wp-content/uploads/2008/06/guj-connections-week.png' title='conexões por segundo no GUJ, em uma semana'><img src='http://blog.caelum.com.br/wp-content/uploads/2008/06/guj-connections-week.png' alt='conexões por segundo no GUJ, em uma semana' border="false" width="558" height="190"/></a></center>
<p/>
<p>Note que a legenda do gráfico está errada, já que deveria mostrar <em>&#8220;connections/sec&#8221;</em>. O pequeno pico que dá para ver no gráfico aparece por causa de alguns testes de carga que fizemos neste dia. Pode ser desconsiderado.</p>
<p>Fizemos ainda algumas experiências com múltiplos servidores Jetty por trás do Nginx, funcionando também como <a href="http://en.wikipedia.org/wiki/Load_balancing_(computing)">balanceador de carga</a>. Espero em breve postar sobre nossa experiência em geral com balanceamento de carga e alguns outros truques que pudemos testar nesta experiência do GUJ e em alguns clientes.</p>
<p>Aproveitando o post, o <a href="http://www.guj.com.br/posts/list/94487.java">GUJ recentemente comemorou</a> a marca de <strong>meio milhão de mensagens</strong>. É um orgulho poder fazer parte desta comunidade, e mais ainda por poder torná-la cada vez melhor.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/2008/06/27/melhorando-o-guj-jetty-nio-e-load-balancing/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Novidades: Caelum RJ, FalandoEmAgile 2008 e Treinamento JBoss Seam</title>
		<link>http://blog.caelum.com.br/2008/06/24/novidades-caelum-rj-falandoemagile-2008-e-treinamento-jboss-seam/</link>
		<comments>http://blog.caelum.com.br/2008/06/24/novidades-caelum-rj-falandoemagile-2008-e-treinamento-jboss-seam/#comments</comments>
		<pubDate>Tue, 24 Jun 2008 11:43:06 +0000</pubDate>
		<dc:creator>Nico Steppat</dc:creator>
		
		<category><![CDATA[caelum]]></category>

		<category><![CDATA[eventos]]></category>

		<category><![CDATA[scrum]]></category>

		<category><![CDATA[seam]]></category>

		<category><![CDATA[Agile]]></category>

		<category><![CDATA[falandoemagile]]></category>

		<category><![CDATA[jboss seam]]></category>

		<category><![CDATA[rio de janeiro]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/2008/06/24/novidades-caelum-rj-falandoemagile-2008-e-treinamento-jboss-seam/</guid>
		<description><![CDATA[Algumas novidades da Caelum para o segundo semestre:
Caelum Rio de Janeiro
Dado o grande público de treinamento que já atendemos no Rio de Janeiro, e somando a isso o fato de dois de nossos atuais clientes de consultoria serem no Rio, estamos definitivamente estendendo nossos trabalhos para lá, com sede próxima à avenida Rio Branco.
Eu, Nico [...]]]></description>
			<content:encoded><![CDATA[<p>Algumas novidades da Caelum para o segundo semestre:</p>
<h3>Caelum Rio de Janeiro</h3>
<p>Dado o grande público de treinamento que já atendemos no Rio de Janeiro, e somando a isso o fato de dois de nossos atuais clientes de consultoria serem no Rio, estamos definitivamente estendendo nossos trabalhos para lá, com sede próxima à avenida Rio Branco.</p>
<p>Eu, Nico Steppat, pessoalmente, serei o responsável pelo início das operações da Caelum em território carioca, neste próximo semestre. Estou há pouco mais de cinco anos no Brasil desde que saí da Alemanha, sendo mais de dois anos na Caelum. Para mim, esse será mais um desafio: levar a qualidade da Caelum para o Rio de Janeiro, onde já me encontro.</p>
<h3>Falando Em Agile 2008</h3>
<p>Dado o sucesso do <a href="http://blog.caelum.com.br/2007/07/06/fatos-e-fotos-do-falando-em-java-2007/">Falando em Java 2007</a> e do <a href="http://blog.caelum.com.br/2008/05/20/falando-em-java-2008-eu-fui/">Falando em Java 2008</a>, juntamento com o nosso envolvimento em metodologias ágeis, teremos em outubro o <a href="http://www.falandoemagile.com.br/">Falando Em Agile 2008</a>! O evento contará com ninguém menos que <a href="http://www.agilemanagement.net/">David Anderson</a>!</p>
<p><img src="http://www.caelum.com.br/falando-em-agile/david.png" alt="David Anderson" align=right /><b>David Anderson</b> foi gerente e líder de excelentes equipes de software, entregando produtos de ponta desde 1991. Ele ajudou a fundar a APLN (Agile Project Leadership Network), uma organização sem fins lucrativos dedicada a encorajar uma melhor liderança e gestão no setor de TI, e é um palestrante e apresentador popular, autor de muitos artigos sobre gestão de engenharia de software, além de escritor e editor do popular blog Agile Management.</p>
<p>David entrou em cena no desenvolvimento ágil de software muito cedo, como membro original do time em Cingapura que criou a Feature Driven Development (FDD), um dos seis métodos ágeis originais. Baseado em sua experiência com a FDD na Sprint PCS, posteriormente escreveu o primeiro livro sobre a gestão do desenvolvimento ágil, &#8220;Agile Management for Software Engineering&#8221;, publicado  em 2003. Como arquiteto de processo para a MSF for CMMI da Microsoft, ele se tornou versado na aplicação de técnicas ágeis ao CMMI do Software Engineering Institute (SEI) e estabeleceu um forte relacionamento profissional com pessoas-chave nessas comunidades. David é especialista em mudança cultural para a implantação instucionalizada e de longa duração de equipes de desenvolvimento Ágil e Lean (Enxuto) de software. Atualmente é um dos diretores da Modus Cooperandi.</p>
<p>O evento já tem também a presença confirmada do CSP <b>Alexandre Magno</b>, de <b>Adail Retamal</b> e de <b>Guilherme Silveira</b>. Muito em  breve teremos mais informações, além da grade completa e inscrições.</p>
<h3>FJ-34 - JBoss Seam</h3>
<p><img src="http://www.seamframework.org/themes/sfwkorg/img/seam_icon_large.png" alt="JBoss Seam" align=left /> Sem dúvida alguma o <a href="http://www.seamframework.org/">JBoss Seam</a> é o framework Java EE que mais tem ganho atenção ultimamente. E isso não é sem razão: ele faz uma excelente ponte entre o EJB3 e o JSF, as duas principais e mais bem sucedidas especificações do Java EE da atualidade. Liderado por Gavin King, o mesmo criador do Hibernate, o JBoss Seam já é até uma cobiçada especificação: a <a href="http://jcp.org/en/jsr/detail?id=299">JSR 299, WebBeans</a>. Emmanuel Bernard, que esteve no evento Falando Em Java 2008, trabalha lado a lado com Gavin King desde o <em>Hibernate 1 beta</em> e nos atualizou com muitas informações durante sua estadia no Brasil e conversas na Caelum.</p>
<p><img src="http://www.caelum.com.br/caelum/images/fj34-icon.gif" alt="FJ 34 Jboss Seam" align="right" /> Com o know how adquirido em diversas consultorias com JSF, EJB3, JBoss e Hibernate, criamos o treinamento <a href="http://www.caelum.com.br/caelum/treinamento-fj-34-desenvolvimento-web-agil-jboss-seam.jsp">FJ-34: Desenvolvimento para Web com o JBoss Seam</a>. Neste treinamento, você vai conhecer a fundo os problemas que o Seam resolve ao integrar as duas grandes tecnologias do Java EE 5, passando pelos recursos facilitados pelo frameworks até o JBPM. Esperamos você lá!</p>
<p><b>atualizado</b>: o evento Falando em Agile será dias 23 e 24 de outubro</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/2008/06/24/novidades-caelum-rj-falandoemagile-2008-e-treinamento-jboss-seam/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Qualidade com Scrum</title>
		<link>http://blog.caelum.com.br/2008/06/02/qualidade-com-scrum/</link>
		<comments>http://blog.caelum.com.br/2008/06/02/qualidade-com-scrum/#comments</comments>
		<pubDate>Mon, 02 Jun 2008 22:22:01 +0000</pubDate>
		<dc:creator>Edmilson Miyasaki</dc:creator>
		
		<category><![CDATA[eventos]]></category>

		<category><![CDATA[palestras]]></category>

		<category><![CDATA[scrum]]></category>

		<category><![CDATA[Agile]]></category>

		<category><![CDATA[Ágil]]></category>

		<category><![CDATA[metodologias]]></category>

		<category><![CDATA[Qualidade]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/2008/06/02/qualidade-com-scrum/</guid>
		<description><![CDATA[Tive a oportunidade de palestrar juntamente com o Alexandre Magno no Falando em Java 2008. Um tema recorrente durante as discussões depois de palestras e workshops sobre Scrum é Qualidade.
Quando falamos sobre qualidade em software, surgem diversas dúvidas quanto ao que significa ter qualidade em um software: ter um código bem escrito? Testes unitários? Código [...]]]></description>
			<content:encoded><![CDATA[<p>Tive a oportunidade de palestrar juntamente com o <a href="http://amagno.blogspot.com/">Alexandre Magno</a> no <a href="http://blog.caelum.com.br/2008/05/20/falando-em-java-2008-eu-fui/">Falando em Java 2008</a>. Um tema recorrente durante as discussões depois de palestras e workshops sobre Scrum é <strong>Qualidade</strong>.</p>
<p>Quando falamos sobre qualidade em software, surgem diversas dúvidas quanto ao que significa ter qualidade em um software: ter um código bem escrito? Testes unitários? Código que não apresente falhas? Boa performance no que se propõe a fazer? Documentação?</p>
<p>De acordo com a NBR 13596 (ISO/IEC 9126), existem algumas características que um software deve apresentar para ser considerado como um software de qualidade. Estas características são listadas na tabela a seguir:</p>
<table align="center" border="1" width="80%" style="margin-left:20px;">
<tr>
<th align="left" width="50%">Característica</th>
<th align="left">Descrição</th>
</tr>
<tr>
<td>Funcionalidade</td>
<td>Satisfaz as necessidades?</td>
</tr>
<tr>
<td>Confiabilidade</td>
<td>É imune a falhas?</td>
</tr>
<tr>
<td>Usabilidade</td>
<td>É fácil de usar?</td>
</tr>
<tr>
<td>Eficiência</td>
<td>É rápido e &#8220;enxuto&#8221;?</td>
</tr>
<tr>
<td>Manutenibilidade</td>
<td>É fácil de modificar?</td>
</tr>
<tr>
<td>Portabilidade</td>
<td>É fácil de usar em outro ambiente?</td>
</tr>
</table>
<p>A maioria das características que determinam um software com qualidade referem-se mais a boas práticas de engenharia de software ou eficiência da plataforma tecnológica. Entretanto, <strong>Scrum</strong>, como framework para gerenciamento de projetos, também é capaz de oferecer qualidade no processo de desenvolvimento.</p>
<p>Em Scrum, conseguimos uma melhora na qualidade através de diversos pontos. Obter esta melhora na qualidade depende muito se Scrum está sendo bem implementado ou não.</p>
<p>Dentre estes pontos, podemos destacar:</p>
<ul>
<li>Iterações</li>
<li>Remoção de impedimentos</li>
<li>Inspeção e adaptação</li>
<li>Autonomia</li>
<li>Times multifuncionais</li>
</ul>
<h3>Iterações</h3>
<p>Qualidade em software também significa entregar para o cliente algo que lhe seja <em>realmente útil</em>, de acordo com suas necessidades.</p>
<p>Por ser uma framework ágil, Scrum trabalha com <strong>iterações</strong>, onde a cada iteração entregamos software, ou incrementos de software, potencialmente usável e de acordo com a necessidade do cliente. E, a cada nova iteração, temos &#8220;feedback&#8221; do que foi entregue e que utilizamos para melhorar o produto (sempre de acordo com a prioridade do cliente).</p>
<p>O &#8220;<strong>feedback</strong>&#8221; do cliente existiria de qualquer forma, seja apresentando o produto ao final de uma iteração, seja ao final de todo o ciclo de desenvolvimento (o que normalmente acarreta em alterações no código). Entretanto, se estas alterações forem feitas no final do projeto, isto também pode causar efeitos colaterais indesejados, ao passo que, fazê-las de forma antecipada, impede este tipo de problemas.</p>
<p>Através das <strong>Sprints</strong>, times Scrum estão sempre desenvolvendo algo que realmente tenha valor para o cliente.</p>
<h3>Remoção de impedimentos</h3>
<p>Remover qualquer tipo de <em>impedimento</em> durante a execução de um projeto é essencial não importa qual metodologia seja utilizada. Em Scrum, é esperado que estes problemas apareçam. Mas, o que é feito após resolver este impedimento, determina se um time está utilizando Scrum corretamente ou não.</p>
<p>Durante a execução de uma Sprint, é recomendável que a execução das tarefas seja feita item a item ao invés de cada membro executar tarefas de itens diferentes. Isso tem duas razões: a primeira é relacionada ao valor para o cliente. Para um cliente, um item somente tem valor caso tenha sido entregue completamente &#8212; algo que esteja funcionando 80% não lhe trará vantagem alguma. Além disso, executar um item completamente ajuda a manter o foco da equipe na meta e no item em específico. Desenvolvedores em geral tendem a ser mais orientados a tarefas ao invés de orientados a valor. Manter o foco na meta ajuda a aumentar a qualidade do item sendo desenvolvido.</p>
<p>A outra razão é em relação à forma como os problemas são resolvidos e como suas correspondentes soluções são utilizadas. A execução completa de um item representa um fluxo completo de execução e faz parte do processo utilizado no desenvolvimento. Neste caso, problemas que poderiam se tornar recorrentes podem ser solucionados imediatamente, permitindo que isso não se repita na execução dos próximos itens. Desta forma, estamos aprimorando o processo, o que também reflete na qualidade do produto.</p>
<h3>Inspeção e adaptação</h3>
<p>Ao final da execução de uma Sprint, há a <strong>Sprint Retrospective</strong>, uma das cerimônias de Scrum. Nela, revisamos a Sprint (<strong>inspeção</strong>) e determinamos o que foi bom e o que precisa ser melhorado (<strong>adaptação</strong>). As adaptações podem ser individuais ou coletivas, mas, de qualquer forma, elas garantem a melhora do processo e consequente otimização, o que traz diversos benefícios.</p>
<p>Com um processo mais enxuto e mais eficiente, podemos ter um software com mais qualidade.</p>
<h3>Autonomia</h3>
<p>Times em Scrum são <strong>auto-gerenciados</strong>, o que significa uma menor pressão sobre eles. Desta forma, cada um dos membros pode selecionar o que fará e terá o tempo necessário para fazê-lo com qualidade. Estudos mostram que, sob pressão de prazos exíguos, a primeira coisa a ser deixada de lado pelos desenvolvedores é a qualidade.</p>
<p>Além disso, através desta autonomia, os membros do time passam a ter uma melhor qualidade de vida, o que reflete em uma melhoria na qualidade como um todo. Isso porque passam a ter mais tempo e disposição para pesquisar uma melhor forma de abordar e executar uma tarefa. Em um ambiente onde Scrum tenha sido bem implantado, este aprimoramento pessoal é compartilhado com os outros membros, o que traz mais incremento na qualidade.</p>
<h3>Times multifuncionais</h3>
<p>Quando montamos os times, procuramos sempre montá-los com membros que tenham diferentes características ou atribuições. Por exemplo, ao invés de um time formado só por desenvolvedores ou só de analistas de requisitos, procuramos misturá-los e formar diversos times Scrum.</p>
<p>Isto porque a experiência de cada um é extremamente útil no planejamento das tarefas a serem executadas na Sprint. Entretanto, existe um conceito maior escondido por trás disto: <strong>qualidade desde o início</strong>.</p>
<p>Pude presenciar em diversas ocasiões a seguinte situação: empresas utilizando o modelo em cascata, faziam o levantamento de requisitos no início do projeto. Em seguida, arquitetos de sistema e especialistas no negócio modelavam as classes para atender a todos os requisitos levantados na etapa anterior. Depois (bem depois, por sinal), estes modelos eram passados para a equipe de desenvolvimento e o resultado era testado pela equipe de Q&amp;A e homologação. No final do processo, isto era entregue à equipe de implantação.</p>
<p>Invariavelmente, o contato com o cliente era feito no início do projeto, onde este apresentava todos os requisitos possíveis e imagináveis para o produto. Embora saibamos que o cliente sabe o que precisa mas tenha somente uma vaga idéia do que quer, ele era obrigado a informar o que desejava que fosse desenvolvido, e por isso a quantidade de requisitos, algumas vezes desnecessários, era imensa.</p>
<p>Durante a modelagem, os analistas modelavam o que era necessário para a aplicação, muitas vezes deixando de lado alguns detalhes que poderiam facilitar o desenvolvimento ou ignorando outros detalhes que pudessem melhorar o acesso aos dados.</p>
<p>Os desenvolvedores, por sua vez, simplesmente executavam o que foi determinado pelos arquitetos e no prazo determinado pelo gerente de projeto.</p>
<p>Depois de devidamente codificado, o resultado era passado para a equipe de Q&amp;A, que testava o que tinha sido produzido e retornava o resultado dos testes à equipe de desenvolvimento. Infelizmente, isto era feito invariavelmente aos lotes &#8212; os testadores eram obrigados a testarem diversos recursos de uma vez, muitas vezes impossibilitando testes com aspectos mais amplos.</p>
<p>Como tudo isso feito às pressas, em algumas situações, a equipe de implantação era informada com poucos dias de antecedência (e em uma situação, a equipe foi informada que tinha até o final da tarde para implantar um sistema). Com tão pouco prazo, muitas vezes a implantação era feita sem qualquer teste, simplesmente esperando que a sorte sorrisse para eles.</p>
<p>Note que os cinco parágrafos anteriores descreveram cada um dos estágios no desenvolvimento. E isto reflete como o desenvolvimento era feito &#8212; sem qualquer comunicação adicional entre cada uma das etapas que não fosse a documentação do sistema. É fácil descobrir o resultado disso.</p>
<p>Através de <strong>times multifuncionais</strong>, a cada Sprint temos a opinião de especialistas em diferentes áreas definindo o que será feito naquela Sprint. Enquanto não sabemos o que o cliente realmente quer como produto, sabemos o que é mais importante para ele, com estes especialistas definindo a melhor abordagem possível, levando em consideração os aspectos nos quais cada um é melhor. Assim, arquitetos podem começar definindo as classes levando em consideração a opinião de um especialista em banco de dados, de domínio, etc.</p>
<p>Utilizando o princípio de qualidade desde o início, o código tende a ser mais enxuto, mais adaptável, a ter mais performance. Como a interação com o usuário é constante, o produto estará sempre de acordo com a necessidade do usuário. E com a presença de um especialista em testes, cada tarefa executada já pode ser testada e eventualmente corrigida rapidamente.</p>
<p>E finalmente, um especialista em implantação já sabe antecipadamente o que deve testar e providenciar como ambiente de produção.</p>
<h3>Conclusões</h3>
<p>Existe uma beleza singular na simplicidade apresentada por Scrum. Entretanto, por trás desta simplicidade, existem conceitos que não devem ser ignorados, sob pena de obter somente parte dos benefícios de Scrum.</p>
<p>Um ScrumMaster deve estar sempre atento aos diversos sinais que o time apresenta, bem como motiva-los e desafia-los, sempre em busca constante do aprimoramento individual como seres humanos e o time como um todo. Além disso, buscar a melhoria contínua do processo permite que a qualidade passe a ser uma constante em futuros projetos de software.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/2008/06/02/qualidade-com-scrum/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Domain-Driven Design no Falando em Java 2008</title>
		<link>http://blog.caelum.com.br/2008/05/26/domain-driven-design-no-falando-em-java-2008/</link>
		<comments>http://blog.caelum.com.br/2008/05/26/domain-driven-design-no-falando-em-java-2008/#comments</comments>
		<pubDate>Tue, 27 May 2008 02:54:30 +0000</pubDate>
		<dc:creator>Sérgio Lopes</dc:creator>
		
		<category><![CDATA[caelum]]></category>

		<category><![CDATA[design patterns]]></category>

		<category><![CDATA[eventos]]></category>

		<category><![CDATA[oo]]></category>

		<category><![CDATA[palestras]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/2008/05/26/domain-driven-design-no-falando-em-java-2008/</guid>
		<description><![CDATA[
No Falando em Java 2008, apresentei uma palestra introdutória sobre Domain-Driven Design. Apesar do tempo curto, os comentários foram ótimos! Muito obrigado a todos os que comentaram: pessoas no evento, blogs e GUJ. Falar de DDD em 40 min foi meu maior desafio e acabou faltando um pouquinho de tempo no final, mas deu para [...]]]></description>
			<content:encoded><![CDATA[<p><center><img src='http://blog.caelum.com.br/wp-content/uploads/2008/05/ddd.png' /></center><br />
No <a href="http://blog.caelum.com.br/2008/05/20/falando-em-java-2008-eu-fui/">Falando em Java 2008</a>, apresentei uma palestra introdutória sobre <a href="http://www.domaindrivendesign.org/">Domain-Driven Design</a>. Apesar do tempo curto, os comentários foram ótimos! Muito obrigado a todos os que comentaram: pessoas no evento, blogs e GUJ. Falar de DDD em 40 min foi meu maior desafio e acabou faltando um pouquinho de tempo no final, mas deu para passar a mensagem.</p>
<h3>Domain e Ubiquitous Language</h3>
<p>O ponto fundamental do DDD é o primeiro D, o <strong>Domain</strong>. Tudo gira em torno desse tal de Domínio. O domínio é, em poucas palavras, o problema que queremos resolver com o programa que estamos desenvolvendo. <em>Alguém</em> (um cliente) tem um <em>problema</em> na área de atuação dele (geralmente nada a ver com informática) e contrata uma equipe de programação para ajudá-lo (nós :).</p>
<p>Segundo o DDD, é <strong>impossível</strong> resolver esse problema satisfatoriamente sem entender direito o que acontece no domínio do cliente. Não basta os desenvolvedores saberem mais ou menos: é necessário entrar fundo no domínio do cliente.</p>
<p>Mas é claro que nosso objetivo não é se tornar um especialista completo na área do cliente, mas apenas compreendê-la. A palavra-chave para isso acontecer é <strong>Conversa</strong>. Conversa constante e profunda entre os especialistas de domínio e os desenvolvedores. </p>
<p>Aqueles que conhecem o domínio em detalhes devem conversar com aqueles que conhecem programação em detalhes. Juntos, tentarão chegar a uma <strong>língua comum</strong> em que todos consigam se entender e que será usada em todas as conversas. É o que o DDD chama de <strong>Ubiquitous Language</strong>: uma língua baseada nos termos do domínio, não totalmente aprofundada neste, mas suficiente para descrever o problema satisfatoriamente.</p>
<h3>Construção do Domain Model</h3>
<p>Durante a conversa constante, todos juntos chegarão a um consenso sobre o Domínio. Os especialistas de domínio eventualmente criarão simplificações para facilitar a conversa; e os desenvolvedores podem introduzir conceitos técnicos simples.</p>
<p>Com isso, todos criam um <em>modelo do domínio</em>. É uma abstração do problema real, desenvolvida em conjuntos pelos especialistas do domínio e desenvolvedores. No DDD, é chamado de <strong>Domain Model</strong>.</p>
<p><strong>É esse modelo que os desenvolvedores vão implementar em código</strong>. Literalmente. Item por item, como foi acordado por todos. Será desenvolvido um código limpo, com palavras do domínio, que representa, na programação, o domínio em discussão.<br />
<img src='http://blog.caelum.com.br/wp-content/uploads/2008/05/2505605674_ed952c43a9.jpg' alt='Foto do Sérgio no FJ2008' align="left" style="margin: 15px; margin-left: 0" /><br />
Usando DDD, seu programa orientado a objetos deve expressar a riqueza do domain model. Qualquer mudança no modelo (e, acredite, isso é muito comum) deve ser refletida imediatamente no código. Se algo do modelo torna-se inviável de se implementar tecnicamente, não se faz um &#8220;ajustezinho&#8221; no código; o modelo deve ser mudado para ser mais fácil de se implementar.</p>
<p>Ou seja, <strong>sempre seu código será expressão do modelo</strong>, que por sua vez é baseado totalmente no domínio.</p>
<h3>Implementando o Domain Model</h3>
<p>O DDD define uma série de patterns para facilitar a implementação do modelo em código. <strong>Mas, com absoluta certeza, esse não é o ponto principal do DDD</strong>. São apenas ferramentas que facilitam essa implementação.</p>
<p>Na palestra, mostrei alguns patterns de forma bem simples e rápida, como Entity e <a href="http://martinfowler.com/bliki/ValueObject.html">Value Object</a>. E mostrei o tão discutido, debatido e mal-compreendido <a href="http://martinfowler.com/eaaCatalog/repository.html">Repository</a>.</p>
<p>O cliente descreve ao desenvolvedor o seguinte problema: <em>&#8220;preciso saber todos os peixes que são da cor azul&#8221;</em>. (na palestra, usei o exemplo de uma loja de peixes) Para o cliente, é natural em seu domínio, que se consiga &#8220;buscar&#8221; coisas. A idéia é recuperar &#8220;objetos&#8221; do domínio (entities) previamente conhecidos, baseado eventualmente em algum critério.</p>
<p>A noção de <strong>repositório</strong> surge justo dessa necessidade: chegar nos objetos de conhecimento do domínio. Na palestra, eu levantei a questão de que o nome repositório não deve ser algo interno ao código, mas <strong>deve fazer parte da Ubiquitous Language</strong>, deve aparecer nas conversas e no Domain Model. Ou seja, repositório deve ser um conceito que o especialista de domínio também entende e, por que está no Model, é ele que vai para o código.</p>
<p>Não há problema em trazer palavriado técnico para a Ubiquitous Language, desde que o príncipio da UL seja mantida: todos entendem o conceito. E, se, eventualmente, no contexto do domínio sendo tratado, outro nome faça mais sentido que repositório, esse nome deve ser usado (mesmo que nós técnicos saibamos que no fundo aquilo é um repositório).</p>
<p><strong>Repositório como interface? Classe concreta delegando? DAO implementa Repository?</strong><br />
Tanto faz. Um outro ponto fundamental do DDD é: nada tem resposta definitiva. Se você entende a questão toda do Domain Model e aplica essa noção na programação, pode usar diversas formas diferentes de implementar tudo isso.</p>
<p>Na palestra, eu representei o Repository como uma interface dentro do Model. E a implementação (que, do ponto de vista do DDD, <em>não importa</em>) era um DAO com Hibernate na camada de infraestrutura.</p>
<h3>Concluindo</h3>
<p>Meu ponto principal na palestra foi mostrar a Ubiquitous Language e o Domain Model, que são o coração do DDD. Vou escrever um segundo artigo com códigos e mais comentários da palestra, mas paro esse artigo gigante por aqui.</p>
<p>Termino <a href="http://blog.fragmental.com.br/2008/05/22/domain-driven-design-e-simples/">linkando para um excelente post do Philip Calçado</a> que ele publicou essa semana (parece até que combinamos) sobre DDD falando justo que o que conta no DDD é o Domínio e não os Patterns. Ele conta uma historinha de um projeto onde todos &#8220;entendiam&#8221;  DDD, usavam Repositórios, Entities etc, mas infelizmente não falavam a mesma língua do domínio.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/2008/05/26/domain-driven-design-no-falando-em-java-2008/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Caelum Stella - o cinto de utilidades para o desenvolvedor brasileiro</title>
		<link>http://blog.caelum.com.br/2008/05/21/caelum-stella-o-cinto-de-utilidades-para-o-desenvolvedor-brasileiro/</link>
		<comments>http://blog.caelum.com.br/2008/05/21/caelum-stella-o-cinto-de-utilidades-para-o-desenvolvedor-brasileiro/#comments</comments>
		<pubDate>Wed, 21 May 2008 20:38:14 +0000</pubDate>
		<dc:creator>Fabio Kung</dc:creator>
		
		<category><![CDATA[caelum]]></category>

		<category><![CDATA[hibernate]]></category>

		<category><![CDATA[integração]]></category>

		<category><![CDATA[open source]]></category>

		<category><![CDATA[boleto]]></category>

		<category><![CDATA[cnpj]]></category>

		<category><![CDATA[cpf]]></category>

		<category><![CDATA[formatação]]></category>

		<category><![CDATA[inscrição estadual]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[jsf]]></category>

		<category><![CDATA[nota fiscal]]></category>

		<category><![CDATA[seam]]></category>

		<category><![CDATA[validação]]></category>

		<category><![CDATA[vraptor]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/2008/05/21/caelum-stella-o-cinto-de-utilidades-para-o-desenvolvedor-brasileiro/</guid>
		<description><![CDATA[Durante o Falando em Java 2008 do último fim de semana (18/05/2008), anunciamos o lançamento do novo Caelum Stella.
O projeto vem para auxiliar os desenvolvedores brasileiros, suprindo algumas das necessidades comumente encontradas em aplicações desenvolvidas aqui no Brasil. Atualmente, o Caelum Stella fornece uma biblioteca de validadores, formatadores e conversores para documentos brasileiros, tais como [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://stella.caelum.com.br/images/logos/stella.jpg" alt="stella" align=left />Durante o <a href="http://www.falandoemjava.com.br">Falando em Java 2008</a> do último fim de semana (18/05/2008), anunciamos o lançamento do novo <a href="http://stella.caelum.com.br">Caelum Stella</a>.</p>
<p>O projeto vem para auxiliar os desenvolvedores brasileiros, suprindo algumas das necessidades comumente encontradas em aplicações desenvolvidas aqui no Brasil. Atualmente, o <a href="http://stella.caelum.com.br">Caelum Stella</a> fornece uma biblioteca de validadores, formatadores e conversores para documentos brasileiros, tais como CPF, CNPJ e PIS/PASEP.</p>
<p><code><font color="#ffffff">&nbsp;</font><font color="#000000">String&nbsp;cpf&nbsp;=&nbsp;</font><font color="#2a00ff">&#34;867.554.707-24&#34;</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;</font><font color="#000000">CPFValidator&nbsp;vld&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">CPFValidator</font><font color="#000000">();</font><br />
<font color="#ffffff">&nbsp;</font><font color="#7f0055"><b>for</b></font><font color="#000000">(</font><font color="#000000">ValidationMessage&nbsp;error&nbsp;:&nbsp;</font><span style="border: 1px dashed #000; padding: 2px;"><font color="#000000">vld.invalidMessagesFor</font><font color="#000000">(</font><font color="#000000">cpf</font><font color="#000000">)</span>)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.out.println</font><font color="#000000">(</font><font color="#000000">error.getMessage</font><font color="#000000">())</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;</font><font color="#000000">}</font><br />
</code></p>
<p>Há uma alternativa que lança <a href="http://stella.caelum.com.br/core-validators.html">uma exceção</a> caso ocorra algum problema de validação:</p>
<p><code><font color="#ffffff">&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">CPFValidator</font><font color="#000000">()</font><font color="#000000">.assertValid</font><font color="#000000">(</font><font color="#2a00ff">&#34;867.554.707-24&#34;</font><font color="#000000">)</font><font color="#000000">;</font><br />
</code></p>
<p>O Stella também inclui módulos extras, como o de geração de boletos bancários, adaptadores para JSF, VRaptor, JBoss Seam e Hibernate Validator. Veja um exemplo de validação para CPFs usando o Caelum Stella junto ao Hibernate Validator:</p>
<p><code><font color="#ffffff">&nbsp;&nbsp;</font><font color="#646464">@Entity</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>public&nbsp;class&nbsp;</b></font><font color="#000000">Modelo&nbsp;</font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#646464">@CPF</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#000000">String&nbsp;cpf;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>public&nbsp;</b></font><font color="#000000">String&nbsp;getCpf</font><font color="#000000">()&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>return&nbsp;</b></font><font color="#000000">cpf;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
</code></p>
<p>O módulo Stella Faces conta com alguns validadores compatíveis com a especificação JSF, que você pode adicionar aos seus componentes:</p>
<pre><code>
&lt;h:inputText id=&quot;cpf&quot; value=&quot;#{usuarioBean.cpf}&quot;&gt;
  &lt;stella:validateCPF/&gt;
&lt;/h:inputText&gt;
</code></pre>
<p>O Stella Boleto procura fornecer um idioma mais fluente para a geração de boletos, através do encadeamento de métodos, gerando PDFs, PNGs e em breve TXT, RTF e HTML:</p>
<p><code><font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">Boleto&nbsp;boleto&nbsp;=&nbsp;Boleto.newBoleto</font><font color="#000000">()</font><br/><font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">.withBanco</font><font color="#000000">(</font><font color="#000000">banco</font><font color="#000000">)</font><font color="#000000">.withDatas</font><font color="#000000">(</font><font color="#000000">datas</font><font color="#000000">)</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">.withDescricoes</font><font color="#000000">(</font><font color="#2a00ff">&#34;descricao&nbsp;1&#34;</font><font color="#000000">,&nbsp;</font><font color="#2a00ff">&#34;descricao&nbsp;2&#34;</font><font color="#000000">,&nbsp;</font><font color="#2a00ff">&#34;descricao&nbsp;3&#34;</font><font color="#000000">)</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">.withEmissor</font><font color="#000000">(</font><font color="#000000">emissor</font><font color="#000000">)</font><font color="#000000">.withSacado</font><font color="#000000">(</font><font color="#000000">sacado</font><font color="#000000">)</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">.withValorBoleto</font><font color="#000000">(</font><font color="#2a00ff">&#34;200.00&#34;</font><font color="#000000">)</font><font color="#000000">.withNoDocumento</font><font color="#000000">(</font><font color="#2a00ff">&#34;1234&#34;</font><font color="#000000">)</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">.withInstrucoes</font><font color="#000000">(</font><font color="#2a00ff">&#34;instrucao&nbsp;1&#34;</font><font color="#000000">,&nbsp;</font><font color="#2a00ff">&#34;instrucao&nbsp;2&#34;</font><font color="#000000">,&nbsp;</font><font color="#2a00ff">&#34;instrucao&nbsp;3&#34;</font><font color="#000000">)</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">.withLocaisDePagamento</font><font color="#000000">(</font><font color="#2a00ff">&#34;local&nbsp;1&#34;</font><font color="#000000">,&nbsp;</font><font color="#2a00ff">&#34;local&nbsp;2&#34;</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">BoletoGenerator</font><font color="#000000">(</font><font color="#000000">boleto</font><font color="#000000">)</font><font color="#000000">.toPNG</font><font color="#000000">(</font><font color="#2a00ff">&#34;teste.png&#34;</font><font color="#000000">)</font><font color="#000000">;</font><br />
</code></p>
<p>Estão ainda previstas no <a href="http://stella.caelum.com.br/roadmap.html">roadmap do projeto</a> funcionalidades como JSP taglibs, rotinas JavaScript para máscaras, validação e suporte a formulários, seleção de cidades dependente da seleção de estados, suporte a mais documentos, geração da <strong>nota fiscal eletrônica</strong>, webservices para busca de endereços através de CEP, entre muitas outras. A lista vem sendo constantemente atualizada e você pode conferi-la através <a href="http://stella.caelum.com.br/roadmap.html">deste link</a>.</p>
<p>Todas estas funcionalidades estão divididas em diversos módulos dentro do Stella. Atualmente são quatro: <a href="http://stella.caelum.com.br/core-index.html">Stella Core</a>, <a href="http://stella.caelum.com.br/hibernate-index.html">Stella Hibernate</a>, <a href="http://stella.caelum.com.br/faces-index.html">Stella Faces</a> e <a href="http://stella.caelum.com.br/boleto-index.html">Stella Boleto</a>. Cada um com um propósito diferente, mas todos relacionados aos problemas do dia a dia recorrentes no mercado brasileiro.</p>
<p>Além de facilitar a vida dos desenvolvedores brasileiros, o projeto prima pela alta qualidade (extensa quantidade de testes unitários, cobertura e documentação) e facilidade de uso. Você pode conferir diversas características técnicas do projeto e dos vários módulos na <a href="http://stella.caelum.com.br/dev/index.html">página técnica, gerada pelo maven</a>. Lá você encontra a <a href="http://stella.caelum.com.br/dev/team-list.html">lista de responsáveis</a> (e respectivos emails), a ótima <a href="http://stella.caelum.com.br/dev/caelum-stella-core/cobertura/index.html">cobertura dos testes</a> para cada um dos módulos e o <a href="http://stella.caelum.com.br/dev/caelum-stella-core/xref/index.html">código fonte</a>  navegável para cada um dos módulos.</p>
<p>Como de costume em qualquer projeto open-source, o código fonte está disponível em um repositório <a href="http://sourceforge.net/svn/?group_id=217573">SVN (subversion) no sourceforge.net</a>. Para baixar os fontes basta usar seu cliente preferido:</p>
<pre><code>svn checkout http://caelum-stella.svn.sourceforge.net/svnroot/caelum-stella/trunk</code></pre>
<p>Você também pode navegar pelo repositório <a href="http://caelum-stella.svn.sourceforge.net/viewvc/caelum-stella/trunk/">neste link</a>.</p>
<p>Para tirar as suas dúvidas, sugerir funcionalidades, apontar bugs e discutir sobre o projeto, não deixe de assinar as listas de discussão, que podem ser encontradas <a href="http://stella.caelum.com.br/dev/mail-lists.html">aqui</a>. Se preferir, pode postar também no <a href="http://www.guj.com.br">GUJ</a>.</p>
<p>Visite, use, comente e participe do desenvolvimento do projeto! </p>
<p><a href="http://stella.caelum.com.br/">stella.caelum.com.br</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/2008/05/21/caelum-stella-o-cinto-de-utilidades-para-o-desenvolvedor-brasileiro/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
