Instalar Node.js em Ubuntu 14.04

Precisei configurar um servidor novo no EC2 da Amazon, escolhi um Ubuntu 14.04. Tudo as mil maravilhas (como sempre) até a hora de instalar o Node.js. O executável do Node.js no Ubuntu, quando instalado pelo repositório, é nodejs (e não node). Então alguns scripts começaram a dar problemas. Muitos problemas.

Uma solução que encontrei – e não conhecia, é usar o nvm (Node.js version manager).

Instalação simples e fácil. Primeiros, algumas dependências:

sudo apt-get update

sudo apt-get install build-essential libssl-dev

Pull no projeto do nvm:

curl https://raw.githubusercontent.com/creationix/nvm/v0.16.1/install.sh | sh

Obs.: mude 0.16.1 pela versão desejada.

Recarregue o bash:

source ~/.profile

Pronto. Com o comando “nvm ls-remote” você verá as versões disponíveis. Então, dê um

nvm install 0.11.13

e a versão 0.11.13 estará instalada. Você pode instalar várias e alternar entre elas, usando:

nvm use 0.11.13

Para quem já usou o rvm, é a mesma coisa.

Referência: https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-an-ubuntu-14-04-server

Como bloquear user-agent pelo .htaccess

Na semana passada o site de um cliente foi atacado por spammers devido a uma falha de segurança do WordPress e ontem um amigo notificou que o Eu Compraria estava fora do ar por falha do banco de dados – demorei um pouco para identificar isto pois o servidor e o banco continuavam “de pé”, mas analizando o processamento do servidor vi que constantemente o MySQL estava estourando o processamento.

Achei estranho e fui verificar os logs do servidor e encontrei a causa do problema: um bot fazendo requisições constantes para o And After, para páginas de busca e tags (onde meu sistema de cache, confesso, não é muito eficiente).

O primeiro passo foi bloquear o bot pelo IP via .htaccess para sanar o problema.

Como bloquear um IP via .htaccess

Sem mistérios, nas regras de .htacces adicionei o seguinte:

Order Deny,Allow
Deny from 54.197.86.53

Problema resolvido temporariamente.

Mas claro que durou pouco, pois o bot tinha um tange de IP para trabalhar. Ao invés de ir bloquando IP por IP – ou bloquear o range de IPs, como este bot se identificava via user-agent, achei que seria uma solução mais elegante e duradoura.

Como bloquar user-agent via htaccess

O primeiro passo é identificar o user-agent que você quer bloquear, para isso basta ver os logs do apache.

tail -f /path_dos_logs_do_dominio/access.log

No meu caso o bot se identificava como BDBBot. Depois de identificar quem queremos bloquear vamos criar as regras no htacess, explicadas abaixo.

Na primeira linha vamos determinar uma “env” chamada bad_bot se o user-agent casar com BDCBot (usando o modsetenvif do Apache). Você pode repetir esta linha para todos os user-agents que deseja bloquear.

Com esta identificação de user-agent e com o env configurado quando “casar”, você só precisa escrever a regra para negar os acessos sempre que o env for bad_bot.

Para o meu caso adicionei o seguinte ao htaccess:

BrowserMatchNoCase BDCBot bad_bot
Order Deny,Allow
Deny from env=bad_bot

Agora sim, problema com este bot resolvido de uma forma um pouco menos temporária.

Ainda neste tópico li sobte uma abordagem curiosa e, ao meu ver, perigosa que é fazer o inverso: ao invés de bloquear os spammers, bloquear tudo e permitir apenas os bots / crawlers conhecidos.

Eu não arrisco, mas se você se interessar pode conferir o tópico sobre o assunto.

Como migrar um repositório git sem perder o histórico?

Faz alguns anos que comecei a trabalhar com git e na época escolhi o Unfuddle como serviço para meus repositórios privados e de clientes. Atualmente estou usando o Bitbucket para repositórios privados e o Github para projetos open-source, mas ainda tem alguns repositórios “legados” no antigo serviço.

Ontem retomei um projeto de uns dois anos atrás que estava no unfuddle e resolvi migrar para o bitbucket, mas como fazer esta migração mantendo todo o histórico de commit e branches do repositório?

Como migrar um repositório git sem perder seu histórico?

O primeiro passo é fazer o clone do repositório original, para pegar todas as informações necessárias:

git clone url-do-repositorio.git

Agora você tem todos os arquivos e históricos do repositório no seu repositório git local. Vamos remover o repositório remoto (no meu caso, o unfuddle). Neste exemplo o nome do repositório remoto é “origin”, substitua se necessário.

git remote rm origin

Agora vamos adicionar o novo repositório remoto (no meu caso, o do bitbucket):

git remote add origin [email protected]:gserrano/meurepositorio.git

Para finalizar, vamos dar um push de todos os dados do seu repositório local (recuperados do seu antigo repositório remoto) para o novo repositório remoto:

git push -u origin --all
git push -u origin --tags

Pronto, assim você não perde o histórico do seus repositórios GIT e tem liberdade para migrar de serviço se necessário.

Você também pode gostar:

Como ignorar arquivos no Git

Faz algum tempo que estamos usando o Git para fazer deploy nos projetos da GS Solutions e um dos cuidados que isso exige é manter os arquivos de configuração do servidor de produção intactos.

Como ignorar arquivos no Git?

.gitignore

O modo mais fácil de ignorar arquivos no repositório é através do gitignore. O gitignore é uma lista que ignora qualquer arquivo que ainda não foi acompanhado pelo repositório através do git add. Veja a documentação (en).

Quando um arquivo já foi adicionado ao sistema de tracking muitas pessoas acham que o gitignore não está funcionando. Na verdade você precisa remover o arquivo do índice para que repositório pare de monitorar aquele arquivo.

Como fazer usar o .gitignore para um arquivo que já foi commitado?

Se um arquivo já foi adicionado e commitado não adianta somente adicionar ele no seu .gitignore, você precisa primeiro remover ele do sistema de tracking do git. Para isso utilize o comando abaixo:

git rm --cached config.json

No exemplo abaixo o git vai remover o cache/tracking do arquivo config.json e se ele estiver no .gitignore do repositório ele não será mais indexado nos commits.

Como ignorar um arquivo do repositório no git

Para arquivos de configuração eu prefiro que eles estejam no tracking do git, pois eles são parte do projeto e devem estar no repositório. Mas apesar de estarem no repositório, não quero enviar para o repositório minhas alterações locais. Para isso podemos pedir para que o git considere que determinados arquivos não foram alterados alterando o índice do git manualmente.

Mantendo o exemplo do arquivo config.json vamos supor que ele não está no seu gitignore e você fez alterações para o ambiente de desenvolvimento e não quer correr o risco de commitar estas mudanças.

Diga para o git considerar que aquele arquivo não foi alterado com o seguinte comando:

git update-index --assume-unchanged config.json

Agora seu repositório vai considerar que este arquivo não foi alterado mesmo que você atualize ele inúmeras vezes. Se você precisa dar commit em alguma alteração no arquivo é só remover o status de “não alterado” deste arquivo no índice do repositório com a seguinte linha de código:

git update-index --no-assume-unchanged config.json

Para arquivos de configuração eu prefiro utilizar o –assume-unchanged. Deixo o .gitignore para arquivos de uploads do projetos, cache e demais arquivos que não fazem parte do projeto.

Como vocês lidam com arquivos de configuração no repositório? Deixe dicas nos comentários!

Palestra sobre Componetização de CSS e HTML (Front in Sampa 2013)

[http://www.youtube.com/watch?v=00NrHc7Vz4g]

Saiu o vídeo oficial da minha palestra no FrontInSampa 2013, sobre componetização de HTML e CSS e a polêmica sobre orientação a objetos com CSS.

E os slides:

[slideshare id=28678434&doc=componetizacaodecsscomcompass-131127102153-phpapp02]

E você usa componetização de CSS e HTML? Que ferramentas utiliza para isso?