Arquivo

Arquivo do autor

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.

    Motivos para amar um NERD

    1, setembro, 2009 5 comentários

    1. Você pode ter certeza daquilo que ele é, e de como será.

    Nerd não muda. Ele não tenta fingir que é outra pessoa só para te agradar, porque nem se ele quisesse ele saberia como parecer legal, bonito, etc. As qualidades de um NERD são imutáveis.

    Se ele gosta de C++, vai morrer gostando de C++. Pode até ser que passe a usar Java também, mas no fundo é tudo a mesma coisa.

    Se ele gosta de De Volta para o Futuro, vai morrer gostando disso.
    Se hoje ele é gordinho, amanhã será gordinho.
    Se hoje ele é magrelo, amanhã será magrelo.
    Diferente dos garotos que fazem musculação para você achar que eles são gostosos, e depois que você casar eles vão virar uns gordos barrigudos?

    2. Se ele diz que vai fazer uma festa em rede é verdade.
    Sabe aquele papo dos homens comuns de falar que vai jogar futebol e ir a outro lugar?
    Se Nerd fala que vai a casa de alguém para fazer uma Festa em Rede e jogar Doom, é porque ele vai fazer isso.

    Ele não vai mentir para você, falando que vai fazer uma coisa e ir fazer outra coisa.

    3. Nerd tem empregos estáveis.
    Muita gente diz que mulher gosta de dinheiro, tremenda mentira.
    O que mulher odeia são homens idiotas que não conseguem ter um emprego decente.
    Até porque senão você ( mulher ) tiver um marido com emprego tosco, ainda tem que ouvir sua mãe, suas amigas falando:
    - Nossa! Mas que marido você arrumou, ele é um banana?

    Com Nerds não tem preocupação. Até porque Nerd sempre faz algo que ninguém entende, e daí parece ser muito mais importante o emprego dele do que realmente é.

    - Ah! Meu marido cuida de um Servidor de rede?

    4. Nerd sempre resolverá o problema do seu computador muito mais rápido e melhor que o suporte técnico.
    E o melhor, de graça.

    5. Ele não vai esquecer seu aniversário.
    A menos que a bateria do Palm dele acabe.

    6. Ele não tem ciúmes do carro dele.
    Ele não vai ficar falando do carro dele o tempo todo.
    Mas não pegue o livro do Stephen Hawking e nem toque no computador dele.
    Computador é uma coisa sagrada, NUNCA TOQUE NELE.

    7. Nerd adora saber como as coisas funcionam.
    Então enquanto ele não conseguir fazer você ter um orgasmo, ele vai estudar o porquê, estudar os pontos sensíveis de uma mulher, criar um gráfico com as possíveis formas de te fazer chegar lá medindo a probabilidade de isso acontecer.

    Fará cálculos de Permutação para saber qual o conjunto dessas formas é a melhor para fazer você ter um orgasmo?.
    Só não pergunte para ele o que ele está fazendo, porque se ele tentar te explicar você não vai entender.

    8. Nerd esperto grava os programas.
    Nerd que é nerd sabe programar o video cassete, o gravador de DVD ou a placa dee captura de TV para gravar seu programa favorito. Por isso não tem porquê ele não ir a algum lugar com você só porque estará passando Jornada nas Estrelas ( ao contrário dos maridos comuns que ficariam em casa vendo futebol ).
    A menos que você queira ir a um lugar movimentado, a maioria dos Nerds odeiam lugares cheios ( pelo menos eu odeio )?

    9. Todo mundo tem defeito.
    Mesmo tendo bons motivos para amar um NERD, NUNCA, JAMAIS, NEM PENSE, em interrompê-lo quando ele está programando, esse momento é sagrado.
    Interromper alguém que está programando é pior que interromper alguém que está no meio de um cálculo.

    Motivo: Quase sempre agente tem que ter em mente o valor de 4 ou 5 variáveis nessa hora.
    Tem que saber como e porquê o FOR começou e vai acabar
    Tem que guardar na cabeça a condição do IF onde estamos lendo.

    E guardar muitas outras informações.
    Se você interrompe nessa hora, agente esquece todas essas informações e tem que procurá-las de novo. e isso é uma chatice.

    Então! AME um NERD!
    Mas NUNCA encoste no computador dele, fale mal do Stephen Hawking ou dos programas de TV que ele assiste e NUNCA interrompe no meio de uma programação.
    Faça isso e será feliz para sempre !

    Categories: Sem categoria Tags: ,

    Envolvimento X Comprometimento – Dilbert

    28, agosto, 2009 1 comentário

    A tirinha sobre porcos e galinhas, é classica:

    Porco vs Galinha

    Baseados nesta historinha, costumamos dizer que existem dois tipos de pessoas em projetos Scrum:

    Galinhas: Apenas envolvidas com o projeto
    Porcos: Totalmente comprometidos com o projeto

    Na visão Dilbert seria assim:

    Dilbert

    Categories: Scrum Tags: , , ,

    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: ,

    Bem Vindo!!! www.eliezer.com.br

    23, agosto, 2009 4 comentários

    Bom, Finalmente vou manter meu blog sobre tecnologia e desenvolvimento de software atualizado. Ou melhor vou tentar manter ele vivo. Pretendo ir postando assuntos mais variados sobre desenvolvimento de software que geralmente acho legal mas que não era possível disponibilizar para amigos e interessados.

    Espero que gostem do conteúdo. :)

    Categories: Sem categoria Tags: