Arquivo

Arquivo da Categoria ‘Linguagens’

Busca de CEP no seu form apenas com Javascript

5, dezembro, 2011 Sem comentários

Busca de CEP, sempre foi um grande problema em grandes empresas, mas para pequenos projetos nem se fala. O objetivo não é ter 100% de certeza para busca de cep, mas sim uma alternativa via internet sem grandes complicações.

Vantagens

  • É melhor ter uma busca de 90% dos casos do que nada
  • Sem custo com base dos correios
  • Sem custo de infraestrutura
  • Muito, mas muito simples utilizar o código

Desvantagens:

Ao que interessa, como fazer.
Uma mistura de jquery, plugin de mascara, html é possível ter uma busca de CEP no seu formulário. A magia está na unica possibilidade de se fazer um cross-request em um browser com dominios diferentes, getScript do jquery. Ele vai fazer uma requisição do tipo GET em um script. Pensando nisso e utilizando o próprio exemplo do site republica virtual, é possível fazer a busca online de CEP.
O Script:
function findCEP() {
    if($.trim($("#zipcode").val()) != ""){
        $.getScript("http://cep.republicavirtual.com.br/web_cep.php?formato=javascript&cep="+$("#zipcode").val(), function(){
            if(resultadoCEP["resultado"] == 1){
                $("#street").val(unescape(resultadoCEP["tipo_logradouro"])+" "+unescape(resultadoCEP["logradouro"]));
                $("#district").val(unescape(resultadoCEP["bairro"]));
                $("#city").val(unescape(resultadoCEP["cidade"]));
                $("#state").val(unescape(resultadoCEP["uf"]));
                $("#number").focus();
            }else{
                alert("Endereço não encontrado para o cep ");
            }
        });
    }
}
Teste a busca:

Download dos fontes: http://eliezer.com.br/files/cep-javascript.zip

Saiba mais sobre a base, exemplos no site: http://www.republicavirtual.com.br/cep/

Categories: javascript Tags: , ,

Utilitário de acesso a maquinas remotas com ssh – fast-remote

14, janeiro, 2011 2 comentários

Bom, quem nunca esqueceu o IP da maquina que tem o servidor de desenvolvimento da sua aplicação? você até lembra que nome dela era ‘dev’ alguma coisa….. e que o ip começava com 192.168.4. mas não tem certeza.

Essa história passa a ser muito comum quando:

  • Quantidade de projetos que você trabalha vai aumentando
  • Complexidade de serviços utilizados pela sua aplicação aumenta
  • Quantidade de ambientes aumenta (desenvolvimento, teste, homologação, produção)

Como sou desenvolvedor, tenho que lembrar de um monte de coisas, não vou me dar ao trabalho de lembrar mais 30 IPs diferentes para trabalhar. Surgindo assim o ‘fast-remote’. Um simples script shell criado para te ‘lembrar’ dos nomes e ips das suas maquinas.

Ele está hospedado no github em: https://github.com/eliezer/fast-remote

Como instalar?

Faça um clone do repositório no local que preferir instalar.

[eliezer@vader ~]$ cd /opt/
[eliezer@vader opt]$ git clone git://github.com/eliezer/fast-remote.git
Cloning into fast-remote...
remote: Counting objects: 15, done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 15 (delta 3), reused 0 (delta 0)
Receiving objects: 100% (15/15), done.
Resolving deltas: 100% (3/3), done.

Execute o instalador

[eliezer@vader opt]$ cd fast-remote/
[eliezer@vader fast-remote]$ ./fast-remote install
Installation successfully
Run command: 'source /home/eliezer/.bashrc' or logout/login
usage: fast-remote --help

Recarregue o bashrc (linux) ou bash_profile (mac)

Ajuda:

[eliezer@vader opt]$ fast-remote --help
Usage:

'fast-remote install' to install
'fast-remote set_user' to define default user connect
'fast-remote' to connect ssh (ssh SERVER)
'fast-remote /home/user/file.tar' to transfer file scp (scp file SERVER:/HOME_DIR)

Além do acesso ssh o fast-remote também faz transferência de arquivos utilizando scp.

Executando:

[eliezer@vader ~]$ fast-remote

Agora é só configurar seu servidores favoritos no arquivo server.properties e utilizar.

Nova versão 0.5 do Inotes Contacts para Gmail

29, março, 2010 Sem comentários

Nova versão do Inotes Contacts disponível aqui. Essa versão corrige o bug da API gmail-greasemonkey. Detalhes sobre o problema em: http://code.google.com/p/gmail-greasemonkey/issues/detail?id=39

A solução foi implementar um listener que monitora a pagina no gmail e inclui o botão do Inotes.

Para que não conhece tem um post explicando o script.

Categories: javascript Tags: ,

Integração de contatos IBM Inotes no gmail

15, outubro, 2009 1 comentário

Não estou querendo que todos abandonem o Inotes da IBM, pois se trata de uma ferramenta de e-mail muito boa. Mas como todo software tem limitações, e a principal delas que me atrapalha muito é o espaço. Tem outro fator que ajuda, centralizar todos os seus e-mails em um único lugar.

Então uma alternativa é colocar a sua conta do gmail para baixar os e-mails do inotes via pop3. Mas essa solução traz outro problema, os contatos do seu domínio do inotes não ficam mais acessíveis.

Para corrigir isso trabalhei em um script Greasemonkey que resolve meu problema. :) Espero que seja útil para mais pessoas também.

Como funciona:

Uma combinação de tecnologia deu origem ao script.

Firefox 3.5 + gmail + inotes + Greasymonkey + javascript + gmonkeyAPI + GM_xmlhttpRequest + xpath + dedicação = “IBM Inotes Contacts in Gmail”

O Script está hospedado no userscripts.org o maior repositório de scripts existente.

Instalação:

Depois de intalado, defina as configurações da sua conta no script:

1
2
3
InotesContacts.config.domain = ""; //Define your domain here (ex.: inotes.yourdomain.com)
InotesContacts.config.user = "";   // Set your username
InotesContacts.config.password = ""; //Set your password

Veja o screeanshot:

inotes_contacts

Qualquer problema, sugestão, melhoria, agradecimento acesse a pagina do script aqui

Para que gosta do código, o fonte está aqui. :)

Categories: javascript Tags: , , , , ,

Parse de XML string com xpath em Javascript

5, outubro, 2009 1 comentário

XML simples de clientes com tipo de pessoa. Nesse exemplo vou usar xpath para pegar apenas os clientes do tipo ‘F’

1
2
3
4
5
6
7
8
9
10
11
12
13
<xml>
	<clientes>
		<cliente id="1" tipoPessoa="F">
			<nome>Eliezer Rodrigues</nome>
		</cliente>
		<cliente id="2" tipoPessoa="J">
			<nome>Empresa Abz teste</nome>
		</cliente>
		<cliente id="3" tipoPessoa="F">
			<nome>Maria da Silva</nome>
		</cliente>
	</clientes>
</xml>

Codigo completo, para fazer o teste, cole no firefug e rode:

1
2
3
4
5
6
7
8
9
10
11
12
var xmlString = "<xml><clientes><cliente id='1' tipoPessoa='F'><nome>Eliezer Rodrigues</nome></cliente><cliente id='2' tipoPessoa='J'><nome>Empresa Abz teste</nome></cliente><cliente id='3' tipoPessoa='F'><nome>Maria da Silva</nome></cliente></clientes></xml>";
 
var parser=new DOMParser();
var doc = parser.parseFromString(xmlString,"text/xml");
var xpath= "//clientes/cliente[@tipoPessoa = 'F']";
var xmlObject = doc.evaluate( xpath, doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );
 
var i=0;
while ( (entry = xmlObject.snapshotItem(i) ) !=null ){ 
    alert("Nome: "+entry.firstElementChild.textContent);
    i++;
}

legal neh?

Categories: javascript Tags: , ,

Lendo arquivo de propriedades com Shell Script – IFS

21, setembro, 2009 2 comentários

Bom, pode parecer simples, mas quando a velocidade é o seu primeiro quesito, isso pode mudar um pouco. Mas espera aí, é apenas ler um arquivo e fazer um split pegar a chave e o valor. Simples assim mesmo, mas quando o assunto é shell script um simples split não é tão simples.

A primera forma de se fazer seria fazer com um cut, veja:

1
echo "chave=valor" | cut -d = -f 1

Legal, funciona, mas quando seu arquivo de properties é grande, ou que esse script rode toda hora, a velocidade do um simples cut que funciona passa a ser um problema.

Uma outra forma de se fazer isso é usar o IFS – Internal Field Separator para fazer isso de uma forma decente.

Então, vamos lá. Pimeiro meu arquivo de propriedades:

sample.properties

1
2
caminho=/tmp
version=1.0

Fiz um script simples para representar o problema. Função rox com IFS e função sux com CUT.

sample.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash
 
rox(){
	IFS_OLD=$IFS
	IFS="="
	while read key value
	do
		echo "key = $key"
		echo "Value = $value" 
	done < sample.properties 
	IFS=$IFS_OLD
}
 
sux(){
	while read line
	do
		key=`echo $line | cut -d = -f 1`
		value=`echo $line | cut -d = -f 2`
		echo "key = $key"
		echo "Value = $value"
	done < sample.properties 
}
clear
echo "rox--------------------------------------"
time rox
echo "sux--------------------------------------"
time sux

Veja o resultado:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
rox--------------------------------------
key = caminho
Value = /tmp
key = version
Value = 1.0
 
real	0m0.001s
user	0m0.000s
sys	0m0.000s
 
sux--------------------------------------
key = caminho
Value = /tmp
key = version
Value = 1.0
 
real	0m0.024s
user	0m0.007s
sys	0m0.019s

Notem a velocidade do script. Não é ser xiita, mas sim fazer da forma correta. :)

Template Engine em Python – Cheetah

10, setembro, 2009 Sem comentários

Um modulo simples para python, cheetah. Ele tem tudo que programadores python gosta, simples, bem documentado, comunidade ativa, rápido, possui um mecanismo de cache entre outras funcionalidades.

  • Onde baixar?
  • http://www.cheetahtemplate.org

  • Instalando
  • 1
    
    python setup.py install
  • Criando um objeto simples Cliente
  • 1
    2
    3
    4
    
    class Cliente():
    	def __init__(self, nome, email):
    		self.nome = nome
    		self.email = email
  • Criando um template
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    <html>
    <head><title>$title</title></head>
    <body>
    	<div>
    	#for $cliente in $clientes        
    		<div>
    		<b>$cliente.nome</b>
    		(<a href="mailto:$cliente.email">$cliente.email</a>)
    		</div>
    	#end for
    	</div>
    </body>
    </html>
  • Executando
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    from Cheetah.Template import Template
     
    if __name__ == "__main__":
     
    	clientes = [Cliente("Eliezer Rodrigues", "eliezer@teste.net"), 
                           Cliente("Maria", "maria@teste.net")]
     
    	template = Template(file="page.tpl")
    	template.title = "Todos os clientes"
    	template.clientes = clientes
     
    	print str(template)
  • Resultado:
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    <html>
    <head><title>Todos os clientes</title></head>
    <body>
            <div>
                    <div>
                    <b>Eliezer Rodrigues</b>
                    (<a href="mailto:eliezer@teste.net">eliezer@teste.net</a>)
                    </div>
                    <div>
                    <b>Maria</b>
                    (<a href="mailto:maria@teste.net">maria@teste.net</a>)
                    </div>
            </div>
    </body>

    Curtiu?? para saber mais sobre o projeto entre no guia do usuário e confira tudo sobre o cheetah.

    Sabe aquele monte de “if” e “else” no código? Limpando tudo em Java.

    26, agosto, 2009 3 comentários

    Uma das coisas que considero mais ruins de se ler em um código são os malditos ifs encadeados. Veja, não é fácil de se ler, não é confiável e bem mais propício a bug. Portando se tem muitos ifs, algo não está correto.

    Vou utilizar polimorfismo para implementar o padrão de projeto Strategy.

    Um fiz um caso simples apenas para exemplificar o estudo.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    public class StringUtils {
     
    	public static final String	REMOVE_ALL_SPACES	= "remove-all-spaces";
    	public static final String	FILTER_ONLY_NUMBERS	= "filter-only-numbers";
     
    	public static String format(String action, String value) {
     
    		if (REMOVE_ALL_SPACES.equals(action)) {
    			return value.replaceAll("\\s", "");
    		} else if (FILTER_ONLY_NUMBERS.equals(action)) {
    			return value.replaceAll("\\D", "");
    		}
    		return null;
    	}
    }

    Bom não é tão feio, pq tb quem nunca viu algo pior que isso que atire a primeira pedra. :) Vamos fazer com que esse método format seja mais simples. No caso ele está com apenas duas comparações, mas lembre-se que poderiam ser 18. :(

    Mas dá pra melhorar e muito utilizando Enum. Veja:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    public enum StringFormat {
     
    	TRIM_SPACES() {
     
    		@Override
    		public String format(String value) {
    			return value.replaceAll("\\s", "");
    		}
    	},
    	ONLY_NUMBERS() {
     
    		@Override
    		public String format(String value) {
    			return value.replaceAll("\\D", "");
    		}
    	};
    	public abstract String format(String value);
    }

    E agora o nosso objetivo final, remover os ifs e else do método format:

    1
    2
    3
    4
    5
    6
    
    public class StringUtils {
     
    	public static String format(StringFormat action, String value) {
    		return action.format(value);
    	}
    }

    Legal né?

    Persistência em Python com módulo Shelve

    24, agosto, 2009 1 comentário

    Uma das coisa que atualmente mais acho legal em programação é Python. É muito bem documentado, simples e rápido. Em um projeto open source que estou parcipando, o Peanut [Explico melhor em um outro post :) ], tive que persistir uma configuração do software, e com isso veio a possibilidade de utilizar o módulo shelve do python.

    O shelve foi criado para trabalhar com persistência de dicionários (dict) python em arquivo. Para operações simples, configuração, dados não muito grandes, é perfeito. Sua chave sempre deve ser uma string.

    Como a maioria dos módulos em python, é tudo muito simples:

    Exemplo 1: Vamos salvar uma lista de e-mail em um arquivo

    1
    2
    3
    4
    5
    6
    7
    
    import shelve
    emails = shelve.open('emails.db')
     
    emails["maria"] = "exemplo@maria.com.br"
    emails["joao"] = "exemplo@joao.com.br"
     
    emails.close()

    Recuperando os e-mails

    1
    2
    3
    4
    5
    6
    
    import shelve
    emails = shelve.open('emails.db')
     
    print emails["maria"]
     
    emails.close()


    Exemplo 2: Persistência de um objeto mais completo

    Criação de um objeto simples

    1
    2
    3
    4
    5
    6
    7
    
    class Profile():
       def __init__(self, name, type, username, password=None, auto_login='off'):
       self.name = name
       self.type = type
       self.username = username
       self.password = password
       self.auto_login = auto_login

    Classe util para acesso a shelve

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    import shelve
    class Db():
     
      def open(self):
        self.__db = shelve.open("profiles.db")
     
      def close(self):
        self.__db.close()
     
      def add(self, profile):
        self.__db[profile.name] = profile;
     
      def size(self):
        return len(self.__db)
     
      def find_all(self):
        return self.__db.values();
     
      def get(self, key):
        return self.__db[key]
     
      def get_first(self):
        return self.get(self.__db.keys()[0])

    Inserindo um perfil

    1
    2
    3
    4
    5
    
    db = Db()
    db.open()
    profile = Profile("maria", "user", "mariazinha", "123")
    db.add(profile)
    db.close()
    Categories: Python Tags: ,