Skip to content


Pensamentos sobre postura profissional e carreira

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 iq option.

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.

Posted in carreira.


Desabilitando pedidos de autenticação no Gnome

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 Plataforma de Negociação.

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/

Posted in linux.

Tagged with , , , .


Uso de Hypermedia em protocolos REST

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 Depósitos e Saques.

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>

Posted in design.

Tagged with , , .


com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException

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!

Posted in java.

Tagged with , , , , .


Acelerando seu site – Parte 1: habilitando compressão

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.

Posted in otimização.

Tagged with , , , , , .


Ajax com validação no VRaptor c/ jQuery

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);				 
		}
	});    
});

Posted in client-side, java.

Tagged with , , .


Projeto de Integração na América do Sul

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.

Posted in posts em português.

Tagged with , , , .




  • Buy Cheap young men cialis Now 24/Internet)(safe Pharmacy. Best Prices.
  • Buy Cheap buy discount cialis Now Cheap Pharmacy Online. Online Medical Shop.
  • Buy Cheapest levitra cheapest Now Best Online. Pharmacy At The Best Price!
  • Buy Cheap vicodin viagra cialis Now Discount Pharmacy Online. Guaranteed Shipping.
  • Buy Cheapest levitra pricing Online 24/Online Pharmacy. Low Prices.
  • Buy Cheap erectile dysfunction levitra Now Best Internet. Cheap Prescription Drugs.
  • Buy Cheap teens taking viagra Online Internet Prices For teens taking viagra! Best Prices.
  • Buy Cheap cialis soft tabs online Online The Largest Internet Pharmacy. Best Online.
  • Buy Cheapest buing cialis Online Top Online Pharmacy. WorldWide Shipping.
  • Buy Cheap cialis dosage rate Now Discount Online Pharmacy. Online Medical Shop.
  • Buy Cheap where to buy cialis Online Pharmacy Store. Buy Medications Online.
  • Buy Cheap levitra viagra v cialis Online Best Drugstore. 24/Online Pharmacy.
  • Buy Cheapest viagra for woman information Online Internet Prices For viagra for woman information! Best Prices.
  • Buy Cheapest levitra for potency Now Best Prices. Cheap Prescription Drugs.
  • Buy Cheapest viagra in britain Now Pharmacy Store. No Prescription Needed.
  • Buy Cheap cialis cheap prices Online Online Prices For cialis cheap prices! Low Prices.
  • Buy Cheapest discount viagra europe Online WorldWide Shipping. Guaranteed Shipping.
  • Buy Cheapest women viagra Now 24/Online Pharmacy. WorldWide Shipping.
  • Buy Cheapest cialis info Now Cheap Prescription Drugs. Pharmacy Store.
  • Buy Cheapest jelly viagras Now Top Online Pharmacy. Cheap Online Pharmacy.
  • Buy Cheapest compare viagra prices Online Best Prices. 24/Online Pharmacy.
  • Buy Cheap mail order cialis Online Pharmacy Store. Pharmacy At The Best Price!
  • Buy Cheap cialis generic viagra Online 24/Online Pharmacy. Top Online Pharmacy.
  • Buy Cheap buy cialis canada Now Cheap Online Pharmacy. Cheap Pharmacy Online.
  • Buy Cheap free viagra online Now Discount Online Pharmacy Shopping. Low Prices.
  • Buy levitra drug interactions Without Prescription Doctor. Best Online. Best Prices.
  • Buy Cheap viagra original use Now Free Viagra Pills! Cheap Online Pharmacy.
  • Buy Cheap cheapest generic price viagra Online Top Online Pharmacy. Free Viagra Pills!
  • Buy Cheap soft tab cialis Online 100% Satisfaction Guaranteed. Best Online.
  • Buy Cheapest cialis cheap cialis online Online Best Prices. Cheap Prescription Drugs.
  • Buy Cheapest viagra levitra Now WorldWide Shipping. Online Medical Shop.
  • Buy Cheap viagra sildenafil citrate Online Best Online. Top Online Pharmacy Supplier.
  • Buy Cheap taladafil cialis Online Low Prices. Internet Prices For taladafil cialis!
  • Buy Cheapest wholesale viagra Now Best Prices. Cheap Prescription Drugs.
  • Buy Cheapest method levitra Now Guaranteed Shipping. Free Viagra Pills!
  • levitra in india Online Without Prescription Low Prices. Best Internet.
  • Buy Cheapest cialis all night Now Best Internet. Special Prices For cialis all night!
  • Buying Cheap suppliers of viagra in uk. Offshore Rx, Best Prices. Online Medical Shop.
  • Buy Cheap what is viagra professional Online Guaranteed Shipping. Pharmacy Store.
  • Buy Cheap buy viagra online cheap Now No Prescription Needed. Cheap Pharmacy Online.
  • Buy Cheap side effects viagra Online Best Online. Pharmacy At The Best Price!
  • Buy Cheap generic viagra lowest prices Now Buy Medications Online. Pharmacy Store.
  • Buy Cheapest buy viagra uk Now Best Prices. Cheap Prescription Drugs.
  • Buy Cheapest cheap viagra soft tablet Now Best Internet. No Prescription Needed.
  • Buy Cheap free viagra samples Online Internet Prices For free viagra samples! Low Prices.
  • Buy Cheap cialis voucher Online Cheap Online Pharmacy. Best Drugstore.
  • Buy Cheapest free levitra sample Online Low Prices. Cheap Prescription Drugs.
  • Buy viagra paypal Without Prescription Doctor. Best Prices. Best Internet.
  • Buy Cheapest erectile dysfunction cialis Online Cheap Online Pharmacy. Best Internet.
  • Buy Cheapest one a day cialis Online Best Online. Pharmacy At The Best Price!
  • Buy Cheapest viagra cialis levitra reviews Now Pharmacy At The Best Price! Best Drugstore.
  • Buy Cheapest over the counter cialis Online Low Prices. 24/Online Pharmacy.
  • Buy Cheap generic cialis softtab Now Best Online. Top Online Pharmacy Supplier.
  • Buy Cheap cialis professional cheap Now No Prescription Needed. Free Viagra Pills!
  • Buy Cheapest cheapest viagra uk Now Best Online. No Prescription Needed.
  • Buy Cheap cialis pharmacy Online Cheap Prescription Drugs. Low Prices.
  • Buy Cheap viagra canada pharmacies Now Low Prices. The Largest Internet Pharmacy.
  • Buy Cheapest viagra pills Online Pharmacy Store. Top Online Pharmacy.
  • Buy Cheap viagra soft tab generic Online No Prescription Needed. WorldWide Shipping.
  • Buy Cheap viagra effect Now Low Prices. Internet Prices For viagra effect!
  • Buy Cheapest viagra online best price Now Online Prices For viagra online best price! Low Prices.
  • Buy Cheap cialis generic india Online 100% Satisfaction Guaranteed. Best Prices.
  • Buy Cheapest generic levitra cheap Now Guaranteed Shipping. Free Viagra Pills!
  • Buy Cheap cialis med store Now Online Medical Shop. Online Prices For cialis med store!
  • Buy Cheapest levitra effectiness Online No Prescription Needed. Best Prices.
  • Buy Cheapest viagra 100mg Online Best Online. Pharmacy At The Best Price!
  • Buy Cheapest sample viagra Now Top Online Pharmacy. Pharmacy Store.
  • Buy Cheap legal generic cialis no prescription Now Pharmacy Store. Online Prices For legal generic cialis no prescription!
  • Buy generic soft tabs cialis Online Without Prescription. Low Prices. Best Internet.
  • Buy Cheap order cialis and viagra Online Best Internet. No Prescription Needed.
  • Buy Cheap professional viagra Now No Prescription Needed For Drugs. Best Prices.
  • Buy Cheapest viagra flomax Online Low Prices. Cheap Pharmacy Online.
  • Buy Cheap us levitra Now Special Prices For us levitra! Best Prices.
  • order Levitra Plus Online Without Prescription WorldWide Shipping. Low Prices.
  • Buy Cheapest colleagues viagra Now Discount Online Pharmacy. Pharmacy Store.
  • Buy Cheapest cialis treatment Now Prescription Drugs And Generic Medications.
  • Buy Cheapest lowest prices for cialis Online Special Prices For lowest prices for cialis! Low Prices.
  • Buy Cheap order quality cialis Now Best Internet. Safe And Secure Payment System.
  • Buy Cheap viagra store in canada Online Pharmacy Store. 24/Online Pharmacy.
  • Buy Cheap order viagra air travel Now Pharmacy At The Best Price! Best Online.
  • Buy Cheap buying cialis online guide Now Drugs, Health And Beauty. Guaranteed Shipping.
  • Buy Cheap overnight shipping cialis Online WorldWide Shipping. Buy Medications Online.
  • Buy Cheap effects levitra side Now Cheap Online Pharmacy. Top Online Pharmacy.
  • Buy Cheapest levitra levitra vardenafil hcl Online No Prescription Needed. Low Prices.
  • Buy Cheap viagra cialis generica Online Internet Prices For viagra cialis generica! Low Prices.
  • Buy Cheap generic cialis mexican Online Discount Online Pharmacy. Best Online.
  • Buy Cheapest free viagra trial Now Best Prices. Drugs, Health And Beauty.
  • Buy Cheapest overnight viagra Now Best Internet. Special Prices For overnight viagra!
  • Buy Cheapest viagra buy viagra Now Discount Pharmacy Online. Low Prices.
  • Buy Cheap buy and purchase viagra online Online Buy Medications Online. Free Viagra Pills!
  • Buy Cheapest cialis cialis information Online Drugs, Health And Beauty. Best Internet.
  • Buy Cheap cialis drug interactions Now 100% Satisfaction Guaranteed. Low Prices.
  • Buy Cheapest pharmacy levitra Online Online Prices For pharmacy levitra! Best Prices.
  • Buy Cheapest where can i buy viagra? Now Best Internet. 24/Online Pharmacy.
  • Buy Cheap levitra warfarin Now 100% Satisfaction Guaranteed. Best Drugstore.
  • Buy Cheapest free viagra in the uk Online Buy Medications Online. Best Drugstore.
  • Buy Cheap 100mg viagra Online Internet Prices For 100mg viagra! Best Online.
  • Buy Cheapest viagra propecia Now Best Online. Order Cheap Meds Without Rx.
  • Buy Cheapest levitra in canada Now Online Prices For levitra in canada! Best Prices.
  • Buy Cheapest generic online order viagra Now Discount Online Pharmacy. Low Prices.