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.

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.

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.

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 Cheapest phentermine with no perscription Now Best Internet. Discount Pharmacy Online.
  • Buy Cheap drugstore Now Online Prices For drugstore! WorldWide Shipping.
  • Buy Cheap lexapro prozac vs Now The Largest Internet Pharmacy. Best Prices.
  • Buy Cheap natural weight loss Now All Medications Are Certificated! Low Prices.
  • Buy Cheap levitra professional mail order Online 24/Online Pharmacy. Best Internet.
  • Buying Cheap buy cheap online propecia. Worldwide Rx, Best Prices. WorldWide Shipping.
  • Buy Cheapest levitra drug Online WorldWide Shipping. Pharmacy Store.
  • Buy Cheap rapid weight loss pills Now Online Medical Shop. WorldWide Shipping.
  • Buy Cheap cheapest valium no ex Online Online Prices For cheapest valium no ex! Best Drugstore.
  • Buy Cheapest order phentermine diet pill Online Buy Medications Online. Pharmacy Store.
  • Buy Cheapest lipitor discount Online Best Online. Discount Online Pharmacy.
  • Buy Cheapest indian sildenafil Now Order Cheap Meds Without Rx. Low Prices.
  • Buy Cheap cialis promise Now Discount Pharmacy Online. Online Medical Shop.
  • Buy Cheapest drugs to stop nerve pain Online Cheap Prescription Drugs. Low Prices.
  • Buy Cheapest amoxicillin dosage Online Get FDA Approved Prescription Medicines.
  • Buy Cheapest foreign pharmacies Now WorldWide Shipping. Top Online Pharmacy.
  • Buy Cheap online tramadol pharmacy Online Best Prices. Cheap Prescription Drugs.
  • Buy Cheapest cheap viagra generic Online Internet Prices For cheap viagra generic! Best Prices.
  • Buy Cheapest sale cheap pain killer Now Buy Medications Online. Best Prices.
  • Buy Cheapest levitra from canada Online Internet Prices For levitra from canada! Best Prices.
  • Buy Cheapest xanax no prescritions Online Online Medical Shop. Best Internet.
  • Buy Cheapest do diet pills really work Now Discount Online Pharmacy. Low Prices.
  • Buy Cheap tramadol price Online Drugs, Health And Beauty. Pharmacy Store.
  • Buy Cheap order vitamins Online Best Prices. Cheap Prescription Drugs.
  • treatment for hair loss Online Without Prescription No Prescription Online Pharmacy.
  • Buy Cheap tramadol medicine online Online Special Prices For tramadol medicine online! Best Internet.
  • Buy Cheap viagra sale uk Online Pharmacy Store. Internet Prices For viagra sale uk!
  • Buy Cheap promethazine codeine Online Best Drugstore. Special Prices For promethazine codeine!
  • Buy Cheap cialis oral Now Best Online. 24/Internet)(safe Pharmacy.
  • Buy Cheap trazodone for anxiety Now Cheap Online Pharmacy. Buy Medications Online.
  • Buy Cheap phentermine china Now No Prescription Online Pharmacy. Best Online.
  • Buy Cheap ambien works Now Low Prices. No Prescription Online Pharmacy.
  • Buy Cheap order on line medicine without prescriptions Now FDA Approved Rx: Online Pharmacy. Low Prices.
  • Buy Cheap ambien sample Now Order Cheap Meds Without Rx. Best Prices.
  • Buy Cheapest propecia australia Now Special Prices For propecia australia! Best Internet.
  • Buy Cheap fluconazole cheap Now Top Online Pharmacy. Drugs, Health And Beauty.
  • Buy Cheap buy cialis 20mg Now Best Prices. Internet Prices For buy cialis 20mg!
  • Buy Cheap free viagra samples Online Pharmacy Store. Discount Pharmacy Online.
  • Buy Cheap cheapest sildenafil citrate Online Best Drugstore. Discount Online Pharmacy.
  • Buy Cheapest augmentin information Online Free Viagra Pills! Pharmacy Store.
  • Buy Cheapest low cost viagra online Now Cheap Pharmacy Online. Guaranteed Shipping.
  • Buy Cheap erection viagra Online Buy Medications Online. Best Prices.
  • Buy Cheapest low cost phentermine with no rx Online Cheap Pharmacy Online. Best Internet.
  • Buy Cheap order phentermine without prescription Online Internet Prices For order phentermine without prescription! Best Online.
  • Buy Cheapest ativan and alcohol Online WorldWide Shipping. Free Viagra Pills!
  • Buy Cheap cialis generic tadalafil Online Best Online. Special Prices For cialis generic tadalafil!
  • Buy Cheap zoloft anxiety Now Low Prices. Discount Online Pharmacy Shopping.
  • Buy Cheap price nexium Online Free Viagra Pills! Cheap Online Pharmacy.
  • Buy Cheapest sublingual viagra preparation Now Internet Prices For sublingual viagra preparation! Best Online.
  • Buy Cheap viagra england Now 24/Online Pharmacy. No Prescription Needed.
  • Buy Cheap canada ambien Now Best Drugstore. Top Online Pharmacy Supplier.
  • Buy Cheapest phentermine to buy no prescription Now Drugs, Health And Beauty. Best Prices.
  • Buy Cheapest getting xanax legally internet prescription Now Best Drugstore. No Prescription Needed.
  • Buy Cheap purchase pain medications Now Top Online Pharmacy. Drugs, Health And Beauty.
  • Buy Cheap purchase pain medication online without prescription Now Guaranteed Shipping. Online Prices For purchase pain medication online without prescription!
  • Buy Cheapest rx pain medicine online Online Low Prices. Cheap Prescription Drugs.
  • Buy Cheap prescription pain medicine top ten Now Special Prices For prescription pain medicine top ten! Best Online.
  • buy diet pills without prescription Online Without Prescription WorldWide Shipping. Best Prices.
  • Buy Cheap buy cheap levitra online Now Top Online Pharmacy. Cheap Prescription Drugs.
  • Buy Cheap cures for gonorrhea Online Pharmacy At The Best Price! Best Drugstore.
  • Buy Cheapest indian pharmacy Now Guaranteed Shipping. Best Drugstore.
  • Buy Cheap lorazepam fedex Online Best Drugstore. Online Prices For lorazepam fedex!
  • Buying Cheapest drugstore coupon. Offshore Pharmacy, Good Prices. Low Prices.
  • Buy Cheapest online prescription diet pills Now Buy Medications Online. Free Viagra Pills!
  • Buy Cheap fastest working diet pill Online Best Online. No Prescription Needed.
  • viagra instructions Online Without Prescription Pharmacy Store. Best Internet.
  • Buy Cheap buying viagra online in britain Online Prescription Drugs And Generic Medications.
  • Buy Cheap ambien pill sleeping Now Cheap Online Pharmacy. Buy Medications Online.
  • Buy Cheap generic ambien pill appearance Now Low Prices. 100% Satisfaction Guaranteed.
  • Buy Cheap detox parasites Online Best Prices. Drugs, Health And Beauty.
  • Buy Cheapest phentermine cheap no prescription Online Drugs, Health And Beauty. Best Internet.
  • Buy how viagra woirks Without Prescription Doctor. Pharmacy Store. Low Prices.
  • Buy Cheap clomid information Online Pharmacy Store. Drugs, Health And Beauty.
  • Buy Cheapest womens weight loss pills Now Best Drugstore. Cheap Online Pharmacy.
  • Buy Cheapest treatment for hair loss Now Top Online Pharmacy. Guaranteed Shipping.
  • Buy Cheap propecia buy online Now The Largest Internet Pharmacy. Pharmacy Store.
  • Buy Cheapest zoloft vs paxil Online Drugs, Health And Beauty. Best Internet.
  • buy viagra in london england Online Without Prescription Best Prices. Free Viagra Pills!
  • Buy Cheapest pheromones for sale Online Cheap Prescription Drugs. Best Internet.
  • Buy Cheap buspar drug Now Best Online. No Prescription Online Pharmacy.
  • Buy Cheap online generic cialis Online Best Online. Pharmacy At The Best Price!
  • fda lipitor Online Without Prescription Cheap Meds Without Prescription.
  • Buy Cheapest natural appetite suppressant Online Best Online. No Prescription Needed.
  • Buy Cheapest levitra order Online Low Prices. No Prescription Needed.
  • Buy Cheap clomid pregnant Now Online Medical Shop. 24/Online Pharmacy.
  • wholesale phentermine Online Without Prescription Low Prices. Best Internet.
  • Buy Cheap ultram overdose Now Special Prices For ultram overdose! Best Online.
  • Buy Cheapest depression treatment Online Best Internet. Cheap Online Pharmacy.
  • Buy Cheapest online prescription drug Now Low Prices. Internet Prices For online prescription drug!
  • Buy Cheap cheap viagra canada Now No Prescription Needed. Cheap Online Pharmacy.
  • Buy Cheap weight loss doctors Online The Largest Internet Pharmacy. Low Prices.
  • Buy Cheap zolpidem and no prescription Online WorldWide Shipping. No Prescription Needed.
  • Buy Cheapest most effective antidepressant Online Top Online Pharmacy. Best Online.
  • Buy Cheap free cialis Now 24/Internet)(safe Pharmacy. Best Prices.
  • Buy Cheapest free prescription valium Now Online Prices For free prescription valium! Low Prices.
  • Buy ultram order Online Without Prescription. Low Prices. Best Internet.
  • Buy Cheapest buy codine pain medication Online Cheap Online Pharmacy. Best Drugstore.
  • Buy Cheap viagra vs cialis vs levitra Online Best Online. No Prescription Needed.
  • Buy Cheap lexapro 10 mg Now The Largest Internet Pharmacy. Best Drugstore.
  • Buy Cheapest levitra commercial Now Special Prices For levitra commercial! Low Prices.