segunda-feira, 28 de setembro de 2015

SQL - Demorada

Consultas demoradas

SELECT pid, now(), datname, usename, now()-query_start as tempo_execucao, waiting, client_addr, query
FROM pg_stat_activity
WHERE query not like  '%%' and query_start < now() - interval '5 seconds'  order by 3 desc;

Cancelar uma consulta

 SELECT pg_cancel_backend(pid of the postgres process);

quinta-feira, 27 de agosto de 2015

Lendo dados CSV com R


Para leitura de um arquivo CSV em R

dados = read.csv(file="C:/caio/SNAS/CREAS/CREAS/Bases de Dados/CensoSUAS2014_CREAS_DadosGerais_Divulgação.csv", sep=";", quote='"', header=TRUE)

Relação dos campos lidos
names(dados)

Apresenta os dados da coluna q2
dados$q2

Média dos valores da coluna q8_1
mean(dados$q8_1)

Quantidade de linhas
nrow(dados)

Quantidade de colunas
ncol(dados)

Menor valor
min(dados$q8_1)

Maior valor
 max(dados$q8_1)

Desvio Padrão
sd(dados$q8_1)

Variância 
var(dados$q8_1)

Quartiles
quantile(dados$q8_1)

BOXPlot
summary(dados$q8_1)

Lista todas as variáveis definidas 
ls()

Salva os dados como um objeto do R.
dataDaPesquisa = date()
save(dados, dataDaPesquisa, file="C:/caio/SNAS/CREAS/CREAS/Bases de Dados/CensoSUAS2014_CREAS_DadosGerais_Divulgação.Rda")

Carrega o objeto salvo sem precisar consultar novamente no banco!
dataDaPesquisa = date()
load("C:/caio/SNAS/CREAS/CREAS/Bases de Dados/CensoSUAS2014_CREAS_DadosGerais_Divulgação.Rda")

terça-feira, 25 de agosto de 2015

Algoritmo e Estrutura de Dados Capitulo 1

Algoritmo é qualquer procedimento computacional bem definido que toma algum valor ou conjunto de valores como entrada e produz algum valor ou conjunto de valores como saída. É uma ferramenta para resolver um problema computacional bem especificado.

Uma instância de um problema consiste na entrada que satisfaz a quaisquer restrições impostas no enunciado do problema necessária para se calcular uma solução para o problema.

Um algoritmo é dito correto se para cada instância de entrada, ele para com a saída correta.

Diz-se que um algoritmo correto resolve o problema computacional dado.

Os algoritmos incorretos podem ser úteis, se sua taxa de erros pode ser controlada.

O único requisito é que a especificação deve fornecer uma descrição precisa do procedimento computacional a ser seguido.

Estrutura de dados é um meio para armazenar e organizar dados com o objetivo de facilitar o acesso e as modificações. Nenhuma estrutura de dados única funciona bem para todos os propósitos, e assim é importante conhecer os pontos fracos e as limitações de várias delas.

Problemas NP-Completos

  • embora ainda não tenha sido encontrado nenhum algoritmo eficiente para um problema NP completo, ninguém jamais provou que não é possível existir um algoritmo eficiente para este fim. Desconhece-se se existem ou não algoritmos eficiente para problemas NP completos.
  • Se existe um algoritmo eficiente para qualquer um deles, então existem algoritmos eficientes para todos.
  • Vários problemas NP Completos são semelhantes, mas não idênticos, a problemas para os quais conhecemos algoritmos eficientes. Uma pequena mudança no enunciado do problema pode provocar uma grande alteração na eficiência do melhor algoritmo conhecido.
Exemplo de um problema NP Completo é "problema do caixeiro viajante". Não tem nenhum algoritmo eficiente conhecido. "Algoritmos de aproximação".

Exercício:
1.1-1 Forneça um exemplo real no qual apareça um dos problemas computacionais a seguir:
ordenação: Listagem de alunos ou produtos por nome, ou código ou sobrenome, ou fabricante
determinação da melhor ordem para multiplicação de matrizes: Para solução sistema de equações lineares, utilizando método de Gauss
localização da envoltória convexa: topografia, determinar o terreno que envolve os pontos levantados, Curvas de nível

1.1-2 Além da velocidade, que outras medidas de eficiência poderiam ser usadas em configuração real?
Espaço utilizado para solução, custo financeiro dos recursos utilizados, por exemplo: banda de conexão, tempo de processamento.

1.1-3 Selecione uma estrutura de dados que você já tenha visto antes e discuta seus pontos fortes e suas limitações.

Vetor 
Pontos fortes: rapidez no seu acesso. pode-se acessar qualquer posição do vetor diretamente
Pontos fracos: alocação em geral é estática, necessita de uma engenharia para alocar mais espaço, desde que esteja utilizando alocação estática.

1.1-4 Em que aspectos os problemas do caminho mais curto e do caixeiro viajante anteriores são semelhantes? Em que aspectos eles são diferentes?

Aspectos semelhantes: a dificuldade para encontrar a solução mais eficiente esta no tamanho da quantidade de pontos, cidades que se queira analisar, quanto maior o número de cidades, pontos do problema mais difícil fica a solução do problema.

o problema do caminho mais curto pertence a classe P
o problema do caixeiro viajante pertence a classe NP Completo

1.1-5 Mostre um problema real no qual apenas a melhor solução servirá. Em seguida, apresente um problema em que baste uma solução que seja “aproximadamente” a melhor.

Solução Ótima: Quantidade de dinheiro necessária para quitar as dívidas do dia (contas a pagar)
Solução Aproximada: Encontrar o zero de uma função utilizando o método das secantes.

https://meitcher.wordpress.com/2015/01/27/1-1-algoritmos/

O estudo do algoritmo é necessário para demonstrar que o método da solução adotada termina e obtém a resposta correta.

Boa prática da engenharia de software - bem documentada e projetada.

1.2-1 Forneça um exemplo de aplicação que exige conteúdo algorítmico no nível da aplicação e discuta a função dos algoritmos envolvidos

A solução de classificação multivariável, por exemplo aplicação do algoritmo de PROMETHEE, tem que aplicar algoritmo de ordenação, classificação, comparação entre os critérios selecionados.

1.2-2 Vamos supor que estamos comparando implementações de ordenação por inserção e ordenação por intercalação na mesma máquina. Para entradas de tamanho n, a ordenação por inserção é executada em 8n^2 etapas, enquanto a ordenação por intercalação é executada em 64n lg (n) etapas. Para que valores de n a ordenação por inserção supera a ordenação por intercalação?
Elaborando uma tabela com três colunas, n, tempo para o algoritmo por inserção e o tempo para o algoritmo por intercalação tem-se a tabela abaixo. O algoritmo por inserção tem menos etapas para n variando de 1 a 31, depois disso, ou seja, para n>26 o algoritmo por intercalação tem menos etapas. Foi utilizado lg = log na base 2.

n 8*n^2 64*n*ln(n)
1 8.00 0.00
2 32.00 88.72
3 72.00 210.93
4 128.00 354.89
5 200.00 515.02
6 288.00 688.04
7 392.00 871.77
8 512.00 1,064.67
9 648.00 1,265.60
10 800.00 1,473.65
11 968.00 1,688.12
12 1,152.00 1,908.41
13 1,352.00 2,134.04
14 1,568.00 2,364.60
15 1,800.00 2,599.73
16 2,048.00 2,839.13
17 2,312.00 3,082.54
18 2,592.00 3,329.71
19 2,888.00 3,580.44
20 3,200.00 3,834.54
21 3,528.00 4,091.84
22 3,872.00 4,352.19
23 4,232.00 4,615.45
24 4,608.00 4,881.49
25 5,000.00 5,150.20
26 5,408.00 5,421.47
27 5,832.00 5,695.21
28 6,272.00 5,971.31
29 6,728.00 6,249.70
30 7,200.00 6,530.30
31 7,688.00 6,813.03


1.2-3 Qual o menor valor de n tal que um algoritmo cujo tempo de execução é 100n^2 funciona mais rápido que um algoritmo cujo tempo de execução é 2^n na mesma máquina.
Elaborando uma tabela com três colunas, n, tempo para o algoritmo 1 e o tempo para o algoritmo 2 tem-se a tabela abaixo. O algoritmo 2 é melhor até n=14, a partir de n=15 o algoritmo 1 tem melhor desempenho.
n 100^n 2^n
0 0 1
1 100 2
10 10000 1024
14 19600 16384
15 22500 32768


https://meitcher.wordpress.com/2015/01/27/1-2-algoritmos-como-tecnologia/
http://clrs.skanev.com/

sexta-feira, 26 de junho de 2015

Replicação Postgresql utilizando SLONY (Instalação)

Necessitei trabalhar com replicação de banco de dados pensando em alta disponibilidade de acesso aos dados. O local onde o servidor de dados esta instalado não possui um no break. Tenho que fazer uma migração para outro local, porém como todos os sistemas acessam este banco de dados, não conseguia pensar em uma estratégia para esta migração.

A solução que implantamos faz o seguinte:

 
As minhas informações são gravadas no Banco 1. Todas as minhas aplicações estão apontando para o Banco 1. A estratégia adotada foi replicar o Banco 1 no site 1 para o Banco 2 no site 2. Tanto o banco como o ambiente do Site 2 são mais atualizados que do site 1.

Assim que as aplicações forem atualizados pode-se desligar o site 1 ou inverter a replicação.

Para replicação utilizei o Slony. A escolha do Slony aconteceu antes de entender todas as possibilidades de replicação que o Postgresql oferece.
Para instalação do Slony 2.2.4 em ambiente linux, segui a receita:

1) Baixar o Slony do site http://slony.info/downloads/, quando escrevi este post, a versão mais atualizada disponível era: slony1-2.2.4.tar.bz2.

2) Na pasta onde baixei o pacote, executei o comando:

            tar -vjxf slony1-2.2.4.tar.bz2

faz com que o pacote seja descompactado e cria uma pasta denominda: slony1-2.2.4

3) É necessário ter instalado um compilador C em sua máquina / servidor. No lugar se utilizar o configure.sh que vem na pasta slony1-2.2.4 utilize o configure.sh seguinte:


export PGMAIN=/DBA/postgresql/9.4.1

./configure \
    --prefix=$PGMAIN \
    --bindir=$PGMAIN/bin \
    --datadir=$PGMAIN/share \
    --libdir=$PGMAIN/lib \
    --with-pgconfigdir=$PGMAIN/bin \
    --with-pgbindir=$PGMAIN/bin \
    --with-pgincludedir=$PGMAIN/include \
    --with-pglibdir=$PGMAIN/lib \
    --with-pgsharedir=$PGMAIN/share


onde na variável PGMAIN deve ser inserida a pasta onde esta sua instalação do POSTGRESQL.

Execute do arquivo configure.sh.

Caso você receba a mensagem:

checking PostgreSQL for thread-safety... configure: error: PQisthreadsafe test failed - PostgreSQL needs to be compiled with --enable-thread-safety


Procure em sua máquina, a pasta onde esta instalado o arquivo: libpq-fe.h

find / -name libpq-fe.h
/usr/include/postgresql/libpq-fe.h

Coloque o resultado no arquivo configure.sh na variável with-pgincludedir

export PGMAIN=/DBA/postgresql/9.4.1

./configure \
    --prefix=$PGMAIN \
    --bindir=$PGMAIN/bin \
    --datadir=$PGMAIN/share \
    --libdir=$PGMAIN/lib \
    --with-pgconfigdir=$PGMAIN/bin \
    --with-pgbindir=$PGMAIN/bin \
    --with-pgincludedir=/usr/include/postgresql \
    --with-pglibdir=$PGMAIN/lib \
    --with-pgsharedir=$PGMAIN/share


Execute novamente o arquivo configure.sh

4) Em seguida execute os comandos:

make all

make install

5) Esta instalado o Slony em uma máquina.É necessário repetir procedimento para cada servidor de banco de dados.

6) Para entender como funciona o Slony utilizei o tutorial que encontrei no site:

http://slony.info/documentation/2.2/tutorial.html

Infelizmente tem alguns erros neste tutorial que podem ser resolvidos lendo os arquivos de LOG gerados.



quarta-feira, 20 de maio de 2015

GRANT POSTGRES


Problema: Configurar acesso a um usuário para fazer consultas em TABELAS no NOME_SCHEMA

Comando para garantir acesso ao NOME_SCHEMA

GRANT USAGE ON SCHEMA nome_schema TO usuario

Comando para dar autorização de CONSULTA ao NOME_SCHEMA

GRANT SELECT ON ALL TABLES IN SCHEMA nome_schema TO usuario;

segunda-feira, 20 de abril de 2015

Conselhos de um velho programador

Ache um emprego que te faça o mais feliz possível. Que te dê espaço para utilizar sua criatividade. Que te dê tempo para praticar e experimentar novas tecnologias. E que, principalmente, te cerque de pessoas como você. Pessoas que te inspiram, que te motivam e que reclamam de tudo e de todos. Uns totais insatisfeitos.
Ache um emprego no qual não seja tão difícil acordar de manhã (ou qualquer que seja o seu horário) e ir trabalhar.

Fonte:http://gizmodo.uol.com.br/conselhos-de-um-velho-programador-antissocial-e-ranzinza/

terça-feira, 31 de março de 2015

XML formatado

Necessitei criar um arquivo formatado:

select  '<doc>''||E'\n'
                '<field name="cd_email">'|| cd_email ||'</field>'||E'\n'||
                '<field name="ds_remetente_email">'|| ds_remetente_email ||'</field>'||E'\n'||
                '<field name="ds_destinatario_email">'|| ds_destinatario_email ||'</field>'||E'\n'||
                '<field name="ds_copia">'|| ds_copia ||'</field>'||E'\n'||
                '<field name="ds_assunto">'|| ds_assunto ||'</field>'||E'\n'||
                '<field name="ds_mensagem_txt">'|| strip_tags(ds_mensagem_txt) ||'</field>'||E'\n'||
                '<field name="dt_abertura">'|| dt_abertura ||'</field>'||E'\n'||
                '<field name="dt_envio">'|| dt_envio ||'</field>'||E'\n'||
                '<field name="dt_recebimento">'|| dt_recebimento ||'</field>'||E'\n'||
        '<doc>'||E'\n'||E'\n'FROM crm.tb_email;


A solução acima gera um trabalho muito grande para escrever a consulta.

Com a expressão abaixo tem-se:

select  'xmlelement(name field,  xmlattributes(''' || coluna  || ''' as name), ' ||coluna|| '),' from
(select  a.attname as coluna
from pg_catalog.pg_attribute a inner join pg_stat_user_tables c on a.attrelid = c.relid
WHERE a.attnum > 0
and NOT a.attisdropped
and c.relname = 'tb_email') as foo

o seguinte resultado:

 xmlelement(name field,  xmlattributes('cd_email' as name), cd_email),
 xmlelement(name field,  xmlattributes('cd_caixa_email' as name), cd_caixa_email),
 xmlelement(name field,  xmlattributes('cd_usuario_cadastro' as name), cd_usuario_cadastro),
 xmlelement(name field,  xmlattributes('cd_usuario_abertura' as name), cd_usuario_abertura),
 xmlelement(name field,  xmlattributes('cd_usuario_responsavel' as name), cd_usuario_responsavel),
 xmlelement(name field,  xmlattributes('cd_status_documento' as name), cd_status_documento),
 xmlelement(name field,  xmlattributes('cd_status_fluxo' as name), cd_status_fluxo),
 xmlelement(name field,  xmlattributes('ds_remetente_email' as name), ds_remetente_email),
 xmlelement(name field,  xmlattributes('ds_destinatario_email' as name), ds_destinatario_email),
 xmlelement(name field,  xmlattributes('ds_copia' as name), ds_copia),
 xmlelement(name field,  xmlattributes('ds_assunto' as name), ds_assunto),
 xmlelement(name field,  xmlattributes('ds_mensagem' as name), ds_mensagem),
 xmlelement(name field,  xmlattributes('nu_protocolo_email' as name), nu_protocolo_email),
 xmlelement(name field,  xmlattributes('ds_mensagem_txt' as name), ds_mensagem_txt),
 xmlelement(name field,  xmlattributes('ds_mensagem_srch' as name), ds_mensagem_srch),
 xmlelement(name field,  xmlattributes('dt_abertura' as name), dt_abertura),
 xmlelement(name field,  xmlattributes('dt_envio' as name), dt_envio),
 xmlelement(name field,  xmlattributes('dt_recebimento' as name), dt_recebimento),
 xmlelement(name field,  xmlattributes('dt_auditoria' as name), dt_auditoria),


com o resultado pode-se criar uma nova consulta

select '< doc >',
 xmlelement(name field,  xmlattributes('cd_email' as name), cd_email),
 xmlelement(name field,  xmlattributes('cd_caixa_email' as name), cd_caixa_email),
 xmlelement(name field,  xmlattributes('cd_usuario_cadastro' as name), cd_usuario_cadastro),
 xmlelement(name field,  xmlattributes('cd_usuario_abertura' as name), cd_usuario_abertura),
 xmlelement(name field,  xmlattributes('cd_usuario_responsavel' as name), cd_usuario_responsavel),
 xmlelement(name field,  xmlattributes('cd_status_documento' as name), cd_status_documento),
 xmlelement(name field,  xmlattributes('cd_status_fluxo' as name), cd_status_fluxo),
 xmlelement(name field,  xmlattributes('ds_remetente_email' as name), ds_remetente_email),
 xmlelement(name field,  xmlattributes('ds_destinatario_email' as name), ds_destinatario_email),
 xmlelement(name field,  xmlattributes('ds_copia' as name), ds_copia),
 xmlelement(name field,  xmlattributes('ds_assunto' as name), ds_assunto),
 xmlelement(name field,  xmlattributes('ds_mensagem' as name), ds_mensagem),
 xmlelement(name field,  xmlattributes('nu_protocolo_email' as name), nu_protocolo_email),
 xmlelement(name field,  xmlattributes('ds_mensagem_txt' as name), ds_mensagem_txt),
 xmlelement(name field,  xmlattributes('ds_mensagem_srch' as name), ds_mensagem_srch),
 xmlelement(name field,  xmlattributes('dt_abertura' as name), dt_abertura),
 xmlelement(name field,  xmlattributes('dt_envio' as name), dt_envio),
 xmlelement(name field,  xmlattributes('dt_recebimento' as name), dt_recebimento),
 xmlelement(name field,  xmlattributes('dt_auditoria' as name), dt_auditoria),
'< / doc >'
from crm.tb_email


quarta-feira, 25 de fevereiro de 2015

Alterar proprietário de todas as tabelas

Alterar o proprietário de tabelas do postgresql

select 'alter table ' ||relname || ' owner to novo_usuario;'
from pg_stat_user_tables
order by 1