<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-544668644670311424</id><updated>2012-02-01T13:58:36.858-02:00</updated><category term='equals e hashCode'/><category term='Lean'/><category term='Certificação'/><category term='Plugins'/><category term='Oracle-Sun'/><category term='XP'/><category term='DevOps'/><category term='Just Java'/><category term='Java Básico'/><category term='Mobilidade'/><category term='Tutorial'/><category term='SOA'/><category term='JavaOne'/><category term='Plataforma'/><category term='Globalcode'/><category term='Competição'/><category term='EJB'/><category term='ALM'/><category term='TDD'/><category term='Arquitetura'/><category term='L10N'/><category term='Eventos'/><category term='Innovation Games'/><category term='Yahoo'/><category term='Mundo Java'/><category term='IBM'/><category term='Google Wave'/><category term='SouJava'/><category term='REST'/><category term='Portal'/><category term='Web Services'/><category term='Zembly'/><category term='GlassFish'/><category term='InfoQ'/><category term='Projetos'/><category term='NetBeans'/><category term='Web 2.0'/><category term='Google'/><category term='Entrevista'/><category term='Diamond Powder'/><category term='SCSNI'/><category term='JAVA EE'/><category term='Java Magazine'/><category term='Artigos'/><category term='Agile'/><category term='Engenharia'/><category term='Scrum'/><category term='Publicações'/><category term='Widget'/><category term='Wiki'/><category term='Estimativas Ágeis'/><category term='JAVA EE 6'/><title type='text'>NetFeijão Brazil</title><subtitle type='html'>Como seria se a IDE RI da sun, o NetBeans fosse Brasileiro ? 

Este espaço foi criado para você, que gosta de Tecnologia, Java, Metodologias Ágeis e trocar experiência.

Seja bem vindo..</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>72</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-417620954050138283</id><published>2012-02-01T13:58:00.000-02:00</published><updated>2012-02-01T13:58:36.866-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Engenharia'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Arquitetura'/><category scheme='http://www.blogger.com/atom/ns#' term='Artigos'/><title type='text'>Estilos de Arquitetura e Separação de Responsabilidades para um Design Ágil</title><content type='html'>Com a grande demanda de profissionais por parte das empresas, muitos deles acabam sendo&amp;nbsp;contratados sem ter o devido conhecimento sobre boas práticas de desenvolvimento de software,&amp;nbsp;infraestrutura de desenvolvimento, protocolos de comunicação, sistemas gerenciadores de banco de&amp;nbsp;dados e muitas vezes até conhecimento básico sobre sistemas operacionais.&lt;br /&gt;&lt;br /&gt;Além disso, dentro das&amp;nbsp;empresas existe uma demanda cada vez maior por projetos de software de alta complexidade, com&amp;nbsp;prazos de entrega na maioria das vezes fora da realidade. O que faz com que muitos projetos sejam&amp;nbsp;entregues sem testes, com falhas de implementação, qualidade duvidosa e muitas vezes sem atender&amp;nbsp;ao negócio do cliente.&lt;br /&gt;&lt;br /&gt;Como consequência, após implantado, o sistema passa a apresentar sérios problemas como&amp;nbsp;degradação da performance, perda de dados, cálculos incorretos, entre outros problemas, trazendo&amp;nbsp;grandes prejuízos à empresa e fazendo com que os usuários percam a confiança no sistema e por&amp;nbsp;fim os próprios desenvolvedores.&lt;br /&gt;&lt;br /&gt;Direcionado para este cenário, o presente artigo visa demonstrar boas práticas de desenvolvimento&amp;nbsp;de software e explicar os princípios fundamentais para se criar um bom design. Veremos também a&amp;nbsp;aplicação de alguns padrões de projeto pouco difundidos, mas que são de extrema importância no dia a dia do desenvolvedor.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Estilos de Arquitetura&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Quando vamos planejar o desenvolvimento de um software, geralmente um dos primeiros itens que o arquiteto de software começa a analisar é qual o melhor estilo de arquitetura que se aplica ao&lt;br /&gt;contexto do projeto. Neste ponto ele leva em consideração diversos fatores, como os requisitos do software, custo, infraestrutura e conhecimento técnico da equipe.&lt;br /&gt;&lt;br /&gt;Entender o estilo arquitetural adotado para o desenvolvimento traz diversos benefícios para os desenvolvedores e para a empresa como um todo, entre eles: fornecer uma linguagem comum entre os desenvolvedores e os demais envolvidos no projeto.&lt;br /&gt;&lt;br /&gt;Por exemplo, quando o estilo de arquitetura é SOA, os desenvolvedores podem até conversar com pessoas de outras áreas, que não possuem&amp;nbsp;conhecimento técnico (como detalhes da linguagem de programação, servidores de aplicação, etc.), sobre o método envolvido na automação dos processos de negócio, que as mesmas entenderão sobre o que é um serviço, governança e, dependendo do usuário, até termos mais específicos, como escalabilidade.&lt;br /&gt;&lt;br /&gt;A &lt;b&gt;Tabela 1&lt;/b&gt; apresenta um resumo dos principais estilos de arquitetura.&lt;br /&gt;&lt;table border="1"&gt;            &lt;tbody&gt;&lt;tr&gt;                &lt;td&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;Estilo de Arquitetura&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;                &lt;td&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;Descrição&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;            &lt;/tr&gt;&lt;tr&gt;                &lt;td&gt;&lt;b&gt;&lt;i&gt;Client-Server&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;                &lt;td&gt;Também conhecida como arquitetura de duas camadas. Este tipo de arquitetura descreve a interação entre um ou mais clientes e um servidor, através de uma conexão de rede. A aplicação mais comum para esse tipo de arquitetura é um Banco de Dados no lado do servidor com a lógica da aplicação representada em Stored Procedures, e o lado do Cliente representado por aplicações conhecidas como &lt;i&gt;Fat-Clients&lt;/i&gt; (Clientes Pesados), que muitas vezes contêm a lógica de negócio embutida no front-end. Como exemplo, podemos citar aplicações desenvolvidas com Delphi, Visual Basic, Oracle Forms, entre outros.&lt;/td&gt;            &lt;/tr&gt;&lt;tr&gt;                &lt;td&gt;&lt;b&gt;&lt;i&gt;Arquitetura baseada em Componentes&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;                &lt;td&gt;Quando utilizamos uma arquitetura baseada em componentes, decompomos o design da aplicação em componentes lógicos com um fraco acoplamento, de forma que cada um deles seja individual e reutilizável, com uma localização transparente e interface de comunicação bem definida. Uma das grandes vantagens desse tipo de arquitetura é que ela promove a reusabilidade dos componentes e facilita a manutenção da aplicação.&lt;/td&gt;            &lt;/tr&gt;&lt;tr&gt;                &lt;td&gt;&lt;i&gt;&lt;b&gt;Domain Driven Design&lt;/b&gt;&lt;/i&gt;&lt;/td&gt;                &lt;td&gt;De acordo com o próprio criador, Eric Evans, DDD não é uma tecnologia e nem uma metodologia. DDD é um estilo de arquitetura orientado a objetos, focado em modelar o domínio do negócio e a lógica do domínio com o uso de técnicas, práticas e padrões de projeto.&lt;/td&gt;            &lt;/tr&gt;&lt;tr&gt;                &lt;td&gt;&lt;i&gt;&lt;b&gt;Arquitetura em Camadas&lt;/b&gt;&lt;/i&gt;&lt;/td&gt;                &lt;td&gt;Esse é o estilo de arquitetura mais conhecido e mais utilizado para o desenvolvimento de aplicações. Ele permite a separação dos módulos do sistema em camadas (&lt;i&gt;layers&lt;/i&gt;) diferentes. As principais vantagens desse estilo são a facilidade de manutenção, o aumento da extensibilidade, reusabilidade e escalabilidade.&lt;/td&gt;            &lt;/tr&gt;&lt;tr&gt;                &lt;td&gt;&lt;i&gt;&lt;b&gt;3-Tiers/N-Tiers&lt;/b&gt;&lt;/i&gt;&lt;/td&gt;                &lt;td&gt;Esse estilo segrega as funcionalidades em segmentos separados de maneira similar ao estilo da arquitetura em camadas, mas com cada segmento alocado em camadas físicas (tiers) separadas, conforme veremos em detalhes no tópico “&lt;i&gt;Arquitetura Distribuída&lt;/i&gt;”.&lt;br /&gt;&amp;nbsp;Ele é ideal quando o projeto demanda escalabilidade. Para isso, as camadas lógicas (&lt;i&gt;layers&lt;/i&gt;) da aplicação são alocadas em máquinas diferentes.&lt;br /&gt;&amp;nbsp;Geralmente, ao mapear as camadas lógicas (&lt;i&gt;layers&lt;/i&gt;) para as físicas (&lt;i&gt;tiers&lt;/i&gt;), podemos criar um &lt;u&gt;&lt;b&gt;cluster&lt;/b&gt;&lt;/u&gt; ou um &lt;u&gt;&lt;b&gt;farm&lt;/b&gt;&lt;/u&gt; na mesma camada física para aumentar a performance e a confiabilidade da aplicação.&lt;/td&gt;            &lt;/tr&gt;&lt;tr&gt;                &lt;td&gt;&lt;b&gt;&lt;i&gt;Arquitetura Orientada a Serviços(SOA)&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;                &lt;td&gt;SOA já deixou de ser apenas uma palavra no meio de TI para se tornar um modelo consagrado adotado em muitas empresas. Uma arquitetura orientada a serviços nada mais é do que uma aplicação que expõe e consome as funcionalidades do sistema como serviços por meio de contratos e mensagens.&lt;br /&gt;&amp;nbsp;Algumas das características de uma Arquitetura Orientada a Serviços são: a independência da Plataforma, comunicação baseada em serviços entre os componentes de software, integração de múltiplas funcionalidades em um único componente de interface do usuário e a exposição dos serviços por meio de &lt;u&gt;&lt;b&gt;repositórios ou catálogos&lt;/b&gt;&lt;/u&gt;.&lt;/td&gt;            &lt;/tr&gt;&lt;tr&gt;                &lt;td&gt;&lt;i&gt;&lt;b&gt;Arquitetura Orientada a Objetos&lt;/b&gt;&lt;/i&gt;&lt;/td&gt;                &lt;td&gt;Ao aplicar esse estilo, o sistema é dividido em objetos individuais, reutilizáveis e autossuficientes. Cada objeto contém os dados e o comportamento pelos quais é responsável.                    Uma arquitetura orientada a objetos geralmente busca espelhar objetos do mundo real de modo a tornar simples a modelagem da aplicação.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;Tabela 1.&lt;/b&gt; Estilos de Arquitetura.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;u&gt;&lt;b&gt;Cluster:&lt;/b&gt;&lt;/u&gt; É um conjunto de computadores interligados que trabalham em conjunto como se fosse um único computador. Estes computadores são utilizados para suportar aplicações que têm necessidade de alta disponibilidade e alta capacidade de processamento.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;u&gt;&lt;b&gt;Farm:&lt;/b&gt;&lt;/u&gt; Um Servidor Farm, também conhecido como Data Center, é um conjunto de servidores mantido (geralmente) por uma empresa para atender as necessidades computacionais da corporação, como o processamento de grandes volumes de informação, atender aos sistemas corporativos e prover servidores de contingência no caso de um problema no computador principal.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;u&gt;&lt;b&gt;Repositório:&lt;/b&gt;&lt;/u&gt; Um Repositório é um local onde todos os clientes de um domínio específico publicam seus serviços, de maneira que todos os usuários passam a conhecer os serviços disponíveis e como acessá-los.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;Para tanto, um repositório deve ter uma interface bem definida para publicação dos serviços, funções para localização, controle e maneira uniforme de acesso.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Uma vez que o estilo de arquitetura é definido, o passo seguinte é definir como as funcionalidades do sistema serão divididas, de forma a manter em conjunto os componentes relacionados (alta&lt;br /&gt;coesão), e fazer com que estes possuam o mínimo de conhecimento sobre os outros componentes (baixo acoplamento). Para alcançar o baixo acoplamento e uma alta coesão é importante entender o conceito de Separação de Responsabilidades.&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Separação de Responsabilidades (Separation of Concerns)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;O termo Separação de Responsabilidades foi criado pelo pai do algoritmo de caminho mínimo, o cientista Edsger W. Dijkstra em 1974, e tem como objetivo dividir a aplicação em funcionalidade distintas com a menor similaridade possível entre elas. Para aplicar com sucesso este princípio, o mais importante é minimizar os pontos de interação para obter alta coesão e baixo acoplamento entre os componentes do sistema. Para tanto, é recomendado, primeiro dividir suas responsabilidades e organizá-las em elementos bem definidos, sem repetição de código ou de funcionalidade.&lt;br /&gt;&lt;br /&gt;O tipo de separação de conceito mais difundido é o da separação horizontal, onde dividimos a aplicação em camadas lógicas de funcionalidades, como por exemplo, o protocolo TCP/IP (modelo OSI), que é separado pelas camadas de aplicação, transporte, rede, enlace e física. Neste modelo, cada camada tem sua própria responsabilidade e não precisa conhecer as camadas adjacentes. Voltando ao nosso mundo, em uma aplicação Java EE, as camadas mais conhecidas são a de Apresentação, Serviço, Domínio e Infraestrutura, como ilustra a &lt;b&gt;Figura 1&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-IU9CWe_K-mI/TycgKvenr4I/AAAAAAAABIA/nhlAYJXcRTQ/s1600/Layers01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://3.bp.blogspot.com/-IU9CWe_K-mI/TycgKvenr4I/AAAAAAAABIA/nhlAYJXcRTQ/s320/Layers01.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;Figura 1.&lt;/b&gt; Separação Horizontal de Conceitos (Camadas lógicas de uma aplicação).&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Podemos também aplicar o tipo de separação vertical, onde dividimos a aplicação em módulos ou funcionalidades que são relacionadas a um subsistema ou grupo de operações dentro de um sistema.&lt;br /&gt;Veja um exemplo na &lt;b&gt;Figura 2&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-QIsTN08wuiU/Tycge4guT2I/AAAAAAAABII/AwdBNpMVstw/s1600/soc01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="247" src="http://4.bp.blogspot.com/-QIsTN08wuiU/Tycge4guT2I/AAAAAAAABII/AwdBNpMVstw/s320/soc01.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;Figura 2.&lt;/b&gt; Separação Vertical de Conceitos.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Separar as funcionalidades de uma aplicação em módulos deixa claro as responsabilidades e dependências de cada funcionalidade, o que ajuda na execução dos testes e na manutenção do&lt;br /&gt;software. Na &lt;b&gt;Figura 2&lt;/b&gt; fazemos um agrupamento por módulos; neste caso a separação foi feita pelos módulos de RH, Contábil e Marketing.&lt;br /&gt;&lt;br /&gt;Além disso, podemos utilizar o conceito de separação vertical em conjunto com o conceito de separação horizontal. Veja um exemplo na &lt;b&gt;Figura 3&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-DjTZ0ddidt8/TycgzuWKzMI/AAAAAAAABIQ/3KOtytFeKyU/s1600/soc02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="277" src="http://4.bp.blogspot.com/-DjTZ0ddidt8/TycgzuWKzMI/AAAAAAAABIQ/3KOtytFeKyU/s320/soc02.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;Figura 3. &lt;/b&gt;Aplicação da Separação de Conceitos Vertical e Horizontal.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Um papel importante da separação de conceitos é o da separação de comportamento, que envolve a divisão dos processos do sistema em unidades lógicas de código reutilizáveis e gerenciáveis. Ao organizar o comportamento, alcançamos os seguintes benefícios:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Eliminamos a duplicação de funcionalidades;&lt;/li&gt;&lt;li&gt;Minimizamos as dependências externas;&lt;/li&gt;&lt;li&gt;Maximizamos o potencial para reuso;&lt;/li&gt;&lt;li&gt;Restringimos o escopo do trabalho para os limites de cada módulo.&lt;/li&gt;&lt;/ul&gt;Como vimos, é importante entender a separação de conceitos pois ao modelarmos uma aplicação devemos ter conhecimento das responsabilidades de cada um de seus componentes. Além disso, devemos ter uma ideia de como será feita esta separação e como será feita a distribuição destes componentes na arquitetura disponível pelo cliente.&lt;br /&gt;&lt;br /&gt;Para tanto, é preciso levar em consideração&amp;nbsp;outros fatores, como infraestrutura e recursos disponíveis, conforme veremos a seguir, no próximo artigo da série.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Referências&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Excelente artigo sobre separação de responsabilidades&lt;/i&gt;&lt;br /&gt;&lt;a href="http://www.aspiringcraftsman.com/2008/01/art-of-separation-of-concerns/"&gt;http://www.aspiringcraftsman.com/2008/01/art-of-separation-of-concerns/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Biografia de Edsger Dijkstra.&lt;/i&gt;&lt;br /&gt;&lt;a href="http://pt.wikipedia.org/wiki/Edsger_Dijkstra"&gt;http://pt.wikipedia.org/wiki/Edsger_Dijkstra&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Guia de Arquitetura de Aplicações da Microsoft.&lt;/i&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/AppArchGuide"&gt;http://www.codeplex.com/AppArchGuide&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-417620954050138283?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/417620954050138283/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=417620954050138283' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/417620954050138283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/417620954050138283'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2012/02/estilos-de-arquitetura-e-separacao-de.html' title='Estilos de Arquitetura e Separação de Responsabilidades para um Design Ágil'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-IU9CWe_K-mI/TycgKvenr4I/AAAAAAAABIA/nhlAYJXcRTQ/s72-c/Layers01.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-5321938085898807074</id><published>2012-01-19T10:25:00.002-02:00</published><updated>2012-01-19T10:25:47.589-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eventos'/><category scheme='http://www.blogger.com/atom/ns#' term='Innovation Games'/><category scheme='http://www.blogger.com/atom/ns#' term='DevOps'/><category scheme='http://www.blogger.com/atom/ns#' term='ALM'/><category scheme='http://www.blogger.com/atom/ns#' term='SouJava'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Arquitetura'/><title type='text'>Continuous Delivery, DevOps e Innovation Games na UFSCar</title><content type='html'>Ano passado, tive a oportunidade de palestrar em eventos importantes como o &lt;a href="http://www.thedevelopersconference.com.br/tdc/2011/index.html#saopaulo" target="_blank"&gt;TDC 2011&lt;/a&gt;&amp;nbsp;em São Paulo, organizado pela &lt;a href="http://www.globalcode.com.br/" target="_blank"&gt;Globalcode&lt;/a&gt; e no aniversário de 10 anos do evento &lt;a href="http://www2.dc.ufscar.br/diadejava/" target="_blank"&gt;É Dia de Java&lt;/a&gt;, realizado na Faculdade Federal de São Carlos (UFSCar), organizado pelo &lt;a href="http://soujava.org/" target="_blank"&gt;SOUJava&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Q34EfST4Kns/TxcRZWdQNbI/AAAAAAAABFI/fZNod4R5I_w/s1600/TDC2011-Agile-CD02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="265" src="http://3.bp.blogspot.com/-Q34EfST4Kns/TxcRZWdQNbI/AAAAAAAABFI/fZNod4R5I_w/s400/TDC2011-Agile-CD02.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Ainda no TDC, participei do painel "O que vem depois do Agile?" com nomes bem conhecidos pela comunidade Ágil. Publiquei um &lt;a href="http://netfeijao.blogspot.com/2012/01/painel-tdc2011-o-que-vem-depois-do.html" target="_blank"&gt;post&lt;/a&gt; recentemente sobre o Painel e uma palestra sobre DataGrid e NoSQL com JBoss Infinispan, que em breve publicarei aqui.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-0nAo-ksSHr0/TxeXB13dZkI/AAAAAAAABFo/zMFqaN9Qjtc/s1600/TDC2011-Agile-Debate02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://2.bp.blogspot.com/-0nAo-ksSHr0/TxeXB13dZkI/AAAAAAAABFo/zMFqaN9Qjtc/s400/TDC2011-Agile-Debate02.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;O evento É Dia de Java 2011 foi muito especial, primeiro porque foi a celebração de 10 anos do evento, e também porque pude reencontrar grandes amigos como &lt;a href="https://twitter.com/#!/_afonseca" target="_blank"&gt;André Fonseca&lt;/a&gt;,&amp;nbsp;&lt;a href="http://twitter.com/vsenger" target="_blank"&gt;Vinícius Senger&lt;/a&gt; da Globalcode, &lt;a href="https://twitter.com/#!/fabiovelloso" target="_blank"&gt;Fabio Velloso&lt;/a&gt; e &lt;a href="https://twitter.com/#!/brjavaman" target="_blank"&gt;Bruno Souza&lt;/a&gt; do SOUJava e ter a satisfação de conhecer o grande &lt;a href="http://twitter.com/dwildt" target="_blank"&gt;Daniel Wildt&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;O evento foi bem bacana, na sexta feira o dia foi reservado para a realizacao de Workshops praticos, no meu caso, fiz um workshop de&lt;a href="http://innovationgames.com/" target="_blank"&gt; Innovation Games&lt;/a&gt;, uma aborgagem lúdica inovadora criada por Luke Hohmann, para auxílio na criação de produtos, condução de retrospectivas e análise de problemas.&lt;br /&gt;&lt;br /&gt;Realizei com a turma, jogos como &lt;a href="http://innovationgames.com/product-box/" target="_blank"&gt;Product Box&lt;/a&gt;, &lt;a href="http://innovationgames.com/remember-the-future/" target="_blank"&gt;Remember the Future&lt;/a&gt;, &lt;a href="http://innovationgames.com/speed-boat/" target="_blank"&gt;Speed Boat&lt;/a&gt; e como plus (não é um Innovation Game), fizemos uma retrospectiva utilizando a técnica dos &lt;a href="http://cantinhodoagile.blogspot.com/2011/01/aplicacao-os-seis-chapeus-na.html" target="_blank"&gt;06 Chapéus do Pensamento&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Abaixo uma das Product Box criada por um dos grupos.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ZBTyhgesPzQ/TxcVIPeppvI/AAAAAAAABFQ/GTwma5k2S78/s1600/IMAG0623.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="238" src="http://4.bp.blogspot.com/-ZBTyhgesPzQ/TxcVIPeppvI/AAAAAAAABFQ/GTwma5k2S78/s400/IMAG0623.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;No dia seguinte, foram várias palestras, sem falar que o evento estava lotado.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-mq9obJgS2JQ/TxcV0jwIieI/AAAAAAAABFg/RVDlQzgVGSc/s1600/IMAG0626.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="238" src="http://3.bp.blogspot.com/-mq9obJgS2JQ/TxcV0jwIieI/AAAAAAAABFg/RVDlQzgVGSc/s400/IMAG0626.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Minha palestra foi sobre Continuous Delivery e DevOps, o feedback foi muito bom, e várias pessoas solicitaram os slides. Sendo assim, aqui está.&lt;br /&gt;&lt;div id="__ss_11083252" style="width: 425px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong style="display: block; margin: 12px 0 4px;"&gt;&lt;a href="http://www.slideshare.net/wrsantos/continuous-delivery-e-devops" target="_blank" title="Continuous Delivery e DevOps"&gt;Continuous Delivery e DevOps&lt;/a&gt;&lt;/strong&gt; &lt;br /&gt;&lt;iframe frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/11083252" width="425"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;div style="padding: 5px 0 12px;"&gt;View more &lt;a href="http://www.slideshare.net/" target="_blank"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/wrsantos" target="_blank"&gt;wrsantos&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;Parabéns as pessoas que organizaram e participaram do evento na UFSCar e a Globalcode pelo excelente TDC. Esse ano se Deus quiser tem mais.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;* Crédito ao pessoal da &lt;a href="http://www.octo.com/" target="_blank"&gt;OCTO&lt;/a&gt; por alguns dos slides sobre Integração Contínua.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Diversão Garantida!!!&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-5321938085898807074?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/5321938085898807074/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=5321938085898807074' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/5321938085898807074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/5321938085898807074'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2012/01/continuous-delivery-devops-e-innovation.html' title='Continuous Delivery, DevOps e Innovation Games na UFSCar'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-Q34EfST4Kns/TxcRZWdQNbI/AAAAAAAABFI/fZNod4R5I_w/s72-c/TDC2011-Agile-CD02.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-1112700718179888752</id><published>2012-01-16T11:16:00.002-02:00</published><updated>2012-01-16T11:16:55.279-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lean'/><category scheme='http://www.blogger.com/atom/ns#' term='DevOps'/><category scheme='http://www.blogger.com/atom/ns#' term='ALM'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Arquitetura'/><category scheme='http://www.blogger.com/atom/ns#' term='Projetos'/><title type='text'>Continuous Delivery: Case de Sucesso com tecnologias .NET - Deploy em 7000 máquinas com apenas 3 cliques</title><content type='html'>&lt;br /&gt;Em um recente &lt;a href="http://blog.octo.com/en/continuous-delivery-how-do-we-deliver-in-3-clicks-to-7000-machines/" target="_blank"&gt;artigo&lt;/a&gt;, Maxence Modelin discute de maneira bem detalhada, como a &lt;a href="http://www.octo.com/br/" target="_blank"&gt;OCTO Technology&lt;/a&gt;, criou um fluxo de implantação (&lt;a href="http://www.informit.com/articles/article.aspx?p=1621865" target="_blank"&gt;Deployment Pipeline&lt;/a&gt;), onde com apenas 3 cliques, o deploy de um serviço Windows é feito em 7000 máquinas, de um fornecedor de serviços de hosting, localizado na França.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;A solução descrita, cujo foco envolve o deploy de um serviço Windows, desenvolvido em C#, que se comunica via FTPS com um servidor Java.&lt;br /&gt;&lt;br /&gt;Uma caracteristica importante da solução, é o uso de uma plataforma de Integração Contínua baseado em ferramentas open-source, bem populares na comunidade Java, ao invés do uso do &lt;a href="http://msdn.microsoft.com/en-us/library/ms364061.aspx" target="_blank"&gt;Team Foundation Server&lt;/a&gt;&amp;nbsp;fornecido pela Microsoft.&lt;br /&gt;&lt;br /&gt;Entre as tecnologias utilizadas para Integração Contínua, podemos destacar &lt;a href="http://jenkins-ci.org/" target="_blank"&gt;Jenkins&lt;/a&gt; como Servidor de Integração Contínua, &lt;a href="http://maven.apache.org/" target="_blank"&gt;Maven&lt;/a&gt; para gestão do projeto e &lt;a href="http://nexus.sonatype.org/" target="_blank"&gt;Nexus&lt;/a&gt; para a gestão do repositório.&lt;br /&gt;&lt;br /&gt;Para administração do farm de servidores, foi utilizado o software &lt;a href="http://www.ocsinventory-ng.org/" target="_blank"&gt;OCS Inventory&lt;/a&gt;. Um aplicativo web, responsável por centralizar todas as informações pelos Agentes OCS instalado em cada um servidores do farm. Que por sua vez, através das informações recebidas, efetua o deploy dos pacotes necessários nos servidores, sem a necessidade de uma ação do usuário.&lt;br /&gt;&lt;br /&gt;Para monitoração do ambiente, foi utilizado &lt;a href="http://www.zabbix.com/" target="_blank"&gt;Zabbix&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A cadeia de entrega contínua, se resume a apenas 3 cliques, onde o primeiro deles, começa com a operação de commit no SVN, que inicia o processo de integração contínua orquestrado pelo Jenkins. Que após efetuar o checkout do projeto, executa o script do Maven, que efetua o build, executa os testes, e por fim, armazena os artefatos gerados no Nexus.&lt;br /&gt;&lt;br /&gt;O segundo clique, é para criação do pacote OCS, onde um profissional de operações (ops), executa um script shell, que extrai o artifato do Nexus e disponibiliza o pacote pronto para deploy no banco de dados do OCS. &lt;br /&gt;&lt;br /&gt;Para o terceiro clique, no contexto da empresa, este último passo é considerado um passo funcional, e não existe razão de ser automático. Quem decide quais máquinas irão receber os pacotes, são os profissionais de operações, através do OCS. Os desenvolvedores tem o mesmo acesso, porém, para fazer o deploy em ambiente de testes.&lt;br /&gt;&lt;br /&gt;Para assegurar que tudo ocorreu corretamente, operações utiliza duas ferramentas para feedback, que são o próprio OCS e Zabbix, e um usuário fake. Este usuário fake, é responsável por efetuar o download dos pacotes nas máquinas destino, e verificar se tudo ocorreu conforme o esperado.&lt;br /&gt;&lt;br /&gt;A figura a seguir, descreve os softwares e ações realizadas durante o fluxo de implantação.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-dvLWxokgG6s/TxCOblpbAyI/AAAAAAAABE8/XfDaIq7GboU/s1600/Global-Architecture-Schema-bis.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-dvLWxokgG6s/TxCOblpbAyI/AAAAAAAABE8/XfDaIq7GboU/s400/Global-Architecture-Schema-bis.png" width="356" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Um dos fatores imprescendíveis para o sucesso da Implantação Contínua, foi a abordagem DevOps dada ao projeto. Esta abordagem abriu a oportunidade para um compartilhamento das necessidades e visão entre os times de Desenvolvimento e Operações.&lt;br /&gt;&lt;br /&gt;Pois com a responsabilidade do deployment a cargo do time de desenvolvimento, ao invés do time de operações, talvez eles nunca teriam a real noção do trabalho realizado.&lt;br /&gt;&lt;br /&gt;E você, tem alguma estória de sucesso sobre implementações de Continuous Delivery e DevOps? Comente, discuta, colabore!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Nota:&lt;/b&gt; O artigo que o texto destaca é um pouco antigo, mas como esse post era para ser uma notícia na InfoQ Brasil no ano passado, mas como não foi aprovado então resolvi publicar aqui. Espero que curtam! Pois o case foi bem interessante, por se tratar de um case de Continuous Delivery para um aplicativo .NET, utilizando ferramentas open source Java.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-1112700718179888752?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/1112700718179888752/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=1112700718179888752' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/1112700718179888752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/1112700718179888752'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2012/01/continuous-delivery-case-de-sucesso-com.html' title='Continuous Delivery: Case de Sucesso com tecnologias .NET - Deploy em 7000 máquinas com apenas 3 cliques'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-dvLWxokgG6s/TxCOblpbAyI/AAAAAAAABE8/XfDaIq7GboU/s72-c/Global-Architecture-Schema-bis.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-5090705127918093904</id><published>2012-01-13T17:41:00.002-02:00</published><updated>2012-01-13T17:55:01.936-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lean'/><category scheme='http://www.blogger.com/atom/ns#' term='DevOps'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='InfoQ'/><category scheme='http://www.blogger.com/atom/ns#' term='Entrevista'/><title type='text'>Jez Humble on Continuous Delivery and DevOps</title><content type='html'>&lt;br /&gt;In the last year, during the period i have been in France, attending&amp;nbsp;&lt;a href="http://www.usievents.com/" target="_blank"&gt;Université du SI&lt;/a&gt;, one of the best conferences i've participate in whole life (sponsored by&amp;nbsp;&lt;a href="http://www.octo.com/br" target="_blank"&gt;OCTO Technology&lt;/a&gt;),&amp;nbsp;i had the privilege of being invited to participate in a very interesting course with&amp;nbsp;&lt;a href="https://twitter.com/#!/jezhumble" target="_blank"&gt;Jez Humble&lt;/a&gt;, &amp;nbsp;about&amp;nbsp;&lt;a href="http://www.thoughtworks.com/events/thoughtworks-continuous-delivery-devops" target="_blank"&gt;Continuous Delivery for DevOps.&lt;/a&gt;&lt;br /&gt;After the course, i could make an&amp;nbsp;&lt;a href="http://www.infoq.com/br/articles/jezhumble-continuous-delivery-devops" target="_blank"&gt;interview&lt;/a&gt;&amp;nbsp;for&amp;nbsp;&lt;a href="http://www.infoq.com/br" target="_blank"&gt;InfoQ Brazil&lt;/a&gt;, but for obvious reasons we translated it to Brazilian Portuguese. And now, here goes the original version. Enjoy!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;You wrote a best seller, called Continuous Delivery, What is it all about?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;It's about all the stuff that is normally considered somewhat peripheral to software development - configuration, build and deployment management, automated testing, continuous integration, infrastructure and database management. However the discovery that many of us made while working on large agile projects was that this stuff is essential if you want to be able to reliably, repeatably release high quality software.&lt;br /&gt;&lt;br /&gt;Actually many of the ideas in the book aren't new. It's really a call to arms to focus on the engineering practices that were always at the heart of agile methodologies, but that somehow got sidelined in many places over the last ten years. Of course several tools like Puppet, Chef, Git and DbDeploy have emerged that didn't exist ten years ago that make much of this stuff much more tractable.&lt;br /&gt;&lt;br /&gt;It turns out that the engineering practices - particularly automation of build, test, deployment, and database and infrastructure management - and collaboration between development, testing and operations - are really essential to be able to get high quality software delivered fast. And that, in turn, is central to the ability of organizations to innovate and get new features out of the door quickly and reliably.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What practices do you think are more important?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;For developers, you need to start with continuous integration. That doesn't mean installing a CI server and pointing it at your feature branches - it means making sure everyone&amp;nbsp;&lt;a href="http://continuousdelivery.com/2011/07/on-dvcs-continuous-integration-and-feature-branches/"&gt;merges regularly into mainline&lt;/a&gt;&amp;nbsp;(and yes, that applies to Git too). In order for CI to be useful, you need automated tests, in particular at the unit and acceptance level. Having a comprehensive, maintainable set of unit tests is almost impossible without doing TDD. Creating maintainable acceptance tests requires close collaboration between developers and testers. Finally, you need to validate every build to ensure it's production ready, which means having the ability to spin up production-like testing environments on demand and run realistic loads against your system. This requires automated provisioning of environments and infrastructure, and automated deployment of your system, including any database changes. All of this needs to be implemented within the context of the&amp;nbsp;&lt;a href="http://www.informit.com/articles/article.aspx?p=1621865"&gt;deployment pipeline&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;These kinds of changes need to be made incrementally, by finding out where the constraints are in your delivery process and removing them one by one. That in turn requires close collaboration between developers, testers and the operations department. More on that later.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;We have seen, that some people make some confusion about the term Continuous Delivery, can you explain to us, what's the difference between Continuous Delivery and Continuous Deployment?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Continuous delivery means you can release on demand. I should be able to release the latest good build at the press of a button without having to worry that it's going to break. But when you release is a business decision. Continuous deployment means you actually go ahead and release every good build. Obviously that only really applies in the context of websites or software-as-a-service. But if you can't actually do continuous deployment and release every good build for some reason - say you're working on a user-installed product - you should at the very least be putting every good build into a production-like environment and running realistic acceptance and performance tests against it so that there are no surprises when you come to release it. You can do that on embedded systems, products, pretty much anything that involves software.&lt;br /&gt;&lt;br /&gt;Organizations that could in principle do continuous deployment really should aim to. One of the key benefits is organizational. Continuous deployment makes developers care much more about the quality and reliability of what they're doing because if they can push a button to make their changes go live, it connects them with what's going on in production. And it makes the business focus much less on stuffing features into a release when they know they can create some small feature, have it in production in a couple of days' time, and get real feedback on whether it's valuable and whether more effort should be put into it. It is a complete paradigm shift in the way organizations work and they become much more responsive to their customers. Eric Ries writes more about this in his forthcoming book,&amp;nbsp;&lt;a href="http://theleanstartup.com/" target="_blank"&gt;The Lean Startup&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Can you explain to us, the term DevOps, and what that means?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;DevOps is kind of an anti-movement, by which I mean it has resisted attempts to pin it down. But fundamentally it's about putting a strong focus on collaboration between everybody involved in software delivery - in particular, developers, testers and operations - and sharing knowledge and techniques between them. Infrastructure-as-code is one example of knowledge sharing - the application of agile techniques such as refactoring and test-driven development to evolving your infrastructure. DevOps is essential to achieve continuous delivery.&lt;br /&gt;&lt;br /&gt;Part of the reason people in the movement have resisted (for example) creating a manifesto is to prevent vendors (in particular tool vendors) from appropriating it and trying to own it. Often people are guilty of reaching for tools (even within the movement - myself included) when actually it's the attitude and mindset that makes you successful. That's not to say the tools aren't important - they are. Tools that can't be managed in an automated fashion through an API are especially unpopular within the community.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How do you implement DevOps?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;One really good way to start is to get representatives from every part of the organization involved in delivery - development, testing, infrastructure, operations, product management - to get together regularly and have retrospectives to reflect on how to incrementally improve things. In many organizations, you never see people from every department in a meeting together. It just doesn't happen.&lt;br /&gt;&lt;br /&gt;Another way to get going is for everyone involved in delivering software celebrate successful releases together. Really implementing DevOps is about change that works up from the people on the ground - it's hard to mandate it. That's one of the reasons senior management has a hard time with it. But it's also the secret sauce - incremental, bottom-up change is usually the most effective and long-lasting.&lt;br /&gt;&lt;br /&gt;What skills related to Infrastructure a modern developer should have? And why it is important? Does it make sense, for companies that are not in the cloud?&lt;br /&gt;&lt;br /&gt;I think the key element is that infrastructure provisioning and management has to be automated. It should be possible to plug a new server (or workstation) in - power and network - and bring it into the correct state, configure it, and deploy to it in a fully automated fashion. You can do that whether or not you're in the cloud. In fact ThoughtWorks recently did some consulting to automate hardware provisioning and management for one of the cloud vendors. Under the hood, "the cloud" of course runs on real hardware and the same principles apply.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;For great companies, that has already an Operation Department, what a developer can do to decrease this gap between devs and ops?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;First of all, get to know your operations department. Make friends with them. Invite them along to your retrospectives and showcases. Learn the tools they use. Help them build new ones. Read books like Release It! that talk about how to create production-ready software. Check out the screens they have up that show off production metrics. Get the same screens put up in development rooms (LCD panels are cheap these days). Ask to help out when releases happen. Get involved.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Can you talk about your job at ThoughtWorks?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I'm working on a number of things. On the one hand I am doing a lot of travelling at the moment, going to conferences and talking to our customers. I'm also doing some research and writing, including working on a series of interviews to create some videos about continuous delivery. Finally I'm doing some consulting work to make sure I keep my feet on the ground and stay in touch with the latest developments in the space, and of course to pay my way.&lt;br /&gt;&lt;br /&gt;------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jezhumble.net/" target="_blank"&gt;Jez Humble&lt;/a&gt;&amp;nbsp;is a Principal at ThoughtWorks Studios, and author of&amp;nbsp;&lt;a href="http://www.amazon.com/gp/product/0321601912?tag=contindelive-20" target="_blank"&gt;Continuous Delivery&lt;/a&gt;, published in Martin Fowler’s Signature Series (Addison Wesley, 2010). He has worked with a variety of platforms and technologies, consulting for non-profits, telecoms, financial services, and online retail companies. His focus is on helping organisations deliver valuable, high-quality software frequently and reliably through implementing effective engineering practices.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-5090705127918093904?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/5090705127918093904/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=5090705127918093904' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/5090705127918093904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/5090705127918093904'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2012/01/jez-humble-on-continuous-delivery-and.html' title='Jez Humble on Continuous Delivery and DevOps'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-4292987963243554503</id><published>2012-01-09T16:14:00.000-02:00</published><updated>2012-01-13T18:31:56.282-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eventos'/><category scheme='http://www.blogger.com/atom/ns#' term='Lean'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>[Painel TDC2011]  O que vem depois do Agile?</title><content type='html'>No ano passado, tive o privilégio de participar do &lt;a href="http://www.thedevelopersconference.com.br/" target="_blank"&gt;TDC 2011&lt;/a&gt;, um evento super massa concebido pela &lt;a href="http://www.globalcode.com.br/" target="_blank"&gt;Globalcode&lt;/a&gt;, &amp;nbsp;que contou com o o apoio de grandes nomese empresas da Indústria de Software.&lt;br /&gt;Participei de um painel bem bacana, mediado pelos meus amigos &lt;a href="https://twitter.com/#!/felipero" target="_blank"&gt;Felipe Rodrigues&lt;/a&gt; da &lt;a href="http://www.crafters.com.br/" target="_blank"&gt;Crafters&lt;/a&gt;, e Victor Hugo Germano.&lt;br /&gt;O tema da discussão foi &lt;i&gt;&lt;b&gt;O que vem depois do Agile?&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;Segue a descrição oficial.&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;A adoção da agilidade tem crescido muito no mercado brasileiro e cada vez mais grandes empresas tem aderido ao seu uso. Isso aumenta sua visibilidade, mas também vai exigindo adaptações nem sempre fáceis ou bem recebidas pela comunidade.&lt;br /&gt;A grande pergunta que surge é: Qual é o próximo passo? O que vem depois do Agile?&lt;/blockquote&gt;&lt;div&gt;Abaixo segue o vídeo do painel&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;iframe allowfullscreen="" frameborder="0" height="230" mozallowfullscreen="" src="http://player.vimeo.com/video/33355978?title=0&amp;amp;byline=0&amp;amp;portrait=0" webkitallowfullscreen="" width="400"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/33355978" target="_blank"&gt;TDC2011 SP - Painel (O que vem depois do Agile) - Domingo, 10 de Julho&lt;/a&gt; from &lt;a href="http://vimeo.com/globalcode" target="_blank"&gt;Globalcode&lt;/a&gt; on &lt;a href="http://vimeo.com/" target="_blank"&gt;Vimeo&lt;/a&gt;.&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-4292987963243554503?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/4292987963243554503/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=4292987963243554503' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/4292987963243554503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/4292987963243554503'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2012/01/painel-tdc2011-o-que-vem-depois-do.html' title='[Painel TDC2011]  O que vem depois do Agile?'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-1487656922538311252</id><published>2011-10-13T00:45:00.000-03:00</published><updated>2011-10-13T00:45:40.435-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java Magazine'/><category scheme='http://www.blogger.com/atom/ns#' term='Publicações'/><title type='text'>Distribuição de Dados com Infinispan na Java Magazine 95</title><content type='html'>Este mês, foi publicado na revista &lt;a href="http://www.devmedia.com.br/post-22320-Revista-Java-Magazine-95.html"&gt;Java Magazine 95&lt;/a&gt;, um artigo meu sobre &lt;a href="http://www.jboss.org/infinispan"&gt;JBoss Infinispan&lt;/a&gt;.&lt;br /&gt;Uma das maneiras mais fáceis de melhorar a performance de uma aplicação é trazer os dados para mais perto dela e manter um formato que seja simples para ela consumir.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-clBMlDOiQoE/TpZej_6awhI/AAAAAAAAA9Y/pHblqWXaW_M/s1600/java95_online.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-clBMlDOiQoE/TpZej_6awhI/AAAAAAAAA9Y/pHblqWXaW_M/s1600/java95_online.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;A maioria das aplicações escritas em Java, consomem dados que geralmente são armazenados em bancos de dados relacionais, como Oracle, MySQL, entre outros. Isto significa que para a aplicação consumir estes dados, precisa converter as informações que estão armazenadas em tabelas em objetos.&lt;br /&gt;Por conta da natureza tabular destes dados, o processo de conversão de dados para objeto em memória pode ser muito custoso, e nem sempre é fácil. Para remediar estes problemas, ferramentas ORM como Hibernate e EclipseLink utilizam mecanismos de cache para armazenar os objetos internamente. Entretanto, quando a aplicação cresce e é necessário escalá-la para múltiplos servidores, e neste momento, começam a surgir vários problemas de sincronização de dados.&lt;br /&gt;Para ajudar a resolver este problema, podemos utilizar uma plataforma de Data Grid. Dentro desta categoria, existem diversos frameworks e soluções, entre eles: Hazelcast, GigaSpaces, Oracle Coherence, Joafip, GridGain, ExtremeScale e JBoss Infinispan. .&lt;br /&gt;Utilizei o JBoss Infinispan recentemente, em um projeto de grande porte, de uma nova URA inteligente, para uma grande empresa de Telecom da Itália. O sistema, foi distribuído em dois sites diferentes, com clusters com diversas máquinas.&lt;br /&gt;A partir daí, surgiu a idéia de fazer este artigo. Neste artigo abordo além da computação em grid com ênfase na plataforma de datagrid Infinispan, abordo e a importância de seu uso em um ambiente corporativo, que tem necessidades mais específicas do que simplesmente criar um cache de dados.&lt;br /&gt;Apresento os diferentes modos para criar um cache e seus conceitos, como Replicação, Invalidação, Distribuição, L1 Caching e Cache Local, assim como os benefícios de cada uma destas abordagens. E ao final, como transformar o Infinispan em uma solução NoSQL, utilizando Cache Stores com o Módulo REST.&lt;br /&gt;Para concluir, apresento os módulos disponíveis para o desenvolvedor tirar ainda mais proveito desta poderosa plataforma, onde exploro como configurar um Módulo REST para acesso aos objetos no Grid via protocolo HTTP.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sobre o Infinispan&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Infinispan é uma plataforma para grid de dados open source distribuída pela JBoss. Geralmente, data grids são utilizados para reduzir a latência do banco de dados, prover alta disponibilidade e storage elástico dos dados, como soluções NoSQL. Data Grids podem ser utilizados em conjunto com bancos de dados tradicionais ou como cache distribuído, para acesso rápido aos dados.&lt;br /&gt;Ao escolher o Infinispan no lugar de um simples cache, temos as seguintes vantagens:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Cluster:&lt;/b&gt; Podemos distribuir nosso cache em cluster com apenas algumas configurações;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Eviction:&lt;/b&gt; Mecanismo automático de eviction para evitar erros de out-of-memory e controle do melhor uso da memória;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Cache Loader:&lt;/b&gt; É possível configurar cache loaders (ver tópico “Cache Loader”) para persistir o estado dos objetos em um banco de dados ou em um arquivo no disco;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Suporte a JTA e compatibilidade com XA:&lt;/b&gt; Gerenciamento de transação com qualquer aplicação compatível com JTA;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Gerenciamento:&lt;/b&gt; É possível gerenciar e monitorar os objetos de uma instância do grid de dados através de componentes JMX ou utilizar um console gráfico com RHQ.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Caso se interesse por soluções desta natureza, entre em contato conosco!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-1487656922538311252?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/1487656922538311252/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=1487656922538311252' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/1487656922538311252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/1487656922538311252'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2011/10/distribuicao-de-dados-com-infinispan-na.html' title='Distribuição de Dados com Infinispan na Java Magazine 95'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-clBMlDOiQoE/TpZej_6awhI/AAAAAAAAA9Y/pHblqWXaW_M/s72-c/java95_online.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-5685356309571620380</id><published>2011-10-12T19:16:00.004-03:00</published><updated>2011-10-12T23:56:15.025-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='JAVA EE'/><category scheme='http://www.blogger.com/atom/ns#' term='Portal'/><category scheme='http://www.blogger.com/atom/ns#' term='Artigos'/><title type='text'>Desenvolvimento Portlets: JSRs 168 e 286</title><content type='html'>Duas JSRs, 168 e 286, atendem à criação de portlets. Em outubro de 2003 o JCP lançou a JSR-168, a primeira especificação que padroniza como os componentes devem ser desenvolvidos para os servidores de portal. Como as outras grandes JSRs, a JSR-168 possui o aval dos maiores fornecedores de portais. Esta especificação atende aos seguintes quesitos:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;O contrato de contêiner de portlet e o gerenciamento do ciclo de vida do portlet;&amp;nbsp;&lt;/li&gt;&lt;li&gt;A definição dos estados das janelas e os modos do portlet;&amp;nbsp;&lt;/li&gt;&lt;li&gt;Gerenciamento das preferências do Portlet;&amp;nbsp;&lt;/li&gt;&lt;li&gt;Informações do Usuário como nome, endereço, e-mail, que podem ser informadas no arquivo de deployment descriptor e que podem ser recuperadas por um objeto &lt;i&gt;Map&lt;/i&gt; através da constante &lt;b&gt;USER_INFO&lt;/b&gt; definida na interface &lt;i&gt;PortletRequest&lt;/i&gt;;&amp;nbsp;&lt;/li&gt;&lt;li&gt;Empacotamento e Deployment;&amp;nbsp;&lt;/li&gt;&lt;li&gt;Segurança;&amp;nbsp;&lt;/li&gt;&lt;li&gt;Tags para JSF.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;Mas, quando grandes fornecedores como a Apache, BEA, Borland, Oracle, IBM, SAP entre outros que fazem parte do expert group da JSR-168 começaram a criar as suas soluções de Portal, começaram a surgir também alguns problemas relacionados à limitação da especificação que antes não haviam sido detectados.&lt;div&gt;Conforme a adoção por soluções de portal baseadas na JSR 168 começou a aumentar, naturalmente o público consumidor destas soluções e o próprio negócio passou a demandar cada vez mais funcionalidades, que não haviam sido contempladas, fazendo com que soluções proprietárias fossem criadas pelos fornecedores. Entre as limitações da primeira versão da especificação de Portlets (JSR-168), podemos citar:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Falta de filtros para portlets (similar aos Filtros nos Servlets);&amp;nbsp;&lt;/li&gt;&lt;li&gt;Ausência de funcionalidades para a intercomunicação entre os portlets;&amp;nbsp;&lt;/li&gt;&lt;li&gt;Limitação do Escopo de Sessão do Portlet, onde a sessão do Portlet na JSR 168 se restringe apenas ao ID individual da aplicação e não da sessão do usuário do Portal.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;Essas limitações culminaram no lançamento da JSR 286, que define a segunda versão da API de Portlets. A JSR 286 incluiu novas funcionalidades como tratamento de eventos, envio e recebimento de parâmetros (permitindo a passagem de parâmetros entre os portlets), inclusão de filtros, suporte a Ajax e a disponibilidade de recursos do servidor, com o uso da interface &lt;i&gt;ResourceServingPortlet&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;Contrato do Contêiner e Gerenciamento do ciclo de vida do Portlet&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;A especificação da JSR-286 define um contrato para o contêiner de portlets. O contrato define quais métodos o contêiner deve chamar durante o ciclo de vida do portlet mediante o uso da interface &lt;i&gt;javax.portlet.Portlet&lt;/i&gt;. O desenvolvedor pode implementar estes métodos para fornecer a funcionalidade desejada. Dessa forma, todo portlet tem que implementar esta interface, seja implementando-o diretamente ou estendendo uma classe existente que a implemente.&lt;br /&gt;Os métodos do ciclo de vida executados pelo contêiner definidos pela interface &lt;i&gt;javax.portlet.Portlet&lt;/i&gt; são apresentados na &lt;b&gt;Tabela 1&lt;/b&gt;.&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="border-bottom-style: none; border-collapse: collapse; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; width: 494px;"&gt;&lt;tbody&gt;&lt;tr&gt;   &lt;td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 91.75pt;" valign="top" width="92"&gt;&lt;div class="MsoNormal" style="text-indent: 0cm;"&gt;&lt;b&gt;&lt;span lang="PT-BR"&gt;Método&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 402.7pt;" valign="top" width="403"&gt;&lt;div class="MsoNormal" style="text-indent: 0cm;"&gt;&lt;b&gt;&lt;span lang="PT-BR"&gt;Descrição&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 91.75pt;" valign="top" width="92"&gt;&lt;div class="MsoNormal" style="text-indent: 0cm;"&gt;&lt;b&gt;&lt;span lang="PT-BR" style="font-family: 'Arial Narrow';"&gt;init()&lt;/span&gt;&lt;/b&gt;&lt;span lang="PT-BR"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 402.7pt;" valign="top" width="403"&gt;&lt;div class="MsoNormal" style="text-indent: 0cm;"&gt;&lt;span lang="PT-BR"&gt;Método executado   quando o portlet for instanciado no contêiner.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 91.75pt;" valign="top" width="92"&gt;&lt;div class="MsoNormal" style="text-indent: 0cm;"&gt;&lt;b&gt;&lt;span lang="PT-BR" style="font-family: 'Arial Narrow';"&gt;processAction()&lt;/span&gt;&lt;/b&gt;&lt;span lang="PT-BR"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 402.7pt;" valign="top" width="403"&gt;&lt;div class="MsoNormal" style="text-indent: 0cm;"&gt;&lt;span lang="PT-BR"&gt;Chamado após o   usuário submeter requisições ao portlet. É onde processamos os inputs   disparados por uma ação do usuário do portlet.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 91.75pt;" valign="top" width="92"&gt;&lt;div class="MsoNormal" style="text-indent: 0cm;"&gt;&lt;b&gt;&lt;span lang="PT-BR" style="font-family: 'Arial Narrow';"&gt;render()&lt;/span&gt;&lt;/b&gt;&lt;span lang="PT-BR"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 402.7pt;" valign="top" width="403"&gt;&lt;div class="MsoNormal" style="text-indent: 0cm;"&gt;&lt;span lang="PT-BR"&gt;Chamado sempre   que o portlet é reconstruído na tela.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 91.75pt;" valign="top" width="92"&gt;&lt;div class="MsoNormal" style="text-indent: 0cm;"&gt;&lt;b&gt;&lt;span lang="PT-BR" style="font-family: 'Arial Narrow';"&gt;destroy()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 402.7pt;" valign="top" width="403"&gt;&lt;div class="MsoNormal" style="text-indent: 0cm;"&gt;&lt;span lang="PT-BR"&gt;Executado no   momento em que o contêiner destrói o portlet. Útil para liberarmos recursos   que não estejam sendo utilizados, por exemplo, conexões com banco de dados.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;b&gt;Tabela 1.&lt;/b&gt; Métodos do ciclo de vida de um portlet&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;A especificação da JSR-286 ainda fornece interfaces opcionais para controle do ciclo de vida que o Portlet pode implementar como &lt;i&gt;EventPortlet&lt;/i&gt;, que permite ao Portlet reagir às ações ou mudanças de estado oriundas da interação do usuário com o portlet ou ações originadas por outros portlets e a interface &lt;i&gt;ResourceServingPortlet&lt;/i&gt;, utilizada para disponibilizar recursos do servidor no Portlet.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;Portlet Modes e Window States&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Para cada portlet existem dois itens de estado gerenciado, que são o modo do portlet (portlet mode) e o estado da janela (window state). Cada portlet possui um “portlet mode” corrente que indica a função que o portlet está realizando.&lt;br /&gt;Os &lt;b&gt;modes&lt;/b&gt; (ou &lt;b&gt;modos&lt;/b&gt;) definidos na especificação são &lt;b&gt;VIEW&lt;/b&gt;, &lt;b&gt;EDIT&lt;/b&gt; e &lt;b&gt;HELP&lt;/b&gt;. Estes modos são utilizados pelo método de renderização &lt;i&gt;render()&lt;/i&gt;, conforme vimos na &lt;b&gt;Tabela 1&lt;/b&gt;, para decidir qual método de visualização deve ser chamado. Os métodos de renderização chamados são apresentados na &lt;b&gt;Tabela 2&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 480;"&gt;&lt;tbody&gt;&lt;tr&gt;   &lt;td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 91.75pt;" valign="top" width="92"&gt;&lt;div class="MsoNormal" style="text-indent: 0cm;"&gt;&lt;b&gt;&lt;span lang="PT-BR"&gt;Método&lt;/span&gt;&lt;/b&gt;&lt;span lang="PT-BR"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 400.9pt;" valign="top" width="401"&gt;&lt;div class="MsoNormal" style="text-indent: 0cm;"&gt;&lt;b&gt;&lt;span lang="PT-BR"&gt;Descrição&lt;/span&gt;&lt;/b&gt;&lt;span lang="PT-BR"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 91.75pt;" valign="top" width="92"&gt;&lt;div class="MsoNormal" style="text-indent: 0cm;"&gt;&lt;b&gt;&lt;span lang="PT-BR" style="font-family: 'Arial Narrow';"&gt;doView()&lt;/span&gt;&lt;/b&gt;&lt;span lang="PT-BR"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 400.9pt;" valign="top" width="401"&gt;&lt;div class="MsoNormal" style="text-indent: 0cm;"&gt;&lt;span lang="PT-BR"&gt;Método chamado   por &lt;/span&gt;&lt;b&gt;&lt;span lang="PT-BR" style="font-family: 'Arial Narrow';"&gt;render()&lt;/span&gt;&lt;/b&gt;&lt;span lang="PT-BR"&gt;   quando o portlet está em modo de visualização (&lt;/span&gt;&lt;b&gt;&lt;span lang="PT-BR" style="font-family: 'Arial Narrow';"&gt;VIEW&lt;/span&gt;&lt;/b&gt;&lt;span lang="PT-BR"&gt;). Deve conter a lógica que apresenta a página de Visualização   para o portlet.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 91.75pt;" valign="top" width="92"&gt;&lt;div class="MsoNormal" style="text-indent: 0cm;"&gt;&lt;b&gt;&lt;span lang="PT-BR" style="font-family: 'Arial Narrow';"&gt;doEdit()&lt;/span&gt;&lt;/b&gt;&lt;span lang="PT-BR"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 400.9pt;" valign="top" width="401"&gt;&lt;div class="MsoNormal" style="text-indent: 0cm;"&gt;&lt;span lang="PT-BR"&gt;Chamado por &lt;/span&gt;&lt;b&gt;&lt;span lang="PT-BR" style="font-family: 'Arial Narrow';"&gt;render()&lt;/span&gt;&lt;/b&gt;&lt;span lang="PT-BR"&gt; quando o portlet está em modo de edição (&lt;/span&gt;&lt;b&gt;&lt;span lang="PT-BR" style="font-family: 'Arial Narrow';"&gt;EDIT&lt;/span&gt;&lt;/b&gt;&lt;span lang="PT-BR"&gt;).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 91.75pt;" valign="top" width="92"&gt;&lt;div class="MsoNormal" style="text-indent: 0cm;"&gt;&lt;b&gt;&lt;span lang="PT-BR" style="font-family: 'Arial Narrow';"&gt;doHelp()&lt;/span&gt;&lt;/b&gt;&lt;span lang="PT-BR"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 400.9pt;" valign="top" width="401"&gt;&lt;div class="MsoNormal" style="text-indent: 0cm;"&gt;&lt;span lang="PT-BR"&gt;Chamado por &lt;/span&gt;&lt;b&gt;&lt;span lang="PT-BR" style="font-family: 'Arial Narrow';"&gt;render()&lt;/span&gt;&lt;/b&gt;&lt;span lang="PT-BR"&gt; quando o portlet está em modo de ajuda (&lt;/span&gt;&lt;b&gt;&lt;span lang="PT-BR" style="font-family: 'Arial Narrow';"&gt;HELP&lt;/span&gt;&lt;/b&gt;&lt;span lang="PT-BR"&gt;) .&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;b&gt;Tabela 2. &lt;/b&gt;Métodos de renderização do Portlet Mode&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;A classe &lt;i&gt;PortletMode&lt;/i&gt; define constantes para estes portlet modes. A disponibilidade dos modos para o portlet pode ser restrito a roles (papéis) específicos de usuários do portal. Por exemplo, um usuário anônimo pode acessar o portlet apenas nos modos &lt;b&gt;VIEW&lt;/b&gt; e &lt;b&gt;HELP&lt;/b&gt;, enquanto que a role &lt;b&gt;EDIT&lt;/b&gt; pode ser utilizada somente por usuários autenticados.&lt;br /&gt;Outro tipo de estado gerenciado, o &lt;b&gt;estado da janela&lt;/b&gt; (&lt;i&gt;window state&lt;/i&gt;), apresenta a quantidade de informações que será disponibilizada para o portlet. A especificação define três tipos de estados para cada portlet, que são: &lt;b&gt;normal&lt;/b&gt;, &lt;b&gt;maximizado&lt;/b&gt; e &lt;b&gt;minimizado&lt;/b&gt;. A classe &lt;i&gt;WindowState&lt;/i&gt; possui constantes para estes estados da janela.&lt;br /&gt;Para um maior entendimento, a &lt;b&gt;Figura 1&lt;/b&gt; apresenta estes conceitos de&lt;i&gt; portlet mode&lt;/i&gt; e &lt;i&gt;window state &lt;/i&gt;aplicados a um portlet.&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-2cCqq5Gp5CM/TpYDekTxm1I/AAAAAAAAA9A/D3zC9H6_NQc/s1600/AnatomiaPortlet.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="164" src="http://2.bp.blogspot.com/-2cCqq5Gp5CM/TpYDekTxm1I/AAAAAAAAA9A/D3zC9H6_NQc/s320/AnatomiaPortlet.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;b&gt;Figura 1.&lt;/b&gt; Anatomia de um portlet&lt;/span&gt;&lt;/div&gt;Opcionalmente o desenvolvedor pode especificar tipos customizados de modo e estado de janela, alterando o arquivo portlet.xml com uso da tag &lt;b&gt;custom-window-state&lt;/b&gt; para estados de janela e &lt;b&gt;custom-portlet-mode&lt;/b&gt; para modos.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;JSF/Portlet Bridge&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Como parte do projeto OpenPortal da Sun, foi criado o projeto JSF/Portlet Bridge, que tem como objetivo fornecer uma biblioteca de integração que permita que aplicações desenvolvidas com JSF possam ser executadas em um ambiente de Portlet.&lt;br /&gt;Para atender à especificação de portlets, o JCP disponibilizou a JSR 301 para definir como um portlet 286 interage com os artefatos do JSF. A especificação foi para votação em Julho de 2006, mas somente em Janeiro de 2009 o draft da proposta final foi disponibilizada para o público.&lt;br /&gt;Portlet Bridge é uma tecnologia utilizada por um portlet para fazer uma ponte (por isso o nome bridge) para um ambiente de execução, onde diferentes abstrações são utilizadas para processar as interações com o usuário ou para renderizar a interface gráfica.&lt;br /&gt;O Portlet Bridge age como um engine tradutor entre o ambiente de portal e o sistema destino, neste caso, uma aplicação desenvolvida com o framework JSF. Ele ainda fornece uma abstração do ambiente de portal para o ambiente do bridge, deixando os desenvolvedores livres para executar aplicações Faces como portlets, sem a necessidade de conhecerem os detalhes das APIs de portlet e seu modelo de desenvolvimento.&lt;br /&gt;A &lt;b&gt;Figura 2&lt;/b&gt; ilustra uma aplicação portlet utilizando o JSF/Portlet Bridge para executar páginas Faces como se fossem fragmentos de um portlet&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-WphD-FW6K5s/TpYEYij4BZI/AAAAAAAAA9I/ML0la7vINSw/s1600/JSFPortletBridge.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-WphD-FW6K5s/TpYEYij4BZI/AAAAAAAAA9I/ML0la7vINSw/s1600/JSFPortletBridge.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;b&gt;Figura 2&lt;/b&gt;. JSF/Portlet Bridge entre uma aplicação Portlet e uma aplicação JSF.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;Transformando sua aplicação JSF em um portlet&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Para tornar uma aplicação JSF compatível com a JSR 168/286 é preciso fazer algumas alterações na aplicação antes de executá-la como um portlet.&lt;br /&gt;Primeiro, para utilizar o JSF Portlet/Bridge é preciso efetuar o download da biblioteca &lt;i&gt;jsf-portlet.jar&lt;/i&gt; no site java.net (ver ao final, em &lt;b&gt;Referências&lt;/b&gt;) e copiá-la para o diretório &lt;i&gt;WEB-INF/lib&lt;/i&gt; da aplicação JSF que você deseja executar como portlet.&lt;br /&gt;Uma vez adicionado o arquivo &lt;i&gt;.jar&lt;/i&gt; ao classpath da aplicação, é preciso adicionar o arquivo deployment descriptor &lt;i&gt;portlet.xml&lt;/i&gt; para o portlet. Neste arquivo vamos informar a classe &lt;i&gt;com.sun.faces.portlet.FacesPortlet&lt;/i&gt; para a tag portlet-class. Esta classe é a implementação da interface &lt;i&gt;javax.portlet.Portlet &lt;/i&gt;fornecida pela biblioteca do JSF/Portlet Bridge, e é ela que fará o trabalho de converter as páginas JSF para páginas de visualização no Portlet.&lt;br /&gt;É preciso também informar qual página queremos utilizar como página inicial do portlet, informando o parâmetro de portlet &lt;b&gt;com.sun.faces.portlet.INIT_VIEW&lt;/b&gt; para a página desejada, conforme mostra a &lt;b&gt;Listagem 1&lt;/b&gt; entre as linhas 08 e 15.&lt;br /&gt;&lt;pre class="xml" name="code"&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"&lt;br /&gt;version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd&lt;br /&gt;http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"&gt;&lt;br /&gt;    &lt;portlet&gt;&lt;br /&gt;        &lt;description&gt;Portlet JSF&lt;/description&gt;&lt;br /&gt;        &lt;portlet-name&gt;Teste&lt;/portlet-name&gt;&lt;br /&gt;        &lt;display-name&gt;Portlet JSF/Portlet Bridge&lt;/display-name&gt;&lt;br /&gt;        &lt;!—Incluir esta classe para a implementação de Portlet --&gt;&lt;br /&gt;        &lt;portlet-class&gt;com.sun.faces.portlet.FacesPortlet&lt;/portlet-class&gt;&lt;br /&gt;        &lt;!—Parâmetro obrigatório, que deve indicar a página inicial da aplicação JSF -&gt;&lt;br /&gt;        &lt;init-param&gt;&lt;br /&gt;            &lt;description&gt;Página inicial do Portlet &lt;/description&gt;&lt;br /&gt;            &lt;name&gt;com.sun.faces.portlet.INIT_VIEW&lt;/name&gt;&lt;br /&gt;            &lt;value&gt;/index.jsp&lt;/value&gt;&lt;br /&gt;        &lt;/init-param&gt;&lt;br /&gt;        &lt;supports&gt;&lt;br /&gt;            &lt;mime-type&gt;text/html&lt;/mime-type&gt;&lt;br /&gt;            &lt;portlet-mode&gt;VIEW&lt;/portlet-mode&gt;&lt;br /&gt;            &lt;portlet-mode&gt;EDIT&lt;/portlet-mode&gt;&lt;br /&gt;            &lt;portlet-mode&gt;HELP&lt;/portlet-mode&gt;&lt;br /&gt;        &lt;/supports&gt;&lt;br /&gt;        &lt;portlet-info&gt;&lt;br /&gt;            &lt;title&gt;Portlet JSF&lt;/title&gt;&lt;br /&gt;            &lt;short-title&gt;JSF&lt;/short-title&gt;&lt;br /&gt;        &lt;/portlet-info&gt;&lt;br /&gt;    &lt;/portlet&gt;&lt;br /&gt;&lt;/portlet-app&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;b&gt;Listagem 1.&lt;/b&gt; Portlet.xml de uma aplicação JSF&lt;/span&gt;&lt;/div&gt;Para incluir a página de edição do portlet, o procedimento é similar. Nos parâmetros iniciais do arquivo portlet.xml, devemos incluir o parâmetro de portlet &lt;b&gt;com.sun.faces.portlet.INIT_EDIT&lt;/b&gt;, conforme o trecho da &lt;b&gt;Listagem 2&lt;/b&gt;. Essa ação fará com que o contêiner de portlets interprete a página JSF editar.jsp citada na listagem, como modo de visualização &lt;b&gt;EDIT&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre class="xml" name="code"&gt;&lt;init-param&gt;&lt;br /&gt;  &lt;description&gt;Página de Edição do Portlet&lt;/description&gt;&lt;br /&gt;  &lt;name&gt;com.sun.faces.portlet.INIT_EDIT&lt;/name&gt;&lt;br /&gt;  &lt;value&gt;/editar.jsp&lt;/value&gt;&lt;br /&gt;&lt;/init-param&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;b&gt;Listagem 2.&lt;/b&gt; Inclusão da página de edição JSF no portlet&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;O mesmo se aplica para a página &lt;b&gt;HELP&lt;/b&gt;, com a inclusão do parâmetro &lt;b&gt;com.sun.faces.portlet.INIT_HELP&lt;/b&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Além disso, se em nossa aplicação houver mais de uma página, podemos atribuir regras de navegação para cada uma destas páginas, e por ser uma aplicação JSF o modelo de navegação é o do próprio JavaServer Faces.&lt;br /&gt;&lt;br /&gt;O modelo de navegação do JSF torna fácil o trabalho de definir a regra de navegação das páginas do projeto, com a utilização de apenas algumas linhas no arquivo &lt;i&gt;faces-config.xml&lt;/i&gt; da aplicação JSF. Podemos indicar qualquer página do portlet como referência para navegação, conforme demonstra a &lt;b&gt;Listagem 3&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Na &lt;b&gt;Listagem 3&lt;/b&gt;, utilizamos o modelo de navegação declarativo do próprio JSF para definir a navegação de um portlet. Como não é o escopo deste artigo, não iremos explicar o funcionamento das regras de navegação do JavaServer Faces, mas apenas para ilustrar, nesta listagem definimos uma regra que ao ser disparada uma ação na página &lt;i&gt;editar.jsp&lt;/i&gt;, a aplicação irá navegar desta página para a página &lt;i&gt;index.jsp&lt;/i&gt;, se o resultado referenciado pelo componente que disparou a ação de navegação da página &lt;i&gt;editar.jsp&lt;/i&gt; for &lt;b&gt;success&lt;/b&gt;.&lt;br /&gt;&lt;/div&gt;&lt;pre class="xml" name="code"&gt;&lt;navigation-rule&gt;&lt;br /&gt;  &lt;from-view-id&gt;/editar.jsp&lt;/from-view-id&gt;&lt;br /&gt;  &lt;navigation-case&gt;&lt;br /&gt;    &lt;from-outcome&gt;success&lt;/from-outcome&gt;&lt;br /&gt;    &lt;to-view-id&gt;/index.jsp&lt;/to-view-id&gt;&lt;br /&gt;  &lt;/navigation-case&gt;&lt;br /&gt;&lt;/navigation-rule&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;b&gt;Listagem 3.&lt;/b&gt; Navegação entre páginas JSF em um portlet&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Por fim, para executar a aplicação é preciso somente efetuar o deploy do arquivo WAR para o seu servidor de portal preferido.&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;WSRP &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;WSRP significa &lt;i&gt;Web Services for Remote Portlets&lt;/i&gt;, ou web services para portlets remotos. WSRP é uma tecnologia definida pela &lt;u&gt;OASIS&lt;/u&gt;, e propõe um padrão para web services visuais que podem ser plugados em ambientes de portal que estejam aderentes à especificação, ou seja, se em um web service padrão nós reutilizamos o serviço com WSRP, reutilizamos toda a interface gráfica. &lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;OASIS&lt;/b&gt;: Consórcio global formado por grandes empresas de tecnologia da informação como IBM, SAP, AG, Sun Microsystems, que conduz o desenvolvimento, convergência e adoção de padrões para e-business e web services, produzindo diversas especificações e padrões relacionados a áreas como SOA, web services, processamento de XML, segurança da informação e supply chain.&amp;nbsp;&lt;/blockquote&gt;Atualmente a API WSRP está na versão 2.0 e possui um fluxo bem simples. O &lt;i&gt;owner&lt;/i&gt; do portal ou da aplicação primeiro inclui em seu ambiente de portal um web service de terceiro (WSRP) dentro de um portlet. A partir deste momento, o portlet irá interagir com o conteúdo e com os serviços descritos no documento wsdl do WSRP, conforme veremos em detalhes mais adiante.&lt;br /&gt;&lt;br /&gt;Um WSRP define: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Uma interface &lt;u&gt;WSDL&lt;/u&gt; para invocação dos serviços WSRP;&amp;nbsp;&lt;/li&gt;&lt;li&gt;Como publicar, buscar, e efetuar bind dos serviços WSRP e metadados;&amp;nbsp;&lt;/li&gt;&lt;li&gt;Regras de fragmentação por marcação, para marcações emitidas pelos serviços WSRP.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;b&gt;WSDL&lt;/b&gt;: Significa Web Service Definition Language, é uma linguagem baseada em XML utilizada para descrever web services. Além de descrever o serviço, um documento WSDL especifica os métodos e operações disponíveis e como acessá-los.&amp;nbsp;&lt;/blockquote&gt;&lt;br /&gt;WSRP é útil para o desenvolvimento web pois ele desacopla o deployment da entrega da aplicação, assim como fornece tanto os dados quanto a lógica de apresentação e requer pouca ou nenhuma programação para implementação do serviço. Além disso, WSRP fornece uma série de benefícios adicionais, como interoperabilidade e portabilidade. Normalmente um servidor de portal pode atuar como um produtor ou consumidor de WSRP.&lt;br /&gt;Graças a essa interoperabilidade com o WSRP, podemos então rodar portlets Java remotos em uma ferramenta de portal que não seja em Java, como no Microsoft SharePoint. &lt;br /&gt;Entre as desvantagens, estão a adoção ainda baixa por parte dos fornecedores, e a performance, que tende a ser baixa em grandes aplicações. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Como funciona? &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Basicamente, um WSRP envolve dois componentes, além do portlet em si, conforme demonstra a &lt;b&gt;Figura 3&lt;/b&gt;. A aplicação remota, conhecida como WSRP &lt;i&gt;Producer&lt;/i&gt;, implementa os padrões de web services utilizando a especificação SOAP (&lt;i&gt;Simple Object Access Protocol&lt;/i&gt;) sobre HTTP. &lt;br /&gt;O WSRP Producer fornece um conjunto de operações para os consumidores do serviço, onde dependendo da implementação, o &lt;i&gt;Producer&lt;/i&gt; pode tanto oferecer apenas um portlet quanto pode fornecer um ambiente para gerenciamento de diversos portlets. Resumindo, o WSRP &lt;i&gt;Producer&lt;/i&gt; é um web service verdadeiro, com um WSDL e um conjunto de endpoints. Cada WSRP &lt;i&gt;Producer&lt;/i&gt; é descrito utilizando um documento WSDL padrão. &lt;br /&gt;O segundo componente é o WSRP &lt;i&gt;Consumer&lt;/i&gt;, que é o cliente do serviço e que age como uma aplicação de portal para consumir o serviço baseado no arquivo WSDL do &lt;i&gt;Producer&lt;/i&gt;.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-61TTBPSY5F8/TpYSX7POoLI/AAAAAAAAA9Q/dmNtzSWmTW8/s1600/WSRP.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-61TTBPSY5F8/TpYSX7POoLI/AAAAAAAAA9Q/dmNtzSWmTW8/s1600/WSRP.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="FiguraLegenda" style="text-align: center;"&gt;&lt;b&gt;&lt;span lang="PT-BR"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Figura 3.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang="PT-BR"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt; Consumo de um WSRP&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="Intertitulo2"&gt;&lt;span lang="PT-BR"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="Intertitulo2" style="text-align: center;"&gt;&lt;span lang="PT-BR"&gt;&lt;b&gt;Interfaces do WSRP&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="PT-BR"&gt;Conforme explicado, WSRP define um conjunto de interfaces que todo WSRP &lt;i&gt;Producer&lt;/i&gt; deve implementar e que todo WSRP &lt;i&gt;Consumer&lt;/i&gt; utiliza para interagir com os portlets remotos. O grande benefício de se padronizar estas interfaces é a possibilidade de criar portlets genéricos. Isto garante que todo fornecedor de portal que queira suportar WSRP deve seguir a&amp;nbsp;especificação.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="PT-BR"&gt;A especificação WSRP propõe as interfaces definidas na &lt;b&gt;Tabela 3&lt;/b&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table border="0" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="border-collapse: collapse; margin-left: 5.15pt; mso-padding-alt: 0cm 0cm 0cm 0cm; mso-table-layout-alt: fixed;"&gt;&lt;tbody&gt;&lt;tr style="height: 17.5pt; mso-yfti-firstrow: yes; mso-yfti-irow: 0; page-break-inside: avoid;"&gt;   &lt;td style="background: white; border-right: none; border: solid black 1.0pt; height: 17.5pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 0cm 0cm 0cm; width: 141.1pt;" valign="top" width="141"&gt;   &lt;div class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt 106.2pt; text-indent: 0cm;"&gt;&lt;span lang="PT-BR" style="font-family: &amp;quot;Times New Roman Bold&amp;quot;; font-size: 12.0pt; mso-bidi-font-family: &amp;quot;Times New Roman&amp;quot;; mso-bidi-font-size: 10.0pt;"&gt;Interface&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="background: white; border-right: none; border: solid black 1.0pt; height: 17.5pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 259.0pt;" valign="top" width="259"&gt;   &lt;div class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt 106.2pt 141.6pt 177.0pt 212.4pt 247.8pt; text-indent: 0cm;"&gt;&lt;span lang="PT-BR" style="font-family: &amp;quot;Times New Roman Bold&amp;quot;; font-size: 12.0pt; mso-bidi-font-family: &amp;quot;Times New Roman&amp;quot;; mso-bidi-font-size: 10.0pt;"&gt;Descrição&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="background: white; border: solid black 1.0pt; height: 17.5pt; mso-border-alt: solid black .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 81.55pt;" valign="top" width="82"&gt;   &lt;div class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt; text-indent: 0cm;"&gt;&lt;span lang="PT-BR" style="font-family: &amp;quot;Times New Roman Bold&amp;quot;; font-size: 12.0pt; mso-bidi-font-family: &amp;quot;Times New Roman&amp;quot;; mso-bidi-font-size: 10.0pt;"&gt;Obrigatório?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 89.0pt; mso-yfti-irow: 1; page-break-inside: avoid;"&gt;   &lt;td style="background: white; border-bottom: solid black 1.0pt; border-left: solid black 1.0pt; border-right: none; border-top: none; height: 89.0pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 0cm 0cm 0cm; width: 141.1pt;" valign="top" width="141"&gt;   &lt;div class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt 106.2pt; text-indent: 0cm;"&gt;&lt;i&gt;&lt;span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;"&gt;Service   Description Interface&lt;/span&gt;&lt;/i&gt;&lt;span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;"&gt; (Interface de Descrição de Serviço)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="background: white; border-bottom: solid black 1.0pt; border-left: solid black 1.0pt; border-right: none; border-top: none; height: 89.0pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 259.0pt;" valign="top" width="259"&gt;   &lt;div class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt 106.2pt 141.6pt 177.0pt 212.4pt 247.8pt; text-indent: 0cm;"&gt;&lt;span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;"&gt;Essa interface fornece uma descrição dos serviços fornecidos pelo &lt;i&gt;Producer&lt;/i&gt;. Baseado nestas informações,   o &lt;i&gt;Consumer&lt;/i&gt; é capaz de determinar o   que é preciso para executar o portlet, como por exemplo, inicializar um   cookie antes que o &lt;i&gt;Consumer&lt;/i&gt; interaja   com qualquer um dos portlets.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="background: white; border-top: none; border: solid black 1.0pt; height: 89.0pt; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 81.55pt;" valign="top" width="82"&gt;   &lt;div align="center" class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt; text-align: center; text-indent: 0cm;"&gt;&lt;span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;"&gt;Sim&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 125.45pt; mso-yfti-irow: 2; page-break-inside: avoid;"&gt;   &lt;td style="background: white; border-bottom: solid black 1.0pt; border-left: solid black 1.0pt; border-right: none; border-top: none; height: 125.45pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 0cm 0cm 0cm; width: 141.1pt;" valign="top" width="141"&gt;   &lt;div class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt 106.2pt; text-indent: 0cm;"&gt;&lt;i&gt;&lt;span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;"&gt;Mark-up   Interface&lt;/span&gt;&lt;/i&gt;&lt;span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;"&gt; (Interface de Marcação)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="background: white; border-bottom: solid black 1.0pt; border-left: solid black 1.0pt; border-right: none; border-top: none; height: 125.45pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 259.0pt;" valign="top" width="259"&gt;   &lt;div class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt 106.2pt 141.6pt 177.0pt 212.4pt 247.8pt; text-indent: 0cm;"&gt;&lt;span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;"&gt;A Interface de Marcação permite que o &lt;i&gt;Consumer&lt;/i&gt; interaja com o portlet remoto. Por exemplo, o &lt;i&gt;Consumer&lt;/i&gt; poderia utilizar esta   interface para realizar interações quando um usuário final submete um   formulário a partir de uma página de portal. Além disso, o portal pode   precisar obter a última marcação baseada no estado atual do portlet (por   exemplo, quando um usuário atualiza o navegador ou inicia uma interação com   outro portlet na mesma página).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="background: white; border-top: none; border: solid black 1.0pt; height: 125.45pt; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 81.55pt;" valign="top" width="82"&gt;   &lt;div align="center" class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt; text-align: center; text-indent: 0cm;"&gt;&lt;span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;"&gt;Sim&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 59.0pt; mso-yfti-irow: 3; page-break-inside: avoid;"&gt;   &lt;td style="background: white; border-bottom: solid black 1.0pt; border-left: solid black 1.0pt; border-right: none; border-top: none; height: 59.0pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 0cm 0cm 0cm; width: 141.1pt;" valign="top" width="141"&gt;   &lt;div class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt 106.2pt; text-indent: 0cm;"&gt;&lt;i&gt;&lt;span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;"&gt;Registration   Interface&lt;/span&gt;&lt;/i&gt;&lt;span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;"&gt; (Interface de Registro)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="background: white; border-bottom: solid black 1.0pt; border-left: solid black 1.0pt; border-right: none; border-top: none; height: 59.0pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 259.0pt;" valign="top" width="259"&gt;   &lt;div class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt 106.2pt 141.6pt 177.0pt 212.4pt 247.8pt; text-indent: 0cm;"&gt;&lt;span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;"&gt;Esta Interface permite que o &lt;i&gt;Producer&lt;/i&gt;   obrigue que os &lt;i&gt;Consumers&lt;/i&gt; façam um   registro antes de interagir com o serviço através do uso das interfaces de   Service Description e Mark-up.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="background: white; border-top: none; border: solid black 1.0pt; height: 59.0pt; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 81.55pt;" valign="top" width="82"&gt;   &lt;div align="center" class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt; text-align: center; text-indent: 0cm;"&gt;&lt;span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;"&gt;Não&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="height: 74.0pt; mso-yfti-irow: 4; mso-yfti-lastrow: yes; page-break-inside: avoid;"&gt;   &lt;td style="background: white; border-bottom: solid black 1.0pt; border-left: solid black 1.0pt; border-right: none; border-top: none; height: 74.0pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 0cm 0cm 0cm; width: 141.1pt;" valign="top" width="141"&gt;   &lt;div class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt 106.2pt; text-indent: 0cm;"&gt;&lt;i&gt;&lt;span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;"&gt;Portlet   Management Interface&lt;/span&gt;&lt;/i&gt;&lt;span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;"&gt; (Interface de Gerenciamento do Portlet)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="background: white; border-bottom: solid black 1.0pt; border-left: solid black 1.0pt; border-right: none; border-top: none; height: 74.0pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 259.0pt;" valign="top" width="259"&gt;   &lt;div class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt 106.2pt 141.6pt 177.0pt 212.4pt 247.8pt; text-indent: 0cm;"&gt;&lt;span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;"&gt;Esta interface fornece acesso ao ciclo de vida do portlet remoto. Um &lt;i&gt;Consumer&lt;/i&gt; poderia customizar o   comportamento do portlet ou até mesmo efetuar uma chamada ao método &lt;/span&gt;&lt;span class="NegritoTecnico"&gt;&lt;span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;"&gt;destroy()&lt;/span&gt;&lt;/span&gt;&lt;span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;"&gt; mediante o uso desta interface.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="background: white; border-top: none; border: solid black 1.0pt; height: 74.0pt; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 81.55pt;" valign="top" width="82"&gt;   &lt;div align="center" class="Tabelacomgrade1" style="layout-grid-mode: char; tab-stops: 35.4pt 70.8pt; text-align: center; text-indent: 0cm;"&gt;&lt;span lang="PT-BR" style="font-size: 12.0pt; mso-bidi-font-size: 10.0pt;"&gt;Não&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;b&gt;Tabela 3&lt;/b&gt;. Interfaces definidas na especificação WSRP&lt;/span&gt;&lt;!--EndFragment--&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;No mais é isso,&amp;nbsp;&lt;/div&gt;&lt;div&gt;Diversão Garantida!!!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-5685356309571620380?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/5685356309571620380/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=5685356309571620380' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/5685356309571620380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/5685356309571620380'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2011/10/desenvolvimento-portlets-jsrs-168-e-286.html' title='Desenvolvimento Portlets: JSRs 168 e 286'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-2cCqq5Gp5CM/TpYDekTxm1I/AAAAAAAAA9A/D3zC9H6_NQc/s72-c/AnatomiaPortlet.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-5661638138360997426</id><published>2011-10-12T17:51:00.001-03:00</published><updated>2011-10-12T23:57:02.908-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XP'/><category scheme='http://www.blogger.com/atom/ns#' term='Java Magazine'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Publicações'/><title type='text'>Princípios, Padrões e Práticas para um Design Ágil na Java Magazine - Parte 3</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/-D-Jah97hbAY/TpS1djlMfrI/AAAAAAAAA84/6uUyBZTVwY8/s1600/capaOnline_JAVA86.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-D-Jah97hbAY/TpS1djlMfrI/AAAAAAAAA84/6uUyBZTVwY8/s320/capaOnline_JAVA86.jpg" width="273" /&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="background-color: white; color: #333333; font-family: 'trebuchet ms', verdana, arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;Em Janeiro, saiu a terceira e última parte do&amp;nbsp;&lt;a href="http://www.devmedia.com.br/post-18782-Principios-Padroes-e-Praticas-para-um-Design-Agil-Parte-3.html" style="color: #3366cc; font-weight: bold;"&gt;meu artigo Princípios, Padrões e Práticas para um Design Ágil&lt;/a&gt;&amp;nbsp;na revista&amp;nbsp;&lt;a href="http://www.devmedia.com.br/post-18790-Revista-Java-Magazine-86.html" style="color: #3366cc; font-weight: bold;"&gt;Java Magazine edição 86&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;Na primeira e segunda parte desta série de artigos, publicados nas Edições 80 e 81, abordamos&amp;nbsp;sobre fundamentos de arquitetura de software, padrões de projetos em uma arquitetura distribuída,&amp;nbsp;analisamos como identificar sintomas de um software mal planejado, e como refatorar a sua&amp;nbsp;aplicação para utilizar boas práticas de desenvolvimento OO.&lt;br /&gt;&lt;div class="p1"&gt;&lt;/div&gt;&lt;div class="p1"&gt;Na última parte desta série, vamos analisar a fundo como funciona um Projeto XP, passando por&amp;nbsp;todas as suas fases, e veremos também como adotar as práticas de engenharia da Extreme&amp;nbsp;Programming para construir um software aplicando as melhores práticas de desenvolvimento OO&lt;/div&gt;&lt;div class="p1"&gt;utilizando TDD e testes de aceitação.&lt;/div&gt;&lt;div class="p1"&gt;Abordaremos os valores destas metodologias através do Manifesto Ágil, apresentando de maneira&lt;/div&gt;&lt;div class="p1"&gt;clara como estes valores estão presentes na Extreme Programming. Analisaremos também, como a&amp;nbsp;Arquitetura do Software é tratada em um projeto ágil e como algumas práticas do XP auxiliam na&amp;nbsp;criação e evolução da Arquitetura.&amp;nbsp;&lt;/div&gt;&lt;div class="p1"&gt;Por fim, é apresentado um estudo de caso onde&amp;nbsp;implementaremos uma funcionalidade em um sistema fictício, mostrando desde a escrita da estória&amp;nbsp;pelo cliente até sua implementação utilizando testes de aceite com o framework FitNesse e TDD.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-5661638138360997426?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/5661638138360997426/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=5661638138360997426' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/5661638138360997426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/5661638138360997426'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2011/10/principios-padroes-e-praticas-para-um.html' title='Princípios, Padrões e Práticas para um Design Ágil na Java Magazine - Parte 3'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-D-Jah97hbAY/TpS1djlMfrI/AAAAAAAAA84/6uUyBZTVwY8/s72-c/capaOnline_JAVA86.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-7924193281715838452</id><published>2011-10-11T18:25:00.000-03:00</published><updated>2011-10-11T18:25:10.316-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='Plugins'/><category scheme='http://www.blogger.com/atom/ns#' term='Yahoo'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Yahoo OpenHack 2010 - YQL Console for Netbeans</title><content type='html'>Depois de muito tempo sem blogar, resolvi atualizar um pouco as coisas aqui.&lt;br /&gt;O ano passado, teve o &lt;a href="http://developer.yahoo.com/hackday/"&gt;Yahoo Open Hack&lt;/a&gt;, onde mais uma vez, tive a oportunidade de participar. Para o evento, meu hack foi o &lt;a href="http://developer.yahoo.com/hacku/hackuhandler.php?appid=hacku&amp;amp;op=showhack&amp;amp;hackid=979"&gt;YQL! Console for NetBeans and Meme Robot&lt;/a&gt;.&lt;br /&gt;Apesar de não ter levado o prêmio, gostei muito do trabalho realizado, pois foi um verdadeiro hack, pois todas queries executadas pelo YQL Console no Netbeans, foram utilizando uma página do Yahoo, que descobri utilizando Wireshark.&lt;br /&gt;O plugin chamou a atenção de Geertjan wielenga, que me convidou a escrever um artigo para a &lt;a href="http://netbeans.dzone.com/"&gt;DZone&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Segue abaixo o texto, para acessar o artigo original, clique&amp;nbsp;&lt;a href="http://netbeans.dzone.com/nb-yql"&gt;aqui&lt;/a&gt;, que foi copiado do &lt;a href="http://netbeans.dzone.com/"&gt;DZONE&lt;/a&gt;,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Recently, Yahoo provided a nice API called &lt;a href="http://developer.yahoo.com/yql/"&gt;YQL&lt;/a&gt;, which stands for "Yahoo! Query Language". It's an API that exposes an SQL-like syntax (from SHOW and DESC to INSERT and DELETE commands) that is very familiar to developers. It lets you make great things: with this language, developers can use a single language to query, filter, and join data across web services. You can even create your own open data table (see &lt;a href="http://datatables.org/"&gt;http://datatables.org&lt;/a&gt;) that can make your data YQL-accessible.&lt;br /&gt;&lt;br /&gt;To test your queries and data tables, Yahoo created the &lt;a href="http://developer.yahoo.com/yql/console/"&gt;YQL Console&lt;/a&gt; to help developers test their own queries and funcionalities, it's quite useful for YQL Developers.&lt;br /&gt;&lt;br /&gt;This year (in March), Yahoo sponsored a contest called '&lt;a href="http://www.hackday.org/"&gt;Yahoo Hack Day&lt;/a&gt;', an open contest for developers to create hacks using these &lt;a href="http://developer.yahoo.com/everything.html#apis"&gt;Yahoo APIs&lt;/a&gt;. My contribution to this contest was the plugin "YQL Console for NetBeans", which is the YQL Console embedded into NetBeans IDE:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-bGdKzBOgp1I/TpSzzbEYb8I/AAAAAAAAA8w/RnnBRh9UEh0/s1600/1271129657437_yql-console.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="246" src="http://1.bp.blogspot.com/-bGdKzBOgp1I/TpSzzbEYb8I/AAAAAAAAA8w/RnnBRh9UEh0/s400/1271129657437_yql-console.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;To make it work, I used &lt;a href="http://www.wireshark.org/"&gt;wireshark&lt;/a&gt; to sniff the network to see what was happening. In that way, I was able to hack some Yahoo PHP pages that let me "clone" the console inside NetBeans IDE. I'm using some APIs like Bean Bindings and Swing Application Framework for the UI, Jakarta Commons HttpClient for accessing resources via HTTP, as well as RESTClient to format XML and JSon code, and a couple of NetBeans APIs, such as the Window System, Utilities, UI Utilities and Settings.&lt;br /&gt;&lt;br /&gt;Bem, e isso ai, para download do plugin, conforme citado acima, acesse o link&lt;br /&gt;&lt;br /&gt;&lt;a href="http://plugins.netbeans.org/plugin/27552/yql-console-for-netbeans"&gt;http://plugins.netbeans.org/plugin/27552/yql-console-for-netbeans&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Diversão Garantida!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-7924193281715838452?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/7924193281715838452/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=7924193281715838452' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/7924193281715838452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/7924193281715838452'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2011/10/yahoo-openhack-2010-yql-console-for.html' title='Yahoo OpenHack 2010 - YQL Console for Netbeans'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-bGdKzBOgp1I/TpSzzbEYb8I/AAAAAAAAA8w/RnnBRh9UEh0/s72-c/1271129657437_yql-console.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-3378567133891771960</id><published>2010-10-16T13:29:00.007-03:00</published><updated>2010-10-16T13:46:51.798-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JAVA EE 6'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Services'/><category scheme='http://www.blogger.com/atom/ns#' term='Arquitetura'/><category scheme='http://www.blogger.com/atom/ns#' term='Artigos'/><title type='text'>Introdução a JAX–RS – Java API for RESTful Web Services</title><content type='html'>&lt;a href="http://jcp.org/en/jsr/detail?id=311"&gt;JAX-RS&lt;/a&gt; é a solução do JCP para o estilo de programação REST. A proposta final da especificação foi&amp;nbsp;liberada para o público no inicio de Agosto de 2008,. A especificação define um conjunto de APIs Java para&lt;br /&gt;auxiliar no desenvolvimento de web services baseados em REST.&lt;br /&gt;O objetivo da API é fornecer um conjunto de anotações, classes e interfaces para expor uma classe POJO&lt;br /&gt;como um web service RESTful, de modo que possamos fazer uma programação fácil e de alto nível.&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Trabalhando com os recursos&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Para uma classe ser determinada como um recurso, ela tem que ser uma classe POJO com pelo menos um&amp;nbsp;método anotado com a anotação @Path.&lt;br /&gt;A anotação @Path pode ser colocada na declaração de classe ou de um método e possui o elemento value&lt;br /&gt;obrigatório. Por este elemento definimos o prefixo da URI que a classe ou o método irá atender. Na &lt;b&gt;Listagem 01&lt;/b&gt;,&amp;nbsp;a classe Repositorio é identificada pela URI relativa “/repositorio/{id}”, onde {id} é o valor do parâmetro id, fornecido junto a URI.&lt;br /&gt;Mais adiante, demonstraremos como extrair valores como esse de uma URI utilizando anotações especificas.&lt;br /&gt;&lt;pre class="java" name="code"&gt;@Path("/repositorio/{id}")&lt;br /&gt;public class Repositorio { ... }&lt;br /&gt;&lt;/pre&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Listagem 01&lt;/b&gt; - Mapeando uma URI para uma classe com @Path.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A especificação define que no ciclo de vida de um recurso, por padrão, sempre que for feito uma requisição a um recurso, será criada uma nova instância de uma classe REST. Primeiro o construtor é chamado pelo contêiner, por conta disto, o construtor da classe deve ser público. Após este primeiro passo, o contêiner efetua as injeções de dependência nos devidos métodos e o método designado para aquele recurso é invocado. E finalmente após a chamada ao método o objeto fica disponível para o garbage collector.&lt;br /&gt;Geralmente a anotação @Path é incluída na declaração de um método quando queremos atribuir um caminho mais específico para um recurso, de forma a especializar nosso método, como na &lt;b&gt;Listagem 02&lt;/b&gt;. Note no exemplo como a URI é mapeada com a classe e o método.&lt;br /&gt;&lt;pre class="java" name="code"&gt;@Path("/vendas/")&lt;br /&gt;public class Repositorio {&lt;br /&gt;  @GET&lt;br /&gt;  @Produces("application/xml")&lt;br /&gt;  @Path("/pedidos/{numPedido}/")&lt;br /&gt;  public PedidoAsXML getPedido(@PathParam("numPedido") Integer id){&lt;br /&gt;    // retorna Pedido em formato XML.&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Listagem 02&lt;/b&gt; - Mapeando uma URI para uma classe com @Path.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Acessando os Recursos&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Para acesso aos recursos, a especificação JAX-RS define um conjunto de anotações correspondentes aos métodos HTTP, como @GET, @POST, @PUT, @DELETE, @HEAD.. Elas devem ser atribuídas a métodos públicos. O método anotado com @GET, por exemplo, irá processar requisições HTTP GET na URI atribuída. O&amp;nbsp;comportamento do recurso é determinado pelo método HTTP ao qual o recurso está respondendo.&lt;br /&gt;É bom entender o papel e o uso de cada um destes métodos HTTP no momento de projetar nossos serviços.&lt;br /&gt;Além dos métodos definidos pelo JAX-RS, podemos criar uma anotação customizada como @MKCOL, com uso da anotação HttpMethod, conforme ilustra a &lt;b&gt;Listagem 03&lt;/b&gt;.&lt;br /&gt;Com esta anotação podemos criar métodos customizados e extender a gama dos métodos pré-existentes e utilizar os métodos definidos pelo WebDAV, como fazemos na &lt;b&gt;Listagem 3&lt;/b&gt;, ou podemos alternar um método padrão para a anotação customizada, onde para isso poderíamos simplesmente informar como valor para anotação HttpMethod o valor do método que queremos sobrepor, por exemplo, para sobrepor o método PUT a declaração da anotação ficaria &lt;br /&gt;&lt;pre class="java" name="code"&gt;@HttpMethod("PUT").&lt;br /&gt;&lt;br /&gt;@Target(ElementType.METHOD)&lt;br /&gt;@Retention(RetentionPolicy.RUNTIME)&lt;br /&gt;@HttpMethod("MKCOL")&lt;br /&gt;public @interface MKCOL {&lt;br /&gt;}&lt;/pre&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Listagem 03&lt;/b&gt;: Utilizando a anotação HttpMethod para criar uma anotação customizada.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Representações: Quais são os sabores?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;As classes de uma aplicação RESTful podem ser declaradas para suportar diversos tipos de formatos durante um ciclo requisição-resposta. Para isso a especificação define as anotações @Consumes e @Produces para o tratamento da request e response respectivamente.&lt;br /&gt;Com estas anotações o servidor declara o tipo de conteúdo que será trafegado, através do cabeçalho (header) do protocolo HTTP, estas anotações podem ser aplicadas na declaração de uma classe, ou podemos utilizar estas anotações na declaração do método para sobrescrever a declaração da classe, na ausência destas anotações, será assumido como default qualquer tipo de retorno ("*/*").&lt;br /&gt;No caso da anotação @Produces, ela é utilizada para mapear uma requisição de um cliente com o cabeçalho do cliente (parâmetro Accept). Desta maneira, podemos definir mais de um tipo de retorno da URI solicitada, como JSON e XML, como no exemplo da &lt;b&gt;Listagem 04&lt;/b&gt;:&lt;br /&gt;&lt;pre class="java" name="code"&gt;@GET&lt;br /&gt;@Produces({"application/xml", "application/json"})&lt;br /&gt;public PessoaConverter getPessoa(@QueryParam("CPF") String numCPF) {&lt;br /&gt;  // Retorna representação em XML ou JSON&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Listagem 04&lt;/b&gt; - Declarando o tipo de retorno com a anotação @Produces.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pegando o exemplo da&lt;b&gt; Listagem 04&lt;/b&gt;, podemos testar o retorno da chamada utilizando uma das ferramentas&lt;br /&gt;citadas no tópico "Como consumir serviços REST", como a ferramenta RESTClient, por exemplo, e incluir na&amp;nbsp;aba "Headers" o parâmetro "Accept" e no campo Value especificar o tipo de retorno primeiro com XML e depois&amp;nbsp;com JSON, conforme &lt;b&gt;Figura 01&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_6CJaDmsVepU/TLj43i8TIHI/AAAAAAAAAw0/3LjSTAyaaNo/s1600/Figura1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="376" src="http://2.bp.blogspot.com/_6CJaDmsVepU/TLj43i8TIHI/AAAAAAAAAw0/3LjSTAyaaNo/s640/Figura1.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Figura 01&lt;/b&gt; - Testando tipos de retorno para a mesma URI com RESTClient.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Com a anotação @Consumes por outro lado, podemos definir os tipos de mídia que um recurso em particular&amp;nbsp;consome. Como o exemplo da&lt;b&gt; Listagem 05&lt;/b&gt;, onde estamos declarando que o método consome apenas formatos&amp;nbsp;do tipo XML e JSON:&lt;br /&gt;&lt;pre class="java" name="code"&gt;@PUT&lt;br /&gt;@Consumes("application/xml","application/json")&lt;br /&gt;@Path("/autores/")&lt;br /&gt;public Response putPessoa(PessoaBinding pessoa) {}&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;Listagem 05: Uso da anotação @Consumes.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Extraindo parâmetros e valores da URI na requisição.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;JAX-RS fornece algumas anotações para extrair informações de uma requisição. Existem seis tipos de parâmetros (ver &lt;b&gt;Tabela 01&lt;/b&gt;) que podemos extrair para utilizar em nossa classe recurso. Para os parâmetros de query utilizamos a anotação @QueryParam. Para os parâmetros de URI(path) existe a anotação @PathParam.&lt;br /&gt;Para os parâmetros de formulário existe @FormParam. Já para parâmetros de cookie existe @CookieParam.&lt;br /&gt;Para os parâmetros de header existe @HeaderParam e, finalmente, para os parâmetros de matriz existe a anotação @MatrixParam.&lt;br /&gt;Estas anotações podem ser aplicadas diretamente a parâmetros de um método. Desta forma vinculamos o valor do parâmetro de uma URI a algum parâmetro de entrada de um método. Para contextualizar, veja um exemplo na &lt;b&gt;Listagem 06&lt;/b&gt;:&lt;br /&gt;&lt;pre class="java" name="code"&gt;@Path("/editora/")&lt;br /&gt;public class EditoraResource {&lt;br /&gt;  @GET&lt;br /&gt;  @Produces("application/xml")&lt;br /&gt;  @Path("/autores/{nomeAutor}/")&lt;br /&gt;  public PessoaBinding getPessoa(@PathParam("nomeAutor") String name,&lt;br /&gt;&amp;nbsp;&amp;nbsp;   &amp;nbsp; &amp;nbsp; &amp;nbsp;             @QueryParam("idade") int idade,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;   &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;     @HeaderParam("CPF") String numCPF,&lt;br /&gt;                       @MatrixParam("statusCivil") String statusCivil) {&lt;br /&gt;     return new PessoaBinding(name, idade, numCPF, statusCivil);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;Listagem 06&lt;/b&gt; – Mapeando os parâmetros de uma URI para os parâmetros de um método.&lt;br /&gt;&lt;br /&gt;Na &lt;b&gt;Listagem 06&lt;/b&gt;, vemos a aplicação de várias anotações de parâmetro de URI em um único método. Para entender melhor como será feito o DE-PARA da URI para os parâmetros de entrada, vamos fazer uma chamada a este recurso com a biblioteca curl, apresentado na &lt;b&gt;Figura 02&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_6CJaDmsVepU/TLj5f1v5LUI/AAAAAAAAAw4/ws0UH7iBH_E/s1600/Figura2.jpg" imageanchor="1"&gt;&lt;img border="0" height="173" src="http://3.bp.blogspot.com/_6CJaDmsVepU/TLj5f1v5LUI/AAAAAAAAAw4/ws0UH7iBH_E/s640/Figura2.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Figura 02&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; - Fragmentando a URI para demonstrar anotações de mapeamento.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_6CJaDmsVepU/TLj6qe_L7CI/AAAAAAAAAw8/fJeZXfzb1gE/s1600/tabela01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="226" src="http://1.bp.blogspot.com/_6CJaDmsVepU/TLj6qe_L7CI/AAAAAAAAAw8/fJeZXfzb1gE/s400/tabela01.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Tabela 01&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;- Anotações JAX-RS para extração de informações da URI.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;No exemplo da &lt;b&gt;Listagem 06&lt;/b&gt; não demonstramos o uso das anotações CookieParam e FormParam, mas o seu uso é bem similar. No caso de FormParam, esta anotação pode capturar todos os valores submetidos de um formulário HTML e injetá-los nos parâmetros desejados. Veja um exemplo simples na &lt;b&gt;listagem 07&lt;/b&gt;. Trata-se de um formulário HTML e de um método que irá receber estas informações.&lt;br /&gt;&lt;br /&gt;&lt;pre class="html" name="code"&gt;&lt;form action="/editora/autores" method="POST"&gt;Nome: &lt;input name="nomeAutor" type="text" /&gt;&lt;br /&gt;  Idade: &lt;input name="idade" type="number" /&gt;&lt;br /&gt;&lt;/form&gt;&lt;/pre&gt;&lt;pre class="java" name="code"&gt;@Path("/editora/")&lt;br /&gt;public class EditoraResource {&lt;br /&gt;  @GET&lt;br /&gt;  @Path("/autores/")&lt;br /&gt;  public PessoaBinding getPessoa(@FormParam("nomeAutor") String name,&lt;br /&gt;                       @FormParam("idade") int idade) {&lt;br /&gt;    return new PessoaBinding(name, idade);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Listagem 07 &lt;/b&gt;- Uso da anotação FormParam.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;No caso da anotação CookieParam, conseguimos injetar o valor de cookie ou a classe Cookie do javax.ws.rs.core, que representa o valor de um cookie HTTP na invocação de um método.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Dados de Contexto&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A especificação JAX-RS dispõe de um recurso para a obtenção de informações do contexto da aplicação e de requisições individuais. Estas informações são disponíveis tanto para as classes recursos quanto para os providers. Para a recuperação destas informações existe a anotação @Context, que ao ser aplicada sobre um campo, método ou parâmetro, identifica um alvo a ser injetado pelo contêiner.&lt;br /&gt;O contêiner fornece instâncias dos recursos listados na &lt;b&gt;tabela 02&lt;/b&gt;, mediante a aplicação da anotação @Context.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_6CJaDmsVepU/TLj8oj_QYDI/AAAAAAAAAxA/za-babvXqGM/s1600/tabela02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="175" src="http://1.bp.blogspot.com/_6CJaDmsVepU/TLj8oj_QYDI/AAAAAAAAAxA/za-babvXqGM/s400/tabela02.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Tabela 02: &lt;/b&gt;Lista de recursos injetados pelo contêiner pela anotação @Context.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Tratando o retorno dos métodos ao Cliente.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Os tipos de retorno de uma chamada a um método recurso podem ser do tipo void, Resource, GenericType ou outro tipo Java. Esses tipos de retorno são mapeados ao entity body da Response cada um de uma maneira, de acordo o provider padrão, conforme veremos a seguir.&lt;br /&gt;Para os retornos do tipo void, o retorno será um corpo vazio com status 204 do HTTP. Para tratar o retorno ao cliente foi disponibilizada a classe abstrata Response. Com essa classe definimos um contrato entre a instância de retorno e o ambiente de execução, quando uma classe precisa fornecer metadados para ambiente de execução.&lt;br /&gt;Podemos estender esta classe diretamente ou, ainda melhor, podemos criar uma instância utilizando sua classe interna ResponserBuilder. Por essa classe podemos construir objetos do tipo Response, adicionar metadados, adicionar cookies, adicionar dados no Header, informar a linguagem, entre outras informações.&lt;br /&gt;Na &lt;b&gt;Listagem 08&lt;/b&gt;, no método putPessoa, fazemos uso do método Response. Note que não a instanciamos diretamente, pois ela é uma classe abstrata que implementa o padrão de projeto Builder.&lt;br /&gt;Dentro do método, primeiramente efetuamos uma chamada ao método estático created, passando como parâmetro a URI que obtemos através da classe injetada UriInfo. Esta classe retorna o objeto ResponseBuilder, que é uma subclasse de Response, esta subclasse é utilizada exclusivamente para criar instâncias de Response.&lt;br /&gt;Por ResponseBuilder ser uma classe de construção (Builder), podemos efetuar chamadas recursivas aos métodos de parametrização. Após a chamada ao método created, chamamos o método status, no qual atribuímos o código de status HTTP 202 (Accepted) e logo após atribuímos uma entidade à requisição, no nosso exemplo um código HTML simples, pelo método entity. Na chamada ao método type seguinte, especificamos o tipo de mídia trafegado, neste caso TEXT_HTML. No final fazemos uma chamada ao método build, que constrói o objeto Response.&lt;br /&gt;E por fim o objeto GenericEntity representa uma entidade de um tipo genérico, muito útil quando precisamos retornar uma Response personalizada e reter informações genéricas. Pois informações de tipos genéricos são apagadas ao utilizar uma instância.&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;@Context protected UriInfo uriInfo;&lt;br /&gt;@PUT&lt;br /&gt;@Consumes("application/xml")&lt;br /&gt;@Path("/MundoJava/update/")&lt;br /&gt;public Response putPessoa(PessoaBinding pessoa) {&lt;br /&gt;     String retorno = "Bem vindo "+pessoa.getNome();&lt;br /&gt;     Response response = Response.created(uriInfo.getAbsolutePath()).&lt;br /&gt;                                       status(Response.Status.ACCEPTED).&lt;br /&gt;                                       entity(retorno).&lt;br /&gt;                                       type(MediaType.TEXT_HTML).&lt;br /&gt;                                       build();&lt;br /&gt;     return response;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Listagem 08&lt;/b&gt;&amp;nbsp;– Tratando a Response do cliente.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Entity Providers&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Entity providers fornecem serviços de mapeamento entre representações e seus tipos associados Java. Existem dois tipos de entity providers, &lt;i&gt;MessageBodyReader&lt;/i&gt; e &lt;i&gt;MessageBodyWriter&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;A especificação JAX-RS define que para alguns tipos, o contêiner pode automaticamente serializar (marshal) e deserealizar (unmarshal) o corpo de diferentes tipos de mensagens, listados na &lt;b&gt;tabela 03&lt;/b&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_6CJaDmsVepU/TLj_lwuAyHI/AAAAAAAAAxE/iKbS59Q63YE/s1600/tabela03.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="179" src="http://1.bp.blogspot.com/_6CJaDmsVepU/TLj_lwuAyHI/AAAAAAAAAxE/iKbS59Q63YE/s400/tabela03.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Tabela 03:&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Tipos de Mídia e seus tipos Java correspondentes.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Para requisições HTTP, podemos mapear o corpo da entidade para um parâmetro de método com uso da interface &lt;i&gt;MessageBodyReader&lt;t&gt;&lt;/t&gt;&lt;/i&gt;, para o tratamento das responses, o valor de retorno é mapeado para o corpo da entidade de um método HTTP com uso da interface &lt;i&gt;MessageBodyWriter&lt;t&gt;&lt;/t&gt;&lt;/i&gt;.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Pode ser que no desenvolvimento de nossas aplicações, estes tipos padrões não atendam a necessidade de negócio e tenhamos que lidar com tipos que não sejam suportados pelos tipos default, para contornar esta limitação, a API JAX-RS permite que a criação de Providers para Message Body customizáveis, com métodos para conversão de InputStream/OutputStream para objetos Java do tipo T.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Para criar nosso próprio provider customizado, a especificação disponibiliza a anotação @Provider, que ao ser aplicado sobre uma classe, estamos automaticamente registrando este classe junto ao contêiner.&amp;nbsp;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Porém, é importante ressaltar, que esta funcionalidade apesar de muito útil, pode ser tornar um problema em grandes projetos, que podem utilizar providers com o mesmo nome em diferentes bibliotecas, podendo ocasionar conflitos.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Caso a aplicação necessite de informações adicionais, como HTTP Headers ou um código de status diferente, o método pode retornar o objeto Response que encapsule a entidade.&amp;nbsp;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Veja um exemplo extraído de um sample da implementação de referência da Sun, o Jersey, na&lt;b&gt; listagem 09&lt;/b&gt;, esta classe implementa um &lt;i&gt;MessageBodyWriter&lt;/i&gt; para uma classe Properties.&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;pre class="java" name="code" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;@Produces("text/plain")&lt;br /&gt;@Provider&lt;br /&gt;public class PropertiesProvider implements MessageBodyWriter&lt;properties&gt; {&lt;br /&gt;    public void writeTo(Properties p, &lt;br /&gt;            Class type, Type genericType, Annotation annotations[],&lt;br /&gt;            MediaType mediaType, MultivaluedMap&lt;string, object=""&gt; headers, &lt;br /&gt;            OutputStream out) throws IOException {&lt;br /&gt;        p.store(out, null);&lt;br /&gt;    }&lt;br /&gt;    public boolean isWriteable(Class type, Type genericType, Annotation annotations[], MediaType mediaType) {&lt;br /&gt;        return Properties.class.isAssignableFrom(type);&lt;br /&gt;    }&lt;br /&gt;    public long getSize(Properties p, Class type, Type genericType, Annotation annotations[], MediaType mediaType) {&lt;br /&gt;        return -1;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Listagem 09: &lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Uso da tag @Provider.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Tratando Exceções&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Para tratamento de exceções, a especificação JAX-RS define a exceção WebApplicationException que estende RuntimeExcetion, que pode ser lançada por um método de recurso, por um provider ou por uma implementação de StreamingOutput. Esta exceção permite que abortemos a execução de um serviço JAX-RS.&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Como parâmetro de construtor, podemos utilizar um código de status HTTP ou até um objeto Response. Veja um exemplo na&amp;nbsp;&lt;b&gt;listagem 10&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;@GET&lt;br /&gt;@Produces("application/xml")&lt;br /&gt;@Path("/autores/{personName}/{idade: [0-9]+}/")&lt;br /&gt;public PessoaBinding getPessoa(@PathParam("personName") String name, @PathParam("idade")&lt;br /&gt;    int idade, @HeaderParam("CPF") String numCPF) {&lt;br /&gt;    if (idade &amp;lt;= 0 || idade &amp;gt; 120){&lt;br /&gt;        throw new WebApplicationException(Response.&lt;br /&gt;                                          status(412).&lt;br /&gt;                                          entity("Idade inválida!").&lt;br /&gt;                                          build());&lt;br /&gt;    }&lt;br /&gt;  return new PessoaBinding(name, idade, numCPF);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Listagem 10:&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Uso de exceção com WebApplicationException.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Por padrão, quando uma classe JAX-RS ou um método provider lança uma exceção em tempo de execução, essa exceção é mapeada a um código de status HTTP adequado. Nós podemos customizar a nossa exceção conforme a necessidade, para isto, a especificação define a interface ExceptionMapper, com ela podemos criar nossos próprios providers e customizar este mapeamento, para tanto, a implementação desta interface deve estar anotada com @Provider. Veja um exemplo na&amp;nbsp;&lt;b&gt;listagem 11&lt;/b&gt;:&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;@Provider&lt;br /&gt;public class IdadeInvalidaExceptionMapper implements ExceptionMapper&lt;idadeinvalidaexception&gt;{&lt;br /&gt;  public Response toResponse(IdadeInvalidaException ex) {&lt;br /&gt;    return Response.status(412).entity(ex.getMessage()).build();&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Listagem 11:&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Mapeando uma exceção Java para uma Response.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Na&amp;nbsp;&lt;b&gt;listagem 11&lt;/b&gt;&amp;nbsp;perceba que registramos a classe ExceptionMapper da mesma maneira que registramos&amp;nbsp;&lt;i&gt;MessageBodyReaders&lt;/i&gt;&amp;nbsp;e&amp;nbsp;&lt;i&gt;MessageBodyWriters&lt;/i&gt;. Ao utilizarmos a exceção IdadeInvalidaException em um método RESTful como no método da&amp;nbsp;&lt;b&gt;listagem 12&lt;/b&gt;, o contêiner irá em tempo de execução identificar o provider e irá mapear esta exceção com&amp;nbsp;&lt;i&gt;IdadeInvalidaExceptionMapper&lt;/i&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;@GET&lt;br /&gt;@Produces("application/xml")&lt;br /&gt;@Path("/autores/{personName}/{idade: [0-9]+}/")&lt;br /&gt;public PessoaBinding getPessoa(@PathParam("personName") String name, @PathParam("idade")&lt;br /&gt;int idade, @HeaderParam("CPF") String numCPF) throws IdadeInvalidaException {&lt;br /&gt;    if (idade &amp;lt;= 0 || idade &amp;gt; 120)&lt;br /&gt;       throw new IdadeInvalidaException("Idade Inválida!");&lt;br /&gt;    return new PessoaBinding(name, idade, numCPF);&lt;br /&gt;}&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Listagem 12:&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Uso de exceção de negócio, que é mapeada para Response.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Assim como toda nova tecnologia, JAX-RS não é uma bala de prata, mas sabendo o momento de usá-la se torna uma ferramenta poderosa de integração, em termos de facilidade no desenvolvimento e requerer uma&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;infraestrutura mais leve, dispensando o uso de um middleware WS-*.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Use e abuse! Diversão garantida!&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-3378567133891771960?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/3378567133891771960/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=3378567133891771960' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/3378567133891771960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/3378567133891771960'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2010/10/introducao-jaxrs-java-api-for-restful.html' title='Introdução a JAX–RS – Java API for RESTful Web Services'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6CJaDmsVepU/TLj43i8TIHI/AAAAAAAAAw0/3LjSTAyaaNo/s72-c/Figura1.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-7849020887679251750</id><published>2010-08-19T12:53:00.000-03:00</published><updated>2010-08-19T12:53:10.556-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java Magazine'/><category scheme='http://www.blogger.com/atom/ns#' term='Publicações'/><title type='text'>Princípios, Padrões e Práticas para um Design Ágil na Java Magazine - Parte 2</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_6CJaDmsVepU/TG1QCeGtNgI/AAAAAAAAAwE/4acDre1gq1U/s1600/capaOnline_java81.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_6CJaDmsVepU/TG1QCeGtNgI/AAAAAAAAAwE/4acDre1gq1U/s320/capaOnline_java81.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Em Julho, saiu a segunda parte do &lt;a href="http://www.devmedia.com.br/post-17441-Principios-Padroes-e-Praticas-para-um-Design-Agil-Parte-2.html"&gt;meu artigo Princípios, Padrões e Práticas para um Design Ágil&lt;/a&gt; na revista &lt;a href="http://www.devmedia.com.br/post-17443-Revista-Java-Magazine-81.html"&gt;Java Magazine edição 81&lt;/a&gt;, &amp;nbsp;e dando continuidade no artigo publicado na &lt;a href="http://www.devmedia.com.br/post-17125-Revista-Java-Magazine-80.html"&gt;edição 80&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Para esta segunda parte, vamos abordar as diferenças entre a criação de uma arquitetura seguindo métodos tradicionais, como o Waterfall, e a criação de um Design Ágil a partir de ciclos iterativos de duas a três semanas. Além disso, veremos meios de identificar um software mal planejado através de alguns sintomas conhecidos como Design Smells.&lt;br /&gt;Para tratar estes sintomas, abordaremos alguns princípios de Design OO, que são a base de muitos padrões de projeto e que são o produto de várias décadas de experiência com engenharia de software de não apenas um, mas de vários profissionais consagrados no ramo de tecnologia.&lt;br /&gt;Veremos na prática alguns destes princípios, abordando todo o conceito teórico, expondo através de exemplos, sua utilidade e como eles se relacionam com alguns padrões de projeto, e por fim, veremos a aplicabilidade destes princípios nos cenários apropriados para cada um deles.&lt;br /&gt;Para identificar se nosso sistema está com um bom design, Robert C. Martin, popularmente conhecido como Uncle Bob, apresentou alguns sintomas de design ruim, chamado de Design Smells (algo como Odores do Design). Estes sintomas permeiam a estrutura geral do software, e em seu livro Agile Software Development, Uncle Bob chegou a seguinte classificação:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Rigidez&lt;/li&gt;&lt;li&gt;Fragilidade&lt;/li&gt;&lt;li&gt;Imobilidade&lt;/li&gt;&lt;li&gt;Viscosidade (Pode ser 2 tipos: Viscosidade do Software e Viscosidade do ambiente)&lt;/li&gt;&lt;li&gt;Complexidade Desnecessária&lt;/li&gt;&lt;li&gt;Repetição Desnecessária&lt;/li&gt;&lt;li&gt;Opacidade&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Uma boa técnica para desenvolver um código expressivo é utilizar uma das principais ideias do Domain Driven Design, a Linguagem Ubíqua (ou Onipresente), proposta por Eric Evans. Esta técnica consiste em aplicar uma linguagem comum entre os desenvolvedores e analistas de negócio, utilizando os conceitos do modelo de domínio como forma primária de comunicação, fazendo com que ela seja aplicada tanto nos discursos entre os técnicos e os stakeholders quanto na documentação do sistema. Como consequência, fazemos com que os mesmos termos utilizados no domínio do negócio sejam expressos também no código, o que torna a comunicação mais transparente entre os times durante as discussões sobre o modelo do domínio.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Os sintomas citados acima, podem ser identificados em qualquer parte do sistema e são causados geralmente pela violação de alguns princípios da Programação Orientada a Objetos. Estes princípios, ainda que antigos, são pouco difundidos, mas essenciais para criar um bom Design em qualquer projeto orientado a objetos.&lt;br /&gt;Os princípios que abordaremos no artigo são:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&amp;nbsp;Princípio Aberto-Fechado (OCP – Open-Closed Principle);&lt;/li&gt;&lt;li&gt;&amp;nbsp;Princípio DRY (Don’t Repeat Yourself);&lt;/li&gt;&lt;li&gt;&amp;nbsp;Princípio da Responsabilidade Única (SRP – The Single Responsibility Principle);&lt;/li&gt;&lt;li&gt;&amp;nbsp;Princípio da Substituição de Liskov (LSP – Liskov Substitution Principle);&lt;/li&gt;&lt;li&gt;&amp;nbsp;Princípio do Conhecimento Mínimo (PLK – The Principle of Least Knowledge)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div&gt;Diversão Garantida!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-7849020887679251750?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/7849020887679251750/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=7849020887679251750' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/7849020887679251750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/7849020887679251750'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2010/08/principios-padroes-e-praticas-para-um_19.html' title='Princípios, Padrões e Práticas para um Design Ágil na Java Magazine - Parte 2'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6CJaDmsVepU/TG1QCeGtNgI/AAAAAAAAAwE/4acDre1gq1U/s72-c/capaOnline_java81.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-8904660369082027581</id><published>2010-08-13T22:31:00.000-03:00</published><updated>2010-08-13T22:31:56.220-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='Portal'/><category scheme='http://www.blogger.com/atom/ns#' term='Arquitetura'/><category scheme='http://www.blogger.com/atom/ns#' term='Web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Artigos'/><title type='text'>Introdução a Portais Corporativos</title><content type='html'>Se buscarmos a definição de Portal no dicionário, na maioria delas veremos que ele é definido como “uma porta, portão ou entrada”. Quando falamos em Portais web, estamos nos referindo a sites especiais da web ou intranet, que são designados a agir como um gateway de acesso a outros sites.&lt;br /&gt;Um portal agrega informações de múltiplas fontes e torna estas informações disponíveis para diversos usuários. Além de disponibilizar diversas fontes de informações, eles fornecem um guia de serviços que auxiliam os usuários a se direcionarem no meio de tantas informações na internet.&lt;br /&gt;Mais especificamente, um portal não deve ser visto somente como gateway para outros sites, mas para todos os recursos acessíveis na rede, que envolve intranets, extranets ou a própria Internet. Em outras palavras, um portal oferece acesso centralizado para aplicações e todo conteúdo relevante para a empresa/usuários finais. Na &lt;b&gt;Figura 1&lt;/b&gt; apresentamos a arquitetura de um portal, formado por um servidor web, um contêiner de Servlets/Portlets e as aplicações (portlets) para o portal, conforme veremos em detalhes no decorrer do artigo.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_6CJaDmsVepU/TGXu7rK07dI/AAAAAAAAAvk/a0n3EvCVISM/s1600/ArquiteturaPortal.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_6CJaDmsVepU/TGXu7rK07dI/AAAAAAAAAvk/a0n3EvCVISM/s320/ArquiteturaPortal.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Figura 1.&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; Arquitetura de um portal&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Durante muito tempo as ferramentas de portal foram ignoradas e até mesmo discriminadas por muitos programadores que achavam que elas eram de uso exclusivo para web designers. Mas com o surgimento da arquitetura orientada a serviços e a busca frenética das empresas em disponibilizar soluções mais baratas e produtivas, com o intuito de reduzir o Time-to-Marketing, esse tipo de ferramenta voltou com toda a força para fazer o que sempre fez: facilitar a vida de todos. A partir desta análise, mostraremos nesse artigo as vantagens do uso de uma ferramenta de portal, e qual o papel do programador neste contexto.&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Segurança&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;A etapa mais cansativa e torturante para um desenvolvedor é ter que gastar seu tempo desenvolvendo módulos de segurança de uma aplicação, sendo que esses módulos geralmente são constituídos por telas de autenticação, tratamentos de usuários e grupos de usuário, utilização de repositórios LDAP, e em algumas vezes a integração com um autenticador para desfrutar do tão desejável Single Sign On .&lt;/div&gt;&lt;div&gt;Além de ter todas essas características, muitas vezes é necessário desenvolver soluções “self-service”, para que o administrador do ambiente de Portal tenha autonomia para gerenciar o repositório de usuários e dar permissões de uso para as funcionalidades da ferramenta.&lt;/div&gt;&lt;div&gt;Praticamente todas as soluções de portal possuem todo esse mecanismo pronto, possibilitando ao programador se dedicar somente no desenvolvimento das aplicações de automatização do negócio.&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Conteúdo&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;No desenvolvimento completo de uma solução como uma “Intranet”, é comum ver que todo o tempo de desenvolvimento é gasto na criação de aplicações para gerenciamento de conteúdo, como funcionalidades de notícias, biblioteca de documentos, áreas institucionais e qualquer outra seção que necessita de um gerenciamento de informações por parte do usuário do sistema. Em um projeto deste tipo, também é comum que todas essas funcionalidades passem por uma governança editorial, e que inevitavelmente necessitem de um mecanismo de workflow. Essas são funcionalidades típicas nas ferramentas de portal, o que fez com que todos achassem que esse tipo de ferramenta só proporcionava esse benefício.&lt;/div&gt;&lt;div&gt;Há empresas que buscam outras soluções que vão além de um simples gerenciamento de conteúdo, indicando que elas devem ser mais robustas e possuir módulos de digitalização, transformação e busca de conteúdo. Esses sistemas, chamados ECM (Enterprise Content Management), muitas vezes dependem de uma ferramenta de portal para disponibilizar o conteúdo trabalhado. Este é só um exemplo de ferramenta que necessita de um portal como camada de visão. E a forma com a qual esse e outros tipos de ferramentas mostram suas funcionalidades é através dos chamados portlets.&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Portlet&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;A internet fornece um conjunto de informações quase que ilimitado para diversos tipos de dispositivos. Com o advento da web foi criado um universo de padrões e protocolos de comunicação, recursos, e uma linguagem de marcação utilizada para apresentação (HTML). Mas a web e seus protocolos foram projetados para atender ao conceito de uma página como um pedaço estático único de informação, apresentado em um navegador, como uma entidade completa e inalterável. Para visualizar outra página, o usuário tem que chamar outra página.&lt;/div&gt;&lt;div&gt;Até o momento, diversos esforços têm sido feitos para superar esta limitação com o uso extensivo de código, como JavaScript/Ajax, ou alguma solução DHTML para trazer ao usuário uma experiência similar e até mesmo superior ao uso de uma aplicação desktop.&lt;/div&gt;&lt;div&gt;Portlet é uma maneira de superar a natureza “tudo ou nada” de uma página HTML. Para defini-los podemos dizer que os portlets são o núcleo dos serviços de um portal, onde uma ferramenta de portal utiliza os portlets como uma interface de apresentação plugável, ou seja, aplicações que podem ser adicionadas em qualquer página em um ambiente de portal, com o objetivo de fornecer qualquer tipo de informação na camada de apresentação.&lt;/div&gt;&lt;div&gt;O conteúdo gerado por um portlet é chamado de fragmento, que na verdade é um pedaço de marcação (ex: HTML, XHTML, etc.) aderente a certas regras, de forma que possamos agregar pedaços de vários fragmentos para gerar um documento.&lt;/div&gt;&lt;div&gt;A página de um portal é composta por um ou mais portlets, que são normalmente agregados com o conteúdo de outros portlets para formar uma página. O ciclo de vida de um portlet é gerenciado pelo contêiner de portlet, conforme veremos logo a seguir. Na &lt;b&gt;Figura 2&lt;/b&gt; apresentamos uma página de exemplo do portal open source &lt;a href="http://www.liferay.com/"&gt;Liferay&lt;/a&gt;, com a disposição de vários portlets.&lt;/div&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_6CJaDmsVepU/TGXvq6yoFRI/AAAAAAAAAvs/1oA0Hfcdfus/s1600/liferay.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="317" src="http://3.bp.blogspot.com/_6CJaDmsVepU/TGXvq6yoFRI/AAAAAAAAAvs/1oA0Hfcdfus/s400/liferay.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Figura 2&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;. Exemplo de uma página de portal&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Se olharmos atentamente o conteúdo do navegador na &lt;b&gt;Figura 2&lt;/b&gt;, veremos que a página é formada por diferentes janelas. Temos uma janela para um dicionário, outra para um RSS, uma terceira para um calendário, e por último uma para o Google Maps. Cada uma destas janelas representa um portlet. Ao analisarmos o detalhe de cada janela, vamos perceber que cada uma delas contém uma barra de título e alguns botões, incluindo os botões de maximizar e minimizar.&lt;/div&gt;&lt;div&gt;Na verdade, estas janelas são aplicações diferentes, desenvolvidas independentemente uma das outras. O programador desenvolve o portlet como uma aplicação web e empacota em um arquivo .war, e o administrador do portal efetua o deploy deste arquivo .war no servidor de portal e adiciona o portlet recém instalado em uma ou mais páginas do portal.&lt;/div&gt;&lt;div&gt;Pelo fato de você poder colocar o portlet em qualquer página, faz com que você possa reutilizá-lo a todo o momento no portal, até mesmo em uma mesma página. No caso da &lt;b&gt;Figura 3&lt;/b&gt;, apresentamos uma página com várias instâncias de um mesmo portlet (Locadora).&lt;/div&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_6CJaDmsVepU/TGXwMOn47aI/AAAAAAAAAv0/5IISEdVvnos/s1600/locadora.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_6CJaDmsVepU/TGXwMOn47aI/AAAAAAAAAv0/5IISEdVvnos/s320/locadora.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Figura 3&lt;/b&gt;. Várias instâncias do mesmo portlet em uma página&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Repare nesta figura que temos um mesmo portlet na página, mas com instâncias diferentes. A ferramenta de portal tem a responsabilidade de garantir sessões independentes da aplicação, mesmo estando todos na mesma página.&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Contêiner&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Portlets são executados em um contêiner de portlets. O contêiner fornece aos portlets o ambiente necessário para sua execução e gerenciam o seu ciclo de vida.&lt;/div&gt;&lt;div&gt;O contêiner de portlets recebe as requisições oriundas do portal para executar ações nos portlets em seu ambiente. É importante entender que contêiner de portlets não é responsável por agregar o conteúdo produzido pelo portlet que ele está hospedando, quem faz esta agregação é o próprio portal.&lt;/div&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_6CJaDmsVepU/TGXxB_cQqbI/AAAAAAAAAv8/PeeHngx47Z4/s1600/FluxoPortal.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_6CJaDmsVepU/TGXxB_cQqbI/AAAAAAAAAv8/PeeHngx47Z4/s320/FluxoPortal.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Figura 4. &lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Fluxo de criação de uma página de portal&lt;/span&gt;&lt;/div&gt;&lt;div&gt;A&lt;b&gt; Figura 4&lt;/b&gt;&amp;nbsp;acima, apresenta como funciona a construção da página de um portal. Podemos notar que os portlets rodam dentro do contêiner, que recebe o conteúdo gerado pelos portlets. Na seqüência, vemos que o contêiner retorna o conteúdo do portlet para o portal. Por último, o servidor de portal cria a página com o conteúdo gerado pelos portlets e envia para o dispositivo cliente, onde é renderizada (por exemplo, um navegador).&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #351c75;"&gt;&lt;i&gt;Contêiners de Portlet e Contêiners de Servlets&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Os portlets possuem várias similaridades com os servlets, como ambos serem componentes gerenciados por um contêiner especializado, ambos gerarem conteúdo dinâmico, por ambos interagirem com um cliente web através de request/response HTTP. Entretanto, os portlets não podem ser tratados como servlets por conta dos seguintes fatores:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Geram somente fragmentos de página no método de renderização, e não documentos completos;&lt;/li&gt;&lt;li&gt;Podem somente ser invocados através de URLs construídas através da API de portlet;&lt;/li&gt;&lt;li&gt;Clientes web interagem com os portlets através do sistema de portal;&lt;/li&gt;&lt;li&gt;Possuem modos pré-definidos de portlet e estados de janela que indicam a função que o portlet está executando;&lt;/li&gt;&lt;li&gt;Possuem um tratamento de requisição refinado para action, eventos, requisições de renderização e requisições a recursos;&lt;/li&gt;&lt;li&gt;Não possuem acesso a certas funcionalidades fornecidas pelos servlets, como a URL de requisição do cliente ao Portal, ou atribuir o encoding de caracteres para a resposta ao cliente.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Por conta destas diferenças, o JCP decidiu criar para portlets um novo tipo de componente. Porém, ao formular a especificação de Portlets, o JCP procurou sempre que possível, potencializar o uso das funcionalidades fornecidas pela especificação de Servlets. Isto inclui deployment, classloading, aplicações web, gerenciamento de sessão e request dispatching. Por isso, diversos conceitos e partes da API de Portlets foram modelados a partir da API de Servlet.&lt;/div&gt;&lt;div&gt;Os objetos criados em uma aplicação de portal, como portlets, servlets e JSPs são empacotados como uma aplicação web comum (.war), e irão compartilhar o mesmo classloader, contexto de aplicação e sessão no ambiente de execução.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;No próximo artigo sobre o assunto, vou falar sobre as JSRs 168 / 286 sobre a criação de Portlets.&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-8904660369082027581?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/8904660369082027581/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=8904660369082027581' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/8904660369082027581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/8904660369082027581'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2010/08/introducao-portais-corporativos.html' title='Introdução a Portais Corporativos'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6CJaDmsVepU/TGXu7rK07dI/AAAAAAAAAvk/a0n3EvCVISM/s72-c/ArquiteturaPortal.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-5155242571431680770</id><published>2010-08-13T21:36:00.004-03:00</published><updated>2010-08-13T21:48:05.309-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java Magazine'/><category scheme='http://www.blogger.com/atom/ns#' term='Publicações'/><title type='text'>Princípios, Padrões e Práticas para um Design Ágil na Java Magazine - Parte 1</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_6CJaDmsVepU/TGXZuF1eDzI/AAAAAAAAAvU/vnregwpBleA/s1600/capaOnline_java80_2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_6CJaDmsVepU/TGXZuF1eDzI/AAAAAAAAAvU/vnregwpBleA/s320/capaOnline_java80_2.jpg" width="274" /&gt;&lt;/a&gt;&lt;/div&gt;Na revista &lt;a href="http://www.devmedia.com.br/post-17125-Revista-Java-Magazine-80.html"&gt;Java Magazine Edição 80&lt;/a&gt;, saiu a primeira parte de uma série de três artigos, onde abordarei diversos assuntos relacionados ao desenvolvimento de software em ambientes ágeis.&lt;br /&gt;Como o nome indica, ele é baseado no obra de Uncle Bob, Robert C. Martin, autor de diversos livros importantes como &lt;a href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1281745868&amp;amp;sr=8-1"&gt;Clean Code&lt;/a&gt;, &lt;a href="http://www.amazon.com/UML-Java-Programmers-Robert-Martin/dp/0131428489/ref=sr_1_6?s=books&amp;amp;ie=UTF8&amp;amp;qid=1281745906&amp;amp;sr=1-6"&gt;UML for Java Programmers&lt;/a&gt;, &lt;a href="http://www.amazon.com/Extreme-Programming-Practice-James-Newkirk/dp/0201709376/ref=sr_1_8?s=books&amp;amp;ie=UTF8&amp;amp;qid=1281745906&amp;amp;sr=1-8"&gt;Extreme Programming in Practice&lt;/a&gt; e o clássico &lt;a href="http://www.amazon.com/Software-Development-Principles-Patterns-Practices/dp/0135974445/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1281745906&amp;amp;sr=1-1"&gt;Agile Software Development, Principles, Patterns, and Practices&amp;nbsp;&lt;/a&gt;, que é o livro que me baseei para escrever este artigo, obviamente, este livro não foi a única fonte de inspiração, pois falei sobre diversos assuntos, como arquitetura de software e Design, princípios não abordados no livro (Pragmatic Programming), DDD, Effective Java, entre outros. &lt;br /&gt;A primeira parte desta série o objetivo é apresentar conceitos relacionados a arquitetura de software, como Estilos de Arquitetura conhecidos (SOA, DDD, Arquitetura em Camadas, 3/N Tiers). Separação de Responsabilidades (Separation of Concerns) Horizontal e Vertical. Arquitetura Distribuída, Tiers e Layers. &lt;br /&gt;E &amp;nbsp;visa também demonstrar boas práticas de desenvolvimento de software e explicar os princípios fundamentais para se criar um bom design. E analisar também a aplicação de alguns padrões de projeto pouco difundidos, mas que são de extrema importância no dia a dia do desenvolvedor.&lt;br /&gt;Como os Padrões de Projeto Front Controller, Domain Model e Transaction Script.&lt;br /&gt;Em breve vou publicar neste blog alguns artigos para complementar o assunto,&lt;br /&gt;&lt;div&gt;Diversão Garantida!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-5155242571431680770?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/5155242571431680770/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=5155242571431680770' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/5155242571431680770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/5155242571431680770'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2010/08/principios-padroes-e-praticas-para-um.html' title='Princípios, Padrões e Práticas para um Design Ágil na Java Magazine - Parte 1'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6CJaDmsVepU/TGXZuF1eDzI/AAAAAAAAAvU/vnregwpBleA/s72-c/capaOnline_java80_2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-3638284894179945749</id><published>2010-03-17T20:58:00.006-03:00</published><updated>2012-01-13T18:31:40.844-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lean'/><category scheme='http://www.blogger.com/atom/ns#' term='XP'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Academia Agile - Do Coaching ao Kanban</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_6CJaDmsVepU/S6FtJMwCeAI/AAAAAAAAAuU/PJGvaHFD8O8/s320/academiaagile.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;Muitos já sabem que a &lt;a href="http://globalcode.com.br/" target="_blank"&gt;Globalcode &lt;/a&gt;em conjunto com a&amp;nbsp;&lt;a href="http://www.fratech.net/home" target="_blank"&gt;Fratech&amp;nbsp;&lt;/a&gt;&amp;nbsp;está lançando a &lt;a href="http://globalcode.com.br/treinamentos/carreiras/academia-do-agile" target="_blank"&gt;Academia do Agile&lt;/a&gt;, uma carreira com a carga horária de 108 horas, e composta por 8&amp;nbsp;&amp;nbsp;cursos que abordam todos os aspectos necessários para formar um profissional ágil.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #666666; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;table border="0" cellpadding="0" cellspacing="1" class="modulos_agil" style="background-color: #d9d9d9; width: 802px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td style="background-color: #a7bade; color: white; font-size: 11px; font-weight: bold; height: 35px; line-height: 15px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;" width="71"&gt;Código&lt;/td&gt;&lt;td style="background-color: #a7bade; color: white; font-size: 11px; font-weight: bold; height: 35px; line-height: 15px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;" width="530"&gt;Nome do curso&lt;/td&gt;&lt;td style="background-color: #a7bade; color: white; font-size: 11px; font-weight: bold; height: 35px; line-height: 15px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;" width="100"&gt;Carga&lt;br /&gt;Horária&lt;/td&gt;&lt;td style="background-color: #a7bade; color: white; font-size: 11px; font-weight: bold; height: 35px; line-height: 15px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;" width="100"&gt;Apostila&lt;br /&gt;Demo&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="pretoCentro" style="background-color: white; color: black; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;"&gt;&lt;b&gt;AG1&lt;/b&gt;&lt;/td&gt;&lt;td class="corEsquerda" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: left;"&gt;&lt;b&gt;Implantando e liderando equipes Ágeis&lt;/b&gt;&lt;/td&gt;&lt;td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"&gt;&lt;b&gt;12 hs&lt;/b&gt;&lt;/td&gt;&lt;td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="pretoCentro" style="background-color: white; color: black; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;"&gt;&lt;b&gt;AG2&lt;/b&gt;&lt;/td&gt;&lt;td class="corEsquerda" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: left;"&gt;&lt;b&gt;Criação de produtos com Requisitos Ágeis&lt;/b&gt;&lt;/td&gt;&lt;td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"&gt;&lt;b&gt;12 hs&lt;/b&gt;&lt;/td&gt;&lt;td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="pretoCentro" style="background-color: white; color: black; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;"&gt;&lt;b&gt;AG3&lt;/b&gt;&lt;/td&gt;&lt;td class="corEsquerda" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: left;"&gt;&lt;b&gt;Otimizando a Comunicação através de DDD&lt;/b&gt;&lt;/td&gt;&lt;td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"&gt;&lt;b&gt;12 hs&lt;/b&gt;&lt;/td&gt;&lt;td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="pretoCentro" style="background-color: white; color: black; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;"&gt;&lt;b&gt;AG4&lt;/b&gt;&lt;/td&gt;&lt;td class="corEsquerda" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: left;"&gt;&lt;b&gt;Modelagem Ágil de Software&lt;/b&gt;&lt;/td&gt;&lt;td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"&gt;&lt;b&gt;12 hs&lt;/b&gt;&lt;/td&gt;&lt;td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="pretoCentro" style="background-color: white; color: black; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;"&gt;&lt;b&gt;AG5&lt;/b&gt;&lt;/td&gt;&lt;td class="corEsquerda" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: left;"&gt;&lt;b&gt;Práticas Ágeis de Engenharia de Software com XP&lt;/b&gt;&lt;/td&gt;&lt;td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"&gt;&lt;b&gt;24 hs&lt;/b&gt;&lt;/td&gt;&lt;td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="pretoCentro" style="background-color: white; color: black; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;"&gt;&lt;b&gt;AG6&lt;/b&gt;&lt;/td&gt;&lt;td class="corEsquerda" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: left;"&gt;&lt;b&gt;Gestão de projetos com Scrum&lt;/b&gt;&lt;/td&gt;&lt;td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"&gt;&lt;b&gt;12 hs&lt;/b&gt;&lt;/td&gt;&lt;td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="pretoCentro" style="background-color: white; color: black; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;"&gt;&lt;b&gt;AG7&lt;/b&gt;&lt;/td&gt;&lt;td class="corEsquerda" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: left;"&gt;&lt;b&gt;Gestão de processos com Kanban e Lean&lt;/b&gt;&lt;/td&gt;&lt;td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"&gt;&lt;b&gt;12 hs&lt;/b&gt;&lt;/td&gt;&lt;td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="pretoCentro" style="background-color: white; color: black; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;"&gt;&lt;b&gt;AG8&lt;/b&gt;&lt;/td&gt;&lt;td class="corEsquerda" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: left;"&gt;&lt;b&gt;Estratégia Ágil para Governança em TI&lt;/b&gt;&lt;/td&gt;&lt;td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"&gt;&lt;b&gt;12 hs&lt;/b&gt;&lt;/td&gt;&lt;td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="pretoCentro" style="background-color: white; color: black; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center;"&gt;&lt;/td&gt;&lt;td class="corEsquerda" style="background-color: white; color: #a7bade; font-size: 11px; height: 25px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: left;"&gt;&lt;strong&gt;Resumo da carreira Academia do Agile&lt;/strong&gt;&lt;/td&gt;&lt;td class="corCentro" style="background-color: white; color: #a7bade; font-size: 11px; font-weight: normal; height: 25px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 7px; padding-left: 7px; padding-right: 7px; padding-top: 7px; text-align: center; vertical-align: middle;"&gt;&lt;strong&gt;108 hs&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Serei um dos revisores do material e para as próximas turmas um dos instrutores desta Academia, mas o que posso garantir é que o material foi feito pelos maiores especialistas na área, meus amigos &lt;a href="http://felipero.com/" target="_blank"&gt;Felipe Rodrigues&lt;/a&gt; da &lt;a href="http://www.fratech.net/home" target="_blank"&gt;Fratech &lt;/a&gt;e &lt;a href="http://twitter.com/manoelp" target="_blank"&gt;Manoel Pimentel&lt;/a&gt; editor chefe da revista &lt;a href="http://visaoagil.wordpress.com/" target="_blank"&gt;Visão Ágil&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A primeira turma está com 25% de desconto, pelo preço é uma ótima pedida para quem quer conhecer a fundo as disciplinas do Agile.&lt;br /&gt;&lt;br /&gt;Segue alguns dos temas que irá rolar em cada módulo.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; font-family: Verdana, Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;AG1&lt;/b&gt;&lt;/span&gt;-&amp;nbsp;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; color: #a7bade; font-family: Verdana, Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;Implantando e liderando equipes Ágeis&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;b&gt;&lt;li&gt;Facilitação&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;O que é facilitação&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Abordagem cognitiva para facilitar mudanças&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Um breve passeio pela mente humana&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Estimulando a Neuroplasticidade&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Compreensão do Sistema Límbico&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Técnicas de Facilitação durante as atividades Agile&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Os Seis Chapéus do Pensamento&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Feedback efetivo através da janela de JOHARI&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;O Que? Para que? E como causar a mudança com a TOC(Theory of Constraints)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;O desenvolvimento da confiança entre indivíduo&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Planejamento de eventos de facilitação&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Coaching&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Objetivo do Coaching&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Desfazendo mitos acerca do Coaching&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Papéis no processo de Coaching&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Condição Humana&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Missão e Ideal&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Valores e Crenças&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Consciência e Responsabilidade&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Perguntas Eficazes para gerar mudanças&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Motivação (verdades e mentiras)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Vencendo o Inner Game&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;FFA (Force Field Analysis)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Ganhos e Perdas&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Modelo FARM&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Modelo GROW&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;House of Change&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Estrutura das sessões de Coaching&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Liderança&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Gestão do tempo para gerar ROE&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Empatia&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Técnica Pomodoro&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;GTD - Getting Things Done&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Covey Planning&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Liderança baseada em Coaching&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Coaching para Equipes&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;O Coaching num ambiente Ágil&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;O que fazer com impedimentos?&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Projeto de aplicação prática de Coaching&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/b&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; color: #a7bade; font-family: Verdana, Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: black; font-weight: normal;"&gt;&lt;b&gt;AG2 -&amp;nbsp;&lt;/b&gt;&lt;/span&gt;Criação de produtos com Requisitos Ágeis&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;b&gt;Definição de escopo&lt;/b&gt;&lt;/b&gt;&lt;/li&gt;&lt;b&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;O produto do ponto de vista de negócio&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;As dimensões do escopo (Tamanho, simplicidade e aderência.)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Processo de aprendizado de escopo&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Estado Lean para o desenho de software&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Requisitos ágeis e os casos de usos?&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;User Stories&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Modelando Papéis&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Representando desejos com User Story&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Formato para User Story&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;O modelo INVEST&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Usando Temas e Épicos&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Features segundo o FDD&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Representando desejos com Features&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;O modelo ARO (Ação Resultado Objeto)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Aplicando a FBS (Feature Breakdown Structure) da FDD (Feature Driven Development)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Usando Áreas e Atividades&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Priorização por Áreas, Atividades ou Temas&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Definindo o modelo de Entrega&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Estratégia de entrega em alto nível&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Critérios de Aceitação em diferentes níveis&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;DoD (Definition of Done) em diferentes níveis&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Monitoramento de resultados&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Aplicando a TOC na engenharia de requisitos&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Documentação pós-projeto&lt;/b&gt;&lt;/li&gt;&lt;/b&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; color: #a7bade; font-family: Verdana, Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: black; font-weight: normal;"&gt;&lt;b&gt;AG3 -&amp;nbsp;&lt;/b&gt;&lt;/span&gt;Otimizando a Comunicação através de DDD&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;b&gt;&lt;/b&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;b&gt;Introdução ao Domain Driven Design&lt;/b&gt;&lt;/b&gt;&lt;/li&gt;&lt;b&gt;&lt;b&gt;&lt;li&gt;Sinergia entre Domain Driven Design e os princípios Ágeis&lt;/li&gt;&lt;li&gt;Uma Linguagem Unificada e abrangente&lt;/li&gt;&lt;li&gt;Visão Arquitetural do Domain Driven Design&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Arquitetura em Camadas&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Objetos de negócio com Domain Objects&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Ciclo de vida dos Domain Objects&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Mantendo um domínio flexível com Supple Design&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Práticas de suporte&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Refactoring em busca de aprofundamento&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Integrando vários domínios com Strategic Desing&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Delimitando os contextos&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Integração entre contextos diferentes&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Estratégias de integração&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/b&gt;&lt;/b&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; color: #a7bade; font-family: Verdana, Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: black; font-weight: normal;"&gt;&lt;b&gt;AG4 -&amp;nbsp;&lt;/b&gt;&lt;/span&gt;Modelagem Ágil de Software&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;Introdução à Modelagem de software&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/li&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;li&gt;Modelagem no contexto da agilidade&lt;/li&gt;&lt;li&gt;Ciclos de modelagem ágil&lt;/li&gt;&lt;li&gt;Modelagem em equipe&lt;/li&gt;&lt;li&gt;Visualização do modelo&lt;/li&gt;&lt;li&gt;Diagramas simples e práticos com Agile Draw&lt;/li&gt;&lt;li&gt;Modelagem Ágil e UML&lt;/li&gt;&lt;li&gt;Resultados da modelagem ágil&lt;/li&gt;&lt;li&gt;Entregáveis&lt;/li&gt;&lt;div&gt;&lt;/div&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; color: #a7bade; font-family: Verdana, Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: black; font-weight: normal;"&gt;&lt;b&gt;AG5 -&amp;nbsp;&lt;/b&gt;&lt;/span&gt;Práticas Ágeis de Engenharia de Software com XP&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Introdução ao Extreme Programming&lt;/b&gt;&lt;/li&gt;&lt;b&gt;&lt;li&gt;Modelo cíclico de entrega&lt;/li&gt;&lt;li&gt;Ciclo PDCA&lt;/li&gt;&lt;li&gt;Test Driven Development&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;O modelo Test First&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Modelando através dos testes&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Relação custo-benefício dos testes&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Behavior Driven Development&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Especificação executável com BDD&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Casos de negócio&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Ferramentas de BDD&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Relatórios de BDD&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Integração Contínua&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Processo de desenvolvimento com integração contínua&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Repositórios de código fonte&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Integração contínua e os testes&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Servidores de integração contínua&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Principios importantes&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Inspeção&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Pair-Programming&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Inspeção segundo o FDD&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;A Inspeção e a Definição de Pronto&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/b&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; color: #a7bade; font-family: Verdana, Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: black; font-weight: normal;"&gt;&lt;b&gt;AG6 -&amp;nbsp;&lt;/b&gt;&lt;/span&gt;Gestão de projetos com Scrum&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Abordagens Ágeis&lt;/b&gt;&lt;/li&gt;&lt;b&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Imergindo no Scrum&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Conhecendo as fases e ciclo de vida do Scrum&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;A FDD (Feature Driven Development) e como combiná-la com o Scrum&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Entendendo a influência Lean&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Engenharia de Requisitos para compor um bom Product Backlog&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;FBS (Feature Breakdown Structure) da FDD&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Compondo o Product BackLog com funcionalidades&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Planejamento&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Os papeis do Scrum&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;O conceito de Sprint&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Entregas freqüentes de valor para o cliente&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Gerenciando Business Value&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Sprint Planning Meeting&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Desdobramento em tarefas&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Características do Sprint BackLog&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Estimativas&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Apostando no Planning Poker&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Descobrindo a complexidade&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Conhecendo o tamanho das coisas&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Trabalhando com estimativas em horas&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Qual a granularidade necessária para as estimativas&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Desenvolvimento&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Scrum Daily Meeting&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Gestão de Impedimentos&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Métricas e Acompanhamentos&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Foco no Escopo ? Entrega de software funcionado&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;KanBan para facilitar a comunicação durante o processo&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Conhecendo o BurnDown Chart&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Entregas&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Sprint Review&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Testes de Aceitação&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Melhoria contínua&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Sprint Retrospective&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Uma breve introdução em TOC (Theory Of Constraints) para o Processo de Mudança&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Imersão&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Durante todo o workshop será realizado um laboratório prático através da dinâmica de construção.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/b&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; color: #a7bade; font-family: Verdana, Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: black; font-weight: normal;"&gt;&lt;b&gt;AG7 -&amp;nbsp;&lt;/b&gt;&lt;/span&gt;Gestão de processos com Kanban e Lean&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Cultura e Filosofia Lean&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;O que é Lean&lt;/li&gt;&lt;li&gt;Pensamento Enxuto&lt;/li&gt;&lt;li&gt;Impactos econômicos do pensamento enxuto&lt;/li&gt;&lt;li&gt;Tipos de cenários para o pensamento Lean&lt;/li&gt;&lt;li&gt;Perspectiva de Consumo&lt;/li&gt;&lt;li&gt;Geração de Valor&lt;/li&gt;&lt;li&gt;Eliminação das Perdas&lt;/li&gt;&lt;li&gt;Respeito e Desenvolvimento de Pessoas&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Ferramentas Lean&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Hansei e Kaizen para melhoria contínua&lt;/li&gt;&lt;li&gt;Poka-Yoke e Jidoka para ajudar a qualidade&lt;/li&gt;&lt;li&gt;Andon e Kanban como meio de comunicação&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Gestão Lean&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Planejamento e Gestão com pensamento A3&lt;/li&gt;&lt;li&gt;WIP (Work-In-Process)&lt;/li&gt;&lt;li&gt;Pull System&lt;/li&gt;&lt;li&gt;Visualizando o VSM - Value Stream Map&lt;/li&gt;&lt;li&gt;O que é Lead Time?&lt;/li&gt;&lt;li&gt;Identificando Restrições&lt;/li&gt;&lt;li&gt;Resolução de Problemas com The Five Whys&lt;/li&gt;&lt;li&gt;Aplicando o clico PDCA&lt;/li&gt;&lt;li&gt;Definindo demanda&lt;/li&gt;&lt;li&gt;Definindo tamanho&lt;/li&gt;&lt;li&gt;Definindo capacidade&lt;/li&gt;&lt;li&gt;Usando o sistema Kanban&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Adoção&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Aplicação em equipes de projetos&lt;/li&gt;&lt;li&gt;Aplicações de equipes de sustentação&lt;/li&gt;&lt;li&gt;Lean/Kanban com Scrum&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; color: #a7bade; font-family: Verdana, Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: black; font-weight: normal;"&gt;&lt;b&gt;AG8 -&amp;nbsp;&lt;/b&gt;&lt;/span&gt;Estratégia Ágil para Governança em TI&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Visão Geral do Ecossistema&lt;/b&gt;&lt;/li&gt;&lt;b&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Pessoas&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Processos&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Práticas&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Ferramentas&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Parceiros&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Filosofia e Cultura&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Missão, Valores e Propósito&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Introdução ao Enterprise Agile&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Agile Project Management&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Enterprise Scrum&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Engenharia de Software com FDD&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Lean/KanBan para gestão de processos&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Definindo escopo de atuação para Agile&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Planejamento de adoção/implementação de Agile&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Framework de TI&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Gestão de Demandas&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Gestão de Portfólio&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Gestão de Configuração&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Gestão de Mudanças&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Gestão de Serviço de TI&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Planejamento Estratégico&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Gestão Financeira&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Geração de Conhecimento&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Integrações&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Dialogando com ITIL e COBIT&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Gestão Ágil em ambientes PMBoK&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Agile com modelos de certificação&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Convivendo com processos auditáveis por órgãos reguladores&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/b&gt;&lt;/ul&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="display: inline !important;"&gt;&lt;div style="display: inline !important;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Pelo conteúdo apresentado acima, é fácil entender o porque este curso é a formação mais completa que existe sobre agilidade não só no Brasil, mas talvez no mundo, abordando temas como DDD, FDD, BDD, TDD, Lean, Kanban, XP, Scrum, passando por Coaching, e Governança em TI.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="display: inline !important;"&gt;&lt;div style="display: inline !important;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="display: inline !important;"&gt;&lt;div style="display: inline !important;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="display: inline !important;"&gt;&lt;div style="display: inline !important;"&gt;&lt;div style="display: inline !important;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;A primeira turma começa agora dia 26/03, as aulas serão intercaladas de 15 em 15 dias com aulas ás sextas e sábados. Nos vemos por lá!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Diversão Garantida!!!&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-3638284894179945749?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/3638284894179945749/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=3638284894179945749' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/3638284894179945749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/3638284894179945749'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2010/03/academia-agile-do-coaching-kanban.html' title='Academia Agile - Do Coaching ao Kanban'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6CJaDmsVepU/S6FtJMwCeAI/AAAAAAAAAuU/PJGvaHFD8O8/s72-c/academiaagile.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-6935063022547266986</id><published>2009-12-29T13:44:00.011-02:00</published><updated>2010-01-06T11:46:11.165-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JAVA EE 6'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Services'/><category scheme='http://www.blogger.com/atom/ns#' term='Web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Artigos'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Consumindo e Testando Clientes REST</title><content type='html'>&lt;div class="separator" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span id="goog_1262090748801"&gt;&lt;/span&gt;&lt;span id="goog_1262090748802"&gt;&lt;/span&gt;&lt;br /&gt;A especificação &lt;a href="http://jcp.org/en/jsr/detail?id=311" target="_blank"&gt;JAX-RS &lt;/a&gt;é uma ótima opção para criar web services &lt;a href="http://www.ics.uci.edu/%7Efielding/pubs/dissertation/top.htm" target="_blank"&gt;REST&lt;/a&gt; e fornece meios de desenvolver componentes server-side, mas não descreve como os desenvolvedores devem desenvolver seus componentes client-side em Java, e essa já é uma das promessas para a próxima release do JAX-RS.&lt;br /&gt;&lt;br /&gt;Pelo fato de nossos serviços RESTful serem URIs e a forma de acesso a estes serviços serem os próprios métodos HTTP, podemos trabalhar diretamente com requisições HTTP ou utilizar bibliotecas para facilitar este trabalho.  Felizmente é relativamente fácil trabalhar diretamente com requests e responses HTTP, e as linguagens mais populares de programação possuem métodos/bibliotecas HTTP, como por exemplo, urllib2 e httplib em Python, libcurl em PHP, HTTPWebRequest em C#, open-uri em Ruby, e o pacote java.net.* e o projeto HttpClient da Apache para Java, entre outros.  Mas para qualquer linguagem que seja feito a requisição ao serviço RESTful, temos que passar por alguns passos, conforme segue:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Montar os dados que irão trafegar pelo requisição HTTP, como a URI, HTTP header (se houver), e o método HTTP desejado.&lt;/li&gt;&lt;li&gt;Formatar estes dados como uma requisição HTTP, e enviá-lo para um servidor HTTP apropriado.&lt;/li&gt;&lt;li&gt;Efetuar o parsing dos dados retornados (XML, JSON, etc..) para as estruturas de dados que o seu programa precisa.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Para facilitar a pesquisa, montamos um pequeno guia, para os desenvolvedores e estudiosos que querem aprender um pouco mais sobre REST, onde iremos apresentar algumas bibliotecas para teste e consumo de serviços RESTful.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;cURL&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Se o intuito for apenas testar os serviços REST desenvolvidos e validar o retorno, o mais simples é utilizar ferramentas existentes na web como é o caso da biblioteca cURL, que é uma ferramenta de transferência de arquivos entre cliente-servidor desenvolvida em C, e suporta protocolos como HTTP, HTTPS, FTP, FTPS, etc.&lt;br /&gt;&amp;nbsp;A &lt;b&gt;listagem 1&lt;/b&gt; apresenta alguns exemplos de como fazer uma requisição GET e POST com uso da biblioteca cURL, como podemos ver, ela não possui uma interface gráfica, sendo uma ferramenta de linha de comando.&lt;br /&gt;&amp;nbsp;Fazendo uma requisição (GET), passando como parâmetro de headerv tipo de conteúdo &lt;b&gt;json&lt;/b&gt;, (&lt;i&gt;-H "Accept:application/json"&lt;/i&gt;) &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_6CJaDmsVepU/SwIBAFg4uDI/AAAAAAAAApk/Z4RWDxBqc54/s1600/rest01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_6CJaDmsVepU/SwIBAFg4uDI/AAAAAAAAApk/Z4RWDxBqc54/s400/rest01.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;// Fazendo uma requisição POST, passando como&amp;nbsp; query parameter name = JumboComLtda&lt;/span&gt;&lt;br style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;" /&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;$ curl -d name=JumboComLtda http://localhost:8080/Contatos/resources/customers/2/cliente/&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;// Excluindo um registro com DELETE, pelo parâmetro –X&lt;/span&gt;&lt;br style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;" /&gt;&lt;b style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;$ curl -v –X DELETE http://localhost:8080/Contatos/resources/customers/99/&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Registro excluído com sucesso !&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;Listagem 1: Uso da biblioteca cURL.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;&amp;nbsp; &lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;Referências:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;cURL&lt;/b&gt; - Site Oficial &lt;a href="http://curl.haxx.se/" target="_blank"&gt;http://curl.haxx.se/&lt;/a&gt; &lt;/li&gt;&lt;li&gt;Artigo &lt;a href="http://download.indiwiz.com.s3.amazonaws.com/article/RESTClient.pdf" rel="nofollow" target="_blank"&gt;Testing RESTful WebServices Made Easy&lt;/a&gt; (em inglês), publicado na revista Linux 4You em Maio de 2009.&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/rest-client/wiki/Cookbook" target="_blank"&gt;RESTClient Cookbook&lt;/a&gt;, vários receitas e demonstrações de como extender o RESTClient.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;RESTClient&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;a href="http://code.google.com/p/rest-client/" target="_blank"&gt;RESTClient&lt;/a&gt; é uma aplicação Java própria para auxiliar nos testes de serviços RESTful, complementar a isto, ela pode ser utilizada para testar Web Services POX (Plain Old XML) sobre HTTP. Para utilizar, basta efetuar o &lt;a href="http://code.google.com/p/rest-client/downloads/list" target="_blank"&gt;download&lt;/a&gt; do arquivo jar (com dependências) da ultima versão, no momento que escrevo este artigo, a versão mais recente é a versão 2.3, e vem com duas opções.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;RESTClient 2.3 GUI:&lt;/b&gt; &lt;a href="http://rest-client.googlecode.com/files/restclient-ui-2.3-jar-with-dependencies.jar" target="_blank"&gt;restclient-ui-2.3-jar-with-dependencies.jar&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;RESTClient 2.3 Command-line:&lt;/b&gt; &lt;a href="http://rest-client.googlecode.com/files/restclient-cli-2.3-jar-with-dependencies.jar" target="_blank"&gt;restclient-cli-2.3-jar-with-dependencies.jar&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;A versão GUI, é uma aplicação Swing com diversas opções, e bem conhecida de quem trabalha com o RESTClient desde suas primeiras versões, e a outra versão "cli" é para execução batch de arquivos .rcq. Para começar utilizar a versão em Swing, basta digitar o seguinte comando (A aplicação requer Java 6 para rodar):&lt;br /&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;b&gt;$java -jar restclient-ui-2.3-jar-with-dependencies.jar&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&amp;nbsp; &lt;br /&gt;Após executar a aplicação, deverá ser apresentado a tela conforme ilustra a &lt;b&gt;Figura 1&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_6CJaDmsVepU/SzoGEGVXqwI/AAAAAAAAArg/CFNY_xCf6As/s1600-h/Restclientjpg.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_6CJaDmsVepU/SzoGEGVXqwI/AAAAAAAAArg/CFNY_xCf6As/s320/Restclientjpg.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;Figura 01 - Interface Swing do RESTClient.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Pela aparência da interface gráfica, podemos deduzir facilmente o modo de utiliza-lá, basta digitar no campo URL o caminho desejado, selecionar algum método HTTP na aba Method, e executar a consulta clicando no botão [&amp;gt;&amp;gt;]. O resultado será apresentando no bloco HTTP Response.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Funcionalidades &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;Com RESTClient, podemos fazer qualquer tipo de requisição HTTP (GET, PUT, POST, DELETE, HEAD, OPTIONS, TRACE), ainda existe o suporte a SSL e a possibilidade de adicionar parâmetros de Header adicionais.&lt;br /&gt;É possível salvar as requests, responses, e o Response Body (atráves do menu &lt;i&gt;File&lt;/i&gt; &amp;gt; &lt;i&gt;Save Request&lt;/i&gt;, ou &lt;i&gt;Save Response&lt;/i&gt;, &lt;i&gt;Save Response Body&lt;/i&gt;), o que é útil para testes de regressão, que podemos utiliza-los posteriormente na versão de linha de comando.&lt;br /&gt;RESTClient ainda vem com o Conteiner Jetty embutido, que possui um Servlet que imprime os detalhes das requisições submetidas a ele. Para iniciar o servidor basta acessar o menu &lt;i&gt;Tools&lt;/i&gt; &amp;gt; Opção &lt;i&gt;Start Trace Server&lt;/i&gt; (subirá na porta 10101).&lt;br /&gt;&lt;br /&gt;E por fim, uma das funcionalidades mais interessantes é o seu suporte integrado para testes, que podem inclusive ser escritos em Groovy, o suporte a testes é baseado no JUnit 3.x e os tests são atachados a cada requisição. Para iniciar os testes, na aba "&lt;i&gt;Test Script&lt;/i&gt;", clique o no botão &lt;i&gt;Insert Template&lt;/i&gt;, RESTClient irá criar o código para você, conforme mostra a &lt;b&gt;Listagem 02&lt;/b&gt;:&lt;br /&gt;&lt;pre class="java" name="code"&gt;// The test class name should end with `Test'--this is a convention:&lt;br /&gt;public class TemplateClassTest &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; extends org.wiztools.restclient.RESTTestCase{&lt;br /&gt;&lt;br /&gt;&amp;nbsp; // Test method names should start with `test':&lt;br /&gt;&amp;nbsp; public void testStatus(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(response.getStatusCode() != 200){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fail("This will fail the test!");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}&lt;/pre&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;Listagem 2: Template de Test gerado pelo RESTClient.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A partir da versão 2.3, RESTClient possui uma versão em linha de comando, está versão é utilizada para executar requisições de forma batch e armazenar o resultado dos testes.&amp;nbsp; Para executar está versão, basta na linha de comando executar:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;b&gt;$java -jar restclient-cli-2.3-jar-with-dependencies.jar -o /temp/diretorioResponse *.rcq&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Esse comando, irá executar todos as requisições contidas nos arquivos de extensão (.rcq) no diretório de execução atual, e irá salvar as responses (na extensão .rcs) no diretório /temp/diretorioResponse. E por fim, o RESTClient, imprime um resumo da execução dos testes.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Referências:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Artigo RESTFul Web Services e a API JAX-RS na revista Mundo Java edição 35&lt;/li&gt;&lt;li&gt;Artigo &lt;a href="http://download.indiwiz.com.s3.amazonaws.com/article/RESTClient.pdf" rel="nofollow" target="_blank"&gt;Testing RESTful WebServices Made Easy&lt;/a&gt; (em inglês), publicado na revista Linux 4You em Maio de 2009.&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/rest-client/wiki/Cookbook" target="_blank"&gt;RESTClient Cookbook&lt;/a&gt;, vários receitas e demonstrações de como extender o RESTClient.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Testando Web Services RESTful no NetBeans.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;Para quem é usuário do NetBeans, uma outra opção para testar Web Services RESTful é utilizar o suporte do próprio IDE, com um projeto Web criado e os serviços RESTful devidamente configurados, é possível testá-los clicando com o botão direito do mouse em cima do projeto e selecionar a opção “Test RESTful Web Services” (&lt;b&gt;Figura 02&lt;/b&gt;), lembrando que está opção só estará disponível, se o projeto WEB possuir serviços WEB.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_6CJaDmsVepU/SzoXM63X-II/AAAAAAAAAro/xAJem7mAxac/s1600-h/netbeans-rest.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_6CJaDmsVepU/SzoXM63X-II/AAAAAAAAAro/xAJem7mAxac/s320/netbeans-rest.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;Figura 02 -Suporte a REST no NetBeans.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Ao selecionar esta opção, será feito o build e o deploy da aplicação web, e ao final do processo será disponibilizado uma página de testes web, como mostra a &lt;b&gt;Figura 03&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_6CJaDmsVepU/SzoYOknGpkI/AAAAAAAAAr4/7nNLixZJgQM/s1600-h/netbeans-rest2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_6CJaDmsVepU/SzoYOknGpkI/AAAAAAAAAr4/7nNLixZJgQM/s320/netbeans-rest2.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;&lt;span style="font-size: x-small;"&gt;Figura 03 - Tela de testes de Web Services RESTful&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Na página apresentada é possível testar todos os serviços disponíveis, criar novos parâmetros para a requisição (botão “Add Parameter”), e também é possível selecionar o tipo de método HTTP para teste e o tipo MIME de retorno.&lt;br /&gt;&lt;br /&gt;Para iniciar o teste, basta clicar no botão “Test”, após a execução, dentro da seção Response, podemos analisar os dados de retorno, os dados do cabeçalho e o status da chamada.&lt;br /&gt;&lt;br /&gt;Além disso, de acordo com os serviços criados, o NetBeans ainda gera o arquivo WADL, visível no canto superior esquerdo da &lt;b&gt;Figura 03&lt;/b&gt;.&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;b&gt;Referências:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;NetBeans - Site Oficial: &lt;a href="http://netbeans.org/" target="_blank"&gt;http://netbeans.org/&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://docs.sun.com/app/docs/doc/820-7627/giqaa?a=view" target="_blank"&gt;Creating a RESTFul Web Service Using NetBeans&lt;/a&gt; - Tutorial do site da Sun.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;JAXB&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;JAXB (Java Architecture for XML Binding) fornece a API, as ferramentas e um framework que automatiza o mapeamento entre documentos XML e objetos Java. Ou seja, fornece compiladores que compilam Schemas XML para objetos Java. Em tempo de execução podemos deserializar (unmarshal) o conteúdo de um arquivo XML para representações Java. &lt;br /&gt;&lt;br /&gt;Além disso, podemos acessar, alterar e validar a representação Java contra regras de um Schema e por fim, podemos serializar (marshal) o conteúdo de um objeto Java em conteúdo XML. Veja sua arquitetura na &lt;b&gt;Figura 04&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_6CJaDmsVepU/SzoZqBWIB8I/AAAAAAAAAsA/868L9PSdjZI/s1600-h/jaxb-overview.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_6CJaDmsVepU/SzoZqBWIB8I/AAAAAAAAAsA/868L9PSdjZI/s320/jaxb-overview.gif" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;imagem 4=""&gt;&lt;/imagem&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;Figura 04 - Overview do JAXB.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Esta fora deste artigo um estudo mais aprofundado sobre o JAXB, mas apenas para conhecimento, a API JAXB acabou se tornando a forma padrão de mapeamento entre Java e XML, com JAXB temos anotações que nos permitem criar uma representação em Java de um Schema XML, estas anotações estão presentes no pacote javax.xml.bind.annotations, e possuem anotações associadas a pacotes Java (@XmlSchema, @XmlSchemaType, etc..), a classes Java (@XmlType, @XmlRootElement), a propriedades e campos (@XmlElement, @XmlAttribute), entre outras anotaçõe.&lt;br /&gt;&lt;br /&gt;Para exemplificar, considere o exemplo da &lt;b&gt;listagem 3&lt;/b&gt;, esta é uma classe POJO representando uma pessoa, com anotações JAXB.&amp;nbsp; Ao fazer um marshalling de uma instância da classe PessoaBinding para XML, teremos o resultado apresentado na &lt;b&gt;listagem 04&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;@XmlRootElement(name="pessoa")&lt;br /&gt;@XmlType(name="", propOrder={"nome","idade","statusCivil"})&lt;br /&gt;public class PessoaBinding {&lt;br /&gt;/* Construtores e Setters omitidos */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String nome;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int idade;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String statusCivil;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String cpf;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @XmlElement&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getNome() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return nome;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @XmlElement&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int getIdade() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return idade;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @XmlAttribute(name="num_cpf")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getCpf() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return cpf;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @XmlElement&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getStatusCivil() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return statusCivil;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;Listagem 03 - Classe PessoaBinding com anotações JAXB.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="xml" name="code"&gt;&amp;nbsp;&amp;nbsp; &lt;pessoa num_cpf="123456789"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;nome&gt;Wagner&lt;/nome&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;idade&gt;29&lt;/idade&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;statuscivil&gt;Casado&lt;/statuscivil&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;/pessoa&gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;Listagem 04 - XML Gerado após marshalling de classe JAXB PessoaBinding.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A especificação do JAX-RS fornece alguns Entity Providers padrões, entre eles, provedores para JAXB, para quando o tipo de conteúdo trafegado for do tipo xml (application/xml, text/xml e application/*+xml), de modo que o programador não precisa criar código para converter um objeto Java em código XML e vice versa, facilitando muito nossa vida.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ainda na classe PessoaBinding da&amp;nbsp; &lt;b&gt;listagem 03&lt;/b&gt;, poderíamos então, no nosso exemplo, criar um serviço RESTful cujo retorno seja a classe JAXB PessoaBinding , neste caso a declaração do serviço seria similar ao método da &lt;b&gt;listagem 05&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @GET&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Produces("application/xml")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Path("/NetFeijao/autor/{idPessoa}/")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public PessoaBinding getPessoa(@PathParam("idPessoa") Integer id) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return dao.getPessoaAsBinding(id); // Retorna uma entidade Pessoa como PessoaBinding&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&lt;/pre&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;Listagem 05 - Serviço RESTful cujo retorno é uma classe JAXB.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ao fazermos o consumo deste serviço RESTful, vamos perceber que a conversão é feita automaticamente pelo entity provider padrão para XML (veja o teste na &lt;b&gt;Figura 05&lt;/b&gt;, utilizando a ferramenta &lt;i&gt;RESTClient&lt;/i&gt;). De maneira inversa poderíamos criar um serviço RESTful para receber requisições PUT e receber como parâmetro de entrada do método a classe PessoaBinding via HTTP Body.&amp;nbsp; Conforme apresenta a &lt;b&gt;listagem 06&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;imagem 5=""&gt;&lt;/imagem&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_6CJaDmsVepU/Szob9PlrbOI/AAAAAAAAAsI/CW4cAeuEnUs/s1600-h/Restclient1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_6CJaDmsVepU/Szob9PlrbOI/AAAAAAAAAsI/CW4cAeuEnUs/s320/Restclient1.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;imagem 5=""&gt; &lt;span style="font-size: x-small;"&gt;&lt;b&gt;Figura 05 - Retorno do serviço RESTful cujo retorno é uma classe JAXB.&lt;/b&gt;&lt;/span&gt;&lt;/imagem&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @PUT&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Consumes("application/xml")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Path("/NetFeijao/")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void putPessoa(PessoaBinding pessoa) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Operação de update&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&lt;/pre&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;Listagem 06 - Convertendo código XML para objeto JAXB em chamada PUT com REST.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Referências:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://java.sun.com/developer/technicalArticles/WebServices/jaxb/" target="_blank"&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Site Oficial no java.net. - &lt;a href="https://jaxb.dev.java.net/" target="_blank"&gt;https://jaxb.dev.java.net/&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/developer/technicalArticles/WebServices/jaxb/" target="_blank"&gt;Java Architectura for XML Binding&lt;/a&gt; - Tutorial do site da Sun.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;JAKARTA COMMONS - HTTP CLIENT&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;HttpClient é um subprojeto open source da Jakarta Commons que se tornou independente em 2007, e que foi concebido para facilitar o desenvolvimento de aplicações que utilizam o protocolo HTTP. &lt;br /&gt;&amp;nbsp;Ele é um projeto escrito totalmente em Java, e implementa todos os métodos HTTP (GET, POST, PUT, DELETE, HEAD, OPTIONS e TRACE).&lt;br /&gt;&lt;br /&gt;Possui suporte ao protocolo HTTPS, suporte ao gerenciamento de conexões para uso em aplicações multi-thread, suporte a cookie, possui mecanismos de autenticação Basic, Digest e criptografia NTLM.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;Na &lt;b&gt;listagem 07&lt;/b&gt;, demonstramos o uso da biblioteca HttpClient, onde consumimos dois serviços RESTful, um com uma chamada GET e outra com uma chamada PUT.&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void testHTTPClient() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpClient client = new HttpClient(new MultiThreadedHttpConnectionManager());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; client.getHttpConnectionManager().getParams().setConnectionTimeout(30000);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; final String CONTENT_TYPE = "application/xml";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; final String CHARSET = "UTF8";&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Executando chamada com método HTTP GET */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String getURI = "http://localhost:8080/ProjetoREST/NetFeijao/autores/Wagner/?idade=29";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetMethod get = new GetMethod(getURI);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Header meuHeader = new Header("CPF","123456789");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get.setRequestHeader(meuHeader);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int statusCodeGET = client.executeMethod(get);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String responseBody = get.getResponseBodyAsString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println("Chamada GET");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(" Status Code: "+statusCodeGET+" \nResponse Body:\n"+responseBody);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Executando chamada com método HTTP PUT */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String putURI = "http://localhost:8080/ProjetoREST/NetFeijao/autores/update/";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PutMethod put = new PutMethod(putURI);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringRequestEntity requestEntity = new StringRequestEntity(responseBody, CONTENT_TYPE, CHARSET);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; put.setRequestEntity(requestEntity);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int statusCodePUT = client.executeMethod(put);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; responseBody = put.getResponseBodyAsString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println("Chamada PUT");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(" Status Code: "+statusCodePUT+" \nResponse Body:\n"+responseBody);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (Exception ex) {/* OMITIDO */}&lt;br /&gt;}&lt;/pre&gt;Retorno da chamada ao método.&lt;br /&gt;Chamada GET&lt;br /&gt;&amp;nbsp;Status Code: 200 &lt;br /&gt;Response Body:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;pessoa num_cpf="123456789"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;nome&gt;Wagner&lt;/nome&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;idade&gt;29&lt;/idade&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;statuscivil&gt;Casado&lt;/statuscivil&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;/pessoa&gt;&lt;br /&gt;&lt;br /&gt;Chamada PUT&lt;br /&gt;&amp;nbsp;Status Code: 202 &lt;br /&gt;Response Body:&lt;br /&gt;&lt;h1 style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;Bem vindo Wagner&lt;/span&gt;&lt;/h1&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;Listagem 07: Consumindo serviços REST via GET e PUT com HTTPClient.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Primeiro, na linha 3 instanciamos a classe HttpClient que é o nosso agente HTTP que irá conter os atributos de persistência com cookies, e credenciais de autenticação através da classe HttpState. E também onde será armazenado uma ou mais conexões HTTP, cujo qual faremos chamadas aos métodos HTTP.&lt;br /&gt;&lt;br /&gt;Na linha 4 atribuímos um timeout para a conexão de 30 segundos. Depois nas linhas 5, 6 e 9 declaramos as variáveis quer irão determinar o tipo de conteúdo, o character set e a URI de acesso ao serviço REST.&lt;br /&gt;&lt;br /&gt;Na linha 10, instanciamos a classe GetMethod, que como o próprio nome indica representa o método GET, passando como parâmetro a URL do nosso serviço RESTful (getURI). Na linha 11 criamos um objeto Header, passando como parâmetro no construtor a chave e o valor que representam o parâmetro e o valor do cabeçalho, no nosso exemplo, passamos um número fictício de CPF. Na linha 12 atribuímos o objeto header para o objeto GetMethod.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;Na linha 13, fazemos a chamada ao serviço RESTful via HTTP GET, e armazenamos o código de status do retorno na variável statusCodeGET, na linha 14 extraímos os dados da Response como String para a variável responseBody. Pelo fato do retorno ser em XML, poderíamos facilmente utilizar JAXB para trabalhar o retorno como um objeto Java. Finalmente nas linhas 15 e 16 imprimimos no console o retorno da chamada a estes métodos.&lt;br /&gt;&lt;br /&gt;A partir da linha 18, iniciamos o mesmo processo, mas agora para efetuar uma chamada via método PUT, as únicas diferenças, são o uso do método PutMethod, que implementa o método HTTP PUT e o uso da classe StringRequestEntity na linha&amp;nbsp; 21,&amp;nbsp; com esta classe atribuímos uma entidade como String ao método PUT que será enviado junto a requisição.&lt;br /&gt;&lt;br /&gt;Nas linhas 25 e 26 imprimimos o retorno da requisição PUT.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;JavaScript:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size: large;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=544668644670311424&amp;amp;postID=6935063022547266986" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=544668644670311424&amp;amp;postID=6935063022547266986" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://2.bp.blogspot.com/_6CJaDmsVepU/SzoeLAm1ApI/AAAAAAAAAsQ/jw4WdUuSCvo/s1600/ajax.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_6CJaDmsVepU/SzoeLAm1ApI/AAAAAAAAAsQ/jw4WdUuSCvo/s200/ajax.jpg" /&gt;&lt;/a&gt; Graças ao objeto XMLHttpRequest conseguimos nos comunicar com servidores de forma assíncrona,&amp;nbsp;&amp;nbsp; desde então temos todas as vantagens do AJAX ao nosso dispor.&amp;nbsp; Para quem desenvolve interfaces WEB, este recurso resolveu grandes problemas no lado do cliente, mas vale lembrar que JavaScript não é Java, não possui threads, nem tipos, e possui uma grande gama de frameworks Ajax, como por exemplo Prototype, JQuery, Dojo, Script.aculo.us, Ext-JS, entre outros.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;Na &lt;b&gt;listagem 08&lt;/b&gt;, temos um exemplo de uma função em JavaScript&amp;nbsp; que consume um serviço RESTful cujo retorno é um XML.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=544668644670311424&amp;amp;postID=6935063022547266986" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=544668644670311424&amp;amp;postID=6935063022547266986" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=544668644670311424&amp;amp;postID=6935063022547266986" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=544668644670311424&amp;amp;postID=6935063022547266986" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="js" name="code"&gt;var xmlHttp;&lt;br /&gt;function showCustomer(str){ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlHttp=GetXmlHttpObject(); // omitido código do método0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (xmlHttp==null) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert ("Your browser does not support AJAX!");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var url='http://localhost:8080/Contatos/resources/customers/58/';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlHttp.onreadystatechange=stateChanged;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlHttp.open('GET',url,true);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlHttp.send(null);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function stateChanged() { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (xmlHttp.readyState==4){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var xmlDoc=xmlHttp.responseXML.documentElement;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; document.getElementById("nome").innerHTML= &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlDoc.getElementsByTagName("name")[0].childNodes[0].nodeValue;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;Listagem 08 - Consumindo um serviço RESTful (retorno XML) com Ajax.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Na &lt;b&gt;listagem 08&lt;/b&gt;, vimos um exemplo de um serviço que retorna XML, mas uma das grandes vantagens dos serviços REST, é que podemos trabalhar com diversos formatos para troca de informação de um mesmo recurso. Entre eles JSON.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;jQuery&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_6CJaDmsVepU/SzofaGdZdqI/AAAAAAAAAsY/4f025I79JXE/s1600-h/jquery-logo.thumbnail.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_6CJaDmsVepU/SzofaGdZdqI/AAAAAAAAAsY/4f025I79JXE/s320/jquery-logo.thumbnail.gif" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;JQuery é uma biblioteca JavaScript que vem chamando atenção por conta de sua facilidade de desenvolvimento, ela simplifica muito a manipulação dos elementos de um documento HTML, o tratamento de eventos e as interações Ajax para prover um desenvolvimento rápido de aplicações web, livrando o desenvolvedor de preocupações relacionadas a compatibilidade de navegadores e aderência a CSS.&lt;br /&gt;&lt;br /&gt;A biblioteca jQuery fornece algumas funções para tratamento de requisições Ajax, ideais para o consumo de serviços REST, que reduzem muito a complexidade e a quantidade de linhas necessárias para consumir um serviço REST.&amp;nbsp; Com a função $.ajax() do jQuery, conseguimos um alto nível de controle nas requisições ajax. &lt;br /&gt;&lt;br /&gt;A sintaxe do comando é $.ajax(options), onde o parâmetro options são as propriedades que passamos para controlar como a requisição é feita e retorno da chamada.&lt;br /&gt;Na &lt;b&gt;listagem 09&lt;/b&gt;, demonstramos o uso das funções $.ajax().&lt;br /&gt;&lt;pre class="js" name="code"&gt;$.ajax({&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; type: ‘DELETE’,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; url: "http://localhost:8080/ProjetREST/NetFeijao/autores/"+idAutor+"/",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; success: function(msg){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#alert").html(msg);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;&lt;span style="font-size: x-small;"&gt;Listagem 09 - Consumindo um serviço REST com a função $.ajax(). &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Na &lt;b&gt;listagem 09&lt;/b&gt;, usamos dois parâmetros na função $.ajax(), o parâmetro type para indicar o método HTTP que queremos executar e a url de chamada. &lt;br /&gt;&lt;br /&gt;Para tratar tipos de retorno JSON, o jQuery oferece a função $.getJSON(), utilizada para carregar dados JSON mediante uma requisição HTTP GET.&lt;br /&gt;&lt;br /&gt;Na &lt;b&gt;listagem 10&lt;/b&gt; mostramos um exemplo de uso da função $.getJSON() em um serviço REST do Flickr, nós fazemos uma chamada ao serviço REST e passamos o retorno da chamada ao método de callback. Dentro da função de callback criamos a tag  passando como valor o endereço da foto retornada pelo serviço REST e a incluímos na div #foto. Note que a variável data, é um map chave-valor dos dados retornados pela função REST.&lt;br /&gt;&lt;pre class="js" name="code"&gt;$.getJSON("http://api.flickr.com/services/rest/?method=flickr.photosets.getPhotos&amp;amp; photoset_id=72157614488723406&amp;amp;format=json&amp;amp;jsoncallback=?",&lt;br /&gt;function(data){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $.each(data.photoset.photo, function(i,item){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (item.title == foto){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $("").attr("src", "http://farm"+item.farm+".static.flickr.com/"+item.server+"/"+item.id+"_"+item.secret+"_m.jpg").appendTo("#foto");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;Listagem 10 - Uso da função $.getJSON para consumo de dados no formato JSON.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;É isso aí, consumir serviços REST é diversão garantida !!! E a todos um Feliz Ano Novo repleto de código \o/ !!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-6935063022547266986?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/6935063022547266986/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=6935063022547266986' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/6935063022547266986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/6935063022547266986'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2009/12/consumindo-e-testando-clientes-rest.html' title='Consumindo e Testando Clientes REST'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_6CJaDmsVepU/SwIBAFg4uDI/AAAAAAAAApk/Z4RWDxBqc54/s72-c/rest01.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-4488335978697870386</id><published>2009-12-21T13:10:00.004-02:00</published><updated>2009-12-21T13:14:44.064-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='Portal'/><category scheme='http://www.blogger.com/atom/ns#' term='Publicações'/><category scheme='http://www.blogger.com/atom/ns#' term='Web 2.0'/><title type='text'>Java Magazine 73 - Portais Corporativos</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="#" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_6CJaDmsVepU/Sy-M8rPwt8I/AAAAAAAAArY/0O_cdcdfpkE/s320/capaOnline_73.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;No mês de Novembro, publiquei um artigo na revista &lt;a href="http://www.devmedia.com.br/assgold/listmag.asp?site=6"&gt;Java Magazine&lt;/a&gt;, fazia um tempo que não escrevia por conta de um projeto que estou tocando.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;O tema do artigo é "&lt;b&gt;Portais Corporativos&lt;/b&gt;", Neste artigo é apresentado na teoria e na prática os fundamentos do desenvolvimento de portlets em portais corporativos e a importância de Portais no contexto de SOA (com a colaboração de meu amigo Marcelo Zanatto, que falou sobre SOA e Integração com Portais). Como é de costume, o artigo é bem longo e entra a fundo nas tecnologias envolvidas na construção de um grande portal, como as JSRs 168/286, que contemplam a criação e o ciclo de vida de um portlet. É explicado também como definir WSRPs, que são os web services para portlets remotos, e como converter uma aplicação JSF para um portlet com o uso do Portlet Bridge.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Como demo, utilizei o NetBeans para montar e configurar um ambiente para o desenvolvimento de portlets utilizando o Contêiner de Portlets, o pacote WSRP, e a biblioteca JSF/Portlet Bridge do projeto livre OpenPortal junto ao servidor de aplicações Glassfish V2.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Nesta edição, ainda são apresentados os seguintes artigos.&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;JavaOne 2009: Java + Community = Powerful&lt;/li&gt;&lt;li&gt;Desenvolvendo com JavaServer Faces&lt;/li&gt;&lt;li&gt;&lt;b&gt;Portais Corporativos&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Desenvolvendo com Hibernate&lt;/li&gt;&lt;li&gt;Spring-WS de ponta a ponta&lt;/li&gt;&lt;li&gt;O diferencial Scrum&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Diversão Garantida!!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-4488335978697870386?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/4488335978697870386/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=4488335978697870386' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/4488335978697870386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/4488335978697870386'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2009/12/java-magazine-73-portais-corporativos.html' title='Java Magazine 73 - Portais Corporativos'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6CJaDmsVepU/Sy-M8rPwt8I/AAAAAAAAArY/0O_cdcdfpkE/s72-c/capaOnline_73.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-4627984111523589202</id><published>2009-10-14T17:53:00.002-03:00</published><updated>2012-01-13T18:31:24.742-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lean'/><category scheme='http://www.blogger.com/atom/ns#' term='XP'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Entrevista'/><title type='text'>Perguntas Frequentes sobre Agilidade</title><content type='html'>Em Julho deste ano, &lt;a href="http://www.globalcode.com.br/site/noticias/painel.seam?chave=MinicursoScrum" target="_blank"&gt;após o mini-curso que dei&lt;/a&gt; na &lt;a href="http://www.globalcode.com.br/" target="_blank"&gt;Globalcode &lt;/a&gt;sobre Scrum + XP, uma das pessoas presentes, meu amigo &lt;a href="http://orlandojunior.com.br/" target="_blank"&gt;Orlando&lt;/a&gt;, anotou diversas perguntas sobre Agilidade no formato de entrevista e pediu que eu respondesse por email. &lt;br /&gt;Segue abaixo algumas perguntas que achei interessante, e resolvi publicá-las aqui no blog.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;O que é ser ágil nos dias de hoje?&lt;br /&gt;&lt;/h3&gt;Acho que ser ágil nos dias de hoje é saber aproveitar as oportunidades de inovação no seu ambiente de trabalho, percebo que a maioria das pessoas acabam ficando acostumadas com a rotina de seus afazeres e perdem chances de inovar.&lt;br /&gt;Quando digo inovar, digo que existem várias maneiras de você introduzir no seu dia a dia práticas ágeis. Outro ponto importante em ambiente ágeis é a comunicação, para ser ágil a pessoa saber lidar com pessoas, com o cliente, e ter um relacionamento de parceria, não pode ter medo de se expor e ser comprometido.&lt;br /&gt;Comprometido não é trabalhar 250 horas por mês no projeto, é saber assumir responsabilidades e saber responder por elas, não ter vergonha de pedir ajuda na hora de uma dificuldade. É velha a história do porco e da galinha =).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Quais os pontos fracos das metodologias ágeis?&lt;br /&gt;&lt;/h3&gt;O que vejo como um ponto fraco em metodologias ágeis, pela sua própria natureza lean, ou seja, enxuta. É que fica um pouco difícil a sua adoção em ambientes que haja modelos de governança de TI como o Cobit, por exemplo. É difícil em um ambiente de Governança "certificado", você justificar para o gerenciamento de projeto o uso apenas de quadros e post-its, entende? Isso eu digo principalmente com Scrum e XP.&lt;br /&gt;Neste tipo de cenário, a empresa tende a escolher modelos híbridos baseados no PMBook e RUP. O que no final acabam se tornando processos altamente burocráticos em cascata.&lt;br /&gt;Por isso, que acho que esse é um campo que tem muito a ser explorado, trabalhei cerca de 2 a 3 com RUP, e uma escolha mal feita nos artefatos de projeto acaba comprometendo e muito o rendimento da equipe&lt;br /&gt;Outro ponto fraco é o próprio agilista, que tende a pensar que é o dono da razão, pois a verdade é que &lt;a href="http://en.wikipedia.org/wiki/Barry_Boehm"&gt;Barry Boehm&lt;/a&gt; já falava da importância dos &lt;a href="http://en.wikipedia.org/wiki/Iterative_development"&gt;métodos iterativos&lt;/a&gt; (&amp;nbsp; &lt;a href="http://en.wikipedia.org/wiki/Spiral_model"&gt;que vieram bem antes do movimento ágil&lt;/a&gt; ).&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Quando não usar?&lt;/h3&gt;Bem, independente do lugar que você esteja é muito importante praticar, aplicar os valores do Manifesto Ágil.&lt;br /&gt;Eu não consigo enxergar o uso de métodos ágeis em projetos de implantação de ERP (pacote comprado), principalmente quando a implantação é feita em grandes empresas com diversas filiais. Geralmente, as empresas fornecedoras deste tipo de software já possuem métodos próprios.&lt;br /&gt;Outra ponto, é se a sua empresa desenvolve software e seu cliente esta feliz, o desenvolvedor esta feliz, os projetos estão sendo entregues no prazo, o ROI esta dentro das expectativas, o Time-to-market do seu produto é baixo e a equipe é produtiva, se neste cenário você já não estiver usando ágil, fique onde está.&lt;br /&gt;Se o seu processo de desenvolvimento esta atendendo plenamente você e seus clientes, então não mude. Você já esta no caminho certo.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;O que mais dificulta a implantação de uma metodologia ágil numa empresa atualmente?&lt;/h3&gt;Com certeza o que dificulta a implantação de métodos ágeis nas empresas é a própria filosofia de desenvolvimento da empresa. Por requerer uma mudança radical na forma de lidar com o desenvolvimento de software, é difícil alcançar uma plenitude na implementação de métodos ágeis e isto pode afetar sua adoção, é difícil as pessoas envolvidas na definição de processos da empresa admitirem que estavam fazendo algo que é não muito produtivo, e que a maneira que elas desenvolvendo software não é a melhor.&lt;br /&gt;Outros pontos que dificultam a implantação de métodos ágeis, ainda alinhado ao primeiro item é a falta de um sponsor, como um diretor, ou outro cargo executivo, se agile não está "vendido" para a alta cúpula da empresa, então pode haver muita resistência por conta da própria TI.&lt;br /&gt;E por fim, a falta de comprometimento da equipe e a falta de conhecimento em métodos ágeis podem dificultar também a implantação.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Só serve para projetos? E a manutenção do sistema?&lt;/h3&gt;Agile proporciona um leque bem variado de métodos, entre eles FDD, Scrum, XP, Lean, Crystal, entre outros. Eu diria que os dois caminham juntos, a questão gira em torno de como você irá administrar e classificar os itens em seu backlog.&lt;br /&gt;A partir do momento que um release do seu produto entra em produção, é natural que novas demandas e até bugs apareçam. Tem empresas que separam equipes para atuar somente em projetos de manutenção e outras equipes para trabalhar somente em projetos de evolução, depende tudo de como o trabalho é priorizado.&lt;br /&gt;Para áreas de serviço, como Infraestrutura, onde a atuação das equipes geralmente é feita sob demanda, é recomendado o uso de quadros Kanban, inclusive atualmente estou fazendo um trabalho neste sentido (Quadros Kanban para áreas de Infraestrutura).&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;E a arquitetura do sistema, como fica?&lt;/h3&gt;Essa é uma questão polêmica e que gera muitas dúvidas para quem está iniciando no mundo ágil, principalmente para as pessoas que estão em transição de um método como o Waterfall para o Ágil.&lt;br /&gt;Quando o time de desenvolvimento vem do Waterfall ou até mesmo do RUP, que é um método que descreve os artefatos necessários para se documentar a arquitetura do projeto e propõe um modelo "big design up front", ou seja, força o time tentar imaginar e fechar todos os modelos no inicio da execução do projeto.&lt;br /&gt;Em processos ágeis isso acontece de forma natural e evolutiva, uma das práticas do XP, o "Simple Design" ou "Design Simples" nos diz para mantermos o nosso design o mais limpo e simples possível, e não tentar imaginar funcionalidades que o sistema possa vir a ter, e preparar o sistema para estes prováveis cenários. Isso foge completamente do modelo ágil de gerir projetos.&lt;br /&gt;Independente do modelo que você segue, o seu sistema obviamente será construída baseada em uma arquitetura, e em toda metodologia é muito importante você fazer o planejamento da sua arquitetura, a diferença é que em métodos ágeis devemos sempre respeitar a maturidade atual do projeto de modo que quando houver mudanças ou adição de novos requisitos do negócio, fique fácil refatorar o sistema, levando sempre em consideração os requisitos de qualidade de serviço (QoS) conhecidos por todo arquiteto,&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Como fica o contrato? Não há prejuízos para a produtora, uma vez que o cliente altere constantemente o que foi inicialmente solicitado?&lt;/h3&gt;Acredito que não, um dos valores do manifesto ágil diz que a colaboração com o cliente é mais importante do que a negociação de contratos, por que isso? Se olharmos para a maneira como as empresas negociam os contratos de software com as consultorias, veremos que esta é uma eterna luta. Porque as empresas adotam o modelo de "Preço Fixo" e para uma consultoria entrar em uma empresa, ao formular uma RFP ela acaba colocando valores que muitas vezes ela mesma sabe que pode tomar um prejuízo, mas o faz para ganhar o cliente.&lt;br /&gt;Este tipo de contrato é ruim, pois passa a maior parte do risco para o desenvolvedor, se o projeto atrasa, o consultor arca com os custos, o que dificulta (e muito) mudanças de escopo.&lt;br /&gt;Um modelo de contrato que achei muito interessante é o modelo "Money for Nothing, Changes for free" proposto por Peter Stevens em &lt;a href="http://agilesoftwaredevelopment.com/blog/peterstev/10-agile-contracts#MFN-cff"&gt;http://agilesoftwaredevelopment.com/blog/peterstev/10-agile-contracts#MFN-cff&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Qual o maior benefício (a longo ou curto prazo) que um funcionário (desenvolvedor, tester, analista, etc.) obtém quando se compromete a seguir uma proposta ágil?&lt;/h3&gt;Desenvolvedores geralmente gostam de agile, porque os métodos são voltados para times auto-gerenciáveis. Modelos ágeis dão uma liberdade maior aos membros do time, então acho que o maior benefício é o próprio bem-estar do time. Sem falar dos ganhos da empresa como a melhoria contínua da qualidade, redução do risco de entrega e do time to market, aumento da visibilidade do projeto, entre outros.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Como ser um Scrum Master?&lt;/h3&gt;Na minha visão, para ser um Scrum Master é preciso antes de tudo saber lidar com pessoas, isso é fundamental, além disso, precisa ser uma pessoa comprometida e responsável, que entenda os requisitos do negócio e as necessidades do time.&lt;br /&gt;Tem que ser uma pessoa humilde, e que saiba influenciar a equipe de maneira positiva, com uma cultura de colaboração.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Como as empresas do Brasil estão aceitando a XP?&lt;/h3&gt;Hoje em dia é moda falar de Agilidade no Brasil, principalmente no meio dos desenvolvedores. O que vejo é que é um assunto muito falado, mas pouco aplicado.&lt;br /&gt;XP tem sido assunto em roda de conversa de desenvolvedores durante muitos anos, e o que acaba sendo feito neste sentido são movimentos individuais de desenvolvedores que aplicam algumas práticas do XP de maneira isolada, principalmente TDD.&lt;br /&gt;Com o advento e a popularidade do SCRUM, pessoas de outras esferas nas empresas estão começando a olhar agile de maneira diferente, e tem havido uma grande aceitação neste sentido, então acho que isso tem sido bom para XP também.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Dê algumas dicas de boas práticas àqueles que estão iniciando (estagiários e estudantes).&lt;/h3&gt;A melhor dica que posso dar é a mesma que dou em minhas apresentações quando sou indagado. Que é estudar, e tentar se manter bem informado sobre o que está acontecendo no mercado. É impressionante o que você consegue fazer com os feeds dos websites, busque os melhores sites e agregue-os em ferramentas como o Google Reader ou outro leitor de feed qualquer, isso potencializa muito o conhecimento.&lt;br /&gt;Participe de lista de discussões, veja cases de implantação tanto de sucesso quando de insucesso e buscar ler o máximo que puder sobre o assunto.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Finalize com uma mensagem para aqueles que estão interessados, mas ainda são céticos.&lt;/h3&gt;Faça uma prova de conceito, e se possível procure implementar ao menos uma prática ágil. Uma dica que dou é sempre que possível, traga o cliente para o lado do desenvolvimento, se você puder fazer com que seu cliente avalie o produto que você está desenvolvendo semanalmente ou até de 15 em 15 dias, você irá começar a ver os ganhos do desenvolvimento ágil.&lt;br /&gt;Ou ainda, vou ir totalmente contra o que acabei de falar, sempre que olhar para o seu processo atual de desenvolvimento, antes de tentar adicionar qualquer prática ou passo novo (menos a que citei sobre o cliente), exclua uma etapa do seu processo. Monte um gráfico de cadeia de valor dos seus processos, e analise o que você pode excluir de passos do seu processo. Se você fizer isso, você já está no caminho de se tornar um grande agilista!&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-4627984111523589202?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/4627984111523589202/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=4627984111523589202' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/4627984111523589202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/4627984111523589202'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2009/10/perguntas-frequentes-sobre-agilidade.html' title='Perguntas Frequentes sobre Agilidade'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-9070255830331505186</id><published>2009-10-13T14:14:00.005-03:00</published><updated>2009-10-14T10:23:19.489-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Globalcode'/><category scheme='http://www.blogger.com/atom/ns#' term='Eventos'/><title type='text'>The Developers Conference 2009 - Here we Go !!!</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.thedevelopersconference.com.br/tdc/2009/index.seam" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_6CJaDmsVepU/StSzt1lZ2HI/AAAAAAAAApM/hUDit9HOU-o/s400/tdc2009-01.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Está chegando mais uma edição do &lt;a href="http://www.thedevelopersconference.com.br/tdc/2009/index.seam"&gt;The Developers Conference 2009&lt;/a&gt;, que promete ser um dos eventos mais importantes de Java do Brasil. O evento é organizado pela &lt;a href="http://www.globalcode.com.br/"&gt;Globalcode&lt;/a&gt;.&lt;br /&gt;Afinal, não é todo os dias que temos a oportunidade de conhecer caras importantes como Rod Johnson, certo !!&lt;br /&gt;&lt;br /&gt;A programação do evento já foi liberada, com uma novidade bem agradável, que são as &lt;a href="http://en.wikipedia.org/wiki/Lightning_Talk"&gt;Lightning Talks&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Nos encontramos lá !!!&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.thedevelopersconference.com.br/tdc/2009/sp/palestrantes.seam" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_6CJaDmsVepU/StS1vfrwJBI/AAAAAAAAApc/rUn_60xKC44/s400/tdc2009-02.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;A 3ª edição do The Developer’s Conference 2009, maior evento Java do país, contará com a participação de  Chris Schalk, Developer Advocate do Google, trabalha atualmente no time de Google App Engine, plataforma de Computação em Nuvem do Google, além dos principais nomes da comunidade Java mundial:  Ed Burns,  Rod Johnson e  Mike Keith. O evento acontecerá nas cidades de  São Paulo (SP), nos dias 6 e 7 de novembro, em  Florianópolis (SC) no dia 09 de novembro e no  Rio de Janeiro (RJ) em 11 de novembro.&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;Haverá tradução simultânea em todas as etapas do evento;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;Serão emitidos certificados de participação;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;Inscrições antecipadas com desconto especial;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;Inscrições corporativas e caravanas.&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Diversão Garantida!!!&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-9070255830331505186?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/9070255830331505186/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=9070255830331505186' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/9070255830331505186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/9070255830331505186'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2009/10/developers-conference-2009-here-we-go.html' title='The Developers Conference 2009 - Here we Go !!!'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6CJaDmsVepU/StSzt1lZ2HI/AAAAAAAAApM/hUDit9HOU-o/s72-c/tdc2009-01.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-8516215882775406380</id><published>2009-10-05T18:41:00.003-03:00</published><updated>2009-10-05T18:44:22.418-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Just Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Eventos'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Services'/><category scheme='http://www.blogger.com/atom/ns#' term='Web 2.0'/><title type='text'>[Just Java 2009] De Web Services RESTful a aplicações Mashup</title><content type='html'>Nos dias 15 a 17 de Outubro, aconteceu no Centro de Convenções do Senac de Santo Amaro, mais uma edição do &lt;a href="http://www.sucesusp.org.br/eventos2009/justjava/"&gt;Just Java&lt;/a&gt;. E como sempre, esta foi uma ótima oportunidade para aprender novas tecnologias e fazer aquele Network.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_6CJaDmsVepU/SspjqfY6lvI/AAAAAAAAAok/RLG3bDoJwks/s1600-h/palestra.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_6CJaDmsVepU/SspjqfY6lvI/AAAAAAAAAok/RLG3bDoJwks/s320/palestra.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Apresentei no auditório principal, a palestra &lt;i&gt;"&lt;b&gt;De Web Services RESTFul a aplicações Mashups&lt;/b&gt;"&lt;/i&gt;, onde pude abordar os conceitos de REST proposto pelo Dr. Roy Fielding, passando pela especificação JAX-RS, que define API para criação de Web Services, demonstrando várias maneiras de consumir e testar serviços REST, até chegar ao mundo dos Mashups, apresentando várias ferramentas com exemplos de uso .&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Por fim foi apresentado uma demo, que infelizmente por falta de acesso a internet, não pude apresentar em sua plenitude =(.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Para ver o restante da programação e baixar as apresentações que rolaram no evento, acesse este link.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://www.sucesusp.org.br/mailing2009/congresso/justjava/apresentacoes/apresentacoes_justjava2009.html"&gt;Congresso JustJava 2009 - 15 a 17 de Setembro - Apresentações&lt;/a&gt; &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_6CJaDmsVepU/SspjwI4MrLI/AAAAAAAAAos/BnL2JZz02hY/s1600-h/palestra2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_6CJaDmsVepU/SspjwI4MrLI/AAAAAAAAAos/BnL2JZz02hY/s320/palestra2.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fotos:&lt;/b&gt; Crédito de Eduardo Quagliato -&lt;b&gt;Link:&lt;/b&gt; &lt;a href="http://www.flickr.com/photos/duhhquagliato/3934446367/in/set-72157622411956582/"&gt;JustJava 2009 no Flickr – Compartilhamento de fotos!&lt;/a&gt; &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Segue abaixo a apresentação. &lt;br /&gt;&lt;/div&gt;&lt;div style="width:425px;text-align:left" id="__ss_2099807"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/wrsantos/de-web-services-restful-a-aplicaes-mashup" title="De Web Services RESTful a Aplicações Mashup"&gt;De Web Services RESTful a Aplicações Mashup&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=dewebservicesrestful-090930165447-phpapp01&amp;stripped_title=de-web-services-restful-a-aplicaes-mashup" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=dewebservicesrestful-090930165447-phpapp01&amp;stripped_title=de-web-services-restful-a-aplicaes-mashup" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;documents&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/wrsantos"&gt;wrsantos&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;nbsp;Diversão Garantida !!!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-8516215882775406380?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/8516215882775406380/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=8516215882775406380' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/8516215882775406380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/8516215882775406380'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2009/10/just-java-2009-de-web-services-restful.html' title='[Just Java 2009] De Web Services RESTful a aplicações Mashup'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6CJaDmsVepU/SspjqfY6lvI/AAAAAAAAAok/RLG3bDoJwks/s72-c/palestra.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-4450944538419983842</id><published>2009-09-10T11:38:00.004-03:00</published><updated>2009-09-10T11:40:50.096-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zembly'/><category scheme='http://www.blogger.com/atom/ns#' term='SouJava'/><category scheme='http://www.blogger.com/atom/ns#' term='Widget'/><category scheme='http://www.blogger.com/atom/ns#' term='Web 2.0'/><title type='text'>Widget SOUJava</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.soujava.org.br/display/v/Widget+SOUJava" target="_blank"&gt;&lt;br /&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_6CJaDmsVepU/SqgjPUHP6-I/AAAAAAAAAms/P6R3rkV2zHQ/s320/SOUJava-NeedsYou.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Já faz um tempo, que venho colaborando com o SOUJava, um dos maiores grupos de usuários Java no mundo, sem fins lucrativos. Após pequenas contribuições apresentando algumas palestras (localização, NetBeans Platform), nos últimos tempos tenho tido o privilégio de participar mais efetivamente com o grupo, que conta com a presença de pessoas como Bruno Souza, Mauricio Leal, Yara Senger, Mr. M, Fabio Velloso entre outros.&lt;br /&gt;&lt;br /&gt;E uma das contribuições, junto com o grupo foi justamente na criação de um widget web para divulgação de eventos, notícias, reuniões para o SOUJava.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://zembly.com/" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" height="73" src="http://upload.wikimedia.org/wikipedia/commons/c/c6/Zembly-small.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Esse widget foi desenvolvido utilizando o &lt;a href="https://zembly.com/"&gt;Zembly&lt;/a&gt;,&amp;nbsp; para quem não conhece, o Zembly é um ambiente de desenvolvimento no Browser criado pela &lt;a href="http://en.wikipedia.org/wiki/Sun_Microsystems"&gt;Sun Microsystems&lt;/a&gt;, que permite um conceito novo chamado de programação social, muito similar a um Wiki. Com Zembly podemos criar aplicações para redes sociais como &lt;a href="http://en.wikipedia.org/wiki/Facebook" title="Facebook"&gt;Facebook&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Meebo" title="Meebo"&gt;Meebo&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/OpenSocial" title="OpenSocial"&gt;OpenSocial&lt;/a&gt;, aplicações web para o iPhone e outras plataformas sociais. E claro, permite criar &lt;a class="mw-redirect" href="http://en.wikipedia.org/wiki/Web_widgets" title="Web widgets"&gt;web widgets&lt;/a&gt;.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;O widget que criamos (vide abaixo) é separado em cinco tabs, onde dispomos informações referentes aos eventos, reuniões, uma das abas (Notícias) é uma integração com o nosso feed. Periodicamente vamos atualizar o conteúdo do widget, sempre que surgir novidades.&lt;br /&gt;&lt;br /&gt;O melhor disso tudo, é que VOCÊ desenvolvedor brasileiro, que possui algum site ou blog de tecnologia agora pode nos ajudar a divulgar os eventos promovidos pelo SOUJava e notícias do mundo Java, embutindo o widget em seu site, blog ou fórum. &lt;br /&gt;&lt;br /&gt;Para divulgar nossos eventos é muito fácil, apenas copie o código javascript abaixo e inclua em seu blog ou site.&lt;br /&gt;&lt;script type="text/javascript"&gt;function SelectAll(id){    document.getElementById(id).focus();    document.getElementById(id).select();}&lt;/script&gt;&lt;br /&gt;&lt;textarea cols="80" id="txtfld" onclick="SelectAll('txtfld');" rows="2" type="text"&gt; &amp;lt;!-- Inicio Widget --&amp;gt;&amp;lt;br /&amp;gt; &amp;lt;script type="text/javascript" src="http://widgets.clearspring.com/o/4a9c57d510343a2e/4a9c57dbabfa3bd9/4a9c57d510343a2e/dee11f21/widget.js" &amp;gt;&amp;lt;/script&amp;gt;&amp;lt;br /&amp;gt; &amp;lt;!-- Fim Widget --&amp;gt;&amp;lt;br /&amp;gt; &lt;/textarea&gt;&lt;br /&gt;Segue abaixo, o widget em ação.&lt;br /&gt;&lt;center&gt;&lt;script src="http://widgets.clearspring.com/o/4a9c57d510343a2e/4a9c57dbabfa3bd9/4a9c57d510343a2e/dee11f21/widget.js" type="text/javascript"&gt;&lt;/script&gt;&lt;/center&gt;&lt;br /&gt;Diversão Garantida!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-4450944538419983842?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/4450944538419983842/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=4450944538419983842' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/4450944538419983842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/4450944538419983842'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2009/09/widget-soujava_10.html' title='Widget SOUJava'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6CJaDmsVepU/SqgjPUHP6-I/AAAAAAAAAms/P6R3rkV2zHQ/s72-c/SOUJava-NeedsYou.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-5857712476832528616</id><published>2009-09-10T11:38:00.003-03:00</published><updated>2009-09-10T11:40:38.537-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Globalcode'/><category scheme='http://www.blogger.com/atom/ns#' term='Zembly'/><category scheme='http://www.blogger.com/atom/ns#' term='Plugins'/><category scheme='http://www.blogger.com/atom/ns#' term='Diamond Powder'/><category scheme='http://www.blogger.com/atom/ns#' term='Entrevista'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Entrevista para a Globalcode</title><content type='html'>No mês de Junho, foi publicado uma entrevista minha para meus caros amigos da &lt;a href="http://www.globalcode.com.br/"&gt;Globalcode&lt;/a&gt;, sobre carreira e oportunidades, para quem não viu vale a pena conferir. Segue abaixo as perguntas que estão disponíveis no próprio site da Globalcode. Para quiser ver o link da entrevista, &lt;a href="http://www.globalcode.com.br/site/noticias/painel.seam?chave=EntrevistaWagner"&gt;clique aqui&lt;/a&gt;.&lt;br /&gt;&lt;h3&gt;1. Poderia nos contar como começou a desenvolver plugins para o Netbeans ?&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;Comecei a desenvolver plugins através do "Desafio NetBeans", um campeonato de desenvolvimento de plugins para o NetBeans patrocinado pela Globalcode, Sun e o SOUJava, me lembro que antes de iniciar o campeonato participei de alguns minicursos gratuitos promovido pela Globalcode, contando inclusive com a participação de dois desenvolvedores do NetBeans (Tim Boudreau e Charlie Hunt).&lt;br /&gt;Neste campeonato desenvolvi meu primeiro plugin para o Netbeans, mais especificamente um plugin para o Hibernate, onde a partir de tabelas selecionadas de um Banco de Dados, o plugin gera as entidades de persistência, o arquivo de configuração, com suporte a xDoclet (na época não havia annotations). Neste primeiro contato com a plataforma NetBeans tive a oportunidade de aprender várias coisas legais que me motivaram a continuar o aprendizado.&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;2. Desde então, quais plugins você já desenvolveu?&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;O segundo plugin que desenvolvi foi o módulo CodeGen, um plugin para sobrescrever os métodos equals() e hashcode() que na época (NetBeans 5.0) não existia no NetBeans, e existia no Eclipse. Existe até uma história engraçada por trás disso, me lembro de estar em um minicurso em que o Vinicius comentou que abria o Eclipse apenas para utilizar a função do equals e hashcode, o que me motivou a criar este projeto =D.&lt;br /&gt;Depois desenvolvi alguns plugins corporativos, e depois de um tempo, a pedido do meu amigo Renato Bellia, criei o plugin Diamond Powder for NetBeans. No evento Yahoo Open Hack Day desenvolvi junto com o time Globalcode o plugin Blueprints Yahoo!, e mais recentemente estou colaborando na criação de um plugin para o framework SuperCRUD para o meu amigo Vinicius Senger.&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;3.Poderia comentar um pouco sobre o plugin que você desenvolveu no Yahoo Open Hack Day onde participou da equipe que ganhou o prêmio Bridging the Gap ?&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;Para mim foi uma grande alegria e honra participar do time Globalcode, onde ao todo foram desenvolvidos 4 hacks. Sobre o plugin desenvolvido para o Yahoo Open Hack Day, é um módulo que permite a criação de projetos (através de templates) com suporte ao Yahoo! Blueprint, uma tecnologia desenvolvida pela Yahoo que permite a criação de web sites para celulares com uso apenas de XML. O plugin oferece a criação de um esqueleto para um projeto Yahoo, criando os arquivos necessários para seu funcionamento (gallery.xml e config.xml). Além disso, o plugin vem com alguns samples (desenvolvidos pela Globalcode) dentro do NetBeans para os desenvolvedores que querem entender como funciona um projeto Blueprint. E possui suporte a Update Center, Help, e a inclusão do guia do Desenvolvedor em pdf no NetBeans.&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;4. Quais os conhecimentos necessários para um programador começar a criar módulos para o NetBeans ?&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;Além de ter conhecimentos sólidos de Java Standard Edition, para o programador iniciar a criação de módulos para o NetBeans, é importante entender como funciona o NetBeans e a sua arquitetura. Procurar enxergar além do IDE, rs.. o IDE NetBeans é construído sobre a Plataforma NetBeans, assim como vários outros produtos, como por exemplo a ferramenta VisualVM, quem utiliza nota a grande semelhança com o NetBeans.&lt;br /&gt;Ao iniciar o desenvolvimento na plataforma NetBeans, já temos disponíveis várias funcionalidades / componentes prontos para o uso e toda esta infraestrutura pode ser manipulada via código através das APIs da Plataforma NetBeans. A plataforma dispõe de APIs para trabalhar com diversos tipos de categorias entre os quais podemos destacar como as Ações do Sistema (Actions), Ant, Paleta de objetos, Debug, Dialogs (para notificação), Sistema de Janelas, Sistema de Arquivos, Editores, Navegação, Loaders, entre outros.&lt;br /&gt;O programador precisa somente entender como manipular estas APIs que ele pode praticamente fazer o que quiser com o NetBeans.&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;5. Sabemos que você andou fazendo testes com Zembly, poderia comentar um pouco sobre o que é Zembly e para que serve ?&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;A ideia do Zembly, é criar uma espécie de Wiki para aplicações sociais como o Facebook, ele fornece o ambiente no próprio site do Zembly para criação e edição de aplicações sociais, essa aplicação fica hospedada em uma nuvem do Zembly de maneira que podemos compartilhar nossa aplicação entre diversos sites, como se fossem widgets.&lt;br /&gt;É algo extremamente interessante, pois no Zembly, temos um editor para o código HTML/XHTML para UI, um editor CSS para aplicar os estilos da aplicação e um editor JavaScript para a lógica do negócio, que pode ser utilizado bibliotecas JavaScript como jQuery, Prototype e podemos fazer inclusive integração com diversas APIs como FlickR, Yahoo API, Google Maps, entre outros.&lt;br /&gt;Atualmente estou trabalhando no SOUJava para criar uma aplicação que seja compartilhada pelos sites de tecnologia, fóruns, blogs, de maneira que o SOUJava possa divulgar suas atividades de uma maneira muito mais ampla, pois estes sites deverão apenas incluir um pequeno trecho de código JavaScript em seus sites.&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;6. Poderia comentar um pouco sobre o Plugin que desenvolveu como colaboração para o SuperCRUD ?&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;Na verdade, este foi um trabalho relâmpago que montamos para o SuperCRUD e está em evolução, atualmente o plugin permite a criação de qualquer tipo de projeto (web, desktop, maven) com fontes existentes a partir de um servidor remoto, onde o desenvolvedor precisa informar a URL para o projeto (zipado).&lt;br /&gt;Pelo que sei, o desenvolvedor cria um projeto no SuperCRUD, e ao final o próprio SuperCRUD gera uma bookmarkable URL que o programador cola e copia no NetBeans (no plugin), que por sua vez abre o projeto remotamente. Mas claro, sobre esta parte do SuperCRUD o Vinicius poderia dar maiores detalhes =D.&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;7. Poderia comentar um pouco sobre o Plugin que fez para o projeto Diamond Powder junto com o Renato Bellia?&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;O Diamond Powder é um framework open source para Java ME desenvolvido pelo Bellia, que acelera a criação de coletores de dados em aplicações MIDP. O framework permite a criação dos formulários, fields (datafield, stringitem, textfield, choicegroup, filter, etc..), definição do fluxo de navegação das páginas e as páginas de help de maneira declarativa, baseada em definições de pares de chave-valor com uso de um Hashtable, que descreve toda a sua organização por um objeto chamado Schema.&lt;br /&gt;O "Schema" é o coração do framework, mas conforme a sua aplicação cresce, fica cada vez mais difícil dar manutenção no seu Schema, como adicionar novas páginas e campos, e é onde o plugin entra, ele facilita muito a criação e a manutenção do código do Schema (com refactoring ou criação de uma nova classe) através de um wizard e evita a digitação errada dos nomes das váriaveis, campos. &lt;br /&gt;Tem a possibilidade de gravar os dados criados (páginas, campos, etc...) em um arquivo properties e reutilizá-los em outros projetos.&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;8. Você realmente achou um nicho de mercado muito interessante, onde pode colaborar com praticamente qualquer projeto Open Source, quais as dicas que você poderia dar para as pessoas que estão iniciando?&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;A melhor dica que posso dar é estudar, estudar e estudar. Porém, se você ficar cansado de estudar, estude mais um pouco, faça cursos de java, visite sites de tecnologia como InfoQ, TheServerSide, execute os samples disponíveis no NetBeans e analise o código fonte, participe das listas de discussão. Participe dos eventos, dos minicursos, inscreva-se em todos os feeds possíveis sobre tecnologia, blogs, participe de grupos de discussão, tire certificações e o mais importante, participe de projetos open source, além de aprender com profissionais renomados e compartilhar conhecimento, você estará fazendo networking, sem falar da possibilidade do seu trabalho ficar conhecido no mundo todo.&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;9. Poderia citar algumas referências para quem quer começar a desenvolver plugins para NetBeans ?&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;Para as pessoas que estão iniciando, recomendo o próprio site do &lt;a target="_blank" href="http://platform.netbeans.org/"&gt; NetBeans Platform&lt;/a&gt;  que possui diversos tutoriais, screencasts, wikis, samples que demonstram como criar módulos para o NetBeans, recomendo também o blog do &lt;a target="_blank" href="http://blogs.sun.com/geertjan"&gt; Geertjan&lt;/a&gt;, um dos desenvolvedores e evangelista do NetBeans,  e existe um livro excelente chamado Plugging into the NetBeans Platform, que apesar de ser de 2007 demonstra em detalhes a criação de módulos para o NetBeans e o uso correto das APIs. E também recomendo meu artigo que foi publicado na edição 29 da revista Mundo Java sobre a Plataforma NetBeans ;).&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;10. Poderia citar algumas referências para quem quer começar a estudar Zembly?&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;Para começar a estudar Zembly, o mais importante é conhecer bem JavaScript, (X)HTML e CSS, o resto é entender como funciona o ambiente do Zembly.&lt;br /&gt;Uma ótima referência é o &lt;a target="_blank" href="http://wiki.zembly.com/"&gt; wiki&lt;/a&gt; do site, que possui diversos tutoriais de como criar aplicações a partir de templates, criação de aplicações para o Facebook, iPhone, Meebo, entre outros.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-5857712476832528616?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/5857712476832528616/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=5857712476832528616' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/5857712476832528616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/5857712476832528616'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2009/09/entrevista-para-globalcode.html' title='Entrevista para a Globalcode'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-4281399442523983723</id><published>2009-09-10T09:53:00.001-03:00</published><updated>2009-09-10T09:56:21.308-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle-Sun'/><title type='text'>Oracle - Sun no fantástico mundo de Hardware</title><content type='html'>Para quem pensava que a Oracle não iria investir em Hardware, saiu hoje &lt;a href="http://www.oracle.com/features/suncustomers.html"&gt;no site da Oracle&lt;/a&gt; um comunicado aos cliente da Sun sobre alguns de seus planos, mais especificamente na parte de hardware, observe que final ainda tem um aviso para IBM,&lt;br /&gt;&lt;blockquote&gt;Nós estamos nesta para ganhar. &lt;br /&gt;IBM prepare-se, nós estamos nos preparando para competir com vocês no negócio de Hardware. &lt;br /&gt;&lt;br /&gt;&lt;i&gt;Larry Elisson&lt;/i&gt;&lt;/blockquote&gt;É esperar para ver !!! =)&lt;br /&gt;Diversão garantida !&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_6CJaDmsVepU/Sqj2VjnkHPI/AAAAAAAAAm0/PMxLpuGdXcE/s1600-h/OracleSun.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_6CJaDmsVepU/Sqj2VjnkHPI/AAAAAAAAAm0/PMxLpuGdXcE/s400/OracleSun.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-4281399442523983723?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/4281399442523983723/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=4281399442523983723' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/4281399442523983723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/4281399442523983723'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2009/09/oracle-sun-no-fantastico-mundo-de.html' title='Oracle - Sun no fantástico mundo de Hardware'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_6CJaDmsVepU/Sqj2VjnkHPI/AAAAAAAAAm0/PMxLpuGdXcE/s72-c/OracleSun.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-8995709870082005877</id><published>2009-09-09T16:25:00.002-03:00</published><updated>2009-09-09T16:30:08.773-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JAVA EE 6'/><category scheme='http://www.blogger.com/atom/ns#' term='Eventos'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Services'/><category scheme='http://www.blogger.com/atom/ns#' term='Web 2.0'/><title type='text'>Just Java 2009 - O principal evento da comunidade Java Brasileira</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a target="_blank" href="http://www.sucesusp.org.br/eventos2009/justjava/"&gt;&lt;br /&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_6CJaDmsVepU/Sqf_del0w8I/AAAAAAAAAmk/tL0f9aQTxNQ/s320/justjava.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Nos dias 15, 16 e 17 de Setembro acontece em São Paulo o Just Java 2009. Será a 8a. edição do principal evento da Comunidade Java Brasileira.&lt;br /&gt;A grade do evento já está disponível no site &lt;a target="_blank" href="http://grade.justjava.com.br/"&gt;http://grade.justjava.com.br/&lt;/a&gt;&lt;br /&gt;Esse ano vou apresentar a palestra "&lt;b&gt;De Web Services RESTFul a aplicações Mashups: Como chegar lá&lt;/b&gt;". &lt;br /&gt;Onde vou apresentar o conceitos de REST, falar sobre especificação da &lt;a target="_blank" href="http://jcp.org/en/jsr/summary?id=311"&gt;JSR-311&lt;/a&gt; que define o JAX-RS , falar sobre frameworks de teste, como consumir serviços REST e finalmente falar sobre Mashups, e a importância de REST neste contexto.&lt;br /&gt;&amp;nbsp;Para se inscrever, acesse o site do evento &lt;a target="_blank" href="http://www.sucesusp.org.br/eventos2009/justjava/"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Diversão Garantida!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-8995709870082005877?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/8995709870082005877/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=8995709870082005877' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/8995709870082005877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/8995709870082005877'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2009/09/just-java-2009-o-principal-evento-da.html' title='Just Java 2009 - O principal evento da comunidade Java Brasileira'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6CJaDmsVepU/Sqf_del0w8I/AAAAAAAAAmk/tL0f9aQTxNQ/s72-c/justjava.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-8799142014479025447</id><published>2009-08-12T11:07:00.010-03:00</published><updated>2012-01-13T18:31:07.336-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Globalcode'/><category scheme='http://www.blogger.com/atom/ns#' term='Eventos'/><category scheme='http://www.blogger.com/atom/ns#' term='Lean'/><category scheme='http://www.blogger.com/atom/ns#' term='XP'/><category scheme='http://www.blogger.com/atom/ns#' term='Estimativas Ágeis'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Scrum + XP = Agilidade eXtrema</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_6CJaDmsVepU/SoxIlqQPpdI/AAAAAAAAAmM/QeqRtczXG44/s1600-h/MC_AgileXP_1.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5371748267380942290" src="http://4.bp.blogspot.com/_6CJaDmsVepU/SoxIlqQPpdI/AAAAAAAAAmM/QeqRtczXG44/s400/MC_AgileXP_1.jpg" style="cursor: pointer; display: block; height: 293px; margin: 0px auto 10px; text-align: center; width: 390px;" /&gt;&lt;/a&gt;  Nos dias 07 e 28 de Julho foi realizado no auditório da &lt;a href="http://www.globalcode.com.br/"&gt;Globalcode &lt;/a&gt;o minicurso Scrum + XP = Agilidade eXtrema, gostaria de agradecer a Globalcode pelo espaço concedido e pela força e também a todos que compareceram, pelo ótimo feedback que recebi.&lt;br /&gt;&lt;br /&gt;Para maiores detalhes de como foi o mini-curso acesse o seguinte &lt;a href="http://www.globalcode.com.br/site/noticias/painel.seam?chave=MinicursoScrum"&gt;link&lt;/a&gt; no site da Globalcode.&lt;br /&gt;&lt;br /&gt;Na apresentação, o intuito foi dar um enfoque teórico e prático de como funciona o Gerenciamento de Projetos Ágeis utilizando XP e Scrum, e no final uma explicação de como combinar as duas.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_6CJaDmsVepU/SoxM9bCptxI/AAAAAAAAAmU/i7UXJBu90dk/s1600-h/MC_AgileXP_2.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5371753073660770066" src="http://1.bp.blogspot.com/_6CJaDmsVepU/SoxM9bCptxI/AAAAAAAAAmU/i7UXJBu90dk/s320/MC_AgileXP_2.jpg" style="cursor: pointer; float: right; height: 240px; margin: 0pt 0pt 10px 10px; width: 320px;" /&gt;&lt;/a&gt;O que acabou agregando bastante a apresentação foi o próprio público, que iteragiu bastante, com perguntas sobre planejamento e estimativas em projetos ágeis. Foi apresentado alguns técnicas para "vender" Agile em um ambiente corporativo.  Conversamos bastante sobre o papel de uma equipe de testes, como escrever os testes de aceite e unitário dentro do TDD, Refactoring, Integração Contínua, priorização dos itens de backlog, User Stories, Débito Técnico, enfim.. três horas pareceu pouco =)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Conforme solicitado pelos colegas, segue a apresentação.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.scribd.com/doc/18821590/Scrum-XP-na-pratica" style="display: block; font-family: Helvetica,Arial,Sans-serif; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; margin: 12px auto 6px; text-decoration: underline;" title="View Scrum + XP na prática on Scribd"&gt;Scrum + XP na prática&lt;/a&gt; &lt;object align="middle" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" height="500" id="doc_320618798223982" name="doc_320618798223982" width="100%"&gt;        &lt;param name="movie" value="http://d.scribd.com/ScribdViewer.swf?document_id=18821590&amp;amp;access_key=key-14cnjarfc90qqlnjtcgi&amp;amp;page=1&amp;amp;version=1&amp;amp;viewMode="&gt;         &lt;param name="quality" value="high"&gt;         &lt;param name="play" value="true"&gt;        &lt;param name="loop" value="true"&gt;         &lt;param name="scale" value="showall"&gt;        &lt;param name="wmode" value="opaque"&gt;         &lt;param name="devicefont" value="false"&gt;        &lt;param name="bgcolor" value="#ffffff"&gt;         &lt;param name="menu" value="true"&gt;        &lt;param name="allowFullScreen" value="true"&gt;         &lt;param name="allowScriptAccess" value="always"&gt;         &lt;param name="salign" value=""&gt;                    &lt;embed src="http://d.scribd.com/ScribdViewer.swf?document_id=18821590&amp;amp;access_key=key-14cnjarfc90qqlnjtcgi&amp;amp;page=1&amp;amp;version=1&amp;amp;viewMode=" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" play="true" loop="true" scale="showall" wmode="opaque" devicefont="false" bgcolor="#ffffff" name="doc_320618798223982_object" menu="true" allowfullscreen="true" allowscriptaccess="always" salign="" type="application/x-shockwave-flash" align="middle" width="100%" height="500"&gt;&lt;/embed&gt;    &lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Ainda durante a apresentação, demonstrei um vídeo bem engraçado intitulado "O Alpinista", onde fiz uma analogia de um alpinista com gerentes de projeto.. momento bacana para quebrar um pouco o gelo. Segue abaixo o vídeo.&lt;br /&gt;&lt;br /&gt;&lt;object height="313" width="384"&gt;&lt;param name="movie" value="http://www.youtube.com/v/E5ngNIrNnwo&amp;amp;hl=pt-br&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/E5ngNIrNnwo&amp;amp;hl=pt-br&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="384" height="313"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Bom, é isso aí pessoal, obrigado mais uma vez !!!&lt;br /&gt;&lt;br /&gt;Scrum + XP = Diversão Garantida !!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-8799142014479025447?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/8799142014479025447/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=8799142014479025447' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/8799142014479025447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/8799142014479025447'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2009/08/scrum-xp-agilidade-extrema.html' title='Scrum + XP = Agilidade eXtrema'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6CJaDmsVepU/SoxIlqQPpdI/AAAAAAAAAmM/QeqRtczXG44/s72-c/MC_AgileXP_1.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-7859763109304370655</id><published>2009-07-22T16:39:00.014-03:00</published><updated>2009-07-24T10:45:54.516-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google Wave'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='Web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Artigos'/><title type='text'>Introdução ao Google Wave - Tutorial e Primeiras Impressões</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6CJaDmsVepU/SmdxLDYg8YI/AAAAAAAAAls/j4KL33d60XI/s1600-h/GWave.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 256px; height: 256px;" src="http://2.bp.blogspot.com/_6CJaDmsVepU/SmdxLDYg8YI/AAAAAAAAAls/j4KL33d60XI/s400/GWave.jpg" alt="" id="BLOGGER_PHOTO_ID_5361378316108493186" border="0" /&gt;&lt;/a&gt;Como muitos devem saber, a Google está lançando um novo produto chamado &lt;a href="https://wave.google.com/"&gt;Google Wave&lt;/a&gt;, que a alguns meses está disponível para beta-testers em um sandbox para desenvolvimento. Se a Google revolucionou a forma como utilizamos a web, agora com Wave eles querem reinventar o email. Tenho testado a ferramenta, e com o uso fui compilando o material que encontrei sobre o wave que irei disponibilizar neste artigo.&lt;br /&gt;Para este post, adaptei grande parte do conteúdo do artigo &lt;a href="http://mashable.com/2009/05/28/google-wave-guide/"&gt;Google Wave: A Complete Guide&lt;/a&gt; do Site &lt;a href="http://mashable.com/"&gt;Mashable.com&lt;/a&gt; com as minhas impressões. O site ainda possui diversos artigos interessantes sobre o Wave.&lt;br /&gt;&lt;br /&gt;Para iniciar veja na &lt;span style="font-weight: bold;"&gt;Figura 1&lt;/span&gt;, a aparência do Google Wave.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6CJaDmsVepU/Smd5J31_JII/AAAAAAAAAl0/97-J_DFX3eI/s1600-h/GWave-1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 220px;" src="http://4.bp.blogspot.com/_6CJaDmsVepU/Smd5J31_JII/AAAAAAAAAl0/97-J_DFX3eI/s400/GWave-1.jpg" alt="" id="BLOGGER_PHOTO_ID_5361387091924034690" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 1:&lt;/span&gt; Aparência do Google Wave.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;O Google Wave possui uma interface rica e intuitiva, onde começando da esquerda para a direita, temos a caixa de navegação com a Caixa de Entrada (Inbox), a opção Active apresenta as ondas que estão ativas, a opção All apresenta todas as ondas disponíveis, e assim por diante. Na caixa Contacts, temos a nossa lista de contatos. A coluna do meio (Inbox) apresenta a nossa caixa de entrada, ou a visão que estamos enxergando no momento, similar ao Gmail, que demonstra as mensagens de acordo com o filtro (se houver) estabelecido.&lt;br /&gt;Na terceira coluna, vemos uma onda aberta similar a uma seção de chat.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Mas o que é o Google Wave?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para resumir, o Google Wave é uma plataforma de comunicação em real-time, que combina diversos aspectos da Web 2.0 que utilizamos atualmente como mensagens instantâneas, blogs, wikis, redes social, sem falar de email =) tudo isso em seu browser.&lt;br /&gt;Pode ser utilizado em diversas finalidades, para gerenciamento de projetos (ferramenta de colaboração), para compartilhar arquivos ou simplesmente iniciar uma conversa, ops , onda. As pessoas podem se comunicar e trabalhar em conjunto formatação de texto rich-text, fotos, vídeos, mapas, e muito mais.&lt;br /&gt;&lt;br /&gt;Entre as diversas funcionalidades inovadoras, segue o resumo de algumas disponíveis:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Colaboração em Tempo Real:&lt;/span&gt; Tecnologia concorrente que permite que as pessoas em uma onda editem conteúdo de mídia ao mesmo tempo. (É possível ver o que a pessoa está escrevendo em tempo real.)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Ferramentas de Linguagem Nativa:&lt;/span&gt; Google Wave automaticamente corrige palavras escritas erroneamente, e o que achei mais impressionante, ele corrige erros de concordância.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Embutível: &lt;/span&gt;É possível embutir ondas em qualquer blog ou site. No GDD foi apresentado como publicar uma onda no blogspot, bem legal.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Aplicações e Extensões:&lt;/span&gt; Assim como o Facebook ou o iGoogle é possível criar aplicações para o wave, desde de robôs até complexas aplicações, gadgets. (Tanto em Java como em Python).&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Suporte a Drag and Drop: &lt;/span&gt;É possível fazer drag and drop de documentos, fotos para a onda, no more attachments ;-)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Playback:&lt;/span&gt; Uma funcionalidade interessante, uma vez que a onde fica muito grande, se alguém entrar no meio da onda, pode ficar sem entender o histórico, para isso foi disponibilizado um botão (Playback), que é possível ver o que foi dito em qualquer parte da onda. E o melhor, o projeto é open source \o/&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Terminologia&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para entrar na onda, é preciso entender o linguajar do Google Wave, que ajuda a definir e contextualizar essa nova plataforma de comunicação. Entender estes termos irá ajudar a compreender mais este novo projeto. Veja a Figura 2, que apresenta estes conceitos de maneira visual.&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6CJaDmsVepU/SmdsS7rpazI/AAAAAAAAAlM/cR14yWPXu_8/s1600-h/GWave-2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 254px;" src="http://2.bp.blogspot.com/_6CJaDmsVepU/SmdsS7rpazI/AAAAAAAAAlM/cR14yWPXu_8/s400/GWave-2.jpg" alt="" id="BLOGGER_PHOTO_ID_5361372953922071346" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="text-align: center;" class="MsoNormal"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 2:&lt;/span&gt; Entendendo os termos de uma Wave&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Wave:&lt;/span&gt; A onda refere-se a uma thread especifica de uma conversação. Pode serincluída apenas uma pessoa, um grupo de usuários ou mesmo robôs. Que seria todo o histórico de conversação de um email.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Wavelet&lt;/span&gt;: Um wavelet é também uma thread de conversação, mas somente um subconjunto de uma grande conversação (ou uma onda).&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Blip&lt;/span&gt;: Ainda menor que uma Wavelet, um Blip é uma única, mensagem individual. Blips podem conter outros blips anexados a ele. Para saber mais sobre Blips, acesse &lt;a href="http://www.blippr.com/apps/337306-BLIP"&gt;http://www.blippr.com/apps/337306-BLIP&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Documento&lt;/span&gt;: Refere-se ao conteúdo dentro de um blip. Podemos ser simples caracteres ou arquivos associados ao blip.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Extensões&lt;/span&gt;: Um extensão é uma mini-aplicação que opera dentro de uma onda. Existem dois tipos de extensão, os Gadgets e os Robots&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Gadgets&lt;/span&gt;: Um gadget é uma aplicação onde os usuários podem utilizar em conjunto, a maioria é construída sobre a plataforma OpenSocial (da Google), podemos fazer uma comparação com os gadgets do iGoogle ou as aplicações do Facebook. Veja a Figura 3, para alguns exemplos de gadgets (Google Maps, Polls de pesquisa, um jogo de xadrez, entre outros).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p class="MsoNormal" style=""&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6CJaDmsVepU/Smds1pb1svI/AAAAAAAAAlU/H8OJz4ORFHY/s1600-h/GWave-3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 265px;" src="http://1.bp.blogspot.com/_6CJaDmsVepU/Smds1pb1svI/AAAAAAAAAlU/H8OJz4ORFHY/s400/GWave-3.jpg" alt="" id="BLOGGER_PHOTO_ID_5361373550319350514" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 3: &lt;/span&gt;Gadgets para o Google Wave.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Robots: &lt;/span&gt;Robots são aplicações (robots) que participam de uma onda. Eles podem interagir com os usuários de uma onda, podem fornecer informações de fontes externas como o Twitter, ou podem tomar ações baseadas no conteúdo digitado pelos participantes de uma onda, um exemplo muito interessante é o robô Rosy Etta, que em tempo real traduz o conteúdo de uma onda para participantes de linguagens diferentes (ex: Japonês x Inglês) =) ,, na apresentação do GDD este ano, este foi um dos pontos altos da apresentação \o/. Veja na &lt;span style="font-weight: bold;"&gt;Figura 4&lt;/span&gt; alguns robôs em ação.&lt;/li&gt;&lt;/ul&gt;&lt;p class="MsoNormal" style=""&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6CJaDmsVepU/SmdtfzdiDmI/AAAAAAAAAlc/7GZQmU3hWLs/s1600-h/GWave-4.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 285px;" src="http://3.bp.blogspot.com/_6CJaDmsVepU/SmdtfzdiDmI/AAAAAAAAAlc/7GZQmU3hWLs/s400/GWave-4.jpg" alt="" id="BLOGGER_PHOTO_ID_5361374274565312098" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 4:&lt;/span&gt; Robôs em ação em uma onda.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Ondas Embutidas:&lt;/span&gt; Uma onda embutida é uma maneira de levar uma conversação de uma Wave para dentro de seu site ou blog. Sendo possível utilizar a mesma como chat ou uma maneira de se comunicar com você. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6CJaDmsVepU/Smdt19CrRxI/AAAAAAAAAlk/p0_QHnSCk_w/s1600-h/GWave-5.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 212px;" src="http://4.bp.blogspot.com/_6CJaDmsVepU/Smdt19CrRxI/AAAAAAAAAlk/p0_QHnSCk_w/s400/GWave-5.jpg" alt="" id="BLOGGER_PHOTO_ID_5361374655094146834" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 5:&lt;/span&gt; Exemplo de Ondas embutidas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;É isso aí, esse é apenas um aperitivo que vem por aí, lembrando que o Google Wave não está disponível ainda para o grande público, se a ansiedade for grande demais =) , solicite acesso ao acesso Dev Preview, e torça para ganhar um convite.&lt;br /&gt;&lt;br /&gt;No próximo vou demonstrar como criar um robô passo a passo para o Wave.&lt;br /&gt;&lt;br /&gt;Diversão Garantida!!!&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class="MsoNormal"&gt;&lt;b style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-7859763109304370655?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/7859763109304370655/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=7859763109304370655' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/7859763109304370655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/7859763109304370655'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2009/07/introducao-ao-google-wave-primeiras.html' title='Introdução ao Google Wave - Tutorial e Primeiras Impressões'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6CJaDmsVepU/SmdxLDYg8YI/AAAAAAAAAls/j4KL33d60XI/s72-c/GWave.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-4880506066283969999</id><published>2009-06-09T18:25:00.007-03:00</published><updated>2009-06-09T18:58:16.115-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='Publicações'/><category scheme='http://www.blogger.com/atom/ns#' term='Mundo Java'/><title type='text'>RESTful Web Services e a API JAX-RS na revista Mundo Java, nº 35</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6CJaDmsVepU/Si7T8wmriVI/AAAAAAAAAjY/EZFAhNxcBjE/s1600-h/ed35_destaques.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 251px;" src="http://3.bp.blogspot.com/_6CJaDmsVepU/Si7T8wmriVI/AAAAAAAAAjY/EZFAhNxcBjE/s400/ed35_destaques.jpg" alt="" id="BLOGGER_PHOTO_ID_5345442848528107858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;No mês de Maio foi publicado mais um artigo meu na &lt;a href="http://www.mundojava.com.br/"&gt;revista Mundo Java&lt;/a&gt;, sobre a REST desde o conceito proposto pelo Dr. Roy Fielding até a implementação JAX-RS em Java, com diversos exemplos práticos no Jersey.&lt;br /&gt;&lt;br /&gt;Graças a Deus tenho recebido um bom feedback das pessoas, no artigo procurei demonstrar as tecnologias por trás de um serviço REST, onde fiz primeiro uma introdução ao HTTP,  para auxiliar aos leitores que estão iniciando a compreender a dinâmica do serviço.&lt;br /&gt;&lt;br /&gt;Ainda no artigo, apresentei um artigo bem completo sobre a API JAX-RS, e mostrando na prática com diversos códigos como se trabalhar com os recursos, tratamento de exceções, extração de parâmetros e valores da URI na requisição.&lt;br /&gt;Como trabalhar o retorno dos métodos ao Cliente, dando uma visão geral dos Providers.&lt;br /&gt;&lt;br /&gt;E por fim, apresentei um guia de ferramentas para teste, e como consumir serviços REST, utilizando a API JAXB para conversão dos dados em objetos, uso prático da biblioteca Jakarta Commons HTTP Client,  o uso de bibliotecas JavaScript como o jQuery, e o uso de JavaScript / AJAX..&lt;br /&gt;&lt;br /&gt;Sem dúvida, uma ótima pedida para quem esta iniciando o desenvolvimento de serviços REST.&lt;br /&gt;&lt;br /&gt;Além do artigo, tem vários destaques na revista deste mês, conforme segue:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Projeto da Certificação SCEA 5&lt;/span&gt;&lt;br /&gt;Um exemplo fictício de projeto para a segunda fase da cobiçada certificação de arquiteto Java EE.&lt;br /&gt;Autores: Márcio Varchawski&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conhecendo a Plataforma JavaFX Mobile&lt;/span&gt;&lt;br /&gt;Através deste artigo crie e compreenda seus primeiros aplicativos utilizando a plataforma Java- FX Mobile.&lt;br /&gt;Autores: Ricardo da Silva Ogliari&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Mundo OO: Padrões de Projeto com Generics&lt;/span&gt;&lt;br /&gt;Aprenda como tirar vantagem de Generics na implementação de Padrões de Projeto em suas aplicações Java.&lt;br /&gt;Autor: Alexandre Gazola, Alex Marques Campos&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;RESTful Web Services e a API JAX-RS&lt;/span&gt;&lt;br /&gt;Conheça o poder dos serviços REST e a implementação de Referência da Sun, o Jersey.&lt;br /&gt;Autor: Wagner Roberto dos Santos&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ProfessorJ: Conhecendo os parâmetros de configuração mais utilizados da JVM&lt;/span&gt;&lt;br /&gt;Aprenda como configurar a Máquina Virtual JAVA para evitar os indesejados estouros de memória.&lt;br /&gt;Autores: Rodrigo de Azevedo&lt;br /&gt;    &lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tendências em Foco: Adotando o Open Source no Ensino da Computação&lt;/span&gt;&lt;br /&gt;Entenda a estratégia de adoção do Open Source no ensino da computação e programação Java.&lt;br /&gt;Autor: Cezar Taurion&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SOA na Prática: Governança em SOA - Versionamento de Serviços&lt;/span&gt;&lt;br /&gt;Aprendendo a lidar com questões de versionamento de serviços dentro de uma arquitetura SOA.&lt;br /&gt;Autor: Ricardo Ferreira         &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Made in Brazil: JColtrane - Parser XML com SAX + Anotações&lt;/span&gt;&lt;br /&gt;Conheça essa alternativa nacional para processesar arquivos XML sem comprometer memória e a clareza do código.&lt;br /&gt;Autor: Renzo Nuccitelli, Eduardo Guerra&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6CJaDmsVepU/Si7a5pmBc0I/AAAAAAAAAjg/nY62wPmzEcw/s1600-h/revistanumero0035.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 148px; height: 190px;" src="http://4.bp.blogspot.com/_6CJaDmsVepU/Si7a5pmBc0I/AAAAAAAAAjg/nY62wPmzEcw/s400/revistanumero0035.jpg" alt="" id="BLOGGER_PHOTO_ID_5345450491688088386" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Diversão Garantida !!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-4880506066283969999?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/4880506066283969999/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=4880506066283969999' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/4880506066283969999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/4880506066283969999'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2009/06/restful-web-services-e-api-jax-rs-na.html' title='RESTful Web Services e a API JAX-RS na revista Mundo Java, nº 35'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6CJaDmsVepU/Si7T8wmriVI/AAAAAAAAAjY/EZFAhNxcBjE/s72-c/ed35_destaques.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-4317888704255005735</id><published>2009-05-14T17:03:00.032-03:00</published><updated>2009-06-09T18:45:01.197-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Services'/><category scheme='http://www.blogger.com/atom/ns#' term='JAVA EE'/><category scheme='http://www.blogger.com/atom/ns#' term='Artigos'/><title type='text'>Web Services WS-* vs REST.</title><content type='html'>Muitos sites, blogs e fóruns têm colocado seus pontos de vista em relação ao uso de web services REST e SOAP, gerando muitas vezes calorosas discussões.&lt;br /&gt;&lt;br /&gt;Na verdade, não existe uma disputa entre eles, pois cada um possui uma proposta bem diferente.   Vários estilos diferentes de aplicações tem sido utilizadas para integrar sistemas de informação corporativos, entre as opções, existem os banco de dados compartilhados, transferência de arquivos (EDI ), remote procedure call (RPC), ou troca de mensagens assíncronas via uma sistema de mensageria.   Ao fazermos uma comparação entre REST e WS-* (pronucia-se ws-star), precisamos fazer uma comparação quantitativa baseado em princípios arquiteturais que envolvem questões relacionadas a cenário, tecnologia, métodos, formato dos dados trafegados, segurança, transação, entre outros fatores da sua aplicação.  Devemos lembrar que estas tecnologias surgiram para suprir estes problemas recorrentes na maioria dos projetos de software, que é a interoperabilidade.&lt;br /&gt;&lt;br /&gt;Foi quando começaram a surgir esforços da comunidade de buscar dos grandes players interoperabilidade entre suas plataformas, aplicações, e linguagens de programação. Foi quando surgiram as especificações WS-*, que atendem tanto ao estilo RPC quanto mensageria.   A especificação SOAP não define como deve ser um message header, ou elementos do corpo do envelope, dessa maneira podemos ter aplicações que customizem o tipo de header que ela aceita, e o tipo de informação que deve estar vinculado ao body para uma operação em particular, sem falar que algumas dessas informações podem ser compartilhadas por diferentes aplicações, sem falar em questões de segurança, roteamento de mensagens, entre outros fatores.&lt;br /&gt;&lt;br /&gt;As especificações WS-* definem padrões para mensagem, troca de metadados, segurança, entre outros. No mundo Java, para implementar este mundo de especificações, foi aberto o projeto WSIT (antigo projeto Tango) como parte do projeto Metro, que por sua vez faz parte do projeto Glassfish, veja a Figura 01 os padrões (em verde) utilizado no projeto WSIT.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6CJaDmsVepU/Sg2rMp_LwYI/AAAAAAAAAiI/AlpuwywwFas/s1600-h/metro.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 227px;" src="http://1.bp.blogspot.com/_6CJaDmsVepU/Sg2rMp_LwYI/AAAAAAAAAiI/AlpuwywwFas/s400/metro.jpg" alt="" id="BLOGGER_PHOTO_ID_5336109367421550978" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 1:&lt;/span&gt; Padrões de Web Services utilizados no WSIT.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;É claro que para a maioria dos projetos, um web service simples resolveria, mas se começarmos a entrar mais a fundo no mundo orientado a serviços, começa a surgir a necessidade de integração com diversos sistemas, naturalmente teremos que utilizar estes padrões. É somente olhar para a figura 01 que já causa calafrios em muitos desenvolvedores, mesmo com suporte eficiente nos IDEs existentes.&lt;br /&gt;&lt;br /&gt;Com isto, vemos claramente que a arquitetura de web services baseadas nas especificações WS-* é muito bem definida, com regras para trocas de dados, segurança, o que por conta de seu excesso de padrões acabou se tornando uma solução muito complexa.&lt;br /&gt;&lt;br /&gt;Mesmo com toda a complexidade, serviços WS-* têm tomado cada vez mais espaço no mercado, graças aos projetos SOA que tem adotado largamente serviços WS-* por sua independência e transparência de protocolo.      Por outro lado, REST é muito mais simples, como uma resposta para todos estes padrões e especificações, para utilizar REST basta ter um conhecimento razoável sobre HTTP e seus métodos.&lt;br /&gt;&lt;br /&gt;Enquanto web services WS-* são orientados a atividade/serviço, serviços REST são orientados a recurso. Quando falamos em desenvolver serviços SOAP, estamos falando em criar APIs, contratos (WSDL), onde o WSDL descreve os detalhes de implementação, como as operações e os tipos de dados trafegados.   REST por outro lado, conforme explicado no inicio diz respeito a utilizar o protocolo HTTP para manipular o estado de um recurso. Fazendo uma analogia, podemos dizer que assim como a linguagem de manipulação de dados (DML) do SQL é utilizada para manipular as informações de um banco de dados transacional, REST utiliza os métodos (verbos) do protocolo HTTP para manipular o estado de uma informação. Com estes verbos, podemos fazer praticamente tudo o que quisermos com os dados, independente se usarmos SQL ou HTTP.&lt;br /&gt;Ao mapear os métodos HTTP (POST, DELETE, GET E PUT) com operações DML de um banco de dados temos a seguinte estrutura, conforme ilustra a &lt;span style="font-weight: bold;"&gt;tabela 01&lt;/span&gt;.&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold;"&gt;Métodos HTTP / Operações CRUD&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;GET  -&gt; SELECT&lt;br /&gt;POST -&gt; INSERT, UPDATE&lt;br /&gt;PUT  -&gt; INSERT, UPDATE&lt;br /&gt;DELETE -&gt;DELETE&lt;/blockquote&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Tabela 01&lt;/span&gt;. Associação dos métodos HTTP com operações CRUD. &lt;/span&gt;&lt;br /&gt;&lt;/div&gt;Na tabela podemos notar que podemos ter mais de uma operação relacionada a um verbo HTTP, como por exemplo, o método POST, que pode ser utilizado para diversas ações. O método PUT nos dá a possibilidade de criar um novo recurso, ou substituir por outro mais atualizado.  Apesar dos diversos tutoriais e exemplos que encontramos na internet sobre REST que envolvem operações CRUD, isso não quer dizer que temos que ficar presos somente a estes tipos de operações. Por conta de sua própria natureza, REST é mais fácil e funciona muito bem com CRUDs, mas podemos em nosso design criar serviços REST.      Web Services RESTful.&lt;br /&gt;&lt;table style="text-align: left; margin-left: auto; margin-right: auto;"&gt;&lt;br /&gt;&lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;&lt;td style="font-weight: bold; text-align: center;"&gt;Pontos Positivos&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="text-align: center; font-weight: bold;"&gt;Pontos Negativos&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;&lt;ul&gt;&lt;li&gt;Linguagem e plataforma agnóstica.&lt;/li&gt;&lt;li&gt;Simplicidade, interface imutável.&lt;/li&gt;&lt;li&gt;Interação assíncrona, não possui estado.&lt;/li&gt;&lt;li&gt;Facilidade de adoção, pois não requer uma grande infra-estrutura, muito menos um middleware para WS-* ou camada intermediária adicional.&lt;/li&gt;&lt;li&gt;Utiliza a própria web como meio de transporte, sendo assim uma carga baixa para a rede.&lt;/li&gt;&lt;li&gt;Utilizada por grande parte das aplicações Web 2.0. (Google, Flickr, Amazon, etc..). Portanto, ótimo para mashups.&lt;/li&gt;&lt;li&gt;Curva de aprendizagem baixa.&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;ul&gt;&lt;li&gt;Faltam padrões.&lt;/li&gt;&lt;li&gt;Falta de segurança (dados sigilosos não deveriam ser enviados como parâmetros na URI).&lt;/li&gt;&lt;li&gt;Não é indicado para trafegar grandes volumes de parâmetros via URI, no caso de PUT/POST para inclusão de dados, por exemplo.&lt;/li&gt;&lt;li&gt;Em muitas empresas apenas os métodos GET e POST do HTTP são liberados em proxies e firewalls. Dentro desta limitação, muitos preferem utilizar os métodos GET para requisições de consulta e POST para todo o resto.&lt;/li&gt;&lt;li&gt;Não há mecanismos de transação (Do it yourself)&lt;/li&gt;&lt;li&gt;Não existe um padrão como UDDI para service discovery.&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Tabela 02&lt;/span&gt;: Pontos positivos e negativos de REST&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-weight: bold;"&gt;SOAP&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;table style="text-align: left; margin-left: 0px; margin-right: auto;"&gt;&lt;/table&gt;&lt;table style="text-align: left; margin-left: 0px; margin-right: auto; width: 592px; height: 24px;"&gt;&lt;tbody&gt;&lt;tr align="center"&gt;&lt;br /&gt;&lt;td style="font-weight: bold;"&gt;Pontos Positivos&lt;/td&gt;&lt;br /&gt;&lt;td style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="font-weight: bold;"&gt;Pontos Negativos&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr align="left"&gt;&lt;br /&gt;&lt;td&gt;&lt;ul&gt;&lt;li&gt;Diversas ferramentas de desenvolvimento.&lt;/li&gt;&lt;li&gt;Tipagem forte e um vocabulário bem definido.&lt;/li&gt;&lt;li&gt;Quando utilizado sobre HTTP, dificilmente é bloqueado por proxies e firewalls.&lt;/li&gt;&lt;li&gt;Permite o uso de diferentes tipos de protocolos.&lt;/li&gt;&lt;li&gt;Plataforma independente.&lt;/li&gt;&lt;li&gt;Linguagem independente.&lt;/li&gt;&lt;/ul&gt; &lt;/td&gt;&lt;td&gt;&lt;ul&gt;&lt;li&gt;Diversos padrões.&lt;/li&gt;&lt;li&gt;Complexidade dos padrões.&lt;/li&gt;&lt;li&gt;Performance.&lt;/li&gt;&lt;li&gt;Mensagens podem ficar muito extensas, por serem codificadas com XML&lt;/li&gt;&lt;/ul&gt; &lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Tabela 03:&lt;/span&gt; Pontos positivos e negativos com SOAP.     &lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Fazendo esta pequena análise, chegamos á conclusão de que ambas as soluções são úteis, e a utilização de cada uma depende do contexto em que será aplicada.      &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;&lt;span style="font-weight: bold;"&gt;Referências (Links):&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/p&gt;[Parley] A Little REST and Relaxation:  &lt;a href="http://tinyurl.com/cm33t2"&gt;http://tinyurl.com/cm33t2 &lt;/a&gt;&lt;br /&gt;Estilo SOAP vs Estilo REST: &lt;a href="http://www.ibm.com/developerworks/webservices/library/ws-restvsoap/"&gt;http://www.ibm.com/developerworks/webservices/library/ws-restvsoap/&lt;/a&gt;&lt;br /&gt;Descrevendo Serviços REST com WSDL 2.0: &lt;a href="http://www.ibm.com/developerworks/webservices/library/ws-restwsdl/"&gt;http://www.ibm.com/developerworks/webservices/library/ws-restwsdl/&lt;/a&gt;&lt;br /&gt;Bruno Pereira: &lt;a href="http://brunopereira.org/2008/05/14/precisamos-de-um-descritor-de-servicos-rest/"&gt;http://brunopereira.org/2008/05/14/precisamos-de-um-descritor-de-servicos-rest/&lt;/a&gt;&lt;p&gt;&lt;/p&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-4317888704255005735?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/4317888704255005735/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=4317888704255005735' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/4317888704255005735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/4317888704255005735'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2009/05/web-services-ws-vs-rest.html' title='Web Services WS-* vs REST.'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_6CJaDmsVepU/Sg2rMp_LwYI/AAAAAAAAAiI/AlpuwywwFas/s72-c/metro.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-5160774013645828494</id><published>2009-04-17T23:52:00.009-03:00</published><updated>2012-01-13T18:30:38.704-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XP'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Artigos'/><title type='text'>XP - Extreme Programming - Embrace Change Summary</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_6CJaDmsVepU/SelMmRj0gVI/AAAAAAAAAhg/ER1b3KEfW9E/s1600-h/xp.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5325872254774706514" src="http://1.bp.blogspot.com/_6CJaDmsVepU/SelMmRj0gVI/AAAAAAAAAhg/ER1b3KEfW9E/s400/xp.jpg" style="cursor: pointer; display: block; height: 263px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;As you may already know,  XP is a lightweight methodology created by Kent Beck, for small-to-medium-sized teams developing software in the face of vague or rapidly changing requirements.&lt;br /&gt;&lt;br /&gt;To help the understand of the basis, i'm providing a summary and a mind map of the book eXtreme Programming - Embrace Change, by Kent Beck, as you can see below. Enjoy it!&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_6CJaDmsVepU/SelFQeC87JI/AAAAAAAAAhQ/M9lLIJ4vqAg/s1600-h/Extreme+Programming.jpeg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5325864183587990674" src="http://1.bp.blogspot.com/_6CJaDmsVepU/SelFQeC87JI/AAAAAAAAAhQ/M9lLIJ4vqAg/s400/Extreme+Programming.jpeg" style="cursor: pointer; display: block; height: 384px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figure 1:&lt;/span&gt; Extreme Programming Mind Map&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;XP - Embrace Change is a small book, quite fast and easy to read, it took me only two days to finish it.&lt;br /&gt;As Kent Beck said "XP is a philosophy of software development based on the values of communication, feedback, simplicity, courage, and respect."&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Basic Problem &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Software development fails to deliver, and fails to deliver value. This failure behind software development has a huge economic and human impact. So it was the reason to find ways to develop software.&lt;br /&gt;&lt;br /&gt;First recognize risks and try to address it applying some XP practices, like short release cycles to limit scope, one to four week iterations of features requests from customer, it will give you a fine-grained feedback about progress.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt; &lt;span style="font-weight: bold;"&gt;Economics of Software Development &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Create a strategy for maximizing the economic value of the project, spending less, earning more (depends strategy), spending later and earning sooner, increase probability that the project will stay alive.&lt;br /&gt;&lt;br /&gt;In projects we have to control five variables: cost, time, quality and scope, like PMBoK scope is the best way to achieve control. KEEP FOCUS ON SCOPE.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cost of Change &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The cost of changing a program rises exponentially over time. Figura 2 shows that the longer it takes you to find a defect then on average the more expensive it is to address.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_6CJaDmsVepU/SelF41VzftI/AAAAAAAAAhY/Pj-rn0lHhuo/s1600-h/comparingTechniques.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5325864877035847378" src="http://2.bp.blogspot.com/_6CJaDmsVepU/SelF41VzftI/AAAAAAAAAhY/Pj-rn0lHhuo/s400/comparingTechniques.jpg" style="cursor: pointer; display: block; height: 310px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figure 2&lt;/span&gt; - Cost of Change [Scott  W. Ambler, 2006]&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;To overtake problems related to cost of change, after years of production some factors became clear like a simple design, intensive use of automated tests, refactoring code and design, incremental design, continuous integration.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Learning to drive. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Everything in software changes. requirements, design, business, technology, team members change. The problem&lt;br /&gt;isn't change, the problem, rather, is the inability to cope with change when it comes.&lt;br /&gt;&lt;br /&gt;Learn to control the development of software by making many small adjustments, not by making a few large adjustments, kind of like driving a car.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The driver of a software project is the customer. If the software doesn't do what they want it to do,&lt;br /&gt;you have failed. Of course, they don't know exactly what the software should do. That's why&lt;br /&gt;software development is like steering, not like getting the car pointed straight down the road. Our&lt;br /&gt;job as programmers is to give the customer a steering wheel and give them feedback about&lt;br /&gt;exactly where we are on the road.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;XP Values&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Communication:&lt;/span&gt; Ensured an effective comunication of your team and your organization core values. &lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Simplicity:&lt;/span&gt; Search for simple solutions. &lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Feedback&lt;/span&gt;: Work with your customers at your side, seat the team together. &lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Courage&lt;/span&gt;: Throw code possible whenever itŽs possible (keeping your code simple). Courage to change, to assume your faults. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;PUT ALL THESE VALUES IN PRACTICE.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 130%; font-weight: bold;"&gt;The Four Basic Activities &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Coding&lt;/span&gt;: Code is the one artifact that development absolutely cannot live without, it gives you a chance to communicate clearly and concisely. &lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Testing&lt;/span&gt;: Writing every test you can imagine. &lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Listening&lt;/span&gt;: Learn to listen your customer, he knows about the business not you. &lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Designing:&lt;/span&gt; Good design ensures that every piece of logic in the system has one and only one home.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_6CJaDmsVepU/SelPePQu0rI/AAAAAAAAAho/Cfssekjs1X4/s1600-h/overview.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5325875415253701298" src="http://2.bp.blogspot.com/_6CJaDmsVepU/SelPePQu0rI/AAAAAAAAAho/Cfssekjs1X4/s400/overview.jpg" style="cursor: pointer; display: block; height: 290px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figure 3&lt;/span&gt; - XP Overview.&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-weight: bold;"&gt;The Practices &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Primary Practices&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;------------------------&lt;/span&gt;&lt;br /&gt;-&lt;span style="font-style: italic;"&gt;Integration &lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;  &lt;span style="font-style: italic;"&gt;Ten minute build:&lt;/span&gt; Automatically build the whole system and run all of the tests in ten minutes.&lt;/li&gt;&lt;li&gt;  &lt;span style="font-style: italic;"&gt;Continuous integration:&lt;/span&gt; Integrate and test changes after no more than a couple of hours.&lt;/li&gt;&lt;/ul&gt;-&lt;span style="font-style: italic;"&gt;Whole Team&lt;/span&gt;: Create cross-functional teams. Create a team with all the skills necessary for the project to succeed.&lt;br /&gt;-&lt;span style="font-style: italic;"&gt;Programming &lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;  Test-First Programming:&lt;/span&gt;  [TDD] Test -&amp;gt; Code -&amp;gt; Refactor&lt;/li&gt;&lt;li&gt;  &lt;span style="font-style: italic;"&gt;Incremental Design: &lt;/span&gt;Keep the design investment in proportion to the needs of the system.&lt;/li&gt;&lt;li&gt;  &lt;span style="font-style: italic;"&gt;Pair Programming:&lt;/span&gt; Help to:&lt;/li&gt;&lt;/ul&gt;&lt;ol&gt;&lt;li style="text-align: left;"&gt;     Keep each other on task.&lt;/li&gt;&lt;li style="text-align: left;"&gt;     Brainstorm refinements to the system.&lt;/li&gt;&lt;li style="text-align: left;"&gt;     Clarify ideas.&lt;/li&gt;&lt;li style="text-align: left;"&gt;     Lower frustration.&lt;/li&gt;&lt;li style="text-align: left;"&gt;     Hold each other accountable&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;-&lt;span style="font-style: italic;"&gt;Energized Work&lt;/span&gt;: Take care and respect yourself.&lt;br /&gt;&lt;br /&gt;-&lt;span style="font-style: italic;"&gt;Planning&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; &lt;span style="font-style: italic;"&gt;Weekly Cycle:&lt;/span&gt; Plan work a week at a time, have meeting at the beginning of every week. During meetings, review progress, ask your customer to pick some stories to implement and break stories into tasks.&lt;/li&gt;&lt;li&gt; &lt;span style="font-style: italic;"&gt;Monthly Cycle:&lt;/span&gt; Plan work quarter at a time, Identify bottlenecks, Initiate repairs, Plan the theme, pick the stories.&lt;/li&gt;&lt;li&gt; &lt;span style="font-style: italic;"&gt;Stories: &lt;/span&gt;Write the stories on index cards and put them on a wall.&lt;/li&gt;&lt;li&gt; &lt;span style="font-style: italic;"&gt;Slack&lt;/span&gt;: Include some minor tasks that can be dropped if you get behind in your plan.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The Planning Game:  &lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;List the items of work that may need to be done. &lt;/li&gt;&lt;li&gt;Estimate the items. &lt;/li&gt;&lt;li&gt;Set a budget for the planning cycle. &lt;/li&gt;&lt;li&gt;Agree on the work that needs to be done within the budget. As you negotiate, don't change the estimates or the budget.  &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Corollary Practices &lt;/span&gt; &lt;span style="font-weight: bold;"&gt;&lt;br /&gt;-------------------------- &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;-&lt;span style="font-style: italic;"&gt;Business Negociated Scope Contract&lt;/span&gt;: Try a sequence of short contracts instead of one long one.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;  &lt;span style="font-style: italic;"&gt;Pay-per-use:&lt;/span&gt; Charge for every time the system is used.&lt;/li&gt;&lt;li&gt;  &lt;span style="font-style: italic;"&gt;Daily Deployment:&lt;/span&gt; Put new software into production every night.&lt;/li&gt;&lt;/ul&gt;-&lt;span style="font-style: italic;"&gt;Incremental Deployment:&lt;/span&gt; Find a little piece of functionality and deploy it.&lt;br /&gt;-&lt;span style="font-style: italic;"&gt;Programming&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;  &lt;span style="font-style: italic;"&gt;Single Code Base&lt;/span&gt;: Keep only one code stream.&lt;/li&gt;&lt;li&gt;  &lt;span style="font-style: italic;"&gt;Code &amp;amp; Tests:&lt;/span&gt; Mantain Code and tests as permanent artifacts.&lt;/li&gt;&lt;li&gt;  &lt;span style="font-style: italic;"&gt;Shared Code&lt;/span&gt;: Anyone on the team can improve any part of the system at any time.&lt;/li&gt;&lt;/ul&gt;-&lt;span style="font-style: italic;"&gt;Root Cause Analysis:&lt;/span&gt; Eliminate defect and its cause. To find the Root cause, apply Taiichi Ohno's exercise, called "Five Whys":&lt;br /&gt;&lt;ul&gt;&lt;li&gt;    Why did we miss this defect?&lt;/li&gt;&lt;li&gt;    Why didn't we know? &lt;/li&gt;&lt;li&gt;    Why isn't she part of the team? &lt;/li&gt;&lt;li&gt;    Why doesn't anyone else know how? &lt;/li&gt;&lt;li&gt;    Why isn't it a management priority?&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;-&lt;span style="font-style: italic;"&gt;Real Customer Involvement:&lt;/span&gt; Put your customer at your side.&lt;br /&gt;-&lt;span style="font-style: italic;"&gt;Team&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;  &lt;span style="font-style: italic;"&gt;Team Continuity:&lt;/span&gt; Keep effective teams together.&lt;/li&gt;&lt;li&gt;  &lt;span style="font-style: italic;"&gt;Shrinking Teams: &lt;/span&gt;Lean Thinking, reduce the size.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_6CJaDmsVepU/SelVMdQl28I/AAAAAAAAAhw/hHlxrPMCyiA/s1600-h/big0321278658.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5325881706843331522" src="http://2.bp.blogspot.com/_6CJaDmsVepU/SelVMdQl28I/AAAAAAAAAhw/hHlxrPMCyiA/s200/big0321278658.jpg" style="cursor: pointer; float: left; height: 200px; margin: 0pt 10px 10px 0pt; width: 159px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you like it, buy the book &lt;a href="http://www.amazon.com/Extreme-Programming-Explained-Embrace-Change/dp/0321278658?&amp;amp;camp=212361&amp;amp;linkCode=wey&amp;amp;tag=netfbraz-20&amp;amp;creative=380733"&gt;here&lt;/a&gt;..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-5160774013645828494?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/5160774013645828494/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=5160774013645828494' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/5160774013645828494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/5160774013645828494'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2009/04/xp-extreme-programming-embrace-change.html' title='XP - Extreme Programming - Embrace Change Summary'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_6CJaDmsVepU/SelMmRj0gVI/AAAAAAAAAhg/ER1b3KEfW9E/s72-c/xp.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-32670099651378240</id><published>2009-03-23T14:45:00.008-03:00</published><updated>2009-06-09T18:45:50.457-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mobilidade'/><category scheme='http://www.blogger.com/atom/ns#' term='Projetos'/><category scheme='http://www.blogger.com/atom/ns#' term='Diamond Powder'/><category scheme='http://www.blogger.com/atom/ns#' term='Artigos'/><category scheme='http://www.blogger.com/atom/ns#' term='Plataforma'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Diamond Powder for NetBeans</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://diamond-powder.blogspot.com/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 284px; height: 247px;" src="http://2.bp.blogspot.com/_6CJaDmsVepU/ScfLGb7jmaI/AAAAAAAAAfg/oN059WR6vak/s400/DP.jpg" alt="" id="BLOGGER_PHOTO_ID_5316441196571367842" border="0" /&gt;&lt;/a&gt;Last year, i have created a NetBeans plugin to an interesting framework, called Diamond Powder, it was developed by a friend of mine, Renato Bellia .&lt;br /&gt;To explain what &lt;a href="https://diamond-powder.dev.java.net/"&gt;Diamond Powder&lt;/a&gt; is, i´ve extracted a briefly introduction from his blog,&lt;br /&gt;&lt;h4 style="background-color: rgb(153, 0, 0);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;What is it ?&lt;/span&gt;&lt;br /&gt;&lt;/h4&gt;&lt;p&gt;It's a Java ME framework to quickly build data collector forms. Further, it is able to manage the persistence of collected data into RMS records.&lt;/p&gt;&lt;h4 style="background-color: rgb(153, 0, 0);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;Data Collector ?&lt;/span&gt;&lt;br /&gt;&lt;/h4&gt;&lt;p&gt;It is about user input. &lt;/p&gt;&lt;p&gt;Suppose you develop a MIDP application that helps car drivers to maintain records about fuel consume in his/her car: &lt;em&gt;The driver stops by at the gas station and gets his mobile device to take note about odometer value, supplied fuel amount , price of fuel, gas station name, and the current date. Later on the driver needs to recover such data.&lt;/em&gt; This is a data collector, and Diamond Powder can help you to do so. &lt;/p&gt;&lt;p&gt;Your MIDP application could go further, doing some math with such data, plotting charts, sending it over the internet and the like, but this is up to you.&lt;br /&gt;&lt;/p&gt;&lt;h4 style="background-color: rgb(153, 0, 0);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;How does it work ?&lt;/span&gt;&lt;br /&gt;&lt;/h4&gt;Read this step-by-step and the glossary bellow:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Define a Schema&lt;/li&gt;&lt;li&gt;Create a Collector suppling with a display, a schema and a flow name&lt;/li&gt;&lt;li&gt;Add regular LCDUI commands to the collector&lt;/li&gt;&lt;ol&gt;&lt;li&gt;at least an OK Command, and a BACK Command&lt;/li&gt;&lt;li&gt;other Commands can be provided&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Swicht the MIDlet display to the Collector&lt;/li&gt;&lt;li&gt;At the end of Colletor´s job you may persist collected data with a StorageManager.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div style="font-weight: bold;" class="app" id="projecthome"&gt;Glossary: &lt;/div&gt;&lt;div class="app" id="projecthome"&gt;&lt;table class="axial" style="border-color: rgb(153, 0, 0); border-width: 1px;" align="left" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="background-color: rgb(153, 0, 0);"&gt;&lt;p&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;strong&gt;term&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background-color: rgb(153, 0, 0);"&gt;&lt;p&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;strong&gt;definition &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Schema&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;A Hashtable that describes the data collector fields, and its organization. &lt;/p&gt;&lt;p&gt;A schema contains a name, a version number, and at least one Flow.&lt;br /&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Flow&lt;/td&gt;&lt;td&gt;&lt;p&gt;A sequence pages that the application user can browse through.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Page&lt;/td&gt;&lt;td&gt;&lt;p&gt;A top level field container, to display to the user, as a data collector step.&lt;/p&gt;&lt;p&gt;Can be reused among flows.&lt;/p&gt;&lt;p&gt;Can be associated with a help screen. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Field&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Regular LCDUI items: StringItem, TextField, DateField, ChoiceGroup&lt;/p&gt;&lt;p&gt;+ Filter : a special component to deal with huge ChoiceGroups &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Collector&lt;/td&gt;&lt;td&gt;&lt;p&gt;A collector manages the display of a Flow of Pages, and gathers all user input.&lt;/p&gt;&lt;p&gt;It extends LCDUI Form. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;StorageManager&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;It is the Diamond Powder persistence component. &lt;/p&gt;&lt;p&gt;It helps to preserve user input data gathered by a Collector into RMS records.&lt;/p&gt;&lt;p&gt;It also helps to restore a Collector with previously saved RMS records. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="app" id="projecthome"&gt;&lt;p&gt; &lt;/p&gt;&lt;p style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;NetBeans Plugin&lt;/span&gt;&lt;/p&gt; Now,  it´s time to talk about my collaboration in this project, if you get a look at this framework, you will realize that it simplifies a lot the development of a data collector on java me.&lt;br /&gt;&lt;br /&gt;On the other hand, the heart of the framework, the "Schema", as stated in the glossary, it is a Hashtable that describes the data collector fields, flow, name and version of your application. Let´s see on listing 1, a snippet of the schema code from the hello world example, extracted from diamond powder blog.&lt;br /&gt;&lt;blockquote&gt;  public Hashtable getSchema() {&lt;br /&gt;Hashtable schema = new Hashtable();&lt;br /&gt;&lt;br /&gt;//schema declaration:  name;version&lt;br /&gt;schema.put("schema", "fuelControl;2");&lt;br /&gt;//flow declaration: page1;page2;...&lt;br /&gt;schema.put("flow.basicRecord", "numbers;extra");&lt;br /&gt;//page declaration: title;field1;field2;...&lt;br /&gt;schema.put("page.numbers", "The Numbers;date;odometer;fuelAmount;fuelPrice");&lt;br /&gt;schema.put("page.extra", "Gas Station;gasStationName;gasStationBrand");&lt;br /&gt;//help for page: help text&lt;br /&gt;schema.put("help.numbers", "Enter the odometer mark, the supplied fuel amount and the fuel price");&lt;br /&gt;schema.put("help.extra", "Enter the gas station name and brand");&lt;br /&gt;&lt;br /&gt;//text field declaration: field type;label;size;mask&lt;br /&gt;schema.put("field.odometer","textfield;odometer;6;numeric");&lt;br /&gt;schema.put("field.fuelAmount","textfield;fuel amount;5;decimal");&lt;br /&gt;schema.put("field.fuelPrice","textfield;fuel price;5;decimal");&lt;br /&gt;// dateField;label;{date|time|date_time}"&lt;br /&gt;schema.put("field.date","datefield;when;date_time");&lt;br /&gt;schema.put("field.gasStationName","textfield;gas station;40;initial_caps_word");&lt;br /&gt;&lt;br /&gt;//choice gorup declaration: field type;label;list model;mode&lt;br /&gt;schema.put("field.gasStationBrand",&lt;br /&gt;               "choicegroup;brand;allBrands;exclusive");&lt;br /&gt;//list model declaration: value1;label1;value2;label2;...&lt;br /&gt;schema.put("listmodel.allBrands",&lt;br /&gt;               "999;undefined;1;Atlantic;2;Chevron;3;Esso;4;Texaco");&lt;br /&gt;&lt;br /&gt;return schema;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Listing 1:&lt;/span&gt; Schema method example.&lt;br /&gt;&lt;br /&gt;As you can see in the example, it can be a problem if you want a more complex application, as your schema evolves it can became inconvenient and error-prone, as you add more fields, or even new pages.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/span&gt;Diamond Powder for NetBeans it´s a plugin, that comes to fill this gap, and helps to create a Schema code, avoiding spelling error in variable names. Now let´s see how to install it.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Download and Installation&lt;/span&gt;&lt;br /&gt;To install Diamond Powder for NetBeans, you can visit plugin Portal on NetBeans website, or you can download it directly from java.net site project. The easiest way to download it, is directly from NetBeans,&lt;br /&gt;To install DP from NetBeans, select "Tools &gt; Plugins", open the Setting category and click Add button, in Name field enter "Diamond Powder", and URL enter "&lt;a href="https://diamond-powder.dev.java.net/files/documents/9072/108868/updates.xml"&gt;https://diamond-powder.dev.java.net/files/documents/9072/108868/updates.xml&lt;/a&gt;", and click OK to create a new Update Center source.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6CJaDmsVepU/Scf74G1FQyI/AAAAAAAAAfo/OtYhgQNW-Ww/s1600-h/Figure1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 246px;" src="http://3.bp.blogspot.com/_6CJaDmsVepU/Scf74G1FQyI/AAAAAAAAAfo/OtYhgQNW-Ww/s320/Figure1.jpg" alt="" id="BLOGGER_PHOTO_ID_5316494826458661666" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Figure 1:&lt;/span&gt; Configuration of Update Centers.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Now, to install the plugin, select "Available Plugins" category and install the Diamond Powder plugin, during instalation it will generate a warning, stating that the module is not signed, but it´s ok..&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Generating the Schema&lt;/span&gt;&lt;br /&gt;There are two ways to create a schema, creating a new file, selecting "New File &gt; MIDP &gt; Diamond Powder - Schema Generator" from a Java ME Project, or you can invoke Diamond Powder wizard from the source code editor, selecting menu popup "Refactor &gt; Diamond Powder - Schema Generator"..&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6CJaDmsVepU/Scf8CcTNG-I/AAAAAAAAAfw/Iqyq04_97VI/s1600-h/Figure2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 237px;" src="http://4.bp.blogspot.com/_6CJaDmsVepU/Scf8CcTNG-I/AAAAAAAAAfw/Iqyq04_97VI/s320/Figure2.jpg" alt="" id="BLOGGER_PHOTO_ID_5316495004020841442" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Figure 2:&lt;/span&gt; Creating a new Schema file&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Start by creating a Diamond Powder Schema file, as shown in Figure 3. Let´s create the schema defined in listing 1, so name the schema "fuelControl", set version 2 and click next to go the panel shown in Figure 4:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6CJaDmsVepU/Scf8MZnGFMI/AAAAAAAAAf4/8JUUQrmhAI4/s1600-h/Figure3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 215px;" src="http://1.bp.blogspot.com/_6CJaDmsVepU/Scf8MZnGFMI/AAAAAAAAAf4/8JUUQrmhAI4/s320/Figure3.jpg" alt="" id="BLOGGER_PHOTO_ID_5316495175097652418" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Figure 3: &lt;/span&gt;Naming the Schema file.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Here we can define our application fields, , let´s define the odometer, fuelAmount, fuelPrice, date, gasStationName and gasStationBrand. Note, that for gastStationBrand is a choicegroup field, to define our list values, click the Editor button, and create the list model defined in Figure 5.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6CJaDmsVepU/Scf8Z2xm_0I/AAAAAAAAAgA/mWCGw2mWe3g/s1600-h/Figure4.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 242px;" src="http://3.bp.blogspot.com/_6CJaDmsVepU/Scf8Z2xm_0I/AAAAAAAAAgA/mWCGw2mWe3g/s320/Figure4.jpg" alt="" id="BLOGGER_PHOTO_ID_5316495406264680258" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Figure 4:&lt;/span&gt; Fields Configuration&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Enter "allBrands" to List Model and click New Button, to include a value to the allBrands list model, select it in the list and click Add button, to cancel an item just click cancel, and to finish it, close the window.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6CJaDmsVepU/Scf8i4H6ZEI/AAAAAAAAAgI/6U2eVnj4XiA/s1600-h/Figure5.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 260px;" src="http://3.bp.blogspot.com/_6CJaDmsVepU/Scf8i4H6ZEI/AAAAAAAAAgI/6U2eVnj4XiA/s320/Figure5.jpg" alt="" id="BLOGGER_PHOTO_ID_5316495561245484098" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Figure 5:&lt;/span&gt; List Model editor.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;In the Pages Configuration step, let´s create our pages number and extra adding the related fields and entering the properly information like page name, title and help, like Figure 6.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6CJaDmsVepU/Scf8skdSAgI/AAAAAAAAAgQ/_5HW9aX-yoE/s1600-h/Figure6.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 251px;" src="http://2.bp.blogspot.com/_6CJaDmsVepU/Scf8skdSAgI/AAAAAAAAAgQ/_5HW9aX-yoE/s320/Figure6.jpg" alt="" id="BLOGGER_PHOTO_ID_5316495727765094914" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Figure 6:&lt;/span&gt; Pages Configuration.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Click Next to our final step, now we going to define the sequence pages that our application will browse through. Enter basicRecord for Flow Name, and add the two pages created earlier (Figure 7).&lt;br /&gt;Check the "Save to File?" option and click browser, this option will persist all fields created to an user defined file.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6CJaDmsVepU/Scf80wZkcJI/AAAAAAAAAgY/-7xoz1Z9NXE/s1600-h/Figure7.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 245px;" src="http://1.bp.blogspot.com/_6CJaDmsVepU/Scf80wZkcJI/AAAAAAAAAgY/-7xoz1Z9NXE/s320/Figure7.jpg" alt="" id="BLOGGER_PHOTO_ID_5316495868409704594" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Figure 7:&lt;/span&gt; Flow Definition.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Note: You can retrieve these values, loading the file in the Fields Configuration step (see Figure 4).&lt;br /&gt;&lt;br /&gt;Click Finish to generate the schema class. After generation, you should see the Java class, Schema, in the hello.schema package.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;References:&lt;/span&gt;&lt;br /&gt;Diamond Powder (java.net): &lt;a href="https://diamond-powder.dev.java.net/"&gt;https://diamond-powder.dev.java.net/&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Diamond Powder Blog: &lt;a href="http://diamond-powder.blogspot.com/"&gt;http://diamond-powder.blogspot.com/&lt;/a&gt;&lt;br /&gt;NetBeans Plugin: &lt;a href="http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=17094"&gt;http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=17094&lt;/a&gt;&lt;br /&gt;NetBeans: &lt;a href="http://www.netbeans.org/"&gt;http://www.netbeans.org/&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Try it !!&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-32670099651378240?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/32670099651378240/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=32670099651378240' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/32670099651378240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/32670099651378240'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2009/03/diamond-powder-for-netbeans.html' title='Diamond Powder for NetBeans'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6CJaDmsVepU/ScfLGb7jmaI/AAAAAAAAAfg/oN059WR6vak/s72-c/DP.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-3167054862767518499</id><published>2009-03-19T23:56:00.007-03:00</published><updated>2009-03-20T11:50:22.217-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Globalcode'/><category scheme='http://www.blogger.com/atom/ns#' term='Eventos'/><category scheme='http://www.blogger.com/atom/ns#' term='Java Básico'/><title type='text'>[Profissão Java] Como me dei bem com Java</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6CJaDmsVepU/ScMIzJ1BsKI/AAAAAAAAAew/SetDxWxsfYE/s1600-h/f_top_site_proJava.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 89px;" src="http://3.bp.blogspot.com/_6CJaDmsVepU/ScMIzJ1BsKI/AAAAAAAAAew/SetDxWxsfYE/s400/f_top_site_proJava.jpg" alt="" id="BLOGGER_PHOTO_ID_5315101660131995810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;No dia 07/03 ocorreu nas instalações da Faculdade Anhembi Morumbi, o evento Profissão Java, promovido pela Globalcode. Tive o prazer de participar deste encontro, ver grandes amigos, e contar um pouco da minha trajetória ..&lt;br /&gt;&lt;br /&gt;Como sempre acontece nos eventos da Globalcode, o clima estava super bacana, a platéia estava bem animada, o pessoal bem interessado, percebi que o público, era um público jovem, que estão buscando conhecimento, e isto é muito importante.&lt;br /&gt;&lt;br /&gt;Quando fui convidado para participar do quadro "Como me dei bem com Java", a primeira coisa que pensei foi "Puxa, mas será que me dei bem com Java ?", pois logo vem a minha mente os problemas cotidianos, e tal,.. não sei se me dei bem, mas graças a Deus consegui até o presente momento atingir minhas metas e objetivos profissionais. E junto com o crescimento profissional, vem as responsabilidades, e com certeza, para se dar bem em alguma coisa, é preciso ter maturidade e gostar muito do que faz, e nada melhor do que a experiência para alcançar a maturidade.&lt;br /&gt;&lt;br /&gt;É assim que aconteceu com as metodologias de desenvolvimento, é assim que aconteceu com as linguagens de programação, é assim que aconteceu com as grandes empresas, com os grandes projetos, enfim, é assim que acontece na nossa vida..&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6CJaDmsVepU/ScMOf5a8sdI/AAAAAAAAAfY/UPCe7MPB3cM/s1600-h/IMG_1173.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_6CJaDmsVepU/ScMOf5a8sdI/AAAAAAAAAfY/UPCe7MPB3cM/s320/IMG_1173.jpg" alt="" id="BLOGGER_PHOTO_ID_5315107926379901394" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Quando estamos iniciando a nossa carreira, são muitas as dificuldades que encontramos, a principio elas são técnicas, depois percebemos que conforme o tempo passa, não basta apenas o técnico, temos que ter outras habilidades para nos dar bem em uma empresa. Como:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Foco.&lt;/li&gt;&lt;li&gt; Entendimento do negócio.&lt;/li&gt;&lt;li&gt; Domínio das ferramentas.&lt;/li&gt;&lt;li&gt; Bom relacionamento com o cliente, ou entender o cliente (tudo bem, concordo que isto é uma arte).&lt;/li&gt;&lt;li&gt; Comprometimento.&lt;/li&gt;&lt;li&gt; Responsabilidade.&lt;/li&gt;&lt;li&gt; Ser auto-didata.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Na minha palestra, procurei dar várias dicas e orientações para os que estão iniciando e para os mais experientes que que querem progredir seus conhecimentos.&lt;br /&gt;&lt;br /&gt;Nos slides abaixo mostro os passos necessários, onde deixei grandes dicas de livros, sites, feeds, etc... tipo um roadmap para o sucesso.&lt;br /&gt;&lt;br /&gt;&lt;div style="width: 425px; text-align: left;" id="__ss_1172141"&gt;&lt;a style="margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;" href="http://www.slideshare.net/wrsantos/como-me-dei-bem-com-java?type=presentation" title="Como me dei bem com Java"&gt;Como me dei bem com Java&lt;/a&gt;&lt;object style="margin: 0px;" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=profissaojava3-wagner-090319220256-phpapp01&amp;amp;stripped_title=como-me-dei-bem-com-java"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=profissaojava3-wagner-090319220256-phpapp01&amp;amp;stripped_title=como-me-dei-bem-com-java" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"&gt;View more &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/wrsantos"&gt;wrsantos&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Basicamente, os passos que listei seguem a seguinte ordem, não necessariamente desse jeito, para a apresentação preferi fazer algo do tipo "Como você se dar bem com Java" ;). Então vamos lá:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1º Passo: Treinamentos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para quem está começando, é super importante fazer treinamentos, por mais auto didata que você seja, o desafio é grande, e a curva se torna menor. Talvez compense mais você pagar por um bom treinamento  (no meu caso fiz as 3 academias da Globalcode), do que tentar aprender tudo sozinho.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2º Passo: Certificações&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Após fazer os treinamentos, se estes forem focados no core java (Java SE), e o desejo de ingressar no mercado de trabalho é grande, então, recomendo as certificações, invista em certificações, pois o investimento não é alto quanto uma faculdade e o retorno é rápido, é desejável que o estudante esteja cursando nível superior.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3º Passo: Livros Essenciais&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Tendo conhecimento em Java e certicação, que tal aumentar o seu conhecimento? Segue uma lista de livros básicos em qualquer acervo de um programador.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;  &lt;span style="font-style: italic;"&gt;Effective Java 2º Edition&lt;/span&gt; - Esse é um clássico, todo desenvolvedor tem a obrigação de ler este livro.&lt;/li&gt;&lt;li&gt;  &lt;span style="font-style: italic;"&gt;Java Concurrency in Practice&lt;/span&gt; - Com o advento de super processadores multi core, é conhecimento em Threads é um grande diferencial.&lt;/li&gt;&lt;li&gt;  Todos os livros de Padrões de Projeto.&lt;/li&gt;&lt;li&gt;  &lt;span style="font-style: italic;"&gt;Patterns of Enterprise Application Architecture&lt;/span&gt; - Clássico da arquitetura de software, pelo tio Fowler, já ouviu falar de Domain Model, Active Record ?&lt;/li&gt;&lt;li&gt;  &lt;span style="font-style: italic;"&gt;Design Patterns - Elements of reusable OO Software&lt;/span&gt; - GoF, este não precisa de maiores comentários, porém, os exemplos estão em C++, se não for sua praia ou não quiser se arriscar, tente Head First - Design Patterns.&lt;/li&gt;&lt;li&gt;  &lt;span style="font-style: italic;"&gt;Core J2EE Patterns&lt;/span&gt; - Tá certo que grande parte dos padrões perdeu o sentido, pois muitos destes padrões os frameworks de hoje em dia já resolvem, mas ainda assim é uma ótima leitura.&lt;/li&gt;&lt;li&gt;  &lt;span style="font-style: italic;"&gt;Agile Software Development&lt;/span&gt; - Este livro também é um pouco antigo, mas é uma ótima referência, pois Robert C. Martin propõe o uso dos padrões em um ambiente ágil.&lt;/li&gt;&lt;li&gt;  &lt;span style="font-style: italic;"&gt;The Pragmatic Programmer&lt;/span&gt; - Ótimas dicas, para se tornar um ótimo programador.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4º Passo: Eventos:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sempre que tiver a oportunidade de ir a algum evento, vá !!! Mesmo que te chamem de nerd, nos eventos você conhece novas pessoas, que passam ou passaram pelos mesmos problemas que você.&lt;br /&gt;É uma chance de fazer network, trocar experiências, e conhecer novas tecnologias e tendências.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5º Passo: Por dentro das últimas.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Acesse os sites "quentes" de tecnologia, e seja o primeiro a comentar sobre novas tecnologias na sua turma.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;InfoQ&lt;/span&gt; - &lt;a href="http://www.infoq.com/"&gt;http://www.infoq.com/&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The Server Side&lt;/span&gt; - &lt;a href="http://www.theserverside.com/"&gt;http://www.theserverside.com/&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;DZone Java&lt;/span&gt; -&lt;a href="http://www.dzone.com/"&gt; http://www.dzone.com/&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Java Sun&lt;/span&gt; -&lt;a href="http://java.sun.com/"&gt; http://java.sun.com/&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;java.net&lt;/span&gt; - &lt;a href="http://www.java.net/"&gt;http://www.java.net/&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;NetFeijão Brazil&lt;/span&gt; - &lt;a href="http://netfeijao.blogspot.com/"&gt;http://netfeijao.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; 6º Passo: Open Source.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Esse é o mais importante, pois é aqui que você vai colocar em prática tudo o que você aprendeu.&lt;br /&gt;Participe de projetos open, entre no site java.net existem projetos de grande expressão, inclusive o Open JDK, GlassFish, e diversos projetos menores, além de aprender com os melhores desenvolvedores do mercado, é uma ótima chance de fazer Networking.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; 7º Outras dicas: Conhece outras áreas da sua empresa&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Aprenda um pouco a área de infra-estrutura da sua empresa, as vezes ao falarmos de projeto, somente pensamos no bitcode, lembre-se que para suportar tudo isto, existem servidores, load balancing, memória, disco, cpu, etc. ..  procure conhecer um pouco áreas como:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Rede&lt;/li&gt;&lt;li&gt; Telecomunicações&lt;/li&gt;&lt;li&gt; Sistemas Operacionais&lt;/li&gt;&lt;li&gt; Banco de Dados&lt;/li&gt;&lt;li&gt; Segurança&lt;/li&gt;&lt;/ul&gt; &lt;blockquote style="font-style: italic;"&gt;Lembre-se que por trás de um grande sistema, existe uma grande infra-estrutura.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; 8º Outras dicas 2: Super Feeds.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Feeds, Se você conhece Google Reader, ótimo, senão, conheça, e adicione os seguintes feeds na sua lista.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt; Java Posse:&lt;/span&gt; &lt;a href="http://feeds.feedburner.com/javaposse"&gt;http://feeds.feedburner.com/javaposse&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Java Specialists:&lt;/span&gt; &lt;a href="http://www.javaspecialists.eu/archive/tjsn.rss"&gt;http://www.javaspecialists.eu/archive/tjsn.rss&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;O'Reilly News:&lt;/span&gt; &lt;a href="http://feeds2.feedburner.com/oreilly/java?format=rss2"&gt;http://feeds2.feedburner.com/oreilly/java?format=rss2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Core Java:&lt;/span&gt; &lt;a href="http://blogs.sun.com/CoreJavaTechTips/feed/entries/atom"&gt;http://blogs.sun.com/CoreJavaTechTips/feed/entries/atom&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Martin Fowler:&lt;/span&gt; &lt;a href="http://martinfowler.com/bliki/bliki.rss"&gt;http://martinfowler.com/bliki/bliki.rss&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Agile:&lt;/span&gt; &lt;a href="http://leadinganswers.typepad.com/leading_answers/atom.xml"&gt;http://leadinganswers.typepad.com/leading_answers/atom.xml&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Artima:&lt;/span&gt; &lt;a href="http://www.artima.com/spotlight/feeds/spotlight.rss"&gt;http://www.artima.com/spotlight/feeds/spotlight.rss&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;DZone Java:&lt;/span&gt; &lt;a href="http://www.dzone.com/links/feed/frontpage/java/rss.xml"&gt;http://www.dzone.com/links/feed/frontpage/java/rss.xml&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;br /&gt;Deixo aqui os meus parabéns para a equipe da Globalcode, que vem trabalhando à anos com o projeto Open 4 Education, realizando eventos de altíssima qualidade, mini cursos, treinamentos, projetos, e o melhor, é tudo de GRAÇA!!&lt;br /&gt;&lt;br /&gt;Bom, acho que é isso aí, com tudo isso dá para ganhar algumas horinhas..&lt;br /&gt;&lt;br /&gt;Diversão garantida !!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-3167054862767518499?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/3167054862767518499/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=3167054862767518499' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/3167054862767518499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/3167054862767518499'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2009/03/profissao-java-como-me-dei-bem-java.html' title='[Profissão Java] Como me dei bem com Java'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6CJaDmsVepU/ScMIzJ1BsKI/AAAAAAAAAew/SetDxWxsfYE/s72-c/f_top_site_proJava.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-1665686851935257119</id><published>2008-11-11T23:51:00.018-02:00</published><updated>2009-03-25T11:10:30.757-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Globalcode'/><category scheme='http://www.blogger.com/atom/ns#' term='Eventos'/><category scheme='http://www.blogger.com/atom/ns#' term='Yahoo'/><category scheme='http://www.blogger.com/atom/ns#' term='Projetos'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Yahoo! Hack Day 2008 Brasil - Bridging The Gap</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6CJaDmsVepU/SRo529r8RTI/AAAAAAAAAdE/N-mFRg44-Fc/s1600-h/header_blog_brhackday.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 105px;" src="http://4.bp.blogspot.com/_6CJaDmsVepU/SRo529r8RTI/AAAAAAAAAdE/N-mFRg44-Fc/s400/header_blog_brhackday.gif" alt="" id="BLOGGER_PHOTO_ID_5267586330597803314" border="0" /&gt;&lt;/a&gt;  In this weekend, we have celebrated the first Yahoo! Open Hack in Brazil, it was a great party in fact, the lunch was great, people were taking there time and having fun !!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6CJaDmsVepU/SRpAMurn-xI/AAAAAAAAAdM/tlUPGvLtZ_M/s1600-h/yahoo+hack+day08-5.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 201px;" src="http://2.bp.blogspot.com/_6CJaDmsVepU/SRpAMurn-xI/AAAAAAAAAdM/tlUPGvLtZ_M/s320/yahoo+hack+day08-5.jpg" alt="" id="BLOGGER_PHOTO_ID_5267593301596830482" border="0" /&gt;&lt;/a&gt;I can consider myself a luck guy, i was invited to join the &lt;a href="http://www.globalcode.com.br/"&gt;Globalcode&lt;/a&gt; Team, with my friends Vinicius Senger, Yara Senger,  Eder Magalhães, Rafael Nunes, Pedro Germano, and a couple of Globalcode classmates =) ..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:78%;" &gt;Caption: NetBeans plugin presentation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6CJaDmsVepU/SRttUFyVpFI/AAAAAAAAAd8/g25c_3NZ0ZU/s1600-h/yahoo+hackday08-13.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 206px;" src="http://3.bp.blogspot.com/_6CJaDmsVepU/SRttUFyVpFI/AAAAAAAAAd8/g25c_3NZ0ZU/s320/yahoo+hackday08-13.jpg" alt="" id="BLOGGER_PHOTO_ID_5267924381058049106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;We have divided the work into team groups and as a result we have produced &lt;span style="font-weight: bold;"&gt;FOUR&lt;/span&gt; incredible hacks, yes man, i said four great hacks.. See below:&lt;br /&gt;---------------------------------------------&lt;br /&gt;&lt;ol style="text-align: justify;"&gt;&lt;li&gt;NetBeans Plugin for Yahoo! Blueprint&lt;/li&gt;&lt;li&gt;JSF Renderkit for Yahoo! Blueprint&lt;/li&gt;&lt;li&gt;Mobile Planning Poker for distributed Teams&lt;/li&gt;&lt;li&gt;Supercrud Mashup for Flickr&lt;/li&gt;&lt;/ol&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6CJaDmsVepU/SRts4yDKr-I/AAAAAAAAAd0/UN7Z7_MNQYU/s1600-h/yahoo+hackday+08-12.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 213px;" src="http://3.bp.blogspot.com/_6CJaDmsVepU/SRts4yDKr-I/AAAAAAAAAd0/UN7Z7_MNQYU/s320/yahoo+hackday+08-12.jpg" alt="" id="BLOGGER_PHOTO_ID_5267923911903457250" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.globalcode.com.br/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 171px; height: 93px;" src="http://2.bp.blogspot.com/_6CJaDmsVepU/SRtsLPyIQiI/AAAAAAAAAds/O5ssIEfuwu0/s320/global_code.jpg" alt="" id="BLOGGER_PHOTO_ID_5267923129611076130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;span style="font-weight: bold;font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Caption: Eder presenting the Planning poker mobile&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6CJaDmsVepU/SRwTiA3j0PI/AAAAAAAAAeE/5nyKjZ0xmeQ/s1600-h/hackday8.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 252px; height: 190px;" src="http://2.bp.blogspot.com/_6CJaDmsVepU/SRwTiA3j0PI/AAAAAAAAAeE/5nyKjZ0xmeQ/s320/hackday8.jpg" alt="" id="BLOGGER_PHOTO_ID_5268107139186151666" border="0" /&gt;&lt;/a&gt;Obviously, my participation was related to the NetBeans plugin development =), it provides a template for Yahoo Blueprint Web Project, a sample application for Yahoo Blueprint, a JBlueprint librarie that encapsulates the Yahoo! Blueprint' API components (developed by Eder Magalhães), some Help Documents, an Update Center and the Developers Guide pdf file inside NetBeans.. =)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6CJaDmsVepU/SRpAseecOTI/AAAAAAAAAdU/RqJ433UjW58/s1600-h/yahoo-hackday08.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 266px;" src="http://2.bp.blogspot.com/_6CJaDmsVepU/SRpAseecOTI/AAAAAAAAAdU/RqJ433UjW58/s400/yahoo-hackday08.jpg" alt="" id="BLOGGER_PHOTO_ID_5267593847002380594" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:78%;"&gt;Caption: Award on "Bridging the Gap" Category&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Our subject wasn't the prize only, our real intention was to build something useful for Java Developers, and make the work with Yahoo APIs easier with the NetBeans plugin and JSF Renderkit, we are planning open the code on java.net soon and attract new developers to this great platform. so stay tunned for more details !!!&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6CJaDmsVepU/SRpBQctJB7I/AAAAAAAAAdc/jgAj78s3LXY/s1600-h/yahoohackday08-2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 266px;" src="http://3.bp.blogspot.com/_6CJaDmsVepU/SRpBQctJB7I/AAAAAAAAAdc/jgAj78s3LXY/s400/yahoohackday08-2.jpg" alt="" id="BLOGGER_PHOTO_ID_5267594465002457010" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:78%;"&gt;Caption: Globalcode "Super" Team &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6CJaDmsVepU/SRpB0S71Y3I/AAAAAAAAAdk/KRkLJS-z8H0/s1600-h/yahoo+hackday-04jpg.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 266px;" src="http://3.bp.blogspot.com/_6CJaDmsVepU/SRpB0S71Y3I/AAAAAAAAAdk/KRkLJS-z8H0/s400/yahoo+hackday-04jpg.jpg" alt="" id="BLOGGER_PHOTO_ID_5267595080855020402" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:78%;"&gt;Caption: Globalcode Team and some friends from São Carlos&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;Congratulations for all the winners. It’s really amazing to see these great and wonderful work .. you are the best !!&lt;br /&gt;&lt;br /&gt;See more details at &lt;a href="http://developer.yahoo.net/blog/archives/2008/11/oi_open_hack_da.html"&gt;Yahoo! Developer Network blog by Chris Heilmann&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/q-HRo1_RzfI&amp;amp;hl=pt-br&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/q-HRo1_RzfI&amp;amp;hl=pt-br&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-size:78%;"&gt;Caption: NetBeans Plugin Presentation&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;One of the best moments, was the Puff Hacking Video,, see for yourself&lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="225"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=2199324&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1"&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=2199324&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/2199324"&gt;Puff Hacking&lt;/a&gt; from &lt;a href="http://vimeo.com/fcz"&gt;fczuardi&lt;/a&gt; on &lt;a href="http://vimeo.com/"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Cheers, and we see you again next year !!!!&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-1665686851935257119?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/1665686851935257119/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=1665686851935257119' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/1665686851935257119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/1665686851935257119'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2008/11/yahoo-hack-day-2008-bridging-gap.html' title='Yahoo! Hack Day 2008 Brasil - Bridging The Gap'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6CJaDmsVepU/SRo529r8RTI/AAAAAAAAAdE/N-mFRg44-Fc/s72-c/header_blog_brhackday.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-7615834852557103044</id><published>2008-11-09T21:43:00.008-02:00</published><updated>2008-11-09T23:29:06.886-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eventos'/><category scheme='http://www.blogger.com/atom/ns#' term='InfoQ'/><category scheme='http://www.blogger.com/atom/ns#' term='Arquitetura'/><title type='text'>Evento InfoQ Brasil</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6CJaDmsVepU/SRd7DxeOeAI/AAAAAAAAAcU/Bvi6FPRHcPk/s1600-h/%C3%8CnfoQ+Brasil.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 249px; height: 100px;" src="http://3.bp.blogspot.com/_6CJaDmsVepU/SRd7DxeOeAI/AAAAAAAAAcU/Bvi6FPRHcPk/s320/%C3%8CnfoQ+Brasil.gif" alt="" id="BLOGGER_PHOTO_ID_5266813593983023106" border="0" /&gt;&lt;/a&gt;No dia 01/11/2008 rolou o evento de inauguração do Portal &lt;a href="http://www.infoq.com/br/"&gt;InfoQ Brasil&lt;/a&gt;, nas palavras do meu amigo &lt;a href="http://www.visaoagil.com/"&gt;Manoel Pimentel&lt;/a&gt;,&lt;br /&gt;&lt;p&gt;"&lt;span style="font-style: italic;"&gt;Agora a comunidade Brasileira de desenvolvimento de software, possui um importante aliado de nível internacional, pois já está no ar, a versão Brasileira do portal &lt;/span&gt;&lt;b style="font-style: italic;"&gt;InfoQ&lt;/b&gt;&lt;span style="font-style: italic;"&gt;, que trata com maestria de assuntos como &lt;/span&gt;&lt;b style="font-style: italic;"&gt;Java&lt;/b&gt;&lt;span style="font-style: italic;"&gt;, .&lt;/span&gt;&lt;b style="font-style: italic;"&gt;NET&lt;/b&gt;&lt;span style="font-style: italic;"&gt;, &lt;/span&gt;&lt;b style="font-style: italic;"&gt;Ruby&lt;/b&gt;&lt;span style="font-style: italic;"&gt;, &lt;/span&gt;&lt;b style="font-style: italic;"&gt;SOA&lt;/b&gt;&lt;span style="font-style: italic;"&gt;,  &lt;/span&gt;&lt;b style="font-style: italic;"&gt;Agi&lt;/b&gt;&lt;b style="font-style: italic;"&gt;le&lt;/b&gt;&lt;span style="font-style: italic;"&gt; e &lt;/span&gt;&lt;b style="font-style: italic;"&gt;Arquitetura&lt;/b&gt;&lt;span style="font-style: italic;"&gt;.&lt;/span&gt;&lt;/p&gt; &lt;p style="font-style: italic;"&gt;Com o nome de &lt;b&gt;InfoQ Brasil&lt;/b&gt;, este projeto está sendo possível através da empresa &lt;a href="http://www.fratech.net/"&gt;&lt;b&gt;Fratech It&lt;/b&gt; &lt;/a&gt;e com uma enorme participação da comunidade Brasileira, pois através de um mega projeto com equipes distribuídas, reunimos vários autores e editores do portal, com a meta de traduzir vários artigos, notícias e um importante livro sobre Scrum e XP para o português.&lt;/p&gt; &lt;p style="font-style: italic;"&gt;Como marco desse acontecimento histórico para o Brasil, no sábado passado, dia 01 de novembro de 2008, realizamos o &lt;b&gt;InfoQ Launch Meeting &lt;/b&gt;&lt;span style=""&gt;(Encontro de Lançamento)&lt;/span&gt;,  no auditório da Faculdade &lt;b&gt;Anhembi Morumbi &lt;/b&gt;em  São Paulo(SP), com o importante patrocínio da &lt;a href="http://www.locaweb.com.br/"&gt;&lt;b&gt;Locaweb&lt;/b&gt;&lt;/a&gt; e do &lt;a href="http://jcp.org/"&gt;&lt;b&gt;JCP&lt;/b&gt;&lt;/a&gt; (Java Community Process) e com o apoio da empresa &lt;a href="http://www.teamware.com.br/"&gt;&lt;b&gt;Teamware&lt;/b&gt;&lt;/a&gt;, &lt;b&gt;&lt;a href="http://www.ibm.com/developerworks"&gt;DeveloperWorks&lt;/a&gt; &lt;/b&gt;&lt;span style=""&gt;e claro, com  uma grande participação da comunidade Brasileira.&lt;/span&gt;&lt;/p&gt; &lt;p style="font-style: italic;"&gt;O evento contou com dois palestrantes internacionais de peso, pois tivemos o&lt;b&gt; Max Lanfranconi,&lt;/b&gt;&lt;span style=""&gt; Gerente de Marketing do &lt;/span&gt;&lt;b&gt;JCP&lt;/b&gt;&lt;span style=""&gt; e  &lt;/span&gt;&lt;b&gt;Floyd Marinesco&lt;/b&gt;&lt;span style=""&gt;, CEO e fundador da &lt;/span&gt;&lt;b&gt;InfoQ&lt;/b&gt;&lt;span style=""&gt; internacional.&lt;/span&gt;&lt;/p&gt; &lt;p style="font-style: italic;"&gt;Também tivemos ótimas palestras, feitas por grandes nomes de nossa comunidade nacional como  &lt;b&gt;Giovanni Bassi&lt;/b&gt;&lt;span style=""&gt;, &lt;/span&gt;&lt;b&gt;Fábio Akita&lt;/b&gt;&lt;span style=""&gt;, &lt;/span&gt;&lt;b&gt;Henry Conceição&lt;/b&gt;&lt;span style=""&gt;, &lt;/span&gt;&lt;b&gt;Vinícius Senger&lt;/b&gt;&lt;span style=""&gt;,  &lt;/span&gt;&lt;b&gt;Alexandre Gomes&lt;/b&gt;&lt;span style=""&gt;,  &lt;/span&gt;&lt;b&gt;Felipe Rodrigues&lt;/b&gt;&lt;span style=""&gt;, &lt;/span&gt;&lt;b&gt;Yara Senger&lt;/b&gt;&lt;span style=""&gt;, &lt;/span&gt;&lt;b&gt;Victor Hugo&lt;/b&gt;&lt;span style=""&gt;,  &lt;/span&gt;&lt;b&gt;Rodrigo Yoshima&lt;/b&gt;&lt;span style=""&gt;,  &lt;/span&gt;&lt;b&gt;Hugo Corbucci, &lt;/b&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;b&gt;Wagner Santos &lt;/b&gt;&lt;span style=""&gt;e&lt;/span&gt;&lt;b&gt; Manoel Pimentel&lt;/b&gt;&lt;span style=""&gt;, onde cada um deles, dentro de sua especialidade, falou sobre  Java, .NET, Ruby, SOA, Agile e Arquitetura.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-style: italic;"&gt;E no melhor estilo de uma &lt;/span&gt;&lt;a style="font-style: italic;" href="http://qconsf.com/sf2008/conference/"&gt;&lt;b&gt;QCon&lt;/b&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;, tivemos dois grandes painéis, um sobre &lt;/span&gt;&lt;b style="font-style: italic;"&gt;Plataformas distribuídas &lt;/b&gt;&lt;span style="font-style: italic;"&gt;e outro sobre &lt;/span&gt;&lt;b style="font-style: italic;"&gt;Agilidade no dia a dia&lt;/b&gt;&lt;span style=""&gt;&lt;span style="font-style: italic;"&gt;, que fizeram com que todo o público participasse de maneira ativa de ótimas discussões sobre esses dois temas.&lt;/span&gt;"&lt;/span&gt;&lt;/p&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6CJaDmsVepU/SReGQZNZfwI/AAAAAAAAAcs/J5-iO_3ArmQ/s1600-h/30092008154.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_6CJaDmsVepU/SReGQZNZfwI/AAAAAAAAAcs/J5-iO_3ArmQ/s320/30092008154.jpg" alt="" id="BLOGGER_PHOTO_ID_5266825905436196610" border="0" /&gt;&lt;/a&gt;Na minha palestra falei sobre arquitetura, explicando as suas origens, e o papel do arquiteto nos dias de hoje, as palestras tiveram uma duração de 30 minutos (algumas passaram o tempo, claro =) , e alguém perguntou,&lt;br /&gt;"Como falar de Arquitetura em 30 minutos ?", bom, para quem falou de EJB 3.1 e apresentou ainda uma DEMO em 5 minutos no &lt;a href="http://diamond-powder.blogspot.com/2008/10/sun-tech-days-2008.html"&gt;Lightining Talk do Sun Tech Days&lt;/a&gt; 2008 (Foto ao lado), 30 minutos é luxo.. =)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Segue abaixo minha apresentação, o upload foi feito gentilmente pelo Manoel,&lt;br /&gt;&lt;br /&gt;&lt;div style="width: 425px; text-align: left;" id="__ss_730701"&gt;&lt;a style="margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;" href="http://www.slideshare.net/manoelp/infoq-brasil-arquitetando-o-futuro-da-ti-por-wagner-santos-presentation?type=powerpoint" title="InfoQ Brasil -  Arquitetando o Futuro da TI - Por Wagner Santos"&gt;InfoQ Brasil -  Arquitetando o Futuro da TI - Por Wagner Santos&lt;/a&gt;&lt;object style="margin: 0px;" height="355" width="425"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=infoqarquitetando-do-futuro-da-ti-1226067069255861-8&amp;amp;stripped_title=infoq-brasil-arquitetando-o-futuro-da-ti-por-wagner-santos-presentation"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=infoqarquitetando-do-futuro-da-ti-1226067069255861-8&amp;amp;stripped_title=infoq-brasil-arquitetando-o-futuro-da-ti-por-wagner-santos-presentation" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="355" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"&gt;View SlideShare &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/manoelp/infoq-brasil-arquitetando-o-futuro-da-ti-por-wagner-santos-presentation?type=powerpoint" title="View InfoQ Brasil -  Arquitetando o Futuro da TI - Por Wagner Santos on SlideShare"&gt;presentation&lt;/a&gt; or &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/upload?type=powerpoint"&gt;Upload&lt;/a&gt; your own. (tags: &lt;a style="text-decoration: underline;" href="http://slideshare.net/tag/arquitetura"&gt;arquitetura&lt;/a&gt; &lt;a style="text-decoration: underline;" href="http://slideshare.net/tag/tend%C3%AAnias"&gt;tendênias&lt;/a&gt;)&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;E algumas fotos..&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6CJaDmsVepU/SRd5yuSbBYI/AAAAAAAAAcM/Pw3uk6HDcZI/s1600-h/PICT0534.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_6CJaDmsVepU/SRd5yuSbBYI/AAAAAAAAAcM/Pw3uk6HDcZI/s400/PICT0534.JPG" alt="" id="BLOGGER_PHOTO_ID_5266812201558803842" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6CJaDmsVepU/SRd94DCRqDI/AAAAAAAAAck/PS-Zw0k6Ji4/s1600-h/InfoQ+559+%287%29.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_6CJaDmsVepU/SRd94DCRqDI/AAAAAAAAAck/PS-Zw0k6Ji4/s320/InfoQ+559+%287%29.JPG" alt="" id="BLOGGER_PHOTO_ID_5266816691074082866" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;O evento fui muito bom, encontrei os editores, amigos, conheci novas pessoas, tive o prazer de conhecer Felipe Rodrigues, da Fratech, o simpático Max Lanfranconi , gerente de marketing JCP e o próprio Floyd Marinescu =)..&lt;br /&gt;&lt;br /&gt;Diversão Garantida !!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-7615834852557103044?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/7615834852557103044/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=7615834852557103044' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/7615834852557103044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/7615834852557103044'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2008/11/evento-infoq-brasil.html' title='Evento InfoQ Brasil'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6CJaDmsVepU/SRd7DxeOeAI/AAAAAAAAAcU/Bvi6FPRHcPk/s72-c/%C3%8CnfoQ+Brasil.gif' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-5233046705115931058</id><published>2008-10-21T23:03:00.004-02:00</published><updated>2008-10-21T23:59:44.947-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Parabéns NetBeans !!!!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6CJaDmsVepU/SP6Ipu4HbyI/AAAAAAAAAb0/yoEIXwbbF7M/s1600-h/logo-10y-nb-since1998-180.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_6CJaDmsVepU/SP6Ipu4HbyI/AAAAAAAAAb0/yoEIXwbbF7M/s400/logo-10y-nb-since1998-180.png" alt="" id="BLOGGER_PHOTO_ID_5259791665354731298" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Como muitos já sabem o NetBeans está completando 10 anos de vida, e como homenagem, cantamos parabéns em grupo na época do Sun Tech Days.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Segue o mico, quer dizer o vídeo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-a62a173c502293da" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v4.nonxt6.googlevideo.com/videoplayback?id%3Da62a173c502293da%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330448434%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D53D5A4DAFA0B5822EC3A26224FF2D39451F7B540.7ED7214FDD09A94E95A77208D4D8599F41C46605%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Da62a173c502293da%26offsetms%3D5000%26itag%3Dw160%26sigh%3Dk9XtbNhlUpG37CmdQY4p905M6dI&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v4.nonxt6.googlevideo.com/videoplayback?id%3Da62a173c502293da%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330448434%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D53D5A4DAFA0B5822EC3A26224FF2D39451F7B540.7ED7214FDD09A94E95A77208D4D8599F41C46605%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Da62a173c502293da%26offsetms%3D5000%26itag%3Dw160%26sigh%3Dk9XtbNhlUpG37CmdQY4p905M6dI&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;No vídeo gravado na churrascaria Jardineira Grill, estão presentes da esquerda para a direita, Renato Bellia e sua esposa, a esposa de um dos meus amigos, logo atrás dela eu e minha esposa, ao lado dela se encontra a minha grande amiga Janice Campbell, atrás dela, Jefferson Prestes e Michel Graciano, no centro Marcelo Castellani (de jaqueta preta), Mauricio "Maltron" Leal, atrás dele Vinicius Senger e Yara Senger, atrás deles, está Greg Sporar, e mais dois gringos da Sun, e logo após a esposa do Bruno com suas lindas filhas, atrás delas se encontra Henrique Meira e seu colega, e por último o JavaMan.&lt;br /&gt;&lt;br /&gt;Fonte do Vídeo: &lt;a href="http://www.netbeans.tv/on-the-road/Brazilian-Birthday-Song-400/"&gt;http://www.netbeans.tv/on-the-road/Brazilian-Birthday-Song-400/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Outra dessa só daqui a 10 anos... =)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;PARABÉNS NETBEANS !!!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-5233046705115931058?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='video/mp4' href='http://www.blogger.com/video-play.mp4?contentId=a62a173c502293da&amp;type=video%2Fmp4' length='0'/><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/5233046705115931058/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=5233046705115931058' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/5233046705115931058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/5233046705115931058'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2008/10/parabns-netbeans.html' title='Parabéns NetBeans !!!!'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6CJaDmsVepU/SP6Ipu4HbyI/AAAAAAAAAb0/yoEIXwbbF7M/s72-c/logo-10y-nb-since1998-180.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-1139795275864774194</id><published>2008-10-20T23:39:00.006-02:00</published><updated>2008-10-22T21:49:48.836-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eventos'/><category scheme='http://www.blogger.com/atom/ns#' term='InfoQ'/><title type='text'>Seja Bem Vindo InfoQ Brasil</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6CJaDmsVepU/SP06Im6d78I/AAAAAAAAAbk/MwGeFrye6eQ/s1600-h/InfoQ_Brasil.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_6CJaDmsVepU/SP06Im6d78I/AAAAAAAAAbk/MwGeFrye6eQ/s400/InfoQ_Brasil.png" alt="" id="BLOGGER_PHOTO_ID_5259423859397750722" border="0" /&gt;&lt;/a&gt; Agora está confirmado, e no dia 01 de Novembro já tem uma festa marcada, a &lt;a href="http://www.fratech.net/"&gt;Fratech&lt;/a&gt; realizará o evento de Lançamento do portal InfoQ Brasil.&lt;br /&gt;&lt;br /&gt;Para quem não conhece, o site &lt;a href="http://www.infoq.com/"&gt;InfoQ &lt;/a&gt;criado e fundado por Floyd Marinescu, o mesmo criador do theserverside, é considerado um dos maiores portais do mundo sobre tecnologia, com diversos artigos técnicos de altíssima qualidade, com material criado por personalidades como Martin Fowler, Joshua Bloch, está chegando ao Brasil com tudo.&lt;br /&gt;E para começar em grande estilo, no dia primeiro será realizado a festa de lançamento no estilo workshop.&lt;br /&gt;&lt;br /&gt;Nesse evento teremos profissionais consagrados no mercado falando sobre os tópicos mais importantes abordados no portal. A grade irá abordar assuntos como Java, .NET, SOA, Ruby, Agile e Arquitetura. Todas as palestras terão um formato de painel, expondo o que há de mais recente em cada Queue. No evento irei falar sobre a Queue Architecture.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6CJaDmsVepU/SP-61dmMaVI/AAAAAAAAAb8/ulRNa32uqwk/s1600-h/Grade.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 376px; height: 313px;" src="http://3.bp.blogspot.com/_6CJaDmsVepU/SP-61dmMaVI/AAAAAAAAAb8/ulRNa32uqwk/s400/Grade.png" alt="" id="BLOGGER_PHOTO_ID_5260128317432686930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;A vinda da InfoQ não seria possível sem os esforços da Fratech, em especial do Felipe Rodrigues, e o Manoel Pimentel (&lt;a href="http://www.visaoagil.com/"&gt;Visão Ágil&lt;/a&gt;),  e de todos os editores,  de altíssima capacitação técnica, que tem feito o melhor para traduzir o conteúdo do portal para o Português.  Sem dúvida para mim é um orgulho participar deste grupo.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6CJaDmsVepU/SP-7c3KBZ9I/AAAAAAAAAcE/Em2S1HCC5PE/s1600-h/contamos.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 194px;" src="http://2.bp.blogspot.com/_6CJaDmsVepU/SP-7c3KBZ9I/AAAAAAAAAcE/Em2S1HCC5PE/s400/contamos.png" alt="" id="BLOGGER_PHOTO_ID_5260128994308745170" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Mais informações:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Fratech: &lt;a href="http://www.fratech.net/model/event%21show.act?event.id=26"&gt;http://www.fratech.net/model/event!show.act?event.id=26&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Saúde e Sucesso !!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-1139795275864774194?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/1139795275864774194/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=1139795275864774194' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/1139795275864774194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/1139795275864774194'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2008/10/seja-bem-vindo-infoq-brasil.html' title='Seja Bem Vindo InfoQ Brasil'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6CJaDmsVepU/SP06Im6d78I/AAAAAAAAAbk/MwGeFrye6eQ/s72-c/InfoQ_Brasil.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-6509074927847617291</id><published>2008-10-18T10:28:00.004-03:00</published><updated>2008-10-21T00:04:22.064-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Certificação'/><category scheme='http://www.blogger.com/atom/ns#' term='SCSNI'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>SCSNI Study Group - Netbeans IDE Certification Exam</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6CJaDmsVepU/SP04MX9t9eI/AAAAAAAAAbc/oJ3Bul7pMuY/s1600-h/logo-10y-nb-text.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_6CJaDmsVepU/SP04MX9t9eI/AAAAAAAAAbc/oJ3Bul7pMuY/s400/logo-10y-nb-text.png" alt="" id="BLOGGER_PHOTO_ID_5259421725081073122" border="0" /&gt;&lt;/a&gt;If you don´t know already, and to celebrate &lt;a href="http://www.netbeans.org/birthday/"&gt;10th NetBeans Birthday&lt;/a&gt; yeaahhh, Sun is planning to release a new certification for NetBeans IDE (Beta), if you are interested and would like to know more about it, or you are just looking for material to study, take a look at the &lt;a href="http://sites.google.com/site/netbeansscsni/"&gt;SCSNI Study Group&lt;/a&gt;, the first study group to this certification, it has a plenty of related stuff.&lt;br /&gt;&lt;br /&gt;You can help to increase the group providing mocks, articles, or even changing the site, if you wanna  help, please let me know mailling me at wrsconsulting@gmail.com&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://sites.google.com/site/netbeansscsni/"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_6CJaDmsVepU/SP03bmJKL5I/AAAAAAAAAbM/MuL9QKoDS6w/s400/customLogo.gif.jpg" alt="" id="BLOGGER_PHOTO_ID_5259420887073566610" border="0" /&gt;&lt;/a&gt;As a beta tester, you officially test the test and will be able to provide Sun with valuable comments and technical feedback about the Netbeans IDE questions. The Sun beta exam counts towards official Sun Certified Specialist Netbeans IDE (SCSNI) Certification!&lt;/p&gt;&lt;b&gt;Exam Testing Objectives&lt;/b&gt;  &lt;ul&gt;  Section 1:  IDE Configuration  &lt;ul&gt;&lt;li&gt;1.1 Demonstrate the ability to configure the functionality available in the IDE, including using enabling and disabling functionality and using the Plugin Manager. &lt;/li&gt;&lt;li&gt;1.2 Explain the purpose of the user directory and the netbeans.conf file and how these can be used to configure the IDE.   &lt;/li&gt;&lt;li&gt;1.3 Demonstrate the ability to work with servers in the IDE, such as registering new server instances and stopping and starting servers. &lt;/li&gt;&lt;li&gt;1.4 Describe how to integrate external libraries in the IDE and use them in coding and debugging your project.   &lt;/li&gt;&lt;li&gt;1.5 Demonstrate knowledge of working with databases in the IDE, including registering new database connections and tables running SQL scripts. &lt;/li&gt;&lt;li&gt;1.6 Describe how to integrate and use different versions of the JDK in the IDE for coding, debugging, and viewing Javadoc documentation. &lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Section 2:  Project Setup  &lt;ul&gt;&lt;li&gt;2.1 Describe the characteristics and uses of a free-form project.   &lt;/li&gt;&lt;li&gt;2.2 Demonstrate the ability to work with version control systems and the IDE. (Which VCS's are available, which ones you need an external client for, how to pull sources out of a repository, view changes, and check them back in). &lt;/li&gt;&lt;li&gt;2.3 Describe the ways in which you can change the build process for a standard project, such as configuring project properties and modifying the project's Ant build script. &lt;/li&gt;&lt;li&gt;2.4 Configure your project to compile against and run on a specific version of the JDK.  &lt;/li&gt;&lt;/ul&gt;  &lt;/li&gt;&lt;li&gt;Section 3:  Java SE Development  &lt;ul&gt;&lt;li&gt;3.1  Demonstrate the ability to create NetBeans projects from the source code of an existing Java SE program.   &lt;/li&gt;&lt;li&gt;3.2 Describe how to manage the classpath of a Java SE project, including maintaining a separate classpath for compiling and debugging. &lt;/li&gt;&lt;li&gt;3.3 Demonstrate the knowledge of the NetBeans GUI Builder and the ability to lay out and hook up basic forms using it.   &lt;/li&gt;&lt;li&gt;3.4 Demonstrate the ability to package and distribute a built Java Desktop project for use by another user.  &lt;/li&gt;&lt;/ul&gt;  &lt;/li&gt;&lt;li&gt;Section 4:  Java EE Web Development   &lt;ul&gt;&lt;li&gt;4.1  Describe how to create a NetBeans project from the source code of an existing Web application.   &lt;/li&gt;&lt;li&gt;4.2  Distinguish between a visual web application and web application.   &lt;/li&gt;&lt;li&gt;4.3 Demonstrate knowledge of which web frameworks are available in NetBeans IDE and how they are added to and used in a web application. &lt;/li&gt;&lt;li&gt;4.4 Describe how to monitor HTTP requests when running a web application.   &lt;/li&gt;&lt;li&gt;4.5 Demonstrate a knowledge of basic tasks related to building and deploying web applications to a server, such as changing the target server and undeploying an application. &lt;/li&gt;&lt;/ul&gt;  &lt;/li&gt;&lt;li&gt;Section 5:  Editing  &lt;ul&gt;&lt;li&gt;5.1 Describe the purpose and uses of refactoring and demonstrate the ability to perform basic refactoring on Java source code.   &lt;/li&gt;&lt;li&gt;5.2 Describe how to use the Options window to change the default appearance and behavior of the Source Editor.   &lt;/li&gt;&lt;li&gt;5.3 Describe the ways that the IDE highlights errors in source code and the tools the IDE offers for correcting those errors.   &lt;/li&gt;&lt;li&gt;5.4 Demonstrate the ability to use editor hints, such as implementing all the methods for an implemented interface.   &lt;/li&gt;&lt;li&gt;5.5 Demonstrate the ability to use live code templates such as automatic generation of constructors, try/catch loops, and getters and setters. &lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;li&gt;Section 6:  Testing, Profiling, and Debugging  &lt;ul&gt;&lt;li&gt;6.1 Demonstrate the ability to work with JUnit tests in the IDE, such as creating JUnit tests and interpreting JUnit test output. &lt;/li&gt;&lt;li&gt;6.2 Describe how to debug a local (desktop) application, including setting breakpoints and stepping through code.   &lt;/li&gt;&lt;li&gt;6.3 Describe the difference between local and remote debugging and describe how to debug a remote (web) application.   &lt;/li&gt;&lt;li&gt;6.4 Describe the purpose of profiling applications and how to profile a local desktop application in the IDE.   &lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;/ul&gt;  &lt;!-- BEGIN GREYLINE --&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;References:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Official Site&lt;span class="sp5"&gt;&lt;/span&gt;: &lt;a href="http://www.sun.com/training/certification/netbeans.html"&gt;http://www.sun.com/training/certification/netbeans.html&lt;/a&gt;&lt;br /&gt;Study Group: &lt;a href="http://sites.google.com/site/netbeansscsni/"&gt;http://sites.google.com/site/netbeansscsni/&lt;/a&gt;&lt;br /&gt;NetBeans 10th Birthday: &lt;a href="http://www.netbeans.org/birthday/"&gt;http://www.netbeans.org/birthday/logos.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;NetBeans Rocks, The only IDE you need !!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-6509074927847617291?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/6509074927847617291/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=6509074927847617291' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/6509074927847617291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/6509074927847617291'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2008/10/scsni-study-group-netbeans-ide.html' title='SCSNI Study Group - Netbeans IDE Certification Exam'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6CJaDmsVepU/SP04MX9t9eI/AAAAAAAAAbc/oJ3Bul7pMuY/s72-c/logo-10y-nb-text.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-407347833767192912</id><published>2008-10-15T21:34:00.001-03:00</published><updated>2008-10-16T00:10:43.289-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IBM'/><category scheme='http://www.blogger.com/atom/ns#' term='Eventos'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='Arquitetura'/><title type='text'>[Resumo Executivo] Evento Smart SOA 2008 IBM</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6CJaDmsVepU/SPaOlQhFx7I/AAAAAAAAAa0/f4m7n9_7RvA/s1600-h/bpm.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_6CJaDmsVepU/SPaOlQhFx7I/AAAAAAAAAa0/f4m7n9_7RvA/s320/bpm.png" alt="" id="BLOGGER_PHOTO_ID_5257546385741694898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Na semana passada, no dia 08 estive presente no evento &lt;a href="http://www-01.ibm.com/software/solutions/soa/launch/"&gt;Smart SOA&lt;/a&gt; da IBM, uma iniciativa da IBM que levou para 100 cidades ao redor do mundo as novidades em Smart SOA e o lançamento da nova linha de produtos WebSphere,  e preparei um resumo executivo do que vi.&lt;br /&gt;&lt;p class="MsoNormal"&gt;O evento foi focado na nova linha produtos Websphere da IBM para suporte a implantação de SOA e foi demonstrado um case de sucesso, da empresa OJC - Organizações Jaime Câmara (TV Anhanguera). Que adotaram a linha de produtos da IBM para implantar os seus processos.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;  &lt;/span&gt;Na primeira apresentação, o vice-presidente de marketing de produto WebSphere Paul Brunet, deu uma introdução ao conceito de SOA e em BPM, neste último tópico, ressaltou a importância da área de negócio mapear os seus processos com BPM.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt; &lt;/span&gt;Afirmou que uma implantação de SOA, requer mudanças nos planos de negócio, e demonstrou alguns números interessantes, como por exemplo, que no mundo dos negócios, 83% dos CIOs esperam mudanças reais em seus processos de negócio, e que 98% dos planos de negócio mudam em decorrência da estratégia corporativo, que por sua vez buscam mais performance e agilidade em seus processos de negócio. &lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;  &lt;/span&gt;Citou também as prioridades TOP dos CIOs que são:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Tornar      os processos locais (departamentais) em processos globais (corporativos).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Tornar      os processos que são automáticos e visíveis em processos dinâmicos, de      fácil adaptação e baixo tempo de resposta.&lt;/li&gt;&lt;/ul&gt;      &lt;p class="MsoNormal"&gt;&lt;span style=""&gt; &lt;/span&gt;Foi proposto que BPM possibilita a mudança do negócio, sendo SOA o Core (Núcleo) do BPM. Após a apresentação dos conceitos, foi dada uma visão geral do ferramental, entre seus produtos podemos destacar:&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;b style=""&gt;WebSphere Process Server&lt;/b&gt; para gerenciamento de tarefas humanas e orquestração de processos. O produto oferece visibilidade dos processos em real time de forma consolidada e customizada.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;  &lt;/span&gt;Monitoração dos processos chaves (KPI) e configuração para recebimento de email de acordo com índice.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;WebSphere Business Modeler&lt;/b&gt; que é uma ferramenta gráfica para gerar os diagramas do BPM, e que é possível gerar os processos executáveis (geração de código). É possível importar modelos criados no Visio e PowerPoint para esta ferramenta.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;WebSphere Business Monitor&lt;/b&gt; monitoração dos processos e eventos de negócio.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;WebSphere Business Events&lt;/b&gt; que é um módulo para a parametrização de eventos do sistemas, onde foi explanado o conceito de BEP - Business Event Process,&lt;span style=""&gt;  &lt;/span&gt;integrado com o módulo WebSphere Business Monitor, &lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt; &lt;/span&gt;E finalmente foi apresentado o &lt;b style=""&gt;IBM BPM Suite&lt;/b&gt;, que é a suíte de ferramentas para SOA da IBM, que fornece em seus módulos o gerenciamento dos eventos de negócio, o controle do conteúdo ativo, relatórios analíticos que dão uma visão real-time das vendas, um engine de regras, seleção de serviços e policies.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt; &lt;/span&gt;Na apresentação de Takeshi Kamimura, ele explicou a importância do alinhamento entre TI e da área de negócio para a implantação de SOA, sem este alinhamento não é possível montar uma arquitetura orientada a serviços. Apresentou estudos que provam que quando existe um alinhamento entre TI e negócios os ganhos de produtividade DUPLICAM.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt; &lt;/span&gt;E apresentou em um quadro padrão das fases de implantação de SOA por abordagem, o percentual em que as empresas brasileiras hoje se encontram.&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6CJaDmsVepU/SPaOuvqvmNI/AAAAAAAAAa8/kMxP7f0g_WA/s1600-h/soa-abordagem.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_6CJaDmsVepU/SPaOuvqvmNI/AAAAAAAAAa8/kMxP7f0g_WA/s400/soa-abordagem.png" alt="" id="BLOGGER_PHOTO_ID_5257546548722505938" border="0" /&gt;&lt;/a&gt;&lt;p class="MsoNormal"&gt;Como criar o alinhamento entre TI e as áreas de negócio:&lt;/p&gt;  &lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;Desenvolver      uma linguagem compartilhada, que TI e negócio entendam.&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Deixar      claro as prioridades (compartilhada).&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Estabelecer      equipe para tomada de decisões conjunta.&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Utilizar      uma linguagem de mercado.&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Fazer      referência à validação externa. (O que existe de melhores práticas no      mercado)&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt;Na apresentação do case de sucesso da OJC, Júlio de Oliveira o atual gerente de TI explicou o que os motivou a adotar SOA e a escolha da IBM como parceira. Foram feitas Provas de Conceito, RFP, RFI que apontaram a necessidade de mudança para SOA. Este estudo revelou a IBM como a empresa que atende o negócio. Após escolher a IBM como fornecedora e com base nestas informações montaram uma matriz SWOT para implantação de SOA, que foi aberta para o público, conforme segue:&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6CJaDmsVepU/SPaO9ORvMKI/AAAAAAAAAbE/JSWAUGrzN4A/s1600-h/swot.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_6CJaDmsVepU/SPaO9ORvMKI/AAAAAAAAAbE/JSWAUGrzN4A/s400/swot.png" alt="" id="BLOGGER_PHOTO_ID_5257546797457289378" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;Para as fraquezas foi montado um plano de ação conforme segue:&lt;/p&gt;  &lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;Reestruturação      da equipe.&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Fixação      dos conceitos SOA.&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Treinamentos      contínuos em Java.&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Workshops      sobre as ferramentas.&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Hands-On.&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Envolvimento      dos consultores do ERP.&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Foco      nas especificações de regras de negócio e na integração.&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Treinamento      Oficiais IBM.&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Mentoring      por Terceiros.&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Migrar      de forma gradual.&lt;/li&gt;&lt;/ul&gt;    &lt;p class="MsoNormal"&gt;Plano de Ação para as Oportunidades.&lt;/p&gt;    &lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;Apresentar      conceitos macros, as oportunidades imediatas e as possibilidades em longo      prazo (Planejamento Estratégico).&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Exposição      dos resultados parciais. (Quick Wins).&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Pulso      Firme:&lt;/li&gt;&lt;ul style="margin-top: 0cm;" type="circle"&gt;&lt;li class="MsoNormal" style=""&gt;Equipe&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Parceiros&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Clientes       Internos.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;    &lt;p class="MsoNormal"&gt;E por fim, eles apresentaram o case selecionado (Faturamento) para implantação, os fatores que o levaram a escolher este case foram a Relevância, a Rastreabilidade, o Monitoramento e o Risco agregado, tudo isso alinhado aos objetivos do negócio. Com base nestas informações eles selecionaram o sistema de Faturamento.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;É importante frisar que em dois anos de implantação de SOA, hoje eles estão em transição para a fase de Transformação (vide quadro acima), e que eles fizeram esta migração para SOA de forma gradativa, e que somente HOJE estão estruturando uma área de Governança em TI, que até então não existia.&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Algo que para ser sincero eu nunca teria pensado, até ver a palestra, para mim era inconcebível implantar SOA sem governança. Vivendo e aprendendo !!!&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-407347833767192912?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/407347833767192912/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=407347833767192912' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/407347833767192912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/407347833767192912'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2008/10/resumo-executivo-evento-smartsoa-2008.html' title='[Resumo Executivo] Evento Smart SOA 2008 IBM'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6CJaDmsVepU/SPaOlQhFx7I/AAAAAAAAAa0/f4m7n9_7RvA/s72-c/bpm.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-8025477243118796453</id><published>2008-10-01T18:31:00.001-03:00</published><updated>2012-01-13T18:30:19.968-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XP'/><category scheme='http://www.blogger.com/atom/ns#' term='Estimativas Ágeis'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Artigos'/><title type='text'>Estimativas Ágeis - Planning Poker</title><content type='html'>Em projetos de software tradicionais, (leia-se não ágeis), geralmente fazer estimativa é algo muito chato, e que provavelmente será feito por apenas uma pessoa, que na maioria das vezes essa pessoa é o gerente de projeto, ou o líder da equipe, que utiliza métodos tradicionais para medir uma atividade com análise de ponto de função, ou por linhas de código, etc... mas acontece que quase sempre essa pessoa não conhece a fundo o negócio e as dificuldades técnicas de se implementar uma certa funcionalidade.&lt;br /&gt;&lt;br /&gt;O que acaba gerando problemas no decorrer do projeto, pelo fato do analista de negócio (quando tem) não ter previsto uma funcionalidade adicional, ou uma regra de negócio imprescindível para  o negócio.&lt;br /&gt;&lt;br /&gt;Nesta altura de campeonato, quanto este tipo de situação acontece, geralmente o projeto já esta em um estágio avançado no desenvolvimento, e ATRASADO.. o cliente está puto,,, e sempre quem acaba levando a culpa é o incompetente do desenvolvedor.&lt;br /&gt;&lt;br /&gt;Se você já se sentiu familiarizado com este triste relato, pois bem, não fique triste, pois isto já aconteceu comigo e acontece com milhares de pessoas nos dias atuais...&lt;br /&gt;&lt;br /&gt;Pois bem, existe solução para este problema?&lt;br /&gt;&lt;br /&gt;Sim, existe, se olharmos para alguns dos príncipios ágeis, conforme segue:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"Business people and developers must work together daily throughout the project. "&lt;/blockquote&gt;Traduzindo, quer dizer algo como "Analistas de negócio e desenvolvedores devem trabalhar juntos DIARIAMENTE no decorrer do projeto".&lt;br /&gt;&lt;blockquote&gt;"The most efficient and effective method of conveying information to and within a development team is face-to-face conversation. "&lt;/blockquote&gt;Traduzindo este também,&lt;br /&gt;&lt;br /&gt;“O método mais eficiente e efetivo de obter informação para o time de desenvolvimento é na conversa cara-a-cara."&lt;br /&gt;&lt;blockquote&gt;"Welcome changing requirements, even late in development. Agile processes harness change for the customer's competitive advantage. "&lt;/blockquote&gt;E por último..&lt;br /&gt;&lt;br /&gt;“Mudanças de requisitos são bem vindas, mesmo em um estágio avançado no desenvolvimento. Processos ágeis alinham as mudanças para vantagem competitiva do cliente."&lt;br /&gt;&lt;br /&gt;Uma estimativa bem feita durante a fase inicial do projeto, reduz muito as chances de você ter dores de cabeça no futuro.&lt;br /&gt;&lt;br /&gt;Ok, você está se perguntando, "Mas isto não respondeu a pergunta !!!", como eu posso melhorar as estimativas no inicio de um projeto ou de uma nova iteração ???&lt;br /&gt;&lt;br /&gt;Existe um método ágil para estimativas, chamada de Planning Poker, esse método foi descrito inicialmente por James Grenning em 2002 e depois popularizado por &lt;a href="http://blog.mountaingoatsoftware.com/?p=13"&gt;Mike Cohn&lt;/a&gt; no seu livro &lt;a href="http://www.amazon.com/Agile-Estimating-Planning-Robert-Martin/dp/0131479415"&gt;Agile Estimating and Planning&lt;/a&gt;,, essa técnica é muito conhecido em XP.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_6CJaDmsVepU/SOPyU0ipiRI/AAAAAAAAATs/0kQ5Ntosf7A/s1600-h/DSC00031.JPG"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5252308029959407890" src="http://2.bp.blogspot.com/_6CJaDmsVepU/SOPyU0ipiRI/AAAAAAAAATs/0kQ5Ntosf7A/s320/DSC00031.JPG" style="cursor: pointer; float: left; margin: 0pt 10px 10px 0pt;" /&gt;&lt;/a&gt;Para "jogar" o Planning Poker precisamos apenas de uma lista de backlog e um baralho. E o baralho, geralmente composto por cartas que possuem uma seqüência fibonaci ou similar (0,  ½, 1, 2, 3, 5, 8, 13, 21, 34, 50, 80 ,100, ?) e uma carta opcional com um sinal de interrogação.&lt;br /&gt;&lt;br /&gt;Por que utilizar esta seqüência, e não um conjunto de números naturais (0,1,2,3,4,5,6,7,etc...) ?&lt;br /&gt;&lt;br /&gt;Boa pergunta, mas vou responder com outra pergunta, você consegue distinguir o número 13 do número 14? Fica mais fácil você ter uma noção de separação de complexidade, quando você trabalha com números em uma seqüência fibonaci, imagine que para cada tarefa, quando você for dar o seu peso, pense que uma tarefa com peso 2, é 2 vezes mais difícil que uma tarefa com peso 1.&lt;br /&gt;&lt;br /&gt;Voltando ao PP, para jogar, cada participante, geralmente os membros da equipe de desenvolvimento (programadores, testers, designers, etc..) devem possuir uma seqüência de cartas, e cada funcionalidade da lista de backlog irá corresponder a uma rodada do jogo entre a equipe. Os membros não podem conhecer as cartas uns dos outros até início da rodada.&lt;br /&gt;&lt;br /&gt;Para facilitar o entendimento, vou demonstrar um exemplo real, imagine que temos uma lista de backlog conforme a tabela abaixo, apresentada pelo Product Owner, e o mesmo dá explicações relacionadas a cada um dos itens, onde todos os membros discutem para chegar a um entendimento do problema.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_6CJaDmsVepU/SOPwA89nJ2I/AAAAAAAAATc/AUEik7exvg4/s1600-h/Backlog.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5252305489599342434" src="http://4.bp.blogspot.com/_6CJaDmsVepU/SOPwA89nJ2I/AAAAAAAAATc/AUEik7exvg4/s320/Backlog.jpg" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt; Na nossa ambiente, vamo imaginar que temos 5 membros, 3 desenvolvedores (Carlão, Maria, Zeca), um tester (Júlio) e uma designer (Rita) e o Project Manager / SM (Walter). O Product Owner neste momento, já deu uma visão dos itens de backlog e explicou a necessidade do negócio, tirou algumas dúvidas e foi embora..&lt;br /&gt;&lt;br /&gt;É importante frizar que os membros do time devem estimar todo o trabalho relacionado ao item do backlog, e não apenas a sua parte especifica.&lt;br /&gt;&lt;br /&gt;Antes de iniciar a primeira rodada, o SM inicia a discussão:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; Walter (SM):&lt;/span&gt; Pessoal, o que vocês acharam dessa user story (100)?, o usuário quer um repositório para armazenas os documentos operacionais da empresa assim, assim, assado, então, vamos votar:&lt;br /&gt;&lt;br /&gt;Então, neste momento cada membro da equipe, pega uma carta que acha que corresponde com os Story points e depois que todos escolheram suas cartas, tem inicio a rodada. No nosso exemplo, o resultado foi esse:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Rodada 1:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_6CJaDmsVepU/SOPxWKcABUI/AAAAAAAAATk/pkzAK0wjE88/s1600-h/Rodada.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5252306953505342786" src="http://2.bp.blogspot.com/_6CJaDmsVepU/SOPxWKcABUI/AAAAAAAAATk/pkzAK0wjE88/s320/Rodada.jpg" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;Perceba que na primeira rodada, tivemos pessoas que votaram 50 (Maria, Julio), duas que votaram 80 (Zeca, Rita), um 21 (Carlão) e um 34 (Walter), neste momento o mediador (geralmente o Scrum Master) questiona os resultados.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Walter (SM):&lt;/span&gt; Peraí gente, vamos discutir, esta tendo muita divergência, Rita e Zeca, porque vocês acham que essa atividade tem um peso 80?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Rita (Designer):&lt;/span&gt; É por que, fico imaginando o tamanho dessa aplicação, já é uma bagunça hoje a forma que é organizado os documentos, imagina só o trabalho de reclassificar tudo, montar um repositório, modelagem, etc... e chora.. ..&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Walter (SM):&lt;/span&gt; Huum entendi, e você Zeca.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Zeca (Dev):&lt;/span&gt; Concordo com a Maria, imagina a quantidade de trabalho.. e chora mais.. etc..&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Walter (SM):&lt;/span&gt; Carlão porque você acha que é 21, é tão fácil assim??&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Carlão (Dev):&lt;/span&gt; Na verdade, olhando na ótica do Zeca e da Rita, o problema me parece ser mais complexo do que pensei,..&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Walter (SM):&lt;/span&gt; Então, o que vocês acham da gente pesquisar alguma ferramenta open source que nos ajude neste trabalho, como um ECM ??? Estava pensando em algo neste tipo, senão realmente teremos muito trabalho,,,&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Júlio (tester):&lt;/span&gt; Ok Walter, ótima idéia, mas acho que vamos ter muita customização, e com a estrutura que temos hoje não será nada fácil.. Imagine a quantidade de testes !!!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Walter (SM):&lt;/span&gt; Certo, se todos estão de acordo, vamos implantar um ECM, vamos fazer mais uma rodada então...&lt;br /&gt;&lt;br /&gt;Nisso, é feito a segunda rodada (Tabela 1), podemos ver que houve um consenso..&lt;br /&gt;&lt;br /&gt;Neste exemplo simples, podemos observar que alguns benefícios ficam bem claros:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;O Product Owner descreve cada história resumidamente, de forma que todos tem uma idéia do que esta rolando.&lt;/li&gt;&lt;li&gt;A sinergia entre a equipe aumenta, cada for iniciar um Sprint, onde as tarefas estarão bem definidas, os membros do time, terão uma idéia bem definida do que esta sendo feito, do que o seu colega de trabalho esta fazendo.&lt;/li&gt;&lt;li&gt;O risco de erros da estimativa diminui dramaticamente.&lt;/li&gt;&lt;li&gt;As diferenças de opiniões ficam transparentes, de modo que todos passam a discutir estas diferenças.&lt;/li&gt;&lt;li&gt;É possível re-estimar uma user story até que haja um consenso.&lt;/li&gt;&lt;/ul&gt;Ok, muito legal esta explicação, mas ainda falta algo, qual a relação entre os princípios ágeis &lt;a href="http://3.bp.blogspot.com/_6CJaDmsVepU/SOPyrqTzStI/AAAAAAAAAT0/0htleWrt2i8/s1600-h/DSC00033.JPG"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5252308422349769426" src="http://3.bp.blogspot.com/_6CJaDmsVepU/SOPyrqTzStI/AAAAAAAAAT0/0htleWrt2i8/s320/DSC00033.JPG" style="cursor: pointer; float: right; margin: 0pt 0pt 10px 10px;" /&gt;&lt;/a&gt;citados no início deste artigo com este jogo de cartas?&lt;br /&gt;&lt;br /&gt;Bem, respondendo a pergunta, eu diria que tem tudo a ver, quer ver só:&lt;br /&gt;&lt;blockquote&gt;"O método mais eficiente e efetivo de obter informação para o time de desenvolvimento é na conversa cara-a-cara."&lt;/blockquote&gt;Em planning poker todos estão conversando, (quase sempre olho no olho), o que dá transparência ao negócio.&lt;br /&gt;&lt;blockquote&gt;"Analistas de negócio e desenvolvedores devem trabalhar juntos DIARIAMENTE no decorrer do projeto".&lt;/blockquote&gt;Ao fazer o planning poker, estamos discutindo requisitos funcionais e não funcionais, que visam a realização de um desejo do cliente, e geralmente, durate o planning poker está o Product Owner, para tirar todas as dúvidas em relação ao negócio e verificar se está sendo feito o que foi acordado.&lt;br /&gt;&lt;br /&gt;E por último..&lt;br /&gt;&lt;blockquote&gt;"Mudanças de requisitos são bem vindas, mesmo em um estágio avançado no desenvolvimento. Processos ágeis alinha as mudanças para vantagem competitiva do cliente."&lt;/blockquote&gt;Isso irá sempre acontecer, sempre haverá novas features/sistemas a serem desenvolvidos, e durante a estimativa podemos discutir de maneira mais técnica, até modelos de arquitetura, pois querendo ou não, a arquitetura/modelo que será desenvolvido o produto tem um forte peso nas user stories. Portanto, a qualidade do código e do modelo é essencial para que as mudanças de requisitos sejam menos "traumáticas".&lt;br /&gt;&lt;br /&gt;Estive no Sun Tech Days, e uma palestra que achei interessante foi a "Usando computação social para melhorar a produtividade no seu projeto" da "Java Champion" Fabiane Nardon, onde ela apresentou várias ferramentas para computação social, e uma das ferramentas citadas foi o site "&lt;a href="http://www.planningpoker.com/"&gt;http://www.planningpoker.com/&lt;/a&gt;", um site idealizado por Mike Cohn, e propõe uma ferramenta para que time distribuídos façam a estimativa em conjunto, tem algumas coisas a melhorar, mas a idéia é bem bacana..&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;OBS&amp;gt;&lt;/span&gt; Nas fotos acima, a 1º é uma sessão de planning poker no meu ambiente de trabalho, e na segunda foto o PO priorizando e discutindo os itens de Backlog.&lt;br /&gt;&lt;br /&gt;Planning poker com certeza é uma ótima prática, e é também uma boa maneira de iniciar no mundo ágil..&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;Diversão garantida !!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-8025477243118796453?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/8025477243118796453/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=8025477243118796453' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/8025477243118796453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/8025477243118796453'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2008/10/estimativas-geis-planning-poker.html' title='Estimativas Ágeis - Planning Poker'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6CJaDmsVepU/SOPyU0ipiRI/AAAAAAAAATs/0kQ5Ntosf7A/s72-c/DSC00031.JPG' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-6621722062697098719</id><published>2008-09-15T15:31:00.011-03:00</published><updated>2009-09-09T11:41:59.909-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GlassFish'/><category scheme='http://www.blogger.com/atom/ns#' term='EJB'/><category scheme='http://www.blogger.com/atom/ns#' term='JAVA EE 6'/><category scheme='http://www.blogger.com/atom/ns#' term='Publicações'/><category scheme='http://www.blogger.com/atom/ns#' term='Mundo Java'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>[JavaEE 6] EJB 3.1 no GlassFish V3 e NetBeans</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_6CJaDmsVepU/SNAH_mQTVfI/AAAAAAAAATM/lDpZo6sjWXk/s1600-h/ed31_destaques.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5246702355068704242" src="http://4.bp.blogspot.com/_6CJaDmsVepU/SNAH_mQTVfI/AAAAAAAAATM/lDpZo6sjWXk/s320/ed31_destaques.jpg" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;Esta semana saiu nas bancas a&lt;span style="font-weight: bold;"&gt; edição 31&lt;/span&gt; da revista &lt;a href="http://www.mundojava.com.br/"&gt;Mundo Java&lt;/a&gt; com o título "&lt;span style="font-weight: bold;"&gt;Futuro do Java Corporativo"&lt;/span&gt;, com um artigo meu sobre o mesmo tema.&lt;br /&gt;Para quem quer saber o que vai rolar na próxima especificação do Java EE 6, está edição está um prato cheio, portanto compre uma edição e aproveite...&lt;br /&gt;Não vou entrar em muitos detalhes da matéria, mas vou descrever aqui melhor a demo que está na revista, onde apresento uma aplicação utilizando Session Bean da especificação de EJB 3.1 no GlassFish V3.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Instalando o GlassFish V3 e o conteiner EJB&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;No &lt;a href="https://glassfish.dev.java.net/downloads/v3-techPreview-1.html"&gt;site do GlassFish&lt;/a&gt; baixe o arquivo zip e descompacte em um diretório da sua escolha, a partir deste momento vamos chamar apenas de GLASSFISH_HOME\bin e execute o updatetool (Figura 1).&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_6CJaDmsVepU/SM25WJx368I/AAAAAAAAASs/QqzCCqlXUgY/s1600-h/glassfishV3.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5246052931189861314" src="http://3.bp.blogspot.com/_6CJaDmsVepU/SM25WJx368I/AAAAAAAAASs/QqzCCqlXUgY/s320/glassfishV3.jpg" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;  Na opção available addons, selecione glassfishv3-ejb e clique em Install, esta ação irá instalar o container EJB no Glassfish.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Instalando o plugin GlassFish V3 no NetBeans&lt;br /&gt;&lt;br /&gt;&lt;/span&gt; Agora inicie o NetBeans (de preferência a versão 6.1 ou 6.5) e instale o plugin do GlassFish V3 para o NetBeans em Ferramentas | Plugins, selecione em plugins disponíveis "Glassfish JavaEE Integration" e clique em instalar.&lt;br /&gt;Após instaldo o plugin, na aba Serviços, adicione um novo servidor, selecione a opção GlassFish V3 e siga os passos apontando o diretório GLASSFISH_HOME de instalação e finalizar.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Vamos explorar agora uma funcionalidade no NetBeans para a criação de CRUD, crie uma nova Aplicação Web na categoria Web e clique em Próximo.&lt;br /&gt;Neste passo digite "DEMO_EJB31" e clique em Próximo, na opção servidores selecione o servidor GlassFish V3 T2 recém instalado e clique em Próximo. No último passo selecione o framework JavaServer Faces e clique em Finalizar.&lt;br /&gt;&lt;br /&gt;Agora vamos criar uma aplicação CRUD completa baseada em uma entidade de banco de dados, para isso clique em Arquivo | Novo Arquivo, na categoria Persistence selecione a opção "Classes de entidade do banco de dados" e clique em Próximo.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;OBS:&lt;/span&gt; Antes de fazer o passo abaixo, inicie o banco de dados Derby na guia Serviços do NetBeans, clique com o botão direito do mouse em Java DB e clique em "Iniciar Servidor".&lt;br /&gt;&lt;br /&gt;Neste segundo passo, na lista Fonte de Dados selecione a opção "Nova Fonte de Dados", no campo "Nome JNDI" digite jndi/TesteEJB e na lista "Conexão de banco de dados" selecione o banco "jdbc:derby://localhost:1527/vir" já existente e clique em OK.&lt;br /&gt;&lt;br /&gt;Se tudo ocorreu de maneira correta será apresentada uma lista de tabelas disponíveis. Selecione a tabela Employee, clique em Adicionar e em seguida clique em Próximo.&lt;br /&gt;&lt;br /&gt;No campo nome do pacote digite br.com.netfeijao.entities e por fim clique no botão "Criar unidade de persistência". Mantenha os valores default clique em Criar e depois clique em Finalizar. Esta ação irá criar a classe persistente Employee no pacote informado.&lt;br /&gt;&lt;br /&gt;Agora vamos utilizar um recurso no NetBeans para a criação de um CRUD com páginas JSF baseado em entidades JPA, no caso a classe Employee que acabamos de criar. Acesse o menu Arquivo | Novo Arquivo, na pasta categoria Persistence selecione "Páginas JSF de classes de entidade" e clique em próximo. Adicione a única classe persistente (Employee) existente (ver &lt;span style="font-weight: bold;"&gt;figura 1&lt;/span&gt;), clique em Próximo e a seguir clique em Finalizar.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_6CJaDmsVepU/SM6UVpf7LVI/AAAAAAAAAS0/btxOAqmjLKo/s1600-h/NetBeans-CRUD_JSF.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5246293715571125586" src="http://2.bp.blogspot.com/_6CJaDmsVepU/SM6UVpf7LVI/AAAAAAAAAS0/btxOAqmjLKo/s320/NetBeans-CRUD_JSF.jpg" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;Execute a aplicação pressionando o botão F6 e faça testes, perceba que o NetBeans criou uma aplicação completa "a lá Ruby on Rails" com apenas alguns cliques.&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;public class EmployeeController {&lt;br /&gt;private Employee employee = null;&lt;br /&gt;private List employees = null;&lt;br /&gt;@Resource&lt;br /&gt;private UserTransaction utx = null;&lt;br /&gt;@PersistenceUnit(unitName = "DEMO_EJB31PU")&lt;br /&gt;private EntityManagerFactory emf = null;&lt;br /&gt;&lt;br /&gt;public EntityManager getEntityManager() {&lt;br /&gt;return emf.createEntityManager();&lt;br /&gt;}&lt;br /&gt;public int batchSize = 5;&lt;br /&gt;private int firstItem = 0;&lt;br /&gt;private int itemCount = -1;&lt;br /&gt;&lt;br /&gt;public SelectItem[] getEmployeesAvailableSelectMany() {&lt;br /&gt;return getEmployeesAvailable(false);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public SelectItem[] getEmployeesAvailableSelectOne() {&lt;br /&gt;return getEmployeesAvailable(true);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private SelectItem[] getEmployeesAvailable(boolean one) {&lt;br /&gt;List allEmployees = getEmployees(true);&lt;br /&gt;int size = one ? allEmployees.size() + 1 : allEmployees.size();&lt;br /&gt;SelectItem[] items = new SelectItem[size];&lt;br /&gt;int i = 0;&lt;br /&gt;if (one) {&lt;br /&gt;items[0] = new SelectItem("", "---");&lt;br /&gt;i++;&lt;br /&gt;}&lt;br /&gt;for (Employee x : allEmployees) {&lt;br /&gt;items[i++] = new SelectItem(x, x.toString());&lt;br /&gt;}&lt;br /&gt;return items;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Employee getEmployee() {&lt;br /&gt;if (employee == null) {&lt;br /&gt;employee = getEmployeeFromRequest();&lt;br /&gt;}&lt;br /&gt;if (employee == null) {&lt;br /&gt;employee = new Employee();&lt;br /&gt;}&lt;br /&gt;return employee;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String listSetup() {&lt;br /&gt;reset(true);&lt;br /&gt;return "employee_list";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String createSetup() {&lt;br /&gt;reset(false);&lt;br /&gt;employee = new Employee();&lt;br /&gt;return "employee_create";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String create() {&lt;br /&gt;EntityManager em = getEntityManager();&lt;br /&gt;try {&lt;br /&gt;utx.begin();&lt;br /&gt;em.persist(employee);&lt;br /&gt;utx.commit();&lt;br /&gt;addSuccessMessage("Employee was successfully created.");&lt;br /&gt;} catch (Exception ex) {&lt;br /&gt;try {&lt;br /&gt;if (findEmployee(employee.getId()) != null) {&lt;br /&gt;addErrorMessage("Employee " + employee + " already exists.");&lt;br /&gt;} else {&lt;br /&gt;ensureAddErrorMessage(ex, "A persistence error occurred.");&lt;br /&gt;}&lt;br /&gt;utx.rollback();&lt;br /&gt;} catch (Exception e) {&lt;br /&gt;ensureAddErrorMessage(e, "An error occurred attempting to roll back the transaction.");&lt;br /&gt;}&lt;br /&gt;return null;&lt;br /&gt;} finally {&lt;br /&gt;em.close();&lt;br /&gt;}&lt;br /&gt;return listSetup();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String detailSetup() {&lt;br /&gt;return scalarSetup("employee_detail");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String editSetup() {&lt;br /&gt;return scalarSetup("employee_edit");&lt;br /&gt;}&lt;br /&gt;..&lt;br /&gt;}&lt;/pre&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: 78%;"&gt;&lt;span style="font-weight: bold;"&gt;Listagem 1  - &lt;/span&gt;Parte da Classe EmployeeController gerado pelo NetBeans&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Perceba que o NetBeans gerou o código de persistencia em uma classe controller, vamos melhorar um pouco isto, tirando o código de acesso aos dados e isolando isto em uma classe DAO, depois vamos transformar esta classe em um EJB sem interface,&lt;br /&gt;&lt;br /&gt;OBS&amp;gt; Cuidado, o uso de um EJB DAO deve ser restrito, pois dependendo do seu uso, isso pode ser um Anti-Pattern&lt;br /&gt;&lt;br /&gt;Vamos criar uma nova classe Java acessando o menu Arquivo | Novo Arquivo. Nomeie a classe como EmployeeDAO no pacote br.com.mundojava.dao. Nesta classe vamos colocar todos os métodos de acesso ao banco utilizados na classe EmployeeController e inclui-los na classe recém criada. Veja parte do código na Listagem 18.&lt;br /&gt;&lt;br /&gt;Vamos criar uma nova classe Java acessando o menu Arquivo | Novo Arquivo. Nomeie a classe como EmployeeDAO no pacote br.com.mundojava.dao.&lt;br /&gt;Adicionalmente vamos criar uma classe para tratamento de Exceptions, crie uma classe e nomeie de DatabaseException, na classe DAO vamos encapsular os erros de acesso a banco nesta classe.&lt;br /&gt;&lt;br /&gt;Criada a classe DAO, vamos colocar todos os métodos de acesso ao banco utilizados na classe EmployeeController. Feito isto, transforme esta classe EmployeeDAO em um EJB colocando a anotação Stateless em cima da declaração da classe. Veja parte da classe criada na &lt;span style="font-weight: bold;"&gt;Listagem 2&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;@Stateless&lt;br /&gt;public class EmployeeDAO {&lt;br /&gt;&lt;br /&gt;public static final int PROCESSADO = 1;&lt;br /&gt;public static final int JA_EXISTE = 2;&lt;br /&gt;public static final int ERRO = 3;&lt;br /&gt;&lt;br /&gt;@PersistenceUnit(unitName = "DEMO_EJB31PU")&lt;br /&gt;private EntityManagerFactory emf;&lt;br /&gt;&lt;br /&gt;private EntityManager getEntityManager() {&lt;br /&gt;  return emf.createEntityManager();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;  public Employee getEmployeeFromRequestParam(Object employee) {&lt;br /&gt;    EntityManager em = getEntityManager();&lt;br /&gt;     try{&lt;br /&gt;       Employee o = em.merge((Employee) employee);&lt;br /&gt;       return o;&lt;br /&gt;     } finally {&lt;br /&gt;       em.close();&lt;br /&gt;     }&lt;br /&gt;  } &lt;br /&gt;&lt;br /&gt;  public int create(Employee employee) throws DatabaseException{&lt;br /&gt;    EntityManager em = getEntityManager();&lt;br /&gt;    try {&lt;br /&gt;      em.getTransaction().begin();&lt;br /&gt;      em.persist(employee);&lt;br /&gt;      em.getTransaction().commit();&lt;br /&gt;      return EmployeeDAO.PROCESSADO;&lt;br /&gt;    } catch (Exception ex) {&lt;br /&gt;      try{&lt;br /&gt;       int opt = 0;&lt;br /&gt;       if (getEmployee(employee.getId()) != null) {&lt;br /&gt;         opt = EmployeeDAO.JA_EXISTE;&lt;br /&gt;       } else {&lt;br /&gt;         opt = EmployeeDAO.ERRO;&lt;br /&gt;         throw new DatabaseException("A persistence error occurred.");&lt;br /&gt;       }&lt;br /&gt;       em.getTransaction().rollback();&lt;br /&gt;       return opt;&lt;br /&gt;      }catch(Exception sup){&lt;br /&gt;        throw new DatabaseException("An error occurred attempting to roll back the transaction.");&lt;br /&gt;      } finally {&lt;br /&gt;        em.close();&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;public void edit(Employee employee) throws DatabaseException {&lt;br /&gt;EntityManager em = getEntityManager();&lt;br /&gt;try {&lt;br /&gt;em.getTransaction().begin();&lt;br /&gt;em.merge(employee);&lt;br /&gt;em.getTransaction().commit();&lt;br /&gt;} catch (Exception ex) {&lt;br /&gt;try {&lt;br /&gt;em.getTransaction().rollback();&lt;br /&gt;throw new DatabaseException(ex.getLocalizedMessage());&lt;br /&gt;} catch (Exception e) {&lt;br /&gt;throw new DatabaseException("An error occurred attempting to roll back the transaction.");&lt;br /&gt;}&lt;br /&gt;} finally {&lt;br /&gt;em.close();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;...&lt;br /&gt;}&lt;/pre&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: 78%;"&gt;&lt;span style="font-weight: bold;"&gt;Listagem 2&lt;/span&gt; - Parte da classe EmployeeDAO recém criada.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Fica um desafio para o leitor do blog, criar os métodos&lt;br /&gt;&lt;pre name="code" class="java"&gt;public void destroy(Employee employee);&lt;br /&gt;public List getEmployees(boolean all, &lt;br /&gt;                         int batchSize, &lt;br /&gt;                         int firstItem); &lt;br /&gt;public List getEmployees(boolean all,  &lt;br /&gt;                         int batchSize,  &lt;br /&gt;                         int firstItem); &lt;br /&gt;public Employee getEmployee(Integer id); &lt;br /&gt;public int getItemCount();&lt;br /&gt;&lt;/pre&gt;Por fim, na classe EmployeeController vamos fazer algumas alterações para consumir o EJB sem interface. Primeiro declare uma variável do tipo EmployeeDAO, e vamos injetar com a referência do EJB, e troque todas as referências ao código de acesso ao banco para apontar para o nosso EJB DAO, veja como ficou na classe EmployeeController na &lt;span style="font-weight: bold;"&gt;Listagem 3&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;public class EmployeeController {&lt;br /&gt;private Employee employee = null;&lt;br /&gt;private List employees = null;&lt;br /&gt;public int batchSize = 5;&lt;br /&gt;private int firstItem = 0;&lt;br /&gt;private int itemCount = -1;&lt;br /&gt;@EJB&lt;br /&gt;EmployeeDAO dao;&lt;br /&gt;&lt;br /&gt;public SelectItem[] getEmployeesAvailableSelectMany() {&lt;br /&gt;return getEmployeesAvailable(false);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public SelectItem[] getEmployeesAvailableSelectOne() {&lt;br /&gt;return getEmployeesAvailable(true);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private SelectItem[] getEmployeesAvailable(boolean one) {&lt;br /&gt;List allEmployees = getEmployees(true);&lt;br /&gt;int size = one ? allEmployees.size() + 1 : allEmployees.size();&lt;br /&gt;SelectItem[] items = new SelectItem[size];&lt;br /&gt;int i = 0;&lt;br /&gt;if (one) {&lt;br /&gt;items[0] = new SelectItem("", "---");&lt;br /&gt;i++;&lt;br /&gt;}&lt;br /&gt;for (Employee x : allEmployees) {&lt;br /&gt;items[i++] = new SelectItem(x, x.toString());&lt;br /&gt;}&lt;br /&gt;return items;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Employee getEmployee() {&lt;br /&gt;if (employee == null) {&lt;br /&gt;employee = getEmployeeFromRequest();&lt;br /&gt;}&lt;br /&gt;if (employee == null) {&lt;br /&gt;employee = new Employee();&lt;br /&gt;}&lt;br /&gt;return employee;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String listSetup() {&lt;br /&gt;reset(true);&lt;br /&gt;return "employee_list";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String createSetup() {&lt;br /&gt;reset(false);&lt;br /&gt;employee = new Employee();&lt;br /&gt;return "employee_create";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String create() {&lt;br /&gt;int resultado = dao.PROCESSADO;&lt;br /&gt;try {&lt;br /&gt;resultado = dao.create(employee);&lt;br /&gt;if (resultado == dao.PROCESSADO) {&lt;br /&gt;addSuccessMessage("Employee was successfully created.");&lt;br /&gt;} else if (resultado == dao.JA_EXISTE) {&lt;br /&gt;addErrorMessage("Employee " + employee + " already exists.");&lt;br /&gt;}&lt;br /&gt;} catch (Exception ex) {&lt;br /&gt;ensureAddErrorMessage(ex, ex.getLocalizedMessage());&lt;br /&gt;}&lt;br /&gt;return listSetup();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String detailSetup() {&lt;br /&gt;return scalarSetup("employee_detail");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String editSetup() {&lt;br /&gt;return scalarSetup("employee_edit");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private String scalarSetup(String destination) {&lt;br /&gt;reset(false);&lt;br /&gt;employee = getEmployeeFromRequest();&lt;br /&gt;if (employee == null) {&lt;br /&gt;String requestEmployeeString = getRequestParameter("jsfcrud.currentEmployee");&lt;br /&gt;addErrorMessage("The employee with id " + requestEmployeeString + " no longer exists.");&lt;br /&gt;String relatedControllerOutcome = relatedControllerOutcome();&lt;br /&gt;if (relatedControllerOutcome != null) {&lt;br /&gt;return relatedControllerOutcome;&lt;br /&gt;}&lt;br /&gt;return listSetup();&lt;br /&gt;}&lt;br /&gt;return destination;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String edit() {&lt;br /&gt;EmployeeConverter converter = new EmployeeConverter();&lt;br /&gt;String employeeString = converter.getAsString(FacesContext.getCurrentInstance(), null, employee);&lt;br /&gt;String currentEmployeeString = getRequestParameter("jsfcrud.currentEmployee");&lt;br /&gt;if (employeeString == null || employeeString.length() == 0 || !employeeString.equals(currentEmployeeString)) {&lt;br /&gt;String outcome = editSetup();&lt;br /&gt;if ("employee_edit".equals(outcome)) {&lt;br /&gt;addErrorMessage("Could not edit employee. Try again.");&lt;br /&gt;}&lt;br /&gt;return outcome;&lt;br /&gt;}&lt;br /&gt;try {&lt;br /&gt;dao.edit(employee);&lt;br /&gt;addSuccessMessage("Employee was successfully updated.");&lt;br /&gt;} catch (DatabaseException ex) {&lt;br /&gt;String msg = ex.getLocalizedMessage();&lt;br /&gt;if (msg != null &amp;amp;&amp;amp; msg.length() &amp;gt; 0) {&lt;br /&gt;addErrorMessage(msg);&lt;br /&gt;}else if (getEmployeeFromRequest() == null) {&lt;br /&gt;addErrorMessage("The employee with id " + currentEmployeeString + " no longer exists.");&lt;br /&gt;return listSetup();&lt;br /&gt;} else {&lt;br /&gt;addErrorMessage("A persistence error occurred.");&lt;br /&gt;}&lt;br /&gt;return null;&lt;br /&gt;}&lt;br /&gt;return detailSetup();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String destroy() {&lt;br /&gt;employee = getEmployeeFromRequest();&lt;br /&gt;if (employee == null) {&lt;br /&gt;String currentEmployeeString = getRequestParameter("jsfcrud.currentEmployee");&lt;br /&gt;addErrorMessage("The employee with id " + currentEmployeeString + " no longer exists.");&lt;br /&gt;String relatedControllerOutcome = relatedControllerOutcome();&lt;br /&gt;if (relatedControllerOutcome != null) {&lt;br /&gt;return relatedControllerOutcome;&lt;br /&gt;}&lt;br /&gt;return listSetup();&lt;br /&gt;}&lt;br /&gt;try {&lt;br /&gt;dao.destroy(employee);&lt;br /&gt;addSuccessMessage("Employee was successfully deleted.");&lt;br /&gt;} catch (DatabaseException ex) {&lt;br /&gt;ensureAddErrorMessage(ex, ex.getLocalizedMessage());&lt;br /&gt;return null;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;String relatedControllerOutcome = relatedControllerOutcome();&lt;br /&gt;if (relatedControllerOutcome != null) {&lt;br /&gt;return relatedControllerOutcome;&lt;br /&gt;}&lt;br /&gt;return listSetup();&lt;br /&gt;}&lt;br /&gt;...&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size: 78%; font-weight: bold;"&gt;Listagem 3&lt;/span&gt;&lt;span style="font-size: 78%;"&gt; - Classe EmployeeController refatorada para utilizar o EJB DAO sem interface&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Perceba que na expressão "@EJB EmployeeDAO dao" estamos referenciando ao EJB, sem interface para atrapalhar, claro que não é possível criar uma instância utilizando a palavra reservada &lt;span style="font-family: courier new;"&gt;new&lt;/span&gt; ainda,  na verdade estamos trabalhando com um proxy, mas se quisermos podemos fazer um lookup utilizando JNDI também.&lt;br /&gt;Vou deixar o restante dos métodos para o leitor resolver, é apenas trocar a referencia pela classe dao conforme os métodos acima.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_6CJaDmsVepU/SM6lmKJmaUI/AAAAAAAAAS8/MYcHF1Hx_yI/s1600-h/Exemplo-App.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5246312690911439170" src="http://3.bp.blogspot.com/_6CJaDmsVepU/SM6lmKJmaUI/AAAAAAAAAS8/MYcHF1Hx_yI/s320/Exemplo-App.jpg" style="cursor: pointer; float: left; margin: 0pt 10px 10px 0pt;" /&gt;&lt;/a&gt;&lt;br /&gt;Compile e faça o deploy, rode a aplicação, se tudo deu certo você irá ver a sua aplicação rodando (ver figura 2) com um EJB sem interface, e o melhor, o EJB está dentro de um arquivo .war, já estamos implementando o empacotamento simplificado.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Veja como ficou o empacotamento do nosso projeto na &lt;span style="font-weight: bold;"&gt;Figura 3&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_6CJaDmsVepU/SM6mcEcvL6I/AAAAAAAAATE/JBJeHJ0ploU/s1600-h/Figura+6.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5246313617094029218" src="http://4.bp.blogspot.com/_6CJaDmsVepU/SM6mcEcvL6I/AAAAAAAAATE/JBJeHJ0ploU/s320/Figura+6.jpg" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Para maiores informações sobre o futuro do Java Corporativo, leia a edição 31 da Mundo Java, que ainda traz ótimos artigos como:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;&lt;ul&gt;&lt;li&gt;EJB 3.1:Conheça as Novidades do Futuro do Java Corporativo.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Autor&lt;/span&gt;:Wagner Roberto dos Santos &lt;br /&gt;&lt;/li&gt;&lt;li&gt;Grizzly e Comet - Ajax Reverso com Escalabilidade. &lt;/li&gt;&lt;li&gt;     &lt;span style="font-weight: bold;"&gt;Autor&lt;/span&gt;: Pedro Cavalero &lt;/li&gt;&lt;li&gt; Usando o Mavem para melhorar a Qualidade dos seus Projetos. &lt;/li&gt;&lt;li&gt; &lt;span style="font-weight: bold;"&gt;Autor&lt;/span&gt;:Márcio Varchavsky &lt;/li&gt;&lt;li&gt; Criando Software mais próximo do Cliente com Domain-Drivgen Design. &lt;/li&gt;&lt;li&gt;     &lt;span style="font-weight: bold;"&gt;Autor&lt;/span&gt;:Sérgio Lopes &lt;/li&gt;&lt;li&gt; Setembro: Mês de Java. &lt;/li&gt;&lt;li&gt; &lt;span style="font-weight: bold;"&gt;Autor&lt;/span&gt;:Mauricio Leal &lt;/li&gt;&lt;li&gt; Testes de unidades Avançadas com JMock 2 &lt;/li&gt;&lt;li&gt;     &lt;span style="font-weight: bold;"&gt;Autor&lt;/span&gt;:Eduardo Guerra &lt;/li&gt;&lt;li&gt; Gerenciamento de Conteúdo  Web com OpemCMS -Customização de Sites. &lt;/li&gt;&lt;li&gt; &lt;span style="font-weight: bold;"&gt;Autor&lt;/span&gt;:Rodrigo Cunha de Paiva &lt;/li&gt;&lt;li&gt; Tirando o Máximo dos Interceptors no Struts2. &lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Autor&lt;/span&gt;:   José Yoshiriro Ajisaka Ramos &lt;/li&gt;&lt;li&gt; Tendências em Foco:Ganhando com Open Source &lt;/li&gt;&lt;li&gt;      &lt;span style="font-weight: bold;"&gt;Autor&lt;/span&gt;:Cezar Taurion &lt;/li&gt;&lt;li&gt; Jogo Rápido &lt;/li&gt;&lt;li&gt;  &lt;span style="font-weight: bold;"&gt;Autor&lt;/span&gt;:Charbel Symanski e Rodrigo Barbosa Cesar &lt;/li&gt;&lt;li&gt; Mundo OO: Requisitos Executáveis com FIT &lt;/li&gt;&lt;li&gt;  &lt;span style="font-weight: bold;"&gt;Autor&lt;/span&gt;:Rodrigo Yoshima &lt;/li&gt;&lt;li&gt; SOA na Pratica:Iniciando Projetos SOA. &lt;/li&gt;&lt;li&gt;  &lt;span style="font-weight: bold;"&gt;Autor&lt;/span&gt;:Ricardo Ferreira &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/_6CJaDmsVepU/Si7bOgwtwFI/AAAAAAAAAjo/2wDoZpJTKCs/s1600-h/revistanumero0031.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5345450850094268498" src="http://4.bp.blogspot.com/_6CJaDmsVepU/Si7bOgwtwFI/AAAAAAAAAjo/2wDoZpJTKCs/s400/revistanumero0031.jpg" style="cursor: pointer; float: left; height: 190px; margin: 0pt 10px 10px 0pt; width: 148px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Diversão Garantida !!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-6621722062697098719?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/6621722062697098719/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=6621722062697098719' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/6621722062697098719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/6621722062697098719'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2008/09/javaee-6-ejb-31-no-glassfish-v3-e.html' title='[JavaEE 6] EJB 3.1 no GlassFish V3 e NetBeans'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6CJaDmsVepU/SNAH_mQTVfI/AAAAAAAAATM/lDpZo6sjWXk/s72-c/ed31_destaques.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-3792553027758012831</id><published>2008-09-14T16:23:00.000-03:00</published><updated>2008-09-14T17:23:36.389-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Just Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Eventos'/><title type='text'>[Just Java 2008] - Considerações</title><content type='html'>.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6CJaDmsVepU/SM1wBu4BrrI/AAAAAAAAASc/jHdKFX_J7a4/s1600-h/DSC00925.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_6CJaDmsVepU/SM1wBu4BrrI/AAAAAAAAASc/jHdKFX_J7a4/s320/DSC00925.JPG" alt="" id="BLOGGER_PHOTO_ID_5245972316021698226" border="0" /&gt;&lt;/a&gt;O Just Java, o maior evento independente da comunidade Java no Brasil, rolou nos dias 10, 11 e 12 de Setembro, e mais uma vez tivemos ótimas palestras, eu particularmente participei apenas nos dias 10 e 11, que foram os dias que tive as minhas palestras.&lt;br /&gt;&lt;br /&gt;No dia 10 apresentei junto com meu grande amigo e professor &lt;a href="http://diamond-powder.blogspot.com/"&gt;Renato Bellia&lt;/a&gt; a palestra "&lt;a href="http://soujava.org.br/display/v/Resumos#Resumos-1479"&gt;Java EE  6/ EJB 3.1 e o Futuro do Java Corporativo&lt;/a&gt;", confesso que fiquei bem nervoso durante a apresentação por conta do grande número de pessoas presentes, o auditório estava extremamente lotado, com pessoas de pé e sentadas no chão..&lt;br /&gt;&lt;br /&gt;No dia 11 foi dia de apresentar o framework &lt;a href="http://soujava.org.br/display/v/Resumos#Resumos-1507"&gt;Diamond Powder - Produtividade Open Source para Java ME&lt;/a&gt; , desenvolvido pelo Bellia, minha parte na apresentação foi mostrar o plugin que desenvolvi para o NetBeans, onde auxilia a criação do Schema,  nesta apresentação fiquei muito mais tranquilo, o público era bem menor (ver foto),, mas o que me deixou muito mais calmo foi o fato de estar atrás de um teclado, mostrando código, as funcionalidades ali, na hora =) ,,,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6CJaDmsVepU/SM1rTA4EUoI/AAAAAAAAASM/UhN7639RqMg/s1600-h/DSC00928.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_6CJaDmsVepU/SM1rTA4EUoI/AAAAAAAAASM/UhN7639RqMg/s320/DSC00928.JPG" alt="" id="BLOGGER_PHOTO_ID_5245967115353346690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6CJaDmsVepU/SM1vFCNuuHI/AAAAAAAAASU/u5cWCqj5FXc/s1600-h/DSC00932.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_6CJaDmsVepU/SM1vFCNuuHI/AAAAAAAAASU/u5cWCqj5FXc/s320/DSC00932.JPG" alt="" id="BLOGGER_PHOTO_ID_5245971273240983666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;No mais, foi muito bom conhecer caras como &lt;a href="http://weblogs.java.net/blog/kohsuke/"&gt;Kohsuke Kawaguchi&lt;/a&gt; e &lt;a href="http://weblogs.java.net/blog/brinkley/"&gt;Roger Brinkley&lt;/a&gt; da Sun, e conheci pessoalmente o Eduardo Guerra da &lt;a href="http://www.mundojava.com.br/"&gt;Mundo Java&lt;/a&gt;,  inclusive tivemos uma ótima conversa com o Kawaguchi sobre o metadados, GlassFish V3, OSGi, entre outras coisas.&lt;br /&gt;&lt;br /&gt;E claro, foi ótimo rever os amigos, Mauricio Leal, Bruno Souza, Michel Graciano, Alessandro Lazarotti, Cristian Sanchez, Jefferson Prestes, Carlos Fernando Gonçalves e toda a galera da Globalcode.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;O evento como um todo foi muito bom, e mostra a força que tem, parabéns para o Mauricio Leal e o SOUJava que trabalharam muito para trazer a todos um evento com ótimas palestras e uma organização impecável... só mais um comentário, é impressionante ver como a galera ama Java =) heheh,, o evento começou as nove horas da manhã e acabava apenas as oito da noite, só que depois deste horário ainda tinham as muvucas, que acabavam em torno das 21:00 - 21:30, o engraçado foi ver que tinha pessoas tristes por ter acabado a muvuca 21:30, incluvise tem quem sugerisse um happy hour após as muvucas para continuar as discussões.. =) ,,&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6CJaDmsVepU/SM1wssIqd4I/AAAAAAAAASk/jP0LGJOqBik/s1600-h/DSC00927.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_6CJaDmsVepU/SM1wssIqd4I/AAAAAAAAASk/jP0LGJOqBik/s320/DSC00927.JPG" alt="" id="BLOGGER_PHOTO_ID_5245973054020548482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Brincadeiras a parte, parabéns a todos que fizeram o evento a acontecer, é por essas e outras que a linguagem é a mais utilizada no mundo..&lt;br /&gt;&lt;br /&gt;Diversão garantida !!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-3792553027758012831?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/3792553027758012831/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=3792553027758012831' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/3792553027758012831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/3792553027758012831'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2008/09/just-java-2008-consideraes.html' title='[Just Java 2008] - Considerações'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6CJaDmsVepU/SM1wBu4BrrI/AAAAAAAAASc/jHdKFX_J7a4/s72-c/DSC00925.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-4814169004132714710</id><published>2008-08-31T14:53:00.000-03:00</published><updated>2008-09-15T13:43:28.071-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Just Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Eventos'/><category scheme='http://www.blogger.com/atom/ns#' term='JAVA EE'/><title type='text'>Just Java 2008</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6CJaDmsVepU/SLx9PkVNBVI/AAAAAAAAASE/8nn8dSKDTdQ/s1600-h/JustJava2008.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_6CJaDmsVepU/SLx9PkVNBVI/AAAAAAAAASE/8nn8dSKDTdQ/s320/JustJava2008.jpg" alt="" id="BLOGGER_PHOTO_ID_5241201772756534610" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Esta chegando o Just Java 2008, em Setembro no &lt;a href="http://weblogs.java.net/blog/maltron/archive/2008/08/september_the_m_1.html"&gt;mês do Java&lt;/a&gt; a festa do Just Java será em São Paulo nos dias 10, 11 e 12 de Setembro. Será a 7a edição do principal evento da Comunidade Java Brasileira.&lt;br /&gt;Serão 3 dias com várias palestras relacionadas a Java e agora com alguns temas sobre Agile, hora de aprender um pouco mais, rever os amigos e reforçar o Networking.&lt;br /&gt;&lt;br /&gt;Eu vou representar no Just Java com duas palestras junto com meu grande amigo Renato Bellia, no dia 10 ás 15:00 hs com a palestra &lt;span style="font-weight: bold;"&gt;Java EE 6 / EJB 3.1 e o Futuro do Java Corporativo&lt;/span&gt; no auditório superior 2, e no dia 11 de Setembro será a vez de falar do framework&lt;span style="font-weight: bold;"&gt; Diamond Powder - Produtividade OpenSource para JavaME&lt;/span&gt;, que é um projeto criado pelo Bellia.&lt;br /&gt;&lt;br /&gt;Neste projeto do Diamond Powder, tive a felicidade de participar com o desenvolvimento de um plugin para o NetBeans para facilitar a criação do Schema, que é um Hashtable que descreve o os campos do coletor, as páginas, fluxo de navegação com opção de persistência.&lt;br /&gt;Você que desenvolve aplicativos embarcados vale a pena conhecer este framework!!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Site do Evento: &lt;/span&gt;&lt;a href="http://www.sucesusp.org.br/justjava2008/"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;http://www.sucesusp.org.br/justjava2008/&lt;/a&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;Grade de Palestras:&lt;/span&gt;  &lt;a href="http://soujava.org.br/display/v/Grade+de+Palestras"&gt;http://soujava.org.br/display/v/Grade+de+Palestras&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Diamond Powder no java.net:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt; &lt;a href="https://diamond-powder.dev.java.net/"&gt;https://diamond-powder.dev.java.net/&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Blog do Diamond Powder:&lt;/span&gt; &lt;a href="https://diamond-powder.dev.java.net/"&gt;https://diamond-powder.dev.java.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Participe, é diversão garantida !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/544668644670311424-4814169004132714710?l=netfeijao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netfeijao.blogspot.com/feeds/4814169004132714710/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=544668644670311424&amp;postID=4814169004132714710' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/4814169004132714710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/544668644670311424/posts/default/4814169004132714710'/><link rel='alternate' type='text/html' href='http://netfeijao.blogspot.com/2008/08/just-java-2008.html' title='Just Java 2008'/><author><name>Wagner Santos</name><uri>http://www.blogger.com/profile/01837369605547921799</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_6CJaDmsVepU/SzombfJfDcI/AAAAAAAAAsg/QhOrpPu3SWE/S220/Wagner.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6CJaDmsVepU/SLx9PkVNBVI/AAAAAAAAASE/8nn8dSKDTdQ/s72-c/JustJava2008.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-544668644670311424.post-323333092094331547</id><published>2008-08-27T10:24:00.001-03:00</published><updated>2009-06-09T18:46:38.077-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Services'/><category scheme='http://www.blogger.com/atom/ns#' term='Web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Artigos'/><title type='text'>Entendendo REST (REpresentational State Transfer)</title><content type='html'>Você já precisou explicitamente utilizar algum método (PUT, DELETE, POST, GET) do protocolo HTTP, muito dificil, geralmente quando o fazemos, nós fazemos isto ao desenvolver uma aplicação web para especificar o tipo de submit, enfim, agora encontraram uma solução muito útil para utilizar os tais métodos, que é através de REST (REpresentational State Transfer), que é o nome dado por Roy Fielding em sua tese de doutorado, muita gente confunde REST com Web Services SOAP, mas ambos são totalmente diferentes.&lt;br /&gt;&lt;br /&gt;REST são serviços stateless e arquiteturas baseadas nela são construídas a partir de "pedaços de informação" únicas identificadas por URIs. Em sistemas REST, os recursos são manipulados através da troca de representações do recurso.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ex.:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;http://netfeijao.blogspot.com/colecao/marvel/spiderman/3&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Neste exemplo, atráves desta URI estamos definindo como a URI mapeia nossos recursos, no exemplo fica muito fácil entender como funciona, identificamos nossa chave primária (3) no último elemento, e o nome da coleção (spiderman), podemos ainda definir um serviço que me retorne uma coleção de objetos do spiderman caso seja omitido a chave primária,&lt;br /&gt;&lt;br /&gt;Por as URIs serem únicas ganhamos uma busca otimizada e posso ter multiplas representações oferecendo esta informação em vários tipos de formatos como XML, JSON e XHTML.&lt;br /&gt;&lt;br /&gt;Temos um DE-PARA dos métodos HTTP com as funções CRUD que queremos desempenhar em um sistema baseado em REST, conforme tabela abaixo:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6CJaDmsVepU/SLVl8EPTe5I/AAAAAAAAAR8/cHI3utUjgfI/s1600-h/REST-CRUD.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_6CJaDmsVepU/SLVl8EPTe5I/AAAAAAAAAR
