quinta-feira, 2 de outubro de 2014

Como editar configurações de rede Ubuntu 12.04 na mão

Vou postar isso aqui pois sempre esqueço qual o arquivo que deve ser alterado:

sudo vim /etc/NetworkManager/system-connections/Wired\ connection\ 1

[802-3-ethernet]
duplex=full
mac-address=78:2B:CB:C4:69:52

[connection]
id=Wired connection 1
uuid=eba66e39-b7d1-4ce8-a79d-60208a94f966
type=802-3-ethernet
timestamp=1394655259

[ipv6]
method=auto

[802-1x]
eap=peap;
identity=[USERNAME]
phase2-auth=mschapv2
password=[PASSWORD]

[ipv4]
method=auto

segunda-feira, 1 de setembro de 2014

Testes mais rápidos com Rspec e PostgreSql

Uma dica simples e fácil para aumentar a velocidade dos testes no Rspec com PostgreSql é seguir as instruções nesse link:

http://www.postgresql.org/docs/current/static/non-durability.html
obs: não fiz o 1o item da lista (RAM disk)

No meu caso os testes que rodavam em 4min e 10s cairam para 56s !!

Só não use essas configurações em produção pois o risco perder dados é alto!

sexta-feira, 14 de março de 2014

Adicionando o nome do branch em todos os commits do git

*obs: testei isso rodando no Ubuntu 12.4, não tenho certeza se funciona no Mac e no Windows

Com este hook o nome do branch será colocado no começo de todos os commits do git

Por exemplo se fizer isso no branch [historia_1]

git commit -am "lala popo"

A mensagem gravada será "[historia_1] lala popo"

Segue o passo a passo de como configurar o git para isso:

- Se estiver usando o git acima da versão 1.7.1, é possível deixar o hook global deste jeito

git config --global init.templatedir '~/.git_template'

- Depois disso, criar o arquivo abaixo

~/.git_template/hooks/prepare-commit-msg

- Colocar o conteudo abaixo:

#!/bin/bash

FILE=$1

if [[ "$git_status" =~ On\ branch\ ([^[:space:]]+) ]]; then
    BRANCH_NAME=${BASH_REMATCH[1]}
    test "$branch" != master || branch=' '
else
    # Detached HEAD.  (branch=HEAD is a faster alternative.)
    BRANCH_NAME="`git describe --all --contains --abbrev=4 HEAD 2> /dev/null ||
        echo HEAD`"
fi

echo $1

if [ -n "$BRANCH_NAME" ] && [ "$BRANCH_NAME" != "master" ]; then
    sed -i.bak -e "1s/^/[$BRANCH_NAME] /" $FILE
fi

- Salvar o arquivo e colocar permissão chmod 755

A partir desse ponto, todos os repositórios clonados e inicializados terão este hook, para os já existentes, precisa rodar o comando git init que carregará o hook global.

terça-feira, 14 de janeiro de 2014

PostgreSql migrando da versão 9.2 para a 9.3

No Debian/Ubuntu existe um jeito simples de fazer um upgrade da versão 9.2 para a versão 9.3 do PostgreSql com os comando pg_upgradecluster (http://manpages.ubuntu.com/manpages/jaunty/man8/pg_upgradecluster.8.html).

Basta seguir o procedimento abaixo:

sudo apt-get install postgresql-9.3
sudo /etc/init.d/postgresql stop
sudo pg_dropcluster --stop 9.3 main
sudo pg_upgradecluster 9.2 main

Após isso, é possivel rodar o comando pg_lsclusters para verificar que a versão 9.3 está ok.


quarta-feira, 6 de fevereiro de 2013

Lumosity - You have the power to improve your brain

Hoje vou falar do site lumosity.com

O Lumosity é um site com vários jogos feitos para treinar o cérebro.

Segundo eles, os jogos treinam 5 diferentes áreas:

  • velocidade
  • memória
  • atenção
  • flexibilidade
  • resolução de problemas

Ao criar uma conta, você escolhe quais áreas deseja melhorar e quais tem preferência no treinamento.

Todos os dias, são 5 jogos selecionados de acordo com seu perfil. Eles dizem que treinar o cérebro deve ser um costume como escovar os dentes, deve ser feito todos os dias e assim terá resultados no futuro.

Uma das partes mais legais é acompanhar o gráfico de evolução das suas habilidades e como você se compara com as outras pessoas da sua mesma faixa etária. A seguir coloquei um print dessa tela:


 Para experimentar é possível criar uma conta trial e jogar por 3 dias.

Eu não consegui resistir e estou pagando um plano mensal para poder continuar, até minha esposa está treinando e gostando!

A dica é fazer um plano familiar, fica mais barato por pessoa, inclusive tenho vagas no meu plano, se alguem tiver interesse me avisem!

sexta-feira, 18 de janeiro de 2013

sexta-feira, 13 de abril de 2012

Importação de dados em massa no MongoDB com Mongoimport

No mysql quando precisamos inserir grande quantidade de registros podemos utilizar o comando LOAD DATA, no MongoDB temos o comando mongoimport, vou falar de algumas coisas que percebemos ao utilizá-lo
obs: Nossa implementação foi feita em Rails + Mongoid

Utilização básica


Após alguns testes, decidimos utilizar a importação com algumas opções, como abaixo:

mongoimport -d [DB_NAME] --upsert --stopOnError -c [COLLECTION] [IMPORT_FILE]
onde:
  • DB_NAME: nome do database
  • --upsert: atualiza documentos que já existirem (abaixo falarei mais sobre isso);
  • --stopOnError: interrompe a importação caso ocorra algum erro em alguma linha do arquivo de importação;
  • COLLECTION: nome da collection;
  • IMPORT_FILE: arquivo com os os dados a serem importados (falarei mais sobre isso)

Opção --upsert


Quando utilizada a opção --upsert, ao importar uma linha, o mongo irá procurar se existe algum documento com esse ID no banco e se existir sobrescreverá esse pelo que está no arquivo de importação, mas atenção, ele não faz e não tem como fazer um MERGE, que é uma feature request no mongodb, ele irá sobrescrever todos atributos desse documento!

Se não utilizada a opção --upsert, as linhas que já existirem no mongo serão ignoradas pela importação

Arquivo de importação


Para rodar o mongoimport, é preciso gerar um arquivo de importação seguindo o exemplo na documentação do mongoimport

É preciso tomar cuidado ao gerar esse arquivo, por exemplo alguns campos como created_at e updated_at que são criados automaticamente ao inserir um novo documento, não são criados se não forem colocados nesse arquivo de importação. Também precisamos tomar cuidado com os campos de relacionamento, mesmo que esse documento não esteja relacionado, é preciso colocar no json o campo com o valor vazio.

Na nossa implementação para geração desse arquivo, fizemos um metodo to_mongo_json no modelo a ser importado, para que gerasse o json esperado pelo mongoimport de cada documento.

Para isso utilizamos o método attributes para pegar todos atributos do documento e gerar o json, além disso precisamos converter alguns valores (data, object_ids, etc..) de acordo com essa página

Velocidade de importação


Ao rodar o comando mongoimport, é impresso a taxa de importação. Nos testes que fizemos chegamos a taxas de até 9mil documentos por segundo, muito rapido! Se fizéssemos o create de cada documento individualmente no Rails, demoraria muito mais.

Atualização de documentos existentes


Como no mongoimport não existe a opção de merge dos dados, como mencionado acima, a solução seria gerar o json desse documento com todos os dados existentes e rodar o mongoimport com a opção --upsert. Assim poderíamos ter problemas, pois se enquanto a importação estivesse sendo processada, se um documento fosse atualizado pela aplicação, e ele já tivesse seu json gravado no arquivo de importação, ao rodar o mongoimport, os dados atualizados nesse meio tempo seriam perdidos.

O ideal nesse caso seria atualizar somente os novos dados com uma opção de merge que não existe, como falamos acima. Nossa solução foi separar os documentos que já existem no mongo dos que são novos. Para os novos utilizamos o mongoimport normalmente, já para os existentes, não colocamos no arquivo de importação e simplesmente rodamos a query de update direto no mongo, como o exemplo abaixo:

MODEL.collection.update({_id: MODEL.id}, { "$set" => { lala: "popo" }, "$addToSet" => { list_ids: {"$each" => lists.map(&:id)} } })

O método collection.update é o que o mongoid utiliza internamente para executar as queries no mongodb e pelos testes que fizemos é muito mais rápido do que se utilizássemos o método save do objeto.

* Créditos também ao @marciotrindade e Claudio Bruno Martins