Bruno Pereira http://brunopereira.org Open source, Java, web, python, client-side e outros hobbies :) Thu, 20 Oct 2011 00:47:23 +0000 http://wordpress.org/?v=2.9.2 en hourly 1 Pensamentos sobre postura profissional e carreira http://brunopereira.org/2011/10/19/pensamentos-sobre-postura-profissional-e-carreira/ http://brunopereira.org/2011/10/19/pensamentos-sobre-postura-profissional-e-carreira/#comments Thu, 20 Oct 2011 00:47:23 +0000 blpsilva http://brunopereira.org/?p=387 Estamos num momento peculiar da humanidade. A disponibilidade de informação e conhecimento e a facilidade de acesso nunca foram tão grandes. Se antigamente precisávamos buscar livros físicos em bibliotecas e livrarias e às vezes esperar dias para ter acesso a um conteúdo, hoje quase sempre a espera é de minutos, no máximo algumas horas.

A facilidade de colaboração e interação entre pessoas também é ridiculamente maior do que tínhamos há 10 anos ou mais. Isto pode e deve catalisar a capacidade de estudo e trabalho das pessoas, mas muitas vezes não é o que acontece.

Percebo tanta gente perdida e sem foco que resolvi transcrever aqui algumas opiniões minhas especificamente sobre postura profissional e coisas relacionadas.

* Enquanto você perde tempo e atenção com redes sociais, outro profissional estará imerso em algum estudo ou problema e estará evoluindo mais que você.

* A interação humana é muito mais rica do que a interação digital. Pessoalmente e em grupo você normalmente terá discussões e conversas bem mais ricas e interessantes do que em mensagens curtas e espaçadas.

* Poder não se dá, poder se toma. Se você não tiver a inquietação e buscar sempre colaborar mais, assumir mais responsabilidades e ser mais relevante, você será sempre secundário. Pessoas secundárias são menos valiosas, e nunca indispensáveis.

* Liberdade é algo muito valioso, mas precisa estar sempre acompanhada de muita responsabilidade. Você prefere ter calma e paz de espírito pra pensar ou só reagir a um chicote? A escolha muitas vezes depende só de nós mesmos.

* De forma análoga, confiança só se perde uma vez.

* A carreira é muito mais uma prova de resistência do que velocidade. Se você for rápido, mas não resistente e confiável, você nunca será “O Cara” nos momentos importantes. Hombridade e determinação vencem a maioria das batalhas.

* Antes de buscar desculpas e a zona de conforto, questione-se 100x se você de fato fez tudo que estava ao seu alcance. Desculpas são sempre companheiras das derrotas, evite-as.

* No final das contas, todos somos avaliados por resultados e conquistas. O melhor jogador de um time fracassado sempre estará abaixo de um jogador de um time vencedor. O reconhecimento sempre vem para quem faz o seu melhor. Não aceite fracassar.

]]>
http://brunopereira.org/2011/10/19/pensamentos-sobre-postura-profissional-e-carreira/feed/ 5
Desabilitando pedidos de autenticação no Gnome http://brunopereira.org/2010/10/12/desabilitando-pedidos-de-autenticacao-no-gnome/ http://brunopereira.org/2010/10/12/desabilitando-pedidos-de-autenticacao-no-gnome/#comments Tue, 12 Oct 2010 13:31:57 +0000 blpsilva http://brunopereira.org/?p=379 Estou escrevendo isso para conseguir encontrar rapidamente no futuro :)

O Gnome por padrão exige autenticação em algumas coisas bobas como o applet de escolha de frequência do processador. Pede também para o gerenciador de pacotes, entre outras coisas.

O local onde estas políticas ficam configuradas é o diretório /usr/share/polkit-1/actions/, que contém vários arquivos .policy que definem o controle de acesso. Por exemplo, o Cpu Frequency Scaling Monitor é configurado no arquivo /usr/share/polkit-1/actions/org.gnome.cpufreqselector.policy. Para cada ação existe uma tag como a seguinte:


<defaults>
<allow_inactive>no</allow_inactive>
<allow_active>auth_admin_keep</allow_active>
</defaults>



Este valor auth_admin_keep define que será pedida autenticação do usuário root. Se trocarmos o valor para yes, o usuário comum conseguirá fazer as modificações sem autenticar. No meu caso, desabilitei a autenticação para o Cpu Frequency Scaling Monitor e pro gerenciador de pacotes, mas todas as ações do Gnome que exigem autenticação são configuradas em arquivos .policy dentro deste diretório /usr/share/polkit-1/actions/

]]>
http://brunopereira.org/2010/10/12/desabilitando-pedidos-de-autenticacao-no-gnome/feed/ 0
Uso de Hypermedia em protocolos REST http://brunopereira.org/2010/08/03/uso-de-hypermedia-em-protocolos-rest/ http://brunopereira.org/2010/08/03/uso-de-hypermedia-em-protocolos-rest/#comments Tue, 03 Aug 2010 12:18:44 +0000 blpsilva http://brunopereira.org/?p=370 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, áudio, vídeo, texto plano e hyperlinks para criar um fluxo de navegação não-linear. (Definição retirada da Wikipedia).

Motivação: REST sem Hypermedia

No artigo de REST 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 – a exceção ficou por conta de Hypermedia.

Para ilustrar uma resposta REST sem uso de Hypermedia, copio aqui uma listagem que usei no artigo de REST da Java Magazine.

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
 
<?xml version="1.0" ?>
<ofertasDoItem>
<oferta>
<codOferta>23c32440-959a-4c33-b6ee-caff8e41422a</codOferta>
<valor>111.22</valor>
<dataModificacao>2008-02-05</dataModificacao>
<item>
<codItem>b7d24e54-0c0d-4fa0-b4fe-d7cf60180ed7</codItem>
<novo>false</novo>
<vendido>false</vendido>
</item>
<ofertante>
<codUsuario>505ab9d4-4b4b-4ce6-b128-b7408268126c</codUsuario>
</ofertante>
<vencedora>false</vencedora>
</oferta>
<oferta>
<codOferta>41ffac11-5ba2-405b-acc8-8e3d0904b158</codOferta>
<valor>111.22</valor>
<dataModificacao>2008-02-14</dataModificacao>
<item>
<codItem>b7d24e54-0c0d-4fa0-b4fe-d7cf60180ed7</codItem>
<novo>false</novo>
<vendido>false</vendido>
</item>
<ofertante>
<codUsuario>505ab9d4-4b4b-4ce6-b128-b7408268126c</codUsuario>
</ofertante>
<vencedora>false</vencedora>
</oferta>
</ofertasDoItem>

Se você julga que isso parece um grafo de objetos serializado, você não está enganado, é exatamente isso.

O que temos a ganhar com Hypermedia?

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?

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:

<item>
<codItem>b7d24e54-0c0d-4fa0-b4fe-d7cf60180ed7</codItem>
<novo>false</novo>
<vendido>false</vendido>
</item>

O que podemos dizer sobre ele? Ele traz informações “quase” 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 SE JÁ SOUBER PREVIAMENTE COMO! O cliente já deve conhecer as URIs de cada recurso e saber quais manipulações ele pode fazer sobre os mesmos.

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.

Exemplo de resposta usando Hypermedia

Agora pegarei um trecho do meu artigo sobre AtomPub para exemplificar uma resposta com uso de Hypermedia:

<?xml version="1.0" encoding="UTF-8"?>
<atom:entry xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:apps="http://schemas.google.com/apps/2006"
xmlns:gd="http://schemas.google.com/g/2005">
<atom:id>https://www.google.com/a/feeds/example.com/user/2.0/SusanJones</atom:id>
<atom:updated>1970-01-01T00:00:00.000Z</atom:updated>
<atom:category scheme="http://schemas.google.com/g/2005#kind"
term="http://schemas.google.com/apps/2006#user"/>
<atom:title type="text">SusanJones</atom:title>
<atom:link rel="self" type="application/atom+xml"
href="https://www.google.com/a/feeds/example.com/user/2.0/SusanJones"/>
<atom:link rel="edit" type="application/atom+xml"
href="https://www.google.com/a/feeds/example.com/user/2.0/SusanJones"/>
<apps:login userName="SusanJones" suspended="false" admin="false" changePasswordAtNextLogin="false" agreedToTerms="true"/>
<apps:name familyName="Jones" givenName="Susan"/>
<gd:feedLink rel="http://schemas.google.com/apps/2006#user.nicknames"
href="https://www.google.com/a/feeds/example.com/nickname/2.0?
username=Susy-1321"/>
<gd:feedLink rel="http://schemas.google.com/apps/2006#user.emailLists"
href="https://www.google.com/a/feeds/example.com/emailList/2.0?
recipient=us-sales@example.com"/>
</atom:entry>

Qual é a principal diferença aqui? Através do uso de links conseguimos indicar uma URI para manipulação do recurso, e através do atributo rel, indicamos QUAL é a manipulação. Algumas coisas ainda ficam implícitas. Por exemplo, se o link indica um rel=”edit”, a manipulação em questão provavelmente será feita com uma requisição HTTP PUT. Se o link tiver um rel=”show”, a manipulação deve ser uma leitura, feita com HTTP GET.

Hypermedia x Acoplamento

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.

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.

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.

Precisamos de Hypermedia em um protocolo REST?

Resposta curta: na minha opinião não.

Resposta longa: 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.

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.

É 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.

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.

Recomendação geral: 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.

xml version=”1.0″ encoding=”UTF-8″?>

<atom:entry xmlns:atom=”http://www.w3.org/2005/Atom”

xmlns:apps=”http://schemas.google.com/apps/2006″

xmlns:gd=”http://schemas.google.com/g/2005″>

<atom:id>https://www.google.com/a/feeds/example.com/user/2.0/SusanJones</atom:id>

<atom:updated>1970-01-01T00:00:00.000Z</atom:updated>

<atom:category scheme=”http://schemas.google.com/g/2005#kind”

term=”http://schemas.google.com/apps/2006#user”/>

<atom:title type=”text”>SusanJones</atom:title>

<atom:link rel=”self” type=”application/atom+xml”

href=”https://www.google.com/a/feeds/example.com/user/2.0/SusanJones”/>

<atom:link rel=”edit” type=”application/atom+xml”

href=”https://www.google.com/a/feeds/example.com/user/2.0/SusanJones”/>

<apps:login userName=”SusanJones” suspended=”false” admin=”false” changePasswordAtNextLogin=”false” agreedToTerms=”true”/>

<apps:name familyName=”Jones” givenName=”Susan”/>

<gd:feedLink rel=”http://schemas.google.com/apps/2006#user.nicknames”

href=”https://www.google.com/a/feeds/example.com/nickname/2.0?

username=Susy-1321″/>

<gd:feedLink rel=”http://schemas.google.com/apps/2006#user.emailLists”

href=”https://www.google.com/a/feeds/example.com/emailList/2.0?

recipient=us-sales@example.com”/>

</atom:entry>

]]>
http://brunopereira.org/2010/08/03/uso-de-hypermedia-em-protocolos-rest/feed/ 4
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException http://brunopereira.org/2010/07/16/com-mysql-jdbc-exceptions-jdbc4-mysqlnontransientconnectionexception/ http://brunopereira.org/2010/07/16/com-mysql-jdbc-exceptions-jdbc4-mysqlnontransientconnectionexception/#comments Fri, 16 Jul 2010 03:27:40 +0000 blpsilva http://brunopereira.org/?p=362 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 solucionar a maioria dos problemas relacionados. Há 2400 resultados no Google sobre MySQLNonTransientConnectionException, deve ter ocorrido muito já.

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:

  • MySql foi reiniciado
  • Problema de rede na conexão com MySql
  • Conexão ficou ociosa tempo demais, e o MySql fechou-a

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:

<datasources>
  <local-tx-datasource> 
    <jndi-name>NomeDS</jndi-name>
    <connection-url>jdbc:mysql://servidormysql:3306/nome_schema</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>usuario</user-name>
    <password>senha</password> 
    <min-pool-size>1</min-pool-size>
    <max-pool-size>20</max-pool-size>    
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
    <metadata>
       <type-mapping>mySQL</type-mapping>
    </metadata>
  </local-tx-datasource> 
</datasources>

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: <check-valid-connection-sql>select 1</check-valid-connection-sql>. Este elemento é filho de <local-tx-datasource>. 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.

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 nesse exemplo. É 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: <property name=”connection.provider_class”>org.hibernate.connection.C3P0ConnectionProvider</property>

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, o parâmetro autoReconnect é deprecated e não é recomendada a utilização.

That’s all folks!

]]>
http://brunopereira.org/2010/07/16/com-mysql-jdbc-exceptions-jdbc4-mysqlnontransientconnectionexception/feed/ 14
Acelerando seu site – Parte 1: habilitando compressão http://brunopereira.org/2010/06/20/acelerando-seu-site-parte-1-habilitando-compressao/ http://brunopereira.org/2010/06/20/acelerando-seu-site-parte-1-habilitando-compressao/#comments Mon, 21 Jun 2010 01:21:47 +0000 blpsilva http://brunopereira.org/?p=355 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 YSlow(do Yahoo). Ambos são extensões do Firebug, então você precisa primeiro instalá-lo no Firefox.

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 Caelum. 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 :)

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.

Motivação

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.

Como fazer

O servidor web mais utilizado na internet é o Apache. Mostrarei inicialmente a configuração somente dele, e caso alguém queira saber também do IIS e nginx, complementarei posteriormente.

Para habilitar a compressão, deve estar ativo mod_deflate. No Ubuntu você pode verificar os módulos ativos listando o diretório /etc/apache2/mods-enabled.

A opção mais simples de configuração é utilizar a diretiva: SetOutputFilter DEFLATE

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.

Outra opção é habilitar compressão somente para alguns tipos de arquivos, com esta diretiva: AddOutputFilterByType DEFLATE text/html text/plain text/xml

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.

Verificando que funcionou

Para verificar que a compressão está ativa, podemos utilizar o Poster 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.

]]>
http://brunopereira.org/2010/06/20/acelerando-seu-site-parte-1-habilitando-compressao/feed/ 14
Ajax com validação no VRaptor c/ jQuery http://brunopereira.org/2010/06/17/ajax-com-validacao-no-vraptor-c-jquery/ http://brunopereira.org/2010/06/17/ajax-com-validacao-no-vraptor-c-jquery/#comments Fri, 18 Jun 2010 00:57:45 +0000 blpsilva http://brunopereira.org/?p=348 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. 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.

import java.util.ArrayList;
import java.util.List;
 
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.view.Results;
 
@Resource
public class JsonController {
 
	private Result result;
 
	public JsonController(Result result){
		this.result = result;
	}
 
	@Get
	@Path("/json/erro")
	public void jsonErro(){
		List<String> erros = new ArrayList<String>();
		erros.add("Erro 1");
		erros.add("Erro 2");
                //Results.http() em vez de Status.badRequest(), pois este força uma página de erro, que ñ serve p/ um cliente ajax 
		result.use(Results.http()).setStatusCode(400); 
		result.use(Results.json()).from(erros, "erros").serialize();
		return;
	}
 
	@Get
	@Path("/json/sucesso")
	public void jsonSucesso(){
		List<String> strings = new ArrayList<String>();
		strings.add("Texto 1");
		strings.add("Texto 2");
		result.use(Results.http()).setStatusCode(200);
		result.use(Results.json()).from(strings, "strings").serialize();
		return;
	}
}

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.

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.

Criei um HTML simples para teste, com 2 botões para gerar os requests ajax de sucesso e de erro.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>Ajax com validação</title>
</head>
<body id="public">
<div id="container">
<h1 id="logo"></h1>
<form id="teste-json" name="teste-json" enctype="application/x-www-form-urlencoded" method="post" action="/json/erro">
 
<div class="info"><h2>Teste JSON</h2></div>
<div class="info">
<ul id="campos-cadastro">	
	<li class="buttons ">
	<div><input id="erro" name="erro" type="button" value="Teste Erro" /></div>
	</li>
	<li class="buttons ">
	<div><input id="sucesso" name="sucesso" type="button" value="Teste Sucesso" /></div>
	</li>	
</ul>
</div>
</form>
</div>
<img id="bottom" src="/images/bottom.png" alt="" />
<script type="text/javascript" src="/scripts/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="/scripts/teste-json.js"></script>
</body>
</html>

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.

$(document).ready(function(){ 
	$("input#erro").click(function() {
		$.ajax({
		   type: "GET",
		   url: "/json/erro",
		   dataType: "json",
		   success: function(json){    		
    		for (var x = 0; x < json.erros.length; x++) {
    			var erro = json.erros[x];
    			alert("Erro: " + erro);
    		}    	    
    	  }
    	}); 
    });
 
	$("input#erro").ajaxError(function(e, xhr, settings, exception) {
		var errosStr = xhr.responseText;
		var json = eval("(" + errosStr + ")");		
		for (var x = 0; x < json.erros.length; x++) {
			var erro = json.erros[x];
                        alert("Erro: " + erro);
		}
	});
 
	$("input#sucesso").click(function() {
		$.ajax({
		   type: "GET",
		   url: "/json/sucesso",
		   dataType: "json",
		   success: function(json){    		
    		for (var x = 0; x < json.strings.length; x++) {
    			var texto = json.strings[x];
    			alert("Texto: " + texto);
    		}    	    
    	  }
    	}); 
    });
 
	$("input#sucesso").ajaxError(function(e, xhr, settings, exception) {
		var errosStr = xhr.responseText;
		var json = eval("(" + errosStr + ")");		
		for (var x = 0; x < json.erros.length; x++) {
			var erro = json.erros[x];
			alert("Erro: " + erro);				 
		}
	});    
});
]]>
http://brunopereira.org/2010/06/17/ajax-com-validacao-no-vraptor-c-jquery/feed/ 6
Projeto de Integração na América do Sul http://brunopereira.org/2010/01/03/projeto-de-integracao-na-america-do-sul/ http://brunopereira.org/2010/01/03/projeto-de-integracao-na-america-do-sul/#comments Sun, 03 Jan 2010 13:06:15 +0000 blpsilva http://brunopereira.org/?p=345 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 preferencialmente até o dia 07/01/2010, pois as vagas precisam ser preenchidas rapidamente.

]]>
http://brunopereira.org/2010/01/03/projeto-de-integracao-na-america-do-sul/feed/ 2
Vaga para Sênior Java e Analista de Infra-estrutura http://brunopereira.org/2009/11/05/vaga-para-senior-java-e-analista-de-infra-estrutura/ http://brunopereira.org/2009/11/05/vaga-para-senior-java-e-analista-de-infra-estrutura/#comments Thu, 05 Nov 2009 12:06:21 +0000 blpsilva http://brunopereira.org/?p=344 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 ou 10, Jboss AS, Apache Tomcat e Geronimo
Conhecimento de plataforma Linux
Conhecimento em shell scripting para Unix/Linux é bastante Desejável
Forma Contratação: Pessoa Jurídica
Obs: Apenas serão considerados os currículos no perfil acima

Ainda está aberta também a vaga de analista de Infra-estrutura, com perfil abaixo:

Analista de Infra-estrutura 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 com cópia para bruno.pereira@concretesolutions.com.br.

]]>
http://brunopereira.org/2009/11/05/vaga-para-senior-java-e-analista-de-infra-estrutura/feed/ 0
Vaga de Analista de Suporte Pleno/Sênior http://brunopereira.org/2009/10/19/vaga-de-analista-de-suporte/ http://brunopereira.org/2009/10/19/vaga-de-analista-de-suporte/#comments Mon, 19 Oct 2009 15:59:33 +0000 blpsilva http://brunopereira.org/?p=343 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

]]>
http://brunopereira.org/2009/10/19/vaga-de-analista-de-suporte/feed/ 1
Aniversário do CEJUG 2009 – Vou Palestrar! http://brunopereira.org/2009/09/16/aniversario-do-cejug-2009-vou-palestrar/ http://brunopereira.org/2009/09/16/aniversario-do-cejug-2009-vou-palestrar/#comments Wed, 16 Sep 2009 11:57:31 +0000 blpsilva http://brunopereira.org/?p=342

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 humilde sujeito que vos escreve, Régis Melo, Victor Hugo Oliveira, Rafael Ponte e Tarso Bessa, Jeveaux, Rodrigo Yoshima e Paulo Silveira.

A minha palestra 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!

]]>
http://brunopereira.org/2009/09/16/aniversario-do-cejug-2009-vou-palestrar/feed/ 4