Objetos com Atributos Dinâmicos em Python

fevereiro 27, 2012

Criação da classe:

class Carro(object):

    def __init__(self,**kargs):
        for chave,valor in kargs.items():
            self.__dict__[chave] = valor

    marca = ''
    modelo = ''

O atributo especial __dict__, em um objeto, é um dicionário que é usado para

guardar atributos e seus respectivos valores.

Reparem que a classe inicialmente só tem 2 (dois) atributos: marca e modelo.

Criando um objeto dessa classe com mais atributos:

c = Carro(marca = 'Porsche', modelo = '911',
 cor = 'azul', ano = 1991)

Na definição da classe Carro, não há os atributos cor e ano.

Os mesmos foram criados dinamicamente para esse objeto no momento da

intanciação do mesmo.

 

Visualizando o valor de todos os atributos:

print c.marca

Porsche

print c.modelo

911

print c.cor

azul

print c.ano

1991

nextsysid.sh: Shell Script para Determinar o Próximo ID de Sistema

abril 17, 2011
Algumas vezes precisamos criar usuários e/ou grupos de sistema, os quais geralmente são IDs abaixo de 1000 para serem usuários de serviços. Abaixo vai o código fonte e exemplos de uso.
#!/bin/bash 

# nextsysid.sh 

# Script para gerar o próximo ID de sistema vago 

# Elaborado por Juliano Atanazio
# 17/04/2011 

if [ -f /etc/adduser.conf ]; then
    source /etc/adduser.conf 

# Faz a leitura do arquivo onde contém variáveis sobre
# quais devem ser os últimos IDs de usuários e grupos
# Obs.: Debian e derivados

else

# Para Red Hat e derivados

    FIRST_SYSTEM_UID='1'
    LAST_SYSTEM_UID='499'    
    FIRST_SYSTEM_GID='1'
    LAST_SYSTEM_GID='499'
fi

case $1 in
# Opção para o próximo ID de usuário de sistema
     'user')                    
# Primeiro ID de usuário de sistema
        ID_MIN=$FIRST_SYSTEM_UID    
# Último ID de usuário de sistema
        ID_MAX=$LAST_SYSTEM_UID; 
# Arquivo de IDs para usuários  
        FILE='/etc/passwd';        
        ;;

# Opção para o próximo ID de grupo de sistema
    'group')                

# Primeiro ID de grupo de sistema
        ID_MIN=$FIRST_SYSTEM_GID    
# Último ID de grupo de sistema
         ID_MAX=$LAST_SYSTEM_GID; 

# Arquivo de IDs para grupos   
        FILE='/etc/group';        
        ;;
    *)
# Exibe mensagem sobre parâmetros corretos
         echo -e "$0 {user|group}";    
        exit 1;
        ;;
esac 

# ----- Extrai todos IDs de sistema do arquivo -----

IDs=$(cat $FILE | cut -f3 -d: | sort -n )            

SYS_IDs=""

for ID in $IDs; do
    if [ $ID -ge $ID_MIN ] && [ $ID -le $ID_MAX ]; then
        SYS_IDs="$SYS_IDs $ID"
    fi
done

# ----- Extrai o próximo ID vago de sistema -----

i=$ID_MIN
NEXT_ID=$(($ID_MIN+1))

for SYS_ID in $SYS_IDs; do

    if [ $SYS_ID -ne $i ]; then
        break;    
    fi

    let i++;

    NEXT_ID=$i

done

# Imprime na tela o próximo ID
echo $NEXT_ID
Salve o arquivo com o nome nextsysid.sh e dê a permissão de execução: chmod +x nextsysid.sh Exemplos de Uso Próximo ID disponível para usuário de sistema ./nextsysid.sh user 114 Próximo ID disponível para grupo de sistema ./nextsysid.sh group 126 Até a próxima dica!!! :)

AUTO INCREMENTO E PREENCHIMENTO COM ZEROS À ESQUERDA NO ORACLE

outubro 30, 2010

A Idéia

No MySQL há dois recursos muito interessantes que são o AUTO_INCREMENT e o ZEROFILL.
O AUTO_INCREMENT que como o próprio nome sugere, incrementa automaticamente a cada INSERT. Esse recurso também está disponível no PostgreSQL (serial) e no MS SQL Server (identity).
Já o ZEROFILL, preenche com zeros à esquerda. Algo do tipo: 27 -> 00027.

No Oracle

No Oracle essas coisas, lógico, também são possíveis. Mas darão um pouco mais de trabalho.
Vamos construir um exemplo em que, numa tabela de funcionarios há um campo chamado id_funcionario, o qual é a matrícula de um colaborador contendo 5 dígitos, e, em casos que o número de dígitos seja inferior a 5, será preenchido com zeros, por exemplo: 00352. E também esse número será incrementado a cada
INSERT para fazermos o “AUTO_INCREMENT”.

Criação da tabela

CREATE TABLE tb_funcionarios(
id_funcionario CHAR(5),
nome_funcionario VARCHAR(30),
CONSTRAINT pk_funcionario PRIMARY KEY (id_funcionario)
);

Até então nada de muito especial, talvez o fato do campo de identificação ser CHAR e não INT… A resposta pra isso é muito simples; ninguém soma matrículas :)

SEQUENCES – Criando uma sequência

São Objetos que armazenam sequências numéricas:

CREATE SEQUENCE sq_funcionario START WITH 1 INCREMENT BY 1 NOMAXVALUE;

Relacionando a Sequência com a Tabela através de um Gatilho

CREATE OR REPLACE TRIGGER tg_id_funcionario BEFORE INSERT ON tb_funcionarios
FOR EACH ROW
BEGIN
SELECT lpad(sq_funcionario.nextval,5,’0′) INTO :NEW.id_funcionario FROM DUAL;
END;

A Função lpad

No Oracle, qualquer consulta necessita de um “FROM” para poder funcionar, então foi usada a tabela DUAL (para maiores informações procure no SQL Reference por “Selecting from the DUAL Table”).
A função “lpad” no caso teve três parâmetros respectivamente: o número, quantidade de dígitos e caractere para preencher à esquerda. Veja um exemplo prático:

SELECT lpad(352,5,’0′) FROM DUAL;

Retornou: 00352

E por fim, vamos inserir algumas coisas na tabela para testar

INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Chiquinho da Silva’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Astrogilda Santos’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Estroncio Veiga’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Wolframia Costa’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Teobaldo Castro’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Equinocia Tavares’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Gisevalda Almeida’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Gioconda Ramires’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Berília Rocha’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Adergildo Sales’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Criptonio Dias’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Rubidio Jose’);

Obs.: Nomes fictícios, qualquer semelhança com a realidade é mera coincidência :)

O resultado

SELECT * FROM tb_funcionarios;

Conclusão

O resultado final foi obtido através de relacionamento entre objetos, no qual um gatilho (TRIGGER) é acionado quando um INSERT é feito na tabela e
faz com que o valor inserido para o campo “id_funcionario” seja automaticamente incrementado, pegando o próximo número da sequência e o preenchendo com zeros à esquerda.

Configuração Manual do Ambiente JDK no Ubuntu + Plugin Java para Mozilla

julho 16, 2010

Um pequeno tutorial para ajudar a configurar o ambiente Java para programação de forma mais flexível, sem depender do apt-get. Além de configurar o plugin Java para navegadores como Firefox, Google Chrome, Opera, Konqueror, etc…

De início, temos que baixar o JDK no site:

http://java.sun.com/products/archive/index.html

Passos do site:

JDK/JRE – 6 -> [ Escolha a última versão ] -> Go

Download JDK -> Plataform: [ "Linux x64" para sistemas de 64 bits e "Linux" para 32 ] -> Continue
jdk-[versão].bin (não pode ser rpm.bin!) -> Salve em /tmp

Configurações e comandos

Abra um terminal e dê os comandos:

cd /tmp

chmod +x jdk-*.bin # Torna o arquivo executavel

./jdk-[versão].bin # Roda o executável

[ Pressione "q" a não ser que queira ler todo o texto :) ] -> [ Escreva "yes" (sem as aspas) ] -> <Enter>

mv jdk1* jdk # Deixa um nome mais amigavel

sudo mv jdk /opt/ # Move o diretorio jdk para /opt

Para sistemas de 64 bits:

# Cria um link para o plugin Java para Mozilla

sudo ln -s /opt/jdk/jre/lib/amd64/libnpjp2.so /usr/lib/mozilla/plugins/

Para sistemas de 32 bits:

# Cria um link para o plugin Java para Mozilla

sudo ln -s /opt/jdk/jre/lib/i386/libnpjp2.so /usr/lib/mozilla/plugins/

Edite o arquivo /etc/bash.bashrc e adicione as seguintes linhas:

export JAVA_HOME=/opt/jdk
export JRE_HOME=/opt/jdk/jre
export CLASSPATH=.:/opt/jdk/jre/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

Se for programar apenas em modo texto, no shell (haja coragem!!!), basta executar:

source /etc/bash.bashrc

Ou então para poder usufruir plenamente, simplesmente encerre a sessão na qual seu usuário está logado e entre novamente.

Pode ser que ao instalar via apt-get algum programa que necessite do jdk ele venha instalar automaticamente coisas como openjdk, icedtea que mais atrapalham do que ajudam. Então será preciso remover esses pacotes (indesejados) com o comando apt-get –purge remove nome_do_pacote. Uma boa maneira para se verificar se existem tais pacotes é fazendo uma busca com o comando:

dpkg -l | egrep “(jdk|java|icedtea)”

Se for o caso, desinstale o que não interessar para evitar conflitos com a instalação manual.

Agora o ambiente está pronto! É só começar a programar!

:)

PostgreSQL com “ZEROFILL” e “AUTO_INCREMENT”

março 20, 2010

Este artigo é dirigido especialmente àqueles que vêm do MySQL para o Postgres.
Dois recursos interessantes que existem no MySQL, o ZEROFILL (preenchimento com zeros à esquerda) e o  AUTO_INCREMENT (incremento automático).

Como fazer o AUTO_INCREMENT no PostgreSQL

O recurso de auto incremento no Postgres é feito através de SEQUENCES (sequências), que é um tipo de objeto que armazena sequências.
Em um exemplo mais simples criamos a tabela sem criar a SEQUENCE explicitamente. A palavra chave SERIAL, na verdade é o tipo INTEGER e faz com que uma sequência seja criada implicitamente para o campo:

CREATE TABLE tb_teste(
id SERIAL PRIMARY KEY
);

Dentre as mensagens exibidas após o comando acima, destaca-se:

NOTICE: CREATE TABLE will create implicit sequence “tb_teste_id_seq” for serial column “tb_teste.id”

Vejamos a descrição da tabela:

\d tb_teste

Table “public.tb_teste”
column | Type    | Modifiers
——–+———+——————————————————-
id          | integer  | not null default nextval(‘tb_teste_id_seq’::regclass)
Indexes:
“tb_teste_pkey” PRIMARY KEY, btree (id)

Como podemos ver, não existe “mágica” e sim LÓGICA! :) -> Se quiser um auto incremento, tem que ter uma sequência, a qual é o valor padrão do campo ao qual está associada, nem que seja criada implicitamente.

Criação de uma Sequência

Incrementa com razão = 1 (lembre-se das aulas de progressão aritimética ;) ), valor mínimo = 0, valor máximo = 99999:

CREATE SEQUENCE sq_exemplo INCREMENT 1 MINVALUE 0 MAXVALUE 99999;

Enfim, o ZEROFILL

Criação da Tabela

CREATE TABLE tb_exemplo(

id CHAR(5) DEFAULT lpad(nextval(‘sq_exemplo’)::CHAR(5),5,’0′) PRIMARY KEY
);

Repare que desta vez houve a mensagem de criação de sequência implícita. Isso porque a mesma foi criada explicitamente.

E onde está o EFEITO ESPECIAL?

1 – A restrição DEFAULT, que atribui um valor padrão ao campo;
2 – A função nextval que retorna o próximo valor da sequência, sua sintaxe é: nextval(‘nome_da_sequence’);
3 – A função lpad que recebe aqui três parâmetros: text, integer e text.
No primeiro parâmetro, nextval(‘sq_exemplo’)::CHAR(5), como a função nextval retorna um integer, foi preciso converter para um formato texto, que no caso foi CHAR(5).
No segundo parâmetro, 5 é o tamanho máximo da string que será preenchida com zeros à esquerda.
E no terceiro parâmetro, ’0′, é o caractere que será usado para preencher à esquerda caso de a string (primeiro parâmetro) for menor que o tamanho máximo (segundo parâmetro).

Teste e Conclusão

INSERT INTO tb_exemplo VALUES (DEFAULT),(DEFAULT),(DEFAULT),(DEFAULT),(DEFAULT);

O comando acima é um INSERT múltiplo na tabela que só tem um campo e que o mesmo possui um valor padrão (DEFAULT) e esse valor é o próximo numero da sequência, com preenchimento de zeros à esquerda.

Agora vejamos o resultado:

SELECT * from tb_exemplo ;

id
——-
00000
00001
00002
00003
00004
00005
(6 rows)

Vale a pena repetir os testes para ver  os valores inseridos.

Enfim, confie no poder do grande elefante e tome suas rédeas para dominá-lo XD.

Concedendo ou Revogando Privilégios em Colunas

dezembro 15, 2009

Antes da versão 8.4 só era possível fazer o controle de acesso de forma mais granular a uma tabela criando uma view especificando as colunas permitidas.

Agora pode dar ou tirar privilégios da seguinte forma:

GRANT SELECT (coluna1,coluna2,…) ON tabela TO role;

Para o exemplo prático a criação de role:

CREATE ROLE limitado LOGIN NOSUPERUSER;

Só terá acesso às colunas campoX e campoY, sendo de somente leitura da tabela tb_exemplo:

GRANT SELECT (campoX,campoY) ON tb_exemplo TO limitado;

De forma análoga será revogado (retirado) o acesso à coluna “campoX”:

REVOKE SELECT (campoX) ON tb_exemplo FROM limitado;

PostgreSQL – Função Replace: Corrigindo Inserções Equivocadas

dezembro 4, 2009

Imaginemos uma situação em que uma pessoa encarregada de cadastrar nomes de pessoas em um banco de dados. E que essa pessoa por algum motivo acabava confundindo os sobrenomes “dos Santos” e “da Silva”.

No exemplo, o cadastro das pessoas que constam como “da Silva”, na verdade o sobrenome é “dos Santos”. Como corrigir isso??? Fazer um UPDATE em cada linha? Há uma maneira simples, rápida e eficiente para isso:

–Criação da Tabela de exemplo:

CREATE TEMP TABLE tb1(

nome varchar(25)

);

–Inserção dos valores (equivocadamente):

INSERT INTO tb1 VALUES (‘Genésio Silva’),

(‘Estrobaldo da Silva’),

(‘Aventina Silva’),

(‘Eloécio da Silva’);

–Arrumando o erro:

UPDATE tb1 SET nome = replace(nome,’da Silva’,'dos Santos’);

–Verificando o resultado:

SELECT * from tb1 ;

nome

———————–

Genésio Silva

Estrobaldo dos Santos

Aventina Silva

Eloécio dos Santos

(4 rows)

Como pode se constatar apenas as ocorrências da string “da Silva” e não “Silva” foram alteradas para o novo valor.

Consulta aleatória com PostgreSQL

agosto 13, 2009

Ao invés de apresentarmos resultados de uma consulta de forma ordenada, pode ser interessante apresentá-los sem uma ordem específica. Uma forma aleatória.
No PostgreSQL temos a função random() que nos ajudará para isso.
Exemplo:

SELECT campo1,campo2,campoN FROM tabela WHERE campo1=’valor’ ORDER BY random() LIMIT 5;

De acordo com o exemplo, conforme a condição de filtragem, os resultados serão apresentados em 5 (cinco) por vez e de forma aleatória.

Atualizando a hora do Windows por um Servidor Linux NTP

junho 24, 2009

Com as devidas permissões de usuário, no prompt DOS digite os comandos:

net time /setsntp:ip_do_serrvidor_NTP
net stop w32time
net start w32time

Aguarde alguns segundos e terá o horário atualizdo! ;)

Gerando senhas com o pwgen

dezembro 27, 2008

Política de senhas é algo que todo administrador de redes deve se preocupar, mas, muitas vezes se deparam num pequeno problema:
o de elaborá-las… Como fazer isso? De cabeça? Data de aniversário, casamento ou uma outra qualquer? Para um cracker que possui a habilidade de engenharia social descobrir uma senha dessas é razoavelmente fácil.
Até conhecer o pwgen, eu mesmo pra elaborar minhas senhas queimava alguns neurônios pensando em seqüências de caracteres “doidas”, como diziam aqueles para quem as entregava (risos).
No entanto, a partir do momento que conheci o pequeno utilitário pwgen as coisas mudaram e facilitaram pra mim nesse assunto.
Vamos primeiro instalar o utilitário:

sudo apt-get install pwgen

Fiz uma tradução de seu help (pwgen –help):

Opções suportadas pelo pwgen:

-c ou --capitalize
Inclui no mínimo uma letra maiúscula na senha
-A ou --no-capitalize
Não inclui letras maiúsculas na senha
-n ou --numerals
Inclui no mínimo um número na senha
-0 ou --no-numerals
Não inclui números na senha
-y ou --symbols
Inclui no mímino um carácter especial na senha
-s ou --secure
Gera senhas completamente aleatórias
-B ou --ambiguous
Não inclui caracteres ambíguos na senha
-h ou --help
Exibe ajuda do comando
-H ou --sha1=path/to/file[#seed]
Use hash sha1 de um dado arquivo como gerador aleatório
-C
Exibe as senhas geradas em colunas
-1
Não exibe as senhas geradas em colunas
-v ou --no-vowels
Não utiliza vogais nas senhas

Se for simplesmnete digitado o nome do executável teremos um resultado como o que segue abaixo:


Thietho3 lahC7yoV oox3Asah fohch4Ej ooChoi7e ileeCae3 oMai8ui7 feV2cahk
ew1Quomu teshou1U FaoNo9oh irooMei1 SheiGh5h chu7Chee eiDei0oh Ojie7eik
Keegieb5 pu7aiGae Poh8quae Ti0poo5v Ahkoo0Ee uCh4thie deiCh2aC chax6Hoh
omaid8aP eeTh6oob Ooch4iwe Ur2ochai Ahgh2Chu thae4Nei ahPha9oo Xiaraiy8
iePh5mi4 Sexoh1Ge faequ9Oh HeN3aNg3 eew8EiYo zohVoh5p foo2DiiV ouKen0ma
shiec0Re haenohW4 aetha4eP Gai1aiTh iwie2Kai ga0gaeH8 Uih3mahs oqu8Iaha
neiF0eir xaoXui7X Doha6iGh jui2eeKu vaRohr6t eL1uhazu aijoh1Ee AiX9eeba
Ahgh1Jee loozu8Ev ThauTil1 Gai6aePo vee5Gee9 ahSh6Nur Zohk1ubi ieX1tigu
Ii5eiToh DahDeev1 foiDoh1W aiH4Iu7W Eech7dae xoe8aQuo quuiT2ae ohVie8ib
baePhu9O ahNgee8Z Fui9gohb Thea8soo Shee0fie Ma0choem ohco7aKa ieng2ohH
ECeel2Io saer8Vei Cho7thah aGh3aite AhXoof7i pig5Sho3 Fa8Wiah1 deW0raiz
Ephia2de Eemah7ai eeX5ohti ve5Xiezo texu5IGh ReiGh7Mo aeCh3shu ool8Diul
ooCh5umi kuKaup7b iet4Xa9l Achangi5 Gahxeix9 eech5AhV aThahsi0 Raik3nae
ahGu0Oof uiNgoh6i aGae9kaf eewe2Tha Tai9oPhe ve3Uphoo JaeQuai2 SohF2wai
jom8ooTh KeyeeZ0X cee0FaeN Xait1soo EiSoo1ae leeCaej8 fuf0Pafu iPhie7wi
faeGith4 Phaf0duy oGu5ifuy uRae1Zai Wiet7EeC eem9Viep Deepoo6i Pug8aing
Thae4ahb Gaiqu3Ga aixi2Uwa The6aepa hom8Iexe oozaGu5n quohg1Ie Jieyae5b
Tu2Ietho Pai9zeSh yeeShae7 chew8Gah Ohr0eefo ookoBe8w eol1yaK9 achuoS1x
nai8Aith ang6Oozi Touy1ail Opha7phu Ri7Eepha oSi3Oora ahpee3Eh Heehi8ee
Quoh8tha Ohshae6h eeNg7Ies ooV9Eich OCe2rooc bie6Liez eeReiy9h Ovus6iej

Vale lembrar que as senhas são aleatórias, a probabilidade de elas se repetirem são realmente ínfimas.
Para não ficar uma demonstração poluída, que exibe várias senhas geradas em colunas, usarei a opção “-1″
para exibir apenas uma senha. Então vejamos:

pwgen -1

toej3ahL

Por padrão mistura letras (maiúsculas e minúsculas) e números, mas não inclui caracteres especiais.
Para fazermos uma senha mais segura, vamos acrescentar um “y” como parâmetro para gerar uma senha mais difícil ainda de ser adivinhada:

pwgen -1y

Sie)th7U

Agora temos uma senha q possui letras (maíusculas e minúsculas), números e caracteres especiais.

O uso do pwgen é bem simples, as opções são auto explicativas por si só e vale lembrar que cada senha que o aplicativo gera tem 8 (oito) caracteres, determinados sistemas exigem mais que isso. A solução é bem simples, complemente o que falta gerando outra senha e junte-as.

O pwgen é a ferramenta ideal para gerar senhas, simples, prático e agilizador. Eu recomendo!


Seguir

Obtenha todo post novo entregue na sua caixa de entrada.