PostgreSQL Database Modeler ou pgModeler é uma ferramenta open source para modelagem de banco de dados a qual mescla conceitos clássicos de diagramas entidade-relacionamento com as funcionalidade específicas do PostgreSQL.
O pgModeler traduz os modelos criados para código SQL (versão 8.0 a 9.1). Implementado sobre framework Qt, o pgModeler pode ser usado em ambientes Linux, Windows e Mac.
Ajude a melhorar este projeto 100% brasileiro! Visite a página oficial e veja como colaborar: http://pgmodeler.com.br
Rafael Bernard Rodrigues Araújo
Shared posts
pgModeler: Ferramenta de Modelagem de Open source
Mas, e Mateus 18?
Escolher com quem você vai casar é importante (RVD)
Meu marido e eu estávamos certa vez com um grupo de jovens. Havia três deles sentados em frente a nós durante uma refeição: dois meninos e uma menina. Um cara era um nerd com óculos. O outro era um estudante de faculdade com o cabelo um pouco menos moderno e sem óculos. A menina estava, obviamente, com este. Mas, enquanto o nerd estava ocupado servindo a todos no refeitório, raspando os pratos e o lixo, o estudante universitário ficou bravo com a menina por causa de um pequeno acidente e derramou suco vermelho sobre a jaqueta de couro e a camisa branca dela. Ela pegou o cara errado, mas o suco não pareceu fazê-la mudar de ideia. É bom que ela tenha algum temor da relação continuar e, especialmente, de terminar em casamento.
Então, meninas cristãs jovens e solteiras, ouçam: escolher com quem você vai casar é importante. Você pode pensar que a forma como ele trata você hoje não é tão ruim. Mas não vai ficar melhor depois do casamento. Você pode pensar que ele vai mudar. É possível, mas a maioria dos homens não muda. Você pode pensar que será capaz de ministrar a ele e de ajudá-lo. Possivelmente, mas, se você não pode agora, não vai conseguir depois, e vai se colocar em risco. Um marido deve liderar e cuidar de você, não depender de seu conselho sobre questões básicas de personalidade ou de comportamento.
A menos que alguém casado seja muito franco com você, você não conseguirá entender o quanto o marido vai ter impacto sobre todos os aspectos de sua vida. Depois da salvação, não há outro evento de longo prazo que vá mudar tantas áreas de sua vida tão profundamente. Aqui estão apenas algumas das maneiras como o casamento afetará sua vida.
1. Ele terá impacto sobre você espiritualmente. Se o cara não é cristão, pare agora mesmo. Você não pode colocar sob o mesmo jugo uma alma redimida e uma não regenerada, mesmo que ele pareça estar aberto a mudanças. Cristo comprou você com um preço, e não é uma opção trair aquele sangue dando o coração a alguém que não conhece e ama seu Senhor. Se o fizer, isso vai paralisar seu desenvolvimento espiritual, abrir uma série de tentações, reprimir sua vida de oração, tornar difícil o congregar-se e causar enorme conflito parental, se vocês tiverem filhos.
Se o cara é crente, ele é um crente forte? Será que ele vai liderá-la em oração, leitura da Bíblia, culto familiar e público? Ou você terá de se virar sozinha? Será que ele vai fazer do crescimento espiritual uma prioridade ou deixar que outras coisas venham em primeiro lugar? Será que ele vai lhe perguntar como vai sua alma a fim de ajudá-la a crescer em santidade e amor a Cristo ou vai deixar isso para seu pastor? Será que ele vai conduzir as crianças nesse aspecto ou você é quem vai ter de encabeçar isso? Na reunião da igreja, ele vai ajudar as crianças a sentarem-se direitinho, a orar, a encontrar o hino, ou você vai ser a pessoa que vai chamar a atenção para o que está acontecendo ao lado dele e ajudar a família a manter-se unida? Muitas mulheres casaram com homens espiritualmente imaturos, pensando que isso não era um grande problema ou que o homem mudaria, e elas estavam erradas. Hoje, elas carregam as cicatrizes.
A saúde de sua eternidade1 está em jogo. Pense cuidadosamente.
2. Ele terá impacto sobre você emocionalmente. Ele é o cara que você pensa que vai encorajá-la, amá-la, ser gentil com você e tentar compreendê-la ou será que ele vai querer sair com os amigos quando você estiver tendo uma noite difícil? Será que ele vai ouvir quando você estiver lutando com alguma coisa ou vai estar preocupado com o vídeo game? Será que ele vai ficar irritado quando você chorar ou ele vai lhe trazer lenço de papel e lhe dar um abraço? Será que ele vai entender que você, provavelmente, é mais terna do que ele, mais sensível a questões e comentários, ou ele é sempre sendo rude com seus sentimentos? Uma mulher estava lutando para amamentar seu bebê, acreditando que isso era o melhor para ela, mas era muito difícil. Em vez de dar apoio e encorajar, o marido fazia sons de mugido quando via a esposa envolvida nisso. Nós temos de nos livrar do complexo de princesa, mas temos necessidades emocionais. Qualquer cara que é indiferente a seus sentimentos e sua autoestima é egoísta e deve ser deixado sozinho.
Tenha cuidado: um marido pode prejudicar ou favorecer a saúde emocional.
3. Ele terá impacto sobre você fisicamente. Ele é o cara que vai suprir suas necessidades básicas? Ele vai ser capaz de abrigar, vestir e alimentar você? Em certo momento de nosso casamento, eu estava preocupada, pois não havia oportunidade de emprego. Meu marido me garantiu que ele trabalharia no McDonalds, cavaria valas, limparia cenas de atropelamento: o que fosse necessário para sustentar a família, independentemente de seus dons e treinamento. Esse é o tipo de atitude que você deseja. Um homem que não cuida da própria casa é pior do que o infiel (1Tm 5.8). Você pode ter de ajudar a aliviar o peso financeiro, mas, a menos que seu marido seja incapaz ou haja outra circunstância incomum, você não deveria ter de carregá-lo.
Esse homem irá cuidar de seu corpo ou abusar dele? Se ele lhe dá beliscões, pontapés, etc, quando estão namorando, fuja. É quase garantido que ele vai abusar de você depois do casamento, e as estatísticas mostram que isso será especialmente verdadeiro quando você estiver grávida. Será que ele vai cuidar e proteger seu corpo ou vai feri-lo? Há mulheres em igrejas por todo país que pensaram não ser nada demais soquinhos ou tapinhas (amigáveis) do namorado, e agora estão encobrindo os hematomas causados pelo marido.
Esse homem vai ser cuidadoso sexualmente com você? Será que ele vai honrar o leito conjugal com fidelidade física e mental a você ou vai flertar, alimentar seu vício em pornografia ou até mesmo deixá-la por outra mulher? Nem sempre é possível prever essas questões, mas, se as sementes ou práticas já estão lá, cuidado. Recentemente, vi um casal recém-casado cujo marido estava flertando abertamente com outra mulher. A menos que algo drástico aconteça, aquele casamento está indo para o desastre.
Será que ele vai ser suave e gentil com você na cama? Uma colega de trabalho descrente de minha irmã certa vez disse a ela que, depois de seu primeiro encontro sexual, ela teve dificuldade para andar por alguns dias porque seu namorado havia sido muito rude. Em outras palavras, ele não era altruísta o suficiente para cuidar do corpo da mulher a quem dizia amar.
Cuidado! Seu corpo precisa de cuidado e proteção.
4. Ele terá impacto sobre você mentalmente. O homem no qual você está pensando será uma fonte de preocupação ou vai ajudá-la a lidar com suas próprias preocupações? Ele vai incentivar seu desenvolvimento intelectual ou vai negligenciar isso? Ele vai valorizar suas opiniões e ouvir o que você está pensando ou vai ignorar seus pensamentos? Ele vai ajudá-la a cuidar das pressões de modo que sua mente não seja sobrecarregada ou vai deixar você lutar sozinha com esses problemas? Ele vai cuidar de você e ser gentil se você estiver enfrentando tensão mental ou vai ignorá-la? Eu sei de uma mulher que podia lidar fisicamente muito bem com a gravidez e o parto, mas a depressão pós-parto cobrou um alto preço em sua mente. O marido não deu atenção a isso e continuou a ter filhos, até que a esposa acabou em um sanatório.
Você pode pensar que o lado intelectual ou mental de um casamento é pequeno. É maior do que você pensa. Considere isso com seriedade.
5. Ele terá impacto sobre você relacionalmente. Como está seu relacionamento com sua mãe? E com seu pai? Você os ama? E seu namorado? Avance dez anos. Você diz a seu marido que sua mãe está vindo para o fim de semana. Ele fica animado? Desapontado? Com raiva? Faz piadas maldosas com os amigos? Claro, o marido deve vir em primeiro lugar em sua prioridade de relacionamentos, já que ambos deixaram pai e mãe e se uniram um ao outro. Mas os pais ainda são uma parte importante. Quaisquer que sejam os sentimentos negativos que ele tenha em relação a seus pais agora, provavelmente serão ampliados depois do casamento. O casamento irá ou fortalecer ou prejudicar – até mesmo destruir – seu relacionamento com seus pais. As pessoas que a conhecem melhor e mais a amam agora podem ser cortadas de sua vida por um marido que as odeia.
O mesmo ocorre com irmãs e amigas. Elas serão bem-vindas, em horários razoáveis, em sua casa? Será que o cara a quem você escolheu vai incentivá-la a ter relacionamentos saudáveis com outras mulheres ou vai ficar com ciúmes de amizades bíblicas normais? Ele vai ajudá-la a orientar mulheres mais jovens e a ser grata quando mulheres mais velhas a orientarem ou vai menosprezar isso?
Não sacrifique muitos bons relacionamentos por causa de um cara que não valoriza as pessoas que amam você.
Então, o que seu namorado fará depois de pronunciar os votos? Porque essa é apenas uma amostra das maneiras pelas quais um marido pode abençoar ou amaldiçoar a esposa. Os efeitos são de longo alcance, de longa duração, tanto os maravilhosos como os difíceis. É verdade que não há homens perfeitos lá fora. Mas há caras muito bons. E é melhor estar solteira a vida toda do que se casar com alguém que vai tornar sua vida um fardo. O celibato pode ser uma boa escolha. O casamento com a pessoa errada é um pesadelo. Eu estava no estacionamento de uma igreja em que o pastor teve de chamar a polícia para proteger uma mulher do marido que estava tentando impedi-la de adorar e de estar com a família. Foi muito feio.
Não esteja tão desesperada para casar a ponto de fazer de seu casamento uma tristeza. Se você está em um casamento infeliz, existem maneiras de obter ajuda. Mas, se não é casada, não se coloque nessa situação. Não se case com alguém cuja liderança você não pode seguir. Não se case com alguém que não busque amar você como Cristo amou a igreja. Case com alguém que conhece e demonstra o amor de Cristo.
_____
1A autora não parece crer que se pode perder a salvação. Assim, essa frase faz pensar que, pelo fato de ser casada com um homem que não a ajuda espiritualmente, a mulher deixará de experimentar muitos benefícios espirituais aqui, o que lhe dará uma herança eterna menos rica.
(Autor: RVD. Traduzido por Francisco Nunes de It Matters Whom You Marry. Original aqui. O texto pode ser usado e distribuído livremente, desde que não seja alterado, com a indicação de autoria, fonte e tradução. Proibido seu uso com fins comerciais.)
São 0,20 ou não são 0,20, afinal?
Um bocado de gente se mostrou decepcionada ontem com os dois líderes do Movimento Passe Livre que foram ao Roda Viva. Eles afirmaram categoricamente que o ato de ontem é pelos vinte centavos de aumento da passagem. E aí? Tinha uma multidão compartilhando no Facebook que não eram só vinte centavos, que estávamos protestando contra a repressão, a corrupção, as más condições de saúde e educação, os gastos exorbitantes com a Copa do Mundo e “tudo isso que a gente vê todo dia”. Afinal, são só vinte centavos?
Sim, são só vinte centavos
Você acha mesmo que, depois desse levante popular, todos os políticos eleitos do Brasil vão virar santos ou renunciar? Você acha que Haddad e Alckmin vão ceder suas cadeiras? Não, não vão. E você acha mesmo que cem mil pessoas vão sair às ruas para “acabar com a corrupção” até que a corrupção acabe? Digamos que seja uma marcha até que a corrupção acabe, a educação melhore e haja segurança, quando é que você vai se dar por satisfeito e sair das ruas? É claramente inviável que acampemos nas ruas até que haja escolas modelo para todas as crianças, que cada policial tenha salário digno, que cada bandido seja preso, que cada bairro tenha praças arborizadas com playgrounds e que tenhamos ônibus gratuito com ar condicionado para todos. Cada um de nós tem mais o que fazer do que acampar na rua. Não vai rolar.
E nem é bom que role mesmo. Não se constrói uma rede de escolas numa semana. Não há como resolver todos os problemas de São Paulo em um mês, nem em um ano. Você não ficar na rua tanto tempo gritando. Por isso, é bom que quando o povo saia para as ruas, haja uma proposta clara. A proposta, dessa vez, é apenas a revogação do aumento da passagem de ônibus. São sim, os vinte centavos. Se o Haddad e o Alckmin cederem os vinte centavos, podemos sair das ruas, por enquanto, só por enquanto.
Mas e o resto?
Vivemos uma crise de representatividade política. Boa parte da população sequer vota, mesmo o voto sendo obrigatório no Brasil. Outra parte tenta organizar protestos de voto nulo ou boicotes à eleição. Ninguém está orgulhoso dos políticos que elegeu e o cidadão que não desistiu tenta, nas eleições, escolher o “menos ruim”. Votar no segundo turno, então, é uma tristeza.
A gente escolhe um representante, e ele esquece que deveria nos representar. Parece que ele passa a achar que tem quatro anos para fazer o que quiser, e volta a falar com o povo só nas próximas eleições. Eles se encafurnam em seu palácios e gabinetes, e deixam de ouvir. Durante as eleições eles estão todo dia na rua, na televisão, no Facebook, no Twitter, nos fazendo acreditar que se importam conosco. Depois da eleição eles somem.
E a gente vive reclamando que ninguém faz nada, que ninguém se importa, que no Brasil é assim mesmo. Um dia como ontem (e como hoje) serve para mostrar quem é o patrão. O patrão é o povo. O governador e o prefeito são nossos empregados, e temos a obrigação de mandar neles. Hoje, a questão é sim sobre a passagem. Mas é também sobre quem é que manda. Se a passagem não abaixar, podemos continuar até abaixar, e podemos fazer mais. Então, cedo ou tarde, vai abaixar. E quando abaixar, teremos mostrado quem é que manda. Isso é que importa. É por isso que o governador pôs a polícia na rua semana passada para descer borracha na galera. Para mostrar quem é que manda.
Governante tem que respeitar o povo, tem que ter medo do povo. Você é o patrão.
E depois que a passagem abaixar?
Rosa Parks lutou por um assento, Gandhi caminhou 400km para produzir sal. Era só um assento. Era só sal. Mas era para mostrar quem manda. Uma vez que você mostrou quem manda, abriu a porta para que mais coisas mudem.
Tem gente perguntando “porque não protestam contra o mensalão, a PEC 37, os gastos com a Copa, etc.”? E tem gente dizendo que está justamente protestando contra essas coisas. A questão é conseguir agora a redução da tarifa, e voltar para casa, com o gosto da vitória, de ter mostrado quem manda. E sair na rua de novo cada vez que um governante sair da linha.
Vão votar a PEC 37. É uma vergonha. A redução da passagem vai mostrar quem manda, e aí você vai poder mandar de novo.
Governantes que ignoram o povo
Alguma coisa aconteceu do tempo dos caras pintadas para cá. Foi a internet. Os protestos foram organizados pela internet, e ganharam força lá. Qualquer ser humano hoje, que faça qualquer tipo de trabalho que envolva as pessoas, está na internet. O Facebook pode não ser o melhor lugar do mundo para o debate inteligente, mas o povo está lá. Nosso prefeito esteve ativamente interagindo com o povo no Facebook e Twitter (através de acessores, eu sei, e não importa). Durante a campanha. Depois, sumiu.
Por isso a frase do momento é “Fulano não me representa”.
É uma utopia muito grande, eu sei, mas eu imagino o prefeito, da França mesmo onde ele estava semana passada, convocando as pessoas na última quarta para um hangout. Mostrando seus motivos e argumentos, e ouvindo as pessoas. Por que se eu sou empregado e meu patrão está tão furioso comigo a ponto de vir gritar na porta da minha casa, eu vou fazer questão de falar com ele.
O patrão, nesse caso, não aguenta mais. Por isso tanta gente na rua. Pela passagem sim, e para mostrar quem é que manda.
E as urnas?
Vi também um monte de gente compartilhando uma imagem de uma urna com o texto “proteste aqui, idiota”. Muita gente dizendo “por que não protestam nas eleições”?
Ora, imagine que você é dono de uma lanchonete e combinou com seus funcionários que vai fazer avaliação com eles a cada seis meses. E nesse momento, vai aumentar salários de quem merece, vai conceder promoções, mas vai também dispensar os que não servem. Mas, três meses depois da última avaliação, você descobre desvios de conduta sérios de um funcionário. Ele está usando água da privada para fazer café, xingando as velhinhas que demoram a contar o dinheiro e mordendo o lanche dos clientes que reclamam, na frente deles. Você vai esperar mais três meses até a próxima avaliação?
É a mesma coisa. Eu não votei no Haddad no primeiro turno, no segundo fui obrigado. Não votei no Alckmin. Mas eu acho que mesmo quem votou nesses candidatos tem o direito, e a obrigação, de pras ruas agora. Não vamos achar governantes perfeitos e nossa ação para mantê-los na linha não pode acontecer apenas a cada quatro anos, mas a cada desvio de conduta.
Democracia direta já!
Numa democracia direta, o povo vota não apenas nas pessoas, mas nas decisões. O orçamento da prefeitura é feito com o povo. É o povo que decide se uma avenida será ampliada para carros ou para um corredor de ônibus. É o povo que decide se a verba vai ser destinada a aumentar o salário dos professores ou dos vereadores. Antes da internet, democracia direta era meio inviável para cidades do tamanho de São Paulo. Com a tecnologia que temos hoje, acho que está na hora de começar a pensar no assunto, não?
Também acho que é um longo e difícil caminho de uma estrutura política como a brasileira para uma democracia direta. Alguns vão dizer que é um caminho impossível, eu não acho. Mas não será fácil.
Enquanto isso, vamos fazer democracia direta do nosso jeito. Ao tomar uma decisão, os representantes eleitos do povo precisam ouvi-lo. Os legisladores deveriam estar agora no Facebook, no Twitter, na TV, nas ruas, perguntando a você, o patrão, o que você acha da PEC 37. Se não estão ouvindo, vamos fazê-los ouvir.
O post São 0,20 ou não são 0,20, afinal? apareceu primeiro em fechaTag.
Medindo a complexidade do seu código JavaScript

Já mostramos aqui no Tableless ferramentas para testes e ferramentas para garantir o padrão do seu código JavaScript, mas, enquanto esses utilitários asseguram uma consistência maior, eles nem sempre acabam com complexidades desnecessárias.
Neste artigo vamos falar sobre complexidade ciclomática e mostrar uma ferramenta para análise de códigos JavaScript, a biblioteca Plato.
Complexidade Ciclomática
A primeira regra de funções é que elas devem ser pequenas. A segunda regra de funções é que elas devem ser ainda menores.
— Uncle Bob
Funções devem fazer uma coisa apenas. Fazê-la bem. Fazer somente ela.
— Uncle Bob
Explicando de forma bem direta, complexidade ciclomática é uma métrica do número de caminhos possíveis no seu código. Por exemplo, vejamos o código abaixo:
function authenticate() {
if (user.isValid() === true) {
user.login();
} else {
showMessage('Invalid credentials', 'error');
}
}
A função authenticate possui valor 2 de complexidade ciclomática. Na prática, isso quer dizer que precisaríamos escrever dois testes unitários para cobrir todos os possíveis caminhos. Ou seja, quanto mais caminhos, maior a complexidade ciclomática e, quanto maior a complexidade ciclomática, mais difícil será de manter/testar seu código.
Estudos recomendam 10 como o valor máximo que você deve permitir de complexidade ciclomática no seu método ou sua função. Este é um bom valor, mas tenha em mente que 10 já é uma complexidade alta e não deve, de forma alguma, ser a média de complexidade do seu projeto.
Bad Fix
Outra métrica tirada a partir da complexidade ciclomática é a probabilidade de uma correção injetar novos bugs no seu código. O pessoal da Aivosto, uma empresa especializada em ferramentas para desenvolvedores, chegou a seguinte tabela:
| Complexidade Ciclomática | Probabilidade de “bad fix” |
|---|---|
| 1-10 | 5% |
| 20-30 | 20% |
| >50 | 40% |
| próximo de 100 | 60% |
Segundo a pesquisa da Aivosto, uma correção aplicada em um método com complexidade ciclomática 25 tem 20% de chances de introduzir um novo bug na sua aplicação. Tente lembrar quantas vezes isso já aconteceu com você? E tente lembrar também do tamanho do método ou função que você estava “corrigindo”. Por isso é muito importante tentar medir tudo a respeito do seu código.
Plato

Desenvolvida por Jarrod Overson, a ferramenta Plato aplica na prática todas as teorias de medição de complexidade ciclomática, exibindo na forma de gráficos dados como taxa de mantenabilidade, bugs estimados e erros de lint.
A instalação é feita através do npm, gerenciador de pacotes do nodejs:
npm install -g plato
A forma mais básica de uso é a seguinte:
plato -d report src
Onde -d report é a flag para indicar o diretório report como saída do seu relatório e src é o diretório dos arquivos JavaScript a serem analisados.
Outras opções importantes são as flag -r para ler o diretório recursivamente e -x <regex> para excluir arquivos baseados em uma regex.
Os relatórios do Plato armazenam históricos e é bem interessante ver os números subindo e descendo durante o desenvolvimento do seu projeto. Uma prática legal é guardar e exibir o relatório em algum lugar disponível para todo o seu time.
Exemplos de relatórios
Abaixo temos alguns exemplos de relatórios disponibilizados no repositório do projeto, gerados a partir de bibliotecas e utilitários populares:
Bugs estimados

Um gráfico que chama a atenção nos relatórios do Plato é o de bugs estimados. Afinal de contas, entregar um produto sem bugs é (ou deveria ser) o objetivo final de qualquer desenvolvedor.
Maurice Howard Halstead criou um conjunto de fórmulas para medir coisas como volume, esforço, dificuldade e bugs estimados em um código. As fórmulas são baseadas nos números únicos e totais de operadores e operandos.
Não vou entrar muito em detalhes sobre os valores e as fórmulas, mas é bem interessante ler sobre esse assunto (não precisa ser o livro, a Wikipedia mesmo fornece uma página bem completa sobre as fórmulas).
Integração com Grunt
Overson também desenvolveu um módulo que disponibiliza uma task Grunt para relatórios Plato.
A instalação segue o padrão de pacotes Grunt:
npm install grunt-plato --save-dev
Uma vez instalado o pacote, basta carregar a task no seu Gruntfile.js e rodar a task com o comando grunt plato:
grunt.initConfig({
plato: {
your_task: {
files: {
'report/output/directory': ['src/**/*.js', 'test/**/*.js'],
}
},
},
});
grunt.loadNpmTasks('grunt-plato');
Métricas, métricas e mais métricas
Medir o código do seu projeto ajuda você e seu time a entender e prevenir problemas. Com a ajuda de métricas você vai conseguir manter um código fácil de ler e entender. Além de métricas dos níveis de complexidade também é importante possuir um relatório visível de cobertura de testes e uma documentação simples e direta do seu projeto.
Apesar do nome pomposo e de muita teoria, não é pra ninguém ficar assustado. Pode parecer um conceito avançado, mas na verdade é uma coisa muito básica: o que você estará fazendo é medir se é fácil (ou difícil) manter o seu código.
E lembrem-se: nunca refatore um código sem que ele possua uma cobertura de testes satisfatória!
O post Medindo a complexidade do seu código JavaScript foi originalmente publicado em Tableless.
Migração de dados: não deixe essa atividade tornar seu projeto um fracasso
Em um projeto de desenvolvimento e implantação de sistemas, independentemente do tipo de projeto, é comum existir a necessidade de migrar dados de sistemas legados para o novo sistema. Nesse processo, alguma conversão, tratamento e/ou transformação dos dados será necessária para que seja possível migrá-los.
Os problemas ocorrem quando se tenta levar dados mantidos por sistemas legados para “encaixar” em uma nova definição. Um erro comum em projetos de sistemas é que o gerente do projeto fica muito focado em determinar claramente os requisitos funcionais de um novo sistema e dispõe de pouca ou nenhuma atenção para a migração de dados que deve ocorrer. É comum também que o processo de migração de dados seja representado como uma simples atividade dentro de um planejamento maior. Não tenha dúvidas de que a migração de dados é uma atividade custosa dentro do projeto e, se não for dada a devida atenção, se tornará caminho crítico do projeto, e pode ainda gerar atrasos em sua entrega e até mesmo levá-lo ao fracasso.
A fim de evitar problemas na migração de dados, essa atividade deve ser executada de uma forma para que se possa garantir sua qualidade final. Para tanto, um processo sistemático divido em etapas com atividades distintas, em que cada atividade gera insumos para a execução da atividade seguinte, deve ser seguido. A figura abaixo apresenta as etapas e as atividades do processo que serão discutidas a seguir.
A etapa de planejamento da migração é horizontal e permeia todas outras etapas. Uma vez definida a estratégia, o processo é iterativo, podendo ser incremental, paralelo ou ocorrer em ciclos de revisões sistemáticas. É iterativo porque o processo se repete diversas vezes para se chegar a um resultado e a cada vez gera um resultado parcial que será usado na vez seguinte. Pode ser incremental se a estratégia definida for “fatiar” a migração em conjuntos de dados por assunto, por exemplo, como cadastros, faturamento etc., e executar cada fatia, uma após a outra. Pode ser paralelo, se for possível executar cada fatia ao mesmo tempo, por equipes diferentes, por exemplo. Ou pode-se optar por migrar todo o conjunto de dados e validar o processo em ciclos de revisões sistemáticas até conseguir a excelência no processo.
Estratégia
Na fase de estratégia é que ocorre o planejamento geral do processo de migração de dados. É importante notar que projetos de migração de dados não ocorrem de forma independente. Pelo contrário, eles são demandados a partir de outros esforços de desenvolvimento. A fase de estratégia é fundamental para que o processo de migração de dados ocorra de forma clara e sem problemas e fornecerá os artefatos necessários para a condução das próximas atividades do processo.
O objetivo da fase de estratégia é obter uma compreensão high-level do processo a ser executado e a definição de como será executado. Possui foco na descoberta, no planejamento e no alinhamento do processo com stakeholders. As atividades são realizadas para obter uma avaliação dos dados de origem e criar documentos de planejamento para estabelecer formalmente o escopo, a abordagem e a estratégia da migração. As informações levantadas nessa fase dimensionarão o esforço necessário para a execução da migração.
Atividades que devem ser executadas nessa fase:
- Definição do escopo da migração
- Definição de como será executado o processo (big-bang, faseado, paralelo etc.)
- Especificação das tecnologias envolvidas nas fontes de dados de origem e destino
- Especificação das tecnologias e metodologias que suportarão o processo de migração
- Identificação de riscos associados
Workshop de migração de dados
O objetivo da realização de um workshop de migração de dados é apresentar a abordagem definida para o processo de migração para os stakeholders. Esse workshop destina-se a ser de mão dupla, no qual os membros da equipe de migração de dados poderão compartilhar a abordagem escolhida e experiências em projetos anteriores e, por outro lado, membros da área de negócio poderão apresentar os objetivos de negócio, restrições e preocupações.
No decorrer do workshop, a estratégia traçada anteriormente poderá sofrer alterações. É importante que esse alinhamento ocorra ainda na fase de estratégia para que não aconteçam retrabalhos nas atividades seguintes. Dessa forma, a equipe pode definir uma estratégia adequada para a execução de todo o processo.
Ao concluir o workshop de migração de dados, a equipe de migração obtém uma compreensão dos objetivos de negócio e os desafios em termos do processo de migração, e os clientes de negócio ganham uma compreensão das complexidades e dos desafios para execução do processo e como gerenciar os riscos associados.
Entradas da atividade:
- Declaração de escopo do projeto
Saídas da atividade:
- Declaração de escopo de migração de dados
Análise
A fase de análise da migração de dados deve ser programada para ocorrer simultaneamente com a mesma fase do projeto principal. O objetivo da fase de análise é identificar detalhadamente as fontes de dados que devem ser migradas para o novo sistema. As fontes podem não estar limitadas a um único sistema, assim como podem ser planilhas, arquivos texto ou outras fontes de dados não estruturados.
Nesta fase, a equipe deve familiarizar-se com os dados que se pretende migrar. O entendimento do modelo conceitual de dados na origem facilitará a atividade seguinte. A identificação de tabelas, campos e tipos de dados nas fontes de origem fazem parte desta atividade do processo.
Assim como a equipe deve estar familiarizada com o conjunto de dados que se deve migrar, a equipe deve conhecer qual será o destino dos dados. Modelos conceitual e físico, com tabelas, campos e tipos de dados devem ser identificados para a atividade seguinte do processo.
Auditoria de dados
O propósito da auditoria de dados é analisar o perfil e a qualidade dos dados que serão migrados em suas fontes de origem. A atividade de perfil de dados (data profiling) é o processo de analisar os dados legados para identificar anomalias nos dados e validar regras de negócio a serem aplicadas. Na atividade de auditoria de dados, o foco é conduzir a análise observando problemas típicos, como a falta de dados, nomes de colunas inconsistentes e tipos de dados inconsistentes. A equipe de migração deve envolver usuários de negócio para auxiliar a identificar gaps existentes nos níveis requeridos de qualidade de dados.
Entradas da atividade:
- Declaração de escopo de migração de dados
Saídas da atividade:
- Modelos conceituais e físicos das fontes de dados de origem
- Modelos conceituais e físicos das fontes de dados de destino
- Relatório de auditoria de dados (gaps e riscos identificados quanto à qualidade de dados)
Design
A fase de design tem por objetivo especificar os requisitos necessários para a execução da migração. Nesta fase, serão definidos os mapeamentos entre as fontes de dados de origem e destino e as transformações necessárias para que a migração ocorra. Técnicas de ETL (extract, trasnform, load) podem ser utilizadas neste momento. Durante o desenho da solução a ser implementada, algumas questões que não foram identificadas na fase de análise podem ser identificadas. Caso isso ocorra, a equipe deve voltar à fase de análise para sanar as dúvidas/questões encontradas e posteriormente continuar com o design da solução.
Um documento de especificação técnica deve ser gerado contendo os seguintes tópicos:
- Inventário das aplicações envolvidas (localização, plataforma etc.)
- Diagrama arquitetural do ambiente
- Métodos e ferramentas utilizados na migração (manual, automatizado etc.)
- Padrões de conectividade de fontes de dados de origem e destino
- Requisitos de retenção de dados (tudo, n anos/meses, transações em aberto etc.)
- Requisitos de linguagem
- Requisitos de segurança
- Mapeamento/correspondência entre entidades físicas e respectivos atributos
- Transformações necessárias
Entradas da atividade:
- Declaração de escopo de migração de dados
- Modelos conceituais e físicos das fontes de dados de origem
- Modelos conceituais e físicos das fontes de dados de destino
- Relatório de auditoria de dados (gaps e riscos identificados quanto à qualidade de dados)
Saídas da atividade:
- Especificação técnica de migração de dados
Desenvolvimento
Na fase de desenvolvimento, constrói-se efetivamente a solução que foi especificada na fase anterior. Durante a construção da solução, algumas questões que não foram mapeadas na fase de design podem ser identificadas. Caso isso ocorra, a equipe deve voltar à fase de design para sanar as dúvidas/questões encontradas e posteriormente continuar com o design da solução. Note que pode ser necessário voltar até a fase de análise, caso as atividades da fase de design não consigam solucionar o problema encontrado.
Entradas da atividade:
- Especificação técnica de migração de dados
Saídas da atividade:
- Solução de migração
Testes
O desenvolvimento é acompanhado por uma atividade de teste de software, que é um elemento fundamental da garantia de qualidade do processo de migração. Essa atividade fornecerá subsídios para uma revisão sistemática da especificação, design e codificação com o intuito de diminuir ao máximo a quantidade de erros. Os erros encontrados na fase de testes podem ser divididos em dois tipos: erros físicos e erros lógicos. Erros físicos são essencialmente fáceis de tratar e estão ligados à natureza sintática do mapeamento dos campos. Erros lógicos devem ser revistos na fase de análise e design da migração. Estão ligados à natureza semântica dos campos.
Algumas perguntas devem ser observadas na execução dos testes:
- Quantos registros espera-se criar em cada objeto?
- Os dados foram carregados nos campos corretos?
- Os dados foram formatados de forma correta?
- As transformações foram executadas conforme o esperado?
Entradas da atividade:
- Especificação técnica de migração de dados
Saídas da atividade:
- Relatório de execução de testes (sucesso e erros ocorridos por objeto migrado)
Revisão
Com base nos testes executados, uma revisão de todo o processo executado deve ser efetuada. Nesta fase é que pode-se verificar se toda a análise, design, desenvolvimento e, até mesmo, a estratégia adotada foi eficaz. Neste momento, a equipe de migração deve decidir se o processo está pronto para ser executado em produção ou se um novo ciclo deve ser iniciado. Um plano de roll-out deve ser criado para que todos os passos, ordenação necessária para a execução das atividades, tempo previsto da execução e resultados esperados estejam documentados para a execução do processo em ambiente de produção.
Entradas da atividade:
- Relatório de execução de testes (sucesso e erros ocorridos por objeto migrado)
Saídas da atividade:
- Relatório de correções a serem executadas (caso necessário)
- Go-ahead para o roll-out (se o processo estiver ok)
- Plano de roll-out
Roll-Out
A fase de roll-out é a execução da solução desenvolvida em ambiente de produção. Para a execução do roll-out, os erros devem ser totalmente corrigidos ou uma discussão com a área de negócio sobre os erros encontrados a nível semântico de dados deve ser realizada. Erros sintáticos devem ser revistos na fase anterior e corrigidos.
Não recomenda-se que diversos roll-outs na forma “tentativa e erro” sejam executados. Muitas vezes a limpeza dos dados migrados em ambiente de produção, para realização de uma nova migração, pode ser uma tarefa custosa e difícil de ser realizada, além de apresentar um risco à integridade dos dados.
Entradas da atividade:
- Plano de roll-out
Saídas da atividade:
- Relatório de execução da migração.
Conclusão
Migrar dados de um sistema para outro não é uma atividade trivial e deve ser dada a devida atenção por sua complexidade, que por muitas vezes é negligenciada. Para o usuário final, ter seu sistema funcional não é o suficiente se os dados que ele tinha no sistema antigo não estão lá disponíveis. Considere que a migração de dados é um subproduto de um projeto maior, e não apenas uma atividade, e merece atenção especial.
O post Migração de dados: não deixe essa atividade tornar seu projeto um fracasso apareceu primeiro em .
vida
Não sei se a vida é curta ou longa demais para nós, mas sei que nada do que vivemos tem sentido se não tocarmos o coração das pessoas… E isso não é coisa de outro mundo, é o que dá sentido à vida. É o que faz com que ela não seja nem curta, nem longa demais, mas que seja intensa, verdadeira, pura… Enquanto durar.
(Cora Coralina)
Saber é serviço (Francisco Genciano)
Tive o privilégio de assistir às aulas e de conhecer um dos grandes hebraístas deste nosso país.
Ele não sofre mais as tribulações desta terra. Aquele velho pastor luterano e acadêmico respeitado partiu para estar com o Senhor. Poderia eu lembrar que participou daquela questionável abordagem teológica chamada teologia da libertação, mas prefiro lembrar outras coisas.
Prefiro lembrar quando ele pedia desculpas ao indicar alguma obra sua cuja publicação pertencia a editoras que cobravam preços, para ele, exorbitantes. Prefiro lembrar que após determinada experiência fora exortado a disseminar livremente seu conhecimento, e que desde então providenciou que seus livros fossem vendidos a preços baixíssimos, “apenas para cobrir custos”, como me disse.
Prefiro me lembrar da humildade, infelizmente não tão comum entre os grandes doutores, da disponibilidade para atender, para receber e conversar. Prefiro me lembrar da porta aberta de sua casa, recepcionando com afeto quem ali fosse conversar ou comprar (eu diria ganhar) algum livro.
Mas acima de tudo guardo a lembrança de uma frase que escreveu para mim como dedicatória em um livro:
“Francisco, saber é serviço”.
Que belo conselho. Trocaria aquelas aulas de hebraico e história, se fosse preciso, por essa pequenina, porém estrondosa frase.
Conhecimento que não redunde em práticas de misericórdia e amor é como o grão de trigo que não cai na terra. Pode ser um grão portentoso e vistoso, mas não frutifica.
Qual é o benefício em encher-se de tantos conhecimentos se não for para servir?
Qual a utilidade de profundos e elevados debates teológicos que não redundam em cuidado prático, em amor visível e palpável, em respeito, em preservar a consciência alheia, em santidade e interesse genuíno pelo outro?
Qual a razão de aprofundar-se em conhecimentos doutrinários se não for para melhor conhecer a Deus, deixar-se conduzir adequadamente pelas trilhas desta vida e instruir com mansidão os que resistem?
Os grandes pensadores e teólogos da história da igreja tinham essa abençoada característica, a de conjugar saber e serviço.
Agostinho, Calvino, Lutero, Edwards, Lloyd-Jones e tantos outros não foram meros pensadores de gabinete ou debatedores pedantes, foram homens comprometidos antes de tudo com servir a Deus e servir ao povo de Deus. Foram pastores que se deixaram gastar no cuidado daquela parte do rebanho de Jesus Cristo que lhes fora confiado. Faziam teologia naquele lugar em que é menor o risco de ela ser mera especulação academicista: no meio do povo, servindo.
Sou um grande entusiasta do engajamento intelectual dos cristãos. Tenho convicção de que devemos estar intelectualmente bem preparados, mas temo aquela aberração que é uma cabeça inchada e um coração mirrado. Um cabeção de repolho em um talinho de agrião que não lhe pode sustentar com equilíbrio.
Aprecio o estudo, ou antes, reconheço que ele é um elemento necessário à maturidade cristã. Entretanto, não entendo que deveríamos sentir vergonha por ainda não ter lido tal ou qual livro – exceto a Bíblia, mas deveríamos nos envergonhar profundamente quando podendo não visitamos um doente, não abraçamos o abatido ou levamos pão ao faminto, pior ainda se sequer orarmos por isso.
Saber é serviço. E a autoridade dessa frase não vem do saudoso professor, muito menos de mim, mas vem DELE, a quem devemos honra glória, ações de graça e obediência:
E vós também, pondo nisto mesmo toda a diligência, acrescentai à vossa fé a virtude, e à virtude a ciência, e à ciência a temperança, e à temperança a paciência, e à paciência a piedade, e à piedade o amor fraternal, e ao amor fraternal a caridade. Porque, se em vós houver e abundarem estas coisas, não vos deixarão ociosos nem estéreis no conhecimento de nosso Senhor Jesus Cristo. - 2 Pe 1:5-8
Afinal, como nomear IDs e CLASSes no CSS/HTML ?
Somos incentivados a usar UpperCamelCase para nomear classes em OOP, usamos lowerCamelCase nos nomes dos métodos, não podemos usar dash-case em nomes de variáveis (erro de sintaxe), por isso usamos underscore_case.. mas saindo do mundo backend, e voltando para o frontend, afinal, como nomear ids e classes no css/html ?
Escolha um e somente um, e use
lowerCamelCase, onde a primeira letra da palavra é minúscula e as inicias das demais palavras são escritas em letra maiúscula.
UpperCamelCase, o mesmo de cima, mas a primeira letra da palavra é escrita em maiúscula.
dash-case, onde as palavras são separadas por um hífen, e tudo é sempre escrito em minúsculo.
underscore_case, onde as palavras são separadas por underlines.
AlGoMuito_louco-eEsquisito, nem preciso falar nada ne?! não faça isso.
Mas o problema começa não só quando vc está nomeando uma variavel, objeto, id ou class. O problema existe quando um mesmo projeto possui estilos diferentes de codificação nele mesmo, portanto, padronize. Entre em um acordo com a sua equipe.
SMACSS – Scalable and Modular Arquiteture fore CSS
O http://smacss.com/ não é um framework css, é um guia de estilo.
Toda a teoria dele é muito interessante e eu recomendo a leitura. O foco deste post é apenas como eu venho nomeando meus ids e classes.
dash-case
Considero esse estilo mais próximo da linguagem css e html, do que os outros. As próprias propriedades css já são escritas em dash-case: text-decoration, data-*.. e assim por diante.
in english
Afinal não podemos mesmo usar acentos, algumas palavras são menores e queremos que qualquer pessoa possa dar manutenção em nosso código. É o caso, por exemplo de plugins, frameworks e snippets open source. As linguagens já são em inglês, então se o nosso código também for fica mais natural ler.
Pense em módulos
É comum quando estamos recortando layouts tableless, nos depararmos com partes da página que estarão presentes em mais de uma página. Por exemplo um box de depoimentos que pode existe na home e na página de preços de um produto.
O ideal é escrevermos um código html/css que possa ser copiado/movido de um lugar para o outro, sem que nada se perca e continue funcionando.
<ul id="comments">
<li class="comment">
<q class="comment-text">"lorem ipsum dolor sit amet..."</q>
<cite class="comment-author">Desconhecido</cite>
</li><!-- .comment -->
<li class="comment">
<q class="comment-text">"lorem ipsum dolor sit amet..."</q>
<cite class="comment-author">Desconhecido</cite>
</li><!-- .comment -->
</ul><!-- #comments -->
Só possuo um bloco de comentários por document, então uso ID para identificar esse bloco.
Cada LI é um .comment, e os filhos desse comentário, como o texto e o autor carregam o nome do pai neles: .comment-text e .comment-author.
Namespaces isolados
Ao batermos o olho no nosso css:
.comment {}
.comment-text {}
.comment-author {}
Sabemos rapida e exatamente quais classes se referem a esse módulo de comentários. O mesmo não seria possível se tivéssemos nomeado assim:
.comment {}
.text {}
.author {}
Afinal, podemos gerar um conflito de namespaces, pois se for uma página com CDs, a classe text poderia também estar identificando qualquer texto na página, e o author poderia ser o compositor.
Não estilize por filhos
Uma alternativa seria usar classes filhas:
.comment {}
.comment .text {}
.comment .author {}
O problema dessa abordagem é que estamos aumentando a especificidade do seletor, e se precisamos sobrescrever alguma propriedade, tudo começa a ficar muito verboso:
body.home .comment .author {}
body.price .comment .author {}
Além do que, se o .author for uma classe com poucas responsabilidades, podemos usá-la em diversos contextos, apenas somando classes:
<cite class="comment-author author"></cite> <p class="music-author author"></p>
Não estilize pelo nome da tag
É comum termos preguiça de declarar classes no HTML, e sair fazendo coisas assim:
#comments li {}
#comments p {}
#comments cite {}
ou então:
.comment {}
.comment p {}
.comment cite {}
O grande problema, é que estamos vinculando o nosso css a um único html, e quando fazermos isso, estamos travando a implementação, o que é ruim, já que se formos apresentar um único comentário, não vamos usar uma LISTA para isso, mas sim uma DIV ou algo do tipo. Além de lento, pois devemos lembrar que os browsers lêem os seletores da direita para a esquerda.
Pense nos layouts que vc já implementou. Tudo começa a ficar mais complexo conforme o site cresce e mais módulos são adicionados, mais áreas precisam ser transpostas de um lugar para outro.. Dei um exemplo simples para ilustrar o conceito.
Quando usar ID e CLASS
Identifique um elemento com ID quando ele for único em uma página, e não existir nenhuma possibilidade de ter outro igual a ele, como por exemplo o #header e o #footer do site.
Identifique um ou mais elementos com CLASSes quando estiver pensando em módulos reaproveitáveis, em estilos que podem ser somados, como por exemplo:
<a href="" class="btn btn-hire btn-big">Contratar</a>
Estou somando classes para compor o meu elemento. Se eu precisar desse botão em um tamanho menor, apenas troco uma classe no html, ou se eu quiser ele em outra cor, eu apenas adiciono outra class class=”btn btn-submit btn-medium”.
Nomeie pela função
Não escolha nomes que estejam vinculados aos estilos de um seletor. Estilos mudam, assim que layouts se alteram. Escolha nomes que representem o que aquele seletor é na página, ou o que ele faz.
O que faz ?
Por exemplo, .btn-green e .btn-orange são nomes ruins, pois carregam cores que podem ser alteradas. Melhor seria se esses nomes de classes descrevessem o que aquilo faz, como: .btn-hire e .btn-submit. Assim sabemos que possuimos uma classe que cuida de todos os botões de contratar do site e outra para cuidar dos botões de enviar formulários.
Dessa forma, podemos altera a vontade os estilos sem que o nome do seletor deixe de fazer sentido.
Vale a pena dar uma lida sobre a teoria OOCSS.
O que é ?
Outra má prática, é nomear de acordo com a posição do elemento na página: #column-left, se algum dia essa coluna deixar de ser coluna ou mudar de lado, além de alterarmos alguns estilos no css, teríamos também que alterar no html, pois não faria sentido esse nome.
Nomeie pelo o que o elemento é. Esqueça coisas como posição, cor e tamanho. Se é uma coluna adicional ao conteúdo, não importa onde ela está, é uma #sidebar, #aside.. algo do gênero.
Devemos conseguir distinguir o que um elemento é, sem ler ou ver o conteúdo dele. Apenas batendo o olho na tag e no seletor que ele possui.
Google Style Guide
Uma indicação de leitura complementar:
CSS Style Rules
Conclusão
Para ter um código mais fácil de ler, mais simples de dar manutenção, com seletores mais rápidos, desenvolvido em módulos encaixáveis em qualquer página e independente da marcação html, é que eu nomeio os meus IDs e classes desta maneira.
E ai ? gostou desse estilo ?
Saber é serviço
Tive o privilégio de assistir às aulas e de conhecer um dos grandes hebraístas deste nosso país.
Ele não sofre mais as tribulações desta terra. Aquele velho pastor luterano e acadêmico respeitado partiu para estar com o Senhor. Poderia eu lembrar que participou de polêmica e questionável (até por seus idealizadores) abordagem teológica, mas prefiro lembrar de outras coisas.
Prefiro lembrar de quando ele pedia desculpas ao indicar alguma obra sua cuja publicação pertencia a editoras que cobravam preços, para ele, exorbitantes. Prefiro lembrar que após determinada experiência fora exortado a disseminar livremente seu conhecimento, e que desde então providenciou que seus livros fossem vendidos a preços baixíssimos, “apenas para cobrir custos”, como me disse.
Prefiro me lembrar da humildade, infelizmente não tão comum entre os grandes doutores, da disponibilidade para atender, para receber e conversar. Prefiro me lembrar da porta aberta de sua casa, recepcionando com afeto quem ali fosse conversar ou comprar (eu diria ganhar) algum livro.
Mas acima de tudo guardo a lembrança de uma frase que escreveu para mim como dedicatória em um livro:
Que belo conselho. Trocaria aquelas aulas de hebraico e história, se fosse preciso, por essa pequenina, porém estrondosa frase.
Conhecimento que não redunde em práticas de misericórdia e amor é como o grão de trigo que não cai na terra. Pode ser um grão portentoso e vistoso, mas não frutifica.
Qual é o benefício em encher-se de tantos conhecimentos se não for para servir?
Qual a utilidade de profundos e elevados debates teológicos que não redundam em cuidado prático, em amor visível e palpável, em respeito, em preservar a consciência alheia, em santidade e interesse genuíno pelo outro?
Qual a razão de aprofundar-se em conhecimentos doutrinários se não for para melhor conhecer a Deus, deixar-se conduzir adequadamente pelas trilhas desta vida e instruir com mansidão os que resistem?
Os grandes pensadores e teólogos da história da igreja tinham essa abençoada característica, a de conjugar saber e serviço.
Agostinho, Calvino, Lutero, Edwards, Lloyd-Jones e tantos outros não foram meros pensadores de gabinete ou debatedores pedantes, foram homens comprometidos antes de tudo com servir a Deus e servir ao povo de Deus. Foram pastores que se deixaram gastar no cuidado daquela parte do rebanho de Jesus Cristo que lhes fora confiado. Faziam teologia naquele lugar em que é menor o risco de ela ser mera especulação academicista: no meio do povo, servindo.
Sou um grande entusiasta do engajamento intelectual dos cristãos. Tenho convicção de que devemos estar intelectualmente bem preparados, mas temo aquela aberração que é uma cabeça inchada e um coração mirrado. Um cabeção de repolho em um talinho de agrião que não lhe pode sustentar com equilíbrio.
Aprecio o estudo, ou antes, reconheço que ele é um elemento necessário à maturidade cristã. Entretanto, não entendo que deveríamos sentir vergonha por ainda não ter lido tal ou qual livro – exceto a Bíblia, mas deveríamos nos envergonhar profundamente quando podendo não visitamos um doente, não abraçamos o abatido ou levamos pão ao faminto, pior ainda se sequer orarmos por isso.
Saber é serviço. E a autoridade dessa frase não vem do saudoso professor, muito menos de mim, mas vem DELE, a quem devemos honra, glória, ações de graça e obediência:
E vós também, pondo nisto mesmo toda a diligência, acrescentai à vossa fé a virtude, e à virtude a ciência, e à ciência a temperança, e à temperança a paciência, e à paciência a piedade, e à piedade o amor fraternal, e ao amor fraternal a caridade. Porque, se em vós houver e abundarem estas coisas, não vos deixarão ociosos nem estéreis no conhecimento de nosso Senhor Jesus Cristo. - 2 Pe 1:5-8
Comparando semi joins
Existem alguns mitos envolvendo o que conceitualmente é conhecido como semi join e, infelizmente, tais mitos acabam por prejudicar a escrita de consultas, causando problemas de performance. Mas, o que são semi joins? São joins que retornam linhas de uma tabela A baseado na existência de linhas correlacionadas em uma tabela B. Se a consulta retorna apenas atributos (campos) da tabela da esquerda, então o join é chamado de Left Semi Join; se retorna apenas atributos da tabela da direita, então é chamado de Right Semi Join. Um semi join pode ser produzido usando INNER JOINS, EXISTS, IN e também com o INTERSECT.
Antes de entrarmos em mais detalhes, listemos os mitos comuns envolvendo semi joins:
- JOIN versus EXISTS
- IN versus EXISTS
Será que realmente existe ganho de performance ao adotar, por exemplo, o EXISTS ao invés do IN? Iremos clarificar essa e outras questões no decorrer do artigo.
Preparando o ambiente
Antes de entrarmos diretamente no assunto, vamos executar o código abaixo para a criação do nosso ambiente de estudo. Estou utilizando o banco AdventureWorks2012 como referência.
-- Cria o ambiente use tempdb go CREATE TABLE dbo.Clientes ( ClienteID INT NOT NULL PRIMARY KEY, Nome VARCHAR(50) NOT NULL, Sobrenome VARCHAR(50) NOT NULL, ); INSERT dbo.Clientes SELECT c.CustomerID , p.FirstName , p.LastName FROM AdventureWorks2012.Sales.Customer c JOIN AdventureWorks2012.Person.Person p ON c.PersonID = p.BusinessEntityID GO CREATE TABLE dbo.Vendas ( VendasID INT NOT NULL PRIMARY KEY, Data DATETIME NOT NULL, ClienteID INT NOT NULL FOREIGN KEY REFERENCES dbo.Clientes (ClienteID), TotalDaVenda DECIMAL(15,4) NOT NULL ); INSERT dbo.Vendas SELECT TOP 40 PERCENT h.SalesOrderID , h.OrderDate , h.CustomerID , h.TotalDue FROM AdventureWorks2012.Sales.SalesOrderHeader h; CREATE NONCLUSTERED INDEX AK_Vendas_ClienteID on dbo.Vendas (ClienteID) GO
INNER JOIN versus IN versus EXISTS
Imagine a seguinte sentença: recuperar todos os clientes que já realizaram compras na empresa?
-- 1) Usando INNER JOIN com DISTINCT SELECT DISTINCT c.ClienteID, c.Nome, c.Sobrenome FROM dbo.Clientes c JOIN dbo.Vendas v ON v.ClienteID = c.ClienteID
-- 2) Usando IN SELECT c.ClienteID, c.Nome, c.Sobrenome FROM dbo.Clientes c WHERE c.ClienteID IN ( SELECT v.ClienteID FROM dbo.Vendas v )
-- 3) Usando EXISTS SELECT c.ClienteID, c.Nome, c.Sobrenome FROM dbo.Clientes c WHERE EXISTS ( SELECT 1 FROM dbo.Vendas v WHERE v.ClienteID = c.ClienteID )
Veja que:
- Os resultados gerados são os mesmos;
- Os planos de execução são idênticos.
Nos exemplos expostos anteriormente, para cada linha da tabela A o otimizador necessita checar se existe pelo menos uma linha correspondente na tabela B (lado oposto). Isso significa que o otimizador não precisa percorrer todas as linhas da outra tabela. Existe por aí a ideia equivocada de que quando usamos o IN, o otimizador obrigatoriamente percorre todas as linhas da tabela B (o que não é verdade). O IN segue basicamente o mesmo princípio do EXISTS: fazer teste de existência. Atente que para alcançarmos o LEFT SEMI JOIN a partir do INNER JOIN, foi necessário restringir a lista de colunas da cláusula SELECT para recuperar apenas as colunas da tabela A e usarmos o DISTINCT para suprimir as linhas redundantes (este é o segredo). Apesar de não ter sido demonstrado anteriormente, também é possível alcançar um semi-join através do operador INTERSECT.
Anti-Semi Join (OUTER JOIN versus NOT IN versus NOT EXISTS)
O inverso de um semi join é um anti-semi join, que ocorre quando linhas em uma tabela A não possuem correspondentes em uma tabela B (é baseado na não-existência). É possível alcançar um anti-semi join através de subconsultas utilizando NOT IN ou EXISTS, ou ainda através do operador EXCEPT. Também é possível alcançar um anti-semi join utilizando outer join, filtrando somente as outer rows.
Imagine a seguinte sentença: recuperar todos os clientes que nunca realizaram compras na empresa?
-- 1) Usando NOT IN SELECT c.ClienteID, c.Nome, c.Sobrenome FROM dbo.Clientes c WHERE c.ClienteID NOT IN ( SELECT v.ClienteID FROM dbo.Vendas v )
-- 2) Usando NOT EXISTS SELECT c.ClienteID, c.Nome, c.Sobrenome FROM dbo.Clientes c WHERE NOT EXISTS ( SELECT 1 FROM dbo.Vendas v WHERE v.ClienteID = c.ClienteID )
Vejamos o que acontece quando utilizamos um LEFT OUTER JOIN:
-- 3) Usando LEFT OUTER JOIN SELECT c.ClienteID, c.Nome, c.Sobrenome FROM dbo.Clientes c LEFT JOIN dbo.Vendas v ON v.ClienteID = c.ClienteID WHERE v.ClienteID IS NULL
O resultado da consulta é igual, mas o plano de execução gerado não é o mesmo. Veja que apesar de alcançarmos os mesmos resultados, explicitamente não aparece um Anti Semi Join quando usamos o LEFT OUTER JOIN. Se compararmos a performance das consultas veremos que o NOT EXISTS é mais eficiente. Por conta disso, deixo a seguinte dica: se você precisar recuperar linhas baseadas na não existência em outra tabela, prefira NOT EXISTS ou NOT IN; evite usar OUTER JOIN como foi demonstrado anteriormente.
O post Comparando semi joins apareceu primeiro em .
Yes, we fan!
Opinião enviada por Anahuac de Paula Gil (anahuacΘanahuac·biz):
Finalmente: Anatel acaba com exigência de provedor para banda larga fixa
Via g1.globo.com:
A Agência Nacional de Telecomunicações (Anatel) aprovou nesta quinta-feira (23) mudanças nas regras para prestação de banda larga fixa que, espera a agência, devem levar a mais competição neste mercado e à redução no custo do serviço aos consumidores.
Uma das mudanças aprovadas pelo conselho é o fim da necessidade de contratação do provedor de internet nos serviços de banda larga fixa (prestada junto com o serviço de telefonia fixa, também chamada de ADSL), herança dos tempos da conexão discada.
Menina de 14 anos poderia ser guitarrista em qualquer banda do mundo
O artigo Menina de 14 anos poderia ser guitarrista em qualquer banda do mundo faz parte do conteúdo do Byte Que Eu Gosto! - Nerd, Geek, Dicas, Cinema, Games e mais!.
O nome da menina é Tina. O vídeo mostra ela fazendo um cover de Eruption, de Van Halen. O mais incrível: a menina tem uma cara de puro tédio, como se aquilo fosse algo extremamente elementar e entediante pra ela.
O artigo Menina de 14 anos poderia ser guitarrista em qualquer banda do mundo faz parte do conteúdo do Byte Que Eu Gosto! - Nerd, Geek, Dicas, Cinema, Games e mais!.
Um pensamento solto sobre Davi (Francisco Nunes)
Hoje fui levado a pensar no fim da vida de Davi, conforme o registro de 1Reis.
O último versículo do livro anterior, 2Samuel, fala de algo glorioso: “E edificou ali Davi ao SENHOR um altar, e ofereceu holocaustos, e ofertas pacíficas. Assim o SENHOR se aplacou para com a terra e cessou aquele castigo de sobre Israel”. Sem dúvida, é uma bela cena. Davi, arrependido de ter ordenado o censo do reino, arrependido por seu erro ter resultado na morte de setenta mil homens do povo, oferece holocaustos ao Senhor na eira de Araúna, que agora lhe pertence, pois ele não ofereceria ao Senhor, seu Deus, holocaustos que não lhe custassem nada (2Sm 24.20).
É uma bela cena para nossa visão das coisas espirituais: temos arrependimento, holocausto, louvor, perdão de Deus… Mas falta algo, não só nessa cena como eu muitas outras da vida de Davi: sua família. Davi, mais uma vez, está desacompanhado de sua família: nem uma esposa (havia tantas que podiam estar com ele…), nem um filho (dos tantos…). Por quê?
O resumo de tudo é: Davi foi um fracasso como pai, como marido, como chefe de família. Como este é uma consideração rápida sobre ele, não há como aprofundar isso. Mas basta ler a história do rei de Israel, especialmente depois de 2Samuel 11: o adultério com Bate-Seba trouxe conseqüências, especialmente sobre sua família, da qual a espada nunca se apartou (12.10). Isso significaria que haveria guerras, lutas, desencontros, intrigas, mortes dentro da família, mas isso não explica a omissão de Davi como pai e como marido. Os capítulos 13 a 15 exemplificam isso vergonhosamente: sua omissão no caso de estupro de sua filha Tamar por Amnom, meio-irmão dela (portanto, filho de Davi), sua incapacidade de lidar com a rebelião de Absalão, preferindo fugir covardemente a enfrentá-lo e pô-lo em seu lugar.
E foi esse Davi, o solitário homem cheio de esposas e de filhos, que adorou a Deus na eira de Araúna. Linda cena, mas… vazia. O rei está acompanhado apenas de seus escravos (24.20). Somente os servos ouviram aquela declaração, sobre o preço dos holocaustos, mas nenhum filho, nenhuma esposa. Nenhum deles teve oportunidade de ouvir este princípio tão importante acerca do dar-se ao Senhor, do ser totalmente Dele em Seu serviço. O pai de muitos filhos não tem filhos. O marido de muitas esposas não tem esposa. Só escravos: pessoas que apenas obedecem, que não precisam aprender ou praticar nada. Só seguir seu dono.
Na página seguinte da Bíblia está 1Reis, que inicia dizendo: “Sendo, pois, o rei Davi já velho, e entrado em dias, cobriam-no de roupas, porém não se aquecia” (1.1). Do holocausto à velhice, do sacrifício ao frio, das ofertas ao não se aquecer. O que aconteceu nesse meio tempo? Segundo esse registro, nada. Nada da importante. Nenhum fato digno de nota. Agora há um rei velho, decrépito, cheio de roupas, que não se aquece. A cena deveria ser patética: um velho entrouxado de roupas, cercado de roupas, e tremendo de frio, batendo queixo.
É comum os velhos sentirem mais frio. Lembro-me de meu pai, antes de partir para o Senhor, sempre com seu casacão ou com seu pala de lã, com frio. Mas a cena de Davi era patética por ele ser o rei, uma figura imponente, que inspirar respeito e admiração, e por estar cheio de roupas, exageradamente vestido.
Então, seus escravos tiveram uma idéia:
“Disseram-lhe os seus servos: Busquem para o rei meu senhor uma moça virgem, que esteja perante o rei, e tenha cuidado dele; e durma no seu seio, para que o rei meu senhor se aqueça. E buscaram por todos os termos de Israel uma moça formosa, e acharam a Abisague, sunamita; e a trouxeram ao rei. E era a moça sobremaneira formosa; e tinha cuidado do rei, e o servia; porém o rei não a conheceu” (vv. 2-4).
Quantas coisas há a se considerar nesses poucos versículos!
1. De onde os escravos tiraram essa idéia? Uma mulher que aquece mais que banhos quentes ou lareira ou aquecimento no quarto? Seria isso decorrência da fama de mulherengo de Davi, de sua lascívia, até agora, incontrolável? Seria esta a impressão final que Davi, o da eira de Araúna, passava a seus escravos: “Só uma mulher resolve meu problema”?
2. Por que os escravos se preocuparam com isso, não uma das tantas esposas ou um dos tantos filhos? Onde estão elas? Onde estão eles? Ninguém se preocupa com Davi? A preocupação deles é apenas com o reino (como se vê nos versículos seguintes). O que Davi fez para ser assim desprezado, deixado de lado, no fim da vida. É um velho! Merecia um pouco de atenção. Merecia? Não estaria ele colhendo o que semeou na família: desinteresse, omissão, ausência, destempero emocional…? Um velho friorento entregue pela família às idéias sem pé nem cabeça de seus escravos, que uma vez o viram apresentar holocaustos, mas muitas vezes o viram com mulheres, muitas e variadas.
3. Se a intenção era mesmo apenas encontrar um cobertor humano para Davi, por que procurar “por todos os termos de Israel uma moça formosa” (v. 3)? Ela vai aquecer Davi por ser formosa? Ela não precisava ter outras habilidades para resolver a constante hipotermia do rei? Ou seria mais um enfeite do palácio de Davi para eram as outras esposas? Troféus expostos para ressaltar a virilidade de Davi? E escolheram uma “moça sobremaneira formosa” (v. 4). Uma modelo, uma miss, uma “uau!”. Era preciso mesmo isso? Parece-me apenas um conceito mundano, caído, de que beleza é o principal.
Não são muitos seduzidos (com trocadilho) por essa idéia? Não é imposto, a homens e a mulheres, um padrão, um conceito de beleza? Não são tantas jovens escravizadas pela anorexia das modelos, pelo raquitismo das que desfilam nas passarelas? Não são tantas as mães que moldam suas filhas desde muito pequenas no padrão adulto de beleza artificial: maquilagem, roupas, erotismo precoce, músicas idiotas sobre “com quem será…”? Não são tantos jovens cristãos atraídos pela falsa aparência exterior, ignorando a piedade, o “incorruptível traje de um espírito manso e quieto, que é precioso diante de Deus” (1Pe 3.4)?
Voltemos a Davi.
O que me assombrou pela primeira vez, como se a tinta ainda secando, nessa antiga passagem foi a ausência da família. “Davi, o que você fez com sua família?” Agora, o velho Davi tem nos braços uma mulher linda – imagino que a mais linda que ele já viu –, mas ele é velho e friorento. E a Bíblia registra, talvez como um louvor a ele, mas, ao mesmo tempo, para envergonhar sua virilidade, sua fama de conquistador: “Porém o rei não a conheceu” (1Rs 1.4).
Ah, se fosse em outros tempos! Davi, que não respeitou a mulher do próximo, ao preço de matá-lo para ficar com ela, que a fez deitar-se com ele (provavelmente usando sua autoridade imperial sobre os súditos), não teria deixado passar incólume uma moça sobremaneira formosa. Mas agora ele está velho e friorento. Seu corpo está impotente. Sexo, que nunca o satisfez, agora não o satisfaz mais. Mulheres, que eram sua busca, seu alvo, sua certeza de satisfação, agora de nada lhe servem. Ele só queria um banho quente permanente.
Há um detalhe curioso: a Bíblia não registra que Abisague, a tal moça linda, conseguiu aquecer o rei. Diz apenas que ela o servia e cuidava dele (vv. 4, 15). Trocava suas roupas? Trocava-lhe as fraldas geriátricas? Levava-o para o banho? Dava comida na boca? A pergunta surge de novo: “Davi, o que você fez de sua família? Por que nenhuma esposa cuida de você? Por que nenhum de seus filhos cuida de você? Em que você se tornou aos olhos de sua família, Davi? O que sua família se tornou a seus olhos, Davi?” Davi parece sentir-se indigno de pedir o socorro a qualquer de suas esposas ou de seus filhos. É minha inferência, minha leitura do quadro todo. Davi foi rei, com a dignidade real, até o fim, mas, em algum lugar do passado, ele perdeu a dignidade como marido e pai. Agora, está com frio.
Ainda há mais. Por causa da preocupação com o reino, não com o rei, Bate-Seba (sim, aquela com quem ele adulterara e cujo marido ele mandou matar) vai a Davi interceder por Salomão (filho legítimo do casal, pois gerado depois de Davi ter casado com ela). Mas a cena é… desagradável, na falta de outro adjetivo: “E foi Bate-Seba ao rei na sua câmara; e o rei era muito velho; e Abisague, a sunamita, servia ao rei” (v. 15).
Imagine a cena toda: aquele homem havia adulterado com a mulher e matado o marido (honesto, leal, decente, patriótico) dela. Depois, por culpa de seu pecado, o primeiro filho deles morre. Talvez ela tenha pensado que, dada a loucura toda feita em nome do amor (da lascívia é mais exato), Davi a trataria como única, como a preferida, como a especial. Que nada! Em pouco tempo, por onde vai passando, Davi coleciona mais e mais mulheres. Bate-Seba era apenas mais uma, importante, talvez, por ser a mãe de Salomão, o futuro rei. Aquele homem agora é um velho, mas ainda está no comando. Bate-Seba não tem opção: tem de ir a ele. Ao chegar lá, o vê com Abisague, a mulher linda que o serve. Bate-Seba agora é idosa, enrugada; não é mais a mulher bonita que, ao se banhar, atraiu o rei com sua beleza nua. Talvez fosse tão bonita quanto Abisague. Agora é velha e Davi é velho. E seu marido está, mais uma vez, com outra mulher.
E ela não se dirige ao marido: ela fala com o rei, com seu senhor (vv. 16-20). Ela não é a esposa: é a serva (v. 17), não mãe do filho, já que o filho, um servo, é filho apenas do rei (vv. 17, 19).
Com certeza, algumas dessas expressões são justificadas pela cultura palaciana, pelo protocolo real. No entanto, a cena toda é vazia de relacionamentos de amor, de laços de família, de ternura. (Compare com o relacionamento entre Jacó e José.) Davi é um rei só, só numa numerosa família, abandonado por aqueles a quem abandonou.
Por isso, o maravilhoso e incomparável rei Davi termina a vida em um versículo: “E Davi dormiu com seus pais, e foi sepultado na cidade de Davi” (2.10). Ninguém o pranteou, ninguém sentiu falta dele, nenhuma esposa de luto, nenhum filho entristecido. Davi morreu. E ponto.
Ao ler 1Reis e pensar nisso tudo, vieram-me ao coração pensamentos assustadores: “Quem vai cuidar de mim em minha velhice? Quem fará questão de cuidar de mim? O que semeio hoje em minha família? Que colheita vou ter?” O princípio é imutável: colhemos exclusivamente o que semeamos. Davi semeou solidão, omissão, abandono, desinteresse; colheu frio e tremedeira nos braços de uma linda estranha (e nem ela foi chorar sua morte).
O que eu semeio?
O que você semeia?
Ainda é tempo de iniciar uma nova semeadura.
___
Você poderá citar e distribuir este texto livremente, para uso exclusivo em publicações gratuitas, desde que não altere seu conteúdo e cite autor e fonte.
© Campos de Boaz 2013.
Alguns Princípios Cristãos sobre o Lazer e Entretenimento
Faz algum tempo acompanhei uma discussão entre jovens cristãos, pela Internet, sobre a ida a shows de artistas famosos. Após uma boa troca de mensagens, postei a mensagem abaixo sobre alguns princípios cristãos sobre o lazer. Fica para a reflexão de quem se interessar:
Queridos,
Acho que o método certo para analisarmos esta questão e outras é estabelecermos os princípios bíblicos que controlam o assunto. Sem o referencial bíblico ficaremos às apalpadelas. Menciono alguns princípios bíblicos que controlam a questão do LAZER do crente -- pois é aqui que se encaixa o assunto.
1. É dever do crente fazer todas as coisas para a glória de Deus. Isto inclui o lazer. Portanto, qualquer forma de lazer em que o crente não consiga glorificar a Deus deveria ser questionada. Esclareço que eu iria a um show de artistas cujo conteúdo, ambiente, letra das músicas, apresentação pessoal dos artistas (alguns se apresentam semi-despidos) não ofendam as virtudes cristãs nem os valores morais do Cristianismo.2. Também é dever do crente desfrutar com moderação de todas as coisas boas que Deus criou, usando com moderação a alegria, o sono, a alimentação, os exercícios e certamente o lazer também. O lazer não pode se transformar num ídolo, e receber o primeiro lugar em minha vida. Cristo é quem deve ter esta prioridade.
3. O cristão deve evitar todas as ocasiões à impureza, em que a tentação é maior e mais pesada; deve evitar a sociedade com ímpios e devassos; sua mente deve estar sempre ocupada com "tudo o que é verdadeiro, tudo o que é respeitável, tudo o que é justo, tudo o que é puro, tudo o que é amável, tudo o que é de boa fama, se alguma virtude há e se algum louvor existe, seja isso o que ocupe o vosso pensamento" (Fp 4:8). Tenho certeza que a letra de algumas músicas de alguns artistas não se pode encaixar aqui. Não vejo como um crente pode descontrair-se e agitar-se ao som de uma música que exalta a infidelidade conjugal ou idolatra o homem ou a mulher.
4. Compete ao cristão também "examinar todas as coisas e reter o que é bom". Não devemos reter o mal e nem nos deliciarmos nele. Se estou escutando uma música que exalta o amor homossexual, ou a violência contra a mulher, ou o adultério, ou uma relação promíscua, certamente não devo ter prazer algum nestas coisas. Por outro lado, tem muita letra boa e sã, sem maldade ou malícia. Tudo OK, nestes casos. A graça comum de Deus permite que algumas coisas boas ainda sejam produzidas pela humanidade não regenerada.
5. Por último, o amor a Cristo e ao próximo precede o uso da liberdade cristã. Se no uso da minha liberdade irei ser escândalo para o Evangelho ou outros irmãos, me compete abrir mão por amor.
Apesar da "cultura de proibição de programas para a juventude" que foi mencionada numa mensagem da lista, não podemos esquecer que o crente é escravo de Deus e que tem com única regra de fé e prática a Bíblia. Até na hora de descontrair.
Um abraço,
Pr. Augustus
Convocação para treinamento da Seleção Estadual 2013.
Aplicativos Web RESTful são bons pra você
Recentemente, discussões têm surgido nos círculos de desenvolvimento web sobre se aplicativos web RESTful (conhecido como Client MVC, conhecido como única página) são uma boa ideia. Ou, mais precisamente, se eles são uma ideia melhor do que apenas servir HTML do servidor.
Agora, antes de eu dar minha humilde opinião, vamos definir o que estamos falando aqui. O padrão básico por trás dos aplicativos web RESTful é o seguinte: o servidor expõe um conjunto de endpoints REST que emitem XML ou JSON (geralmente o último), enquanto o Client (que normalmente é construído usando algum framework JavaScript MV *) consome esses endpoints.
Devo ressaltar que ambos os lados do argumento trazem alguns pontos muito válidos. Particularmente, o lado contra web apps RESTful aponta para custos não-triviais (na forma de aumento da complexidade e de problemas de desempenho) como motivos para não fazê-lo em cada app que você construir.
Eles trazem um importante ponto. Há um custo associado a Web Apps RESTful, assim como há um custo associado com um monte de outras coisas (Domain Driven Design é um exemplo popular). Se o custo não pode ser justificado, não deve ser incorrido.
Dito isso, eu acho que esse padrão estrutural é uma das tendências mais interessantes no desenvolvimento de software. Aqui está o porquê.
Forcing Function
Se você está construindo um web app RESTful, você é forçado a pensar sobre o seu domínio em termos de recursos e operações simples de CRUD nesses recursos. Muito tem sido escrito sobre o porquê de a orientação de recursos ser uma coisa boa, por isso não vou falar sobre essas razões aqui. Eu vou apenas dizer que, para mim, conseguir modularidade e baixo acoplamento via orientação de recurso parece ser a maneira menos elaborada de fazê-lo.
Em outras palavras, eu raramente sinto que estou forçando a metáfora de recursos quando falo sobre os recursos que meu aplicativo consumiria/criaria. Eu também acho mais natural e mais direto raciocinar sobre isso, especialmente quando comparado a outras camadas ou técnicas orientadas a serviços.
APIs gratuitas
Outro benefício de construir web apps RESTful é que você recebe um conjunto de APIs para seu domínio gratuitamente. Quer construir um cliente móvel? Não tem problema, é só usar essas APIs já desenvolvidas e testadas. Isso está em contraste gritante com aplicativos web “tradicionais”, nos quais expor seus dados para outros consumidores exige um novo esforço de desenvolvimento.
Agora, devo observar que você provavelmente vai precisar testar suas APIs antes de expô-las aos consumidores externos. Afinal de contas, nós tendemos a tomar atalhos quando temos o controle completo sobre o consumidor e o produtor das APIs. Isso é normal e razoável, pois o nível extra de rigor simplesmente não é necessário.
Então, provavelmente você terá que voltar e adicionar coisas como mecanismos adicionais de autenticação, validações mais robustas, fazer logs, códigos de resposta mais consistentes, mensagens de erro mais claras etc. Dito isso, o esforço para obter essas APIs preparadas para consumo externo é consideravelmente menor do que construí-las a partir do zero.
***
Artigo traduzido pela Redação iMasters, com autorização do autor. Publicado originalmente em http://tatiyants.com/restful-web-applications-are-good-for-you/
O post Aplicativos Web RESTful são bons pra você apareceu primeiro em .
Não “empurre” seus pull requests
Você passa por um problema, ou tem uma vontade súbita. Então você abre o seu editor e mergulha no código. Em uma situação boa, o patch é simples, portanto você mesmo corrige o erro, envia um pull request, reclina a cadeira e espera – mesmo quando o patch é simples, a experiência diz que normalmente você vai ter que incorporar algum feedback antes que o seu pull request seja incorporado pelo autor.
Então, vez ou outra, você encontra um problema “cabeludo” – do tipo que parecia simples à primeira vista – e perde a melhor parte do seu dia, ou até mesmo mais do que isso, e quanto mais longe você vai, mais comprometido você fica em chegar no fim. Finalmente, você sai vitorioso: com mais de 300 linhas de patch, uma dúzia de arquivos modificados e a sensação de que acabou de fazer um favor para o mundo – hora de enviar o seu pull request!
É aqui que tudo começa a dar errado. Você espera agradecimento pelo seu tempo, trabalho e esforço, mas o mantenedor olha com horror para o patch enquanto tenta enumerar as razões pelas quais não pode aceitá-lo. Em 50% das vezes, ele não sabe nem por onde começar, então ele procura pelos mínimos defeitos – sua contribuição vai para lugar nenhum, e a culpa não é de nenhum dos dois lados.
Não “empurre” um pull request
Contribuições são sempre bem-vindas, mas patches surpresa são quase sempre um fardo. Sim, você está oferecendo a sua ajuda, mas alguém precisará manter o seu código no longo prazo – faça com que eles comprem a ideia primeiro e evite surpresas. Pior ainda, uma mudança localizada referente a um problema específico irá com frequência desconhecer todas as implicações para o projeto: outros casos de uso, planos para as futuras versões ou decisões de arquitetura em geral. Uma boa ideia pode acabar sendo implementada de forma inapropriada para um determinado projeto. Ela pode ser invalidada por um outro esforço do qual você talvez não tenha o menor conhecimento: pode não ser a hora certa, ou uma dúzia de outras razões que podem conspirar contra você.
Aqueles que são responsáveis por manter o código possuem a melhor perspectiva, portanto, entre em contato com eles o quanto antes. Isso não é para dizer que eles sempre têm razão; você talvez tenha que argumentar levando isso em consideração, mas essa é uma discussão que é melhor ter antes do que depois de escrever o seu código. É um dos paradoxos mais frustrantes no mundo open-source: coisa muito comum seus fãs mais engajados cairem numa armadilha, ao perderem noites e fins de semana trabalhando em uma grande contribuição, apenas para ficarem desapontado quando o mantenedor rejeita o trabalho deles logo de cara.
Revisões de código são difíceis: comece cedo
Da próxima vez, antes de se fechar no editor, abra uma discussão, descreva o problema e a solução e se ofereça para fazer o trabalho. Não deve levar mais de um parágrafo para explicar o objetivo – se você precisar de uma redação, já é um sinal de que você deve quebrar o problema em partes, ou que ele talvez não esteja bem delineado. Se o projeto ou a mudança é grande, escolha um revisor específico e trace o projeto. Peça ajuda e opinião logo no começo e, como num passe de mágica, você verá o seu código ser incorporado dentro do cronograma.
Revisões de código são difíceis. Na verdade, acontece que a efetividade de revisões cai dramaticamente depois de 200-400 linhas de código, e a taxa de inspeção sugerida é de no máximo 300-500 linhas por hora. Tenha isto em mente: divida grandes commits em pedaços pequenos e administráveis. Uma regra de ouro é mirar meia hora de revisão, ou menos de 200 linhas de um código bom e limpo (não necessariamente inteligente). Se houver múltiplos commits, então apresente um plano de desenvolvimento e consiga um feedback para cada parte assim que estiverem prontos.
Um bom trabalho é “entregue” não “empurrado”
Não há nada mais frustrante do que se identificar com este texto, ou ainda pior, estar na reta final de uma experiência desse tipo que não deu certo. Quem contribuiu fica ofendido por não ser reconhecido, e o mantenedor é pego em um dilema: ele quer construir uma comunidade, mas precisa ir contra seus maiores fãs. Não há vencedores aqui, e nenhum dos lados deve ser culpado.
Da próxima vez, antes de se fechar no editor, abra uma discussão, descreva o problema e a solução e se ofereça para fazer o trabalho. Não “empurre” o pull request e também não trabalhe no escuro.
***
Artigo traduzido pela Redação iMasters, com autorização do autor. Publicado originalmente em http://www.igvita.com/2011/12/19/dont-push-your-pull-requests/
O post Não “empurre” seus pull requests apareceu primeiro em .
Hans-Juergen Schoenig: Finding similar texts in PostgreSQL
60 vídeos para aprender inglês

Já falamos aqui sobre Educatina, uma plataforma que nos oferece vídeos educacionais em espanhol sobre diferentes temáticas, que pode ser de utilidade para aprender alguma matéria específica ou mesmo saber mais um pouco sobre qualquer outra, aumentando nosso conhecimento.
Por exemplo, se quisermos aprender ou treinar o inglês, em Educatina encontraremos 60 clases en videos para serem visualizados de forma gratuita, e poder utilizar como complemento de nossa aprendizagem. Não é um curso, cada um dos vídeos é independente e analisa um tema em particular, abrangendo os diferentes conceitos de um nível de Inglês básico. Isso pode ser ideal se tivermos alguma dúvida pendente em nossa aprendizagem ou tivermos que nos preparar para um exame.
As lições são breves e estão muito bem explicadas como se estivéssemos na escola e com a vantagem de tê-las em video para repeti-las quantas vezes for necessário. E um detalhe interessante que pode ser de grande utilidade é que cada um dos vídeos vem acompanhado de um resumo ou os pontos principais tratados na lição, que encontraremos abaixo do player em “Conteúdo”. É como se tivéssemos tomado notas dos conceitos explicados para uma consulta posterior.
E se desejarmos receber apoio adicional, Educatina oferece a opção de solicitar aulas particulares adaptadas a nossos horários, através de professores online.
Artigo escrito no br.wwwhatsnew.com
Acompanhe também as notícias pelo twitter: twitter.com/pooldigital ou pelo RSS
Veja também:
Sobre prazos e produtividade
Você já percebeu que cumprir prazos em projetos de web é praticamente impossível? Nunca vi ninguém entregando tudo o que combinou no prazo final. Sempre falta alguma coisa, um teste, uma feature, algo que ninguém conseguiu prever. O problema é que isso pode estar se tornando um problema crônico dentro das empresas, principalmente em empresas onde as equipes não tem um processo bem formado, onde a comunicação é difícil.
Talvez a solução e o início do problema esteja nas trincheiras. Seja designer, front-end ou back-end, a maioria deles não sabe estimar. Todos eles acham que estimar é acertar a data exata de quando eles entregarão as tarefas e fecharão o ciclo principal de desenvolvimento. Estimar não significa isso, pelo contrário. E a solução pode estar aqui também por que os integrantes das equipes que devem definir as datas. Claro, essa data pode ser revista e afinada com os gestores, isso deve acontecer, é necessário. Mas quem deve dizer se uma data é impossível ou não são os desenvolvedores.
Estimar é opinar a respeito de algo de que não se tem certeza. – Fonte
Você não precisa saber exatamente o dia, mas algo aproximado. Quando alguém pergunta o prazo, não é a hora de agradar ninguém, é hora de você dar uma data confortável para o projeto que talvez seja suficiente para execução da tarefa. É opinar sobre os problemas e tentar identificar as armadilhas daquela tarefa e também do projeto. Fique tranquilo, você não precisa ter certeza de quanto tempo uma tarefa custará se você nunca a executou. A ideia de estimar é realmente esta: opinar uma data mais próxima possível da realidade. Você vai errar a maioria das vezes, afinal de contas, você não tem bola de cristal.
Eu sei que fazer isso e convencer os outros de que a sua data não é a real é um desafio quase que impossível. Mas tenha em mente que é muito melhor você deixar claro e mostrar os motivos do por que determinada data não factivel, do que tentar agradar a todos e ganhar a fama de atrasado e ainda assim prejudicar outras pontas do projeto, como campanhas de marketing, lançamento, budgets, etc etc etc… Eu sei também que tem desenvolvedores que se aproveitam disso para enrolar demais. Nestes casos o sistema trata de excluí-los automaticamente.
Ninguém sabe estimar. E isso é bom por que é um campo a ser trabalhado nas equipes. É possível convencê-los de que chupar o dedo e colocá-lo para cima para sentir para brisa não é a melhor forma de conseguir datas. Existem maneiras melhores para saber com mais precisão uma data de entrega. Inclusive melhorando a sua produtividade.
Outros atrasam também
Claro que atrasam. O comercial, por exemplo. Quem não nunca trabalhou com um comercial que fecha orçamentos prometendo milagres em curto prazo? Geralmente isso acontece por que o comercial nunca trabalhou ou trabalha a pouco tempo com web. Eles nunca conversaram com os membros da equipe de produção. Nunca viram um processo do começo ao fim. E geralmente não entendem que tem uma fila de projetos a serem entregues.
Esse problema pode ser facilmente resolvido se: 1. O comercial tem uma raíz técnica. Nesse caso ele sabe que dar uma data muito próxima, é irreal e tem mais chances de acordar uma data plausível. 2. O comercial traz o briefing para a equipe e pede sua opinião. A equipe estima e devolve uma data mais próxima da realidade, levando em conta a fila de projetos, complexidade das tarefas e etc. 3. O comercial leva o líder técnico ou o gerente da equipe para as reuniões – pelo menos as mais importantes. Dessa forma o comercial tem uma visão mais pé no chão de todas as necessidades do projeto e também o cliente ganha confiança, já que ele pode conversar direto com um integrante da equipe e executará o projeto.
Claro que o comercial precisa ser competitivo. Ninguém consegue vender se jogar o prazo lá para frente. O projeto fica mais caro, o cliente perde tempo e você deixa seus funcionários muito tempo alocado em apenas um projeto. Mas outra pergunta que se deve fazer é: quanto tempo você consegue manter o cliente atrasando seu projeto vezes seguidas? E os outros clientes que podem conhecer essa fama ruim de entregar projetos atrasados? Na minha opinião é melhor brigar por um prazo longo, mas que não prejudique a qualidade nem paciência dos envolvidos, do que atrasar o tempo todo e criar um clima ruim entre empresa e cliente.
Produtividade
Entregar na data tem muito a ver com produtividade. E produtividade tem muito a ver em conhecer problemas e suas soluções de tarefas comuns que são frequentemente executadas. Entender quantas tarefas comuns existem em uma fatia do projeto ajuda a mensurar uma estimativa mais acertada, não a correta, mas com uma margem de erro muito pequena. Tente estudar, por exemplo, quanto tempo se leva para fazer uma tela de cadastro/login. Se você é designer, quanto tempo leva para desenhar uma tela de cadastro e uma de login? Se você é front-end, quanto tempo leva para implementar um cenário deste? E se você é programador, quanto tempo leva para preparar o banco e pra programar essas telas?
Quando alguém pergunta o prazo, não é a hora de agradar ninguém
Depois que você passa a entender e a conhecer bem os cenários comuns, sabendo quais são seus problemas e suas soluções, você ganha a percepção de detectar problemas durante o processo. Em vez de avisar sobre um possível atraso no último dia do desenvolvimento, você vai detectar o problema semanas antes. Isso dá tempo para que a equipe se reprograme, para que a equipe de marketing remarque as campanhas, para que a diretoria replaneje a parte financeira.
A verdade é que você não pode esperar que um dia você acordará dando datas corretas e sendo um desenvolvedor perspicaz. Você tem que fazer por onde. Tem que descobrir respostas antecipadamente e tem que aprender com os problemas de projetos passados. Anote tudo o que puder durante o processo de produção. Isso vai te ajudar a manter um histórico de problemas e de soluções que geraram bons resultados e que podem ser usadas em outros projetos.
Editores, programas e truques
Saber usar de verdade os programas e editores que você trabalha diariamente também ajuda muito.
Eu gosto dos desenvolvedores que utilizam VIM por um simples motivos: eles pararam um tempo para aprender os todos os comandos ou os mais importantes. Eu particularmente não gosto de VI, exatamente por que a curva de aprendizado é muito grande. Mas quando o desenvolvedor sabe utilizar tudo o que o VI oferece, a produtividade deste desenvolvedor cresce demais.
Chupar o dedo e colocá-lo para cima para sentir a brisa não é a melhor forma de conseguir datas.
Você pode alcançar uma produtividade monstruosa com qualquer editor. Basta estudar e aprender seus truques. O Sublime Text ganhou notoriedade entre os desenvolvedores exatamente por que ele é recheado de truques. Eu paro frequentemente para estudar novos atalhos ou para procurar novos plugins.
Muitos devs acham que perder tanto tempo em um editor é ruim. Eu acho que é exatamente o contrário. Você ganha efetividade nas tarefas futuras e esse tempo “perdido” se paga com muita facilidade.
A mesma coisa quando o desenvolvedor aprende Expressões Regulares. Nada paga aquele Find & Replace complexo que consumiria meia hora do seu, mas que sendo feito com ER levou apenas poucos segundos/minutos. Não só ER, mas entender de verdade os atalhos da sua linguagem predileta vai te economizar muitos minutos durante tarefas triviais.
Sabe como muitos desenvolvedores por aí perdem tempo? Segurando o mouse. Isso é uma coisa simples, mas eu já vi tanto desenvolvedor que nem usa o básico CMD/ALT+TAB para alternar janelas. Para tentar chegar numa determinada linha do editor, usa a barra de rolagem… O mínimo tem que ser feito.
Concluindo
Ninguém nasceu sabendo estimar. Isso se aprende durante sua carreira, errando muito. É algo que você aprende rápido e leva uma vida inteira para aperfeiçoar. É um assunto interessante e com certeza, com este artigo, abordamos muito superficialmente o que podemos melhorar para que entreguemos mais em menos tempo. Em artigos posteriores podemos abordar métodos ágeis, flexibilização de processos entre as equipes e outos assuntos importantes. Aguarde.
O post Sobre prazos e produtividade foi originalmente publicado em Tableless.
PGTUNE: Otimize a configuração do PostgreSQL!
São muitas variáveis em jogo e o processo de otimização raramente possibilita a quantidade de testes realmente necessária em virtude do tempo ser exíguo, e os sistemas não poderem parar. O PGTUNE é um script python, desenvolvido por Gregory Smith, que atua como ferramenta complementar para o tuning de bancos de dados postgresql, mais especificamente, sugerindo alterações no complexo arquivo postgresql.conf visando um melhor desempenho.
Neste post, vamos apresentar o funcionamento básico do pgtune e elencar pontos fortes e limitações.
* Instalação
O PGTUNE demanda a instalação do python, a qual é bastante simples para linux, windows e MAC (além de máquina virtual do java, .NET, etc.).
Assumindo que você já possui o postgres e o python instalados, basta acessar o sítio do PGTUNE, baixar o arquivo compactado e descompactá-lo.
Para este post utilizamos:
- pgtune versão 0.9.3
- postgresql versão 9.2.1
- python versão 2.6.5
* Utilização
Abra o prompt de comando e entre na pasta descompactada do pgtune.
O comando abaixo aciona o pgtune, passando como parâmetros o arquivo postgresql.conf do postgres e o arquivo de saída (no caso, psql.conf), gerado com sugestões para o tuning do banco de dados.
python pgtune -i /etc/postgresql/9.2/main/postgresql.conf -o psql.conf
O resultado da execução aparece na figura abaixo, com a listagem do arquivo de saída:
Caso deseje testar as alterações, altere o postgresql.conf e reinicie o servidor do banco.
Além dos arquivos de entrada e saída, o script apresenta outros recursos realmente interessantes, através de parâmetros (opcionais) de execução:
* -M ou –memory: Utilizar este parâmetro para fornecer a memória do servidor. Caso não esteja especificado, o pgtune tentará detectar a memória da máquina de execução do script, assumindo que é a máquina servidora.
* -T ou –type: Especifica o tipo de base de dados. As opções aceitas são:
- DW - Grandes massas de dados com poucas alterações mas com consultas extremamente complexas
- OLTP - Sistema tradicional de processamento de transações
- Web - Sistema web, com grande número de acessos concorrentes
- Mixed - Sistema com características intermediárias em relação aos demais tipos.
- Desktop - Sistema monousuário
* -c or –connections: Especifica o máximo de conexões desejado. Este é o parâmetro mais relevante em sistemas com grande número de usuários.
Exemplos adicionais com os parâmetros:
python pgtune -i /etc/postgresql/9.2/main/postgresql.conf -o psql.conf -M 500000
python pgtune -i /etc/postgresql/9.2/main/postgresql.conf -o psql.conf -c 1000
pgtune-0.9.3$ python pgtune -i /etc/postgresql/9.2/main/postgresql.conf -o psql.conf -M 500000 -c1000
* Considerações finais
O pgtune mostrou que pode ser utilizado sem problemas como ferramenta complementar de tuning de banco de dados. Recomendo que antes de qualquer alteração no postgresql.conf, que se faça testes e backup do arquivo antigo.
Abaixo, listo pontos fortes e limitações:
Vantagens:
- Facilidade de instalação e utilização
- Ser multiplataforma, por utilizar python
- Regras de alteração de valores são acessíveis dentro do script
- Facilidade de interpretação de resultados
- Pode ser utilizado sem interromper o funcionamento do servidor de banco de dados
- Não altera o ambiente de produção, deixando para o DBA a opção de aceitar ou não as alterações sugeridas
Limitações:
- Não faz testes aprofundados no ambiente que indiquem a eficácia da otimização
- Funcionar através de cálculos sobre regras relacionadas à configuração, e não realiza testes de simulação comprobatórios
- Não considera outros fatores além da configuração do postgresql.conf
- Não existe uma forma clara de distinguir entre os diversos tipos de sistema, e um servidor pode ter mais de um banco de dados com tipos diferentes, o que invalidaria a configuração com o parâmetro -T.
- O parâmetro -M não aceita abreviações como 4gb, 5000mb.
Teste você mesmo e me diga o que achou! Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/ - Cláudio Bezerra Leopoldino
Desvendando os Microdados do ENEM 2010
Estava olhando o conteúdo do Portal Brasileiro de Dados Abertos (vide link) e me deparei com os Microdados do ENEM[1] fornecidos pelo INEP [2]. Fiquei interessado nessas informações e resolvi baixar os arquivos da última edição disponibilizada do exame: 2010.
Achei muito organizado o material fornecido pela instituição ao público, e então resolvi destrinchar os dados usando uma ferramenta mais apropriada: o SGBD de código aberto mais avançado do mundo, o PostgreSQL[3].
O principal conteúdo no arquivo ZIP é o "DADOS_ENEM_2010.txt", um arquivo de texto com 4.626.094 linhas e míseros 4,4 GB...! Cada linha representa um inscrito no exame, e os campos dividem-se em seções de variáveis como CONTROLE DO INSCRITO, CONTROLE DA ESCOLA, CIDADE DA PROVA, PROVA OBJETIVA e PROVA DE REDAÇÃO.
A lista de informações de cada inscrito é extensa, por isso resolvi extrair apenas algun campos de maior interessante. Fazemos isso usando as instruções a seguir no Linux:
cat DADOS_ENEM_2010.txt | cut -b 1-12,21-179,533-572,951,997-1006 > enem10a.txt
O arquivo resultante "enem10a.txt" fica bem menor, com cerca de 980 MB... Os dados nele ainda não estão perfeitos: existem valores em branco em colunas como código e nome de município e nas notas. Para o código do município, usamos o SED com a seguinte instrução para inserir zeros no lugar de vazio, o que será tratado posteriormente:
sed 's/^\(.\{12\}\)\s\{7\}/\10000000/' enem10a.txt > enem10b.txt
Agora temos outro arquivo de texto com 980 MB, pronto para ser carregado no SGBD. É preciso então criar o banco de dados "enem". Podemos fazer isso usando o comando createdb.
Uma vez conectado ao banco recém-criado, criaremos a tabela "enem10" usando a seguinte instrução SQL:
CREATE TABLE enem10 (
num_inscr int8,
cod_munic int,
nom_munic varchar,
sig_uf char(2),
idc_cn int2,
idc_ch int2,
idc_lc int2,
idc_mt int2,
not_cn numeric(6,2),
not_ch numeric(6,2),
not_lc numeric(6,2),
not_mt numeric(6,2),
idc_rd char(1),
not_rd numeric(6,2)
);
Veja que começamos a normalizar os dados, principalmente pela especificação de restrições de tipos de dados para cada uma das colunas. Além disso, tabela e cada uma de duas colunas serão melhor documentadas se dotadas de descrições. Isso pode ser feito através dos comandos de criação de comentários abaixo:
COMMENT ON TABLE enem10 IS 'Microdados do Exame Nacional do Ensino Médio 2010';
COMMENT ON COLUMN enem10.num_inscr IS 'Número de inscrição no ENEM 2010';
COMMENT ON COLUMN enem10.cod_munic IS 'Código do Município em que o inscrito mora';
COMMENT ON COLUMN enem10.nom_munic IS 'Nome do município em que o inscrito mora ';
COMMENT ON COLUMN enem10.sig_uf IS 'Código da Unidade da Federação do inscrito no Enem';
COMMENT ON COLUMN enem10.idc_cn IS 'Presença à prova objetiva de Ciências da Natureza';
COMMENT ON COLUMN enem10.idc_ch IS 'Presença à prova objetiva de Ciências Humanas';
COMMENT ON COLUMN enem10.idc_lc IS 'Presença à prova objetiva de Linguagens e Códigos';
COMMENT ON COLUMN enem10.idc_mt IS 'Presença à prova objetiva de Matemática';
COMMENT ON COLUMN enem10.not_cn IS 'Nota da prova de Ciências da Natureza ';
COMMENT ON COLUMN enem10.not_ch IS 'Nota da prova de Ciências Humanas';
COMMENT ON COLUMN enem10.not_lc IS 'Nota da prova de Linguagens e Códigos';
COMMENT ON COLUMN enem10.not_mt IS 'Nota da prova de Matemática';
COMMENT ON COLUMN enem10.idc_rd IS 'Presença à redação';
COMMENT ON COLUMN enem10.not_rd IS 'Nota da prova de redação';
Para dar carga de maneira mais eficiente no PostgreSQL, além de um tuning básico, podemos utilizar a ferramenta pgloader [4]. Para isso, após instalar o pacote "pgloader", crie um arquivo de configurações de nome "pgloader.conf" com o seguinte conteúdo:
[pgsql]
base = enem
log_file = /tmp/pgloader.log
;log_min_messages = DEBUG
client_min_messages = WARNING
client_encoding = 'utf-8'
lc_messages = C
;pg_option_client_encoding = 'utf-8'
;pg_option_standard_conforming_strings = on
pg_option_work_mem = 512MB
copy_every = 10000
commit_every = 50000
null = " "
empty_string = ""
max_parallel_sections = 4
[enem10]
table = enem10
format = fixed
filename = enem10b.txt
columns = *
fixed_specs = num_inscr:0:12, cod_munic:12:7, nom_munic:19:150, sig_uf:169:2, idc_cn:171:1, idc_ch:172:1, idc_lc:173:1, idc_mt:174:1, not_cn:175:9, not_ch:184:9, not_lc:193:9, not_mt:202:9, idc_rd:211:1, not_rd:212:9
Esse arquivo especificará ao pgloader de que forma o arquivo de entrada "enem10b.txt" será lido para alimentar a tabela "enem10" no banco de dados. Para maior desempenho, é utilizado o comando COPY (e não INSERT INTO) a cada 10 mil linhas e as transações são efetivadas a cada 50 mil registros. O grande pulo do gato é a substituição de espaços em branco pelo valor nulo. Para iniciar a carga, basta executar pgloader nesse diretório.
Assim que o processo de carga finalizar, é preciso executar as instruções SQL abaixo para ajustes finais nos dados:
UPDATE enem10 SET nom_munic = trim(nom_munic);
UPDATE enem10 SET cod_munic = null WHERE cod_munic = 0;
Confira então se a tabela "enem10" possui as 4,6 milhões de linhas referentes a cada inscrito no exame de 2010. Eis um exemplo do conteúdo dessa tabela:
enem=# SELECT * FROM enem10 LIMIT 10;
num_inscr | cod_munic | nom_munic | sig_uf | idc_cn | idc_ch | idc_lc | idc_mt | not_cn | not_ch | not_lc | not_mt | idc_rd | not_rd
--------------+-----------+----------------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------
200000382760 | 2105302 | IMPERATRIZ | MA | 1 | 1 | 1 | 1 | 545.40 | 598.20 | 589.00 | 502.10 | P | 550.00
200004076118 | 3202306 | GUACUI | ES | 1 | 1 | 1 | 1 | 434.10 | 505.80 | 439.00 | 495.30 | P | 475.00
200001265338 | 4309209 | GRAVATAI | RS | 1 | 1 | 1 | 1 | 491.10 | 598.40 | 528.70 | 322.50 | P | 450.00
200003174558 | 2211001 | TERESINA | PI | 1 | 1 | 1 | 1 | 499.90 | 521.10 | 479.10 | 411.50 | P | 875.00
200000277562 | 1501709 | BRAGANCA | PA | 1 | 1 | 1 | 1 | 479.70 | 583.90 | 447.20 | 398.60 | P | 575.00
200000104197 | 2800670 | BOQUIM | SE | 1 | 1 | 1 | 1 | 341.90 | 438.40 | 360.00 | 370.70 | P | 550.00
200004343078 | 3139409 | MANHUACU | MG | 1 | 1 | 1 | 1 | 499.00 | 610.90 | 452.00 | 513.80 | P | 450.00
200001011958 | 1502400 | CASTANHAL | PA | 1 | 1 | 1 | 1 | 597.80 | 599.30 | 517.80 | 586.60 | P | 700.00
200002382852 | 3106200 | BELO HORIZONTE | MG | 1 | 1 | 1 | 1 | 506.50 | 623.70 | 555.50 | 530.10 | P | 725.00
200000757106 | 1709500 | GURUPI | TO | 1 | 1 | 1 | 1 | 494.70 | 534.10 | 558.00 | 430.80 | P | 800.00
(10 rows)
A essa altura você já deve ter percebido que trabalhar com tamanho volume de dados no SGBD não é nada trivial. As consultas tendem a ser mais lentas a cada vez que uma varredura sequencial de tabela (i.e., full scan) é invocado. Para minimizar esse problema, podemos criar tabelas totalizadoras.
Para criar a tabela "nota_media_cidade", uma agregação da média e desvio padrão das notas e quantidades de inscritos para cada cidade (i.e., municípios com mais de 1.000 alunos), podemos executar a seguinte instrução SQL (note que desconsideramos os candidatos que não compareceram às provas):
SELECT nom_munic AS municipio, sig_uf AS uf,
avg(not_cn + not_ch + not_lc + not_mt + not_rd)::int AS media,
stddev(not_cn + not_ch + not_lc + not_mt + not_rd)::int AS desvio,
count(num_inscr) AS inscritos
INTO nota_media_cidade
FROM enem10
WHERE cod_munic IS NOT NULL
AND idc_cn = 1 AND idc_ch = 1 AND idc_lc = 1 AND idc_mt = 1 AND idc_rd = 'P'
GROUP BY nom_munic, sig_uf
HAVING count(num_inscr) > 1000
ORDER BY media DESC;
Outra análise interessante é criar a tabela "nota_media_estado", uma agregação da média, desvio padrão, mínima e máxima das notas e quantidades de inscritos para cada Unidade da Federação (i.e., estado brasileiro). Para isso, executamos a instrução SQL abaixo:
SELECT sig_uf AS uf,
avg(not_cn + not_ch + not_lc + not_mt + not_rd)::int AS media,
stddev(not_cn + not_ch + not_lc + not_mt + not_rd)::int AS desvio,
min(not_cn + not_ch + not_lc + not_mt + not_rd)::int AS minima,
max(not_cn + not_ch + not_lc + not_mt + not_rd)::int AS maxima,
count(num_inscr) AS inscritos
INTO nota_media_estado
FROM enem10
WHERE cod_munic IS NOT NULL
AND idc_cn = 1 AND idc_ch = 1 AND idc_lc = 1 AND idc_mt = 1 AND idc_rd = 'P'
GROUP BY sig_uf
ORDER BY 2 DESC;
Nas agregações anteriores, usamos a soma das notas dos candidatos nas 4 provas objetivas e na redação. Para obter o desempenho dos candidatos separadamente em cada uma das provas, podemos criar a tabela "nota_prova_geral" conforme instrução a seguir:
SELECT
min(not_cn) AS min_cn, max(not_cn) AS max_cn, avg(not_cn)::numeric(6,2) AS med_cn, stddev(not_cn)::numeric(6,2) AS dsv_cn,
min(not_ch) AS min_ch, max(not_ch) AS max_ch, avg(not_ch)::numeric(6,2) AS med_ch, stddev(not_ch)::numeric(6,2) AS dsv_ch,
min(not_lc) AS min_lc, max(not_lc) AS max_lc, avg(not_lc)::numeric(6,2) AS med_lc, stddev(not_lc)::numeric(6,2) AS dsv_lc,
min(not_mt) AS min_mt, max(not_mt) AS max_mt, avg(not_mt)::numeric(6,2) AS med_mt, stddev(not_mt)::numeric(6,2) AS dsv_mt,
min(not_rd) AS min_rd, max(not_rd) AS max_rd, avg(not_rd)::numeric(6,2) AS med_rd, stddev(not_rd)::numeric(6,2) AS dsv_rd
INTO nota_prova_geral
FROM enem10
WHERE idc_cn = 1 AND idc_ch = 1 AND idc_lc = 1 AND idc_mt = 1 AND idc_rd = 'P';
A fim de melhor entender os dados dessa tabela, podemos criar a visão "nota_prova" com esse comando SQL:
CREATE VIEW nota_prova AS
SELECT 'Ciências da Natureza' AS prova, min_cn AS min, max_cn AS max, med_cn AS media, dsv_cn AS desvio FROM nota_prova_geral
UNION
SELECT 'Ciências Humanas', min_ch, max_ch, med_ch, dsv_ch FROM nota_prova_geral
UNION
SELECT 'Linguagens e Códigos', min_lc, max_lc, med_lc, dsv_lc FROM nota_prova_geral
UNION
SELECT 'Matemática', min_mt, max_mt, med_mt, dsv_mt FROM nota_prova_geral
UNION
SELECT 'Redação', min_rd, max_rd, med_rd, dsv_rd FROM nota_prova_geral
ORDER BY 1;
Como resultado, teremos as seguintes estruturas no banco de dados "enem":
enem=# \d+
List of relations
Schema | Name | Type | Owner | Size | Description
--------+-------------------+-------+-------+------------+---------------------------------------------------
public | enem10 | table | hjort | 1452 MB | Microdados do Exame Nacional do Ensino Médio 2010
public | nota_media_cidade | table | hjort | 40 kB |
public | nota_media_estado | table | hjort | 8192 bytes |
public | nota_prova | view | hjort | 0 bytes |
public | nota_prova_geral | table | hjort | 16 kB |
(5 rows)
Pronto! Agora podemos começar a fazer as análises dos dados usando essas tabelas e visão. Eis alguns exemplos a seguir.
1. Quais são as cidades cujos alunos obtiveram as maiores médias?
| municipio | uf | media | desvio | inscritos |
|---|---|---|---|---|
| NITEROI | RJ | 2.935 | 420 | 9.328 |
| FLORIANOPOLIS | SC | 2.935 | 385 | 6.160 |
| VALINHOS | SP | 2.892 | 424 | 1.634 |
| NOVA FRIBURGO | RJ | 2.891 | 376 | 2.129 |
| SAO CAETANO DO SUL | SP | 2.888 | 402 | 2.092 |
| BOTUCATU | SP | 2.887 | 405 | 1.449 |
| ITAJUBA | MG | 2.886 | 361 | 2.647 |
| JUIZ DE FORA | MG | 2.884 | 399 | 11.411 |
| ARAXA | MG | 2.883 | 396 | 1.054 |
| ARARAQUARA | SP | 2.882 | 390 | 3.214 |
| CATANDUVA | SP | 2.863 | 408 | 1.115 |
| PATOS DE MINAS | MG | 2.858 | 392 | 1.767 |
| RIBEIRAO PRETO | SP | 2.856 | 406 | 9.512 |
| SAO CARLOS | SP | 2.855 | 403 | 5.528 |
| SAO JOSE DO RIO PRETO | SP | 2.852 | 413 | 5.686 |
| BARBACENA | MG | 2.849 | 374 | 2.469 |
| JAU | SP | 2.847 | 409 | 1.233 |
| POUSO ALEGRE | MG | 2.846 | 379 | 2.340 |
| VICOSA | MG | 2.845 | 410 | 2.713 |
| UBERABA | MG | 2.843 | 420 | 4.058 |
| PORTO ALEGRE | RS | 2.843 | 389 | 24.059 |
| UBA | MG | 2.841 | 385 | 1.229 |
| BELO HORIZONTE | MG | 2.840 | 422 | 63.090 |
| POCOS DE CALDAS | MG | 2.839 | 355 | 2.614 |
| BLUMENAU | SC | 2.831 | 364 | 1.485 |
| PIRASSUNUNGA | SP | 2.830 | 396 | 1.317 |
| CAMPINAS | SP | 2.830 | 417 | 13.638 |
| VITORIA | ES | 2.828 | 439 | 8.475 |
| VOLTA REDONDA | RJ | 2.828 | 373 | 3.934 |
| RIO DE JANEIRO | RJ | 2.826 | 408 | 93.300 |
| SAO JOSE DOS CAMPOS | SP | 2.825 | 403 | 11.545 |
| JABOTICABAL | SP | 2.822 | 381 | 1.077 |
| DIVINOPOLIS | MG | 2.822 | 369 | 4.787 |
| SANTA MARIA | RS | 2.819 | 390 | 7.601 |
| SANTOS | SP | 2.817 | 404 | 5.195 |
| GUARATINGUETA | SP | 2.817 | 397 | 1.559 |
| LAVRAS | MG | 2.814 | 388 | 2.446 |
| JUNDIAI | SP | 2.814 | 392 | 5.232 |
| CONSELHEIRO LAFAIETE | MG | 2.813 | 382 | 2.429 |
| PASSOS | MG | 2.813 | 399 | 1.316 |
| CURITIBA | PR | 2.812 | 394 | 38.904 |
| SAO JOAO DEL REI | MG | 2.812 | 354 | 2.273 |
| CRICIUMA | SC | 2.810 | 399 | 1.232 |
| MARILIA | SP | 2.807 | 409 | 2.721 |
| LAGOA SANTA | MG | 2.806 | 391 | 1.038 |
| MOGI MIRIM | SP | 2.806 | 412 | 1.249 |
| NOVA LIMA | MG | 2.806 | 403 | 1.701 |
| SAO JOSE | SC | 2.805 | 350 | 2.478 |
| PIRACICABA | SP | 2.804 | 399 | 4.435 |
| TAUBATE | SP | 2.804 | 407 | 3.209 |
(Vide "nota_media_cidade")
2. Em quais estados os alunos obtiveram as maiores médias?
| uf | media | desvio | minima | maxima | inscritos |
|---|---|---|---|---|---|
| RJ | 2.764 | 392 | 1.588 | 4.242 | 220.383 |
| SP | 2.739 | 392 | 1.488 | 4.346 | 522.098 |
| MG | 2.737 | 387 | 1.513 | 4.239 | 368.835 |
| SC | 2.728 | 363 | 1.605 | 4.179 | 60.242 |
| PR | 2.704 | 370 | 1.563 | 4.111 | 159.061 |
| RS | 2.688 | 363 | 1.578 | 4.230 | 199.630 |
| DF | 2.675 | 383 | 1.579 | 4.111 | 40.292 |
| GO | 2.645 | 393 | 1.585 | 4.134 | 77.254 |
| CE | 2.641 | 408 | 1.543 | 4.221 | 146.687 |
| ES | 2.640 | 392 | 1.592 | 4.174 | 75.985 |
| PE | 2.626 | 380 | 1.450 | 4.186 | 155.738 |
| PB | 2.592 | 371 | 1.561 | 4.160 | 68.475 |
| MS | 2.590 | 371 | 1.601 | 4.127 | 69.354 |
| RN | 2.589 | 374 | 1.493 | 4.105 | 64.952 |
| PA | 2.587 | 368 | 1.475 | 4.131 | 120.739 |
| MT | 2.559 | 356 | 1.544 | 4.029 | 76.255 |
| AP | 2.551 | 335 | 1.615 | 3.782 | 9.413 |
| PI | 2.550 | 390 | 1.567 | 4.217 | 63.441 |
| RO | 2.548 | 346 | 1.570 | 4.094 | 33.387 |
| AL | 2.545 | 366 | 1.633 | 4.107 | 30.301 |
| BA | 2.545 | 366 | 1.443 | 4.166 | 264.654 |
| MA | 2.543 | 374 | 1.544 | 4.109 | 123.806 |
| RR | 2.527 | 350 | 1.622 | 3.873 | 8.921 |
| TO | 2.523 | 374 | 1.558 | 4.014 | 19.491 |
| AM | 2.514 | 345 | 1.517 | 4.084 | 80.490 |
| SE | 2.499 | 370 | 1.537 | 4.126 | 33.099 |
| AC | 2.491 | 344 | 1.621 | 3.995 | 9.887 |
(Vide "nota_media_estado")
3. Qual foi o desempenho geral dos alunos em cada uma das provas?
| prova | min | max | media | desvio |
|---|---|---|---|---|
| Ciências da Natureza | 297.30 | 844.70 | 489.05 | 79.96 |
| Ciências Humanas | 265.10 | 883.70 | 550.16 | 89.83 |
| Linguagens e Códigos | 254.00 | 810.10 | 512.00 | 77.28 |
| Matemática | 313.40 | 973.20 | 506.90 | 112.51 |
| Redação | 250.00 | 1000.00 | 596.44 | 132.34 |
(Vide "nota_prova")
Bom, através dos dados pude constatar que o ensino médio brasileiro de qualidade (pelo menos no ano de 2010) está polarizado no eixo Sudeste-Sul do país. Parabéns a Niterói - RJ, Florianópolis - SC e Valinhos - SP, as cidades campeãs no ensino! Tomara que o Ministério da Educação tenha ideia de como homogeneizar (para melhor!) o ensino em todas as regiões do Brasil.
Com relação às notas, a mídia limita-se a divulgar apenas as mínimas e máximas (vide [5,6]). Entretanto, qualquer profissional com conhecimento estatístico sabe que o mais importante nesse tipo de análise são as médias e os desvios padrão. Um exemplo disso é na prova de matemática, onde ocorreu a maior nota das objetivas, porém também a maior diferença entre as notas dos candidatos. Ou seja, é uma disciplina cujo ensino precisa ser reforçado! :D
Referências
[1] Sobre o Enem - http://portal.inep.gov.br/web/enem/sobre-o-enem/
[2] Microdados do Enem - http://dados.gov.br/dataset/microdados-do-exame-nacional-do-ensino-medio-enem/
[3] PostgreSQL - http://www.postgresql.org/
[4] pgloader - http://pgfoundry.org/projects/pgloader/
[5] Confira as notas mínima e máxima das provas do Enem (Estadão) - http://www.estadao.com.br/noticias/vidae,confira-as-notas-minima-e-maxima-das-provas-do-enem,666251,0.htm
[6] Como calcular a nota do Enem? - http://vestibular.brasilescola.com/enem/como-calcular-nota-enem.htm













