Importando bancos de dados com o SPSS

Padrão

Apesar de trazer consigo ferramentas para realizarmos algumas alterações direto na fonte dos dados, o SPSS dificilmente será a melhor alternativa para preenchermos um banco com dados.

As maneiras de organizar inputs em um banco variam de acordo com o projeto e dependerão sempre de arbitrariedades do responsável pelo mesmo. A digitação poderá variar desde o preenchimento direto no banco, em uma interface como a do Excel, a formulários on-line via “PHP”. O que nos interessa, no entanto, é o formato em que esses dados serão armazenados.

O formato mais usual – e, portanto, o que a maioria dos programas e pacotes estatísticos lê sem problemas – de guardarmos nossas bases é o CSV (extensão “.csv”), ou, Comma Separated Values.

No CSV, a estrutura dos bancos será uma adaptação daquilo que explicamos anteriormente, ou seja, cada caso será dado em uma linha, e cada coluna será responsável por uma variável. Entretanto, por ser um formato extremamente simples, apenas com caracteres e tabulações, a representação é um pouco diferente: cada coluna será demarcada por uma vírgula (no padrão inglês, já no padrão português, o caractere de demarcação é o ponto e vírgula “;”). Assim, aquele banco do nosso exemplo seria guardado da seguinte maneira:

aplicacao,sexo,idade

Caso 1,Feminino,28

Caso 2,Masculino,27

Caso 3,Feminino,3

Muito bem, para os fins desse post, vamos utilizar esse modelo simples para aprender a importar dados gravados em CSV para nosso banco.

Abra o bloco de notas e escreva (ou copie e cole) exatamente o banco acima, nada além disso. O arquivo deverá ficar assim:

Agora salvamos o arquivo com a extensão “.CSV” e… Pronto! Temos nosso banco armazenado em um arquivo simples (e leve) de texto.

Próximo passo: para a importação!

No SPSS, o processo será bem simples: vamos em Arquivo > Abrir > Dados. Em “Arquivos do tipo”, selecionamos o formato “Texto”, dessa forma:

Abrir dados

Assim que clicamos em “Abrir”, o SPSS inicia o “Assistente de importação de texto” e a partir daí o processo é autoexplicativo. No primeiro passo, o programa perguntará se já temos um modelo de importação a ser seguido, em nosso caso, não temos, então clicamos em “Próximo”, apenas.

Em seguida, indicamos duas informações importantes para o processo: Nossas variáveis estão delimitadas ou têm largura fixa? Seus nomes estão incluídos na parte superior do arquivo?

No caso, as variáveis estarem “delimitadas” significa que existe um caractere que as separa, ou seja um caractere responsável por mostrar onde começa e acaba uma coluna, ao contrário de uma divisão específica, delimitada por um número de caracteres, como é o caso da “Largura fixa”. Como estamos utilizando o formato CSV, utilizamos a opção “Delimitado”.

Em nosso exemplo, também incluímos o cabeçalho na primeira linha do nosso banco, então marcaremos a opção correspondente.

Na tela seguinte, temos opção de utilizar um outro sistema de organização de banco, onde cada caso corresponderia a um número X de variáveis, mas nossa opção será a padrão de “Cada linha representa um caso”. Além disso, não faremos nenhuma amostragem do banco, portanto, optaremos por importar “Todos os casos”.

A seguir, selecionaremos a “Vírgula” como caractere delimitador. Notem que outros caracteres podem ser utilizados, em caso de o usuário trabalhar com um arquivo “txt” e ter utilizado outro caractere delimitador.

O próximo passo serve para fazermos customizações nas variáveis. No momento, isso não nos interessa, portanto: Próximo!

Está definido o formato do banco e nessa última tela é possível salvar essa importação para o caso de desejarmos repetir o processo outras vezes (naquela primeira etapa do assistente). Clicamos em “Concluir”.

Mais uma vez, temos o nosso banco pronto para ser trabalhado com o SPSS. Notem que na visualização de variáveis, o próprio programa analisou e definiu os tipos de variáveis adequados a partir dos nossos inputs no CSV. É claro que nem sempre o SPSS define o melhor formato possível e isso pode ser ajustado na etapa correspondente no assistente que acabamos de ver.

É isso! Banco pronto para ser modelado!

Dúvidas? Sugestões? Participem nos comentários!

Coautoria de Caique Theodoro.

A interface do SPSS: Data view, Variable View e Output

Padrão

Agora que já sabemos como funciona a estrutura de um banco de dados, vejamos alguns aspectos da interface de usuário do SPSS. Lembrando que, para os propósitos de nosso curso, utilizaremos apenas algumas das funções principais do programa.

Analisemos, primeiramente, a Data View:

Data view

A Data View é a seção responsável por exibir a base de dados, dando ao usuário liberdade de alterar os dados, como, por exemplo, para corrigir possíveis erros nas entradas, identificar anomalias nos valores, padronizar respostas digitadas, entre outros. Como vimos no post anterior, nas linhas desta seção encontraremos os casos, e, nas colunas, as variáveis da nossa estrutura de banco de dados.

A Variable View, por sua vez, tem uma função bem distinta da sua “vizinha”. Notem que, para cada coluna de variável na Data View, haverá uma linha correspondente na Variable View. Essas linhas servirão para definirmos as características das nossas variáveis:

Variable view

Para exemplificar, pensemos em uma hipótese em que definimos uma variável responsável por armazenar os nomes dos indivíduos, para cada caso, alguns aspectos que são relevantes serão:

  1. Name: o nome da variável, que não deverá conter acentos ou espaços, e não poderá começar com um número. Chamaremos a nossa de “nome”.
  2. Type: esse campo dirá que tipos de valores a variável carregará (numérico, texto, datas, etc.), no caso. No caso, utilizaremos o tipo “Sequência de caracteres” (String) com limite de 32 caracteres. Essa definição é bem importante, pois é nela em que o SPSS define a quantidade de memória que será alocada para carregar os valores do campo para o computador, e isso vai afetar no desempenho de nossos cálculos e frequências mais tarde.
  3. Label (rótulo): é onde damos um nome “bem descritivo” para a variável. Em nosso exemplo, usaremos “Nome da pessoa entrevistada”.

Assim, teremos a seguinte definição de variável:

Exemplo de variável com os nomes das pessoas entrevistadas

Aproveitando para ilustrar, vejamos alguns campos preenchidos na Data View, de acordo com nosso modelo:

Exemplo de preenchimento da nossa variável

Entre outras especificações, essas são as que mais nos interessam no momento, visto que existem ainda mais definições possíveis para as variáveis – como numéricas ordinais, escalares ou, ainda, nominais. No decorrer dos textos explicaremos novas especificações utilizadas assim que suas abordagens forem necessárias.

Por último, vejamos a janela de Output (Saída):

A janela de Output

Nesta janela – que fica, por definição, à parte das duas anteriores – teremos os resultados de nossas manipulações, ou seja, nossas tabelas e gráficos (finalmente, resultados!). Também será possível ver um log com os comandos que aplicamos na interface do programa.

Basicamente, tudo o que fizermos será registrado em SPSS Script, para o caso de precisarmos conferir algum procedimento, ou mesmo, para reaproveitar esse roteiro de manipulação, de modo a adaptar e repetir o processo “n” vezes, ao gosto do freguês.
Para os estudos de hoje, é isso. Agora os convidamos a testar as possibilidades de classificações, com quantas variáveis desejarem, para praticar essa que é uma parte importante da estrutura de um banco de dados.
Em caso de dúvidas, comentem!

Coautoria de Caique Theodoro.

A estrutura de um banco de dados no SPSS

Padrão

Para iniciarmos nossos estudos sobre manipulação de bases de dados e a transformação daquelas “saladas” (rs) de números em tabelas organizadas e informativas, precisaremos, antes de tudo, entender a estrutura de uma base de dados simples.

Quando uma pesquisa é feita, há o intuito de montar uma base de dados. O processo funciona da seguinte maneira: as respostas obtidas com as perguntas que nos interessam são armazenados em uma estrutura parecida com uma grande tabela.

Cada pergunta feita corresponderá a uma variável (ex.: nome do entrevistado, idade, sexo, etc.), e cada resposta (entrada) obtida na aplicação do questionário será guardada em sua variável. Todas as variáveis estarão dispostas nas colunas de nosso banco e cada variável terá sua própria coluna.

Além disso, cada linha de nosso banco representará um caso, que é a aplicação em si, esteja ela representando uma pessoa, um domicílio, uma propriedade e outros elementos, que podem (e devem!) variar de acordo com o objetivo da pesquisa.

Lembrando que apesar de ter, inevitavelmente, utilizado o exemplo de uma aplicação de questionário, podemos aplicar o conceito para todo tipo de sistematização de informações (como um hospital registrando informações de seus pacientes, ou uma escola de seus alunos).

Para esclarecer, vejamos um singelo modelo de estrutura de banco de dados a seguir:

AplicaçãoSexoIdade
Caso 1Feminino28
Caso 2Masculino27
Caso 3Feminino3

Como vocês devem ter imaginado, a partir desse modelo, podemos pensar em infinitas maneiras de organizar nossos valiosos dados.

Aproveitando para ilustrar, no SPSS, a linha de cabeçalho é dedicada aos nomes das variáveis e, logo abaixo, começa a contagem dos casos, a partir do número 1. Vejam como ficaria nosso banco modelo no SPSS:

Modelo simplificado de banco de dados

Notem que o SPSS não aceita acentos e espaços nos nomes das variáveis, por isso a adoção dessas nomenclaturas “simplificadas”. Seguindo essa estrutura, podemos associar “n” casos a uma mesma variável, e vice-versa, ou seja, cada caso conterá os mais diferentes tipos de informações, de acordo com nossas especificidades.

Essa forma de disposição de dados é amplamente utilizada em análises estatísticas e é através dela que podemos chegar a tabelas com populações por sexo, pirâmides etárias e muitas outras representações interessantes.

Por fim, vale frisar que todas as classificações e definições de propriedades das variáveis serão controladas a partir da aba “Variable View”, mas isso já é um assunto para nosso próximo post…

Não se esqueçam de participar nos comentários!

Até a próxima!

Coautoria de Caique Theodoro

florencerodrigues.com.br

Padrão

Olá amigos!

Hoje quero apenas compartilhar mais um job que acabo de lançar em parceria com meu grande amigo Tiago Penha, o portfólio da Florence Rodrigues, Cientista Social e documentarista, com um olhar holístico registra diferentes perspectivas de universos culturais, mentais e geográficos.

Por lá, você irá encontrar pesquisas realizadas nos segmentos de Branded Content, Socioambiental e Acadêmico.

Vale a pena conferir: http://florencerodrigues.com.br

Mais um job realizado com Django e Wagtail.

Manipulação de dados com SPSS

Padrão

Já parou pra se perguntar como aquelas pesquisas com entrevistadores e seus questionários interagindo com o público se transformam em estatísticas, tabelas e gráficos capazes de “ilustrar” aquele ambiente? O que acontece entre essas etapas? Como são armazenadas as informações destas pesquisas e como elas são visualizadas depois? Ou, até mesmo, como estatísticas de educação, saúde, economia ou segurança pública ficam armazenadas e são facilmente calculadas em diferentes momentos?

Para responder a estas (e outras) questões, nós vamos, em uma série de posts, explicar o processo de manipulação de bases de dados estatísticos, desde a imputação desses números em um banco de dados, até as extrações de frequências, contagens e cruzamentos de condições impostas pelos estatísticos e analistas afim de obter retratos representativos daquelas populações ou amostras que serão estudadas.

Existem diversos programas, linguagens e pacotes estatísticos capazes de trabalhar com essas bases de dados, cada um com seus prós e contras, alguns poucos exemplos são: STATA, Python, SPSS, R, EViews, SAS e até mesmo o próprio Excel. Para nossos estudos, utilizaremos o SPSS: Statistical Package for the Social Sciences – software atualmente distribuído e desenvolvido pela IBM – dada a sua interface amigável com o usuário.

Ainda, cabe lembrar que, apesar de o SPSS ser um software pago, existe uma espécie de versão Open Source dele, o PSPP, cujas funcionalidades se baseiam totalmente no software da IBM, com algumas reduções de recursos e funções. O projeto disponibiliza em seu site o download gratuito do PSPP.

A estrutura das postagens será:
1. A estrutura de bancos de dados
2. A interface do SPSS (Data view, Variable view e Output)
3. Importar bancos de dados com o SPSS
4. Frequências Simples
5. Frequências Compostas (crosstabs)
6. Calcular novas variáveis
7. Recodificar variáveis
8. Criar faixas de valores
9. Respostas múltiplas
10. Peso amostral
11. As vantagens de trabalhar com microdados

Deixaremos espaços para o caso de ajustes no “script” de tópicos, caso percebamos que um ou outro assunto pode ser desenvolvido mais profundamente.

Como o processo de análise de dados é todo relativo e adaptável ao gosto do usuário (o que significa que normalmente haverá mais de uma maneira de chegar ao mesmo resultado), quem se interessar, será muito bem-vindo na sessão de comentários para discutirmos metodologias e ferramentas do programa.

Então, até breve!

Coautoria de Caique Theodoro

Recuperando atributos específicos de uma página no Wagtail

Padrão

No último post de 2015 rasguei elogios ao novo gerenciador de conteúdo desenvolvido em Django, o Wagtail, o qual venho usando para desenvolver alguns projetos.

Nesse contexto,  hoje falarei sobre como recuperar atributos específicos de uma classe que você tenha definido para uma determinada página.

Tomando como exemplo o respectivo modelo abaixo, veja que definiremos alguns novos itens para nossa página:

01
class JobPageCarouselItem(Orderable, CarouselItem):
02
    page = ParentalKey('home.JobPage', related_name='carousel_items')
03
 
04
class JobPageRelatedLink(Orderable, RelatedLink):
05
    page = ParentalKey('home.JobPage', related_name='related_links')
06
 
07
class JobPage(Page):
08
    intro = RichTextField(blank=True)
09
    subline = models.CharField(max_length=255, blank=True)
10
    body = RichTextField(blank=True)
11
    vimeo = models.CharField(max_length=255, blank=True)
12
    feed_image = models.ForeignKey(
13
        'wagtailimages.Image',
14
        null=True,
15
        blank=True,
16
        on_delete=models.SET_NULL,
17
        related_name='+'
18
    )
19
 
20
    search_fields = Page.search_fields + (
21
        index.SearchField('intro'),
22
        index.SearchField('body'),
23
    )
24
 
25
    class Meta:
26
        verbose_name = u"Job (page)"
27
 
28
JobPage.content_panels = [
29
    FieldPanel('title', classname="full title"),
30
    FieldPanel('subline', classname="full"),
31
    FieldPanel('intro', classname="full"),
32
    FieldPanel('vimeo', classname="full"),
33
    InlinePanel('carousel_items'),
34
    FieldPanel('body', classname="full"),
35
]
36
 
37
JobPage.promote_panels = Page.promote_panels + [
38
    ImageChooserPanel('feed_image'),
39
]

Repare que criamos alguns atributos complementares, como: “subline”, “intro” e “vimeo”.

Normalmente, uma operação padrão do Wagtail que recupera um queryset de páginas – como calling.get_children() – irá devolvê-los como instâncias da classe Page, que incluem apenas os dados da página essenciais, tais como título.

Desse modo, ao criar nosso filtro padrão ilustrado

01
@register.inclusion_tag(
02
    'home/tags/jobs_index_listing.html',
03
    takes_context=True
04
)
05
def jobs_index_listing(context, calling_page):
06
    pages = calling_page.get_children().live()
07
    return {
08
        'pages': pages,
09
        'request': context['request'],
10
    }

O método specific() permitirá que os atributos definidos na classe JobPage sejam disponibilizados para o contexto utilizando um número mínimo de consultas:

01
@register.inclusion_tag(
02
    'home/tags/jobs_index_listing.html',
03
    takes_context=True
04
)
05
def jobs_index_listing(context, calling_page):
06
    pages = calling_page.get_children().specific().live()
07
    return {
08
        'pages': pages,
09
        'request': context['request'],
10
    }

Espero que lhe seja útil, grande abraço!

Criando ambientes Python com virtualenvwrapper no Ubuntu

Padrão


Olá amigos,

Hoje falarei sobre como garantir que a criação de ambientes funcione sem problemas.

O virtualenvwrapper deve ser instalado na mesma área global site-packages onde virtualenv está instalado e, para isso você precisará privilégios administrativos para fazer isso. Para tal tarefa, usaremos o pip:

1
sudo pip install virtualenv
2
sudo pip install virtualenvwrapper

Pode-se usar também somente o seguinte comando e as dependências serão instaladas:

1
sudo pip install virtualenvwrapper

É importante frisar que seja usado o comando sudo para realizar a instalação.

Para certificar-se que a instalação deu certo, rode o comando:

1
which virtualenvwrapper.sh

O resultado deve ser o seguinte:

1
/usr/local/bin/virtualenvwrapper.sh

Depois de garantir que está tudo certo, vamos criar um diretório para salvar os ambientes.

1
mkdir ~/.envs

Para simplificar ainda mais as coisas, deixemos acessível os scripts de inicialização.

1
vim ~/.bashrc

No final do arquivo, insira as respectivas linhas:

1
export WORKON_HOME=$HOME/.envs
2
export PROJECT_HOME=$HOME/projects/python
3
export VIRTUALENVWRAPPER_SCRIPT=/usr/local/bin/virtualenvwrapper.sh
4
source /usr/local/bin/virtualenvwrapper_lazy.sh

Espero que lhe seja útil, grande abraço!

Criar usuários e banco de dados PostgreSQL no Ubuntu

Padrão

Olá amigos,

Mostrarei de maneira simples como instalar o PostgreSQL e também configurar as bases de dados e seus respectivos usuários.

Primeiramente, faremos a atualização do sistema para garantir que instalemos a versão vai recente:

1
sudo apt-get update
2
sudo apt-get upgrade

Em seguida, instalamos o PostgreSQL:

1
sudo apt-get install postgresql postgresql-contrib

Para os não tão familiarizados com o psql, abaixo uma maneira interativa e simples de criar usuários.

01
vinicius@salsotto:~$
02
sudo su - postgres
03
postgres@salsotto:~$ createuser --interactive -P
04
Enter name of role to add: username
05
Enter password for new role:
06
Enter it again:
07
Shall the new role be a superuser? (y/n)
08
Shall the new role be allowed to create databases? (y/n)
09
Shall the new role be allowed to create more new roles? (y/n)
10
postgres@salsotto:~$

Para finalizar, vamos criar uma base de dados e vincular o usuário criado

1
postgres@salsotto:~$ createdb --owner database_name username
2
postgres@salsotto:~$ logout
3
vinicius@salsotto:~$

Grande abraço!

Wagtail CMS – Gerenciador de conteúdo em Django

Padrão

Já faz algum tempo eu deixei de usar somente o Django para construir gerenciadores de conteúdo e comecei usar o Wagtail CMS. No entanto, apesar da paixão a primeira vista, foi um processo evolutivo pois sempre fui muito reticente com outras soluções que experimentei nos primórdios de soluções do gênero como o Django CMS e o Mezzanine. Vale frisar que não posso avaliá-los hoje em dia pois nunca mais testei, mas confesso que tenho uma caída pelo Django CMS.

Bem, recomendo que desbrave o demo no Github e tire suas próprias conclusões.

Cron Jobs: agendamento de scripts Python

Padrão

Diferentemente de como falei anteriormente sobre como criar rotinas de backups no Linux, hoje vou mostrar como contornar um pequeno detalhe na criação de rotinas em Python.

Para fins de exemplo, utilizarei o script postado ontem no blog: enviando e-mails unicode (utf-8) com Python.

Após quebrar a cabeça por algumas horas para tentar desvendar o que havia de errado no script de envio de e-mails e também nos paramêtros de dias e horas do crontab, cheguei ao diagnóstico de que seria necessário especificar que o caminho completo do Python instalado em sua máquina, vejam a solução:

Crie um arquivo “.sh” – no nosso caso chamaremos de alertas.sh – e defina o caminho para seu script Python, assim como o caminho de instalação:

1
# errado
2
python /home/salsotto/email.py
3
 
4
# correto
5
/usr/bin/python /home/salsotto/email.py

Em seguida acesse o crontab para agendar sua tarefa:

1
crontab -e

Agora, parametrize os dias e horário de envio:

1
30 08 * * 1-5 sh /home/salsotto/alertas.sh

Lembre-se, não deixe de definir o caminho de instalalção do Python, sem isso não vai funcionar.

Enviando e-mails unicode (utf-8) com Python

Padrão

Deixo aqui um pequeno exemplo de como enviar e-mails em formato unicode utilizando Python.

01
# -*- coding: utf-8 -*-
02
 
03
# python imports
04
import time
05
import smtplib
06
from datetime import date
07
from email.mime.multipart import MIMEMultipart
08
from email.mime.text import MIMEText
09
from email.header import Header
10
 
11
today = date.today()
12
 
13
s = smtplib.SMTP('smtp.dominio.com.br', 587)
14
 
15
s.login('remetente@dominio.com.br', 'S3nh4')
16
 
17
me = 'Nome<rementente@dominio.com.br>'
18
to = 'destinatario@dominio.com.br'
19
 
20
msg = MIMEMultipart('alternative')
21
msg.set_charset('utf8')
22
msg['Subject'] = "Lembrete diário - %s/%s/%s" % (today.day, today.month, today.year)
23
msg['From'] = me
24
msg['To'] = to
25
 
26
text = "Escreva aqui a sua mensagem com acentuação"
27
html = """Escreva aqui a sua mensagem com acentuação"""
28
 
29
part1 = MIMEText(text, 'plain')
30
part2 = MIMEText(html, 'html', 'utf-8')
31
 
32
msg.attach(part1)
33
msg.attach(part2)
34
 
35
s.sendmail(me, to, msg.as_string())
36
s.quit()

 

Seleção de dados por mês e ano no MySQL

Padrão

O MySQL possui funções interessantes para se trabalhar com bases históricas de dados, essas quais permitem extrair em uso conjunto ou não listagens filtradas pelo período.

As funções MONTH() e YEAR() são excelentes para pegar períodos  determinados somente pelo mês e o ano. Uma função similar que já citei em uma postagem de 2010 “Uso similar do operador ‘between’ do MySQL no Django” permite selecionar períodos exatos entre datas em sua forma completa.

Com a função abaixo pegarei todos os registros no mês de maio desde o seu primeiro registro:

1
SELECT * FROM cesta WHERE MONTH(data) = 05;

Já com o respectivo exemplo abaixo pegarei todo os registros de maio em 2012

1
SELECT * FROM cesta WHERE MONTH(data) = 05 AND YEAR(data) = 2012;

Espero que lhe seja útil!

Armazenar valores numéricos no MySQL

Padrão

Armazenar dados numéricos no MySQL é uma tafera simples e muito útil para quem necessita da exatidão dos valores, tal como percentuais, valores monetários e cálculos matemáticos avançados.
Mostrarei rapidamente como configurar os campos trabalhar com esses campos, no caso, mais especificamente com valores monetários.

1
ALTER TABLE 'pagamento' ADD 'valor' DECIMAL( 5, 2 )

No exemplo acima o 5 é o número de dígitos e 2 o número de casas decimais.

Espero que lhe seja útil!

 

 

 

Operador ternário em Python

Padrão

Em uma força tarefa de final de ano em ajuda a um colega estudante de Ciência da Computação, ajudei ele resolver uma série exercícios de programação em Python. Um deles postado ontem, Troca de valores entre variáveis em Python.

Hoje mostrarei a utilização dos operadores ternários em Python. Eis a solução:

1
# definicao da carro
2
carro = 'celta'
3
 
4
# exibe o nome do carro
5
print 'Fiat' if carro is not 'celta' else 'Chevrolet'

 

Espero que lhe seja útil!

Troca de valores entre variáveis em Python

Padrão

Recentemente ajudei um colega a resolver um exercício de sua graduação,  esse qual tem o desafio de trocar valores entre duas variáveis sem fazer o uso de uma terceira.

01
# definicao da variavel x
02
x=99
03
 
04
# definicao da variavel y
05
y=1000
06
 
07
# exibe os valores das variaveis
08
print 'x:%s - y:%s' %(x,y)
09
 
10
# troca dos valores entre as variaveis x e y
11
x, y = y, x
12
 
13
# exibe os valores das variaveis apos a troca de valores
14
print 'x:%s - y:%s' %(x,y)

Sei que é um post simplório para alguns leitores, no entanto, pode vir ajudar alguém.

Espero que lhe seja útil!

As fixtures no Django e as suas praticidades

Padrão

As fixtures do Django possuem o propósito principal de prover de maneira rápida e prática dados iniciais a um projeto. No entanto, geralmente faz se o uso das fixtures a partir de uma base de dados já existente, seja ela de produção ou desenvolvimento.

Uma fixture criada em produção provavelmente será usada para backup, e posteriomente usada para replicar a massa de dados em ambiente de desenvolvimento. Já o contrário acontece quando o projeto irá para produção e precisa de algumas configurações pré-definidas quando for para o ar.

Para contextualizar melhor a utilização das fixtures, abaixo listo alguns exemplos de como gerá-las:

Dump de todos os models do projeto

1
python manage.py dumpdata --indent=4 > site.json

Dump de todos os models de uma app

1
python manage.py dumpdata app --indent=4 > app.json

Dump de apenas um model de uma app

1
python manage.py dumpdata app.model --indent=4 > model.json

Para fazer o insert dos dados faça o seguinte comando com a base que deseja, veja exemplo:

1
python manage.py loaddata site.json

É importante que você não se esqueça que é necessário que as tabelas já estejam criadas antes de rodar esse comando para inserir o conteúdo.

Converter campo text para um select com jQuery

Padrão

Recentemente precisei transformar um campo text input para um select input mediante a seleção de campo radio button, no qual ao selecionar a ‘opção X‘ abriria um campo text e selecionando a ‘opção Y‘ abriria o mesmo campo em caixa de seleção.

Para resolver isso, achei a seguinte solução:

1
$("#school").replaceWith('<select id="school" name="school">' +
2
    '<option value="1">School 1</option>' +
3
    '<option value="2">School 2</option>' +
4
    '<option value="3">School 3</option>' +
5
'</select>');

Dessa maneira pude salvar no mesmo campo informações que podiam ser cadastradas em texto livre ou opções disponibilizadas para seleção.

Espero que lhe seja útil!

Reverter alterações no Git

Padrão

O Git possui uma funcionalidade para reverter commits feitos localmente utilizando o comando reset, o qual possui dois propósitos:

– Desfazer um commit mantendo as alterações realizadas no código
– Desfazer um commit completamente incluindo as alterações (volta ao estado da última versão)

A seguir os respectivos exemplos de utilização:

Uso do “–soft” para desfazer o commit e manter as alterações

1
git reset --soft HEAD~1

Uso do “–hard” para desfazer todas as alterações

1
git reset --hard HEAD~1

O uso da opção “–soft” vejo ganhos para momentos onde você deseja adicionar ou remover algum arquivo, alterar trechos de código. Já a opção “–hard” é para aqueles momentos onde você fez uma tremenda cagada e deseja voltar do zero.

Espero que lhe seja útil! ;)

Acompanhar ocorrências de log no Linux

Padrão

É de fato necessário algumas vezes fazer o acompanhamento das ocorrências do log de seu sistema em tempo real, principalmente quando se trata da versão em produção (quando escapa um errinho aqui e ali). Para isso mostrarei de forma prática como fazer a verificação no arquivo de log do seu sistema usando o comando less (permite fazer a paginação de arquivos ou da entrada padrão).

1
less production.log

Depois de aberto o arquivo basta teclar:

1
shift + F

Dessa maneira você poderá acompanhar tudo que está ocorrendo (logs) em seu sistema no momento e identificar o causador do problema.

Criar alias ssh no Ubuntu

Padrão

Acredito que grande parte dos leitores que estão lendo essa publicação conhecem as inúmeras vantagens que o poderoso ssh fornece para os desenvolvedores, se não conhece deveria conhecer!

Para efeito de evidenciamento, imagine um cenário no qual você toma conta de 6 servidores distintos, os quais é necessário o acesso quase que diariamente para fazer algum deploy ou alguma manutenção. Diante disso, mostrarei um pequeno trâmite para agilizar o processo de conexão e poupar seu tempo e memória.

Um uso comum do ssh se daria da seguinte maneira:

1
ssh usuario@186.305.245.22

Agora imagine você se lembrar de mais seis IP’s ou domínios, é um bom trabalho para exercitar a memória, porém totalmente desncessário. Para isso, você pode criar um alias e ser muito mais prático!

Para criar um alias, primeiramente acesse o diretório do ssh:

1
cd ~/ssh/

Crie ou edite (caso já exista) o arquivo config com o seu editor de texto que tem preferência, no meu caso o Vim:

1
vim config

Na edição do arquivo, coloque os dados de seu servidor:

1
Host servidor_1
2
HostName 186.305.245.22
3
User usuario

Salve e feche o arquivo. Agora já podemos usar nosso alias para se conectar ao servidor:

1
ssh servidor_1

Ele lhe pedirá a senha e pronto! As próximas cconexões não serão mais um parto para você se lembrar, a menos que queira.

Espero que lhe seja útil! ;)

Instalar versão específica de uma Gem

Padrão

Como já faz algum tempo que não publico nada por aqui, venho em uma tentativa de retomar as publicações semanais começando por este post. Hoje, a proposta é mostrar como instalar versões específicas de uma Gem, tomando como exemplo a instalação do Rails.

Abaixo segue o exemplo para instalar o Rails na versão 2.3.14

1
sudo gem install rails -v=2.3.14

Espero que lhe seja útil! ;)

Planejamento e execução de requisitos com Scrum

Padrão

Tem sido muito comum nas formalizações de contratos de desenvolvimento de software, tanto como CONTRATANTE e CONTRATADA, adicionar um documento de apoio explicando como o método ágil será aplicado para gerenciamento de projetos . Em um artigo do ano passado, Priorização de requisitos de software, ressaltei alguns pontos que julgo serem fundamentais para fazer a priorização dos requisitos, e que fazem relação para cada Sprint desse documento.

É importante ressaltar que esse documento é uma tentativa pragmática de explicar como será tocado o Projeto para os envolvidos que não possuem tanta afinidade com tecnologia e metodologias.

Baixe o modelo: Planejamento e execução de requisitos com Scrum

Migrations no Rails 2

Padrão

O Rails, assim como o Django, conta com um poderoso recurso chamado Migrations (migrações). As migrações são uma forma conveniente para alterar o banco de dados de maneira estruturada e organizada de projetos,  principalmente daqueles já em produção.

Primeiramente, é preciso definir o que você quer alterar na estrutura da tabela, ou seja, qual coluna você deseja adicionar, remover ou definir algum padrão ou obrigatoriedade. Sendo assim, no Rails 2, usa-se o seguinte comando para gerar o arquivo de migração:

1
ruby script/generate migration AddColorToCar color:string

O código acima adiciona a coluna Color na tabela Car, onde a coluna color é definida como string. O arquivo será gerado dentro do diretório “db” do seu projeto com um identificador timestamp no início do nome do arquivo. Uma vez gerado o arquivo, basta efetuar o respectivo trecho para gerar a migração da estrutura da tabela:

1
rake db:migrate

Espero, que você faça tudo primeiramente em versão de desenvolvimento, levando-se em conta a qualidade do que está sendo feito e a garantia do que será irá para a versão em produção e obviamente utilize um controlador de vesão de código distribuído, como o Git ou Mercurial.

Com os devidos testes realizados e a homolagação feita, no servidor de produção basta apenas você atualizar para última versão (não se esqueça de adicionar o arquivo da migração no repositório). Em produção não é necessário criar rodar o primeiro comando, pois o arquivo já está no servidor devido a atualização do repositório, bastando apenas rodar novamente o comando:

1
rake db:migrate

Ops! Provavelmente você se esbarrou com a mensagem “rake aborted! development database is not configured“. Se isso aconteceu, rode o seguinte comando:

1
rake db:migrate RAILS_ENV=production

Isso acontece porque o Rails mitiga o risco de você acidentalmente fazer uma migração indesejada no sistema em produção, sendo necessário explicitar o ambiente que deseja rodar a migração, pois caso contrário será interpretado que deve ser gerado a migração no ambiente de desenvolvimento.

Espero que lhe seja útil!

Criando rotinas de backups no Linux

Padrão

Todo desenvolvedor sabe a importância de fazer backups diários do sistema em produção, ou pelo menos deveria saber, principalmente quando se trata de sistemas em produção.

Uma rotina de backups, seja ela de banco de dados ou de arquivos é imprescindível para a continuidade de um projeto com total segurança. Vale ressaltar que a mitigação desse tipo de problema, por muitas vezes é lembrado apenas quando tudo foi pro vinagre e você por infelicidade não tinha backup algum.

Estou me alongando nessa explanação, para que você tome ciência do quanto é fundamental criar rotinas de backups, de preferência diários e que não dependa de um trabalho braçal e de memória ser feito todo santo dia. Com esse cenário exposto, mostrarei rapidamente como criar tais rotinas em servidores Linux, para banco de dados MySQL e diretórios de arquivos (imagens, vídeos, documentos e etc).

Em primeiro momento, mostro as respectivas linhas de comandos que são usados para fazer um dump de uma base e um arquivo compactado com todos os diretórios e arquivos pertinentes a eles. Eis os comados:

Gera o dump do banco de dados com o nome da data em que foi gerado:

1
mysqldump -u usuario -psenha --opt banco > /home/salsotto/backups/database/`date +\%Y\%m\%d`.sql

Gera um arquivo compactado com o nome da data em que foi gerado de um diretório e todos os subdiretórios (e arquivos)

1
tar -c -z --recursion -p --file=/home/salsotto/backups/files/`date +\%Y\%m\%d`.tar.gz /applications

Depois de ter testado e validado os comandos, chegou a hora de fazer com que esses comandos se tornem scripts a serem executados diariamente, com os fantásticos cronjobs do Linux. Para isso, copie e cole os comandos validados em um arquivo e salve com a extensão .sh (arquivos executáveis), por exemplo, crie um diretório scripts em sua área e salve os respectivos arquivos database.sh e files.sh lá.

Para se criar as rotinas, no terminar digite o seguinte comando “crontab -e” para gerenciar as rotinas (você precisará de um editor como vim, nano e etc). Com o arquivo aberto, mostro alguns exemplos de configuração das crons:

1
# roda todos os dias as 23h59
2
59 23 * * * /home/salsotto/scripts/database.sh
3
 
4
# roda as 22h10 de segunda e sexta
5
10 22 * * 1,5 /home/salsotto/scripts/files.sh
6
 
7
# roda todos dia a cada duas horas
8
0 */6 * * * /home/salsotto/scripts/database.sh
9

Depois só resta salvar!