Eliminando PHP short tags com regex

Escrevi uma regex para substituir short tags do PHP, a única coisa diferente da maioria que eu encontrei foi que me preocupei em manter as quebras de linhas – e não quebrar nenhuma parte do código comendo caracter (encontrei várias sugestões com regex que acabam “comendo” caracter dependendo do caso).

A expressão regular (regex):

<\?([^p|=])

O replace:

<?php $1

Explicando a REGEX:

Ela irá buscar por qualquer <? que não seja seguido imediatemente por um “p”, garantindo que <?php não case com a regex, ou seguido por um “=” – garantindo que <?= não case com a regex.

Os parêntesis da REGEX criam um grupo de captura que é utilizado no replace, isto serve para casos específicos como

<?if(

O i seria “engolido” neste caso. O grupo de captura também captura quebras de linha, isso garante que:

<?
if($x = $y)

Se transforme em:

<?php
if($x = $y)

E não em:

<?php if($x = $y)

Mantendo a mesma legibilidade e formatação do código original após o replace.

Não encontrei nenhuma situação em que esta regex causou problema, se ela não funcionar em algum caso comente aí.

Controlando GPIO do RaspberryPI com NodeJS

Esta semana eu comecei a me aventurar com o Arduino e depois de me sentir um pouco mais seguro na parte eletrônica resolvi entender como controlar os “pinos”, ou formalmente conhecidos como General Purpose Input/Output (GPIO) do Raspberry Pi.

Consegui fazer testes para controlar GPIO do Raspberry PI pelo terminal unix, mas resolvi colocar em teste a Atwood’s Law:

“any application that can be written in JavaScript, will eventually be written in JavaScript. “

qualquer aplicação que pode ser escrita em JavaScript, eventualmente será escrita em JavaScript.

Controlando GPIO do RaspberryPI com Node.JS

1) Instale NodeJS + NPM no RPi

A instalação do nodejs e do npm pode variar de acordo com o SO que você está usando no RPi – aqui eu estava usando o SO do Kano e consegui instalar sem problemas – mas não via (apt-get).

wget http://node-arm.herokuapp.com/node_latest_armhf.deb
sudo dpkg -i node_latest_armhf.deb

Para verificar se você tem nodejs instalado – ou se a instalação aconteceu com sucesso, utilize os comando abaixo para verificar a versão instalada:

node -v

Repita o proesso para o npm

npm -v

Se eles não estão instalados o primeiro passo é instalar o NodeJS e NPM no seu raspberry.

Camiseta Node.JS

Jabá: camiseta NodeJS do Eu Compraria

2) Instale o rpi-gpio

Com o node e npm instalados você precisa instalar o rpi-gpio utilizando o npm.

npm install rpi-gpio

3) Conecte um led ao seu RPi

Defina o GPIO que você urá utilizar, veja a documentação do GPIO dos RPi do RPi – a imagem abaixo é desta documentação.

No meu caso usei o 13 (que é o GPIO27) e o pino 14 para o terra. Não esqueca de usar um resistor de acordo com o led que você vai utilizar.

Eu utilizei uma protoboard para facilitar a instalação.

4) Crie uma aplicação em Node.JS

Crie uma aplicação de teste e carregue o rpi-gpio.

var gpio = require('rpi-gpio');

O setup (veja a documentação do rpi-gpio) faz o “export” da GPIO e configura se será entrada ou saída.

O último parâmetro é o callback para quando a porta estiver pronta.

gpio.setup(13, gpio.DIR_OUT, write);

No callback, estou escrevendo o valor “true” para o pino 13 (ou GPIO27) – que vai acenter o led conectado lá.

function write() {
  gpio.write(13, true, function(err) {
    if (err) throw err;
    console.log('Written to pin');
  });
}

Agora você já pode fazer um server web interagir com o Arduino, com leds, com a sua casa.

Veja também:

Instalação do NodeJS no RPi – we work we play (en)

Documentação do GPIO do Raspberry Pi (en)

Heim control – Automação residencial com Node.JS (en)

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: