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

<channel>
	<title>Bruno Pereira</title>
	<atom:link href="http://brunopereira.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://brunopereira.org</link>
	<description>Open source, Java, web, python, client-side e outros hobbies :)</description>
	<lastBuildDate>Tue, 03 Aug 2010 12:29:24 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Uso de Hypermedia em protocolos REST</title>
		<link>http://brunopereira.org/2010/08/03/uso-de-hypermedia-em-protocolos-rest/</link>
		<comments>http://brunopereira.org/2010/08/03/uso-de-hypermedia-em-protocolos-rest/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 12:18:44 +0000</pubDate>
		<dc:creator>blpsilva</dc:creator>
				<category><![CDATA[design]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[hypermedia]]></category>
		<category><![CDATA[rest]]></category>

		<guid isPermaLink="false">http://brunopereira.org/?p=370</guid>
		<description><![CDATA[Algumas vezes amigos já me questionaram sobre o uso de Hypermedia em protocolos REST. É sem dúvida um assunto que me agrada bastante, e acho que a discussão pode trazer boas idéias para quem implementar serviços REST interessantes.
Começando do começo: o que é Hypermedia?
Hypermedia é uma extensão lógica de Hypertext, na qual conseguimos combinar gráficos, [...]]]></description>
			<content:encoded><![CDATA[<p>Algumas vezes amigos já me questionaram sobre o uso de Hypermedia em protocolos REST. É sem dúvida um assunto que me agrada bastante, e acho que a discussão pode trazer boas idéias para quem implementar serviços REST interessantes.</p>
<h2>Começando do começo: o que é Hypermedia?</h2>
<p><a title="Hypermedia" href="http://en.wikipedia.org/wiki/Hypermedia" target="_blank">Hypermedia</a> é uma extensão lógica de <a title="Hypertext" href="http://en.wikipedia.org/wiki/Hypertext" target="_blank">Hypertext</a>, na qual conseguimos combinar gráficos, áudio, vídeo, texto plano e hyperlinks para criar um fluxo de navegação não-linear. (Definição retirada da Wikipedia).</p>
<h2>Motivação: REST sem Hypermedia</h2>
<p>No <a title="Artigo REST" href="http://brunopereira.org/webservicesrest-indice/" target="_blank">artigo de REST</a> que escrevi no começo de 2008 eu falei sobre diversos aspectos importantes em um protocolo de comunicação REST. Recomendo a leitura para quem ainda não tenha visto o artigo. Naquele artigo, cobri praticamente todos os detalhes aos quais devemos prestar atenção &#8211; a exceção ficou por conta de Hypermedia.</p>
<p>Para ilustrar uma resposta REST sem uso de Hypermedia, copio aqui uma listagem que usei no <a title="Artigo REST" href="http://brunopereira.org/artigos/" target="_blank">artigo de REST da Java Magazine</a>.</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">HTTP/1.1 200 OK
Date: nnn
Content-Type: text/xml; charset=utf-8
Content-Length: nnn
Last-Modified: Sat, 19 Feb 2008 13:40:03 GMT
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ofertasDoItem<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;oferta<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;codOferta<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>23c32440-959a-4c33-b6ee-caff8e41422a<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/codOferta<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;valor<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>111.22<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/valor<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dataModificacao<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>2008-02-05<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dataModificacao<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;codItem<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>b7d24e54-0c0d-4fa0-b4fe-d7cf60180ed7<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/codItem<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;novo<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>false<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/novo<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;vendido<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>false<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/vendido<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ofertante<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;codUsuario<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>505ab9d4-4b4b-4ce6-b128-b7408268126c<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/codUsuario<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ofertante<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;vencedora<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>false<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/vencedora<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/oferta<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;oferta<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;codOferta<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>41ffac11-5ba2-405b-acc8-8e3d0904b158<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/codOferta<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;valor<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>111.22<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/valor<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dataModificacao<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>2008-02-14<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dataModificacao<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;codItem<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>b7d24e54-0c0d-4fa0-b4fe-d7cf60180ed7<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/codItem<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;novo<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>false<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/novo<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;vendido<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>false<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/vendido<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ofertante<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;codUsuario<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>505ab9d4-4b4b-4ce6-b128-b7408268126c<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/codUsuario<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ofertante<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;vencedora<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>false<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/vencedora<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/oferta<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ofertasDoItem<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Se você julga que isso parece um grafo de objetos serializado, você não está enganado, é exatamente isso.</p>
<h2>O que temos a ganhar com Hypermedia?</h2>
<p>Quando implementamos a API REST da autenticação/autorização/cadastro da Globo.com, o protocolo REST sem Hypermedia atendeu perfeitamente. A comunicação funcionou, permitiu integração de clientes de todas as plataformas, de forma desacoplada tecnologicamente. No que será que Hypermedia poderia ajudar?</p>
<p>O cerne do benefício de Hypermedia está no conhecimento prévio que os clientes devem ter sobre o seu protocolo. Repare no seguinte fragmento da resposta:</p>
<p>&lt;item&gt;<br />
&lt;codItem&gt;b7d24e54-0c0d-4fa0-b4fe-d7cf60180ed7&lt;/codItem&gt;<br />
&lt;novo&gt;false&lt;/novo&gt;<br />
&lt;vendido&gt;false&lt;/vendido&gt;<br />
&lt;/item&gt;</p>
<p>O que podemos dizer sobre ele? Ele traz informações &#8220;quase&#8221; completas sobre o item em questão. Todos os atributos estão presentes, porém não dizemos nada ao cliente sobre como interagir com este recurso, não é verdade? Um cliente que receba este XML conseguirá manipulá-lo <strong>SE JÁ SOUBER PREVIAMENTE COMO</strong>! O cliente já deve conhecer as URIs de cada recurso e saber quais manipulações ele pode fazer sobre os mesmos.</p>
<p>Como Hypermedia pode nos levar além? Com Hypermedia podemos dizer aos clientes como manipular os recursos, e com isso diminuir a inteligência embutida nos clientes.</p>
<h2>Exemplo de resposta usando Hypermedia</h2>
<p>Agora pegarei um trecho do meu artigo sobre AtomPub para exemplificar uma resposta com uso de Hypermedia:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;atom:entry</span> <span style="color: #000066;">xmlns:atom</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/2005/Atom&quot;</span></span>
<span style="color: #009900;"><span style="color: #000066;">xmlns:apps</span>=<span style="color: #ff0000;">&quot;http://schemas.google.com/apps/2006&quot;</span></span>
<span style="color: #009900;"><span style="color: #000066;">xmlns:gd</span>=<span style="color: #ff0000;">&quot;http://schemas.google.com/g/2005&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;atom:id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>https://www.google.com/a/feeds/example.com/user/2.0/SusanJones<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/atom:id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;atom:updated<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1970-01-01T00:00:00.000Z<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/atom:updated<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;atom:category</span> <span style="color: #000066;">scheme</span>=<span style="color: #ff0000;">&quot;http://schemas.google.com/g/2005#kind&quot;</span></span>
<span style="color: #009900;"><span style="color: #000066;">term</span>=<span style="color: #ff0000;">&quot;http://schemas.google.com/apps/2006#user&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;atom:title</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;text&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>SusanJones<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/atom:title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;atom:link</span> <span style="color: #000066;">rel</span>=<span style="color: #ff0000;">&quot;self&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;application/atom+xml&quot;</span></span>
<span style="color: #009900;"><span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;https://www.google.com/a/feeds/example.com/user/2.0/SusanJones&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;atom:link</span> <span style="color: #000066;">rel</span>=<span style="color: #ff0000;">&quot;edit&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;application/atom+xml&quot;</span></span>
<span style="color: #009900;"><span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;https://www.google.com/a/feeds/example.com/user/2.0/SusanJones&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;apps:login</span> <span style="color: #000066;">userName</span>=<span style="color: #ff0000;">&quot;SusanJones&quot;</span> <span style="color: #000066;">suspended</span>=<span style="color: #ff0000;">&quot;false&quot;</span> <span style="color: #000066;">admin</span>=<span style="color: #ff0000;">&quot;false&quot;</span> <span style="color: #000066;">changePasswordAtNextLogin</span>=<span style="color: #ff0000;">&quot;false&quot;</span> <span style="color: #000066;">agreedToTerms</span>=<span style="color: #ff0000;">&quot;true&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;apps:name</span> <span style="color: #000066;">familyName</span>=<span style="color: #ff0000;">&quot;Jones&quot;</span> <span style="color: #000066;">givenName</span>=<span style="color: #ff0000;">&quot;Susan&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;gd:feedLink</span> <span style="color: #000066;">rel</span>=<span style="color: #ff0000;">&quot;http://schemas.google.com/apps/2006#user.nicknames&quot;</span></span>
<span style="color: #009900;"><span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;https://www.google.com/a/feeds/example.com/nickname/2.0?</span>
<span style="color: #009900;">username=Susy-1321&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;gd:feedLink</span> <span style="color: #000066;">rel</span>=<span style="color: #ff0000;">&quot;http://schemas.google.com/apps/2006#user.emailLists&quot;</span></span>
<span style="color: #009900;"><span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;https://www.google.com/a/feeds/example.com/emailList/2.0?</span>
<span style="color: #009900;">recipient=us-sales@example.com&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/atom:entry<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Qual é a principal diferença aqui? Através do uso de <strong>links</strong> conseguimos indicar uma URI para manipulação do recurso, e através do atributo <strong>rel</strong>, indicamos QUAL é a manipulação. Algumas coisas ainda ficam implícitas. Por exemplo, se o link indica um <strong>rel=&#8221;edit&#8221;</strong>, a manipulação em questão provavelmente será feita com uma requisição HTTP PUT. Se o link tiver um <strong>rel=&#8221;show&#8221;</strong>, a manipulação deve ser uma leitura, feita com HTTP GET.</p>
<h2>Hypermedia x Acoplamento</h2>
<p>Neste ponto deve ter ficado claro que o uso de Hypermedia confere maior significado ao protocolo de comunicação. Em vez de trafegar dados crus, enviamos também metadados que permitem a construção de clientes mais genéricos dos nossos serviços.</p>
<p>Reduzindo o conhecimento que os clientes têm sobre o servidor, naturalmente o acoplamento diminui. O servidor precisa manter fixa apenas  a URI inicial da conversação, pois as posteriores serão informadas durante a comunicação.</p>
<p>O servidor pode também utilizar múltiplos tipos de conteúdo, de forma que alguns clientes consigam interagir de forma mais ampla. Um exemplo seria um IPod que sabe consumir podcasts, enquanto estes seriam ignorados por um browser comum.</p>
<h2>Precisamos de Hypermedia em um protocolo REST?</h2>
<p><strong>Resposta curta</strong>: na minha opinião não.</p>
<p><strong>Resposta longa</strong>: espero que minha resposta curta não tenha deixado a impressão de que não valorizo Hypermedia. Muito pelo contrário, acho que um protocolo que use Hypermedia será muito elegante e terá baixo acomplamento.</p>
<p>Entretanto, construir protocolos para clientes genéricos é bem mais difícil. Em alguns casos a decisão de diminuir o acoplamento aumenta na mesma proporção a complexidade do protocolo de comunicação envolvido.</p>
<p>É perfeitamente possível criar um excelente protocolo de comunicação sem Hypermedia. Você poderá ter clientes de múltiplas plataformas, conversando com seu servidor em múltiplos formatos de conteúdo.</p>
<p>Há um ponto de atenção no quanto seus clientes conhecem sobre seus formatos de URIs. Sem Hypermedia, mudanças de URIs podem quebrar seus clientes, o que traz um nível de acoplamento maior do que o existente com Hypermedia.</p>
<p><strong>Recomendação geral</strong>: o uso de Hypermedia é consistente com a arquitetura da web, utilizada há muitos anos com sucesso. Quando um protocolo de comunicação REST faz uso de Hypermedia, o acoplamento fica baixo e nos dá bastante liberdade para evolução. O ideal é tentar usar Hypermedia ao máximo desde o começo, mas sempre ponderando o nível de complexidade na construção dos clientes.</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 1066px; width: 1px; height: 1px; overflow: hidden;">
<p style="margin-bottom: 0in;" lang="en-US"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;</span></span></p>
<p style="margin-bottom: 0in;" lang="en-US"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">&lt;atom:entry xmlns:atom=&#8221;http://www.w3.org/2005/Atom&#8221;</span></span></p>
<p style="margin-bottom: 0in;" lang="en-US"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">xmlns:apps=&#8221;http://schemas.google.com/apps/2006&#8243;</span></span></p>
<p style="margin-bottom: 0in;" lang="en-US"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">xmlns:gd=&#8221;http://schemas.google.com/g/2005&#8243;&gt;</span></span></p>
<p style="margin-bottom: 0in;" lang="en-US"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">&lt;atom:id&gt;https://www.google.com/a/feeds/example.com/user/2.0/SusanJones&lt;/atom:id&gt;</span></span></p>
<p style="margin-bottom: 0in;" lang="en-US"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">&lt;atom:updated&gt;1970-01-01T00:00:00.000Z&lt;/atom:updated&gt;</span></span></p>
<p style="margin-bottom: 0in;" lang="en-US"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">&lt;atom:category scheme=&#8221;http://schemas.google.com/g/2005#kind&#8221;</span></span></p>
<p style="margin-bottom: 0in;" lang="en-US"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">term=&#8221;http://schemas.google.com/apps/2006#user&#8221;/&gt;</span></span></p>
<p style="margin-bottom: 0in;" lang="en-US"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">&lt;atom:title type=&#8221;text&#8221;&gt;SusanJones&lt;/atom:title&gt;</span></span></p>
<p style="margin-bottom: 0in;" lang="en-US"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">&lt;atom:link rel=&#8221;self&#8221; type=&#8221;application/atom+xml&#8221; </span></span></p>
<p style="margin-bottom: 0in;" lang="en-US"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">href=&#8221;https://www.google.com/a/feeds/example.com/user/2.0/SusanJones&#8221;/&gt;</span></span></p>
<p style="margin-bottom: 0in;" lang="en-US"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">&lt;atom:link rel=&#8221;edit&#8221; type=&#8221;application/atom+xml&#8221; </span></span></p>
<p style="margin-bottom: 0in;" lang="en-US"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">href=&#8221;https://www.google.com/a/feeds/example.com/user/2.0/SusanJones&#8221;/&gt;</span></span></p>
<p style="margin-bottom: 0in;" lang="en-US"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">&lt;apps:login userName=&#8221;SusanJones&#8221; suspended=&#8221;false&#8221; admin=&#8221;false&#8221; changePasswordAtNextLogin=&#8221;false&#8221; agreedToTerms=&#8221;true&#8221;/&gt;</span></span></p>
<p style="margin-bottom: 0in;" lang="en-US"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">&lt;apps:name familyName=&#8221;Jones&#8221; givenName=&#8221;Susan&#8221;/&gt;</span></span></p>
<p style="margin-bottom: 0in;" lang="en-US"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">&lt;gd:feedLink rel=&#8221;http://schemas.google.com/apps/2006#user.nicknames&#8221; </span></span></p>
<p style="margin-bottom: 0in;" lang="en-US"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">href=&#8221;https://www.google.com/a/feeds/example.com/nickname/2.0?</span></span></p>
<p style="margin-bottom: 0in;" lang="en-US"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;"> username=Susy-1321&#8243;/&gt;</span></span></p>
<p style="margin-bottom: 0in;" lang="en-US"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">&lt;gd:feedLink rel=&#8221;http://schemas.google.com/apps/2006#user.emailLists&#8221; </span></span></p>
<p style="margin-bottom: 0in;" lang="en-US"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">href=&#8221;https://www.google.com/a/feeds/example.com/emailList/2.0?</span></span></p>
<p style="margin-bottom: 0in;" lang="en-US"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;"> recipient=us-sales@example.com&#8221;/&gt;</span></span></p>
<p style="margin-bottom: 0in;" lang="en-US"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">&lt;/atom:entry&gt;</span></span></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://brunopereira.org/2010/08/03/uso-de-hypermedia-em-protocolos-rest/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException</title>
		<link>http://brunopereira.org/2010/07/16/com-mysql-jdbc-exceptions-jdbc4-mysqlnontransientconnectionexception/</link>
		<comments>http://brunopereira.org/2010/07/16/com-mysql-jdbc-exceptions-jdbc4-mysqlnontransientconnectionexception/#comments</comments>
		<pubDate>Fri, 16 Jul 2010 03:27:40 +0000</pubDate>
		<dc:creator>blpsilva</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[autoreconnect]]></category>
		<category><![CDATA[datasource]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[jboss]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://brunopereira.org/?p=362</guid>
		<description><![CDATA[O título deste post é uma exceção do driver do MySql que ocorre em algumas situações e pode ser difícil de diagnosticar a causa. A mensagem completa é: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Connection.close() has already been called. Invalid operation in this state.
Tive este problema em um ambiente de QA essa semana e vou deixar aqui informações que devem [...]]]></description>
			<content:encoded><![CDATA[<p>O título deste post é uma exceção do driver do MySql que ocorre em algumas situações e pode ser difícil de diagnosticar a causa. A mensagem completa é: <strong>com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Connection.close() has already been called. Invalid operation in this state.</strong></p>
<p>Tive este problema em um ambiente de QA essa semana e vou deixar aqui informações que devem solucionar a maioria dos problemas relacionados. Há 2400 resultados no Google sobre MySQLNonTransientConnectionException, deve ter ocorrido muito já.</p>
<p>Esta exceção é lançada quando uma aplicação Java tenta utilizar uma conexão, mas ela já foi fechada no MySql. Os cenários mais comuns para isso são:</p>
<ul>
<li>MySql foi reiniciado</li>
<li>Problema de rede na conexão com MySql</li>
<li>Conexão ficou ociosa tempo demais, e o MySql fechou-a</li>
</ul>
<p>Estes cenários podem ser raros na sua infra, mas é importante que sua aplicação consiga lidar com isso. Minha aplicação usa o Hibernate, conectado a um pool de conexões do JBoss. O datasource em QA estava configurado assim:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;datasources<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;local-tx-datasource<span style="color: #000000; font-weight: bold;">&gt;</span></span></span> 
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;jndi-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>NomeDS<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/jndi-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;connection-url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>jdbc:mysql://servidormysql:3306/nome_schema<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/connection-url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;driver-class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>com.mysql.jdbc.Driver<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/driver-class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;user-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>usuario<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/user-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;password<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>senha<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/password<span style="color: #000000; font-weight: bold;">&gt;</span></span></span> 
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;min-pool-size<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/min-pool-size<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;max-pool-size<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>20<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/max-pool-size<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>    
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exception-sorter-class-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exception-sorter-class-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;metadata<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;type-mapping<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>mySQL<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/type-mapping<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/metadata<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/local-tx-datasource<span style="color: #000000; font-weight: bold;">&gt;</span></span></span> 
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/datasources<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>A solução no meu caso foi incluir um novo parâmetro no datasource indicando uma query para o JBoss checar se a conexão é válida ou não: <strong>&lt;check-valid-connection-sql&gt;select 1&lt;/check-valid-connection-sql&gt;</strong>. Este elemento é filho de <strong>&lt;local-tx-datasource&gt;</strong>. Com a introdução deste parâmetro, o JBoss consegue identificar que a conexão já não é válida e então obtém uma nova conexão.</p>
<p>Nas minhas buscas vi muitas pessoas com esse problema rodando no Tomcat sem um pool de conexões. A solução para eles foi criar um pool com C3P0, como <a href="http://seamframework.org/Community/JDBCCommitFailed">nesse exemplo</a>. É importante prestar atenção na configuração para que seja feita a renovação das conexões em caso de falha. Isto parece ser feito com o parâmetro no C3P0: <strong>&lt;property name=&#8221;connection.provider_class&#8221;&gt;org.hibernate.connection.C3P0ConnectionProvider&lt;/property&gt;</strong></p>
<p>Observação importante: colocar o parâmetro ?autoReconnect=true na URL jdbc NÃO resolve o problema, só muda a exceção. Além disso, <a href="http://dev.mysql.com/doc/refman/5.1/en/connector-j-usagenotes-troubleshooting.html">o parâmetro autoReconnect é deprecated e não é recomendada a utilização</a>.</p>
<p>That&#8217;s all folks!</p>
]]></content:encoded>
			<wfw:commentRss>http://brunopereira.org/2010/07/16/com-mysql-jdbc-exceptions-jdbc4-mysqlnontransientconnectionexception/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Acelerando seu site &#8211; Parte 1: habilitando compressão</title>
		<link>http://brunopereira.org/2010/06/20/acelerando-seu-site-parte-1-habilitando-compressao/</link>
		<comments>http://brunopereira.org/2010/06/20/acelerando-seu-site-parte-1-habilitando-compressao/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 01:21:47 +0000</pubDate>
		<dc:creator>blpsilva</dc:creator>
				<category><![CDATA[otimização]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[caelum]]></category>
		<category><![CDATA[firebug]]></category>
		<category><![CDATA[mod_deflate]]></category>
		<category><![CDATA[page speed]]></category>
		<category><![CDATA[yslow]]></category>

		<guid isPermaLink="false">http://brunopereira.org/?p=355</guid>
		<description><![CDATA[Recentemente tenho me envolvido bastante com otimização de sites e aplicações web. Fazendo uma pesquisa diversificada em muitos sites nacionais e internacionais, pude constatar que a grande maioria dos sites deixa muito a desejar nos critérios de velocidade/eficiência. As ferramentas mais simples para medir a eficiência das páginas são o Google Page Speed e o [...]]]></description>
			<content:encoded><![CDATA[<p>Recentemente tenho me envolvido bastante com otimização de sites e aplicações web. Fazendo uma pesquisa diversificada em muitos sites nacionais e internacionais, pude constatar que a grande maioria dos sites deixa muito a desejar nos critérios de velocidade/eficiência. As ferramentas mais simples para medir a eficiência das páginas são o <a title="Google Page Speed" href="http://code.google.com/speed/page-speed/" target="_blank">Google Page Speed</a> e o <a title="YSlow" href="http://developer.yahoo.com/yslow/" target="_blank">YSlow</a>(do Yahoo). Ambos são extensões do <a title="Firebug" href="http://getfirebug.com/" target="_blank">Firebug</a>, então você precisa primeiro instalá-lo no Firefox.</p>
<p>Para uma referência dos ratings do Page Speed e YSlow, sites com rating acima de 80 podem ser considerados muito bons. É possível chegar até  90 sem configurações muito complicadas. Até hoje, o site com os maiores ratings que já encontrei em toda a internet é o site da <a title="Caelum" href="http://www.caelum.com.br" target="_blank">Caelum</a>. Rodei agora os testes e eles estão c/ 96 no Page Speed e 100 no YSlow. O meu blog está c/ 85 no Page Speed e 84 no YSlow <img src='http://brunopereira.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>A maioria das técnicas de otimização é simples de aplicar, e é possível ter ótimos resultados com bem pouco trabalho. Escreverei uma série de posts curtos e objetivos explicando as principais técnicas e mostrando como utilizá-las nas arquiteturas mais comumente usadas.</p>
<h2>Motivação</h2>
<p>Todos os browsers modernos possuem recursos de descompressão de conteúdo, e boa parte dos arquivos servidos em aplicações web podem ser bem comprimidos. Habilitando compressão no servidor o tempo de resposta das páginas diminui, e com isso cai também o tráfego do servidor.</p>
<h2>Como fazer</h2>
<p>O servidor web mais utilizado na internet é o <a title="Apache HTTP Server" href="http://httpd.apache.org/" target="_blank">Apache</a>. Mostrarei inicialmente a configuração somente dele, e caso alguém queira saber também do IIS e nginx, complementarei posteriormente.</p>
<p>Para habilitar a compressão, deve estar ativo <a title="mod_deflate" href="http://httpd.apache.org/docs/2.0/mod/mod_deflate.html" target="_blank">mod_deflate</a>. No Ubuntu você pode verificar os módulos ativos listando o diretório /etc/apache2/mods-enabled.</p>
<p>A opção mais simples de configuração é utilizar a diretiva: <code>SetOutputFilter DEFLATE</code></p>
<p>Esta opção habilita compressão para tudo, no escopo onde for colocada. Podemos habilitar compressão em um virtual host, em um diretório ou até mesmo em todos os arquivos servidos pelo Apache.</p>
<p>Outra opção é habilitar compressão somente para alguns tipos de arquivos, com esta diretiva: <code>AddOutputFilterByType DEFLATE text/html text/plain text/xml</code></p>
<p>Na documentação do mod_deflate há cenários mais complicados, como verificações do browser, manipulação de cabeçalhos HTTP, consumo de conteúdo comprimido, entre outras coisas. Se alguém tiver dúvidas posso ajudar no setup de testes.</p>
<h2>Verificando que funcionou</h2>
<p>Para verificar que a compressão está ativa, podemos utilizar o <a title="Poster" href="https://addons.mozilla.org/en-US/firefox/addon/2691/" target="_blank">Poster</a> para requisitar uma página do site e conferir o cabeçalho Content-Encoding da resposta, conforme imagem abaixo. Se aparecer o encoding gzip, a compressão está ativa.</p>
<p><a href="http://brunopereira.org/wp-content/uploads/2010/06/poster_compressao.png"><img class="alignnone size-full wp-image-360" title="poster_compressao" src="http://brunopereira.org/wp-content/uploads/2010/06/poster_compressao.png" alt="" width="835" height="638" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://brunopereira.org/2010/06/20/acelerando-seu-site-parte-1-habilitando-compressao/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Ajax com validação no VRaptor c/ jQuery</title>
		<link>http://brunopereira.org/2010/06/17/ajax-com-validacao-no-vraptor-c-jquery/</link>
		<comments>http://brunopereira.org/2010/06/17/ajax-com-validacao-no-vraptor-c-jquery/#comments</comments>
		<pubDate>Fri, 18 Jun 2010 00:57:45 +0000</pubDate>
		<dc:creator>blpsilva</dc:creator>
				<category><![CDATA[client-side]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[vraptor]]></category>

		<guid isPermaLink="false">http://brunopereira.org/?p=348</guid>
		<description><![CDATA[Depois de um longo inverno estou voltando a escrever, e estou com algumas coisas na fila que devem sair em breve. Sem muita cerimônia, quero mostrar uma abordagem que me agrada de ajax com validação no VRaptor usando o jQuery.
O código é bem sucinto e simplório, somente com o necessário para falar do que quero. [...]]]></description>
			<content:encoded><![CDATA[<p>Depois de um longo inverno estou voltando a escrever, e estou com algumas coisas na fila que devem sair em breve. Sem muita cerimônia, quero mostrar uma abordagem que me agrada de ajax com validação no VRaptor usando o jQuery.</p>
<p>O código é bem sucinto e simplório, somente com o necessário para falar do que quero. Primeiro a classe JsonController, com 2 métodos que serão acessados pelo client jQuery. Um deles ilustra uma requisição com sucesso e o outro uma requisição com erro.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.ArrayList</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.List</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.com.caelum.vraptor.Get</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.com.caelum.vraptor.Path</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.com.caelum.vraptor.Resource</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.com.caelum.vraptor.Result</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.com.caelum.vraptor.view.Results</span><span style="color: #339933;">;</span>
&nbsp;
@Resource
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> JsonController <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> Result result<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> JsonController<span style="color: #009900;">&#40;</span>Result result<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">result</span> <span style="color: #339933;">=</span> result<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Get
	@Path<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/json/erro&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> jsonErro<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		List<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;</span> erros <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ArrayList<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		erros.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Erro 1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		erros.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Erro 2&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #666666; font-style: italic;">//Results.http() em vez de Status.badRequest(), pois este força uma página de erro, que ñ serve p/ um cliente ajax </span>
		result.<span style="color: #006633;">use</span><span style="color: #009900;">&#40;</span>Results.<span style="color: #006633;">http</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setStatusCode</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">400</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
		result.<span style="color: #006633;">use</span><span style="color: #009900;">&#40;</span>Results.<span style="color: #006633;">json</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">from</span><span style="color: #009900;">&#40;</span>erros, <span style="color: #0000ff;">&quot;erros&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">serialize</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Get
	@Path<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/json/sucesso&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> jsonSucesso<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		List<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;</span> strings <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ArrayList<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		strings.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Texto 1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		strings.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Texto 2&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		result.<span style="color: #006633;">use</span><span style="color: #009900;">&#40;</span>Results.<span style="color: #006633;">http</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setStatusCode</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">200</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		result.<span style="color: #006633;">use</span><span style="color: #009900;">&#40;</span>Results.<span style="color: #006633;">json</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">from</span><span style="color: #009900;">&#40;</span>strings, <span style="color: #0000ff;">&quot;strings&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">serialize</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Observação importante sobre o Controller: quem me conhece sabe da minha predileção por bons designs com REST, então neste exemplo essa premissa é seguida. O caso de sucesso retorna um HTTP 200 indicando o sucesso, e o caso de erro retorna HTTP 400 (Bad Request), indicando ao cliente que sua requisição tinha problemas que precisam ser corrigidos.</p>
<p>Ambos os casos retornam JSON para o cliente Ajax. No caso de sucesso o jQuery consome isto diretamente. No caso de erro o JSON com os erros será consumido do responseText do XmlHttpRequest.</p>
<p>Criei um HTML simples para teste, com 2 botões para gerar os requests ajax de sucesso e de erro.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #00bbdd;">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">html</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">meta</span> <span style="color: #000066;">http-equiv</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Content-Type&quot;</span> <span style="color: #000066;">content</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/html;charset=UTF-8&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">title</span>&gt;</span>Ajax com validação<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">title</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">body</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;public&quot;</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;container&quot;</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">h1</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;logo&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">h1</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">form</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;teste-json&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;teste-json&quot;</span> <span style="color: #000066;">enctype</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;application/x-www-form-urlencoded&quot;</span> <span style="color: #000066;">method</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;post&quot;</span> <span style="color: #000066;">action</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/json/erro&quot;</span>&gt;</span>
&nbsp;
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;info&quot;</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">h2</span>&gt;</span>Teste JSON<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">h2</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;info&quot;</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">ul</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;campos-cadastro&quot;</span>&gt;</span>	
	<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;buttons &quot;</span>&gt;</span>
	<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;erro&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;erro&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;button&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Teste Erro&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
	<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
	<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;buttons &quot;</span>&gt;</span>
	<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;sucesso&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;sucesso&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;button&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Teste Sucesso&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
	<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>	
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">ul</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">form</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">img</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;bottom&quot;</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/images/bottom.png&quot;</span> <span style="color: #000066;">alt</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/scripts/jquery-1.4.2.min.js&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/scripts/teste-json.js&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">html</span>&gt;</span></pre></div></div>

<p>Para completar, o javascript que trata do clique nos botões, faz os requests e consome o JSON de sucesso e o JSON com as mensagens de erro.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ready</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> 
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;input#erro&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		$.<span style="color: #660066;">ajax</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
		   type<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;GET&quot;</span><span style="color: #339933;">,</span>
		   url<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;/json/erro&quot;</span><span style="color: #339933;">,</span>
		   dataType<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;json&quot;</span><span style="color: #339933;">,</span>
		   success<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>json<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>    		
    		<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> x <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> x <span style="color: #339933;">&lt;</span> json.<span style="color: #660066;">erros</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> x<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    			<span style="color: #003366; font-weight: bold;">var</span> erro <span style="color: #339933;">=</span> json.<span style="color: #660066;">erros</span><span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    			<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Erro: &quot;</span> <span style="color: #339933;">+</span> erro<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    		<span style="color: #009900;">&#125;</span>    	    
    	  <span style="color: #009900;">&#125;</span>
    	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;input#erro&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ajaxError</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #339933;">,</span> xhr<span style="color: #339933;">,</span> settings<span style="color: #339933;">,</span> exception<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003366; font-weight: bold;">var</span> errosStr <span style="color: #339933;">=</span> xhr.<span style="color: #660066;">responseText</span><span style="color: #339933;">;</span>
		<span style="color: #003366; font-weight: bold;">var</span> json <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">eval</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;(&quot;</span> <span style="color: #339933;">+</span> errosStr <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;)&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		
		<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> x <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> x <span style="color: #339933;">&lt;</span> json.<span style="color: #660066;">erros</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> x<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #003366; font-weight: bold;">var</span> erro <span style="color: #339933;">=</span> json.<span style="color: #660066;">erros</span><span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                        <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Erro: &quot;</span> <span style="color: #339933;">+</span> erro<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;input#sucesso&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		$.<span style="color: #660066;">ajax</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
		   type<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;GET&quot;</span><span style="color: #339933;">,</span>
		   url<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;/json/sucesso&quot;</span><span style="color: #339933;">,</span>
		   dataType<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;json&quot;</span><span style="color: #339933;">,</span>
		   success<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>json<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>    		
    		<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> x <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> x <span style="color: #339933;">&lt;</span> json.<span style="color: #660066;">strings</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> x<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    			<span style="color: #003366; font-weight: bold;">var</span> texto <span style="color: #339933;">=</span> json.<span style="color: #660066;">strings</span><span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    			<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Texto: &quot;</span> <span style="color: #339933;">+</span> texto<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    		<span style="color: #009900;">&#125;</span>    	    
    	  <span style="color: #009900;">&#125;</span>
    	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;input#sucesso&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ajaxError</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #339933;">,</span> xhr<span style="color: #339933;">,</span> settings<span style="color: #339933;">,</span> exception<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003366; font-weight: bold;">var</span> errosStr <span style="color: #339933;">=</span> xhr.<span style="color: #660066;">responseText</span><span style="color: #339933;">;</span>
		<span style="color: #003366; font-weight: bold;">var</span> json <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">eval</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;(&quot;</span> <span style="color: #339933;">+</span> errosStr <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;)&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		
		<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> x <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> x <span style="color: #339933;">&lt;</span> json.<span style="color: #660066;">erros</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> x<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #003366; font-weight: bold;">var</span> erro <span style="color: #339933;">=</span> json.<span style="color: #660066;">erros</span><span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
			<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Erro: &quot;</span> <span style="color: #339933;">+</span> erro<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>				 
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>    
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://brunopereira.org/2010/06/17/ajax-com-validacao-no-vraptor-c-jquery/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Projeto de Integração na América do Sul</title>
		<link>http://brunopereira.org/2010/01/03/projeto-de-integracao-na-america-do-sul/</link>
		<comments>http://brunopereira.org/2010/01/03/projeto-de-integracao-na-america-do-sul/#comments</comments>
		<pubDate>Sun, 03 Jan 2010 13:06:15 +0000</pubDate>
		<dc:creator>blpsilva</dc:creator>
				<category><![CDATA[posts em português]]></category>
		<category><![CDATA[concrete solutions]]></category>
		<category><![CDATA[integração]]></category>
		<category><![CDATA[soa]]></category>
		<category><![CDATA[vagas]]></category>

		<guid isPermaLink="false">http://brunopereira.org/?p=345</guid>
		<description><![CDATA[Pessoal, a Concrete está contratando analistas para um projeto de integração na América do Sul. Os requisitos das vagas são os seguintes:
ANALISTA DE SISTEMAS
Projeto de 3 meses (prorrogável) em país da América do Sul
Fundamental: Inglês fluente
Desejável: Espanhol
Arquitetura SOA
Web Services + WSSE
XPath
XQuery
UML
Orientação a objetos
Modelagem de processos e indicadores (SLA)
Enviar currículos somente EM INGLÊS para:
fernanda.godoy@concretesolutions.com.br
Atenção: Enviar currículos [...]]]></description>
			<content:encoded><![CDATA[<p>Pessoal, a Concrete está contratando analistas para um projeto de integração na América do Sul. Os requisitos das vagas são os seguintes:</p>
<p><strong>ANALISTA DE SISTEMAS</strong><br />
Projeto de 3 meses (prorrogável) em país da América do Sul<br />
Fundamental: Inglês fluente<br />
Desejável: Espanhol<br />
Arquitetura SOA<br />
Web Services + WSSE<br />
XPath<br />
XQuery<br />
UML<br />
Orientação a objetos<br />
Modelagem de processos e indicadores (SLA)</p>
<p><strong>Enviar currículos somente EM INGLÊS para:<br />
</strong><a href="mailto:fernanda.godoy@concretesolutions.com.br" target="_blank">fernanda.godoy@concretesolutions.com.br</a><strong></p>
<p>Atenção: Enviar currículos preferencialmente até o dia 07/01/2010, pois as vagas precisam ser preenchidas rapidamente.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://brunopereira.org/2010/01/03/projeto-de-integracao-na-america-do-sul/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Vaga para Sênior Java e Analista de Infra-estrutura</title>
		<link>http://brunopereira.org/2009/11/05/vaga-para-senior-java-e-analista-de-infra-estrutura/</link>
		<comments>http://brunopereira.org/2009/11/05/vaga-para-senior-java-e-analista-de-infra-estrutura/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 12:06:21 +0000</pubDate>
		<dc:creator>blpsilva</dc:creator>
				<category><![CDATA[posts em português]]></category>

		<guid isPermaLink="false">http://brunopereira.org/?p=344</guid>
		<description><![CDATA[Pessoal, estão abertas 2 vagas para contratação imediata na Concrete. Uma delas é para um profissional sênior Java, com o perfil abaixo:
Java Senior 
Experiência comprovada  de pelo menos 4 anos como programador/desenvolvedor
Java EE 5 e 6
JPA, Hibernate, Struts ou algum framework para a web em Java
Experiência de alguns dos seguintes appplication servers: BEA Weblogoc 9 [...]]]></description>
			<content:encoded><![CDATA[<p>Pessoal, estão abertas 2 vagas para contratação imediata na Concrete. Uma delas é para um profissional sênior Java, com o perfil abaixo:</p>
<p><strong>Java Senior </strong></p>
<p>Experiência comprovada  de pelo menos 4 anos como programador/desenvolvedor<br />
Java EE 5 e 6<br />
JPA, Hibernate, Struts ou algum framework para a web em Java<br />
Experiência de alguns dos seguintes appplication servers: BEA Weblogoc 9 ou 10, Jboss AS, Apache Tomcat e Geronimo<br />
Conhecimento de plataforma Linux<br />
Conhecimento em shell scripting para Unix/Linux é bastante Desejável<br />
Forma Contratação: Pessoa Jurídica<br />
Obs: Apenas serão considerados os currículos no perfil acima</p>
<p>Ainda está aberta também a vaga de analista de Infra-estrutura, com perfil abaixo:</p>
<p><strong>Analista de Infra-estrutura Pleno/Senior</strong></p>
<p>Obrigatório<br />
- Administração Linux<br />
- Configuração e administração do Apache Web Server<br />
- Shell Script<br />
- Configuração de redes</p>
<p>Desejável<br />
- Configuração e administração Weblogic Server<br />
- Noções de arquitetura Java EE<br />
- Noções de arquitetura SOA</p>
<p>Somente com experiência comprovada.</p>
<p>Os currículos devem ser enviados para marcia.cataldi@concretesolutions.com.br com cópia para bruno.pereira@concretesolutions.com.br.</p>
]]></content:encoded>
			<wfw:commentRss>http://brunopereira.org/2009/11/05/vaga-para-senior-java-e-analista-de-infra-estrutura/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vaga de Analista de Suporte Pleno/Sênior</title>
		<link>http://brunopereira.org/2009/10/19/vaga-de-analista-de-suporte/</link>
		<comments>http://brunopereira.org/2009/10/19/vaga-de-analista-de-suporte/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 15:59:33 +0000</pubDate>
		<dc:creator>blpsilva</dc:creator>
				<category><![CDATA[posts em português]]></category>

		<guid isPermaLink="false">http://brunopereira.org/?p=343</guid>
		<description><![CDATA[Analista de Suporte Pleno/Senior
Obrigatório
- Administração Linux
- Configuração e administração do Apache Web Server
- Shell Script
- Configuração de redes
Desejável
- Configuração e administração Weblogic Server
- Noções de arquitetura Java EE
- Noções de arquitetura SOA
Somente com experiência comprovada.
Os currículos devem ser enviados para marcia.cataldi@concretesolutions.com.br
]]></description>
			<content:encoded><![CDATA[<p>Analista de Suporte Pleno/Senior</p>
<p>Obrigatório</p>
<p>- Administração Linux<br />
- Configuração e administração do Apache Web Server<br />
- Shell Script<br />
- Configuração de redes</p>
<p>Desejável</p>
<p>- Configuração e administração Weblogic Server<br />
- Noções de arquitetura Java EE<br />
- Noções de arquitetura SOA</p>
<p>Somente com experiência comprovada.</p>
<p>Os currículos devem ser enviados para marcia.cataldi@concretesolutions.com.br</p>
]]></content:encoded>
			<wfw:commentRss>http://brunopereira.org/2009/10/19/vaga-de-analista-de-suporte/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Aniversário do CEJUG 2009 &#8211; Vou Palestrar!</title>
		<link>http://brunopereira.org/2009/09/16/aniversario-do-cejug-2009-vou-palestrar/</link>
		<comments>http://brunopereira.org/2009/09/16/aniversario-do-cejug-2009-vou-palestrar/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 11:57:31 +0000</pubDate>
		<dc:creator>blpsilva</dc:creator>
				<category><![CDATA[eventos]]></category>
		<category><![CDATA[posts em português]]></category>

		<guid isPermaLink="false">http://brunopereira.org/?p=342</guid>
		<description><![CDATA[
Meus caros amigos cearenses novamente me honraram com o convite para palestrar no evento comemorativo do 7o aniversário do CEJUG.

O evento ano passado já foi excelente, e este ano promete ser melhor ainda. Este ano o evento será realizado no próximo sábado, dia 19/09, e a grade de programação está sensacional, tendo como palestrantes este [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://brunopereira.org/wp-content/uploads/2008/09/fortaleza_praia.jpg"><img class="alignnone size-full wp-image-198" title="fortaleza_praia" src="http://brunopereira.org/wp-content/uploads/2008/09/fortaleza_praia.jpg" alt="" width="500" height="325" /></a></p>
<p>Meus caros amigos cearenses <a href="http://brunopereira.org/2008/09/20/aniversario-do-cejug-retrospectiva/" target="_blank">novamente</a> me honraram com o convite para palestrar no evento comemorativo do 7o aniversário do <a href="http://www.cejug.org/display/cejug/Home" target="_blank">CEJUG</a>.</p>
<p><a href="http://www.cafecomtapioca.com"><img class="alignnone size-full wp-image-180" title="Visite o site do Café com Tapioca" src="http://wp.oktiva.com.br/cafe-com-tapioca/files/2009/09/button_animado.gif" alt="" width="192" height="192" /></a></p>
<p>O evento ano passado já foi excelente, e este ano promete ser melhor ainda. Este ano o evento será realizado no próximo sábado, dia 19/09, e a <a href="http://www.cafecomtapioca.com/programacao/aniversario-de-7-anos-da-cejug" target="_blank">grade de programação</a> está sensacional, tendo como palestrantes este humilde sujeito que vos escreve, <a href="http://www.cafecomtapioca.com/palestras/19092009-10h-%E2%80%9Ccomo-fazer-uma-aplicacao-jeejme-para-rodar-nos-4-cantos-do-mundo%E2%80%9D-com-regis-melo" target="_blank">Régis Melo</a>, <a href="http://www.cafecomtapioca.com/palestras/19092009-11h-%E2%80%9Co-mito-dos-times-ageis%E2%80%9D-com-victor-oliveira" target="_blank">Victor Hugo Oliveira</a>, <a href="http://www.cafecomtapioca.com/palestras/19092009-13h30-%E2%80%9Cos-10-maus-habitos-dos-desenvolvedores-jsf%E2%80%9D-com-tarso-bessa-e-rafael-ponte" target="_blank">Rafael Ponte e Tarso Bessa</a>, <a href="http://www.cafecomtapioca.com/palestras/19092009-14h20-%E2%80%9Cturbinando-sua-aplicacao-com-lucene-conheca-solr-e-hibernate-search%E2%80%9D-com-jeveaux" target="_blank">Jeveaux</a>, <a href="http://www.cafecomtapioca.com/palestras/rodrigo-yoshima-presenca-confirmada" target="_blank">Rodrigo Yoshima</a> e <a href="http://www.cafecomtapioca.com/palestras/paulo-silveira-presenca-confirmada" target="_blank">Paulo Silveira</a>.</p>
<p>A <a href="http://www.cafecomtapioca.com/palestras/19092009-9h10-%E2%80%9Co-caminho-da-produtividade-para-desenvolvedores-web%E2%80%9D-com-bruno-pereira" target="_blank">minha palestra</a> será sobre desenvolvimento web produtivo. Falarei de frameworks Java até Rails, Grails e Django, passando por web standards e jQuery. Para completar, uma rica caixa de ferramentas no Firefox. Se você é um caba cearense arretado, não pode perder essa ocasião tão bacana!</p>
]]></content:encoded>
			<wfw:commentRss>http://brunopereira.org/2009/09/16/aniversario-do-cejug-2009-vou-palestrar/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Novas Vagas na Concrete Solutions</title>
		<link>http://brunopereira.org/2009/09/04/novas-vagas-na-concrete-solutions/</link>
		<comments>http://brunopereira.org/2009/09/04/novas-vagas-na-concrete-solutions/#comments</comments>
		<pubDate>Fri, 04 Sep 2009 14:51:32 +0000</pubDate>
		<dc:creator>blpsilva</dc:creator>
				<category><![CDATA[posts em português]]></category>

		<guid isPermaLink="false">http://brunopereira.org/?p=341</guid>
		<description><![CDATA[Pessoal, a Concrete fechou mais projetos, e estamos com várias posições, para todos os níveis de experiência. Os principais projetos que temos feito envolvem desenvolvimento de portais colaborativos de internet/intranet, integração de aplicações e soluções móveis.
No momento atual, temos posições para início imediato e horizonte de longo prazo. Queremos profissionais que tenham paixão por software [...]]]></description>
			<content:encoded><![CDATA[<p>Pessoal, a Concrete fechou mais projetos, e estamos com várias posições, para todos os níveis de experiência. Os principais projetos que temos feito envolvem desenvolvimento de portais colaborativos de internet/intranet, integração de aplicações e soluções móveis.</p>
<p>No momento atual, temos posições para início imediato e horizonte de longo prazo. Queremos profissionais que tenham paixão por software e sejam auto-motivados, buscando evolução contínua. Profissionais deste perfil encontrarão um ambiente ótimo para seu crescimento dentro da Concrete. A descrição técnica dos perfis pode ser vista a seguir.</p>
<p>Os níveis de experiência são variados, então entre em contato se você se julgar dentro do perfil de profissional que buscamos. Quem quiser mais informações, não deixe de entrar em contato.</p>
<p>Para os poliglotas e pluralistas do conhecimento tecnológico, há projetos acontecendo em Java, .NET, Python e Javascript. Embora não tenhamos posicões disponíveis em todos eles, a troca de conhecimento e a colaboração acontecem naturalmente por aqui, simplesmente porque isso faz parte do nosso DNA. Além disso, como trabalhamos com diferentes domínios conceituais, não é raro alguém sair de um projeto web tradicional e entrar em um que um CMS open source, sair de um outro de comércio eletrônico em Java e partir para um outro em Python com integração, e por aí vai.</p>
<p><strong>Desenvolvedor Java (preferencialmente com experiência em Web e/ou Mobile)</strong></p>
<p>Java SE 5 e/ou 6. Java EE 1.4 e/ou 5.</p>
<p>JPA e/ou Hibernate são bastante desejáveis. Importante conhecer banco de dados relacionais e mapeamento objeto-relacional. Se você conhece SQLAlchemy e já colocou um aplicação em produção com ele, esteja certo que tem grandes chances.</p>
<p>Experiência de uso com alguns dos seguintes application servers: BEA Weblogic 9 ou 10, Jboss AS, Jetty, Apache Tomcat, Geronimo.</p>
<p>Struts, Spring MVC ou outro framework para web em Java. Boa experiência com Grails, Ruby on Rails, Django, Pylons, são válidos, e podem nos interessar mesmo se você não conhecer um framework web Java.<br />
Inglês para leitura e estudo de material técnico.</p>
<p><strong>Desejável</strong></p>
<p>Graduação em Ciência da Computação, Engenharia da Computacão, Informática, Física ou Matemática.</p>
<p>Conhecimento e interesse em outras linguagens de programação é bastante apreciado: Python, Scala, Ruby, Rhino, Javascript, Perl, OCAML, Common Lisp, Brainfuck.</p>
<p>Experiência com Apache e seus módulos mais famosos, como mod_rewrite e mod_jk.</p>
<p>Bons conhecimentos de client-side (HTML, CSS, Javascript) são muito positivos.</p>
<p>Conhecimento de plataforma Linux é desejável, mas não obrigatório.</p>
<p>Conhecimento em shell scripting para Unix/ Linux é muito bem-vindo.</p>
<p>Os interessados devem enviar um e-mail com currículo para <a href="mailto:marcia.cataldi@concretesolutions.com.br" target="_blank">marcia.cataldi@concretesolutions.com.br</a> com cópia para <a href="mailto:bruno.pereira@concretesolutions.com.br" target="_blank">bruno.pereira@concretesolutions.com.br</a></p>
]]></content:encoded>
			<wfw:commentRss>http://brunopereira.org/2009/09/04/novas-vagas-na-concrete-solutions/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A importância do open source profissional</title>
		<link>http://brunopereira.org/2009/05/18/a-importancia-do-open-source-profissional/</link>
		<comments>http://brunopereira.org/2009/05/18/a-importancia-do-open-source-profissional/#comments</comments>
		<pubDate>Mon, 18 May 2009 05:28:23 +0000</pubDate>
		<dc:creator>blpsilva</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[posts em português]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[jboss]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[spring source]]></category>

		<guid isPermaLink="false">http://brunopereira.org/?p=340</guid>
		<description><![CDATA[Continuando o tema do meu artigo anterior, agora quero falar sobre a importância do open source profissional.
Na última quinta-feira eu fui na palestra do Bruno Borges no RioJUG, sobre Apache Camel. A palestra em si foi bem legal, pois eu já conhecia um pouco do Apache Camel e pude ver algumas coisas a mais. Mas [...]]]></description>
			<content:encoded><![CDATA[<p>Continuando o tema do <a href="http://brunopereira.org/2009/05/18/as-diferentes-culturas-open-source-ubuntu-x-debian/" target="_blank">meu artigo anterior</a>, agora quero falar sobre a importância do open source profissional.</p>
<p>Na última quinta-feira eu fui na palestra do <a href="http://blog.brunoborges.com.br/" target="_blank">Bruno Borges</a> no <a href="http://www.riojug.org" target="_blank">RioJUG</a>, <a href="http://www.riojug.org/blog/?p=79" target="_blank">sobre Apache Camel</a>. A palestra em si foi bem legal, pois eu já conhecia um pouco do <a href="http://camel.apache.org/" target="_blank">Apache Camel</a> e pude ver algumas coisas a mais. Mas o ponto específico que eu quero abordar é um comentário que o Bruno fez, que diverge da minha postura em relação a open source.</p>
<p>Ele comentou que tenta sempre utilizar produtos <a href="http://www.apache.org" target="_blank">Apache</a>, evitando produtos open source que tenham vínculo com alguma empresa, como <a href="http://www.jboss.org/" target="_blank">JBoss</a>, <a href="http://www.springsource.com/" target="_blank">SpringSource</a>, entre outras. Não me recordo do motivo exato, mas a razão principal que ele explicou é o fato da Apache Software Foundation ser uma fundação composta de pessoas, em vez de ser uma empresa com fins comerciais.</p>
<p>Eu tenho uma postura diferente da dele em relação a open source. Eu gosto muito e tenho um respeito enorme pela fundação Apache. Já usei inúmeros produtos Apache e certamente continuarei usando por muito tempo. Entretanto, já usei vários produtos <a href="http://www.jboss.org" target="_blank">JBoss</a> e vários componentes do <a href="http://www.springsource.org/" target="_blank">Spring</a>, e acho muito importante e saudável a existência dessas empresas.</p>
<p>A história do movimento open source tem vários elementos &#8220;românticos&#8221; e &#8220;filosóficos&#8221;, e essa característica ainda é muito presente em várias comunidades hoje em dia. Entretanto, com o crescimento do Linux, Java, Python, Ruby e outras tecnologias, existe hoje um mercado enorme de trabalho e negócios em torno do software livre.</p>
<p>O surgimento desse mercado naturalmente trouxe a participação de muitas empresas que vivem de software livre atualmente. Sei que há pessoas que enxergam open source e capitalismo como coisas opostas, mas na minha opinião essa visão é míope. Open source é um modelo de desenvolvimento de software e oferta de produtos e serviços. A busca do lucro é o que move nossas empresas, e isso não é diferente para quem atua com software livre.</p>
<p>O surgimento das empresas profissionais open source foi importantíssimo para o amadurecimento das tecnologias e dos profissionais. Se o movimento open source continuasse restrito ao meio acadêmico, o nível de competição no mercado de software seria muito menor, e o avanço tecnológico teria sido bem mais lento.</p>
<p>Além disso, minha postura profissional é de tentar sempre entregar os melhores resultados para os clientes e para a empresa em que trabalho. Em algumas situações pode ser mais adequado usar open source, em outras pode ser necessário usar software proprietário. Temos que nos adequar às necessidades dos clientes, em vez de esperar que eles se adeqüem às nossas preferências.</p>
<p>No meu ponto de vista, empresas como JBoss e SpringSource contribuíram e contribuem muito no processo de profissionalização do software livre. A existência delas criou um mercado fortíssimo em torno do software livre, e eu só tenho a agradecer por isso.</p>
]]></content:encoded>
			<wfw:commentRss>http://brunopereira.org/2009/05/18/a-importancia-do-open-source-profissional/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
